hwq пре 1 година
родитељ
комит
6a1e12ebec

+ 2 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "易趣CBB",
     "appid" : "__UNI__9A7699F",
     "description" : "",
-    "versionName" : "1.3.8",
-    "versionCode" : 138,
+    "versionName" : "1.4.3",
+    "versionCode" : 143,
     "transformPx" : false,
     "app-plus" : {
         /* 5+App特有相关 */

+ 28 - 13
pages/collection/wx.vue

@@ -42,8 +42,12 @@
 		auction,
 		pay_list
 	} from '@/api/wallet.js';
-	import { verify } from '@/api/login.js';
-	import { mapState } from 'vuex';
+	import {
+		verify
+	} from '@/api/login.js';
+	import {
+		mapState
+	} from 'vuex';
 	export default {
 		computed: {
 			...mapState('user', ['userInfo'])
@@ -54,9 +58,10 @@
 				name: '',
 				image: '',
 				phone: '',
-				captcha:'',
-				countDown:0,//倒计时
-				time:''
+				captcha: '',
+				countDown: 0, //倒计时
+				time: '',
+				upFileLoding:false,
 			};
 		},
 		watch: {
@@ -78,7 +83,7 @@
 					this.phone = data.wx.phone
 				}
 			})
-			
+
 		},
 		methods: {
 			//发送验证码
@@ -98,10 +103,12 @@
 					}, 1000);
 					//调用验证码接口
 					verify({
-						phone: obj.userInfo.phone,
-						type: ''
-					})
-						.then(({ data }) => {})
+							phone: obj.userInfo.phone,
+							type: ''
+						})
+						.then(({
+							data
+						}) => {})
 						.catch(err => {
 							console.log(err);
 						});
@@ -109,12 +116,20 @@
 			},
 			uploads() {
 				const that = this;
+				if (that.upFileLoding) {
+					return
+				}
+				that.upFileLoding = true;
+				setTimeout(()=>{
+					that.upFileLoding = false;
+				},1000);
 				upload({
 					filename: '',
-					file_name:'collection/wx/'+that.userInfo.uid
+					file_name: 'collection/wx/' + that.userInfo.uid
 				}).then(data => {
-					console.log(data[0].url,'data');
 					that.image = data[0].url;
+				}).catch((err) => {
+					console.log(err);
 				})
 			},
 			confirm() {
@@ -140,7 +155,7 @@
 						payment: obj.code,
 						image: obj.image,
 						phone: obj.phone,
-						captcha:obj.captcha,
+						captcha: obj.captcha,
 					})
 					.then(e => {
 						obj.$api.msg('修改成功');

+ 14 - 3
pages/collection/zfb.vue

@@ -24,7 +24,7 @@
 				<text>收款码</text>
 				<view class="img" @click="uploads()">
 					<image src="../../static/user/erweima.png" mode="" v-if="image == ''"></image>
-					<image :src="image" mode="" v-else></image>
+					<image :src="image" mode="scaleToFill" v-else></image>
 				</view>
 			</view>
 		</view>
@@ -63,7 +63,8 @@
 				countDown: 0, //倒计时
 				code: '', //验证码
 				time: '',
-				image: ''
+				image: '',
+				upFileLoding:false,
 			};
 		},
 		watch: {
@@ -89,11 +90,21 @@
 		methods: {
 			...mapMutations('user', ['setUserInfo', 'setOrderInfo']),
 			uploads() {
+				const that = this;
+				if (that.upFileLoding) {
+					return
+				}
+				that.upFileLoding = true;
+				setTimeout(()=>{
+					that.upFileLoding = false;
+				},1000);
 				upload({
 					filename: '',
 					file_name:'collection/zfb/'+that.userInfo.uid
 				}).then(data => {
-					this.image = data[0].url;
+					that.image = data[0].url;
+				}).catch((err) => {
+					console.log(err);
 				})
 			},
 			verification() {

+ 14 - 9
pages/hall/hallpay.vue

@@ -142,8 +142,8 @@
 		<view class="upload">
 			<view class="upload-title">上传支付截图</view>
 			<view class="upload-main">
-				<image class="upload-image" src="../../static/img/add.png" mode="" v-if="!image" @click="uploads()"></image>
-				<image class="upload-image" :src="image" mode="" @click="uploads()" v-if="image"></image>
+				<image class="upload-image" src="../../static/img/add.png" mode="" v-if="!image" @click="uploads"></image>
+				<image class="upload-image" :src="image" mode="" @click="uploads" v-if="image"></image>
 				<view class="upload-font">点击上传支付截图</view>
 			</view>
 		</view>
@@ -207,7 +207,8 @@ export default {
 			image: '',
 			status: 1,
 			text: '123456',
-			payTime: ''
+			payTime: '',
+			upFileLoding:false
 		};
 	},
 	onLoad(option) {
@@ -219,16 +220,20 @@ export default {
 	},
 	methods: {
 		uploads() {
+			const that = this;
+			if (that.upFileLoding) {
+				return
+			}
+			that.upFileLoding = true;
+			setTimeout(()=>{
+				that.upFileLoding = false;
+			},1000);
 			upload({
 				filename: ''
 			}).then(data => {
-				this.image = data[0].url;
+				that.image = data[0].url;
 			}).catch((e)=>{
-				uni.showModal({
-					title: '上传失败',
-					content: JSON.stringify(e),
-					showCancel: false,
-				});
+				console.log(e);
 			});
 		},
 		getpayTime() {

+ 5 - 0
pages/index/downLoad.vue

@@ -14,6 +14,8 @@
 </template>
 
 <script>
+	
+	
 export default {
 	data() {
 		return {
@@ -29,6 +31,9 @@ export default {
 	onReady() {},
 	methods: {
 		downApp(version) {
+			if(!(version.indexOf("http")>-1)){
+				version = this.$store.state.baseURL+version
+			}
 			this.dtask = plus.downloader.createDownload(version);
 			this.dtask.addEventListener('statechanged', this.onStateChanged, false);
 			this.dtask.start();

+ 1 - 1
pages/money/qudou.vue

@@ -34,7 +34,7 @@
 				</view>
 				<view class="margin-t-10 flex-center">
 					<text>
-						
+						兑
 					</text>
 				</view>
 			</view>

+ 3 - 0
pages/money/quick.vue

@@ -56,10 +56,13 @@
 				</view>
 			</view>
 		</navigator>
+		
+		<view class="echart-box"><l-echart ref="chart" @finished="init"></l-echart></view>
 	</view>
 </template>
 
 <script>
+	import * as echarts from '@/uni_modules/lime-echart/static/echarts.min'
 	import {
 		getUserInfo,
 		admintrade,

+ 100 - 0
pages/navigation/index.vue

@@ -36,6 +36,38 @@
 				<image class="nav-img" src="../../static/img/oldbanner.png" mode=""></image>
 			</view>
 		</view>
+		<view class="box margin-t-30">
+			<!-- <view class="titlebox flex">
+				<view class="flex-start">
+					<image class="nametip" src="../../static/icon/quick6.png" mode="scaleToFill"></image>
+					<text class="padding-l-10">文票趋势</text>
+				</view>
+			</view> -->
+			<view class="flex item">
+				<view class="item-box">
+					<view class="title">
+						{{ticketBase.fullname}}
+					</view>
+					<view class="mintitle margin-t-20">
+						价格(CNY)<text class="num font-size-lg">{{ticketBase.CurPrice}}</text>
+					</view>
+				</view>
+				<view class="item-box">
+					<view class="num righttext">
+						<text v-if="ticketBase.CurrentGains>0">+</text>
+						<text  v-if="ticketBase.CurrentGains<0">-</text>
+						{{ticketBase.CurrentGains*100}}%
+					</view>
+					<view class="mintitle margin-t-10">
+						近24小时涨跌幅
+					</view>
+				</view>
+			</view>
+		</view>
+
+
+
+
 		<!-- #ifdef H5 -->
 		<view class="btm">
 			<a href="https://beian.miit.gov.cn" class="a-pm">备案编号:浙ICP备2022017146号 </a>
@@ -49,6 +81,9 @@
 		loadIndexs,
 		store_list
 	} from '@/api/index.js';
+	import {
+		getTicket
+	} from '@/api/quick.js';
 	import {
 		mapState,
 		mapMutations
@@ -62,13 +97,28 @@
 				swiperLength: 0,
 				carouselList: [], //轮播图列表
 				text: ['双模式 双系统  开创第三代新零售'],
+				ticketBase:{}
 			};
 		},
 		onShow() {
 			this.loadData();
+			this.getTicket()
 		},
 		methods: {
 			...mapMutations(['setLat', 'setLon', 'setChoose']),
+			getTicket(){
+				getTicket()
+				.then(
+				(res) => {
+					console.log(res);
+					this.ticketBase = res.data.v;
+				}
+				).catch(
+				(err) => {
+					console.log(err);
+				}
+				)
+			},
 			loadData() {
 				loadIndexs({})
 					.then(({
@@ -107,6 +157,54 @@
 </script>
 
 <style lang="scss">
+	.box {
+		border-radius: 10rpx;
+		line-height: 1;
+		margin: 0 30rpx;
+		background-image: url("../../static/img/indwxWp.png");
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		.titlebox {
+			padding: 10rpx 30rpx;
+			font-weight: bold;
+			font-size: $font-base;
+			border-bottom: 1px solid #FFF;
+		}
+
+		.nametip {
+			width: 50rpx;
+			height: 50rpx;
+		}
+
+		.item {
+			padding-top: 100rpx;
+			padding-left: 60rpx;
+			padding-right: 90rpx;
+			padding-bottom: 60rpx;
+		}
+
+		.item-box {
+			font-weight: bold;
+
+			.num {
+				text-align: center;
+				color: $color-red;
+				&.righttext{
+					font-size: 50rpx;
+				}
+			}
+
+			.title {
+				font-size: $font-lg;
+				color: $font-color-dark;
+			}
+			.mintitle{
+				font-size: $font-sm;
+				color: $font-color-light;
+			}
+		}
+	}
+
 	page,
 	.center {
 		min-height: 100%;
@@ -245,6 +343,7 @@
 			border-radius: 14rpx;
 		}
 	}
+
 	.btm {
 		position: fixed;
 		bottom: 0;
@@ -252,6 +351,7 @@
 		height: 50rpx;
 		line-height: 50rpx;
 		text-align: center;
+
 		.a-pm {
 			text-decoration: none;
 			width: 100%;

+ 15 - 6
pages/order/evaluate.vue

@@ -62,7 +62,8 @@ export default {
 			cloudimgList: [],
 			rateValue1: '', //商品质量
 			rateValue2: '', //服务态度
-			imgCount: 6 //最多支持9张上传,可以修改
+			imgCount: 6 ,//最多支持9张上传,可以修改
+			upFileLoding:false
 		};
 	},
 	onLoad(option) {
@@ -94,9 +95,15 @@ export default {
 		},
 		//单张上传图片
 		scImg() {
-			let obj = this;
-			console.log(obj.imgCount, 11);
-			if (obj.imgCount == 0) {
+			const that = this;
+			if (that.upFileLoding) {
+				return
+			}
+			that.upFileLoding = true;
+			setTimeout(()=>{
+				that.upFileLoding = false;
+			},1000);
+			if (that.imgCount == 0) {
 				uni.showToast({
 					title: '最多添加6张图片',
 					icon: 'none'
@@ -107,8 +114,10 @@ export default {
 				file: ''
 			})
 				.then(e => {
-					obj.imgList = [...obj.imgList, ...e];
-					obj.imgCount = 10 - obj.imgList.length;
+					that.imgList = [...that.imgList, ...e];
+					that.imgCount = 10 - that.imgList.length;
+				}).catch((err) => {
+					console.log(err);
 				})
 		},
 		//提交评论

+ 12 - 1
pages/set/userinfo.vue

@@ -2,7 +2,7 @@
 	<view class="content">
 		<view class="row1">
 			<text class="tit">头像</text>
-			<view class="background-img" @click.stop="imgsub"><image class="background-img" v-model="userInfo.avatar" :src="userInfo.avatar" mode="aspectFill"></image></view>
+			<view class="background-img" @click.stop="imgsub()"><image class="background-img" v-model="userInfo.avatar" :src="userInfo.avatar" mode="aspectFill"></image></view>
 		</view>
 		<view class="row">
 			<text class="tit">昵称</text>
@@ -40,6 +40,7 @@ export default {
 		return{
 			show:false,
 			password: '',
+			upFileLoding:false,
 		}
 	},
 	onLoad() {
@@ -51,10 +52,20 @@ export default {
 	methods: {
 		...mapMutations('user',['logout']),
 		imgsub() {
+			const that = this;
+			if (that.upFileLoding) {
+				return
+			}
+			that.upFileLoding = true;
+			setTimeout(()=>{
+				that.upFileLoding = false;
+			},1000);
 			upload({
 				filename: ''
 			}).then(data => {
 				this.userInfo.avatar = data[0].url;
+			}).catch((err) => {
+				console.log(err);
 			})
 		},
 		confirm() {

+ 14 - 3
pages/user/approve.vue

@@ -2,12 +2,12 @@
 	<view class="content">
 		<view class="bgimg"><image class="img" src="https://zhibo.liuniu946.com/img/bgRz.png" mode="widthFix"></image></view>
 		<u-form class="user" :model="form" ref="uForm">
-			<u-form-item label="姓名"><u-input v-model="form.name" placeholder="请输入真实姓名" /></u-form-item>
+			<u-form-item label="姓名" label-width="150"><u-input v-model="form.name" placeholder="请输入真实姓名" /></u-form-item>
 			<u-form-item label="身份证号" label-width="150"><u-input placeholder="请输入身份证号" v-model="form.card" /></u-form-item>
 		</u-form>
 		<view class="userBox">
 			<view class="title">上传身份证照片</view>
-			<view class="imgUp" @click.stop="upImg"><image class="img" :src="form.img || '../../static/img/sfz.png'" mode="scaleToFill"></image></view>
+			<view class="imgUp" @click.stop="upImg()"><image class="img" :src="form.img || '../../static/img/sfz.png'" mode="scaleToFill"></image></view>
 		</view>
 		<button class="add-btn" @click="pushData('add')">提交</button>
 	</view>
@@ -24,17 +24,28 @@ export default {
 				name: '',
 				card: '',
 				img: ''
-			}
+			},
+			upFileLoding:false,
+			
 		};
 	},
 	onLoad(option) {},
 	methods: {
 		upImg(e) {
 			const that = this;
+			if(that.upFileLoding){
+				return
+			}
+			that.upFileLoding = true;
+			setTimeout(()=>{
+				that.upFileLoding = false;
+			},1000);
 			upload({
 				filename: ''
 			}).then(data => {
 				this.form.img = data[0].url;
+			}).catch((err)=>{
+				console.log(err);
 			})
 		},
 		ToIndex() {

+ 12 - 1
pages/user/gzsq.vue

@@ -75,6 +75,7 @@
 				address:'',//店铺地址
 				yyzz:'',//营业执照
 				imageshop:'',//门店照片
+				upFileLoding:false,
 			}
 		},
 		methods: {
@@ -115,10 +116,20 @@
 				})
 			},
 			uploads(type) {
+				const that = this;
+				if (that.upFileLoding) {
+					return
+				}
+				that.upFileLoding = true;
+				setTimeout(()=>{
+					that.upFileLoding = false;
+				},1000);
 				upload({
 					filename: ''
 				}).then(data => {
-					this[type] = data[0].url;
+					that[type] = data[0].url;
+				}).catch((err) => {
+					console.log(err);
 				})
 			}
 		}

BIN
static/img/indwxWp.png


+ 169 - 0
uni_modules/lime-echart/changelog.md

@@ -0,0 +1,169 @@
+## 0.8.1(2023-08-24)
+- fix: app 的`touch`事件为`object` 导致无法显示 `tooltip`
+## 0.8.0(2023-08-22)
+- fix: 离屏 报错问题
+- fix: 微信小程序PC无法使用事件
+- chore: 更新文档
+## 0.7.9(2023-07-29)
+- chore: 更新文档
+## 0.7.8(2023-07-29)
+- fix: 离屏 报错问题
+## 0.7.7(2023-07-27)
+- chore: 更新文档
+- chore: lime-echart 里的示例使用自定tooltips
+- feat: 对支持离屏的使用离屏创建(微信、字节、支付宝)
+## 0.7.6(2023-06-30)
+- fix: vue3 报`width`的错
+## 0.7.5(2023-05-25)
+- chore: 更新文档 和 demo, 使用`lime-echart`这个标签即可查看示例
+## 0.7.4(2023-05-22)
+- chore: 增加关于钉钉小程序上传时提示安全问题的说明及修改建议
+## 0.7.3(2023-05-16)
+- chore: 更新 vue3 非微信小程序平台可能缺少`wx`的说明
+## 0.7.2(2023-05-16)
+- chore: 更新 vue3 非微信小程序平台的可以缺少`wx`的说明
+## 0.7.1(2023-04-26)
+- chore: 更新demo,使用`lime-echart`这个标签即可查看示例
+- chore:微信小程序的`tooltip`文字有阴影,怀疑是微信的锅,临时解决方法是`tooltip.shadowBlur = 0`
+## 0.7.0(2023-04-24)
+- fix: 修复`setAttribute is not a function`
+## 0.6.9(2023-04-15)
+- chore: 更新文档,vue3请使用echarts esm的包
+## 0.6.8(2023-03-22)
+- feat: mac pc无法使用canvas 2d
+## 0.6.7(2023-03-17)
+- feat: 更新文档
+## 0.6.6(2023-03-17)
+- feat: 微信小程序PC已经支持canvas 2d,故去掉判断PC
+## 0.6.5(2022-11-03)
+- fix: 某些手机touches为对象,导致无法交互。
+## 0.6.4(2022-10-28)
+- fix: 优化点击事件的触发条件
+## 0.6.3(2022-10-26)
+- fix: 修复 dataZoom 拖动问题
+## 0.6.2(2022-10-23)
+- fix: 修复 飞书小程序 尺寸问题
+## 0.6.1(2022-10-19)
+- fix: 修复 PC mousewheel 事件 鼠标位置不准确的BUG,不兼容火狐!
+- feat: showLoading 增加传参
+## 0.6.0(2022-09-16)
+- feat: 增加PC的mousewheel事件
+## 0.5.4(2022-09-16)
+- fix: 修复 nvue 动态数据不显示问题
+## 0.5.3(2022-09-16)
+- feat: 增加enableHover属性, 在PC端时当鼠标进入显示tooltip,不必按下。
+- chore: 更新文档
+## 0.5.2(2022-09-16)
+- feat: 增加enableHover属性, 在PC端时当鼠标进入显示tooltip,不必按下。
+## 0.5.1(2022-09-16)
+- fix: 修复nvue报错
+## 0.5.0(2022-09-15)
+- feat: init(echarts, theme?:string, opts?:{}, callback: function(chart))
+## 0.4.8(2022-09-11)
+- feat: 增加 @finished
+## 0.4.7(2022-08-24)
+- chore: 去掉 stylus
+## 0.4.6(2022-08-24)
+- feat: 增加 beforeDelay
+## 0.4.5(2022-08-12)
+- chore: 更新文档
+## 0.4.4(2022-08-12)
+- fix: 修复 resize 无参数时报错
+## 0.4.3(2022-08-07)
+# 评论有说本插件对新手不友好,让我做不好就不要发出来。 还有的说跟官网一样,发出来做什么,给我整无语了。
+# 所以在此提醒一下准备要下载的你,如果你从未使用过 echarts 请不要下载 或 谨慎下载。
+# 如果你确认要下载,麻烦看完文档。还有请注意插件是让echarts在uniapp能运行,API 配置请自行去官网查阅!
+# 如果你不会echarts 但又需要图表,市场上有个很优秀的图表插件 uchart 你可以去使用这款插件,uchart的作者人很好,也热情。
+# 每个人都有自己的本职工作,如果你能力强可以自行兼容,如果使用了他人的插件也麻烦尊重他人的成果和劳动时间。谢谢。
+# 为了心情愉悦,本人已经使用插件屏蔽差评。
+- chore: 更新文档
+## 0.4.2(2022-07-20)
+- feat: 增加 resize
+## 0.4.1(2022-06-07)
+- fix: 修复 canvasToTempFilePath 不生效问题
+## 0.4.0(2022-06-04)
+- chore 为了词云 增加一个canvas 标签
+- 词云下载地址[echart-wordcloud](https://ext.dcloud.net.cn/plugin?id=8430)
+## 0.3.9(2022-06-02)
+- chore: 更新文档
+- tips: lines 不支持 `trailLength`
+## 0.3.8(2022-05-31)
+- fix: 修复 因mouse事件冲突tooltip跳动问题
+## 0.3.7(2022-05-26)
+- chore: 更新文档
+- chore: 设置默认宽高300px
+- fix: 修复 vue3 微信小程序 拖影BUG
+- chore: 支持PC
+## 0.3.5(2022-04-28)
+- chore: 更新使用方式
+- 🔔 必须使用hbuilderx 3.4.8-alpha以上
+## 0.3.4(2021-08-03)
+- chore: 增加 setOption的参数值
+## 0.3.3(2021-07-22)
+- fix: 修复 径向渐变报错的问题
+## 0.3.2(2021-07-09)
+- chore: 统一命名规范,无须主动引入组件
+## [代码示例站点1](https://limeui.qcoon.cn/#/echart-example)
+## [代码示例站点2](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.3.1(2021-06-21)
+- fix: 修复 app-nvue ios is-enable 无效的问题
+## [代码示例站点1](https://limeui.qcoon.cn/#/echart-example)
+## [代码示例站点2](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.3.0(2021-06-14)
+- fix: 修复 头条系小程序 2d 报 JSON.stringify 的问题
+- 目前 头条系小程序 2d 无法在开发工具上预览,划动图表页面无法滚动,axisLabel 字体颜色无法更改,建议使用非2d。
+## 0.2.9(2021-06-06)
+- fix: 修复 头条系小程序 2d 放大的BUG 
+- 头条系小程序 2d 无法在开发工具上预览,也存在划动图表页面无法滚动的问题。
+## [代码示例:http://liangei.gitee.io/limeui/#/echart-example](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.2.8(2021-05-19)
+- fix: 修复 微信小程序 PC 显示过大的问题
+## 0.2.7(2021-05-19)
+- fix: 修复 微信小程序 PC 不显示问题
+## [代码示例:http://liangei.gitee.io/limeui/#/echart-example](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.2.6(2021-05-14)
+- feat: 支持 `image`
+- feat: props 增加 `ec.clear`,更新时是否先删除图表样式 
+- feat: props 增加 `isDisableScroll` ,触摸图表时是否禁止页面滚动
+- feat: props 增加 `webviewStyles` ,webview 的样式, 仅nvue有效
+## 0.2.5(2021-05-13)
+- docs: 插件用到了css 预编译器 [stylus](https://ext.dcloud.net.cn/plugin?name=compile-stylus) 请安装它
+## 0.2.4(2021-05-12)
+- fix: 修复 百度平台 多个图表ctx 和 渐变色 bug
+- ## [代码示例:http://liangei.gitee.io/limeui/#/echart-example](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.2.3(2021-05-10)
+- feat: 增加 `canvasToTempFilePath` 方法,用于生成图片
+```js
+this.$refs.chart.canvasToTempFilePath({success: (res) => {
+	console.log('tempFilePath:', res.tempFilePath)
+}})
+```
+## 0.2.2(2021-05-10)
+- feat: 增加 `dispose` 方法,用于销毁实例
+- feat: 增加 `isClickable` 是否派发点击
+- feat: 实验性的支持 `nvue` 使用要慎重考虑
+- ## [代码示例:http://liangei.gitee.io/limeui/#/echart-example](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.2.1(2021-05-06)
+- fix:修复 微信小程序 json 报错
+- chore: `reset` 更改为 `setChart`
+- feat: 增加 `isEnable` 开启初始化 启用这个后 无须再使用`init`方法
+```html
+<l-echart ref="chart" is-enable />
+```
+```js
+// 显示加载
+this.$refs.chart.showLoading()
+// 使用实例回调
+this.$refs.chart.setChart(chart => ...code)
+// 直接设置图表配置
+this.$refs.chart.setOption(data)
+```
+## 0.2.0(2021-05-05)
+- fix:修复 头条 百度 偏移的问题
+- docs: 更新文档
+## [代码示例:http://liangei.gitee.io/limeui/#/echart-example](http://liangei.gitee.io/limeui/#/echart-example)
+## 0.1.0(2021-05-02)
+- chore:  第一次上传,基本全端兼容,使用方法与官网一致。
+- 已知BUG:非2d 无法使用背景色,已反馈官方
+- 已知BUG:头条 百度 有许些偏移
+- 后期计划:兼容nvue

+ 385 - 0
uni_modules/lime-echart/components/l-echart/canvas.js

@@ -0,0 +1,385 @@
+const cacheChart = {}
+const fontSizeReg = /([\d\.]+)px/;
+class EventEmit {
+	constructor() {
+		this.__events = {};
+	}
+	on(type, listener) {
+		if (!type || !listener) {
+			return;
+		}
+		const events = this.__events[type] || [];
+		events.push(listener);
+		this.__events[type] = events;
+	}
+	emit(type, e) {
+		if (type.constructor === Object) {
+			e = type;
+			type = e && e.type;
+		}
+		if (!type) {
+			return;
+		}
+		const events = this.__events[type];
+		if (!events || !events.length) {
+			return;
+		}
+		events.forEach((listener) => {
+			listener.call(this, e);
+		});
+	}
+	off(type, listener) {
+		const __events = this.__events;
+		const events = __events[type];
+		if (!events || !events.length) {
+			return;
+		}
+		if (!listener) {
+			delete __events[type];
+			return;
+		}
+		for (let i = 0, len = events.length; i < len; i++) {
+			if (events[i] === listener) {
+				events.splice(i, 1);
+				i--;
+			}
+		}
+	}
+}
+class Image {
+	constructor() {
+		this.currentSrc = null
+		this.naturalHeight = 0
+		this.naturalWidth = 0
+		this.width = 0
+		this.height = 0
+		this.tagName = 'IMG'
+	}
+	set src(src) {
+		this.currentSrc = src
+		uni.getImageInfo({
+			src,
+			success: (res) => {
+				this.naturalWidth = this.width = res.width
+				this.naturalHeight = this.height = res.height
+				this.onload()
+			},
+			fail: () => {
+				this.onerror()
+			}
+		})
+	}
+	get src() {
+		return this.currentSrc
+	}
+}
+class OffscreenCanvas {
+	constructor(ctx, com, canvasId) {
+		this.tagName = 'canvas'
+		this.com = com
+		this.canvasId = canvasId
+		this.ctx = ctx
+	}
+	set width(w) {
+		this.com.offscreenWidth = w
+	}
+	set height(h) {
+		this.com.offscreenHeight = h
+	}
+	get width() {
+		return this.com.offscreenWidth || 0
+	}
+	get height() {
+		return this.com.offscreenHeight || 0
+	}
+	getContext(type) {
+		return this.ctx
+	}
+	getImageData() {
+		return new Promise((resolve, reject) => {
+			this.com.$nextTick(() => {
+				uni.canvasGetImageData({
+					x:0,
+					y:0,
+					width: this.com.offscreenWidth,
+					height: this.com.offscreenHeight,
+					canvasId: this.canvasId,
+					success: (res) => {
+						resolve(res)
+					},
+					fail: (err) => {
+						reject(err)
+					},
+				}, this.com)
+			})
+		})
+	}
+}
+export class Canvas {
+	constructor(ctx, com, isNew, canvasNode={}) {
+		cacheChart[com.canvasId] = {ctx}
+		this.canvasId = com.canvasId;
+		this.chart = null;
+		this.isNew = isNew
+		this.tagName = 'canvas'
+		this.canvasNode = canvasNode;
+		this.com = com;
+		if (!isNew) {
+			this._initStyle(ctx)
+		}
+		this._initEvent();
+		this._ee = new EventEmit()
+	}
+	getContext(type) {
+		if (type === '2d') {
+			return this.ctx;
+		}
+	}
+	setAttribute(key, value) {
+		if(key === 'aria-label') {
+			this.com['ariaLabel'] = value
+		}
+	}
+	setChart(chart) {
+		this.chart = chart;
+	}
+	createOffscreenCanvas(param){
+		if(!this.children) {
+			this.com.isOffscreenCanvas = true
+			this.com.offscreenWidth = param.width||300
+			this.com.offscreenHeight = param.height||300
+			const com = this.com
+			const canvasId = this.com.offscreenCanvasId
+			const context = uni.createCanvasContext(canvasId, this.com)
+			this._initStyle(context)
+			this.children = new OffscreenCanvas(context, com, canvasId)
+		} 
+		return this.children
+	}
+	appendChild(child) {
+		console.log('child', child)
+	}
+	dispatchEvent(type, e) {
+		if(typeof type == 'object') {
+			this._ee.emit(type.type, type);
+		} else {
+			this._ee.emit(type, e);
+		}
+		return true
+	}
+	attachEvent() {
+	}
+	detachEvent() {
+	}
+	addEventListener(type, listener) {
+		this._ee.on(type, listener)
+	}
+	removeEventListener(type, listener) {
+		this._ee.off(type, listener)
+	}
+	_initCanvas(zrender, ctx) {
+		// zrender.util.getContext = function() {
+		// 	return ctx;
+		// };
+		// zrender.util.$override('measureText', function(text, font) {
+		// 	ctx.font = font || '12px sans-serif';
+		// 	return ctx.measureText(text, font);
+		// });
+	}
+	_initStyle(ctx, child) {
+		const styles = [
+			'fillStyle',
+			'strokeStyle',
+			'fontSize',
+			'globalAlpha',
+			'opacity',
+			'textAlign',
+			'textBaseline',
+			'shadow',
+			'lineWidth',
+			'lineCap',
+			'lineJoin',
+			'lineDash',
+			'miterLimit',
+			// 'font'
+		];
+		const colorReg = /#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])\b/g;
+		styles.forEach(style => {
+			Object.defineProperty(ctx, style, {
+				set: value => {
+					// if (style === 'font' && fontSizeReg.test(value)) {
+					// 	const match = fontSizeReg.exec(value);
+					// 	ctx.setFontSize(match[1]);
+					// 	return;
+					// }
+					if (style === 'opacity') {
+						ctx.setGlobalAlpha(value)
+						return;
+					}
+					if (style !== 'fillStyle' && style !== 'strokeStyle' || value !== 'none' && value !== null) {
+						// #ifdef H5 || APP-PLUS || MP-BAIDU
+						if(typeof value == 'object') {
+							if (value.hasOwnProperty('colorStop') || value.hasOwnProperty('colors')) {
+								ctx['set' + style.charAt(0).toUpperCase() + style.slice(1)](value);
+							}
+							return
+						} 
+						// #endif
+						// #ifdef MP-TOUTIAO
+						if(colorReg.test(value)) {
+							value = value.replace(colorReg, '#$1$1$2$2$3$3')
+						}
+						// #endif
+						ctx['set' + style.charAt(0).toUpperCase() + style.slice(1)](value);
+					}
+				}
+			});
+		});
+		if(!this.isNew && !child) {
+			ctx.uniDrawImage = ctx.drawImage
+			ctx.drawImage = (...a) => {
+				a[0] = a[0].src
+				ctx.uniDrawImage(...a)
+			}
+		}
+		if(!ctx.createRadialGradient) {
+			ctx.createRadialGradient = function() {
+				return ctx.createCircularGradient(...[...arguments].slice(-3))
+			};
+		}
+		// 字节不支持
+		if (!ctx.strokeText) {
+			ctx.strokeText = (...a) => {
+				ctx.fillText(...a)
+			}
+		}
+		// 钉钉不支持 
+		if (!ctx.measureText) {
+			const strLen = (str) => {
+				let len = 0;
+				for (let i = 0; i < str.length; i++) {
+					if (str.charCodeAt(i) > 0 && str.charCodeAt(i) < 128) {
+						len++;
+					} else {
+						len += 2;
+					}
+				}
+				return len;
+			}
+			ctx.measureText = (text, font) => {
+				let fontSize = ctx?.state?.fontSize || 12;
+				if (font) {
+					fontSize = parseInt(font.match(/([\d\.]+)px/)[1])
+				}
+				fontSize /= 2;
+				let isBold = fontSize >= 16;
+				const widthFactor = isBold ? 1.3 : 1;
+				return {
+					width: strLen(text) * fontSize * widthFactor
+				};
+			}
+		}
+	}
+
+	_initEvent(e) {
+		this.event = {};
+		const eventNames = [{
+			wxName: 'touchStart',
+			ecName: 'mousedown'
+		}, {
+			wxName: 'touchMove',
+			ecName: 'mousemove'
+		}, {
+			wxName: 'touchEnd',
+			ecName: 'mouseup'
+		}, {
+			wxName: 'touchEnd',
+			ecName: 'click'
+		}];
+
+		eventNames.forEach(name => {
+			this.event[name.wxName] = e => {
+				const touch = e.touches[0];
+				this.chart.getZr().handler.dispatch(name.ecName, {
+					zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+					zrY: name.wxName === 'tap' ? touch.clientY : touch.y
+				});
+			};
+		});
+	}
+
+	set width(w) {
+		this.canvasNode.width = w
+	}
+	set height(h) {
+		this.canvasNode.height = h
+	}
+
+	get width() {
+		return this.canvasNode.width || 0
+	}
+	get height() {
+		return this.canvasNode.height || 0
+	}
+	get ctx() {
+		return cacheChart[this.canvasId]['ctx'] || null
+	}
+	set chart(chart) {
+		cacheChart[this.canvasId]['chart'] = chart
+	}
+	get chart() {
+		return cacheChart[this.canvasId]['chart'] || null
+	}
+}
+
+export function dispatch(name, {x,y, wheelDelta}) {
+	this.dispatch(name, {
+		zrX: x,
+		zrY: y,
+		zrDelta: wheelDelta,
+		preventDefault: () => {},
+		stopPropagation: () =>{}
+	});
+}
+export function setCanvasCreator(echarts, {canvas, node}) {
+	// echarts.setCanvasCreator(() => canvas);
+	if(echarts && !echarts.registerPreprocessor) {
+		return console.warn('echarts 版本不对或未传入echarts,vue3请使用esm格式')
+	}
+	echarts.registerPreprocessor(option => {
+		if (option && option.series) {
+			if (option.series.length > 0) {
+				option.series.forEach(series => {
+					series.progressive = 0;
+				});
+			} else if (typeof option.series === 'object') {
+				option.series.progressive = 0;
+			}
+		}
+	});
+	function loadImage(src, onload, onerror) {
+		let img = null
+		if(node && node.createImage) {
+			img = node.createImage()
+			img.onload = onload.bind(img);
+			img.onerror = onerror.bind(img);
+			img.src = src;
+			return img
+		} else {
+			img = new Image()
+			img.onload = onload.bind(img)
+			img.onerror = onerror.bind(img);
+			img.src = src
+			return img
+		}
+	}
+	if(echarts.setPlatformAPI) {
+		echarts.setPlatformAPI({
+			loadImage: canvas.setChart ? loadImage : null,
+			createCanvas(){
+				const key = 'createOffscreenCanvas'
+				return uni.canIUse(key) && uni[key] ? uni[key]({type: '2d'}) : canvas
+			}
+		})
+	}
+}

+ 502 - 0
uni_modules/lime-echart/components/l-echart/l-echart.vue

@@ -0,0 +1,502 @@
+<template>
+	<view class="lime-echart" :style="customStyle" v-if="canvasId" ref="limeEchart" :aria-label="ariaLabel">
+		<!-- #ifndef APP-NVUE -->
+		<canvas
+			class="lime-echart__canvas"
+			v-if="use2dCanvas"
+			type="2d"
+			:id="canvasId"
+			:style="canvasStyle"
+			:disable-scroll="isDisableScroll"
+			@touchstart="touchStart"
+			@touchmove="touchMove"
+			@touchend="touchEnd"
+		/>
+		<!-- <canvas
+			class="lime-echart__canvas"
+			v-else-if="isPC"
+			:style="canvasStyle"
+			:id="canvasId"
+			:canvas-id="canvasId"
+			:disable-scroll="isDisableScroll"
+			@mousedown="touchStart"
+			@mousemove="touchMove"
+			@mouseup="touchEnd"
+		/> -->
+		<canvas
+			class="lime-echart__canvas"
+			v-else
+			:width="nodeWidth"
+			:height="nodeHeight"
+			:style="canvasStyle"
+			:canvas-id="canvasId"
+			:id="canvasId"
+			:disable-scroll="isDisableScroll"
+			@touchstart="touchStart"
+			@touchmove="touchMove"
+			@touchend="touchEnd"
+		/>
+		<view class="lime-echart__mask"
+			v-if="isPC"
+			@mousedown="touchStart"
+			@mousemove="touchMove"
+			@mouseup="touchEnd"
+			@touchstart="touchStart"
+			@touchmove="touchMove"
+			@touchend="touchEnd">
+		</view>
+		<canvas v-if="isOffscreenCanvas" :style="offscreenStyle" :canvas-id="offscreenCanvasId"></canvas>
+		<!-- #endif -->
+		<!-- #ifdef APP-NVUE -->
+		<web-view
+			class="lime-echart__canvas"
+			:id="canvasId"
+			:style="canvasStyle"
+			:webview-styles="webviewStyles"
+			ref="webview"
+			src="/uni_modules/lime-echart/static/index.html"
+			@pagefinish="finished = true"
+			@onPostMessage="onMessage"
+		></web-view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+// #ifdef VUE3
+// #ifdef APP-PLUS
+global = {}
+// #endif
+// #endif
+// #ifndef APP-NVUE
+import {Canvas, setCanvasCreator, dispatch} from './canvas';
+import {wrapTouch, convertTouchesToArray, devicePixelRatio ,sleep, canIUseCanvas2d, getRect} from './utils';
+// #endif
+// #ifdef APP-NVUE
+import { base64ToPath, sleep } from './utils';
+import {Echarts} from './nvue'
+// #endif
+const charts = {}
+const echartsObj = {}
+export default {
+	name: 'lime-echart',
+	props: {
+		// #ifdef MP-WEIXIN || MP-TOUTIAO
+		type: {
+			type: String,
+			default: '2d'
+		},
+		// #endif
+		// #ifdef APP-NVUE
+		webviewStyles: Object,
+		// hybrid: Boolean,
+		// #endif
+		customStyle: String,
+		isDisableScroll: Boolean,
+		isClickable: {
+			type: Boolean,
+			default: true
+		},
+		enableHover: Boolean,
+		beforeDelay: {
+			type: Number,
+			default: 30
+		}
+	},
+	data() {
+		return {
+			// #ifdef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+			use2dCanvas: true,
+			// #endif
+			// #ifndef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+			use2dCanvas: false,
+			// #endif
+			ariaLabel: '图表',
+			width: null,
+			height: null,
+			nodeWidth: null,
+			nodeHeight: null,
+			// canvasNode: null,
+			config: {},
+			inited: false,
+			finished: false,
+			file: '',
+			platform: '',
+			isPC: false,
+			isDown: false,
+			isOffscreenCanvas: false,
+			offscreenWidth: 0,
+			offscreenHeight: 0
+		};
+	},
+	computed: {
+		canvasId() {
+			return `lime-echart${this._ && this._.uid || this._uid}`
+		},
+		offscreenCanvasId() {
+			return `${this.canvasId}_offscreen`
+		},
+		offscreenStyle() {
+			return `width:${this.offscreenWidth}px;height: ${this.offscreenHeight}px; position: fixed; left: 99999px; background: red`
+		},
+		canvasStyle() {
+			return  this.width && this.height ? ('width:' + this.width + 'px;height:' + this.height + 'px') : ''
+		}
+	},
+	// #ifndef VUE3
+	beforeDestroy() {
+		this.clear()
+		this.dispose()
+		// #ifdef H5
+		if(this.isPC) {
+			document.removeEventListener('mousewheel', this.mousewheel)
+		}
+		// #endif
+	},
+	// #endif
+	// #ifdef VUE3
+	unmounted() {
+		this.clear()
+		this.dispose()
+		// #ifdef H5
+		if(this.isPC) {
+			document.removeEventListener('mousewheel', this.mousewheel)
+		}
+		// #endif
+	},
+	// #endif
+	created() {
+		// #ifdef H5
+		if(!('ontouchstart' in window)) {
+			this.isPC = true
+			document.addEventListener('mousewheel', this.mousewheel)
+		}
+		// #endif
+		// #ifdef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+		const { platform } = uni.getSystemInfoSync();
+		this.isPC = /windows/i.test(platform)
+		// #endif
+		this.use2dCanvas = this.type === '2d' && canIUseCanvas2d()
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.$emit('finished')
+		})
+	},
+	methods: {
+		// #ifdef APP-NVUE
+		onMessage(e) {
+			const res = e?.detail?.data[0] || null;
+			if (res?.event) {
+				if(res.event === 'inited') {
+					this.inited = true
+				}
+				this.$emit(res.event, JSON.parse(res.data));
+			} else if(res?.file){
+				this.file = res.data
+			} else if(!res[0] && JSON.stringify(res[0]) != '{}'){
+				console.error(res);
+			} else {
+				console.log(...res)
+			}
+		},
+		// #endif
+		setChart(callback) {
+			if(!this.chart) {
+				console.warn(`组件还未初始化,请先使用 init`)
+				return
+			}
+			if(typeof callback === 'function' && this.chart) {
+				callback(this.chart);
+			}
+			// #ifdef APP-NVUE
+			if(typeof callback === 'function') {
+				this.$refs.webview.evalJs(`setChart(${JSON.stringify(callback.toString())}, ${JSON.stringify(this.chart.options)})`);
+			}
+			// #endif
+		},
+		setOption() {
+			if (!this.chart || !this.chart.setOption) {
+				console.warn(`组件还未初始化,请先使用 init`)
+				return
+			}
+			this.chart.setOption(...arguments);
+		},
+		showLoading() {
+			if(this.chart) {
+				this.chart.showLoading(...arguments)
+			}
+		},
+		hideLoading() {
+			if(this.chart) {
+				this.chart.hideLoading()
+			}
+		},
+		clear() {
+			if(this.chart) {
+				this.chart.clear()
+			}
+		},
+		dispose() {
+			if(this.chart) {
+				this.chart.dispose()
+			}
+		},
+		resize(size) {
+			if(size && size.width && size.height) {
+				this.height = size.height
+				this.width = size.width
+				if(this.chart) {this.chart.resize(size)}
+			} else {
+				this.$nextTick(() => {
+					uni.createSelectorQuery()
+						.in(this)
+						.select(`.lime-echart`)
+						.boundingClientRect()
+						.exec(res => {
+							if (res) {
+								let { width, height } = res[0];
+								this.width = width = width || 300;
+								this.height = height = height || 300;
+								this.chart.resize({width, height})
+							}
+						});
+				})
+				
+			}
+			
+		},
+		canvasToTempFilePath(args = {}) {
+			// #ifndef APP-NVUE
+			const { use2dCanvas, canvasId } = this;
+			return new Promise((resolve, reject) => {
+				const copyArgs = Object.assign({
+					canvasId,
+					success: resolve,
+					fail: reject
+				}, args);
+				if (use2dCanvas) {
+					delete copyArgs.canvasId;
+					copyArgs.canvas = this.canvasNode;
+				}
+				uni.canvasToTempFilePath(copyArgs, this);
+			});
+			// #endif
+			// #ifdef APP-NVUE
+			this.file = ''
+			this.$refs.webview.evalJs(`canvasToTempFilePath()`);
+			return new Promise((resolve, reject) => {
+				this.$watch('file', async (file) => {
+					if(file) {
+						const tempFilePath = await base64ToPath(file)
+						resolve(args.success({tempFilePath}))
+					} else {
+						reject(args.fail({error: ``}))
+					}
+				})
+			})
+			// #endif
+		},
+		async init(echarts, ...args) {
+			// #ifndef APP-NVUE
+			if(arguments && arguments.length < 1) {
+				console.error('缺少参数:init(echarts, theme?:string, opts?: object, callback?: function)')
+				return
+			}
+			// #endif
+			let theme=null,opts={},callback;
+			
+			Array.from(arguments).forEach(item => {
+				if(typeof item === 'function') {
+					callback = item
+				}
+				if(['string'].includes(typeof item)) {
+					theme = item
+				}
+				if(typeof item === 'object') {
+					opts = item
+				}
+			})
+			
+			if(this.beforeDelay) {
+				await sleep(this.beforeDelay)
+			}
+			let config = await this.getContext();
+			// #ifndef APP-NVUE
+			setCanvasCreator(echarts, config)
+			this.chart = echarts.init(config.canvas, theme, Object.assign({}, config, opts))
+			if(typeof callback === 'function') {
+				callback(this.chart)
+			} else {
+				return this.chart
+			}
+			// #endif
+			// #ifdef APP-NVUE
+			this.chart = new Echarts(this.$refs.webview)
+			this.$refs.webview.evalJs(`init(null, null, ${JSON.stringify(opts)}, ${theme})`)
+			if(callback) {
+				callback(this.chart)
+			} else {
+				return this.chart
+			}
+			// #endif
+		},
+		getContext() {
+			// #ifdef APP-NVUE
+			if(this.finished) {
+				return Promise.resolve(this.finished)
+			}
+			return new Promise(resolve => {
+				this.$watch('finished', (val) => {
+					if(val) {
+						resolve(this.finished)
+					}
+				})
+			})
+			// #endif
+			// #ifndef APP-NVUE
+			return getRect(`#${this.canvasId}`, {context: this, type: this.use2dCanvas ? 'fields': 'boundingClientRect'}).then(res => {
+				if(res) {
+					let dpr = devicePixelRatio
+					let {width, height, node} = res
+					let canvas;
+					this.width = width = width || 300;
+					this.height = height = height || 300;
+					if(node) {
+						const ctx = node.getContext('2d');
+						canvas = new Canvas(ctx, this, true, node);
+						this.canvasNode = node
+					} else {
+						// #ifdef MP-TOUTIAO
+						dpr = !this.isPC ? devicePixelRatio : 1// 1.25
+						// #endif
+						// #ifndef MP-ALIPAY || MP-TOUTIAO
+						dpr = this.isPC ? devicePixelRatio : 1
+						// #endif
+						// #ifdef MP-ALIPAY || MP-LARK
+						dpr = devicePixelRatio
+						// #endif
+						this.rect = res
+						this.nodeWidth = width * dpr;
+						this.nodeHeight = height * dpr;
+						const ctx = uni.createCanvasContext(this.canvasId, this);
+						canvas =  new Canvas(ctx, this, false);
+					}
+					return { canvas, width, height, devicePixelRatio: dpr, node };
+				} else {
+					return {}
+				}
+			})
+			// #endif
+		},
+		// #ifndef APP-NVUE
+		getRelative(e, touches) {
+			let { clientX, clientY } = e
+			if(!(clientX && clientY) && touches && touches[0]) {
+				clientX = touches[0].clientX
+				clientY = touches[0].clientY
+			}
+			return {x: clientX - this.rect.left, y: clientY - this.rect.top, wheelDelta: e.wheelDelta || 0}
+		},
+		getTouch(e, touches) {
+			const {x} = touches && touches[0] || {}
+			return x ? touches[0] : this.getRelative(e, touches);
+		},
+		touchStart(e) {
+			this.isDown = true
+			const next = () => {
+				const touches = convertTouchesToArray(e.touches)
+				if(this.chart) {
+					const touch = this.getTouch(e, touches)
+					this.startX = touch.x
+					this.startY = touch.y
+					this.startT = new Date()
+					const handler = this.chart.getZr().handler;
+					dispatch.call(handler, 'mousedown', touch)
+					dispatch.call(handler, 'mousemove', touch)
+					handler.processGesture(wrapTouch(e), 'start');
+					clearTimeout(this.endTimer);
+				}
+				
+			}
+			if(this.isPC) {
+				getRect(`#${this.canvasId}`, {context: this}).then(res => {
+					this.rect = res
+					next()
+				})
+				return
+			}
+			next()
+		},
+		touchMove(e) {
+			if(this.isPC && this.enableHover && !this.isDown) {this.isDown = true}
+			const touches = convertTouchesToArray(e.touches)
+			if (this.chart && this.isDown) {
+				const handler = this.chart.getZr().handler;
+				dispatch.call(handler, 'mousemove', this.getTouch(e, touches))
+				handler.processGesture(wrapTouch(e), 'change');
+			}
+			
+		},
+		touchEnd(e) {
+			this.isDown = false
+			if (this.chart) {
+				const touches = convertTouchesToArray(e.changedTouches)
+				const {x} = touches && touches[0] || {}
+				const touch = (x ? touches[0] : this.getRelative(e, touches)) || {};
+				const handler = this.chart.getZr().handler;
+				const isClick = Math.abs(touch.x - this.startX) < 10 && new Date() - this.startT < 200;
+				dispatch.call(handler, 'mouseup', touch)
+				handler.processGesture(wrapTouch(e), 'end');
+				if(isClick) {
+					dispatch.call(handler, 'click', touch)
+				} else {
+					this.endTimer = setTimeout(() => {
+						dispatch.call(handler, 'mousemove', {x: 999999999,y: 999999999});
+						dispatch.call(handler, 'mouseup', {x: 999999999,y: 999999999});
+					},50)
+				}
+			}
+		},
+		// #endif
+		// #ifdef H5
+		mousewheel(e){
+			if(this.chart) {
+				dispatch.call(this.chart.getZr().handler, 'mousewheel', this.getTouch(e))
+			}
+		}
+		// #endif
+	}
+};
+</script>
+<style>	
+.lime-echart {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	height: 100%;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	flex: 1;
+	/* #endif */
+}
+.lime-echart__canvas {
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	height: 100%;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	flex: 1;
+	/* #endif */
+}
+/* #ifndef APP-NVUE */
+.lime-echart__mask {
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	left: 0;
+	top: 0;
+	z-index: 1;
+}
+/* #endif */
+</style>

+ 35 - 0
uni_modules/lime-echart/components/l-echart/nvue.js

@@ -0,0 +1,35 @@
+export class Echarts {
+	constructor(webview) {
+		this.webview = webview
+		this.options = null
+	}
+	setOption() {
+		this.options = arguments
+		this.webview.evalJs(`setOption(${JSON.stringify(arguments)})`);
+	}
+	getOption() {
+		return this.options
+	}
+	showLoading() {
+		this.webview.evalJs(`showLoading(${JSON.stringify(arguments)})`);
+	}
+	hideLoading() {
+		this.webview.evalJs(`hideLoading()`);
+	}
+	clear() {
+		this.webview.evalJs(`clear()`);
+	}
+	dispose() {
+		this.webview.evalJs(`dispose()`);
+	}
+	resize(size) {
+		if(size) {
+			this.webview.evalJs(`resize(${size})`);
+		} else {
+			this.webview.evalJs(`resize()`);
+		}
+	}
+	on(type, ...args) {
+		console.warn('nvue 暂不支持事件')
+	}
+}

+ 145 - 0
uni_modules/lime-echart/components/l-echart/utils.js

@@ -0,0 +1,145 @@
+// #ifndef APP-NVUE
+// 计算版本
+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
+}
+const systemInfo = uni.getSystemInfoSync();
+
+function gte(version) {
+	// 截止 2023-03-22 mac pc小程序不支持 canvas 2d
+	let {
+		SDKVersion,
+		platform
+	} = systemInfo;
+	// #ifdef MP-ALIPAY
+	SDKVersion = my.SDKVersion
+	// #endif
+	// #ifdef MP-WEIXIN
+	return platform !== 'mac' && compareVersion(SDKVersion, version) >= 0;
+	// #endif
+	return compareVersion(SDKVersion, version) >= 0;
+}
+
+
+export function canIUseCanvas2d() {
+	// #ifdef MP-WEIXIN
+	return gte('2.9.0');
+	// #endif
+	// #ifdef MP-ALIPAY
+	return gte('2.7.0');
+	// #endif
+	// #ifdef MP-TOUTIAO
+	return gte('1.78.0');
+	// #endif
+	return false
+}
+
+export function convertTouchesToArray(touches) {
+	// 如果 touches 是一个数组,则直接返回它
+	if (Array.isArray(touches)) {
+		return touches;
+	}
+	// 如果touches是一个对象,则转换为数组
+	if (typeof touches === 'object' && touches !== null) {
+		return Object.values(touches);
+	}
+	// 对于其他类型,直接返回它
+	return touches;
+}
+
+export function wrapTouch(event) {
+	for (let i = 0; i < event.touches.length; ++i) {
+		const touch = event.touches[i];
+		touch.offsetX = touch.x;
+		touch.offsetY = touch.y;
+	}
+	return event;
+}
+export const devicePixelRatio = uni.getSystemInfoSync().pixelRatio
+// #endif
+// #ifdef APP-NVUE
+export function base64ToPath(base64) {
+	return new Promise((resolve, reject) => {
+		const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || [];
+		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()
+					console.error(`${JSON.stringify(error)}`)
+					reject(error)
+				})
+		}, (error) => {
+			bitmap.clear()
+			console.error(`${JSON.stringify(error)}`)
+			reject(error)
+		})
+	})
+}
+// #endif
+
+
+export function sleep(time) {
+	return new Promise((resolve) => {
+		setTimeout(() => {
+			resolve(true)
+		}, time)
+	})
+}
+
+
+export function getRect(selector, options = {}) {
+	const typeDefault = 'boundingClientRect'
+	const {
+		context,
+		type = typeDefault
+	} = options
+	return new Promise((resolve, reject) => {
+		const dom = uni.createSelectorQuery().in(context).select(selector);
+		const result = (rect) => {
+			if (rect) {
+				resolve(rect)
+			} else {
+				reject()
+			}
+		}
+		if (type == typeDefault) {
+			dom[type](result).exec()
+		} else {
+			dom[type]({
+				node: true,
+				size: true,
+				rect: true
+			}, result).exec()
+		}
+	});
+};

+ 149 - 0
uni_modules/lime-echart/components/lime-echart/lime-echart.vue

@@ -0,0 +1,149 @@
+<template>
+	<view >
+		<view style="height: 750rpx; background-color: aquamarine; position: relative">
+			<l-echart ref="chart" @finished="init"></l-echart>
+			<view class="customTooltips" :style="{left: position[0] + 'px',top: position[1] + 'px'}" v-if="params.length && position.length && showTip">
+				<view>这是个自定的tooltips</view>
+				<view>{{params[0]['axisValue']}}</view>
+				<view v-for="item in params">
+					<view>
+						<text>{{item.seriesName}}</text>
+						<text>{{item.value}}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>		
+</template>
+
+<script>
+	// nvue 不需要引入
+	// #ifdef VUE2
+	import * as echarts from '@/uni_modules/lime-echart/static/echarts.min';
+	// #endif
+	// #ifdef VUE3
+	// #ifdef MP
+	// 由于vue3 使用vite 不支持umd格式的包,小程序依然可以使用,但需要使用require
+	const echarts = require('../../static/echarts.min');
+	// #endif
+	// #ifndef MP
+	// 由于 vue3 使用vite 不支持umd格式的包,故引入npm的包
+	import * as echarts from 'echarts/dist/echarts.esm';
+	// #endif
+	// #endif
+	export default {
+		data() {
+			return {
+				showTip: false,
+				position: [],
+				params: [],
+				option:  {
+					tooltip: {
+						trigger: 'axis',
+						// shadowBlur: 0,
+						textStyle: {
+							textShadowBlur : 0
+						},
+						renderMode: 'richText',
+						position: (point, params, dom, rect, size) => {
+							// 假设自定义的tooltips尺寸
+							const box = [170, 170]
+							// 偏移
+							const offsetX = point[0] < size.viewSize[0] / 2 ? 20 : -box[0] - 20;
+							const offsetY = point[1] < size.viewSize[1] / 2 ? 20 : -box[1] - 20;
+							const x = point[0] + offsetX;
+							const y = point[1] + offsetY;
+							
+							this.position = [x, y]
+							this.params = params
+						},
+						formatter: (params, ticket, callback) => {
+							
+						}
+					},
+					legend: {
+						data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
+					},
+					grid: {
+						left: '3%',
+						right: '4%',
+						bottom: '3%',
+						containLabel: true
+					},
+					xAxis: {
+						type: 'category',
+						boundaryGap: false,
+						data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
+					},
+					yAxis: {
+						type: 'value'
+					},
+					series: [
+						{
+							name: '邮件营销',
+							type: 'line',
+							stack: '总量',
+							data: [120, 132, 101, 134, 90, 230, 210]
+						},
+						{
+							name: '联盟广告',
+							type: 'line',
+							stack: '总量',
+							data: [220, 182, 191, 234, 290, 330, 310]
+						},
+						{
+							name: '视频广告',
+							type: 'line',
+							stack: '总量',
+							data: [150, 232, 201, 154, 190, 330, 410]
+						},
+						{
+							name: '直接访问',
+							type: 'line',
+							stack: '总量',
+							data: [320, 332, 301, 334, 390, 330, 320]
+						},
+						{
+							name: '搜索引擎',
+							type: 'line',
+							stack: '总量',
+							data: [820, 932, 901, 934, 1290, 1330, 1320]
+						}
+					]
+				}
+			}
+		},
+		methods: {
+			init() {
+				this.$refs.chart.init(echarts, chart => {
+					chart.setOption(this.option);
+					
+					// 监听tooltip显示事件
+					chart.on('showTip', (params) => {
+					  this.showTip = true
+					});
+					chart.on('hideTip', (params) => {
+						setTimeout(() => {
+							 this.showTip = false
+						},300)
+					});
+					
+				});
+			},
+			save() {
+				this.$refs.chart.canvasToTempFilePath({
+					success(res) {
+						console.log('res::::', res)
+					}
+				})
+			}
+		}
+	}
+</script>
+<style>
+	.customTooltips {
+		position: absolute;
+		background-color: rgba(255, 255, 255, 0.8);
+		padding: 20rpx;
+	}
+</style>

+ 88 - 0
uni_modules/lime-echart/package.json

@@ -0,0 +1,88 @@
+{
+  "id": "lime-echart",
+  "displayName": "echarts",
+  "version": "0.8.1",
+  "description": "echarts 全端兼容,一款使echarts图表能跑在uniapp各端中的插件",
+  "keywords": [
+    "echarts",
+    "canvas",
+    "图表",
+    "可视化"
+],
+  "repository": "https://gitee.com/liangei/lime-echart",
+  "engines": {
+    "HBuilderX": "^3.6.4"
+  },
+  "dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "type": "component-vue"
+  },
+  "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": "u",
+          "IE": "u",
+          "Edge": "u",
+          "Firefox": "u",
+          "Safari": "u"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y",
+          "钉钉": "u",
+          "快手": "u",
+          "飞书": "u",
+          "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        }
+      }
+    }
+  },
+  "dependencies": {
+    "echarts": "^5.4.1",
+    "zrender": "^5.4.3"
+  }
+}

+ 42 - 0
uni_modules/lime-echart/pnpm-lock.yaml

@@ -0,0 +1,42 @@
+lockfileVersion: 5.4
+
+specifiers:
+  echarts: ^5.4.1
+  zrender: ^5.4.3
+
+dependencies:
+  echarts: registry.npmmirror.com/echarts/5.4.1
+  zrender: registry.npmmirror.com/zrender/5.4.3
+
+packages:
+
+  registry.npmmirror.com/echarts/5.4.1:
+    resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts/-/echarts-5.4.1.tgz}
+    name: echarts
+    version: 5.4.1
+    dependencies:
+      tslib: registry.npmmirror.com/tslib/2.3.0
+      zrender: registry.npmmirror.com/zrender/5.4.1
+    dev: false
+
+  registry.npmmirror.com/tslib/2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz}
+    name: tslib
+    version: 2.3.0
+    dev: false
+
+  registry.npmmirror.com/zrender/5.4.1:
+    resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz}
+    name: zrender
+    version: 5.4.1
+    dependencies:
+      tslib: registry.npmmirror.com/tslib/2.3.0
+    dev: false
+
+  registry.npmmirror.com/zrender/5.4.3:
+    resolution: {integrity: sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/zrender/-/zrender-5.4.3.tgz}
+    name: zrender
+    version: 5.4.3
+    dependencies:
+      tslib: registry.npmmirror.com/tslib/2.3.0
+    dev: false

+ 332 - 0
uni_modules/lime-echart/readme.md

@@ -0,0 +1,332 @@
+# echarts 图表 <span style="font-size:16px;">👑👑👑👑👑 <span style="background:#ff9d00;padding:2px 4px;color:#fff;font-size:10px;border-radius: 3px;">全端</span></span>
+> 一个基于 JavaScript 的开源可视化图表库   [查看更多 站点1](https://limeui.qcoon.cn/#/echart) |  [查看更多 站点2](http://liangei.gitee.io/limeui/#/echart)  <br>
+> 基于 echarts 做了兼容处理,更多示例请访问  [uni示例 站点1](https://limeui.qcoon.cn/#/echart-example) | [uni示例 站点2](http://liangei.gitee.io/limeui/#/echart-example) | [官方示例](https://echarts.apache.org/examples/zh/index.html)     <br>
+> Q群:1046793420 <br>
+
+## 平台兼容
+
+| H5  | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ 小程序 | App  |
+| --- | ---------- | ------------ | ---------- | ---------- | --------- | ---- |
+| √   | √          | √         | √      | √       | √      | √ |
+
+
+## 安装
+- 第一步、在uniapp 插件市场 找到 [百度图表](https://ext.dcloud.net.cn/plugin?id=4899) 导入
+- 第二步、安装 echarts 或者直接使用插件内的echarts.min文件
+```cmd
+pnpm add echarts
+ -or-
+npm install echarts
+```
+
+
+**注意** 
+* 🔔 必须使用hbuilderx 3.4.8-alpha及以上
+* 🔔 echarts 5.3.0及以上
+* 🔔 如果是 `cli` 项目需要主动 `import` 插件
+```js
+import LEchart from '@/uni_modules/lime-echart/components/l-echart/l-echart.vue';
+export default {
+	components: {LEchart}
+}
+```
+
+## 代码演示
+### 基础用法
+```html
+<view><l-echart ref="chart" @finished="init"></l-echart></view>
+```
+
+```js
+// 方式一:自定义包
+// 使用插件内提供的echarts.min
+// 或在官网自定义包:https://echarts.apache.org/zh/builder.html
+// 注意 插件内的包是umd格式的,如果你是vue3请使用esm格式的包 https://github.com/apache/echarts/tree/master/dist
+import * as echarts from '@/uni_modules/lime-echart/static/echarts.min'
+
+
+// 方式二:全量包
+// 如果你使用 npm 安装了 echarts
+import * as echarts from 'echarts'
+
+
+// 方式三:按需引入
+// 按需引入 开始
+import * as echarts from 'echarts/core';
+import {LineChart, BarChart} from 'echarts/charts';
+import {TitleComponent,TooltipComponent,GridComponent, DatasetComponent, TransformComponent, LegendComponent } from 'echarts/components';
+// 标签自动布局,全局过渡动画等特性
+import {LabelLayout,UniversalTransition} from 'echarts/features';
+// 引入 Canvas 渲染器,注意引入 CanvasRenderer 是必须的一步
+import {CanvasRenderer} from 'echarts/renderers';
+
+// 按需引入 注册必须的组件
+echarts.use([
+	LegendComponent,
+	TitleComponent,
+	TooltipComponent,
+	GridComponent,
+	DatasetComponent,
+	TransformComponent,
+	LineChart,
+	BarChart,
+	LabelLayout,
+	UniversalTransition,
+	CanvasRenderer
+]);
+//-------------按需引入结束------------------------
+
+
+export default {
+	data() {
+		return {
+			option: {
+				tooltip: {
+					trigger: 'axis',
+					axisPointer: {
+						type: 'shadow' 
+					},
+					confine: true
+				},
+				legend: {
+					data: ['热度', '正面', '负面']
+				},
+				grid: {
+					left: 20,
+					right: 20,
+					bottom: 15,
+					top: 40,
+					containLabel: true
+				},
+				xAxis: [
+					{
+						type: 'value',
+						axisLine: {
+							lineStyle: {
+								color: '#999999'
+							}
+						},
+						axisLabel: {
+							color: '#666666'
+						}
+					}
+				],
+				yAxis: [
+					{
+						type: 'category',
+						axisTick: { show: false },
+						data: ['汽车之家', '今日头条', '百度贴吧', '一点资讯', '微信', '微博', '知乎'],
+						axisLine: {
+							lineStyle: {
+								color: '#999999'
+							}
+						},
+						axisLabel: {
+							color: '#666666'
+						}
+					}
+				],
+				series: [
+					{
+						name: '热度',
+						type: 'bar',
+						label: {
+							normal: {
+								show: true,
+								position: 'inside'
+							}
+						},
+						data: [300, 270, 340, 344, 300, 320, 310],
+					},
+					{
+						name: '正面',
+						type: 'bar',
+						stack: '总量',
+						label: {
+							normal: {
+								show: true
+							}
+						},
+						data: [120, 102, 141, 174, 190, 250, 220]
+					},
+					{
+						name: '负面',
+						type: 'bar',
+						stack: '总量',
+						label: {
+							normal: {
+								show: true,
+								position: 'left'
+							}
+						},
+						data: [-20, -32, -21, -34, -90, -130, -110]
+					}
+				]
+			},
+		};
+	},
+	// 组件能被调用必须是组件的节点已经被渲染到页面上
+	// 1、在页面mounted里调用,有时候mounted 组件也未必渲染完成
+	mounted() {
+		// init(echarts, theme?:string, opts?:{}, chart => {})
+		// echarts 必填, 非nvue必填,nvue不用填
+		// theme 可选,应用的主题,目前只支持名称,如:'dark'
+		// opts = { // 可选
+		//	locale?: string  // 从 `5.0.0` 开始支持
+		// }
+		// chart => {} , callback 返回图表实例
+		this.$refs.chart.init(echarts, chart => {
+			chart.setOption(this.option);
+		});
+	},
+	// 2、或者使用组件的finished事件里调用
+	methods: {
+		async init() {
+			// chart 图表实例不能存在data里
+			const chart = await this.$refs.chart.init(echarts);
+			chart.setOption(this.option)
+		}
+	}
+}
+```
+
+## 数据更新
+- 使用 `ref` 可获取`setOption`设置更新
+
+```js
+this.$refs.chart.setOption(data)
+```
+
+## 图表大小
+- 在有些场景下,我们希望当容器大小改变时,图表的大小也相应地改变。
+
+```js
+// 默认获取容器尺寸
+this.$refs.chart.resize()
+// 指定尺寸
+this.$refs.chart.resize({width: 375, height: 375})
+```
+
+## 自定义Tooltips
+- nvue 不支持
+由于除H5之外都不存在dom,但又有tooltips个性化的需求,代码就不贴了,看示例吧
+```
+代码位于/uni_modules/lime-echart/component/lime-echart
+```
+
+
+## 插件标签
+- 默认 l-echart 为 component
+- 默认 lime-echart 为 demo
+```html
+ // 在任意地方使用可查看domo, 代码位于/uni_modules/lime-echart/component/lime-echart
+<lime-echart></lime-echart>
+```
+
+
+## 常见问题
+- 钉钉小程序 由于没有`measureText`,模拟的`measureText`又无法得到当前字体的`fontWeight`,故可能存在估计不精细的问题
+- 微信小程序 `2d` 只支持 真机调试2.0
+- 微信开发工具会出现 `canvas` 不跟随页面的情况,真机不影响
+- 微信开发工具会出现 `canvas` 层级过高的问题,真机一般不受影响,可以先测只有两个元素的页面看是否会有层级问题。
+- toolbox 不支持 `saveImage`
+- echarts 5.3.0 的 lines 不支持 trailLength,故需设置为 `0`
+- dataZoom H5不要设置 `showDetail` 
+- 如果微信小程序的`tooltip`文字有阴影,可能是微信的锅,临时解决方法是`tooltip.shadowBlur = 0`
+- 如果钉钉小程序上传时报安全问题`Uint8Clamped`,可以向钉钉反馈是安全代码扫描把Uint8Clamped数组错误识别了,也可以在 echarts 文件修改`Uint8Clamped`
+```js
+// 找到这段代码把代码中`Uint8Clamped`改成`Uint8_Clamped`,再把下划线去掉,不过直接去掉`Uint8Clamped`也是可行的
+// ["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e+"Array]"]
+// 改成如下
+["Int8","Uint8","Uint8_Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e.replace('_','')+"Array]"]
+```
+
+### vue3
+如果您是使用 **vite + vue3** 非微信小程序可能会遇到`echarts`文件缺少`wx`判断导致无法使用或缺少`tooltip`<br>
+
+方式一:可以在`echarts.min.js`文件开头增加以下内容,参考插件内的echart.min.js的做法
+
+```js
+var prefix = () => {
+	var UNDEFINED = 'undefined'
+	if(typeof wx !== UNDEFINED) return wx // 微信
+	if(typeof tt !== UNDEFINED) return tt // 字节 飞书
+	if(typeof swan !== UNDEFINED) return swan // 百度
+	if(typeof my !== UNDEFINED) return my // 支付宝
+	if(typeof dd !== UNDEFINED) return dd // 钉钉
+	if(typeof ks !== UNDEFINED) return ks // 快手
+	if(typeof jd !== UNDEFINED) return jd // 京东
+	if(typeof qa !== UNDEFINED) return qa // 快应用
+	if(typeof qq !== UNDEFINED) return qq // qq
+	if(typeof qh !== UNDEFINED) return qh // 360
+	if(typeof uni !== UNDEFINED) return uni
+	return null
+}
+//在 !function(t,e){"object"==typeof 下面加入 可能是第36行
+var wx = prefix();
+/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation.
+```
+
+方式二:在`vite.config.js`的`define`设置环境
+
+```js
+//  或者在`vite.config.js`的`define`设置环境
+import { defineConfig } from 'vite';
+import uni from '@dcloudio/vite-plugin-uni';
+
+const UNI_PLATFORM = {
+	"app": "uni",
+	"web": "uni",
+	"mp-weixin": "wx",
+	"mp-baidu": "swan",
+	"mp-alipay": "my",
+	"mp-toutiao": "tt",
+	"mp-lark": "tt",
+	"mp-qq": "qq",
+	"mp-kuaishou": "ks",
+	"mp-jd": "jd",
+	"mp-360": "qh",
+	"quickapp-webview-union": "qa",
+	"quickapp-webview-huawei": "qa",
+	"quickapp-webview": "qa",
+}
+
+export default defineConfig({
+	plugins: [uni()],
+	define: { 
+		global: UNI_PLATFORM[process.env.UNI_PLATFORM],
+		wx: UNI_PLATFORM[process.env.UNI_PLATFORM]
+	}
+});
+```
+
+
+## Props
+
+| 参数             | 说明                                                            | 类型             | 默认值        | 版本 	|
+| ---------------  | --------                                                        | -------         | ------------ | ----- 	|
+| custom-style     | 自定义样式                                                      |   `string`       | -            | -     	|
+| type             | 指定 canvas 类型                                				 |    `string`      | `2d`         |   	    |
+| is-disable-scroll | 触摸图表时是否禁止页面滚动                                       |    `boolean`     | `false`     |   	    |
+| beforeDelay       |  延迟初始化 (毫秒)                       						|    `number`     | `30`     |   	    |
+| enableHover       |  PC端使用鼠标悬浮                       						|    `boolean`     | `false`     |   	    |
+
+## 事件
+
+| 参数                    | 说明                                                                                                             |
+| ---------------        | ---------------                                                                                                  |
+| init(echarts, chart => {})  | 初始化调用函数,第一个参数是传入`echarts`,第二个参数是回调函数,回调函数的参数是 `chart` 实例                                           |  
+| setChart(chart => {})        | 已经初始化后,请使用这个方法,是个回调函数,参数是 `chart` 实例                  |  
+| setOption(data)        | [图表配置项](https://echarts.apache.org/zh/option.html#title),用于更新 ,传递是数据 `option`  |  
+| clear()                | 清空当前实例,会移除实例中所有的组件和图表。  |  
+| dispose()              | 销毁实例  |  
+| showLoading()          | 显示加载  |  
+| hideLoading()          | 隐藏加载  |  
+| [canvasToTempFilePath](https://uniapp.dcloud.io/api/canvas/canvasToTempFilePath.html#canvastotempfilepath)(opt)  | 用于生成图片,与官方使用方法一致,但不需要传`canvasId`  |  
+
+
+## 打赏
+如果你觉得本插件,解决了你的问题,赠人玫瑰,手留余香。  
+![](https://testingcf.jsdelivr.net/gh/liangei/image@1.9/alipay.png)
+![](https://testingcf.jsdelivr.net/gh/liangei/image@1.9/wpay.png)

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
uni_modules/lime-echart/static/ecStat.min.js


Разлика између датотеке није приказан због своје велике величине
+ 49 - 0
uni_modules/lime-echart/static/echarts.min.js


+ 129 - 0
uni_modules/lime-echart/static/index.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="zh">
+	<head>
+		<meta charset="UTF-8">
+		<meta name="viewport"
+			content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+		<meta http-equiv="X-UA-Compatible" content="ie=edge">
+		<title></title>
+		<style type="text/css">
+			html,
+			body,
+			.canvas {
+				padding: 0;
+				margin: 0;
+				overflow-y: hidden;
+				background-color: transparent;
+				width: 100%;
+				height: 100%;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="canvas" id="limeChart"></div>
+		<script type="text/javascript" src="./uni.webview.1.5.3.js"></script>
+		<script type="text/javascript" src="./echarts.min.js"></script>
+		<script type="text/javascript" src="./ecStat.min.js"></script>
+		<!-- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-liquidfill@latest/dist/echarts-liquidfill.min.js"></script> -->	
+		<script>
+			let chart = null;
+			let cache = [];
+			console.log = function(...agrs) {
+				postMessage(agrs)
+			}
+			function emit(event, data) {
+				let dataStr = JSON.stringify(data, stringify)
+				postMessage({
+					event,
+					data: dataStr
+				})
+				cache = []
+			}
+			function postMessage(data) {
+				uni.postMessage({
+					data
+				});
+			}
+			function stringify(key, value) {
+				if (typeof value === 'object' && value !== null) {
+					if (cache.indexOf(value) !== -1) {
+						return;
+					}
+					cache.push(value);
+				}
+				return value;
+			}
+			function parse(name, callback, options) {
+				const optionNameReg = /[\w]+\.setOption\(([\w]+\.)?([\w]+)\)/
+				if (optionNameReg.test(callback)) {
+					const optionNames = callback.match(optionNameReg)
+					if(optionNames[1]) {
+						const _this = optionNames[1].split('.')[0]
+						window[_this] = {}
+						window[_this][optionNames[2]] = options
+						return optionNames[2]
+					} else {
+						return null
+					}
+				}
+				return null
+			}
+			function init(callback, options, opts = {}, theme = null) {
+				if(!chart) {
+					chart = echarts.init(document.getElementById('limeChart'), theme, opts)
+					if(options) {
+						chart.setOption(options)
+					}
+					// const name = parse('a', callback, options)
+					// console.log('options::', callback)
+					// if(name) this[name] = options
+					// eval(`a = ${callback};`)
+					// if(a) {a(chart)}
+				}
+			}
+			
+			function setChart(callback, options) {
+				if(!callback) return
+				if(chart && callback && options) {
+					var r = null
+					const name = parse('r', callback, options)
+					if(name) this[name] = options
+					eval(`r = ${callback};`)
+					if(r) {r(chart)}
+				}
+			}
+			function setOption(data) {
+				if (chart) chart.setOption(data[0], data[1])
+			}
+			function showLoading(data) {
+				if (chart) chart.showLoading(data[0], data[1])
+			}
+			
+			function hideLoading() {
+				if (chart) chart.hideLoading()
+			}
+			
+			function clear() {
+				if (chart) chart.clear()
+			
+			}
+			
+			function dispose() {
+				if (chart) chart.dispose()
+			}
+			function resize(size) {
+				if (chart) chart.resize(size)
+			}
+			
+			function canvasToTempFilePath(opt = {}) {
+				if (chart) {
+				  const src = chart.getDataURL(opt)
+				  postMessage({
+					  file: true,
+					  data: src
+				  })
+				}
+			}
+		</script>
+	</body>
+</html>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
uni_modules/lime-echart/static/uni.webview.1.5.3.js


+ 113 - 79
utils/newRequest.js

@@ -90,7 +90,7 @@ let service = {
 	},
 	// 上传文件
 	upFilse: async function(data) {
-		return await new Promise(function(resolve, reject) {
+		return await new Promise(async function(resolve, reject) {
 			let requestData = ''; //保存处理完成后请求数据
 			let url = '' //保存请求地址
 			try {
@@ -116,95 +116,129 @@ let service = {
 				// 上传图片的API
 				upload_img_url: url,
 				data: requestData.data,
-				file_name: requestData.data.file_name||'user/'+store.state.user.userInfo.uid
+				file_name: requestData.data.file_name || 'user/' + store.state.user.userInfo.uid
 			}
 			uni.showLoading({
-				title: '请求key中'
+				title: '请求key中',
+				mark: true,
 			})
-			getUpimgKey({
-				file_name: config.file_name
-			}).then(({
-				data
-			}) => {
+			try {
+				const {
+					data
+				} = await getUpimgKey({
+					file_name: config.file_name
+				})
 				uni.hideLoading()
-				uni.chooseImage({
-					count: 1,
-					sourceType: ['camera', 'album'],
-					success(res) {
-						uni.showLoading({
-							title: '上传中'
-						})
-						// console.log(res, '选中图片');
-						const time = (new Date()).getTime();
-						// #ifdef H5
-						const formData = {
-								"policy": data.sign.policy,
-								"OSSAccessKeyId": data.sign.accessid,
-								'success_action_status': 200,
-								"signature": data.sign.signature,
-								"key": config.file_name+'/'+time+res.tempFiles[0].name
-							}
-						// #endif
-						// #ifndef H5
-						const formData = {
-								"policy": data.sign.policy,
-								"OSSAccessKeyId": data.sign.accessid,
-								'success_action_status': 200,
-								"signature": data.sign.signature,
-								"key": config.file_name+'/'+time+'.png'
-							}
-						// #endif
-						// console.log(formData,'formData');
-						uni.uploadFile({
-							url: data.sign.host, //仅为示例,非真实的接口地址
-							filePath: res.tempFilePaths[0],
-							formData,
-							name: 'file',
-							header: {
-								"Authori-zation": 'Bearer ' + uni
-									.getStorageSync('token')
-							},
-							success: (suc) => {
-								if(suc.statusCode==200){
-									// #ifdef H5
-									const imgurl = [{url:data.sign.host+'/'+config.file_name+'/'+time+res.tempFiles[0].name}];
-									// #endif
-									// #ifndef H5
-									const imgurl = [{url:data.sign.host+'/'+config.file_name+'/'+time+'.png'}];
-									// #endif
-									resolve(imgurl)
+				setTimeout(()=>{
+					uni.chooseImage({
+						count: 1,
+						sizeType: ['compressed'],
+						sourceType: ['camera', 'album'],
+						success(res) {
+							uni.showLoading({
+								title: '上传中',
+								mark: true,
+							})
+							try{
+								// console.log(res, '选中图片');
+								const time = (new Date()).getTime();
+								// #ifdef H5
+								const formData = {
+									"policy": data.sign.policy,
+									"OSSAccessKeyId": data.sign.accessid,
+									'success_action_status': 200,
+									"signature": data.sign.signature,
+									"key": config.file_name + '/' + time + res.tempFiles[0]
+										.name
+								}
+								// #endif
+								// #ifndef H5
+								const formData = {
+									"policy": data.sign.policy,
+									"OSSAccessKeyId": data.sign.accessid,
+									'success_action_status': 200,
+									"signature": data.sign.signature,
+									"key": config.file_name + '/' + time + '.png'
 								}
-								uni.hideLoading()
-							},
-							file(res) {
-								uni.hideLoading()
-								// console.log(res, '图片上传错误');
-								reject(res)
+								// #endif
+								// console.log(formData,'formData');
+								uni.uploadFile({
+									url: data.sign.host, //仅为示例,非真实的接口地址
+									filePath: res.tempFilePaths[0],
+									formData,
+									name: 'file',
+									header: {
+										"Authori-zation": 'Bearer ' + uni
+											.getStorageSync('token')
+									},
+									success: (suc) => {
+										if (suc.statusCode == 200) {
+											// #ifdef H5
+											const imgurl = [{
+												url: data.sign.host + '/' +
+													config.file_name + '/' +
+													time + res.tempFiles[0]
+													.name
+											}];
+											// #endif
+											// #ifndef H5
+											const imgurl = [{
+												url: data.sign.host + '/' +
+													config.file_name + '/' +
+													time + '.png'
+											}];
+											// #endif
+											resolve(imgurl)
+										}
+										uni.hideLoading()
+									},
+									file(res) {
+										uni.hideLoading()
+										// console.log(res, '图片上传错误');
+										reject(res)
+									}
+													
+								});
+							}catch(e){
+								uni.showModal({
+									title: '错误',
+									content: e.message,
+									showCancel: false
+								});
 							}
-
-						});
-					},
-					complete() {
-						uni.hideLoading()
-					},
-					fail(err) {
-						// console.log(res, '图片上传错误');
-						uni.showToast({
-							title: '图片上传失败',
-							icon:"error"
-						});
-						uni.hideLoading()
-						reject(err)
-					}
+							
+						},
+						fail(err) {
+							if (err.errCode == 0) {
+								uni.showToast({
+									title: '已取消',
+									icon: "error"
+								});
+							} else if (err.errCode == 12) {
+								uni.showToast({
+									title: '已返回',
+									icon: "error"
+								});
+							} else {
+								console.log(err, '图片上传错误');
+								uni.showToast({
+									title: '请重新上传',
+									icon: "error"
+								});
+							}
+							uni.hideLoading()
+							reject(err)
+						}
+					})
 				})
-			}).catch((res)=>{
+			} catch (e) {
 				uni.hideLoading()
 				uni.showToast({
-					title: 'key请求失败',
-					icon:"error"
+					title: e.message,
+					icon: "error"
 				});
 				reject(res)
-			})
+			}
 		})
 	},
 };

Неке датотеке нису приказане због велике количине промена