Ohio-HYF 2 tahun lalu
induk
melakukan
58c03ab591
100 mengubah file dengan 21129 tambahan dan 2296 penghapusan
  1. 1 1
      components/htz-image-upload/htz-image-upload.vue
  2. 157 0
      components/lime-painter/changelog.md
  3. 147 0
      components/lime-painter/components/common/relation.js
  4. 27 0
      components/lime-painter/components/l-painter-image/l-painter-image.vue
  5. 26 0
      components/lime-painter/components/l-painter-qrcode/l-painter-qrcode.vue
  6. 28 0
      components/lime-painter/components/l-painter-text/l-painter-text.vue
  7. 29 0
      components/lime-painter/components/l-painter-view/l-painter-view.vue
  8. 407 0
      components/lime-painter/components/l-painter/l-painter.vue
  9. 218 0
      components/lime-painter/components/l-painter/nvue.js
  10. 0 0
      components/lime-painter/components/l-painter/painter.js
  11. 50 0
      components/lime-painter/components/l-painter/props.js
  12. 479 0
      components/lime-painter/components/l-painter/utils.js
  13. 2 0
      components/lime-painter/components/lime-painter/index.vue
  14. 95 0
      components/lime-painter/package.json
  15. 911 0
      components/lime-painter/readme.md
  16. 119 0
      components/lime-painter/static/index.html
  17. 2665 0
      components/lime-painter/static/painter.js
  18. 0 0
      components/lime-painter/static/uni.webview.1.5.3.js
  19. 516 0
      components/mosowe-canvas-image/mosowe-canvas-image.vue
  20. 195 0
      components/mosowe-canvas-image/readme.md
  21. 987 0
      components/mosowe-canvas-image/wxqrcode.js
  22. 18 0
      components/mys-tip_1.0.01/a_tip/aTip.vue
  23. 26 0
      components/mys-tip_1.0.01/a_tip/说明.md
  24. 95 0
      components/mys-tip_1.0.01/manifest.json
  25. 18 0
      components/mys-tip_1.0.01/package.json
  26. TEMPAT SAMPAH
      components/mys_navBar.zip
  27. 11 3
      components/mys_navBar/mysNavBar.vue
  28. 1261 0
      components/qrcode.js
  29. 2 1
      components/request.js
  30. 2 1
      components/requesttoken111.js
  31. 79 0
      components/utils.js
  32. 133 126
      manifest.json
  33. 12 0
      node_modules/.package-lock.json
  34. 201 0
      node_modules/uqrcodejs/license.md
  35. 27 0
      node_modules/uqrcodejs/package.json
  36. 135 0
      node_modules/uqrcodejs/readme.md
  37. 36 0
      node_modules/uqrcodejs/uqrcode.js
  38. 22 1
      package-lock.json
  39. 5 0
      package.json
  40. 109 29
      pages.json
  41. 576 87
      pages/login/login.vue
  42. 140 0
      pages/mycenter/message.vue
  43. 259 149
      pages/mycenter/mycenter.vue
  44. 579 0
      pages/mycenter/myincome.vue
  45. 261 0
      pages/mycenter/myincome/applywithdraw.vue
  46. 28 34
      pages/mycenter/myinformation/addlocation.vue
  47. 41 78
      pages/mycenter/myinformation/bindaccount.vue
  48. 30 35
      pages/mycenter/myinformation/myaccount.vue
  49. 614 28
      pages/mycenter/myinformation/mybank.vue
  50. 132 0
      pages/mycenter/myinformation/myinformation.vue
  51. 95 69
      pages/mycenter/myinformation/mylocation.vue
  52. 639 0
      pages/mycenter/myinformation/myzhifubao.vue
  53. 13 86
      pages/mycenter/myinformation/personinfo.vue
  54. 0 211
      pages/mycenter/mytask/applytask.vue
  55. 0 212
      pages/mycenter/mytask/endtask.vue
  56. 0 211
      pages/mycenter/mytask/executetask.vue
  57. 248 29
      pages/mycenter/mytask/mytask.vue
  58. 26 3
      pages/tasksquare/bindinfo.vue
  59. 5 4
      pages/tasksquare/cooperation.vue
  60. 3 2
      pages/tasksquare/guide.vue
  61. 73 26
      pages/tasksquare/information.vue
  62. 1125 0
      pages/tasksquare/search.vue
  63. 340 0
      pages/tasksquare/specialTask/information.vue
  64. 1570 0
      pages/tasksquare/specialTask/specialTaskDetail.vue
  65. 27 28
      pages/tasksquare/success.vue
  66. 421 336
      pages/tasksquare/taskdetail.vue
  67. 214 263
      pages/tasksquare/tasksquare.vue
  68. 288 4
      pages/test/test.vue
  69. 8 4
      pages/workspace/applyInformation.vue
  70. 114 0
      pages/workspace/datarecord.vue
  71. 12 6
      pages/workspace/deliveryInformation.vue
  72. 761 0
      pages/workspace/editaddress.vue
  73. 97 0
      pages/workspace/linkrecord.vue
  74. 26 24
      pages/workspace/scriptrecord.vue
  75. 105 0
      pages/workspace/sketchrecord.vue
  76. 724 97
      pages/workspace/taskdetail.vue
  77. 345 0
      pages/workspace/uploaddata.vue
  78. 258 0
      pages/workspace/uploadlink.vue
  79. 47 27
      pages/workspace/uploadscript.vue
  80. 392 0
      pages/workspace/uploadsketch.vue
  81. 136 81
      pages/workspace/workspace.vue
  82. TEMPAT SAMPAH
      static/delete.png
  83. TEMPAT SAMPAH
      static/img/copy.png
  84. TEMPAT SAMPAH
      static/img/delete.png
  85. TEMPAT SAMPAH
      static/img/help.png
  86. TEMPAT SAMPAH
      static/img/icon-edit.png
  87. TEMPAT SAMPAH
      static/img/type1.png
  88. TEMPAT SAMPAH
      static/img/type2.png
  89. TEMPAT SAMPAH
      static/img/type3.png
  90. TEMPAT SAMPAH
      static/img/type4.png
  91. TEMPAT SAMPAH
      static/img/younggee_logo.png
  92. 3 0
      uni_modules/Sansnn-uQRCode/changelog.md
  93. 71 0
      uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue
  94. 71 0
      uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue
  95. 241 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/bridge/bridge-weex.js
  96. 18 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleLinearGradient.js
  97. 8 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStylePattern.js
  98. 17 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleRadialGradient.js
  99. 666 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/RenderingContext.js
  100. 11 0
      uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/ActiveInfo.js

+ 1 - 1
components/htz-image-upload/htz-image-upload.vue

@@ -528,7 +528,7 @@
 	.preview-full-close {
 		position: fixed;
 		right: 32rpx;
-		top: 25rpx;
+		top: 150rpx;
 		width: 80rpx;
 		height: 80rpx;
 		line-height: 60rpx;

+ 157 - 0
components/lime-painter/changelog.md

@@ -0,0 +1,157 @@
+## 1.9.3.5(2022-06-29)
+- feat: justifyContent 增加 `space-around`、`space-between`
+- feat: canvas 2d 也使用`getImageInfo`
+- fix: 修复 `text`的 `text-decoration`错位
+## 1.9.3.4(2022-06-20)
+- fix: 修复 因创建节点速度问题导致顺序出错。 
+- fix: 修复 微信小程序 PC 无法显示本地图片 
+- fix: 修复 flex-box 对齐问题 
+- feat: 增加 `text-shadow`
+- feat: 重写 `text` 对齐方式
+- chore: 更新文档
+## 1.9.3.3(2022-06-17)
+- fix: 修复 支付宝小程序 canvas 2d 存在ctx.draw问题导致报错
+- fix: 修复 支付宝小程序 toDataURL 存在权限问题改用 `toTempFilePath`
+- fix: 修复 支付宝小程序 image size 问题导致 `objectFit` 无效
+## 1.9.3.2(2022-06-14)
+- fix: 修复 image 设置背景色不生效问题
+- fix: 修复 nvue 环境判断缺少参数问题
+## 1.9.3.1(2022-06-14)
+- fix: 修复 bottom 定位不对问题
+- fix: 修复 因小数导致计算出错换行问题
+- feat: 增加 `useCORS` h5端图片跨域 在设置请求头无效果后试一下设置这个值
+- chore: 更新文档
+## 1.9.3(2022-06-13)
+- feat: 增加 `zIndex`
+- feat: 增加 `flex-box` 该功能处于原始阶段,非常简陋。
+- tips: QQ小程序 vue3 不支持, 为 uni 官方BUG
+## 1.9.2.9(2022-06-10)
+- fix: 修复`text-align`及`margin`居中问题
+## 1.9.2.8(2022-06-10)
+- fix: 修复 Nvue `canvasToTempFilePathSync` 不生效问题
+## 1.9.2.7(2022-06-10)
+- fix: 修复 margin及padding的bug
+- fix: 修复 Nvue `isCanvasToTempFilePath` 不生效问题
+## 1.9.2.6(2022-06-09)
+- fix: 修复 Nvue 不显示
+- feat: 增加支持字体渐变
+```html
+<l-painter-text 
+	text="水调歌头\n明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在人间。"
+	css="background: linear-gradient(,#ff971b 0%, #1989fa 100%); background-clip: text" />
+```
+## 1.9.2.5(2022-06-09)
+- chore: 更变获取父级宽度的设定
+- chore: `pathType` 在canvas 2d 默认为 `url`
+## 1.9.2.4(2022-06-08)
+- fix: 修复 `pathType` 不生效问题
+## 1.9.2.3(2022-06-08)
+- fix: 修复 `canvasToTempFilePath` 漏写 `success` 参数
+## 1.9.2.2(2022-06-07)
+- chore: 更新文档
+## 1.9.2.1(2022-06-07)
+- fix: 修复 vue3 赋值给this再传入导致image无法绘制
+- fix: 修复 `canvasToTempFilePathSync` 时机问题
+- feat: canvas 2d 更改图片生成方式 `toDataURL` 
+## 1.9.2(2022-05-30)
+- fix: 修复 `canvasToTempFilePathSync` 在 vue3 下只生成一次
+## 1.9.1.7(2022-05-28)
+- fix: 修复 `qrcode`显示不全问题
+## 1.9.1.6(2022-05-28)
+- fix: 修复 `canvasToTempFilePathSync` 会重复多次问题
+- fix: 修复 `view` css `backgroundImage` 图片下载失败导致 子节点不渲染
+## 1.9.1.5(2022-05-27)
+- fix: 修正支付宝小程序 canvas 2d版本号 2.7.15
+## 1.9.1.4(2022-05-22)
+- fix: 修复字节小程序无法使用xml方式
+- fix: 修复字节小程序无法使用base64(非2D情况下工具上无法显示)
+- fix: 修复支付宝小程序 `canvasToTempFilePath` 报错
+## 1.9.1.3(2022-04-29)
+- fix: 修复vue3打包后uni对象为空后的报错
+## 1.9.1.2(2022-04-25)
+- fix: 删除多余文件
+## 1.9.1.1(2022-04-25)
+- fix: 修复图片不显示问题
+## 1.9.1(2022-04-12)
+- fix: 因四舍五入导致有些机型错位
+- fix: 修复无views报错 
+- chore: nvue下因ios无法读取插件内static文件,改由下载方式
+## 1.9.0(2022-03-20)
+- fix: 因无法固定尺寸导致生成图片不全
+- fix: 特定情况下text判断无效
+- chore: 本地化APP Nvue webview
+## 1.8.9(2022-02-20)
+- fix: 修复 小程序下载最多10次并发的问题
+- fix: 修复 APP端无法获取本地图片
+- fix: 修复 APP Nvue端不执行问题
+- chore: 增加图片缓存机制
+## 1.8.8.8(2022-01-27)
+- fix: 修复 主动调用尺寸问题
+## 1.8.8.6(2022-01-26)
+- fix: 修复 nvue 下无宽度时获取父级宽度 
+- fix: 修复 ios app 无法渲染问题
+## 1.8.8(2022-01-23)
+- fix: 修复 主动调用时无节点问题
+- fix: 修复 `box-shadow` 颜色问题
+- fix: 修复 `transform:rotate` 角度位置问题
+- feat: 增加 `overflow:hidden`
+## 1.8.7(2022-01-07)
+- fix: 修复 image 方向为 `right` 时原始宽高问题
+- feat: 支持 view 设置背景图 `background-image: url(xxx)`
+- chore: 去掉可选链
+## 1.8.6(2021-11-28)
+- feat: 支持`view`对`inline-block`的子集使用`text-align`
+## 1.8.5.5(2021-08-17)
+- chore: 更新文档,删除 replace
+- fix: 修复 text 值为 number时报错
+## 1.8.5.4(2021-08-16)
+- fix: 字节小程序兼容
+## 1.8.5.3(2021-08-15)
+- fix: 修复线性渐变与css现实效果不一致的问题
+- chore: 更新文档
+## 1.8.5.2(2021-08-13)
+- chore: 增加`background-image`、`background-repeat` 能力,主要用于背景纹理的绘制,并不是代替`image`。例如:大面积的重复平铺的水印
+- 注意:这个功能H5暂时无法使用,因为[官方的API有BUG](https://ask.dcloud.net.cn/question/128793),待官方修复!!!
+## 1.8.5.1(2021-08-10)
+- fix: 修复因`margin`报错问题
+## 1.8.5(2021-08-09)
+- chore: 增加margin支持`auto`,以达到居中效果
+## 1.8.4(2021-08-06)
+- chore: 增加判断缓存文件条件
+- fix: 修复css 多余空格报错问题
+## 1.8.3(2021-08-04)
+- tips: 1.6.x 以下的版本升级到1.8.x后要为每个元素都加上定位:position: 'absolute'
+- fix: 修复只有一个view子元素时不计算高度的问题
+## 1.8.2(2021-08-03)
+- fix: 修复 path-type 为 `url` 无效问题
+- fix: 修复 qrcode `text` 为空时报错问题
+- fix: 修复 image `src` 动态设置时不生效问题
+- feat: 增加 css 属性 `min-width` `max-width`
+## 1.8.1(2021-08-02)
+- fix: 修复无法加载本地图片
+## 1.8.0(2021-08-02)
+- chore 文档更新
+- 使用旧版的同学不要升级!
+## 1.8.0-beta(2021-07-30)
+- ## 全新布局方式 不兼容旧版!
+- chore: 布局方式变更
+- tips: 微信canvas 2d 不支持真机调试
+## 1.6.6(2021-07-09)
+- chore: 统一命名规范,无须主动引入组件
+## 1.6.5(2021-06-08)
+- chore: 去掉console
+## 1.6.4(2021-06-07)
+- fix: 修复 数字 为纯字符串时不转换的BUG
+## 1.6.3(2021-06-06)
+- fix: 修复 PC 端放大的BUG
+## 1.6.2(2021-05-31)
+- fix: 修复 报`adaptor is not a function`错误
+- fix: 修复 text 多行高度
+- fix: 优化 默认文字的基准线
+- feat: `@progress`事件,监听绘制进度
+## 1.6.1(2021-02-28)
+- 删除多余节点
+## 1.6.0(2021-02-26)
+- 调整为uni_modules目录规范
+- 修复:transform的rotate不能为负数问题
+- 新增:`pathType` 指定生成图片返回的路径类型,可选值有 `base64`、`url`

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

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

+ 27 - 0
components/lime-painter/components/l-painter-image/l-painter-image.vue

@@ -0,0 +1,27 @@
+<template>
+	
+</template>
+
+<script>
+	import {parent, children} from '../common/relation';
+	export default {
+		name: 'lime-painter-image',
+		mixins:[children('painter')],
+		props: {
+			css: [String, Object],
+			src: String
+		},
+		data() {
+			return {
+				type: 'image',
+				el: {
+					css: {},
+					src: null
+				},
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 26 - 0
components/lime-painter/components/l-painter-qrcode/l-painter-qrcode.vue

@@ -0,0 +1,26 @@
+<template>
+</template>
+
+<script>
+	import {parent, children} from '../common/relation';
+	export default {
+		name: 'lime-painter-qrcode',
+		mixins:[children('painter')],
+		props: {
+			css: [String, Object],
+			text: String
+		},
+		data() {
+			return {
+				type: 'qrcode',
+				el: {
+					css: {},
+					text: null
+				},
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 28 - 0
components/lime-painter/components/l-painter-text/l-painter-text.vue

@@ -0,0 +1,28 @@
+<template>
+	<text style="opacity: 0;height: 0;"><slot/></text>
+</template>
+
+<script>
+	import {parent, children} from '../common/relation';
+	export default {
+		name: 'lime-painter-text',
+		mixins:[children('painter')],
+		props: {
+			css: [String, Object],
+			text: [String, Number],
+			replace: Object,
+		},
+		data() {
+			return {
+				type: 'text',
+				el: {
+					css: {},
+					text: null
+				},
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 29 - 0
components/lime-painter/components/l-painter-view/l-painter-view.vue

@@ -0,0 +1,29 @@
+<template>
+	<view><slot/></view>
+</template>
+
+<script>
+	import {parent, children} from '../common/relation';
+	export default {
+		name: 'lime-painter-view',
+		mixins:[children('painter'), parent('painter')],
+		props: {
+			css: [String, Object],
+		},
+		data() {
+			return {
+				type: 'view',
+				el: {
+					css: {},
+					views:[]
+				},
+			}
+		},
+		mounted() {
+			
+		}
+	}
+</script>
+
+<style>
+</style>

+ 407 - 0
components/lime-painter/components/l-painter/l-painter.vue

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

+ 218 - 0
components/lime-painter/components/l-painter/nvue.js

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

File diff ditekan karena terlalu besar
+ 0 - 0
components/lime-painter/components/l-painter/painter.js


+ 50 - 0
components/lime-painter/components/l-painter/props.js

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

+ 479 - 0
components/lime-painter/components/l-painter/utils.js

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

+ 2 - 0
components/lime-painter/components/lime-painter/index.vue

@@ -0,0 +1,2 @@
+<template>
+</template>

+ 95 - 0
components/lime-painter/package.json

@@ -0,0 +1,95 @@
+{
+  "id": "lime-painter",
+  "displayName": "海报画板",
+  "version": "1.9.3.5",
+  "description": "一款canvas海报组件,更优雅的海报生成方案",
+  "keywords": [
+    "海报",
+    "canvas",
+    "生成海报",
+    "生成二维码",
+    "JSON"
+],
+  "repository": "https://gitee.com/liangei/lime-painter", 
+  "engines": {
+    "HBuilderX": "^3.4.14"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": "305716444"
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "u",
+          "Edge": "u",
+          "Firefox": "u",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+        "QQ": "y",
+        "钉钉": "u",
+        "快手": "u",
+        "飞书": "u",
+        "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  },
+  "name": "lime-painter",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC"
+}

+ 911 - 0
components/lime-painter/readme.md

@@ -0,0 +1,911 @@
+# Painter 画板 测试版
+
+> uniapp 海报画板,更优雅的海报生成方案  
+> [查看更多 站点 1](https://limeui.qcoon.cn/#/painter)  
+> [查看更多 站点 2](http://liangei.gitee.io/limeui/#/painter)  
+> Q 群:806744170
+
+## 平台兼容
+
+| H5  | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ 小程序 | App |
+| --- | ---------- | ------------ | ---------- | ---------- | --------- | --- |
+| √   | √          | √            | 未测       | √          | √         | √   |
+
+## 安装
+在市场导入**[海报画板](https://ext.dcloud.net.cn/plugin?id=2389)uni_modules**版本的即可,无需`import`
+
+## 代码演示
+
+### 基本用法
+
+- 插件提供 JSON 及 XML 的方式绘制海报
+- 参考 css 块状流布局模拟 css schema。
+
+
+#### 方式一 XML
+
+- 提供`l-painter-view`、`l-painter-text`、`l-painter-image`、`l-painter-qrcode`四种类型组件
+- 通过 `css` 属性绘制样式,与 style 使用方式保持一致。
+```html
+<l-painter>
+	//如果使用XML出现顺序错乱,可使用`template` 等所有变量完成再显示
+	<template v-if="show">
+		<l-painter-view
+			css="background: #07c160; height: 120rpx; width: 120rpx; display: inline-block"
+		></l-painter-view>
+		<l-painter-view
+			css="background: #1989fa; height: 120rpx; width: 120rpx; border-top-right-radius: 60rpx; border-bottom-left-radius: 60rpx; display: inline-block; margin: 0 30rpx;"
+		></l-painter-view>
+		<l-painter-view
+			css="background: #ff9d00; height: 120rpx; width: 120rpx; border-radius: 50%; display: inline-block"
+		></l-painter-view>
+	<template>
+</l-painter>
+```
+
+#### 方式二 JSON
+
+- 在 json 里四种类型组件的`type`为`view`、`text`、`image`、`qrcode`
+- 通过 `board` 设置海报所需的 JSON 数据进行绘制或`ref`获取组件实例调用组件内的`render(json)`
+- 所有类型的 schema 都具有`css`字段,css 的 key 值使用**驼峰**如:`lineHeight`
+
+```html
+<l-painter :board="poster"/>
+```
+
+```js
+data() {
+	return {
+		poster: {
+			css: {
+				// 根节点若无尺寸,自动获取父级节点
+				width: '750rpx'
+			},
+			views: [
+				{
+					css: {
+						background: "#07c160",
+						height: "120rpx",
+						width: "120rpx",
+						display: "inline-block"
+					},
+					type: "view"
+				},
+				{
+					css: {
+						background: "#1989fa",
+						height: "120rpx",
+						width: "120rpx",
+						borderTopRightRadius: "60rpx",
+						borderBottomLeftRadius: "60rpx",
+						display: "inline-block",
+						margin: "0 30rpx"
+					},
+					views: [],
+					type: "view"
+				},
+				{
+					css: {
+						background: "#ff9d00",
+						height: "120rpx",
+						width: "120rpx",
+						borderRadius: "50%",
+						display: "inline-block"
+					},
+					views: [],
+					type: "view"
+				},
+			]
+		}
+	}
+}
+```
+
+### View 容器
+
+- 类似于 `div` 可以嵌套承载更多的 view、text、image,qrcode 共同构建一颗完整的节点树
+- 在 JSON 里具有 `views` 的数组字段,用于嵌套承载节点。
+
+#### 方式一 XML
+
+```html
+<l-painter>
+  <l-painter-view css="background: #f0f0f0; padding-top: 100rpx;">
+    <l-painter-view
+      css="background: #d9d9d9; width: 33.33%; height: 100rpx; display: inline-block"
+    ></l-painter-view>
+    <l-painter-view
+      css="background: #bfbfbf; width: 66.66%; height: 100rpx; display: inline-block"
+    ></l-painter-view>
+  </l-painter-view>
+</l-painter>
+```
+
+#### 方式二 JSON
+
+```js
+{
+	css: {},
+	views: [
+		{
+			type: 'view',
+			css: {
+				background: '#f0f0f0',
+				paddingTop: '100rpx'
+			},
+			views: [
+				{
+					type: 'view',
+					css: {
+						background: '#d9d9d9',
+						width: '33.33%',
+						height: '100rpx',
+						display: 'inline-block'
+					}
+				},
+				{
+					type: 'view',
+					css: {
+						background: '#bfbfbf',
+						width: '66.66%',
+						height: '100rpx',
+						display: 'inline-block'
+					}
+				}
+			],
+
+		}
+	]
+}
+```
+
+### Text 文本
+
+- 通过 `text` 属性填写文本内容。
+- 支持`\n`换行符
+- 支持省略号,使用 css 的`line-clamp`设置行数,当文字内容超过会显示省略号。
+- 支持`text-decoration`
+
+#### 方式一 XML
+
+```html
+<l-painter>
+  <l-painter-view css="background: #e0e2db; padding: 30rpx; color: #222a29">
+    <l-painter-text
+      text="登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼"
+    />
+    <l-painter-text
+      text="登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼"
+      css="text-align:center; padding-top: 20rpx; text-decoration: line-through "
+    />
+    <l-painter-text
+      text="登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼"
+      css="text-align:right; padding-top: 20rpx"
+    />
+    <l-painter-text
+      text="水调歌头\n明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在人间。"
+      css="line-clamp: 3; padding-top: 20rpx; background: linear-gradient(,#ff971b 0%, #ff5000 100%); background-clip: text"
+    />
+  </l-painter-view>
+</l-painter>
+```
+
+#### 方式二 JSON
+
+```js
+// 基础用法
+{
+	type: 'text',
+	text: '登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼',
+},
+{
+	type: 'text',
+	text: '登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼',
+	css: {
+		// 设置居中对齐
+		textAlign: 'center',
+		// 设置中划线
+		textDecoration: 'line-through'
+	}
+},
+{
+	type: 'text',
+	text: '登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼',
+	css: {
+		// 设置右对齐
+		textAlign: 'right',
+	}
+},
+{
+	type: 'text',
+	text: '登鹳雀楼\n白日依山尽,黄河入海流\n欲穷千里目,更上一层楼',
+	css: {
+		// 设置行数,超出显示省略号
+		lineClamp: 3,
+		// 渐变文字
+		background: 'linear-gradient(,#ff971b 0%, #1989fa 100%)',
+		backgroundClip: 'text'
+	}
+}
+```
+
+### Image 图片
+
+- 通过 `src` 属性填写图片路径。
+- 图片路径支持:网络图片,本地 static 里的图片路径,缓存路径
+- 通过 `css` 的 `object-fit`属性可以设置图片的填充方式,可选值见下方 CSS 表格。
+- 通过 `css` 的 `object-position`配合 `object-fit` 可以设置图片的对齐方式,类似于`background-position`,详情见下方 CSS 表格。
+- 使用网络图片时:小程序需要去公众平台配置 [downloadFile](https://mp.weixin.qq.com/) 域名
+- 使用网络图片时:**H5 和 Nvue 需要决跨域问题**
+
+#### 方式一 XML
+
+```html
+<l-painter>
+  <!-- 基础用法 -->
+  <l-painter-image
+    src="https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg"
+    css="width: 200rpx; height: 200rpx"
+  />
+  <!-- 填充方式 -->
+  <!-- css object-fit 设置 填充方式 见下方表格-->
+  <l-painter-image
+    src="https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg"
+    css="width: 200rpx; height: 200rpx; object-fit: contain; background: #eee"
+  />
+  <!-- css object-position 设置 图片的对齐方式-->
+  <l-painter-image
+    src="https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg"
+    css="width: 200rpx; height: 200rpx; object-fit: contain; object-position: 50% 50%; background: #eee"
+  />
+</l-painter>
+```
+
+#### 方式二 JSON
+
+```js
+// 基础用法
+{
+	type: 'image',
+	src: 'https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg',
+	css: {
+		width: '200rpx',
+		height: '200rpx'
+	}
+},
+// 填充方式
+// css objectFit 设置 填充方式 见下方表格
+{
+	type: 'image',
+	src: 'https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg',
+	css: {
+		width: '200rpx',
+		height: '200rpx',
+		objectFit: 'contain'
+	}
+},
+// css objectPosition 设置 图片的对齐方式
+{
+	type: 'image',
+	src: 'https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg',
+	css: {
+		width: '200rpx',
+		height: '200rpx',
+		objectFit: 'contain',
+		objectPosition: '50% 50%'
+	}
+}
+```
+
+### Qrcode 二维码
+
+- 通过`text`属性填写需要生成二维码的文本。
+- 通过 `css` 里的 `color` 可设置生成码点的颜色。
+- 通过 `css` 里的 `background`可设置背景色。
+- 通过 `css `里的 `width`、`height`设置尺寸。
+
+#### 方式一 XML
+
+```html
+<l-painter>
+  <l-painter-qrcode
+    text="limeui.qcoon.cn"
+    css="width: 200rpx; height: 200rpx"
+  />
+</l-painter>
+```
+
+#### 方式二 JSON
+
+```js
+{
+	type: 'qrcode',
+	text: 'limeui.qcoon.cn',
+	css: {
+		width: '200rpx',
+		height: '200rpx',
+	}
+}
+```
+
+### 生成图片
+
+- 1、通过设置`isCanvasToTempFilePath`自动生成图片并在 `@success` 事件里接收海报临时路径
+- 2、通过调用内部方法生成图片:
+
+```html
+<l-painter ref="painter">...code</l-painter>
+```
+
+```js
+this.$refs.painter.canvasToTempFilePathSync({
+  fileType: "jpg",
+  // 如果返回的是base64是无法使用 saveImageToPhotosAlbum,需要设置 pathType为url
+  pathType: 'url',
+  quality: 1,
+  success: (res) => {
+    console.log(res.tempFilePath);
+	// 非H5 保存到相册
+	// H5 提示用户长按图另存
+	uni.saveImageToPhotosAlbum({
+		filePath: res.tempFilePath,
+		success: function () {
+			console.log('save success');
+		}
+	});
+  },
+});
+```
+
+### 主动调用方式
+
+- 通过获取组件实例内部的`render`函数 传递`JSON`即可
+
+```html
+<l-painter ref="painter" />
+```
+
+```js
+// 渲染
+this.$refs.painter.render(jsonSchema);
+// 生成图片
+this.$refs.painter.canvasToTempFilePathSync({
+  fileType: "jpg",
+  // 如果返回的是base64是无法使用 saveImageToPhotosAlbum,需要设置 pathType为url
+  pathType: 'url',
+  quality: 1,
+  success: (res) => {
+    console.log(res.tempFilePath);
+	// 非H5 保存到相册
+	uni.saveImageToPhotosAlbum({
+		filePath: res.tempFilePath,
+		success: function () {
+			console.log('save success');
+		}
+	});
+  },
+});
+```
+
+
+### H5跨域
+- 一般是需要后端或管理OSS资源的大佬处理
+- 一般OSS的处理方式:
+
+1、设置来源
+```cmd
+*
+```
+
+2、允许Methods
+```html
+GET
+```
+
+3、允许Headers
+```html
+access-control-allow-origin:*
+```
+
+4、最后如果还是不行,可试下给插件设置`useCORS`
+```html
+<l-painter useCORS>
+```
+
+
+
+### 海报示例
+
+- 提供一份示例,只把插件当成生成图片的工具,非必要不要在弹窗里使用。
+- 通过设置`isCanvasToTempFilePath`主动生成图片,再由 `@success` 事件接收海报临时路径
+- 设置`custom-style="position: fixed; left: 200%"`样式把画板移到屏幕之外,达到隐藏画板的效果。
+- **注意**:受平台影响海报画板最好不要隐藏,可能会无法生成图片。
+
+#### 方式一 XML
+
+```html
+<image :src="path" mode="widthFix"></image>
+<l-painter
+  isCanvasToTempFilePath
+  @success="path = $event"
+  custom-style="position: fixed; left: 200%"
+  css="width: 750rpx; padding-bottom: 40rpx; background: linear-gradient(,#ff971b 0%, #ff5000 100%)"
+>
+  <l-painter-image
+    src="https://cdn.jsdelivr.net/gh/liangei/image@latest/avatar-1.jpeg"
+    css="margin-left: 40rpx; margin-top: 40rpx; width: 84rpx;  height: 84rpx; border-radius: 50%;"
+  />
+  <l-painter-view
+    css="margin-top: 40rpx; padding-left: 20rpx; display: inline-block"
+  >
+    <l-painter-text
+      text="隔壁老王"
+      css="display: block; padding-bottom: 10rpx; color: #fff; font-size: 32rpx; fontWeight: bold"
+    />
+    <l-painter-text
+      text="为您挑选了一个好物"
+      css="color: rgba(255,255,255,.7); font-size: 24rpx"
+    />
+  </l-painter-view>
+  <l-painter-view
+    css="margin-left: 40rpx; margin-top: 30rpx; padding: 32rpx; box-sizing: border-box; background: #fff; border-radius: 16rpx; width: 670rpx; box-shadow: 0 20rpx 58rpx rgba(0,0,0,.15)"
+  >
+    <l-painter-image
+      src="https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg"
+      css="object-fit: cover; object-position: 50% 50%; width: 606rpx; height: 606rpx; border-radius: 12rpx;"
+    />
+    <l-painter-view
+      css="margin-top: 32rpx; color: #FF0000; font-weight: bold; font-size: 28rpx; line-height: 1em;"
+    >
+      <l-painter-text text="¥" css="vertical-align: bottom" />
+      <l-painter-text
+        text="39"
+        css="vertical-align: bottom; font-size: 58rpx"
+      />
+      <l-painter-text text=".39" css="vertical-align: bottom" />
+      <l-painter-text
+        text="¥59.99"
+        css="vertical-align: bottom; padding-left: 10rpx; font-weight: normal; text-decoration: line-through; color: #999999"
+      />
+    </l-painter-view>
+    <l-painter-view css="margin-top: 32rpx; font-size: 26rpx; color: #8c5400">
+      <l-painter-text text="自营" css="color: #212121; background: #ffb400;" />
+      <l-painter-text
+        text="30天最低价"
+        css="margin-left: 16rpx; background: #fff4d9; text-decoration: line-through;"
+      />
+      <l-painter-text
+        text="满减优惠"
+        css="margin-left: 16rpx; background: #fff4d9"
+      />
+      <l-painter-text
+        text="超高好评"
+        css="margin-left: 16rpx; background: #fff4d9"
+      />
+    </l-painter-view>
+    <l-painter-view css="margin-top: 30rpx">
+      <l-painter-text
+        css="line-clamp: 2; color: #333333; line-height: 1.8em; font-size: 36rpx; width: 478rpx; padding-right:32rpx; box-sizing: border-box"
+        text="360儿童电话手表9X 智能语音问答定位支付手表 4G全网通20米游泳级防水视频通话拍照手表男女孩星空蓝"
+      ></l-painter-text>
+      <l-painter-qrcode
+        css="width: 128rpx; height: 128rpx;"
+        text="limeui.qcoon.cn"
+      ></l-painter-qrcode>
+    </l-painter-view>
+  </l-painter-view>
+</l-painter>
+```
+
+```js
+data() {
+	return {
+		path: ''
+	}
+}
+```
+
+#### 方式二 JSON
+
+```html
+<image :src="path" mode="widthFix"></image>
+<l-painter
+  :board="poster"
+  isCanvasToTempFilePath
+  @success="path = $event"
+  custom-style="position: fixed; left: 200%"
+/>
+```
+
+```js
+data() {
+	return {
+		path: '',
+		poster: {
+		    css: {
+		        width: "750rpx",
+		        paddingBottom: "40rpx",
+		        background: "linear-gradient(,#000 0%, #ff5000 100%)"
+		    },
+		    views: [
+		        {
+		            src: "https://fastly.jsdelivr.net/gh/liangei/image@latest/avatar-1.jpeg",
+		            type: "image",
+		            css: {
+		                background: "#fff",
+		                objectFit: "cover",
+		                marginLeft: "40rpx",
+		                marginTop: "40rpx",
+		                width: "84rpx",
+		                border: "2rpx solid #fff",
+		                boxSizing: "border-box",
+		                height: "84rpx",
+		                borderRadius: "50%"
+		            }
+		        },
+		        {
+		            type: "view",
+		            css: {
+		                marginTop: "40rpx",
+		                paddingLeft: "20rpx",
+		                display: "inline-block"
+		            },
+		            views: [
+		                {
+		                    text: "隔壁老王",
+		                    type: "text",
+		                    css: {
+		                        display: "block",
+		                        paddingBottom: "10rpx",
+		                        color: "#fff",
+		                        fontSize: "32rpx",
+		                        fontWeight: "bold"
+		                    }
+		                },
+		                {
+		                    text: "为您挑选了一个好物",
+		                    type: "text",
+		                    css: {
+		                        color: "rgba(255,255,255,.7)",
+		                        fontSize: "24rpx"
+		                    },
+		                }
+		            ],
+		        },
+		        {
+		            css: {
+		                marginLeft: "40rpx",
+		                marginTop: "30rpx",
+		                padding: "32rpx",
+		                boxSizing: "border-box",
+		                background: "#fff",
+		                borderRadius: "16rpx",
+		                width: "670rpx",
+		                boxShadow: "0 20rpx 58rpx rgba(0,0,0,.15)"
+		            },
+		            views: [
+		                {
+							src: "https://m.360buyimg.com/babel/jfs/t1/196317/32/13733/288158/60f4ea39E6fb378ed/d69205b1a8ed3c97.jpg",
+							type: "image",
+		                    css: {
+		                        objectFit: "cover",
+		                        objectPosition: "50% 50%",
+		                        width: "606rpx",
+		                        height: "606rpx"
+		                    },
+		                }, {
+		                    css: {
+		                        marginTop: "32rpx",
+		                        color: "#FF0000",
+		                        fontWeight: "bold",
+		                        fontSize: "28rpx",
+		                        lineHeight: "1em"
+		                    },
+		                    views: [{
+								text: "¥",
+								type: "text",
+		                        css: {
+		                            verticalAlign: "bottom"
+		                        },
+		                    }, {
+								text: "39",
+								type: "text",
+		                        css: {
+		                            verticalAlign: "bottom",
+		                            fontSize: "58rpx"
+		                        },
+		                    }, {
+								text: ".39",
+								type: "text",
+		                        css: {
+		                            verticalAlign: "bottom"
+		                        },
+		                    }, {
+								text: "¥59.99",
+								type: "text",
+		                        css: {
+		                            verticalAlign: "bottom",
+		                            paddingLeft: "10rpx",
+		                            fontWeight: "normal",
+		                            textDecoration: "line-through",
+		                            color: "#999999"
+		                        }
+		                    }],
+
+		                    type: "view"
+		                }, {
+		                    css: {
+		                        marginTop: "32rpx",
+		                        fontSize: "26rpx",
+		                        color: "#8c5400"
+		                    },
+		                    views: [{
+								text: "自营",
+								type: "text",
+		                        css: {
+		                            color: "#212121",
+		                            background: "#ffb400"
+		                        },
+		                    }, {
+								text: "30天最低价",
+								type: "text",
+		                        css: {
+		                            marginLeft: "16rpx",
+		                            background: "#fff4d9",
+		                            textDecoration: "line-through"
+		                        },
+		                    }, {
+								text: "满减优惠",
+								type: "text",
+		                        css: {
+		                            marginLeft: "16rpx",
+		                            background: "#fff4d9"
+		                        },
+		                    }, {
+								text: "超高好评",
+								type: "text",
+		                        css: {
+		                            marginLeft: "16rpx",
+		                            background: "#fff4d9"
+		                        },
+
+		                    }],
+
+		                    type: "view"
+		                }, {
+		                    css: {
+		                        marginTop: "30rpx"
+		                    },
+		                    views: [
+								{
+									text: "360儿童电话手表9X 智能语音问答定位支付手表 4G全网通20米游泳级防水视频通话拍照手表男女孩星空蓝",
+									type: "text",
+									css: {
+										paddingRight: "32rpx",
+										boxSizing: "border-box",
+										lineClamp: 2,
+										color: "#333333",
+										lineHeight: "1.8em",
+										fontSize: "36rpx",
+										width: "478rpx"
+		                        },
+		                    }, {
+								text: "limeui.qcoon.cn",
+								type: "qrcode",
+		                        css: {
+		                            width: "128rpx",
+		                            height: "128rpx",
+		                        },
+
+		                    }],
+		                    type: "view"
+		                }],
+		            type: "view"
+		        }
+		    ]
+		}
+	}
+}
+```
+
+### Nvue
+- 必须为HBX 3.4.11及以上
+
+
+### 原生小程序
+
+- 插件里的`painter.js`支持在原生小程序中使用
+- new Painter 之后在`source`里传入 JSON
+- 再调用`render`绘制海报
+- 如需生成图片,请查看微信小程序 cavnas 的[canvasToTempFilePath](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html)
+
+```html
+<canvas type="2d" id="painter" style="width: 100%"></canvas>
+```
+
+```js
+import { Painter } from "./painter";
+page({
+  data: {
+    poster: {
+      css: {
+        width: "750rpx",
+      },
+      views: [
+        {
+          type: "view",
+          css: {
+            background: "#d2d4c8",
+            paddingTop: "100rpx",
+          },
+          views: [
+            {
+              type: "view",
+              css: {
+                background: "#5f7470",
+                width: "33.33%",
+                height: "100rpx",
+                display: "inline-block",
+              },
+            },
+            {
+              type: "view",
+              css: {
+                background: "#889696",
+                width: "33.33%",
+                height: "100rpx",
+                display: "inline-block",
+              },
+            },
+            {
+              type: "view",
+              css: {
+                background: "#b8bdb5",
+                width: "33.33%",
+                height: "100rpx",
+                display: "inline-block",
+              },
+            },
+          ],
+        },
+      ],
+    },
+  },
+  async onLoad() {
+    const res = await this.getCentext();
+    const painter = new Painter(res);
+    // 返回计算布局后的整个内容尺寸
+    const { width, height } = await painter.source(this.data.poster);
+    // 得到计算后的尺寸后 可给canvas尺寸赋值,达到动态响应效果
+    // 渲染
+    await painter.render();
+  },
+  // 获取canvas 2d
+  // 非2d也可以使用这里只是举个例子
+  getCentext() {
+    return new Promise((resolve) => {
+      wx.createSelectorQuery()
+        .select(`#painter`)
+        .node()
+        .exec((res) => {
+          let { node: canvas } = res[0];
+          resolve({
+            canvas,
+            context: canvas.getContext("2d"),
+            width: canvas.width,
+            height: canvas.height,
+            pixelRatio: 2,
+          });
+        });
+    });
+  },
+});
+```
+
+### 旧版(1.6.x)更新
+
+- 由于 1.8.x 版放弃了以定位的方式,所以 1.6.x 版更新之后要每个样式都加上`position: absolute`
+- 旧版的 `image` mode 模式被放弃,使用`object-fit`
+- 旧版的 `isRenderImage` 改成 `is-canvas-to-temp-filePath`
+- 旧版的 `maxLines` 改成 `line-clamp`
+
+## API
+
+### Props
+
+| 参数                       | 说明                                                         | 类型             | 默认值       |
+| -------------------------- | ------------------------------------------------------------ | ---------------- | ------------ |
+| board                      | JSON 方式的海报元素对象集                                    | <em>object</em>  | -            |
+| css                        | 海报最外层的样式,可以理解为`body`                           | <em>object</em>  | 参数请向下看 |
+| custom-style               | canvas 自定义样式                                            | <em>string</em>  |              |
+| is-canvas-to-temp-filePath | 是否生成图片,在`@success`事件接收图片地址                   | <em>boolean</em> | `false`      |
+| after-delay                | 生成图片错乱,可延时生成图片                                 | <em>number</em>  | `100`        |
+| type                       | canvas 类型,对微信头条支付宝小程序可有效,可选值:`2d`,`''` | <em>string</em>  | `2d`         |
+| file-type                  | 生成图片的后缀类型, 可选值:`png`、`jpg`                     | <em>string</em>  | `png`        |
+| path-type                  | 生成图片路径类型,可选值`url`、`base64`                      | <em>string</em>  | `-`          |
+| pixel-ratio                | 生成图片的像素密度,默认为对应手机的像素密度,`nvue`无效     | <em>number</em>  | `-`          |
+| width                      | **废弃** 画板的宽度,一般只用于通过内部方法时加上            | <em>number</em>  | ``           |
+| height                     | **废弃** 画板的高度 ,同上                                   | <em>number</em>  | ``           |
+
+### css
+| 属性名                                                                              | 支持的值或类型                                                                                                                                                                       | 默认值   |
+| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
+| (min\max)width                                                                      | 支持`%`、`rpx`、`px`                                                                                                                                                                 | -        |
+| height                                                                              | 同上                                                                                                                                                                                 | -        |
+| color                                                                               | `string`                                                                                                                                                                             | -        |
+| position                                                                            | 定位,可选值:`absolute`、`fixed`                                                                                                                                                    | -        |
+| ↳ left、top、right、bottom                                                          | 配合`position`才生效,支持`%`、`rpx`、`px`                                                                                                                                           | -        |
+| margin                                                                              | 可简写或各方向分别写,如:`margin-top`,支持`auto`、`rpx`、`px`                                                                                                                      | -        |
+| padding                                                                             | 可简写或各方向分别写,支持`rpx`、`px`                                                                                                                                                | -        |
+| border                                                                              | 可简写或各个值分开写:`border-width`、`border-style` 、`border-color`,简写请按顺序写                                                                                                | -        |
+| line-clamp                                                                          | `number`,超过行数显示省略号                                                                                                                                                         | -        |
+| vertical-align                                                                      | 文字垂直对齐,可选值:`bottom`、`top`、`middle`                                                                                                                                      | `middle` |
+| line-height                                                                         | 文字行高,支持`rpx`、`px`、`em`                                                                                                                                                      | `1.4em`  |
+| font-weight                                                                         | 文字粗细,可选值:`normal`、`bold`                                                                                                                                                   | `normal` |
+| font-size                                                                           | 文字大小,`string`,支持`rpx`、`px`                                                                                                                                                  | `14px`   |
+| text-decoration                                                                     | 文本修饰,可选值:`underline` 、`line-through`、`overline`                                                                                                                           | -        |
+| text-align                                                                          | 文本水平对齐,可选值:`right` 、`center`                                                                                                                                             | `left`   |
+| display                                                                             | 框类型,可选值:`block`、`inline-block`、`flex`、`none`,当为`none`时是不渲染该段, `flex`功能简陋。                                                                                                            | -        |
+| flex                                                                                | 配合 display: flex; 属性定义了在分配多余空间,目前只用为数值如: flex: 1                                                                                                           | -        |
+| align-self                                                                          | 配合 display: flex; 单个项目垂直轴对齐方式: `flex-start` `flex-end` `center`                                                                                                         | `flex-start`        |
+| justify-content                                                                     | 配合 display: flex; 水平轴对齐方式: `flex-start` `flex-end` `center`                                                                                                         | `flex-start`        |
+| align-items                                                                         | 配合 display: flex; 垂直轴对齐方式: `flex-start` `flex-end` `center`                                                                                                  | `flex-start`        |
+| border-radius                                                                       | 圆角边框,支持`%`、`rpx`、`px`                                                                                                                                                       | -        |
+| box-sizing                                                                          | 可选值:`border-box`                                                                                                                                                                 | -        |
+| box-shadow                                                                          | 投影                                                                                                                                                                                 | -        |
+| background(color)                                                                   | 支持渐变,但必须写百分比!如:`linear-gradient(,#ff971b 0%, #ff5000 100%)`、`radial-gradient(#0ff 15%, #f0f 60%)`,目前 radial-gradient 渐变的圆心为元素中点,半径为最长边,不支持设置 | -        |
+| background-clip                                                                	  | 文字渐变,配合`background`背景渐变,设置`background-clip: text` 达到文字渐变效果 | -        |
+| background-image                                                                    | view 元素背景:`url(src)`,若只是设置背景图,请不要设置`background-repeat`                                                                                                                                                           | -        |
+| background-repeat                                                                   | 设置是否及如何重复背景纹理,可选值:`repeat`、`repeat-x`、`repeat-y`、`no-repeat`                                                                                                    | `repeat` |
+| [object-fit](https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit/)          | 图片元素适应容器方式,类似于`mode`,可选值:`cover`、 `contain`、 `fill`、 `none`                                                                                                      | -        |
+| [object-position](https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-position) | 图片的对齐方式,配合`object-fit`使用                                                                                                                                                 | -        |
+
+### 图片填充模式 object-fit
+
+| 名称    | 含义                                                   |
+| ------- | ------------------------------------------------------ |
+| contain | 保持宽高缩放图片,使图片的长边能完全显示出来           |
+| cover   | 保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边 |
+| fill    | 拉伸图片,使图片填满元素                               |
+| none    | 保持图片原有尺寸                                       |
+
+### 事件 Events
+
+| 事件名   | 说明                                                             | 返回值 |
+| -------- | ---------------------------------------------------------------- | ------ |
+| success  | 生成图片成功,若使用`is-canvas-to-temp-filePath` 可以接收图片地址 | path   |
+| fail     | 生成图片失败                                                     | error  |
+| done     | 绘制成功                                                         |        |
+| progress | 绘制进度                                                         | number |
+
+### 内部函数 Ref
+| 事件名   | 说明                                                             | 返回值 |
+| -------- | ---------------------------------------------------------------- | ------ |
+| render(object)   |  渲染器,传入JSON 绘制海报 | promise   |
+| [canvasToTempFilePath](https://uniapp.dcloud.io/api/canvas/canvasToTempFilePath.html#canvastotempfilepath)(object)   | 把当前画布指定区域的内容导出生成指定大小的图片,并返回文件临时路径。    |   |
+| canvasToTempFilePathSync(object)    | 同步接口,同上                                                         |        |
+
+
+## 常见问题
+
+- 1、H5 端使用网络图片需要解决跨域问题。
+- 2、小程序使用网络图片需要去公众平台增加下载白名单!二级域名也需要配!
+- 3、H5 端生成图片是 base64,有时显示只有一半可以使用原生标签`<IMG/>`
+- 4、发生保存图片倾斜变形或提示 native buffer exceed size limit 时,使用 pixel-ratio="2"参数,降分辨率。
+- 5、h5 保存图片不需要调接口,提示用户长按图片保存。
+- 6、画板不能隐藏,包括`v-if`,`v-show`、`display:none`、`opacity:0`,另外也不要把画板放在弹窗里。如果需要隐藏画板请设置 `custom-style="position: fixed; left: 200%"`
+- 7、微信小程序 canvas 2d **不支持真机调试**,请使用真机预览方式。
+- 8、微信小程序打开调试时可以生但并闭无法生成时,这种情况一般是没有在公众号配置download域名
+- 9、HBX 3.4.5之前的版本不支持vue3
+- 10、在微信开发工具上 canvas 层级最高无法zindex,并不影响真机
+- 11、请不要导入非uni_modules插件
+- 华为手机 APP 上无法生成图片,请使用 HBX2.9.11++(已过时,忽略这条)
+- IOS APP 请勿使用 HBX2.9.3.20201014 的版本!这个版本无法生成图片。(已过时,忽略这条)
+- 苹果微信 7.0.20 存在闪退和图片无法 onload 为微信 bug(已过时,忽略这条)
+
+## 打赏
+
+如果你觉得本插件,解决了你的问题,赠人玫瑰,手留余香。
+
+![输入图片说明](https://static-6d65bd90-8508-4d6c-abbc-a4ef5c8e49e7.bspapp.com/image/222521_bb543f96_518581.jpeg "微信图片编辑_20201122220352.jpg")
+![输入图片说明](https://static-6d65bd90-8508-4d6c-abbc-a4ef5c8e49e7.bspapp.com/image/wxplay.jpg "wxplay.jpg")

+ 119 - 0
components/lime-painter/static/index.html

@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html lang="zh">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<title></title>
+	<style type="text/css">
+		html,
+		body,
+		canvas {
+			padding: 0;
+			margin: 0;
+			width: 100%;
+			height: 100%;
+			overflow-y: hidden;
+			background-color: transparent;
+		}
+	</style>
+</head>
+
+<body>
+	<canvas id="lime-painter"></canvas>
+	<script type="text/javascript" src="./uni.webview.1.5.3.js"></script>
+	<script type="text/javascript" src="./painter.js"></script>
+	<script> 
+		var cache = [];
+		var painter = null;
+		var canvas = null;
+		var context = null;
+		var timer = null;
+		var pixelRatio = 1;
+		console.log = function (...args) {
+			postMessage(args);
+		};
+		// function stringify(key, value) {
+		// 	if (typeof value === 'object' && value !== null) {
+		// 		if (cache.indexOf(value) !== -1) {
+		// 			return;
+		// 		}
+		// 		cache.push(value);
+		// 	}
+		// 	return value;
+		// };
+
+		function emit(event, data) {
+			postMessage({
+				event,
+				data: (typeof data !== 'object' && data !== null ? data : JSON.stringify(data)) 
+			});
+			cache = [];
+		};
+		function postMessage(data) {
+			uni.postMessage({
+				data
+			});
+		};
+		
+		function init(dpr) {
+			canvas = document.querySelector('#lime-painter');
+			context = canvas.getContext('2d');
+			pixelRatio = dpr || window.devicePixelRatio;
+			painter = new Painter({
+				id: 'lime-painter',
+				context,
+				canvas,
+				pixelRatio,
+				width: canvas.offsetWidth,
+				height: canvas.offsetHeight,
+				listen: {
+					onProgress(v) {
+						emit('progressChange', v);
+					},
+					onEffectFail(err) {
+						//console.error(err)
+						emit('fail', err);
+					}
+				}
+			});
+			emit('inited', true);
+		};
+		function save(args) {
+			delete args.success;
+			delete args.fail;
+			clearTimeout(timer);
+			timer = setTimeout(() => {
+				const path = painter.save(args);
+				if (typeof path == 'string') {
+					const index = Math.ceil(path.length / 8);
+					for (var i = 0; i < 8; i++) {
+						if (i == 7) {
+							emit('success', path.substr(i * index, index));
+						} else {
+							emit('file', path.substr(i * index, index));
+						}
+					};
+				} else {
+					// console.log('canvas no data')
+					emit('fail', 'canvas no data');
+				};
+			}, 30);
+		};
+		async function source(args) {
+			let size = await painter.source(args);
+			emit('layoutChange', size);
+			if(!canvas.height) {
+				console.log('canvas no size')
+				emit('fail', 'canvas no size');
+			}
+			painter.render().catch(err => {
+				// console.error(err)
+				emit('fail', err);
+			});
+		};
+	</script>
+</body>
+
+</html>

+ 2665 - 0
components/lime-painter/static/painter.js

@@ -0,0 +1,2665 @@
+! function(t, e) {
+	"object" == typeof exports && "undefined" != typeof module ? e(exports) : "function" == typeof define && define
+		.amd ? define(["exports"], e) : e((t = "undefined" != typeof globalThis ? globalThis : t || self).Painter = {})
+}(this, (function(t) {
+	"use strict";
+	var e = function() {
+		return e = Object.assign || function(t) {
+			for (var e, i = 1, n = arguments.length; i < n; i++)
+				for (var r in e = arguments[i]) Object.prototype.hasOwnProperty.call(e, r) && (t[r] = e[
+					r]);
+			return t
+		}, e.apply(this, arguments)
+	};
+
+	function i(t, e, i, n) {
+		return new(i || (i = Promise))((function(r, o) {
+			function s(t) {
+				try {
+					h(n.next(t))
+				} catch (t) {
+					o(t)
+				}
+			}
+
+			function a(t) {
+				try {
+					h(n.throw(t))
+				} catch (t) {
+					o(t)
+				}
+			}
+
+			function h(t) {
+				var e;
+				t.done ? r(t.value) : (e = t.value, e instanceof i ? e : new i((function(t) {
+					t(e)
+				}))).then(s, a)
+			}
+			h((n = n.apply(t, e || [])).next())
+		}))
+	}
+
+	function n(t, e) {
+		var i, n, r, o, s = {
+			label: 0,
+			sent: function() {
+				if (1 & r[0]) throw r[1];
+				return r[1]
+			},
+			trys: [],
+			ops: []
+		};
+		return o = {
+			next: a(0),
+			throw: a(1),
+			return: a(2)
+		}, "function" == typeof Symbol && (o[Symbol.iterator] = function() {
+			return this
+		}), o;
+
+		function a(o) {
+			return function(a) {
+				return function(o) {
+					if (i) throw new TypeError("Generator is already executing.");
+					for (; s;) try {
+						if (i = 1, n && (r = 2 & o[0] ? n.return : o[0] ? n.throw || ((r = n
+								.return) && r.call(n), 0) : n.next) && !(r = r.call(n, o[1])).done)
+							return r;
+						switch (n = 0, r && (o = [2 & o[0], r.value]), o[0]) {
+							case 0:
+							case 1:
+								r = o;
+								break;
+							case 4:
+								return s.label++, {
+									value: o[1],
+									done: !1
+								};
+							case 5:
+								s.label++, n = o[1], o = [0];
+								continue;
+							case 7:
+								o = s.ops.pop(), s.trys.pop();
+								continue;
+							default:
+								if (!(r = s.trys, (r = r.length > 0 && r[r.length - 1]) || 6 !== o[
+										0] && 2 !== o[0])) {
+									s = 0;
+									continue
+								}
+								if (3 === o[0] && (!r || o[1] > r[0] && o[1] < r[3])) {
+									s.label = o[1];
+									break
+								}
+								if (6 === o[0] && s.label < r[1]) {
+									s.label = r[1], r = o;
+									break
+								}
+								if (r && s.label < r[2]) {
+									s.label = r[2], s.ops.push(o);
+									break
+								}
+								r[2] && s.ops.pop(), s.trys.pop();
+								continue
+						}
+						o = e.call(t, s)
+					} catch (t) {
+						o = [6, t], n = 0
+					} finally {
+						i = r = 0
+					}
+					if (5 & o[0]) throw o[1];
+					return {
+						value: o[0] ? o[1] : void 0,
+						done: !0
+					}
+				}([o, a])
+			}
+		}
+	}
+	var r = {
+			MP_WEIXIN: "mp-weixin",
+			MP_QQ: "mp-qq",
+			MP_ALIPAY: "mp-alipay",
+			MP_BAIDU: "mp-baidu",
+			MP_TOUTIAO: "mp-toutiao",
+			MP_DINGDING: "mp-dingding",
+			H5: "h5",
+			WEB: "web",
+			PLUS: "plus"
+		},
+		o = ["contentSize", "clientSize", "borderSize", "offsetSize"],
+		s = "row",
+		a = "column",
+		h = "top",
+		d = "middle",
+		c = "bottom",
+		l = "left",
+		f = "center",
+		u = "right",
+		p = "view",
+		g = "text",
+		v = "image",
+		y = "qrcode",
+		b = "block",
+		x = "inline-block",
+		m = "none",
+		w = "flex",
+		S = "absolute",
+		z = "fixed",
+		M = "transparent",
+		B = "fill",
+		k = {
+			display: b,
+			color: "#000000",
+			lineHeight: "1.4em",
+			fontSize: 14,
+			fontWeight: 400,
+			fontFamily: "sans-serif",
+			lineCap: "butt",
+			flexDirection: s,
+			flexWrap: "nowrap",
+			textAlign: "left",
+			alignItems: "flex-start",
+			justifyContent: "flex-start",
+			position: "static",
+			transformOrigin: "center center"
+		},
+		I = {
+			upx2px: function(t) {
+				return window.innerWidth / 750 * t
+			},
+			getSystemInfoSync: function() {
+				return {
+					screenWidth: window.innerWidth
+				}
+			},
+			getImageInfo: function(t) {
+				var e = t.src,
+					i = t.success,
+					n = t.fail,
+					r = new Image;
+				r.onload = function() {
+					i({
+						width: r.naturalWidth,
+						height: r.naturalHeight,
+						path: r.src,
+						src: e
+					})
+				}, r.onerror = n, r.src = e
+			}
+		},
+		P = "object",
+		W = "undefined",
+		R = typeof window == P ? typeof uni == W || typeof uni !== W && !uni.addInterceptor ? r.WEB : r.H5 :
+		typeof swan == P ? r.MP_BAIDU : typeof tt == P ? r.MP_TOUTIAO : typeof plus === P ? r.PLUS :
+		typeof wx == P ? r.MP_WEIXIN : void 0,
+		L = R == r.MP_WEIXIN ? wx : typeof uni != W ? uni.getImageInfo ? {
+			upx2px: function(t) {
+				return uni.upx2px(t)
+			},
+			getSystemInfoSync: function() {
+				return uni.getSystemInfoSync()
+			},
+			getImageInfo: function(t) {
+				return uni.getImageInfo(t)
+			},
+			downloadFile: function(t) {
+				return uni.downloadFile(t)
+			}
+		} : Object.assign(uni, I) : typeof window != W ? I : uni;
+	if (!L.upx2px) {
+		var O = ((L.getSystemInfoSync && uni.getSystemInfoSync()).screenWidth || 375) / 750;
+		L.upx2px = function(t) {
+			return O * t
+		}
+	}
+
+	function T(t) {
+		return /^-?\d+(\.\d+)?$/.test(t)
+	}
+
+	function A(t, e, i) {
+		if ("number" == typeof t) return t;
+		if (T(t)) return 1 * t;
+		if ("string" == typeof t) {
+			var n = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g.exec(t);
+			if (!t || !n) return 0;
+			var r = n[3];
+			t = parseFloat(t);
+			var o = 0;
+			return "rpx" === r ? o = L.upx2px(t) : "px" === r ? o = 1 * t : "%" === r && e ? o = t * A(e) /
+				100 : "em" === r && e && (o = t * A(e || 14)), 1 * o.toFixed(2)
+		}
+		return 0
+	}
+
+	function F(t) {
+		return /%$/.test(t)
+	}
+	var j = function(t) {
+			return !(!t || !t.startsWith("linear") && !t.startsWith("radial"))
+		},
+		C = function(t, e, i, n, r, o) {
+			t.startsWith("linear") ? function(t, e, i, n, r, o) {
+				for (var s = function(t, e, i, n, r) {
+							void 0 === n && (n = 0);
+							void 0 === r && (r = 0);
+							var o = t.match(/([-]?\d{1,3})deg/),
+								s = o && o[1] ? parseFloat(o[1]) : 0;
+							s >= 360 && (s -= 360);
+							s < 0 && (s += 360);
+							if (0 === (s = Math.round(s))) return {
+								x0: Math.round(e / 2) + n,
+								y0: i + r,
+								x1: Math.round(e / 2) + n,
+								y1: r
+							};
+							if (180 === s) return {
+								x0: Math.round(e / 2) + n,
+								y0: r,
+								x1: Math.round(e / 2) + n,
+								y1: i + r
+							};
+							if (90 === s) return {
+								x0: n,
+								y0: Math.round(i / 2) + r,
+								x1: e + n,
+								y1: Math.round(i / 2) + r
+							};
+							if (270 === s) return {
+								x0: e + n,
+								y0: Math.round(i / 2) + r,
+								x1: n,
+								y1: Math.round(i / 2) + r
+							};
+							var a = Math.round(180 * Math.asin(e / Math.sqrt(Math.pow(e, 2) + Math.pow(i,
+								2))) / Math.PI);
+							if (s === a) return {
+								x0: n,
+								y0: i + r,
+								x1: e + n,
+								y1: r
+							};
+							if (s === 180 - a) return {
+								x0: n,
+								y0: r,
+								x1: e + n,
+								y1: i + r
+							};
+							if (s === 180 + a) return {
+								x0: e + n,
+								y0: r,
+								x1: n,
+								y1: i + r
+							};
+							if (s === 360 - a) return {
+								x0: e + n,
+								y0: i + r,
+								x1: n,
+								y1: r
+							};
+							var h = 0,
+								d = 0,
+								c = 0,
+								l = 0;
+							if (s < a || s > 180 - a && s < 180 || s > 180 && s < 180 + a || s > 360 - a) {
+								var f = s * Math.PI / 180,
+									u = s < a || s > 360 - a ? i / 2 : -i / 2,
+									p = Math.tan(f) * u,
+									g = s < a || s > 180 - a && s < 180 ? e / 2 - p : -e / 2 - p;
+								h = -(c = p + (v = Math.pow(Math.sin(f), 2) * g)), d = -(l = u + v / Math
+									.tan(f))
+							}
+							if (s > a && s < 90 || s > 90 && s < 90 + a || s > 180 + a && s < 270 || s >
+								270 && s < 360 - a) {
+								var v;
+								f = (90 - s) * Math.PI / 180, p = s > a && s < 90 || s > 90 && s < 90 + a ?
+									e / 2 : -e / 2, u = Math.tan(f) * p, g = s > a && s < 90 || s > 270 &&
+									s < 360 - a ? i / 2 - u : -i / 2 - u;
+								h = -(c = p + (v = Math.pow(Math.sin(f), 2) * g) / Math.tan(f)), d = -(l =
+									u + v)
+							}
+							return h = Math.round(h + e / 2) + n, d = Math.round(i / 2 - d) + r, c = Math
+								.round(c + e / 2) + n, l = Math.round(i / 2 - l) + r, {
+									x0: h,
+									y0: d,
+									x1: c,
+									y1: l
+								}
+						}(r, t, e, i, n), a = s.x0, h = s.y0, d = s.x1, c = s.y1, l = o
+						.createLinearGradient(a, h, d, c), f = r.match(/linear-gradient\((.+)\)/)[1], u = E(
+							f.substring(f.indexOf(",") + 1)), p = 0; p < u.colors.length; p++) l
+					.addColorStop(u.percents[p], u.colors[p]);
+				o.setFillStyle(l)
+			}(e, i, n, r, t, o) : t.startsWith("radial") && function(t, e, i, n, r, o) {
+				for (var s = E(r.match(/radial-gradient\((.+)\)/)[1]), a = Math.round(t / 2) + i, h = Math
+						.round(e / 2) + n, d = o.createRadialGradient(a, h, 0, a, h, Math.max(t, e) / 2),
+						c = 0; c < s.colors.length; c++) d.addColorStop(s.percents[c], s.colors[c]);
+				o.setFillStyle(d)
+			}(e, i, n, r, t, o)
+		};
+
+	function E(t) {
+		for (var e = [], i = [], n = 0, r = t.substring(0, t.length - 1).split("%,"); n < r.length; n++) {
+			var o = r[n];
+			e.push(o.substring(0, o.lastIndexOf(" ")).trim()), i.push(o.substring(o.lastIndexOf(" "), o
+				.length) / 100)
+		}
+		return {
+			colors: e,
+			percents: i
+		}
+	}
+
+	function H(t, e, i) {
+		return e in t ? Object.defineProperty(t, e, {
+			value: i,
+			enumerable: !0,
+			configurable: !0,
+			writable: !0
+		}) : t[e] = i, t
+	}
+
+	function U() {
+		return U = Object.assign ? Object.assign.bind() : function(t) {
+			for (var e = 1; e < arguments.length; e++) {
+				var i = arguments[e];
+				for (var n in i) Object.prototype.hasOwnProperty.call(i, n) && (t[n] = i[n])
+			}
+			return t
+		}, U.apply(this, arguments)
+	}
+
+	function Y(t, e) {
+		return Y = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(t, e) {
+			return t.__proto__ = e, t
+		}, Y(t, e)
+	}
+
+	function $(t, e) {
+		(null == e || e > t.length) && (e = t.length);
+		for (var i = 0, n = new Array(e); i < e; i++) n[i] = t[i];
+		return n
+	}
+
+	function D(t, e) {
+		var i = "undefined" != typeof Symbol && t[Symbol.iterator] || t["@@iterator"];
+		if (i) return (i = i.call(t)).next.bind(i);
+		if (Array.isArray(t) || (i = function(t, e) {
+				if (t) {
+					if ("string" == typeof t) return $(t, e);
+					var i = Object.prototype.toString.call(t).slice(8, -1);
+					return "Object" === i && t.constructor && (i = t.constructor.name), "Map" === i ||
+						"Set" === i ? Array.from(t) : "Arguments" === i ||
+						/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) ? $(t, e) : void 0
+				}
+			}(t)) || e && t && "number" == typeof t.length) {
+			i && (t = i);
+			var n = 0;
+			return function() {
+				return n >= t.length ? {
+					done: !0
+				} : {
+					done: !1,
+					value: t[n++]
+				}
+			}
+		}
+		throw new TypeError(
+			"Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."
+			)
+	}
+
+	function _(t) {
+		return "number" == typeof t
+	}
+
+	function X(t) {
+		return "auto" === t || null === t
+	}
+
+	function N(t) {
+		return /%$/.test(t)
+	}
+	var V, G = 0,
+		q = function() {
+			function t() {
+				H(this, "elements", []), H(this, "afterElements", []), H(this, "beforeElements", []), H(this,
+						"ids", []), H(this, "width", 0), H(this, "height", 0), H(this, "top", 0), H(this,
+						"left", 0), H(this, "pre", null), H(this, "offsetX", 0), H(this, "offsetY", 0), G++,
+					this.id = G
+			}
+			var e = t.prototype;
+			return e.fixedBind = function(t, e) {
+				void 0 === e && (e = 0), this.container = e ? t.parent : t.root, this.container.fixedLine =
+					this, this.fixedAdd(t)
+			}, e.fixedAdd = function(t) {
+				this.elements.push(t);
+				var e = t.computedStyle.zIndex;
+				(void 0 === e ? 0 : e) >= 0 ? this.afterElements.push(t) : this.beforeElements.push(t), this
+					.refreshLayout()
+			}, e.bind = function(t) {
+				this.container = t.parent, this.container.line = null, this.container.lines ? (this
+						.container.lines.push(this), this.pre = this.getPreLine(), this.top = this.pre.top +
+						this.pre.height, this.left = this.container.contentSize.left) : (this.top = this
+						.container.contentSize.top, this.left = this.container.contentSize.left, this
+						.container.lines = [this]), this.isInline = t.isInline(), this.container.line =
+					this, this.outerWidth = t.parent && t.parent.contentSize.width ? t.parent.contentSize
+					.width : 1 / 0, this.add(t)
+			}, e.getPreLine = function() {
+				return this.container.lines[this.container.lines.length - 2]
+			}, e.canIEnter = function(t) {
+				return this.outerWidth || t.parent && t.parent.contentSize.width, !((100 * t.offsetSize
+					.width + 100 * this.width) / 100 > this.outerWidth) || (this.closeLine(), !1)
+			}, e.closeLine = function() {
+				delete this.container.line
+			}, e.add = function(t) {
+				this.ids.includes(t.id) || (this.ids.push(t.id), this.elements.push(t), this
+					.refreshWidthHeight(t))
+			}, e.refreshWidthHeight = function(t) {
+				t.offsetSize.height > this.height && (this.height = t.offsetSize.height), this.width += t
+					.offsetSize.width || 0, (this.container.lineMaxWidth || 0) < this.width && (this
+						.container.lineMaxWidth = this.width)
+			}, e.refreshXAlign = function() {
+				if (this.isInline) {
+					var t = this.container.contentSize.width - this.width,
+						e = this.container.style.textAlign;
+					"center" === e ? t /= 2 : "left" === e && (t = 0), this.offsetX = t
+				}
+			}, e.getOffsetY = function(t) {
+				if (!t || !t.style) return 0;
+				var e = (t.style || {}).verticalAlign;
+				return "bottom" === e ? this.height - t.contentSize.height : "middle" === e ? (this.height -
+					t.contentSize.height) / 2 : 0
+			}, e.layout = function(t, e) {
+				for (var i in this.refreshXAlign(), this.pre ? (this.top = this.pre.top + this.pre.height +
+						this.offsetY, this.left = e + this.offsetX) : (this.top = Math.max(this.top,
+						this.container.contentSize.top, t) + this.offsetY, this.left = Math.max(this
+						.left, this.container.contentSize.left, e) + this.offsetX), this.elements) {
+					var n = this.elements[i],
+						r = this.elements[i - 1],
+						o = this.getOffsetY(n);
+					n.style.top = this.top + o, n.style.left = r ? r.offsetSize.left + r.offsetSize.width :
+						this.left, n.getBoxPosition2()
+				}
+			}, e.refreshLayout = function() {
+				this.afterElements = this.afterElements.sort((function(t, e) {
+					return t.computedStyle.zIndex - e.computedStyle.zIndex
+				})), this.beforeElements = this.beforeElements.sort((function(t, e) {
+					return t.computedStyle.zIndex - e.computedStyle.zIndex
+				}))
+			}, t
+		}(),
+		J = ((V = {})[s] = {
+			width: "width",
+			contentWidth: "width",
+			x: "x",
+			y: "y",
+			contentX: "left",
+			height: "height",
+			contentHeight: "height",
+			marginLeft: "marginLeft"
+		}, V[a] = {
+			width: "height",
+			contentWidth: "height",
+			x: "y",
+			y: "x",
+			contentX: "top",
+			height: "width",
+			contentHeight: "width",
+			marginLeft: "marginTop"
+		}, V),
+		Q = function(t) {
+			var e, i;
+
+			function n() {
+				var e;
+				return H(function(t) {
+						if (void 0 === t) throw new ReferenceError(
+							"this hasn't been initialised - super() hasn't been called");
+						return t
+					}(e = t.call(this) || this), "outerWidth", 0), e.exactValue = 0, e.flexTotal = 0, e.key =
+					null, e
+			}
+			i = t, (e = n).prototype = Object.create(i.prototype), e.prototype.constructor = e, Y(e, i);
+			var r = n.prototype;
+			return r.bind = function(t) {
+				console.warn("[painter] flex-box 功能未完善谨慎使用"), this.container = t.parent, this.container
+					.line = this, this.container.lines ? (this.container.lines.push(this), this.pre = this
+						.getPreLine(), this.top = this.pre.top + this.pre.height, this.left = this.container
+						.contentSize.left) : (this.top = this.container.contentSize.top, this.left = this
+						.container.contentSize.left, this.container.lines = [this]), t.parent && (this.key =
+						J[t.parent.style.flexDirection]), this.initHeight(t), this.outerWidth = t.parent &&
+					t.parent.contentSize[this.key.contentWidth] ? t.parent.contentSize[this.key
+						.contentWidth] : 1 / 0, this.add(t)
+			}, r.add = function(t) {
+				this.ids.push(t.id), _(t.style.flex) ? this.flexTotal += t.style.flex : _(t.style[this.key
+					.width]) && (this.exactValue += t.contentSize[this.key.width]), this.elements.push(
+					t), this.refreshWidthHeight(t), t.next || this.closeLine()
+			}, r.closeLine = function() {
+				this.calcFlex()
+			}, r.initHeight = function(t) {
+				this[this.key.height] = 0
+			}, r.calcFlex = function() {
+				var t = this,
+					e = this.container.contentSize[this.key.contentWidth];
+				this.elements.forEach((function(i) {
+					var n = i.style.width || 0;
+					_(i.style.flex) && (n = i.style.flex / t.flexTotal * (e - t.exactValue)), i
+						.computedStyle[t.key.width] = n, delete i.line, delete i.lines, delete i
+						.lineMaxWidth, i.getBoxWidthHeight()
+				}))
+			}, r.refreshWidthHeight = function(t) {
+				this.container.style.alignItems && !t.style.alignSelf && (t.style.alignSelf = this.container
+						.style.alignItems), t.contentSize[this.key.height] > this[this.key.height] && (this[
+						this.key.height] = t.offsetSize[this.key.height]), this[this.key.width] += t
+					.offsetSize[this.key.width];
+				var e = Math.min(this[this.key.width], this.container.contentSize[this.key.width]);
+				(this.container.lineMaxWidth || 0) < e && (this.container.lineMaxWidth = e)
+			}, r.refreshXAlign = function() {
+				var t = this,
+					e = this.elements.reduce((function(e, i) {
+						return e + i.offsetSize[t.key.width]
+					}), 0),
+					i = this.outerWidth == 1 / 0 ? 0 : this.outerWidth - Math.max(this[this.key.width], e),
+					n = this.container.style.justifyContent;
+				"center" === n ? i /= 2 : "flex-start" === n ? i = 0 : ["space-between", "space-around"]
+					.includes(n) && (! function(e, i) {
+						void 0 === i && (i = 0), i /= t.elements.length + (e ? -1 : 1), t.elements
+							.forEach((function(n, r) {
+								var o;
+								e && !r || (n.style.margin ? n.style.margin[t.key.marginLeft] +=
+									i : n.style.margin = ((o = {})[t.key.marginLeft] = i, o)
+									)
+							})), i = 0
+					}("space-between" == n, i), i = 0), this.offsetX = i || 0, this.refreshYAlign()
+			}, r.refreshYAlign = function() {
+				if (1 == this.container.lines.length) return 0;
+				var t = this.container.lines.reduce((function(t, e) {
+					return t + e.height
+				}), 0);
+				if ("center" === this.container.style.alignItems) {
+					var e = (this.container.contentSize[this.key.contentHeight] - t) / (this.container.lines
+						.length + 1);
+					this.container.lines.forEach((function(t) {
+						t.offsetY = e
+					}))
+				}
+				if ("flex-end" === this.container.style.alignItems) {
+					var i = this.container.contentSize[this.key.contentHeight] - t;
+					this.container.lines[0].offsetY = i
+				}
+			}, r.getOffsetY = function(t) {
+				return this.container.lines.length > 1 ? 0 : "flex-end" === t.style.alignSelf ? this
+					.container.contentSize[this.key.contentHeight] - t.contentSize[this.key.height] :
+					"center" === t.style.alignSelf ? (this.container.contentSize[this.key.contentHeight] - t
+						.contentSize[this.key.height]) / 2 : 0
+			}, n
+		}(q),
+		Z = v,
+		K = g,
+		et = p,
+		it = y,
+		nt = b,
+		rt = x,
+		ot = w,
+		st = S,
+		at = z,
+		ht = 0,
+		dt = {
+			left: null,
+			top: null,
+			width: null,
+			height: null
+		},
+		ct = function() {
+			function t(t, e, i, n) {
+				var r = this;
+				H(this, "id", ht++), H(this, "style", {
+						left: null,
+						top: null,
+						width: null,
+						height: null
+					}), H(this, "computedStyle", {}), H(this, "originStyle", {}), H(this, "children", {}), H(
+						this, "layoutBox", U({}, dt)), H(this, "contentSize", U({}, dt)), H(this, "clientSize",
+						U({}, dt)), H(this, "borderSize", U({}, dt)), H(this, "offsetSize", U({}, dt)), this
+					.ctx = n, this.root = i, e && (this.parent = e), this.name = t.name || t.type, this
+					.attributes = this.getAttributes(t);
+				var o = this.getComputedStyle(t, e && e.computedStyle);
+				this.isAbsolute = o.position == st, this.isFixed = o.position == at, this.originStyle = o,
+					Object.keys(o).forEach((function(t) {
+						Object.defineProperty(r.style, t, {
+							configurable: !0,
+							enumerable: !0,
+							get: function() {
+								return o[t]
+							},
+							set: function(e) {
+								o[t] = e
+							}
+						})
+					}));
+				var s = {
+					contentSize: U({}, this.contentSize),
+					clientSize: U({}, this.clientSize),
+					borderSize: U({}, this.borderSize),
+					offsetSize: U({}, this.offsetSize)
+				};
+				Object.keys(s).forEach((function(t) {
+					Object.keys(r[t]).forEach((function(e) {
+						Object.defineProperty(r[t], e, {
+							configurable: !0,
+							enumerable: !0,
+							get: function() {
+								return s[t][e]
+							},
+							set: function(i) {
+								s[t][e] = i
+							}
+						})
+					}))
+				})), this.computedStyle = this.style
+			}
+			var e = t.prototype;
+			return e.add = function(t) {
+				t.parent = this, this.children[t.id] = t
+			}, e.getChildren = function() {
+				var t = this;
+				return Object.keys(this.children).map((function(e) {
+					return t.children[e]
+				}))
+			}, e.getLineRect = function(t, e) {
+				var i = {
+						width: 0,
+						height: 0
+					},
+					n = e ? e.lines : this.parent && this.parent.lines;
+				return n && n.find((function(e) {
+					return e.ids.includes(t)
+				})) || i
+			}, e.getComputedStyle = function(t, e) {
+				var i = ["color", "fontSize", "lineHeight", "verticalAlign", "fontWeight", "textAlign"],
+					n = t.css,
+					r = void 0 === n ? {} : n,
+					o = t.type,
+					s = void 0 === o ? et : o,
+					a = U({}, k);
+				if ([K, Z, it].includes(s) && !r.display && (a.display = rt), e)
+					for (var h = 0; h < i.length; h++) {
+						var d = i[h];
+						(r[d] || e[d]) && (r[d] = r[d] || e[d])
+					}
+				for (var c = function() {
+						var t = f[l],
+							e = r[t];
+						if (/-/.test(t) && (t = t.replace(/-([a-z])/g, (function(t, e) {
+								return e.toUpperCase()
+							})), a.key = e), /^(box|text)?shadow$/i.test(t)) {
+							var i = [];
+							return e.replace(/((\d+(rpx|px)?\s+?){3})(.+)/, (function() {
+								for (var t = arguments.length, e = new Array(t), n = 0; n <
+									t; n++) e[n] = arguments[n];
+								i = e[1].match(/\d+(rpx|px)?/g).map((function(t) {
+									return A(t)
+								})).concat(e[4])
+							})), /^text/.test(t) ? a.textShadow = i : a.boxShadow = i, "continue"
+						}
+						if (/^border/i.test(t) && !/radius$/i.test(t)) {
+							var n, o = t.match(/^border([BTRLa-z]+)?/)[0],
+								h = t.match(/[W|S|C][a-z]+/),
+								d = e.replace(/([\(,])\s+|\s+([\),])/g, "$1$2").split(" ").map((
+									function(t) {
+										return /^\d/.test(t) ? A(t, "") : t
+									}));
+							return a[o] = ((n = {})[o + "Width"] = T(d[0]) ? d[0] : 0, n[o + "Style"] =
+									d[1] || "solid", n[o + "Color"] = d[2] || "black", n), 1 == d
+								.length && h && (a[o][o + h[0]] = d[0]), "continue"
+						}
+						if (/^background(color)?$/i.test(t)) return a.backgroundColor = e, "continue";
+						if (/^objectPosition$/i.test(t)) return a[t] = e.split(" "), "continue";
+						if (/padding|margin|radius/i.test(t)) {
+							var c = /radius$/i.test(t),
+								u = c ? "borderRadius" : t.match(/[a-z]+/)[0],
+								p = [0, 0, 0, 0].map((function(t, e) {
+									return c ? ["borderTopLeftRadius", "borderTopRightRadius",
+										"borderBottomRightRadius", "borderBottomLeftRadius"
+									][e] : [u + "Top", u + "Right", u + "Bottom", u +
+										"Left"][e]
+								})),
+								g = "margin";
+							if ("padding" === t || t === g || /^(border)?radius$/i.test(t)) {
+								var v, y = ("" + e).split(" ").map((function(e) {
+										return /^\d+(rpx|px)?$/.test(e) ? A(e) : t != g &&
+											/auto/.test(e) ? 0 : e
+									}), []) || [0],
+									b = c ? "borderRadius" : t,
+									x = y[0],
+									m = y[1],
+									w = y[2],
+									S = y[3];
+								a[b] = ((v = {})[p[0]] = X(x) ? 0 : x, v[p[1]] = T(m) || X(m) ? m : x,
+									v[p[2]] = X(T(w) ? w : x) ? 0 : T(w) ? w : x, v[p[3]] = T(S) ?
+									S : m || x, v)
+							} else {
+								var z;
+								if ("object" == typeof a[u]) a[u][t] = u == g && X(e) || N(e) ? e : A(
+								e);
+								else a[u] = ((z = {})[p[0]] = a[u] || 0, z[p[1]] = a[u] || 0, z[p[2]] =
+										a[u] || 0, z[p[3]] = a[u] || 0, z), a[u][t] = u == g && X(e) ||
+									N(e) ? e : A(e)
+							}
+							return "continue"
+						}
+						if (/^transform$/i.test(t)) return a[t] = {}, e.replace(
+							/([a-zA-Z]+)\(([0-9,-\.%rpxdeg\s]+)\)/g, (function(e, i, n) {
+								var o = n.split(",").map((function(t) {
+										return t.replace(/(^\s*)|(\s*$)/g, "")
+									})),
+									s = function(t, e) {
+										return t.includes("deg") ? 1 * t : e && !N(e) ? A(t,
+											e) : t
+									};
+								i.includes("matrix") ? a[t][i] = o.map((function(t) {
+										return 1 * t
+									})) : i.includes("rotate") ? a[t][i] = 1 * n.match(
+										/^-?\d+(\.\d+)?/)[0] : /[X, Y]/.test(i) ? a[t][i] =
+									/[X]/.test(i) ? s(o[0], r.width) : s(o[0], r.height) : (
+										a[t][i + "X"] = s(o[0], r.width), a[t][i + "Y"] = s(
+											o[1] || o[0], r.height))
+							})), "continue";
+						/^font$/i.test(t) && console.warn("font 不支持简写"), /^left|top$/i.test(t) && ![st,
+							at
+						].includes(r.position) ? a[t] = 0 : a[t] = /^[\d\.]+(px|rpx)?$/.test(e) ? A(
+							e) : /em$/.test(e) && s == K ? A(e, r.fontSize) : e
+					}, l = 0, f = Object.keys(r); l < f.length; l++) c();
+				return a
+			}, e.setPosition = function(t, e) {
+				var i = {
+					left: "width",
+					top: "height",
+					right: "width",
+					bottom: "height"
+				};
+				Object.keys(i).forEach((function(n) {
+					var r = "right" == n ? "left" : "top";
+					["right", "bottom"].includes(n) && void 0 !== t.style[n] && "number" !=
+						typeof t.originStyle[r] ? t.style[r] = e[i[n]] - t.offsetSize[i[n]] - A(
+							t.style[n], e[i[n]]) : t.style[n] = A(t.style[n], e[i[n]])
+				}))
+			}, e.getAttributes = function(t) {
+				var e = t.attributes || {};
+				return (t.url || t.src) && (e.src = e.src || t.url || t.src), t.replace && (e.replace = t
+					.replace), t.text && (e.text = t.text), e
+			}, e.getOffsetSize = function(t, e, i) {
+				void 0 === i && (i = o[3]);
+				var n = e || {},
+					r = n.margin,
+					s = (r = void 0 === r ? {} : r).marginLeft,
+					a = void 0 === s ? 0 : s,
+					h = r.marginTop,
+					d = void 0 === h ? 0 : h,
+					c = r.marginRight,
+					l = void 0 === c ? 0 : c,
+					f = r.marginBottom,
+					u = void 0 === f ? 0 : f,
+					p = n.padding,
+					g = (p = void 0 === p ? {} : p).paddingLeft,
+					v = void 0 === g ? 0 : g,
+					y = p.paddingTop,
+					b = void 0 === y ? 0 : y,
+					x = p.paddingRight,
+					m = void 0 === x ? 0 : x,
+					w = p.paddingBottom,
+					S = void 0 === w ? 0 : w,
+					z = n.border,
+					M = (z = void 0 === z ? {} : z).borderWidth,
+					B = void 0 === M ? 0 : M,
+					k = n.borderTop,
+					I = (k = void 0 === k ? {} : k).borderTopWidth,
+					P = void 0 === I ? B : I,
+					W = n.borderBottom,
+					R = (W = void 0 === W ? {} : W).borderBottomWidth,
+					L = void 0 === R ? B : R,
+					O = n.borderRight,
+					T = (O = void 0 === O ? {} : O).borderRightWidth,
+					A = void 0 === T ? B : T,
+					F = n.borderLeft,
+					j = (F = void 0 === F ? {} : F).borderLeftWidth,
+					C = void 0 === j ? B : j,
+					E = a < 0 && l < 0 ? Math.abs(a + l) : 0,
+					H = d < 0 && u < 0 ? Math.abs(d + u) : 0,
+					U = a >= 0 && l < 0,
+					Y = d >= 0 && u < 0;
+				return i == o[0] && (this[i].left = t.left + a + v + C + (U ? 2 * -l : 0), this[i].top = t
+					.top + d + b + P + (Y ? 2 * -u : 0), this[i].width = t.width + (this[i].widthAdd ?
+						0 : E), this[i].height = t.height + (this[i].heightAdd ? 0 : H), this[i]
+					.widthAdd = E, this[i].heightAdd = H), i == o[1] && (this[i].left = t.left + a + C +
+					(U < 0 ? -l : 0), this[i].top = t.top + d + P + (Y ? -u : 0), this[i].width = t
+					.width + v + m, this[i].height = t.height + b + S), i == o[2] && (this[i].left = t
+					.left + a + C / 2 + (U < 0 ? -l : 0), this[i].top = t.top + d + P / 2 + (Y ? -u :
+					0), this[i].width = t.width + v + m + C / 2 + A / 2, this[i].height = t.height + b +
+					S + L / 2 + P / 2), i == o[3] && (this[i].left = t.left + (U < 0 ? -l : 0), this[i]
+					.top = t.top + (Y ? -u : 0), this[i].width = t.width + v + m + C + A + a + l, this[
+						i].height = t.height + b + S + L + P + u + d), this[i]
+			}, e.layoutBoxUpdate = function(t, e, i, n) {
+				var r = this;
+				if (void 0 === i && (i = -1), "border-box" == e.boxSizing) {
+					var s = e || {},
+						a = s.border,
+						h = (a = void 0 === a ? {} : a).borderWidth,
+						d = void 0 === h ? 0 : h,
+						c = s.borderTop,
+						l = (c = void 0 === c ? {} : c).borderTopWidth,
+						f = void 0 === l ? d : l,
+						u = s.borderBottom,
+						p = (u = void 0 === u ? {} : u).borderBottomWidth,
+						g = void 0 === p ? d : p,
+						v = s.borderRight,
+						y = (v = void 0 === v ? {} : v).borderRightWidth,
+						b = void 0 === y ? d : y,
+						x = s.borderLeft,
+						m = (x = void 0 === x ? {} : x).borderLeftWidth,
+						w = void 0 === m ? d : m,
+						S = s.padding,
+						z = (S = void 0 === S ? {} : S).paddingTop,
+						M = void 0 === z ? 0 : z,
+						B = S.paddingRight,
+						k = void 0 === B ? 0 : B,
+						I = S.paddingBottom,
+						P = void 0 === I ? 0 : I,
+						W = S.paddingLeft,
+						R = void 0 === W ? 0 : W;
+					i || (t.width -= R + k + b + w), 1 !== i || n || (t.height -= M + P + f + g)
+				}
+				this.layoutBox && (o.forEach((function(i) {
+					return r.layoutBox[i] = r.getOffsetSize(t, e, i)
+				})), this.layoutBox = Object.assign({}, this.layoutBox, this.layoutBox.borderSize))
+			}, e.getBoxPosition2 = function() {
+				var t = this.computedStyle,
+					e = this.fixedLine,
+					i = this.lines,
+					n = t.left,
+					r = void 0 === n ? 0 : n,
+					o = t.top,
+					s = void 0 === o ? 0 : o,
+					a = t.padding || {},
+					h = a.paddingBottom,
+					d = void 0 === h ? 0 : h,
+					c = a.paddingRight,
+					l = void 0 === c ? 0 : c,
+					f = U({}, this.contentSize, {
+						left: r,
+						top: s
+					}),
+					u = this.contentSize.top - this.offsetSize.top,
+					p = this.contentSize.left - this.offsetSize.left;
+				if (this.root.fixedLine && !this.root.isDone) {
+					this.root.isDone = !0;
+					for (var g, v = D(this.root.fixedLine.elements); !(g = v()).done;) {
+						var y = g.value;
+						y.setPosition(y, this.root.offsetSize), y.getBoxPosition2()
+					}
+				}
+				if (e)
+					for (var b, x = D(e.elements); !(b = x()).done;) {
+						var m = b.value;
+						m.setPosition(m, f), m.style.left += r + p + l, m.style.top += s + u + d, m
+							.getBoxPosition2()
+					}
+				if (i)
+					for (var w, S = D(i); !(w = S()).done;) {
+						w.value.layout(f.top + u, f.left + p)
+					}
+				return this.layoutBoxUpdate(f, t), this.layoutBox
+			}, e.getBoxState = function(t, e) {
+				return this.isBlock(t) || this.isBlock(e)
+			}, e.isBlock = function(t) {
+				return void 0 === t && (t = this), t && t.style.display == nt
+			}, e.isFlex = function(t) {
+				return void 0 === t && (t = this), t && t.style.display == ot
+			}, e.isInFlow = function() {
+				return !(this.isAbsolute || this.isFixed)
+			}, e.inFlexBox = function(t) {
+				return void 0 === t && (t = this), !!t.isInFlow() && (!!t.parent && (!(!t.parent || t.parent
+					.style.display !== ot) || void 0))
+			}, e.isInline = function(t) {
+				return void 0 === t && (t = this), t && t.style.display == rt
+			}, e.contrastSize = function(t, e, i) {
+				var n = t;
+				return i && (n = Math.min(n, i)), e && (n = Math.max(n, e)), n
+			}, e.measureText = function(t, e) {
+				var i = this.ctx.measureText(t),
+					n = i.width,
+					r = i.actualBoundingBoxAscent,
+					o = i.actualBoundingBoxDescent;
+				return {
+					ascent: r,
+					descent: o,
+					width: n,
+					fontHeight: r + o || .7 * e + 1
+				}
+			}, e.getBoxWidthHeight = function() {
+				var t = this,
+					e = this.name,
+					i = this.computedStyle,
+					n = this.attributes,
+					r = this.parent,
+					o = void 0 === r ? {} : r,
+					s = this.ctx,
+					a = this.getChildren(),
+					h = i.left,
+					d = void 0 === h ? 0 : h,
+					c = i.top,
+					l = void 0 === c ? 0 : c,
+					f = i.bottom,
+					u = i.right,
+					p = i.width,
+					g = void 0 === p ? 0 : p,
+					v = i.minWidth,
+					y = i.maxWidth,
+					b = i.minHeight,
+					x = i.maxHeight,
+					m = i.height,
+					w = void 0 === m ? 0 : m,
+					S = i.fontSize,
+					z = void 0 === S ? 14 : S,
+					M = i.fontWeight,
+					B = i.fontFamily,
+					k = i.fontStyle,
+					I = i.position,
+					P = i.lineClamp,
+					W = i.lineHeight,
+					R = i.padding,
+					L = void 0 === R ? {} : R,
+					O = i.margin,
+					T = void 0 === O ? {} : O,
+					F = i.border,
+					j = (F = void 0 === F ? {} : F).borderWidth,
+					C = void 0 === j ? 0 : j,
+					E = i.borderRight,
+					H = (E = void 0 === E ? {} : E).borderRightWidth,
+					U = void 0 === H ? C : H,
+					Y = i.borderLeft,
+					$ = (Y = void 0 === Y ? {} : Y).borderLeftWidth,
+					D = void 0 === $ ? C : $,
+					_ = o.contentSize && o.contentSize.width,
+					X = o.contentSize && o.contentSize.height;
+				if (N(g) && _ && (g = A(g, _)), N(g) && !_ && (g = null), N(w) && X && (w = A(w, X)), N(
+					w) && !X && (w = null), N(v) && _ && (v = A(v, _)), N(y) && _ && (y = A(y, _)), N(b) &&
+					X && (b = A(b, X)), N(x) && X && (x = A(x, X)), i.padding && _)
+					for (var V in i.padding) Object.hasOwnProperty.call(i.padding, V) && (i.padding[V] = A(i
+						.padding[V], _));
+				var G = L.paddingRight,
+					J = void 0 === G ? 0 : G,
+					tt = L.paddingLeft,
+					it = void 0 === tt ? 0 : tt;
+				if (i.margin && [i.margin.marginLeft, i.margin.marginRight].includes("auto"))
+					if (g) {
+						var nt = _ && _ - g - J - it - D - U || 0;
+						i.margin.marginLeft == i.margin.marginRight ? i.margin.marginLeft = i.margin
+							.marginRight = nt / 2 : "auto" == i.margin.marginLeft ? i.margin.marginLeft =
+							nt : i.margin.marginRight = nt
+					} else i.margin.marginLeft = i.margin.marginRight = 0;
+				var rt = T.marginRight,
+					ot = void 0 === rt ? 0 : rt,
+					at = T.marginLeft,
+					ht = {
+						width: g,
+						height: w,
+						left: 0,
+						top: 0
+					},
+					dt = it + J + D + U + (void 0 === at ? 0 : at) + ot;
+				if (e == K && !this.attributes.widths) {
+					var ct = n.text || "";
+					s.save(), s.setFonts({
+						fontFamily: B,
+						fontSize: z,
+						fontWeight: M,
+						fontStyle: k
+					});
+					var lt = new Map;
+					ct.split("\n").map((function(e) {
+						var i = e.split("").map((function(e) {
+								var i = lt.get(e);
+								if (i) return i;
+								var n = t.measureText(e, z).width;
+								return lt.set(e, n), n
+							})),
+							n = t.measureText(e, z),
+							r = n.fontHeight,
+							o = n.ascent,
+							s = n.descent;
+						t.attributes.fontHeight = r, t.attributes.ascent = o, t.attributes
+							.descent = s, t.attributes.widths || (t.attributes.widths = []), t
+							.attributes.widths.push({
+								widths: i,
+								total: i.reduce((function(t, e) {
+									return t + e
+								}), 0)
+							})
+					})), s.restore()
+				}
+				if (e == Z && null == g) {
+					var ft = n.width,
+						ut = n.height;
+					ht.width = this.contrastSize(Math.round(ft * w / ut) || 0, v, y), this.layoutBoxUpdate(
+						ht, i, 0)
+				}
+				if (e == K && null == g) {
+					var pt = this.attributes.widths,
+						gt = Math.max.apply(Math, pt.map((function(t) {
+							return t.total
+						})));
+					if (o && _ > 0 && (gt > _ || this.isBlock(this)) && !this.isAbsolute && !this.isFixed)
+						gt = _ - dt;
+					ht.width = this.contrastSize(gt, v, y), this.layoutBoxUpdate(ht, i, 0)
+				}
+				if (e == K && (o.style.flex || !this.attributes.lines)) {
+					var vt = this.attributes.widths.length;
+					this.attributes.widths.forEach((function(t) {
+						return t.widths.reduce((function(t, e, i) {
+							return t + e > ht.width ? (vt++, e) : t + e
+						}), 0)
+					})), vt = P && vt > P ? P : vt, this.attributes.lines = vt
+				}
+				if (e == Z && null == w) {
+					var yt = n.width,
+						bt = n.height;
+					ht.height = this.contrastSize(A(ht.width * bt / yt) || 0, b, x), this.layoutBoxUpdate(
+						ht, i, 1)
+				}
+				e == K && null == w && (W = A(W, z), ht.height = this.contrastSize(A(this.attributes.lines *
+						W), b, x), this.layoutBoxUpdate(ht, i, 1, !0)), o && o.children && _ && ([et, K]
+						.includes(e) && this.isFlex() || e == et && this.isBlock(this) && this.isInFlow()
+						) && (ht.width = this.contrastSize(_ - dt, v, y), this.layoutBoxUpdate(ht, i)), g &&
+					!N(g) && (ht.width = this.contrastSize(g, v, y), this.layoutBoxUpdate(ht, i, 0)), w && !
+					N(w) && (ht.height = this.contrastSize(ht.height, b, x), this.layoutBoxUpdate(ht, i,
+					1));
+				var xt = 0;
+				if (a.length) {
+					var mt = null;
+					a.forEach((function(e, n) {
+						e.getBoxWidthHeight();
+						var r = a[n + 1];
+						if (r && r.isInFlow() && (e.next = r), e.isInFlow() && !e.inFlexBox()) {
+							var o = t.getBoxState(mt, e);
+							t.line && t.line.canIEnter(e) && !o ? t.line.add(e) : (new q).bind(
+								e), mt = e
+						} else e.inFlexBox() ? t.line && (t.line.canIEnter(e) || "nowrap" == i
+								.flexWrap) ? t.line.add(e) : (new Q).bind(e) : e.isFixed ? t
+							.root.fixedLine ? t.root.fixedLine.fixedAdd(e) : (new q).fixedBind(
+								e) : t.fixedLine ? t.fixedLine.fixedAdd(e) : (new q).fixedBind(
+								e, 1)
+					})), this.lines && (xt = this.lines.reduce((function(t, e) {
+						return t + e.height
+					}), 0))
+				}
+				var wt = 0,
+					St = 0;
+				if (!g && (this.isAbsolute || this.isFixed) && _) {
+					var zt = I == st ? _ : this.root.width,
+						Mt = zt - (N(d) ? A(d, zt) : d) - (N(u) ? A(u, zt) : u);
+					wt = i.left ? Mt : this.lineMaxWidth
+				}
+				if (!w && (null != l ? l : this.isAbsolute || this.isFixed && X)) {
+					var Bt = I == st ? X : this.root.height,
+						kt = Bt - (N(l) ? A(l, Bt) : l) - (N(f) ? A(f, Bt) : f);
+					St = i.top ? kt : 0
+				}
+				if (g && !N(g) || ht.width || (ht.width = wt || this.contrastSize((this.isBlock(this) && !
+							this.isInFlow() ? _ || o.lineMaxWidth : this.lineMaxWidth) || this
+						.lineMaxWidth, v, y), this.layoutBoxUpdate(ht, i, 0)), w || !xt && !St || (ht
+						.height = St || this.contrastSize(xt, b, x), this.layoutBoxUpdate(ht, i)), i
+					.borderRadius && this.borderSize && this.borderSize.width)
+					for (var V in i.borderRadius) Object.hasOwnProperty.call(i.borderRadius, V) && (i
+						.borderRadius[V] = A(i.borderRadius[V], this.borderSize.width));
+				return this.layoutBox
+			}, e.layout = function() {
+				return this.getBoxWidthHeight(), this.root.offsetSize = this.offsetSize, this
+					.getBoxPosition2(), this.offsetSize
+			}, t
+		}(),
+		lt = function() {
+			var t, e, i, n, r, o, s = [0, 11, 15, 19, 23, 27, 31, 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24,
+					26, 28, 28, 22, 24, 24, 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
+				],
+				a = [3220, 1468, 2713, 1235, 3062, 1890, 2119, 1549, 2344, 2936, 1117, 2583, 1330, 2470, 1667,
+					2249, 2028, 3780, 481, 4011, 142, 3098, 831, 3445, 592, 2517, 1776, 2234, 1951, 2827, 1070,
+					2660, 1345, 3177
+				],
+				h = [30660, 29427, 32170, 30877, 26159, 25368, 27713, 26998, 21522, 20773, 24188, 23371, 17913,
+					16590, 20375, 19104, 13663, 12392, 16177, 14854, 9396, 8579, 11994, 11245, 5769, 5054, 7399,
+					6608, 1890, 597, 3340, 2107
+				],
+				d = [1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17, 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22,
+					22, 1, 0, 16, 28, 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22, 1, 0, 80, 20, 2,
+					0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16, 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11,
+					22, 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28, 2, 0, 78, 20, 4, 0, 31, 18, 2,
+					4, 14, 18, 4, 1, 13, 26, 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26, 2, 0, 116,
+					30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24, 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6,
+					2, 15, 28, 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24, 2, 2, 92, 24, 6, 2, 36,
+					22, 4, 6, 20, 26, 7, 4, 14, 28, 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22, 3,
+					1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24, 5, 1, 87, 22, 5, 5, 41, 24, 5, 7,
+					24, 30, 11, 7, 12, 24, 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30, 1, 5, 107,
+					28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28, 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28,
+					2, 19, 14, 28, 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26, 3, 5, 107, 28, 3,
+					13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28, 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19,
+					6, 16, 30, 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24, 4, 5, 121, 30, 4, 14,
+					47, 28, 11, 14, 24, 30, 16, 14, 15, 30, 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2,
+					16, 30, 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30, 10, 2, 114, 28, 19, 4,
+					46, 28, 28, 6, 22, 28, 33, 4, 16, 30, 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28,
+					15, 30, 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30, 7, 7, 116, 30, 21, 7,
+					45, 28, 1, 37, 23, 30, 19, 26, 15, 30, 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23,
+					25, 15, 30, 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30, 17, 0, 115, 30,
+					10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30, 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24,
+					30, 11, 46, 15, 30, 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30, 12, 7,
+					121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30, 6, 14, 121, 30, 6, 34, 47, 28, 46,
+					10, 24, 30, 2, 64, 15, 30, 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
+					4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30, 20, 4, 117, 30, 40, 7, 47,
+					28, 43, 22, 24, 30, 10, 67, 15, 30, 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61,
+					15, 30
+				],
+				c = [255, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141,
+					239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147,
+					142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228,
+					114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208,
+					148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72,
+					126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212,
+					229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197,
+					254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63,
+					209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20,
+					42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196,
+					23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187,
+					204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79,
+					174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175
+				],
+				l = [1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117,
+					234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181,
+					119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222,
+					161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211,
+					187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34,
+					68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118,
+					236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21,
+					42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209,
+					191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150,
+					49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56,
+					112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172,
+					69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44,
+					88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 0
+				],
+				f = [],
+				u = [],
+				p = [],
+				g = [],
+				v = [],
+				y = 2;
+
+			function b(t, e) {
+				var i;
+				t > e && (i = t, t = e, e = i), i = e, i *= e, i += e, i >>= 1, g[i += t] = 1
+			}
+
+			function x(t, i) {
+				var n;
+				for (p[t + e * i] = 1, n = -2; n < 2; n++) p[t + n + e * (i - 2)] = 1, p[t - 2 + e * (i + n +
+					1)] = 1, p[t + 2 + e * (i + n)] = 1, p[t + n + 1 + e * (i + 2)] = 1;
+				for (n = 0; n < 2; n++) b(t - 1, i + n), b(t + 1, i - n), b(t - n, i - 1), b(t + n, i + 1)
+			}
+
+			function m(t) {
+				for (; t >= 255;) t = ((t -= 255) >> 8) + (255 & t);
+				return t
+			}
+			var w = [];
+
+			function S(t, e, i, n) {
+				var r, o, s;
+				for (r = 0; r < n; r++) f[i + r] = 0;
+				for (r = 0; r < e; r++) {
+					if (255 != (s = c[f[t + r] ^ f[i]]))
+						for (o = 1; o < n; o++) f[i + o - 1] = f[i + o] ^ l[m(s + w[n - o])];
+					else
+						for (o = i; o < i + n; o++) f[o] = f[o + 1];
+					f[i + n - 1] = 255 == s ? 0 : l[m(s + w[0])]
+				}
+			}
+
+			function z(t, e) {
+				var i;
+				return t > e && (i = t, t = e, e = i), i = e, i += e * e, i >>= 1, g[i += t]
+			}
+
+			function M(t) {
+				var i, n, r, o;
+				switch (t) {
+					case 0:
+						for (n = 0; n < e; n++)
+							for (i = 0; i < e; i++) i + n & 1 || z(i, n) || (p[i + n * e] ^= 1);
+						break;
+					case 1:
+						for (n = 0; n < e; n++)
+							for (i = 0; i < e; i++) 1 & n || z(i, n) || (p[i + n * e] ^= 1);
+						break;
+					case 2:
+						for (n = 0; n < e; n++)
+							for (r = 0, i = 0; i < e; i++, r++) 3 == r && (r = 0), r || z(i, n) || (p[i + n *
+								e] ^= 1);
+						break;
+					case 3:
+						for (o = 0, n = 0; n < e; n++, o++)
+							for (3 == o && (o = 0), r = o, i = 0; i < e; i++, r++) 3 == r && (r = 0), r || z(i,
+								n) || (p[i + n * e] ^= 1);
+						break;
+					case 4:
+						for (n = 0; n < e; n++)
+							for (r = 0, o = n >> 1 & 1, i = 0; i < e; i++, r++) 3 == r && (r = 0, o = !o), o ||
+								z(i, n) || (p[i + n * e] ^= 1);
+						break;
+					case 5:
+						for (o = 0, n = 0; n < e; n++, o++)
+							for (3 == o && (o = 0), r = 0, i = 0; i < e; i++, r++) 3 == r && (r = 0), (i & n &
+								1) + !(!r | !o) || z(i, n) || (p[i + n * e] ^= 1);
+						break;
+					case 6:
+						for (o = 0, n = 0; n < e; n++, o++)
+							for (3 == o && (o = 0), r = 0, i = 0; i < e; i++, r++) 3 == r && (r = 0), (i & n &
+								1) + (r && r == o) & 1 || z(i, n) || (p[i + n * e] ^= 1);
+						break;
+					case 7:
+						for (o = 0, n = 0; n < e; n++, o++)
+							for (3 == o && (o = 0), r = 0, i = 0; i < e; i++, r++) 3 == r && (r = 0), (r && r ==
+								o) + (i + n & 1) & 1 || z(i, n) || (p[i + n * e] ^= 1)
+				}
+			}
+
+			function B(t) {
+				var e, i = 0;
+				for (e = 0; e <= t; e++) v[e] >= 5 && (i += 3 + v[e] - 5);
+				for (e = 3; e < t - 1; e += 2) v[e - 2] == v[e + 2] && v[e + 2] == v[e - 1] && v[e - 1] == v[e +
+					1] && 3 * v[e - 1] == v[e] && (0 == v[e - 3] || e + 3 > t || 3 * v[e - 3] >= 4 * v[e] ||
+					3 * v[e + 3] >= 4 * v[e]) && (i += 40);
+				return i
+			}
+
+			function k() {
+				var t, i, n, r, o, s = 0,
+					a = 0;
+				for (i = 0; i < e - 1; i++)
+					for (t = 0; t < e - 1; t++)(p[t + e * i] && p[t + 1 + e * i] && p[t + e * (i + 1)] && p[t +
+						1 + e * (i + 1)] || !(p[t + e * i] || p[t + 1 + e * i] || p[t + e * (i + 1)] ||
+						p[t + 1 + e * (i + 1)])) && (s += 3);
+				for (i = 0; i < e; i++) {
+					for (v[0] = 0, n = r = t = 0; t < e; t++)(o = p[t + e * i]) == r ? v[n]++ : v[++n] = 1, a +=
+						(r = o) ? 1 : -1;
+					s += B(n)
+				}
+				a < 0 && (a = -a);
+				var h = a,
+					d = 0;
+				for (h += h << 2, h <<= 1; h > e * e;) h -= e * e, d++;
+				for (s += 10 * d, t = 0; t < e; t++) {
+					for (v[0] = 0, n = r = i = 0; i < e; i++)(o = p[t + e * i]) == r ? v[n]++ : v[++n] = 1, r =
+						o;
+					s += B(n)
+				}
+				return s
+			}
+			var I = null;
+			return {
+				api: {
+					get ecclevel() {
+						return y
+					},
+					set ecclevel(t) {
+						y = t
+					},
+					get size() {
+						return _size
+					},
+					set size(t) {
+						_size = t
+					},
+					get canvas() {
+						return I
+					},
+					set canvas(t) {
+						I = t
+					},
+					getFrame: function(v) {
+						return function(v) {
+							var B, I, P, W, R, L, O, T;
+							W = v.length, t = 0;
+							do {
+								if (t++, P = 4 * (y - 1) + 16 * (t - 1), i = d[P++], n = d[P++], r = d[
+										P++], o = d[P], W <= (P = r * (i + n) + n - 3 + (t <= 9))) break
+							} while (t < 40);
+							for (e = 17 + 4 * t, R = r + (r + o) * (i + n) + n, W = 0; W < R; W++) u[
+								W] = 0;
+							for (f = v.slice(0), W = 0; W < e * e; W++) p[W] = 0;
+							for (W = 0; W < (e * (e + 1) + 1) / 2; W++) g[W] = 0;
+							for (W = 0; W < 3; W++) {
+								for (P = 0, I = 0, 1 == W && (P = e - 7), 2 == W && (I = e - 7), p[I +
+										3 + e * (P + 3)] = 1, B = 0; B < 6; B++) p[I + B + e * P] = 1,
+									p[I + e * (P + B + 1)] = 1, p[I + 6 + e * (P + B)] = 1, p[I + B +
+										1 + e * (P + 6)] = 1;
+								for (B = 1; B < 5; B++) b(I + B, P + 1), b(I + 1, P + B + 1), b(I + 5,
+									P + B), b(I + B + 1, P + 5);
+								for (B = 2; B < 4; B++) p[I + B + e * (P + 2)] = 1, p[I + 2 + e * (P +
+									B + 1)] = 1, p[I + 4 + e * (P + B)] = 1, p[I + B + 1 + e * (P +
+									4)] = 1
+							}
+							if (t > 1)
+								for (W = s[t], I = e - 7;;) {
+									for (B = e - 7; B > W - 3 && (x(B, I), !(B < W));) B -= W;
+									if (I <= W + 9) break;
+									x(6, I -= W), x(I, 6)
+								}
+							for (p[8 + e * (e - 8)] = 1, I = 0; I < 7; I++) b(7, I), b(e - 8, I), b(7,
+								I + e - 7);
+							for (B = 0; B < 8; B++) b(B, 7), b(B + e - 8, 7), b(B, e - 8);
+							for (B = 0; B < 9; B++) b(B, 8);
+							for (B = 0; B < 8; B++) b(B + e - 8, 8), b(8, B);
+							for (I = 0; I < 7; I++) b(8, I + e - 7);
+							for (B = 0; B < e - 14; B++) 1 & B ? (b(8 + B, 6), b(6, 8 + B)) : (p[8 + B +
+								6 * e] = 1, p[6 + e * (8 + B)] = 1);
+							if (t > 6)
+								for (W = a[t - 7], P = 17, B = 0; B < 6; B++)
+									for (I = 0; I < 3; I++, P--) 1 & (P > 11 ? t >> P - 12 : W >> P) ? (
+										p[5 - B + e * (2 - I + e - 11)] = 1, p[2 - I + e - 11 + e *
+											(5 - B)] = 1) : (b(5 - B, 2 - I + e - 11), b(2 - I + e -
+										11, 5 - B));
+							for (I = 0; I < e; I++)
+								for (B = 0; B <= I; B++) p[B + e * I] && b(B, I);
+							for (R = f.length, L = 0; L < R; L++) u[L] = f.charCodeAt(L);
+							if (f = u.slice(0), R >= (B = r * (i + n) + n) - 2 && (R = B - 2, t > 9 &&
+									R--), L = R, t > 9) {
+								for (f[L + 2] = 0, f[L + 3] = 0; L--;) W = f[L], f[L + 3] |= 255 & W <<
+									4, f[L + 2] = W >> 4;
+								f[2] |= 255 & R << 4, f[1] = R >> 4, f[0] = 64 | R >> 12
+							} else {
+								for (f[L + 1] = 0, f[L + 2] = 0; L--;) W = f[L], f[L + 2] |= 255 & W <<
+									4, f[L + 1] = W >> 4;
+								f[1] |= 255 & R << 4, f[0] = 64 | R >> 4
+							}
+							for (L = R + 3 - (t < 10); L < B;) f[L++] = 236, f[L++] = 17;
+							for (w[0] = 1, L = 0; L < o; L++) {
+								for (w[L + 1] = 1, O = L; O > 0; O--) w[O] = w[O] ? w[O - 1] ^ l[m(c[w[
+									O]] + L)] : w[O - 1];
+								w[0] = l[m(c[w[0]] + L)]
+							}
+							for (L = 0; L <= o; L++) w[L] = c[w[L]];
+							for (P = B, I = 0, L = 0; L < i; L++) S(I, r, P, o), I += r, P += o;
+							for (L = 0; L < n; L++) S(I, r + 1, P, o), I += r + 1, P += o;
+							for (I = 0, L = 0; L < r; L++) {
+								for (O = 0; O < i; O++) u[I++] = f[L + O * r];
+								for (O = 0; O < n; O++) u[I++] = f[i * r + L + O * (r + 1)]
+							}
+							for (O = 0; O < n; O++) u[I++] = f[i * r + L + O * (r + 1)];
+							for (L = 0; L < o; L++)
+								for (O = 0; O < i + n; O++) u[I++] = f[B + L + O * o];
+							for (f = u, B = I = e - 1, P = R = 1, T = (r + o) * (i + n) + n, L = 0; L <
+								T; L++)
+								for (W = f[L], O = 0; O < 8; O++, W <<= 1) {
+									128 & W && (p[B + e * I] = 1);
+									do {
+										R ? B-- : (B++, P ? 0 != I ? I-- : (P = !P, 6 == (B -= 2) && (
+											B--, I = 9)) : I != e - 1 ? I++ : (P = !P, 6 == (
+											B -= 2) && (B--, I -= 8))), R = !R
+									} while (z(B, I))
+								}
+							for (f = p.slice(0), W = 0, I = 3e4, P = 0; P < 8 && (M(P), (B = k()) < I &&
+									(I = B, W = P), 7 != W); P++) p = f.slice(0);
+							for (W != P && M(W), I = h[W + (y - 1 << 3)], P = 0; P < 8; P++, I >>= 1)
+								1 & I && (p[e - 1 - P + 8 * e] = 1, P < 6 ? p[8 + e * P] = 1 : p[8 + e *
+									(P + 1)] = 1);
+							for (P = 0; P < 7; P++, I >>= 1) 1 & I && (p[8 + e * (e - 7 + P)] = 1, P ?
+								p[6 - P + 8 * e] = 1 : p[7 + 8 * e] = 1);
+							return p
+						}(v)
+					},
+					utf16to8: function(t) {
+						var e, i, n, r;
+						for (e = "", n = t.length, i = 0; i < n; i++)(r = t.charCodeAt(i)) >= 1 && r <=
+							127 ? e += t.charAt(i) : r > 2047 ? (e += String.fromCharCode(224 | r >> 12 &
+									15), e += String.fromCharCode(128 | r >> 6 & 63), e += String
+								.fromCharCode(128 | r >> 0 & 63)) : (e += String.fromCharCode(192 | r >> 6 &
+								31), e += String.fromCharCode(128 | r >> 0 & 63));
+						return e
+					},
+					draw: function(t, i, n, r, o) {
+						i.drawView(n, r);
+						var s = i.ctx,
+							a = n.contentSize,
+							h = a.width,
+							d = a.height,
+							c = a.left,
+							l = a.top;
+						r.borderRadius, r.backgroundColor;
+						var f = r.color,
+							u = void 0 === f ? "#000000" : f;
+						r.border, n.contentSize.left, n.borderSize.left, n.contentSize.top, n.borderSize
+						.top;
+						if (y = o || y, s) {
+							s.save(), i.setOpacity(r), i.setTransform(n, r);
+							var p = Math.min(h, d);
+							t = this.utf16to8(t);
+							var g = this.getFrame(t),
+								v = p / e;
+							s.setFillStyle(u);
+							for (var b = 0; b < e; b++)
+								for (var x = 0; x < e; x++) g[x * e + b] && s.fillRect(c + v * b, l + v * x,
+									v, v);
+							s.restore(), i.setBorder(n, r)
+						} else console.warn("No canvas provided to draw QR code in!")
+					}
+				}
+			}
+		}(),
+		ft = v,
+		ut = g,
+		pt = y,
+		gt = p,
+		vt = h,
+		yt = d,
+		bt = c,
+		xt = l,
+		mt = f,
+		wt = u,
+		St = function() {
+			function t(t) {
+				var e, i = this;
+				this.v = "1.9.3.5", this.id = null, this.pixelRatio = 1, this.width = 0, this.height = 0, this
+					.sleep = 1e3 / 30, this.count = 0, this.isRate = !1, this.isDraw = !0, this.isCache = !0,
+					this.fixed = "", this.useCORS = !1, this.imageBus = [], this.createImage = function(t, e) {
+						return new Promise((function(i, n) {
+							if (window) {
+								var r = new Image;
+								e && r.setAttribute("crossOrigin", "Anonymous"), r.src = t, r
+									.onload = function() {
+										i({
+											width: r.naturalWidth || r.width,
+											height: r.naturalHeight || r.height,
+											path: r,
+											src: this.src
+										})
+									}, r.onerror = function(t) {
+										n(t)
+									}
+							} else n({
+								fail: "getImageInfo fail",
+								src: t
+							})
+						}))
+					}, this.options = t, Object.assign(this, t), this.ctx = ((e = t.context).setFonts =
+						function(t) {
+							var i = t.fontFamily,
+								n = void 0 === i ? "sans-serif" : i,
+								o = t.fontSize,
+								s = void 0 === o ? 14 : o,
+								a = t.fontWeight,
+								h = void 0 === a ? "normal" : a,
+								d = t.fontStyle,
+								c = void 0 === d ? "normal" : d;
+							R == r.MP_TOUTIAO && (h = "bold" == h ? "bold" : "", c = "italic" == c ? "italic" :
+									""), e.font = "".concat(c, " ").concat(h, " ").concat(Math.round(s), "px ")
+								.concat(n)
+						}, e.draw && e.setFillStyle ? e : Object.assign(e, {
+							setStrokeStyle: function(t) {
+								e.strokeStyle = t
+							},
+							setLineWidth: function(t) {
+								e.lineWidth = t
+							},
+							setLineCap: function(t) {
+								e.lineCap = t
+							},
+							setFillStyle: function(t) {
+								e.fillStyle = t
+							},
+							setFontSize: function(t) {
+								e.font = "".concat(String(t), "px sans-serif")
+							},
+							setGlobalAlpha: function(t) {
+								e.globalAlpha = t
+							},
+							setLineJoin: function(t) {
+								e.lineJoin = t
+							},
+							setTextAlign: function(t) {
+								e.textAlign = t
+							},
+							setMiterLimit: function(t) {
+								e.miterLimit = t
+							},
+							setShadow: function(t, i, n, r) {
+								e.shadowOffsetX = t, e.shadowOffsetY = i, e.shadowBlur = n, e
+									.shadowColor = r
+							},
+							setTextBaseline: function(t) {
+								e.textBaseline = t
+							},
+							createCircularGradient: function() {},
+							draw: function() {}
+						})), this.progress = 0, this.root = {
+						width: t.width,
+						height: t.height,
+						fontSizeRate: 1,
+						fixedLine: null
+					}, this.size = this.root;
+				var n = 0;
+				Object.defineProperty(this, "progress", {
+					configurable: !0,
+					set: function(t) {
+						n = t, i.lifecycle("onProgress", t / i.count)
+					},
+					get: function() {
+						return n || 0
+					}
+				})
+			}
+			return t.prototype.lifecycle = function(t, e) {
+				this.options.listen && this.options.listen[t] && this.options.listen[t](e)
+			}, t.prototype.setContext = function(t) {
+				t && (this.ctx = t)
+			}, t.prototype.init = function() {
+				(this.canvas.height || r.WEB == R) && (this.canvas.height = this.size.height * this
+					.pixelRatio, this.canvas.width = this.size.width * this.pixelRatio, this.ctx.scale(this
+						.pixelRatio, this.pixelRatio))
+			}, t.prototype.clear = function() {
+				this.ctx.clearRect(0, 0, this.size.width, this.size.height)
+			}, t.prototype.clipPath = function(t, e, i, n, r, o, s) {
+				void 0 === o && (o = !1), void 0 === s && (s = !1);
+				var a = this.ctx;
+				if (/polygon/.test(r)) {
+					var h = r.match(/-?\d+(rpx|px|%)?\s+-?\d+(rpx|px|%)?/g) || [];
+					a.beginPath(), h.map((function(r) {
+						var o = r.split(" "),
+							s = o[0],
+							a = o[1];
+						return [A(s, i) + t, A(a, n) + e]
+					})).forEach((function(t, e) {
+						0 == e ? a.moveTo(t[0], t[1]) : a.lineTo(t[0], t[1])
+					})), a.closePath(), s && a.stroke(), o && a.fill()
+				}
+			}, t.prototype.roundRect = function(t, e, i, n, r, o, s) {
+				if (void 0 === o && (o = !1), void 0 === s && (s = !1), !(r < 0)) {
+					var a = this.ctx;
+					if (a.beginPath(), r) {
+						var h = r || {},
+							d = h.borderTopLeftRadius,
+							c = void 0 === d ? r || 0 : d,
+							l = h.borderTopRightRadius,
+							f = void 0 === l ? r || 0 : l,
+							u = h.borderBottomRightRadius,
+							p = void 0 === u ? r || 0 : u,
+							g = h.borderBottomLeftRadius,
+							v = void 0 === g ? r || 0 : g;
+						a.arc(t + i - p, e + n - p, p, 0, .5 * Math.PI), a.lineTo(t + v, e + n), a.arc(t +
+							v, e + n - v, v, .5 * Math.PI, Math.PI), a.lineTo(t, e + c), a.arc(t + c,
+							e + c, c, Math.PI, 1.5 * Math.PI), a.lineTo(t + i - f, e), a.arc(t + i - f,
+							e + f, f, 1.5 * Math.PI, 2 * Math.PI), a.lineTo(t + i, e + n - p)
+					} else a.rect(t, e, i, n);
+					a.closePath(), s && a.stroke(), o && a.fill()
+				}
+			}, t.prototype.setTransform = function(t, e) {
+				var i = e.transform,
+					n = e.transformOrigin,
+					r = this.ctx,
+					o = i || {},
+					s = o.scaleX,
+					a = void 0 === s ? 1 : s,
+					h = o.scaleY,
+					d = void 0 === h ? 1 : h,
+					c = o.translateX,
+					l = void 0 === c ? 0 : c,
+					f = o.translateY,
+					u = void 0 === f ? 0 : f,
+					p = o.rotate,
+					g = void 0 === p ? 0 : p,
+					v = o.skewX,
+					y = void 0 === v ? 0 : v,
+					b = o.skewY,
+					x = void 0 === b ? 0 : b,
+					m = t.left,
+					w = t.top,
+					S = t.width,
+					z = t.height;
+				l = A(l, S) || 0, u = A(u, z) || 0;
+				var M = {
+						top: A("0%", 1),
+						center: A("50%", 1),
+						bottom: A("100%", 1)
+					},
+					B = {
+						left: A("0%", 1),
+						center: A("50%", 1),
+						right: A("100%", 1)
+					};
+				if (n = n.split(" ").filter((function(t, e) {
+						return e < 2
+					})).reduce((function(t, e) {
+						if (/\d+/.test(e)) {
+							var i = A(e, 1) / (/px|rpx$/.test(e) ? T(t.x) ? z : S : 1);
+							return T(t.x) ? Object.assign(t, {
+								y: i
+							}) : Object.assign(t, {
+								x: i
+							})
+						}
+						return T(B[e]) && !T(t.x) ? Object.assign(t, {
+							x: B[e]
+						}) : Object.assign(t, {
+							y: M[e] || .5
+						})
+					}), {}), (l || u) && r.translate(l, u), (a || d) && r.scale(a, d), g) {
+					var k = m + S * n.x,
+						I = w + z * n.y;
+					r.translate(k, I), r.rotate(g * Math.PI / 180), r.translate(-k, -I)
+				}(y || x) && r.transform(1, Math.tan(x * Math.PI / 180), Math.tan(y * Math.PI / 180), 1, 0,
+					0)
+			}, t.prototype.setBackground = function(t, e, i, n, o) {
+				var s = this.ctx;
+				t && t != M ? j(t) ? C(t, e, i, n, o, s) : s.setFillStyle(t) : [r.MP_TOUTIAO, r.MP_BAIDU]
+					.includes(R) ? s.setFillStyle("rgba(0,0,0,0)") : s.setFillStyle(M)
+			}, t.prototype.setShadow = function(t) {
+				var e = t.boxShadow,
+					i = void 0 === e ? [] : e,
+					n = this.ctx;
+				if (i.length) {
+					var r = i[0],
+						o = i[1],
+						s = i[2],
+						a = i[3];
+					n.setShadow(r, o, s, a)
+				}
+			}, t.prototype.setBorder = function(t, e) {
+				var i = this.ctx,
+					n = t.width,
+					r = t.height,
+					o = t.left,
+					s = t.top,
+					a = e.border,
+					h = e.borderBottom,
+					d = e.borderTop,
+					c = e.borderRight,
+					l = e.borderLeft,
+					f = e.borderRadius,
+					u = e.lineCap,
+					p = a || {},
+					g = p.borderWidth,
+					v = void 0 === g ? 0 : g,
+					y = p.borderStyle,
+					b = p.borderColor,
+					x = h || {},
+					m = x.borderBottomWidth,
+					w = void 0 === m ? v : m,
+					S = x.borderBottomStyle,
+					z = void 0 === S ? y : S,
+					M = x.borderBottomColor,
+					B = void 0 === M ? b : M,
+					k = d || {},
+					I = k.borderTopWidth,
+					P = void 0 === I ? v : I,
+					W = k.borderTopStyle,
+					L = void 0 === W ? y : W,
+					O = k.borderTopColor,
+					T = void 0 === O ? b : O,
+					A = c || {},
+					F = A.borderRightWidth,
+					j = void 0 === F ? v : F,
+					C = A.borderRightStyle,
+					E = void 0 === C ? y : C,
+					H = A.borderRightColor,
+					U = void 0 === H ? b : H,
+					Y = l || {},
+					$ = Y.borderLeftWidth,
+					D = void 0 === $ ? v : $,
+					_ = Y.borderLeftStyle,
+					X = void 0 === _ ? y : _,
+					N = Y.borderLeftColor,
+					V = void 0 === N ? b : N,
+					G = f || {},
+					q = G.borderTopLeftRadius,
+					J = void 0 === q ? f || 0 : q,
+					Q = G.borderTopRightRadius,
+					Z = void 0 === Q ? f || 0 : Q,
+					K = G.borderBottomRightRadius,
+					tt = void 0 === K ? f || 0 : K,
+					et = G.borderBottomLeftRadius,
+					it = void 0 === et ? f || 0 : et;
+				if (h || l || d || c || a) {
+					var nt = function(t, e, n) {
+							"dashed" == e ? /mp/.test(R) ? i.setLineDash([Math.ceil(4 * t / 3), Math.ceil(
+									4 * t / 3)]) : i.setLineDash([Math.ceil(6 * t), Math.ceil(6 * t)]) :
+								"dotted" == e && i.setLineDash([t, t]), i.setStrokeStyle(n)
+						},
+						rt = function(t, e, n, r, o, s, a, h, d, c, l, f, p, g, v) {
+							i.save(), i.setLineCap(v ? "square" : u), i.setLineWidth(f), nt(f, p, g), i
+								.beginPath(), i.arc(t, e, a, Math.PI * d, Math.PI * c), i.lineTo(n, r), i
+								.arc(o, s, h, Math.PI * c, Math.PI * l), i.stroke(), i.restore()
+						};
+					if (i.save(), a && !h && !l && !d && !c) return i.setLineWidth(v), nt(v, y, b), this
+						.roundRect(o, s, n, r, f, !1, !!b), void i.restore();
+					w && rt(o + n - tt, s + r - tt, o + it, s + r, o + it, s + r - it, tt, it, .25, .5, .75,
+						w, z, B, D && j), D && rt(o + it, s + r - it, o, s + J, o + J, s + J, it, J,
+						.75, 1, 1.25, D, X, V, P && w), P && rt(o + J, s + J, o + n - Z, s, o + n - Z,
+						s + Z, J, Z, 1.25, 1.5, 1.75, P, L, T, D && j), j && rt(o + n - Z, s + Z, o + n,
+						s + r - tt, o + n - tt, s + r - tt, Z, tt, 1.75, 2, .25, j, E, U, P && w)
+				}
+			}, t.prototype.setOpacity = function(t) {
+				var e = t.opacity,
+					i = void 0 === e ? 1 : e;
+				this.ctx.setGlobalAlpha(i)
+			}, t.prototype.drawPattern = function(t, e, r) {
+				return i(this, void 0, void 0, (function() {
+					var i = this;
+					return n(this, (function(n) {
+						return [2, new Promise((function(n, o) {
+							i.drawView(e, r, !0, !1, !0);
+							var s = i,
+								a = s.ctx;
+							s.canvas;
+							var h = e.width,
+								d = e.height,
+								c = e.left,
+								l = e.top,
+								f = r || {},
+								u = f.borderRadius,
+								p = void 0 === u ? 0 : u,
+								g = f.backgroundImage,
+								v = f.backgroundRepeat,
+								y = void 0 === v ? "repeat" : v;
+							g && function(t) {
+								var o = a.createPattern(t.src,
+									y);
+								a.setFillStyle(o), i.roundRect(
+										c, l, h, d, p, !0, !1),
+									i.setBorder(e, r), n()
+							}(t)
+						}))]
+					}))
+				}))
+			}, t.prototype.drawView = function(t, e, i, n, r) {
+				void 0 === i && (i = !0), void 0 === n && (n = !0), void 0 === r && (r = !0);
+				var o = this.ctx,
+					s = t.width,
+					a = t.height,
+					h = t.left,
+					d = t.top,
+					c = e || {},
+					l = c.borderRadius,
+					f = void 0 === l ? 0 : l,
+					u = c.backgroundColor,
+					p = void 0 === u ? M : u,
+					g = c.overflow;
+				e.opacity && this.setOpacity(e), this.setTransform(t, e), r && (o.save(), this.setShadow(
+					e)), i && this.setBackground(p, s, a, h, d), e.clipPath ? this.clipPath(h, d, s, a, e
+						.clipPath, i, !1) : this.roundRect(h, d, s, a, f, i, !1), r && o.restore(), n &&
+					this.setBorder(t, e), "hidden" == g && o.clip()
+			}, t.prototype.drawImage = function(t, e, o, s) {
+				return void 0 === e && (e = {}), void 0 === o && (o = {}), void 0 === s && (s = !0), i(this,
+					void 0, void 0, (function() {
+						var a = this;
+						return n(this, (function(h) {
+							switch (h.label) {
+								case 0:
+									return [4, new Promise((function(h, d) {
+										return i(a, void 0, void 0, (
+											function() {
+												var i, a, d, c,
+													l, f, u, p,
+													g, v, y, b,
+													x, m, w, S,
+													z, k, I, P,
+													W, L = this;
+												return n(this, (
+													function(
+														n
+														) {
+														return i =
+															this
+															.ctx,
+															a =
+															o
+															.borderRadius,
+															d =
+															void 0 ===
+															a ?
+															0 :
+															a,
+															c =
+															o
+															.backgroundColor,
+															l =
+															void 0 ===
+															c ?
+															M :
+															c,
+															f =
+															o
+															.objectFit,
+															u =
+															void 0 ===
+															f ?
+															B :
+															f,
+															p =
+															o
+															.backgroundSize,
+															g =
+															void 0 ===
+															p ?
+															B :
+															p,
+															v =
+															o
+															.objectPosition,
+															y =
+															o
+															.backgroundPosition,
+															b =
+															o
+															.boxShadow,
+															o
+															.backgroundImage &&
+															(u = g,
+																v =
+																y
+																),
+															b &&
+															this
+															.drawView(
+																e,
+																Object
+																.assign(
+																	o, {
+																		backgroundColor: l ||
+																			b &&
+																			(l ||
+																				"#ffffff"
+																				)
+																	}
+																	),
+																!
+																0,
+																!
+																1,
+																!
+																0
+																),
+															x =
+															e
+															.width,
+															m =
+															e
+															.height,
+															w =
+															e
+															.left,
+															S =
+															e
+															.top,
+															i
+															.save(),
+															z =
+															e
+															.contentSize
+															.left -
+															e
+															.borderSize
+															.left,
+															k =
+															e
+															.contentSize
+															.top -
+															e
+															.borderSize
+															.top,
+															s ||
+															(this
+																.setOpacity(
+																	o
+																	),
+																this
+																.setTransform(
+																	e,
+																	o
+																	),
+																this
+																.setBackground(
+																	l,
+																	x,
+																	m,
+																	w,
+																	S
+																	),
+																this
+																.roundRect(
+																	w,
+																	S,
+																	x,
+																	m,
+																	d,
+																	!
+																	!
+																	(d ||
+																		!
+																		b &&
+																		l
+																		),
+																	!
+																	1
+																	)
+																),
+															w +=
+															z,
+															S +=
+															k,
+															i
+															.clip(),
+															I =
+															function(
+																t
+																) {
+																if (u !==
+																	B
+																	) {
+																	var n =
+																		function(
+																			t,
+																			e,
+																			i
+																			) {
+																			var n =
+																				t
+																				.objectFit,
+																				r =
+																				t
+																				.objectPosition,
+																				o =
+																				e
+																				.width /
+																				e
+																				.height,
+																				s =
+																				i
+																				.width /
+																				i
+																				.height,
+																				a =
+																				1;
+																			"contain" ==
+																			n && o >=
+																				s ||
+																				"cover" ==
+																				n &&
+																				o <
+																				s ?
+																				a =
+																				e
+																				.height /
+																				i
+																				.height :
+																				("contain" ==
+																					n &&
+																					o <
+																					s ||
+																					"cover" ==
+																					n &&
+																					o >=
+																					s
+																					) &&
+																				(a = e
+																					.width /
+																					i
+																					.width
+																					);
+																			var h =
+																				i
+																				.width *
+																				a,
+																				d =
+																				i
+																				.height *
+																				a,
+																				c =
+																				r ||
+																				[],
+																				l =
+																				c[
+																					0],
+																				f =
+																				c[
+																					1],
+																				u =
+																				/^\d+px|rpx$/
+																				.test(
+																					l
+																					) ?
+																				A(l, e
+																					.width
+																					) :
+																				(e.width -
+																					h
+																					) *
+																				(F(l) ?
+																					A(l,
+																						1) :
+																					{
+																						left: 0,
+																						center: .5,
+																						right: 1
+																					}
+																					[l ||
+																						"center"
+																					]
+																					),
+																				p =
+																				/^\d+px|rpx$/
+																				.test(
+																					f
+																					) ?
+																				A(f, e
+																					.height
+																					) :
+																				(e.height -
+																					d
+																					) *
+																				(F(f) ?
+																					A(f,
+																						1) :
+																					{
+																						top: 0,
+																						center: .5,
+																						bottom: 1
+																					}
+																					[f ||
+																						"center"
+																					]
+																					),
+																				g =
+																				function(
+																					t,
+																					e
+																					) {
+																					return [(t -
+																							u) /
+																						a,
+																						(e -
+																							p) /
+																						a
+																					]
+																				},
+																				v =
+																				g(0,
+																					0),
+																				y =
+																				v[
+																					0],
+																				b =
+																				v[
+																					1],
+																				x =
+																				g(e.width,
+																					e
+																					.height
+																					),
+																				m =
+																				x[
+																					0],
+																				w =
+																				x[
+																					1];
+																			return {
+																				sx: Math
+																					.max(
+																						y,
+																						0
+																						),
+																				sy: Math
+																					.max(
+																						b,
+																						0
+																						),
+																				sw: Math
+																					.min(
+																						m -
+																						y,
+																						i
+																						.width
+																						),
+																				sh: Math
+																					.min(
+																						w -
+																						b,
+																						i
+																						.height
+																						),
+																				dx: Math
+																					.max(
+																						u,
+																						0
+																						),
+																				dy: Math
+																					.max(
+																						p,
+																						0
+																						),
+																				dw: Math
+																					.min(
+																						h,
+																						e
+																						.width
+																						),
+																				dh: Math
+																					.min(
+																						d,
+																						e
+																						.height
+																						)
+																			}
+																		}
+																		({
+																				objectFit: u,
+																				objectPosition: v
+																			},
+																			e
+																			.contentSize,
+																			t
+																			),
+																		o =
+																		n
+																		.sx,
+																		s =
+																		n
+																		.sy,
+																		a =
+																		n
+																		.sh,
+																		h =
+																		n
+																		.sw,
+																		d =
+																		n
+																		.dx,
+																		c =
+																		n
+																		.dy,
+																		l =
+																		n
+																		.dh,
+																		f =
+																		n
+																		.dw;
+																	R == r
+																		.MP_BAIDU ?
+																		i
+																		.drawImage(
+																			t
+																			.src,
+																			d +
+																			w,
+																			c +
+																			S,
+																			f,
+																			l,
+																			o,
+																			s,
+																			h,
+																			a
+																			) :
+																		i
+																		.drawImage(
+																			t
+																			.src,
+																			o,
+																			s,
+																			h,
+																			a,
+																			d +
+																			w,
+																			c +
+																			S,
+																			f,
+																			l
+																			)
+																} else
+																	i
+																	.drawImage(
+																		t
+																		.src,
+																		w,
+																		S,
+																		x,
+																		m
+																		)
+															},
+															P =
+															function() {
+																i.restore(),
+																	L
+																	.drawView(
+																		e,
+																		o,
+																		!
+																		1,
+																		!
+																		0,
+																		!
+																		1
+																		),
+																	h(
+																		1)
+															},
+															W =
+															function(
+																t
+																) {
+																I(t),
+																	P()
+															},
+															W(
+																t),
+															[
+																2]
+													}))
+											}))
+									}))];
+								case 1:
+									return h.sent(), [2]
+							}
+						}))
+					}))
+			}, t.prototype.drawText = function(t, e, i, n) {
+				var r = this.ctx,
+					o = e.borderSize,
+					s = e.contentSize,
+					a = e.left,
+					h = e.top,
+					d = s.width,
+					c = s.height,
+					l = s.left - o.left,
+					f = s.top - o.top,
+					u = i.color,
+					p = void 0 === u ? "#000000" : u,
+					g = i.lineHeight,
+					v = void 0 === g ? "1.4em" : g,
+					y = i.fontSize,
+					b = void 0 === y ? 14 : y,
+					x = i.fontWeight,
+					m = i.fontFamily,
+					w = i.fontStyle,
+					S = i.textAlign,
+					z = void 0 === S ? "left" : S,
+					M = i.verticalAlign,
+					B = void 0 === M ? yt : M,
+					k = i.backgroundColor,
+					I = i.lineClamp,
+					P = i.backgroundClip,
+					W = i.textShadow,
+					R = i.textDecoration;
+				if (this.drawView(e, i, P != ut), v = A(v, b), t) {
+					r.save(), this.setShadow({
+						boxShadow: W
+					}), a += l, h += f;
+					var L = n.fontHeight,
+						O = n.descent + n.ascent;
+					switch (r.setFonts({
+						fontFamily: m,
+						fontSize: b,
+						fontWeight: x,
+						fontStyle: w
+					}), r.setTextBaseline(O ? yt : B), r.setTextAlign(z), P ? this.setBackground(k, d,
+						c, a, h) : r.setFillStyle(p), z) {
+						case xt:
+							break;
+						case mt:
+							a += .5 * d;
+							break;
+						case wt:
+							a += d
+					}
+					var T = n.lines * v,
+						F = Math.ceil((c - T) / 2);
+					switch (F < 0 && (F = 0), B) {
+						case vt:
+							break;
+						case yt:
+							h += F;
+							break;
+						case bt:
+							h += 2 * F
+					}
+					var j = (v - L) / 2,
+						C = function(t) {
+							var e = r.measureText(t),
+								i = e.actualBoundingBoxDescent,
+								n = void 0 === i ? 0 : i,
+								o = e.actualBoundingBoxAscent;
+							return B == vt ? {
+								fix: O ? void 0 === o ? 0 : o : 0,
+								lineY: O ? 2 * j : j
+							} : B == yt ? {
+								fix: O ? v / 2 + n / 4 : v / 2,
+								lineY: (v - L) / 2
+							} : B == bt ? {
+								fix: O ? v - n : v + j,
+								lineY: 0
+							} : {
+								fix: 0,
+								height: 0,
+								lineY: 0
+							}
+						},
+						E = function(t, e, i) {
+							var o = t;
+							switch (z) {
+								case xt:
+									o += i;
+									break;
+								case mt:
+									o = (t -= i / 2) + i;
+									break;
+								case wt:
+									o = t, t -= i
+							}
+							if (R) {
+								r.setLineWidth(b / 13), r.beginPath();
+								var s = .1 * n.fontHeight;
+								/\bunderline\b/.test(R) && (r.moveTo(t, e + s), r.lineTo(o, e + s)),
+									/\boverline\b/.test(R) && (O || (e -= j), r.moveTo(t, e - n.fontHeight -
+										s), r.lineTo(o, e - n.fontHeight - s)), /\bline-through\b/.test(
+									R) && (r.moveTo(t, e - .5 * n.fontHeight), r.lineTo(o, e - .5 * n
+										.fontHeight)), r.closePath(), r.setStrokeStyle(p), r.stroke()
+							}
+						};
+					if (!n.widths || 1 == n.widths.length && n.widths[0].total <= s.width) {
+						var H = C(t),
+							U = H.fix,
+							Y = H.lineY;
+						return r.fillText(t, a, h + U), E(a, (h += v) - Y, n && n.widths && n.widths[0]
+							.total || n.text), r.restore(), void this.setBorder(e, i)
+					}
+					for (var $ = t.split(""), D = h, _ = a, X = "", N = 0, V = 0; V <= $.length; V++) {
+						var G = $[V] || "",
+							q = "\n" === G,
+							J = "" == G,
+							Q = X + (G = q ? "" : G),
+							Z = r.measureText(Q).width;
+						if (N >= I) break;
+						if (_ = a, Z > s.width || q || J) {
+							if (N++, X = J && Z <= s.width ? Q : X, N === I && Z > d) {
+								for (; r.measureText("".concat(X, "...")).width > s.width && !(X.length <=
+										1);) X = X.substring(0, X.length - 1);
+								X += "..."
+							}
+							var K = C(X);
+							U = K.fix, Y = K.lineY;
+							if (r.fillText(X, _, h + U), E(_, (h += v) - Y, Z), X = G, h > D + c) break
+						} else X = Q
+					}
+					r.restore()
+				}
+			}, t.prototype.source = function(t) {
+				return i(this, void 0, void 0, (function() {
+					var e, i, r, o = this;
+					return n(this, (function(n) {
+						switch (n.label) {
+							case 0:
+								if (this.node = null, e = +new Date, "{}" == JSON
+									.stringify(t)) return [2];
+								if (!t.type)
+									for (i in t.type = gt, t.css = t.css || {}, t)[
+											"views", "children", "type", "css"]
+										.includes(i) || (t.css[i] = t[i], delete t[
+											i]);
+								return t.css && !t.css.width && (t.css || (t
+									.css = {})), [4, this.create(t)];
+							case 1:
+								return (r = n.sent()) ? (this.size = r.layout() ||
+									{}, this.node = r, this.onEffectFinished()
+									.then((function(t) {
+										return o.lifecycle(
+											"onEffectSuccess", t)
+									})).catch((function(t) {
+										return o.lifecycle(
+											"onEffectFail", t)
+									})), console.log("布局用时:" + (+new Date - e) +
+										"ms"), [2, this.size]) : [2, console
+									.warn("no node")
+								]
+						}
+					}))
+				}))
+			}, t.prototype.getImageInfo = function(t) {
+				return this.imageBus[t] || (this.imageBus[t] = this.createImage(t, this.useCORS)), this
+					.imageBus[t]
+			}, t.prototype.create = function(t, r) {
+				return i(this, void 0, void 0, (function() {
+					var i, o, s, a, h, d, c, l, f, u, p, g, v, y, b, x, w;
+					return n(this, (function(n) {
+						switch (n.label) {
+							case 0:
+								if (i = t.type == ft, o = [ut, pt].includes(t.type),
+									s = t.css || {}, a = s.backgroundImage, h = s
+									.display, i && !t.src && !t.url || o && !t.text)
+									return [2];
+								if (h == m) return [2];
+								if (o && (t.text = String(t.text)), !(i || t.type ==
+										gt && a)) return [3, 4];
+								d = i ? t.src : "", c = /url\((.+)\)/.exec(a), a &&
+									c && c[1] && (d = c[1] || ""), n.label = 1;
+							case 1:
+								return n.trys.push([1, 3, , 4]), [4, this
+									.getImageInfo(d)
+								];
+							case 2:
+								return l = n.sent(), f = l.width, u = l.height, !(
+									p = l.path) && i ? [2] : (p && (t
+									.attributes = Object.assign(t
+										.attributes || {}, {
+											width: f,
+											height: u,
+											path: p,
+											src: p,
+											naturalSrc: d
+										})), [3, 4]);
+							case 3:
+								return g = n.sent(), t.type != gt ? [2] : (this
+									.lifecycle("onEffectFail", e(e({}, g), {
+										src: d
+									})), [3, 4]);
+							case 4:
+								if (this.count += 1, v = new ct(t, r, this.root,
+										this.ctx), !(y = t.views || t.children))
+									return [3, 8];
+								b = 0, n.label = 5;
+							case 5:
+								return b < y.length ? (x = y[b], [4, this.create(x,
+									v)]) : [3, 8];
+							case 6:
+								(w = n.sent()) && v.add(w), n.label = 7;
+							case 7:
+								return b++, [3, 5];
+							case 8:
+								return [2, v]
+						}
+					}))
+				}))
+			}, t.prototype.drawNode = function(t, e) {
+				return void 0 === e && (e = !1), i(this, void 0, void 0, (function() {
+					var i, r, o, s, a, h, d, c, l, f, u, p, g, v, y, b, x, m, w, S;
+					return n(this, (function(n) {
+						switch (n.label) {
+							case 0:
+								return i = t.layoutBox, r = t.computedStyle, o = t
+									.attributes, s = t.name, a = t.children, h = t
+									.fixedLine, d = t.attributes, c = d.src, l = d
+									.text, ["fixed"].includes(r.position) && !e ? [
+										2] : (this.ctx.save(), s !== gt ? [3, 7] :
+										c ? r.backgroundRepeat ? [4, this
+											.drawPattern(o, i, r)
+										] : [3, 2] : [3, 5]);
+							case 1:
+								return n.sent(), [3, 4];
+							case 2:
+								return [4, this.drawImage(o, i, r, !1)];
+							case 3:
+								n.sent(), n.label = 4;
+							case 4:
+								return [3, 6];
+							case 5:
+								this.drawView(i, r), n.label = 6;
+							case 6:
+								return [3, 10];
+							case 7:
+								return s === ft && c ? [4, this.drawImage(o, i, r, !
+									1)] : [3, 9];
+							case 8:
+								return n.sent(), [3, 10];
+							case 9:
+								s === ut ? this.drawText(l, i, r, o) : s === pt &&
+									lt.api && lt.api.draw(l, this, i, r), n.label =
+									10;
+							case 10:
+								if (this.progress += 1, u = (f = h || {})
+									.beforeElements, p = f.afterElements, !u)
+								return [3, 14];
+								g = 0, v = u, n.label = 11;
+							case 11:
+								return g < v.length ? (S = v[g], [4, this.drawNode(
+									S)]) : [3, 14];
+							case 12:
+								n.sent(), n.label = 13;
+							case 13:
+								return g++, [3, 11];
+							case 14:
+								if (!a) return [3, 18];
+								y = Object.values ? Object.values(a) : Object.keys(
+									a).map((function(t) {
+									return a[t]
+								})), b = 0, x = y, n.label = 15;
+							case 15:
+								return b < x.length ? "absolute" === (S = x[b])
+									.computedStyle.position ? [3, 17] : [4, this
+										.drawNode(S)
+									] : [3, 18];
+							case 16:
+								n.sent(), n.label = 17;
+							case 17:
+								return b++, [3, 15];
+							case 18:
+								if (!p) return [3, 22];
+								m = 0, w = p, n.label = 19;
+							case 19:
+								return m < w.length ? (S = w[m], [4, this.drawNode(
+									S)]) : [3, 22];
+							case 20:
+								n.sent(), n.label = 21;
+							case 21:
+								return m++, [3, 19];
+							case 22:
+								return this.ctx.restore(), [2]
+						}
+					}))
+				}))
+			}, t.prototype.render = function(t) {
+				var e = this;
+				return void 0 === t && (t = 30), new Promise((function(r, o) {
+					return i(e, void 0, void 0, (function() {
+						var e, i, s, a, h, d, c, l, f, u;
+						return n(this, (function(n) {
+							switch (n.label) {
+								case 0:
+									return e = +new Date, this.init(), [
+										4, (p = t, void 0 === p && (
+											p = 0), new Promise(
+											(function(t) {
+												return setTimeout(
+													t, p
+													)
+											})))
+									];
+								case 1:
+									n.sent(), n.label = 2;
+								case 2:
+									if (n.trys.push([2, 14, , 15]), !
+										this.node) return [3, 12];
+									if (i = this.root.fixedLine || {},
+										s = i.beforeElements, a = i
+										.afterElements, !s) return [3,
+										6];
+									h = 0, d = s, n.label = 3;
+								case 3:
+									return h < d.length ? (f = d[h], [4,
+										this.drawNode(f, !0)
+									]) : [3, 6];
+								case 4:
+									n.sent(), n.label = 5;
+								case 5:
+									return h++, [3, 3];
+								case 6:
+									return [4, this.drawNode(this
+									.node)];
+								case 7:
+									if (n.sent(), !a) return [3, 11];
+									c = 0, l = a, n.label = 8;
+								case 8:
+									return c < l.length ? (f = l[c], [4,
+										this.drawNode(f, !0)
+									]) : [3, 11];
+								case 9:
+									n.sent(), n.label = 10;
+								case 10:
+									return c++, [3, 8];
+								case 11:
+									return r(this.node), [3, 13];
+								case 12:
+									this.lifecycle("onEffectFail",
+											"node is empty"), n.label =
+										13;
+								case 13:
+									return [3, 15];
+								case 14:
+									return u = n.sent(), this.lifecycle(
+										"onEffectFail", u), o(u), [
+										3, 15
+									];
+								case 15:
+									return console.log("渲染用时:" + (+
+											new Date - e - 30) +
+										"ms"), [2]
+							}
+							var p
+						}))
+					}))
+				}))
+			}, t.prototype.onEffectFinished = function() {
+				var t = this,
+					e = Object.keys(this.imageBus).map((function(e) {
+						return t.imageBus[e]
+					}));
+				return Promise.all(e)
+			}, t.prototype.destroy = function() {
+				this.node = []
+			}, t.prototype.save = function(t) {
+				try {
+					var e = t || {},
+						i = e.fileType,
+						n = void 0 === i ? "png" : i,
+						r = e.quality,
+						o = void 0 === r ? 1 : r;
+					return this.canvas.toDataURL("image/".concat(n), o)
+				} catch (t) {
+					return this.lifecycle("onEffectFail", "image cross domain"), t
+				}
+			}, t
+		}();
+	r.WEB == R && (window.Painter = St), t.Painter = St, t.default = St, Object.defineProperty(t,
+	"__esModule", {
+		value: !0
+	})
+}));

File diff ditekan karena terlalu besar
+ 0 - 0
components/lime-painter/static/uni.webview.1.5.3.js


+ 516 - 0
components/mosowe-canvas-image/mosowe-canvas-image.vue

@@ -0,0 +1,516 @@
+<!-- mosowe-canvas-image -->
+<template>
+	<view class='mosowe-canvas-image'>
+		<view class="slot-view" @click="createCanvas">
+			<slot></slot>
+		</view>
+		<view class="canvas-wrap-box">
+			<!-- 主面板绘制 -->
+			<canvas class="canvas-wrap" canvas-id="canvas"
+				:style="'width: '+ width +'px; height: '+ height +'px;'"></canvas>
+			<!-- 这个是用来绘制圆形图片的 -->
+			<canvas class="canvas-wrap" canvas-id="canvas-arc"
+				:style="'width: '+ canvasArcWidth +'px; height: '+ canvasArcHeight +'px;'"></canvas>
+		</view>
+	</view>
+</template>
+
+<script>
+	import QR from './wxqrcode.js';
+	export default {
+		name: 'mosowe-canvas-image',
+		components: {},
+		props: {
+			imgType: { // 图片类型
+				type: String,
+				default: 'jpg',
+				validator: () => {
+					return ['jpg', 'png'];
+				}
+			},
+			compress: { // 是否开启压缩
+				type: Boolean,
+				default: false
+			},
+			compressSize: { // 压缩界限,超过界限压缩,默认2M
+				type: [Number, String],
+				default: 1024 * 1024 * 2
+			},
+			showPreview: { // 生成图像后是否预览
+				type: Boolean,
+				default: false
+			},
+			height: { // canvas高度
+				type: [String, Number],
+				default: 200
+			},
+			width: { // canvas宽度
+				type: [String, Number],
+				default: 200
+			},
+			lists: {
+				type: Array,
+				default: () => {
+					return [];
+				}
+			}
+		},
+		data() {
+			return {
+				canvas: null,
+				listsIndex: 0,
+				listsLength: 0,
+				canvasArc: null,
+				canvasArcWidth: 100,
+				canvasArcHeight: 100,
+				compressQuality: 20,
+				compressQualityH5: 5,
+			};
+		},
+		watch: {},
+		// 组件实例化之前 
+		beforeCreate() {},
+		// 组件创建完成
+		created() {
+			this.canvas = uni.createCanvasContext('canvas', this);
+			this.canvasArc = uni.createCanvasContext('canvas-arc', this);
+		},
+		// 组件挂载之前
+		beforeMount() {},
+		// 组件挂载之后
+		mounted() {},
+		// 组件数据更新时
+		beforeUpdate() {},
+		// 组价更新
+		updated() {},
+		// 组件销毁前
+		beforeDestroy() {},
+		// 组件销毁后
+		destroyed() {},
+		// 页面方法
+		methods: {
+			// 开始绘制
+			createCanvas() {
+				this.clearCanvas();
+				if (this.lists.length === 0) {
+					uni.showToast({
+						title: 'lists不能为空',
+						icon: 'none'
+					});
+					return;
+				}
+				this.listsIndex = 0;
+				this.listsLength = this.lists.length - 1;
+				uni.showLoading({
+					title: '正在生成图片...',
+					mask: true
+				});
+				// 先生成一个白色背景
+				this.canvas.setFillStyle('#fff');
+				this.canvas.globalAlpha = 1;
+				this.canvas.fillRect(0, 0, this.width, this.height);
+
+				this.dataDrawCanvas();
+			},
+			// 数据绘制
+			dataDrawCanvas() {
+				let item = this.lists[this.listsIndex];
+				if (item.type === 'image') { // 图片
+					if (item.content.indexOf('https://') > -1) { // https://网络图片
+						// #ifndef H5
+						// 非H5
+						this.downloadImageNotH5(item);
+						// #endif
+						// #ifdef H5
+						// H5
+						this.downloadImageH5(item);
+						// #endif
+					} else { // 本地选择图片
+						if (this.compress && item.hasOwnProperty('file') && item.file.size > this
+							.compressSize) { // 大于限制2M压缩
+							this.compressImage(item);
+						} else {
+							if (item.arc) {
+								this.drawImageArc(item);
+							} else {
+								this.drawImage(item);
+							}
+						}
+					}
+
+				} else if (item.type === 'text') { // 文本
+					this.drawText(item);
+				} else if (item.type === 'rect') { // 矩形(线条)
+					this.drawRect(item);
+				} else if (item.type === 'arc') { // 圆形
+					this.drawArc(item);
+				} else if (item.type === 'qr') { // 二维码
+					this.drawQR(item);
+				}
+			},
+			// #ifndef H5
+			// https图片下载本地并绘制,非H5
+			downloadImageNotH5(item) {
+				uni.downloadFile({
+					url: item.content,
+					header: {
+						'Access-Control-Allow-Origin': '*',
+					},
+					success: (res) => {
+						item.content = res.tempFilePath;
+						if (item.arc) {
+							this.drawImageArc(item);
+						} else {
+							this.drawImage(item);
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+					}
+				});
+			},
+			// #endif
+			// #ifdef H5
+			// https图片下载本地并绘制,H5
+			downloadImageH5(item) {
+				let image = null;
+				image = new Image();
+				image.setAttribute('crossOrigin', 'anonymous');
+				image.crossOrigin = 'Anonymous';
+				image.src = item.content;
+				image.onload = () => {
+					let canvas = document.createElement('canvas');
+					canvas.width = item.width;
+					canvas.height = item.height;
+					let ctx = canvas.getContext('2d');
+					ctx.drawImage(
+						image,
+						0,
+						0,
+						item.width,
+						item.height
+					);
+					let dataURL = canvas.toDataURL('image/png');
+					if (item.arc) { // 绘制圆形
+						item.content = dataURL;
+						this.drawImageArc(item);
+					} else {
+						this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+						this.canvas.drawImage(
+							dataURL,
+							item.x,
+							item.y,
+							item.hasOwnProperty('width') ? item.width : this.width,
+							item.hasOwnProperty('height') ? item.height : this.height
+						);
+
+						this.checkDrawOver();
+					}
+
+				};
+			},
+			// #endif
+			// 图片压缩
+			compressImage(item) {
+				uni.showLoading({
+					title: '压缩中...',
+					mask: true
+				});
+				// 非H5压缩
+				// #ifndef H5
+				uni.compressImage({
+					src: item.content,
+					quality: this.compressQuality,
+					success: (res) => {
+						uni.showLoading({
+							title: '正在生成图片...',
+							mask: true
+						});
+						item.content = res.tempFilePath;
+						if (item.arc) {
+							this.drawImageArc(item);
+						} else {
+							this.drawImage(item);
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '压缩失败',
+							icon: 'none'
+						});
+					}
+				});
+				// #endif
+				// H5压缩
+				// #ifdef H5
+				let image = new Image();
+				image.setAttribute('crossOrigin', 'anonymous');
+				image.crossOrigin = 'Anonymous';
+				image.src = item.content;
+				image.onload = () => {
+					let canvas = document.createElement('canvas');
+					canvas.width = item.width;
+					canvas.height = item.height;
+					let ctx = canvas.getContext('2d');
+					ctx.drawImage(
+						image,
+						0,
+						0,
+						item.width,
+						item.height
+					);
+					let dataURL = canvas.toDataURL('image/png');
+					item.content = dataURL;
+					if (item.arc) {
+						this.drawImageArc(item);
+					} else {
+						this.drawImage(item);
+					}
+				};
+				// #endif
+			},
+			// 圆形图片另外绘制canvas,png格式
+			drawImageArc(item) {
+				this.canvasArc.clearRect(0, 0, this.canvasArcWidth, this.canvasArcHeight);
+				this.canvasArcWidth = item.arcR * 2;
+				this.canvasArcHeight = item.arcR * 2;
+				this.canvasArc.save();
+				let arcT = setTimeout(() => {
+					clearTimeout(arcT);
+					this.canvasArc.arc(item.arcR, item.arcR, item.arcR, 0, 2 * Math.PI);
+					this.canvasArc.clip();
+					// this.canvasArc.closePath();
+
+					this.canvasArc.drawImage(
+						item.content,
+						item.arcX,
+						item.arcY,
+						item.width,
+						item.height
+					);
+					this.canvasArc.draw(false, setTimeout(() => {
+						let t = setTimeout(() => {
+							clearTimeout(t);
+							uni.canvasToTempFilePath({
+								x: 0,
+								y: 0,
+								width: item.arcR * 2,
+								height: item.arcR * 2,
+								fileType: 'png',
+								canvasId: 'canvas-arc',
+								success: (res) => {
+									item.width = item.arcR * 2;
+									item.height = item.arcR * 2;
+									item.content = res.tempFilePath;
+									this.drawImage(item);
+								},
+								fail: (res) => {
+									console.log(res);
+								},
+								complete: () => {
+									this.canvasArc.restore();
+									this.canvasArc.fillRect(0, 0, 0, 0);
+									this.canvasArc.clearRect(0, 0, this
+										.canvasArcWidth, this.canvasArcHeight);
+								}
+							}, this);
+						}, 100);
+					}));
+				}, 100);
+			},
+			// 图片绘制
+			drawImage(item) {
+				this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+				this.canvas.drawImage(
+					item.content,
+					item.x,
+					item.y,
+					item.hasOwnProperty('width') ? item.width : this.width,
+					item.hasOwnProperty('height') ? item.height : this.height
+				);
+				this.checkDrawOver();
+			},
+			// 文本绘制
+			drawText(item) {
+				this.canvas.setFillStyle(item.hasOwnProperty('color') ? item.color : '#000000');
+				this.canvas.setFontSize(item.hasOwnProperty('size') ? item.size : 20);
+				this.canvas.setTextAlign(item.hasOwnProperty('align') ? item.align : 'left');
+				this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+
+				if (item.maxWidth) {
+					this.canvas.fillText(item.content, item.x, item.y, item.maxWidth);
+				} else {
+					this.canvas.fillText(item.content, item.x, item.y);
+				}
+				this.checkDrawOver();
+			},
+
+			// 矩形(线条)绘制
+			drawRect(item) {
+				this.canvas.setFillStyle(item.hasOwnProperty('color') ? item.color : '#000000');
+				this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+				this.canvas.fillRect(item.x, item.y, item.width, item.height);
+				this.checkDrawOver();
+			},
+
+			// 圆形绘制
+			drawArc(item) {
+				this.canvas.arc(item.arcX, item.arcY, item.arcR, 0, 2 * Math.PI);
+				this.canvas.setFillStyle(item.hasOwnProperty('color') ? item.color : '#000000');
+				this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+				this.canvas.fill();
+				this.canvas.closePath();
+				this.checkDrawOver();
+			},
+
+			// 二维码绘制
+			async drawQR(item) {
+				console.log("content:", item.content)
+				await this.removeSave();
+				item.content = await this.base64ToSave(item.content);
+				console.log("content:", item.content)
+				if (item.content) {
+					this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+					this.canvas.drawImage(
+						item.content,
+						item.x,
+						item.y,
+						item.hasOwnProperty('width') ? item.width : this.width,
+						item.hasOwnProperty('height') ? item.height : this.height
+					);
+				}
+
+				// item['qr'] = QR.createQrCodeImg(item.content, {
+				// 	size: parseInt(300)
+				// });
+				// console.log("qr: ", item.qr)
+				// this.canvas.globalAlpha = item.hasOwnProperty('globalAlpha') ? item.globalAlpha : 1;
+				// this.canvas.drawImage(
+				// 	item.qr,
+				// 	item.x,
+				// 	item.y,
+				// 	item.hasOwnProperty('width') ? item.width : this.width,
+				// 	item.hasOwnProperty('height') ? item.height : this.height
+				// );
+				this.checkDrawOver();
+			},
+
+			// 判断是否绘制完
+			checkDrawOver() {
+				if (this.listsIndex < this.listsLength) { // lists未画完
+					this.listsIndex++;
+					this.dataDrawCanvas();
+				} else {
+					this.canvasImage();
+				}
+			},
+
+			// 绘制到画布并生成图片
+			canvasImage() {
+				this.listsIndex = 0
+				this.canvas.draw(false, setTimeout(() => {
+					setTimeout(() => {
+						uni.canvasToTempFilePath({
+							x: 0,
+							y: 0,
+							width: Number(this.width),
+							height: Number(this.height),
+							fileType: this.imgType,
+							canvasId: 'canvas',
+							success: (res) => {
+								this.$emit('canvasImage', res.tempFilePath);
+								if (this.showPreview) {
+									this.showPreviewFn(res.tempFilePath);
+								}
+							},
+							fail: (res) => {
+								console.log(res);
+							},
+							complete: () => {
+								uni.hideLoading();
+							}
+						}, this);
+					}, 500);
+				}));
+			},
+			// 预览图
+			showPreviewFn(img) {
+				uni.previewImage({
+					current: 0,
+					urls: [img]
+				});
+			},
+			// 清空画布
+			clearCanvas() {
+				this.canvas.clearRect(0, 0, this.width, this.height);
+			},
+			removeSave(FILE_BASE_NAME = 'tmp_base64src', format = 'jpg') {
+				return new Promise((resolve) => {
+					// 把文件删除后再写进,防止超过最大范围而无法写入
+					const fsm = uni.getFileSystemManager(); //文件管理器
+					const FILE_BASE_NAME = 'tmp_base64src';
+					const format = 'gif';
+					const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
+					fsm.unlink({
+						filePath: filePath,
+						success(res) {
+							console.log('文件删除成功');
+							resolve(true);
+						},
+						fail(e) {
+							console.log('readdir文件删除失败:', e);
+							resolve(true);
+						}
+					});
+				})
+			},
+			base64ToSave(base64data, FILE_BASE_NAME = 'tmp_base64src') {
+				const fsm = uni.getFileSystemManager();
+				return new Promise((resolve, reject) => {
+					//format这个跟base64数据的开头对应
+					const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
+					if (!format) {
+						reject(new Error('ERROR_BASE64SRC_PARSE'));
+					}
+					const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
+					//const buffer = wx.base64ToArrayBuffer(bodyData);
+					fsm.writeFile({
+						filePath,
+						data: bodyData,
+						//data: base64data.split(";base64,")[1],
+						encoding: 'base64',
+						success() {
+							resolve(filePath);
+						},
+						fail() {
+							reject(new Error('ERROR_BASE64SRC_WRITE'));
+						},
+					});
+				});
+			},
+
+		}
+	};
+</script>
+
+<style lang='scss' scoped>
+	.mosowe-canvas-image {
+		overflow: hidden;
+
+		.canvas-wrap-box {
+			overflow: hidden;
+			height: 0;
+			width: 0;
+			position: fixed;
+			left: 200%;
+			top: 0;
+		}
+
+		.canvas-wrap {
+			overflow: hidden;
+			height: 0;
+			width: 0;
+		}
+	}
+</style>

+ 195 - 0
components/mosowe-canvas-image/readme.md

@@ -0,0 +1,195 @@
+## mosowe-canvas-image:一个可以制作多用途图片的插件(海报,二维码,分享图)
+
+### v1.2.0:
+1. 添加透明度`globalAlpha`,值0-1;
+2. 修改只能画一个圆形图片问题,画圆形图片时耗时较多,因为额外增加了一个canvas处理圆形图片,请注意`arcX`与`arcY`的说明;
+
+### v1.1.0:
+
+1. 添加本地图片渲染,已支持本地相册/相机 + https的网络图片,建议画布宽高:750*1330
+2. 添加导出图片的类型:`imgType`,可选值,jpg、png
+3. 添加本地图片压缩功能:`compress`是否开启压缩,`compressSize`:压缩程度,默认2M,lists列表图片项需增加传参`file`,
+4. 解决H5网络图片“canvasToTempFilePath:fail SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported”错误问题,图片服务器需支持“Access-Control-Allow-Origin: *”
+5. 使用非solt插槽触发事件时,请确认`$ref`是否正确
+6. 示例增加参数编辑,使用前体验插件
+
+#### 平台支持:
+
+| APP  |  H5  | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节跳动小程序 | QQ小程序 |
+| :--: | :--: | :--------: | :----------: | :--------: | :------------: | :------: |
+|  √   |  √   |     √      |      ×       |    未测    |      未测      |   未测   |
+
+#### 插件功能
+
+1. 支持多图片绘制,多文本绘制,圆形图片绘制;
+2. 支持矩形(线条)绘制;
+3. 支持圆形绘制;
+4. 支持二维码生成,项目用不上可以去插件内去除,毕竟这个插件携带的比较大,单纯用来生成二维码图片也是阔以的;
+5. 支持绘图后预览。
+
+多用于海报图,分享图;
+
+注意H5跨域问题及小程序白名单配置;
+
+图片是网络图片:https://....(require及import引入不了3Kb以上的绝对路径图片,若有大神知道处理方法,望不吝赐教,谢谢!)
+
+#### 属性
+
+| 名称         | 类型             | 默认值       | 说明                                                     | 版本  |
+| ------------ | ---------------- | ------------ | -------------------------------------------------------- | ----- |
+| width        | Number \String   | 200          | canvas画布宽度,也是导出图片宽度,单位px,值中不要带单位 | 1.0.0 |
+| height       | Number \String   | 200          | canvas画布高度,也是导出图片高度,单位px,值中不要带单位 | 1.0.0 |
+| showPreview  | Boolean          | false        | 绘制完成后是否打开预览                                   | 1.0.0 |
+| lists        | Array            | []           | 绘制的元素列表:图片,文字,矩形(线条),圆形,二维码   | 1.0.0 |
+| imgType      | String           | jpg          | 生成图片格式,可选:png                                  | 1.1.0 |
+| compress     | Boolean          | false        | 是否开启图片压缩                                         | 1.1.0 |
+| compressSize | Number\String    | 2097152 (2M) | 超过多少M压缩                                            | 1.1.0 |
+
+
+
+
+#### lists\<item>属性
+
+注意:图文先后顺序,底层的图片靠前,最上层的在最后,圆形图片放在最后,因为一旦绘制圆形,后续的元素都只在该圆形内显示,而超过圆形范围的将看不见。
+
+| 名称     | 类型   | 必填 | 说明                                                         |版本|
+| :------- | :----- | :--- | :----------------------------------------------------------- |:----|
+| type     | String | 是   | 元素类型:`image`图片,`text`文本,`rect`矩形(线条),`arc`圆形,`qr`二维码 |1.0.0|
+| content  | String | 否   | image:图片路径(必填),text:文字(必填),qr:转二维码的数据(必填),rect及arc:非必填 |1.0.0|
+| x        | Number | 是   | X轴坐标,绘制圆形图片时:x = arcX - arcR                     |1.0.0|
+| y        | Number | 是   | Y轴坐标,绘制圆形图片时:y = arcY - arcR                     |1.0.0|
+| width    | Number | 否   | 图片、矩形(线条)、二维码宽度                               |1.0.0|
+| height   | Number | 否   | 图片、矩形(线条)、二维码高度                               |1.0.0|
+| arc      | Boolen | 否   | type=image时:是否绘制圆形图片                               |1.0.0|
+| arcX     | Number | 否   | type=arc时:绘制圆形时中心点X轴坐标,type=image时,图片在圆形canvas的X坐标,多为负数,版本`1.2.0`                  |1.2.0|
+| arcY     | Number | 否   | type=arc时:绘制圆形时中心点Y轴坐标,type=image时,图片在圆形canvas的Y坐标,多为负数,版本`1.2.0`                  |1.2.0|
+| arcR     | Number | 否   | type=image、arc时:绘制圆形的半径                            |1.0.0|
+| color    | String | 否   | 绘制文本、矩形(线条)的颜色,默认:#000000                  |1.0.0|
+| size     | Number | 否   | 绘制文本的字号大小,默认:20                                 |1.0.0|
+| align    | String | 否   | 绘制文本的对齐方式,默认:left                               |1.0.0|
+| maxWidth | Number | 否   | 绘制文本的最大宽度,文字长度超过该值会被压缩                 |1.0.0|
+| file     | file   | 否   | 选择本地图片的file文件,版本`1.1.0`                          |1.1.0|
+| globalAlpha  | Number | 否   | 透明度:0~1,默认1,版本`1.2.0` |1.2.0|
+
+#### slots
+
+| 名称    | 说明                               |
+| :------ | :--------------------------------- |
+| default | 自定义插槽,点击此区会触发绘图事件 |
+
+#### 事件
+
+| 名称        | 回调参数 | 说明                                 |
+| ----------- | -------- | ------------------------------------ |
+| canvasImage | url      | 绘制成功后返回的本地地址,H5为base64 |
+
+
+
+#### 使用方式
+
+若`page.json`中配置了`"easycom": true`,则无需`script`引入就可以使用,没有则需要引入。
+
+1. 无slot:组件标签添加`ref`属性,采用父级调用子组件`createCanvas()`方法使用,见后文示例;
+2. 有slot:slot区点击就会执行
+
+#### 示例
+
+```javascript
+// js
+data () {
+    return {
+			canvasUrl: '',
+			lists: [
+						{
+							type: 'image',
+							content: 'https://www.zhonglixunqing.cn/images/uniapp/1.jpg', 
+							width: 200, 
+							height: 100, 
+							x: 50, 
+							y: 20, 
+						},
+						{
+							type: 'image',
+							content: 'https://www.zhonglixunqing.cn/images/uniapp/2.jpg', 
+							width: 80, 
+							height: 80, 
+							x: 20, 
+							y: 200, 
+							arc: false, 
+							arcX: 0, 
+							arcY: 0, 
+							arcR: 0 
+						},
+						{
+							type: 'text',
+							content: '扫一扫,获取更多信息', 
+							x: 120, 
+							y: 250, 
+							color: '#ff0000', 
+							size: 10, 
+							// maxWidth: 100, 
+							// align: 'left', 
+						},
+						{
+							type: 'rect',
+							width: 1,
+							height: 100,
+							x: 0,
+							y: 10,
+							color: '#ff0000',
+						},
+						{
+							type: 'image',
+							content: 'https://www.zhonglixunqing.cn/images/uniapp/3.jpg', 
+							width: 100, 
+							height: 100, 
+							x: 200, 
+							y: 200, 
+							arc: true, 
+							arcX: 250, 
+							arcY: 250, 
+							arcR: 50 
+						},
+					]
+    };
+  },
+  methods: {
+		beginCanvas () {
+			this.$refs.mosoweCanvasComponents.createCanvas();
+		},
+		_canvasImage (e) {
+			this.canvasUrl = e;
+		}
+	}
+```
+
+插件外独立按钮触发:
+
+```html
+		<button type="default" @click="beginCanvas">开始绘图</button>
+		<image :src="canvasUrl" mode="widthFix"></image>
+		<mosowe-canvas-image 
+			ref="mosoweCanvasComponents" 
+			@canvasImage="_canvasImage" 
+			:lists="lists" 
+			height="300" 
+			width="300"
+			showPreview />
+```
+
+slot插槽触发:
+
+```html
+		<mosowe-canvas-image 
+			:lists="lists" 
+			height="300" 
+			width="300"
+			showPreview >
+			<view class="in_btn">
+				slot按钮的
+			</view>
+			</mosowe-canvas-image>
+```
+
+#### 预览地址
+

File diff ditekan karena terlalu besar
+ 987 - 0
components/mosowe-canvas-image/wxqrcode.js


File diff ditekan karena terlalu besar
+ 18 - 0
components/mys-tip_1.0.01/a_tip/aTip.vue


+ 26 - 0
components/mys-tip_1.0.01/a_tip/说明.md

@@ -0,0 +1,26 @@
+# 1.0.0
+插件市场<https://ext.dcloud.net.cn/plugin?id=2435>
+## uniapp,添加我的小程序,支持自定义 custom
+
+#### props 值说明
+
+|    属性    | 默认值                                           |       可选       |  类型   |               简介                |
+| :--------: | :----------------------------------------------- | :--------------: | :-----: | :-------------------------------: |
+|  isCustom  | false                                            |     Boolean      | Boolean | 是否配置了 navigationStyle:custom |
+| closeColor | true                                             |     Boolean      | Boolean |  close 按钮颜色,黑白,不用就清理  |
+|  bgColor   | #E6F0FF                                          |      自定义      | String  |             背景颜色              |
+|  borderR   | 5                                                |      自定义      | Number  |             圆角大小              |
+|   delay    | 2000                                             |      自定义      | Number  |           延时出现时间            |
+|    isAm    | true                                             |     Boolean      | Boolean |             动画效果              |
+|    text    | 添加我的小程序                                   |      自定义      | String  |             提示文本              |
+|  fontObj   | {color: "202020",fontSize:13px fontWeight: "0",} | 传入对应格式对象 | Object  |          提示文本 style           |
+
+
+用到了 scss 插件
+
+只显示一次 ,调试下面 
+
+```javascript
+//115 if (uni.getStorageSync("my_tips_2020")) return;
+//121 this.timeOut();
+```

+ 95 - 0
components/mys-tip_1.0.01/manifest.json

@@ -0,0 +1,95 @@
+{
+	"name" : "",
+	"appid" : "",
+	"description": "应用描述",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	/* 5+App特有相关 */
+	"app-plus": {
+		"usingComponents": true,
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		"modules": {
+			"OAuth": {},
+			"Payment": {},
+			"Push": {},
+			"Share": {},
+			"Speech": {},
+			"VideoPlayer": {}
+		},
+		/* 应用发布信息 */
+		"distribute": {
+			/* android打包配置 */
+			"android": {
+				"permissions": [
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
+					"<uses-permission android:name=\"android.permission.INTERNET\"/>",
+					"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.READ_SMS\"/>",
+					"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
+					"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+					"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
+					"<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
+					"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
+				]
+			},
+			/* ios打包配置 */
+			"ios": {
+				"UIBackgroundModes": ["audio"]
+			},
+			/* SDK配置 */
+			"sdkConfigs": {
+				"speech": {
+					"ifly": {}
+				}
+			},
+			"orientation": ["portrait-primary"]
+		}
+	},
+	/* 快应用特有相关 */
+	"quickapp": {},
+	/* 小程序特有相关 */
+	"mp-weixin": {
+		"appid": "",
+		"setting": {
+			"urlCheck": false
+		},
+		"usingComponents": true
+	},
+	"h5": {
+		"template": "template.h5.html",
+		"router": {
+			"mode": "history",
+			"base": "/h5/"
+		}
+	}
+}

+ 18 - 0
components/mys-tip_1.0.01/package.json

@@ -0,0 +1,18 @@
+{
+    "id": "mys-tip",
+    "name": "小程序 添加我的小程序顶部提示 支持自定义 custom",
+    "version": "1.0.01",
+    "description": "uniapp,添加我的小程序,支持自定义 custom",
+    "keywords": [
+        "小程序",
+        "自定义custom",
+        "小程序导航",
+        "小程序提示"
+    ],
+    "dcloudext": {
+        "category": [
+            "uni-app前端模板",
+            "前端页面模板"
+        ]
+    }
+}

TEMPAT SAMPAH
components/mys_navBar.zip


+ 11 - 3
components/mys_navBar/mysNavBar.vue

@@ -134,14 +134,14 @@
 							text: "",
 							color: "",
 							fontSize: "", // px upx rpx
-							fontWeight: "", // blod
+							fontWeight: "500", // blod
 						},
 						/* 标题 */
 						navTitle: {
 							text: "",
 							color: "",
 							fontSize: "32rpx", // px upx rpx
-							fontWeight: "", // blod
+							fontWeight: "500", // blod
 						},
 						/* type2 按钮 */
 						type2Config: {
@@ -262,7 +262,15 @@
 					});
 				} else {
 					console.log("back");
-					uni.navigateBack();
+					let pages = getCurrentPages(); // 当前页面
+					let beforePage = pages[pages.length - 2]; // 上一页
+					uni.navigateBack({
+						success: function() {
+							beforePage
+								.onLoad(); // 执行上一页的onLoad方法
+						}
+					})
+					// uni.navigateBack();
 				}
 			},
 			/* type2 返回首页 */

+ 1261 - 0
components/qrcode.js

@@ -0,0 +1,1261 @@
+//---------------------------------------------------------------------
+// QRCode for JavaScript
+//
+// Copyright (c) 2009 Kazuhiko Arase
+//
+// URL: http://www.d-project.com/
+//
+// Licensed under the MIT license:
+//   http://www.opensource.org/licenses/mit-license.php
+//
+// The word "QR Code" is registered trademark of 
+// DENSO WAVE INCORPORATED
+//   http://www.denso-wave.com/qrcode/faqpatent-e.html
+//
+//---------------------------------------------------------------------
+
+//---------------------------------------------------------------------
+// QR8bitByte
+//---------------------------------------------------------------------
+
+function QR8bitByte(data) {
+  this.mode = QRMode.MODE_8BIT_BYTE;
+  this.data = data;
+}
+
+QR8bitByte.prototype = {
+
+  getLength: function(buffer) {
+    return this.data.length;
+  },
+
+  write: function(buffer) {
+    for (var i = 0; i < this.data.length; i++) {
+      // not JIS ...
+      buffer.put(this.data.charCodeAt(i), 8);
+    }
+  }
+};
+
+//---------------------------------------------------------------------
+// QRCode
+//---------------------------------------------------------------------
+
+function QRCode(typeNumber, errorCorrectLevel) {
+  this.typeNumber = typeNumber;
+  this.errorCorrectLevel = errorCorrectLevel;
+  this.modules = null;
+  this.moduleCount = 0;
+  this.dataCache = null;
+  this.dataList = new Array();
+}
+
+QRCode.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() {
+    // Calculate automatically typeNumber if provided is < 1
+    if (this.typeNumber < 1) {
+      var typeNumber = 1;
+      for (typeNumber = 1; typeNumber < 40; typeNumber++) {
+        var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);
+
+        var buffer = new QRBitBuffer();
+        var totalDataCount = 0;
+        for (var i = 0; i < rsBlocks.length; i++) {
+          totalDataCount += rsBlocks[i].dataCount;
+        }
+
+        for (var i = 0; i < this.dataList.length; i++) {
+          var data = this.dataList[i];
+          buffer.put(data.mode, 4);
+          buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
+          data.write(buffer);
+        }
+        if (buffer.getLengthInBits() <= totalDataCount * 8)
+          break;
+      }
+      this.typeNumber = typeNumber;
+    }
+    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; //(col + row) % 3;
+      }
+    }
+
+    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 = QRCode.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);
+
+    // vertical		
+    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;
+      }
+    }
+
+    // horizontal
+    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;
+      }
+    }
+
+    // fixed module
+    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;
+        }
+      }
+    }
+
+  }
+
+};
+
+QRCode.PAD0 = 0xEC;
+QRCode.PAD1 = 0x11;
+
+QRCode.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);
+  }
+
+  // calc num max data.
+  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 +
+      ")");
+  }
+
+  // end code
+  if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
+    buffer.put(0, 4);
+  }
+
+  // padding
+  while (buffer.getLengthInBits() % 8 != 0) {
+    buffer.putBit(false);
+  }
+
+  // padding
+  while (true) {
+
+    if (buffer.getLengthInBits() >= totalDataCount * 8) {
+      break;
+    }
+    buffer.put(QRCode.PAD0, 8);
+
+    if (buffer.getLengthInBits() >= totalDataCount * 8) {
+      break;
+    }
+    buffer.put(QRCode.PAD1, 8);
+  }
+
+  return QRCode.createBytes(buffer, rsBlocks);
+}
+
+QRCode.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;
+
+}
+
+//---------------------------------------------------------------------
+// QRMode
+//---------------------------------------------------------------------
+
+var QRMode = {
+  MODE_NUMBER: 1 << 0,
+  MODE_ALPHA_NUM: 1 << 1,
+  MODE_8BIT_BYTE: 1 << 2,
+  MODE_KANJI: 1 << 3
+};
+
+//---------------------------------------------------------------------
+// QRErrorCorrectLevel
+//---------------------------------------------------------------------
+
+var QRErrorCorrectLevel = {
+  L: 1,
+  M: 0,
+  Q: 3,
+  H: 2
+};
+
+//---------------------------------------------------------------------
+// QRMaskPattern
+//---------------------------------------------------------------------
+
+var QRMaskPattern = {
+  PATTERN000: 0,
+  PATTERN001: 1,
+  PATTERN010: 2,
+  PATTERN011: 3,
+  PATTERN100: 4,
+  PATTERN101: 5,
+  PATTERN110: 6,
+  PATTERN111: 7
+};
+
+//---------------------------------------------------------------------
+// QRUtil
+//---------------------------------------------------------------------
+
+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) {
+
+      // 1 - 9
+
+      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) {
+
+      // 10 - 26
+
+      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) {
+
+      // 27 - 40
+
+      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;
+
+    // LEVEL1
+
+    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);
+        }
+      }
+    }
+
+    // LEVEL2
+
+    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;
+        }
+      }
+    }
+
+    // LEVEL3
+
+    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;
+        }
+      }
+    }
+
+    // LEVEL4
+
+    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;
+  }
+
+};
+
+
+//---------------------------------------------------------------------
+// QRMath
+//---------------------------------------------------------------------
+
+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;
+}
+
+//---------------------------------------------------------------------
+// QRPolynomial
+//---------------------------------------------------------------------
+
+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);
+    }
+
+    // recursive call
+    return new QRPolynomial(num, 0).mod(e);
+  }
+};
+
+//---------------------------------------------------------------------
+// QRRSBlock
+//---------------------------------------------------------------------
+
+function QRRSBlock(totalCount, dataCount) {
+  this.totalCount = totalCount;
+  this.dataCount = dataCount;
+}
+
+QRRSBlock.RS_BLOCK_TABLE = [
+
+  // L
+  // M
+  // Q
+  // H
+
+  // 1
+  [1, 26, 19],
+  [1, 26, 16],
+  [1, 26, 13],
+  [1, 26, 9],
+
+  // 2
+  [1, 44, 34],
+  [1, 44, 28],
+  [1, 44, 22],
+  [1, 44, 16],
+
+  // 3
+  [1, 70, 55],
+  [1, 70, 44],
+  [2, 35, 17],
+  [2, 35, 13],
+
+  // 4		
+  [1, 100, 80],
+  [2, 50, 32],
+  [2, 50, 24],
+  [4, 25, 9],
+
+  // 5
+  [1, 134, 108],
+  [2, 67, 43],
+  [2, 33, 15, 2, 34, 16],
+  [2, 33, 11, 2, 34, 12],
+
+  // 6
+  [2, 86, 68],
+  [4, 43, 27],
+  [4, 43, 19],
+  [4, 43, 15],
+
+  // 7		
+  [2, 98, 78],
+  [4, 49, 31],
+  [2, 32, 14, 4, 33, 15],
+  [4, 39, 13, 1, 40, 14],
+
+  // 8
+  [2, 121, 97],
+  [2, 60, 38, 2, 61, 39],
+  [4, 40, 18, 2, 41, 19],
+  [4, 40, 14, 2, 41, 15],
+
+  // 9
+  [2, 146, 116],
+  [3, 58, 36, 2, 59, 37],
+  [4, 36, 16, 4, 37, 17],
+  [4, 36, 12, 4, 37, 13],
+
+  // 10		
+  [2, 86, 68, 2, 87, 69],
+  [4, 69, 43, 1, 70, 44],
+  [6, 43, 19, 2, 44, 20],
+  [6, 43, 15, 2, 44, 16],
+
+  // 11
+  [4, 101, 81],
+  [1, 80, 50, 4, 81, 51],
+  [4, 50, 22, 4, 51, 23],
+  [3, 36, 12, 8, 37, 13],
+
+  // 12
+  [2, 116, 92, 2, 117, 93],
+  [6, 58, 36, 2, 59, 37],
+  [4, 46, 20, 6, 47, 21],
+  [7, 42, 14, 4, 43, 15],
+
+  // 13
+  [4, 133, 107],
+  [8, 59, 37, 1, 60, 38],
+  [8, 44, 20, 4, 45, 21],
+  [12, 33, 11, 4, 34, 12],
+
+  // 14
+  [3, 145, 115, 1, 146, 116],
+  [4, 64, 40, 5, 65, 41],
+  [11, 36, 16, 5, 37, 17],
+  [11, 36, 12, 5, 37, 13],
+
+  // 15
+  [5, 109, 87, 1, 110, 88],
+  [5, 65, 41, 5, 66, 42],
+  [5, 54, 24, 7, 55, 25],
+  [11, 36, 12],
+
+  // 16
+  [5, 122, 98, 1, 123, 99],
+  [7, 73, 45, 3, 74, 46],
+  [15, 43, 19, 2, 44, 20],
+  [3, 45, 15, 13, 46, 16],
+
+  // 17
+  [1, 135, 107, 5, 136, 108],
+  [10, 74, 46, 1, 75, 47],
+  [1, 50, 22, 15, 51, 23],
+  [2, 42, 14, 17, 43, 15],
+
+  // 18
+  [5, 150, 120, 1, 151, 121],
+  [9, 69, 43, 4, 70, 44],
+  [17, 50, 22, 1, 51, 23],
+  [2, 42, 14, 19, 43, 15],
+
+  // 19
+  [3, 141, 113, 4, 142, 114],
+  [3, 70, 44, 11, 71, 45],
+  [17, 47, 21, 4, 48, 22],
+  [9, 39, 13, 16, 40, 14],
+
+  // 20
+  [3, 135, 107, 5, 136, 108],
+  [3, 67, 41, 13, 68, 42],
+  [15, 54, 24, 5, 55, 25],
+  [15, 43, 15, 10, 44, 16],
+
+  // 21
+  [4, 144, 116, 4, 145, 117],
+  [17, 68, 42],
+  [17, 50, 22, 6, 51, 23],
+  [19, 46, 16, 6, 47, 17],
+
+  // 22
+  [2, 139, 111, 7, 140, 112],
+  [17, 74, 46],
+  [7, 54, 24, 16, 55, 25],
+  [34, 37, 13],
+
+  // 23
+  [4, 151, 121, 5, 152, 122],
+  [4, 75, 47, 14, 76, 48],
+  [11, 54, 24, 14, 55, 25],
+  [16, 45, 15, 14, 46, 16],
+
+  // 24
+  [6, 147, 117, 4, 148, 118],
+  [6, 73, 45, 14, 74, 46],
+  [11, 54, 24, 16, 55, 25],
+  [30, 46, 16, 2, 47, 17],
+
+  // 25
+  [8, 132, 106, 4, 133, 107],
+  [8, 75, 47, 13, 76, 48],
+  [7, 54, 24, 22, 55, 25],
+  [22, 45, 15, 13, 46, 16],
+
+  // 26
+  [10, 142, 114, 2, 143, 115],
+  [19, 74, 46, 4, 75, 47],
+  [28, 50, 22, 6, 51, 23],
+  [33, 46, 16, 4, 47, 17],
+
+  // 27
+  [8, 152, 122, 4, 153, 123],
+  [22, 73, 45, 3, 74, 46],
+  [8, 53, 23, 26, 54, 24],
+  [12, 45, 15, 28, 46, 16],
+
+  // 28
+  [3, 147, 117, 10, 148, 118],
+  [3, 73, 45, 23, 74, 46],
+  [4, 54, 24, 31, 55, 25],
+  [11, 45, 15, 31, 46, 16],
+
+  // 29
+  [7, 146, 116, 7, 147, 117],
+  [21, 73, 45, 7, 74, 46],
+  [1, 53, 23, 37, 54, 24],
+  [19, 45, 15, 26, 46, 16],
+
+  // 30
+  [5, 145, 115, 10, 146, 116],
+  [19, 75, 47, 10, 76, 48],
+  [15, 54, 24, 25, 55, 25],
+  [23, 45, 15, 25, 46, 16],
+
+  // 31
+  [13, 145, 115, 3, 146, 116],
+  [2, 74, 46, 29, 75, 47],
+  [42, 54, 24, 1, 55, 25],
+  [23, 45, 15, 28, 46, 16],
+
+  // 32
+  [17, 145, 115],
+  [10, 74, 46, 23, 75, 47],
+  [10, 54, 24, 35, 55, 25],
+  [19, 45, 15, 35, 46, 16],
+
+  // 33
+  [17, 145, 115, 1, 146, 116],
+  [14, 74, 46, 21, 75, 47],
+  [29, 54, 24, 19, 55, 25],
+  [11, 45, 15, 46, 46, 16],
+
+  // 34
+  [13, 145, 115, 6, 146, 116],
+  [14, 74, 46, 23, 75, 47],
+  [44, 54, 24, 7, 55, 25],
+  [59, 46, 16, 1, 47, 17],
+
+  // 35
+  [12, 151, 121, 7, 152, 122],
+  [12, 75, 47, 26, 76, 48],
+  [39, 54, 24, 14, 55, 25],
+  [22, 45, 15, 41, 46, 16],
+
+  // 36
+  [6, 151, 121, 14, 152, 122],
+  [6, 75, 47, 34, 76, 48],
+  [46, 54, 24, 10, 55, 25],
+  [2, 45, 15, 64, 46, 16],
+
+  // 37
+  [17, 152, 122, 4, 153, 123],
+  [29, 74, 46, 14, 75, 47],
+  [49, 54, 24, 10, 55, 25],
+  [24, 45, 15, 46, 46, 16],
+
+  // 38
+  [4, 152, 122, 18, 153, 123],
+  [13, 74, 46, 32, 75, 47],
+  [48, 54, 24, 14, 55, 25],
+  [42, 45, 15, 32, 46, 16],
+
+  // 39
+  [20, 147, 117, 4, 148, 118],
+  [40, 75, 47, 7, 76, 48],
+  [43, 54, 24, 22, 55, 25],
+  [10, 45, 15, 67, 46, 16],
+
+  // 40
+  [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 = new Array();
+
+  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;
+  }
+}
+
+//---------------------------------------------------------------------
+// QRBitBuffer
+//---------------------------------------------------------------------
+
+function QRBitBuffer() {
+  this.buffer = new Array();
+  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++;
+  }
+};
+
+QRCode.errorCorrectLevel = QRErrorCorrectLevel;
+export default QRCode;

+ 2 - 1
components/request.js

@@ -2,7 +2,8 @@
 
 export default {
 	config: {
-		baseUrl: "http://192.168.31.155:8200",	//本地开发
+		baseUrl: "http://localhost:8200",	//本地开发
+		// baseUrl: "http://172.27.185.236:8200",	//本地开发	
 		// baseUrl: "https://talent.younggee.com:8201",  //默认的公共域名
 		},
 	// 获取用户 token

+ 2 - 1
components/requesttoken111.js

@@ -2,7 +2,8 @@
 //通用uni-app网络请求
 export default {
 	config: {
-		baseUrl: "http://192.168.31.155:8200",	//本地开发
+		baseUrl: "http://localhost:8200",	//本地开发
+		// baseUrl: "http://172.27.185.236:8200",	//本地开发		
 		// baseUrl: "https://talent.younggee.com:8201",  //默认的公共域名
 		  
 		header: {

+ 79 - 0
components/utils.js

@@ -0,0 +1,79 @@
+function getRouter() {
+	let pages = getCurrentPages(); //获取加载的页面
+	let currentPage = pages[pages.length - 1]; //获取当前页面的对象
+	let url = currentPage.route; //当前页面url
+	uni.setStorageSync('url', `${url}`)
+	let options = currentPage.options;
+	console.log("url: " + url);
+	console.log("options: " + options);
+	if (options) {
+		let urlParams = url + '?'
+		for (let key in options) {
+			let value = options[key]
+			urlParams += key + '=' + value + '&'
+		}
+		urlParams = urlParams.substring(0, urlParams.length - 1); //去掉末尾的&
+		uni.setStorageSync('url', `${urlParams}`)
+	}
+}
+//解析链接
+function getQueryString(url, name) {
+	// console.log("url = " + url);
+	// console.log("name = " + name);
+	var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i');
+	var r = url.substr(1).match(reg);
+	if (r != null) {
+		// console.log("r = " + r)
+		// console.log("r[2] = " + r[2])
+		return r[2];
+	}
+	return null;
+}
+
+// 
+function money (value) {
+  if (typeof value !== 'string') {
+    value = String(value)
+  }
+  if (!value) return '0.00'
+  const intPart = Number(value).toFixed(0) // 获取整数部分
+  const intPartFormat = intPart
+    .toString()
+    .replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断
+  let floatPart = '.00' // 预定义小数部分
+  const value2Array = value.split('.')
+  // =2表示数据有小数位
+  if (value2Array.length === 2) {
+    floatPart = value2Array[1].toString() // 拿到小数部分
+    if (floatPart.length === 1) {
+      // 补0,
+      return intPartFormat + '.' + floatPart + '0'
+    } else {
+      return intPartFormat + '.' + floatPart
+    }
+  } else {
+    return intPartFormat + floatPart
+  }
+}
+
+function fansview(num) {
+  num = parseInt(num)
+  if (num >= 10000) {
+    var t1 = num / 10000
+    var t2 = num % 10000
+    if (t2 !== 0) {
+      // return String(t1).match(/^\d+(?:\.\d{1,2})?/) + "万"
+      return String(t1).substring(0, String(t1).indexOf('.') + 2) + '万'
+    } else return String(t1) + '.0万'
+  } else {
+    num = String(num)
+  }
+  return num
+}
+
+module.exports = {
+	getRouter,
+	getQueryString,
+	money,
+	fansview,
+}

+ 133 - 126
manifest.json

@@ -1,128 +1,135 @@
 {
-    "name" : "样叽v2.1",
-    "appid" : "__UNI__B083F58",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    // "h5" : {
-    //         "devServer" : {
-    //             "proxy" : {
-    //                 "/api" : {
-    //                     "target" : "http://localhost:8888/uni_web",
-    //                     "changeOrigin" : true,
-    //                     "secure" : false,
-    //                     "pathRewrite" : {
-    //                         "^/api" : "http://192.168.0.107:8199" // 设置/api路径重定向,重点!!!
-    //                     }
-    //                 }
-    //             }
-    //         }
-    //     },
-    "app-plus" : {
-        "compatible" : {
-            "ignoreVersion" : true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持  
-        },
-        /* 5+App特有相关 */
-        "usingComponents" : true,
-        "nvueCompiler" : "uni-app",
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        "modules" : {
-            "VideoPlayer" : {}
-        },
-        /* 模块配置 */
-        "distribute" : {
-            /* 应用发布信息 */
-            "android" : {
-                /* android打包配置 */
-                "permissions" : [
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            "ios" : {},
-            /* ios打包配置 */
-            "sdkConfigs" : {
-                "ad" : {},
-                "push" : {},
-                "payment" : {
-                    "weixin" : {
-                        "__platform__" : [ "ios", "android" ],
-                        "appid" : "wxac396a3be7a16844",
-                        "UniversalLinks" : ""
-                    }
-                },
-                "share" : {
-                    "weixin" : {
-                        "appid" : "wxac396a3be7a16844",
-                        "UniversalLinks" : ""
-                    }
-                }
-            },
-            "icons" : {
-                "android" : {
-                    "hdpi" : "unpackage/res/icons/72x72.png",
-                    "xhdpi" : "unpackage/res/icons/96x96.png",
-                    "xxhdpi" : "unpackage/res/icons/144x144.png",
-                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
-                },
-                "ios" : {
-                    "appstore" : "unpackage/res/icons/1024x1024.png",
-                    "ipad" : {
-                        "app" : "unpackage/res/icons/76x76.png",
-                        "app@2x" : "unpackage/res/icons/152x152.png",
-                        "notification" : "unpackage/res/icons/20x20.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "proapp@2x" : "unpackage/res/icons/167x167.png",
-                        "settings" : "unpackage/res/icons/29x29.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "spotlight" : "unpackage/res/icons/40x40.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
-                    },
-                    "iphone" : {
-                        "app@2x" : "unpackage/res/icons/120x120.png",
-                        "app@3x" : "unpackage/res/icons/180x180.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "notification@3x" : "unpackage/res/icons/60x60.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "settings@3x" : "unpackage/res/icons/87x87.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
-                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
-                    }
-                }
-            }
-        }
-    },
-    /* SDK配置 */
-    "quickapp" : {},
-    /* 快应用特有相关 */
-    "mp-weixin" : {
-        "appid" : "wxbbcd7973dc77b197",
-        "setting" : {
-            "urlCheck" : false,
-            "postcss" : true,
-            "minified" : false,
-            "es6" : false
-        },
-        "usingComponents" : true
-    }
+	"name": "样叽v2.1",
+	"appid": "__UNI__8C01D7C",
+	"description": "",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	// "h5" : {
+	//         "devServer" : {
+	//             "proxy" : {
+	//                 "/api" : {
+	//                     "target" : "http://localhost:8888/uni_web",
+	//                     "changeOrigin" : true,
+	//                     "secure" : false,
+	//                     "pathRewrite" : {
+	//                         "^/api" : "http://192.168.0.107:8199" // 设置/api路径重定向,重点!!!
+	//                     }
+	//                 }
+	//             }
+	//         }
+	//     },
+	"app-plus": {
+		"compatible": {
+			"ignoreVersion": true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持  
+		},
+		/* 5+App特有相关 */
+		"usingComponents": true,
+		"nvueCompiler": "uni-app",
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		"modules": {
+			"VideoPlayer": {}
+		},
+		/* 模块配置 */
+		"distribute": {
+			/* 应用发布信息 */
+			"android": {
+				/* android打包配置 */
+				"permissions": [
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+				]
+			},
+			"ios": {},
+			/* ios打包配置 */
+			"sdkConfigs": {
+				"ad": {},
+				"push": {},
+				"payment": {
+					"weixin": {
+						"__platform__": ["ios", "android"],
+						"appid": "wxac396a3be7a16844",
+						"UniversalLinks": ""
+					}
+				},
+				"share": {
+					"weixin": {
+						"appid": "wxac396a3be7a16844",
+						"UniversalLinks": ""
+					}
+				}
+			},
+			"icons": {
+				"android": {
+					"hdpi": "unpackage/res/icons/72x72.png",
+					"xhdpi": "unpackage/res/icons/96x96.png",
+					"xxhdpi": "unpackage/res/icons/144x144.png",
+					"xxxhdpi": "unpackage/res/icons/192x192.png"
+				},
+				"ios": {
+					"appstore": "unpackage/res/icons/1024x1024.png",
+					"ipad": {
+						"app": "unpackage/res/icons/76x76.png",
+						"app@2x": "unpackage/res/icons/152x152.png",
+						"notification": "unpackage/res/icons/20x20.png",
+						"notification@2x": "unpackage/res/icons/40x40.png",
+						"proapp@2x": "unpackage/res/icons/167x167.png",
+						"settings": "unpackage/res/icons/29x29.png",
+						"settings@2x": "unpackage/res/icons/58x58.png",
+						"spotlight": "unpackage/res/icons/40x40.png",
+						"spotlight@2x": "unpackage/res/icons/80x80.png"
+					},
+					"iphone": {
+						"app@2x": "unpackage/res/icons/120x120.png",
+						"app@3x": "unpackage/res/icons/180x180.png",
+						"notification@2x": "unpackage/res/icons/40x40.png",
+						"notification@3x": "unpackage/res/icons/60x60.png",
+						"settings@2x": "unpackage/res/icons/58x58.png",
+						"settings@3x": "unpackage/res/icons/87x87.png",
+						"spotlight@2x": "unpackage/res/icons/80x80.png",
+						"spotlight@3x": "unpackage/res/icons/120x120.png"
+					}
+				}
+			}
+		}
+	},
+	/* SDK配置 */
+	"quickapp": {},
+	/* 快应用特有相关 */
+	"mp-weixin": {
+		"appid": "wxac396a3be7a16844",
+		"setting": {
+			"urlCheck": false,
+			"postcss": true,
+			"minified": true,
+			"es6": false
+		},
+		"usingComponents": true,
+		"permission": {},
+		"requiredPrivateInfos": [
+			"getLocation",
+			"onLocationChange",
+			"startLocationUpdateBackground",
+			"chooseAddress"
+		]
+	}
 }

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

@@ -0,0 +1,12 @@
+{
+  "name": "youngee_c_web_v2",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "node_modules/uqrcodejs": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/uqrcodejs/-/uqrcodejs-3.6.0.tgz",
+      "integrity": "sha512-TsWg8spym1bjLifmnsYjkib98h4Dw/gS8N0Sygc9Uvg7jX3ySJMDW3wya/DexCaS+8ZbWATj1YXPuYJ5Aej9Eg=="
+    }
+  }
+}

+ 201 - 0
node_modules/uqrcodejs/license.md

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 27 - 0
node_modules/uqrcodejs/package.json

@@ -0,0 +1,27 @@
+{
+  "name": "uqrcodejs",
+  "version": "3.6.0",
+  "description": "uQRCode是一款基于Javascript环境开发的二维码生成插件,适用所有Javascript运行环境的前端应用和Node.js。",
+  "main": "uqrcode.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Sansnn/uQRCode.git"
+  },
+  "keywords": [
+    "uQRCode",
+    "QR",
+    "QRCode",
+    "artQRCode",
+    "二维码",
+    "艺术码"
+  ],
+  "author": "Sansnn",
+  "license": "Apache-2.0",
+  "bugs": {
+    "url": "https://github.com/Sansnn/uQRCode/issues"
+  },
+  "homepage": "https://github.com/Sansnn/uQRCode#readme"
+}

File diff ditekan karena terlalu besar
+ 135 - 0
node_modules/uqrcodejs/readme.md


File diff ditekan karena terlalu besar
+ 36 - 0
node_modules/uqrcodejs/uqrcode.js


+ 22 - 1
package-lock.json

@@ -1,3 +1,24 @@
 {
-  "lockfileVersion": 1
+  "name": "youngee_c_web_v2",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "uqrcodejs": "^3.6.0"
+      }
+    },
+    "node_modules/uqrcodejs": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/uqrcodejs/-/uqrcodejs-3.6.0.tgz",
+      "integrity": "sha512-TsWg8spym1bjLifmnsYjkib98h4Dw/gS8N0Sygc9Uvg7jX3ySJMDW3wya/DexCaS+8ZbWATj1YXPuYJ5Aej9Eg=="
+    }
+  },
+  "dependencies": {
+    "uqrcodejs": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/uqrcodejs/-/uqrcodejs-3.6.0.tgz",
+      "integrity": "sha512-TsWg8spym1bjLifmnsYjkib98h4Dw/gS8N0Sygc9Uvg7jX3ySJMDW3wya/DexCaS+8ZbWATj1YXPuYJ5Aej9Eg=="
+    }
+  }
 }

+ 5 - 0
package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "uqrcodejs": "^3.6.0"
+  }
+}

+ 109 - 29
pages.json

@@ -93,23 +93,46 @@
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
 			}
+		}, {
+			"path": "pages/tasksquare/guide",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/tasksquare/cooperation",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
 
 		}, {
-			"path": "pages/test/test",
+			"path": "pages/tasksquare/information",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
 			}
+
 		}, {
-			"path": "pages/tasksquare/guide",
+			"path": "pages/tasksquare/success",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
 			}
+
 		}, {
-			"path": "pages/tasksquare/cooperation",
+			"path": "pages/mycenter/mytask/mytask",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/workspace/taskdetail",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -117,7 +140,7 @@
 			}
 
 		}, {
-			"path": "pages/tasksquare/information",
+			"path": "pages/workspace/applyInformation",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -125,7 +148,7 @@
 			}
 
 		}, {
-			"path": "pages/tasksquare/success",
+			"path": "pages/workspace/deliveryInformation",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -133,7 +156,7 @@
 			}
 
 		}, {
-			"path": "pages/mycenter/mytask/mytask",
+			"path": "pages/workspace/uploadscript",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -141,7 +164,7 @@
 			}
 
 		}, {
-			"path": "pages/mycenter/mytask/executetask",
+			"path": "pages/workspace/scriptrecord",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -149,7 +172,7 @@
 			}
 
 		}, {
-			"path": "pages/mycenter/mytask/endtask",
+			"path": "pages/workspace/uploadsketch",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -157,7 +180,42 @@
 			}
 
 		}, {
-			"path": "pages/mycenter/mytask/applytask",
+			"path": "pages/workspace/sketchrecord",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/workspace/uploadlink",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/workspace/linkrecord",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/workspace/uploaddata",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/workspace/datarecord",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/mycenter/myincome",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
@@ -165,50 +223,72 @@
 			}
 
 		}, {
-			"path": "pages/workspace/taskdetail",
+			"path": "pages/mycenter/myincome/applywithdraw",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
 			}
 
-		}
-	    ,{
-            "path" : "pages/workspace/applyInformation",
+		}, {
+			"path": "pages/mycenter/message",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
-            }
-            
-        }
-        ,{
-            "path" : "pages/workspace/deliveryInformation",
-            "style" :                                                                                    
-            {
+			}
+		}, {
+			"path": "pages/tasksquare/specialTask/specialTaskDetail",
+			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
-            }
-            
-        }
-        ,{
-            "path" : "pages/workspace/uploadscript",
+			}
+		}, {
+			"path": "pages/tasksquare/specialTask/information",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/mycenter/myinformation/myinformation",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+
+		}, {
+			"path": "pages/mycenter/myinformation/myzhifubao",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}, {
+			"path": "pages/test/test",
+			"style": {
+				"navigationBarTitleText": "YoungGee",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "black"
+			}
+		}
+	    ,{
+            "path" : "pages/tasksquare/search",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
 			}
-            
         }
         ,{
-            "path" : "pages/workspace/scriptrecord",
+            "path" : "pages/workspace/editaddress",
 			"style": {
 				"navigationBarTitleText": "YoungGee",
 				"navigationStyle": "custom",
 				"navigationBarTextStyle": "black"
-			}
-            
+			}            
         }
     ],
 	"globalStyle": {

+ 576 - 87
pages/login/login.vue

@@ -1,70 +1,524 @@
 <template>
-		<view class="container">
-			<view class="head">
-				<view class="head-image">
-					<image :src="defaultavatarUrl" mode="" style="border-radius: 50%; width: 100%;height: 100%;">
-					</image>
-				</view>
-				<view class="head-text">
-					<p style="font-weight:bold;font-size: 35rpx;padding-bottom: 20rpx;">样叽</p>
-					<p style="font-weight:bold;font-size: 35rpx;">YounGee</p>
-				</view>
+	<view class="container">
+		<view class="head">
+			<view class="head-image">
+				<image :src="defaultavatarUrl" mode="" style="width: 100%;height: 100%;">
+				</image>
 			</view>
-			<view class="body">
-				<button class="login-btn" @click="toggle('bottom')">微信授权</button>
-				<button class="exit-btn" @click="exit()">取消登录</button>
-				<view class="xieyi">
-					<uni-data-checkbox multiple class="xieyi-btn" v-model="value" :localdata="range" @change="select">
-					</uni-data-checkbox>
-					<p class="xieyi-read">阅读并同意</p>
-					<a class="xieyi-content" src="">《用户协议及隐私政策》</a>
-				</view>
+			<view class="head-text">
+				<p style="font-weight:bold;font-size: 35rpx;padding-bottom: 20rpx;">样叽</p>
+				<p style="font-weight:bold;font-size: 35rpx;">YOUNGGEE</p>
 			</view>
-			<view>
-				<!-- 底部普通弹窗 -->
-				<uni-popup ref="popup" background-color="#fff" @change="change" style="border-radius: 20rpx;">
-					<view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }"
-						style="    ">
-						<view class=""
-							style="width: 90%; margin: 0 auto; margin-top: 10% !important;margin-bottom: 10% !important;">
-							<view class="Tasktext">
-								<image :src="picture.task15" mode=""></image>
-								<span>YoungGee申请使用</span>
-							</view>
-							<view class="">
-								<h5>你的微信头像、昵称、地区及性别信息</h5>
-							</view>
-							<!-- 黑线 -->
-							<view class="" style="border-bottom: 2rpx solid #C0C0C0;margin-top: 3%;margin-bottom: 3%;">
-							</view>
-							<view class="" style="display: flex;justify-content:space-around;">
-
-								<image :src="picture.jpg7" mode=""
-									style="width: 84rpx;height: 84rpx;border-radius: 10rpx;">
-								</image>
-								<view class="" style="width: 70%;">
-									<p style='color: #000000; font-size: 28rpx;'>昵称</p>
-									<p style='color: #999999; font-size: 24rpx;margin-top: 2%;'>微信个人信息</p>
-								</view>
-								<view class="" style="margin-top: 3%;">
-									<image :src="picture.png6" mode="" style="width: 32rpx;height: 22rpx;"></image>
-								</view>
-							</view>
+		</view>
+		<view class="body">
+			<button class="login-btn" @click="toggle('bottom')">微信授权</button>
+			<button class="exit-btn" @click="exit()">取消登录</button>
+			<view class="xieyi">
+				<uni-data-checkbox multiple class="xieyi-btn" v-model="value" :localdata="range" @change="select">
+				</uni-data-checkbox>
+				<p class="xieyi-read">阅读并同意</p>
+				<p class="xieyi-content"><span style="color: #63779b;" @click="showXieyi()">《用户协议》</span>及<span
+						style="color: #63779b;" @click="showYinsi()">《隐私政策》</span></p>
+			</view>
+		</view>
 
-							<!-- 黑线 -->
-							<view class="" style="border-bottom: 2rpx solid #C0C0C0;margin-top: 3%;margin-bottom: 3%;">
+		<view>
+			<!-- 底部普通弹窗 -->
+			<uni-popup ref="popup" background-color="#fff" @change="change" style="border-radius: 20rpx;">
+				<view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }"
+					style="    ">
+					<view class=""
+						style="width: 90%; margin: 0 auto; margin-top: 10% !important;margin-bottom: 10% !important;">
+						<view class="Tasktext">
+							<image :src="picture.task15" mode=""></image>
+							<span>YoungGee申请使用</span>
+						</view>
+						<view class="">
+							<h5>你的微信头像、昵称、地区及性别信息</h5>
+						</view>
+						<!-- 黑线 -->
+						<view class="" style="border-bottom: 2rpx solid #C0C0C0;margin-top: 3%;margin-bottom: 3%;">
+						</view>
+						<view class="" style="display: flex;justify-content:space-around;">
+
+							<image :src="picture.jpg7" mode="" style="width: 84rpx;height: 84rpx;border-radius: 10rpx;">
+							</image>
+							<view class="" style="width: 70%;">
+								<p style='color: #000000; font-size: 28rpx;'>昵称</p>
+								<p style='color: #999999; font-size: 24rpx;margin-top: 2%;'>微信个人信息</p>
 							</view>
-							<view class="butto" style="margin-top: 3%;">
-								<button class="mini-btn" size="mini" @tap="Reset"
-									style="background-color: #F2F2F2;color:#20AC19 ; margin-right: 5%;">拒绝</button>
-								<button class="mini-btn" size="mini" @tap="determine"
-									style="background-color: #20AC19;color:#F2F2F2 ;margin-left: 5%;">允许</button>
+							<view class="" style="margin-top: 3%;">
+								<image :src="picture.png6" mode="" style="width: 32rpx;height: 22rpx;"></image>
 							</view>
 						</view>
+
+						<!-- 黑线 -->
+						<view class="" style="border-bottom: 2rpx solid #C0C0C0;margin-top: 3%;margin-bottom: 3%;">
+						</view>
+						<view class="butto" style="margin-top: 3%;">
+							<button class="mini-btn" size="mini" @tap="Reset"
+								style="background-color: #F2F2F2;color:#20AC19 ; margin-right: 5%;">拒绝</button>
+							<button class="mini-btn" size="mini" @tap="determine"
+								style="background-color: #20AC19;color:#F2F2F2 ;margin-left: 5%;">允许</button>
+						</view>
 					</view>
-				</uni-popup>
-			</view>
+				</view>
+			</uni-popup>
 		</view>
+
+		<view>
+			<!-- 底部普通弹窗 -->
+			<uni-popup ref="popup3" background-color="#fff" @change="change" style="border-radius: 20rpx;">
+				<view class="popup-content1" :class="{ 'popup-height': type === 'left' || type === 'right' }">
+					<view style="display: flex; justify-content: space-around; margin-top: 10% ;margin-bottom: 10% ;">
+						<scroll-view scroll-y="true" style="height:350px;padding: 0 20rpx;">
+							<view class="title">样叽平台服务协议</view>
+							<text style="padding-bottom: 50rpx;">
+								<text class="point">更新时间:2022年11月19日\n</text>
+								<text class="point">生效时间:2022年11月26日\n</text>
+								尊敬的用户,欢迎您使用样叽平台及相关服务。
+								为更好地为您提供服务,请您在访问和使用样叽平台及相关服务前,务必仔细阅读并充分理解本协议条款,特别是涉及免除或者限制责任的条款、权利许可和信息使用的条款、法律适用和争议解决条款等。<text
+									class="point">其中,免除或者限制责任条款等重要内容将以加粗形式提示您注意,您应重点阅读。</text>
+								<text
+									class="point">\n除非您完全接受本协议的全部内容,否则您无权注册、登录样叽平台,或者通过任何方式使用样叽平台,或者获得样叽平台提供的任何服务(以下统称“使用”)。一旦您使用样叽平台及相关服务,即视为您已充分理解本协议,并同意作为本协议的一方当事人接受本协议以及其他与样叽平台及相关服务相关的协议和规则的约束。届时您无权以未阅读本协议的内容或者未获得服务方对您问询的回复、解答、处理等理由,主张本协议无效和/或要求撤销本协议。\n</text>
+								<text class="point">\n一、适用范围及定义\n\n</text>
+								1.本协议是您与北京火乐星球科技有限公司(以下简称“公司”)之间就您注册、登录、使用样叽平台,并获得样叽平台提供的相关服务,所订立的协议。<text
+									class="point">公司有权依样叽平台及相关服务或运营的需要单方决定,安排或指定其关联方、控制公司、继承公司或公司认可的第三方公司继续运营样叽平台。并且,就本协议项下涉及的某些服务,可能由公司的关联公司、控制公司向您提供,您知晓并同意接受上述服务内容,即视为接受双方之间的相关权利义务关系亦受本协议约束。\n</text>
+								2.“样叽平台”:在本协议中也称为“平台”,指公司或其关联公司所运营的包含域名为www.younggee.com的网络平台、标注名称为“样叽企业版”的APP/小程序(以下统称“企业端”)与标注名称为“样叽”的APP/小程序(以下统称“创作者端”),专注于为用户提供图文与视频上传、素材制作、流程执行管理或其他内容服务任务(简称“任务”或“任务需求”或“任务内容”)交易相关的管理及技术服务。公司有权对前述网站平台与应用程序单方变更(包括但不限于更名、新增等)。
+								3.“样叽服务”:指公司为用户提供的,可通过技术手段实现任务交易及管理的一种有偿服务,不同类型的任务交易具体要求、流程及方式,将在本协议相关条款或平台规则中进行规定,用户应予遵守。
+								4.“用户”:指根据样叽平台相关规则与本协议,完成注册或完成平台认证和验证后使用样叽平台及相关服务的自然人、法人和其他组织等。使用“企业端”的用户在本协议中称为“客户”;使用“创作者端”的用户在本协议中称为“创作者”。
+								5.“客户”:指通过“企业端”发布与管理任务,通过“创作者”完成的服务推广其产品或服务的实际需求者,包含客户、客户委托的个人与代理公司。
+								6.“创作者”:指通过“创作者端”按照任务要求进行任务报名、任务分享、任务执行等行为且在社交媒体上拥有自己账号的用户。
+								7.“服务费用”:指客户针对各任务所应支付的相关费用(包括任务服务费、平台服务费等)。一般情况下,“服务费用”采用预充值的形式,当达到本协议或平台规则约定的情况时,公司将在客户预付费用中扣除相应的费用,并依据本协议约定与创作者进行具体任务服务费用结算;特殊情况下,“服务费用”结算方式可由客户与公司另行约定;其中“任务服务费”是指,客户通过平台与创作者针对各任务达成的交易金额(若在实际执行过程中出现变更,应按照平台规则显示的实际执行的金额为准)。
+								8.“合作期限”:自您点击同意本协议之日起长期有效(但本协议其它条款另有约定的,其它条款的有效期从其约定),样叽平台有权提前解除或终止本协议且无需承担任何违约责任,如提前终止或解除本协议的,应当结清债权债务关系;若您创作者,无论因任何原因导致本协议终止的,您应履行完毕已经接受的任务,平台将按照您实际履行的情况与您完成结算,如因您拒绝、迟延履行已接订单导致平台或第三方损失的,您应当承担全部赔偿责任,平台还有权从未结算费用中扣除相应损失。
+								<text
+									class="point">\n9.本协议内容同时包含公司已经发布及后续可能不断发布、更新的关于平台及相关服务和任务的协议、规则等内容。前述内容自公告、通知之日或公告、通知载明之日起生效,并成为本协议不可分割的组成部分,您在前述内容生效之后,仍继续使用样叽平台的,则视为您接受和自愿遵守前述内容。\n</text>
+								<text class="point">\n二、关于账号\n\n</text>
+								1.平台为您提供手机号码注册通道,您的手机号码是您用以登录平台并以您的身份使用平台及相关服务的凭证。
+								<text
+									class="point">\n2.您理解并承诺,您所设置的账号不得违反国家法律法规及公司的相关规则,您的账号名称等注册信息及其他信息中不得出现违法信息及不良信息,未经他人许可不得使用他人名义(包括但不限于冒用他人姓名、名称、字号等足以让人引起混淆的方式)开设账号,不得恶意注册平台账号(包括但不限于频繁注册、批量注册账号等行为)。您在账号注册及使用过程中需遵守相关法律法规,不得实施任何侵害国家利益、损害第三方合法权益、有害社会道德风尚的行为。</text>
+								<text
+									class="point">\n3.您在平台注册的账号所有权及有关权益归公司所有,您完成注册流程后仅享有该账号的使用权。您在平台中的注册账号仅限您使用,未经公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他方式许可第三方使用您的账号。若公司发现或者有合理理由认为使用者并非账号所有人或有权使用者,为保障账号安全,公司有权在未通知您的情况下,暂停或终止向该账号提供服务,并注销该账号,而无需向注册该账号的用户承担法律责任。\n</text>
+								4.平台在此特别提示您:为了保障您的账户的安全性,您有责任妥善保管并维护您账号的安全性与保密性。若发现他人未经许可使用您的账号或发生其他任何安全漏洞问题时,您应当立即通知公司。您须对以所注册账号名义所从事的一切活动承担全部法律责任,包括但不限于您在平台上进行的任何信息和任务发布、修改、报价、承接任务订单、充值、付款、提现等操作行为可能引起的一切法律责任。
+								5.您的账号在丢失或遗忘密码后,可遵照公司的申诉途径及时申诉请求找回账号或密码。您应提供增加账号安全性的密码保护资料,并可以凭初始注册资料及密码保护资料填写申诉单向公司申请找回账号。您理解并认可,公司的密码找回机制仅需要识别申诉单上所填资料与系统记录资料具有一致性,而无法识别申诉人是否系账号真正的有权使用者。公司特别提醒您应妥善保管您的账号和密码。当您使用完毕后,应安全退出。因您保管不当可能导致遭受盗号或密码丢失,责任由您自行承担。
+								6.第三方账号授权登录:除自行注册平台帐号外,您也可选择通过授权使用您合法拥有或经过他人合法授权的包括但不限于公司和/或其关联方运营的其他平台下的用户帐号登录、注册并使用样叽平台及相关服务。当您以前述已有帐号登录使用的,应保证相应帐号已进行实名注册登记,您应遵守该平台自身的用户协议及其他协议条款的规定,并同样适用本协议中的相关条款。<text
+									class="point">如您以经他人合法授权的他人账号登录使用的,您应保证已获得全部合法授权,如因使用该他人账号授权登录平台或相关事宜发生争议的,您应当负责解决并保证平台免于承担任何赔偿责任。\n</text>
+								<text
+									class="point">7.在注册、使用和管理账号时,您应保证注册账号时填写信息的真实性、准确性。请您在注册、管理账号时使用真实、准确、合法、有效的相关资质证明材料及必要信息(包括电子邮件地址、联系电话、联系地址等)。公司有权对您提交的注册信息(包括但不限于资质文件等)进行审核。若您提交的材料或提供的信息不准确、不真实、不合法或者公司有理由怀疑为错误、不实或不合法的资料,公司有权不予审核通过。如您已在公司的关联公司所有或经授权合法运营的相关平台提供过相关资质文件,并经过验证(包括但不限于第三方对公验证等形式),您理解并同意,公司有权调取相关数据进行匹配。如未匹配一致,公司有权不予审核通过。\n</text>
+								<text class="point">\n三、样叽平台及相关服务\n\n</text>
+								1.平台提供包括任务发布和承接、任务管理、服务费用结算、提现等技术服务(以下统称“样叽服务”)。
+								2.您成功注册平台账号后,即可登录样叽平台。
+								(1)若您为客户,登录成功后,您可在平台发布任务并根据自身需求选择适合的创作者并在预付相应服务费用后开展合作。
+								(2)若您为创作者,登录成功后,您可在平台查看客户发布的视频拍摄、内容制作、网络直播等具体任务需求,并根据自身需求选择是否接受任务需求。
+								3.若您为客户,您与创作者达成合作意向后:
+								(1)您应按照平台的管理规定及流程要求及时与其沟通内容服务提供和标准等需求,并及时在平台对创作者在各阶段的服务成果进行验收。
+								(2)您为了任务(包括但不限于视频内容、素材内容、直播内容等)能达到更好的推广效果,您同意授权公司以使用您的名义对任务内容和服务成果进行传播或广告投放,且授权公司可以共享您入驻时的主体资质、经营许可资质、商标授权等资质材料,例如公司可将前述资质材料共享至广告投放平台,以便广告投放平台可进行广告投放资质的审核。<text
+									class="point">您知悉并确认,公司对任务内容进行传播或广告投放时,会根据法律法规、平台规则规范等要求调整任务内容,包括但不限于调整锚点组件、标识或标志。</text>您应为公司以您名义进行的传播或广告投放行为依法承担法律责任,包括但不限于:您应承担任务内容、资质材料等信息不合规导致公司遭受损失的赔偿责任。
+								4.若您为创作者,您与客户达成合作意向后,应按照平台的管理规定及流程要求及时查看任务详情、任务要求、任务执行时间等任务信息。并及时在平台对任务各阶段(待传脚本、待传初稿、待传链接、待传数据等)服务成果进行上传。
+								除任务要求或平台管理另有规定外:
+								(1)<text class="point">您同意,客户或平台有权将任务服务成果用于商业性或非商业性合理使用;\n</text>
+								(2)客户可按照您与客户达成的合作意向对工作成果进行使用。
+								<text
+									class="point">您与客户达成合作意向后,如您同时将委托或者安排第三方实际提供服务内容的,因前述第三方实际提供服务不符合客户任务要求或平台管理规定的或该第三方无法提供服务的,均由您按照本协议约定自行向客户和平台承担相应违约和赔偿责任。\n</text>
+								5.客户按照平台规则进行任务结案后,平台依据本协议、具体任务要求等与创作者进行服务费用结算。
+								6.若您为客户,您理解并同意:
+								(1)您应按照平台规则及流程进行任务发布、脚本与初稿的审核、链接与数据质检、结案等操作。您应对您的操作行为负责,不得以任何理由否认操作行为的效力。
+								(2)您发布任务后至结案前的任务执行阶段内,由于创作者违约(违约行为包括但不限于创作者未传或超时上传脚本/初稿/链接/数据、不执行任务要求等)或其他违规情况由此引起的该创作者无法履行现有任务的情况,不视为公司违约,公司无需进行任何赔偿。
+								(3)您与创作者对任务执行、费用支付等问题产生异议时,公司有权介入并按照公司已经发布及后续发布的平台规则等进行判定,您与创作者认可公司意见。<text
+									class="point">但您知悉并理解,您和创作者为在平台所达成任务中的交易双方,所有任务交易应由交易双方自行协商沟通达成并依约履行和承担,公司和平台均非交易一方。\n</text>
+								7.若您为创作者,您理解并同意:
+								(1)您应按照平台规则及流程进行任务需求承接、任务成功上传等操作。您应对您的操作行为负责,不得以任何理由否认操作行为的效力。您可通过平台与客户就任务执行等方面的问题进行商讨。但您不得就任务需求与客户进行私下交易。如您违反本条款约定,公司有权将您列入不良记录名单,终止与您的服务协议,并保留追究您法律责任的权利。
+								(2)您与客户服务执行、费用支付、知识产权授权、活动审批和执行等问题产生异议时,公司有权介入并按照公司已经发布及后续发布的平台规则等进行判定,您与客户确认以公司意见为最终处理结果。<text
+									class="point">但您知悉并理解,您和客户为在平台所达成任务中的交易双方,所有任务交易应由交易双方自行协商沟通达成并依约履行和承担,公司和平台均非交易一方。\n</text>
+								(3)您承诺您有资格从事本协议项下之合作,并有能力履行其于本协议项下之义务,且该等履行义务的行为不违反任何对您有约束力的法律文件的限制。
+								(4)未经平台事先书面同意,您不得以平台合作伙伴或类似名义对外进行宣传,并且不得使用平台、公司及关联公司名称、活动名称、商标或其他LOGO。
+								(5)公司及关联公司禁止任何组织、机构或者自然人在使用公司及关联公司运营的任何网站、平台、应用程序、创作者端或有关服务过程中,通过不正当手段获得不正当利益,包括但不限于刷单、伪造虚假粉丝、伪造虚假评论、伪造虚假交易等行为。一旦发现您存在上述行为的,公司或关联公司有权终止本协议,拒绝向您提供平台的任何服务。如因上述行为造成公司或关联公司发生投诉、纠纷,或被行政机关监管、处罚,或商誉受到不良影响,或有其他经济损失的,公司有权要求您公开道歉,消除影响,并要求您赔偿全部损失。
+								8.为更好地提升用户体验及服务,公司将不定期提供平台及相关服务的更新或改变(包括但不限于平台升级、功能强化、开发新服务和任务类型等)。为保证平台及相关服务安全、提升服务质量,在平台及相关服务的部分或全部更新、改变后,公司将在可行的情况下以妥当的方式(包括但不限于系统提示、公告、站内信等)提示您。
+								<text class="point">\n\n四、费用及结算\n\n</text>
+								1.若您为客户,您同意并遵守以下关于服务费用的约定:
+								(1) 服务费用的支付方式为:预付。您应将相关服务费用支付至公司如下指定账户。在您付费之后,公司才开始为您提供服务。公司保留在您未按照约定支付全部费用之前不向您提供服务的权利。
+								(2) 您在平台点击任务结案后,公司对相应服务费用进行扣除结算,您可在线申请等额发票,公司开出后回寄给您。
+								(3) 为确保您能继续正常使用平台及相关服务,您支付的预付款剩余金额不足以支付具体项目款项的时候,您应及时续费。
+								(4)公司指定账户信息如下:
+								账户名称:北京火乐星球科技有限公司
+								开户银行:广发银行股份有限公司北京奥运村支行
+								收款账号:9550880221666800136
+								(5)如您为香港、澳门、台湾地区或其他非中国大陆地区客户,您向公司支付款项,您应承担相应的汇款手续费及结汇产生的汇兑损益。您每次在平台充值金额均为结汇后人民币金额。如合作期内产生任何退款,退款相关手续费及汇兑损益均由您承担。如您所在地区税务机关要求其对所支付款项代扣代缴相关税费(包括但不限于税收及其他类型政府性收费),代扣代缴税费由您承担。
+								(6)双方结算币种为【人民币】,结汇汇率以结汇当日银行实时汇率为准。
+								(7)您发布任务时,需针对各任务支付相关费用(包括任务服务费、平台服务费等),具体费用构成以平台任务页面所描述和约定为准。公司有权对不同类型的费用结算规则进行调整,如发生调整的,公司将另行向您通知,您同意按照公司另行通知或公示的规定执行。
+								2.若您为创作者,您同意并遵守以下关于服务费用的约定:
+								(1)针对您承接的任务,客户根据平台规则对具体任务结案后,公司将依照您在报名任务时任务详情页面所描述和约定的“固定稿费”或您“自报价”进行结算。
+								(2)若您在具体任务执行中有未传或超时上传脚本/初稿/链接/数据、不执行任务要求等违约情况,平台有权扣除对应的违约比例与您结算服务费用。
+								(3)公司有权对不同类型的费用结算规则进行调整,如发生调整的,公司将另行向您通知,您同意按照公司另行通知或公示的规定执行。
+								(4)您同意,您应就本协议项下所获得的任务服务费用自行承担个人所得税、增值税及附加税费等税费成本。
+								(5)您同意,平台有权依据相关法律法规及前述合作协议,就您在本协议项下获得的收入办理包括个人所得税、增值税及附加等相关税费的申报缴纳、代办发票等相关事宜。 
+								(6)您确认,如税收政策或监管环境发生变化,您有义务根据届时变更的税收政策或监管要求履行相关合规义务。
+								(7)您发起提现后,平台将相应费用支付到您指定的银行账户或支付宝账号中,您应当确保您在平台中所填写的银行账户信息与支付宝账号信息确系您本人所有,并准备无误。
+								<text class="point">\n\n五、用户信息的保护与使用\n\n</text>
+								1.若您为客户,您理解并同意:为履行本协议,公司有权在平台的服务器上保存您的信息(包括但不限于您的注册信息、任务信息等);公司在法律法规所允许的范围内,有权使用和对外披露您的信息,包括但不限于为平台及相关服务系统升级、抽样测试、更新的目的,出于提升互联网诚信环境的目的、依据司法和/或行政机关的要求使用或披露您的信息。为了您更好的使用平台及相关服务,公司有可能对相关服务数据进行整理分析并用于进一步优化或拓展相关服务;公司或经公司授权的关联公司也可能会出于运营需要将您的使用情况和信息作为相关服务的案例进行展示或参与相关评奖或用于基于运营需要的其他用途。
+								<text
+									class="point">您授权样叽平台将您下单任务的转化数据披露给对应接单的达人,便于达人了解任务表现效果,以提升并优化达人在本协议项下的服务能力,以及确保达人将来能更好地与您合作;同时您应确保您有权进行授权。\n</text>
+								2.若您为创作者,您理解并同意:
+								(1)为履行本协议,公司有权在平台的服务器上保存您的信息(包括但不限于您的注册信息、任务信息、社媒账号信息、物流信息、提现信息等);公司在法律法规所允许的范围内,有权使用和对外披露您的信息,包括但不限于为平台及相关服务系统升级、抽样测试、更新的目的,出于提升互联网诚信环境的目的、依据司法和/或行政机关的要求使用或披露您的信息。公司或经公司授权的关联公司也可能会出于运营需要将您的使用情况作为相关服务的案例进行展示或参与相关评奖。
+								<text
+									class="point">\n(2)为便于客户更好、更全面地了解您的信息,帮助您与客户更好地达成合作,您同意并授权样叽平台将您包括头像、昵称、性别、地域、设备所在城市及您社媒帐号粉丝量、粉丝统计画像、作品数据、用户评论等账号信息以及商品分享内容、形式、商品分享订单数据等共享至平台,并授权平台向客户展示您的前述信息。您同时同意平台将通过技术方式对上述信息和您在平台任务完成情况进行分析和整理后的数据披露给客户,包括完成任务数、预计播放/曝光量、任务服务成果发布链接等。\n</text>
+								<text
+									class="point">(3)为便于客户更好地了解您承接任务完成情况及效果相关的信息,您同意并授权平台将您在平台所完成任务的效果数据向相应发布任务的客户进行展示,包括完成播放量、点赞量、评论量、分享量等。\n</text>
+								<text
+									class="point">(4)为了您更好的使用平台及相关服务,平台有可能对相关服务数据进行整理分析并用于进一步优化或拓展相关服务;您授权同意将您在样叽平台上绑定的第三方社媒平台帐号信息、任务和任务商品相关的数据(任务信息和任务商品信息等)产生的数据授权公司及公司关联公司作为相关服务的案例进行宣传展示或参与相关评奖或用于基于运营需要的其他用途,以便商家和平台用户更好地了解相关商品或服务情况以及为您提供更好的平台任务体验以及拓展相关服务。\n</text>
+								<text
+									class="point">(5)为了帮助您更好地完成任务,您可将平台任务分享给其他“创作者”同时您同意并授权平台向其他“创作者、MCN”展示您在样叽平台的承接任务的公开数据。\n</text>
+								<text class="point">\n六、用户行为规范\n\n</text>
+								1. 客户、创作者应当各自对使用平台及相关服务的行为负责,除非法律允许或者经公司事先书面许可,使用平台及相关服务不得具有下列行为:
+								(1) 使用未经公司授权或许可的任何插件、外挂、系统或第三方工具对平台及相关服务的正常运行进行干扰、破坏、修改或施加其他影响。
+								(2) 利用或针对平台及相关服务进行任何危害计算机网络安全的行为,包括但不限于:
+								(a) 非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;
+								(b) 提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;
+								(c) 明知他人从事危害网络安全的活动的,为其提供技术支持、广告推广、支付结算等帮助
+								(d) 使用未经许可的数据或进入未经许可的服务器/账号;
+								(e) 未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息;
+								(f) 未经许可,企图探查、扫描、测试平台的弱点或其它实施破坏网络安全的行为;
+								(g) 企图干涉、破坏平台的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;
+								(h) 伪造TCP/IP数据包名称或部分名称。
+								(i) 对平台及相关服务进行反向工程、反向汇编、编译或者以其他方式尝试发现本软件的源代码。
+								(j) 违反法律法规、本协议、公司的相关规则及侵犯他人合法权益的其他行为。
+								(3)
+								在任何情况下,如果公司有理由认为您的任何行为违反或可能违反上述约定的,公司可独立进行判断并处理,且有权在不进行任何事先通知情况下终止向您提供服务,并追究您的相关法律责任。
+								<text
+									class="point">\n2.客户、创作者在平台中发布与上传的内容应自觉遵守相应法律、法规,尊重公共秩序,尊重社会公德、社会主义制度、国家利益、公民合法权益、道德风尚和信息真实性等要求。您同意并承诺不制作、发布法律、行政法规禁止的下列信息内容:\n</text>
+								(1) 反对宪法确定的基本原则的;
+								(2) 危害国家安全,泄露国家秘密的;
+								(3) 颠覆国家政权,推翻社会主义制度、煽动分裂国家、破坏国家统一的;
+								(4) 损害国家荣誉和利益的;
+								(5) 宣扬恐怖主义、极端主义的;
+								(6) 宣扬民族仇恨、民族歧视,破坏民族团结的;
+								(7) 煽动地域歧视、地域仇恨的;
+								(8) 破坏国家宗教政策,宣扬邪教和迷信的;
+								(9) 编造、散布谣言、虚假信息,扰乱经济秩序和社会秩序、破坏社会稳定的;
+								(10) 散布、传播暴力、淫秽、色情、赌博、凶杀、恐怖或者教唆犯罪的;
+								(11) 侵害未成年人合法权益或者损害未成年人身心健康的;
+								(12) 未获他人允许,偷拍、偷录他人,侵害他人合法权利的;
+								(13) 包含恐怖、暴力血腥、高危险性、危害表演者自身或他人身心健康内容的;
+								(14) 危害网络安全、利用网络从事危害国家安全、荣誉和利益的;
+								(15) 侮辱或者诽谤他人,侵害他人合法权益的;
+								(16) 对他人进行暴力恐吓、威胁,实施人肉搜索的;
+								(17) 涉及他人隐私、个人信息或资料的;
+								(18) 散布污言秽语,损害社会公序良俗的;
+								(19) 侵犯他人隐私权、名誉权、肖像权、知识产权等合法权益内容的;
+								(20) 散布商业广告,或类似的商业招揽信息、过度营销信息及垃圾信息;
+								(21) 使用本平台常用语言文字以外的其他语言文字评论的;
+								(22) 与所评论的信息毫无关系的;
+								(23) 所发表的信息毫无意义的,或刻意使用字符组合以逃避技术审核的;
+								(24) 其他违反法律法规、政策及公序良俗、干扰平台正常运营或侵犯其他用户或第三方合法权益内容的其他信息。
+								<text class="point">\n\n七、内容的审查和责任\n\n</text>
+								1.若您为客户或创作者:
+								(1)您必须对发表或者上传于平台的所有信息(包括但不限于文字、图片、音频、视频、链接等各种形式的内容及其中包括的音乐、声音、台词、视觉设计、对话等所有组成部分)均享有完整的知识产权,或已经得到相关权利人的合法授权(且含转授权),并保证该信息不侵犯任何第三人的合法权益(包括但不限于名誉权、姓名权、肖像权、隐私权、知识产权等);如您违反本条规定造成平台被第三人索赔的,您应赔偿平台一切损失和费用(包括但不限于各种赔偿金、诉讼代理费及为此支出的其它合理费用)。
+								(2)公司有权不时对您的身份信息、发布内容、账号名称等内容进行审查,如有公司认为不真实、不符合法律规定、不符合本协议约定或存在风险的信息,公司有权在不通知您的前提下即进行自行处理的权利。处理的方法包括但不限于删除信息,终止账号,屏蔽IP地址、关键字、联系方式,或法律诉讼等。公司前述审查行为并不视为公司对您提交的相关任务、信息、内容的真实性、准确性、合法合规性的任何承诺或担保,也不构成公司对您提交的相关信息、内容承担任何连带责任,您应当对您的相关信息、内容独立负责。
+								2.若您为客户,在平台发布信息和任务时,您应首先进行自审,查看是否有违规或存在归属权争议,一旦您在平台发布信息和任务,平台视为您已经进行自审;若您为创作者,在平台上传信息时,您应首先进行自审,查看是否有违规或存在归属权争议,一旦您在平台上传信息,平台视为您已经进行自审。
+								<text
+									class="point">\n3.平台提供显示的创作者在第三方社媒平台的部分信息(包括但不限于社媒平台的主页链接、主页截图、粉丝数量、点赞量、评论量、收藏量、带货销量等)为创作者自行上传或平台通过第三方平台接入的数据,因网络技术的局限性和不稳定性及创作者自行上传数据的不可预见性,平台无法保证前述数据与第三方社媒平台数据实时同步更新。前述数据仅供您参考,公司不对其真实性、准确性负责,公司不对创作者绑定的社媒主页链接、粉丝数量、点赞量、评论量、收藏量、带货销量数等进行保证,公司不对您使用平台服务的效果以及您产品或服务的销量做任何承诺。\n</text>
+								<text class="point">\n八、保密义务\n\n</text>
+								1.任何一方对于因签署或履行本协议而了解或接触到的对方的商业秘密及其他机密资料和信息,包括但不限于客户向创作者提供的品牌信息、平台运营政策、运营信息、相关数据、本协议内容、价格体系等(以下简称“保密信息”)均应保守秘密,非经权利方书面同意,任何一方不得向本协议之外的其他方泄露、给予或转让该等保密信息或擅自使用,相关法律法规规定或国家政府部门要求的情况除外。
+								2. 本条规定的权利和义务在本协议终止后将继续有效。
+								3. 如创作者违反保密义务的,平台有权立即终止本协议,并不予退还违约方已支付的保证金(若有);如因创作者反保密义务给平台或客户造成损失的,平台有权向创作者追索。
+								<text class="point">\n\n九、违约处理\n</text>
+								<text class="point">\n1.若您为客户:
+									(1)针对您违反本协议或其他服务条款的行为,公司有权独立判断并视情况采取拒绝发布、删除发布内容、限制账号部分或者全部功能直至永久关闭账号等措施。公司有权公告处理结果,且有权根据实际情况决定是否恢复相关账号的使用。对涉嫌违反法律法规、涉嫌违法犯罪的行为将保存有关记录,并依法向有关主管部门报告、配合有关主管部门调查。
+									(2)因您违反本协议或其他服务条款约定,引起第三方投诉或诉讼索赔的,您应当自行处理并承担全部可能由此引起的法律责任。因您的违法或违约行为导致公司及其关联公司、控制公司向任何第三方赔偿或遭受国家机关处罚的,您还应足额赔偿公司及其关联公司、控制公司因此遭受的全部损失。
+									(3)您不应当随意取消订单,否则公司有权按平台规则进行相应处理,因此造成创作者任何损失的,您应当承担赔偿责任。
+									2.若您为创作者:
+									(1)针对您违反本协议或其他服务条款的行为,公司有权独立判断并视情况采取拒绝发布、删除发布内容、限制账号部分或者全部功能直至永久关闭账号等措施。公司有权公告处理结果,且有权根据实际情况决定是否恢复相关账号的使用。对涉嫌违反法律法规、涉嫌违法犯罪的行为将保存有关记录,并依法向有关主管部门报告、配合有关主管部门调查。
+									(2)因您违反本协议或其他服务条款约定,引起第三方投诉或诉讼索赔的,您应当自行处理并承担全部可能由此引起的法律责任。因您的违法或违约行为导致公司及其关联公司、控制公司向任何第三方赔偿或遭受国家机关处罚的,您还应足额赔偿公司及其关联公司、控制公司因此遭受的全部损失。
+									(3)如您严重违反本协议的,应当按照违约行为所指向的单个任务所涉及的实际产品和服务体验费用向公司支付赔偿金,公司有权向您追偿;公司有权直接从应向您支付的服务费用中扣除赔偿金。严重违反本协议的情况包括:
+									1)接单后未与平台或客户达成一致的退单/跑单;
+									2)接单后未按平台规定时间上传脚本进行审核;
+									3)接单后未按平台规定时间上传初稿进行审核;
+									4)接单后未按平台规定时间上传发布链接进行审核;
+									5)接单后未按平台规定时间上传数据连接进行审核;
+									6)未按客户要求的时间段在约定的平台保持任务服务成果发布;
+									7)接单后未按约定提供服务或交付工作成果;
+									8)未经平台同意或违反本协议,私自与客户接洽与本协议项下的相同或类似服务;
+									9)其它影响客户及公司和/或其关联公司权益的行为(包括但不限于造成直接或直接经济损失、损害形象等行为,以及平台规定的其他严重违反协议的行为。
+									(4)本协议合作期限内,您应确保严格遵守法律法规、遵守社会公德、维护公序良俗,规范您作为网络达人及公众人士的职业操守和良好公众形象,不发生触犯法律法规、国家政策以及严重违背社会公序良俗或其它致使您公众形象严重受损的严重不良行为或其他丑闻劣迹等行为(包括但不限于吸毒、赌博、流连夜店、酗酒、斗殴、参与黑社会性质的团体和活动、涉黄、酒驾、嫖娼、出轨、成为他人婚姻生活中的“第三者”、反政府和反社会等不当言论等);您如出现负面报导,落入国家行政监管机关禁止履行本协议项下约定服务内容范围的,导致公司和/或公司关联公司因前述事宜受到国家机关行政处罚或第三方索赔的,公司有权提前终止本协议,无需承担本协议项下付款义务,并有权要求您退还公司已支付的全部费用,公司有权从尚未支付给您本人的款项金额中直接扣除全部或部分。\n</text>
+								<text class="point">\n十、服务的变更、中断和终止\n\n</text>
+								1.您理解并同意,公司提供的平台及相关服务是按照现有技术和条件所能达到的现状提供的。公司会尽最大努力向您提供服务,确保服务的连贯性和安全性。您理解,公司不能随时预见和防范技术以及其他风险,包括但不限于不可抗力、病毒、木马、黑客攻击、系统不稳定、第三方服务瑕疵及其他各种安全问题的侵扰等原因可能导致的服务中断、数据丢失以及其他的损失和风险。如因不可抗力或其他非公司因素给您造成损失的,您同意公司可以免责。
+								2. 您理解并同意,公司为了服务整体运营的需要,有权在公告通知后修改、中断、中止或终止平台及相关服务,而无须向您负责或承担任何赔偿责任。
+								<text class="point">\n\n十一、知识产权\n\n</text>
+								1.公司在平台及相关服务中提供的内容(包括但不限于软件、技术、程序、网页、文字、图片、图像、音频、视频、图表、版面设计、电子文档等)的知识产权属于公司所有。公司提供服务时所依托的软件的著作权、专利权及其他知识产权均归公司所有。未经公司许可,您不得更改、演绎、拆分、反解平台及相关服务中涉及的技术和程序或以其它任何方式进行可能损害前述专有权利的行为。
+								2.您理解并同意,在使用平台及相关服务时上传或发布的内容(包括文字、图片、视频、音频等各种形式的内容及其中包含的音乐、声音、台词、视觉设计等所有组成部分)均由您原创或已获得合法授权(且含转授权)。您通过平台及相关服务发布的任何内容的知识产权归属您或经原始著作权人合法授权。
+								<text
+									class="point">\n3.创作者通过平台与客户达成交易项下所提供的工作成果(包括文字、图片、视频、音频、网络直播等各种形式的内容及其中包含的音乐、声音、台词、视觉设计等所有组成部分)均由创作者原创或已获得合法授权(且含转授权),创作者在此不可撤销地授权及承诺客户和平台有权对上述工作成果进行合法使用,同时可按照创作者与客户通过平台所达成任务交易明确列明的其它用途使用,具体如下:
+									(1)如客户与创作者达成的任务交易中明确工作成果用于社媒平台商业推广使用的,客户可按照上述用途进行合理使用。
+									(2)如客户与创作者达成的任务交易中未明确其它使用用途,但基于任务类型和属性,任务完成后平台显示客户可以下载创作者工作成果的,工作成果的知识产权归属于客户所有。客户可将工作成果用于商业性或非商业性合理使用,但是前述使用行为不得侵犯创作者对其交付的工作成果中含有的相关素材或内容的知识产权、肖像权或其他第三方权利。
+									(3)如客户与创作者达成的任务交易中未明确其它使用用途,但基于任务类型和属性,任务完成后平台显示客户不可下载创作者工作成果的,工作成果的知识产权归属于创作者所有。如客户有任务交易外的使用用途的,客户应当通告平台与创作者协商沟通确定权利归属和使用范围。
+									(4)若创作者提供授权内容存在第三方授权问题,创作者应配合客户提供相关授权证明。
+									(5)创作者知悉,创作者同意客户使用工作成果时,具体工作成果会根据法律法规、平台规则规范等要求进行调整,包括但不限于附加平台锚点组件、标识或标志。客户在使用工作成果时,创作者保证授权内容授权有效期间保持公开可见的状态,不可随意删除授权内容或设置为私密、好友可见。
+									因工作成果的使用、发布、传播所引起的任何纠纷,由客户与创作者依据双方权利义务的约定承担全部法律责任,平台、公司、公司关联公司不承担任何责任。
+									4.平台使用内容条款
+									(1)若您为客户,您确认并授权平台、公司及公司关联公司有权将您通过平台发布任务委托创作者完成的工作成果以及该任务的基本情况,用于包括但不限于对外宣传、展示、优秀案例推广以及户外、网站/手机客户端/其他形式的信息网络传播等商业的目的或非商业目的使用;您授予公司及公司关联方、控制公司、继承公司一项全球范围内、免费、非独家、可再许可(通过多层次)的权利(包括但不限于复制权、翻译权、汇编权、信息网络传播权、改编权及制作衍生品、表演和展示的权利等),上述权利的使用范围包括但不限于在当前或其他网站、应用程序、产品或终端设备等使用。您在此确认并同意,公司有权自行或许可第三方在与上述内容、平台及相关服务、公司和/或公司品牌有关的任何宣传、推广、广告、营销和/或研究中使用和以其他方式开发内容(全部或部分)。
+									您理解并同意,上述授予的权利包括使用、复制和展示您拥有或被许可使用并植入内容中的个人形象、肖像、姓名、商标、服务标志、品牌、名称、标识和公司标记(如有)以及任何其他品牌、营销和推广资产、物料、素材等的权利和许可。
+									(2)若您为创作者,为使您的工作成果得到更好的分享及推广,提供其传播价值及影响力,您通过平台及相关服务上传、发布或传输的内容(包括但不限文字,图像,音频,视频、直播内容等各种形式的内容及其中包括的音乐、声音、台词、视觉设计、对话等所有组成部分)及工作成果,您授予公司及其关联方、控制公司、继承公司一项全球范围内、免费、非独家、可再许可(通过多层次)的权利(包括但不限于复制权、翻译权、汇编权、信息网络传播权、改编权及制作衍生品、表演和展示的权利等),上述权利的使用范围包括但不限于在当前或其他网站、应用程序、产品或终端设备等使用。您在此确认并同意,公司有权自行或许可第三方在与上述内容、平台及相关服务、公司和/或公司品牌有关的任何宣传、推广、广告、营销和/或研究中使用和以其他方式开发内容(全部或部分)。
+									您理解并同意,上述授予的权利包括使用、复制和展示您拥有或被许可使用并植入内容中的个人形象、肖像、姓名、商标、服务标志、品牌、名称、标识和公司标记(如有)以及任何其他品牌、营销和推广资产、物料、素材等的权利和许可。\n</text>
+								5. 公司为平台开发、运营提供技术支持,并对平台及相关服务的开发和运营等过程中产生的所有数据和信息等享有法律法规允许范围内的全部权利。
+								<text
+									class="point">\n6.请您在任何情况下都不要私自使用公司的包括但不限于“样叽”、“YOUNGGEE”、“www.youunggee.com”等在内的任何商标、服务标记、商号、域名、网站名称或其他显著品牌特征等(以下统称为“标识”)。未经公司事先书面同意,您不得将本条款前述标识以单独或任何结合方式展示、使用或申请注册商标、进行域名注册等,也不得实施向他人明示或暗示有权展示、使用、或其他有权处理该些标识的行为。由于您违反本协议使用公司上述商标、标识等给公司或他人造成损失的,由您承担全部法律责任。
+									7.公司有权以自身名义在全球范围内单独向侵犯本协议项下所产生的肖像权、知识产权和/或其它合法权利的第三方维权,维权形式包括但不限于:监测侵权行为、发送维权函、提起诉讼或仲裁、调解、和解等,公司有权对维权事宜作出任何独立决策并独立实施。如公司已就第三方侵权行为发起任何形式维权的,则本协议合作项目授权期限将自动延续至维权结束或停止维权之时。创作者授权公司以公司的名义制止、打击侵权和盗版行为,包括但不限于申请保全、行政投诉、提起民事诉讼、上诉、申请执行、和解、获得赔偿金等。\n</text>
+								<text class="point">\n十二、免责条款\n</text>
+								<text
+									class="point">\n1.用户知悉、理解并认可:平台仅作为用户任务发布、任务报名、任务执行等交易合作的网络平台提供者,并非订单、任务和项目需求的发布者和交易的一方;客户、创作者上传的内容以及所提供的服务,没有经过平台事先审查,因此平台无法保证其内容的真实性、合法性、准确性、有效性和安全性。用户在使用非平台和公司上传的内容时遭受的损失和其它一切后果由用户独自承担。
+									用户如因为浏览平台的内容或第三方发布和上传的内容而因此遭受到任何损失,或与其他用户、客户、创作者、第三方等发生争议,就上述损失或争议或任何方面产生有关的索赔、要求、诉讼、损失和损害,由用户自行承担或与上述当事方协商解决,平台、公司和公司的管理层、董事、代理人、关联公司、母公司、子公司和雇员对此不承担任何责任。
+									2.用户同意不就其他用户、客户、创作者等发布的内容或行为追究平台的责任。公司对于用户由于使用平台而造成的任何金钱、商誉、名誉的损失,或任何特殊的、间接的、或结果性的损失都不负任何责任。用户同意就用户自身行为之合法性单独承担责任,用户同意,公司及其所有关联公司和相关实体对用户的行为的合法性不承担任何责任。
+									3.除平台注明之服务条款外,其他一切因使用平台及相关服务而引致之任何意外、疏忽、合约毁坏、诽谤或知识产权侵犯及其所造成损失的,平台不承担任何法律责任。
+									4.因不可抗力(包括但不限于政府管制、国家政策调整、恐怖袭击、自然灾害、突发公共事件、战争、停电、电信部门技术调整以及病毒入侵等)、来自外部的恶意网络攻击或其它非平台故意行为导致平台不能正常提供服务时,不视为公司违约,公司不承担任何责任,也无须向您提供任何赔偿。
+									5. 根据法律规定、相关协议约定,平台不承担责任的其他情形。
+									6.如因客户、创作者原因导致的违约、违规(违反平台规则、国家法律法规等)行为造成任何损失的,违约方、违规方应当承担全部责任并赔偿相应的损失,平台不承担任何法律责任,也无须向您提供任何赔偿。
+									7.如因第三方平台原因(包括但不限于第三方社媒平台规则、内容审查、技术等)导致的违约、违规(违反平台规则、国家法律法规等)行为造成任何损失的,平台无需承担任何法律责任,也无需提供任何赔偿;由此导致任务费用无法正常结算等问题,客户、创作者可参考平台规则等流程申请平台调解进行解决。
+									8.如发生包括但不限于有权机关要求、社会公共事件、媒体报道或重大时间节点等情形时,公司有权在相应时间节点调整、暂停或终止本协议项下的服务且无需承担任何责任。\n</text>
+								<text class="point">\n十三、其他\n\n</text>
+								1.本协议自您在线点击同意后生效。除本协议约定的解除或终止情形或法定解除或终止事由外,本协议将长期有效。平台有权经提前15天书面、邮件、电话、短信、平台内消息通知您,即可提前单方终止本协议且不需要承担任何违约责任。本协议生效后,您与平台之前签订的所有协议(如有)中的平台签约主体,都变更为本协议的主体北京火乐星球科技有限公司。
+								2.本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国法律。倘若本协议之任何规定因与中华人民共和国法律抵触而无效,则这些条款应在不违反法律的前提下按照尽可能接近本协议原条文目的之原则进行重新解释和适用,且本协议其它规定仍应具有完整的效力及效果。
+								<text
+									class="point">\n3.本协议的签署地点为中华人民共和国北京市海淀区。若您因本协议与公司发生任何争议,双方应尽量友好协商解决;如协商不成的,您同意应将相关争议提交至北京市海淀区人民法院诉讼解决。\n</text>
+								4.用户同意,在发生并购,本协议和所有纳入的协议可由本公司自行酌情决定向第三方自动转让。本公司未就用户或其他方的违约采取行动并不等于本公司放弃就随后或类似的违约采取行动的权利。
+								<text
+									class="point">\n5.为给您提供更好的服务或因国家法律法规、政策调整、技术条件、产品功能等变化需要,公司会适时对本协议进行修订,公司会将修改后的协议予以发布;前述内容一经正式发布,即作为本协议不可分割的组成部分并具有等同于本协议的法律效力。公司会以适当的方式将本协议的修订条款送达您(网站公布、系统通知等),并督促您同意或拒绝。如您对修改后的协议条款存有异议的,请立即停止登录或使用样叽平台及相关服务。若您继续登录或使用样叽平台及相关服务,即视为您认可并接受修改后的协议条款。\n</text>
+								6.本协议中的标题仅为方便及阅读而设,并不影响本协议中任何规定的含义或解释。
+								7.您和公司均为独立的主体,在任何情况下本协议不构成公司对您的任何形式的明示或暗示担保,双方之间亦不构成代理、合伙、合营或雇佣关系。
+								<text class="point">\n\n附件:个人信息保护承诺函\n\n</text>
+								鉴于用户拟(或正在)与本公司开展样叽服务合作过程中,涉及用户与创作者等主体之间的任务推广服务合作,为符合与个人信息保护相关法律法规的规定,在合作过程中对相关数据主体的个人信息进行充分的保护,用户与本公司可能会共同、单独或接受委托对相关个人信息进行处理。在前述个人信息的处理过程中,用户有义务遵守与个人信息保护相关法律、法规、规章制度及国家标准<text
+									class="point">(以下简称“数据保护要求”)</text>的规定,履行个人信息保护、数据安全以及保密等义务。
+								本承诺函项下“个人信息”是指:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,但不包括匿名化处理后的信息;个人信息的“处理”包括个人信息的收集、存储、使用、加工、传输、提供、公开、删除等。
+								<text class="point">\n用户在此承诺并保证:\n</text>
+								1.在本承诺函项下用户对个人信息的处理,应符合数据保护要求的规定,严格遵守个人信息处理的合法、正当、必要和诚信原则,且仅在为实现《样叽平台服务协议》(以下简称“主协议”)的范围内进行相应的处理活动。用户在处理个人信息过程中,应当遵循公开、透明原则,向相关数据主体公开个人信息处理规则,明示处理的目的、方式和范围,数据处理应具有明确、合理的目的,并应当与处理目的直接相关且在实现处理目的所需的最小范围内进行。数据处理应当在数据主体的授权范围内、采取对数据主体个人权益影响最小的方式进行,并应避免因个人信息不准确、不完整对数据主体权益造成不利影响。若超出数据主体的授权范围对相关个人信息进行处理的,用户应当根据数据保护要求的规定,另行征得相关数据主体的授权同意后进行处理,数据保护要求另有规定的除外。
+								2.若涉及用户向平台传输个人信息,用户承诺在传输相关个人信息前,须符合数据保护要求的规定。除非数据保护要求另有规定,用户承诺已经就其向平台传输的个人信息,将所涉及的个人信息的种类、处理目的、处理方式等数据保护要求所规定的法定内容对数据主体进行了充分且满足透明度要求的告知,并获得了数据主体的授权同意。
+								3.用户承诺向平台上传相关个人信息并使用主协议项下的服务,不会违反数据保护要求以及用户与本公司相关协议/合同(如有)的约定,不会损害本公司、本公司关联方、相关数据主体或对数据拥有相关权利的主体的合法权益,亦不会超出数据主体或对数据拥有相关权利的主体针对用户的相关处理事宜已向用户及任何其他相关方授权同意的范围。若用户违反本条规定,应当负责赔偿相关行为对本公司、本公司关联方及数据主体造成的侵害,并承担全部责任。
+								4.若基于主协议合作的必要,涉及用户从平台获取相关个人信息,用户承诺将按照数据保护要求、在数据主体授权范围内以及本公司和平台设定的安全规则/政策,在主协议的范围内处理相关个人信息并须严格确保相关个人信息的安全。除主协议另有约定外,未经本公司书面许可,用户不得将相关个人信息处理活动分包给任何第三方进行处理。受限于本条规定,用户应对第三方的数据处理活动承担全部责任。本条所规定的个人信息处理活动结束后,除非法律法规另有规定,用户应当及时删除相关个人信息。
+								5.用户承诺,除非获得本公司书面同意且严格受限于数据保护要求、数据主体的授权范围以及主协议的目的范围,用户不会向第三方共享、提供、转让或公开披露相关个人信息,亦不会对相关个人信息进行超出上述范围的进一步处理。受限于本条规定,若确需向第三方传输相关个人信息的,用户承诺此类处理行为不会违反数据保护要求以及用户与本公司相关协议/合同(如有)的约定,不会损害本公司、本公司关联方、相关数据主体或对数据拥有相关权利的主体的合法权益,亦不会超出数据主体或对数据拥有相关权利的主体针对用户的相关处理事宜已向用户及任何其他相关方授权同意的范围,用户将严格约束第三方的处理行为并确保个人信息的安全。若用户违反本条规定,应当负责赔偿相关行为对本公司、本公司关联方及数据主体造成的侵害,并承担全部责任。
+								6.在主协议合作过程中,用户可能使用本公司或本公司关联方为其提供的相关技术服务(例如建站服务),用户知悉并确认,若相关技术服务涉及在本公司或本公司关联方的任何平台/产品或其他场景收集或进一步处理本公司或本公司关联方用户/用户的个人信息,用户应当确保相关处理行为完全符合数据保护要求的规定,包括但不限于:用户应当根据数据保护要求的规定向相关数据主体提供用户隐私政策或类似文件,向其告知所处理的数据类型、处理目的、方式等数据保护要求规定的法定内容,并获得相关数据主体的授权同意,同时应提供用户真实有效的联系方式,便于相关数据主体行使数据保护要求项下的相关权利。
+								7.为了实现监测目的,用户与本公司将通过监测链接等技术方式,对所发布的任务内容进行监测与归因。即用户在发布任务订单的同时配置监测链接、监测代码或采取其他技术方式,当相关用户被任务内容曝光或与任务内容有其他互动时,会通过上述技术方式将相关监测数据回传给用户或第三方监测机构。监测场景下涉及的数据包括经过哈希或其他安全措施处理的设备唯一标识符、IP、UA等<text
+									class="point">(简称为“监测数据”)</text>。用户应当确保对于所接收的上述监测数据,仅可用于实现监测与归因的目的,未经本公司书面许可,不得用于任何其他目的,亦不得向任何其他第三方、关联方共享或进行公开披露。在实现监测与归因目的或合作终止后,用户应当及时删除相关监测数据。若用户委托第三方监测公司进行监测,则用户应当在上述目的实现后,督促其委托的第三方监测机构履行上述义务。
+								8.用户承诺,不会通过主协议项下的服务和/或利用对相关数据的处理活动从事下列违法违规、有违社会善良风俗的行为或活动:
+								(1)任何与淫秽、色情、赌博、迷信、恐怖、暴力、诈骗等相关的行为或活动。
+								(2)任何与表达对民族、种族、宗教、残疾、疾病歧视等相关的行为或活动。
+								(3)任何利用本公司或本公司关联方所提供的中立技术分析服务(包括分析报告或其他服务),进一步创建涉及上述信息或标签的受众人群清单、产出任何分析报告或用于推销用户的产品/服务或用于其他用途。
+								(4)任何非法或不当地对相关数据主体进行个人身份的挖掘和/或对其隐私、安宁进行侵害、侵扰的行为(包括但不限于《中华人民共和国民法典》第1033条所规定的隐私权侵害行为)。
+								9.用户承诺不会违反数据保护要求的规定,以非法方式或以破坏本公司和平台安全规则的方式试图获取相关个人信息。
+								10.用户理解并承诺,为符合数据保护要求的规定、基于保护相关个人信息安全的目的,在数据传输和处理过程中应采取相关技术措施(例如加密技术等)确保个人信息的安全,用户承诺将积极配合本公司,以符合数据保护要求的形式处理相关个人信息。
+								11.用户承诺其具备符合数据保护要求所规定的必要的组织管理制度以及技术措施以保障个人信息的安全。若发生或可能发生个人信息安全事件(指个人信息被泄露、毁损、篡改、丢失、未经授权的访问和处理,以及由此对数据主体的相关权益带来的侵害),用户应当立即书面通知本公司、并在第一时间采取有效的补救措施。若因用户原因导致上述个人信息安全事件,用户承诺将独立处理因此而产生的纠纷(包括但不限于投诉、行政处罚以及诉讼纠纷),使本公司、本公司关联方及相关数据主体免于侵害和损失,并承担全部责任。
+								12.用户承诺如本公司/平台要求,用户将及时向本公司提供所有必要的信息,以证明用户遵守数据保护要求,在主协议和本承诺函的约定范围以及数据主体授权范围内处理个人信息。前述必要信息包括但不限于:用户的数据安全能力情况以及对个人信息的处理情况。用户承诺所提供的信息/情况真实、准确,不存在任何虚假、隐瞒。本公司有权对用户的数据安全和数据处理进行安全审计,用户将予以积极配合。
+								13.当主协议合作期限届满或者因其他任何原因用户与本公司终止合作的,用户承诺将删除或销毁所有从本公司/平台获取的个人信息,包括原数据、备份数据等,并保证删除后无法通过技术手段进行恢复。
+								14.若用户违反本承诺函,将被视为严重违约和/或侵权行为,本公司有权要求用户对本公司、本公司关联方、数据主体或第三方所遭受的全部损失予以赔偿,并有权单方中止或终止用户主协议服务需求和与用户的任何合作,用户承担全部法律责任,并应负责消除影响、妥善解决。
+								15.本承诺函不因主协议或任务推广服务合作的无效、中止、终止而终止或丧失效力。
+							</text>
+						</scroll-view>
+					</view>
+				</view>
+			</uni-popup>
+		</view>
+
+		<view>
+			<!-- 底部普通弹窗 -->
+			<uni-popup ref="popup4" background-color="#fff" @change="change" style="border-radius: 20rpx;">
+				<view class="popup-content1" :class="{ 'popup-height': type === 'left' || type === 'right' }">
+					<view style="display: flex; justify-content: space-around; margin-top: 10% ;margin-bottom: 10% ;">
+						<scroll-view scroll-y="true" style="height:350px;padding: 0 20rpx">
+							<view class="title">样叽平台隐私政策</view>
+							<text style="padding-bottom: 50rpx;">
+								<text class="point">更新日期:2022年11月19日\n</text>
+								<text class="point">生效日期:2022年11月26日\n</text>
+								样叽(简称“我们”)深知个人信息对您的重要性,您的信任对我们非常重要,我们将按照法律法规的规定并参照行业最佳实践保护您的个人信息及隐私安全。我们制定本“隐私政策”并特别提示:希望您在使用样叽及相关服务前仔细阅读并理解本隐私政策,以便做出适当的选择。
+								如您使用本平台,您理解并确认,为了让您更便捷地使用本平台,并在获得您同意的前提下向我们提供与您相关的若干个人信息,包括您的手机号码、电子邮箱、身份证明、企业名称、企业资质文件等。根据您的陈述和保证,您或您的企业向我们提供的上述个人信息之前,已经事先获得您的明确授权及已经充分告知您收集您的个人信息的目的、范围、使用方式。如您无法确认上述内容,我们建议您立即停止访问或使用本平台。同时您也可以通过本隐私政策提供的联系方式与我们联系,我们将在我们的能力范围内配合您处理相关事宜。
+								<text class="point">\n本隐私政策将帮助您了解:\n</text>
+								我们会遵循隐私政策收集、使用您的信息,但不会仅因您同意本隐私政策而采用强制捆绑的方式一揽子收集个人信息。
+								当您使用或开启相关功能或使用服务时,为实现功能、服务所必需,我们会收集、使用相关信息。除非是为实现业务功能或根据法律法规要求所必需的必要信息,您均可以拒绝提供且不影响其他功能或服务。我们将在隐私政策中逐项说明所要收集的信息。
+								摄像头(相机)、相册(存储),均不会默认开启,只有经过您的明示授权才会在为实现特定功能或服务时使用,您也可以撤回授权。<text
+									class="point">特别需要指出的是,即使经过您的授权,我们获得了这些敏感权限,也不会在相关功能或服务不需要时而收集您的信息。</text>
+								本隐私政策适用于样叽向您提供的产品和服务。如您使用我们或关联公司向您提供的某项或某几项服务,有其单独的隐私政策的,则相应服务或产品适用相应隐私政策;<text
+									class="point">如未设立独立隐私政策的,则本政策同样适用于该部分产品或服务。\n</text>
+								下文将帮您详细了解我们如何收集、使用、存储、转移(如适用)与保护个人信息;帮您了解查阅、复制、更正、删除、撤回授权个人信息的方式。本政策与您使用我们的服务关系密切,我们建议您仔细阅读并理解本政策全部内容,作出您认为适当的选择,<text
+									class="point">有关您个人信息权益的条款重要内容我们已用加粗形式提示,请特别关注。</text>
+								<text class="point1">\n\n一、我们如何收集和使用个人信息\n</text>
+								<text class="point1">二、我们如何使用cookie等同类技术\n</text>
+								<text class="point1">三、数据使用过程中涉及的合作方以及转移、公开个人信息\n</text>
+								<text class="point1">四、我们如何存储个人信息\n</text>
+								<text class="point1">五、我们如何保护个人信息的安全\n</text>
+								<text class="point1">六、管理您的个人信息\n</text>
+								<text class="point1">七、未成年人条款\n</text>
+								<text class="point1">八、隐私政策的修订和通知\n</text>
+								<text class="point1">九、联系我们\n</text>
+								<text class="title1">\n一、我们如何收集和使用个人信息\n\n</text>
+								我们会按照如下方式收集您在使用服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息:
+								<text class="point">\n1.1注册、登录、认证、找回\n</text>
+								<text class="point">1.1.1注册、登录\n</text>
+								a.当您注册、登录样叽及相关服务时,您可以通过邮箱或者手机号码创建账号,我们将通过发送短信验证码来验证您的身份是否有效,并且您可以完善相关的网络身份识别信息(头像、昵称、密码),收集这些信息是为了帮助您完成注册。您还可以根据自身需求选择填写邮箱及个人介绍来完善您的信息。
+								b.您也可以使用第三方平台授权登录并使用,您将授权我们获取您在第三方平台注册的公开信息(头像、昵称以及您授权的其他信息),用于与样叽平台账号绑定,使您可以直接登录并使用样叽和相关服务。
+								c.为了保证在不同产品中向您提供一致化的服务,我们与功能相互联系的关联方产品建立统一服务平台体系。在该平台体系的服务范围内,我们与上述关联方产品将共同收集和处理您登录、使用产品的个人信息,并针对您注册使用的手机号码在不同产品中创建统一的数字标识,以实现功能的一致性。
+								<text class="point">\n1.1.2认证\n</text>
+								在您使用身份认证的功能或相关服务所需时,根据相关法律法规、安全保障要求可能需要完成实名认证以验证您的身份。<text
+									class="point1">在实名认证的过程中,第三方认证服务机构需要使用您的真实姓名、身份证号码、手机号码及人脸信息。部分信息是个人敏感信息,拒绝上述处理将导致您无法使用该功能,但不会影响样叽其他功能的正常使用。这些信息仅供实名认证及法律法规所规定的用途,未经您的明示授权,不会用作其他目的。</text>
+								<text class="point">\n1.1.3.帐号找回\n</text>
+								您可以通过找回帐号功能对您的帐号进行找回,为保障您帐号的安全所必需,在找回帐号时我们可能需要您填写相关信息以进行验证,必要时可能通过实名验证、人脸识别等方式验证您的身份。
+								<text class="point">\n1.2提现\n</text>
+								在您使用提现功能时,根据相关法律法规,您可能需要提供您的真实身份信息(真实姓名、<text class="point1">身份证号码</text>、手机号码、<text
+									class="point1">银行账号/支付宝账号</text>)及<text
+									class="point1">金额</text>等结算信息以完成实名验证、并使用提现功能。 <text
+									class="point1">这些信息属于个人敏感信息,您可以拒绝提供,但您将可能无法使用提现功能,但不影响其他功能与服务的正常使用。</text>
+								<text class="point">\n1.3发布任务\n</text>
+								1.3.1当您使用样叽发布任务时,您需要提供任务联系人姓名和手机号码,并承诺此类个人信息已按照相关法律法规的规定合法获取。我们将基于流程指引、活动通知、任务流程通知、服务更新通知、服务体验调研、任务回访等目的使用您提供的手机号码,包括推送信息与拨打电话。您可以拒绝提供,但您将可能无法发布任务,但不影响其他功能与服务的正常使用。
+								1.3.2您发布任务时,我们将收集您发布的信息,并展示您的昵称、头像、任务内容,在任务内容中可能含有您的部分信息。
+								1.3.3在您与交易相对方联系的过程中,我们将为您提供虚拟电话号服务,避免您的信息泄露。
+								<text class="point">\n1.4 接受任务\n</text>
+								1.4.1当您使用样叽接受任务时,您需要提供任务联系人的姓名和手机号码。我们将基于流程指引、活动通知、订单流程通知、服务更新通知、服务体验调研、订单回访等目的使用您提供的手机号码,包括推送信息与拨打电话。您可以拒绝提供,但您将可能无法接受任务,但不影响其他功能与服务的正常使用。
+								1.4.2在您与交易相对方联系的过程中,我们可能会为您提供虚拟电话号服务,避免您的信息泄露。
+								<text class="point">\n1.5 消息通知\n</text>
+								您知悉并同意,对于您在使用产品及/或服务的过程中提供的您的联系方式(例如:联系电话),我们在运营中可能会向其中的一种或多种发送多类通知,用于用户消息告知、身份验证、安全验证、用户使用体验调研等用途;此外,我们也可能会以短信、电话的方式,为您提供您可能感兴趣的服务、功能或活动等商业性信息的用途,但请您放心,如您不愿接受这些信息,您可以通过手机短信中提供的退订方式进行退订,也可以直接与我们联系进行退订。
+								您使用即时通讯工具(如有)的功能时,我们会根据您使用的功能类型分别请求您授权<text
+									class="point">摄像头(相机)、相册(存储)权限</text>。 如您拒绝授权,将无法使用即时通讯工具的上传、发送图片的功能,但不影响您使用样叽的其他功能。
+								<text class="point">\n1.6 搜索\n</text>
+								为了便于您使用搜索功能,寻找与您需求匹配的服务提供者,我们会收集您的搜索关键字信息。
+								<text class="point">\n1.7 个性化推荐\n</text>
+								1.7.1为了向您展示、推荐相关性更高的信息,提供更契合您要求的服务,样叽会为您提供个性化推荐服务。
+								1.7.2我们提供个性化推荐服务的范围包括展示创作者、任务、图文或视频等内容,提供搜索结果等。
+								1.7.3为了预测您的偏好,我们可能会收集、使用您的设备信息以及在使用产品时的行为信息,行为信息包括您在访问/使用产品时的点击、关注、收藏、搜索、查询、浏览、下载(图片)、分享及交易的操作相关记录。我们会对上述信息进行自动分析和计算,系统会根据计算结果自动筛选出你可能更感兴趣的内容进行展示。
+								1.7.4我们会根据您在使用产品过程中的浏览行为对推荐模型进行实时反馈,不断调整优化推荐结果,更好地向您提供优质内容。
+								<text class="point">\n1.8 任务完成反馈\n</text>
+								任务完成后,您可以使用反馈功能,我们会收集您对任务完成情况的反馈内容,但不会公开展示。
+								<text class="point">\n1.9 运营与安全运行/保障\n</text>
+								<text class="point">1.9.1运营与安全保障\n</text>
+								我们致力于为您提供安全、可信的产品与使用环境,提供优质而可靠的服务与信息是我们的核心目标。为了维护我们服务的正常运行,保护您或其他用户或公众的合法利益免受损失,我们会收集用于维护产品或服务安全稳定运行的必要信息。
+								<text class="point">\n1.9.2设备信息与日志信息\n</text>
+								a.为了保障软件与服务的安全运行、运营的质量及效率,我们会收集您的操作系统版本号、IP 地址、操作、使用、服务日志。
+								b.为了预防恶意程序、保障运营质量及效率,我们会收集应用崩溃情况、性能数据。
+								c.我们可能使用您的账户信息、设备信息、服务日志信息以及我们关联方、合作方在获得您授权或依法可以提供的信息,用于判断账户及交易安全、进行身份验证、识别违法违规情况、检测及防范安全事件,并依法采取必要的记录、分析、处置措施。
+								<text class="point">\n1.10 收集、使用个人信息目的变更\n</text>
+								请您了解,随着我们业务的发展,可能会对样叽的功能和提供的服务有所调整变化。原则上,当新功能或服务与我们当前提供的功能或服务相关时,收集与使用的个人信息将与原处理目的具有直接或合理关联。在与原处理目的无直接或合理关联的场景下,我们收集、使用您的个人信息,会再次按照法律法规及国家标准的要求以页面提示、交互流程、协议确认方式另行向您进行告知说明,并征得您的同意。
+								<text class="point">\n1.11 征得授权同意的例外\n</text>
+								请您理解,在下列情形中,根据法律法规及相关国家标准,我们收集和使用您的个人信息不必事先征得您的授权同意:
+								a.与我们履行法律法规规定的义务相关的;
+								b.与国家安全、国防安全直接相关的;
+								c.与公共安全、公共卫生、重大公共利益直接相关的;
+								d.与刑事侦查、起诉、审判和判决执行等直接相关的;
+								e.出于维护您或他人的生命、财产等重大合法权益但又很难得到本人授权同意的;
+								f.您自行向社会公众公开的个人信息;
+								g.根据个人信息主体要求签订和履行合同所必需的;
+								h.从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;
+								i.用于维护软件及相关服务的安全稳定运行所必需的,例如发现、处置软件及相关服务的故障;
+								j.为开展合法的新闻报道所必需的;
+								k.为学术研究机构,基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
+								l.法律法规规定的其他情形。
+								<text
+									class="point1">\n特别提示您注意,如信息无法单独或结合其他信息识别到您的个人身份,其不属于法律意义上您的个人信息;当您的信息可以单独或结合其他信息识别到您的个人身份时或我们将无法与任何特定个人信息建立联系的数据与其他您的个人信息结合使用时,这些信息在结合使用期间,将作为您的个人信息按照本隐私政策处理与保护。</text>
+								<text class="title1">\n\n二、我们如何使用cookie等同类技术\n\n</text>
+								Cookie和设备信息标识等同类技术是互联网中普遍使用的技术。当您使用样叽及相关服务时,我们可能会使用相关技术向您的设备发送一个或多个 Cookie
+								或匿名标识符,以收集、标识和存储您访问、使用本产品时的信息。我们承诺,不会将 Cookie 用于本隐私政策所述目的之外的任何其他用途。我们使用 Cookie
+								和同类技术主要为了实现以下功能或服务:
+								<text class="point">\n2.1 保障产品与服务的安全、高效运转\n</text>
+								我们可能会设置认证与保障安全性的 cookie
+								或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈及其他不法行为。这些技术还会帮助我们改进服务效率,提升登录和响应速度。
+								<text class="point">\n2.2 帮助您获得更轻松的访问体验\n</text>
+								使用此类技术可以帮助您省去重复您填写个人信息、输入搜索内容的步骤和流程(示例:记录搜索、表单填写)。
+								<text class="point">\n2.3 为您推荐、展示、推送您可能感兴趣的内容或帐号\n</text>
+								2.3.1我们可能会利用 Cookie 和同类技术了解您的偏好和使用习惯,进行数据分析,以改善产品服务、推荐用户感兴趣的信息或功能。
+								2.3.2在样叽的分享页中,我们可能会使用cookie对浏览活动进行记录,用于向您推荐信息和排查崩溃、延迟的相关异常情况以及探索更好的服务方式。
+								<text class="point">\n2.4 cookie的清除\n</text>
+								大多数浏览器均为用户提供了清除浏览器缓存数据的功能,您可以在浏览器设置功能中进行相应的数据清除操作。如您进行清除,可能因为这些修改,您可能无法使用依赖于Cookie由公司提供的服务或相应功能。
+								<text class="title1">\n\n三、数据使用过程中涉及的合作方以及转移、公开个人信息\n\n</text>
+								<text class="point">3.1数据使用过程中涉及的合作方\n</text>
+								<text class="point">3.1.1 原则\n</text>
+								a.合法原则:与合作方合作过程中涉及数据使用活动的,必须具有合法目的、符合法定的合法性基础。如果合作方使用信息不再符合合法原则,则其不应再使用你的个人信息,或在获得相应合法性基础后再行使用。
+								b.正当与最小必要原则:数据使用必须具有正当目的,且应以达成目的必要为限。
+								c.安全审慎原则: 我们将审慎评估合作方使用数据的目的,对这些合作方的安全保障能力进行综合评估,并要求其遵循合作法律协议。
+								<text class="point">\n3.1.2 委托处理\n</text>
+								对于委托处理个人信息的场景,我们会与受托合作方根据法律规定签署相关处理协议,并对其个人信息使用活动进行监督。
+								<text class="point">\n3.1.3 共同处理\n</text>
+								对于共同处理个人信息的场景,我们会与合作方根据法律规定签署相关协议并约定各自的权利和义务,确保在使用相关个人信息的过程中遵守法律的相关规定、保护数据安全。
+								<text class="point">\n3.1.4 合作方的范围\n</text>
+								若具体功能和场景中涉及由我们的关联方、第三方提供服务,则合作方范围包括我们的关联方与第三方。
+								<text class="point">\n3.1.5 实现功能或服务的数据使用\n</text>
+								a.当你在使用样叽中由我们的合作方提供的功能,或者当软件服务提供商、智能设备提供商、系统服务提供商与我们联合为你提供服务时我们可能会与其使用为实现业务目的所必需的信息,用以向你推荐、展示或推送你可能感兴趣的信息,或者推送更适合你的特定功能、服务。
+								b.在你使用身份认证的功能或相关服务所需时,根据相关法律法规、安全保障要求可能需要完成实名认证以验证你的身份。<text
+									class="point1">在实名认证的过程中,与我们合作的认证服务机构需要使用你的真实姓名、身份证号码、手机号码及人脸信息。部分信息是个人敏感信息,拒绝上述使用将导致你无法完成身份认证,但不会影响样叽其他功能的正常使用。这些信息仅供实名认证及法律法规所规定的用途,未经你的明示授权,不会用作其他目的。\n</text>
+								c.支付功能:支付功能由与我们合作的第三方支付机构向你提供服务。第三方支付机构为提供功能将使用你的姓名、银行卡类型及卡号、有效期、<text
+									class="point1">身份证号码、支付金额</text>及手机号码。这些信息是支付功能所必需的信息,拒绝上述使用将导致你无法使用该功能,但不影响其他功能的正常使用。
+								d.客户服务:为及时处理你的投诉、建议以及其他诉求,客户服务提供商需要使用你的帐号及所涉及事件的相关信息,以及时了解、处理和响应相关问题。
+								<text class="point">\n3.1.6 实现安全与分析统计的数据使用\n</text>
+								a.保障使用安全:我们非常重视帐号、服务及内容安全,为保障你和其他用户的帐号与财产安全,使你和我们的正当合法权益免受不法侵害,我们的合作方可能会使用必要的帐号及日志信息。
+								b.分析产品情况:为分析我们产品的使用和表现情况,我们的合作方可能需要使用该产品使用情况等信息。
+								c.为提升相关领域的科研能力,促进科技发展水平,我们在确保数据安全与目的正当的前提下,可能会与合作的科研院所、高校等机构使用去标识化或匿名化的数据。
+								<text class="point">\n3.1.7 帮助你参加营销推广活动\n</text>
+								当你选择参加我们及我们的合作方举办的有关营销活动时,为保障你在联合活动中获得体验一致的服务,或委托合作方及时向你兑现奖励,我们与我们的合作方可能需要使用你的姓名、通信地址、联系方式、银行帐号信息(不同活动中使用的信息可能存在差异,具体以活动规则为准)。拒绝上述使用可能会影响你参加相关活动,但不会影响其他功能。
+								<text class="point">\n3.2 转移\n</text>
+								随着我们业务的持续发展,我们将有可能进行合并、收购、资产转让,你的个人信息有可能因此而被转移。在发生前述变更时,我们将按照法律法规及不低于本隐私政策所载明的安全标准要求继受方继续履行个人信息处理者的义务,若继受方变更原先的处理目的、处理方式的,我们将要求继受方重新征得你的授权同意。
+								<text class="point">\n3.3 公开\n</text>
+								对违规帐号、欺诈行为进行处罚公告时,我们会披露相关帐号的信息。除此之外,我们不会公开你的信息,除非遵循国家法律法规规定或者获得你的同意。我们公开你的个人信息会采用符合行业内标准的安全保护措施。
+								<text class="point">\n3.4 依法豁免征得同意提供、公开的个人信息\n</text>
+								请你理解,在下列情形中,根据法律法规及国家标准,我们向合作方提供、公开你的个人信息无需征得你的授权同意:
+								a.为订立、履行你作为一方当事人的合同所必需,或者按照依法制定的劳动规章制度和依法签订的集体合同实施人力资源管理所必需;
+								b.为履行法定职责或者法定义务所必需;
+								c.与国家安全、国防安全直接相关的;
+								d.与刑事侦查、起诉、审判和判决执行等直接相关的;
+								e.为应对突发公共卫生事件,或者紧急情况下为保护自然人的生命健康和财产安全所必需;
+								f.为公共利益实施新闻报道、舆论监督等行为,在合理的范围内处理个人信息;
+								g.依照相关法律规定处理你自行公开或者其他已经合法公开的个人信息;
+								h.从合法公开披露的信息中收集个人信息的;
+								i.法律、行政法规规定的其他情形。
+								<text class="title1">\n\n四、我们如何存储个人信息\n\n</text>
+								<text class="point">4.1 存储地点\n</text>
+								我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们向境外传输,会严格遵守中国的相关法律、监管政策,并会遵循相关国家规定或者征求您的同意。
+								<text class="point">\n4.2 存储期限\n</text>
+								4.2.1 我们仅在为提供样叽服务之目的所必需的期间内保留您的个人信息,例如:
+								手机号码:当您使用手机号码注册登录时,我们需要持续保留您的手机号码,以便于向您提供正常的服务、应对您可能的查询和客诉并保障您的帐号和系统安全。
+								4.2.2 如果您注销帐户、主动删除个人信息或超出必要的期限后,我们将对您的个人信息进行删除或匿名化处理,但以下情况除外:
+								遵从法律法规有关信息留存的要求(例如:《电子商务法》规定:商品和服务信息、交易信息保存时间自交易完成之日起不少于三年)。
+								出于财务、审计、争议解决等目的需要合理延长期限的。
+								<text class="title1">\n\n五、我们如何保护个人信息的安全\n\n</text>
+								5.1我们非常重视您个人信息的安全,将努力采取合理的安全措施(包括技术方面和管理方面)来保护您的个人信息,防止您提供的个人信息被不当使用或未经授权的情况下被访问、公开披露、使用、修改、损坏、丢失或泄漏。
+								5.2我们会使用不低于行业同行的加密技术、匿名化处理及相关合理可行的手段保护您的个人信息,并使用安全保护机制防止您的个人信息遭到恶意攻击。
+								5.3我们会建立专门的安全部门、安全管理制度、数据安全流程保障您的个人信息安全。我们采取严格的数据使用和访问制度,确保只有授权人员才可访问您的个人信息,并适时对数据和技术进行安全审计。
+								<text
+									class="point1">\n5.4尽管已经采取了上述合理有效措施,并已经遵守了相关法律规定要求的标准,但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全,我们将尽力确保您提供给我们的个人信息的安全性。</text>
+								<text
+									class="point1">\n5.5您知悉并理解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定期修改密码、不将自己的帐号密码及相关个人信息透露给他人。\n</text>
+								5.6我们会制定应急处理预案,并在发生用户信息安全事件时立即启动应急预案,努力阻止这些安全事件的影响和后果扩大。一旦发生用户信息安全事件(泄露、丢失)后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已经采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施。我们将及时将事件相关情况以推送通知、邮件、信函、短信及相关形式告知您,难以逐一告知时,我们会采取合理、有效的方式发布公告。同时,我们还将按照相关监管部门要求,上报用户信息安全事件的处置情况。
+								5.7您一旦离开样叽及相关服务,浏览或使用其他网站、服务及内容资源,我们将没有能力和直接义务保护您在样叽及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、网站是否基于样叽的链接或引导。
+								<text class="title1">\n\n六、管理您的个人信息\n\n</text>
+								我们非常重视您对个人信息的管理,并尽全力保护您对于您个人信息的权利,以使您有能力保障您的隐私和信息安全。
+								<text class="point">\n6.1 您的个人信息权利\n</text>
+								<text class="point">6.1.1 查阅、复制帐号信息\n</text>
+								您可以通过“登录样叽-我的账号信息”查阅、复制、更正您的手机号、联系邮箱等信息。
+								特别提示您注意,出于安全性和身份识别(如号码申诉服务)的考虑,您可能无法自主修改注册时提交的某些初始注册信息。如您确有需要修改该类注册信息,请根据本隐私政策载明的联系方式联系我们。
+								除上述外,如果您或其他有权主体对相关法律法规赋予的个人信息权利的行使,有任何主张、要求或者疑问,客户通过bd@younggee.com;创作者通过czh@younggee.com,或可通过客服联系我们,我们将尽快审核所涉问题,并在验证您的用户身份后的十五个工作日内回复。
+								<text class="point">\n6.2 注销帐号\n</text>
+								您可以通过本协议文末的“联系我们”中的联系方式与我们联系申请注销您的帐号,我们将会在收到您的申请后及时进行处理,并在15个工作日或法律法规要求的时限内回复您的请求。在您注销帐号前,我们将验证您的个人身份、安全状态、设备信息等。您知悉并理解,注销帐号是不可逆的行为,当您注销帐号后,我们将删除有关您的相关信息或进行匿名化处理,但法律法规另有规定的除外。
+								有关注销的流程和内容,客户通过bd@younggee.com;创作者通过czh@younggee.com,或可通过客服联系我们。
+								<text class="point">\n6.3 意见反馈和投诉举报\n</text>
+								您可以按照我们公示的制度进行投诉或举报。如果您有任何意见或您认为您的个人信息权利可能受到侵害,或者发现侵害个人信息权利的线索,您可以通过本协议文末的“联系我们”中的联系方式与我们联系。
+								平台为了给您提供更好的服务,
+								(1)在处理您的投诉时,为保障服务质量,我们可能会对通话进行录音;
+								(2)在处理您的投诉时,我们将使用通话录音了解您与其他用户的沟通情况以处理前述事宜;
+								(3)在处理您的申诉时,我们将使用通话录音了解您与其他用户的沟通情况以处理前述事宜。
+								在严格控制好权限范围的前提下,我们将始终坚持以最小必要原则来使用录音。如果您认为我们收集了不应该收集的录音信息,请您通过文末的“联系我们”中的联系方式及时联系我们进行删除。
+								<text class="point">\n6.4 访问隐私政策\n</text>
+								您打开样叽平台首页,通过登录的途径即可查看本隐私政策。
+								请您了解,本隐私政策中所述的样叽及相关服务可能会根据您所使用的系统版本等因素而有所不同。最终的产品和服务以您所使用的样叽平台及相关服务为准。
+								<text class="point">\n6.5 停止运营并向您告知\n</text>
+								如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。
+								<text class="title1">\n\n七、未成年人条款\n\n</text>
+								样叽主要面向成年人,如果您认为我们在无意间收集了未获得许可的未成年人信息,请通过文末的“联系我们”中的联系方式与我们联系以便我们可以尽快删除这些信息。
+								<text class="title1">\n\n八、隐私政策的修订和通知\n\n</text>
+								8.1为了给您提供更好的服务,样叽及相关服务将不时更新与变化,我们会适时对本隐私政策进行修订,这些修订构成本隐私政策的一部分并具有等同于本隐私政策的效力,未经您明确同意,我们不会削减您依据当前生效的本隐私政策所应享受的权利。
+								8.2本隐私政策更新后,我们会在样叽发出更新版本,并在更新后的条款生效前通告样叽平台公告或其他适当的方式提醒您更新的内容,以便您及时了解本隐私政策的最新版本。
+								<text class="title1">\n\n九、联系我们\n\n</text>
+								9.1样叽平台由北京火乐星球科技有限公司提供,如果您对个人信息保护问题有投诉、建议、疑问,客户通过bd@younggee.com;创作者通过czh@younggee.com,或可通过客服联系我们,我们核查并验证您的用户身份后会及时反馈您的投诉与举报。
+								9.2如对本隐私政策内容有任何疑问、意见或建议,客户通过bd@younggee.com;创作者通过czh@younggee.com,或可通过客服联系我们,我们将在验证您的用户身份后的十五个工作日内回复。
+							</text>
+						</scroll-view>
+					</view>
+				</view>
+			</uni-popup>
+		</view>
+
+	</view>
 </template>
 
 <script>
@@ -92,7 +546,12 @@
 		},
 		onLoad() {},
 		methods: {
-
+			showXieyi() {
+				this.$refs.popup3.open()
+			},
+			showYinsi() {
+				this.$refs.popup4.open()
+			},
 			select() {
 				console.log(this.value)
 			},
@@ -130,7 +589,6 @@
 						uni.setStorageSync('avatarUrl', res.userInfo.avatarUrl);
 						try {
 							this.login();
-
 						} catch (e) {}
 					},
 					fail: (res) => {
@@ -140,7 +598,7 @@
 			},
 			// 获取手机号
 			onGetPhoneNumber(e) {
-				if (e.detail.errMsg == "getPhoneNumber:fail user deny") { //用户决绝授权  
+				if (e.detail.errMsg === "getPhoneNumber:fail user deny") { //用户决绝授权  
 					//拒绝授权后弹出一些提示  
 				} else {
 					//允许授权  
@@ -168,7 +626,7 @@
 									nickname: _this.nickname
 								})
 								.then(res => {
-									if (res.data.code == -6) {
+									if (res.data.code === -6) {
 										uni.showToast({
 											title: '您已被拉黑,请联系客服',
 											icon: 'none',
@@ -178,33 +636,42 @@
 										console.log(res)
 										uni.setStorageSync('token', res.data.data.token);
 										uni.setStorageSync('cookie', res.header['Set-Cookie']);
-										uni.navigateBack()
+										let url = uni.getStorageSync('url')
+										console.log(url)
+										//判断缓存中是否有url
+										if (url) {
+											if (url === 'pages/tasksquare/tasksquare') {
+												uni.reLaunch({
+													url: `/${url}`
+												})
+											} else if (url === 'pages/mycenter/mycenter') {
+												uni.reLaunch({
+													url: `/${url}`
+												})
+											} else if (url === 'pages/workspace/workspace') {
+												uni.reLaunch({
+													url: `/${url}`
+												})
+											} else {
+												uni.redirectTo({
+													url: `/${url}`
+												})
+											}
+										} else {
+											let pages = getCurrentPages(); // 当前页面
+											let beforePage = pages[pages.length - 2]; // 上一页
+											setTimeout(() => {
+												uni.navigateBack({
+													success: function() {
+														beforePage
+															.onLoad(); // 执行上一页的onLoad方法
+													}
+												})
+												uni.navigateBack()
+											})
+										}
 									}
 								})
-							// uni.request({
-							// 	url: 'http://localhost:8199/youngee/c/p/login', //演示地址,请以你的后端接口为准  
-							// 	method: 'POST',
-							// 	data: {
-							// 		code: res.code, //wx.login 登录成功后的code 
-							// 		gender: _this.gender,
-							// 		nickname: _this.nickname
-							// 	},
-							// 	success: (cts) => {
-							// 		if (cts.data.code == -6) {
-							// 			uni.showToast({
-							// 				title: '您已被拉黑,请联系客服',
-							// 				icon: 'none',
-							// 				duration: 2000
-							// 			});
-							// 		} else {
-
-							// 			console.log(cts)
-							// 			uni.setStorageSync('token', cts.data.data.token);
-							// 			uni.setStorageSync('cookie', cts.header['Set-Cookie']);
-							// 			uni.navigateBack()
-							// 		}
-							// 	}
-							// });
 						} else {
 							uni.showToast({
 								title: '登录失败!',
@@ -234,6 +701,27 @@
 	}
 </style>
 <style lang="scss" scoped>
+	.title {
+		text-align: center;
+		font-size: 20pt;
+		font-weight: bold;
+		margin: 20px;
+	}
+
+	.title1 {
+		font-weight: 600;
+		padding: 20rpx 0;
+	}
+
+	.point {
+		font-weight: 600;
+	}
+
+	.point1 {
+		font-weight: 600;
+		border-bottom: 1rpx solid #000000;
+	}
+
 	.head {
 		display: flex;
 		align-items: center;
@@ -246,6 +734,7 @@
 	.head-image {
 		display: inline-block;
 		margin: 0 50rpx 0 150rpx;
+		padding: 10rpx 10rpx 0 0;
 		width: 160rpx;
 		height: 160rpx;
 		background-color: #F0D232;

+ 140 - 0
pages/mycenter/message.vue

@@ -0,0 +1,140 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view v-for="item in messageList">
+			<view class="message-list-cell">
+				<view class="message-list-cell-left">
+					<image :src="item.icon_url" style="height: 70rpx;width: 70rpx"></image>
+					<view class="message-list-cell-left-txt">
+						<p style="font-weight: 600;margin-bottom: 10rpx;">{{item.project_name}}</p>
+						<p>{{item.message_content}}</p>
+					</view>
+				</view>
+				<view class="message-list-cell-right">
+					<image src="../../static/img/delete.png" style="height: 50rpx;width: 50rpx"
+						@click="delMessage(item)"></image>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				messageTextList: [],
+				messageIconList: [
+					"https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-success.png",
+					"https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-notice.png",
+					"https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-error.png",
+					"https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-warning.png"
+				],
+				messageList: [],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "通知",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "/pages/mycenter/mycenter",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+		async onShow() {
+			// 显示加载中
+			uni.showLoading({
+				title: '加载中'
+			});
+			await this.getInfoList();
+			await this.getMessage();
+			uni.hideLoading();
+			this.setRead();
+		},
+
+		onLoad() {},
+		methods: {
+			getInfoList() {
+				return this.$http.get('/youngee/c/g/get-info-tables')
+					.then(res => {
+						this.messageTextList = res.data.data.MessageInfo
+					})
+			},
+			getMessage() {
+				return this.$https.get('/youngee/c/t/g/get-message')
+					.then(res => {
+						this.messageList = res.data.data
+						if (this.messageList !== null) {
+							for (let i = 0; i < this.messageList.length; ++i) {
+								let messageId = this.messageList[i].message_id
+								let messageType = this.messageList[i].message_type
+								this.messageList[i].message_content = this.messageTextList[messageId - 1].text
+								this.messageList[i].icon_url = this.messageIconList[messageType - 1]
+							}
+						}
+					})
+			},
+			setRead() {
+				return this.$https.post('/youngee/c/t/p/set-message-read')
+					.then(res => {})
+			},
+			async delMessage(item) {
+				// 在前端消息列表中删除该消息
+				var i = this.messageList.indexOf(item)
+				this.messageList.splice(i, 1)
+
+				// 调用后端接口将该消息设为已读
+				return this.$https.post('/youngee/c/t/p/delete-message', {
+					message_id: item.id
+				}).then(res => {})
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	p {
+		font-size: 32rpx;
+	}
+
+	.message-list-cell {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin: 20rpx 5rpx;
+		padding: 30rpx;
+		box-shadow: 0 0 5px rgba(0, 0, 0, .1);
+	}
+
+	.message-list-cell-left {
+		display: flex;
+		align-items: center;
+	}
+
+	.message-list-cell-left-txt {
+		margin-left: 20rpx;
+	}
+</style>

+ 259 - 149
pages/mycenter/mycenter.vue

@@ -5,51 +5,86 @@
 		<view style="margin-top: 160rpx;"></view>
 		<view>
 			<view class="head" v-if="token">
-				<view class="head-avator">
-					<image :src="avatarUrl" mode="" style="border-radius: 50%; width: 100%;height: 100%;">
-					</image>
+				<view class="head-left">
+					<view class="head-avator">
+						<image :src="avatarUrl" mode="" style="width: 100%;height: 100%;" />
+					</view>
+					<view>
+						<p style="padding-bottom: 20rpx;font-size: 35rpx;">{{information.talent_wx_nickname}}</p>
+						<span style="display: flex;align-items: center;">
+							<p style="font-size: 25rpx;">ID:{{information.id}}</p>
+							<image :src="picture.icon_copy" mode="" style="width: 40rpx;height: 40rpx;"
+								@click="handleCopy()" />
+						</span>
+					</view>
 				</view>
-				<view>
-					<p style="padding-bottom: 20rpx;font-size: 35rpx;">{{information.talent_wx_nickname}}</p>
-					<p style="font-size: 25rpx;">ID:{{information.id}}</p>
+				<view class="head-right">
+					<image class="head-message" :src="picture.icon_message" @click="toMessage()"></image>
+					<view v-if="hasUnReadMessage">
+						<span class="point"></span>
+					</view>
 				</view>
-				<image class="head-message" :src="picture.icon_message"></image>
 			</view>
-			
+
 			<view class="head" v-if="!token">
-				<view class="head-avator">
-					<image :src="picture.defaultavatarUrl" mode="" @tap="login"
-						style="border-radius: 50%; width: 100%;height: 100%;"></image>
-				</view>
-				<view class="head-text">
-					<p @tap="login" style="font-size: 35rpx;padding-bottom: 10rpx;">未登录</p>
-					<p @tap="login" style="font-size: 30rpx;">点击登录账号</p>
+				<view class="head-left">
+					<view class="default-head-avator">
+						<image :src="picture.defaultavatarUrl" mode="" @tap="login" style="width: 100%;height: 100%;">
+						</image>
+					</view>
+					<view class="head-text">
+						<p @tap="login" style="font-size: 35rpx;padding-bottom: 10rpx;">未登录</p>
+						<p @tap="login" style="font-size: 30rpx;">点击登录账号</p>
+					</view>
 				</view>
 			</view>
-			
+
 			<view class="show-income1">
-				<view class="show-income1-text">
-					<p>我获得的收益总数</p>
-					<p style="font-size: 40rpx;font-weight:bold;color: #F0D232;" @click="toincome('all')">
-						{{information.income?information.income:0}}
-					</p>
+				<view>
+					<view style="display: flex;align-items: center;">
+						<p>我获得的收益总数</p>
+						<image id="helpicon" :src="picture.icon_help" mode=""
+							style="width: 35rpx;height: 35rpx;padding-left: 10rpx;" @click="showHelp = true" />
+					</view>
+
+					<view class="tip_box" v-if="showHelp" :style="{ top: boxTop + 'px'}">
+						<view class="container" :style="{
+					  'margin-right': cotainerMargin + 'px',
+					  backgroundColor: '#404040', borderRadius: '5px' }">
+							<!-- 提示文字 -->
+							<view class="tips">
+								<p style="font-size: 24rpx;color: #fff">{{Text}}</p>
+							</view>
+							<view class="close" @click="showHelp = false">
+								<image class="closeImg" src="../../static/delete.png" />
+							</view>
+						</view>
+					</view>
 				</view>
-				<view class="show-income1-text2">
-					<button class="show-income1-btn" type="default" @click="withdraw()">提现</button>
+
+				<view class="show-income1-text">
+					<view>
+						<p style="font-size: 40rpx;font-weight:bold;color: #F0D232;" @click="toincome('can')">
+							{{information.showIncome?information.showIncome:'0.00'}}
+						</p>
+					</view>
+					<view>
+						<button class="show-income1-btn" type="default" @click="toincome('can')">去提现</button>
+					</view>
 				</view>
 			</view>
 			<view class="show-income2">
 				<view class="show-income2-text" @click="toincome('can')">
 					<p style="padding-bottom: 20rpx;">可提现</p>
-					<p>{{information.canwithdraw?information.canwithdraw:0}}</p>
+					<p>{{information.showCanwithdraw?information.showCanwithdraw:'0.00'}}</p>
 				</view>
 				<view class="show-income2-text" @click="toincome('ed')">
 					<p style="padding-bottom: 20rpx;">已提现</p>
-					<p>{{information.withdrawed?information.withdrawed:0}}</p>
+					<p>{{information.showWithdrawed?information.showWithdrawed:'0.00'}}</p>
 				</view>
 				<view class="show-income2-text" @click="toincome('ing')">
 					<p style="padding-bottom: 20rpx;">提现中</p>
-					<p>{{information.withdrawing?information.withdrawing:0}}</p>
+					<p>{{information.showWithdrawing?information.showWithdrawing:'0.00'}}</p>
 				</view>
 			</view>
 			<view class="show-body" style="border-bottom: 1rpx solid #c8c8c8;">
@@ -62,7 +97,7 @@
 					</view>
 				</view>
 				<view class="show-body2">
-					<view class="show-body2-text" style="padding-left: 30rpx;" @click="tomytask('all')">
+					<view class="show-body2-text" @click="tomytask('all')">
 						<p class="task-num-p">{{information.task_all?information.task_all:0}}</p>
 						<p padding>全部任务</p>
 					</view>
@@ -83,30 +118,10 @@
 			</view>
 
 			<view class="show-body">
-				<view class="show-body1">
-					<view class="show-body1-text1">
-						<p>我的信息</p>
-					</view>
-					<view class="show-body1-text2">
-						<image class="show-body1-icon" :src="picture.icon_right"></image>
-					</view>
-				</view>
 				<view class="show-info">
-					<view class="show-info-text" @click="personinfo()">
+					<view class="show-info-text" @click="handleInformation()">
 						<image class="show-info-icon" :src="picture.icon_person"></image>
-						<p>个人资料</p>
-					</view>
-					<view class="show-info-text" @click="mylocation()">
-						<image class="show-info-icon" :src="picture.icon_location"></image>
-						<p>收货地址</p>
-					</view>
-					<view class="show-info-text" @click="myaccount()">
-						<image class="show-info-icon" :src="picture.icon_account"></image>
-						<p>社媒账号</p>
-					</view>
-					<view class="show-info-text" @click="mybank()">
-						<image class="show-info-icon" :src="picture.icon_rmb"></image>
-						<p>提现绑定</p>
+						<p>我的信息</p>
 					</view>
 				</view>
 			</view>
@@ -179,18 +194,32 @@
 			</uni-popup>
 		</view>
 
+		<!-- </view> -->
 	</view>
 </template>
 
 <script>
 	import mvBar from "@/components/mys_navBar/mysNavBar";
+	// import getRouter from '@/components/utils.js';
+	import {
+		money
+	} from '@/components/utils.js';
 	export default {
 		components: {
 			mvBar,
 		},
 		data() {
 			return {
+				hasUnReadMessage: false,
+				Text: "在平台产生的总收益【可提现+已提现+提现中】",
+				showHelp: false,
+				boxTop: 0,
+				arrowMargin: 0,
+				cotainerMargin: 0,
+				screenWidth: 0,
 				picture: {
+					icon_help: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-help.png',
+					icon_copy: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-copy.png',
 					icon_person: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-person.png',
 					icon_location: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-location.png',
 					icon_account: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-account.png',
@@ -223,61 +252,82 @@
 				information: {},
 			};
 		},
-		onShow() {
+		onReady() {
+			this.init()
+		},
+		async onShow() {
 			// 显示加载中
 			uni.showLoading({
 				title: '加载中'
 			});
-
-			// 判断是否登录
-			this.isLogin()
-			if (this.token !== '') { // 若登录
-				this.nickName = uni.getStorageSync('nickName')
-				this.avatarUrl = uni.getStorageSync('avatarUrl')
-				
-				this.gettalentinfo()	// 获取达人基本信息
-				this.getTaskNum()	// 获取参与任务数量
-			} else { // 未登录
-				uni.hideLoading();
-			}
-		},
-		onLoad() {},
-		methods: {
 			// 判断登陆是否过期
-			isLogin() {
-				if (this.token == '') {
-					this.token = uni.getStorageSync('token')
-				}
-				this.$https.get('/youngee/c/t/g/is-login')
+			this.token = uni.getStorageSync('token')
+			await this.$https.get('/youngee/c/t/g/is-login')
+				.then(res => {
+					if (res.data.code == 403) {
+						this.token = ""
+						uni.hideLoading();
+					}
+				})
+			if (this.token !== '') { // 若登录
+				this.nickName = uni.getStorageSync('nickName');
+				this.avatarUrl = uni.getStorageSync('avatarUrl');
+
+				// 获取达人基本信息
+				await this.$https.get('/youngee/c/t/g/get-talent-info')
 					.then(res => {
-						console.log(res)
-						if (res.data.code == 403) {
-							this.token = ""
-							uni.clearStorage();
+						if (res.data.code === 0) {
+							this.information = res.data.data
+							this.information.showWithdrawing = money(this.information.withdrawing)
+							this.information.showWithdrawed = money(this.information.withdrawed)
+							this.information.showCanwithdraw = money(this.information.canwithdraw)
+							this.information.showIncome = money(this.information.income)
 						}
-					})
-			},
-			// 获取达人基本信息
-			gettalentinfo() {
-				this.$https.get('/youngee/c/t/g/get-talent-info')
+					});
+				// 获取达人参与任务数量
+				await this.$https.get('/youngee/c/t/g/get-task-num')
 					.then(res => {
 						console.log(res)
-						this.information = res.data.data
+						if (res.data.code === 0) {
+							this.information.task_all = res.data.data.all_num
+							this.information.task_apply = res.data.data.sign_up_num
+							this.information.task_execute = res.data.data.going_on_num
+							this.information.task_end = res.data.data.completed_num
+						}
 					})
-			},
-			// 获取达人参与任务数量
-			getTaskNum() {
-				this.$https.get('/youngee/c/t/g/get-task-num')
+				await this.$https.get('/youngee/c/t/g/has-un-read-message')
 					.then(res => {
-						console.log(res)
-						this.information.task_all = res.data.data.all_num
-						this.information.task_apply = res.data.data.sign_up_num
-						this.information.task_execute = res.data.data.going_on_num
-						this.information.task_end = res.data.data.completed_num
-
-						uni.hideLoading();
-
+						this.hasUnReadMessage = res.data.data === 0 ? false : true;
 					})
+			} else { // 未登录
+				// this.login();
+			}
+			uni.hideLoading();
+		},
+		onLoad() {},
+		methods: {
+			init() {
+				let rect = uni.getMenuButtonBoundingClientRect();
+				let screenWidth = uni.getSystemInfoSync().screenWidth;
+				// this.boxTop = rect.bottom;
+				this.arrowMargin = rect.width * 0.75 + 4;
+				this.cotainerMargin = screenWidth - rect.right;
+
+				var that = this;
+
+				const query = uni.createSelectorQuery().in(that);
+				query.select('#helpicon').boundingClientRect(data => {
+					this.boxTop = data.bottom;
+					console.log(data)
+				}).exec();
+			},
+			handleCopy() {
+				wx.setClipboardData({
+					data: this.information.id,
+					success: function(res) {
+						console.log("复制成功");
+					}
+				});
 			},
 			// 进入登录页面
 			login() {
@@ -285,78 +335,58 @@
 					url: '../login/login'
 				});
 			},
-			// 进入个人资料
-			personinfo() {
-				if (this.token !== '')
-					uni.navigateTo({
-						url: '/pages/mycenter/myinformation/personinfo'
-					});
-				else
-					this.login()
-			},
-			// 进入收货地址
-			mylocation() {
-				if (this.token !== '')
-					uni.navigateTo({
-						url: '/pages/mycenter/myinformation/mylocation'
-					});
-				else
-					this.login()
-			},
-			// 进入社媒账号
-			myaccount() {
-				if (this.token !== '')
-					uni.navigateTo({
-						url: '/pages/mycenter/myinformation/myaccount'
-					});
-				else
-					this.login()
+			// 进入通知页面
+			toMessage() {
+				uni.navigateTo({
+					url: 'message'
+				});
 			},
-			// 进入个人账号页面
-			mybank() {
+			// 进入个人资料
+			handleInformation() {
 				if (this.token !== '')
 					uni.navigateTo({
-						url: '/pages/mycenter/myinformation/mybank'
+						url: '/pages/mycenter/myinformation/myinformation'
 					});
 				else
 					this.login()
 			},
-			// 提现
-			withdraw() {
-				console.log("提现")
-			},
 			// 进入收益页面
 			toincome(tab) {
 				console.log(tab)
-			},
-			// 进入我的任务页面
-			tomytask(tab) {
 				if (this.token !== '') {
 					switch (tab) {
-						case "all":
+						case "can":
 							uni.navigateTo({
-								url: '/pages/mycenter/mytask/mytask'
+								url: '/pages/mycenter/myincome?showTab=1'
 							});
 							break;
-						case "execute":
+						case "ed":
 							uni.navigateTo({
-								url: '/pages/mycenter/mytask/executetask'
+								url: '/pages/mycenter/myincome?showTab=2'
 							});
 							break;
-						case "apply":
+						case "ing":
 							uni.navigateTo({
-								url: '/pages/mycenter/mytask/applytask'
-							});
-							break;
-						case "end":
-							uni.navigateTo({
-								url: '/pages/mycenter/mytask/endtask'
+								url: '/pages/mycenter/myincome?showTab=3'
 							});
 							break;
 					}
 				} else
 					this.login()
+			},
+			// 进入我的任务页面
+			tomytask(tab) {
 				console.log(tab)
+				if (this.token !== '') {
+					var data = {
+						tab: tab
+					};
+					data = JSON.stringify(data)
+					uni.navigateTo({
+						url: '/pages/mycenter/mytask/mytask?textObj=' + encodeURIComponent(data)
+					});
+				} else
+					this.login()
 			},
 			// 保留两位小数点
 			toDecimal(x) {
@@ -400,18 +430,38 @@
 </style>
 <style lang="scss" scoped>
 	p {
-		font-size: 30rpx;
+		font-size: 32rpx;
 	}
 
 	.head {
 		display: flex;
 		/* 垂直居中 */
 		align-items: center;
+		justify-content: space-between;
 		height: 200rpx;
 		position: relative;
 		margin: 2% 3% 3%;
 	}
 
+	.head-left {
+		display: flex;
+		align-items: center;
+	}
+
+	.head-right {
+		display: flex;
+	}
+
+	.default-head-avator {
+		display: inline-block;
+		margin: 0 25rpx;
+		padding: 10rpx 10rpx 0 0;
+		width: 120rpx;
+		height: 120rpx;
+		background-color: #F0D232;
+		border-radius: 50%;
+	}
+
 	.head-avator {
 		display: inline-block;
 		margin: 0 25rpx;
@@ -433,15 +483,16 @@
 	}
 
 	.show-income1 {
-		display: flex;
-		align-items: center;
-		height: 120rpx;
+		height: 150rpx;
 		margin: 0 3%;
 	}
 
 	.show-income1-text {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-top: 30rpx;
 		margin-left: 20rpx;
-		margin-right: 200rpx;
 	}
 
 	.show-income1-text2 {
@@ -454,8 +505,8 @@
 		text-align: center;
 		background-color: #F0D232;
 		border-radius: 15rpx;
-		font-size: 35rpx;
-		line-height: 180%;
+		font-size: 32rpx;
+		line-height: 200%;
 	}
 
 	.show-income2 {
@@ -466,10 +517,11 @@
 		margin: 0 3% 3%;
 		background-color: #F0D232;
 		border-radius: 10rpx;
+		padding: 0 40rpx;
 	}
 
 	.show-income2-text {
-		padding: 0 50rpx;
+		padding: 0 20rpx;
 		text-align: center;
 	}
 
@@ -505,13 +557,18 @@
 	}
 
 	.show-body2 {
+		// display: flex;
+		// align-items: center;
+		// justify-content: space-between;
+
 		display: flex;
 		align-items: center;
-		// justify-content: space-between;
+		justify-content: space-between;
+		padding: 0 40rpx;
 	}
 
 	.show-body2-text {
-		width: 150rpx;
+		// width: 150rpx;
 		text-align: center;
 	}
 
@@ -544,6 +601,7 @@
 	.show-info-icon {
 		width: 50rpx;
 		height: 50rpx;
+		padding-bottom: 20rpx;
 	}
 
 	.butto {
@@ -725,4 +783,56 @@
 		color: #FFFFFF;
 		line-height: 48rpx;
 	}
+
+	.tip_box {
+		position: fixed;
+		top: 0;
+		right: 0;
+		z-index: 9999;
+		display: flex;
+		justify-content: flex-end;
+		align-items: flex-end;
+		flex-direction: column;
+
+		.arrow {
+			width: 0;
+			height: 0;
+			border: 10rpx solid;
+			border-color: transparent;
+		}
+
+		.container {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 16rpx 24rpx;
+
+			.tips {
+				flex: 1;
+				padding-right: 12rpx;
+			}
+
+			.close {
+				display: flex;
+				align-items: center;
+				height: 30rpx;
+				width: 30rpx;
+
+				.closeImg {
+					height: 100%;
+					width: 100%;
+				}
+			}
+		}
+	}
+
+	.point {
+		position: absolute;
+		// top: 0;
+		right: 5px;
+		width: 6px;
+		height: 6px;
+		background: red;
+		border-radius: 50%;
+	}
 </style>

+ 579 - 0
pages/mycenter/myincome.vue

@@ -0,0 +1,579 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view>
+			<view class="show-income3">
+				<p style="font-weight: bold;">收益明细</p>
+				<view class="menu">
+					<view class="menu-item" @click="toShow1()">
+						<p v-bind:class="showList1?'lor':'unlor'">可提现</p>
+					</view>
+					<view class="menu-item" @click="toShow2()">
+						<p v-bind:class="showList2?'lor':'unlor'">已提现</p>
+					</view>
+					<view class="menu-item" @click="toShow3()">
+						<p v-bind:class="showList3?'lor':'unlor'">提现中</p>
+					</view>
+				</view>
+			</view>
+
+			<view class="income-list" v-if="showList1">
+				<checkbox-group @change="changeCheck">
+					<view class="income-list-cell" v-for="item in list1" :key="item.value">
+						<view class="income-list-cell-left">
+							<label>
+								<view>
+									<checkbox class="income-list-checkbox" :value="item.task_id"
+										:checked="item.checked" />
+								</view>
+							</label>
+							<view>
+								<p>任务ID:{{item.task_id}}</p>
+								<p>{{item.project_name}}</p>
+								<p>商品价值:{{item.product_price}}元</p>
+								<p>粉丝量{{item.RecruitStrategy.show_followers_low}}-{{item.RecruitStrategy.show_followers_up}}</p>
+								<p>稿费:{{item.RecruitStrategy.show_fee_form}} {{item.show_task_reward}}</p>
+								<p>提交时间:{{item.complete_date}}</p>
+							</view>
+						</view>
+
+						<view class="income-list-cell-right">
+							<p>+{{item.show_settle_amount}}</p>
+						</view>
+					</view>
+				</checkbox-group>
+			</view>
+
+			<view class="income-list" v-if="showList2">
+				<view class="income-list-cell" style="margin-left: 70rpx;" v-for="item in list2" :key="item.value">
+					<view class="income-list-cell-left">
+						<view>
+							<p>任务ID:{{item.task_id}}</p>
+							<p>{{item.project_name}}</p>
+							<p>商品价值:{{item.product_price}}元</p>
+							<p>粉丝量{{item.RecruitStrategy.show_followers_low}}-{{item.RecruitStrategy.show_followers_up}}</p>
+							<p>稿费:{{item.RecruitStrategy.show_fee_form}} {{item.show_task_reward}}</p>
+							<p>提交时间:{{item.withdraw_date}}</p>
+						</view>
+					</view>
+
+					<view class="income-list-cell-right">
+						<p>+{{item.show_settle_amount}}</p>
+					</view>
+				</view>
+			</view>
+
+			<view class="income-list" v-if="showList3">
+				<view class="income-list-cell" style="margin-left: 70rpx;" v-for="item in list3" :key="item.value">
+					<view class="income-list-cell-left">
+						<view>
+							<p>任务ID:{{item.task_id}}</p>
+							<p>{{item.project_name}}</p>
+							<p>商品价值:{{item.product_price}}元</p>
+							<p>粉丝量{{item.RecruitStrategy.show_followers_low}}-{{item.RecruitStrategy.show_followers_up}}</p>
+							<p>稿费:{{item.RecruitStrategy.show_fee_form}} {{item.show_task_reward}}</p>
+							<p>提交时间:{{item.withdraw_date}}</p>
+						</view>
+					</view>
+
+					<view class="income-list-cell-right">
+						<p>+{{item.show_settle_amount}}</p>
+					</view>
+				</view>
+			</view>
+
+			<view class="interval2"></view>
+			<view class="income-workList-buttons" v-if="showList1">
+				<view>
+					<label class="all-check-box left-btn">
+						<view>
+							<checkbox-group @change="changeAll">
+								<checkbox class="income-list-checkbox" :value="allCheck.value"
+									:checked="allCheck.checked" />
+							</checkbox-group>
+						</view>
+						<view style="display: flex;justify-content: center;align-items: center;">
+							<p>{{allCheck.name}}</p>
+						</view>
+					</label>
+				</view>
+
+				<view>
+					<button class="right-btn" type="primary" @click="withdraw()">提现</button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import {
+		getRouter,
+		money,
+		fansview
+	} from '@/components/utils.js';
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				// 测试数据
+				// list1: [{
+				// 	task_id: "001abandon",
+				// 	project_name: "PUYU朴郁小树茶冻干茶粉",
+				// 	product_price: 78,
+				// 	RecruitStrategy: {
+				// 		followers_low: "1万",
+				// 		followers_up: "3万",
+				// 		show_fee_form: "创作者自报价",
+				// 		offer: 350,
+				// 	},
+				// 	settle_amount: 350,
+				// 	complete_date: "2022-3-2 14:00",
+				// 	checked: false
+				// }, {
+				// 	task_id: "002abash",
+				// 	project_name: "Pisco生姜气泡饮料",
+				// 	product_price: 68,
+				// 	RecruitStrategy: {
+				// 		followers_low: "1万",
+				// 		followers_up: "3万",
+				// 		show_fee_form: "固定稿费",
+				// 		offer: 300,
+				// 	},
+				// 	settle_amount: 150,
+				// 	complete_date: "2022-3-2 14:00",
+				// 	checked: false
+				// }],
+				// list2: [{
+				// 	task_id: "003abash",
+				// 	project_name: "小鹏海南试驾",
+				// 	product_price: 68,
+				// 	RecruitStrategy: {
+				// 		followers_low: "1万",
+				// 		followers_up: "3万",
+				// 		show_fee_form: "固定稿费",
+				// 		offer: 4000,
+				// 	},
+				// 	settle_amount: 4000,
+				// 	complete_date: "2022-3-2 14:00",
+				// }, {
+				// 	task_id: "004abbreviate",
+				// 	project_name: "优衣库三里屯店新店开业",
+				// 	product_price: 100,
+				// 	RecruitStrategy: {
+				// 		followers_low: "5万",
+				// 		followers_up: "10万",
+				// 		show_fee_form: "固定稿费",
+				// 		offer: 1200,
+				// 	},
+				// 	settle_amount: 1200,
+				// 	complete_date: "2022-3-2 14:00",
+				// }],
+				// list3: [{
+				// 	task_id: "001abandon",
+				// 	project_name: "PUYU朴郁小树茶冻干茶粉",
+				// 	product_price: 78,
+				// 	RecruitStrategy: {
+				// 		followers_low: "1万",
+				// 		followers_up: "3万",
+				// 		show_fee_form: "创作者自报价",
+				// 		offer: 350,
+				// 	},
+				// 	settle_amount: 350,
+				// 	complete_date: "2022-3-2 14:00",
+				// }],
+
+				list1: [],
+				list2: [],
+				list3: [],
+				allCheck: {
+					name: '全选',
+					value: 'all',
+					checked: false
+				},
+				showTab: "",
+				showList1: true,
+				showList2: false,
+				showList3: false,
+				picture: {
+					icon_person: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-person.png',
+					icon_location: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-location.png',
+					icon_account: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-account.png',
+					icon_rmb: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-rmb.png',
+					icon_message: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-message.png',
+					icon_right: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-arrow-right.png',
+					defaultavatarUrl: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/logoxin01.png',
+				},
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "我的收益",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "/pages/mycenter/mycenter",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+				codeImg: '',
+				information: {},
+			};
+		},
+		async onShow() {
+			// 判断登录
+			await this.isLogin();
+			if (this.token === '') {
+				uni.showModal({
+					content: '请先登录',
+					success: function(res) {
+						if (res.confirm) {
+							uni.navigateTo({
+								url: '/pages/login/login'
+							});
+						} else if (res.cancel) {
+							uni.navigateBack();
+						}
+					}
+				});
+			} else {
+				this.getTaskInfo()
+			}
+		},
+		onLoad(options) {
+			getRouter();
+			console.log(options)
+			this.showTab = options.showTab
+			// 传过来的id
+			if (this.showTab == '1') {
+				this.toShow1();
+			} else if (this.showTab == '2') {
+				this.toShow2();
+			} else if (this.showTab == '3') {
+				this.toShow3();
+			}
+		},
+		methods: {
+			// 判断登陆是否过期
+			isLogin() {
+				return this.$https.get('/youngee/c/t/g/is-login')
+					.then(res => {
+						if (res.data.code === 403) {
+							// 登陆已失效
+							this.token = ""
+						} else {
+							this.token = uni.getStorageSync('token')
+						}
+					})
+			},
+			// 全选
+			changeAll: function(e) {
+				if (e.detail.value.length == 0) {
+					this.list1.map(item => this.$set(item, 'checked', false));
+					this.$set(this.allCheck, 'checked', false);
+				} else {
+					this.list1.map(item => this.$set(item, 'checked', true));
+					this.$set(this.allCheck, 'checked', true);
+				}
+			},
+			// 多选
+			changeCheck: function(e) {
+				var items = this.list1;
+				var len = this.list1.length;
+				var values = e.detail.value;
+				console.log(values)
+				for (var i = 0; i < len; i++) {
+					var item = items[i];
+					if (values.includes(String(item.task_id))) {
+						this.$set(item, 'checked', true);
+					} else {
+						this.$set(item, 'checked', false);
+					}
+				}
+				// 判断选中状态
+				var isAll = this.list1.every(item => item.checked == true)
+				isAll ? this.$set(this.allCheck, 'checked', true) : this.$set(this.allCheck, 'checked', false)
+			},
+
+			// 获取提现任务
+			getTaskInfo() {
+				return this.$https.get('/youngee/c/t/g/get-withdraw-task-info')
+					.then(res => {
+						this.list1 = []
+						this.list2 = []
+						this.list3 = []
+						// console.log(res)
+						if (res.data.data.can_withdraw_task_info_list != null) {
+							this.list1 = res.data.data.can_withdraw_task_info_list
+							for (let i = 0; i < this.list1.length; i++) {
+								this.list1[i].show_task_reward = money(this.list1[i].task_reward)
+								this.list1[i].show_settle_amount = money(this.list1[i].settle_amount)
+								this.list1[i].RecruitStrategy.show_followers_low = fansview(this.list1[i]
+									.RecruitStrategy.followers_low)
+								this.list1[i].RecruitStrategy.show_followers_up = fansview(this.list1[i]
+									.RecruitStrategy.followers_up)
+								switch (this.list1[i].RecruitStrategy.fee_form) {
+									case 1:
+										this.list1[i].RecruitStrategy.show_fee_form = "产品置换"
+										break
+									case 2:
+										this.list1[i].RecruitStrategy.show_fee_form = "固定稿费"
+										break
+									case 3:
+										this.list1[i].RecruitStrategy.show_fee_form = "自报价"
+										break
+								}
+							}
+						}
+						if (res.data.data.withdrawed_task_info_list != null) {
+							this.list2 = res.data.data.withdrawed_task_info_list
+							for (let i = 0; i < this.list2.length; i++) {
+								this.list2[i].show_task_reward = money(this.list2[i].task_reward)
+								this.list2[i].show_settle_amount = money(this.list2[i].settle_amount)
+								this.list2[i].RecruitStrategy.show_followers_low = fansview(this.list2[i]
+									.RecruitStrategy.followers_low)
+								this.list2[i].RecruitStrategy.show_followers_up = fansview(this.list2[i]
+									.RecruitStrategy.followers_up)
+								switch (this.list2[i].RecruitStrategy.fee_form) {
+									case 1:
+										this.list2[i].RecruitStrategy.show_fee_form = "产品置换"
+										break
+									case 2:
+										this.list2[i].RecruitStrategy.show_fee_form = "固定稿费"
+										break
+									case 3:
+										this.list2[i].RecruitStrategy.show_fee_form = "自报价"
+										break
+								}
+							}
+						}
+						if (res.data.data.withdrawing_task_info_list != null) {
+							this.list3 = res.data.data.withdrawing_task_info_list
+							for (let i = 0; i < this.list3.length; i++) {
+								this.list3[i].show_task_reward = money(this.list3[i].task_reward)
+								this.list3[i].show_settle_amount = money(this.list3[i].settle_amount)
+								this.list3[i].RecruitStrategy.show_followers_low = fansview(this.list3[i]
+									.RecruitStrategy.followers_low)
+								this.list3[i].RecruitStrategy.show_followers_up = fansview(this.list3[i]
+									.RecruitStrategy.followers_up)
+								switch (this.list3[i].RecruitStrategy.fee_form) {
+									case 1:
+										this.list3[i].RecruitStrategy.show_fee_form = "产品置换"
+										break
+									case 2:
+										this.list3[i].RecruitStrategy.show_fee_form = "固定稿费"
+										break
+									case 3:
+										this.list3[i].RecruitStrategy.show_fee_form = "自报价"
+										break
+								}
+							}
+						}
+					})
+			},
+			// 进入收益页面
+			toincome(tab) {
+				console.log(tab)
+			},
+			toShow1() {
+				this.showList2 = false;
+				this.showList3 = false;
+				this.showList1 = true;
+			},
+			toShow2() {
+				this.showList1 = false;
+				this.showList3 = false;
+				this.showList2 = true;
+			},
+			toShow3() {
+				this.showList2 = false;
+				this.showList1 = false;
+				this.showList3 = true;
+			},
+			withdraw() {
+				let taskIdList = []
+				let totalAmount = 0
+				for (let i = 0; i < this.list1.length; ++i) {
+					if (this.list1[i].checked) {
+						taskIdList.push(this.list1[i].task_id)
+						totalAmount += this.list1[i].settle_amount
+					}
+				}
+				var data = {
+					taskIdList: taskIdList,
+					totalAmount: totalAmount
+				};
+				data = JSON.stringify(data)
+				uni.navigateTo({
+					url: './myincome/applywithdraw?textObj=' + encodeURIComponent(data)
+				});
+			}
+		},
+	};
+</script>
+<style>
+	/deep/ .share .uni-popup .uni-popup__wrapper {
+		width: 70% !important;
+		border-radius: 15rpx !important;
+	}
+</style>
+<style lang="scss" scoped>
+	p {
+		font-size: 32rpx;
+	}
+
+	.menu {
+		display: flex;
+		align-items: center;
+		justify-content: space-around;
+	}
+
+	.menu-item p {
+		font-weight: 600;
+
+		&.lor {
+			border-bottom: 5rpx solid #F0D232;
+			color: #F0D232;
+			padding-bottom: 15rpx;
+		}
+
+		&.unlor {
+			color: #81838f;
+			padding-bottom: 15rpx;
+			border-bottom: 5rpx solid #ffffff;
+		}
+	}
+
+	.show-income1 {
+		display: flex;
+		align-items: center;
+		height: 120rpx;
+		margin: 0 3%;
+	}
+
+	.show-income1-text {
+		margin-left: 20rpx;
+		margin-right: 200rpx;
+	}
+
+	.show-income1-text2 {
+		flex: 1;
+		display: flex;
+	}
+
+	.show-income1-btn {
+		width: 200rpx;
+		text-align: center;
+		background-color: #F0D232;
+		border-radius: 15rpx;
+		font-size: 35rpx;
+		line-height: 180%;
+	}
+
+	.show-income2 {
+		display: flex;
+		align-items: center;
+		justify-content: space-around;
+		height: 150rpx;
+		margin: 0 3% 3%;
+		background-color: #F0D232;
+		border-radius: 10rpx;
+	}
+
+	.show-income2-text {
+		// padding: 0 50rpx;
+		text-align: center;
+	}
+
+	.show-income3 {
+		margin: 0 3%;
+	}
+
+	.show-income3 p {
+		margin-top: 50rpx;
+		margin-left: 20rpx;
+	}
+
+	.income-list {
+		margin-bottom: 100rpx;
+	}
+
+	.income-list-cell {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+
+		margin-right: 20rpx;
+	}
+
+	.income-list-cell-left {
+		display: flex;
+		align-items: center;
+		margin: 20rpx 0;
+	}
+
+	.income-list-cell-right p {
+		color: #F0D232;
+		font-size: 35rpx;
+	}
+
+	// .income-list-cell2 {
+	// 	margin-left: 70rpx;
+	// }
+
+	.income-list-checkbox {
+		transform: scale(0.7)
+	}
+
+	.interval2 {
+		width: 100%;
+		height: 100rpx;
+		margin-top: 5%;
+	}
+
+	.income-workList-buttons {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		padding: 2% 5%;
+		position: fixed;
+		width: 90%;
+		bottom: 0rpx;
+		height: 90rpx;
+		// padding-top: 2%;
+		background-color: #FFFFFF;
+		margin-top: 100rpx;
+	}
+
+	.all-check-box {
+		display: flex;
+	}
+
+	.right-btn {
+		width: 200rpx;
+		text-align: center;
+		color: #000;
+		background-color: #F0D232;
+		border-radius: 15rpx;
+		font-size: 32rpx;
+		line-height: 200%;
+	}
+</style>

+ 261 - 0
pages/mycenter/myincome/applywithdraw.vue

@@ -0,0 +1,261 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view class="show-form">
+			<view class="show-form-cell">
+				<view class="show-form-cell-left">
+					<p>到账方式</p>
+				</view>
+				<view style="display: flex;justify-content: center;">
+					<radio-group @change="chan">
+						<label v-for="item in radioGroup" :key="item">
+							<view style="display: inline;margin: 0 20rpx;font-size: 32rpx;">
+								<radio :value="item" :checked="item==activeRadio" color="#fdd544"
+									style="transform:scale(0.7)" />{{item}}
+							</view>
+						</label>
+					</radio-group>
+				</view>
+			</view>
+			<view class="show-form-cell" v-if="activeRadio == '支付宝'">
+				<view class="show-form-cell-left">
+					<p>支付宝号</p>
+				</view>
+				<view style="display: flex;justify-content: space-between;width: 550rpx;">
+					<view>
+						<p>{{formData.alipay_number}}</p>
+					</view>
+					<view style="display: flex;align-items: center;justify-content: center;"
+						@click="toModifyZhifubao()">
+						<p>前往修改/绑定</p>
+						<image class="show-body1-icon" :src="picture.icon_right"></image>
+					</view>
+				</view>
+			</view>
+			<view class="show-form-cell" v-if="activeRadio == '银行卡'">
+				<view class="show-form-cell-left">
+					<p>银行卡号</p>
+				</view>
+				<view style="display: flex;justify-content: space-between;width: 550rpx;">
+					<view>
+						<p>{{formData.bank_card_number}}</p>
+					</view>
+					<view style="display: flex;align-items: center;justify-content: center;" @click="toModifyBank()">
+						<p>前往修改/绑定</p>
+						<image class="show-body1-icon" :src="picture.icon_right"></image>
+					</view>
+				</view>
+			</view>
+			<view class="show-form-cell">
+				<view class="show-form-cell-left">
+					<p>提现金额</p>
+				</view>
+				<p>{{showTotalAmount}}</p>
+			</view>
+			<view class="show-form-cell">
+				<view class="show-form-cell-left">
+					<p>实际金额</p>
+				</view>
+				<p>{{showRealAmount}}</p>
+			</view>
+		</view>
+		<view class="tips">
+			<p>根据国家法规,平台需代扣代缴5%个人所得税</p>
+			<p>预计5个工作日到账,法定节假日顺延</p>
+		</view>
+		<view class="withdraw-btn">
+			<button type="default" class="btn1" @click="withdraw()">
+				确认提现</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import {
+		money
+	} from '@/components/utils.js';
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				picture: {
+					icon_person: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-person.png',
+					icon_location: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-location.png',
+					icon_account: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-account.png',
+					icon_rmb: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-rmb.png',
+					icon_message: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-message.png',
+					icon_right: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-arrow-right.png',
+					defaultavatarUrl: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/logoxin01.png',
+				},
+				bankType: 1,
+				taskIdList: [],
+				totalAmount: 0,
+				realAmount: 0,
+				showRealAmount: 0,
+				showTotalAmount: 0,
+				activeRadio: "支付宝",
+				radioGroup: ['支付宝', '银行卡'],
+				formData: {},
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "申请提现",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskIdList = data.taskIdList
+			this.totalAmount = data.totalAmount
+			this.realAmount = data.totalAmount * 0.95
+			this.showTotalAmount = money(this.totalAmount)
+			this.showRealAmount = money(this.realAmount)
+		},
+		onShow() {
+			this.getInfo()
+		},
+		methods: {
+			chan(e) {
+				if (e.detail.value == "支付宝")
+					this.bankType = 1
+				else
+					this.bankType = 2
+				this.activeRadio = e.detail.value;
+				console.log(this.activeRadio);
+			},
+			// 默认信息表,获取平台logo
+			getInfo() {
+				this.$https.get('/youngee/c/g/get-info-tables')
+					.then(res => {
+						this.array1 = res.data.data.Bank
+					})
+				this.getBankInfo()
+			},
+			getBankInfo() {
+				this.$https.get('/youngee/c/t/g/get-talent-bank-info')
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.formData = res.data.data
+						}
+					})
+			},
+			withdraw() {
+				this.$https.post('/youngee/c/t/p/withdraw', {
+						task_id_list: this.taskIdList,
+						total_amount: this.totalAmount,
+						real_amount: this.realAmount,
+						bank_type: this.bankType,
+					})
+					.then(res => {
+						console.log(res)
+						let pages = getCurrentPages(); // 当前页面
+						let beforePage = pages[pages.length - 2]; // 上一页
+						setTimeout(() => {
+							uni.navigateBack({
+								success: function() {
+									beforePage
+										.onLoad(); // 执行上一页的onLoad方法
+								}
+							})
+							uni.navigateBack()
+						})
+					})
+			},
+			toModifyBank() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/mybank'
+				});
+			},
+			toModifyZhifubao() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/myzhifubao'
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	p {
+		font-size: 32rpx;
+	}
+
+	.show-form {
+		margin: 0 25rpx;
+	}
+
+	.show-form-cell {
+		display: flex;
+		margin: 30rpx 0;
+	}
+
+	.show-form-cell-left {
+		width: 150rpx;
+	}
+
+	.tips {
+		margin: 30rpx;
+		padding: 30rpx 20rpx;
+		background-color: #eaeaea;
+		border-radius: 15rpx;
+	}
+
+	.tips p {
+		font-size: 28rpx;
+	}
+
+	.withdraw-btn {
+		display: flex;
+		align-items: center;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 100rpx;
+		padding-top: 2%;
+	}
+
+	.btn1 {
+		width: 60%;
+		background-color: #f2d22d;
+		color: #000;
+		border-color: #ffffff;
+		border-radius: 10rpx;
+		font-size: 36rpx;
+		line-height: 240%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+	}
+
+	.show-body1-icon {
+		width: 30rpx;
+		height: 30rpx;
+	}
+</style>

+ 28 - 34
pages/mycenter/myinformation/addlocation.vue

@@ -2,23 +2,8 @@
 	<view style="position: relative;">
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="topersoninfo()">
-				<p>个人资料</p>
-			</view>
-			<view class="menu-item">
-				<p class='lor'>收货地址</p>
-			</view>
-			<view class="menu-item" @click="tomyaccount()">
-				<p>社媒账号</p>
-			</view>
-			<view class="menu-item" @click="tomybank()">
-				<p>提现绑定</p>
-			</view>
-		</view>
-		<view style="padding-top: 260rpx;width: 97%;">
+		<view style="margin-top: 160rpx;"></view>
+		<view>
 			<!-- 修改个人信息完善 -->
 			<view style="margin: 0 20rpx;">
 				<uni-forms :rules="rules" :modelValue="formData" ref="form" validate-trigger="bind"
@@ -88,7 +73,7 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "收货地址管理",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
@@ -161,31 +146,39 @@
 			this.$refs.form.setRules(this.rules)
 		},
 		onShow() {
+			this.initRegion()
 			if (this.ismodify == '1')
 				this.getDetailAddress()
 		},
 		onLoad(options) {
 			console.log(options)
 			this.ismodify = options.ismodify
-			// 传过来的id
 			if (this.ismodify == '1')
 				this.address_id = options.address_id
 		},
 		methods: {
-			tomybank() {
-				uni.navigateTo({
-					url: './mybank'
-				});
-			},
-			topersoninfo() {
-				uni.navigateTo({
-					url: './personinfo'
-				});
-			},
-			tomyaccount() {
-				uni.navigateTo({
-					url: './myaccount'
-				});
+			initRegion() {
+				// 声明城市数组
+				let cityArr = [];
+				let countyArr = [];
+				// 设置下标
+				this.regionIndex = [0, 0, 0];
+				// 改变城市列表
+				this.region[1] = this.oldRegion[0].children.map(item => {
+					cityArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 1, cityArr);
+				// 改变县区列表
+				this.oldRegion[0].children[0].children.map(item => {
+					countyArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 2, countyArr);
 			},
 			setDefault(e) {
 				console.log(e.detail.value)
@@ -284,6 +277,7 @@
 			//城市选择
 			pickerChange(e) {
 				// console.log(e, '1');
+				console.log("pickerChange e.detail.value: ", e.detail.value)
 				this.regionIndex = e.detail.value;
 				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[1]]
 					.name + ' ' +
@@ -454,7 +448,7 @@
 	.btn1 {
 		margin: 30rpx;
 		font-size: 35rpx;
-		color: #FFFFFF;
+		color: #000;
 		background-color: #F0D232;
 		border: none;
 		border-radius: 0;

+ 41 - 78
pages/mycenter/myinformation/bindaccount.vue

@@ -3,7 +3,7 @@
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
 		<view class="home">
-			<view class="card">
+			<view class="card" v-if="!loading">
 				<view class="head">
 					<image :src="platform.platform_icon" mode=""></image>
 					<span>{{platform.platform_name}}账号绑定</span>
@@ -11,8 +11,7 @@
 
 				<view class="body">
 					<view>
-						<uni-forms :rules="rules" :modelValue="formData" ref="form" validate-trigger="bind"
-							err-show-type="undertext">
+						<uni-forms :modelValue="formData" ref="form" validate-trigger="bind" err-show-type="undertext">
 							<uni-forms-item name="name" required label="昵称">
 								<uni-easyinput type="text" v-model="formData.platform_nickname" placeholder="请填写账号昵称">
 								</uni-easyinput>
@@ -36,16 +35,8 @@
 							</view>
 						</uni-forms>
 						<view class="heng-line"></view>
-						<view style="display: flex;justify-content: space-around;align-items: center;">
-							<view class="signupbtn">
-								<button type="default" class="exit-btn" @click="exit()">取消</button>
-							</view>
-							<view class="signupbtn">
-								<button type="default" class="main-btn" @click="submitForm('form')">
-									提交绑定
-								</button>
-							</view>
-						</view>
+						<button class="btn1" @click="submitForm('form')">
+							确认绑定</button>
 					</view>
 				</view>
 			</view>
@@ -65,7 +56,7 @@
 		},
 		data() {
 			return {
-				isUpdate: false,
+				loading: true,
 				accountId: '',
 				platform: {
 					platform_id: '',
@@ -79,32 +70,6 @@
 					fans_count: '',
 					home_page_url: '',
 				},
-				rules: {
-					name: {
-						rules: [{
-							required: true,
-							errorMessage: '请输入'
-						}, ]
-					},
-					numberfans: {
-						rules: [{
-							required: true,
-							errorMessage: '请输入'
-						}, ]
-					},
-					home_link: {
-						rules: [{
-							required: true,
-							errorMessage: '请输入'
-						}, ]
-					},
-					home_img: {
-						rules: [{
-							required: true,
-							errorMessage: '请输入'
-						}, ]
-					},
-				},
 				mysNavConfig: {
 					/* 开启单页显示首页图标 */
 					isHome: true,
@@ -112,7 +77,7 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "社媒账号绑定",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
@@ -132,10 +97,19 @@
 
 			}
 		},
-		onReady() {
-			// this.$refs.form.setRules(this.rules)
+		onReady() {},
+		async onShow() {
+			this.loading = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			await this.getinfo();
+			if (!this.isBind) {
+				await this.getaccount()
+			};
+			this.loading = false;
+			uni.hideLoading();
 		},
-		onShow() {},
 		onLoad() {},
 		onLoad(options) {
 			this.platform.platform_id = parseInt(options.platform_id)
@@ -143,15 +117,11 @@
 				this.accountId = parseInt(options.account_id)
 				this.isBind = false
 			}
-			// if (options.isUpdate) {
-			// 	this.isUpdate = true
-			// }
-			this.getinfo()
 		},
 		methods: {
 			// 默认信息表,获取平台logo
 			getinfo() {
-				this.$https.get('/youngee/c/g/get-info-tables')
+				return this.$https.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						let list = res.data.data.ThirdPlatform
 						for (var i = 0; i < list.length; ++i) {
@@ -160,29 +130,25 @@
 								this.platform.platform_name = list[i].platform_name
 							}
 						}
-						this.getaccount()
 					})
 			},
-
 			getaccount() {
-				console.log(this.isBind)
-				if (!this.isBind) {
-					this.$https.get('/youngee/c/t/g/get-talent-account')
-						.then(res => {
-							console.log(res)
-							if (res.data.code !== -3) {
-								this.account = res.data.data
-								for (var i = 0; i < this.account.length; i++) {
-									if (this.platform.platform_id == this.account[i].platform_id) {
-										this.formData.platform_nickname = this.account[i].platform_nickname
-										this.formData.fans_count = this.account[i].fans_count
-										this.formData.home_page_url = this.account[i].home_page_url
-										this.imageData.push(this.account[i].home_page_capture_url);
-									}
+				return this.$https.get('/youngee/c/t/g/get-talent-account')
+					.then(res => {
+						console.log(res)
+						if (res.data.code !== -3) {
+							this.account = res.data.data
+							this.imageData = []
+							for (var i = 0; i < this.account.length; i++) {
+								if (this.platform.platform_id == this.account[i].platform_id) {
+									this.formData.platform_nickname = this.account[i].platform_nickname
+									this.formData.fans_count = this.account[i].fans_count
+									this.formData.home_page_url = this.account[i].home_page_url
+									this.imageData.push(this.account[i].home_page_capture_url);
 								}
 							}
-						})
-				}
+						}
+					})
 			},
 			/**
 			 * 手动提交
@@ -277,6 +243,7 @@
 				console.log('ceshiChooseSuccess', tempFilePaths, e);
 				if (e == 0) {
 					this.store = 'talent_upload/' + this.guid() + '.png'
+					// this.store = 'talent_upload/icon-warning.png'
 				} else if (e == 1) {
 					this.store = 'talent_upload/' + this.guid() + '.mp4'
 				}
@@ -296,7 +263,6 @@
 					EndPoint: 'https://horastar.obs.cn-east-3.myhuaweicloud.com', //上传文件的路径
 				};
 				let fileName = this.store; //指定上传到OBS桶中的对象名
-				// let fileName = "talent_upload/icon-arrow-right.png"
 				let OBSPolicy = { //设定policy内容
 					"expiration": "2089-12-31T12:00:00.000Z",
 					"conditions": [{
@@ -449,16 +415,13 @@
 		line-height: 180%;
 	}
 
-	.main-btn {
-		width: 300rpx;
-		text-align: center;
-		padding: 10rpx 20rpx;
-		background-color: #FCCF41;
-		border: 0;
-		border-radius: 10rpx;
-		color: #000000;
-		font-size: 30rpx;
-		line-height: 180%;
+	.btn1 {
+		margin: 30rpx;
+		font-size: 35rpx;
+		color: #000;
+		background-color: #F0D232;
+		border: none;
+		border-radius: 0;
 	}
 
 	.uni-input-placeholder {

+ 30 - 35
pages/mycenter/myinformation/myaccount.vue

@@ -2,37 +2,24 @@
 	<view style="position: relative;">
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="topersoninfo()">
-				<p>个人资料</p>
-			</view>
-			<view class="menu-item" @click="tomylocation()">
-				<p>收货地址</p>
-			</view>
-			<view class="menu-item">
-				<p class='lor'>社媒账号</p>
-			</view>
-			<view class="menu-item" @click="tomybank()">
-				<p>提现绑定</p>
-			</view>
-		</view>
-		<view style="padding-top: 260rpx;width: 97%;">
+		<view style="margin-top: 160rpx;"></view>
+		<view v-if="!loading">
 			<!-- 已经绑定的账号-->
-			<view class="card" style="margin-top: 2%;" v-for="item in account">
-				<view class="Tasktext"  @click="accountdetail(item)">
+			<view class="card" style="margin-top: 2%;" v-for="item in account" @click="accountdetail(item)">
+				<view class="Tasktext">
 					<image :src="item.platform_icon" mode=""></image>
 					<span>{{item.platform_nickname}}</span>
 				</view>
 				<view class="dou">
 					<p style="padding-right: 20rpx;color:#A8A8A8;">粉丝数</p>
-					<p>{{item.fans_count}}</p>
+					<p>{{item.show_fans_count}}</p>
 				</view>
-				<view class="clickkk" @click="accountdetail(item)">
+				<view class="clickkk">
 					<image :src="togoimg" mode="" style="width: 16rpx;height: 30rpx;"></image>
 				</view>
 			</view>
+		</view>
+		<view v-if="!loading">
 			<!-- 未绑定的 -->
 			<view class="card" style="margin-top: 2%;" v-for="item in list1">
 				<view class="Tasktext" @click="bindaccount(item)">
@@ -55,12 +42,16 @@
 
 <script>
 	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import {
+		fansview
+	} from '@/components/utils.js';
 	export default {
 		components: {
 			mvBar,
 		},
 		data() {
 			return {
+				loading: false,
 				togoimg: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task16.png',
 				list1: [],
 				account: [],
@@ -71,13 +62,13 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "社媒账号绑定",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
 					},
 					btnType: "type2",
-					onLeftClick: '/pages/mycenter/mycenter',
+					onLeftClick: '',
 					/* type2 按钮 */
 					type2Config: {
 						// 左图标
@@ -90,15 +81,17 @@
 				},
 			}
 		},
-		onShow() {
-			this.getlist1()
-			uni.showLoading()
-			setTimeout(() => {
-				uni.hideLoading()
-			}, 500)
-		},
-		onLoad() {
+		async onShow() {
+			this.loading = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			await this.getlist1()
+			await this.getlist()
+			uni.hideLoading();
+			this.loading = false;
 		},
+		onLoad() {},
 		methods: {
 			tomylocation() {
 				uni.navigateTo({
@@ -117,12 +110,14 @@
 			},
 			// 信息表
 			getlist() {
-				this.$https.get('/youngee/c/t/g/get-talent-account')
+				return this.$https.get('/youngee/c/t/g/get-talent-account')
 					.then(res => {
 						console.log(res)
 						if (res.data.code !== -3) {
 							this.account = res.data.data
 							for (var i = 0; i < this.account.length; i++) {
+								this.account[i].show_fans_count = fansview(this.account[i].fans_count)
+
 								for (var j = 0; j < this.list1.length; j++) {
 									if (this.list1[j].id == this.account[i].platform_id) {
 										this.account[i].platform_icon = this.list1[j].platform_icon
@@ -135,11 +130,10 @@
 			},
 			// 默认信息表
 			getlist1() {
-				this.$https.get('/youngee/c/g/get-info-tables')
+				return this.$https.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						console.log(res)
 						this.list1 = res.data.data.ThirdPlatform
-						this.getlist()
 					})
 			},
 			// 前往绑定账号
@@ -152,7 +146,8 @@
 			// 前往账号详情
 			accountdetail(item) {
 				uni.navigateTo({
-					url: '/pages/mycenter/myinformation/bindaccount?platform_id=' + item.platform_id + '&account_id=' + item
+					url: '/pages/mycenter/myinformation/bindaccount?platform_id=' + item.platform_id +
+						'&account_id=' + item
 						.account_id
 				});
 			}

+ 614 - 28
pages/mycenter/myinformation/mybank.vue

@@ -2,26 +2,59 @@
 	<view style="position: relative;">
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="topersoninfo()">
-				<p>个人资料</p>
-			</view>
-			<view class="menu-item" @click="tomylocation()">
-				<p>收货地址</p>
-			</view>
-			<view class="menu-item" @click="tomyaccount()">
-				<p>社媒账号</p>
+		<view style="margin-top: 160rpx;"></view>
+		<view>
+			<!-- 银行卡信息绑定 -->
+			<view style="margin: 0 20rpx;">
+				<font style="margin: 30rpx 20rpx 20rpx;color: #878994;">银行卡信息绑定</font>
+				<uni-forms :modelValue="formData" err-show-type="undertext">
+					<uni-forms-item name="name" required label="户主姓名">
+						<uni-easyinput type="text" :inputBorder="false" v-model="formData.name" placeholder="姓名">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="cardid" required label="身份证号">
+						<uni-easyinput type="text" :inputBorder="false" v-model="formData.bank_card_id"
+							placeholder="18位身份证号">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="bankcard" required label="银行卡号">
+						<uni-easyinput type="number" maxlength="19" :inputBorder="false"
+							v-model="formData.bank_card_number" placeholder="请填写卡号">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="bank" required label="银行">
+						<picker @change="bindPickerChange1" :value="index1" :range="array1" range-key="name">
+							<view>{{ array1[index1].name }}</view>
+						</picker>
+					</uni-forms-item>
+					<uni-forms-item name="vregion" required label="开户地">
+						<picker class="picker" mode="multiSelector" :range="region" range-key="name"
+							:value="regionIndex" @change="pickerChange" @columnchange="pickerColumnchange">
+							<view class="pbox" :class="{'pbox_hover':regionStr != '请选择省市区'}">
+								<view>{{regionStr}}</view>
+								<text class="iconfont icon-you"></text>
+							</view>
+						</picker>
+					</uni-forms-item>
+					<uni-forms-item name="phone" required label="手机号">
+						<uni-easyinput type="number" maxlength="11" :inputBorder="false" v-model="formData.phone"
+							placeholder="请填写手机号">
+						</uni-easyinput>
+					</uni-forms-item>
+					</uni-group>
+				</uni-forms>
 			</view>
-			<view class="menu-item">
-				<p class='lor'>提现绑定</p>
+			<view>
+				<button class="btn1" @click="submitForm()">保存</button>
 			</view>
 		</view>
+
+
 	</view>
 </template>
 
 <script>
+	import region from '@/components/pca-code.json';
 	import mvBar from "@/components/mys_navBar/mysNavBar";
 	export default {
 		components: {
@@ -29,7 +62,38 @@
 		},
 		data() {
 			return {
-
+				index1: 0,
+				formData: {
+					name: '',
+					phone: '',
+					bank_id: '',
+					bank_card_number: '',
+					bank_open_address: '',
+					bank_card_id: '',
+					alipay_number: '',
+					alipay_real_name: '',
+					alipay_card_id: '',
+				},
+				oldRegion: region,
+				region: [
+					[],
+					[],
+					[]
+				],
+				// 选择省市区的下标Index  传则默认选中传递的
+				regionIndex: [0, 0, 0],
+				// 省市区字符串
+				regionStr: '请选择省市区',
+				array1: [{
+					name: '请选择',
+					id: 0
+				}, {
+					name: '中国农业银行',
+					id: 1
+				}, {
+					name: '中国工商银行',
+					id: 2
+				}],
 				mysNavConfig: {
 					/* 开启单页显示首页图标 */
 					isHome: true,
@@ -37,13 +101,13 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "银行卡信息绑定",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
 					},
 					btnType: "type2",
-					onLeftClick: '/pages/mycenter/mycenter',
+					onLeftClick: '',
 					/* type2 按钮 */
 					type2Config: {
 						// 左图标
@@ -56,32 +120,266 @@
 				},
 			}
 		},
+		onShow() {
+			this.getInfo();
+			this.initRegion();
+		},
 		methods: {
-			tomylocation() {
-				uni.navigateTo({
-					url: './mylocation'
-				});
+			initRegion() {
+				// 声明城市数组
+				let cityArr = [];
+				let countyArr = [];
+				// 设置下标
+				this.regionIndex = [0, 0, 0];
+				// 改变城市列表
+				this.region[1] = this.oldRegion[0].children.map(item => {
+					cityArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 1, cityArr);
+				// 改变县区列表
+				this.oldRegion[0].children[0].children.map(item => {
+					countyArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 2, countyArr);
 			},
-			topersoninfo() {
-				uni.navigateTo({
-					url: './personinfo'
-				});
+			// 默认信息表,获取平台logo
+			getInfo() {
+				this.$https.get('/youngee/c/g/get-info-tables')
+					.then(res => {
+						this.array1 = res.data.data.Bank
+					})
+				this.getBankInfo()
 			},
-			tomyaccount() {
-				uni.navigateTo({
-					url: './myaccount'
-				});
+			getBankInfo() {
+				this.$https.get('/youngee/c/t/g/get-talent-bank-info')
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.formData = res.data.data
+							if (this.formData.bank_id != '') {
+								this.index1 = this.formData.bank_id
+							}
+							if (this.formData.bank_open_address == 0) {
+								this.formData.bank_open_address = ''
+							} else {
+								let a = this.formData.bank_open_address.toString().slice(0, 2)
+								let b = this.formData.bank_open_address.toString().slice(0, 4)
+								let c = 0
+								for (var i = 0; i < region.length; i++) {
+									if (region[i].code == a) {
+										a = region[i].name
+										for (var j = 0; j < region[i].children.length; j++) {
+											if (region[i].children[j].code == b) {
+												b = region[i].children[j].name
+												for (var o = 0; o < region[i].children[j].children.length; o++) {
+													if (region[i].children[j].children[o].code == this.formData
+														.bank_open_address) {
+														c = region[i].children[j].children[o].name
+													}
+												}
+											}
+										}
+									}
+								}
+								this.regionStr = a + ' ' + b + ' ' + c
+							}
+						}
+					})
+			},
+			submitForm() {
+				let f1 = true
+				let message1 = ""
+				// 检查是否填写银行卡信息
+				if (this.formData.name == "") {
+					f1 = false;
+					message1 = "请输入正确的户主姓名"
+				} else if (this.formData.bank_card_id.length != 18) {
+					f1 = false;
+					message1 = "请输入正确的身份证号"
+				} else if (this.formData.bank_card_number == "" || (this.formData.bank_card_number.length != 16 && this
+						.formData.bank_card_number.length != 17 && this.formData.bank_card_number.length != 19)) {
+					f1 = false;
+					message1 = "请输入正确的银行卡号"
+				} else if (this.formData.bank_id == 0) {
+					f1 = false;
+					message1 = "请选择银行"
+				} else if (this.formData.bank_open_address == "") {
+					f1 = false;
+					message1 = "请选择开户地"
+				} else if (this.formData.phone == "" || this.formData.phone.length != 11) {
+					f1 = false;
+					message1 = "请输入正确的手机号"
+				};
+
+				if (f1) {
+					console.log(this.formData)
+					console.log(message1)
+					this.$https.post('/youngee/c/t/p/add-talent-bank', this.formData)
+						.then(res => {
+							console.log(res)
+							uni.showToast({
+								title: "提现信息绑定成功",
+								icon: 'none'
+							})
+							let pages = getCurrentPages(); // 当前页面
+							let beforePage = pages[pages.length - 2]; // 上一页
+							uni.navigateBack({
+								success: function() {
+									beforePage
+										.onLoad(); // 执行上一页的onLoad方法
+								}
+							})
+						})
+				} else {
+					uni.showToast({
+						title: message1,
+						icon: 'none'
+					})
+				}
+
+			},
+			bindPickerChange1: function(e) {
+				console.log(e)
+				this.index1 = e.detail.value;
+				this.formData.bank_id = this.array1[this.index1].id
+				console.log(this.formData.bank_id)
+			},
+
+			//城市选择
+			pickerChange(e) {
+				// console.log(e, '1');
+				this.regionIndex = e.detail.value;
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[
+						1]]
+					.name + ' ' +
+					this.region[2][this.regionIndex[2]].name;
+
+				// 组件传值
+				this.$emit('region', [this.region[0][this.regionIndex[0]].code, this.region[1][this.regionIndex[1]]
+					.code,
+					this.region[
+						2][this.regionIndex[2]].code
+				]);
+				this.formData.bank_open_address = this.region[2][this.regionIndex[2]].code;
+
 			},
+			pickerColumnchange(e) {
+				// console.log(e);
+				// 第几列滑动
+				// console.log(e.detail.column);
+				// 第几列滑动的下标
+				// console.log(e.detail.value)
 
+				if (e.detail.column === 0) {
+					// 声明城市数组
+					let cityArr = [];
+					let countyArr = [];
+					// 设置下标
+					this.regionIndex = [e.detail.value, 0, 0];
+					// 改变城市列表
+					this.region[1] = this.oldRegion[e.detail.value].children.map(item => {
+						cityArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 1, cityArr);
+					// 改变县区列表
+					this.oldRegion[e.detail.value].children[0].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 1) {
+					this.regionIndex[1] = e.detail.value;
+					this.regionIndex[2] = 0;
+					let countyArr = [];
+					this.oldRegion[this.regionIndex[0]].children[this.regionIndex[1]].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 2) {
+					this.regionIndex[2] = e.detail.value;
+				}
+			}
+
+		},
+		created() {
+			let provinceArr = [];
+			let cityArr = [];
+			this.oldRegion.map((item, index) => {
+				this.region[0].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.previnceId == item.code) {
+					provinceArr = item.children;
+					this.regionIndex[0] = index;
+				}
+			})
+			// console.log(provinceArr);
+			provinceArr.map((item, index) => {
+				this.region[1].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.cityId == item.code) {
+					cityArr = item.children;
+					this.regionIndex[1] = index;
+				}
+			})
+			cityArr.map((item, index) => {
+				this.region[2].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.countyId == item.code)
+					this.regionIndex[2] = index;
+			})
+			if (this.isRevise)
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[1]]
+				.name + ' ' + this.region[2][this.regionIndex[2]].name;
+			else
+				this.regionStr = '请选择省市区';
 		}
 	}
 </script>
 
+
+<style>
+	picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-forms-item__inner {
+		border-bottom: none !important;
+		margin-bottom: 0 !important;
+	}
+</style>
 <style lang="scss" scoped>
 	view {
 		font-size: 14px;
 		line-height: inherit;
 	}
+
 	.menu {
 		position: fixed;
 		top: 180rpx;
@@ -103,4 +401,292 @@
 			padding-bottom: 15rpx;
 		}
 	}
+
+	.btn1 {
+		margin: 30rpx;
+		font-size: 35rpx;
+		color: #000;
+		background-color: #F0D232;
+		border: none;
+		border-radius: 0;
+	}
+
+	.uni-input-border,
+	.uni-textarea-border {
+		flex: 1;
+		font-size: 14px;
+		color: #666;
+		border: 1px #FFFFFF solid;
+		border-radius: 5px;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-input-border {
+		padding: 0 10px;
+		height: 35px;
+	}
+
+	.uni-textarea-border {
+		padding: 10px;
+		height: 80px;
+	}
+
+	.label-box {
+		margin-right: 10px;
+	}
+
+	.transform-scale {
+		transform: scale(0.7);
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	.option {
+		padding: 20rpx;
+	}
+
+	.uni-margin-wrap {
+		width: 690rpx;
+		width: 100%;
+		;
+	}
+
+	.swiper {
+		height: 300rpx;
+	}
+
+	.swiper-item {
+		display: block;
+		height: 300rpx;
+		line-height: 300rpx;
+		text-align: center;
+	}
+
+	.swiper-list {
+		margin-top: 40rpx;
+		margin-bottom: 0;
+	}
+
+	.uni-common-mt {
+		margin-top: 60rpx;
+		position: relative;
+	}
+
+	.info {
+		position: absolute;
+		right: 20rpx;
+	}
+
+	.uni-padding-wrap {
+		width: 550rpx;
+		padding: 0 100rpx;
+	}
+
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+		justify-content: space-around;
+	}
+
+	.signuptext {
+		text-align: center;
+		margin-top: 2%;
+
+	}
+
+	.signuptext p {
+		font-size: 60%;
+		color: #333333;
+	}
+
+	.signupbut {
+		text-align: center;
+		margin-top: 2%;
+	}
+
+	.but1 {
+		width: 120%;
+		text-align: center;
+		background-color: #FCCF41;
+		border-radius: 10rpx;
+		color: #464100;
+		font-size: 28rpx;
+		line-height: 156%;
+
+		font-weight: 500;
+		height: 65%;
+	}
+
+	/deep/.uni-searchbar__box {
+		border-color: #267CFF !important;
+		border-width: 2rpx !important;
+	}
+
+	/deep/.uni-searchbar__box {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-searchbar__text-placeholder {
+		font-size: 30rpx !important;
+	}
+
+	/deep/.segmented-control__text {
+		font-size: 34rpx !important;
+	}
+
+	/deep/.uni-data-checklist {
+		padding-left: 20upx;
+	}
+
+	uni-picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-date-x--border {
+		border: 0px solid #dcdfe6 !important;
+	}
+
+	/deep/.is-input-border {
+		border: 0px solid #c8c7cc !important;
+	}
+
+	/deep/.uni-progress-info {
+		font-size: 25rpx !important;
+	}
+
+	/deep/.uni-error-message {
+		position: absolute;
+		bottom: -20rpx !important;
+		left: 20rpx !important;
+		text-align: left;
+	}
+
+	/deep/.uni-forms-item__inner {
+		padding-bottom: 0rpx !important;
+		margin-bottom: 30rpx !important;
+		border-bottom: 0.5rpx solid #CCCCCC;
+	}
+
+	/deep/.uni-group__title {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-list-item__content-title {
+		font-size: 30rpx !important;
+		color: #111111 !important;
+	}
+
+	/deep/.uni-progress-bar {
+		border-radius: 10rpx !important;
+	}
+
+	/deep/.uni-progress-inner-bar {
+		border-radius: 10rpx !important;
+	}
+
+
+	/deep/.is-input-border {
+		border-radius: 20px !important;
+		background-color: #fff;
+	}
+
+	.uni-easyinput__content-input {
+		font-size: 30upx !important;
+	}
+
+	.content-clear-icon {
+		font-size: 40upx !important;
+	}
+
+	/deep/.input-box {
+		padding: 50upx;
+		font-size: 30upx;
+
+		.input-item {
+			display: flex;
+
+			border: 1upx solid #F8F8F8;
+			line-height: 90upx;
+			height: 90upx;
+			margin-top: 20upx;
+			background: #F8F8F8;
+			border-radius: 48upx;
+
+			.input-label {
+				width: 150upx;
+				text-align: center;
+			}
+
+			.input-body {
+				position: relative;
+				height: 100upx;
+				width: calc(100% - 150upx);
+
+				.input {
+					line-height: 90upx;
+					height: 90upx;
+					position: relative;
+					font-size: 28upx;
+				}
+
+				.eye {
+					position: absolute;
+					height: 50upx;
+					width: 50upx;
+					right: 20upx;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+
+				.btn-code {
+					position: absolute;
+					right: 0upx;
+					top: 50%;
+					transform: translateY(-50%);
+					background: none;
+					color: #205592;
+					width: 160upx;
+					font-size: 24upx;
+					box-sizing: border-box;
+					text-align: center;
+					padding: 0;
+					height: 100upx;
+					line-height: 100upx;
+				}
+			}
+		}
+
+		.select {
+			// padding-top: 40upx;
+			display: flex;
+			justify-content: space-between;
+			color: #003B67;
+		}
+	}
+
+	/deep/.title-left {
+		width: 3px;
+		height: 16px;
+		background: #267CFF;
+		display: inline-block;
+		border-radius: 3px;
+		margin-top: 3px;
+		vertical-align: top;
+		margin-right: 10px;
+	}
 </style>

+ 132 - 0
pages/mycenter/myinformation/myinformation.vue

@@ -0,0 +1,132 @@
+<template>
+	<view>
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view class="func">
+			<view class="func-head">
+				<p>任务报名必填项</p>
+			</view>
+			<view class="func-card">
+				<p @click="handlePersoninfo()">个人资料管理</p>
+				<image class="show-body1-icon" :src="picture.icon_right" @click="handlePersoninfo()"></image>
+			</view>
+			<view class="func-card">
+				<p @click="handleLocation()">收货地址管理</p>
+				<image class="show-body1-icon" :src="picture.icon_right" @click="handleLocation()"></image>
+			</view>
+			<view class="func-card">
+				<p @click="handleAccount()">社媒账号绑定</p>
+				<image class="show-body1-icon" :src="picture.icon_right" @click="handleAccount()"></image>
+			</view>
+		</view>
+		<view class="func">
+			<view class="func-head">
+				<p>提现申请必填项</p>
+			</view>
+			<view class="func-card">
+				<p @click="handleBank()">银行卡信息绑定</p>
+				<image class="show-body1-icon" :src="picture.icon_right" @click="handleBank()"></image>
+			</view>
+			<view class="func-card">
+				<p @click="handleZhifubao()">支付宝信息绑定</p>
+				<image class="show-body1-icon" :src="picture.icon_right" @click="handleZhifubao()"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				picture: {
+					icon_right: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent_upload/icon-arrow-right.png',
+				},				
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "个人信息",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+		methods: {
+			handlePersoninfo() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/personinfo'
+				});
+			},
+			handleLocation() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/mylocation'
+				});
+			},
+			handleAccount() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/myaccount'
+				});
+			},
+			handleBank() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/mybank'
+				});
+			},
+			handleZhifubao() {
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/myzhifubao'
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	p {
+		font-size: 32rpx;
+	}
+
+	.func {}
+
+	.func-head {
+		background-color: #f2f2f2;
+		padding: 20rpx 30rpx;
+	}
+
+	.func-head p {
+		font-size: 28rpx;
+	}
+
+	.func-card {
+		display: flex;
+		justify-content: space-between;
+		padding: 20rpx 30rpx;
+	}
+	
+	.show-body1-icon {
+		width: 30rpx;
+		height: 30rpx;
+	}
+</style>

+ 95 - 69
pages/mycenter/myinformation/mylocation.vue

@@ -2,23 +2,8 @@
 	<view style="position: relative;">
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="topersoninfo()">
-				<p>个人资料</p>
-			</view>
-			<view class="menu-item">
-				<p class='lor'>收货地址</p>
-			</view>
-			<view class="menu-item" @click="tomyaccount()">
-				<p>社媒账号</p>
-			</view>
-			<view class="menu-item" @click="tomybank()">
-				<p>提现绑定</p>
-			</view>
-		</view>
-		<view style="padding-top: 260rpx;width: 97%;">
+		<view style="margin-top: 160rpx;"></view>
+		<view>
 			<!-- 收货地址 -->
 			<view class="card" style="margin-top: 6%;" v-for="item in list">
 				<view class="">
@@ -32,20 +17,20 @@
 								<p class='ipon' style="padding-right: 200rpx;">{{item.receiver_name}}</p>
 								<p class='ipon'>{{item.phone_number}}</p>
 							</view>
-							<p class='ipon'>{{item.detail_addr}}</p>
+							<p class='ipon'>{{item.full_detail_addr}}</p>
 						</view>
 					</view>
 
 					<view class="" style="border-bottom: 2rpx solid #C0C0C0;margin-top: 3%;margin-bottom: 3%;"> </view>
-					<view class="" style="display: flex;justify-content:space-between ;">
-						<view class="Tasktext">
-							<label>
-								<radio color="#F0D232" :value="item.default_tag" :checked="item.default_tag" style="transform:scale(0.7);
-		font-size: 30rpx;" @click="setdefault(item)" name="radio" />
-								默认地址
+					<view class="func">
+						<view class="func-left">
+							<label style="font-size: 28rpx;vertical-align: middle;">
+								<radio color="#F0D232" :value="item.default_tag" :checked="item.default_tag" style="transform:scale(0.6);
+		font-size: 24rpx;" @click="setdefault(item)" name="radio" />
 							</label>
+							<span>默认地址</span>
 						</view>
-						<view class="func">
+						<view class="func-right">
 							<view class="func-btn" @click="edit(item)">
 								<image :src="picture.icon_edit" mode="">
 								</image>
@@ -70,11 +55,11 @@
 		<view class="signup">
 
 			<view class="signupbtn">
-				<button type="default" class="manu-btn" @click="addreceipt()">手动添加</button>
+				<button type="default" class="btn1" @click="addreceipt()">手动添加</button>
 			</view>
 
 			<view class="signupbtn">
-				<button type="default" class="auto-btn" @click="chooseAddr()">
+				<button type="default" class="btn1" @click="chooseAddr()">
 					<image class="weixinlogo" :src="weixinimage">
 					</image>
 					<p class="auto-text">
@@ -88,6 +73,7 @@
 </template>
 
 <script>
+	import region from '@/components/pca-code.json';
 	import mvBar from "@/components/mys_navBar/mysNavBar";
 	export default {
 		components: {
@@ -97,9 +83,9 @@
 			return {
 				weixinimage: "../../../static/img/icon-weixin.png",
 				picture: {
-					icon_edit:'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-edit.png',
-					icon_del:'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-del.png',
-					icon_loc:'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-loc.png',
+					icon_edit: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-edit.png',
+					icon_del: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-del.png',
+					icon_loc: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-loc.png',
 					home8: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home8.png',
 					home10: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home10.png',
 					home11: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home11.png',
@@ -113,13 +99,13 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "收货地址管理",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
 					},
 					btnType: "type2",
-					onLeftClick: "/pages/mycenter/mycenter",
+					onLeftClick: "",
 					/* type2 按钮 */
 					type2Config: {
 						// 左图标
@@ -135,30 +121,38 @@
 		onShow() {
 			this.getlist()
 		},
-		onLoad() {
-		},
+		onLoad() {},
 		methods: {
-			tomybank() {
-				uni.navigateTo({
-					url: './mybank'
-				});
-			},
-			topersoninfo() {
-				uni.navigateTo({
-					url: './personinfo'
-				});
-			},
-			tomyaccount() {
-				uni.navigateTo({
-					url: './myaccount'
-				});
-			},
 			// 列表
 			getlist() {
-				this.$https.get('/youngee/c/t/g/get-talent-address')
+				return this.$https.get('/youngee/c/t/g/get-talent-address')
 					.then(res => {
 						console.log(res)
 						this.list = res.data.data
+
+						for (let k = 0; k < this.list.length; ++k) {
+							let a = this.list[k].region_code.toString().slice(0, 2)
+							let b = this.list[k].region_code.toString().slice(0, 4)
+							let c = 0
+							for (var i = 0; i < region.length; i++) {
+								if (region[i].code == a) {
+									a = region[i].name
+									for (var j = 0; j < region[i].children.length; j++) {
+										if (region[i].children[j].code == b) {
+											b = region[i].children[j].name
+											for (var o = 0; o < region[i].children[j].children.length; o++) {
+												if (region[i].children[j].children[o].code == this.list[k]
+													.region_code) {
+													c = region[i].children[j].children[o].name
+												}
+											}
+										}
+
+									}
+								}
+							}
+							this.list[k].full_detail_addr = a + b + c + this.list[k].detail_addr
+						}
 					})
 			},
 			// 进入添加收货地址
@@ -193,6 +187,9 @@
 								console.log(res)
 								that.getlist()
 							})
+					},
+					fail: (res) => {
+						console.log(res)
 					}
 				})
 			},
@@ -275,7 +272,7 @@
 </style>
 <style lang="scss" scoped>
 	view {
-		font-size: 14px;
+		font-size: 28rpx;
 		// line-height: inherit;
 	}
 
@@ -302,33 +299,49 @@
 	}
 
 	.signup {
-		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		display: flex;
+		align-items: center;
+		justify-content: space-around;
 		width: 100%;
 		position: fixed;
+		padding-bottom: 10rpx;
 		bottom: 0rpx;
 		display: flex;
-		height: 90rpx;
-		background-color: #FFFFFF;
-		justify-content: space-around;
-		;
-		/* 垂直居中 */
-		align-items: center;
+		height: 100rpx;
+		padding-top: 2%;
+
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		// width: 100%;
+		// position: fixed;
+		// bottom: 0rpx;
+		// display: flex;
+		// height: 90rpx;
+		// background-color: #FFFFFF;
+		// justify-content: space-around;
+		// ;
+		// /* 垂直居中 */
+		// align-items: center;
 	}
 
 	.signupbtn p {
-		font-size: 28rpx;
+		font-size: 32rpx;
 	}
 
-	.manu-btn {
-		width: 120%;
-		text-align: center;
-		border: 1rpx solid #FCCF41;
-		background-color: #FFFFFF;
+	.btn1 {
+		// width: 60%;
+		background-color: #f2d22d;
+		color: #000;
+		border-color: #ffffff;
 		border-radius: 10rpx;
-		color: #000000;
-		font-size: 28rpx;
-		line-height: 180%;
-		margin-left: 10%;
+		font-size: 32rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 100%;
+		width: 280rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
 	}
 
 	.auto-btn {
@@ -347,6 +360,7 @@
 
 	.auto-text {
 		display: inline-block;
+		// font-size:32rpx;
 	}
 
 	.weixinlogo {
@@ -378,10 +392,23 @@
 
 	.func {
 		display: flex;
+		justify-content: space-between;
+	}
+
+	.func-left {
+		display: flex;
+		align-items: center;
+	}
+
+	.func-right {
+		display: flex;
+		justify-content: center;
 		padding: 0 0 0 1%;
 	}
 
 	.func-btn {
+		display: flex;
+		align-items: center;
 		padding-left: 20rpx;
 	}
 
@@ -389,7 +416,6 @@
 		color: #333333;
 		font-size: 30rpx;
 		font-weight: 500;
-		text-indent: 2em;
 	}
 
 	.func-btn image {

+ 639 - 0
pages/mycenter/myinformation/myzhifubao.vue

@@ -0,0 +1,639 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view>
+			<!-- 支付宝信息绑定 -->
+			<view style="margin: 0 20rpx;">
+				<font style="margin: 50rpx 20rpx 30rpx;color: #878994;">支付宝信息绑定</font>
+				<uni-forms :modelValue="formData" err-show-type="undertext">
+
+					<uni-forms-item name="alipaynumber" required label="支付宝号">
+						<uni-easyinput type="text" :inputBorder="false" v-model="formData.alipay_number"
+							placeholder="请输入邮箱/手机号格式的账号">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="alipayname" required label="真实姓名">
+						<uni-easyinput type="text" :inputBorder="false" v-model="formData.alipay_real_name"
+							placeholder="请填写真实姓名">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="cardid" required label="身份证号">
+						<uni-easyinput type="text" :inputBorder="false" v-model="formData.alipay_card_id"
+							placeholder="18位身份证号">
+						</uni-easyinput>
+					</uni-forms-item>
+				</uni-forms>
+			</view>
+			<view>
+				<button class="btn1" @click="submitForm()">保存</button>
+			</view>
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	import region from '@/components/pca-code.json';
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				index1: 0,
+				formData: {
+					name: '',
+					phone: '',
+					bank_id: '',
+					bank_card_number: '',
+					bank_open_address: '',
+					bank_card_id: '',
+					alipay_number: '',
+					alipay_real_name: '',
+					alipay_card_id: '',					
+				},
+				oldRegion: region,
+				region: [
+					[],
+					[],
+					[]
+				],
+				// 选择省市区的下标Index  传则默认选中传递的
+				regionIndex: [0, 0, 0],
+				// 省市区字符串
+				regionStr: '请选择省市区',
+				array1: [{
+					name: '请选择',
+					id: 0
+				}, {
+					name: '中国农业银行',
+					id: 1
+				}, {
+					name: '中国工商银行',
+					id: 2
+				}],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "支付宝信息绑定",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+		onShow() {
+			this.getInfo();
+			this.getBankInfo()
+		},
+		methods: {
+			// 默认信息表,获取平台logo
+			getInfo() {
+				return this.$https.get('/youngee/c/g/get-info-tables')
+					.then(res => {
+						this.array1 = res.data.data.Bank
+					})
+			},
+			getBankInfo() {
+				this.$https.get('/youngee/c/t/g/get-talent-bank-info')
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.formData = res.data.data
+							if (this.formData.bank_id != '') {
+								this.index1 = this.formData.bank_id
+							}
+							if (this.formData.bank_open_address == 0) {
+								this.formData.bank_open_address = ''
+							} else {
+								let a = this.formData.bank_open_address.toString().slice(0, 2)
+								let b = this.formData.bank_open_address.toString().slice(0, 4)
+								let c = 0
+								for (var i = 0; i < region.length; i++) {
+									if (region[i].code == a) {
+										a = region[i].name
+										for (var j = 0; j < region[i].children.length; j++) {
+											if (region[i].children[j].code == b) {
+												b = region[i].children[j].name
+												for (var o = 0; o < region[i].children[j].children.length; o++) {
+													if (region[i].children[j].children[o].code == this.formData
+														.bank_open_address) {
+														c = region[i].children[j].children[o].name
+													}
+												}
+											}
+										}
+									}
+								}
+								this.regionStr = a + ' ' + b + ' ' + c
+							}
+						}
+					})
+			},
+			submitForm() {
+				let message2 = ""
+				let f2 = true
+				// 检查是否填写支付宝信息
+				if (this.formData.alipay_number == "") {
+					f2 = false;
+					message2 = "请输入正确的支付宝账号"
+				} else if (this.formData.alipay_real_name == "") {
+					f2 = false;
+					message2 = "请输入正确的姓名"
+				}else if (this.formData.alipay_card_id.length != 18) {
+					f2 = false;
+					message2 = "请输入正确的身份证号"
+				};
+				if (f2) {
+					console.log(this.formData)
+					console.log(message2)
+					this.$https.post('/youngee/c/t/p/add-talent-bank', this.formData)
+						.then(res => {
+							console.log(res)
+							uni.showToast({
+								title: "提现信息绑定成功",
+								icon: 'none'
+							})
+							let pages = getCurrentPages(); // 当前页面
+							let beforePage = pages[pages.length - 2]; // 上一页
+							uni.navigateBack({
+								success: function() {
+									beforePage
+										.onLoad(); // 执行上一页的onLoad方法
+								}
+							})
+						})
+				} else if (!f2) {
+					uni.showToast({
+						title: message2,
+						icon: 'none'
+					})
+				}
+
+			},
+			bindPickerChange1: function(e) {
+				console.log(e)
+				this.index1 = e.detail.value;
+				this.formData.bank_id = this.array1[this.index1].id
+				console.log(this.formData.bank_id)
+			},
+
+			//城市选择
+			pickerChange(e) {
+				// console.log(e, '1');
+				this.regionIndex = e.detail.value;
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[
+						1]]
+					.name + ' ' +
+					this.region[2][this.regionIndex[2]].name;
+
+				// 组件传值
+				this.$emit('region', [this.region[0][this.regionIndex[0]].code, this.region[1][this.regionIndex[1]]
+					.code,
+					this.region[
+						2][this.regionIndex[2]].code
+				]);
+				this.formData.bank_open_address = this.region[2][this.regionIndex[2]].code;
+
+			},
+			pickerColumnchange(e) {
+				// console.log(e);
+				// 第几列滑动
+				// console.log(e.detail.column);
+				// 第几列滑动的下标
+				// console.log(e.detail.value)
+
+				if (e.detail.column === 0) {
+					// 声明城市数组
+					let cityArr = [];
+					let countyArr = [];
+					// 设置下标
+					this.regionIndex = [e.detail.value, 0, 0];
+					// 改变城市列表
+					this.region[1] = this.oldRegion[e.detail.value].children.map(item => {
+						cityArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 1, cityArr);
+					// 改变县区列表
+					this.oldRegion[e.detail.value].children[0].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 1) {
+					this.regionIndex[1] = e.detail.value;
+					this.regionIndex[2] = 0;
+					let countyArr = [];
+					this.oldRegion[this.regionIndex[0]].children[this.regionIndex[1]].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 2) {
+					this.regionIndex[2] = e.detail.value;
+				}
+			}
+
+		},
+		created() {
+			let provinceArr = [];
+			let cityArr = [];
+			this.oldRegion.map((item, index) => {
+				this.region[0].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.previnceId == item.code) {
+					provinceArr = item.children;
+					this.regionIndex[0] = index;
+				}
+			})
+			// console.log(provinceArr);
+			provinceArr.map((item, index) => {
+				this.region[1].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.cityId == item.code) {
+					cityArr = item.children;
+					this.regionIndex[1] = index;
+				}
+			})
+			cityArr.map((item, index) => {
+				this.region[2].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.countyId == item.code)
+					this.regionIndex[2] = index;
+			})
+			if (this.isRevise)
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[1]]
+				.name + ' ' + this.region[2][this.regionIndex[2]].name;
+			else
+				this.regionStr = '请选择省市区';
+		}
+	}
+</script>
+
+
+<style>
+	picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-forms-item__inner {
+		border-bottom: none !important;
+		margin-bottom: 0 !important;
+	}
+</style>
+<style lang="scss" scoped>
+	view {
+		font-size: 14px;
+		line-height: inherit;
+	}
+
+	.menu {
+		position: fixed;
+		top: 180rpx;
+		border-bottom: #FCCF41;
+		background-color: #FFFFFF;
+		justify-content: space-around;
+		height: 5%;
+		width: 100%;
+		display: flex;
+		z-index: 10;
+	}
+
+	.menu-item p {
+		font-weight: 600;
+
+		&.lor {
+			border-bottom: 5rpx solid #F0D232;
+			color: #F0D232;
+			padding-bottom: 15rpx;
+		}
+	}
+
+	.btn1 {
+		margin: 30rpx;
+		font-size: 35rpx;
+		color: #000;
+		background-color: #F0D232;
+		border: none;
+		border-radius: 0;
+	}
+
+	.uni-input-border,
+	.uni-textarea-border {
+		flex: 1;
+		font-size: 14px;
+		color: #666;
+		border: 1px #FFFFFF solid;
+		border-radius: 5px;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-input-border {
+		padding: 0 10px;
+		height: 35px;
+	}
+
+	.uni-textarea-border {
+		padding: 10px;
+		height: 80px;
+	}
+
+	.label-box {
+		margin-right: 10px;
+	}
+
+	.transform-scale {
+		transform: scale(0.7);
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	.option {
+		padding: 20rpx;
+	}
+
+	.uni-margin-wrap {
+		width: 690rpx;
+		width: 100%;
+		;
+	}
+
+	.swiper {
+		height: 300rpx;
+	}
+
+	.swiper-item {
+		display: block;
+		height: 300rpx;
+		line-height: 300rpx;
+		text-align: center;
+	}
+
+	.swiper-list {
+		margin-top: 40rpx;
+		margin-bottom: 0;
+	}
+
+	.uni-common-mt {
+		margin-top: 60rpx;
+		position: relative;
+	}
+
+	.info {
+		position: absolute;
+		right: 20rpx;
+	}
+
+	.uni-padding-wrap {
+		width: 550rpx;
+		padding: 0 100rpx;
+	}
+
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+		justify-content: space-around;
+	}
+
+	.signuptext {
+		text-align: center;
+		margin-top: 2%;
+
+	}
+
+	.signuptext p {
+		font-size: 60%;
+		color: #333333;
+	}
+
+	.signupbut {
+		text-align: center;
+		margin-top: 2%;
+	}
+
+	.but1 {
+		width: 120%;
+		text-align: center;
+		background-color: #FCCF41;
+		border-radius: 10rpx;
+		color: #464100;
+		font-size: 28rpx;
+		line-height: 156%;
+
+		font-weight: 500;
+		height: 65%;
+	}
+
+	/deep/.uni-searchbar__box {
+		border-color: #267CFF !important;
+		border-width: 2rpx !important;
+	}
+
+	/deep/.uni-searchbar__box {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-searchbar__text-placeholder {
+		font-size: 30rpx !important;
+	}
+
+	/deep/.segmented-control__text {
+		font-size: 34rpx !important;
+	}
+
+	/deep/.uni-data-checklist {
+		padding-left: 20upx;
+	}
+
+	uni-picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-date-x--border {
+		border: 0px solid #dcdfe6 !important;
+	}
+
+	/deep/.is-input-border {
+		border: 0px solid #c8c7cc !important;
+	}
+
+	/deep/.uni-progress-info {
+		font-size: 25rpx !important;
+	}
+
+	/deep/.uni-error-message {
+		position: absolute;
+		bottom: -20rpx !important;
+		left: 20rpx !important;
+		text-align: left;
+	}
+
+	/deep/.uni-forms-item__inner {
+		padding-bottom: 0rpx !important;
+		margin-bottom: 30rpx !important;
+		border-bottom: 0.5rpx solid #CCCCCC;
+	}
+
+	/deep/.uni-group__title {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-list-item__content-title {
+		font-size: 30rpx !important;
+		color: #111111 !important;
+	}
+
+	/deep/.uni-progress-bar {
+		border-radius: 10rpx !important;
+	}
+
+	/deep/.uni-progress-inner-bar {
+		border-radius: 10rpx !important;
+	}
+
+
+	/deep/.is-input-border {
+		border-radius: 20px !important;
+		background-color: #fff;
+	}
+
+	.uni-easyinput__content-input {
+		font-size: 30upx !important;
+	}
+
+	.content-clear-icon {
+		font-size: 40upx !important;
+	}
+
+	/deep/.input-box {
+		padding: 50upx;
+		font-size: 30upx;
+
+		.input-item {
+			display: flex;
+
+			border: 1upx solid #F8F8F8;
+			line-height: 90upx;
+			height: 90upx;
+			margin-top: 20upx;
+			background: #F8F8F8;
+			border-radius: 48upx;
+
+			.input-label {
+				width: 150upx;
+				text-align: center;
+			}
+
+			.input-body {
+				position: relative;
+				height: 100upx;
+				width: calc(100% - 150upx);
+
+				.input {
+					line-height: 90upx;
+					height: 90upx;
+					position: relative;
+					font-size: 28upx;
+				}
+
+				.eye {
+					position: absolute;
+					height: 50upx;
+					width: 50upx;
+					right: 20upx;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+
+				.btn-code {
+					position: absolute;
+					right: 0upx;
+					top: 50%;
+					transform: translateY(-50%);
+					background: none;
+					color: #205592;
+					width: 160upx;
+					font-size: 24upx;
+					box-sizing: border-box;
+					text-align: center;
+					padding: 0;
+					height: 100upx;
+					line-height: 100upx;
+				}
+			}
+		}
+
+		.select {
+			// padding-top: 40upx;
+			display: flex;
+			justify-content: space-between;
+			color: #003B67;
+		}
+	}
+
+	/deep/.title-left {
+		width: 3px;
+		height: 16px;
+		background: #267CFF;
+		display: inline-block;
+		border-radius: 3px;
+		margin-top: 3px;
+		vertical-align: top;
+		margin-right: 10px;
+	}
+</style>

+ 13 - 86
pages/mycenter/myinformation/personinfo.vue

@@ -2,23 +2,8 @@
 	<view style="position: relative;">
 		<!-- 胶囊 -->
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item">
-				<p class='lor'>个人资料</p>
-			</view>
-			<view class="menu-item" @click="tomylocation()">
-				<p>收货地址</p>
-			</view>
-			<view class="menu-item" @click="tomyaccount()">
-				<p>社媒账号</p>
-			</view>
-			<view class="menu-item" @click="tomybank()">
-				<p>提现绑定</p>
-			</view>
-		</view>
-		<view style="padding-top: 260rpx;width: 97%;">
+		<view style="margin-top: 160rpx;"></view>
+		<view>
 			<!-- 个人信息完善 -->
 			<view style="margin: 0 20rpx;">
 				<uni-forms :rules="rules" :value="formData" ref="form" validate-trigger="bind"
@@ -89,13 +74,6 @@
 				index: 0,
 				index1: 0,
 				Xage: '请选择',
-				sex1: [{
-					text: '男',
-					value: 1
-				}, {
-					text: '女',
-					value: 2
-				}],
 				array: [{
 					age_bracket_discribe: '请选择',
 					age_aid: 0
@@ -128,24 +106,11 @@
 				data: {},
 				show: false,
 				rules: {
-					// wechat: {
-					// 	rules: [{
-					// 		required: true,
-					// 		errorMessage: '请输入微信号'
-					// 	}, ]
-					// },
-					// sex: {
-					// 	rules: [{
-					// 		required: true,
-					// 		errorMessage: '请选择性别'
-					// 	}, ]
-					// },
 					phone: {
 						rules: [{
-								required: true,
-								errorMessage: '请输入联系电话'
-							},
-						]
+							required: true,
+							errorMessage: '请输入联系电话'
+						}, ]
 					},
 				},
 				mysNavConfig: {
@@ -155,13 +120,13 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "个人资料管理",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
 					},
 					btnType: "type2",
-					onLeftClick: '/pages/mycenter/mycenter',
+					onLeftClick: '',
 					/* type2 按钮 */
 					type2Config: {
 						// 左图标
@@ -174,51 +139,18 @@
 				},
 			};
 		},
-		onLoad() {
-			uni.showLoading()
-			// this.formData 应该包含所有需要校验的表单
-			// 模拟异步请求数据
-			setTimeout(() => {
-				// 	this.formData = {
-				// 		wechat: '',
-				// 		age: '',
-				// skintype: '',
-				// 	}
-				uni.hideLoading()
-			}, 500)
-		},
+		onLoad() {},
 		onReady() {
 			this.$refs.form.setRules(this.rules)
 		},
-		onShow() {
-			console.log(this.array)
-			console.log(this.array1)
-			this.getlist()
+		async onShow() {
+			await this.getlist()
 			this.getlist1()
 		},
-
 		methods: {
-			// 进入收货地址填写页面
-			tomylocation() {
-				uni.navigateTo({
-					url: './mylocation'
-				});
-			},
-			// 进入社媒账号绑定页面
-			tomyaccount() {
-				uni.navigateTo({
-					url: './myaccount'
-				});
-			},
-			// 进入提现绑定页面
-			tomybank() {
-				uni.navigateTo({
-					url: './mybank'
-				});
-			},
 			// 信息表
 			getlist() {
-				this.$https.get('/youngee/c/g/get-info-tables')
+				return this.$https.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						console.log(res)
 						this.array = res.data.data.AgeBracket
@@ -226,7 +158,7 @@
 			},
 			// 达人详细信息表
 			getlist1() {
-				this.$https.get('/youngee/c/t/g/get-talent-info')
+				return this.$https.get('/youngee/c/t/g/get-talent-info')
 					.then(res => {
 						console.log(res)
 						if (res.data.data.talent_wx_number !== null) {
@@ -295,10 +227,6 @@
 				this.$refs[form]
 					.submit()
 					.then(res => {
-
-						console.log('表单的值:', res)
-						console.log(this.formData)
-						
 						const iphoneReg1 = /^1[0-9]{10}$/
 						if (!iphoneReg1.test(this.formData.phone)) {
 							uni.showToast({
@@ -328,7 +256,6 @@
 								}
 
 							})
-
 					})
 					.catch(errors => {
 						console.error('验证失败:', errors)
@@ -518,7 +445,7 @@
 	.btn1 {
 		margin: 30rpx;
 		font-size: 35rpx;
-		color: #FFFFFF;
+		color: #000;
 		background-color: #F0D232;
 		border: none;
 		border-radius: 0;

+ 0 - 211
pages/mycenter/mytask/applytask.vue

@@ -1,211 +0,0 @@
-<template>
-	<view>
-		<!-- 胶囊 -->
-		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="toAll()">
-				<p>全部</p>
-			</view>
-			<view class="menu-item">
-				<p class='lor'>已报名</p>
-			</view>
-			<view class="menu-item" @click="toexecute()">
-				<p>执行中</p>
-			</view>
-			<view class="menu-item" @click="toEnd()">
-				<p>已结束</p>
-			</view>
-		</view>
-		
-		<view class="home">
-			<view class="task" v-for="item in applyList">
-				<view @click="toDetail(item)">
-					<view class="task-head">
-						<view class="task-head-account">
-							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
-							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
-						</view>
-						<view class="task-head-status">
-							<p>{{item.task_stage_txt}}</p>
-						</view>
-					</view>
-					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import mvBar from "@/components/mys_navBar/mysNavBar";
-	export default {
-		components: {
-			mvBar,
-		},
-		data() {
-			return {
-				allList: [],
-				applyList: [],
-				goingList: [],
-				endList: [],
-				taskStageList: [],
-				mysNavConfig: {
-					/* 开启单页显示首页图标 */
-					isHome: true,
-					/* 固定导航  */
-					navFixed: true,
-					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
-					navTitle: {
-						text: "我的信息",
-						color: "",
-						fontSize: "32rpx", // px upx rpx
-						fontWeight: "normal", // 100 - 700
-					},
-					btnType: "type2",
-					onLeftClick: "/pages/mycenter/mycenter",
-					/* type2 按钮 */
-					type2Config: {
-						// 左图标
-						leftPath: "/static/img/png2.png",
-						// 右图标
-						rightPath: "/static/img/png4.png",
-						// 圆角
-						radius: "40rpx",
-					},
-				},
-			}
-		},
-		onLoad() {
-			uni.showLoading({
-				title: '加载中'
-			});
-			this.getInfoTable();
-		},
-		methods: {
-			getInfoTable() {
-				this.$https.get('/youngee/c/g/get-info-tables')
-					.then(res => {
-						console.log(res)
-						this.taskStageList = res.data.data.TaskStage
-						this.getList()
-					})
-			},
-			getList() {
-				console.log("run func getList")
-				this.$https.get('/youngee/c/t/g/get-task-brief-list').then(res => {
-					console.log(res)
-					this.applyList = res.data.data.sgin_up_Task_info_list
-					if (this.applyList != null) {
-						for (let i = 0; i < this.applyList.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.applyList[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.applyList[i].task_stage_txt = this.taskStageList[j].task_stage
-							}
-						}
-					}
-
-					console.log(this.applyList)
-					uni.hideLoading();
-				})
-			},
-			toAll() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/mytask'
-				});
-			},
-			toexecute() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/executetask'
-				});
-			},
-			toEnd() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/endtask'
-				});
-			},
-			toDetail(item) {
-				console.log("func toDetail running")
-				uni.navigateTo({
-					url: '/pages/workspace/taskdetail?taskId=' + item.task_id,
-					success(res) {
-						console.log(res);
-					},
-					fail(err) {
-						console.log(err);
-					}
-				});
-
-				console.log("func toDetail end")
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	view {
-		font-size: 14px;
-		line-height: inherit;
-	}
-
-	.menu {
-		position: fixed;
-		top: 180rpx;
-		border-bottom: #FCCF41;
-		background-color: #FFFFFF;
-		justify-content: space-around;
-		height: 5%;
-		width: 100%;
-		display: flex;
-		z-index: 10;
-	}
-
-	.menu-item p {
-		font-weight: 600;
-
-		&.lor {
-			border-bottom: 5rpx solid #F0D232;
-			color: #F0D232;
-			padding-bottom: 15rpx;
-		}
-	}
-
-	.home {
-		margin-top: 100rpx;
-	}
-
-	.task {
-		margin-bottom: 20rpx;
-		border-bottom: 1rpx #d7d7d7 solid;
-
-		.task-head {
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-			.task-head-account {
-				display: flex;
-			}
-
-			.task-head-status {
-				color: red;
-			}
-		}
-
-		.task-info {
-			display: flex;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-		}
-	}
-
-	.line {
-		border-bottom: 1rpx #AAAAAA solid;
-	}
-</style>

+ 0 - 212
pages/mycenter/mytask/endtask.vue

@@ -1,212 +0,0 @@
-<template>
-	<view>
-		<!-- 胶囊 -->
-		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="toAll()">
-				<p>全部</p>
-			</view>
-			<view class="menu-item" @click="toApply()">
-				<p>已报名</p>
-			</view>
-			<view class="menu-item" @click="toexecute()">
-				<p>执行中</p>
-			</view>
-			<view class="menu-item">
-				<p class='lor'>已结束</p>
-			</view>
-		</view>
-		
-		<view class="home">
-			<view class="task" v-for="item in endList">
-				<view @click="toDetail(item)">
-					<view class="task-head">
-						<view class="task-head-account">
-							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
-							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
-						</view>
-						<view class="task-head-status">
-							<p>{{item.task_stage_txt}}</p>
-						</view>
-					</view>
-					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
-					</view>
-				</view>
-			</view>
-		</view>
-		
-	</view>
-</template>
-
-<script>
-	import mvBar from "@/components/mys_navBar/mysNavBar";
-	export default {
-		components: {
-			mvBar,
-		},
-		data() {
-			return {
-				allList: [],
-				applyList: [],
-				goingList: [],
-				endList: [],
-				taskStageList: [],
-				mysNavConfig: {
-					/* 开启单页显示首页图标 */
-					isHome: true,
-					/* 固定导航  */
-					navFixed: true,
-					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
-					navTitle: {
-						text: "我的信息",
-						color: "",
-						fontSize: "32rpx", // px upx rpx
-						fontWeight: "normal", // 100 - 700
-					},
-					btnType: "type2",
-					onLeftClick: "/pages/mycenter/mycenter",
-					/* type2 按钮 */
-					type2Config: {
-						// 左图标
-						leftPath: "/static/img/png2.png",
-						// 右图标
-						rightPath: "/static/img/png4.png",
-						// 圆角
-						radius: "40rpx",
-					},
-				},
-			}
-		},
-		onLoad() {
-			uni.showLoading({
-				title: '加载中'
-			});
-			this.getInfoTable();
-		},
-		methods: {
-			getInfoTable() {
-				this.$https.get('/youngee/c/g/get-info-tables')
-					.then(res => {
-						console.log(res)
-						this.taskStageList = res.data.data.TaskStage
-						this.getList()
-					})
-			},
-			getList() {
-				console.log("run func getList")
-				this.$https.get('/youngee/c/t/g/get-task-brief-list').then(res => {
-					console.log(res)
-					this.endList = res.data.data.completed_Task_info_list
-					if (this.endList != null) {
-						for (let i = 0; i < this.endList.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.endList[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.endList[i].task_stage_txt = this.taskStageList[j].task_stage
-							}
-						}
-					}
-
-					console.log(this.endList)
-					uni.hideLoading();
-				})
-			},
-			toAll() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/mytask'
-				});
-			},
-			toApply() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/applytask'
-				});
-			},
-			toexecute() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/executetask'
-				});
-			},
-			toDetail(item) {
-				console.log("func toDetail running")
-				uni.navigateTo({
-					url: '/pages/workspace/taskdetail?taskId=' + item.task_id,
-					success(res) {
-						console.log(res);
-					},
-					fail(err) {
-						console.log(err);
-					}
-				});
-
-				console.log("func toDetail end")
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	view {
-		font-size: 14px;
-		line-height: inherit;
-	}
-
-	.menu {
-		position: fixed;
-		top: 180rpx;
-		border-bottom: #FCCF41;
-		background-color: #FFFFFF;
-		justify-content: space-around;
-		height: 5%;
-		width: 100%;
-		display: flex;
-		z-index: 10;
-	}
-
-	.menu-item p {
-		font-weight: 600;
-
-		&.lor {
-			border-bottom: 5rpx solid #F0D232;
-			color: #F0D232;
-			padding-bottom: 15rpx;
-		}
-	}
-
-	.home {
-		margin-top: 100rpx;
-	}
-
-	.task {
-		margin-bottom: 20rpx;
-		border-bottom: 1rpx #d7d7d7 solid;
-
-		.task-head {
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-			.task-head-account {
-				display: flex;
-			}
-
-			.task-head-status {
-				color: red;
-			}
-		}
-
-		.task-info {
-			display: flex;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-		}
-	}
-
-	.line {
-		border-bottom: 1rpx #AAAAAA solid;
-	}
-</style>

+ 0 - 211
pages/mycenter/mytask/executetask.vue

@@ -1,211 +0,0 @@
-<template>
-	<view>
-		<!-- 胶囊 -->
-		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
-		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
-		</view>
-		<view class="menu">
-			<view class="menu-item" @click="toAll()">
-				<p>全部</p>
-			</view>
-			<view class="menu-item" @click="toApply()">
-				<p>已报名</p>
-			</view>
-			<view class="menu-item">
-				<p  class='lor'>执行中</p>
-			</view>
-			<view class="menu-item" @click="toEnd()">
-				<p>已结束</p>
-			</view>
-		</view>
-		
-		<view class="home">
-			<view class="task" v-for="item in goingList">
-				<view @click="toDetail(item)">
-					<view class="task-head">
-						<view class="task-head-account">
-							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
-							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
-						</view>
-						<view class="task-head-status">
-							<p>{{item.task_stage_txt}}</p>
-						</view>
-					</view>
-					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import mvBar from "@/components/mys_navBar/mysNavBar";
-	export default {
-		components: {
-			mvBar,
-		},
-		data() {
-			return {
-				allList: [],
-				applyList: [],
-				goingList: [],
-				endList: [],
-				taskStageList: [],
-				mysNavConfig: {
-					/* 开启单页显示首页图标 */
-					isHome: true,
-					/* 固定导航  */
-					navFixed: true,
-					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
-					navTitle: {
-						text: "我的信息",
-						color: "",
-						fontSize: "32rpx", // px upx rpx
-						fontWeight: "normal", // 100 - 700
-					},
-					btnType: "type2",
-					onLeftClick: "/pages/mycenter/mycenter",
-					/* type2 按钮 */
-					type2Config: {
-						// 左图标
-						leftPath: "/static/img/png2.png",
-						// 右图标
-						rightPath: "/static/img/png4.png",
-						// 圆角
-						radius: "40rpx",
-					},
-				},
-			}
-		},
-		onLoad() {
-			uni.showLoading({
-				title: '加载中'
-			});
-			this.getInfoTable();
-		},
-		methods: {
-			getInfoTable() {
-				this.$https.get('/youngee/c/g/get-info-tables')
-					.then(res => {
-						console.log(res)
-						this.taskStageList = res.data.data.TaskStage
-						this.getList()
-					})
-			},
-			getList() {
-				console.log("run func getList")
-				this.$https.get('/youngee/c/t/g/get-task-brief-list').then(res => {
-					console.log(res)
-					this.goingList = res.data.data.going_on_Task_info_list
-					if (this.goingList != null) {
-						for (let i = 0; i < this.goingList.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.goingList[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.goingList[i].task_stage_txt = this.taskStageList[j].task_stage
-							}
-						}
-					}
-
-					console.log(this.goingList)
-					uni.hideLoading();
-				})
-			},
-			toAll() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/mytask'
-				});
-			},
-			toApply() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/applytask'
-				});
-			},
-			toEnd() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/endtask'
-				});
-			},
-			toDetail(item) {
-				console.log("func toDetail running")
-				uni.navigateTo({
-					url: '/pages/workspace/taskdetail?taskId=' + item.task_id,
-					success(res) {
-						console.log(res);
-					},
-					fail(err) {
-						console.log(err);
-					}
-				});
-
-				console.log("func toDetail end")
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	view {
-		font-size: 14px;
-		line-height: inherit;
-	}
-
-	.menu {
-		position: fixed;
-		top: 180rpx;
-		border-bottom: #FCCF41;
-		background-color: #FFFFFF;
-		justify-content: space-around;
-		height: 5%;
-		width: 100%;
-		display: flex;
-		z-index: 10;
-	}
-
-	.menu-item p {
-		font-weight: 600;
-
-		&.lor {
-			border-bottom: 5rpx solid #F0D232;
-			color: #F0D232;
-			padding-bottom: 15rpx;
-		}
-	}
-
-	.home {
-		margin-top: 100rpx;
-	}
-
-	.task {
-		margin-bottom: 20rpx;
-		border-bottom: 1rpx #d7d7d7 solid;
-
-		.task-head {
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-			.task-head-account {
-				display: flex;
-			}
-
-			.task-head-status {
-				color: red;
-			}
-		}
-
-		.task-info {
-			display: flex;
-			align-items: center;
-			padding: 10rpx 20rpx;
-
-		}
-	}
-
-	.line {
-		border-bottom: 1rpx #AAAAAA solid;
-	}
-</style>

+ 248 - 29
pages/mycenter/mytask/mytask.vue

@@ -4,22 +4,23 @@
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
 		<view style="height: 180rpx;width: 100%; position: fixed;background-color: #FFFFFF;top: 0;z-index: 8;">
 		</view>
-		<view class="menu">
-			<view class="menu-item">
-				<p class='lor'>全部</p>
+
+		<view class="menu" v-if="!loading">
+			<view class="menu-item" @click="toAll()">
+				<p v-bind:class="tab == 'all'?'lor':'unlor'">全部</p>
 			</view>
 			<view class="menu-item" @click="toApply()">
-				<p>已报名</p>
+				<p v-bind:class="tab == 'apply'?'lor':'unlor'">已报名</p>
 			</view>
 			<view class="menu-item" @click="toexecute()">
-				<p>执行中</p>
+				<p v-bind:class="tab == 'execute'?'lor':'unlor'">执行中</p>
 			</view>
 			<view class="menu-item" @click="toEnd()">
-				<p>已结束</p>
+				<p v-bind:class="tab == 'end'?'lor':'unlor'">已结案</p>
 			</view>
 		</view>
 
-		<view class="home">
+		<view class="home" v-if="tab == 'all' && !loading">
 			<view class="task" v-for="item in allList">
 				<view @click="toDetail(item)">
 					<view class="task-head">
@@ -32,8 +33,84 @@
 						</view>
 					</view>
 					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="home" v-if="tab == 'apply' && !loading">
+			<view class="task" v-for="item in applyList">
+				<view @click="toDetail(item)">
+					<view class="task-head">
+						<view class="task-head-account">
+							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
+							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
+						</view>
+						<view class="task-head-status">
+							<p>{{item.task_stage_txt}}</p>
+						</view>
+					</view>
+					<view class="task-info">
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="home" v-if="tab == 'execute' && !loading">
+			<view class="task" v-for="item in goingList">
+				<view @click="toDetail(item)">
+					<view class="task-head">
+						<view class="task-head-account">
+							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
+							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
+						</view>
+						<view class="task-head-status">
+							<p>{{item.task_stage_txt}}</p>
+						</view>
+					</view>
+					<view class="task-info">
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="home" v-if="tab == 'end' && !loading">
+			<view class="task" v-for="item in endList">
+				<view @click="toDetail(item)">
+					<view class="task-head">
+						<view class="task-head-account">
+							<image :src="item.platform_icon_url" style="height: 50rpx;width: 50rpx;"></image>
+							<p style="margin-left: 20rpx;">{{item.platform_nick_name}}</p>
+						</view>
+						<view class="task-head-status">
+							<p>{{item.task_stage_txt}}</p>
+						</view>
+					</view>
+					<view class="task-info">
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -43,12 +120,15 @@
 
 <script>
 	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import getRouter from '@/components/utils.js';
 	export default {
 		components: {
 			mvBar,
 		},
 		data() {
 			return {
+				loading: true,
+				tab: '',
 				allList: [],
 				applyList: [],
 				goingList: [],
@@ -78,7 +158,7 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "我的任务",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
@@ -97,53 +177,172 @@
 				},
 			}
 		},
-		onLoad() {
+		async onLoad(options) {
+			// 判断登录
+			await this.isLogin();
+			if (this.token === '') {
+				uni.showModal({
+					content: '请先登录',
+					success: function(res) {
+						if (res.confirm) {
+							uni.navigateTo({
+								url: '/pages/login/login'
+							});
+						} else if (res.cancel) {
+							uni.navigateBack();
+						}
+					}
+				});
+			}
+
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.tab = data.tab
+		},
+		async onShow() {
+			this.loading = true;
 			uni.showLoading({
 				title: '加载中'
 			});
-			this.getInfoTable();
+			await this.getInfoTable();
+			await this.getList();
+			uni.hideLoading();
+			this.loading = false;
 		},
 		methods: {
+			// 判断登陆是否过期
+			isLogin() {
+				return this.$https.get('/youngee/c/t/g/is-login')
+					.then(res => {
+						if (res.data.code === 403) {
+							// 登陆已失效
+							this.token = ""
+							uni.clearStorage();
+						} else {
+							this.token = uni.getStorageSync('token')
+						}
+					})
+			},
 			getInfoTable() {
-				this.$https.get('/youngee/c/g/get-info-tables')
+				return this.$https.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						console.log(res)
 						this.taskStageList = res.data.data.TaskStage
-						this.getList()
 					})
 			},
 			getList() {
-				console.log("run func getList")
-				this.$https.get('/youngee/c/t/g/get-task-brief-list').then(res => {
+				return this.$https.get('/youngee/c/t/g/get-task-brief-list').then(res => {
 					console.log(res)
 					this.allList = res.data.data.all_Task_info_list
 					if (this.allList != null) {
 						for (let i = 0; i < this.allList.length; ++i) {
+							let productPhoto = JSON.parse(this.allList[i].product_photo_snap);
+							for (let j = 0; j < productPhoto.length; j++) {
+								if (productPhoto[j].Symbol == 1) {
+									this.allList[i].product_img_url = productPhoto[j].PhotoUrl
+								}
+							}
+							if ((this.allList[i].task_stage == 7 && this.allList[i].script_status == 3) ||
+								(this.allList[i].task_stage == 9 && this.allList[i].sketch_status == 3) ||
+								(this.allList[i].task_stage == 11 && this.allList[i].link_status == 3) ||
+								(this.allList[i].task_stage == 13 && this.allList[i].data_status == 3)) {
+								this.allList[i].isShowModify = true
+							} else {
+								this.allList[i].isShowModify = false
+							}
+
 							for (let j = 0; j < this.taskStageList.length; ++j) {
 								if (this.allList[i].task_stage == this.taskStageList[j].task_stage_id)
 									this.allList[i].task_stage_txt = this.taskStageList[j].task_stage
 							}
 						}
 					}
-
-					console.log(this.allList)
-					uni.hideLoading();
+					this.applyList = res.data.data.sgin_up_Task_info_list
+					if (this.applyList != null) {
+						for (let i = 0; i < this.applyList.length; ++i) {
+							let productPhoto = JSON.parse(this.applyList[i].product_photo_snap);
+							for (let j = 0; j < productPhoto.length; j++) {
+								if (productPhoto[j].Symbol == 1) {
+									this.applyList[i].product_img_url = productPhoto[j].PhotoUrl
+								}
+							}
+							for (let j = 0; j < this.taskStageList.length; ++j) {
+								if (this.applyList[i].task_stage == this.taskStageList[j].task_stage_id)
+									this.applyList[i].task_stage_txt = this.taskStageList[j].task_stage
+							}
+						}
+					}
+					this.goingList = res.data.data.going_on_Task_info_list
+					if (this.goingList != null) {
+						for (let i = 0; i < this.goingList.length; ++i) {
+							let productPhoto = JSON.parse(this.goingList[i].product_photo_snap);
+							for (let j = 0; j < productPhoto.length; j++) {
+								if (productPhoto[j].Symbol == 1) {
+									this.goingList[i].product_img_url = productPhoto[j].PhotoUrl
+								}
+							}
+							if ((this.goingList[i].task_stage == 7 && this.goingList[i].script_status == 3) ||
+								(this.goingList[i].task_stage == 9 && this.goingList[i].sketch_status == 3) ||
+								(this.goingList[i].task_stage == 11 && this.goingList[i].link_status == 3) ||
+								(this.goingList[i].task_stage == 13 && this.goingList[i].data_status == 3)) {
+								this.goingList[i].isShowModify = true
+							} else {
+								this.goingList[i].isShowModify = false
+							}
+							for (let j = 0; j < this.taskStageList.length; ++j) {
+								if (this.goingList[i].task_stage == this.taskStageList[j].task_stage_id)
+									this.goingList[i].task_stage_txt = this.taskStageList[j].task_stage
+							}
+						}
+					}
+					this.endList = res.data.data.completed_Task_info_list
+					if (this.endList != null) {
+						for (let i = 0; i < this.endList.length; ++i) {
+							let productPhoto = JSON.parse(this.endList[i].product_photo_snap);
+							for (let j = 0; j < productPhoto.length; j++) {
+								if (productPhoto[j].Symbol == 1) {
+									this.endList[i].product_img_url = productPhoto[j].PhotoUrl
+								}
+							}
+							for (let j = 0; j < this.taskStageList.length; ++j) {
+								if (this.endList[i].task_stage == this.taskStageList[j].task_stage_id)
+									this.endList[i].task_stage_txt = this.taskStageList[j].task_stage
+							}
+						}
+					}
 				})
 			},
-			toApply() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/applytask'
+			async toAll() {
+				this.tab = 'all'
+				uni.showLoading({
+					title: '加载中'
 				});
+				await this.getList()
+				uni.hideLoading()
 			},
-			toexecute() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/executetask'
+			async toApply() {
+				this.tab = 'apply'
+				uni.showLoading({
+					title: '加载中'
 				});
+				await this.getList()
+				uni.hideLoading()
 			},
-			toEnd() {
-				uni.navigateTo({
-					url: '/pages/mycenter/mytask/endtask'
+			async toexecute() {
+				this.tab = 'execute'
+				uni.showLoading({
+					title: '加载中'
 				});
+				await this.getList()
+				uni.hideLoading()
+			},
+			async toEnd() {
+				this.tab = 'end'
+				uni.showLoading({
+					title: '加载中'
+				});
+				await this.getList()
+				uni.hideLoading()
 			},
 			toDetail(item) {
 				console.log("func toDetail running")
@@ -156,7 +355,6 @@
 						console.log(err);
 					}
 				});
-
 				console.log("func toDetail end")
 			},
 		}
@@ -189,6 +387,12 @@
 			color: #F0D232;
 			padding-bottom: 15rpx;
 		}
+
+		&.unlor {
+			border-bottom: 5rpx solid #fff;
+			color: #81838f;
+			padding-bottom: 15rpx;
+		}
 	}
 
 	.home {
@@ -217,8 +421,23 @@
 		.task-info {
 			display: flex;
 			align-items: center;
+			justify-content: space-between;
 			padding: 10rpx 20rpx;
 
+			.task-info-left {
+				display: flex;
+				align-items: center;
+			}
+
+			.task-info-right {
+				width: 100rpx;
+				height: 100rpx;
+				border-radius: 50%;
+				border: #ffcb41 2rpx solid;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
 		}
 	}
 

+ 26 - 3
pages/tasksquare/bindinfo.vue

@@ -253,7 +253,7 @@
 					navFixed: true,
 					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
 					navTitle: {
-						text: "我的信息",
+						text: "个人信息",
 						color: "",
 						fontSize: "32rpx", // px upx rpx
 						fontWeight: "normal", // 100 - 700
@@ -270,13 +270,13 @@
 						radius: "40rpx",
 					},
 				},
-
 			}
 		},
 		onReady() {
 			this.$refs.form.setRules(this.rules)
 		},
 		onShow() {
+			this.initRegion()
 			this.getDefaultAddress()
 			this.getlist()
 		},
@@ -288,6 +288,29 @@
 			}
 		},
 		methods: {
+			initRegion() {
+				// 声明城市数组
+				let cityArr = [];
+				let countyArr = [];
+				// 设置下标
+				this.regionIndex = [0, 0, 0];
+				// 改变城市列表
+				this.region[1] = this.oldRegion[0].children.map(item => {
+					cityArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 1, cityArr);
+				// 改变县区列表
+				this.oldRegion[0].children[0].children.map(item => {
+					countyArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 2, countyArr);
+			},
 			// 信息表
 			getlist() {
 				this.$https.get('/youngee/c/g/get-info-tables')
@@ -497,7 +520,7 @@
 					})
 					uni.navigateBack()
 				}).catch(err => {
-					console.error('验证失败:', errors)
+					console.error('验证失败:', err)
 					uni.showToast({
 						title: '请填写所有信息',
 						icon: 'none'

+ 5 - 4
pages/tasksquare/cooperation.vue

@@ -4,8 +4,7 @@
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
 		<view class="home">
 			<!-- 我是品牌合作页面 -->
-			<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/h8.png" style="width: 100%;"
-				mode="widthFix"></image>
+			<image :src="picture.coop" style="width: 100%;" mode="widthFix"></image>
 		</view>
 
 
@@ -20,8 +19,10 @@
 		},
 		data() {
 			return {
-
-
+				picture: {
+					guide: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/cooperation/guide.png',
+					coop: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/cooperation/coop.png'
+				},
 				mysNavConfig: {
 					/* 占位开启  */
 					// navPadding: true,

+ 3 - 2
pages/tasksquare/guide.vue

@@ -4,7 +4,7 @@
 		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
 		<view class="home">
 			<!-- 我是新人指南页面 -->
-			<image :src="picture.h5" style="width: 100%;" mode="widthFix"></image>
+			<image :src="picture.guide" style="width: 100%;" mode="widthFix"></image>
 		</view>
 
 
@@ -20,7 +20,8 @@
 		data() {
 			return {
 				picture: {
-					h5: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/h5.png'
+					guide: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/cooperation/guide.png',
+					coop: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/cooperation/coop.png'
 				},
 
 				mysNavConfig: {

+ 73 - 26
pages/tasksquare/information.vue

@@ -8,7 +8,7 @@
 			</image>
 			<view class="basicInfo_txt">
 				<p style="margin-bottom: 10rpx;font-size: 35rpx;font-weight: 550;">{{project.project_name}}</p>
-				<p style="font-size: 30rpx;">商品价值:{{project.Product.product_price}}</p>
+				<p style="font-size: 30rpx;">商品价值:{{project.Product.ProductPrice}}元</p>
 			</view>
 		</view>
 
@@ -22,46 +22,46 @@
 					<p class='ipon' style="padding-right: 100rpx;">{{address.receiver_name}}</p>
 					<p class='ipon'>{{address.phone_number}}</p>
 				</view>
-				<p class='ipon'>{{address.detail_addr}}</p>
+				<p class='ipon'>{{address.full_detail_addr}}</p>
 			</view>
 			<view class="address_edit" @click="editAddress()">
 				<image :src="picture.icon_edit" mode="">
 				</image>
 			</view>
-
 		</view>
 
 		<view class="keyInfo">
-			<h3>关键任务信息</h3>
+			<p style="margin-bottom: 30rpx;font-size: 36rpx;font-weight: 600">关键任务信息</p>
 			<p style="font-weight: 600;margin-top: 10rpx;">合作方式</p>
-			<view style="display: flex;font-weight: 600;padding-top: 10rpx;">
-				<p>粉丝量{{strategy.followers_low}}-{{strategy.followers_up}}
+			<view style="display: flex;font-weight: 500;padding-top: 10rpx;">
+				<p>粉丝量{{strategy.show_followers_low}}-{{strategy.show_followers_up}}
 					&nbsp;&nbsp;
 					稿费-{{strategy.fee_form_t}}
 				</p>
-				<view v-if="strategy.fee_form!=1">
+				<view v-if="strategy.fee_form==3">
 					<p>{{strategy.offer}}</p>
 				</view>
-
 			</view>
-			<view style="display: flex;margin-top: 10rpx;">
-				<p style="font-weight: 600;">社媒平台:</p>
-				<p>{{project.project_platform_t}}</p>
+			<view style="border-bottom: #dfdfdf 1px solid;margin: 10rpx 0 0;"></view>
+			<p style="font-weight: 600;margin-top: 10rpx;">社媒平台</p>
+			<view style="display: flex;font-weight: 500;padding-top: 10rpx;">
+				<p>{{project.PlatformInfo.platform_name}}</p>
 			</view>
+			<view style="border-bottom: #dfdfdf 1px solid;margin: 10rpx 0 0;"></view>
 			<p style="font-weight: 600;margin-top: 10rpx;">任务要求</p>
 			<view class="keyInfo_task">
 				<view style="display: flex;align-items: center;margin: 5rpx 0;">
 					<p>内容形式:</p>
 					<p class="keyInfo_task_txt">{{project.content}}</p>
-
-					<p style="margin-left: 50rpx;">任务形式:</p>
+				</view>
+				<view style="display: flex;align-items: center;margin: 5rpx 0;">
+					<p>任务形式:</p>
 					<p class="keyInfo_task_txt">{{project.project_form}}</p>
 				</view>
 				<p style="margin: 5rpx 0;">商品描述:</p>
-				<p class="keyInfo_task_txt"> {{project.Product.product_detail}}
-				</p>
-				<p style="margin: 5rpx 0;">任务详情:</p>
-				<p class="keyInfo_task_txt"> {{project.project_detail}} </p>
+				<text class="keyInfo_task_txt">{{project.Product.ProductDetail}}</text>
+				<p style="margin: 35rpx 0 0rpx;">任务详情:</p>
+				<text class="keyInfo_task_txt">{{project.project_detail}}</text>
 			</view>
 		</view>
 
@@ -72,7 +72,7 @@
 			</view>
 			<view class="account_fans">
 				<p style="padding-right: 20rpx;color:#A8A8A8;">粉丝数</p>
-				<p>{{account.fans_count}}</p>
+				<p>{{account.show_fans_count}}</p>
 			</view>
 			<view class="account_btn" @click="editAccount(item)">
 				<image :src="picture.togoimg" mode="" style="width: 16rpx;height: 30rpx;"></image>
@@ -87,7 +87,11 @@
 </template>
 
 <script>
+	import region from '@/components/pca-code.json';
 	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import {
+		fansview
+	} from '@/components/utils.js';
 	export default {
 		components: {
 			mvBar
@@ -144,10 +148,18 @@
 		onLoad(options) {
 			this.textObj = options.textObj.replace(/""/g, "");
 			this.textObj = JSON.parse(decodeURIComponent(this.textObj))
-			// this.textObj = JSON.parse(decodeURIComponent(options.textObj))
 			console.log(this.textObj)
 			this.project = this.textObj.information
 			this.strategy = this.textObj.strategy
+			// console.log(this.project)
+
+			for (let i = 0; i < this.project.Product.ProductPhoto.length; ++i) {
+				if (this.project.Product.ProductPhoto[i].Symbol === 1) {
+					this.mainImg = this.project.Product.ProductPhoto[i].PhotoUrl
+				}
+			}
+			this.strategy.show_followers_low = fansview(this.strategy.followers_low)
+			this.strategy.show_followers_up = fansview(this.strategy.followers_up)
 		},
 		methods: {
 			getAccount() {
@@ -162,14 +174,35 @@
 									this.account = account[i]
 								}
 							}
+							this.account.show_fans_count = fansview(this.account.fans_count)
 						}
 					})
 			},
 			getDefaultAddress() {
 				this.$https.get('/youngee/c/t/g/get-talent-default-address').then(res => {
-					console.log("address")
 					console.log(res.data.data)
 					this.address = res.data.data;
+					let a = this.address.region_code.toString().slice(0, 2)
+					let b = this.address.region_code.toString().slice(0, 4)
+					let c = 0
+					for (var i = 0; i < region.length; i++) {
+						if (region[i].code == a) {
+							a = region[i].name
+							for (var j = 0; j < region[i].children.length; j++) {
+								if (region[i].children[j].code == b) {
+									b = region[i].children[j].name
+									for (var o = 0; o < region[i].children[j].children.length; o++) {
+										if (region[i].children[j].children[o].code == this.address
+											.region_code) {
+											c = region[i].children[j].children[o].name
+										}
+									}
+								}
+
+							}
+						}
+					}
+					this.address.full_detail_addr = a + b + c + this.address.detail_addr
 				})
 			},
 			editAddress() {
@@ -183,6 +216,11 @@
 						this.account.account_id
 				});
 			},
+			debugSubmit() {
+				uni.navigateTo({
+					url: '/pages/tasksquare/success'
+				});
+			},
 			// 提交确认报名
 			submit() {
 				console.log(this.project)
@@ -218,10 +256,13 @@
 					strategy_id: this.strategy.strategy_id,
 					offer: this.strategy.offer,
 				}).then(res => {
-					console.log(res.data.data)
 					if (res.data.code == 0) {
+						var data = {
+							task_id: res.data.data
+						};
+						data = JSON.stringify(data)
 						uni.navigateTo({
-							url: '/pages/tasksquare/success'
+							url: '/pages/tasksquare/success?textObj=' + encodeURIComponent(data)
 						});
 					}
 				})
@@ -249,9 +290,14 @@
 </script>
 
 <style lang="scss" scoped>
+	text {
+		font-size: 30rpx;
+	}
+
 	.basicInfo {
 		display: flex;
 		margin: 0 40rpx;
+		padding: 30rpx 0;
 
 		.basicInfo_txt {
 			margin-left: 40rpx;
@@ -261,7 +307,8 @@
 
 	.address {
 		display: flex;
-		margin: 50rpx 40rpx 0;
+		margin: 30rpx 40rpx 0;
+		padding: 30rpx 0;
 		justify-content: space-around;
 
 		.address_icon {
@@ -291,15 +338,15 @@
 	}
 
 	.keyInfo {
-		margin: 50rpx 40rpx 0;
+		margin: 30rpx 40rpx 0;
 
 		.keyInfo_task {
 			color: #999999;
 
 			.keyInfo_task_txt {
-				border: 1rpx solid #CCCCCC;
+				// border: 1rpx solid #CCCCCC;
 				border-radius: 10rpx;
-				padding: 10rpx;
+				// padding: 10rpx;
 			}
 		}
 	}

+ 1125 - 0
pages/tasksquare/search.vue

@@ -0,0 +1,1125 @@
+<template>
+	<view class="nav">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view class="home" style="padding-top: 160rpx;">
+			<view>
+				<uni-search-bar @confirm="search" :focus="true" v-model="searchValue">
+				</uni-search-bar>
+			</view>
+			<view class="commodity" style="margin-top: 3%;">
+				<view class="project" v-for="(item,index) in projectList" :key="index" @tap="project(item)">
+					<view class="projectdiagram" :style="{backgroundImage:`url(${item.coverphoto})`}">
+						<view class="Mask" v-if="item.ddl">
+							<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home4.png" mode="">
+							</image>
+						</view>
+						<view style="padding-left: 4%;padding-top: 2%;">
+						</view>
+					</view>
+					<view class="projecttext">
+						<image :src="item.project_imgper" mode=""></image>
+						<span>{{item.project_name|ellipsis}}</span>
+					</view>
+					<view style="padding-left: 1%;">
+						<view class="TitleText" v-if="item.isself===1">
+							<p>自报价</p>
+						</view>
+						<view class="TitleText" v-if="item.isfixedfee===1">
+							<p>固定稿费</p>
+						</view>
+						<view class="TitleText" v-if="item.project_form===3">
+							<p>线下探店</p>
+						</view>
+					</view>
+
+					<view class="introduction">
+						<view class="rleft" style="">
+							<p>商品价值: <span
+									style="color: red;font-weight: 600;">¥{{item.ProductInfo.ProductPrice}}</span></p>
+						</view>
+						<view class="rright" style="display: flex;justify-content:space-between;">
+							<p>招募人数: <span style="color: balck;font-weight: 600;">{{item.taskNum}}</span></p>
+							<p>报名人数: <span style="color: balck;font-weight: 600;">{{item.apply_num}}</span>
+							</p>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 普通弹窗  公众号-->
+		<uni-popup ref="popup4" class="share" background-color="#fff" @change="change">
+			<view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }">
+				<view class="sharepage">
+					<view class="projecttext1">
+						<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/project15.png"
+							style="width: 80rpx; height: 80rpx;" mode=""></image>
+						<span>YoungGee</span>
+					</view>
+					<view class="" style="margin-top: 5%;">
+						<p style='color: #333333;font-size: 28rpx;text-align: center;'>扫码联系</p>
+					</view>
+					<view class="sharemap">
+						<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/kefu.png"
+							style="width: 400rpx;height: 400rpx;" mode=""></image>
+					</view>
+				</view>
+
+			</view>
+		</uni-popup>
+		<view class="contact" @click="toggle4('center')">
+			<view class="contt">
+				<!-- <image class="img2" src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home2.png" mode=""></image> -->
+				<image class="img1"
+					src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/kefu_20211124192542.png" mode="">
+				</image>
+
+			</view>
+
+		</view>
+	</view>
+</template>
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import request from '@/components/request.js'
+	import searchVue from "./search.vue";
+	/* 默认首页路径 */
+	const homePath = "/pages/pupu/pupudao";
+	/* 默认首页图标路径 */
+	const homeIconPath = "/static/img/png4.png";
+	/* 默认返回图标路径 */
+	const backIconPath = "/static/img/png2.png";
+	export default {
+		props: {
+			scrollTop: {
+				type: Number,
+				default: function() {
+					return 0;
+				},
+			},
+		},
+		filters: {
+			ellipsis(value) {
+				if (!value) return "";
+				if (value.length > 20) {
+					return value.slice(0, 20) + "...";
+				}
+				return value;
+			},
+		},
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				searchValue: "",
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "任务搜索",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+				token: '',
+				per: 0,
+				type4: 'center',
+				//轮播图
+				img: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home1.png',
+				background: ['color1', 'color2', 'color3'],
+				indicatorDots: true,
+				autoplay: true,
+				interval: 3000,
+				duration: 1000,
+				list1: [{
+						img: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home1.png',
+						name: '/pages/tasksquare/guide'
+					},
+					{
+						img: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home7.png',
+						name: '/pages/tasksquare/cooperation'
+					}
+				],
+				//弹窗
+				type: 'center',
+				formData: {
+					hobby: [],
+					hobby1: [],
+					hobby2: [],
+				},
+				hobby: [],
+				hobby1: [{
+					text: '产品置换',
+					value: 1
+				}, {
+					text: '固定稿费',
+					value: 2
+				}, {
+					text: '自报价',
+					value: 3
+				}],
+				hobby2: [{
+					text: '实体商品寄拍',
+					value: 1
+				}, {
+					text: '虚拟产品测评',
+					value: 2
+				}, {
+					text: '线下探店打卡',
+					value: 3
+				}],
+				iconW: undefined,
+				iconH: undefined,
+				btnWidth: undefined,
+				btnHeight: undefined,
+				navBarTop: undefined,
+				navBarHeight: undefined,
+				navBarLeft: undefined,
+				navBarRight: undefined,
+				inputHeight: undefined,
+				opacity: 0,
+				isHome: false,
+				homeIconPath: homeIconPath,
+				backIconPath: backIconPath,
+				img: '../../static/home/home.png',
+				// 最多显示页数
+				max_page: '',
+				tupian: {
+					wen: '原创图片',
+					lin: 1,
+				},
+				projectList: [],
+				img456: '../../static/home/home.png',
+				platformList: [],
+				filtCondition: '',
+			};
+		},
+		computed: {
+			isSharePage() {},
+		},
+		watch: {
+			scrollTop(val) {
+				if (!this.mysNavConfig.isOpacity) {
+					return;
+				}
+				this.setOpacity(val, this.mysNavConfig.opacityTime);
+			},
+		},
+		onShow() {
+			this.isLogin()
+		},
+		onLoad() {
+			this.getInfoList()
+			this.per = 0
+			this.getProjectListAPI()
+		},
+		//下拉刷新
+		onPullDownRefresh() {
+			this.per = 0
+			this.getProjectListAPI()
+			//停止下拉刷新
+			uni.stopPullDownRefresh()
+		},
+		// 下拉懒加载
+		async onReachBottom() {
+			++this.per;
+			if (this.per >= this.max_page) {
+				uni.showToast({
+					title: "已加载全部"
+				})
+			} else {
+				uni.showLoading({
+					title: '加载中'
+				})
+				await this.$http.get('/youngee/c/g/get-project-list' +
+					"?" +
+					"idx" +
+					"=" +
+					this.per +
+					"&cnt" +
+					"=" +
+					20 + this.filtCondition
+				).then(res => {
+					console.log(res)
+					this.max_page = res.data.data.max_page
+					for (var i = 0; i < res.data.data.ProjectInfos.length; i++) {
+						// 封面图片
+						res.data.data.ProjectInfos[i].ProductInfo = JSON.parse(res.data.data.ProjectInfos[i]
+							.product_snap);
+
+						// 封面图片
+						let ProductPhoto = JSON.parse(res.data.data.ProjectInfos[i].product_photo_snap);
+						for (let j = 0; j < ProductPhoto.length; ++j) {
+							if (ProductPhoto[j].Symbol == 1) {
+								res.data.data.ProjectInfos[i].coverphoto = ProductPhoto[j].PhotoUrl
+							}
+						}
+						// 获取平台图片
+						for (var j = 0; j < this.platformList.length; j++) {
+							if (res.data.data.ProjectInfos[i].project_platform === this.platformList[j]
+								.id) {
+								res.data.data.ProjectInfos[i].project_imgper = this.platformList[j]
+									.platform_icon
+							}
+						}
+
+						// 任务数量&稿费形式
+						res.data.data.ProjectInfos[i].taskNum = 0
+						let lengthOfRecruitStrategys = res.data.data.ProjectInfos[i]
+							.RecruitStrategys != null ? res.data.data.ProjectInfos[i]
+							.RecruitStrategys
+							.length : 0
+						for (var j = 0; j < lengthOfRecruitStrategys; j++) {
+							res.data.data.ProjectInfos[i].taskNum = Number(res.data.data
+								.ProjectInfos[i]
+								.taskNum) + Number(res.data.data.ProjectInfos[i]
+								.RecruitStrategys[j]
+								.recruit_number)
+
+							res.data.data.ProjectInfos[i].isfixedfee = 0
+							if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 2) {
+								res.data.data.ProjectInfos[i].isfixedfee = 1
+							}
+
+							res.data.data.ProjectInfos[i].isself = 0
+							if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 3) {
+								res.data.data.ProjectInfos[i].isself = 1
+							}
+						}
+						//结束时间
+						var newdate = new Date()
+						// console.log(newdate)
+						var endTime = new Date(res.data.data.ProjectInfos[i].recruit_ddl.replace(
+							/-/g, "/"));
+						res.data.data.ProjectInfos[i].ddl = endTime - newdate < 0 ? 1 : 0
+						res.data.data.ProjectInfos[i].recruit_ddl = this.thistime(res.data.data
+							.ProjectInfos[i]
+							.recruit_ddl)
+					}
+					this.projectList.push.apply(this.projectList, res.data.data.ProjectInfos);
+					console.log(this.projectList)
+				})
+				uni.hideLoading();
+			}
+		},
+		methods: {
+			async search(res) {
+				uni.showToast({
+					title: '搜索:' + res.value,
+					icon: 'none'
+				})
+				this.per = 0;
+				this.filtCondition = ''
+				if (res.value != "")
+					this.filtCondition = "&searchvalue" + "=" + res.value
+				uni.showLoading({
+					title: '加载中'
+				});
+				await this.getProjectListAPI()
+				uni.hideLoading();
+			},
+			getProjectListAPI() {
+				return this.$http.get('/youngee/c/g/get-project-list' +
+					"?" +
+					"idx" +
+					"=" +
+					this.per +
+					"&cnt" +
+					"=" +
+					20 + this.filtCondition
+				).then(res => {
+					console.log(res)
+					if (res.data.code === 0) {
+						for (var i = 0; i < res.data.data.ProjectInfos.length; i++) {
+							// 封面图片
+							res.data.data.ProjectInfos[i].ProductInfo = JSON.parse(res.data.data.ProjectInfos[i]
+								.product_snap);
+
+							// 封面图片
+							let ProductPhoto = JSON.parse(res.data.data.ProjectInfos[i].product_photo_snap);
+							for (let j = 0; j < ProductPhoto.length; ++j) {
+								if (ProductPhoto[j].Symbol == 1) {
+									res.data.data.ProjectInfos[i].coverphoto = ProductPhoto[j].PhotoUrl
+								}
+							}
+							// 获取平台图片
+							for (var j = 0; j < this.platformList.length; j++) {
+								if (res.data.data.ProjectInfos[i].project_platform === this.platformList[j]
+									.id) {
+									res.data.data.ProjectInfos[i].project_imgper = this.platformList[j]
+										.platform_icon
+								}
+							}
+
+							// 任务数量&稿费形式
+							res.data.data.ProjectInfos[i].taskNum = 0
+							let lengthOfRecruitStrategys = res.data.data.ProjectInfos[i]
+								.RecruitStrategys != null ? res.data.data.ProjectInfos[i]
+								.RecruitStrategys
+								.length : 0
+							for (var j = 0; j < lengthOfRecruitStrategys; j++) {
+								res.data.data.ProjectInfos[i].taskNum = Number(res.data.data
+									.ProjectInfos[i]
+									.taskNum) + Number(res.data.data.ProjectInfos[i]
+									.RecruitStrategys[j]
+									.recruit_number)
+
+								res.data.data.ProjectInfos[i].isfixedfee = 0
+								if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 2) {
+									res.data.data.ProjectInfos[i].isfixedfee = 1
+								}
+
+								res.data.data.ProjectInfos[i].isself = 0
+								if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 3) {
+									res.data.data.ProjectInfos[i].isself = 1
+								}
+							}
+							//结束时间
+							var newdate = new Date()
+							// console.log(newdate)
+							var endTime = new Date(res.data.data.ProjectInfos[i].recruit_ddl.replace(
+								/-/g, "/"));
+							res.data.data.ProjectInfos[i].ddl = endTime - newdate < 0 || res.data.data
+								.ProjectInfos[i]
+								.project_status > 4 ? 1 : 0
+							res.data.data.ProjectInfos[i].recruit_ddl = this.thistime(res.data.data
+								.ProjectInfos[i]
+								.recruit_ddl)
+						}
+						this.max_page = res.data.data.max_page
+						this.projectList = res.data.data.ProjectInfos;
+					} else if (res.data.code === -4) {
+						uni.showToast({
+							title: "暂无任务"
+						})
+						this.max_page = 1
+						this.projectList = []
+					} else {
+						uni.showToast({
+							title: res.data.msg
+						})
+						this.max_page = 1
+						this.projectList = []
+					}
+				})
+			},
+			// 判断登陆是否过期
+			isLogin() {
+				return this.$https.get('/youngee/c/t/g/is-login')
+					.then(res => {
+						if (res.data.code === 403) {
+							// 登陆已失效
+							this.token = ""
+							uni.clearStorage();
+						} else {
+							this.token = uni.getStorageSync('token')
+						}
+					})
+			},
+			// 信息表
+			getInfoList() {
+				return this.$http.get('/youngee/c/g/get-info-tables')
+					.then(res => {
+						this.hobby = []
+						this.platformList = res.data.data.ThirdPlatform
+						let l = this.platformList != null ? this.platformList.length : 0;
+						for (var i = 0; i < l; i++) {
+							var obj = {}
+							obj.text = this.platformList[i].platform_name
+							obj.value = this.platformList[i].id
+							this.hobby.push(obj)
+						}
+					})
+			},
+			// 计算结束时间
+			thistime(val) {
+				// 转换格式
+				var beginTime = new Date(val.replace(/-/g, "/"));
+				// 当前时间
+				var thisTime = new Date();
+				// 相减
+				var dateMiss = beginTime.getTime() - thisTime.getTime();
+				// 天数
+				var day = Math.floor(dateMiss / (24 * 3600 * 1000));
+				// 减去天数剩下的毫秒数
+				var backOne = dateMiss % (24 * 3600 * 1000);
+				// 小时数
+				var hours = Math.floor(backOne / (3600 * 1000));
+				var deadline_time = '',
+					deadline_time = day + '天' + hours + '时结束'
+				return deadline_time
+			},
+			//弹出层
+			change(e) {
+				console.log('当前模式:' + e.type + ',状态:' + e.show);
+			},
+			toggle4(type) {
+				this.type4 = type
+				// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
+				this.$refs.popup4.open(type)
+				// this.$refs.popup1.close()
+			},
+			xieyi() {
+				console.log('进入联系我们')
+			},
+			go(url) {
+				uni.navigateTo({
+					url: url,
+				});
+			},
+			// 进入任务详情
+			project(item) {
+				// uni.navigateTo({
+				// 	url: '/pages/test/test'
+				// });
+				console.log(item.project_id)
+				if (item.project_type === 1) {
+					uni.navigateTo({
+						url: '/pages/tasksquare/taskdetail?id=' + item.project_id
+					});
+				} else {
+					uni.navigateTo({
+						url: '/pages/tasksquare/specialTask/specialTaskDetail?id=' + item.project_id
+					});
+				}
+				// }
+			},
+			/**
+			 * @param scrollTop 页面顶部距离
+			 * @param down 滑动显示效果延时
+			 */
+			setOpacity(scrollTop, down = 60) {
+				if (scrollTop > 0) {
+					if (scrollTop < down) {
+						this.opacity = scrollTop / down;
+					}
+					if (scrollTop > down) {
+						this.opacity = 1;
+					}
+				} else {
+					this.opacity = 0;
+				}
+			},
+		},
+		created() {},
+		onReady() {
+			// setTimeout(() => {
+			//   // 改变手机状态栏颜色
+			//   uni.setNavigationBarColor({
+			//     frontColor: "#000000",
+			//     backgroundColor: "#FF4258",
+			//   });
+			// }, 10);
+		},
+	};
+</script>
+<style>
+	/deep/ .share .uni-popup .uni-popup__wrapper {
+		width: 70% !important;
+		border-radius: 15rpx !important;
+	}
+</style>
+<style lang="scss" scoped>
+	.option1 {
+		padding: 5rpx 18rpx;
+
+		/deep/.uni-data-checklist .checklist-group .checklist-box .checklist-content {
+			width: 100rpx;
+			text-align: center;
+		}
+	}
+
+	.option2 {
+		padding: 5rpx 18rpx;
+	}
+
+	.option3 {
+		padding: 5rpx 18rpx;
+	}
+
+
+	//弹窗
+	.sharepage {
+		width: 90%;
+		margin: 0 auto;
+		// position: relative;
+	}
+
+	/deep/ .share.uni-popup .uni-popup__wrapper {
+		width: 70%;
+
+		border-radius: 15rpx;
+	}
+
+	.projecttext1 {
+		// padding-top: 5%;
+		padding: 0 0 0 1%;
+		height: 80rpx;
+		margin-top: 7%;
+		text-align: center;
+	}
+
+	.projecttext1 span {
+		color: #333333;
+		font-size: 100%;
+		font-weight: 550;
+		text-indent: 2em;
+
+	}
+
+	.projecttext1 image {
+		vertical-align: middle;
+		width: 80rpx;
+		height: 80rpx;
+		display: inline-block;
+		padding-right: 14rpx;
+	}
+
+	.sharemap {
+		margin: 0 auto;
+		text-align: center;
+		margin-top: 15%;
+		margin-bottom: 15%;
+	}
+
+	.sharemap image {
+		width: 400rpx;
+		height: 400rpx;
+
+	}
+
+	.butmin {
+		height: 48rpx;
+		background-color: #3397FA;
+		color: #FFFFFF;
+		line-height: 48rpx;
+	}
+
+	//弹出层
+	/deep/ .uni-data-checklist .checklist-group .checklist-box {
+		background-color: #FFFFFF !important;
+		border-radius: 20rpx !important;
+		padding: 8rpx 30rpx !important;
+		border: 0 !important;
+	}
+
+	/deep/ .uni-data-checklist .checklist-group .checklist-box .checklist-content .checklist-text {
+		font-size: 24rpx;
+		color: #333333;
+	}
+
+	/deep/ .mini-btn {
+		height: 70rpx;
+		width: 250rpx;
+		line-height: 70rpx;
+		margin: 20rpx;
+		letter-spacing: 4rpx;
+		background-color: #FCCF41;
+	}
+
+	/deep/ .mini-btn1 {
+		height: 70rpx;
+		width: 400rpx;
+		line-height: 70rpx;
+		margin: 20rpx;
+		letter-spacing: 4rpx;
+		color: white;
+		;
+	}
+
+	/deep/ .uni-data-checklist .checklist-group .checklist-box.is--tag.is-checked {
+		background-color: #FCCF41 !important;
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	//其他
+	.nav {
+		position: relative;
+	}
+
+	.nv_padding {
+		height: 88upx;
+		background-color: transparent;
+	}
+
+	/* 图标默认大小 */
+	.nv_icon {
+		width: 16px;
+		height: 16px;
+	}
+
+	.bg_box {
+		position: absolute;
+		width: 750upx;
+		height: 88upx;
+
+		z-index: 10;
+		top: 0;
+		background-color: transparent;
+		/* #ifdef MP */
+		box-sizing: border-box;
+		/* #endif */
+		/* #ifndef APP-PLUS-NVUE */
+		background-size: cover;
+		background-repeat: no-repeat;
+		background-position: center center;
+		/* #endif */
+	}
+
+	.mys_navBar {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		height: 88upx;
+		/* #endif */
+		// #ifdef MP
+		box-sizing: border-box;
+		// #endif
+		width: 750upx;
+		flex-direction: row;
+		background-color: transparent;
+		position: absolute;
+		z-index: 10;
+		top: 0;
+	}
+
+	.fixed {
+		position: fixed;
+	}
+
+	/*
+ left 按钮
+*/
+	.btn_type {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		/* #ifdef APP-PLUS-NVUE */
+		margin-left: 16upx;
+		/* #endif */
+		// #ifndef MP
+		align-items: center;
+		// #endif
+		flex: 1;
+		flex-direction: row;
+		// background-color: #fff;
+	}
+
+	.btn_box {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		margin-left: 16upx;
+		/* #endif */
+		flex-direction: row;
+		// #ifndef MP
+		align-items: center;
+		// #endif
+	}
+
+	.btn_back,
+	.btn_home {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		/* #ifndef APP-PLUS-NVUE */
+		height: 100%;
+		/* #endif */
+		/* #ifdef APP-PLUS-NVUE */
+		width: 76upx;
+		height: 62upx;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+	}
+
+	/* 按钮类型1 */
+	.nav_btn_t1 {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		// #ifdef MP
+		box-sizing: border-box;
+		// #endif
+		flex-direction: row;
+		align-items: center;
+		border-style: solid;
+		border-width: 1px;
+		border-color: #C0C0C0;
+		// background-color: rgba(0, 0, 0, 0.2);
+		background-color: #FFFFFF;
+		width: 130upx;
+		height: 45upx;
+	}
+
+	.line {
+		width: 1upx;
+		height: 60%;
+		/* #ifdef APP-PLUS-NVUE */
+		height: 30upx;
+		/* #endif */
+		background-color: #C0C0C0;
+	}
+
+	/*
+标题
+ */
+	.title_container {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		position: absolute;
+		left: 375upx;
+		bottom: 0;
+		transform: translateX(-50%);
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.title_text {
+		// flex: 1;
+		text-overflow: ellipsis;
+		/* #ifndef APP-PLUS-NVUE */
+		white-space: nowrap;
+		overflow: hidden;
+		font-weight: 550;
+
+		/* #endif */
+		/* #ifdef APP-PLUS-NVUE */
+		lines: 1;
+		/* #endif */
+	}
+
+	/* 
+左边自定义
+ */
+	.my_left_box {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.my_left_icon {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		/* #ifndef MP */
+		margin-left: 18upx;
+		/* #endif */
+	}
+
+	.my_left_custom {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		// justify-content: center;
+	}
+
+	/* 文字 */
+	.leftText {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		padding-left: 4upx;
+		font-size: 15px;
+	}
+
+	/* 
+中间
+ */
+	.my_custom_box {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+	}
+
+	/*
+搜索框 
+ */
+	.nv_search_box {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		flex: 1;
+
+		/* #ifndef MP */
+		height: 60upx;
+		/* #endif */
+		background-color: #f8f8f8;
+		padding-right: 20upx;
+		padding-left: 20upx;
+		border-radius: 60upx;
+		margin-right: 15upx;
+		margin-left: 15upx;
+	}
+
+	.nv_input {
+		flex: 1;
+		padding-left: 16upx;
+		font-size: 13px;
+	}
+
+	.close {
+		width: 50upx;
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		/* #ifndef MP */
+		height: 62upx;
+		/* #endif */
+	}
+
+	/* 
+右边 自定义
+ */
+	.my_right_icon {
+		/* #ifndef APP-PLUS-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		/* #ifndef MP */
+		// min-width: 70upx;
+		/* #endif */
+		padding-left: 6px;
+		padding-right: 10px;
+	}
+
+	.imge image {
+		width: 100%;
+		height: 260rpx;
+	}
+
+	.commodity {
+		margin-top: 10rpx;
+		display: flex;
+		flex-wrap: wrap;
+		justify-content: space-between;
+	}
+
+	.share {
+		text-align: center;
+		line-height: 10rpx;
+		margin-top: 10rpx;
+	}
+
+	.share image {
+		vertical-align: middle;
+		width: 25rpx;
+		height: 25rpx;
+		display: inline-block
+	}
+
+	.share p {
+		display: inline-block;
+		font-size: 24rpx;
+		color: #333333;
+	}
+
+	.project {
+		width: 49%;
+		height: 550rpx;
+		// background-color: #ccc;
+		border-radius: 20rpx;
+		// box-shadow: 0rpx 5rpx 5rpx #ccc;
+		margin-bottom: 0%;
+	}
+
+	.projectdiagram {
+		width: 100%;
+		height: 61%;
+		background-size: 100% 100%;
+		position: relative;
+		border-radius: 10rpx;
+		;
+	}
+
+	.TitleText1 {
+		height: 30rpx;
+		background-color: #FDD442;
+		border-radius: 10rpx;
+		display: inline-block;
+		padding: 0rpx 20rpx 0rpx 20rpx;
+		line-height: 30rpx;
+	}
+
+	.TitleText2 {
+		opacity: 0.8;
+		height: 30rpx;
+		background-color: #FFFFFF;
+		border-radius: 20rpx;
+		display: inline-block;
+		padding: 0rpx 20rpx 0rpx 20rpx;
+		line-height: 30rpx;
+	}
+
+	.TitleText2 p {
+		color: #464100;
+		font-size: 24rpx;
+
+	}
+
+	.projecttext {
+		// padding-top: 5%;
+		padding: 0 0 0 1%;
+		// height: 80rpx;
+	}
+
+	.projecttext span {
+		color: #333333;
+		font-size: 25rpx;
+		font-weight: 550;
+		text-indent: 2em;
+
+	}
+
+	.TitleText1 p {
+		color: #333333;
+		font-size: 18rpx;
+
+	}
+
+	.projecttext {
+		// height: 70rpx;
+	}
+
+	.projecttext image {
+		vertical-align: middle;
+		width: 30rpx;
+		height: 30rpx;
+		display: inline-block;
+		padding-right: 14rpx;
+	}
+
+	.TitleText {
+		// height: 30rpx;
+		background-color: #FDD442;
+		border-radius: 10rpx;
+		display: inline-block;
+		padding: 0rpx 20rpx 0rpx 20rpx;
+		line-height: 30rpx;
+		margin-top: 0%;
+	}
+
+	.TitleText p {
+		color: black;
+		font-size: 18rpx;
+	}
+
+	.introduction {
+		width: 100%;
+		margin: 10rpx auto 0;
+
+
+	}
+
+	.rleft p {
+		font-size: 18rpx;
+
+		color: #999999;
+	}
+
+	.rright p {
+		font-size: 18rpx;
+		color: #999999;
+
+	}
+
+	.Mask {
+		position: absolute;
+		background-color: #000000;
+		opacity: 0.6;
+		width: 100%;
+		height: 100%;
+		// z-index: 999;
+		text-align: center;
+		border-radius: 20rpx;
+	}
+
+	.Mask image {
+		width: 50%;
+		height: 52%;
+		padding-top: 25%;
+	}
+
+	.contt {
+		position: relative;
+	}
+
+	.contact {
+		position: fixed;
+		top: 80%;
+		right: 13%;
+	}
+
+	.img1 {
+		width: 84rpx;
+		height: 124rpx;
+		position: absolute;
+
+	}
+
+	.img2 {
+		width: 114rpx;
+		height: 40rpx;
+		position: absolute;
+		top: 130rpx;
+		left: -12rpx;
+	}
+
+	.swiper {
+		height: 300rpx;
+	}
+
+	.swiper-item {
+		display: block;
+		height: 300rpx;
+		line-height: 300rpx;
+		text-align: center;
+	}
+
+	.swiper-list {
+		margin-top: 40rpx;
+		margin-bottom: 0;
+	}
+</style>

+ 340 - 0
pages/tasksquare/specialTask/information.vue

@@ -0,0 +1,340 @@
+<template>
+	<view>
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view class="basicInfo">
+			<image :src="mainImg" style="width: 150rpx;height: 150rpx;" mode="">
+			</image>
+			<view class="basicInfo_txt">
+				<p style="margin-bottom: 10rpx;font-size: 35rpx;font-weight: 550;">{{project.project_name}}</p>
+				<p style="font-size: 30rpx;">商品价值:{{project.Product.ProductPrice}}</p>
+			</view>
+		</view>
+
+		<view class="address">
+			<view>
+				<image class="address_icon" :src="picture.icon_loc" mode="">
+				</image>
+			</view>
+			<view style="width: 70%;">
+				<view style="display: flex;">
+					<p class='ipon' style="padding-right: 100rpx;">{{address.receiver_name}}</p>
+					<p class='ipon'>{{address.phone_number}}</p>
+				</view>
+				<p class='ipon'>{{address.detail_addr}}</p>
+			</view>
+			<view class="address_edit" @click="editAddress()">
+				<image :src="picture.icon_edit" mode="">
+				</image>
+			</view>
+		</view>
+
+		<view class="keyInfo">
+			<h3>关键任务信息</h3>
+			<view style="display: flex;margin-top: 10rpx;">
+				<p style="font-weight: 600;">社媒平台:</p>
+				<p>{{project.project_platform_t}}</p>
+			</view>
+			<p style="font-weight: 600;margin-top: 10rpx;">任务要求</p>
+			<view class="keyInfo_task">
+				<view style="display: flex;align-items: center;margin: 5rpx 0;">
+					<p>内容形式:</p>
+					<p class="keyInfo_task_txt">{{project.content}}</p>
+				</view>
+				<p style="margin: 5rpx 0;">商品描述:</p>
+				<p class="keyInfo_task_txt"> {{project.Product.ProductDetail}}
+				</p>
+				<p style="margin: 5rpx 0;">任务详情:</p>
+				<p class="keyInfo_task_txt"> {{project.project_detail}} </p>
+			</view>
+		</view>
+
+		<view class="account">
+			<view class="account_txt" @click="editAccount(item)">
+				<image :src="project.PlatformInfo.platform_icon" mode=""></image>
+				<span>{{account.platform_nickname}}</span>
+			</view>
+			<view class="account_fans">
+				<p style="padding-right: 20rpx;color:#A8A8A8;">粉丝数</p>
+				<p>{{account.fans_count}}</p>
+			</view>
+			<view class="account_btn" @click="editAccount(item)">
+				<image :src="picture.togoimg" mode="" style="width: 16rpx;height: 30rpx;"></image>
+			</view>
+		</view>
+
+		<view class="block"></view>
+		<view class="submit">
+			<button type="default" class="submit_btn" @click="submit()"> 确认邀请</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar
+		},
+		data() {
+			return {
+				mainImg: "https://horastar.obs.cn-east-3.myhuaweicloud.com/backstage_upload/bb531ede-28b5-49a0-8431-a1608fd35890.png",
+				account_id: -1,
+				address_id: -1,
+				address: null,
+				project: null,
+				account: null,
+				strategy: null,
+				picture: {
+					togoimg: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task16.png',
+					icon_edit: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-edit.png',
+					icon_loc: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-loc.png',
+					home8: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home8.png',
+					home10: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home10.png',
+					home11: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home11.png',
+				},
+				thirdPlatform: [],
+				mysNavConfig: {
+					isHome: false,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "信息确认",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/png2.png",
+						// 右图标
+						rightPath: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+		onShow() {
+			this.getDefaultAddress();
+			// 查询account	
+			this.getAccount();
+		},
+		onLoad(options) {
+			this.textObj = options.textObj.replace(/""/g, "");
+			this.textObj = JSON.parse(decodeURIComponent(this.textObj))
+			console.log(this.textObj)
+			this.project = this.textObj.information
+		},
+		methods: {
+			getAccount() {
+				this.$https.get('/youngee/c/t/g/get-talent-account')
+					.then(res => {
+						console.log(res)
+						if (res.data.code !== -3) {
+							let account = res.data.data
+							while (this.project == null) {}
+							for (var i = 0; i < account.length; i++) {
+								if (this.project.project_platform == account[i].platform_id) {
+									this.account = account[i]
+								}
+							}
+						}
+					})
+			},
+			getDefaultAddress() {
+				this.$https.get('/youngee/c/t/g/get-talent-default-address').then(res => {
+					console.log("address")
+					console.log(res.data.data)
+					this.address = res.data.data;
+				})
+			},
+			editAddress() {
+				uni.navigateTo({
+					url: '/pages/mycenter/addlocation?address_id=' + this.address.address_id + '&ismodify=1'
+				});
+			},
+			editAccount() {
+				uni.navigateTo({
+					url: '/pages/mycenter/bindaccount?platform_id=' + this.account.platform_id + '&account_id=' +
+						this.account.account_id
+				});
+			},
+			// 提交确认报名
+			submit() {
+				console.log(this.project)
+				
+				// 2. 插入一条任务
+				this.$https.post('/youngee/c/t/p/sign-up-task', {
+					address_id: this.address.address_id,
+					project_id: this.project.project_id,
+					strategy_id: this.strategy.strategy_id,
+					offer: this.strategy.offer,
+				}).then(res => {
+					if (res.data.code == 0) {
+						var data = {
+							task_id: res.data.data
+						};
+						data = JSON.stringify(data)
+						uni.navigateTo({
+							url: '/pages/tasksquare/success?textObj=' + encodeURIComponent(data)
+						});
+					}
+				})
+				
+				// 2. 插入一条任务
+				this.$https.post('/youngee/c/t/p/sign-up-task', {
+					address_id: this.address.address_id,
+					project_id: this.project.project_id,
+				}).then(res => {
+					console.log(res.data.data)
+					if (res.data.code == 0) {
+						var data = {
+							task_id: res.data.data
+						};
+						data = JSON.stringify(data)
+						uni.navigateTo({
+							url: '/pages/tasksquare/success?textObj=' + encodeURIComponent(data)
+						});
+					}
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.basicInfo {
+		display: flex;
+		margin: 0 40rpx;
+
+		.basicInfo_txt {
+			margin-left: 40rpx;
+			padding-top: 20rpx;
+		}
+	}
+
+	.address {
+		display: flex;
+		margin: 50rpx 40rpx 0;
+		justify-content: space-around;
+
+		.address_icon {
+			vertical-align: middle;
+			width: 50rpx;
+			height: 50rpx;
+			display: inline-block;
+			padding-right: 30rpx;
+		}
+
+		.address_edit {}
+
+		.address_edit image {
+			vertical-align: middle;
+			width: 50rpx;
+			height: 50rpx;
+			display: inline-block;
+			padding-right: 14rpx;
+		}
+
+		.ipon {
+			color: #333333;
+			font-size: 30rpx;
+			font-weight: 500;
+			margin-bottom: 10rpx;
+		}
+	}
+
+	.keyInfo {
+		margin: 50rpx 40rpx 0;
+
+		.keyInfo_task {
+			color: #999999;
+
+			.keyInfo_task_txt {
+				border: 1rpx solid #CCCCCC;
+				border-radius: 10rpx;
+				padding: 10rpx;
+			}
+		}
+	}
+
+	.keyInfo h3 {
+		font-weight: 600;
+	}
+
+	.keyInfo p {
+		font-size: 30rpx;
+	}
+
+	.account {
+		display: flex;
+		align-items: center;
+		// justify-content: space-between;
+		width: 90%;
+		padding: 16rpx;
+		margin-top: 50rpx;
+		font-size: 35rpx;
+
+		.account_txt {
+			display: inline-block;
+			padding: 0 0 0 1%;
+			width: 400rpx;
+		}
+
+		.account_txt image {
+			vertical-align: middle;
+			width: 50rpx;
+			height: 50rpx;
+			display: inline-block;
+			padding-right: 14rpx;
+		}
+
+		.account_fans {
+			display: flex;
+			width: 250rpx;
+		}
+
+		.account_fans p {
+			display: inline-block;
+			color: #333333;
+			font-weight: 550;
+		}
+
+		.account_btn {}
+	}
+
+	.block {
+		width: 100%;
+		height: 100rpx;
+		margin-top: 5%;
+	}
+
+	.submit {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+
+		.submit_btn {
+			width: 60%;
+			background-color: #FCCF41;
+			border-radius: 20rpx;
+			font-size: 36rpx;
+			line-height: 200%;
+			letter-spacing: 10rpx;
+			font-weight: 500;
+			height: 80%;
+		}
+
+	}
+</style>

+ 1570 - 0
pages/tasksquare/specialTask/specialTaskDetail.vue

@@ -0,0 +1,1570 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view class="" id="wrap0" v-show="!loading">
+
+			<view class="home" style="padding-top: 180rpx;">
+				<view class="uni-margin-wrap">
+					<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000"
+						:duration="1000">
+						<swiper-item v-for="item in carousel_images">
+							<image :src="item" mode="aspectFill" style="width: 100%;height: 100%;"
+								@click="handlePreviewImage1(item)">
+							</image>
+						</swiper-item>
+					</swiper>
+
+					<view class="">
+						<view class="Tasktext">
+							<image :src="information.PlatformInfo.platform_icon" mode=""></image>
+							<span>{{information.project_name}}</span>
+						</view>
+
+						<view class="markcontent">
+							<view style="display: flex;margin: 10rpx 0;">
+								<p class="wvp">商品价值:</p>
+								<p class="wvp">{{information.Product.ProductPrice}}元</p>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- <view class="interval"></view> -->
+			<view class="home" style="padding-top: 0;">
+				<view class="">
+					<view class="circularmark">
+						<p>任务信息</p>
+					</view>
+					<view class="markcontent">
+						<view style="display: flex;margin: 10rpx 0;">
+							<p class="label">社媒平台:</p>
+							<p class="wvp">{{information.PlatformInfo.platform_name}}</p>
+						</view>
+						<view style="display: flex;margin: 10rpx 0;">
+							<p class="label">商品类型:</p>
+							<p class="wvp">{{information.Product.ProductType}}</p>
+						</view>
+						<view style="display: flex;;margin: 10rpx 0;">
+							<p class="label">商品链接:</p>
+							<p class="wvp" style="padding: 0;">{{information.Product.ProductUrl}}</p>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="" id="wrap1">
+				<view class="home" style="padding-top: 0;">
+					<view class="">
+						<view class="circularmark">
+							<p>任务要求</p>
+						</view>
+						<view class="markcontent">
+							<view style="display: flex;">
+								<p class="wvp" style="margin: 10rpx 0;">内容形式:</p>
+								<p class="wvp" style="margin: 10rpx 0;">{{information.content}}</p>
+							</view>
+							<p class="wvp" style="margin: 10rpx 0;">商品描述:</p>
+							<text class="wvp" style="margin: 10rpx 0;" decode="true" user-select="true">
+								{{information.Product.ProductDetail}} </text>
+							</p>
+							<p class="wvp" style="margin: 10rpx 0;">任务详情:</p>
+							<text class="wvp" style="margin: 10rpx 0;" decode="true" user-select="true">
+								{{information.project_detail}} </text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="" id="wrap2">
+
+				<view class="home" style="padding-top: 0;">
+					<view class="">
+						<view class="circularmark">
+							<p>任务详情图</p>
+						</view>
+						<view class="markcontent1">
+							<view class="diagram" v-for="item in information.ProjectPhoto">
+								<image :src="item.photo_url" mode="widthFix"></image>
+							</view>
+						</view>
+					</view>
+					<view class="">
+						<view class="circularmark">
+							<p>商品详情图</p>
+						</view>
+						<view class="markcontent1">
+							<view class="diagram" v-for="item in product_detail_images">
+								<image :src="item" mode="widthFix"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="interval2"></view>
+			</view>
+
+			<view class="signup">
+				<button type="default" class="but1" :loading="loading" :class="{'on':item.title === '1',}"
+					@click="toggle('bottom')" v-if="isSign===0">
+					开始执行</button>
+				<button type="default" class="but1" disabled v-if="isSign===1 && isAgree === 1"> 等待审核 </button>
+				<button type="default" class="but1" disabled v-if="isSign===1 && isAgree === 2"> 执行中 </button>
+				<button type="default" class="but1" disabled v-if="isSign===1 && isAgree === 3"> 已结束 </button>
+				<button type="default" class="but2" @click="toggle1('bottom')">
+					<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task8.png" mode=""></image>
+					分享
+				</button>
+			</view>
+			<view>
+				<!-- 底部普通弹窗 -->
+				<uni-popup ref="popup1" background-color="#fff" @change="change" style="border-radius: 20rpx;">
+					<view class="popup-content1" :class="{ 'popup-height': type === 'left' || type === 'right' }">
+						<view
+							style="display: flex; justify-content: space-around; margin-top: 10% ;margin-bottom: 3% ;">
+							<view>
+								<button class="tii2" data-name="shareBtn" open-type="share">
+									<view class="circular" style="margin-top: 10% ;">
+										<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/taskw.png"
+											mode=""></image>
+									</view>
+									<p class="tii">发送给朋友</p>
+								</button>
+							</view>
+							<view>
+								<button class="tii2" @click="toggle2('center')">
+									<view class="circular" style="margin-top: 10% ;">
+										<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/taske.png"
+											mode=""></image>
+									</view>
+									<p class="tii">生成分享码</p>
+								</button>
+							</view>
+						</view>
+
+						<button type="default" class="errar" @click="cancel()">取消</button>
+					</view>
+				</uni-popup>
+			</view>
+			<uni-popup ref="popup2" class="share1" background-color="#fff" @change="change">
+				<view class="popup-content">
+					<image :src="canvasUrl" mode="widthFix" style="width: 300px;height: 400px;margin-top: 30rpx;">
+					</image>
+					<mosoweCanvas ref="mosoweCanvasComponents" @canvasImage="_canvasImage" :lists="lists" height="400"
+						width="300" />
+
+					<view class="" style="text-align: center;margin: 5% 0;">
+						<button class="butmin" size="mini" @tap="saveImage">保存</button>
+					</view>
+				</view>
+			</uni-popup>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mosoweCanvas from "@/components/mosowe-canvas-image/mosowe-canvas-image";
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import zSwiper from '@/components/z-swiper/index.vue'
+	import {
+		getRouter,
+		getQueryString
+	} from '@/components/utils.js';
+	import {
+		saveImageToPhotosAlbum,
+		showToast,
+		downloadFile
+	} from '@/uni_modules/sakura-canvas/js_sdk/util'
+	export default {
+		components: {
+			mvBar,
+			zSwiper,
+			mosoweCanvas
+		},
+		data() {
+			return {
+				canvasUrl: '',
+				loading: true,
+				isSign: 0,
+				isAgree: 0,
+				strategy_id: 0,
+				strategy: null,
+				input_offer: 0.0,
+				chooseBtn: 0,
+				share: {
+					title: "",
+					path: '',
+					imageUrl: '',
+					desc: '',
+					content: ''
+				},
+				poster: {},
+				posterImg: '',
+				canvasId: 'myCanvas',
+				img: '',
+				task_type_info: ["实体商品寄拍", "虚拟产品测评", "线下探店打卡", "素材微原创"],
+				talent_type_info: ["美妆", "美食", "生活", "时尚", "测评", "旅行", "汽车", "萌宠", "游戏", "音乐", "舞蹈", "房产", "情感", "三农",
+					"园艺", "随拍", "图文控", "二次元", "母婴亲子", "颜值达人", "剧情搞笑", "运动健身", "家居家装", "科技数码", "教育培训", "才艺技能", "艺术文化",
+					"财经投资",
+				],
+				product_types: [{
+						value: 1,
+						label: '3C及电器'
+					},
+					{
+						value: 2,
+						label: '食品饮料'
+					},
+					{
+						value: 3,
+						label: '服装配饰'
+					},
+					{
+						value: 4,
+						label: '医疗'
+					},
+					{
+						value: 5,
+						label: '房地产'
+					},
+					{
+						value: 6,
+						label: '家居建材'
+					},
+					{
+						value: 7,
+						label: '教育培训'
+					},
+					{
+						value: 8,
+						label: '出行旅游'
+					},
+					{
+						value: 9,
+						label: '游戏'
+					},
+					{
+						value: 10,
+						label: '互联网平台'
+					},
+					{
+						value: 11,
+						label: '汽车'
+					},
+					{
+						value: 12,
+						label: '文体娱乐'
+					},
+					{
+						value: 13,
+						label: '影视传媒'
+					},
+					{
+						value: 14,
+						label: '线下店铺'
+					},
+					{
+						value: 15,
+						label: '软件服务'
+					},
+					{
+						value: 16,
+						label: '美妆'
+					},
+					{
+						value: 17,
+						label: '母婴宠物'
+					},
+					{
+						value: 18,
+						label: '日化'
+					},
+					{
+						value: 19,
+						label: '其他'
+					}
+				],
+				title: '[东鑫记港式茶餐厅]南京东路|魔都新晋爆款茶餐厅来袭!99元抢门',
+				price: '',
+				tips: '识别二维码\n立即申请任务',
+				head: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task15.png',
+				big: '',
+				tabBarStyle: {},
+				activeTab: 0,
+				hei: '',
+				hei1: '',
+				topp0: '',
+				topp1: '',
+				topp2: '',
+				scrollTop: '',
+				activeColor: '#f2d22d',
+				value: '',
+				value1: '',
+				sex: [],
+				coop_choice: [],
+				type: 'center',
+				type1: 'center',
+				type2: 'center',
+				item: {
+					title: '0'
+				},
+				// 视频轮播
+				fullScreen: true,
+				topFloat: true,
+				fotterFloat: true,
+				// 指示器样式
+				mode: 'circle',
+				indicatorPos: 'bottomCenter',
+				list1: [{
+						type: 'video',
+						poster: 'https://img2.baidu.com/it/u=2141851239,1037607188&fm=26&fmt=auto&gp=0.jpg',
+						src: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4',
+					},
+					{
+						type: 'image',
+						src: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home1.png'
+					},
+					{
+						type: 'video',
+						poster: 'https://img1.baidu.com/it/u=1297253752,1185196455&fm=26&fmt=auto&gp=0.jpg',
+						src: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4',
+					},
+					{
+						type: 'image',
+						src: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home1.png'
+					},
+
+				],
+				carousel_images: ['https://img2.baidu.com/it/u=2141851239,1037607188&fm=26&fmt=auto&gp=0.jpg',
+					'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home1.png',
+				],
+				dotIndex: 0, //指示器索引
+				dotFloatIndex: 0, //位置指示器索引
+				//轮播图
+				swiper: {
+					margin: "150rpx",
+					index: 0,
+					list: [
+
+					]
+				},
+
+				tar: false,
+				mysNavConfig: {
+					/* 占位开启  */
+					// navPadding: true,
+					/* 背景 */
+					// bgColor: "#f8f8f8",
+					/* 开启单页显示首页图标 */
+					isHome: false,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "任务详情",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "500", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '/pages/tasksquare/tasksquare',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/png2.png",
+						// 右图标
+						rightPath: "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+				projectid: '',
+				talent: {},
+				account: [],
+				information: {},
+				zhanghaocode: '',
+				product_detail_images: [],
+				codeImg: '',
+				queryAll: '',
+			};
+		},
+		computed: {
+			lists: {
+				get() {
+					let tmplist = [
+						// 大图
+						{
+							type: 'image',
+							content: this.img,
+							width: 300,
+							height: 300,
+							x: 0,
+							y: 0,
+						},
+						// 标题
+						{
+							type: 'text',
+							content: this.title,
+							color: '#333333',
+							size: 12,
+							width: 200,
+							height: 10,
+							x: 10,
+							y: 320,
+						},
+						// 文案1
+						{
+							type: 'text',
+							content: "招募人数:" + this.information.taskNum,
+							color: '#333333',
+							size: 10,
+							width: 60,
+							height: 10,
+							x: 10,
+							y: 340,
+						},
+						// 文案2
+						{
+							type: 'text',
+							content: "扫码立即报名",
+							color: '#333333',
+							size: 10,
+							width: 60,
+							height: 10,
+							x: 80,
+							y: 340,
+						},
+						// logo
+						{
+							type: 'image',
+							content: this.younggee_logo,
+							width: 120,
+							height: 50,
+							x: 10,
+							y: 350,
+						},
+						// 二维码
+						{
+							type: 'qr',
+							content: this.head,
+							width: 75,
+							height: 75,
+							x: 210,
+							y: 305,
+						},
+					]
+					return tmplist
+				},
+				set() {}
+			}
+		},
+		async created() {},
+		async onShow() {
+			// 判断登录
+			await this.isLogin();
+			if (this.token === '') {
+				uni.showModal({
+					content: '请先登录',
+					success: function(res) {
+						if (res.confirm) {
+							uni.navigateTo({
+								url: '/pages/login/login'
+							});
+						} else if (res.cancel) {
+							uni.navigateBack();
+						}
+					}
+				});
+			} else {
+				this.loading = true;
+				uni.showLoading({
+					title: '加载中'
+				});
+				await this.getTalentInfo();
+				await this.getProjectDetail();
+				await this.getTalentAccountInfo();
+				if (this.account.length != 0) {
+					await this.isSignUp();
+				}
+				this.loading = false;
+				uni.hideLoading();
+			}
+		},
+		onLoad(options) {
+			getRouter();
+			if (options.q) {
+				let queryAll = decodeURIComponent(options.q);
+				this.projectid = getQueryString(queryAll, 'id')
+			} else {
+				this.projectid = options.id
+			}
+			this.share.path = 'https://younggee.com/wxapp/specialtaskdetail?action=taskdetail&id=' + this.projectid
+		},
+		onReady() { // 注意:想要拿到元素实例,需要在实例已经挂载到页面上才可以
+		},
+		methods: {
+			// 判断登陆是否过期
+			isLogin() {
+				return this.$https.get('/youngee/c/t/g/is-login')
+					.then(res => {
+						if (res.data.code === 403) {
+							// 登陆已失效
+							this.token = ""
+						} else {
+							this.token = uni.getStorageSync('token')
+						}
+					})
+			},
+			handlePreviewImage1(item) {
+				console.log("image src: ", item)
+				let that = this
+				wx.previewImage({
+					current: item, // 当前显示图片的http链接
+					urls: that.carousel_images // 需要预览的图片http链接列表
+				})
+			},
+			handleCoopClick(value) {
+				if (this.account[0].fans_count < value.followers_low) {
+					// 提示“粉丝量不符合报名条件”
+					uni.showToast({
+						title: '粉丝量不符合报名条件',
+						icon: 'none',
+						duration: 2000
+					});
+				} else {
+					this.strategy_id = value.strategy_id;
+					this.strategy = value;
+				}
+			},
+			getProjectDetail() {
+				return this.$https.get('/youngee/c/t/g/get-project-detail' +
+					"?" +
+					"projectid" +
+					"=" +
+					this.projectid
+				).then(res => {
+					this.information = res.data.data
+
+					this.information.Product = JSON.parse(res.data.data.product_snap);
+					this.information.Product.ProductPhoto = JSON.parse(res.data.data.product_photo_snap);
+					console.log("Product: ", this.information.Product)
+					// 分享图里的
+					for (let i = 0; i < this.information.Product.ProductPhoto.length; i++) {
+						if (this.information.Product.ProductPhoto[i].Symbol === 1) {
+							this.img = this.information.Product.ProductPhoto[i].PhotoUrl
+							this.share.imageUrl = this.information.Product.ProductPhoto[i].PhotoUrl
+						}
+					}
+					this.title = this.information.project_name
+					this.share.title = this.information.project_name
+
+
+					this.information.Product.ProductType = this.product_types[parseInt(this.information.Product
+						.ProductType) - 1].label
+					// 轮播图、详情图
+					this.carousel_images = []
+					this.product_detail_images = []
+					for (let i = 0; i < this.information.Product.ProductPhoto.length; i++) {
+						if (this.information.Product.ProductPhoto[i].Symbol != 3) {
+							this.carousel_images.push(this.information.Product.ProductPhoto[i]
+								.PhotoUrl)
+							if (this.information.Product.ProductPhoto[i].Symbol != 1)
+								this.product_detail_images.push(this.information.Product.ProductPhoto[
+									i].PhotoUrl)
+						}
+					}
+
+					// 任务类型
+					this.information.project_form = this.task_type_info[this.information.project_form -
+						1]
+
+					// 任务形式
+					if (this.information.content_type === 1) this.information.content = "图文"
+					else if (this.information.content_type === 2) this.information.content = "视频"
+				})
+			},
+			// 达人信息
+			getTalentInfo() {
+				return this.$https.get('/youngee/c/t/g/get-talent-info')
+					.then(res => {
+						console.log(res)
+						this.talent = res.data.data
+					})
+			},
+			//账号信息
+			getTalentAccountInfo() {
+				return this.$https.get('/youngee/c/t/g/get-talent-account')
+					.then(res => {
+						console.log(res)
+						var accounts = res.data.data
+						this.account = []
+						if (res.data.code != -3) {
+							for (var i = 0; i < accounts.length; i++) {
+								if (this.information.project_platform === accounts[i].platform_id) {
+									this.account.push(accounts[i])
+								}
+							}
+						}
+					})
+			},
+			isSignUp() {
+				return this.$https.get('/youngee/c/t/g/is-sign-up-task' +
+						"?" +
+						"project_id" +
+						"=" +
+						this.projectid +
+						"&account_id" +
+						"=" +
+						this.account[0].account_id)
+					.then(res => {
+						if (res.data.code === 0) {
+							this.isSign = res.data.data.is_sign;
+							this.isAgree = res.data.data.is_agree;
+						}
+					})
+			},
+			onPageScroll(res) {
+				uni.$emit('onPageScroll', res.scrollTop);
+				this.scrollTop = res.scrollTop;
+				// console.log(res.scrollTop);
+				if (res.scrollTop <= this.topp1 - this.hei1) {
+					// console.log(0)
+					this.activeTab = 0
+				}
+				if (res.scrollTop > this.topp1 - this.hei1 && res.scrollTop < this.topp2 - this.hei1) {
+					// console.log(1)
+					this.activeTab = 1
+				}
+				if (res.scrollTop > this.topp2 - this.hei1) {
+					// console.log(2)
+					this.activeTab = 2
+				}
+			},
+			//获取节点离顶部高度
+			getInfo() {
+
+				const query = uni.createSelectorQuery().in(this);
+
+				query.select('#wrap0').boundingClientRect(data => {
+
+					this.topp0 = data.top
+				}).exec();
+				query.select('#wrap1').boundingClientRect(data => {
+
+					this.topp1 = data.top
+				}).exec();
+				query.select('#wrap2').boundingClientRect(data => {
+					this.topp2 = data.top
+					// console.log(this.topp2)
+				}).exec();
+				query.select('#wap').boundingClientRect(data => {
+
+					// console.log(data)
+					this.hei = data.height
+					this.tabBarStyle = {
+
+						height: data.height + data.height + 'px',
+						width: '100% ',
+					}
+				}).exec();
+				query.select('#wa').boundingClientRect(data => {
+
+					// console.log(data)
+					this.hei1 = data.height
+
+				}).exec();
+
+			},
+			//视频轮播
+			effect3dMarginMethed() {
+				this.effect3dMargin++
+			},
+			//swiper滑动事件
+			swiperChange: function(e) {
+				this.swiper.index = e.detail.current;
+			},
+			//底部弹出层
+			change(e) {
+				console.log('当前模式:' + e.type + ',状态:' + e.show);
+			},
+			toggle(type) {
+				let that = this
+				if (that.talent.is_bind_info === 0 || that.talent.is_bind_location === 0 ||
+					that.account.length === 0) {
+					// 前往个人信息绑定三合一界面
+					uni.showModal({
+						content: '请先绑定个人信息',
+						success: function(res) {
+							if (res.confirm) {
+								if (that.account.length === 0) {
+									uni.navigateTo({
+										url: '/pages/tasksquare/bindinfo?platform_id=' +
+											that
+											.information.project_platform
+									})
+								} else {
+									uni.navigateTo({
+										url: '/pages/tasksquare/bindinfo?platform_id=' +
+											that.information.project_platform +
+											'&account_id=' +
+											that.account[0].account_id
+									})
+								};
+							} else if (res.cancel) {
+								console.log('用户点击取消');
+							}
+						}
+					});
+				} else {
+					var data = {
+							projectid: that.projectid,
+							information: that.information,
+							account: that.account[0].account_id,
+						},
+						data = JSON.stringify(data)
+					uni.navigateTo({
+						url: '/pages/tasksquare/specialTask/information?textObj=' + encodeURIComponent(
+							data)
+					});
+				}
+			},
+			toggle1(type) {
+				this.type1 = type
+				// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
+				this.$refs.popup1.open(type)
+			},
+			cancel() {
+				this.$refs.popup1.close()
+			},
+			// 更新账号
+			Reset() {
+				console.log("Reset func running")
+				uni.navigateTo({
+					url: '/pages/mycenter/myinformation/bindaccount?platform_id=' + this
+						.information
+						.project_platform + '&account_id=' + this.account[0].account_id,
+					success(res) {
+						console.log(res);
+					},
+					fail(err) {
+						console.log(err);
+					}
+				});
+			},
+			//进入信息确认页面
+			determine() {
+				console.log(this.strategy_id)
+				if (this.strategy_id === 0 || this.strategy === null) {
+					uni.showToast({
+						title: '请选择合作方式',
+						icon: 'none',
+						duration: 2000
+					});
+				} else if (this.account[0].fans_count < this.strategy.followers_low) {
+					// 提示“粉丝量不符合报名条件”
+					uni.showToast({
+						title: '粉丝量不符合报名条件',
+						icon: 'none',
+						duration: 2000
+					});
+				} else if (this.strategy.fee_form === 3 && this.strategy.offer === 0) {
+					console.log(this.strategy)
+					uni.showToast({
+						title: '请填写自报价金额',
+						icon: 'none',
+						duration: 2000
+					});
+				} else {
+					this.$refs.popup.close()
+					var data = {
+							projectid: this.projectid,
+							information: this.information,
+							account: this.account[0].account_id,
+							strategy: this.strategy,
+						},
+						data = JSON.stringify(data)
+					console.log("data")
+					console.log(data)
+					uni.navigateTo({
+						url: '/pages/tasksquare/information?textObj=' + encodeURIComponent(data)
+					});
+				}
+			},
+			beginCanvas() {
+				this.$refs.mosoweCanvasComponents.createCanvas();
+			},
+			_canvasImage(e) {
+				console.log("url", e)
+				this.canvasUrl = e;
+			},
+			// 保存图片
+			async saveImage() {
+				let {
+					canvasUrl
+				} = this
+				let res = await saveImageToPhotosAlbum(canvasUrl)
+				if (!res.success) return
+				showToast('保存成功')
+				// this.$refs.popup2.close()
+			},
+			toggle2(type) {
+				if (this.canvasUrl !== '') {
+					this.type2 = type
+					// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
+					this.$refs.popup2.open(type)
+					this.$refs.popup1.close()
+				} else {
+					this.beginCanvas()
+					this.type2 = type
+					// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
+					this.$refs.popup2.open(type)
+					this.$refs.popup1.close()
+				}
+			},
+		}
+	};
+</script>
+<style>
+	/deep/ .share1 .uni-popup .uni-popup__wrapper {
+		width: 300px !important;
+		/* height: 500px !important; */
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		border-radius: 15rpx !important;
+	}
+
+	/deep/ .share.uni-popup .uni-popup__wrapper {
+		width: 70%;
+		border-radius: 15rpx;
+	}
+</style>
+<style lang="scss" scoped>
+	text {
+		font-size: 28rpx;
+	}
+
+	#coop_box {
+		// display: flex;
+		margin-top: 15rpx;
+	}
+
+	#coop_box .coop_box_btn {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		width: 700rpx;
+		// height: 50rpx;
+		border: 2px solid #f9f9f9;
+		border-radius: 15rpx;
+		font-size: 30rpx;
+		text-align: center;
+		// line-height: 40px;
+		cursor: pointer;
+	}
+
+	.borderColor {
+		border: 2px solid #f7d43c !important;
+	}
+
+	.offer_input {
+		width: 50rpx;
+		border: 1px solid #cccccc;
+	}
+
+	.wvp {
+		color: #b2b0b0;
+		margin: 0 5rpx;
+	}
+
+	.wvp1 {
+		padding: 0 30rpx;
+		border-radius: 10rpx;
+		margin: 0 10rpx;
+		background-color: #f2d22d;
+		border: 10rpx;
+	}
+
+	.my-canvas {
+		position: fixed;
+		top: -99999999999rpx;
+		left: -99999999999rpx;
+		z-index: -99999999999;
+		opacity: 0;
+	}
+
+	.poster {
+		width: 100vw;
+		height: 100vh;
+		display: flex;
+		flex-flow: column nowrap;
+		justify-content: center;
+		overflow: hidden;
+	}
+
+	.container {
+		padding: 40rpx;
+		font-size: 28rpx;
+		line-height: 48rpx;
+	}
+
+	.butmin {
+		height: 48rpx;
+		background-color: #3397FA;
+		color: #FFFFFF;
+		line-height: 48rpx;
+	}
+
+	//视频轮播
+	.full {
+		position: relative;
+
+		.btns {
+			position: absolute;
+			background-color: rgba(255, 255, 255, 0.5);
+			z-index: 1;
+			left: 100rpx;
+			top: 50rpx;
+			right: 100rpx;
+			display: flex;
+			justify-content: space-around;
+			flex-wrap: wrap;
+
+			>view {
+				height: 60rpx;
+				line-height: 60rpx;
+				text-align: center;
+				padding: 0 20rpx;
+			}
+
+			&.full {
+				position: relative;
+				left: 0;
+				right: 0;
+
+				>view {
+					height: 60rpx;
+					line-height: 60rpx;
+					text-align: center;
+					padding: 0 20rpx;
+					background-color: rgba(0, 0, 0, 0.1);
+					margin-bottom: 10rpx;
+				}
+			}
+		}
+	}
+
+	//轮播图
+	page {
+		background-color: #fff;
+	}
+
+	.top-swiper {
+		margin-bottom: 30rpx;
+
+		.bg {
+			padding-top: var(--status-bar-height);
+			box-sizing: content-box;
+			width: 100%;
+			position: relative;
+
+
+
+			.image {
+				box-sizing: content-box;
+				position: absolute;
+				z-index: 1;
+				top: 0;
+				left: 0;
+				width: 100%;
+				height: 100%;
+				overflow: hidden;
+
+				&::after {
+					content: '';
+					position: absolute;
+					width: 100%;
+					height: 100%;
+					z-index: 1;
+					bottom: 0;
+					left: 0;
+					height: 65%;
+					background-image: linear-gradient(to bottom, transparent, #FFF);
+				}
+
+				>image {
+					position: absolute;
+					box-sizing: content-box;
+					padding: 60px;
+					top: 0;
+					left: 0;
+					width: 100%;
+					height: 80%;
+					top: -60px;
+					left: -60px;
+					filter: blur(50px);
+				}
+			}
+		}
+
+		.box {
+			padding-top: var(--status-bar-height);
+			box-sizing: content-box;
+			// position: absolute;
+			z-index: 5;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: auto;
+		}
+
+		.swiper {
+			height: 450rpx;
+			margin: 0 20rpx;
+
+			.le-img {
+				width: 100%;
+				height: 100%;
+				display: block;
+				transform: scale(0.8);
+				transition: transform 0.3s ease-in-out 0s;
+				border-radius: 4px;
+
+				&.le-active {
+					transform: scale(1);
+				}
+			}
+
+		}
+	}
+
+	//其他的
+	/deep/ .uni-data-checklist .checklist-group .checklist-box {
+		border-radius: 20rpx !important;
+		padding: 8rpx 30rpx !important;
+		border: 0 !important;
+	}
+
+	/deep/ .uni-data-checklist .checklist-group .checklist-box .checklist-content .checklist-text {
+		font-size: 24rpx;
+		color: #333333;
+	}
+
+	/deep/ .mini-btn {
+		height: 45rpx;
+		width: 150rpx;
+		line-height: 45rpx;
+		margin: 30rpx;
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	.option {
+		padding: 20rpx;
+	}
+
+	//轮播图
+
+	.uni-margin-wrap {
+		width: 690rpx;
+		width: 100%;
+	}
+
+	.swiper {
+		height: 750rpx;
+		display: flex;
+		justify-content: center;
+	}
+
+	.swiper-item {
+		display: block;
+		width: 100%;
+		height: 750rpx;
+		line-height: 750rpx;
+		text-align: center;
+	}
+
+	.swiper-list {
+		margin-bottom: 0;
+	}
+
+	.uni-common-mt {
+		margin-top: 60rpx;
+		position: relative;
+	}
+
+	.info {
+		position: absolute;
+		right: 20rpx;
+	}
+
+	.uni-padding-wrap {
+		width: 550rpx;
+		padding: 0 100rpx;
+	}
+
+	.Tasktext {
+		// padding-top: 5% ;
+		padding: 0 0 0 1%;
+		// height: 80rpx;
+		margin-top: 2%;
+	}
+
+	.Tasktext span {
+		color: #333333;
+		font-size: 100%;
+		font-weight: 550;
+		text-indent: 2em;
+
+	}
+
+	.Tasktext image {
+		vertical-align: middle;
+		width: 50rpx;
+		height: 50rpx;
+		display: inline-block;
+		padding-right: 14rpx;
+	}
+
+	.TitleText {
+		height: 30rpx;
+		background-color: #FDD442;
+		border-radius: 20rpx;
+		display: inline-block;
+		padding: 0rpx 20rpx 0rpx 20rpx;
+		line-height: 30rpx;
+		margin-right: 20rpx;
+		margin-top: 6%;
+	}
+
+	.TitleText p {
+		color: #C49A0A;
+		font-size: 50%;
+
+	}
+
+	.introduction {
+		width: 100%;
+		margin: 0 auto;
+		display: flex;
+		// justify-content: space-around;
+		margin-top: 2%;
+	}
+
+	.rleft p {
+		font-size: 24rpx;
+		color: #999999;
+	}
+
+	.rright p {
+		font-size: 24rpx;
+		color: #999999;
+	}
+
+	.tasks {
+		width: 100%;
+		margin: 0 auto;
+		display: flex;
+		justify-content: space-around;
+		margin-top: 5%;
+	}
+
+	.title-left {
+		width: 6rpx;
+		height: 80rpx;
+		background: #E2E2E2;
+		display: inline-block;
+		border-radius: 1rpx;
+		margin-top: 4rpx;
+		vertical-align: top;
+
+	}
+
+	.tasksleft p {
+		font-size: 30rpx;
+		text-align: center;
+	}
+
+	.tasksright p {
+		font-size: 30rpx;
+		text-align: center;
+	}
+
+	.interval {
+		width: 100%;
+		height: 40rpx;
+		background-color: #E4E4E4;
+		margin-top: 5%;
+	}
+
+	.circularmark {
+		margin: 2% auto;
+		width: 26%;
+		padding: 10rpx;
+		background-color: #f2d22d;
+		border-radius: 10rpx;
+		position: relative;
+	}
+
+	.circularmark p {
+		font-size: 85%;
+		text-align: center;
+		font-weight: 800;
+	}
+
+	.circularmark image {
+		width: 60rpx;
+		height: 68rpx;
+		position: absolute;
+		top: -30%;
+		left: -10%;
+	}
+
+	.btnn {
+		background-color: #3296FA;
+		border-radius: 20rpx;
+		font-size: 25rpx;
+		line-height: 34rpx;
+	}
+
+	.markcontent {
+		// width: 100%;
+		// background-color: #E4E4E4;
+		margin: 0 30rpx;
+		border-radius: 20rpx;
+		padding-top: 2%;
+		padding-bottom: 2%;
+	}
+
+	.markcontent p {
+		font-size: 24rpx;
+		// color: #333333;
+		// margin: 3% ;
+	}
+
+	.markcontent span {
+		font-size: 24rpx;
+		// color: #333333;
+		// margin: 3% ;
+	}
+
+	.interval2 {
+		width: 100%;
+		height: 100rpx;
+		background-color: #E4E4E4;
+		margin-top: 5%;
+	}
+
+	.markcontent1 {
+		width: 100%;
+		border-radius: 20rpx;
+		padding-top: 2%;
+		padding-bottom: 2%;
+	}
+
+	.markcontent1 p {
+		font-size: 24rpx;
+		// color: #333333;
+		// margin: 3% ;
+		text-indent: 2em;
+	}
+
+	.trademark {
+		width: 120rpx;
+		height: 120rpx;
+		border-radius: 50%;
+		background-color: #f2d22d;
+		margin: 0 auto;
+	}
+
+	.trademark image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.diagram {
+		width: 100%;
+		// height: 1000rpx;
+	}
+
+	.diagram image {
+		width: 100%;
+		// height: 100% ;
+	}
+
+	.but1 {
+		width: 60%;
+		background-color: #f2d22d;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+
+		&.on {
+			background-color: #C0C0C0;
+
+		}
+
+	}
+
+	/** 必须提升样式优先权(!important) **/
+	button[disabled] {
+		width: 60%;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+		color: white !important;
+		background: #c4c1c1 !important;
+	}
+
+	.but2 {
+		width: 25%;
+		background-color: #FFFFFF;
+		border: 2rpx solid #f2d22d;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 180%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		position: relative;
+		text-indent: 0.5em;
+		height: 80%;
+	}
+
+	.but2 image {
+		width: 19%;
+		height: 56%;
+		position: absolute;
+		left: 9%;
+		top: 21%;
+	}
+
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+	}
+
+	.pick {
+		width: 50rpx;
+		height: 50rpx;
+		vertical-align: middle;
+	}
+
+	.nex {
+		width: 100rpx;
+		height: 20rpx;
+		vertical-align: middle;
+	}
+
+	.sampledrawing {
+		display: flex;
+		width: 96%;
+		margin: 0 auto;
+
+	}
+
+	.samplecharacter {
+		flex: 1;
+		margin-top: 2%;
+	}
+
+	.samplecharacter p {
+		padding: 1%;
+	}
+
+
+	/deep/.uni-popup__content {
+		background-color: #4CD964;
+		border-radius: 20rpx !important;
+	}
+
+	/deep/.uni-popup__mask {
+		background: rgba(0, 0, 0, 0.5) !important;
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	/deep/ .mini-btn {
+		height: 70rpx;
+		width: 300rpx;
+		line-height: 70rpx;
+		margin: 10rpx;
+		font-size: 80%;
+		box-shadow: 0rpx 0rpx 0rpx 5rpx #f2d22d;
+		border: 0rpx solid #f2d22d !important;
+	}
+
+	/deep/ .uni-data-checklist .checklist-group .checklist-box.is--tag {
+		background-color: #FFFFFF !important;
+		box-shadow: 0rpx 0rpx 6rpx 0rpx #464100;
+		border-radius: 10rpx !important;
+	}
+
+	/deep/ .uni-data-checklist .checklist-group .checklist-box.is--tag.is-checked {
+		background-color: #f2d22d !important;
+	}
+
+	/deep/.uni-data-checklist .checklist-group .checklist-box.is--tag.is-checked .checklist-text {
+		color: #333333 !important;
+	}
+
+	/deep/.buu .uni-data-checklist .checklist-group {
+		flex-direction: column !important;
+	}
+
+
+	.surplus p {
+		margin-bottom: 17%;
+		margin-top: 8%;
+		font-size: 80%;
+
+	}
+
+	.circular {
+		width: 120rpx;
+		height: 120rpx;
+		border-radius: 50%;
+		background-color: #28EA71;
+		margin: 0 auto;
+	}
+
+	.circular image {
+		width: 60%;
+		height: 60%;
+		padding: 20%;
+	}
+
+	.tii {
+		text-align: center;
+		font-size: 26rpx;
+		margin-top: 2%;
+	}
+
+	.tii2 {
+		text-align: center;
+		font-size: 26rpx;
+		margin-top: 2%;
+		background-color: #FFFFFF;
+
+	}
+
+	.errar {
+		background-color: #FFFFFF;
+
+	}
+
+	.sharepage {
+		width: 90%;
+		margin: 0 auto;
+		position: relative;
+	}
+
+	.Tasktext1 {
+		// padding-top: 5% ;
+		padding: 0 0 0 1%;
+		height: 80rpx;
+		margin-top: 7%;
+		text-align: center;
+	}
+
+	.Tasktext1 span {
+		color: #333333;
+		font-size: 100%;
+		font-weight: 550;
+		text-indent: 2em;
+
+	}
+
+	.Tasktext1 image {
+		vertical-align: middle;
+		width: 80rpx;
+		height: 80rpx;
+		display: inline-block;
+		padding-right: 14rpx;
+	}
+
+	.sharemap {
+		margin: 0 auto;
+		text-align: center;
+		margin-top: 5%;
+	}
+
+	.sharemap image {
+		width: 400rpx;
+		height: 400rpx;
+
+	}
+
+	.Tasktext2 {
+		// padding-top: 5% ;
+		padding: 0 0 0 1%;
+		// height: 80rpx;
+		margin-top: 2%;
+		// text-align: center;
+	}
+
+	.Tasktext2 span {
+		color: #333333;
+		font-size: 88%;
+		font-weight: 600;
+		text-indent: 2em;
+
+	}
+
+	.Tasktext2 image {
+		vertical-align: middle;
+		width: 30rpx;
+		height: 30rpx;
+		display: inline-block;
+		padding-right: 14rpx;
+	}
+
+	.textti p {
+		font-size: 60%;
+		color: #999999;
+		text-align: center;
+	}
+
+	.immg image {
+		width: 200rpx;
+		height: 200rpx;
+	}
+
+	.immg {
+		line-height: 150%;
+	}
+
+	.immg p {
+		color: #333333;
+		font-size: 90%;
+		font-weight: 600;
+
+	}
+
+	.warr p {
+		font-weight: 500;
+		font-size: 90%;
+
+		&.lor {
+			border-bottom: 2rpx solid #f2d22d;
+
+		}
+	}
+
+	.label {
+		// font-weight: 600;
+		width: 130rpx;
+	}
+</style>

+ 27 - 28
pages/tasksquare/success.vue

@@ -5,30 +5,24 @@
 		<view class="home">
 			<view class="card">
 				<view class=""
-					style="display: flex;justify-content:space-around;width: 80%;margin: 0 auto;margin-top: 20rpx;margin-bottom: 20rpx;align-items: center;">
-					<!-- <image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task21.png" mode=""
-						style="width: 112rpx;height: 130rpx;"></image> -->
+					style="display: flex;justify-content:center;width: 80%;margin: 0 auto;margin-top: 20rpx;margin-bottom: 20rpx;align-items: center;">
 					<image src="../../static/img/sucess.png" mode=""
 						style="width: 150rpx;height: 150rpx;"></image>
-					<view class="" style="font-size: 32rpx;">
+					<view class="" style="font-size: 32rpx;margin-left: 30rpx;">
 						<p>已报名成功</p>
-						<p>今日报名次数剩余:{{times}}次</p>
-						<p>分享任务可获得更多任务~</p>
-						<!-- 	<p class='ipon' style='margin-top: 5rpx;'>今日报名次数剩余:4次</p>
-					<p class='ipon'>分享任务可申请更多任务</p> -->
 					</view>
 
 				</view>
 			</view>
 			<view class="card" style="margin-top: 6%;">
-				<view class="" style="width: 90%;margin: 0 auto;margin-top: 20rpx;margin-bottom: 20rpx;">
+				<view class="" style="width: 90%;margin-top: 20rpx;margin-bottom: 20rpx;">
 
 					<p class='ipon1' style='margin-top: 5rpx;'>1.任务确认结果可随时在<span
 							style="color: deepskyblue;">我的任务</span>中查看 </p>
 					<p class='ipon1'> 2.品牌同意合作后我们会再次与您确认合作意向和收货地址,请及时操作,否则资格可能会被取消~ </p>
 					<p class='ipon1'>3.请<span style="color: deepskyblue;">订阅</span>我们的通知消息~以防止超时操作的情况~</p>
 					<p class='ipon1'> 4.点击右上角添加小程序,能更快找到我们哦~</p>
-					<view class="" style="width: 80%;background-color: #C9C9C9;border-radius: 10rpx;">
+					<!-- <view class="" style="width: 80%;background-color: #C9C9C9;border-radius: 10rpx;">
 						<view class="Tasktext">
 							<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task20.png" mode="">
 							</image>
@@ -57,7 +51,7 @@
 								<p class='ppan'>添加到我的小程序</p>
 							</view>
 						</view>
-					</view>
+					</view> -->
 				</view>
 
 
@@ -70,7 +64,7 @@
 			</view>
 
 			<view class="signupbut">
-				<button type="default" class="but1" @click="mymission()"> 查看任务</button>
+				<button type="default" class="but1" @click="toDetail()"> 查看任务</button>
 
 			</view>
 
@@ -120,12 +114,16 @@
 				},
 			};
 		},
+		async onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.task_id
+		},
 		methods: {
 			// 进入任务列表页面
-
-			mymission() {
+			toDetail() {
 				uni.navigateTo({
-					url: '/pages/mymission/mymission'
+					url: '/pages/workspace/taskdetail?taskId=' + this.taskId,
 				});
 			},
 			dingyue() {
@@ -137,12 +135,11 @@
 		}
 	};
 </script>
-<style>
-	page {
-		background-color: #F4F4F4;
-	}
-</style>
 <style lang="scss" scoped>
+	p{
+		color: #a9a9a9;
+	}
+	
 	.butto {
 		text-align: center;
 	}
@@ -189,13 +186,15 @@
 	}
 
 	.card {
-		width: 88%;
-		padding: 24rpx;
+		width: 100%;
+		// padding: 24rpx;
 		margin-top: 30rpx;
 		border-radius: 10rpx;
-		background-color: #ffffff;
 		margin: 0 auto;
-		box-shadow: 0px 0px 10rpx 2rpx #FFFFFF;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
 	}
 
 	.ipon {
@@ -212,13 +211,13 @@
 	}
 
 	.signup {
-		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		// box-shadow: 0rpx 5rpx 40rpx #ccc;
 		width: 100%;
 		position: fixed;
 		bottom: 0rpx;
 		display: flex;
 		height: 90rpx;
-		padding-top: 2%;
+		padding: 2% 0;
 		background-color: #FFFFFF;
 		justify-content: space-around;
 	}
@@ -242,9 +241,9 @@
 	.but1 {
 		width: 120%;
 		text-align: center;
-		background-color: dodgerblue;
+		background-color: #f3d500;
 		border-radius: 10rpx;
-		color: white;
+		color: #000;
 		font-size: 28rpx;
 		line-height: 200%;
 		justify-content: center;

File diff ditekan karena terlalu besar
+ 421 - 336
pages/tasksquare/taskdetail.vue


+ 214 - 263
pages/tasksquare/tasksquare.vue

@@ -22,7 +22,7 @@
           marginLeft: navBarLeft,
           borderRadius: mysNavConfig.type2Config.radius,
         }">
-					<view class="btn_back" @tap="onLeftClick">
+					<view class="btn_back" @tap="onLeftClick()">
 						<image class="nv_icon" :src="mysNavConfig.type2Config.leftPath"
 							:style="{ height: btnHeight, width: iconW }" mode="aspectFit" />
 					</view>
@@ -44,31 +44,30 @@
 				</view>
 			</view>
 		</view>
+		<aTip text="点击添加到我的小程序 \n下次访问更方便哦!" isCustom="true" />
 		<view class="home" style="padding-top: 180rpx;">
 			<view>
 				<!-- 普通弹窗 -->
 				<uni-popup ref="popup" background-color="#fff" @change="change">
 					<view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }">
-						<view class="option" style="margin-top: 20%;">
+						<view class="option1" style="margin-top: 20%;">
 							<h3 style="margin-bottom: 10rpx;">社媒平台</h3>
 							<uni-data-checkbox mode="tag" multiple v-model="formData.hobby" :localdata="hobby">
 							</uni-data-checkbox>
 						</view>
-						<view class="option">
+						<view class="option2">
 							<h3 style="margin-bottom: 10rpx;">稿费形式</h3>
 							<uni-data-checkbox mode="tag" multiple v-model="formData.hobby1" :localdata="hobby1">
 							</uni-data-checkbox>
 						</view>
-						<view class="option">
+						<view class="option3">
 							<h3 style="margin-bottom: 10rpx;">任务形式</h3>
 							<uni-data-checkbox mode="tag" multiple v-model="formData.hobby2" :localdata="hobby2">
 							</uni-data-checkbox>
 						</view>
 						<view class="butto">
-							<button class="mini-btn" size="mini" @tap="Reset"
-								style="background-color: #D9D9D9;">重置</button>
-							<button class="mini-btn1" size="mini" @tap="determine"
-								style="background-color: #FCCF41;">确定</button>
+							<button class="mini-btn" size="mini" @tap="Reset">重置</button>
+							<button class="mini-btn" size="mini" @tap="determine">确定</button>
 						</view>
 					</view>
 				</uni-popup>
@@ -88,7 +87,7 @@
 			<view class="commodity" style="margin-top: 3%;">
 				<view class="project" v-for="(item,index) in projectList" :key="index" @tap="project(item)">
 					<view class="projectdiagram" :style="{backgroundImage:`url(${item.coverphoto})`}">
-						<view class="Mask" v-if="item.deadlinetype==0">
+						<view class="Mask" v-if="item.ddl">
 							<image src="https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/home4.png" mode="">
 							</image>
 						</view>
@@ -114,7 +113,7 @@
 					<view class="introduction">
 						<view class="rleft" style="">
 							<p>商品价值: <span
-									style="color: red;font-weight: 600;">¥{{item.ProductInfo.product_price}}</span></p>
+									style="color: red;font-weight: 600;">¥{{item.ProductInfo.ProductPrice}}</span></p>
 						</view>
 						<view class="rright" style="display: flex;justify-content:space-between;">
 							<p>招募人数: <span style="color: balck;font-weight: 600;">{{item.taskNum}}</span></p>
@@ -159,7 +158,8 @@
 	</view>
 </template>
 <script>
-	import request from '@/components/request.js'
+	import aTip from "@/components/mys-tip_1.0.01/a_tip/aTip";
+	import request from '@/components/request.js';
 	/* 默认首页路径 */
 	const homePath = "/pages/pupu/pupudao";
 	/* 默认首页图标路径 */
@@ -229,10 +229,9 @@
 				}
 				return value;
 			},
-
 		},
 		components: {
-
+			aTip
 		},
 		data() {
 			return {
@@ -295,17 +294,14 @@
 					value: 3
 				}],
 				hobby2: [{
-					text: '线下探店',
+					text: '实体商品寄拍',
 					value: 1
 				}, {
-					text: '实体商品',
+					text: '虚拟产品测评',
 					value: 2
 				}, {
-					text: '虚拟商品',
+					text: '线下探店打卡',
 					value: 3
-				}, {
-					text: '素材微原创',
-					value: 4
 				}],
 
 				iconW: undefined,
@@ -330,7 +326,7 @@
 				},
 				projectList: [],
 				img456: '../../static/home/home.png',
-				listsrc: [],
+				platformList: [],
 				filtCondition: '',
 			};
 		},
@@ -350,81 +346,154 @@
 		},
 		onLoad() {
 			this.getInfoList()
-			this.getProjectList()
+			this.per = 0
+			this.getProjectListAPI()
 		},
 		//下拉刷新
 		onPullDownRefresh() {
-			this.getProjectList()
-			console.log(123)
+			this.per = 0
+			this.getProjectListAPI()
 			//停止下拉刷新
 			uni.stopPullDownRefresh()
 		},
 		// 下拉懒加载
-		onReachBottom: function() {
+		async onReachBottom() {
 			++this.per;
-			new Promise((resolve, reject) => {
+			if (this.per >= this.max_page) {
+				uni.showToast({
+					title: "已加载全部"
+				})
+			} else {
 				uni.showLoading({
 					title: '加载中'
 				})
-				// 用延迟代替 请求,模拟异步获取数据的状态
-				this.requestTimeout = setTimeout(() => {
-					let data = {}
-					resolve(data);
-				}, 1000);
-			}).then((res) => {
+				await this.$http.get('/youngee/c/g/get-project-list' +
+					"?" +
+					"idx" +
+					"=" +
+					this.per +
+					"&cnt" +
+					"=" +
+					20 + this.filtCondition
+				).then(res => {
+					console.log(res)
+					this.max_page = res.data.data.max_page
+					for (var i = 0; i < res.data.data.ProjectInfos.length; i++) {
+						// 封面图片
+						res.data.data.ProjectInfos[i].ProductInfo = JSON.parse(res.data.data.ProjectInfos[i]
+							.product_snap);
+
+						// 封面图片
+						let ProductPhoto = JSON.parse(res.data.data.ProjectInfos[i].product_photo_snap);
+						for (let j = 0; j < ProductPhoto.length; ++j) {
+							if (ProductPhoto[j].Symbol == 1) {
+								res.data.data.ProjectInfos[i].coverphoto = ProductPhoto[j].PhotoUrl
+							}
+						}
+						// res.data.data.ProjectInfos[i].coverphoto = res.data.data.ProjectInfos[i]
+						// 	.ProductInfo
+						// 	.ProductCovers.photo_url
+						// 获取平台图片
+						for (var j = 0; j < this.platformList.length; j++) {
+							if (res.data.data.ProjectInfos[i].project_platform === this.platformList[j]
+								.id) {
+								res.data.data.ProjectInfos[i].project_imgper = this.platformList[j]
+									.platform_icon
+							}
+						}
+
+						// 任务数量&稿费形式
+						res.data.data.ProjectInfos[i].taskNum = 0
+						res.data.data.ProjectInfos[i].isfixedfee = 0
+						res.data.data.ProjectInfos[i].isself = 0
+						let lengthOfRecruitStrategys = res.data.data.ProjectInfos[i]
+							.RecruitStrategys != null ? res.data.data.ProjectInfos[i]
+							.RecruitStrategys
+							.length : 0
+						for (var j = 0; j < lengthOfRecruitStrategys; j++) {
+							res.data.data.ProjectInfos[i].taskNum = Number(res.data.data
+								.ProjectInfos[i]
+								.taskNum) + Number(res.data.data.ProjectInfos[i]
+								.RecruitStrategys[j]
+								.recruit_number)
+
+							if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 2) {
+								res.data.data.ProjectInfos[i].isfixedfee = 1
+							}
+							if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 3) {
+								res.data.data.ProjectInfos[i].isself = 1
+							}
+						}
+						//结束时间
+						var newdate = new Date()
+						// console.log(newdate)
+						var endTime = new Date(res.data.data.ProjectInfos[i].recruit_ddl.replace(
+							/-/g, "/"));
+						res.data.data.ProjectInfos[i].ddl = endTime - newdate < 0 ? 1 : 0
+						res.data.data.ProjectInfos[i].recruit_ddl = this.thistime(res.data.data
+							.ProjectInfos[i]
+							.recruit_ddl)
+					}
+					this.projectList.push.apply(this.projectList, res.data.data.ProjectInfos);
+					console.log(this.projectList)
+				})
 				uni.hideLoading();
-				if (this.per >= this.max_page) {
-					uni.showToast({
-						title: "已加载全部"
-					})
-				} else {
-					this.$http.get('/youngee/c/g/get-project-list' +
-						"?" +
-						"idx" +
-						"=" +
-						this.per +
-						"&cnt" +
-						"=" +
-						20 + this.filtCondition
-					).then(res => {
-						console.log(res)
-						this.max_page = res.data.data.max_page
+			}
+		},
+		methods: {
+			getProjectListAPI() {
+				return this.$http.get('/youngee/c/g/get-project-list' +
+					"?" +
+					"idx" +
+					"=" +
+					this.per +
+					"&cnt" +
+					"=" +
+					20 + this.filtCondition
+				).then(res => {
+					console.log(res)
+					if (res.data.code === 0) {
 						for (var i = 0; i < res.data.data.ProjectInfos.length; i++) {
+							res.data.data.ProjectInfos[i].ProductInfo = JSON.parse(res.data.data.ProjectInfos[i]
+								.product_snap);
+
 							// 封面图片
-							res.data.data.ProjectInfos[i].coverphoto = res.data.data.ProjectInfos[i]
-								.ProductInfo
-								.ProductCovers.photo_url
+							let ProductPhoto = JSON.parse(res.data.data.ProjectInfos[i].product_photo_snap);
+							for (let j = 0; j < ProductPhoto.length; ++j) {
+								if (ProductPhoto[j].Symbol == 1) {
+									res.data.data.ProjectInfos[i].coverphoto = ProductPhoto[j].PhotoUrl
+								}
+							}
+							// res.data.data.ProjectInfos[i].coverphoto = res.data.data.ProjectInfos[i]
+							// 	.ProductInfo
+							// 	.ProductCovers.photo_url
 							// 获取平台图片
-							for (var j = 0; j < this.listsrc.length; j++) {
-								if (res.data.data.ProjectInfos[i].project_platform == this.listsrc[j]
+							for (var j = 0; j < this.platformList.length; j++) {
+								if (res.data.data.ProjectInfos[i].project_platform === this.platformList[j]
 									.id) {
-									res.data.data.ProjectInfos[i].project_imgper = this.listsrc[j]
+									res.data.data.ProjectInfos[i].project_imgper = this.platformList[j]
 										.platform_icon
 								}
 							}
-							this.listsrc
-
-							// 价值除100
-							// res.data.data.ProjectInfos[i].ProductInfo.product_price = Number(res.data.data
-							// 	.ProjectInfos[i]
-							// 	.ProductInfo.product_price) * 0.01
 
 							// 任务数量&稿费形式
 							res.data.data.ProjectInfos[i].taskNum = 0
-							for (var j = 0; j < res.data.data.ProjectInfos[i].RecruitStrategys
-								.length; j++) {
+							res.data.data.ProjectInfos[i].isfixedfee = 0
+							res.data.data.ProjectInfos[i].isself = 0
+							let lengthOfRecruitStrategys = res.data.data.ProjectInfos[i]
+								.RecruitStrategys != null ? res.data.data.ProjectInfos[i]
+								.RecruitStrategys
+								.length : 0
+							for (var j = 0; j < lengthOfRecruitStrategys; j++) {
 								res.data.data.ProjectInfos[i].taskNum = Number(res.data.data
 									.ProjectInfos[i]
 									.taskNum) + Number(res.data.data.ProjectInfos[i]
 									.RecruitStrategys[j]
 									.recruit_number)
 
-								res.data.data.ProjectInfos[i].isfixedfee = 0
 								if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 2) {
 									res.data.data.ProjectInfos[i].isfixedfee = 1
 								}
-
-								res.data.data.ProjectInfos[i].isself = 0
 								if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 3) {
 									res.data.data.ProjectInfos[i].isself = 1
 								}
@@ -434,50 +503,55 @@
 							// console.log(newdate)
 							var endTime = new Date(res.data.data.ProjectInfos[i].recruit_ddl.replace(
 								/-/g, "/"));
-							// console.log(beginTime)
-							if (endTime - newdate < 0) {
-								res.data.data.ProjectInfos[i].deadlinetype = 0
-							} else {
-								res.data.data.ProjectInfos[i].deadlinetype = 1
-							}
+							res.data.data.ProjectInfos[i].ddl = endTime - newdate < 0 || res.data.data
+								.ProjectInfos[i]
+								.project_status > 4 ? 1 : 0
 							res.data.data.ProjectInfos[i].recruit_ddl = this.thistime(res.data.data
 								.ProjectInfos[i]
 								.recruit_ddl)
-
 						}
-						this.projectList = res.data.data.ProjectInfos
-						console.log(this.projectList)
-					})
-				}
-			})
-		},
-		methods: {
+						this.max_page = res.data.data.max_page
+						this.projectList = res.data.data.ProjectInfos;
+					} else if (res.data.code === -4) {
+						uni.showToast({
+							title: "暂无任务"
+						})
+						this.max_page = 1
+						this.projectList = []
+
+					} else {
+						uni.showToast({
+							title: res.data.msg
+						})
+						this.max_page = 1
+						this.projectList = []
+					}
+				})
+			},
 			// 判断登陆是否过期
 			isLogin() {
-				if (this.token == '') {
-					this.token = uni.getStorageSync('token')
-				}
-				this.$https.get('/youngee/c/t/g/is-login')
+				return this.$https.get('/youngee/c/t/g/is-login')
 					.then(res => {
-						console.log(res)
-						if (res.data.code == 403) {
+						if (res.data.code === 403) {
+							// 登陆已失效
 							this.token = ""
 							uni.clearStorage();
+						} else {
+							this.token = uni.getStorageSync('token')
 						}
 					})
 			},
 			// 信息表
 			getInfoList() {
-				this.$http.get('/youngee/c/g/get-info-tables')
+				return this.$http.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						this.hobby = []
-						console.log(res)
-						this.listsrc = res.data.data.ThirdPlatform
-
-						for (var i = 0; i < this.listsrc.length; i++) {
+						this.platformList = res.data.data.ThirdPlatform
+						let l = this.platformList != null ? this.platformList.length : 0;
+						for (var i = 0; i < l; i++) {
 							var obj = {}
-							obj.text = this.listsrc[i].platform_name
-							obj.value = this.listsrc[i].id
+							obj.text = this.platformList[i].platform_name
+							obj.value = this.platformList[i].id
 							this.hobby.push(obj)
 						}
 					})
@@ -485,91 +559,11 @@
 			guid() {
 				return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
 					var r = Math.random() * 16 | 0,
-						v = c == 'x' ? r : (r & 0x3 | 0x8);
+						v = c === 'x' ? r : (r & 0x3 | 0x8);
 
 					return v.toString(16);
 				});
 			},
-			getProjectList() {
-				this.per = 0
-				this.$http.get('/youngee/c/g/get-project-list' +
-					"?" +
-					"idx" +
-					"=" +
-					this.per +
-					"&cnt" +
-					"=" +
-					20 + this.filtCondition
-				).then(res => {
-					console.log(res)
-					if (res.data.code == -4) {
-						this.projectList = []
-						uni.showToast({
-							title: '没有满足条件的任务',
-							icon: 'none',
-							duration: 2000
-						});
-					} else {
-						this.max_page = res.data.data.max_page
-						for (var i = 0; i < res.data.data.ProjectInfos.length; i++) {
-							// 封面图片
-							res.data.data.ProjectInfos[i].coverphoto = res.data.data.ProjectInfos[i].ProductInfo
-								.ProductCovers.photo_url
-							// 获取平台图片
-							for (var j = 0; j < this.listsrc.length; j++) {
-								if (res.data.data.ProjectInfos[i].project_platform == this.listsrc[j].id) {
-									res.data.data.ProjectInfos[i].project_imgper = this.listsrc[j].platform_icon
-								}
-							}
-							this.listsrc
-
-							// 价值除100
-							// res.data.data.ProjectInfos[i].ProductInfo.product_price = Number(res.data.data
-							// 	.ProjectInfos[i]
-							// 	.ProductInfo.product_price) * 0.01
-
-							// 任务数量&稿费形式
-							res.data.data.ProjectInfos[i].taskNum = 0
-
-							if (res.data.data.ProjectInfos[i].RecruitStrategys) {
-								for (var j = 0; j < res.data.data.ProjectInfos[i].RecruitStrategys.length; j++) {
-									res.data.data.ProjectInfos[i].taskNum = Number(res.data.data.ProjectInfos[i]
-										.taskNum) + Number(res.data.data.ProjectInfos[i].RecruitStrategys[j]
-										.recruit_number)
-
-									res.data.data.ProjectInfos[i].isfixedfee = 0
-									if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 2) {
-										res.data.data.ProjectInfos[i].isfixedfee = 1
-									}
-
-									res.data.data.ProjectInfos[i].isself = 0
-									if (res.data.data.ProjectInfos[i].RecruitStrategys[j].fee_form === 3) {
-										res.data.data.ProjectInfos[i].isself = 1
-									}
-								}
-							}
-
-							//结束时间
-							var newdate = new Date()
-							// console.log(newdate)
-							var endTime = new Date(res.data.data.ProjectInfos[i].recruit_ddl.replace(/-/g, "/"));
-							// console.log(beginTime)
-							if (endTime - newdate < 0) {
-								res.data.data.ProjectInfos[i].deadlinetype = 0
-							} else {
-								res.data.data.ProjectInfos[i].deadlinetype = 1
-							}
-							res.data.data.ProjectInfos[i].recruit_ddl = this.thistime(res.data.data.ProjectInfos[i]
-								.recruit_ddl)
-
-						}
-						this.projectList = res.data.data.ProjectInfos
-						console.log(this.projectList)
-
-					}
-
-				})
-			},
 			// 计算结束时间
 			thistime(val) {
 				// 转换格式
@@ -588,47 +582,6 @@
 					deadline_time = day + '天' + hours + '时结束'
 				return deadline_time
 			},
-			// 位运算方法
-			contentFormToString(val) {
-				let result = ""
-
-				let broadcast = 128
-				let broadcastType = val & broadcast
-				if (broadcastType > 0) {
-					result += "直播"
-				} else {
-					let imgMask = 15
-					let articleMask = 48
-					let liveMask = 64
-					let originImgVal = 1
-					let zhidingImgVal = 2
-					let originVideo = 4
-					let zhidingVidel = 8
-					let origArticle = 16
-					let zhidingArticle = 32
-
-					let imgAVal = val & imgMask
-					if (imgAVal == originImgVal) {
-						result += "原创图片"
-					} else if (imgAVal == zhidingImgVal) {
-						result += "指定图片"
-					} else if (imgAVal == originVideo) {
-						result += "原创视频"
-					} else if (imgAVal == zhidingVidel) {
-						result += "指定视频"
-					}
-
-					let articleType = val & articleMask
-
-
-					if (articleType == origArticle) {
-						result += "+ 原创文案"
-					} else if (articleType == zhidingArticle) {
-						result += "+ 指定文案"
-					}
-				}
-				return result
-			},
 
 			// 登录页面
 			deng() {
@@ -647,41 +600,37 @@
 			change(e) {
 				console.log('当前模式:' + e.type + ',状态:' + e.show);
 			},
-			determine() {
+			async determine() {
+				this.per = 0;
 				this.$refs.popup.close()
-				uni.showLoading({
-					title: '加载中'
-				});
-				console.log(this.formData.hobby)
-				console.log(this.formData.hobby1)
 				var filtCondition = ''
 				for (var i = 0; i < this.formData.hobby.length; i++) {
 					filtCondition += "&platform[]" + "=" + this.formData.hobby[i]
 				}
-
 				for (var j = 0; j < this.formData.hobby1.length; j++) {
 					filtCondition += "&feeform[]" + "=" + this.formData.hobby1[j]
 				}
-
 				for (var j = 0; j < this.formData.hobby2.length; j++) {
 					filtCondition += "&projectform[]" + "=" + this.formData.hobby2[j]
 				}
-				console.log(filtCondition)
 				this.filtCondition = filtCondition
-				this.getProjectList()
-				uni.hideLoading();
-			},
-			Reset() {
-				this.$refs.popup.close()
 				uni.showLoading({
 					title: '加载中'
 				});
-				console.log('重置')
+				await this.getProjectListAPI()
+				uni.hideLoading();
+			},
+			async Reset() {
+				this.per = 0;
+				this.$refs.popup.close()
 				this.formData.hobby = [];
 				this.formData.hobby1 = [];
 				this.formData.hobby2 = [];
 				this.filtCondition = '';
-				this.getProjectList()
+				uni.showLoading({
+					title: '加载中'
+				});
+				await this.getProjectListAPI()
 				uni.hideLoading();
 			},
 			toggle4(type) {
@@ -702,7 +651,7 @@
 				if (this.mysNavConfig.isHome) {
 					let pages = getCurrentPages().length;
 					/* 单页显示home图标 */
-					pages == 1 ? (this.isHome = true) : (this.isHome = false);
+					pages === 1 ? (this.isHome = true) : (this.isHome = false);
 				}
 				// 开启渐变 强制fixed
 				this.navBarTop = uni.getSystemInfoSync().statusBarHeight + "px";
@@ -743,38 +692,25 @@
 			/* 点击左侧 */
 			onLeftClick() {
 				uni.navigateTo({
-					url: '/pages/pupu/search'
+					url: '/pages/tasksquare/search'
 				});
 			},
 			// 进入任务详情
 			project(item) {
+				// uni.navigateTo({
+				// 	url: '/pages/test/test'
+				// });
 				console.log(item.project_id)
-				if (this.token == '') {
-					uni.showModal({
-						content: '请先登录',
-						success: function(res) {
-							if (res.confirm) {
-								uni.navigateTo({
-									url: '/pages/login/login'
-								});
-							} else if (res.cancel) {
-								console.log('用户点击取消');
-							}
-						}
+				if (item.project_type === 1) {
+					uni.navigateTo({
+						url: '/pages/tasksquare/taskdetail?id=' + item.project_id
 					});
 				} else {
-					if (item.deadlinetype == 0) {
-						uni.navigateTo({
-							url: '/pages/tasksquare/taskdetail?id=' + item.project_id + "&ddl=1"
-						});
-					} else {
-						{
-							uni.navigateTo({
-								url: '/pages/tasksquare/taskdetail?id=' + item.project_id + "&ddl=0"
-							});
-						}
-					}
+					uni.navigateTo({
+						url: '/pages/tasksquare/specialTask/specialTaskDetail?id=' + item.project_id
+					});
 				}
+				// }
 			},
 			/* type2 点击分类 */
 			onLeftHome(type) {
@@ -782,7 +718,6 @@
 				// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
 				this.$refs.popup.open(type)
 			},
-
 			/* 点击右侧 */
 			onRightClick() {
 				console.log("onRightClick");
@@ -846,6 +781,24 @@
 	}
 </style>
 <style lang="scss" scoped>
+	.option1 {
+		padding: 5rpx 18rpx;
+
+		/deep/.uni-data-checklist .checklist-group .checklist-box .checklist-content {
+			width: 100rpx;
+			text-align: center;
+		}
+	}
+
+	.option2 {
+		padding: 5rpx 18rpx;
+	}
+
+	.option3 {
+		padding: 5rpx 18rpx;
+	}
+
+
 	//弹窗
 	.sharepage {
 		width: 90%;
@@ -922,7 +875,7 @@
 		line-height: 70rpx;
 		margin: 20rpx;
 		letter-spacing: 4rpx;
-		color: white;
+		background-color: #FCCF41;
 	}
 
 	/deep/ .mini-btn1 {
@@ -943,11 +896,6 @@
 		text-align: center;
 	}
 
-	.option {
-		padding: 5rpx 18rpx;
-		// background-color: #FFFFFF;
-	}
-
 	//其他
 	.nav {
 		position: relative;
@@ -1330,17 +1278,20 @@
 
 	.TitleText {
 		// height: 30rpx;
+		width: 25%;
 		background-color: #FDD442;
 		border-radius: 10rpx;
 		display: inline-block;
-		padding: 0rpx 20rpx 0rpx 20rpx;
+		text-align: center;
+		// padding: 0rpx 10rpx 0rpx 10rpx;
+		margin-right: 6%;
 		line-height: 30rpx;
 		margin-top: 0%;
 	}
 
 	.TitleText p {
 		color: black;
-		font-size: 18rpx;
+		font-size: 16rpx;
 	}
 
 	.introduction {

+ 288 - 4
pages/test/test.vue

@@ -1,18 +1,302 @@
 <template>
-	<view>
-		
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<!-- <view>
+			<l-painter isRenderImage :width="'686rpx'" :height="'930rpx'"
+				custom-style="position: fixed; top:10px; left: 500%;" ref="painter" @success="poster($event)" />
+		</view> -->
 	</view>
 </template>
 
 <script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	// import lPainter from "@/components/lime-painter/index.vue"	
+	// import lPainter from '@/utils/painter'
+
 	export default {
+		components: {
+			mvBar,
+			// 'l-painter': lPainter
+		},
 		data() {
 			return {
-				
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "我的收益",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: "/pages/mycenter/mycenter",
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
 			}
 		},
+		onLoad(){
+			this.onShareLoad();
+		},
 		methods: {
-			
+			onShareLoad() {
+				let that = this;
+				let base = {
+					width: '686rpx',
+					height: '950rpx',
+					views: [{
+							css: {
+								width: '686rpx',
+								height: '500rpx',
+								display: "inline-block",
+							},
+							views: [{
+								type: 'image',
+								src: '../../static/home.png',
+								mode: 'scaleToFill',
+								css: {
+									radius: '32rpx 32rpx 0rpx 0rpx',
+									left: '0rpx',
+									top: '0rpx',
+									width: '686rpx',
+									height: '500rpx',
+								}
+							}],
+							type: "view"
+						},
+						{
+							css: {
+								width: '686rpx',
+								height: '190rpx',
+								display: "inline-block",
+								background: '#ffffff',
+							},
+							views: [{
+									type: 'text',
+									text: '¥',
+									css: {
+										color: '#FE4F02',
+										left: '30rpx',
+										top: '550rpx',
+										fontSize: '26rpx',
+										lineHeight: '45rpx'
+									}
+								},
+								{
+									type: 'text',
+									text: '1688.00',
+									css: {
+										color: '#FE4F02',
+										left: '60rpx',
+										top: '550rpx',
+										fontWerght: 'bold',
+										fontSize: '52rpx',
+										lineHeight: '45rpx'
+									}
+								},
+								{
+									type: 'text',
+									text: 'uniapp使用l-painter画板,海报uniapp使用l-painter画板,海报',
+									css: {
+										maxLines: 1,
+										width: '630rpx',
+										color: '#1A1A1A',
+										left: '32rpx',
+										top: '620rpx',
+										fontSize: '32rpx',
+										fontWerght: 'bold',
+										lineHeight: '45rpx'
+									}
+								}
+							],
+							type: "view"
+						}, {
+							css: {
+								width: '686rpx',
+								height: '52rpx',
+								display: "inline-block",
+							},
+							views: [{
+								type: 'image',
+								src: '../../static/img/aimg1.png',
+								mode: 'scaleToFill',
+								css: {
+									left: '0rpx',
+									top: '690rpx',
+									width: '686rpx',
+									height: '52rpx',
+								}
+							}],
+							type: "view"
+						}, {
+							css: {
+								width: '686rpx',
+								height: '180rpx',
+								display: "inline-block",
+								background: '#ffffff',
+								radius: '0rpx 0rpx 32rpx 32rpx',
+							},
+							views: [{
+									type: 'text',
+									text: '购买热线',
+									css: {
+										left: '40rpx',
+										top: '770rpx',
+										fontSize: '28rpx',
+										color: '#999999'
+									}
+								},
+								{
+									type: 'image',
+									src: '../../static/img/icon4.png',
+									mode: 'widthFix',
+									css: {
+										left: '184rpx',
+										top: '770rpx',
+										width: '36rpx',
+										height: '36rpx',
+
+									}
+								},
+								{
+									type: 'text',
+									text: '手机号码',
+									css: {
+										left: '240rpx',
+										top: '770rpx',
+										fontSize: '28rpx',
+										fontWerght: 'bold',
+									}
+								},
+								{
+									type: 'text',
+									text: '150-1234-4567',
+									css: {
+										left: '360rpx',
+										top: '770rpx',
+										fontSize: '28rpx',
+										fontWerght: 'bold',
+									}
+								},
+								{
+									type: 'image',
+									src: '../../static/img/sucess.png',
+									mode: 'widthFix',
+									css: {
+										left: '184rpx',
+										top: '840rpx',
+										width: '36rpx',
+										height: '36rpx',
+
+									}
+								},
+								{
+									type: 'text',
+									text: '微信号码',
+									css: {
+										left: '240rpx',
+										top: '840rpx',
+										fontSize: '28rpx',
+										fontWerght: 'bold',
+									}
+								},
+								{
+									type: 'text',
+									text: 'csc1234',
+									css: {
+										left: '360rpx',
+										top: '840rpx',
+										fontSize: '28rpx',
+										fontWerght: 'bold',
+									}
+								},
+							],
+							type: "view"
+						},
+						{
+							css: {
+								top: '360rpx',
+								left: '480rpx',
+								width: '170rpx',
+								height: '220rpx',
+								display: "inline-block",
+								background: '#ffffff',
+								borderRadius: '16rpx',
+								boxShadow: "0 20rpx 58rpx rgba(0,0,0,.15)"
+							},
+							views: [{
+									type: 'text',
+									text: '产品详情二维码',
+									css: {
+										width: '280rpx',
+										top: '540rpx',
+										left: '488rpx',
+										fontSize: '22rpx',
+										color: '#1A1A1A'
+									}
+								},
+								{
+									type: 'image',
+									src: '../../static/img/deng2.png',
+									mode: 'widthFix',
+									css: {
+										top: '370rpx',
+										left: '484rpx',
+										width: '160rpx',
+										height: '160rpx',
+										borderRadius: '50%'
+									}
+								}
+							],
+							type: "view"
+						}
+					]
+				}
+				const painter = that.$refs.painter;
+				painter.render(base);
+			},
+			poster(event) {
+				console.info(event)
+				let path = event;
+				let that = this;
+				// #ifdef H5
+				var eleLink = document.createElement('a');
+				eleLink.download = "filename";
+				eleLink.style.display = 'none';
+				eleLink.href = path;
+				document.body.appendChild(eleLink);
+				eleLink.click();
+				// 然后移除
+				document.body.removeChild(eleLink);
+				// #endif
+				// #ifndef H5
+				uni.saveImageToPhotosAlbum({
+					filePath: path,
+					success(res) {
+						that.painterShow = false;
+						that.show = false;
+						uni.showToast({
+							title: '已保存到相册',
+							icon: 'success',
+							duration: 2000
+						})
+					}
+				})
+				// #endif
+			},
 		}
 	}
 </script>

+ 8 - 4
pages/workspace/applyInformation.vue

@@ -13,10 +13,10 @@
 			</view>
 			<view class="ac-txt">
 				<p style="width: 200rpx;">粉丝数</p>
-				<p>{{account.fans_count}}</p>
+				<p>{{account.show_fans_count}}</p>
 			</view>
 			<view class="ac-link">
-				<p>{{account.home_page_url}}</p>
+				<text>{{account.home_page_url}}</text>
 			</view>
 			<view class="ac-photo">
 				<p>主页截图</p>
@@ -88,14 +88,18 @@
 			margin-top: 30rpx;
 			background-color: #EBEBEB;
 			padding: 20rpx;
+			word-wrap: break-word;
+			word-break: break-all;
+			overflow: hidden;
+			/*这个参数根据需求来决定要不要*/
 		}
 
 		.ac-photo {
 			display: flex;
 			align-items: center;
 			margin: 20rpx;
-				
-			.ac-photo-img{
+
+			.ac-photo-img {
 				width: 300rpx;
 				height: 300rpx;
 				padding-left: 30rpx;

+ 114 - 0
pages/workspace/datarecord.vue

@@ -0,0 +1,114 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+
+		<view class="script" v-for="item in List">
+			<view style="margin: 20rpx;">
+				<p style="margin-bottom: 10rpx;">上传时间:{{item.create_at}}</p>
+				<view style="display: flex;margin-bottom: 10rpx;">
+					<view style="width: 400rpx;">小眼睛阅读数/播放量</view>
+					<view style="width: 100rpx;border: 1rpx;">{{item.play_number}}</view>
+				</view>
+				<view style="display: flex;margin-bottom: 10rpx;">
+					<view style="width: 400rpx;">点赞数</view>
+					<view style="width: 100rpx;border: 1rpx;">{{item.like_number}}</view>
+				</view>
+				<view style="display: flex;margin-bottom: 10rpx;">
+					<view style="width: 400rpx;">收藏数</view>
+					<view style="width: 100rpx;border: 1rpx;">{{item.collect_number}}</view>
+				</view>
+				<view style="display: flex;margin-bottom: 10rpx;">
+					<view style="width: 400rpx;">评论数</view>
+					<view style="width: 100rpx;border: 1rpx;">{{item.comment_number}}</view>
+				</view>
+				<!-- 图片 -->
+
+				<view style="margin-top: 10rpx;">
+					<p>小眼睛截图</p>
+					<image :src="item.photo_url" mode="aspectFit"></image>
+				</view>
+			</view>
+			<view class="heng-line" v-if="item.is_review && !item.is_ok"></view>
+			<view style="margin: 20rpx;color: red;" v-if="item.is_review && !item.is_ok">
+				<p style="margin-bottom: 10rpx;">驳回时间:{{item.reject_at}}</p>
+				<p>{{item.revise_opinion}}</p>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				List: [],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "查看修改/反馈记录",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onShow() {
+			this.getList();
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			console.log(this.taskId)
+		},
+		methods: {
+			// 获取初稿审阅记录
+			getList() {
+				this.$https.get('/youngee/c/t/g/get-task-data' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						this.List = res.data.data
+					})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.script {
+		margin-bottom: 100rpx;
+	}
+
+	.heng-line {
+		width: 100%;
+		border-bottom: 1rpx solid #dadada;
+	}
+</style>

+ 12 - 6
pages/workspace/deliveryInformation.vue

@@ -18,12 +18,12 @@
 						<p class='ipon' style="padding-right: 100rpx;">{{address.receiver_name}}</p>
 						<p class='ipon'>{{address.phone_number}}</p>
 					</view>
-					<p class='ipon'>{{address.detail_addr}}</p>
+					<p class='ipon'>{{address.full_detail_addr}}</p>
 				</view>
-				<view class="address_edit" @click="editAddress()">
+				<!-- <view class="address_edit" @click="editAddress()">
 					<image :src="picture.icon_edit" mode="">
 					</image>
-				</view>
+				</view> -->
 			</view>
 
 			<view class="logistics1">
@@ -55,7 +55,13 @@
 				address: {},
 				taskId: "",
 				projectForm: "",
-				logistics: {},
+				logistics: {
+					company_name:"",
+					logistics_number:"",
+					coupon_code_information:"",
+					explorestore_starttime:"",
+					explorestore_endtime:""
+				},
 				picture: {
 					togoimg: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/task16.png',
 					icon_edit: 'https://horastar.obs.cn-east-3.myhuaweicloud.com/youngee/talent_upload/icon-edit.png',
@@ -101,10 +107,10 @@
 			uni.showLoading({
 				title: '加载中'
 			});
-			this.getTaskInfo()
+			this.getLogisticsInfo()
 		},
 		methods: {
-			getTaskInfo() {
+			getLogisticsInfo() {
 				this.$https.get('/youngee/c/t/g/get-task-logistics-info' +
 					"?" +
 					"task_id" +

+ 761 - 0
pages/workspace/editaddress.vue

@@ -0,0 +1,761 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view>
+			<!-- 修改个人信息完善 -->
+			<view style="margin: 0 20rpx;">
+				<uni-forms :rules="rules" :modelValue="formData" ref="form" validate-trigger="bind"
+					err-show-type="undertext">
+					<uni-forms-item name="name" required label="姓名">
+						<uni-easyinput type="text" :inputBorder="true" v-model="formData.receiver_name" placeholder="请输入收件人">
+						</uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item name="phone" required label="电话">
+						<uni-easyinput type="number" maxlength="11" :inputBorder="true" v-model="formData.phone_number"
+							placeholder="请输入联系电话">
+						</uni-easyinput>
+					</uni-forms-item>
+
+					<uni-forms-item name="region_code" required label="地区">
+						<picker class="picker" mode="multiSelector" :range="region" range-key="name"
+							:value="regionIndex" @change="pickerChange" @columnchange="pickerColumnchange">
+							<view class="pbox" :class="{'pbox_hover':regionStr != '请选择省市区'}">
+								<view>{{regionStr}}</view>
+								<text class="iconfont icon-you"></text>
+							</view>
+						</picker>
+					</uni-forms-item>
+					<uni-forms-item name="detail_addr" required label="详细地址">
+						<uni-easyinput type="text" :inputBorder="true" v-model="formData.detail_addr"
+							placeholder="请输入详细地址(省/市/县/镇/)">
+						</uni-easyinput>
+					</uni-forms-item>
+					</uni-group>
+				</uni-forms>
+				<button class="btn1" @click="submitForm('form')">保存</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import region from '@/components/pca-code.json';
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				taskId: '',
+				// 地区原数组
+				oldRegion: region,
+				// 处理后的数组
+				region: [
+					[],
+					[],
+					[]
+				],
+				// 选择省市区的下标Index  传则默认选中传递的
+				regionIndex: [0, 0, 0],
+				regionStr: '请选择省市区',
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "编辑收货地址",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+				formData: {
+					receiver_name: '',
+					phone_number: '',
+					detail_addr: '',
+					region_code: '',
+					setdefault: false,
+				},
+				index: 0,
+				index1: 0,
+				data: {},
+				show: false,
+				rules: {
+					detail_addr: {
+						rules: [{
+							required: true,
+							errorMessage: '请输入详细地址'
+						}, ]
+					},
+					name: {
+						rules: [{
+							required: true,
+							errorMessage: '请输入收件人'
+						}, ]
+					},
+					phone: {
+						rules: [{
+							required: true,
+							errorMessage: '请输入联系电话',
+						}, ]
+					},
+					region_code: {
+						rules: [{
+							required: true,
+							errorMessage: '请选择所在地区'
+						}, ]
+					},
+				},
+				address_id: '',
+			};
+		},
+		onLoad() {
+			uni.showLoading()
+			setTimeout(() => {
+				uni.hideLoading()
+			}, 500)
+		},
+		onReady() {
+			this.initRegion()
+			this.$refs.form.setRules(this.rules)
+		},
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.formData = data.address
+			this.taskId = data.taskId
+			let a = this.formData.region_code.toString().slice(0, 2)
+			let b = this.formData.region_code.toString().slice(0, 4)
+			let c = 0
+			for (var i = 0; i < region.length; i++) {
+				if (region[i].code == a) {
+					a = region[i].name
+					for (var j = 0; j < region[i].children.length; j++) {
+						if (region[i].children[j].code == b) {
+							b = region[i].children[j].name
+							for (var o = 0; o < region[i].children[j].children.length; o++) {
+								if (region[i].children[j].children[o].code == this.formData.region_code) {
+									c = region[i].children[j].children[o].name
+								}
+							}
+						}
+
+					}
+				}
+			}
+			this.regionStr = a + ' ' + b + ' ' + c
+		},
+		methods: {
+			initRegion() {
+				// 声明城市数组
+				let cityArr = [];
+				let countyArr = [];
+				// 设置下标
+				this.regionIndex = [0, 0, 0];
+				// 改变城市列表
+				this.region[1] = this.oldRegion[0].children.map(item => {
+					cityArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 1, cityArr);
+				// 改变县区列表
+				this.oldRegion[0].children[0].children.map(item => {
+					countyArr.push({
+						name: item.name,
+						code: item.code
+					});
+				})
+				this.$set(this.region, 2, countyArr);
+			},
+			/**
+			 * 手动提交
+			 * @param {Object} form
+			 */
+			submitForm(form) {
+				// console.log(this.formData);
+				this.$refs.form.validate().then(res => {
+					const iphoneReg1 = /^1[0-9]{10}$/
+					if (!iphoneReg1.test(this.formData.phone_number)) {
+						uni.showToast({
+							title: '电话号码格式不正确',
+							icon: 'none'
+						})
+						return
+					}
+					uni.showToast({
+						title: '提交成功'
+					})
+					this.$https.post('/youngee/c/t/p/update-logistics-address', {
+							task_id: this.taskId,
+							region_code: this.formData.region_code,
+							detail_addr: this.formData.detail_addr,
+							phone_number: this.formData.phone_number,
+							receiver_name: this.formData.receiver_name,
+						})
+						.then(res => {
+							console.log(res)
+							uni.navigateBack()
+						})
+				}).catch(err => {
+					console.error('验证失败:', errors)
+					uni.showToast({
+						title: '请填写所有信息',
+						icon: 'none'
+					})
+				})
+			},
+			//城市选择
+			pickerChange(e) {
+				// console.log(e, '1');
+				console.log("pickerChange e.detail.value: ", e.detail.value)
+				this.regionIndex = e.detail.value;
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[1]]
+					.name + ' ' +
+					this.region[2][this.regionIndex[2]].name;
+
+				// 组件传值
+				this.$emit('region', [this.region[0][this.regionIndex[0]].code, this.region[1][this.regionIndex[1]].code,
+					this.region[
+						2][this.regionIndex[2]].code
+				]);
+				this.formData.region_code = this.region[2][this.regionIndex[2]].code;
+				console.log(this.formData.region_code)
+			},
+			pickerColumnchange(e) {
+				if (e.detail.column === 0) {
+					// 声明城市数组
+					let cityArr = [];
+					let countyArr = [];
+					// 设置下标
+					this.regionIndex = [e.detail.value, 0, 0];
+					// 改变城市列表
+					this.region[1] = this.oldRegion[e.detail.value].children.map(item => {
+						cityArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 1, cityArr);
+					// 改变县区列表
+					this.oldRegion[e.detail.value].children[0].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 1) {
+					this.regionIndex[1] = e.detail.value;
+					this.regionIndex[2] = 0;
+					let countyArr = [];
+					this.oldRegion[this.regionIndex[0]].children[this.regionIndex[1]].children.map(item => {
+						countyArr.push({
+							name: item.name,
+							code: item.code
+						});
+					})
+					this.$set(this.region, 2, countyArr);
+				}
+				if (e.detail.column === 2) {
+					this.regionIndex[2] = e.detail.value;
+				}
+			}
+		},
+		created() {
+			let provinceArr = [];
+			let cityArr = [];
+			this.oldRegion.map((item, index) => {
+				this.region[0].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.previnceId == item.code) {
+					provinceArr = item.children;
+					this.regionIndex[0] = index;
+				}
+			})
+			// console.log(provinceArr);
+			provinceArr.map((item, index) => {
+				this.region[1].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.cityId == item.code) {
+					cityArr = item.children;
+					this.regionIndex[1] = index;
+				}
+			})
+			cityArr.map((item, index) => {
+				this.region[2].push({
+					name: item.name,
+					code: item.code
+				});
+				if (this.countyId == item.code)
+					this.regionIndex[2] = index;
+			})
+			if (this.isRevise)
+				this.regionStr = this.region[0][this.regionIndex[0]].name + ' ' + this.region[1][this.regionIndex[1]]
+				.name + ' ' + this.region[2][this.regionIndex[2]].name;
+			else
+				this.regionStr = '请选择省市区';
+		}
+	};
+</script>
+<style>
+	picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-forms-item__inner {
+		border-bottom: none !important;
+		margin-bottom: 0 !important;
+	}
+</style>
+<style lang="scss" scoped>
+	@charset "UTF-8";
+
+	/* 头条小程序组件内不能引入字体 */
+	/* #ifdef MP-TOUTIAO */
+	@font-face {
+		font-family: uniicons;
+		font-weight: normal;
+		font-style: normal;
+		src: url("~@/static/uni.ttf") format("truetype");
+	}
+
+	/* #endif */
+	/* #ifndef APP-NVUE */
+
+	page {
+		display: flex;
+		flex-direction: column;
+		box-sizing: border-box;
+		background-color: #FFFFFF;
+		min-height: 100%;
+		height: auto;
+	}
+
+	view {
+		font-size: 14px;
+		line-height: inherit;
+	}
+
+
+	.menu {
+		position: fixed;
+		top: 180rpx;
+		background-color: #FFFFFF;
+		justify-content: space-around;
+		height: 5%;
+		width: 100%;
+		display: flex;
+		z-index: 10;
+		margin-bottom: 10rpx;
+	}
+
+	.menu-item p {
+		font-weight: 600;
+		font-size: 90%;
+
+		&.lor {
+			border-bottom: 5rpx solid #F0D232;
+			color: #F0D232;
+			padding-bottom: 15rpx;
+		}
+	}
+
+	.setdeault {
+		display: flex;
+		justify-content: space-between;
+	}
+
+	.btn1 {
+		margin: 30rpx;
+		font-size: 35rpx;
+		color: #000;
+		background-color: #F0D232;
+		border: none;
+		border-radius: 0;
+	}
+
+
+
+	.example {
+		padding: 0 15px 15px;
+	}
+
+	.example-info {
+		padding: 15px;
+		color: #3b4144;
+		background: #ffffff;
+	}
+
+	.example-body {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: wrap;
+		justify-content: center;
+		padding: 0;
+		font-size: 14px;
+		background-color: #ffffff;
+	}
+
+	/* #endif */
+	.example {
+		padding: 0 15px;
+	}
+
+	.example-info {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		padding: 15px;
+		color: #3b4144;
+		background-color: #ffffff;
+		font-size: 14px;
+		line-height: 20px;
+	}
+
+	.example-info-text {
+		font-size: 14px;
+		line-height: 20px;
+		color: #3b4144;
+	}
+
+	.example-body {
+		flex-direction: column;
+		padding: 15px;
+		background-color: #ffffff;
+	}
+
+	.word-btn-white {
+		font-size: 18px;
+		color: #FFFFFF;
+	}
+
+	.word-btn {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		border-radius: 6px;
+		height: 48px;
+		margin: 15px;
+		background-color: #007AFF;
+	}
+
+	.word-btn--hover {
+		background-color: #4ca2ff;
+	}
+
+	.example {
+		padding: 0 10px 10px;
+	}
+
+	.uni-input-border,
+	.uni-textarea-border {
+		flex: 1;
+		font-size: 14px;
+		color: #666;
+		border: 1px #FFFFFF solid;
+		border-radius: 5px;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-input-border {
+		padding: 0 10px;
+		height: 35px;
+	}
+
+	.uni-textarea-border {
+		padding: 10px;
+		height: 80px;
+	}
+
+	.label-box {
+		margin-right: 10px;
+	}
+
+	.transform-scale {
+		transform: scale(0.7);
+	}
+
+	.butto {
+		text-align: center;
+	}
+
+	.option {
+		padding: 20rpx;
+	}
+
+	.uni-margin-wrap {
+		width: 690rpx;
+		width: 100%;
+		;
+	}
+
+	.swiper {
+		height: 300rpx;
+	}
+
+	.swiper-item {
+		display: block;
+		height: 300rpx;
+		line-height: 300rpx;
+		text-align: center;
+	}
+
+	.swiper-list {
+		margin-top: 40rpx;
+		margin-bottom: 0;
+	}
+
+	.uni-common-mt {
+		margin-top: 60rpx;
+		position: relative;
+	}
+
+	.info {
+		position: absolute;
+		right: 20rpx;
+	}
+
+	.uni-padding-wrap {
+		width: 550rpx;
+		padding: 0 100rpx;
+	}
+
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+		justify-content: space-around;
+	}
+
+	.signuptext {
+		text-align: center;
+		margin-top: 2%;
+
+	}
+
+	.signuptext p {
+		font-size: 60%;
+		color: #333333;
+	}
+
+	.signupbut {
+		text-align: center;
+		margin-top: 2%;
+	}
+
+	.but1 {
+		width: 120%;
+		text-align: center;
+		background-color: #FCCF41;
+		border-radius: 10rpx;
+		color: #464100;
+		font-size: 28rpx;
+		line-height: 156%;
+
+		font-weight: 500;
+		height: 65%;
+	}
+
+	/deep/.uni-searchbar__box {
+		border-color: #267CFF !important;
+		border-width: 2rpx !important;
+	}
+
+	/deep/.uni-searchbar__box {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-searchbar__text-placeholder {
+		font-size: 30rpx !important;
+	}
+
+	/deep/.segmented-control__text {
+		font-size: 34rpx !important;
+	}
+
+	/deep/.uni-data-checklist {
+		padding-left: 20upx;
+	}
+
+	uni-picker {
+		position: relative;
+		display: block;
+		cursor: pointer;
+		padding-left: 20rpx !important;
+		padding-top: 14rpx !important;
+		color: grey !important;
+	}
+
+	/deep/.uni-date-x--border {
+		border: 0px solid #dcdfe6 !important;
+	}
+
+	/deep/.is-input-border {
+		border: 0px solid #c8c7cc !important;
+	}
+
+	/deep/.uni-progress-info {
+		font-size: 25rpx !important;
+	}
+
+	/deep/.uni-error-message {
+		position: absolute;
+		bottom: -20rpx !important;
+		left: 20rpx !important;
+		text-align: left;
+	}
+
+	/deep/.uni-forms-item__inner {
+		padding-bottom: 0rpx !important;
+		margin-bottom: 30rpx !important;
+		border-bottom: 0.5rpx solid #CCCCCC;
+	}
+
+	/deep/.uni-group__title {
+		background-color: #FFFFFF !important;
+	}
+
+	/deep/.uni-list-item__content-title {
+		font-size: 30rpx !important;
+		color: #111111 !important;
+	}
+
+	/deep/.uni-progress-bar {
+		border-radius: 10rpx !important;
+	}
+
+	/deep/.uni-progress-inner-bar {
+		border-radius: 10rpx !important;
+	}
+
+
+	/deep/.is-input-border {
+		border-radius: 20px !important;
+		background-color: #fff;
+	}
+
+	.uni-easyinput__content-input {
+		font-size: 30upx !important;
+	}
+
+	.content-clear-icon {
+		font-size: 40upx !important;
+	}
+
+	/deep/.input-box {
+		padding: 50upx;
+		font-size: 30upx;
+
+		.input-item {
+			display: flex;
+
+			border: 1upx solid #F8F8F8;
+			line-height: 90upx;
+			height: 90upx;
+			margin-top: 20upx;
+			background: #F8F8F8;
+			border-radius: 48upx;
+
+			.input-label {
+				width: 150upx;
+				text-align: center;
+			}
+
+			.input-body {
+				position: relative;
+				height: 100upx;
+				width: calc(100% - 150upx);
+
+				.input {
+					line-height: 90upx;
+					height: 90upx;
+					position: relative;
+					font-size: 28upx;
+				}
+
+				.eye {
+					position: absolute;
+					height: 50upx;
+					width: 50upx;
+					right: 20upx;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+
+				.btn-code {
+					position: absolute;
+					right: 0upx;
+					top: 50%;
+					transform: translateY(-50%);
+					background: none;
+					color: #205592;
+					width: 160upx;
+					font-size: 24upx;
+					box-sizing: border-box;
+					text-align: center;
+					padding: 0;
+					height: 100upx;
+					line-height: 100upx;
+				}
+			}
+		}
+
+		.select {
+			// padding-top: 40upx;
+			display: flex;
+			justify-content: space-between;
+			color: #003B67;
+		}
+	}
+
+	/deep/.title-left {
+		width: 3px;
+		height: 16px;
+		background: #267CFF;
+		display: inline-block;
+		border-radius: 3px;
+		margin-top: 3px;
+		vertical-align: top;
+		margin-right: 10px;
+	}
+</style>

+ 97 - 0
pages/workspace/linkrecord.vue

@@ -0,0 +1,97 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+
+		<view class="script" v-for="item in List">
+			<view style="margin: 20rpx;">
+				<p style="margin-bottom: 10rpx;">上传时间:{{item.create_at}}</p>
+				<!-- 图片 -->
+				<p>{{item.link_url}}</p>
+				<view style="display: flex;">
+					<image :src="item.photo_url" mode="aspectFit"></image>
+				</view>
+			</view>
+			<view class="heng-line" v-if="item.is_review && !item.is_ok"></view>
+			<view style="margin: 20rpx;color: red;" v-if="item.is_review && !item.is_ok">
+				<p style="margin-bottom: 10rpx;">驳回时间:{{item.reject_at}}</p>
+				<p>{{item.revise_opinion}}</p>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				List: [],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "查看修改/反馈记录",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onShow() {
+			this.getList();
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			console.log(this.taskId)
+		},
+		methods: {
+			// 获取初稿审阅记录
+			getList() {
+				this.$https.get('/youngee/c/t/g/get-task-link' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						this.List = res.data.data
+					})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.script {
+		margin-bottom: 100rpx;
+	}
+
+	.heng-line {
+		width: 100%;
+		border-bottom: 1rpx solid #dadada;
+	}
+</style>

+ 26 - 24
pages/workspace/scriptrecord.vue

@@ -7,12 +7,13 @@
 		<view class="script" v-for="item in List">
 			<view style="margin: 20rpx;">
 				<p style="margin-bottom: 10rpx;">上传时间:{{item.create_at}}</p>
-				<p>{{item.content}}</p>
+				<p>{{item.title}}</p>
+				<text>{{item.content}}</text>
 			</view>
-			<view class="heng-line" v-if="item.is_review"></view>
-			<view style="margin: 20rpx;color: red;" v-if="item.is_review">
+			<view class="heng-line" v-if="item.is_review && !item.is_ok"></view>
+			<view style="margin: 20rpx;color: red;" v-if="item.is_review && !item.is_ok">
 				<p style="margin-bottom: 10rpx;">驳回时间:{{item.reject_at}}</p>
-				<p>{{item.revise_opinion}}</p>
+				<text>{{item.revise_opinion}}</text>
 			</view>
 		</view>
 	</view>
@@ -26,25 +27,26 @@
 		},
 		data() {
 			return {
-				List: [{
-					create_at: "2022-7-10 13:00",
-					content: "脚本内容",
-					reject_at: "2022-7-11 13:00",
-					revise_opinion: "驳回意见",
-					is_review: 1,
-				}, {
-					create_at: "2022-7-11 13:00",
-					content: "脚本内容2",
-					reject_at: "2022-7-12 13:00",
-					revise_opinion: "驳回意见2",
-					is_review: 1,
-				}, {
-					create_at: "2022-7-11 13:00",
-					content: "脚本内容3",
-					reject_at: "",
-					revise_opinion: "",
-					is_review: 0,
-				}],
+				List: [],
+				// List: [{
+				// 	create_at: "2022-7-10 13:00",
+				// 	content: "脚本内容",
+				// 	reject_at: "2022-7-11 13:00",
+				// 	revise_opinion: "驳回意见",
+				// 	is_review: 1,
+				// }, {
+				// 	create_at: "2022-7-11 13:00",
+				// 	content: "脚本内容2",
+				// 	reject_at: "2022-7-12 13:00",
+				// 	revise_opinion: "驳回意见2",
+				// 	is_review: 1,
+				// }, {
+				// 	create_at: "2022-7-11 13:00",
+				// 	content: "脚本内容3",
+				// 	reject_at: "",
+				// 	revise_opinion: "",
+				// 	is_review: 0,
+				// }],
 				mysNavConfig: {
 					/* 开启单页显示首页图标 */
 					isHome: true,
@@ -83,7 +85,7 @@
 			console.log(this.taskId)
 		},
 		methods: {
-			// 获取达人基本信息
+			// 获取脚本审阅记录
 			getList() {
 				this.$https.get('/youngee/c/t/g/get-task-script' +
 						"?" +

+ 105 - 0
pages/workspace/sketchrecord.vue

@@ -0,0 +1,105 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+
+		<view class="script" v-for="item in List">
+			<view style="margin: 20rpx;">
+				<p style="margin-bottom: 10rpx;">上传时间:{{item.create_at}}</p>
+				<!-- 图片 -->
+				<view style="display: flex;" v-if="item.type == 1">
+					<view v-for="photo in item.Photo">
+						<image :src="photo.photo_url" mode="aspectFill" style="width: 150rpx;height: 150rpx;"></image>
+					</view>
+				</view>
+				<!-- 视频 -->
+				<view style="display: flex;" v-if="item.type == 2">
+					<video :src="item.Photo[0].photo_url"></video>
+				</view>
+				<p>{{item.title}}</p>
+				<text>{{item.content}}</text>
+			</view>
+			<view class="heng-line" v-if="item.is_review && !item.is_ok"></view>
+			<view style="margin: 20rpx;color: red;" v-if="item.is_review && !item.is_ok">
+				<p style="margin-bottom: 10rpx;">驳回时间:{{item.reject_at}}</p>
+				<text>{{item.revise_opinion}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	export default {
+		components: {
+			mvBar,
+		},
+		data() {
+			return {
+				List: [],
+				AllImage: [],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "查看修改/反馈记录",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onShow() {
+			this.getList();
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			console.log(this.taskId)
+		},
+		methods: {
+			// 获取初稿审阅记录
+			getList() {
+				this.$https.get('/youngee/c/t/g/get-task-sketch' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						this.List = res.data.data
+					})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.script {
+		margin-bottom: 100rpx;
+	}
+
+	.heng-line {
+		width: 100%;
+		border-bottom: 1rpx solid #dadada;
+	}
+</style>

File diff ditekan karena terlalu besar
+ 724 - 97
pages/workspace/taskdetail.vue


+ 345 - 0
pages/workspace/uploaddata.vue

@@ -0,0 +1,345 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view @click="toRecord()">
+			<view style="display: flex;justify-content: center;">
+				<image style="height: 60rpx;width: 60rpx;" src="../../static/img/icon-clock.png"></image>
+			</view>
+			<view style="display: flex;justify-content: center;">
+				<p style="font-size: 30rpx;">查看修改/反馈记录</p>
+			</view>
+		</view>
+
+		<view style="margin: 40rpx;">
+			<uni-forms :modelValue="formData" validate-trigger="bind" err-show-type="undertext"
+				label-width="150">
+				<uni-forms-item name="play_number" label="小眼睛阅读数/播放量">
+					<uni-easyinput type="digit" maxlength=10 :inputBorder="false" v-model="formData.play_number"
+						placeholder="输入">
+					</uni-easyinput>
+				</uni-forms-item>
+				<uni-forms-item name="like_number" label="点赞数">
+					<uni-easyinput type="digit" maxlength=10 :inputBorder="false" v-model="formData.like_number"
+						placeholder="输入">
+					</uni-easyinput>
+				</uni-forms-item>
+				<uni-forms-item name="collect_number" label="收藏数">
+					<uni-easyinput type="digit" maxlength=10 :inputBorder="false" v-model="formData.collect_number"
+						placeholder="输入">
+					</uni-easyinput>
+				</uni-forms-item>
+				<uni-forms-item name="comment_number" label="评论数">
+					<uni-easyinput type="digit" maxlength=10 :inputBorder="false" v-model="formData.comment_number"
+						placeholder="输入">
+					</uni-easyinput>
+				</uni-forms-item>
+			</uni-forms>
+		</view>
+
+		<view style="margin: 0 40rpx;">
+			<p style="margin-bottom: 20rpx;">上传小眼睛阅读数/播放量截图</p>
+			<htz-image-upload :max="1" mediaType="image" name="file" :chooseNum="1" v-model="imageData"
+				@chooseSuccess="ceshiChooseSuccess1">
+			</htz-image-upload>
+		</view>
+
+		<view class="signup">
+			<button type="default" class="but1" :loading="loading" @click="submit()">
+				提交数据</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import htzImageUpload from '@/components/htz-image-upload/htz-image-upload.vue';
+	import getPolicyEncode from '@/components/obs/getPolicy.js';
+	import getSignature from '@/components/obs/GetSignature.js';
+	export default {
+		components: {
+			mvBar,
+			htzImageUpload,
+		},
+		data() {
+			return {
+				taskId: "",
+				dataStatus: "",
+				imageData: [],
+				formData: {
+					play_number: "",
+					like_number: "",
+					collect_number: "",
+					commet_number: "",
+				},
+				// rules: {
+				// 	// 对play_number字段进行必填验证
+				// 	play_number: {
+				// 		rules: [{
+				// 				required: true,
+				// 				errorMessage: '10位以内的数字',
+				// 			},
+				// 			{
+				// 				minLength: 1,
+				// 				maxLength: 10,
+				// 				errorMessage: '10位以内的数字',
+				// 			}
+				// 		]
+				// 	},
+				// 	// 对like_number字段进行必填验证
+				// 	like_number: {
+				// 		rules: [{
+				// 				required: true,
+				// 				errorMessage: '10位以内的数字',
+				// 			},
+				// 			{
+				// 				minLength: 1,
+				// 				maxLength: 10,
+				// 				errorMessage: '10位以内的数字',
+				// 			}
+				// 		]
+				// 	},
+				// 	// 对collect_number字段进行必填验证
+				// 	collect_number: {
+				// 		rules: [{
+				// 				required: true,
+				// 				errorMessage: '10位以内的数字',
+				// 			},
+				// 			{
+				// 				minLength: 1,
+				// 				maxLength: 10,
+				// 				errorMessage: '10位以内的数字',
+				// 			}
+				// 		]
+				// 	},
+				// 	// 对comment_number字段进行必填验证
+				// 	comment_number: {
+				// 		rules: [{
+				// 				required: true,
+				// 				errorMessage: '10位以内的数字',
+				// 			},
+				// 			{
+				// 				minLength: 1,
+				// 				maxLength: 10,
+				// 				errorMessage: '10位以内的数字',
+				// 			}
+				// 		]
+				// 	}
+				// },
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "上传链接",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			this.dataStatus = data.dataStatus
+			this.getData()
+		},
+		methods: {
+			getData() {
+				this.$https.get('/youngee/c/t/g/get-unsubmit-task-data' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.formData.play_number = res.data.data.play_number
+							this.formData.like_number = res.data.data.like_number
+							this.formData.collect_number = res.data.data.collect_number
+							this.formData.comment_number = res.data.data.comment_number
+							this.imageData.push(res.data.data.photo_url)
+						}
+					})
+			},
+			toRecord() {
+				var data = {
+					taskId: this.taskId,
+				};
+				data = JSON.stringify(data)
+				uni.navigateTo({
+					url: '/pages/workspace/datarecord?textObj=' + encodeURIComponent(data)
+				});
+			},
+
+			submit() {
+				// 校验
+				if (this.formData.play_number == "" || this.formData.like_number == "" || this.formData.collect_number ==
+					"" || this.formData.comment_number == "") {
+					uni.showToast({
+						title: '请输入10位以内的数字',
+						icon: 'none'
+					})
+					return
+				}
+				
+				if (this.imageData.length == 0) {
+					uni.showToast({
+						title: "请上传正确的截图",
+						icon: 'none'
+					})
+					return
+				}				
+
+				// 调用添加链接接口
+				this.$https.post('/youngee/c/t/p/add-task-data', {
+						task_id: this.taskId,
+						play_number: this.formData.play_number,
+						like_number: this.formData.like_number,
+						collect_number: this.formData.collect_number,
+						comment_number: this.formData.comment_number,
+						photo_url: this.imageData[0],
+					})
+					.then(res => {
+						console.log(res)
+						uni.navigateBack()
+					})
+			},
+
+			ceshiChooseSuccess1(tempFilePaths, e) { //选择图片返回
+				console.log('ceshiChooseSuccess', tempFilePaths, e);
+				if (e == 0) {
+					this.store = 'talent_upload/' + this.guid() + '.png'
+				} else if (e == 1) {
+					this.store = 'talent_upload/' + this.guid() + '.mp4'
+				}
+				/****************
+				以下代码是自定义上传逻辑,仅供参考
+				***************/
+				this.imgUpload1(tempFilePaths);
+				/*******************************/
+				console.log("imgdata" + this.imageData)
+			},
+			imgUpload1(tempFilePaths) {
+				let that = this
+				console.log('imgUpload', tempFilePaths)
+				let config = {
+					AccessKeyId: 'IVW21DTGIIUBBAGXKK0Y', //AK
+					SecretKey: 'Y01nEQNcLOATMw7uJwrk3yOdQZ2fqLhSnXcOKVDE', //SK
+					EndPoint: 'https://horastar.obs.cn-east-3.myhuaweicloud.com', //上传文件的路径
+				};
+				let fileName = this.store; //指定上传到OBS桶中的对象名
+				// let fileName = "talent_upload/icon-arrow-right.png"
+				let OBSPolicy = { //设定policy内容
+					"expiration": "2089-12-31T12:00:00.000Z",
+					"conditions": [{
+							"bucket": "horastar"
+						}, //Bucket name
+						// {"bucket": "goin"}, 
+						{
+							'key': fileName
+						}
+					]
+				}
+
+				let policyEncoded = getPolicyEncode(OBSPolicy); //计算policy编码值
+				let signature = getSignature(policyEncoded, config.SecretKey); //计算signature 
+				uni.uploadFile({
+					//url: config.EndPoint,
+					url: config.EndPoint,
+					filePath: tempFilePaths[0],
+					name: 'file',
+
+					formData: {
+						'AccessKeyID': config.AccessKeyId,
+						'policy': policyEncoded,
+						'signature': signature,
+						'key': fileName,
+					},
+
+					success: function(res) {
+						console.log(res.statusCode); //打印响应状态码
+						if (res.statusCode == '204') {
+							that.imageData.push(config.EndPoint + '/' + fileName);
+							console.log('上传图片成功', res)
+							let obs_url = config.EndPoint + '/' + fileName; //用你自己的 bucket 名替换星号
+							console.log(obs_url)
+							// that.formData.home_img = obs_url
+							uni.showToast({
+								title: '上传成功',
+								icon: '成功'
+							});
+						} else {
+							console.log('上传图片失败', res)
+							uni.showToast({
+								title: '上传失败',
+								icon: '失败'
+							});
+						}
+					},
+					fail: function(e) {
+						console.log(e);
+						uni.showToast({
+							title: '上传失败22222',
+							icon: '失败'
+						});
+					}
+				})
+			},
+			guid() {
+				return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+					var r = Math.random() * 16 | 0,
+						v = c == 'x' ? r : (r & 0x3 | 0x8);
+					return v.toString(16);
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+	}
+
+	.but1 {
+		width: 60%;
+		background-color: #f2d22d;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+
+		&.on {
+			background-color: #C0C0C0;
+
+		}
+
+	}
+</style>

+ 258 - 0
pages/workspace/uploadlink.vue

@@ -0,0 +1,258 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view @click="toRecord()">
+			<view style="display: flex;justify-content: center;">
+				<image style="height: 60rpx;width: 60rpx;" src="../../static/img/icon-clock.png"></image>
+			</view>
+			<view style="display: flex;justify-content: center;">
+				<p style="font-size: 30rpx;">查看修改/反馈记录</p>
+			</view>
+		</view>
+
+		<!-- 多行输入框 -->
+		<view style="margin: 40rpx;font-size: 32rpx">
+			<p style="margin-bottom: 20rpx;">上传链接</p>
+			<textarea v-model="link_url" style="height: 50px" placeholder="请删除中文等其他字符,仅输入https://或http://开头的发布链接,样叽会对此进行质检~" />
+		</view>
+
+		<view style="margin: 0 40rpx;">
+			<p style="margin-bottom: 20rpx;">上传作品收录/发布截图</p>
+			<htz-image-upload :max="1" mediaType="image" name="file" :chooseNum="1" v-model="imageData"
+				@chooseSuccess="ceshiChooseSuccess1">
+			</htz-image-upload>
+		</view>
+
+		<view class="signup">
+			<button type="default" class="but1" :loading="loading" @click="submit()">
+				提交链接</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import htzImageUpload from '@/components/htz-image-upload/htz-image-upload.vue';
+	import getPolicyEncode from '@/components/obs/getPolicy.js';
+	import getSignature from '@/components/obs/GetSignature.js';
+	export default {
+		components: {
+			mvBar,
+			htzImageUpload,
+		},
+		data() {
+			return {
+				taskId: "",
+				link_url: "",
+				imageData: [],
+				linkStatus: "",
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "上传链接",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			this.linkStatus = data.linkStatus
+			this.getLink()
+		},
+		methods: {
+			getLink() {
+				this.$https.get('/youngee/c/t/g/get-unsubmit-task-link' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.imageData.push(res.data.data.photo_url)
+							this.link_url = res.data.data.link_url
+						}
+					})
+			},
+			toRecord() {
+				var data = {
+					taskId: this.taskId,
+				};
+				data = JSON.stringify(data)
+				uni.navigateTo({
+					url: '/pages/workspace/linkrecord?textObj=' + encodeURIComponent(data)
+				});
+			},
+
+			submit() {
+				// 校验
+				if (this.link_url == "" || (this.link_url.substring(0, 8) != "https://" && this.link_url.substring(0, 7) != "http://")) {
+					uni.showToast({
+						title: '请输入正确的发布链接',
+						icon: 'none'
+					})
+					return
+				}
+				if (this.imageData.length == 0) {
+					uni.showToast({
+						title: '请上传收录/发布截图',
+						icon: 'none'
+					})
+					return
+				}
+
+				// 调用添加链接接口
+				this.$https.post('/youngee/c/t/p/add-task-link', {
+						task_id: this.taskId,
+						link_url: this.link_url,
+						photo_url: this.imageData[0],
+					})
+					.then(res => {
+						console.log(res)
+						uni.navigateBack()
+					})
+			},
+
+			ceshiChooseSuccess1(tempFilePaths, e) { //选择图片返回
+				console.log('ceshiChooseSuccess', tempFilePaths, e);
+				if (e == 0) {
+					this.store = 'talent_upload/' + this.guid() + '.png'
+				} else if (e == 1) {
+					this.store = 'talent_upload/' + this.guid() + '.mp4'
+				}
+				/****************
+				以下代码是自定义上传逻辑,仅供参考
+				***************/
+				this.imgUpload1(tempFilePaths);
+				/*******************************/
+				console.log("imgdata" + this.imageData)
+			},
+			imgUpload1(tempFilePaths) {
+				let that = this
+				console.log('imgUpload', tempFilePaths)
+				let config = {
+					AccessKeyId: 'IVW21DTGIIUBBAGXKK0Y', //AK
+					SecretKey: 'Y01nEQNcLOATMw7uJwrk3yOdQZ2fqLhSnXcOKVDE', //SK
+					EndPoint: 'https://horastar.obs.cn-east-3.myhuaweicloud.com', //上传文件的路径
+				};
+				let fileName = this.store; //指定上传到OBS桶中的对象名
+				// let fileName = "talent_upload/icon-arrow-right.png"
+				let OBSPolicy = { //设定policy内容
+					"expiration": "2089-12-31T12:00:00.000Z",
+					"conditions": [{
+							"bucket": "horastar"
+						}, //Bucket name
+						// {"bucket": "goin"}, 
+						{
+							'key': fileName
+						}
+					]
+				}
+
+				let policyEncoded = getPolicyEncode(OBSPolicy); //计算policy编码值
+				let signature = getSignature(policyEncoded, config.SecretKey); //计算signature 
+				uni.uploadFile({
+					//url: config.EndPoint,
+					url: config.EndPoint,
+					filePath: tempFilePaths[0],
+					name: 'file',
+
+					formData: {
+						'AccessKeyID': config.AccessKeyId,
+						'policy': policyEncoded,
+						'signature': signature,
+						'key': fileName,
+					},
+
+					success: function(res) {
+						console.log(res.statusCode); //打印响应状态码
+						if (res.statusCode == '204') {
+							that.imageData.push(config.EndPoint + '/' + fileName);
+							console.log('上传图片成功', res)
+							let obs_url = config.EndPoint + '/' + fileName; //用你自己的 bucket 名替换星号
+							console.log(obs_url)
+							// that.formData.home_img = obs_url
+							uni.showToast({
+								title: '上传成功',
+								icon: '成功'
+							});
+						} else {
+							console.log('上传图片失败', res)
+							uni.showToast({
+								title: '上传失败',
+								icon: '失败'
+							});
+						}
+					},
+					fail: function(e) {
+						console.log(e);
+						uni.showToast({
+							title: '上传失败22222',
+							icon: '失败'
+						});
+					}
+				})
+			},
+			guid() {
+				return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+					var r = Math.random() * 16 | 0,
+						v = c == 'x' ? r : (r & 0x3 | 0x8);
+					return v.toString(16);
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+	}
+
+	.but1 {
+		width: 60%;
+		background-color: #f2d22d;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+
+		&.on {
+			background-color: #C0C0C0;
+
+		}
+
+	}
+</style>

+ 47 - 27
pages/workspace/uploadscript.vue

@@ -13,12 +13,13 @@
 		</view>
 
 		<!-- 多行输入框 -->
-		<view style="margin: 40rpx;">
-			<textarea v-model="text" placeholder="在此编辑发布脚本/粘贴文字" />
+		<uni-easyinput type="text" :inputBorder="false" v-model="title" placeholder="在此填写让人眼前一亮的标题吧">
+		</uni-easyinput>
+		<view style="padding: 40rpx 30rpx 150rpx;font-size: 32rpx">
+			<textarea v-model="text" maxlength="5000" auto-height="true" placeholder="在此编辑发布脚本/粘贴文字" />
 		</view>
 		<view class="signup">
-			<button type="default" :disabled="isSubmit" class="but1" :loading="loading"
-				:class="{'on':item.title == '1',}" @click="submit()">
+			<button type="default" class="but1" :loading="loading" @click="submit()">
 				提交脚本</button>
 		</view>
 	</view>
@@ -33,9 +34,9 @@
 		data() {
 			return {
 				taskId: "",
+				title: "",
 				text: "",
 				scriptStatus: "",
-				isSubmit: false,
 				mysNavConfig: {
 					/* 开启单页显示首页图标 */
 					isHome: true,
@@ -68,11 +69,23 @@
 			data = JSON.parse(decodeURIComponent(data))
 			this.taskId = data.taskId
 			this.scriptStatus = data.scriptStatus
-			if (this.scriptStatus != 1 && this.scriptStatus != 3) {
-				this.isSubmit = true
-			}
+			this.getScript()
 		},
 		methods: {
+			getScript() {
+				this.$https.get('/youngee/c/t/g/get-unsubmit-task-script' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.text = res.data.data.content
+							this.title = res.data.data.title
+						}
+					})
+			},
 			toRecord() {
 				var data = {
 					taskId: this.taskId,
@@ -84,25 +97,31 @@
 			},
 
 			submit() {
-				let that = this
-				uni.showModal({
-					title: '提示',
-					content: '提交后无法修改并进行审核,确认提交?',
-					success: function(res) {
-						if (res.confirm) {
-							that.$https.post('/youngee/c/t/p/add-task-script', {
-									task_id: that.taskId,
-									content: that.text,
-								})
-								.then(res => {
-									console.log(res)
-									uni.navigateBack()
-								})
-						} else if (res.cancel) {
-							console.log('用户点击取消');
-						}
-					}
-				});
+				// 检验标题和内容是否为空
+				if (this.title == '') {
+					uni.showToast({
+						title: "请填写脚本标题",
+						icon: 'none'
+					})
+					return 
+				}
+				if (this.text == '') {
+					uni.showToast({
+						title: "请填写脚本内容",
+						icon: 'none'
+					})
+					return 
+				}
+				
+				this.$https.post('/youngee/c/t/p/add-task-script', {
+						task_id: this.taskId,
+						title: this.title,
+						content: this.text,
+					})
+					.then(res => {
+						console.log(res)
+						uni.navigateBack()
+					})
 			},
 		}
 	}
@@ -118,6 +137,7 @@
 		height: 90rpx;
 		padding-top: 2%;
 		background-color: #FFFFFF;
+		z-index: 100;
 	}
 
 	.but1 {

+ 392 - 0
pages/workspace/uploadsketch.vue

@@ -0,0 +1,392 @@
+<template>
+	<view style="position: relative;">
+		<!-- 胶囊 -->
+		<mvBar :mysNavConfig="mysNavConfig"></mvBar>
+		<view style="margin-top: 160rpx;"></view>
+		<view @click="toRecord()" style="margin-bottom:20rpx">
+			<view style="display: flex;justify-content: center;">
+				<image style="height: 60rpx;width: 60rpx;" src="../../static/img/icon-clock.png"></image>
+			</view>
+			<view style="display: flex;justify-content: center;">
+				<p style="font-size: 32rpx;">查看修改/反馈记录</p>
+			</view>
+		</view>
+
+		<view style="display: flex;justify-content: center;">
+			<radio-group @change="chan">
+				<label v-for="item in radioGroup" :key="item">
+					<view style="display: inline;margin: 0 20rpx">
+						<radio :value="item" :checked="item==activeRadio" color="#fdd544" />{{item}}
+					</view>
+				</label>
+			</radio-group>
+		</view>
+
+		<view style="margin: 30rpx;display: flex;justify-content: center;" v-if="activeRadio == '图片'">
+			<htz-image-upload :max="18" mediaType="image" name="file" :chooseNum="9" v-model="imageData"
+				@chooseSuccess="ceshiChooseSuccess1">
+			</htz-image-upload>
+		</view>
+
+		<view style="margin: 30rpx;display: flex;justify-content: center;" v-if="activeRadio == '视频'">
+			<htz-image-upload :max="1" mediaType="video" name="file" :chooseNum="1" v-model="videoData"
+				@chooseSuccess="ceshiChooseSuccess2">
+			</htz-image-upload>
+		</view>
+
+		<uni-easyinput type="text" :inputBorder="false" v-model="title" placeholder="在此填写让人眼前一亮的标题吧">
+		</uni-easyinput>
+		<!-- 多行输入框 -->
+		<view style="padding: 40rpx 30rpx 150rpx;font-size: 32rpx">
+			<textarea v-model="text" maxlength="2000" auto-height="true" placeholder="添加正文" />
+		</view>
+		<view class="signup">
+			<button type="default" class="but1" :loading="loading" :class="{'on':item.title == '1',}" @click="submit()">
+				提交初稿</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mvBar from "@/components/mys_navBar/mysNavBar";
+	import htzImageUpload from '@/components/htz-image-upload/htz-image-upload.vue';
+	import getPolicyEncode from '@/components/obs/getPolicy.js';
+	import getSignature from '@/components/obs/GetSignature.js';
+	export default {
+		components: {
+			mvBar,
+			htzImageUpload,
+		},
+		data() {
+			return {
+				taskId: "",
+				title: "",
+				text: "",
+				sketchStatus: "",
+				activeRadio: '图片', //存的是选中的value值
+				radioGroup: ['图片', '视频'],
+				videoData: [],
+				imageData: [],
+				mysNavConfig: {
+					/* 开启单页显示首页图标 */
+					isHome: true,
+					/* 固定导航  */
+					navFixed: true,
+					/* 标题 (屏幕中心居中 两边图标中心居中使用slot center1) */
+					navTitle: {
+						text: "上传初稿",
+						color: "",
+						fontSize: "32rpx", // px upx rpx
+						fontWeight: "normal", // 100 - 700
+					},
+					btnType: "type2",
+					onLeftClick: '',
+					/* type2 按钮 */
+					type2Config: {
+						// 左图标
+						leftPath: "/static/img/png2.png",
+						// 右图标
+						rightPath: "/static/img/png4.png",
+						// 圆角
+						radius: "40rpx",
+					},
+				},
+			}
+		},
+
+		onLoad(options) {
+			let data = options.textObj.replace(/""/g, "");
+			data = JSON.parse(decodeURIComponent(data))
+			this.taskId = data.taskId
+			this.sketchStatus = data.sketchStatus
+			this.getSketch()
+		},
+		methods: {
+			chan(e) {
+				this.activeRadio = e.detail.value;
+				console.log(this.activeRadio);
+			},
+			getSketch() {
+				this.$https.get('/youngee/c/t/g/get-unsubmit-task-sketch' +
+						"?" +
+						"task_id" +
+						"=" +
+						this.taskId)
+					.then(res => {
+						console.log(res)
+						if (res.data.data != null) {
+							this.title = res.data.data.title
+							this.text = res.data.data.content
+							if (res.data.data.type == 1) { // 图片
+								this.activeRadio = '图片'
+								for (var j = 0; j < res.data.data.Photo.length; j++) {
+									this.imageData.push(res.data.data.Photo[j].photo_url)
+								}
+							} else if (res.data.data.type == 2) { //视频
+								this.activeRadio = '视频'
+								for (var j = 0; j < res.data.data.Photo.length; j++) {
+									this.videoData.push(res.data.data.Photo[j].photo_url)
+								}
+							}
+						}
+					})
+			},
+			toRecord() {
+				var data = {
+					taskId: this.taskId,
+				};
+				data = JSON.stringify(data)
+				uni.navigateTo({
+					url: '/pages/workspace/sketchrecord?textObj=' + encodeURIComponent(data)
+				});
+			},
+
+			submit() {
+				// 检验标题和内容是否为空
+				let type = 0
+				let photourl = []
+				if (this.activeRadio == '图片') { // 图片
+					type = 1
+					photourl = this.imageData
+				} else {
+					type = 2
+					photourl = this.videoData
+				}
+				if (this.title == '') {
+					uni.showToast({
+						title: "请填写初稿标题",
+						icon: 'none'
+					})
+					return
+				}
+				if (this.text == '') {
+					uni.showToast({
+						title: "请填写初稿内容",
+						icon: 'none'
+					})
+					return
+				}
+				if (photourl.length == 0) {
+					uni.showToast({
+						title: "请上传初稿图片或视频",
+						icon: 'none'
+					})
+					return
+				}
+				console.log("photourl:", photourl)
+				this.$https.post('/youngee/c/t/p/add-task-sketch', {
+						task_id: this.taskId,
+						title: this.title,
+						content: this.text,
+						type: type,
+						photo_url: photourl.toString()
+					})
+					.then(res => {
+						console.log(res)
+						uni.navigateBack()
+					})
+			},
+			ceshiChooseSuccess1(tempFilePaths, e) { //选择图片返回
+				console.log('ceshiChooseSuccess', tempFilePaths, e);
+				/****************
+				以下代码是自定义上传逻辑,仅供参考
+				***************/
+				this.imgUpload1(tempFilePaths, e);
+				/*******************************/
+				console.log("imgdata" + this.imageData)
+			},
+			imgUpload1(tempFilePaths, e) {
+				let that = this
+				console.log('imgUpload', tempFilePaths)
+				let config = {
+					AccessKeyId: 'IVW21DTGIIUBBAGXKK0Y', //AK
+					SecretKey: 'Y01nEQNcLOATMw7uJwrk3yOdQZ2fqLhSnXcOKVDE', //SK
+					EndPoint: 'https://horastar.obs.cn-east-3.myhuaweicloud.com', //上传文件的路径
+				};
+
+				for (let i = 0; i < tempFilePaths.length; ++i) {
+					if (e == 0) {
+						this.store = 'talent_upload/' + this.guid() + '.png'
+					} else if (e == 1) {
+						this.store = 'talent_upload/' + this.guid() + '.mp4'
+					}
+					let fileName = this.store; //指定上传到OBS桶中的对象名
+					let OBSPolicy = { //设定policy内容
+						"expiration": "2089-12-31T12:00:00.000Z",
+						"conditions": [{
+								"bucket": "horastar"
+							}, //Bucket name
+							// {"bucket": "goin"}, 
+							{
+								'key': fileName
+							}
+						]
+					}
+					let policyEncoded = getPolicyEncode(OBSPolicy); //计算policy编码值
+					let signature = getSignature(policyEncoded, config.SecretKey); //计算signature 
+					uni.uploadFile({
+						//url: config.EndPoint,
+						url: config.EndPoint,
+						filePath: tempFilePaths[i],
+						name: 'file',
+
+						formData: {
+							'AccessKeyID': config.AccessKeyId,
+							'policy': policyEncoded,
+							'signature': signature,
+							'key': fileName,
+						},
+
+						success: function(res) {
+							console.log(res.statusCode); //打印响应状态码
+							if (res.statusCode == '204') {
+								that.imageData.push(config.EndPoint + '/' + fileName);
+								console.log('上传图片成功', res)
+								let obs_url = config.EndPoint + '/' + fileName; //用你自己的 bucket 名替换星号
+								console.log(obs_url)
+								// that.formData.home_img = obs_url
+								uni.showToast({
+									title: '上传成功',
+									icon: '成功'
+								});
+							} else {
+								console.log('上传图片失败', res)
+								uni.showToast({
+									title: '上传失败',
+									icon: '失败'
+								});
+							}
+						},
+						fail: function(e) {
+							console.log(e);
+							uni.showToast({
+								title: '上传失败22222',
+								icon: '失败'
+							});
+						}
+					})
+				}
+
+			},
+			ceshiChooseSuccess2(tempFilePaths, e) { //选择视频返回
+				console.log('ceshiChooseSuccess', tempFilePaths, e);
+				if (e == 0) {
+					this.store = 'talent_upload/' + this.guid() + '.png'
+				} else if (e == 1) {
+					this.store = 'talent_upload/' + this.guid() + '.mp4'
+				}
+				/****************
+				以下代码是自定义上传逻辑,仅供参考
+				***************/
+				this.imgUpload2(tempFilePaths);
+				/*******************************/
+				console.log("videoData" + this.videoData)
+			},
+			imgUpload2(tempFilePaths) {
+				let that = this
+				console.log('videoUpload', tempFilePaths)
+				let config = {
+					AccessKeyId: 'IVW21DTGIIUBBAGXKK0Y', //AK
+					SecretKey: 'Y01nEQNcLOATMw7uJwrk3yOdQZ2fqLhSnXcOKVDE', //SK
+					EndPoint: 'https://horastar.obs.cn-east-3.myhuaweicloud.com', //上传文件的路径
+				};
+				let fileName = this.store; //指定上传到OBS桶中的对象名
+				// let fileName = "talent_upload/icon-arrow-right.png"
+				let OBSPolicy = { //设定policy内容
+					"expiration": "2089-12-31T12:00:00.000Z",
+					"conditions": [{
+							"bucket": "horastar"
+						}, //Bucket name
+						// {"bucket": "goin"}, 
+						{
+							'key': fileName
+						}
+					]
+				}
+
+				let policyEncoded = getPolicyEncode(OBSPolicy); //计算policy编码值
+				let signature = getSignature(policyEncoded, config.SecretKey); //计算signature 
+				uni.uploadFile({
+					//url: config.EndPoint,
+					url: config.EndPoint,
+					filePath: tempFilePaths[0],
+					name: 'file',
+
+					formData: {
+						'AccessKeyID': config.AccessKeyId,
+						'policy': policyEncoded,
+						'signature': signature,
+						'key': fileName,
+					},
+
+					success: function(res) {
+						console.log(res.statusCode); //打印响应状态码
+						if (res.statusCode == '204') {
+							that.videoData.push(config.EndPoint + '/' + fileName);
+							console.log('上传图片成功', res)
+							let obs_url = config.EndPoint + '/' + fileName; //用你自己的 bucket 名替换星号
+							console.log(obs_url)
+							// that.formData.home_img = obs_url
+							uni.showToast({
+								title: '上传成功',
+								icon: '成功'
+							});
+						} else {
+							console.log('上传图片失败', res)
+							uni.showToast({
+								title: '上传失败',
+								icon: '失败'
+							});
+						}
+					},
+					fail: function(e) {
+						console.log(e);
+						uni.showToast({
+							title: '上传失败22222',
+							icon: '失败'
+						});
+					}
+				})
+			},
+			guid() {
+				return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+					var r = Math.random() * 16 | 0,
+						v = c == 'x' ? r : (r & 0x3 | 0x8);
+
+					return v.toString(16);
+				});
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.signup {
+		box-shadow: 0rpx 5rpx 40rpx #ccc;
+		width: 100%;
+		position: fixed;
+		bottom: 0rpx;
+		display: flex;
+		height: 90rpx;
+		padding-top: 2%;
+		background-color: #FFFFFF;
+		z-index: 99;
+	}
+
+	.but1 {
+		width: 60%;
+		background-color: #f2d22d;
+		border-radius: 20rpx;
+		font-size: 36rpx;
+		line-height: 200%;
+		letter-spacing: 10rpx;
+		font-weight: 500;
+		height: 80%;
+
+		&.on {
+			background-color: #C0C0C0;
+
+		}
+
+	}
+</style>

+ 136 - 81
pages/workspace/workspace.vue

@@ -6,16 +6,16 @@
 		</view>
 		<view class="menu">
 			<view class="menu-item" @click="toShow1()">
-				<p v-bind:class="showList1?'lor':''">待传脚本</p>
+				<p v-bind:class="showList1?'lor':'unlor'">待传脚本</p>
 			</view>
 			<view class="menu-item" @click="toShow2()">
-				<p v-bind:class="showList2?'lor':''">待传初稿</p>
+				<p v-bind:class="showList2?'lor':'unlor'">待传初稿</p>
 			</view>
 			<view class="menu-item" @click="toShow3()">
-				<p v-bind:class="showList3?'lor':''">待发布</p>
+				<p v-bind:class="showList3?'lor':'unlor'">待发布</p>
 			</view>
 			<view class="menu-item" @click="toShow4()">
-				<p v-bind:class="showList4?'lor':''">待传数据</p>
+				<p v-bind:class="showList4?'lor':'unlor'">待传数据</p>
 			</view>
 		</view>
 
@@ -32,8 +32,14 @@
 						</view>
 					</view>
 					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -52,8 +58,14 @@
 						</view>
 					</view>
 					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -72,8 +84,14 @@
 						</view>
 					</view>
 					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -92,8 +110,14 @@
 						</view>
 					</view>
 					<view class="task-info">
-						<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
-						<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						<view class="task-info-left">
+							<image :src="item.product_img_url" style="height: 120rpx;width: 120rpx;"></image>
+							<p style="margin-left: 50rpx;">{{item.project_name}}</p>
+						</view>
+						<view class="task-info-right" v-if="item.isShowModify">
+							<image src="../../static/img/icon-edit.png" style="height: 60rpx;width: 60rpx;"></image>
+							<p style="font-size: 32rpx;color: #ffcb41;font-weight: 600">改</p>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -150,111 +174,121 @@
 				}],
 			}
 		},
-		onShow() {
-			this.isLogin()
-		},
-		methods: {
-			// 判断登陆是否过期
-			isLogin() {
-				if (this.token == '') {
-					this.token = uni.getStorageSync('token')
-				}
-				this.$https.get('/youngee/c/t/g/is-login')
-					.then(res => {
-						console.log(res)
-						if (res.data.code == 403) {
-							this.token = ""
-							uni.clearStorage();
-							uni.showModal({
-								content: '请先登录',
-								success: function(res) {
-									uni.navigateTo({
-										url: '../login/login'
-									});
-								}
-							});
-						} else {
-							uni.showLoading({
-								title: '加载中'
-							});
-							this.getInfoTable();
-						}
-					})
-			},
-			getInfoTable() {
-				this.$https.get('/youngee/c/g/get-info-tables')
+		async onShow() {
+			this.token = uni.getStorageSync('token')
+			await this.$https.get('/youngee/c/t/g/is-login')
+				.then(res => {
+					console.log(res)
+					if (res.data.code == 403) {
+						this.token = ""
+						uni.clearStorage();
+					}
+				});
+			if (this.token !== '') { // 若登录
+				uni.showLoading({
+					title: '加载中'
+				});
+				await this.$https.get('/youngee/c/g/get-info-tables')
 					.then(res => {
 						console.log(res)
 						this.taskStageList = res.data.data.TaskStage
-						this.getList()
 					})
-			},
-			getList() {
-				console.log("run func getList")
-				this.$https.get('/youngee/c/t/g/get-task-exe-list').then(res => {
-					console.log(res)
-					this.List1 = res.data.data.list1
-					this.List2 = res.data.data.list2
-					this.List3 = res.data.data.list3
-					this.List4 = res.data.data.list4
-					if (this.List1 != null) {
-						for (let i = 0; i < this.List1.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.List1[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.List1[i].task_stage_txt = this.taskStageList[j].task_stage
-							}
-						}
+				this.showList2 = false;
+				this.showList3 = false;
+				this.showList4 = false;
+				this.showList1 = true;
+				this.getList(1);
+				uni.hideLoading();
+			} else {
+				uni.showModal({
+					content: '请先登录',
+					success: function(res) {
+						uni.navigateTo({
+							url: '../login/login'
+						});
 					}
-					if (this.List2 != null) {
-						for (let i = 0; i < this.List2.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.List2[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.List2[i].task_stage_txt = this.taskStageList[j].task_stage
+				});
+			}
+		},
+		methods: {
+			async getList(value) {
+				uni.showLoading({
+					title: '加载中'
+				});
+				var taskList = [];
+				await this.$https.get('/youngee/c/t/g/get-task-exe-list?taskStage=' + value).then(res => {
+					console.log(res)
+					taskList = res.data.data.list1
+					if (taskList != null) {
+						for (let i = 0; i < taskList.length; ++i) {
+
+							let productPhoto = JSON.parse(taskList[i].product_photo_snap);
+							for (let j = 0; j < productPhoto.length; j++) {
+								if (productPhoto[j].Symbol == 1) {
+									taskList[i].product_img_url = productPhoto[j].PhotoUrl
+								}
 							}
-						}
-					}
-					if (this.List3 != null) {
-						for (let i = 0; i < this.List3.length; ++i) {
-							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.List3[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.List3[i].task_stage_txt = this.taskStageList[j].task_stage
+
+							if ((taskList[i].task_stage == 7 && taskList[i].script_status == 3) ||
+								(taskList[i].task_stage == 9 && taskList[i].sketch_status == 3) ||
+								(taskList[i].task_stage == 11 && taskList[i].link_status == 3) ||
+								(taskList[i].task_stage == 13 && taskList[i].data_status == 3)) {
+								taskList[i].isShowModify = true
+							} else {
+								taskList[i].isShowModify = false
 							}
-						}
-					}
-					if (this.List4 != null) {
-						for (let i = 0; i < this.List4.length; ++i) {
 							for (let j = 0; j < this.taskStageList.length; ++j) {
-								if (this.List4[i].task_stage == this.taskStageList[j].task_stage_id)
-									this.List4[i].task_stage_txt = this.taskStageList[j].task_stage
+								if (taskList[i].task_stage == this.taskStageList[j]
+									.task_stage_id)
+									taskList[i].task_stage_txt = this.taskStageList[j]
+									.task_stage
 							}
 						}
 					}
-					uni.hideLoading();
 				})
+				switch (value) {
+					case 1:
+						this.List1 = taskList;
+						break;
+					case 2:
+						this.List2 = taskList;
+						break;
+					case 3:
+						this.List3 = taskList;
+						break;
+					case 4:
+						this.List4 = taskList;
+						break;
+				};
+				uni.hideLoading();
 			},
 			toShow1() {
 				this.showList2 = false;
 				this.showList3 = false;
 				this.showList4 = false;
 				this.showList1 = true;
+				this.getList(1);
 			},
 			toShow2() {
 				this.showList1 = false;
 				this.showList3 = false;
 				this.showList4 = false;
 				this.showList2 = true;
+				this.getList(2);
 			},
 			toShow3() {
 				this.showList2 = false;
 				this.showList1 = false;
 				this.showList4 = false;
 				this.showList3 = true;
+				this.getList(3);
 			},
 			toShow4() {
 				this.showList2 = false;
 				this.showList1 = false;
 				this.showList3 = false;
 				this.showList4 = true;
+				this.getList(4);
 			},
 			toDetail(item) {
 				uni.navigateTo({
@@ -297,6 +331,12 @@
 			color: #F0D232;
 			padding-bottom: 15rpx;
 		}
+
+		&.unlor {
+			border-bottom: 5rpx solid #fff;
+			color: #81838f;
+			padding-bottom: 15rpx;
+		}
 	}
 
 	.home {
@@ -325,8 +365,23 @@
 		.task-info {
 			display: flex;
 			align-items: center;
+			justify-content: space-between;
 			padding: 10rpx 20rpx;
 
+			.task-info-left {
+				display: flex;
+				align-items: center;
+			}
+
+			.task-info-right {
+				width: 100rpx;
+				height: 100rpx;
+				border-radius: 50%;
+				border: #ffcb41 2rpx solid;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
 		}
 	}
 

TEMPAT SAMPAH
static/delete.png


TEMPAT SAMPAH
static/img/copy.png


TEMPAT SAMPAH
static/img/delete.png


TEMPAT SAMPAH
static/img/help.png


TEMPAT SAMPAH
static/img/icon-edit.png


TEMPAT SAMPAH
static/img/type1.png


TEMPAT SAMPAH
static/img/type2.png


TEMPAT SAMPAH
static/img/type3.png


TEMPAT SAMPAH
static/img/type4.png


TEMPAT SAMPAH
static/img/younggee_logo.png


+ 3 - 0
uni_modules/Sansnn-uQRCode/changelog.md

@@ -0,0 +1,3 @@
+## 3.6.5(2022-10-14)
+修复组件size值为string类型时,调用toTempFilePath导出临时文件路径失败;  
+优化组件加载本地图片。

File diff ditekan karena terlalu besar
+ 71 - 0
uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue


File diff ditekan karena terlalu besar
+ 71 - 0
uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue


+ 241 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/bridge/bridge-weex.js

@@ -0,0 +1,241 @@
+const isWeex = typeof WXEnvironment !== 'undefined';
+const isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform);
+const isWeexAndroid = isWeex && !isWeexIOS;
+
+import GLmethod from '../context-webgl/GLmethod';
+
+const GCanvasModule =
+    (typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) :
+        (typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {};
+
+let isDebugging = false;
+
+let isComboDisabled = false;
+
+const logCommand = (function () {
+    const methodQuery = [];
+    Object.keys(GLmethod).forEach(key => {
+        methodQuery[GLmethod[key]] = key;
+    })
+    const queryMethod = (id) => {
+        return methodQuery[parseInt(id)] || 'NotFoundMethod';
+    }
+    const logCommand = (id, cmds) => {
+        const mId = cmds.split(',')[0];
+        const mName = queryMethod(mId);
+        console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`);
+    }
+    return logCommand;
+})();
+
+function joinArray(arr, sep) {
+    let res = '';
+    for (let i = 0; i < arr.length; i++) {
+        if (i !== 0) {
+            res += sep;
+        }
+        res += arr[i];
+    }
+    return res;
+}
+
+const commandsCache = {}
+
+const GBridge = {
+
+    callEnable: (ref, configArray) => {
+
+        commandsCache[ref] = [];
+
+        return GCanvasModule.enable({
+            componentId: ref,
+            config: configArray
+        });
+    },
+
+    callEnableDebug: () => {
+        isDebugging = true;
+    },
+
+    callEnableDisableCombo: () => {
+        isComboDisabled = true;
+    },
+
+    callSetContextType: function (componentId, context_type) {
+        GCanvasModule.setContextType(context_type, componentId);
+    },
+
+    callReset: function(id){
+        GCanvasModule.resetComponent && canvasModule.resetComponent(componentId);
+    },
+
+    render: isWeexIOS ? function (componentId) {
+        return GCanvasModule.extendCallNative({
+            contextId: componentId,
+            type: 0x60000001
+        });
+    } : function (componentId) {
+        return callGCanvasLinkNative(componentId, 0x60000001, 'render');
+    },
+
+    render2d: isWeexIOS ? function (componentId, commands, callback) {
+
+        if (isDebugging) {
+            console.log('>>> >>> render2d ===');
+            console.log('>>> commands: ' + commands);
+        }
+		
+        GCanvasModule.render([commands, callback?true:false], componentId, callback);
+
+    } : function (componentId, commands,callback) {
+
+        if (isDebugging) {
+            console.log('>>> >>> render2d ===');
+            console.log('>>> commands: ' + commands);
+        }
+
+        callGCanvasLinkNative(componentId, 0x20000001, commands);
+		if(callback){
+		callback();
+		}
+    },
+
+    callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) {
+
+        throw 'should not be here anymore ' + cmdArgs;
+
+    } : function (componentId, cmdArgs) {
+
+        throw 'should not be here anymore ' + cmdArgs;
+
+    },
+
+
+    flushNative: isWeexIOS ? function (componentId) {
+
+        const cmdArgs = joinArray(commandsCache[componentId], ';');
+        commandsCache[componentId] = [];
+
+        if (isDebugging) {
+            console.log('>>> >>> flush native ===');
+            console.log('>>> commands: ' + cmdArgs);
+        }
+
+        const result = GCanvasModule.extendCallNative({
+            "contextId": componentId,
+            "type": 0x60000000,
+            "args": cmdArgs
+        });
+
+        const res = result && result.result;
+
+        if (isDebugging) {
+            console.log('>>> result: ' + res);
+        }
+
+        return res;
+
+    } : function (componentId) {
+
+        const cmdArgs = joinArray(commandsCache[componentId], ';');
+        commandsCache[componentId] = [];
+
+        if (isDebugging) {
+            console.log('>>> >>> flush native ===');
+            console.log('>>> commands: ' + cmdArgs);
+        }
+
+        const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs);
+
+        if (isDebugging) {
+            console.log('>>> result: ' + result);
+        }
+
+        return result;
+    },
+
+    callNative: function (componentId, cmdArgs, cache) {
+
+        if (isDebugging) {
+            logCommand(componentId, cmdArgs);
+        }
+
+        commandsCache[componentId].push(cmdArgs);
+
+        if (!cache || isComboDisabled) {
+            return GBridge.flushNative(componentId);
+        } else {
+            return undefined;
+        }
+    },
+
+    texImage2D(componentId, ...args) {
+        if (isWeexIOS) {
+            if (args.length === 6) {
+                const [target, level, internalformat, format, type, image] = args;
+                GBridge.callNative(
+                    componentId,
+                    GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src
+                )
+            } else if (args.length === 9) {
+                const [target, level, internalformat, width, height, border, format, type, image] = args;
+                GBridge.callNative(
+                    componentId,
+                    GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' +
+                    + format + ',' + type + ',' + (image ? image.src : 0)
+                )
+            }
+        } else if (isWeexAndroid) {
+            if (args.length === 6) {
+                const [target, level, internalformat, format, type, image] = args;
+                GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src);
+            } else if (args.length === 9) {
+                const [target, level, internalformat, width, height, border, format, type, image] = args;
+                GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0));
+            }
+        }
+    },
+
+    texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) {
+        if (isWeexIOS) {
+            if (arguments.length === 8) {
+                GBridge.callNative(
+                    componentId,
+                    GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src
+                )
+            }
+        } else if (isWeexAndroid) {
+            GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src);
+        }
+    },
+
+    bindImageTexture(componentId, src, imageId) {
+        GCanvasModule.bindImageTexture([src, imageId], componentId);
+    },
+
+    perloadImage([url, id], callback) {
+        GCanvasModule.preLoadImage([url, id], function (image) {
+            image.url = url;
+            image.id = id;
+            callback(image);
+        });
+    },
+	
+	measureText(text, fontStyle, componentId) {
+	    return GCanvasModule.measureText([text, fontStyle], componentId);
+	},
+	
+	getImageData (componentId, x, y, w, h, callback) {
+		GCanvasModule.getImageData([x, y,w,h],componentId,callback);
+	},
+	
+	putImageData (componentId, data, x, y, w, h, callback) {
+		GCanvasModule.putImageData([x, y,w,h,data],componentId,callback);
+	},
+	
+	toTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){ 
+		GCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback);
+	}
+}
+
+export default GBridge;

+ 18 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleLinearGradient.js

@@ -0,0 +1,18 @@
+class FillStyleLinearGradient {
+
+    constructor(x0, y0, x1, y1) {
+        this._start_pos = { _x: x0, _y: y0 };
+        this._end_pos = { _x: x1, _y: y1 };
+        this._stop_count = 0;
+        this._stops = [0, 0, 0, 0, 0];
+    }
+
+    addColorStop = function (pos, color) {
+        if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
+            this._stops[this._stop_count] = { _pos: pos, _color: color };
+            this._stop_count++;
+        }
+    }
+}
+
+export default FillStyleLinearGradient;

+ 8 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStylePattern.js

@@ -0,0 +1,8 @@
+class FillStylePattern {
+    constructor(img, pattern) {
+        this._style = pattern;
+        this._img = img;
+    }
+}
+
+export default FillStylePattern;

+ 17 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleRadialGradient.js

@@ -0,0 +1,17 @@
+class FillStyleRadialGradient {
+    constructor(x0, y0, r0, x1, y1, r1) {
+        this._start_pos = { _x: x0, _y: y0, _r: r0 };
+        this._end_pos = { _x: x1, _y: y1, _r: r1 };
+        this._stop_count = 0;
+        this._stops = [0, 0, 0, 0, 0];
+    }
+
+    addColorStop(pos, color) {
+        if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
+            this._stops[this._stop_count] = { _pos: pos, _color: color };
+            this._stop_count++;
+        }
+    }
+}
+
+export default FillStyleRadialGradient;

+ 666 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/RenderingContext.js

@@ -0,0 +1,666 @@
+import FillStylePattern from './FillStylePattern';
+import FillStyleLinearGradient from './FillStyleLinearGradient';
+import FillStyleRadialGradient from './FillStyleRadialGradient';
+import GImage from '../env/image.js';
+import {
+	ArrayBufferToBase64,
+	Base64ToUint8ClampedArray
+} from '../env/tool.js';
+
+export default class CanvasRenderingContext2D {
+
+	_drawCommands = '';
+
+	_globalAlpha = 1.0;
+
+	_fillStyle = 'rgb(0,0,0)';
+	_strokeStyle = 'rgb(0,0,0)';
+
+	_lineWidth = 1;
+	_lineCap = 'butt';
+	_lineJoin = 'miter';
+
+	_miterLimit = 10;
+
+	_globalCompositeOperation = 'source-over';
+
+	_textAlign = 'start';
+	_textBaseline = 'alphabetic';
+
+	_font = '10px sans-serif';
+
+	_savedGlobalAlpha = [];
+
+	timer = null;
+	componentId = null;
+
+	_notCommitDrawImageCache = [];
+	_needRedrawImageCache = [];
+	_redrawCommands = '';
+	_autoSaveContext = true;
+	// _imageMap = new GHashMap();
+	// _textureMap = new GHashMap();
+
+	constructor() {
+		this.className = 'CanvasRenderingContext2D';
+		//this.save()
+	}
+
+	setFillStyle(value) {
+		this.fillStyle = value;
+	}
+
+	set fillStyle(value) {
+		this._fillStyle = value;
+
+		if (typeof(value) == 'string') {
+			this._drawCommands = this._drawCommands.concat("F" + value + ";");
+		} else if (value instanceof FillStylePattern) {
+			const image = value._img;
+			if (!image.complete) {
+				image.onload = () => {
+					var index = this._needRedrawImageCache.indexOf(image);
+					if (index > -1) {
+						this._needRedrawImageCache.splice(index, 1);
+						CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+						this._redrawflush(true);
+					}
+				}
+				this._notCommitDrawImageCache.push(image);
+			} else {
+				CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+			}
+
+			//CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+			this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
+		} else if (value instanceof FillStyleLinearGradient) {
+			var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
+				value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
+				value._stop_count;
+			for (var i = 0; i < value._stop_count; ++i) {
+				command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
+			}
+			this._drawCommands = this._drawCommands.concat(command + ";");
+		} else if (value instanceof FillStyleRadialGradient) {
+			var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
+				.toFixed(2) + "," +
+				value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + value._end_pos._r.toFixed(2) + "," +
+				value._stop_count;
+			for (var i = 0; i < value._stop_count; ++i) {
+				command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
+			}
+			this._drawCommands = this._drawCommands.concat(command + ";");
+		}
+	}
+
+	get fillStyle() {
+		return this._fillStyle;
+	}
+
+	get globalAlpha() {
+		return this._globalAlpha;
+	}
+
+	setGlobalAlpha(value) {
+		this.globalAlpha = value;
+	}
+
+	set globalAlpha(value) {
+		this._globalAlpha = value;
+		this._drawCommands = this._drawCommands.concat("a" + value.toFixed(2) + ";");
+	}
+
+
+	get strokeStyle() {
+		return this._strokeStyle;
+	}
+
+	setStrokeStyle(value) {
+		this.strokeStyle = value;
+	}
+
+	set strokeStyle(value) {
+
+		this._strokeStyle = value;
+
+		if (typeof(value) == 'string') {
+			this._drawCommands = this._drawCommands.concat("S" + value + ";");
+		} else if (value instanceof FillStylePattern) {
+			CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+			this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
+		} else if (value instanceof FillStyleLinearGradient) {
+			var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
+				value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
+				value._stop_count;
+
+			for (var i = 0; i < value._stop_count; ++i) {
+				command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
+			}
+			this._drawCommands = this._drawCommands.concat(command + ";");
+		} else if (value instanceof FillStyleRadialGradient) {
+			var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
+				.toFixed(2) + "," +
+				value._end_pos._x.toFixed(2) + "," + value._end_pos._y + ",".toFixed(2) + value._end_pos._r.toFixed(2) + "," +
+				value._stop_count;
+
+			for (var i = 0; i < value._stop_count; ++i) {
+				command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
+			}
+			this._drawCommands = this._drawCommands.concat(command + ";");
+		}
+	}
+
+	get lineWidth() {
+		return this._lineWidth;
+	}
+
+	setLineWidth(value) {
+		this.lineWidth = value;
+	}
+
+	set lineWidth(value) {
+		this._lineWidth = value;
+		this._drawCommands = this._drawCommands.concat("W" + value + ";");
+	}
+
+	get lineCap() {
+		return this._lineCap;
+	}
+
+	setLineCap(value) {
+		this.lineCap = value;
+	}
+
+	set lineCap(value) {
+		this._lineCap = value;
+		this._drawCommands = this._drawCommands.concat("C" + value + ";");
+	}
+
+	get lineJoin() {
+		return this._lineJoin;
+	}
+
+	setLineJoin(value) {
+		this.lineJoin = value
+	}
+
+	set lineJoin(value) {
+		this._lineJoin = value;
+		this._drawCommands = this._drawCommands.concat("J" + value + ";");
+	}
+
+	get miterLimit() {
+		return this._miterLimit;
+	}
+
+	setMiterLimit(value) {
+		this.miterLimit = value
+	}
+
+	set miterLimit(value) {
+		this._miterLimit = value;
+		this._drawCommands = this._drawCommands.concat("M" + value + ";");
+	}
+
+	get globalCompositeOperation() {
+		return this._globalCompositeOperation;
+	}
+
+	set globalCompositeOperation(value) {
+
+		this._globalCompositeOperation = value;
+		let mode = 0;
+		switch (value) {
+			case "source-over":
+				mode = 0;
+				break;
+			case "source-atop":
+				mode = 5;
+				break;
+			case "source-in":
+				mode = 0;
+				break;
+			case "source-out":
+				mode = 2;
+				break;
+			case "destination-over":
+				mode = 4;
+				break;
+			case "destination-atop":
+				mode = 4;
+				break;
+			case "destination-in":
+				mode = 4;
+				break;
+			case "destination-out":
+				mode = 3;
+				break;
+			case "lighter":
+				mode = 1;
+				break;
+			case "copy":
+				mode = 2;
+				break;
+			case "xor":
+				mode = 6;
+				break;
+			default:
+				mode = 0;
+		}
+
+		this._drawCommands = this._drawCommands.concat("B" + mode + ";");
+	}
+
+	get textAlign() {
+		return this._textAlign;
+	}
+
+	setTextAlign(value) {
+		this.textAlign = value
+	}
+
+	set textAlign(value) {
+
+		this._textAlign = value;
+		let Align = 0;
+		switch (value) {
+			case "start":
+				Align = 0;
+				break;
+			case "end":
+				Align = 1;
+				break;
+			case "left":
+				Align = 2;
+				break;
+			case "center":
+				Align = 3;
+				break;
+			case "right":
+				Align = 4;
+				break;
+			default:
+				Align = 0;
+		}
+
+		this._drawCommands = this._drawCommands.concat("A" + Align + ";");
+	}
+
+	get textBaseline() {
+		return this._textBaseline;
+	}
+
+	setTextBaseline(value) {
+		this.textBaseline = value
+	}
+
+	set textBaseline(value) {
+		this._textBaseline = value;
+		let baseline = 0;
+		switch (value) {
+			case "alphabetic":
+				baseline = 0;
+				break;
+			case "middle":
+				baseline = 1;
+				break;
+			case "top":
+				baseline = 2;
+				break;
+			case "hanging":
+				baseline = 3;
+				break;
+			case "bottom":
+				baseline = 4;
+				break;
+			case "ideographic":
+				baseline = 5;
+				break;
+			default:
+				baseline = 0;
+				break;
+		}
+
+		this._drawCommands = this._drawCommands.concat("E" + baseline + ";");
+	}
+
+	get font() {
+		return this._font;
+	}
+
+	setFontSize(size) {
+		var str = this._font;
+		var strs = str.trim().split(/\s+/);
+		for (var i = 0; i < strs.length; i++) {
+			var values = ["normal", "italic", "oblique", "normal", "small-caps", "normal", "bold",
+				"bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900",
+				"normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed",
+				"semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
+			];
+
+			if (-1 == values.indexOf(strs[i].trim())) {
+				if (typeof size === 'string') {
+					strs[i] = size;
+				} else if (typeof size === 'number') {
+					strs[i] = String(size) + 'px';
+				}
+				break;
+			}
+		}
+		this.font = strs.join(" ");
+	}
+
+	set font(value) {
+		this._font = value;
+		this._drawCommands = this._drawCommands.concat("j" + value + ";");
+	}
+
+	setTransform(a, b, c, d, tx, ty) {
+		this._drawCommands = this._drawCommands.concat("t" +
+			(a === 1 ? "1" : a.toFixed(2)) + "," +
+			(b === 0 ? "0" : b.toFixed(2)) + "," +
+			(c === 0 ? "0" : c.toFixed(2)) + "," +
+			(d === 1 ? "1" : d.toFixed(2)) + "," + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
+	}
+
+	transform(a, b, c, d, tx, ty) {
+		this._drawCommands = this._drawCommands.concat("f" +
+			(a === 1 ? "1" : a.toFixed(2)) + "," +
+			(b === 0 ? "0" : b.toFixed(2)) + "," +
+			(c === 0 ? "0" : c.toFixed(2)) + "," +
+			(d === 1 ? "1" : d.toFixed(2)) + "," + tx + "," + ty + ";");
+	}
+
+	resetTransform() {
+		this._drawCommands = this._drawCommands.concat("m;");
+	}
+
+	scale(a, d) {
+		this._drawCommands = this._drawCommands.concat("k" + a.toFixed(2) + "," +
+			d.toFixed(2) + ";");
+	}
+
+	rotate(angle) {
+		this._drawCommands = this._drawCommands
+			.concat("r" + angle.toFixed(6) + ";");
+	}
+
+	translate(tx, ty) {
+		this._drawCommands = this._drawCommands.concat("l" + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
+	}
+
+	save() {
+		this._savedGlobalAlpha.push(this._globalAlpha);
+		this._drawCommands = this._drawCommands.concat("v;");
+	}
+
+	restore() {
+		this._drawCommands = this._drawCommands.concat("e;");
+		this._globalAlpha = this._savedGlobalAlpha.pop();
+	}
+
+	createPattern(img, pattern) {
+		if (typeof img === 'string') {
+			var imgObj = new GImage();
+			imgObj.src = img;
+			img = imgObj;
+		}
+		return new FillStylePattern(img, pattern);
+	}
+
+	createLinearGradient(x0, y0, x1, y1) {
+		return new FillStyleLinearGradient(x0, y0, x1, y1);
+	}
+
+	createRadialGradient = function(x0, y0, r0, x1, y1, r1) {
+		return new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1);
+	};
+
+	createCircularGradient = function(x0, y0, r0) {
+		return new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0);
+	};
+
+	strokeRect(x, y, w, h) {
+		this._drawCommands = this._drawCommands.concat("s" + x + "," + y + "," + w + "," + h + ";");
+	}
+
+
+	clearRect(x, y, w, h) {
+		this._drawCommands = this._drawCommands.concat("c" + x + "," + y + "," + w +
+			"," + h + ";");
+	}
+
+	clip() {
+		this._drawCommands = this._drawCommands.concat("p;");
+	}
+
+	resetClip() {
+		this._drawCommands = this._drawCommands.concat("q;");
+	}
+
+	closePath() {
+		this._drawCommands = this._drawCommands.concat("o;");
+	}
+
+	moveTo(x, y) {
+		this._drawCommands = this._drawCommands.concat("g" + x.toFixed(2) + "," + y.toFixed(2) + ";");
+	}
+
+	lineTo(x, y) {
+		this._drawCommands = this._drawCommands.concat("i" + x.toFixed(2) + "," + y.toFixed(2) + ";");
+	}
+
+	quadraticCurveTo = function(cpx, cpy, x, y) {
+		this._drawCommands = this._drawCommands.concat("u" + cpx + "," + cpy + "," + x + "," + y + ";");
+	}
+
+	bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) {
+		this._drawCommands = this._drawCommands.concat(
+			"z" + cp1x.toFixed(2) + "," + cp1y.toFixed(2) + "," + cp2x.toFixed(2) + "," + cp2y.toFixed(2) + "," +
+			x.toFixed(2) + "," + y.toFixed(2) + ";");
+	}
+
+	arcTo(x1, y1, x2, y2, radius) {
+		this._drawCommands = this._drawCommands.concat("h" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + radius + ";");
+	}
+
+	beginPath() {
+		this._drawCommands = this._drawCommands.concat("b;");
+	}
+
+
+	fillRect(x, y, w, h) {
+		this._drawCommands = this._drawCommands.concat("n" + x + "," + y + "," + w +
+			"," + h + ";");
+	}
+
+	rect(x, y, w, h) {
+		this._drawCommands = this._drawCommands.concat("w" + x + "," + y + "," + w + "," + h + ";");
+	}
+
+	fill() {
+		this._drawCommands = this._drawCommands.concat("L;");
+	}
+
+	stroke(path) {
+		this._drawCommands = this._drawCommands.concat("x;");
+	}
+
+	arc(x, y, radius, startAngle, endAngle, anticlockwise) {
+
+		let ianticlockwise = 0;
+		if (anticlockwise) {
+			ianticlockwise = 1;
+		}
+
+		this._drawCommands = this._drawCommands.concat(
+			"y" + x.toFixed(2) + "," + y.toFixed(2) + "," +
+			radius.toFixed(2) + "," + startAngle + "," + endAngle + "," + ianticlockwise +
+			";"
+		);
+	}
+
+	fillText(text, x, y) {
+		let tmptext = text.replace(/!/g, "!!");
+		tmptext = tmptext.replace(/,/g, "!,");
+		tmptext = tmptext.replace(/;/g, "!;");
+		this._drawCommands = this._drawCommands.concat("T" + tmptext + "," + x + "," + y + ",0.0;");
+	}
+
+	strokeText = function(text, x, y) {
+		let tmptext = text.replace(/!/g, "!!");
+		tmptext = tmptext.replace(/,/g, "!,");
+		tmptext = tmptext.replace(/;/g, "!;");
+		this._drawCommands = this._drawCommands.concat("U" + tmptext + "," + x + "," + y + ",0.0;");
+	}
+
+	measureText(text) {
+		return CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId);
+	}
+
+	isPointInPath = function(x, y) {
+		throw new Error('GCanvas not supported yet');
+	}
+
+	drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
+		if (typeof image === 'string') {
+			var imgObj = new GImage();
+			imgObj.src = image;
+			image = imgObj;
+		}
+		if (image instanceof GImage) {
+			if (!image.complete) {
+				imgObj.onload = () => {
+					var index = this._needRedrawImageCache.indexOf(image);
+					if (index > -1) {
+						this._needRedrawImageCache.splice(index, 1);
+						CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+						this._redrawflush(true);
+					}
+				}
+				this._notCommitDrawImageCache.push(image);
+			} else {
+				CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
+			}
+			var srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh];
+			var args = [];
+			for (var arg in srcArgs) {
+				if (typeof(srcArgs[arg]) != 'undefined') {
+					args.push(srcArgs[arg]);
+				}
+			}
+			this.__drawImage.apply(this, args);
+			//this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh);
+		}
+	}
+
+	__drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
+		const numArgs = arguments.length;
+
+		function drawImageCommands() {
+
+			if (numArgs === 3) {
+				const x = parseFloat(sx) || 0.0;
+				const y = parseFloat(sy) || 0.0;
+
+				return ("d" + image._id + ",0,0," +
+					image.width + "," + image.height + "," +
+					x + "," + y + "," + image.width + "," + image.height + ";");
+			} else if (numArgs === 5) {
+				const x = parseFloat(sx) || 0.0;
+				const y = parseFloat(sy) || 0.0;
+				const width = parseInt(sw) || image.width;
+				const height = parseInt(sh) || image.height;
+
+				return ("d" + image._id + ",0,0," +
+					image.width + "," + image.height + "," +
+					x + "," + y + "," + width + "," + height + ";");
+			} else if (numArgs === 9) {
+				sx = parseFloat(sx) || 0.0;
+				sy = parseFloat(sy) || 0.0;
+				sw = parseInt(sw) || image.width;
+				sh = parseInt(sh) || image.height;
+				dx = parseFloat(dx) || 0.0;
+				dy = parseFloat(dy) || 0.0;
+				dw = parseInt(dw) || image.width;
+				dh = parseInt(dh) || image.height;
+
+				return ("d" + image._id + "," +
+					sx + "," + sy + "," + sw + "," + sh + "," +
+					dx + "," + dy + "," + dw + "," + dh + ";");
+			}
+		}
+		this._drawCommands += drawImageCommands();
+	}
+
+	_flush(reserve, callback) {
+		const commands = this._drawCommands;
+		this._drawCommands = '';
+		CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
+		this._needRender = false;
+	}
+
+	_redrawflush(reserve, callback) {
+		const commands = this._redrawCommands;
+		CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
+		if (this._needRedrawImageCache.length == 0) {
+			this._redrawCommands = '';
+		}
+	}
+
+	draw(reserve, callback) {
+		if (!reserve) {
+			this._globalAlpha = this._savedGlobalAlpha.pop();
+			this._savedGlobalAlpha.push(this._globalAlpha);
+			this._redrawCommands = this._drawCommands;
+			this._needRedrawImageCache = this._notCommitDrawImageCache;
+			if (this._autoSaveContext) {
+				this._drawCommands = ("v;" + this._drawCommands);
+				this._autoSaveContext = false;
+			} else {
+				this._drawCommands = ("e;X;v;" + this._drawCommands);
+			}
+		} else {
+			this._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache);
+			this._redrawCommands += this._drawCommands;
+			if (this._autoSaveContext) {
+				this._drawCommands = ("v;" + this._drawCommands);
+				this._autoSaveContext = false;
+			}
+		}
+		this._notCommitDrawImageCache = [];
+		if (this._flush) {
+			this._flush(reserve, callback);
+		}
+	}
+
+	getImageData(x, y, w, h, callback) {
+		CanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) {
+			res.data = Base64ToUint8ClampedArray(res.data);
+			if (typeof(callback) == 'function') {
+				callback(res);
+			}
+		});
+	}
+
+	putImageData(data, x, y, w, h, callback) {
+		if (data instanceof Uint8ClampedArray) {
+			data = ArrayBufferToBase64(data);
+			CanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) {
+				if (typeof(callback) == 'function') {
+					callback(res);
+				}
+			});
+		}
+	}
+
+	toTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) {
+		CanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight,
+			fileType, quality,
+			function(res) {
+				if (typeof(callback) == 'function') {
+					callback(res);
+				}
+			});
+	}
+}

+ 11 - 0
uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/ActiveInfo.js

@@ -0,0 +1,11 @@
+export default class WebGLActiveInfo {
+    className = 'WebGLActiveInfo';
+
+    constructor({
+        type, name, size
+    }) {
+        this.type = type;
+        this.name = name;
+        this.size = size;
+    }
+}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini