cmy 4 éve
szülő
commit
7a2bd238f5

+ 9 - 9
App.vue

@@ -22,16 +22,15 @@ export default {
 </script>
 
 <style lang="scss">
-	/*全局公共样式和字体图标*/
-	@import "uview-ui/index.scss";
-	@import '/static/css/cmy.css';
-.uni-tabbar__item{
-	&.active{
-		background: #127FD5 !important;
+/*全局公共样式和字体图标*/
+@import 'uview-ui/index.scss';
+@import '/static/css/cmy.css';
+.uni-tabbar__item {
+	&.active {
+		background: #127fd5 !important;
 	}
 }
 
-		
 view,
 scroll-view,
 swiper,
@@ -64,8 +63,7 @@ video {
 	padding: 20rpx 0;
 	border-radius: 8rpx;
 }
-.botton-box{
-	
+.botton-box {
 	height: 132rpx;
 }
 
@@ -219,5 +217,7 @@ page {
 	background-color: $page-color-base;
 	// 设置默认字体
 	font-family: PingFang SC, STHeitiSC-Light, Helvetica-Light, arial, sans-serif, Droid Sans Fallback;
+	height: auto;
+	min-height: 100%;
 }
 </style>

+ 0 - 89
components/introduce/introduce.vue

@@ -1,89 +0,0 @@
-<template>
-	<!-- 组件名称 -->
-	
-	<view class="aboutUs">
-		<text>地址:浙江省台州市路桥区路北街道珠光街199号 213室 (环飞龙湖科创生态圈首聚地)</text>
-		<view class="betWeen">
-			<text>电脑:0576-82528889</text>
-			<text>邮箱:163312@qq.com</text>
-			<text>邮编:318050</text>
-		</view>
-		<text>备案号:浙ICP备2021004458号</text>
-		<view class="erweima">
-			<view class="img">
-				<image src="../../static/img/erweima.png" mode=""></image>
-			</view>
-			<text>扫一扫关注我们</text>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-	//定义一个对象
-	props:{
-		aboutUs:Object
-	},
-	//(是在用到这个组件时的页面这样做) 如果有data数据,封装,需要在上放html中声明一下  例:data{1,2,3,45}   html:<view :data = "data"></view>
-	}
-</script>
-<style lang="scss" scoped>
-	.aboutUs {
-		position: relative;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		width: 100%;
-		height: 132rpx;
-		background: #127FD5;
-
-		text {
-			font-size: 14rpx;
-			font-family: Adobe Heiti Std;
-			font-weight: normal;
-			color: #FFFFFF;
-
-		}
-
-		.between {
-			display: flex;
-			justify-content: space-around;
-
-			text {
-				font-size: 14rpx;
-				font-family: Adobe Heiti Std;
-				font-weight: normal;
-				color: #FFFFFF;
-			}
-		}
-
-		.erweima {
-			position: absolute;
-			right: 10rpx;
-			bottom: 5rpx;
-			display: flex;
-			flex-direction: column;
-			justify-content: center;
-			align-items: center;
-
-			.img {
-				width: 56rpx;
-				height: 52rpx;
-
-				image {
-					width: 100%;
-					height: 100%;
-				}
-			}
-
-			text {
-				font-size: 12rpx;
-				font-family: Adobe Heiti Std;
-				font-weight: normal;
-				color: #FFFFFF;
-
-			}
-		}
-	}
-</style>

+ 34 - 0
components/public/heard.vue

@@ -0,0 +1,34 @@
+<template>
+	<view class="img">
+		<view class="imgBox"><image class="imgFlex" src="../../static/img/logo.png" mode="heightFix"></image></view>
+	</view>
+</template>
+
+<script>
+export default {
+	//定义一个对象
+	props: {
+		aboutUs: Object
+	}
+	//(是在用到这个组件时的页面这样做) 如果有data数据,封装,需要在上放html中声明一下  例:data{1,2,3,45}   html:<view :data = "data"></view>
+};
+</script>
+<style lang="scss" scoped>
+.img {
+	height: 80rpx;
+	.imgBox {
+		background-color: #FFFFFF;
+		padding: 10rpx 10rpx;
+		position: fixed;
+		width: 100%;
+		height: auto;
+		top: 0;
+		left: 0;
+		z-index: 999999;
+		border-bottom:1PX solid $border-color-light;
+		.imgFlex {
+			height: 60rpx;
+		}
+	}
+}
+</style>

+ 70 - 0
components/public/introduce.vue

@@ -0,0 +1,70 @@
+<template>
+	<!-- 组件名称 -->
+	<view class="aboutUs">
+		<text>地址:浙江省台州市路桥区路北街道珠光街199号 213室 (环飞龙湖科创生态圈首聚地)</text>
+		<view class="betWeen margin-t-20">
+			<text>电脑:0576-82528889</text>
+			<text class="margin-l-10">邮箱:163312@qq.com</text>
+		</view>
+		<view class="betWeen margin-t-20">
+			<text>邮编:318050</text>
+			<text class="margin-l-10">备案号:浙ICP备2021004458号</text>
+		</view>
+		<view class="erweima">
+			<view class="img"><image src="../../static/img/erweima.png" class="imgBox" mode="scaleToFill"></image></view>
+			<text>扫一扫关注我们</text>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	//定义一个对象
+	props: {
+		aboutUs: Object
+	}
+	//(是在用到这个组件时的页面这样做) 如果有data数据,封装,需要在上放html中声明一下  例:data{1,2,3,45}   html:<view :data = "data"></view>
+};
+</script>
+<style lang="scss" scoped>
+.aboutUs {
+	position: relative;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	text-align: left;
+	padding: 30rpx;
+	background: #127fd5;
+	text {
+		font-size: 14rpx;
+		font-family: Adobe Heiti Std;
+		font-weight: normal;
+		color: #ffffff;
+	}
+	.erweima {
+		position: absolute;
+		right: 30rpx;
+		bottom: 15rpx;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.img {
+			width: 110rpx;
+			height: 110rpx;
+			.imgBox {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		text {
+			font-size: 12rpx;
+			font-family: Adobe Heiti Std;
+			font-weight: normal;
+			color: #ffffff;
+		}
+	}
+}
+</style>

+ 1 - 1
main.js

@@ -4,7 +4,7 @@ import App from './App'
 import uView from "uview-ui";
 Vue.prototype.$store = store
 // import BaiduMap from 'vue-baidu-map'
-Vue.use(VueBaiduMap, {
+Vue.use(VueBaiduMap.default, {
   ak: 'BPOdSO7lNQ45sOHr4veYGsqEkxYApB0x'    //这个地方是官方提供的ak密钥
 })
 Vue.use(uView);

+ 5 - 5
pages.json

@@ -98,35 +98,35 @@
 		// "selectedBackgroundColor":"#3CB371",
 		"list": [{
 				"pagePath": "pages/index/index",
-				"iconPath": "static/tabBar/1.png",
+				"iconPath": "static/tabBar/11.png",
 				"selectedIconPath": "static/tabBar/11.png",
 				"text": "首页"
 			},
 
 			{
 				"pagePath": "pages/about/about",
-				"iconPath": "static/tabBar/2.png",
+				"iconPath": "static/tabBar/22.png",
 				"selectedIconPath": "static/tabBar/22.png",
 				"text": "关于我们"
 			},
 
 			{
 				"pagePath": "pages/case/case",
-				"iconPath": "static/tabBar/3.png",
+				"iconPath": "static/tabBar/33.png",
 				"selectedIconPath": "static/tabBar/33.png",
 				"text": "案例展示"
 			},
 
 			{
 				"pagePath": "pages/news/news",
-				"iconPath": "static/tabBar/4.png",
+				"iconPath": "static/tabBar/44.png",
 				"selectedIconPath": "static/tabBar/44.png",
 				"text": "新闻动态"
 			},
 
 			{
 				"pagePath": "pages/test/test",
-				"iconPath": "static/tabBar/5.png",
+				"iconPath": "static/tabBar/55.png",
 				"selectedIconPath": "static/tabBar/55.png",
 				"text": "节水测试"
 			}

+ 158 - 192
pages/about/about.vue

@@ -1,46 +1,26 @@
 <template>
 	<view class="center">
-		<view class="img">
-			<image src="../../static/img/logo.png" mode=""></image>
-		</view>
-		<view class="test_title">
-			关于我们
-		</view>
+		<heard></heard>
+		<view class="test_title">关于我们</view>
 		<view class="aboutBox">
-			<view class="aboutBox-title" @click="qiehuan(0)">
-				公司介绍
-			</view>
-			<view class="aboutBox-title" @click="qiehuan(1)">
-				产品介绍
-			</view>
-			<view class="aboutBox-title" @click="qiehuan(2)">
-				联系我们
-			</view>
-
+			<view class="aboutBox-title" @click="qiehuan(0)">公司介绍</view>
+			<view class="aboutBox-title" @click="qiehuan(1)">产品介绍</view>
+			<view class="aboutBox-title" @click="qiehuan(2)">联系我们</view>
 		</view>
 		<swiper :current="currentIndex" :duration="1000" style="height: 1000rpx;">
 			<swiper-item>
 				<!-- v-html="gsjj.content" -->
-				<view class="swiper-item" v-html="gsjj.content">
-
-				</view>
-			</swiper-item>
-			<swiper-item>
-				<view class="swiper-item" v-html="products.content">
-				</view>
+				<view class="swiper-item" v-html="gsjj.content"></view>
 			</swiper-item>
+			<swiper-item><view class="swiper-item" v-html="products.content"></view></swiper-item>
 			<swiper-item>
 				<view class="swiper-item swiperRight">
-
-					<view class="swiperRight-img">
-						<image src="../../static/img/map.png" mode=""></image>
-					</view>
+					<view class="swiperRight-img"><image src="../../static/img/map.png" mode=""></image></view>
 					<view class="text">
 						<text>咨询热线:xxxxxxxxxx</text>
 						<text>报修电话:xxxxxxxxxx</text>
 					</view>
 				</view>
-
 			</swiper-item>
 		</swiper>
 
@@ -48,195 +28,181 @@
 	</view>
 </template>
 <script>
-	import {
-		changeTaber,
-	} from '@/utils/tarberChange.js'
-	import {
-		articleDetail,
-		articlelist,
-		productlist,
-		productDetail
-	} from '@/api/index.js'
-	import aboutUs from '@/components/introduce/introduce.vue'
-	export default {
-		components: {
-			aboutUs
+import { changeTaber } from '@/utils/tarberChange.js';
+import { articleDetail, articlelist, productlist, productDetail } from '@/api/index.js';
+import aboutUs from '@/components/public/introduce.vue';
+import heard from '@/components/public/heard.vue';
+export default {
+	components: {
+		aboutUs,
+		heard
+	},
+	data() {
+		return {
+			indexList: [],
+			topNavWidth: '12%', //设置导航默认宽度
+			classIndex: 0, //当前进行中的活动
+			itemWidht: 0, //顶部分类宽度
+			loadingType: 'more', //加载更多状态
+			actionClassInd: 0,
+			page: 1,
+			limit: 10,
+			currentIndex: 0,
+			gsjj: {},
+			products: {}
+		};
+	},
+	onLoad() {
+		this.getGsjj(2);
+		this.getproducts(3);
+	},
+	onShow() {
+		this.$nextTick(function() {
+			changeTaber(1);
+		});
+	},
+	methods: {
+		async loadData() {
+			const obj = this;
 		},
-		data() {
-			return {
-				indexList: [],
-				topNavWidth: '12%', //设置导航默认宽度
-				classIndex: 0, //当前进行中的活动
-				itemWidht: 0, //顶部分类宽度
-				loadingType: 'more', //加载更多状态
-				actionClassInd: 0,
-				page: 1,
-				limit: 10,
-				currentIndex: 0,
-				gsjj: {},
-				products: {}
-			}
+		tabClass(item, index) {
+			this.classIndex = index;
+			this.actionClassId = index;
+			let ls = this.indexList[this.actionClassInd];
 		},
-		onLoad() {
-			// this.loadData();
-			this.$nextTick(function(){
-				changeTaber(1)
-			})
-			this.getGsjj(2)
-			this.getproducts(3)
+		qiehuan(index) {
+			console.log(index);
+			this.currentIndex = index * 1;
 		},
-		
-		methods: {
-			async loadData() {
-				const obj = this;
-			},
-			tabClass(item, index) {
-				this.classIndex = index;
-				this.actionClassId = index;
-				let ls = this.indexList[this.actionClassInd]
-			},
-			qiehuan(index) {
-				console.log(index)
-				this.currentIndex = index * 1;
-			},
-			getGsjj(id) {
-				articleDetail({}, id).then(res => {
-					console.log(res, "111111")
-					this.gsjj = res.data
-				}).catch(err => {
-					this.gsjj = err.data
-
-					console.log(err, 'cuoww')
+		getGsjj(id) {
+			articleDetail({}, id)
+				.then(res => {
+					console.log(res, '111111');
+					this.gsjj = res.data;
 				})
-			},
-			getproducts(id) {
-				productDetail({}, id).then(res => {
-					console.log(res, "111111")
-					this.products = res.data
-				}).catch(err => {
-					this.products = err.data
-
-					console.log(err, 'cuoww')
+				.catch(err => {
+					this.gsjj = err.data;
+
+					console.log(err, 'cuoww');
+				});
+		},
+		getproducts(id) {
+			productDetail({}, id)
+				.then(res => {
+					console.log(res, '111111');
+					this.products = res.data;
 				})
-			}
+				.catch(err => {
+					this.products = err.data;
+
+					console.log(err, 'cuoww');
+				});
 		}
 	}
+};
 </script>
 
 <style lang="scss">
-	page {
-		height: 100%;
-	}
 
-	.img {
-		margin: 17rpx 0 17rpx 41rpx;
-		width: 208rpx;
-		height: 52rpx;
+.img {
+	margin: 17rpx 0 17rpx 41rpx;
+	width: 208rpx;
+	height: 52rpx;
 
-		image {
-			width: 100%;
-			height: 100%;
-		}
+	image {
+		width: 100%;
+		height: 100%;
 	}
-
-	.test_title {
+}
+
+.test_title {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	width: 100%;
+	height: 60rpx;
+	font-size: 22rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #ffffff;
+	background-color: #0165b5;
+}
+
+// .class-box {
+// 	background: #FFFFFF;
+// 	white-space: nowrap;
+// 	height: 78rpx;
+
+// .item {
+// 	text-align: center;
+// 	display: inline-block;
+// 	color: $font-color-base;
+// 	margin: 26rpx 34rpx 15rpx 29rpx;
+// 	background-color: #ffffff;
+// 	line-height: 1;
+
+// 	.time {
+// 		font-family: PingFang SC;
+// 		font-weight: bold;
+// 		font-size: 30rpx;
+// 		padding-bottom: 19rpx;
+
+// 		&.action {
+// 			color: #ff0000;
+// 			border-bottom: 4rpx solid #FF0000;
+// 		}
+// 	}
+// }
+
+.aboutBox {
+	display: flex;
+	justify-content: space-between;
+	width: 100%;
+	height: 60rpx;
+
+	.aboutBox-title {
 		display: flex;
 		justify-content: center;
 		align-items: center;
-		width: 100%;
-		height: 60rpx;
+		width: 33.3%;
+		background: #127fd5;
 		font-size: 22rpx;
 		font-family: Adobe Heiti Std;
 		font-weight: normal;
-		color: #FFFFFF;
-		background-color: #0165B5;
+		color: #ffffff;
+		line-height: 67rpx;
 	}
+}
 
-	// .class-box {
-	// 	background: #FFFFFF;
-	// 	white-space: nowrap;
-	// 	height: 78rpx;
-
-	// .item {
-	// 	text-align: center;
-	// 	display: inline-block;
-	// 	color: $font-color-base;
-	// 	margin: 26rpx 34rpx 15rpx 29rpx;
-	// 	background-color: #ffffff;
-	// 	line-height: 1;
-
-	// 	.time {
-	// 		font-family: PingFang SC;
-	// 		font-weight: bold;
-	// 		font-size: 30rpx;
-	// 		padding-bottom: 19rpx;
-
-	// 		&.action {
-	// 			color: #ff0000;
-	// 			border-bottom: 4rpx solid #FF0000;
-	// 		}
-	// 	}
-	// }
-
-	.aboutBox {
-		display: flex;
-		justify-content: space-between;
-		width: 100%;
-		height: 60rpx;
-
-		.aboutBox-title {
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			width: 33.3%;
-			background: #127FD5;
-			font-size: 22rpx;
-			font-family: Adobe Heiti Std;
-			font-weight: normal;
-			color: #FFFFFF;
-			line-height: 67rpx;
-		}
-	}
+.swiper-item {
+}
 
-	.swiper-item {}
+.swiperRight {
+	margin-top: 140rpx;
+	display: flex;
+	flex-direction: column;
 
-	.swiperRight {
-		margin-top: 140rpx;
-		display: flex;
-		flex-direction: column;
+	align-items: center;
 
-		align-items: center;
-
-		.swiperRight-img {
-
-			width: 560rpx;
-			height: 266rpx;
+	.swiperRight-img {
+		width: 560rpx;
+		height: 266rpx;
 
-			image {
-				width: 100%;
-				height: 100%;
-			}
+		image {
+			width: 100%;
+			height: 100%;
 		}
-
-
-	}
-
-	.text {
-		margin-top: 80rpx;
-		display: flex;
-		flex-direction: column;
-		font-size: 10rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #000000;
-		line-height: 40rpx;
-	}
-
-	.aboutUs {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 0;
-		margin-bottom: 100rpx;
 	}
+}
+
+.text {
+	margin-top: 80rpx;
+	display: flex;
+	flex-direction: column;
+	font-size: 10rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #000000;
+	line-height: 40rpx;
+}
 </style>

+ 174 - 223
pages/case/case.vue

@@ -1,32 +1,17 @@
 <template>
 	<view class="center">
-		<view class="img">
-			<image src="../../static/img/logo.png" mode=""></image>
-		</view>
-		<view class="test_title">
-			案例展示
-		</view>
+		<heard></heard>
+		<view class="test_title">案例展示</view>
 		<view class="box" v-if="isShow">
-			<view class="caseBox" v-for="(item,index) in caseList" @click="nav(item.id)">
-				<view class="caseBox-img">
-					<image :src="imgUrl+item.coverimage" mode=""></image>
-				</view>
+			<view class="caseBox" v-for="(item, index) in caseList" @click="nav(item.id)">
+				<view class="caseBox-img"><image :src="imgUrl + item.coverimage" mode=""></image></view>
 				<view class="caseBox-right">
-					<view class="title">
-						{{item.title}}
-					</view>
-					<view class="date">
-						{{item.createtime}}
-					</view>
-					<view class="content">
-						{{item.synopsis}}
-					</view>
+					<view class="title">{{ item.title }}</view>
+					<view class="date">{{ item.createtime }}</view>
+					<view class="content">{{ item.synopsis }}</view>
 				</view>
 			</view>
-			<view class="tishi" v-if="isShowtishi">
-				已加载全部数据~~
-			</view>
-
+			<view class="tishi" v-if="isShowtishi">已加载全部数据~~</view>
 
 			<view class="pagInation">
 				<!-- prevText	String	上一页	左侧按钮文字
@@ -39,240 +24,206 @@
 				 type值为:next/prev,表示点击的是上一页还是下一个-->
 				<!-- 	<uni-pagination title="标题文字" prevText="" nextText="" pageSize="10" total="20" @change="" ></uni-pagination> -->
 				<!-- <uni-pagination title="标题文字" show-icon="true" total="50" current="2"></uni-pagination> -->
-				
-
-					<uni-pagination class="pagination" prevText="上一页" nextText="下一页" @change="handlePage"
-						show-icon="false" :total="total" :current="pageNum" :pageSize="pageSize"></uni-pagination>
 
-			
+				<uni-pagination
+					class="pagination"
+					prevText="上一页"
+					nextText="下一页"
+					@change="handlePage"
+					show-icon="false"
+					:total="total"
+					:current="pageNum"
+					:pageSize="pageSize"
+				></uni-pagination>
 			</view>
 		</view>
-		<view class="xianqingye" v-html="caseDetail.content" v-else>
-		</view>
+		<view class="xianqingye" v-html="caseDetail.content" v-else></view>
 		<aboutUs class="aboutUs"></aboutUs>
 	</view>
-
 </template>
 <script>
-	import {
-		changeTaber
-	} from '@/utils/tarberChange.js'
-	import {
-		caseslist,
-		casesDetail
-	} from '@/api/index.js'
-	import {
-		getTime
-	} from '@/utils/time.js'
-	import aboutUs from '@/components/introduce/introduce.vue'
-	export default {
-		components: {
-			aboutUs
-		},
-		data() {
-			return {
-				isShowtishi: false, //false不展示
-				isShow: true,
-				imgUrl: 'http://tianli.liuniu946.com',
-				caseList: [],
-				caseCid: 27,
-				// limit:,
-				// page:1,
-				total: '', //数据总量
-				pageSize: 5, //每页数据量
-				pageNum: 1, //当前页
-				caseDetail: {}
-			}
+import { changeTaber } from '@/utils/tarberChange.js';
+import { caseslist, casesDetail } from '@/api/index.js';
+import { getTime } from '@/utils/time.js';
+import aboutUs from '@/components/public/introduce.vue'
+import heard from '@/components/public/heard.vue';
+export default {
+	components: {
+		aboutUs,heard
+	},
+	data() {
+		return {
+			isShowtishi: false, //false不展示
+			isShow: true,
+			imgUrl: 'http://tianli.liuniu946.com',
+			caseList: [],
+			caseCid: 27,
+			// limit:,
+			// page:1,
+			total: '', //数据总量
+			pageSize: 5, //每页数据量
+			pageNum: 1, //当前页
+			caseDetail: {}
+		};
+	},
+
+	onLoad() {
+		// this.loadData();
+		// this.handlePage()
+		this.getCaseList();
+	},
+	onShow() {
+		this.$nextTick(function() {
+			changeTaber(2);
+		});
+	},
+	methods: {
+		async loadData() {
+			const obj = this;
 		},
+		handlePage(params) {
+			console.log(params);
+			this.pageNum = params.current;
 
-		onLoad() {
-			// this.loadData();
-			// this.handlePage()
-			changeTaber(2)
-			this.getCaseList()
+			this.getCaseList();
 		},
-		methods: {
-			async loadData() {
-				const obj = this;
-			},
-			handlePage(params) {
-				console.log(params)
-				this.pageNum = params.current;
-
-				this.getCaseList()
-			},
-			//获取案例
-			getCaseList() {
-				let obj = this
-				caseslist({
-					category_id: obj.caseCid,
-					page: obj.pageNum,
-					limit: obj.pageSize
-				}).then(({
-					data
-				}) => {
-					data.list.forEach(e => {
-						e.createtime = getTime(e.createtime)
-					})
-					console.log(data, '111111')
-					obj.caseList = data.list
-					obj.total = data.count
-					if (data.list.length < 5) {
-						this.isShowtishi = true
-					} else {
-						this.isShowtishi = false
-					}
-				})
-			},
-			//大概,
-			nav(id) {
-				this.isShow = false;
-				casesDetail({}, id).then(res => {
-					console.log(res, "111111")
-					this.caseDetail = res.data
-					// }).catch(err => {
-					// 	this.gsjj = err.data
-					// 	console.log("2222222222")
-					// 	console.log(err, 'cuoww')
-					// })
-				})
-			},
-
+		//获取案例
+		getCaseList() {
+			let obj = this;
+			caseslist({
+				category_id: obj.caseCid,
+				page: obj.pageNum,
+				limit: obj.pageSize
+			}).then(({ data }) => {
+				data.list.forEach(e => {
+					e.createtime = getTime(e.createtime);
+				});
+				console.log(data, '111111');
+				obj.caseList = data.list;
+				obj.total = data.count;
+				if (data.list.length < 5) {
+					this.isShowtishi = true;
+				} else {
+					this.isShowtishi = false;
+				}
+			});
+		},
+		//大概,
+		nav(id) {
+			this.isShow = false;
+			casesDetail({}, id).then(res => {
+				console.log(res, '111111');
+				this.caseDetail = res.data;
+				// }).catch(err => {
+				// 	this.gsjj = err.data
+				// 	console.log("2222222222")
+				// 	console.log(err, 'cuoww')
+				// })
+			});
 		}
 	}
+};
 </script>
 
 <style lang="scss" scoped>
-	page {
-		height: 100%;
-
-	}
-
-	.center {
-		height: 100%;
-	}
-
-	.img {
-		margin: 17rpx 0 17rpx 41rpx;
-		width: 208rpx;
-		height: 52rpx;
-
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
 
-	.aboutUs {
-		width: 100%;
+.tishi {
+	font-size: 16rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #c7c9d1;
+	line-height: 101px;
+}
+
+.test_title {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	width: 100%;
+	height: 60rpx;
+	font-size: 22rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #ffffff;
+	background-color: #0165b5;
+}
+
+.box {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding-bottom: 150rpx;
+	.pagination {
 		position: fixed;
-		left: 0;
 		bottom: 0;
-		margin-bottom: 100rpx;
-	}
-
-	.tishi {
-		font-size: 16rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #C7C9D1;
-		line-height: 101px;
-	}
-
-	.test_title {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		width: 100%;
-		height: 60rpx;
-		font-size: 22rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #FFFFFF;
-		background-color: #0165B5;
+		left: 0;
+		bottom: 232rpx;
 	}
 
-	.box {
+	.caseBox {
+		margin-top: 20rpx;
 		display: flex;
-		flex-direction: column;
 		align-items: center;
+		width: 90%;
+		height: 100%;
 
+		.caseBox-img {
+			flex-shrink: 1;
+			width: 240rpx;
+			height: 160rpx;
 
-			.pagination {
-				position: fixed;
-				bottom: 0;
-				left: 0;
-				bottom:232rpx;
+			image {
+				width: 100%;
+				height: 100%;
 			}
-		
+		}
 
-		.caseBox {
-			margin-top: 20rpx;
+		.caseBox-right {
+			margin-left: 30rpx;
+			width: 440rpx;
 			display: flex;
-			align-items: center;
-			width: 90%;
-			height: 100%;
-
-			.caseBox-img {
-				flex-shrink: 1;
-				width: 240rpx;
-				height: 160rpx;
-
-				image {
-					width: 100%;
-					height: 100%;
-				}
+			flex-direction: column;
+
+			.title {
+				margin-top: -70rpx;
+				font-size: 18rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #535962;
+				max-width: 420rpx;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
 			}
 
-			.caseBox-right {
-				margin-left: 30rpx;
-				width: 440rpx;
-				display: flex;
-				flex-direction: column;
-
-
-				.title {
-					margin-top: -70rpx;
-					font-size: 18rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #535962;
-					max-width: 420rpx;
-					overflow: hidden;
-					text-overflow: ellipsis;
-					white-space: nowrap;
-
-				}
-
-				.date {
-					margin-top: 10rpx;
-					font-size: 11rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #A1A1A1;
-					line-height: 20rpx;
-				}
+			.date {
+				margin-top: 10rpx;
+				font-size: 11rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #a1a1a1;
+				line-height: 20rpx;
+			}
 
-				.content {
-					font-size: 15rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #A1A1A1;
-					line-height: 46rpx;
-					max-width: 420rpx;
-					overflow: hidden;
-					text-overflow: ellipsis;
-					white-space: nowrap;
-				}
+			.content {
+				font-size: 15rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #a1a1a1;
+				line-height: 46rpx;
+				max-width: 420rpx;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
 			}
 		}
 	}
+}
 
+// .uni-pagination__child-btn{
 
-	// .uni-pagination__child-btn{
-
-	// }
-	// 	.pagInation > .uni-pagination>.uni-pagination__btn > .uni-pagination__child-btn > span{
+// }
+// 	.pagInation > .uni-pagination>.uni-pagination__btn > .uni-pagination__child-btn > span{
 
-	// }
+// }
 </style>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 563 - 415
pages/index/index.vue


+ 180 - 204
pages/news/news.vue

@@ -1,32 +1,17 @@
 <template>
 	<view class="center">
-		<view class="img">
-			<image src="../../static/img/logo.png" mode=""></image>
-		</view>
-		<view class="test_title">
-			新闻动态
-		</view>
+		<heard></heard>
+		<view class="test_title">新闻动态</view>
 		<view class="box" v-if="isShow">
-			<view class="caseBox" v-for="(item,index) in newsList"  @click="nav(item.id)">
-				<view class="caseBox-img">
-					<image :src="imgUrl+item.coverimage" mode=""></image>
-				</view>
+			<view class="caseBox" v-for="(item, index) in newsList" @click="nav(item.id)">
+				<view class="caseBox-img"><image :src="imgUrl + item.coverimage" mode=""></image></view>
 				<view class="caseBox-right">
-					<view class="title">
-						{{item.title}}
-					</view>
-					<view class="date">
-						{{item.createtime}}
-					</view>
-					<view class="content">
-						{{item.synopsis}}
-					</view>
+					<view class="title">{{ item.title }}</view>
+					<view class="date">{{ item.createtime }}</view>
+					<view class="content">{{ item.synopsis }}</view>
 				</view>
 			</view>
-			<view class="tishi" v-if="isShowtishi">
-				已加载全部数据~~
-			</view>
-			
+			<view class="tishi" v-if="isShowtishi">已加载全部数据~~</view>
 
 			<view class="pagInation">
 				<!-- prevText	String	上一页	左侧按钮文字
@@ -39,227 +24,218 @@
 				 type值为:next/prev,表示点击的是上一页还是下一个-->
 				<!-- 	<uni-pagination title="标题文字" prevText="" nextText="" pageSize="10" total="20" @change="" ></uni-pagination> -->
 				<!-- <uni-pagination title="标题文字" show-icon="true" total="50" current="2"></uni-pagination> -->
-				<uni-pagination class="pagination" prevText="上一页" nextText="下一页" @change="handlePage" show-icon="false" :total="total" :current="pageNum" :pageSize="pageSize"></uni-pagination>
+				<uni-pagination
+					class="pagination"
+					prevText="上一页"
+					nextText="下一页"
+					@change="handlePage"
+					show-icon="false"
+					:total="total"
+					:current="pageNum"
+					:pageSize="pageSize"
+				></uni-pagination>
 			</view>
 		</view>
-		<view class="xianqingye" v-html="newsDetail.content" v-else>	
-		</view>
+		<view class="xianqingye" v-html="newsDetail.content" v-else></view>
 		<aboutUs class="aboutUs"></aboutUs>
 	</view>
-
 </template>
 <script>
-	import {changeTaber} from '@/utils/tarberChange.js'
-	import {newslist,newsDetail} from '@/api/index.js'
-	import {getTime} from '@/utils/time.js'
-	
-	import aboutUs from '@/components/introduce/introduce.vue'
-	export default {
-		components: {
-			aboutUs
-		},
-		data() {
-			return {
-				isShowtishi:false,//false不展示
-				isShow:true,
-				imgUrl: 'http://tianli.liuniu946.com',
-				newsList: [],
-				newsCid:30,
-				// limit:,
-				// page:1,
-				total: '',//数据总量
-				pageSize: 5,//每页数据量
-				pageNum: 1,//当前页
-				newsDetail:{}
-			}
+import { changeTaber } from '@/utils/tarberChange.js';
+import { newslist, newsDetail } from '@/api/index.js';
+import { getTime } from '@/utils/time.js';
+import heard from '@/components/public/heard.vue';
+import aboutUs from '@/components/public/introduce.vue';
+export default {
+	components: {
+		aboutUs,
+		heard
+	},
+	data() {
+		return {
+			isShowtishi: false, //false不展示
+			isShow: true,
+			imgUrl: 'http://tianli.liuniu946.com',
+			newsList: [],
+			newsCid: 30,
+			// limit:,
+			// page:1,
+			total: '', //数据总量
+			pageSize: 5, //每页数据量
+			pageNum: 1, //当前页
+			newsDetail: {}
+		};
+	},
+
+	onLoad() {
+		// this.loadData();
+		// this.handlePage()
+		this.getNewsList();
+	},
+	onShow() {
+		this.$nextTick(function() {
+			changeTaber(3);
+		});
+	},
+	methods: {
+		async loadData() {
+			const obj = this;
 		},
 
-		onLoad() {
-			// this.loadData();
-			// this.handlePage()
-			this.$nextTick(function(){
-				changeTaber(3)
-			})
-			this.getNewsList()
+		//分页
+		handlePage(params) {
+			console.log(params);
+			this.pageNum = params.current;
+			this.getNewsList();
 		},
-		methods: {
-			async loadData() {	
-				const obj = this;
-			},
-			
-			//分页
-			handlePage(params) {
-				console.log(params)
-				this.pageNum = params.current;
-				this.getNewsList()
-			},
-			//获取案例
-			getNewsList() {
-				let obj = this
-				newslist({
-					category_id: obj.newsCid,
-					page: obj.pageNum,
-					limit: obj.pageSize
-				}).then(({data}) => {					
-					data.list.forEach(e => {
-						e.createtime = getTime(e.createtime)
-					})
-				console.log(data, '111111')
-				obj.newsList = data.list
-				obj.total = data.count
-				if(data.list.length < 5) {
-					this.isShowtishi = true
-				}else{
-					this.isShowtishi = false
+		//获取案例
+		getNewsList() {
+			let obj = this;
+			newslist({
+				category_id: obj.newsCid,
+				page: obj.pageNum,
+				limit: obj.pageSize
+			}).then(({ data }) => {
+				data.list.forEach(e => {
+					e.createtime = getTime(e.createtime);
+				});
+				console.log(data, '111111');
+				obj.newsList = data.list;
+				obj.total = data.count;
+				if (data.list.length < 5) {
+					this.isShowtishi = true;
+				} else {
+					this.isShowtishi = false;
 				}
-				})
-			},
-			//大概,
+			});
+		},
+		//大概,
 		nav(id) {
 			this.isShow = false;
 			newsDetail({}, id).then(res => {
-					console.log(res, "111111")
-					this.newsDetail =res.data
+				console.log(res, '111111');
+				this.newsDetail = res.data;
 				// }).catch(err => {
 				// 	this.gsjj = err.data
 				// 	console.log("2222222222")
 				// 	console.log(err, 'cuoww')
 				// })
-			})
-		},
-		
+			});
 		}
 	}
+};
 </script>
 
 <style lang="scss" scoped>
-	page {
-		height: 100%;
 
-	}
-
-	.center {
-		height: 100%;
-	}
-
-	.img {
-		margin: 17rpx 0 17rpx 41rpx;
-		width: 208rpx;
-		height: 52rpx;
+.img {
+	margin: 17rpx 0 17rpx 41rpx;
+	width: 208rpx;
+	height: 52rpx;
 
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-.aboutUs {
+	image {
 		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 0;
-		margin-bottom: 100rpx;
-	}
-	.pagination {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		bottom:232rpx;
-	}
-			
-	.tishi{
-		font-size: 16rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #C7C9D1;
-		line-height: 101px;
+		height: 100%;
 	}
-
-	.test_title {
+}
+.pagination {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	bottom: 232rpx;
+}
+
+.tishi {
+	font-size: 16rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #c7c9d1;
+	line-height: 101px;
+}
+
+.test_title {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	width: 100%;
+	height: 60rpx;
+	font-size: 22rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #ffffff;
+	background-color: #0165b5;
+}
+
+.box {
+	display: flex;
+	flex-direction: column;
+
+	align-items: center;
+
+	.caseBox {
+		margin-top: 20rpx;
 		display: flex;
-		justify-content: center;
 		align-items: center;
-		width: 100%;
-		height: 60rpx;
-		font-size: 22rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #FFFFFF;
-		background-color: #0165B5;
-	}
+		width: 90%;
+		height: 100%;
 
-	.box {
-		display: flex;
-		flex-direction: column;
+		.caseBox-img {
+			flex-shrink: 1;
+			width: 240rpx;
+			height: 160rpx;
 
-		align-items: center;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
 
-		.caseBox {
-			margin-top: 20rpx;
+		.caseBox-right {
+			margin-left: 30rpx;
+			width: 440rpx;
 			display: flex;
-			align-items: center;
-			width: 90%;
-			height: 100%;
-
-			.caseBox-img {
-				flex-shrink: 1;
-				width: 240rpx;
-				height: 160rpx;
-
-				image {
-					width: 100%;
-					height: 100%;
-				}
+			flex-direction: column;
+
+			.title {
+				margin-top: -70rpx;
+				font-size: 18rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #535962;
+				max-width: 420rpx;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
 			}
 
-			.caseBox-right {
-				margin-left: 30rpx;
-				width: 440rpx;
-				display: flex;
-				flex-direction: column;
-
-
-				.title {
-					margin-top: -70rpx;
-					font-size: 18rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #535962;
-					max-width: 420rpx;
-					overflow: hidden;
-					text-overflow: ellipsis;
-					white-space: nowrap;
-
-				}
-
-				.date {
-					margin-top: 10rpx;
-					font-size: 11rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #A1A1A1;
-					line-height: 20rpx;
-				}
+			.date {
+				margin-top: 10rpx;
+				font-size: 11rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #a1a1a1;
+				line-height: 20rpx;
+			}
 
-				.content {
-					font-size: 15rpx;
-					font-family: Adobe Heiti Std;
-					font-weight: normal;
-					color: #A1A1A1;
-					line-height: 46rpx;
-					max-width: 420rpx;
-					overflow: hidden;
-					text-overflow: ellipsis;
-					white-space: nowrap;
-				}
+			.content {
+				font-size: 15rpx;
+				font-family: Adobe Heiti Std;
+				font-weight: normal;
+				color: #a1a1a1;
+				line-height: 46rpx;
+				max-width: 420rpx;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
 			}
 		}
 	}
+}
 
+// .uni-pagination__child-btn{
 
-	// .uni-pagination__child-btn{
-
-	// }
-	// 	.pagInation > .uni-pagination>.uni-pagination__btn > .uni-pagination__child-btn > span{
+// }
+// 	.pagInation > .uni-pagination>.uni-pagination__btn > .uni-pagination__child-btn > span{
 
-	// }
+// }
 </style>

+ 669 - 757
pages/test/test.vue

@@ -1,98 +1,63 @@
 <template>
 	<view class="center">
-		<view class="img">
-			<image src="../../static/img/logo.png" mode=""></image>
-		</view>
-		<view class="test_title">
-			节水测试
-		</view>
+		<heard></heard>
+		<view class="test_title">节水测试</view>
 		<view class="form">
 			<view class="form-item">
 				<view class="form-left">姓名:</view>
 				<text class="tip">*</text>
-				<view class="form-right">
-					<input type="text" @input="onAction" class="list-input" v-model="name" placeholder="请填写姓名" />
-				</view>
+				<view class="form-right"><input type="text" @input="onAction" class="list-input" v-model="name" placeholder="请填写姓名" /></view>
 			</view>
-		<view class="form-item">
-			<view class="form-left">地址:</view>
-			<text class="tip"></text>
-			<view class="form-right"><input @input="onAction" class="list-input" v-model="address" type="text" placeholder="请填写详细地址" /></view>
-		</view>
-		<view class="form-item">
-			<view class="form-left">联系电话:</view>
-			<text class="tip">*</text>
-			<view class="form-right"><input @input="onAction" class="list-input" v-model="telephone" type="number" placeholder="请填写联系电话" /></view>
-		</view>
 			<view class="form-item">
-				<view class="form-left">
-					生产线类型:
-				</view>
+				<view class="form-left">地址:</view>
+				<text class="tip"></text>
+				<view class="form-right"><input @input="onAction" class="list-input" v-model="address" type="text" placeholder="请填写详细地址" /></view>
+			</view>
+			<view class="form-item">
+				<view class="form-left">联系电话:</view>
+				<text class="tip">*</text>
+				<view class="form-right"><input @input="onAction" class="list-input" v-model="telephone" type="number" placeholder="请填写联系电话" /></view>
+			</view>
+			<view class="form-item">
+				<view class="form-left">生产线类型:</view>
 				<text class="tip">*</text>
 				<view class="form-right">
 					<picker :value="index" :range="array" @change="bindPickerType" class="list-input1">
-						<text style="color: #C7C9D1;">{{line_type || '请选择生产类型'}}</text>
+						<text style="color: #C7C9D1;">{{ line_type || '请选择生产类型' }}</text>
 					</picker>
 				</view>
 			</view>
 			<view class="form-item">
-				<view class="form-left">
-					生产线数量:
-				</view>
+				<view class="form-left">生产线数量:</view>
 				<text class="tip">*</text>
-				<view class="form-right">
-					<input class="list-input" type="number" @input="onAction" v-model="line_num"
-						placeholder="请填写生产线数量" />
-				</view>
+				<view class="form-right"><input class="list-input" type="number" @input="onAction" v-model="line_num" placeholder="请填写生产线数量" /></view>
 			</view>
 			<view class="form-item">
-				<view class="form-left">
-					目前用水量(吨/小时):
-				</view>
+				<view class="form-left">目前用水量(吨/小时):</view>
 				<text class="tip">*</text>
-				<view class="form-right">
-					<input class="list-input" type="number" @input="onAction" v-model="water_using"
-						placeholder="请填写目前用水量" />
-				</view>
+				<view class="form-right"><input class="list-input" type="number" @input="onAction" v-model="water_using" placeholder="请填写目前用水量" /></view>
 			</view>
 			<view class="form-item">
 				<view class="form-left">工作时长(小时):</view>
 				<text class="tip"></text>
-				<view class="form-right">
-					<input @input="onAction" class="list-input" v-model="day_work_times" type="number"
-						placeholder="请填写每日工作时长,默认为12小时" />
-				</view>
+				<view class="form-right"><input @input="onAction" class="list-input" v-model="day_work_times" type="number" placeholder="请填写每日工作时长,默认为12小时" /></view>
 			</view>
 			<view class="form-item">
 				<view class="form-left">年工作日数:</view>
 				<text class="tip"></text>
-				<view class="form-right">
-					<input @input="onAction" class="list-input" v-model="year_work_day" type="number"
-						placeholder="请填写每年工作日数,默认为330天" />
-				</view>
+				<view class="form-right"><input @input="onAction" class="list-input" v-model="year_work_day" type="number" placeholder="请填写每年工作日数,默认为330天" /></view>
 			</view>
 			<view class="form-item">
 				<view class="form-left">废水处理成本(元/吨):</view>
 				<text class="tip">*</text>
-				<view class="form-right">
-					<input @input="onAction" class="list-input" v-model="deal_cost" type="number"
-						placeholder="请填写废水处理成本" />
-				</view>
-			</view>
-		</view>
-		<view class="btn" @click="next" v-if="isShow">
-			<view class="btn-left">
-				提交
+				<view class="form-right"><input @input="onAction" class="list-input" v-model="deal_cost" type="number" placeholder="请填写废水处理成本" /></view>
 			</view>
 		</view>
-		<view class="result" >
-			<view class="result-title">
-				测试结果
-			</view>
-			<view class="border">
-
-			</view>
-			<view class="result-box"  >
+		<view class="btn" @click="next" v-if="isShow"><view class="btn-left">提交</view></view>
+		<view class="result">
+			<view class="result-title">测试结果</view>
+			<view class="border"></view>
+			<view class="result-box">
 				<view class="swiper-item" v-if="num1">
 					<view class="effect">
 						<view class="title">改造后的数据</view>
@@ -121,773 +86,720 @@
 				</view>
 			</view>
 		</view>
-		<view class="tanchang">
-
-		</view>
-		<view class="botton-box">
-
-		</view>
+		<view class="tanchang"></view>
+		<view class="botton-box"></view>
 		<aboutUs class="aboutUs"></aboutUs>
-
 	</view>
 </template>
 <script>
-	import {
-		loadIndexs, cateList, aboutlist, storylist, caseslist, productlist, articlelist, addForm, companies, machine, machineId 
-	} from '@/api/index.js';
-	import aboutUs from "@/components/introduce/introduce.vue"
-	import {
-		
-		changeTaber
-	} from "@/utils/tarberChange.js"
-	export default {
-		components: {
-			
-			aboutUs
-		},
-		data() {
-			return {
-				isShow:true,
-				type: '',
-				name: '',
-				address: '',
-				telephone: '',
-				line_type: '',
-				line_num: '',
-				water_using: '',
-				day_work_times: '',
-				year_work_day: '',
-				deal_cost: '',
-				array: ['塑料镀铬线', '五金镀铬线'],
-				index:'',
-				num4:'',
-				num3:'',
-				num2:'',
-				num1:''
+import { loadIndexs, cateList, aboutlist, storylist, caseslist, productlist, articlelist, addForm, companies, machine, machineId } from '@/api/index.js';
+import aboutUs from '@/components/public/introduce.vue';
+import { changeTaber } from '@/utils/tarberChange.js';
+import heard from '@/components/public/heard.vue';
+export default {
+	components: {
+		aboutUs,
+		heard
+	},
+	data() {
+		return {
+			isShow: true,
+			type: '',
+			name: '',
+			address: '',
+			telephone: '',
+			line_type: '',
+			line_num: '',
+			water_using: '',
+			day_work_times: '',
+			year_work_day: '',
+			deal_cost: '',
+			array: ['塑料镀铬线', '五金镀铬线'],
+			index: '',
+			num4: '',
+			num3: '',
+			num2: '',
+			num1: ''
+		};
+	},
+	onLoad() {
+		this.loadData();
+	},
+	onShow(){
+		this.$nextTick(function() {
+			changeTaber(4);
+		});
+	},
+	methods: {
+		alertChange(tab) {
+			if (tab.show) {
+				this.onAction(false);
+			} else {
+				this.onAction();
 			}
 		},
-		onLoad() {
-			// this.loadData();
-			this.$nextTick(function(){
-				changeTaber(4)
-			})
-			this.loadData();
-			
+		/* 设置弹窗 */
+		zoomendChange(type) {
+			this.zoomActive = type.target.getZoom();
 		},
-		methods: {
-			alertChange(tab) {
-				if (tab.show) {
-					this.onAction(false);
-				} else {
-					this.onAction();
-				}
-			},
-			/* 设置弹窗 */
-			zoomendChange(type) {
-				this.zoomActive = type.target.getZoom();
-			},
-			// 显示数据
-			showData(item) {
-				this.autoPlay = false;
-				console.log('点击小点点------', item.name);
-				this.itemData = item;
-				this.machineid = item.id;
-
-				this.$refs.popupItem.open();
-				// machine({id: this.machineid}).then(e => {
-				machine({}, this.machineid)
-					.then(e => {
-						// this.machineData = e.data;
-						console.log('======>', e);
-						this.machineDataModal = e.data;
-						this.machineDataModal.machine_name = item.name;
-					})
-					.catch(e => {
-						console.log(e);
-					});
-			},
-			toPre() {
+		// 显示数据
+		showData(item) {
+			this.autoPlay = false;
+			console.log('点击小点点------', item.name);
+			this.itemData = item;
+			this.machineid = item.id;
+
+			this.$refs.popupItem.open();
+			// machine({id: this.machineid}).then(e => {
+			machine({}, this.machineid)
+				.then(e => {
+					// this.machineData = e.data;
+					console.log('======>', e);
+					this.machineDataModal = e.data;
+					this.machineDataModal.machine_name = item.name;
+				})
+				.catch(e => {
+					console.log(e);
+				});
+		},
+		toPre() {
+			console.log('this.checkid', this.checkid);
+			if (this.checkid > 0) {
+				this.checkid--;
 				console.log('this.checkid', this.checkid);
-				if (this.checkid > 0) {
-					this.checkid--;
-					console.log('this.checkid', this.checkid);
-				} else {
-					this.checkid = 2;
-				}
-			},
-			toNext() {
+			} else {
+				this.checkid = 2;
+			}
+		},
+		toNext() {
+			console.log('this.checkid', this.checkid);
+			if (this.checkid < 2) {
+				this.checkid++;
 				console.log('this.checkid', this.checkid);
-				if (this.checkid < 2) {
-					this.checkid++;
-					console.log('this.checkid', this.checkid);
-				} else {
-					this.checkid = 0;
-				}
-			},
-			// 获取设备信息
-			machine() {
-				machine({}, 0)
-					.then(e => {
-						// console.log('获取设备信息');
-						this.machineData = e.data;
-						// console.log(e);
-					})
-					.catch(e => {
-						console.log(e);
-					});
-			},
-			// 获取公司列表
-			getMapList() {
-				// zhong
-				companies()
-					.then(e => {
-						this.companyList = e.data.map(e => {
-							// 初始化弹窗显示隐藏
-							e.show = false;
-							// e.lattitude = 28.243198;
-							// e.longtitude = 121.279239;
-							// 设置文字样式
-							e.textType = {
-								width: -((e.name.length / 2) * 10),
-								height: 30
-							};
-							e.style = {
-								background: 'none',
-								color: '#333333',
-								fontSize: '10px',
-								border: 'none'
-							};
-							return e;
-						});
-						// 设置数据加载完毕
-						this.mapLoding = true;
-						// uni.showModal({
-						// 	title: '提示',
-						// 	content: '地图加载完毕',
-						// 	showCancel: false
-						// });
-						// console.log('公司列表', this.companyList);
-					})
-					.catch(e => {
-						console.log(e);
-					});
-			},
-			// 初始化地图/
-			init({
-				BMap,
-				map
-			}) {
-				this.map = map;
-				// 初始化地图,设置中心点坐标
-				var point = new BMap.Point(121.434817, 28.653649);
-				map.centerAndZoom(point, this.zoomActive);
-				// this.setMarker();
-				// 添加鼠标滚动缩放
-				// map.enableScrollWheelZoom();
-			},
-			//切换事件
-			onAction(start = true) {
-				console.log('触发点击');
-				this.autoPlay = false;
-				clearTimeout(this.outPlay);
-				if (start) {
-					this.outPlay = setTimeout(e => {
-						this.autoPlay = true;
-					}, this.setOutTime);
-				}
-			},
-			// 渲染首页数据
-			async loadData() {
-				loadIndexs({}).then(({
-					data
-				}) => {
-					this.carouselList = data.loopProduct.map(item => 'http://tianli.liuniu946.com/' + item
-						.coverimage);
-					this.list3 = data;
+			} else {
+				this.checkid = 0;
+			}
+		},
+		// 获取设备信息
+		machine() {
+			machine({}, 0)
+				.then(e => {
+					// console.log('获取设备信息');
+					this.machineData = e.data;
+					// console.log(e);
+				})
+				.catch(e => {
+					console.log(e);
 				});
-			},
-
-			// 表单交互 提交
-			next() {
-				if (this.name == '') {
-					uni.showToast({
-						title: '请输入您的姓名',
-						icon: 'none',
-						duration: 2000
-					});
-					this.$api.msg('');
-					return;
-				}
-				if (this.address == '') {
-					uni.showToast({
-						title: '请填写详细地址',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请填写详细地址');
-					return;
-				}
-				if (this.telephone == '') {
-					uni.showToast({
-						title: '请填写联系电话',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请填写联系电话');
-					return;
-				}
-				const reg = /^(\+?0?86-?)?1[\d]\d{9}$/;
-				if (!reg.test(this.telephone)) {
-					uni.showToast({
-						title: '请填写正确的手机格式',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请输入您的手机号码');
-					return;
-				}
-				if (this.line_type == '') {
-					uni.showToast({
-						title: '请填写生产线类型',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请输入生产线类型');
-					return;
-				}
-				if (this.line_num == '') {
-					uni.showToast({
-						title: '请填写生产线数量',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请输入生产线数量');
-					return;
-				}
-				if (this.water_using == '') {
-					uni.showToast({
-						title: '请填写目前用水量',
-						icon: 'none',
-						duration: 2000
+		},
+		// 获取公司列表
+		getMapList() {
+			// zhong
+			companies()
+				.then(e => {
+					this.companyList = e.data.map(e => {
+						// 初始化弹窗显示隐藏
+						e.show = false;
+						// e.lattitude = 28.243198;
+						// e.longtitude = 121.279239;
+						// 设置文字样式
+						e.textType = {
+							width: -((e.name.length / 2) * 10),
+							height: 30
+						};
+						e.style = {
+							background: 'none',
+							color: '#333333',
+							fontSize: '10px',
+							border: 'none'
+						};
+						return e;
 					});
-					// this.$api.msg('请填写目前用水量');
-					return;
-				}
+					// 设置数据加载完毕
+					this.mapLoding = true;
+					// uni.showModal({
+					// 	title: '提示',
+					// 	content: '地图加载完毕',
+					// 	showCancel: false
+					// });
+					// console.log('公司列表', this.companyList);
+				})
+				.catch(e => {
+					console.log(e);
+				});
+		},
+		// 初始化地图/
+		init({ BMap, map }) {
+			this.map = map;
+			// 初始化地图,设置中心点坐标
+			var point = new BMap.Point(121.434817, 28.653649);
+			map.centerAndZoom(point, this.zoomActive);
+			// this.setMarker();
+			// 添加鼠标滚动缩放
+			// map.enableScrollWheelZoom();
+		},
+		//切换事件
+		onAction(start = true) {
+			console.log('触发点击');
+			this.autoPlay = false;
+			clearTimeout(this.outPlay);
+			if (start) {
+				this.outPlay = setTimeout(e => {
+					this.autoPlay = true;
+				}, this.setOutTime);
+			}
+		},
+		// 渲染首页数据
+		async loadData() {
+			loadIndexs({}).then(({ data }) => {
+				this.carouselList = data.loopProduct.map(item => 'http://tianli.liuniu946.com/' + item.coverimage);
+				this.list3 = data;
+			});
+		},
 
-				if (this.deal_cost == '') {
-					uni.showToast({
-						title: '请填写废水处理成本',
-						icon: 'none',
-						duration: 2000
-					});
-					// this.$api.msg('请填写废水处理成本');
-					return;
-				}
-				addForm({
-					name: this.name,
-					address: this.address,
-					telephone: this.telephone,
-					line_type: this.line_type,
-					line_num: this.line_num,
-					water_using: this.water_using,
-					day_work_times: 12,
-					year_work_day: 330,
-					deal_cost: this.deal_cost
-				}).then(e => {
-					console.log('请求成功');
-					(this.isshow = false),
+		// 表单交互 提交
+		next() {
+			if (this.name == '') {
+				uni.showToast({
+					title: '请输入您的姓名',
+					icon: 'none',
+					duration: 2000
+				});
+				this.$api.msg('');
+				return;
+			}
+			if (this.address == '') {
+				uni.showToast({
+					title: '请填写详细地址',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请填写详细地址');
+				return;
+			}
+			if (this.telephone == '') {
+				uni.showToast({
+					title: '请填写联系电话',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请填写联系电话');
+				return;
+			}
+			const reg = /^(\+?0?86-?)?1[\d]\d{9}$/;
+			if (!reg.test(this.telephone)) {
+				uni.showToast({
+					title: '请填写正确的手机格式',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请输入您的手机号码');
+				return;
+			}
+			if (this.line_type == '') {
+				uni.showToast({
+					title: '请填写生产线类型',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请输入生产线类型');
+				return;
+			}
+			if (this.line_num == '') {
+				uni.showToast({
+					title: '请填写生产线数量',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请输入生产线数量');
+				return;
+			}
+			if (this.water_using == '') {
+				uni.showToast({
+					title: '请填写目前用水量',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请填写目前用水量');
+				return;
+			}
+
+			if (this.deal_cost == '') {
+				uni.showToast({
+					title: '请填写废水处理成本',
+					icon: 'none',
+					duration: 2000
+				});
+				// this.$api.msg('请填写废水处理成本');
+				return;
+			}
+			addForm({
+				name: this.name,
+				address: this.address,
+				telephone: this.telephone,
+				line_type: this.line_type,
+				line_num: this.line_num,
+				water_using: this.water_using,
+				day_work_times: 12,
+				year_work_day: 330,
+				deal_cost: this.deal_cost
+			}).then(e => {
+				console.log('请求成功');
+				(this.isshow = false),
 					uni.pageScrollTo({
 						scrollTop: 0,
 						duration: 0
 					});
-					/** 
+				/** 
 								交互式表单公式
 									改造后用水量为:目前用水量的30%—70%
 									经济效益=节约的水量X年工作时长(小时)X废水处理成本
 									节约的水量=目前用水量—改造后的用水量
 									经济效益也是一个范围值
 							 **/
-					// 改造后用水量
-					// this.num1 = this.water_using * 0.3;
-					// this.num2 = this.water_using * 0.7;
-					this.num1 = parseFloat(this.water_using * 0.3).toFixed(2);
-					this.num2 = parseFloat(this.water_using * 0.7).toFixed(2);
-
-					console.log('this.num1', this.num1);
-
-					// 节约的水量=目前用水量—改造后的用水量
-					this.savaWater1 = this.water_using - this.num1;
-					this.savaWater2 = this.water_using - this.num2;
-
-					console.log('this.savaWater1', this.savaWater1);
-					console.log('this.day_work_times', this.day_work_times);
-					console.log('this.deal_cost', this.deal_cost);
-
-					// 经济效益=节约的水量X年工作时长(小时)X废水处理成本
-					this.num3 = parseFloat((this.savaWater1 * 3960 * this.deal_cost) / 10000).toFixed(2);
-					this.num4 = parseFloat((this.savaWater2 * 3960 * this.deal_cost) / 10000).toFixed(2);
-
-					// this.name = "";
-					// this.address = "";
-					// this.telephone = "";
-					// this.line_type = "";
-					// this.line_num = "";
-					// this.water_using = "";
-					// this.day_work_times = "";
-					// this.year_work_day = "";
-					// this.deal_cost = "";
+				// 改造后用水量
+				// this.num1 = this.water_using * 0.3;
+				// this.num2 = this.water_using * 0.7;
+				this.num1 = parseFloat(this.water_using * 0.3).toFixed(2);
+				this.num2 = parseFloat(this.water_using * 0.7).toFixed(2);
+
+				console.log('this.num1', this.num1);
+
+				// 节约的水量=目前用水量—改造后的用水量
+				this.savaWater1 = this.water_using - this.num1;
+				this.savaWater2 = this.water_using - this.num2;
+
+				console.log('this.savaWater1', this.savaWater1);
+				console.log('this.day_work_times', this.day_work_times);
+				console.log('this.deal_cost', this.deal_cost);
+
+				// 经济效益=节约的水量X年工作时长(小时)X废水处理成本
+				this.num3 = parseFloat((this.savaWater1 * 3960 * this.deal_cost) / 10000).toFixed(2);
+				this.num4 = parseFloat((this.savaWater2 * 3960 * this.deal_cost) / 10000).toFixed(2);
+
+				// this.name = "";
+				// this.address = "";
+				// this.telephone = "";
+				// this.line_type = "";
+				// this.line_num = "";
+				// this.water_using = "";
+				// this.day_work_times = "";
+				// this.year_work_day = "";
+				// this.deal_cost = "";
+			});
+		},
+		change(item) {
+			// console.log('-----this.checkid', item);
+			let id = item;
+			this.checkid = id;
+			this.onAction();
+		},
+
+		// 重新测试
+		refresh() {
+			this.isshow = true;
+			uni.pageScrollTo({
+				scrollTop: 0,
+				duration: 0
+			});
+		},
+		// 选择生产线类型
+		bindPickerType: function(e) {
+			console.log(this.array[e.target.value]);
+			this.line_type = this.array[e.target.value];
+			this.index = e.target.value + 1;
+			this.onAction();
+		},
+		change1(item) {
+			console.log(123, item);
+			let id = item;
+			this.checkid1 = id;
+		},
+		// 监听切换事件
+		listChange(e) {
+			// 触发改变事件
+			this.onAction();
+			this.checkid = e.detail.current;
+			if (this.checkid == 1 && !this.showMap) {
+				this.showMap = true;
+			}
+			// uni.pageScrollTo({
+			// 	duration: 0, //过渡时间必须为0,uniapp bug,否则运行到手机会报错
+			// 	scrollTop: 0 //滚动到实际距离是元素距离顶部的距离减去最外层盒子的滚动距离
+			// });
+		},
+		listChange1(id) {
+			this.current = id;
+		},
+		// 点击更多 导航
+		toNavList() {
+			this.$refs.popup.open();
+		},
+
+		goBack(type) {
+			this.$refs[type][0].close();
+		},
+
+		cancel() {
+			this.$refs.popup.close();
+		},
+		cancelAll(type) {
+			this.$refs.popup.close();
+			this.$refs[type][0].close();
+		},
+		handlePop(index, type) {
+			this.type = type;
+			console.log('this.type', this.type);
+			this.$refs[type][0].open();
+			cateList({}, this.type).then(({ data }) => {
+				this.productList = data;
+			});
+		},
+
+		// 获取子列表
+		navInfo(id, name, item) {
+			let obj = this;
+			obj.category_id = id;
+			obj.current = id;
+			console.log('进入', obj.type);
+			if (obj.type == 'about') {
+				aboutlist({
+					// title: obj.title,
+					category_id: obj.category_id,
+					page: obj.page,
+					limit: obj.limit
+				}).then(({ data }) => {
+					obj.list1 = data.list.map(item => ({
+						title: item.title,
+						id: item.id
+					}));
 				});
-			},
-			change(item) {
-				// console.log('-----this.checkid', item);
-				let id = item;
-				this.checkid = id;
-				this.onAction();
-			},
-
-			// 重新测试
-			refresh() {
-				this.isshow = true;
-				uni.pageScrollTo({
-					scrollTop: 0,
-					duration: 0
+			}
+			if (obj.type == 'story') {
+				storylist({
+					// title: obj.title,
+					category_id: obj.category_id,
+					page: obj.page,
+					limit: obj.limit
+				}).then(({ data }) => {
+					obj.list1 = data.list.map(item => ({
+						title: item.title,
+						id: item.id
+					}));
 				});
-			},
-			// 选择生产线类型
-			bindPickerType: function(e) {
-				console.log(this.array[e.target.value]);
-				this.line_type = this.array[e.target.value];
-				this.index = e.target.value + 1;
-				this.onAction();
-			},
-			change1(item) {
-				console.log(123, item);
-				let id = item;
-				this.checkid1 = id;
-			},
-			// 监听切换事件
-			listChange(e) {
-				// 触发改变事件
-				this.onAction();
-				this.checkid = e.detail.current;
-				if (this.checkid == 1 && !this.showMap) {
-					this.showMap = true;
-				}
-				// uni.pageScrollTo({
-				// 	duration: 0, //过渡时间必须为0,uniapp bug,否则运行到手机会报错
-				// 	scrollTop: 0 //滚动到实际距离是元素距离顶部的距离减去最外层盒子的滚动距离
-				// });
-			},
-			listChange1(id) {
-				this.current = id;
-			},
-			// 点击更多 导航
-			toNavList() {
-				this.$refs.popup.open();
-			},
-
-			goBack(type) {
-				this.$refs[type][0].close();
-			},
-
-			cancel() {
-				this.$refs.popup.close();
-			},
-			cancelAll(type) {
-				this.$refs.popup.close();
-				this.$refs[type][0].close();
-			},
-			handlePop(index, type) {
-				this.type = type;
-				console.log('this.type', this.type);
-				this.$refs[type][0].open();
-				cateList({}, this.type).then(({
-					data
-				}) => {
-					this.productList = data;
+			}
+			if (obj.type == 'cases') {
+				caseslist({
+					// title: obj.title,
+					category_id: obj.category_id,
+					page: obj.page,
+					limit: obj.limit
+				}).then(({ data }) => {
+					obj.list1 = data.list.map(item => ({
+						title: item.title,
+						id: item.id
+					}));
+				});
+			}
+			if (obj.type == 'product') {
+				productlist({
+					// title: obj.title,
+					category_id: obj.category_id,
+					page: obj.page,
+					limit: obj.limit
+				}).then(({ data }) => {
+					obj.list1 = data.list.map(item => ({
+						title: item.title,
+						id: item.id
+					}));
+				});
+			}
+			//
+			if (obj.type == 'article') {
+				articlelist({
+					// title: obj.title,
+					category_id: obj.category_id,
+					page: obj.page,
+					limit: obj.limit
+				}).then(({ data }) => {
+					obj.list1 = data.list.map(item => ({
+						title: item.title,
+						id: item.id
+					}));
+				});
+			}
+		},
+		// 点击子列表
+		toproList(id) {
+			console.log('当前子列表id:', id);
+			// let id = id,
+
+			if (this.type == 'about') {
+				uni.navigateTo({
+					url: '/pages/about/about?id=' + id
+				});
+			}
+			if (this.type == 'story') {
+				uni.navigateTo({
+					url: '/pages/story/story?id=' + id
+				});
+			}
+			if (this.type == 'cases') {
+				uni.navigateTo({
+					url: '/pages/cases/cases?id=' + id
+				});
+			}
+			if (this.type == 'product') {
+				uni.navigateTo({
+					url: '/pages/product/product?id=' + id
+				});
+			}
+			if (this.type == 'article') {
+				uni.navigateTo({
+					url: '/pages/article/article?id=' + id
 				});
-			},
-
-			// 获取子列表
-			navInfo(id, name, item) {
-				let obj = this;
-				obj.category_id = id;
-				obj.current = id;
-				console.log('进入', obj.type);
-				if (obj.type == 'about') {
-					aboutlist({
-						// title: obj.title,
-						category_id: obj.category_id,
-						page: obj.page,
-						limit: obj.limit
-					}).then(({
-						data
-					}) => {
-						obj.list1 = data.list.map(item => ({
-							title: item.title,
-							id: item.id
-						}));
-					});
-				}
-				if (obj.type == 'story') {
-					storylist({
-						// title: obj.title,
-						category_id: obj.category_id,
-						page: obj.page,
-						limit: obj.limit
-					}).then(({
-						data
-					}) => {
-						obj.list1 = data.list.map(item => ({
-							title: item.title,
-							id: item.id
-						}));
-					});
-				}
-				if (obj.type == 'cases') {
-					caseslist({
-						// title: obj.title,
-						category_id: obj.category_id,
-						page: obj.page,
-						limit: obj.limit
-					}).then(({
-						data
-					}) => {
-						obj.list1 = data.list.map(item => ({
-							title: item.title,
-							id: item.id
-						}));
-					});
-				}
-				if (obj.type == 'product') {
-					productlist({
-						// title: obj.title,
-						category_id: obj.category_id,
-						page: obj.page,
-						limit: obj.limit
-					}).then(({
-						data
-					}) => {
-						obj.list1 = data.list.map(item => ({
-							title: item.title,
-							id: item.id
-						}));
-					});
-				}
-				//
-				if (obj.type == 'article') {
-					articlelist({
-						// title: obj.title,
-						category_id: obj.category_id,
-						page: obj.page,
-						limit: obj.limit
-					}).then(({
-						data
-					}) => {
-						obj.list1 = data.list.map(item => ({
-							title: item.title,
-							id: item.id
-						}));
-					});
-				}
-			},
-			// 点击子列表
-			toproList(id) {
-				console.log('当前子列表id:', id);
-				// let id = id,
-
-				if (this.type == 'about') {
-					uni.navigateTo({
-						url: '/pages/about/about?id=' + id
-					});
-				}
-				if (this.type == 'story') {
-					uni.navigateTo({
-						url: '/pages/story/story?id=' + id
-					});
-				}
-				if (this.type == 'cases') {
-					uni.navigateTo({
-						url: '/pages/cases/cases?id=' + id
-					});
-				}
-				if (this.type == 'product') {
-					uni.navigateTo({
-						url: '/pages/product/product?id=' + id
-					});
-				}
-				if (this.type == 'article') {
-					uni.navigateTo({
-						url: '/pages/article/article?id=' + id
-					});
-				}
 			}
 		}
-	};
+	}
+};
 </script>
 
 <style lang="scss">
-	page {
-		height: 100%;
-	}
-
-	.center {
-		height: 100%;
-		background: #FFFFFF;
+.center {
+	background: #ffffff;
+}
 
+.img {
+	margin: 17rpx 0 17rpx 41rpx;
+	width: 208rpx;
+	height: 52rpx;
 
-	}
-
-	.img {
-		margin: 17rpx 0 17rpx 41rpx;
-		width: 208rpx;
-		height: 52rpx;
-
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-
-	.test_title {
-		display: flex;
-		justify-content: center;
-		align-items: center;
+	image {
 		width: 100%;
-		height: 60rpx;
-		font-size: 22rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #FFFFFF;
-		background-color: #0165B5;
+		height: 100%;
 	}
+}
+
+.test_title {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	width: 100%;
+	height: 60rpx;
+	font-size: 22rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #ffffff;
+	background-color: #0165b5;
+}
+
+.test_table {
+	font-size: 22rpx;
+	font-family: Adobe Heiti Std;
+	font-weight: normal;
+	color: #000000;
+	display: flex;
+	justify-content: space-between;
+	padding: 10rpx 30rpx;
+
+	input {
+		width: 340rpx;
+		height: 40rpx;
+		background: #ffffff;
+		border: 1px solid #b9b7b7;
+		border-radius: 2rpx;
+		font-size: 16rpx;
+		padding-left: 16rpx;
+	}
+}
 
-	.test_table {
+.form {
+	background: #ffffff;
+	width: 100%;
+	padding: 14rpx;
+	// margin-top: 54rpx;
 
-		font-size: 22rpx;
-		font-family: Adobe Heiti Std;
-		font-weight: normal;
-		color: #000000;
+	.form-item {
+		width: 98%;
 		display: flex;
+		align-items: center;
 		justify-content: space-between;
-		padding: 10rpx 30rpx;
-
-		input {
-			width: 340rpx;
-			height: 40rpx;
-			background: #FFFFFF;
-			border: 1px solid #B9B7B7;
-			border-radius: 2rpx;
-			font-size: 16rpx;
-			padding-left: 16rpx;
-		}
-	}
-
-	.form {
-		background: #FFFFFF;
-		width: 100%;
-		padding: 14rpx;
-		// margin-top: 54rpx;
-
-		.form-item {
-
-			width: 98%;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			margin-top: 10rpx;
-
-			.form-left {
+		margin-top: 10rpx;
 
-				color: #212121;
-				font-size: 22rpx;
-				width: 250rpx;
-				flex-shrink: 0;
-			}
-
-			.tip {
-				margin-left: 0rpx;
-				color: #ff0000;
-				width: 34rpx;
-				height: 34rpx;
-			}
+		.form-left {
+			color: #212121;
+			font-size: 22rpx;
+			width: 250rpx;
+			flex-shrink: 0;
+		}
 
-			.form-right {
-				margin-left: 2rpx;
-				padding: 12rpx;
-				width: 100%;
-				background-color: #FFFFFF;
-				border: 2rpx solid #bdbdbd;
-				border-radius: 6rpx;
+		.tip {
+			margin-left: 0rpx;
+			color: #ff0000;
+			width: 34rpx;
+			height: 34rpx;
+		}
 
-				.list-input {
+		.form-right {
+			margin-left: 2rpx;
+			padding: 12rpx;
+			width: 100%;
+			background-color: #ffffff;
+			border: 2rpx solid #bdbdbd;
+			border-radius: 6rpx;
 
+			.list-input {
+				font-size: 18rpx;
 
+				.input-placeholder {
+					color: #c7c9d1;
 					font-size: 18rpx;
-
-					.input-placeholder {
-						color: #C7C9D1;
-						font-size: 18rpx;
-					}
 				}
+			}
 
-				.list-input1 {
-					color: #757575;
-					font-size: 18rpx;
-				}
+			.list-input1 {
+				color: #757575;
+				font-size: 18rpx;
 			}
 		}
 	}
-
-	.btn {
-		margin-top: 34rpx;
-		width: 100%;
+}
+
+.btn {
+	margin-top: 34rpx;
+	width: 100%;
+	height: 70rpx;
+	display: flex;
+	justify-content: center;
+	color: #ffffff;
+	font-size: 26rpx;
+
+	.btn-left {
+		width: 88%;
 		height: 70rpx;
 		display: flex;
 		justify-content: center;
-		color: #ffffff;
-		font-size: 26rpx;
-
-		.btn-left {
-			width: 88%;
-			height: 70rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			// margin-left: 44rpx;
-			background-color: #3874cb;
-			border-radius: 8rpx;
-		}
+		align-items: center;
+		// margin-left: 44rpx;
+		background-color: #3874cb;
+		border-radius: 8rpx;
 	}
+}
 
+.result {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
 
-
-	.result {
+	.result-title {
+		margin-top: 50rpx;
 		display: flex;
-		flex-direction: column;
 		justify-content: center;
 		align-items: center;
+		width: 180rpx;
+		height: 35rpx;
+		font-size: 26rpx;
+		font-family: Adobe Heiti Std;
+		font-weight: normal;
+		color: #000000;
+		position: relative;
+		top: 15rpx;
+		z-index: 99;
+		background-color: #ffffff;
+	}
 
-		.result-title {
-
-			margin-top: 50rpx;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			width: 180rpx;
-			height: 35rpx;
-			font-size: 26rpx;
-			font-family: Adobe Heiti Std;
-			font-weight: normal;
-			color: #000000;
-			position: relative;
-			top: 15rpx;
-			z-index: 99;
-			background-color: #FFFFFF;
-
-		}
+	.border {
+		width: 100%;
+		height: 1rpx;
+		border: 1rpx solid #eee9e9;
+	}
 
-		.border {
-			width: 100%;
-			height: 1rpx;
-			border: 1rpx solid #EEE9E9;
+	.result-box {
+		width: 100%;
+		height: 360rpx;
+		background: #0165b5;
+		margin-top: 24rpx;
+		.effect {
+			.title {
+				margin-top: 10rpx;
+				font-size: 32rpx;
+				color: #ffffff;
+				text-align: center;
+			}
 
-		}
+			.information {
+				width: 100%;
+				// height: 200rpx;
+				display: flex;
+				justify-content: space-between;
 
-		.result-box {
-			width: 100%;
-			height: 360rpx;
-			background: #0165B5;
-			margin-top: 24rpx;
-			.effect {
-				.title {
-					margin-top: 10rpx;
-					font-size: 32rpx;
-					color: #FFFFFF;
-					text-align: center;
-				}
-			
-				.information {
-					width: 100%;
-					// height: 200rpx;
+				.benefits {
+					padding: 24rpx 0;
+					width: 50%;
 					display: flex;
-					justify-content: space-between;
-			
-					.benefits {
-						padding: 24rpx 0;
-						width: 50%;
+					flex-direction: column;
+					align-items: center;
+
+					.unit {
+						width: 200rpx;
+						height: 200rpx;
+						background-color: #3874cb;
+						border-radius: 50%;
 						display: flex;
-						flex-direction: column;
+						justify-content: center;
 						align-items: center;
-			
-						.unit {
-							width: 200rpx;
-							height: 200rpx;
-							background-color: #3874cb;
-							border-radius: 50%;
-							display: flex;
-							justify-content: center;
-							align-items: center;
-							color: #ffffff;
-							font-size: 64rpx;
+						color: #ffffff;
+						font-size: 64rpx;
+						display: flex;
+						flex-direction: column;
+
+						.unit1 {
+							width: 100%;
+							font-size: 34rpx;
 							display: flex;
-							flex-direction: column;
-			
-							.unit1 {
-								width: 100%;
-								font-size: 34rpx;
-								display: flex;
-								padding-left: 34rpx;
-								justify-content: flex-start;
-								// background-color: pink;
-							}
-			
-							.unit2 {
-								font-size: 34rpx;
-								margin: 0 12rpx;
-							}
-			
-							.unit3 {
-								width: 100%;
-								font-size: 34rpx;
-								display: flex;
-								justify-content: flex-end;
-								padding-right: 34rpx;
-							}
+							padding-left: 34rpx;
+							justify-content: flex-start;
+							// background-color: pink;
 						}
-			
-						.info {
-							font-size: 24rpx;
-							margin-top: 32rpx;
+
+						.unit2 {
+							font-size: 34rpx;
+							margin: 0 12rpx;
+						}
+
+						.unit3 {
+							width: 100%;
+							font-size: 34rpx;
+							display: flex;
+							justify-content: flex-end;
+							padding-right: 34rpx;
 						}
 					}
-				}
-			
-				.refresh {
-					width: 270rpx;
-					height: 60rpx;
-					background-color: #3874cb;
-					margin: 44rpx auto;
-					display: flex;
-					justify-content: center;
-					align-items: center;
-					color: #ffffff;
-					font-size: 24rpx;
+
+					.info {
+						font-size: 24rpx;
+						margin-top: 32rpx;
+					}
 				}
 			}
-		}
-
-	}
 
-	.tanchang {
-		height: 132rpx;
+			.refresh {
+				width: 270rpx;
+				height: 60rpx;
+				background-color: #3874cb;
+				margin: 44rpx auto;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				color: #ffffff;
+				font-size: 24rpx;
+			}
+		}
 	}
+}
 
-	.aboutUs {
-		width: 100%;
-		position: fixed;
-		left: 0;
-		bottom: 0;
-		margin-bottom: 100rpx;
-	}
+.tanchang {
+	height: 132rpx;
+}
 </style>

+ 1 - 2
public/index.html

@@ -6,12 +6,12 @@
 		<title>
 			<%= htmlWebpackPlugin.options.title %>
 		</title>
-		<script src="https://unpkg.com/vue-baidu-map"></script>
 		<!-- Open Graph data -->
 		<!-- <meta property="og:title" content="Title Here" /> -->
 		<!-- <meta property="og:url" content="http://www.example.com/" /> -->
 		<!-- <meta property="og:image" content="http://example.com/image.jpg" /> -->
 		<!-- <meta property="og:description" content="Description Here" /> -->
+		<script src="https://unpkg.com/vue-baidu-map"></script>
 		<script>
 			var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS
 				.supports('top: constant(a)'))
@@ -28,5 +28,4 @@
 		<div id="app"></div>
 		<!-- built files will be auto injected -->
 	</body>
-	
 </html>

BIN
static/images/info004.png


BIN
static/images/info005.jpg


+ 35 - 0
uni_modules/uni-popup/changelog.md

@@ -0,0 +1,35 @@
+## 1.6.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.6.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.5.0(2021-06-23)
+- 新增 mask-click 遮罩层点击事件
+## 1.4.5(2021-06-22)
+- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.4(2021-06-18)
+- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.3(2021-06-08)
+- 修复 错误的 watch 字段
+- 修复 safeArea 属性不生效的问题
+- 修复 点击内容,再点击遮罩无法关闭的Bug
+## 1.4.2(2021-05-12)
+- 新增 组件示例地址
+## 1.4.1(2021-04-29)
+- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
+## 1.4.0 (2021-04-29)
+- 新增 type 属性的 left\right 值,支持左右弹出
+- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
+- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
+- 新增 safeArea 属性,是否适配底部安全区
+- 修复 App\h5\微信小程序底部安全区占位不对的Bug
+- 修复 App 端弹出等待的Bug
+- 优化 提升低配设备性能,优化动画卡顿问题
+- 优化 更简单的组件自定义方式
+## 1.2.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.2.8(2021-02-05)
+- 调整为uni_modules目录规范
+## 1.2.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端
+- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端

+ 45 - 0
uni_modules/uni-popup/components/uni-popup-dialog/keypress.js

@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+  name: 'Keypress',
+  props: {
+    disable: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    const keyNames = {
+      esc: ['Esc', 'Escape'],
+      tab: 'Tab',
+      enter: 'Enter',
+      space: [' ', 'Spacebar'],
+      up: ['Up', 'ArrowUp'],
+      left: ['Left', 'ArrowLeft'],
+      right: ['Right', 'ArrowRight'],
+      down: ['Down', 'ArrowDown'],
+      delete: ['Backspace', 'Delete', 'Del']
+    }
+    const listener = ($event) => {
+      if (this.disable) {
+        return
+      }
+      const keyName = Object.keys(keyNames).find(key => {
+        const keyName = $event.key
+        const value = keyNames[key]
+        return value === keyName || (Array.isArray(value) && value.includes(keyName))
+      })
+      if (keyName) {
+        // 避免和其他按键事件冲突
+        setTimeout(() => {
+          this.$emit(keyName, {})
+        }, 0)
+      }
+    }
+    document.addEventListener('keyup', listener)
+    this.$once('hook:beforeDestroy', () => {
+      document.removeEventListener('keyup', listener)
+    })
+  },
+	render: () => {}
+}
+// #endif

+ 244 - 0
uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue

@@ -0,0 +1,244 @@
+<template>
+	<view class="uni-popup-dialog">
+		<view class="uni-dialog-title">
+			<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{title}}</text>
+		</view>
+		<view v-if="mode === 'base'" class="uni-dialog-content">
+			<slot>
+				<text class="uni-dialog-content-text">{{content}}</text>
+			</slot>
+		</view>
+		<view v-else class="uni-dialog-content">
+			<slot>
+				<input class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholder" :focus="focus" >
+			</slot>
+		</view>
+		<view class="uni-dialog-button-group">
+			<view class="uni-dialog-button" @click="closeDialog">
+				<text class="uni-dialog-button-text">取消</text>
+			</view>
+			<view class="uni-dialog-button uni-border-left" @click="onOk">
+				<text class="uni-dialog-button-text uni-button-color">确定</text>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	/**
+	 * PopUp 弹出层-对话框样式
+	 * @description 弹出层-对话框样式
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} value input 模式下的默认值
+	 * @property {String} placeholder input 模式下输入提示
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} mode = [base|input] 模式、
+	 * 	@value base 基础对话框
+	 * 	@value input 可输入对话框
+	 * @property {String} content 对话框内容
+	 * @property {Boolean} beforeClose 是否拦截取消事件
+	 * @event {Function} confirm 点击确认按钮触发
+	 * @event {Function} close 点击取消按钮触发
+	 */
+
+	export default {
+		name: "uniPopupDialog",
+		mixins: [popup],
+		emits:['confirm','close'],
+		props: {
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			placeholder: {
+				type: [String, Number],
+				default: '请输入内容'
+			},
+			type: {
+				type: String,
+				default: 'error'
+			},
+			mode: {
+				type: String,
+				default: 'base'
+			},
+			title: {
+				type: String,
+				default: '提示'
+			},
+			content: {
+				type: String,
+				default: ''
+			},
+			beforeClose: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				dialogType: 'error',
+				focus: false,
+				val: ""
+			}
+		},
+		watch: {
+			type(val) {
+				this.dialogType = val
+			},
+			mode(val) {
+				if (val === 'input') {
+					this.dialogType = 'info'
+				}
+			},
+			value(val) {
+				this.val = val
+			}
+		},
+		created() {
+			// 对话框遮罩不可点击
+			this.popup.disableMask()
+			// this.popup.closeMask()
+			if (this.mode === 'input') {
+				this.dialogType = 'info'
+				this.val = this.value
+			} else {
+				this.dialogType = this.type
+			}
+		},
+		mounted() {
+			this.focus = true
+		},
+		methods: {
+			/**
+			 * 点击确认按钮
+			 */
+			onOk() {
+				if (this.mode === 'input'){
+					this.$emit('confirm', this.val)
+				}else{
+					this.$emit('confirm')
+				}
+				if(this.beforeClose) return
+				this.popup.close()
+			},
+			/**
+			 * 点击取消按钮
+			 */
+			closeDialog() {
+				this.$emit('close')
+				if(this.beforeClose) return
+				this.popup.close()
+			},
+			close(){
+				this.popup.close()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-popup-dialog {
+		width: 300px;
+		border-radius: 15px;
+		background-color: #fff;
+	}
+
+	.uni-dialog-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 15px;
+		padding-bottom: 5px;
+	}
+
+	.uni-dialog-title-text {
+		font-size: 16px;
+		font-weight: 500;
+	}
+
+	.uni-dialog-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		padding: 5px 15px 15px 15px;
+	}
+
+	.uni-dialog-content-text {
+		font-size: 14px;
+		color: #6e6e6e;
+	}
+
+	.uni-dialog-button-group {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-top-color: #f5f5f5;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-dialog-button {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+	}
+
+	.uni-border-left {
+		border-left-color: #f0f0f0;
+		border-left-style: solid;
+		border-left-width: 1px;
+	}
+
+	.uni-dialog-button-text {
+		font-size: 14px;
+	}
+
+	.uni-button-color {
+		color: #007aff;
+	}
+
+	.uni-dialog-input {
+		flex: 1;
+		font-size: 14px;
+		border: 1px #eee solid;
+		height: 40px;
+		padding: 0 10px;
+		border-radius: 5px;
+		color: #555;
+	}
+
+	.uni-popup__success {
+		color: #4cd964;
+	}
+
+	.uni-popup__warn {
+		color: #f0ad4e;
+	}
+
+	.uni-popup__error {
+		color: #dd524d;
+	}
+
+	.uni-popup__info {
+		color: #909399;
+	}
+</style>

+ 143 - 0
uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue

@@ -0,0 +1,143 @@
+<template>
+	<view class="uni-popup-message">
+		<view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
+			<slot>
+				<text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
+			</slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	/**
+	 * PopUp 弹出层-消息提示
+	 * @description 弹出层-消息提示
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} message 消息提示文字
+	 * @property {String} duration 显示时间,设置为 0 则不会自动关闭
+	 */
+
+	export default {
+		name: 'uniPopupMessage',
+		mixins:[popup],
+		props: {
+			/**
+			 * 主题 success/warning/info/error	  默认 success
+			 */
+			type: {
+				type: String,
+				default: 'success'
+			},
+			/**
+			 * 消息文字
+			 */
+			message: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 显示时间,设置为 0 则不会自动关闭
+			 */
+			duration: {
+				type: Number,
+				default: 3000
+			},
+			maskShow:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return {}
+		},
+		created() {
+			this.popup.maskShow = this.maskShow
+			this.popup.messageChild = this
+		},
+		methods: {
+			timerClose(){
+				if(this.duration === 0) return
+				clearTimeout(this.timer) 
+				this.timer = setTimeout(()=>{
+					this.popup.close()
+				},this.duration)
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup-message {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+	}
+
+	.uni-popup-message__box {
+		background-color: #e1f3d8;
+		padding: 10px 15px;
+		border-color: #eee;
+		border-style: solid;
+		border-width: 1px;
+		flex: 1;
+	}
+
+	@media screen and (min-width: 500px) {
+		.fixforpc-width {
+			margin-top: 20px;
+			border-radius: 4px;
+			flex: none;
+			min-width: 380px;
+			/* #ifndef APP-NVUE */
+			max-width: 50%;
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			max-width: 500px;
+			/* #endif */
+		}
+	}
+
+	.uni-popup-message-text {
+		font-size: 14px;
+		padding: 0;
+	}
+
+	.uni-popup__success {
+		background-color: #e1f3d8;
+	}
+
+	.uni-popup__success-text {
+		color: #67C23A;
+	}
+
+	.uni-popup__warn {
+		background-color: #faecd8;
+	}
+
+	.uni-popup__warn-text {
+		color: #E6A23C;
+	}
+
+	.uni-popup__error {
+		background-color: #fde2e2;
+	}
+
+	.uni-popup__error-text {
+		color: #F56C6C;
+	}
+
+	.uni-popup__info {
+		background-color: #F2F6FC;
+	}
+
+	.uni-popup__info-text {
+		color: #909399;
+	}
+</style>

+ 172 - 0
uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue

@@ -0,0 +1,172 @@
+<template>
+	<view class="uni-popup-share">
+		<view class="uni-share-title"><text class="uni-share-title-text">{{title}}</text></view>
+		<view class="uni-share-content">
+			<view class="uni-share-content-box">
+				<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
+					<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
+					<text class="uni-share-text">{{item.text}}</text>
+				</view>
+
+			</view>
+		</view>
+		<view class="uni-share-button-box">
+			<button class="uni-share-button" @click="close">取消</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import popup from '../uni-popup/popup.js'
+	export default {
+		name: 'UniPopupShare',
+		mixins:[popup],
+		emits:['select'],
+		props: {
+			title: {
+				type: String,
+				default: '分享到'
+			},
+			beforeClose: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				bottomData: [{
+						text: '微信',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
+						name: 'wx'
+					},
+					{
+						text: '支付宝',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
+						name: 'wx'
+					},
+					{
+						text: 'QQ',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png',
+						name: 'qq'
+					},
+					{
+						text: '新浪',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
+						name: 'sina'
+					},
+					{
+						text: '百度',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
+						name: 'copy'
+					},
+					{
+						text: '其他',
+						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
+						name: 'more'
+					}
+				]
+			}
+		},
+		created() {},
+		methods: {
+			/**
+			 * 选择内容
+			 */
+			select(item, index) {
+				this.$emit('select', {
+					item,
+					index
+				})
+				this.close()
+				
+			},
+			/**
+			 * 关闭窗口
+			 */
+			close() {
+				if(this.beforeClose) return
+				this.popup.close()
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup-share {
+		background-color: #fff;
+	}
+	.uni-share-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		height: 40px;
+	}
+	.uni-share-title-text {
+		font-size: 14px;
+		color: #666;
+	}
+	.uni-share-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 10px;
+	}
+
+	.uni-share-content-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: wrap;
+		width: 360px;
+	}
+
+	.uni-share-content-item {
+		width: 90px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		padding: 10px 0;
+		align-items: center;
+	}
+
+	.uni-share-content-item:active {
+		background-color: #f5f5f5;
+	}
+
+	.uni-share-image {
+		width: 30px;
+		height: 30px;
+	}
+
+	.uni-share-text {
+		margin-top: 10px;
+		font-size: 14px;
+		color: #3B4144;
+	}
+
+	.uni-share-button-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		padding: 10px 15px;
+	}
+
+	.uni-share-button {
+		flex: 1;
+		border-radius: 50px;
+		color: #666;
+		font-size: 16px;
+	}
+
+	.uni-share-button::after {
+		border-radius: 50px;
+	}
+</style>

+ 45 - 0
uni_modules/uni-popup/components/uni-popup/keypress.js

@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+  name: 'Keypress',
+  props: {
+    disable: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    const keyNames = {
+      esc: ['Esc', 'Escape'],
+      tab: 'Tab',
+      enter: 'Enter',
+      space: [' ', 'Spacebar'],
+      up: ['Up', 'ArrowUp'],
+      left: ['Left', 'ArrowLeft'],
+      right: ['Right', 'ArrowRight'],
+      down: ['Down', 'ArrowDown'],
+      delete: ['Backspace', 'Delete', 'Del']
+    }
+    const listener = ($event) => {
+      if (this.disable) {
+        return
+      }
+      const keyName = Object.keys(keyNames).find(key => {
+        const keyName = $event.key
+        const value = keyNames[key]
+        return value === keyName || (Array.isArray(value) && value.includes(keyName))
+      })
+      if (keyName) {
+        // 避免和其他按键事件冲突
+        setTimeout(() => {
+          this.$emit(keyName, {})
+        }, 0)
+      }
+    }
+    document.addEventListener('keyup', listener)
+    // this.$once('hook:beforeDestroy', () => {
+    //   document.removeEventListener('keyup', listener)
+    // })
+  },
+	render: () => {}
+}
+// #endif

+ 26 - 0
uni_modules/uni-popup/components/uni-popup/popup.js

@@ -0,0 +1,26 @@
+
+export default {
+	data() {
+		return {
+			
+		}
+	},
+	created(){
+		this.popup = this.getParent()
+	},
+	methods:{
+		/**
+		 * 获取父元素实例
+		 */
+		getParent(name = 'uniPopup') {
+			let parent = this.$parent;
+			let parentName = parent.$options.name;
+			while (parentName !== name) {
+				parent = parent.$parent;
+				if (!parent) return false
+				parentName = parent.$options.name;
+			}
+			return parent;
+		},
+	}
+}

+ 402 - 0
uni_modules/uni-popup/components/uni-popup/uni-popup.vue

@@ -0,0 +1,402 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']" @touchmove.stop.prevent="clear">
+		<view @touchstart="touchstart" >
+			<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass" :duration="duration" :show="showTrans" @click="onTap" />
+			<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
+				<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear"><slot /></view>
+			</uni-transition>
+		</view>
+		<!-- #ifdef H5 -->
+		<keypress v-if="maskShow" @esc="onTap" />
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+// #ifdef H5
+import keypress from './keypress.js'
+// #endif
+
+/**
+ * PopUp 弹出层
+ * @description 弹出层组件,为了解决遮罩弹层的问题
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+ * @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
+ * 	@value top 顶部弹出
+ * 	@value center 中间弹出
+ * 	@value bottom 底部弹出
+ * 	@value left		左侧弹出
+ * 	@value right  右侧弹出
+ * 	@value message 消息提示
+ * 	@value dialog 对话框
+ * 	@value share 底部分享示例
+ * @property {Boolean} animation = [ture|false] 是否开启动画
+ * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
+ * @property {String}  backgroundColor 					主窗口背景色
+ * @property {Boolean} safeArea									是否适配底部安全区
+ * @event {Function} change 打开关闭弹窗触发,e={show: false}
+ */
+
+export default {
+	name: 'uniPopup',
+	components: {
+		// #ifdef H5
+		keypress
+		// #endif
+	},
+	emits:['change','maskClick'],
+	props: {
+		// 开启动画
+		animation: {
+			type: Boolean,
+			default: true
+		},
+		// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+		// message: 消息提示 ; dialog : 对话框
+		type: {
+			type: String,
+			default: 'center'
+		},
+		// maskClick
+		maskClick: {
+			type: Boolean,
+			default: true
+		},
+		backgroundColor: {
+			type: String,
+			default: 'none'
+		},
+		safeArea:{
+			type: Boolean,
+			default: true
+		}
+	},
+
+	watch: {
+		/**
+		 * 监听type类型
+		 */
+		type: {
+			handler: function(type) {
+				if (!this.config[type]) return
+				this[this.config[type]](true)
+			},
+			immediate: true
+		},
+		isDesktop: {
+			handler: function(newVal) {
+				if (!this.config[newVal]) return
+				this[this.config[this.type]](true)
+			},
+			immediate: true
+		},
+		/**
+		 * 监听遮罩是否可点击
+		 * @param {Object} val
+		 */
+		maskClick: {
+			handler: function(val) {
+				this.mkclick = val
+			},
+			immediate: true
+		}
+	},
+	data() {
+		return {
+			duration: 300,
+			ani: [],
+			showPopup: false,
+			showTrans: false,
+			popupWidth: 0,
+			popupHeight: 0,
+			config: {
+				top: 'top',
+				bottom: 'bottom',
+				center: 'center',
+				left: 'left',
+				right: 'right',
+				message: 'top',
+				dialog: 'center',
+				share: 'bottom'
+			},
+			maskClass: {
+				position: 'fixed',
+				bottom: 0,
+				top: 0,
+				left: 0,
+				right: 0,
+				backgroundColor: 'rgba(0, 0, 0, 0.4)'
+			},
+			transClass: {
+				position: 'fixed',
+				left: 0,
+				right: 0
+			},
+			maskShow: true,
+			mkclick: true,
+			popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
+		}
+	},
+	computed: {
+		isDesktop() {
+			return this.popupWidth >= 500 && this.popupHeight >= 500
+		},
+		bg() {
+			if (this.backgroundColor === '' || this.backgroundColor === 'none') {
+				return 'transparent'
+			}
+			return this.backgroundColor
+		}
+	},
+	mounted() {
+		const fixSize = () => {
+			const { windowWidth, windowHeight, windowTop, safeAreaInsets } = uni.getSystemInfoSync()
+			this.popupWidth = windowWidth
+			this.popupHeight = windowHeight + windowTop
+			// 是否适配底部安全区
+			if(this.safeArea){
+				this.safeAreaInsets = safeAreaInsets
+			}else{
+				this.safeAreaInsets = 0
+			}
+		}
+		fixSize()
+		// #ifdef H5
+		// window.addEventListener('resize', fixSize)
+		// this.$once('hook:beforeDestroy', () => {
+		// 	window.removeEventListener('resize', fixSize)
+		// })
+		// #endif
+	},
+	created() {
+		this.mkclick = this.maskClick
+		if (this.animation) {
+			this.duration = 300
+		} else {
+			this.duration = 0
+		}
+		// TODO 处理 message 组件生命周期异常的问题
+		this.messageChild = null
+		// TODO 解决头条冒泡的问题
+		this.clearPropagation = false
+	},
+	methods: {
+		/**
+		 * 公用方法,不显示遮罩层
+		 */
+		closeMask() {
+			this.maskShow = false
+		},
+		/**
+		 * 公用方法,遮罩层禁止点击
+		 */
+		disableMask() {
+			this.mkclick = false
+		},
+		// TODO nvue 取消冒泡
+		clear(e) {
+			// #ifndef APP-NVUE
+			e.stopPropagation()
+			// #endif
+			this.clearPropagation = true
+		},
+
+		open(direction) {
+			let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
+			if (!(direction && innerType.indexOf(direction) !== -1)) {
+				direction = this.type
+			}
+			if (!this.config[direction]) {
+				console.error('缺少类型:', direction)
+				return
+			}
+			this[this.config[direction]]()
+			this.$emit('change', {
+				show: true,
+				type: direction
+			})
+		},
+		close(type) {
+			this.showTrans = false
+			this.$emit('change', {
+				show: false,
+				type: this.type
+			})
+			clearTimeout(this.timer)
+			// // 自定义关闭事件
+			// this.customOpen && this.customClose()
+			this.timer = setTimeout(() => {
+				this.showPopup = false
+			}, 300)
+		},
+		// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
+		touchstart(){
+			this.clearPropagation = false
+		},
+
+		onTap() {
+			if (this.clearPropagation) {
+				// fix by mehaotian 兼容 nvue
+				this.clearPropagation = false
+				return
+			}
+			this.$emit('maskClick')
+			if (!this.mkclick) return
+			this.close()
+		},
+		/**
+		 * 顶部弹出样式处理
+		 */
+		top(type) {
+			this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
+			this.ani = ['slide-top']
+			this.transClass = {
+				position: 'fixed',
+				left: 0,
+				right: 0,
+				backgroundColor: this.bg
+			}
+			// TODO 兼容 type 属性 ,后续会废弃
+			if (type) return
+			this.showPopup = true
+			this.showTrans = true
+			this.$nextTick(() => {
+				if (this.messageChild && this.type === 'message') {
+					this.messageChild.timerClose()
+				}
+			})
+		},
+		/**
+		 * 底部弹出样式处理
+		 */
+		bottom(type) {
+			this.popupstyle = 'bottom'
+			this.ani = ['slide-bottom']
+
+			this.transClass = {
+				position: 'fixed',
+				left: 0,
+				right: 0,
+				bottom: 0,
+				paddingBottom: (this.safeAreaInsets && this.safeAreaInsets.bottom) || 0,
+				backgroundColor: this.bg
+			}
+			// TODO 兼容 type 属性 ,后续会废弃
+			if (type) return
+			this.showPopup = true
+			this.showTrans = true
+		},
+		/**
+		 * 中间弹出样式处理
+		 */
+		center(type) {
+			this.popupstyle = 'center'
+			this.ani = ['zoom-out', 'fade']
+			this.transClass = {
+				position: 'fixed',
+				/* #ifndef APP-NVUE */
+				display: 'flex',
+				flexDirection: 'column',
+				/* #endif */
+				bottom: 0,
+				left: 0,
+				right: 0,
+				top: 0,
+				justifyContent: 'center',
+				alignItems: 'center'
+			}
+			// TODO 兼容 type 属性 ,后续会废弃
+			if (type) return
+			this.showPopup = true
+			this.showTrans = true
+		},
+		left(type) {
+			this.popupstyle = 'left'
+			this.ani = ['slide-left']
+			this.transClass = {
+				position: 'fixed',
+				left: 0,
+				bottom: 0,
+				top: 0,
+				backgroundColor: this.bg,
+				/* #ifndef APP-NVUE */
+				display: 'flex',
+				flexDirection: 'column'
+				/* #endif */
+			}
+			// TODO 兼容 type 属性 ,后续会废弃
+			if (type) return
+			this.showPopup = true
+			this.showTrans = true
+		},
+		right(type) {
+			this.popupstyle = 'right'
+			this.ani = ['slide-right']
+			this.transClass = {
+				position: 'fixed',
+				bottom: 0,
+				right: 0,
+				top: 0,
+				backgroundColor: this.bg,
+				/* #ifndef APP-NVUE */
+				display: 'flex',
+				flexDirection: 'column'
+				/* #endif */
+			}
+			// TODO 兼容 type 属性 ,后续会废弃
+			if (type) return
+			this.showPopup = true
+			this.showTrans = true
+		}
+	}
+}
+</script>
+<style lang="scss" scoped>
+.uni-popup {
+	position: fixed;
+	/* #ifndef APP-NVUE */
+	z-index: 99;
+	/* #endif */
+	&.top,
+	&.left,
+	&.right {
+		/* #ifdef H5 */
+		top: var(--window-top);
+		/* #endif */
+		/* #ifndef H5 */
+		top: 0;
+		/* #endif */
+	}
+	.uni-popup__wrapper {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: relative;
+		/* iphonex 等安全区设置,底部安全区适配 */
+		/* #ifndef APP-NVUE */
+		// padding-bottom: constant(safe-area-inset-bottom);
+		// padding-bottom: env(safe-area-inset-bottom);
+		/* #endif */
+		&.left,
+		&.right {
+			/* #ifdef H5 */
+			padding-top: var(--window-top);
+			/* #endif */
+			/* #ifndef H5 */
+			padding-top: 0;
+			/* #endif */
+			flex: 1;
+		}
+	}
+}
+
+.fixforpc-z-index {
+	/* #ifndef APP-NVUE */
+	z-index: 999;
+	/* #endif */
+}
+
+.fixforpc-top {
+	top: 0;
+}
+</style>

+ 85 - 0
uni_modules/uni-popup/package.json

@@ -0,0 +1,85 @@
+{
+	"id": "uni-popup",
+	"displayName": "uni-popup 弹出层",
+	"version": "1.6.1",
+	"description": " Popup 组件,提供常用的弹层",
+	"keywords": [
+        "uni-ui",
+        "弹出层",
+        "弹窗",
+        "popup",
+        "弹框"
+    ],
+	"repository": "https://github.com/dcloudio/uni-ui",
+	"engines": {
+		"HBuilderX": ""
+	},
+	"directories": {
+		"example": "../../temps/example_temps"
+	},
+	"dcloudext": {
+		"category": [
+			"前端组件",
+			"通用组件"
+		],
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "无",
+			"data": "无",
+			"permissions": "无"
+		},
+		"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+	},
+	"uni_modules": {
+		"dependencies": [
+			"uni-transition"
+		],
+		"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": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+	}
+}

+ 296 - 0
uni_modules/uni-popup/readme.md

@@ -0,0 +1,296 @@
+
+
+## Popup 弹出层
+> **组件名:uni-popup**
+> 代码块: `uPopup`
+> 关联组件:`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share`,`uni-transition`
+
+
+弹出层组件,在应用中弹出一个消息提示窗口、提示框等
+
+
+> **注意事项**
+> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
+> - 组件需要依赖 `sass` 插件 ,请自行手动安装
+> - `uni-popup-message` 、 `uni-popup-dialog` 等扩展ui组件,需要和 `uni-popup` 配套使用,暂不支持单独使用
+> - `nvue` 中使用 `uni-popup` 时,尽量将组件置于其他元素后面,避免出现层级问题
+> - `uni-popup` 并不能完全阻止页面滚动,可在打开 `uni-popup` 的时候手动去做一些处理,禁止页面滚动
+> - 如果想在页面渲染完毕后就打开 `uni-popup` ,请在 `onReady` 或 `mounted` 生命周期内调用,确保组件渲染完毕
+> - 在微信小程序开发者工具中,启用真机调试,popup 会延时出现,是因为 setTimeout 在真机调试中的延时问题导致的,预览和发布小程序不会出现此问题
+> - 使用 `npm` 方式引入组件,如果确认引用正确,但是提示未注册组件或显示不正常,请尝试重新编译项目
+> - `uni-popup` 中尽量不要使用 `scroll-view` 嵌套过多的内容,可能会影响组件的性能,导致组件无法打开或者打开卡顿
+> - `uni-popup` 不会覆盖原生 tabbar 和原生导航栏
+> - 组件支持 nvue ,需要在 `manifest.json > app-plus` 节点下配置 `"nvueStyleCompiler" : "uni-app"` 
+> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+
+### 基本用法 
+
+**示例**
+
+```html
+<button @click="open">打开弹窗</button>
+<uni-popup ref="popup" type="bottom">底部弹出 Popup</uni-popup>
+```
+
+```javascript
+export default {
+   methods:{
+      open(){
+        // 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
+        this.$refs.popup.open('top')
+      }
+   }
+}
+
+```
+
+### 设置主窗口背景色
+
+在大多数场景下,并不需要设置 `background-color` 属性,因为`uni-popup`的主窗口默认是透明的,在向里面插入内容的时候 ,样式完全交由用户定制,如果设置了背景色 ,例如 `uni-popup-dialog` 中的圆角就很难去实现,不设置背景色,更适合用户去自由发挥。
+
+而也有特例,需要我们主动去设置背景色,例如 `type = 'bottom'` 的时候 ,在异型屏中遇到了底部安全区问题(如 iphone 11),因为 `uni-popup`的主要内容避开了安全区(设置`safe-area:true`),导致底部的颜色我们无法自定义,这时候使用 `background-color` 就可以解决这个问题。 
+
+**示例**
+
+```html
+<button @click="open">打开弹窗</button>
+<uni-popup ref="popup" type="bottom" background-color="#fff">底部弹出 Popup</uni-popup>
+```
+
+### 禁用打开动画
+在某些场景 ,可能不希望弹层有动画效果 ,只需要将 `animation` 属性设置为 `false` 即可以关闭动画。
+
+**示例**
+
+```html
+<button @click="open">打开弹窗</button>
+<uni-popup ref="popup" type="center" :animation="false">中间弹出 Popup</uni-popup>
+```
+
+### 禁用点击遮罩关闭
+默认情况下,点击遮罩会自动关闭`uni-popup`,如不想点击关闭,只需将`mask-click`设置为`false`,这时候要关闭`uni-popup`,只能手动调用 `close` 方法。
+
+**示例**
+
+```html
+<button @click="open">打开弹窗</button>
+<uni-popup ref="popup" :mask-click="false">
+	<text>Popup</text>
+	<button @click="close">关闭</button>
+</uni-popup>
+```
+
+```javascript
+export default {
+	data() {
+		return {}
+	},
+	onReady() {},
+	methods: {
+		open() {
+			this.$refs.popup.open('top')
+		},
+		close() {
+			this.$refs.popup.close()
+		}
+	}
+}
+
+```
+
+## API
+
+### Popup Props 
+
+|属性名|类型|默认值|说明|
+|:-:|:-:|:-:|:-:|
+|animation|Boolean|true|是否开启动画|
+|type|String|'center'|弹出方式|
+|mask-click|Boolean|true|蒙版点击是否关闭弹窗|
+|background-color|String|'none'|主窗口背景色|
+|safe-area|Boolean|true|是否适配底部安全区|
+
+#### Type Options
+
+|属性名|说明|
+|:-:| :-:|
+|top|顶部弹出	|
+|center|居中弹出|
+|bottom|底部弹出|
+|left|左侧弹出|
+|right|右侧弹出|
+|message|预置样式 :消息提示|
+|dialog|预置样式 :对话框|
+|share|预置样式 :底部弹出分享示例	|
+
+
+### Popup Methods
+
+|方法称名	|说明|参数|
+|:-:|:-:|:-:|
+|open|打开弹出层|open(String:type) ,如果参数可代替 type 属性|
+|close|关闭弹出层	|-|
+
+
+### Popup Events
+
+|事件称名|说明|返回值|
+|:-:|:-:|:-:|
+|change|组件状态发生变化触发|e={show: true|false,type:当前模式}|
+|maskClick|点击遮罩层触发|-|
+
+
+## 扩展组件说明
+`uni-popup` 其实并没有任何样式,只提供基础的动画效果,给用户一个弹出层解决方案,仅仅是这样并不能满足开发需求,所以我们提供了三种基础扩展样式
+
+### uni-popup-message 提示信息
+
+将 `uni-popup` 的`type`属性改为 `message`,并引入对应组件即可使用消息提示 ,*该组件不支持单独使用*
+
+**示例**
+
+```html
+<uni-popup ref="popup" type="message">
+	<uni-popup-message type="success" message="成功消息" :duration="2000"></uni-popup-message>
+</uni-popup>
+```
+
+### PopupMessage Props
+
+|属性名|类型|默认值|说明|
+|:-:|:-:|:-:|:-:|
+|type|String|success|消息提示主题|
+|message|String|-|消息提示文字|
+|duration|Number|3000|消息显示时间,超过显示时间组件自动关闭,设置为0 将不会关闭,需手动调用 close 方法关闭|
+
+#### Type Options
+
+|属性名|说明|
+|:-:| :-:|
+|success|成功	|
+|warn|警告|
+|error|失败|
+|info|消息|
+
+### PopupMessage Slots
+
+|名称|说明|					
+|:-:|:-:|						
+|default|消息内容,会覆盖 message 属性|
+
+### uni-popup-dialog 对话框
+
+将 `uni-popup` 的`type`属性改为 `dialog`,并引入对应组件即可使用对话框 ,*该组件不支持单独使用*
+
+**示例**
+
+```html
+<button @click="open">打开弹窗</button>
+<uni-popup ref="popup" type="dialog">
+	<uni-popup-dialog mode="input" message="成功消息" :duration="2000" :before-close="true" @close="close" @confirm="confirm"></uni-popup-dialog>
+</uni-popup>
+```
+
+```javascript
+export default {
+	methods: {
+		open() {
+			this.$refs.popup.open()
+		},
+		/**
+		 * 点击取消按钮触发
+		 * @param {Object} done
+		 */
+		close() {
+			// TODO 做一些其他的事情,before-close 为true的情况下,手动执行 close 才会关闭对话框
+			// ...
+			this.$refs.popup.close()
+		},
+		/**
+		 * 点击确认按钮触发
+		 * @param {Object} done
+		 * @param {Object} value
+		 */
+		confirm(value) {
+			// 输入框的值
+			console.log(value)
+			// TODO 做一些其他的事情,手动执行 close 才会关闭对话框
+			// ...
+			this.$refs.popup.close()
+		}
+	}
+}
+```
+
+### PopupDialog Props
+
+|属性名|类型|默认值|说明|
+|:-:|:-:|:-:|:-:|
+|type|String|success|对话框标题主题,可选值: success/warn/info/error|
+|mode|String|base| 对话框模式,可选值:base(提示对话框)/input(可输入对话框)|
+|title|String|-|对话框标题|
+|content|String|-|对话框内容,base模式下生效|
+|value| String\Number|-|输入框默认值,input模式下生效|
+|placeholder|String|-|输入框提示文字,input模式下生效|
+|before-close|Boolean|false	| 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法|
+
+#### PopupDialog Events
+
+|事件称名	|说明|返回值|
+|:-:|:-:|:-:|
+|close|点击dialog取消按钮触发|-|
+|confirm|点击dialog确定按钮触发|e={value:input模式下输入框的值}|
+
+### PopupDialog Slots
+
+|名称|说明|					
+|:-:|:-:|						
+|default|自定义内容,回覆盖原有的内容显示|
+
+### uni-popup-share 分享示例
+
+分享示例,不作为最终可使用的组件,只做为样式组件,供用户自行修改,`后续的开发计划是实现实际的分享逻辑,参数可配置`。
+
+将 `uni-popup` 的 `type` 属性改为 `share`,并引入对应组件即可使用 ,*该组件不支持单独使用*
+
+**示例**
+
+```html
+<uni-popup ref="popup" type="share">
+	<uni-popup-share title="分享到" @select="select"></uni-popup-share>
+</uni-popup>
+```
+
+### PopupShare Props
+
+|属性名|类型|默认值|说明|
+|:-:|:-:|:-:| :-:			|
+|title|String|-|分享弹窗标题|
+|before-close|Boolean|false	| 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法|
+
+### PopupShare Events
+
+|事件称名|说明|返回值|
+|:-:|:-:|:-:|
+|select|选择触发|e = {item,index}:所选参数|
+
+**Tips**
+- share 分享组件,只是作为一个扩展示例,如果需要修改数据源,请到组件内修改
+
+## 帮助
+在使用中如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们。
+
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup](https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup)

+ 13 - 0
uni_modules/uni-transition/changelog.md

@@ -0,0 +1,13 @@
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.1(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的Bug
+## 1.1.0(2021-04-22)
+- 新增 通过方法自定义动画
+- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
+- 优化 动画触发逻辑,使动画更流畅
+- 优化 支持单独的动画类型
+- 优化 文档示例
+## 1.0.2(2021-02-05)
+- 调整为uni_modules目录规范

+ 128 - 0
uni_modules/uni-transition/components/uni-transition/createAnimation.js

@@ -0,0 +1,128 @@
+// const defaultOption = {
+// 	duration: 300,
+// 	timingFunction: 'linear',
+// 	delay: 0,
+// 	transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+	constructor(options, _this) {
+		this.options = options
+		this.animation = uni.createAnimation(options)
+		this.currentStepAnimates = {}
+		this.next = 0
+		this.$ = _this
+
+	}
+
+	_nvuePushAnimates(type, args) {
+		let aniObj = this.currentStepAnimates[this.next]
+		let styles = {}
+		if (!aniObj) {
+			styles = {
+				styles: {},
+				config: {}
+			}
+		} else {
+			styles = aniObj
+		}
+		if (animateTypes1.includes(type)) {
+			if (!styles.styles.transform) {
+				styles.styles.transform = ''
+			}
+			let unit = ''
+			if(type === 'rotate'){
+				unit = 'deg'
+			}
+			styles.styles.transform += `${type}(${args+unit}) `
+		} else {
+			styles.styles[type] = `${args}`
+		}
+		this.currentStepAnimates[this.next] = styles
+	}
+	_animateRun(styles = {}, config = {}) {
+		let ref = this.$.$refs['ani'].ref
+		if (!ref) return
+		return new Promise((resolve, reject) => {
+			nvueAnimation.transition(ref, {
+				styles,
+				...config
+			}, res => {
+				resolve()
+			})
+		})
+	}
+
+	_nvueNextAnimate(animates, step = 0, fn) {
+		let obj = animates[step]
+		if (obj) {
+			let {
+				styles,
+				config
+			} = obj
+			this._animateRun(styles, config).then(() => {
+				step += 1
+				this._nvueNextAnimate(animates, step, fn)
+			})
+		} else {
+			this.currentStepAnimates = {}
+			typeof fn === 'function' && fn()
+			this.isEnd = true
+		}
+	}
+
+	step(config = {}) {
+		// #ifndef APP-NVUE
+		this.animation.step(config)
+		// #endif
+		// #ifdef APP-NVUE
+		this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+		this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+		this.next++
+		// #endif
+		return this
+	}
+
+	run(fn) {
+		// #ifndef APP-NVUE
+		this.$.animationData = this.animation.export()
+		this.$.timer = setTimeout(() => {
+			typeof fn === 'function' && fn()
+		}, this.$.durationTime)
+		// #endif
+		// #ifdef APP-NVUE
+		this.isEnd = false
+		let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+		if(!ref) return
+		this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+		this.next = 0
+		// #endif
+	}
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+	'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+	'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+	MPAnimation.prototype[type] = function(...args) {
+		// #ifndef APP-NVUE
+		this.animation[type](...args)
+		// #endif
+		// #ifdef APP-NVUE
+		this._nvuePushAnimates(type, args)
+		// #endif
+		return this
+	}
+})
+
+export function createAnimation(option, _this) {
+	if(!_this) return
+	clearTimeout(_this.timer)
+	return new MPAnimation(option, _this)
+}

+ 277 - 0
uni_modules/uni-transition/components/uni-transition/uni-transition.vue

@@ -0,0 +1,277 @@
+<template>
+	<view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+</template>
+
+<script>
+import { createAnimation } from './createAnimation'
+
+/**
+ * Transition 过渡动画
+ * @description 简单过渡动画组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+ * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+ * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+ *  @value fade 渐隐渐出过渡
+ *  @value slide-top 由上至下过渡
+ *  @value slide-right 由右至左过渡
+ *  @value slide-bottom 由下至上过渡
+ *  @value slide-left 由左至右过渡
+ *  @value zoom-in 由小到大过渡
+ *  @value zoom-out 由大到小过渡
+ * @property {Number} duration 过渡动画持续时间
+ * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+ */
+export default {
+	name: 'uniTransition',
+	emits:['click','change'],
+	props: {
+		show: {
+			type: Boolean,
+			default: false
+		},
+		modeClass: {
+			type: [Array, String],
+			default() {
+				return 'fade'
+			}
+		},
+		duration: {
+			type: Number,
+			default: 300
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		customClass:{
+			type: String,
+			default: ''
+		}
+	},
+	data() {
+		return {
+			isShow: false,
+			transform: '',
+			opacity: 1,
+			animationData: {},
+			durationTime: 300,
+			config: {}
+		}
+	},
+	watch: {
+		show: {
+			handler(newVal) {
+				if (newVal) {
+					this.open()
+				} else {
+					// 避免上来就执行 close,导致动画错乱
+					if (this.isShow) {
+						this.close()
+					}
+				}
+			},
+			immediate: true
+		}
+	},
+	computed: {
+		// 生成样式数据
+		stylesObject() {
+			let styles = {
+				...this.styles,
+				'transition-duration': this.duration / 1000 + 's'
+			}
+			let transform = ''
+			for (let i in styles) {
+				let line = this.toLine(i)
+				transform += line + ':' + styles[i] + ';'
+			}
+			return transform
+		},
+		// 初始化动画条件
+		transformStyles() {
+			return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
+		}
+	},
+	created() {
+		// 动画默认配置
+		this.config = {
+			duration: this.duration,
+			timingFunction: 'ease',
+			transformOrigin: '50% 50%',
+			delay: 0
+		}
+		this.durationTime = this.duration
+	},
+	methods: {
+		/**
+		 *  ref 触发 初始化动画
+		 */
+		init(obj = {}) {
+			if (obj.duration) {
+				this.durationTime = obj.duration
+			}
+			this.animation = createAnimation(Object.assign(this.config, obj))
+		},
+		/**
+		 * 点击组件触发回调
+		 */
+		onClick() {
+			this.$emit('click', {
+				detail: this.isShow
+			})
+		},
+		/**
+		 * ref 触发 动画分组
+		 * @param {Object} obj
+		 */
+		step(obj, config = {}) {
+			if (!this.animation) return
+			for (let i in obj) {
+				try {
+					if(typeof obj[i] === 'object'){
+						this.animation[i](...obj[i])
+					}else{
+						this.animation[i](obj[i])
+					}
+				} catch (e) {
+					console.error(`方法 ${i} 不存在`)
+				}
+			}
+			this.animation.step(config)
+			return this
+		},
+		/**
+		 *  ref 触发 执行动画
+		 */
+		run(fn) {
+			if (!this.animation) return
+			this.animation.run(fn)
+		},
+		// 开始过度动画
+		open() {
+			clearTimeout(this.timer)
+			this.transform = ''
+			this.isShow = true
+			let { opacity, transform } = this.styleInit(false)
+			if (typeof opacity !== 'undefined') {
+				this.opacity = opacity
+			}
+			this.transform = transform
+			// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
+			this.$nextTick(() => {
+				// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
+				this.timer = setTimeout(() => {
+					this.animation = createAnimation(this.config, this)
+					this.tranfromInit(false).step()
+					this.animation.run()
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				}, 20)
+			})
+		},
+		// 关闭过度动画
+		close(type) {
+			if (!this.animation) return
+			this.tranfromInit(true)
+				.step()
+				.run(() => {
+					this.isShow = false
+					this.animationData = null
+					this.animation = null
+					let { opacity, transform } = this.styleInit(false)
+					this.opacity = opacity || 1
+					this.transform = transform
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+		},
+		// 处理动画开始前的默认样式
+		styleInit(type) {
+			let styles = {
+				transform: ''
+			}
+			let buildStyle = (type, mode) => {
+				if (mode === 'fade') {
+					styles.opacity = this.animationType(type)[mode]
+				} else {
+					styles.transform += this.animationType(type)[mode] + ' '
+				}
+			}
+			if (typeof this.modeClass === 'string') {
+				buildStyle(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildStyle(type, mode)
+				})
+			}
+			return styles
+		},
+		// 处理内置组合动画
+		tranfromInit(type) {
+			let buildTranfrom = (type, mode) => {
+				let aniNum = null
+				if (mode === 'fade') {
+					aniNum = type ? 0 : 1
+				} else {
+					aniNum = type ? '-100%' : '0'
+					if (mode === 'zoom-in') {
+						aniNum = type ? 0.8 : 1
+					}
+					if (mode === 'zoom-out') {
+						aniNum = type ? 1.2 : 1
+					}
+					if (mode === 'slide-right') {
+						aniNum = type ? '100%' : '0'
+					}
+					if (mode === 'slide-bottom') {
+						aniNum = type ? '100%' : '0'
+					}
+				}
+				this.animation[this.animationMode()[mode]](aniNum)
+			}
+			if (typeof this.modeClass === 'string') {
+				buildTranfrom(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildTranfrom(type, mode)
+				})
+			}
+
+			return this.animation
+		},
+		animationType(type) {
+			return {
+				fade: type ? 1 : 0,
+				'slide-top': `translateY(${type ? '0' : '-100%'})`,
+				'slide-right': `translateX(${type ? '0' : '100%'})`,
+				'slide-bottom': `translateY(${type ? '0' : '100%'})`,
+				'slide-left': `translateX(${type ? '0' : '-100%'})`,
+				'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
+				'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
+			}
+		},
+		// 内置动画类型与实际动画对应字典
+		animationMode() {
+			return {
+				fade: 'opacity',
+				'slide-top': 'translateY',
+				'slide-right': 'translateX',
+				'slide-bottom': 'translateY',
+				'slide-left': 'translateX',
+				'zoom-in': 'scale',
+				'zoom-out': 'scale'
+			}
+		},
+		// 驼峰转中横线
+		toLine(name) {
+			return name.replace(/([A-Z])/g, '-$1').toLowerCase()
+		}
+	}
+}
+</script>
+
+<style></style>

+ 83 - 0
uni_modules/uni-transition/package.json

@@ -0,0 +1,83 @@
+{
+  "id": "uni-transition",
+  "displayName": "uni-transition 过渡动画",
+  "version": "1.2.0",
+  "description": "元素的简单过渡动画",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "动画",
+    "过渡",
+    "过渡动画"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "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": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 397 - 0
uni_modules/uni-transition/readme.md

@@ -0,0 +1,397 @@
+
+
+## Transition 过渡动画
+> **组件名:uni-transition**
+> 代码块: `uTransition`
+
+
+元素过渡动画
+
+> **注意事项**
+> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
+> - 组件需要依赖 `sass` 插件 ,请自行手动安装
+> - rotate 旋转动画不需要填写 deg 单位,在小程序上填写单位动画不会执行
+> - NVUE 下修改宽高动画,不能定位到中心点
+> - 百度小程序下修改宽高 ,可能会影响其他动画,需注意
+> - nvue 不支持 costom-class , 请使用 styles
+> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+<template>
+	<view>
+		<button type="primary" @click="open">fade</button>
+		<uni-transition mode-class="fade" :styles="{'width':'100px','height':'100px','backgroundColor':'red'}" :show="show" @change="change" />
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			show: false,
+		}
+	},
+	onLoad() {},
+	methods: {
+		open(mode) {
+			this.show = !this.show
+		},
+		change() {
+			console.log('触发动画')
+		}
+	}
+}
+</script>
+```
+
+### 样式覆盖
+
+**注意:`nvue` 不支持 `custom-class` 属性 ,需要使用 `styles` 属性进行兼容**
+
+使用 `custom-class` 属性绑定样式,可以自定义 `uni-transition` 的样式
+
+```html
+<template>
+	<view class="content">
+		<uni-transition custom-class="custom-transition" mode-class="fade" :duration="0" :show="true" />
+	</view>
+</template>
+
+<style>
+/* 常规样式覆盖  */
+.content >>> .custom-transition {
+	width:100px;
+	height:100px;
+	background-color:red;
+}
+</style>
+<style lang="scss">
+/* 如果使用 scss 需要使用 /deep/  */
+.content /deep/ .custom-transition {
+	width:100px;
+	height:100px;
+	background-color:red;
+}
+</style>
+```
+
+
+如果使用 `styles` 注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+
+```html
+<template>
+	<view class="content">
+		<uni-transition :styles="styles" mode-class="fade" :duration="0" :show="true" />
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			styles:{
+				'width':'100px',
+				'height':'100px',
+				'backgroundColor':'red'
+			}
+		}
+	}
+}
+</script>
+```
+
+### 自定义动画
+当内置动画类型不能满足需求的时候 ,可以使用 `step()` 和 `run()` 自定义动画,入参以及具体用法参考下方属性说明
+
+`init()` 方法可以覆盖默认配置
+
+
+```html
+<template>
+	<view>
+		<button type="primary" @click="run">执行动画</button>
+		<uni-transition ref="ani" :styles="{'width':'100px','height':'100px','backgroundColor':'red'}" :show="show"  />
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			show: true,
+		}
+	},
+	onReady() {
+		this.$refs.ani.init({
+			duration: 1000,
+			timingFunction: 'linear',
+			transformOrigin: '50% 50%',
+			delay: 500
+		})
+	},
+	methods: {
+		run() {
+			// 同时右平移到 100px,旋转 360 读
+			this.$refs.ani.step({
+				translateX: '100px',
+				rotate: '360'
+			})
+			// 上面的动画执行完成后,等待200毫秒平移到 0px,旋转到 0 读
+			this.$refs.ani.step({
+				translateX: '0px',
+				rotate: '0'
+			},
+			{
+				timingFunction: 'ease-in',
+				duration: 200
+			})
+			// 开始执行动画
+			this.$refs.ani.run(()=>{
+				console.log('动画支持完毕')
+			})
+		}
+	}
+}
+</script>
+```
+
+
+## API
+
+### Transition Props
+
+|属性名		|类型	|默认值	|说明					|
+|:-:	|:-:	|:-:					|:-:|
+|show				|Boolean|false	|控制组件显示或隐藏	|
+|mode-class |Array/String	|-		|内置过渡动画类型			|
+|custom-class |String	|-		|自定义类名	|
+|duration	 |Number	|300	|过渡动画持续时间		|
+|styles		 |Object	|-		|组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`	|
+
+#### mode-class 内置过渡动画类型说明
+**格式为** :`'fade'` 或者 `['fade','slide-top']`
+
+|属性名			|说明			|
+|:-:			|:-:			|
+|fade			|渐隐渐出过渡	|
+|slide-top		|由上至下过渡	|
+|slide-right	|由右至左过渡	|
+|slide-bottom	|由下至上过渡	|
+|slide-left		|由左至右过渡	|
+|zoom-in		|由小到大过渡	|
+|zoom-out		|由大到小过渡	|
+
+**注意** 
+
+组合使用时,同一种类型相反的过渡动画如(slide-top、slide-bottom)同时使用时,只有最后一个生效
+
+### Transition Events
+
+|事件名		|说明				|返回值			|
+|:-:			|:-:				|:-:			|
+|click		|点击组件触发		|-				|
+|change		|过渡动画结束时触发	| e = {detail:true}	|
+
+### Transition Methons
+
+|方法名|说明|参数|
+|:-:|:-:|:-:|
+|init()|手动初始化配置|Function(OBJECT:config)|
+|step()|动画队列|Function(OBJECT:type,OBJECT:config)|
+|run()|执行动画|Function(FUNCTION:callback)	|
+
+### init(OBJECT:config)
+**通过 ref 调用方法**
+
+手动设置动画配置,需要在页面渲染完毕后调用
+
+```javascript
+this.$refs.ani.init({
+	duration: 1000,
+	timingFunction:'ease',
+	delay:500,
+	transformOrigin:'left center'
+})
+```
+
+### step(OBJECT:type,OBJECT:config) 动画队列
+**通过 ref 调用方法**
+
+调用 `step()` 来表示一组动画完成,`step` 第一个参数可以传入任意多个动画方法,一组动画中的所有动画会同时开始,一组动画完成后才会进行下一组动画。`step` 第二个参数可以传入一个跟 `uni.createAnimation()` 一样的配置参数用于指定当前组动画的配置。
+
+Tips
+- 第一个参数支持的动画参考下面的 `支持的动画`
+- 第二个参数参考下面的 `动画配置`,可省略,如果省略继承`init`的配置
+
+
+```javascript
+this.$refs.ani.step({
+	translateX: '100px'
+},{
+	duration: 1000,
+	timingFunction:'ease',
+	delay:500,
+	transformOrigin:'left center'
+})
+```
+
+### run(FUNCTION:callback) 执行动画
+**通过 ref 调用方法**
+
+在执行 `step()` 后,需要调用 `run()` 来运行动画 ,否则动画会一直等待
+
+`run()` 方法可以传入一个 `callback` 函数 ,会在所有动画执行完毕后回调
+
+```javascript
+this.$refs.ani.step({
+	translateX: '100px'
+})
+this.$refs.ani.run(()=>{
+	console.log('动画执行完毕')
+})
+
+```
+
+### 动画配置
+动画配置 , `init()` 与 `step()` 第二个参数配置相同 ,如果配置`step() `第二个参数,将会覆盖 `init()` 的配置
+
+|属性名|值|必填|默认值|说明|平台差异|
+|:-:|:-:|:-:|:-:|:-:|:-:|
+|duration|Number|否|400|动画持续时间,单位ms|-|
+|timingFunction|String|否|"linear"|定义动画的效果|-|
+|delay|Number|否|0|动画延迟时间,单位 ms|-|
+|needLayout|Boolean|否|false	|动画执行是否影响布局|仅 nvue 支持|
+|transformOrigin|String	|否|"center center"|设置	[transform-origin](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin)|-|
+
+
+### timingFunction 属性说明
+
+|值|说明|平台差异|
+|:-:|:-:|:-:|
+|linear|动画从头到尾的速度是相同的|-|
+|ease|动画以低速开始,然后加快,在结束前变慢|-|
+|ease-in|	动画以低速开始|-|
+|ease-in-out|	动画以低速开始和结束|-|
+|ease-out|动画以低速结束|-|
+|step-start|动画第一帧就跳至结束状态直到结束|nvue不支持|
+|step-end|动画一直保持开始状态,最后一帧跳到结束状态|nvue不支持|
+
+```javascript
+// init 配置
+this.$refs.ani.init({
+	duration: 1000,
+	timingFunction:'ease',
+	delay:500,
+	transformOrigin:'left center'
+})
+// step 配置
+this.$refs.ani.step({
+	translateX: '100px'
+},{
+	duration: 1000,
+	timingFunction:'ease',
+	delay:500,
+	transformOrigin:'left center'
+})
+```
+
+### 支持的动画
+动画方法 
+
+如果同一个动画方法有多个值,多个值使用数组分隔
+
+```javascript
+this.$refs.ani.step({
+	width:'100px',
+	scale: [1.2,0.8],
+})
+```
+
+**样式:**
+
+|属性名|值|说明|平台差异|
+|:-:|:-:|:-:|:-:|
+|opacity|value|透明度,参数范围 0~1|-|
+|backgroundColor|color|颜色值|-|
+|width|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-|
+|height|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-|
+|top|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
+|left|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
+|bottom|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
+|right|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
+
+```javascript
+this.$refs.ani.step({
+	opacity: 1,
+	backgroundColor: '#ff5a5f',
+	widht:'100px',
+	height:'50rpx',
+})
+```
+
+**旋转:**
+
+旋转属性的值不需要填写单位
+
+|属性名|值|说明|平台差异	|
+|:-:|:-:|:-:|:-:|
+|rotate|deg|deg的范围-180~180,从原点顺时针旋转一个deg角度	|-|
+|rotateX|deg|deg的范围-180~180,在X轴旋转一个deg角度				|-|
+|rotateY|deg|deg的范围-180~180,在Y轴旋转一个deg角度				|-|
+|rotateZ|deg|deg的范围-180~180,在Z轴旋转一个deg角度				|nvue不支持|
+|rotate3d|x,y,z,deg| 同	[transform-function rotate3d](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d())		|nvue不支持|
+
+```javascript
+this.$refs.ani.step({
+	rotateX: 45,
+	rotateY: 45
+})
+```
+
+**缩放:**
+
+|属性名|值|说明|平台差异|
+|:-:|:-:|:-:	|:-:|
+|scale|sx,[sy]|一个参数时,表示在X轴、Y轴同时缩放sx倍数;两个参数时表示在X轴缩放sx倍数,在Y轴缩放sy倍数|-|
+|scaleX|sx|在X轴缩放sx倍数|-|
+|scaleY|sy|在Y轴缩放sy倍数|-|
+|scaleZ|sz|在Z轴缩放sy倍数|nvue不支持|
+|scale3d|sx,sy,sz|在X轴缩放sx倍数,在Y轴缩放sy倍数,在Z轴缩放sz倍数|nvue不支持|
+
+```javascript
+this.$refs.ani.step({
+	scale: [1.2,0.8]
+})
+```
+
+**偏移:**
+
+|属性名|值|说明|平台差异|
+|:-:|:-:|:-:|:-:|
+|translate|tx,[ty]|一个参数时,表示在X轴偏移tx,单位px;两个参数时,表示在X轴偏移tx,在Y轴偏移ty,单位px。|-|
+|translateX|tx|	在X轴偏移tx,单位px|-|
+|translateY|ty|	在Y轴偏移tx,单位px|-|
+|translateZ|tz|	在Z轴偏移tx,单位px|nvue不支持|
+|translate3d|tx,ty,tz|	在X轴偏移tx,在Y轴偏移ty,在Z轴偏移tz,单位px|nvue不支持|
+
+```javascript
+this.$refs.ani.step({
+	translateX: '100px'
+})
+```
+
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/transition/transition](https://hellouniapp.dcloud.net.cn/pages/extUI/transition/transition)

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott