zaijin 3 年之前
父節點
當前提交
35f6816f70
共有 42 個文件被更改,包括 7254 次插入281 次删除
  1. 160 141
      h5_web/pages.json
  2. 0 0
      h5_web/pages/dynamicTracking/dynamicTracking.scss
  3. 21 0
      h5_web/pages/dynamicTracking/dynamicTracking.vue
  4. 69 0
      h5_web/pages/evaluationIntention/evaluationIntention.scss
  5. 166 0
      h5_web/pages/evaluationIntention/evaluationIntention.vue
  6. 22 0
      h5_web/pages/jodDetails/jodDetails.vue
  7. 196 0
      h5_web/pages/mine/mine.scss
  8. 98 139
      h5_web/pages/mine/mine.vue
  9. 159 0
      h5_web/pages/mine/mine1.vue
  10. 49 0
      h5_web/pages/myDelivery/myDelivery.scss
  11. 93 0
      h5_web/pages/myDelivery/myDelivery.vue
  12. 317 0
      h5_web/pages/myResume/myResume.scss
  13. 192 0
      h5_web/pages/myResume/myResume.vue
  14. 32 0
      h5_web/pages/personalModify/personalModify.vue
  15. 二進制
      h5_web/static/icon-font/fonts/icomoon.eot
  16. 17 0
      h5_web/static/icon-font/fonts/icomoon.svg
  17. 二進制
      h5_web/static/icon-font/fonts/icomoon.ttf
  18. 二進制
      h5_web/static/icon-font/fonts/icomoon.woff
  19. 55 0
      h5_web/static/icon-font/style.css
  20. 二進制
      h5_web/static/img/avatar.jpg
  21. 1 1
      h5_web/uni.scss
  22. 15 0
      h5_web/uni_modules/z-paging/changelog.md
  23. 186 0
      h5_web/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue
  24. 88 0
      h5_web/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue
  25. 126 0
      h5_web/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue
  26. 157 0
      h5_web/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue
  27. 284 0
      h5_web/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue
  28. 1 0
      h5_web/uni_modules/z-paging/components/z-paging/config/index.js
  29. 181 0
      h5_web/uni_modules/z-paging/components/z-paging/css/z-paging-main.css
  30. 33 0
      h5_web/uni_modules/z-paging/components/z-paging/css/z-paging-static.css
  31. 28 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-config.js
  32. 25 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js
  33. 153 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js
  34. 3062 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-main.js
  35. 32 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js
  36. 8 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-static.js
  37. 199 0
      h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js
  38. 54 0
      h5_web/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js
  39. 342 0
      h5_web/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs
  40. 503 0
      h5_web/uni_modules/z-paging/components/z-paging/z-paging.vue
  41. 84 0
      h5_web/uni_modules/z-paging/package.json
  42. 46 0
      h5_web/uni_modules/z-paging/readme.md

+ 160 - 141
h5_web/pages.json

@@ -6,26 +6,22 @@
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationStyle":"custom",// 隐藏系统导航栏
+				"navigationStyle": "custom", // 隐藏系统导航栏
 				"navigationBarTitleText": "首页"
 			}
-		}
-		,{
-		    "path" : "pages/mycode/mycode",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "退役军人码"
-		    }
-		    
-		}
-		,
+		}, {
+			"path": "pages/mycode/mycode",
+			"style": {
+				"navigationBarTitleText": "退役军人码"
+			}
+
+		},
 		{
-		    "path" : "pages/authentication/authentication",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "退役军人职业教育码申请"
-		    }
-		    
+			"path": "pages/authentication/authentication",
+			"style": {
+				"navigationBarTitleText": "退役军人职业教育码申请"
+			}
+
 		},
 		{
 			"path": "pages/phoneLogin/phoneLogin",
@@ -34,38 +30,31 @@
 			}
 		},
 		{
-		    "path" : "pages/bannerDetails/bannerDetails",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "详情页"
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/policyNews/policyNews",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "政策资讯"
-				
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/policyNewsDetails/policyNewsDetails",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "文章详情"
-				
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/newsDetails/newsDetails",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "文章详情"
-		    }
-		    
+			"path": "pages/bannerDetails/bannerDetails",
+			"style": {
+				"navigationBarTitleText": "详情页"
+			}
+
+		}, {
+			"path": "pages/policyNews/policyNews",
+			"style": {
+				"navigationBarTitleText": "政策资讯"
+
+			}
+
+		}, {
+			"path": "pages/policyNewsDetails/policyNewsDetails",
+			"style": {
+				"navigationBarTitleText": "文章详情"
+
+			}
+
+		}, {
+			"path": "pages/newsDetails/newsDetails",
+			"style": {
+				"navigationBarTitleText": "文章详情"
+			}
+
 		},
 		{
 			"path": "pages/login/code",
@@ -74,81 +63,111 @@
 			}
 		},
 		{
-            "path" : "pages/mine/mine",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "个人中心",
+			"path": "pages/mine/mine",
+			"style": {
+				"navigationBarTitleText": "个人中心",
 				"navigationStyle": "custom"
-            }
-            
-        },
+			}
+
+		},
 		{
-            "path" : "pages/center/center",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "中心",
-                "enablePullDownRefresh": false
-            }
-            
-        }
-		,{
-		    "path" : "pages/privacyPolicy/privacyPolicy",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "隐私政策"
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/schools/schools",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "学院列表"
-		    }
-		}
-		,{
-		    "path" : "pages/skillsTraining/skillsTraining",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "技能培训"
-		    }
-		}
-		,{
-		    "path" : "pages/basicTraining/basicTraining",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "适应性培训"
-		    }
-		}
-		,{
-		    "path" : "pages/basicTraining/myBasicTraining/myBasicTraining",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "我的适应性培训"
-		    }
-		}
-		,{
-		    "path" : "pages/basicTraining/basicTrainingDetails/basicTrainingDetails",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "在线上课"
-		    }
-		}
-		,{
-		    "path" : "pages/upgrade/upgrade",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "学历提升"
-		    }
-		}
-		,{
-		    "path" : "pages/inbuild/inbuild",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "建设中"
-		    }
+			"path": "pages/center/center",
+			"style": {
+				"navigationBarTitleText": "中心",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/privacyPolicy/privacyPolicy",
+			"style": {
+				"navigationBarTitleText": "隐私政策"
+			}
+
+		}, {
+			"path": "pages/schools/schools",
+			"style": {
+				"navigationBarTitleText": "学院列表"
+			}
+		}, {
+			"path": "pages/skillsTraining/skillsTraining",
+			"style": {
+				"navigationBarTitleText": "技能培训"
+			}
+		}, {
+			"path": "pages/basicTraining/basicTraining",
+			"style": {
+				"navigationBarTitleText": "适应性培训"
+			}
+		}, {
+			"path": "pages/basicTraining/myBasicTraining/myBasicTraining",
+			"style": {
+				"navigationBarTitleText": "我的适应性培训"
+			}
+		}, {
+			"path": "pages/basicTraining/basicTrainingDetails/basicTrainingDetails",
+			"style": {
+				"navigationBarTitleText": "在线上课"
+			}
+		}, {
+			"path": "pages/upgrade/upgrade",
+			"style": {
+				"navigationBarTitleText": "学历提升"
+			}
+		}, {
+			"path": "pages/inbuild/inbuild",
+			"style": {
+				"navigationBarTitleText": "建设中"
+			}
+		}, {
+			"path": "pages/myResume/myResume",
+			"style": {
+				"navigationBarTitleText": "简历",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#2a82e4",
+				"navigationBarTextStyle": "white"
+			}
+
+		}, {
+			"path": "pages/dynamicTracking/dynamicTracking",
+			"style": {
+				"navigationBarTitleText": "全链条动态跟踪",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/personalModify/personalModify",
+			"style": {
+				"navigationBarTitleText": "个人资料修改",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#fff"
+			}
+
+		}, {
+			"path": "pages/evaluationIntention/evaluationIntention",
+			"style": {
+				"navigationBarTitleText": "求职意向自我评价",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+			}
+
+		}, {
+			"path": "pages/myDelivery/myDelivery",
+			"style": {
+				"navigationBarTitleText": "我的投递",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#fff"
+			}
+
+		}, {
+			"path": "pages/jodDetails/jodDetails",
+			"style": {
+				"navigationBarTitleText": "职位详情",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#fff"
+			}
+
 		}
-    ],
+	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "uni-app",
@@ -156,25 +175,25 @@
 		"backgroundColor": "#F8F8F8"
 	},
 	"tabBar": {
-	    "color": "#909399",
-	    "selectedColor": "#303133",
-	    "borderStyle": "black",
-	    "backgroundColor": "#ffffff",
-	    "list": [{
-	        "pagePath": "pages/index/index",
-	        "iconPath": "static/icons/index-gray.png",
-	        "selectedIconPath": "static/icons/index.png",
-	        "text": "首页"
-	    }, {
-	        "pagePath": "pages/mycode/mycode",
-	        "iconPath": "static/icons/code-gray.png",
-	        "selectedIconPath": "static/icons/code.png",
-	        "text": "退役军人码"
-	    }, {
-	        "pagePath": "pages/mine/mine",
-	        "iconPath": "static/icons/mine-gray.png",
-	        "selectedIconPath": "static/icons/mine.png",
-	        "text": "我"
-	    }]
+		"color": "#909399",
+		"selectedColor": "#303133",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"list": [{
+			"pagePath": "pages/index/index",
+			"iconPath": "static/icons/index-gray.png",
+			"selectedIconPath": "static/icons/index.png",
+			"text": "首页"
+		}, {
+			"pagePath": "pages/mycode/mycode",
+			"iconPath": "static/icons/code-gray.png",
+			"selectedIconPath": "static/icons/code.png",
+			"text": "退役军人码"
+		}, {
+			"pagePath": "pages/mine/mine",
+			"iconPath": "static/icons/mine-gray.png",
+			"selectedIconPath": "static/icons/mine.png",
+			"text": "我"
+		}]
 	}
 }

+ 0 - 0
h5_web/pages/dynamicTracking/dynamicTracking.scss


+ 21 - 0
h5_web/pages/dynamicTracking/dynamicTracking.vue

@@ -0,0 +1,21 @@
+<!-- 全链条动态跟踪 -->
+<template>
+	<view>全链条动态跟踪</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+@import './dynamicTracking.scss'
+</style>

+ 69 - 0
h5_web/pages/evaluationIntention/evaluationIntention.scss

@@ -0,0 +1,69 @@
+/* 自我评价和求职意向 */
+.evaluate-intention {
+	width: calc(100% - 96rpx);
+	margin: 0 auto;
+	&-bar {
+		&-right {
+			margin-right: 40rpx;
+			font-size: 28rpx;
+			color: #a6a6a6;
+		}
+	}
+	&-explain {
+		margin-top: 20rpx;
+		view {
+			&:first-child {
+				font-size: 36rpx;
+				color: #000;
+				font-weight: bold;
+			}
+			&:last-child {
+				color: #a6a6a6;
+				font-size: 28rpx;
+				margin-top: 10rpx;
+			}
+		}
+	}
+	/* tab */
+	&-tabs {
+		margin-top: 40rpx;
+		display: flex;
+		&-item {
+			margin-right: 72rpx;
+			font-size: 36rpx;
+			color: #a6a6a6;
+			font-family: 'Microsoft YaHei';
+			padding-bottom: 10rpx;
+		}
+		&-active {
+			color: #505050;
+			border-bottom: solid 1px #2a82e4;
+		}
+	}
+	
+	/* 工作意向 */
+	&-intention {
+		margin-top: 40rpx;
+		padding-bottom: 100rpx;
+		&-submit {
+			margin-top: 40rpx;
+			.btn {
+				background-color: #a9d8d1;
+			}
+		}
+		&-explain {
+			text-align: center;
+			margin-top: 40rpx;
+			color: #54a494;
+		}
+	}
+	
+	/* 自我评价 */
+	&-evaluate {
+		margin-top: 40rpx;
+		padding-bottom: 100rpx;
+		&-submit {
+			margin-top: 40rpx;
+		}
+	}
+}

+ 166 - 0
h5_web/pages/evaluationIntention/evaluationIntention.vue

@@ -0,0 +1,166 @@
+<!-- 自我评价和求职意向 -->
+<template>
+	<view class="evaluate-intention">
+		
+		<!-- 导航栏 -->
+		<u-navbar class="evaluate-intention-bar" back-text="" title="">
+			<view class="evaluate-intention-bar-right" slot="right" @click="jumpPage('/pages/index/index')">跳过</view>
+		</u-navbar>
+		
+		<view class="evaluate-intention-explain">
+			<view>继续完善加分项</view>
+			<view>据平台数据显示,完善后,被HR查看几率更高</view>
+		</view>
+		
+		<!-- tab页 -->
+		<view class="evaluate-intention-tabs">
+			<view
+				class="evaluate-intention-tabs-item"
+				v-for="(item, index) in list"
+				:key="index"
+				:class="{'evaluate-intention-tabs-active': tabCur === index}"
+				@click="tabCur = index"
+			>
+				{{ item.name }}
+			</view>
+		</view>
+		
+		<!-- 工作意向 -->
+		<view class="evaluate-intention-intention" v-if="tabCur === 0">
+			<u-form
+				:model="intentionForm"
+				ref="intentionForm"
+				label-position="top"
+			>
+				<u-form-item label="工作城市">
+					<u-input v-model="intentionForm.city" type="select" @click="cityShow = true" placeholder="请选择工作城市"/>
+					<u-select v-model="cityShow" :list="cityList"></u-select>
+				</u-form-item>
+				<u-form-item label="期望职位">
+					<u-input v-model="intentionForm.position" type="select" @click="positionShow = true" placeholder="请选择期望职位"/>
+					<u-select v-model="positionShow" :list="positionList"></u-select>
+				</u-form-item>
+				<u-form-item label="期望行业">
+					<u-input v-model="intentionForm.industry" type="select" @click="industryShow = true" placeholder="请选择期望行业"/>
+					<u-select v-model="industryShow" :list="industryList"></u-select>
+				</u-form-item>
+				<u-form-item label="薪资要求">
+					<u-input v-model="intentionForm.salary" type="select" @click="salaryShow = true" placeholder="请选择薪资要求"/>
+					<u-select v-model="salaryShow" :list="salaryList"></u-select>
+				</u-form-item>
+			</u-form>
+			<view class="evaluate-intention-intention-submit">
+				<u-button type="primary" class="btn">开始找工作</u-button>
+			</view>
+			<view class="evaluate-intention-intention-explain">去完善项目经历,让更多HR看到你</view>
+		</view>
+		
+		<!-- 自我评价 -->
+		<view class="evaluate-intention-evaluate" v-else-if="tabCur === 1">
+			<u-form
+				:model="evaluateForm"
+				ref="evaluateForm"
+				label-position="top"
+			>
+				<u-form-item label="自我评价">
+					<u-input
+						v-model="evaluateForm.content"
+						type="textarea"
+						:border="true"
+						:height="150"
+						:auto-height="true"
+					/>
+				</u-form-item>
+			</u-form>
+			<view class="evaluate-intention-evaluate-submit">
+				<u-button type="primary" class="btn">提交</u-button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list: [
+					{
+						name: '求职意向'
+					},
+					{
+						name: '自我评价'
+					}
+				],
+				tabCur: 0,
+				intentionForm: {
+					city: '贵阳',
+					position: '',
+					industry: '不限',
+					salary: ''
+				},
+				// 城市下拉显示
+				cityShow: false,
+				// 城市列表
+				cityList: [
+					{
+						value: 1,
+						label: '贵阳'
+					}
+				],
+				// 职位下拉显示
+				positionShow: false,
+				// 职位列表
+				positionList: [
+					{
+						value: 1,
+						label: '保安'
+					}
+				],
+				// 行业下拉显示
+				industryShow: false,
+				// 行业列表
+				industryList: [
+					{
+						value: 1,
+						label: '不限'
+					}
+				],
+				// 薪资下拉显示
+				salaryShow: false,
+				// 薪资列表
+				salaryList: [
+					{
+						value: 1,
+						label: '3000 ~ 4000'
+					},
+					{
+						value: 2,
+						label: '4000 ~ 5000'
+					}
+				],
+				// 自我评价
+				evaluateForm: {
+					content: ''
+				}
+			}
+		},
+		onLoad(page) {
+			if (page.tabCur) {
+				this.tabCur = Number(page.tabCur)
+			}
+		},
+		methods: {
+			/**
+			 * 跳转到指定页面
+			 */
+			jumpPage(url) {
+				console.log(url)
+				this.$u.route(url)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+@import './evaluationIntention.scss'
+</style>

+ 22 - 0
h5_web/pages/jodDetails/jodDetails.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		职位详情
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 196 - 0
h5_web/pages/mine/mine.scss

@@ -0,0 +1,196 @@
+/* 部分菜单图标 */
+	@font-face {
+		font-family: 'icomoon';
+		src:  url('../../static/icon-font/fonts/icomoon.eot?f82mqt');
+		src:  url('../../static/icon-font/fonts/icomoon.eot?f82mqt#iefix') format('embedded-opentype'),
+			url('../../static/icon-font/fonts/icomoon.ttf?f82mqt') format('truetype'),
+			url('../../static/icon-font/fonts/icomoon.woff?f82mqt') format('woff'),
+			url('../../static/icon-font/fonts/icomoon.svg?f82mqt#icomoon') format('svg');
+		font-weight: normal;
+		font-style: normal;
+		font-display: block;
+	}
+
+	[class^="icon-"], [class*=" icon-"] {
+		/* use !important to prevent issues with browser extensions that change fonts */
+		font-family: 'icomoon' !important;
+		speak: never;
+		font-style: normal;
+		font-weight: normal;
+		font-variant: normal;
+		text-transform: none;
+		line-height: 1;
+
+		/* Better Font Rendering =========== */
+		-webkit-font-smoothing: antialiased;
+		-moz-osx-font-smoothing: grayscale;
+	}
+
+	.icon-resume-icon:before {
+		content: "\e900";
+		color: #808080;
+	}
+	.icon-evaluate-icon:before {
+		content: "\e901";
+		color: #808080;
+	}
+	.icon-setting-icon:before {
+		content: "\e902";
+		color: #808080;
+	}
+	.icon-delivery-icon:before {
+		content: "\e903";
+		color: #808080;
+	}
+	.icon-interview-icon:before {
+		content: "\e904";
+		color: #808080;
+	}
+	.icon-train-icon:before {
+		content: "\e905";
+		color: #808080;
+	}
+.mine {
+	position: relative;
+	.mine-bg {
+		background-color: #2a82e4;
+		height: 460rpx;
+	}
+	.mine-card-1 {
+		position: absolute;
+		top: 140rpx;
+		z-index: 100;
+		width: calc(100% - 32px);
+		overflow: inherit;
+		box-shadow: 0px 3px 19px 0px rgba(0, 0, 0, 0.2)!important;
+		.mine-card-1-content {
+			.user-info {
+				display: flex;
+				justify-content: space-between;
+				.user-info-left {
+					display: flex;
+					justify-content: space-between;
+					.user-info-left-avatar {
+						text-align: center;
+						.name {
+							font-size: 34rpx;
+							font-family: 'Microsoft YaHei';
+							color: #383838;
+							font-weight: bold;
+						}
+					}
+					.user-info-left-attribute {
+						margin-left: 20rpx;
+						.veterans,
+						.train {
+							font-size: 23rpx;
+							font-family: 'Microsoft YaHei';
+							color: #383838;
+							margin-bottom: 15rpx;
+							line-height: 38rpx;
+							.link {
+								color: #2a82e4;
+							}
+						}
+					}
+				}
+				.user-info-right {
+					width: 300rpx;
+					height: 300rpx;
+					border-radius: 50%;
+					background-color: #fff;
+					position: absolute;
+					right: 50rpx;
+					top: -80rpx;
+					z-index: 3000;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					.integral {
+						width: 220rpx;
+						height: 220rpx;
+						background-color: #ffc300;
+						border-radius: 50%;
+						text-align: center;
+						padding-top: 33rpx;
+						view {
+							&:first-child {
+								color: #ff5733;
+								font-size: 58rpx;
+								font-weight: bold;
+								font-family: 'Microsoft YaHei';
+							}
+							&:nth-child(2) {
+								font-size: 23rpx;
+								color: #383838;
+								font-family: 'Microsoft YaHei';
+							}
+							&:last-child {
+								display: inline-block;
+								width: 120rpx;
+								height: 40rpx;
+								line-height: 40rpx;
+								text-align: center;
+								border-radius: 20rpx;
+								background-color: #fff;
+								font-size: 23rpx;
+								color: #383838;
+								font-family: 'Microsoft YaHei';
+								margin-top: 10rpx;
+							}
+						}
+					}
+				}
+			}
+			.user-integral {
+				display: flex;
+				justify-content: space-between;
+				.user-integral-item {
+					text-align: center;
+					view {
+						color: #383838;
+						font-family: 'Microsoft YaHei';
+						font-size: 26rpx;
+						&:last-child {
+							font-size: 32rpx;
+							font-weight: bold;
+							margin-top: 20rpx;
+						}
+						text {
+							font-size: 60rpx;
+							font-weight: bold;
+							margin-right: 5rpx;
+						}
+					}
+					&:first-child {
+						text {
+							color: #2a82e4;
+						}
+					}
+					&:nth-child(2) {
+						text {
+							color: #ff5733;
+						}
+					}
+					&:last-child {
+						text {
+							color: #00baad;
+						}
+					}
+				}
+			}
+		}
+	}
+	.grid-menu {
+		margin-top: 180rpx!important;
+		box-shadow: 0px 3px 19px 0px rgba(0, 0, 0, 0.2)!important;
+		.grid-menu-icon {
+			font-size: 64rpx;
+		}
+		.grid-text {
+			font-size: 26rpx;
+			margin-top: 16rpx;
+			color: #808080;
+		}
+	}
+}

+ 98 - 139
h5_web/pages/mine/mine.vue

@@ -1,159 +1,118 @@
 <template>
 	<view class="mine">
-		<u-navbar :is-back="false" title=" " :border-bottom="false">
-			<view class="u-flex u-row-right" style="width: 100%;">
-				<!-- <view class="camera u-flex u-row-center">
-					<u-icon name="camera-fill" color="#000000" size="48"></u-icon>
-				</view> -->
+		<view class="mine-bg"></view>
+		<!--  用户信息   -->
+		<u-card class="mine-card-1" :show-head="false">
+			<view slot="body" class="mine-card-1-content">
+				<view class="user-info">
+					<view class="user-info-left">
+						<view class="user-info-left-avatar" @click="jumpPage('/pages/personalModify/personalModify')">
+							<u-avatar :src="userInfo.avatar" mode="square" size="111"></u-avatar>
+							<view class="name">{{ userInfo.nickName }}</view>
+						</view>
+						<view class="user-info-left-attribute">
+							<view class="veterans">
+								<view>退役军人</view>
+								<view class="link">未认证 ></view>
+							</view>
+							<view class="train">
+								<view>适应性培训</view>
+								<view class="link">未完成 ></view>
+							</view>
+						</view>
+					</view>
+					<view class="user-info-right">
+						<view class="integral">
+							<view>{{ userInfo.integral }}</view>
+							<view>进步积分</view>
+							<view>查看详情</view>
+						</view>
+					</view>
+				</view>
+				<u-divider :half-width="300" :height="50" :use-slot="false"></u-divider>
+				<view class="user-integral">
+					<view class="user-integral-item">
+						<view>
+							<text>8 </text>个
+						</view>
+						<view>技能培训</view>
+					</view>
+					<view class="user-integral-item">
+						<view>
+							<text>68.5 </text>小时
+						</view>
+						<view>学习时长</view>
+					</view>
+					<view class="user-integral-item">
+						<view>
+							<text>10 </text>次
+						</view>
+						<view>获得面试</view>
+					</view>
+				</view>
 			</view>
-		</u-navbar>
-		<view class="u-flex user-box u-p-l-30 u-p-r-20 u-p-b-30">
-			<view class="u-m-r-10">
-				<u-avatar :src="memberinfo.avatar||pic" size="140"></u-avatar>
-			</view>
-			<view class="u-flex-1">
-				<view class="u-font-18 u-p-b-20">{{memberinfo.name}}</view>
-				<view class="u-font-14 u-tips-color">
-				军人认证状态:
-				{{memberinfo.auditStatus|verifyStatusFilter}}
-				<text v-if="memberinfo.auditStatus==1||memberinfo.auditStatus==9" @click="openPage('pages/authentication/authentication')" style="margin-left: 24rpx;">去认证</text>
-			</view>
-			</view>
-			<view class="u-m-l-10 u-p-10">
-				<u-icon name="arrow-right" color="#969799" size="28" @click="openPage('pages/inbuild/inbuild','个人信息')"></u-icon>
-			</view>
-		</view>
-		<view class="mine-todo u-flex u-row-between">
-			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','我的投递')">
-				<view class="num">25</view>
-				<view class="text">我的投递</view>
-			</view>
-			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','我的面试')">
-				<view class="num">18</view>
-				<view class="text">我的面试</view>
-			</view>
-			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','关注企业')">
-				<view class="num">6</view>
-				<view class="text">关注企业</view>
-			</view>
-			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','消息通知')">
-				<view class="num">8</view>
-				<view class="text">消息通知</view>
+		</u-card>
+
+		<!-- 宫格 -->
+		<u-card :show-head="false" class="grid-menu">
+			<view slot="body">
+				<u-grid :col="3" :border="false">
+					<u-grid-item @click="jumpPage('/pages/myResume/myResume')">
+						<view class="grid-menu-icon icon-resume-icon"></view>
+						<view class="grid-text">我的简历</view>
+					</u-grid-item>
+					<u-grid-item @click="jumpPage('/pages/myDelivery/myDelivery')">
+						<view class="grid-menu-icon icon-delivery-icon"></view>
+						<view class="grid-text">我的投递</view>
+					</u-grid-item>
+					<u-grid-item>
+						<view class="grid-menu-icon icon-interview-icon"></view>
+						<view class="grid-text">我的面试</view>
+					</u-grid-item>
+				</u-grid>
+				<u-divider :half-width="300" :height="50" :use-slot="false"></u-divider>
+				<u-grid :col="3" :border="false">
+					<u-grid-item>
+						<view class="grid-menu-icon icon-train-icon"></view>
+						<view class="grid-text">我的技能培训</view>
+					</u-grid-item>
+					<u-grid-item>
+						<view class="grid-menu-icon icon-evaluate-icon"></view>
+						<view class="grid-text">我的评价</view>
+					</u-grid-item>
+					<u-grid-item>
+						<view class="grid-menu-icon icon-setting-icon"></view>
+						<view class="grid-text">设置</view>
+					</u-grid-item>
+				</u-grid>
 			</view>
-		</view>
-		
-		<view class="u-m-t-20">
-			<u-cell-group>
-				<u-cell-item icon="order" title="电子简历" @click="openPage('pages/inbuild/inbuild','电子简历')" ></u-cell-item>
-				<u-cell-item icon="heart" title="求职意向" @click="openPage('pages/inbuild/inbuild','求职意向')"></u-cell-item>
-			</u-cell-group>
-		</view>
-		
-		<view class="u-m-t-20">
-			<u-cell-group>
-				<u-cell-item icon="cut" title="我的技能培训" @click="openPage('pages/inbuild/inbuild','我的技能培训')"></u-cell-item>
-				<u-cell-item icon="photo" title="我的学历提升" @click="openPage('pages/inbuild/inbuild','我的学历提升')"></u-cell-item>
-				<u-cell-item icon="coupon" title="我的适应性培训" @click="openPage('pages/basicTraining/myBasicTraining/myBasicTraining')"></u-cell-item>
-				<u-cell-item icon="edit-pen" title="我的考试考核" @click="openPage('pages/inbuild/inbuild','我的考试考核')"></u-cell-item>
-				<u-cell-item icon="android-circle-fill" title="我的班级" @click="openPage('pages/inbuild/inbuild','我的班级')"></u-cell-item>
-				<u-cell-item icon="file-text" title="行为积分" @click="openPage('pages/inbuild/inbuild','行为积分')"></u-cell-item>
-			</u-cell-group>
-		</view>
-		
-		<view class="u-m-t-20">
-			<u-cell-group>
-				<u-cell-item icon="setting" title="设置" @click="openPage('pages/inbuild/inbuild','设置')"></u-cell-item>
-				<u-cell-item icon="level" title="注销登录" @click="loginOut"></u-cell-item>
-			</u-cell-group>
-		</view>
+		</u-card>
 	</view>
 </template>
 
 <script>
 	export default {
+		name: 'Mine',
 		data() {
 			return {
-				pic:'/static/img/default-avatar.png',
-				show:true,
-				veteEducStatus:null,
-				memberinfo:[],
-			}
-		},
-		onLoad() {
-			
-			// this.veteEducCheck();
-		},
-		onShow() {
-			this.getmemberinfo();
-		},
-		filters: {
-		  verifyStatusFilter(value) {
-			if (value === 0) {
-			  return '审核中';
-			}else if(value === 1){
-				return '不通过';
-			}else if(value === 2){
-				return '通过';
-			}else if(value === 9){
-				return '未认证';
-			} else {
-			  return '未知';
+				userInfo: {
+					avatar: require('@/static/img/avatar.jpg'),
+					nickName: '李明',
+					integral: '688'
+				}
 			}
-		  },
 		},
 		methods: {
-			openPage(path,msg) {
-			  this.$u.route({
-			    url: path,
-				params:{
-					msg:msg
-				}
-			  })
-			},
-			veteEducCheck(){
-				this.$u.api.getVeteEducCheck().then(res=>{
-					// console.log('res',res);
-					this.veteEducStatus = res.data;
-				})
-			},
-			getmemberinfo(){
-				this.$u.api.getmemberinfo().then(res=>{
-					this.memberinfo = res.data;
-					console.log('this.memberinfo',JSON.parse(JSON.stringify(this.memberinfo)));
-				})
-			},
-			loginOut(){
-				let that = this;
-				this.$u.vuex('vuex_hasLogin', false);
-				this.$u.vuex('vuex_token', '');
-				this.$u.vuex('vuex_user', '');
-				this.$u.route('/pages/phoneLogin/phoneLogin');
+			/**
+			 * 跳转到指定页面
+			 */
+			jumpPage(url) {
+				this.$u.route(url)
 			}
 		}
 	}
 </script>
 
-<style lang="scss">
-page{
-	background-color: #ededed;	
-}
-
-.camera{
-	width: 54px;
-	height: 44px;
-	
-	&:active{
-		background-color: #ededed;
-	}
-}
-.user-box{
-	background-color: #fff;
-}
-.mine /deep/ .u-cell_title{font-size: 30rpx;}
-.mine /deep/ .u-iconfont{font-size: 45rpx!important;}
-.mine-todo{
-	background-color: #fff;
-	text-align: center;
-	padding: 0 24rpx 24rpx;
-}
+<style lang="scss" scoped>
+	@import './mine.scss';
 </style>

+ 159 - 0
h5_web/pages/mine/mine1.vue

@@ -0,0 +1,159 @@
+<template>
+	<view class="mine">
+		<u-navbar :is-back="false" title=" " :border-bottom="false">
+			<view class="u-flex u-row-right" style="width: 100%;">
+				<!-- <view class="camera u-flex u-row-center">
+					<u-icon name="camera-fill" color="#000000" size="48"></u-icon>
+				</view> -->
+			</view>
+		</u-navbar>
+		<view class="u-flex user-box u-p-l-30 u-p-r-20 u-p-b-30">
+			<view class="u-m-r-10">
+				<u-avatar :src="memberinfo.avatar||pic" size="140"></u-avatar>
+			</view>
+			<view class="u-flex-1">
+				<view class="u-font-18 u-p-b-20">{{memberinfo.name}}</view>
+				<view class="u-font-14 u-tips-color">
+				军人认证状态:
+				{{memberinfo.auditStatus|verifyStatusFilter}}
+				<text v-if="memberinfo.auditStatus==1||memberinfo.auditStatus==9" @click="openPage('pages/authentication/authentication')" style="margin-left: 24rpx;">去认证</text>
+			</view>
+			</view>
+			<view class="u-m-l-10 u-p-10">
+				<u-icon name="arrow-right" color="#969799" size="28" @click="openPage('pages/inbuild/inbuild','个人信息')"></u-icon>
+			</view>
+		</view>
+		<view class="mine-todo u-flex u-row-between">
+			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','我的投递')">
+				<view class="num">25</view>
+				<view class="text">我的投递</view>
+			</view>
+			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','我的面试')">
+				<view class="num">18</view>
+				<view class="text">我的面试</view>
+			</view>
+			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','关注企业')">
+				<view class="num">6</view>
+				<view class="text">关注企业</view>
+			</view>
+			<view class="mine-todo-item" @click="openPage('pages/inbuild/inbuild','消息通知')">
+				<view class="num">8</view>
+				<view class="text">消息通知</view>
+			</view>
+		</view>
+		
+		<view class="u-m-t-20">
+			<u-cell-group>
+				<u-cell-item icon="order" title="电子简历" @click="openPage('pages/inbuild/inbuild','电子简历')" ></u-cell-item>
+				<u-cell-item icon="heart" title="求职意向" @click="openPage('pages/inbuild/inbuild','求职意向')"></u-cell-item>
+			</u-cell-group>
+		</view>
+		
+		<view class="u-m-t-20">
+			<u-cell-group>
+				<u-cell-item icon="cut" title="我的技能培训" @click="openPage('pages/inbuild/inbuild','我的技能培训')"></u-cell-item>
+				<u-cell-item icon="photo" title="我的学历提升" @click="openPage('pages/inbuild/inbuild','我的学历提升')"></u-cell-item>
+				<u-cell-item icon="coupon" title="我的适应性培训" @click="openPage('pages/basicTraining/myBasicTraining/myBasicTraining')"></u-cell-item>
+				<u-cell-item icon="edit-pen" title="我的考试考核" @click="openPage('pages/inbuild/inbuild','我的考试考核')"></u-cell-item>
+				<u-cell-item icon="android-circle-fill" title="我的班级" @click="openPage('pages/inbuild/inbuild','我的班级')"></u-cell-item>
+				<u-cell-item icon="file-text" title="行为积分" @click="openPage('pages/inbuild/inbuild','行为积分')"></u-cell-item>
+			</u-cell-group>
+		</view>
+		
+		<view class="u-m-t-20">
+			<u-cell-group>
+				<u-cell-item icon="setting" title="设置" @click="openPage('pages/inbuild/inbuild','设置')"></u-cell-item>
+				<u-cell-item icon="level" title="注销登录" @click="loginOut"></u-cell-item>
+			</u-cell-group>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				pic:'/static/img/default-avatar.png',
+				show:true,
+				veteEducStatus:null,
+				memberinfo:[],
+			}
+		},
+		onLoad() {
+			
+			// this.veteEducCheck();
+		},
+		onShow() {
+			this.getmemberinfo();
+		},
+		filters: {
+		  verifyStatusFilter(value) {
+			if (value === 0) {
+			  return '审核中';
+			}else if(value === 1){
+				return '不通过';
+			}else if(value === 2){
+				return '通过';
+			}else if(value === 9){
+				return '未认证';
+			} else {
+			  return '未知';
+			}
+		  },
+		},
+		methods: {
+			openPage(path,msg) {
+			  this.$u.route({
+			    url: path,
+				params:{
+					msg:msg
+				}
+			  })
+			},
+			veteEducCheck(){
+				this.$u.api.getVeteEducCheck().then(res=>{
+					// console.log('res',res);
+					this.veteEducStatus = res.data;
+				})
+			},
+			getmemberinfo(){
+				this.$u.api.getmemberinfo().then(res=>{
+					this.memberinfo = res.data;
+					console.log('this.memberinfo',JSON.parse(JSON.stringify(this.memberinfo)));
+				})
+			},
+			loginOut(){
+				let that = this;
+				this.$u.vuex('vuex_hasLogin', false);
+				this.$u.vuex('vuex_token', '');
+				this.$u.vuex('vuex_user', '');
+				this.$u.route('/pages/phoneLogin/phoneLogin');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+page{
+	background-color: #ededed;	
+}
+
+.camera{
+	width: 54px;
+	height: 44px;
+	
+	&:active{
+		background-color: #ededed;
+	}
+}
+.user-box{
+	background-color: #fff;
+}
+.mine /deep/ .u-cell_title{font-size: 30rpx;}
+.mine /deep/ .u-iconfont{font-size: 45rpx!important;}
+.mine-todo{
+	background-color: #fff;
+	text-align: center;
+	padding: 0 24rpx 24rpx;
+}
+</style>

+ 49 - 0
h5_web/pages/myDelivery/myDelivery.scss

@@ -0,0 +1,49 @@
+/* 我的投递 */
+.delivery {
+	&-list {
+		&-item {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 18rpx 20rpx;
+			border-top: solid 1px #f3f3f3;
+			&-left {
+				display: flex;
+				align-items: center;
+				&-image {
+					width: 104rpx;
+					height: 104rpx;
+					margin-right: 40rpx;
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+				&-info {
+					font-size: 22rpx;
+					font-family: 'Microsoft YaHei';
+					color: #a6a6a6;
+					line-height: 50rpx;
+					view {
+						&:first-child {
+							color: #383838;
+							font-size: 30rpx;
+							font-weight: bold;
+						}
+					}
+				}
+			}
+			&-right {
+				view {
+					font-size: 22rpx;
+					font-family: 'Microsoft YaHei';
+					color: #a6a6a6;
+					&:first-child {
+						color: #ff5733;
+						margin-bottom: 20rpx;
+					}
+				}
+			}
+		}
+	}
+}

+ 93 - 0
h5_web/pages/myDelivery/myDelivery.vue

@@ -0,0 +1,93 @@
+<!-- 我的投递 -->
+<template>
+	<view class="delivery">
+		<z-paging
+			 ref="paging"
+			 v-model="deliveryList"
+			 @query="queryList"
+		>
+			<view class="delivery-list">
+				<view
+					class="delivery-list-item"
+					v-for="(item, index) in deliveryList"
+					:key="index"
+					@click="jumpPage('/pages/jodDetails/jodDetails')"
+				>
+					<view class="delivery-list-item-left">
+						<view class="delivery-list-item-left-image">
+							<image
+								:src="item.img"
+							/>
+						</view>
+						<view class="delivery-list-item-left-info">
+							<view>{{ item.position }}</view>
+							<view>{{ item.content }}</view>
+							<view>{{ item.company }}</view>
+						</view>
+					</view>
+					<view class="delivery-list-item-right">
+						<view>{{ item.area }}</view>
+						<view>{{ item.date }}</view>
+					</view>
+				</view>
+			</view>
+		</z-paging>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				deliveryList: []
+			}
+		},
+		methods: {
+			/**
+			 * 下拉上滑触发
+			 */
+			queryList(pageNo, pageSize) {
+				//组件加载时会自动触发此方法,因此默认页面加载时会自动触发,无需手动调用
+				//这里的pageNo和pageSize会自动计算好,直接传给服务器即可
+				//模拟请求服务器获取分页数据,请替换成自己的网络请求
+				// this.$request.queryList(pageNo, pageSize, this.tabIndex + 1, (data) => {
+				// 	//将请求的结果数组传递给z-paging
+				// 	this.$refs.paging.complete(data);
+				// 	//如果请求失败写 this.$refs.paging.complete(false);
+				// })
+				this.$refs.paging.complete(
+				[
+					{
+						img: require('@/static/img/avatar.jpg'),
+						position: '保安员',
+						company: '保利贵州酒店管理有限公司',
+						content: '贵州省 | 经验不限 | 中等专科',
+						area: '4.0 ~ 8.0k',
+						date: '2020-12.25'
+					},
+					{
+						img: require('@/static/img/avatar.jpg'),
+						position: '保安员',
+						company: '保利贵州酒店管理有限公司',
+						content: '贵州省 | 经验不限 | 中等专科',
+						area: '4.0 ~ 8.0k',
+						date: '2020-12.25'
+					}
+				])
+			},
+			/**
+			 * 跳转到指定页面
+			 */
+			jumpPage(url, params) {
+				this.$u.route({
+					url: url,
+					params: params
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+@import './myDelivery.scss';
+</style>

+ 317 - 0
h5_web/pages/myResume/myResume.scss

@@ -0,0 +1,317 @@
+/* 部分菜单图标 */
+@font-face {
+	font-family: 'icomoon';
+	src:  url('../../static/icon-font/fonts/icomoon.eot?f82mqt');
+	src:  url('../../static/icon-font/fonts/icomoon.eot?f82mqt#iefix') format('embedded-opentype'),
+		url('../../static/icon-font/fonts/icomoon.ttf?f82mqt') format('truetype'),
+		url('../../static/icon-font/fonts/icomoon.woff?f82mqt') format('woff'),
+		url('../../static/icon-font/fonts/icomoon.svg?f82mqt#icomoon') format('svg');
+	font-weight: normal;
+	font-style: normal;
+	font-display: block;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+	/* use !important to prevent issues with browser extensions that change fonts */
+	font-family: 'icomoon' !important;
+	speak: never;
+	font-style: normal;
+	font-weight: normal;
+	font-variant: normal;
+	text-transform: none;
+	line-height: 1;
+
+	/* Better Font Rendering =========== */
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+.icon-phone-icon:before {
+	content: "\e906";
+	color: #999;
+}
+/* 我的简历 */
+.resume {
+	width: calc(100% - 92rpx);
+	margin: 36rpx auto;
+	
+	/* 头像 */
+	.resume-head {
+		display: flex;
+		.resume-head-left {
+			margin-right: 32rpx;
+		}
+		.resume-head-right {
+			view {
+				color: #505050;
+				font-size: 30rpx;
+				font-family: 'Microsoft YaHei';
+				&:first-child {
+					font-size: 38rpx;
+					color: #505050;
+					font-weight: bold;
+					margin-bottom: 16rpx;
+				}
+				&:last-child {
+					font-size: 28rpx;
+					margin-top: 5rpx;
+				}
+				text {
+					color: #2a82e4;
+				}
+			}
+		}
+	}
+	
+	/* 基本信息 */
+	.resume-base-info {
+		margin-top: 54rpx;
+		.resume-base-info-item {
+			font-size: 32rpx;
+			color: #666666;
+			margin-top: 30rpx;
+		}
+		.resume-base-info-phone {
+			margin-top: 18rpx;
+			font-size: 30rpx;
+			color: #505050;
+		}
+	}
+	
+	/* 求职意向 */
+	.resume-job-intention {
+		margin-top: 54rpx;
+		.resume-job-intention-add {
+			margin-top: 30rpx;
+			.rjia-item {
+				color: #666666;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+				&:nth-child(2) {
+					color: #2a82e4;
+					text-align: center;
+					margin-top: 30rpx;
+				}
+				&:last-child {
+					font-size: 24rpx;
+					color: #a6a6a6;
+					margin-top: 10rpx;
+					text-align: center;
+				}
+			}
+		}
+		.resume-job-intention-info {
+			.rjii-box {
+				display: flex;
+				justify-content: space-between;
+				margin-top: 30rpx;
+				color: #666666;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+				.rjii-left {
+					line-height: 50rpx;
+				}
+				.rjii-right {
+					color: #2a82e4;
+					margin-top: 20rpx;
+				}
+			}
+			.rjii-edit-btn {
+				color: #2a82e4;
+				text-align: center;
+				margin-top: 30rpx;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+			}
+		}
+	}
+	
+	/* 自我评价 */
+	.resume-self-evaluation {
+		margin-top: 54rpx;
+		.resume-self-evaluation-add {
+			margin-top: 30rpx;
+			.rsea-item {
+				color: #666666;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+				&:nth-child(2) {
+					color: #2a82e4;
+					text-align: center;
+					margin-top: 30rpx;
+				}
+				&:last-child {
+					font-size: 24rpx;
+					color: #a6a6a6;
+					margin-top: 10rpx;
+					text-align: center;
+				}
+			}
+		}
+		.resume-self-evaluation-info {
+			.rsei-box {
+				color: #666666;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+				margin-top: 30rpx;
+				line-height: 60rpx;
+			}
+			.rsei-edit-btn {
+				color: #2a82e4;
+				text-align: center;
+				margin-top: 30rpx;
+				font-size: 32rpx;
+				font-family: 'Microsoft YaHei';
+			}
+		}
+	}
+	
+	/* 工作经历 */
+	.resume-work-experience {
+		margin-top: 54rpx;
+		.resume-work-experience-steps {
+			margin-top: 30rpx;
+		}
+		.height-110 {
+			height: 220rpx;
+			overflow: hidden;
+			transition: height 1s ease-in;
+		}
+		.height-auto {
+			height: auto;
+			transition: height 1s ease-out;
+		}
+		.resume-work-experience-btn {
+			text-align: center;
+			color: #2a82e4;
+			font-size: 28rpx;
+			padding: 30rpx 0;
+		}
+	}
+	
+	/* 培训与教育经历 */
+	.resume-train-experience {
+		margin-top: 54rpx;
+		.resume-train-experience-steps {
+			margin-top: 30rpx;
+		}
+		.height-110 {
+			height: 260rpx;
+			overflow: hidden;
+			transition: height 1s ease-in;
+		}
+		.height-auto {
+			height: auto;
+			transition: height 1s ease-out;
+		}
+		.resume-train-experience-btn {
+			text-align: center;
+			color: #2a82e4;
+			font-size: 28rpx;
+			padding: 30rpx 0;
+		}
+	}
+}
+/* 标题 */
+.title {
+	border-left: solid 20rpx #2a82e4;
+	padding-left: 20rpx;
+	font-size: 32rpx;
+	color: #505050;
+	font-family: 'Microsoft YaHei';
+	font-weight: bold;
+}
+/* 步骤条样式 */
+@import '@/uview-ui/libs/css/style.components.scss';
+
+$u-steps-item-number-width: 44rpx;
+$u-steps-item-dot-width: 20rpx;
+
+.u-steps {
+	display: flex;
+	flex-direction: column;
+	
+	.u-steps__item {
+		flex: 1;
+		text-align: center;
+		position: relative;
+		min-width: 100rpx;
+		font-size: 26rpx;
+		color: #8799a3;
+		display: flex;
+		justify-content: center;
+		flex-direction: column;
+		
+		&--row {
+			@include vue-flex;
+			flex-direction: column;
+			
+			.u-steps__item__line {
+				position: absolute;
+				z-index: 0;
+				left: 75%;
+				width: 50%;
+				
+				&--dot {
+					top: calc(#{$u-steps-item-dot-width} / 2);
+				}
+			}
+		}
+		
+		&--column {
+			@include vue-flex;
+			flex-direction: row;
+			justify-content: flex-start;
+			min-height: 120rpx;
+			
+			.u-steps__item__line {
+				position: absolute;
+				z-index: 0;
+				height: 90%;
+				top: 15%;
+				left: 10rpx;
+				&--dot {
+					left: calc(#{$u-steps-item-dot-width} / 2);
+				}
+				
+				&--number {
+					left: calc(#{$u-steps-item-number-width} / 2);
+				}
+			}
+		}
+	
+		&__dot {
+			width: $u-steps-item-dot-width;
+			height: $u-steps-item-dot-width;
+			@include vue-flex;
+			border-radius: 50%;
+			background-color: #2a82e4;
+			margin-top: 10rpx;
+		}
+		
+		&__text--row {
+			margin-top: 14rpx;
+		}
+		
+		&__text--column {
+			margin-left: 14rpx;
+		}
+	}
+	&-content {
+		text-align: left;
+		margin-left: 40rpx;
+		margin-bottom: 60rpx;
+		view {
+			font-size: 28rpx;
+			line-height: 40rpx;
+			&:first-child {
+				color: #666666;
+				font-size: 32rpx;
+				font-weight: bold;
+				margin-bottom: 10rpx;
+			}
+			text {
+				color: #ff5733;
+			}
+		}
+	}
+}

+ 192 - 0
h5_web/pages/myResume/myResume.vue

@@ -0,0 +1,192 @@
+<!-- 我的简历 -->
+<template>
+	<view class="resume">
+
+		<!-- ================================ 头像部分 ================================ -->
+		<view class="resume-head" @click="jumpPage('/pages/dynamicTracking/dynamicTracking')">
+			<view class="resume-head-left">
+				<u-avatar :src="userInfo.avatar" mode="circle" size="160" />
+			</view>
+			<view class="resume-head-right">
+				<view>{{ userInfo.nickName }}</view>
+				<view>{{ userInfo.sex }}</view>
+				<view>
+					<text>{{ userInfo.company ? '入职中' : '未入职' }}</text>
+					{{ `(${ userInfo.company })` }}
+				</view>
+			</view>
+		</view>
+
+		<!-- ================================ 基本信息部分 ================================ -->
+		<view class="resume-base-info">
+			<view class="title">基本信息</view>
+			<view class="resume-base-info-item">退役军人 / 36岁 / 群众 / 本科
+			</view>
+			<view class="resume-base-info-phone">
+				<text class="icon-phone-icon"></text> 17004240181
+			</view>
+		</view>
+
+		<!-- ================================ 求职意向部分 ================================ -->
+		<view class="resume-job-intention">
+			<view class="title">求职意向</view>
+			<view class="resume-job-intention-add" v-if="jobIntention">
+				<view class="rjia-item">暂未补充求职意向...</view>
+				<view class="rjia-item" @click="jumpPage('/pages/evaluationIntention/evaluationIntention', { tabCur: 0 })">立即补充</view>
+				<view class="rjia-item">(补充信息使求职方向更加精准,增加获得面试的机会)</view>
+			</view>
+			<view class="resume-job-intention-info" v-else>
+				<view class="rjii-box">
+					<view class="rjii-left">
+						<view>武装押运员,贵阳</view>
+						<view>银行 / 生物科学 / 精密仪器</view>
+					</view>
+					<view class="rjii-right">5000 ~ 8000元</view>
+				</view>
+				<view class="rjii-edit-btn">修改</view>
+			</view>
+		</view>
+
+		<!-- ================================ 自我评价部分 ================================ -->
+		<view class="resume-self-evaluation">
+			<view class="title">自我评价</view>
+			<view class="resume-self-evaluation-add" v-if="selfEvaluation">
+				<view class="rsea-item">暂未补充自我评价...</view>
+				<view class="rsea-item" @click="jumpPage('/pages/evaluationIntention/evaluationIntention', { tabCur: 1 })">立即补充</view>
+				<view class="rsea-item">(补充信息使企业第一时间了解你,增加获得面试的机会)</view>
+			</view>
+			<view class="resume-self-evaluation-info" v-else>
+				<view class="rsei-box">性格开朗,工作认真负责,细心,有很强的职责心和进取心,头脑灵活,不怕吃苦,理解潜力强,能够很好的处理同事的关系,具有强烈的团队合作精神,并能承担必须的工作压力。
+				</view>
+				<view class="rsei-edit-btn">修改</view>
+			</view>
+		</view>
+
+		<!-- ================================ 工作经历部分 ================================ -->
+		<view class="resume-work-experience">
+			<view class="title">工作经历</view>
+			<view class="resume-work-experience-steps" :class="isExpand ? 'height-auto' : 'height-110'">
+				<view class="u-steps">
+					<view class="u-steps__item u-steps__item--column" v-for="(item, index) in workExperice"
+						:key="index">
+						<view class="u-steps__item__dot"></view>
+						<view class="u-steps-content">
+							<view>{{ item.dateLine }}</view>
+							<view>{{ item.company }}</view>
+							<view>{{ item.position }}</view>
+							<view>获得企业评价:<text>{{ item.evaluate }}</text></view>
+						</view>
+						<view class="u-steps__item__line u-steps__item__line--column"
+							v-if="index < workExperice.length - 1">
+							<u-line direction="column" length="100%" :hair-line="false" color="#2a82e4" />
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="resume-work-experience-btn" @click="isExpand = !isExpand">
+				{{ isExpand ? '收起' : '展开全部' }}
+			</view>
+		</view>
+
+		<!-- ================================ 培训与教育经历部分 ================================ -->
+		<view class="resume-train-experience">
+			<view class="title">培训与教育经历</view>
+			<view class="resume-train-experience-steps" :class="isTrainExpand ? 'height-auto' : 'height-110'">
+				<view class="u-steps">
+					<view class="u-steps__item u-steps__item--column" v-for="(item, index) in trainExperice"
+						:key="index">
+						<view class="u-steps__item__dot"></view>
+						<view class="u-steps-content">
+							<view>{{ item.dateLine }}</view>
+							<view>{{ item.classes }}</view>
+							<view>{{ item.school }}</view>
+							<view>{{ item.content }}</view>
+							<view>获得企业评价:<text>{{ item.evaluate }}</text></view>
+						</view>
+						<view class="u-steps__item__line u-steps__item__line--column"
+							v-if="index < trainExperice.length - 1">
+							<u-line direction="column" length="100%" :hair-line="false" color="#2a82e4" />
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="resume-train-experience-btn" @click="isTrainExpand = !isTrainExpand">
+				{{ isTrainExpand ? '收起' : '展开全部' }}
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				userInfo: {
+					avatar: require('@/static/img/avatar.jpg'),
+					nickName: '郝爱国',
+					company: '贵州威振押运有限公司',
+					sex: '男'
+				},
+				// 求职意向
+				jobIntention: true,
+				// 自我评价
+				selfEvaluation: true,
+				// 工作经历
+				workExperice: [{
+						dateLine: '2020.3 ~ 至今',
+						company: '贵州威振押运有限公司',
+						position: '武装押运员',
+						evaluate: '优秀'
+					},
+					{
+						dateLine: '2018.5 ~ 2020.3',
+						company: '贵州威振押运有限公司',
+						position: '武装押运员',
+						evaluate: '优秀'
+					},
+					{
+						dateLine: '2015.11 ~ 2018.5',
+						company: '贵州威振押运有限公司',
+						position: '武装押运员',
+						evaluate: '优秀'
+					}
+				],
+				// 是否展开工作经历
+				isExpand: true,
+				// 培训与教育经历
+				trainExperice: [{
+						dateLine: '2020.3 ~ 2020.5',
+						classes: '武装押运服务课程',
+						school: '贵州特种服务职业技术学校',
+						content: '2020年3月9日毕业,成绩优秀,获得特种服务证书',
+						evaluate: '优秀'
+					},
+					{
+						dateLine: '2019.3 ~ 2020.2',
+						classes: '武装押运服务课程',
+						school: '贵州特种服务职业技术学校',
+						content: '2020年3月9日毕业,成绩优秀,获得特种服务证书',
+						evaluate: '优秀'
+					}
+				],
+				// 是否展开培训经历
+				isTrainExpand: true
+			}
+		},
+		methods: {
+			/**
+			 * 跳转到指定页
+			 */
+			jumpPage(url, params) {
+				this.$u.route({
+					url: url,
+					params: params
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import 'myResume.scss'
+</style>

+ 32 - 0
h5_web/pages/personalModify/personalModify.vue

@@ -0,0 +1,32 @@
+<!-- 个人资料修改 -->
+<template>
+	<view>
+		<u-cell-group>
+			<u-cell-item title="头像">
+				<u-upload slot="right-icon" :custom-btn="true" :before-upload="beforeUpload" :multiple="false" :show-upload-list="false">
+					<u-avatar slot="addBtn" :src="avatarUrl" mode="square" size="100"></u-avatar>
+				</u-upload>
+			</u-cell-item>
+		</u-cell-group>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				avatarUrl: require('@/static/img/avatar.jpg')
+			}
+		},
+		methods: {
+			beforeUpload(index, list) {
+				console.log(index)
+				console.log(list)
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

二進制
h5_web/static/icon-font/fonts/icomoon.eot


+ 17 - 0
h5_web/static/icon-font/fonts/icomoon.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe900;" glyph-name="resume-icon" d="M597.333 874.667h-341.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667c0-47.147 37.76-85.333 84.907-85.333h512.427c47.147 0 85.333 38.187 85.333 85.333v512l-256 256zM682.667 192h-341.333v85.333h341.333v-85.333zM682.667 362.667h-341.333v85.333h341.333v-85.333zM554.667 576v234.667l234.667-234.667h-234.667z" />
+<glyph unicode="&#xe901;" glyph-name="evaluate-icon" d="M554.667 576c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667c0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667zM384 320c-113.92 0-341.333-57.173-341.333-170.667v-85.333h682.667v85.333c0 113.493-227.413 170.667-341.333 170.667zM715.093 731.093l-71.893-72.107c35.84-50.56 35.84-115.413 0-165.973l71.893-72.107c86.187 86.613 86.187 216.533 0 310.187zM856.533 874.667l-69.547-69.547c118.187-129.067 118.187-322.347-0.213-458.027l69.76-69.76c166.4 165.76 166.4 424.747 0 597.333z" />
+<glyph unicode="&#xe902;" glyph-name="setting-icon" d="M829.013 406.4c1.707 13.653 2.987 27.52 2.987 41.6s-1.28 27.947-2.987 41.6l90.24 70.613c8.107 6.4 10.453 17.92 5.12 27.307l-85.333 147.84c-5.333 9.173-16.427 13.013-26.027 9.173l-106.24-42.88c-21.973 16.853-46.080 31.147-72.107 42.027l-16 113.067c-1.92 10.027-10.667 17.92-21.333 17.92h-170.667c-10.667 0-19.413-7.893-21.12-17.92l-16-113.067c-26.027-10.88-50.133-24.96-72.107-42.027l-106.24 42.88c-9.6 3.627-20.693 0-26.027-9.173l-85.333-147.84c-5.333-9.173-2.987-20.693 5.12-27.307l90.027-70.613c-1.707-13.653-2.987-27.52-2.987-41.6s1.28-27.947 2.987-41.6l-90.027-70.613c-8.107-6.4-10.453-17.92-5.12-27.307l85.333-147.84c5.333-9.173 16.427-13.013 26.027-9.173l106.24 42.88c21.973-16.853 46.080-31.147 72.107-42.027l16-113.067c1.707-10.027 10.453-17.92 21.12-17.92h170.667c10.667 0 19.413 7.893 21.12 17.92l16 113.067c26.027 10.88 50.133 24.96 72.107 42.027l106.24-42.88c9.6-3.627 20.693 0 26.027 9.173l85.333 147.84c5.333 9.173 2.987 20.693-5.12 27.307l-90.027 70.613zM512 298.667c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333z" />
+<glyph unicode="&#xe903;" glyph-name="delivery-icon" d="M810.667 789.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v426.667h597.333v-426.667h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 533.333l-170.667-170.667h128v-256h85.333v256h128l-170.667 170.667z" />
+<glyph unicode="&#xe904;" glyph-name="interview-icon" d="M810.667 874.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h170.667l128-128 128 128h170.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 733.867c63.573 0 115.2-51.627 115.2-115.2s-51.627-115.2-115.2-115.2c-63.573 0-115.2 51.627-115.2 115.2s51.627 115.2 115.2 115.2zM768 277.333h-512v38.4c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-38.4z" />
+<glyph unicode="&#xe905;" glyph-name="train-icon" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM692.48 192l-180.48 108.8-180.48-108.8 47.787 205.227-159.147 138.027 209.92 17.92 81.92 193.493 81.92-193.493 209.92-17.92-159.147-138.027 47.787-205.227z" />
+<glyph unicode="&#xe906;" glyph-name="phone-icon" horiz-adv-x="1281" d="M827.030 917.333h-426.854c-73.632 0-133.392-47.787-133.392-106.667v-725.333c0-58.88 59.76-106.667 133.392-106.667h426.854c73.632 0 133.392 47.787 133.392 106.667v725.333c0 58.88-59.76 106.667-133.392 106.667zM613.603 21.333c-44.286 0-80.035 28.587-80.035 64s35.749 64 80.035 64 80.035-28.587 80.035-64-35.749-64-80.035-64zM853.708 192h-480.211v597.333h480.211v-597.333z" />
+</font></defs></svg>

二進制
h5_web/static/icon-font/fonts/icomoon.ttf


二進制
h5_web/static/icon-font/fonts/icomoon.woff


+ 55 - 0
h5_web/static/icon-font/style.css

@@ -0,0 +1,55 @@
+@font-face {
+  font-family: 'icomoon';
+  src:  url('fonts/icomoon.eot?efg8bq');
+  src:  url('fonts/icomoon.eot?efg8bq#iefix') format('embedded-opentype'),
+    url('fonts/icomoon.ttf?efg8bq') format('truetype'),
+    url('fonts/icomoon.woff?efg8bq') format('woff'),
+    url('fonts/icomoon.svg?efg8bq#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+  font-display: block;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon' !important;
+  speak: never;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-phone-icon:before {
+  content: "\e906";
+  color: #999;
+}
+.icon-resume-icon:before {
+  content: "\e900";
+  color: #808080;
+}
+.icon-evaluate-icon:before {
+  content: "\e901";
+  color: #808080;
+}
+.icon-setting-icon:before {
+  content: "\e902";
+  color: #808080;
+}
+.icon-delivery-icon:before {
+  content: "\e903";
+  color: #808080;
+}
+.icon-interview-icon:before {
+  content: "\e904";
+  color: #808080;
+}
+.icon-train-icon:before {
+  content: "\e905";
+  color: #808080;
+}

二進制
h5_web/static/img/avatar.jpg


+ 1 - 1
h5_web/uni.scss

@@ -3,4 +3,4 @@
  * 使用的时候,请将下面的一行复制到您的uniapp项目根目录的uni.scss中即可
  * uView自定义的css类名和scss变量,均以"u-"开头,不会造成冲突,请放心使用 
  */
-@import 'uview-ui/theme.scss';
+@import 'uview-ui/theme.scss';

+ 15 - 0
h5_web/uni_modules/z-paging/changelog.md

@@ -0,0 +1,15 @@
+## 2.0.8(2021-10-14)
+1.修复`ReferenceError: getPrivateLanguage is not defined`报错的问题  
+2.修复在nvue中使用聊天记录模式时,手动调用`scrollToTop`或`scrollToBottom`时递归调用的问题。  
+3.修复使用`u-grid`时,内部item元素过多时。`z-paging`自定义的下拉刷新view与默认下拉刷新view同时展示的问题。
+## 2.0.7(2021-10-08)
+1.修复在一些平台中,底部加载更多会被遮挡的问题。  
+2.修复在nvue中`safe-area-inset-bottom`为true时,可能出现的顶部异常偏移的问题。  
+3.修复在HbuilderX 3.2.8+中,下拉刷新时@onRefresh被触发多次的问题。  
+4.修复在iOS中滚动到顶部view,在某些情况下因bounce的影响闪一下又消失的问题。  
+5.修复在使用页面滚动时,滚动到顶部view未能正常显示的问题。  
+6.修复在nvue中,使用聊天记录模式,数据未满一页时,数组被颠倒的问题。  
+7.修复在nvue中,使用页面滚动时,`scrollToTop`无效的问题。  
+8.修复在nvue中,使用聊天记录模式时,`scrollToBottom`和`scrollToTop`效果颠倒的问题。  
+9.修复在安卓 nvue中,导航栏与z-paging间出现的白色分割线的问题。  
+10.修复在HbuilderX 3.2.9+中,vue下拉刷新加载中时有一段空白间隙的问题。

+ 186 - 0
h5_web/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue

@@ -0,0 +1,186 @@
+<!-- z-paging -->
+<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
+<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
+<!-- 反馈QQ群:790460711 -->
+
+<!-- 空数据占位view,此组件支持easycom规范,可以在项目中直接引用 -->
+<template>
+	<view :class="{'zp-container':true,'zp-container-fixed':emptyViewFixed}" :style="[finalEmptyViewStyle]">
+		<view :class="{'zp-main':true,'zp-main-fixed':emptyViewFixed}">
+			<image v-if="!emptyViewImg.length" class="zp-main-image" :style="[emptyViewImgStyle]" :src="emptyImg"></image>
+			<image v-else class="zp-main-image" mode="aspectFit" :style="[emptyViewImgStyle]" :src="emptyViewImg"></image>
+			<text class="zp-main-title" :style="[emptyViewTitleStyle]">{{emptyViewText}}</text>
+			<text v-if="showEmptyViewReload" class="zp-main-error-btn" :style="[emptyViewReloadStyle]"
+				@click="reloadClick">{{emptyViewReloadText}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import zStatic from '../z-paging/js/z-paging-static'
+	export default {
+		data() {
+			return {
+				base64Empty: zStatic.base64Empty,
+				base64Error: zStatic.base64Error
+			};
+		},
+		props: {
+			//空数据描述文字
+			emptyViewText: {
+				type: String,
+				default: function() {
+					return '没有数据哦~'
+				}
+			},
+			//空数据图片
+			emptyViewImg: {
+				type: String,
+				default: function() {
+					return ''
+				}
+			},
+			//是否显示空数据图重新加载按钮
+			showEmptyViewReload: {
+				type: Boolean,
+				default: function() {
+					return false
+				}
+			},
+			//空数据点击重新加载文字
+			emptyViewReloadText: {
+				type: String,
+				default: function() {
+					return '重新加载'
+				}
+			},
+			//是否是加载失败
+			isLoadFailed: {
+				type: Boolean,
+				default: function() {
+					return false
+				}
+			},
+			//空数据图样式
+			emptyViewStyle: {
+				type: Object,
+				default: function() {
+					return {}
+				}
+			},
+			//空数据图img样式
+			emptyViewImgStyle: {
+				type: Object,
+				default: function() {
+					return {}
+				}
+			},
+			//空数据图描述文字样式
+			emptyViewTitleStyle: {
+				type: Object,
+				default: function() {
+					return {}
+				}
+			},
+			//空数据图重新加载按钮样式
+			emptyViewReloadStyle: {
+				type: Object,
+				default: function() {
+					return {}
+				}
+			},
+			//空数据图z-index
+			emptyViewZIndex: {
+				type: Number,
+				default: function() {
+					return 9
+				}
+			},
+			//空数据图片是否使用fixed布局并铺满z-paging
+			emptyViewFixed: {
+				type: Boolean,
+				default: function() {
+					return true
+				}
+			}
+		},
+		computed: {
+			emptyImg() {
+				if (this.isLoadFailed) {
+					return this.base64Error;
+				} else {
+					return this.base64Empty;
+				}
+			},
+			finalEmptyViewStyle(){
+				this.emptyViewStyle['z-index'] = this.emptyViewZIndex;
+				return this.emptyViewStyle;
+			}
+		},
+		methods: {
+			reloadClick() {
+				this.$emit('reload');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.zp-container{
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+	}
+	.zp-container-fixed {
+		/* #ifndef APP-NVUE */
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+	}
+
+	.zp-main{
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		align-items: center;
+	}
+	
+	.zp-main-fixed {
+		/* #ifndef APP-NVUE */
+		margin-top: -150rpx;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		margin-top: -100rpx;
+		/* #endif */
+	}
+
+	.zp-main-image {
+		width: 200rpx;
+		height: 200rpx;
+	}
+
+	.zp-main-title {
+		font-size: 26rpx;
+		color: #aaaaaa;
+		text-align: center;
+		margin-top: 10rpx;
+	}
+
+	.zp-main-error-btn {
+		font-size: 26rpx;
+		padding: 8rpx 24rpx;
+		border: solid 1px #dddddd;
+		border-radius: 6rpx;
+		color: #aaaaaa;
+		margin-top: 50rpx;
+	}
+</style>

+ 88 - 0
h5_web/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue

@@ -0,0 +1,88 @@
+<!-- z-paging -->
+<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
+<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
+<!-- 反馈QQ群:790460711 -->
+
+<!-- 滑动切换选项卡swiper-item,此组件支持easycom规范,可以在项目中直接引用 -->
+<template>
+	<view class="zp-swiper-item-container">
+		<z-paging ref="paging" :fixed="false" @query="_queryList" @listChange="_updateList" :mounted-auto-call-reload="false"
+			style="height: 100%;">
+			<slot></slot>
+		</z-paging>
+	</view>
+</template>
+
+<script>
+	import zPaging from '../z-paging/z-paging'
+	export default {
+		name: "z-paging-swiper-item",
+		components: {
+			zPaging
+		},
+		data() {
+			return {
+				firstLoaded: false
+			}
+		},
+		props: {
+			//当前组件的index,也就是当前组件是swiper中的第几个
+			tabIndex: {
+				type: Number,
+				default: function() {
+					return 0
+				}
+			},
+			//当前swiper切换到第几个index
+			currentIndex: {
+				type: Number,
+				default: function() {
+					return 0
+				}
+			},
+		},
+		watch: {
+			currentIndex: {
+				handler(newVal, oldVal) {
+					if (newVal === this.tabIndex) {
+						//懒加载,当滑动到当前的item时,才去加载
+						if (!this.firstLoaded) {
+							this.$nextTick(()=>{
+								setTimeout(() => {
+									this.$refs.paging.reload();
+								}, 5);
+							})
+						}
+					}
+				},
+				immediate: true
+			}
+		},
+		methods: {
+			reload(data) {
+				this.$refs.paging.reload(data);
+			},
+			complete(data) {
+				this.firstLoaded = true;
+				this.$refs.paging.complete(data);
+			},
+			_queryList(pageNo, pageSize) {
+				this.$emit('query', pageNo, pageSize);
+			},
+			_updateList(list) {
+				this.$emit('updateList', list);
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.zp-swiper-item-container {
+		/* #ifndef APP-NVUE */
+		height: 100%;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+	}
+</style>

+ 126 - 0
h5_web/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue

@@ -0,0 +1,126 @@
+<!-- z-paging -->
+<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
+<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
+<!-- 反馈QQ群:790460711 -->
+
+<!-- 滑动切换选项卡swiper,此组件支持easycom规范,可以在项目中直接引用 -->
+<template>
+	<view :class="fixed?'zp-swiper-container zp-swiper-container-fixed':'zp-swiper-container'" :style="[swiperStyle]">
+		<slot v-if="$slots.top" name="top"></slot>
+		<view class="zp-swiper-super">
+			<view class="zp-swiper">
+				<slot/></slot>
+			</view>
+		</view>
+		<slot v-if="$slots.bottom" name="bottom"></slot>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "z-paging-swiper",
+		data() {
+			return {
+				systemInfo: null
+			};
+		},
+		props: {
+			//是否使用fixed布局,默认为是
+			fixed: {
+				type: Boolean,
+				default: true
+			},
+			//是否开启底部安全区域适配
+			safeAreaInsetBottom: {
+				type: Boolean,
+				default: false
+			}
+		},
+		mounted() {
+			this.$nextTick(() => {
+				this.systemInfo = uni.getSystemInfoSync();
+			})
+		},
+		computed: {
+			swiperStyle() {
+				if (!this.systemInfo) {
+					return {};
+				}
+				let swiperStyle = {};
+				const windowTop = this.systemInfo.windowTop;
+				const windowBottom = this.systemInfo.windowBottom;
+				if (this.fixed) {
+					if (windowTop && windowTop !== undefined) {
+						swiperStyle.top = windowTop + 'px';
+					}
+					let bottom = 0;
+					if (windowBottom && windowBottom !== undefined) {
+						bottom = windowBottom;
+					}
+					if (this.safeAreaInsetBottom) {
+						bottom += this.safeAreaBottom;
+					}
+					swiperStyle.bottom = bottom + 'px';
+				}
+				return swiperStyle;
+			},
+			safeAreaBottom() {
+				if (!this.systemInfo) {
+					return 0;
+				}
+				let safeAreaBottom = 0;
+				// #ifdef MP-WEIXIN
+				safeAreaBottom = this.systemInfo.screenHeight - this.systemInfo.safeArea.bottom;
+				// #endif
+				// #ifdef APP-PLUS || H5
+				safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;
+				// #endif
+				return Math.abs(safeAreaBottom);
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.zp-swiper-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		flex: 1;
+	}
+
+	.zp-swiper-container-fixed {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		height: auto;
+		width: auto;
+		/* #endif */
+		top: 0;
+		left: 0;
+		bottom: 0;
+		right: 0;
+	}
+
+	.zp-swiper-super {
+		flex: 1;
+		position: relative;
+	}
+
+	.zp-swiper {
+		/* #ifndef APP-NVUE */
+		height: 100%;
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+	}
+	
+	.zp-swiper-item {
+		height: 100%;
+	}
+</style>

+ 157 - 0
h5_web/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue

@@ -0,0 +1,157 @@
+<!-- [z-paging]上拉加载更多view -->
+
+<template>
+	<view class="zp-l-container" :style="[zConfig.customStyle]">
+		<text
+			:class="zConfig.defaultThemeStyle==='white'?'zp-l-line zp-l-line-white':'zp-l-line zp-l-line-black'"
+			:style="[zConfig.noMoreLineCustomStyle]"
+			v-if="zConfig.showNoMoreLine&&zConfig.status===2"></text>
+		<!-- #ifndef APP-NVUE -->
+		<image v-if="zConfig.status===1&&zConfig.loadingIconCustomImage.length"
+			:src="zConfig.loadingIconCustomImage" :class="{'zp-l-line-loading-custom-image':true,'zp-l-line-loading-custom-image-animated':zConfig.loadingAnimated}">
+		</image>
+		<image
+			v-if="zConfig.status===1&&zConfig.loadingIconType==='flower'&&!zConfig.loadingIconCustomImage.length"
+			class="zp-line-loading-image" :style="[zConfig.iconCustomStyle]"
+			:src="zConfig.defaultThemeStyle==='white'?base64FlowerWhite:base64Flower">
+		</image>
+		<!-- #endif -->
+		<!-- #ifdef APP-NVUE -->
+		<view>
+			<loading-indicator v-if="zConfig.status===1"
+				:style="[{color:zConfig.defaultThemeStyle==='white'?'white':'#777777'}]" :animating="true"
+				class="zp-line-loading-image">
+			</loading-indicator>
+		</view>
+		<!-- #endif -->
+		<text
+			v-if="zConfig.status===1&&zConfig.loadingIconType==='circle'&&!zConfig.loadingIconCustomImage.length"
+			:class="zConfig.defaultThemeStyle==='white'?'zp-l-line-loading-view zp-l-line-loading-view-white':'zp-l-line-loading-view zp-l-line-loading-view-black'"
+			:style="[zConfig.iconCustomStyle]"></text>
+		<text
+			:class="zConfig.defaultThemeStyle==='white'?'zp-l-text zp-l-text-white':'zp-l-text zp-l-text-black'">{{ownLoadingMoreText}}</text>
+		<text
+			:class="zConfig.defaultThemeStyle==='white'?'zp-l-line zp-l-line-white':'zp-l-line zp-l-line-black'"
+			:style="[zConfig.noMoreLineCustomStyle]"
+			v-if="zConfig.showNoMoreLine&&zConfig.status===2"></text>
+	</view>
+</template>
+<script>
+	import zStatic from '../js/z-paging-static'
+	export default {
+		name: 'z-paging-load-more',
+		data() {
+			return {
+				base64Arrow: zStatic.base64Arrow,
+				base64Flower: zStatic.base64Flower,
+				base64FlowerWhite: zStatic.base64FlowerWhite,
+			};
+		},
+		props: ['zConfig'],
+		computed: {
+			ownLoadingMoreText() {
+				const loadingMoreText = this.loadingStatusTextMap[this.zConfig.status];
+				return loadingMoreText;
+			},
+			loadingStatusTextMap() {
+				return {
+					0: this.zConfig.defaultText,
+					1: this.zConfig.loadingText,
+					2: this.zConfig.noMoreText,
+					3: this.zConfig.failText,
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	@import "../css/z-paging-static.css";
+
+	.zp-l-container {
+		height: 80rpx;
+		font-size: 27rpx;
+		/* #ifndef APP-NVUE */
+		clear: both;
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.zp-l-line-loading-custom-image {
+		color: #a4a4a4;
+		margin-right: 8rpx;
+		width: 28rpx;
+		height: 28rpx;
+	}
+	
+	.zp-l-line-loading-custom-image-animated{
+		/* #ifndef APP-NVUE */
+		animation: loading-circle 1s linear infinite;
+		/* #endif */
+	}
+
+	.zp-l-line-loading-view {
+		margin-right: 8rpx;
+		width: 22rpx;
+		height: 23rpx;
+		border: 3rpx solid #dddddd;
+		border-radius: 50%;
+		/* #ifndef APP-NVUE */
+		animation: loading-circle 1s linear infinite;
+		/* #endif */
+	}
+
+	.zp-l-line-loading-view-black {
+		border-color: #c8c8c8;
+		border-top-color: #444444;
+	}
+
+	.zp-l-line-loading-view-white {
+		border-color: #aaaaaa;
+		border-top-color: #ffffff;
+	}
+
+	.zp-l-text {
+		/* #ifdef APP-NVUE */
+		font-size: 30rpx;
+		margin: 0rpx 10rpx;
+		/* #endif */
+	}
+
+	.zp-l-text-black {
+		color: #a4a4a4;
+	}
+
+	.zp-l-text-white {
+		color: #efefef;
+	}
+
+	.zp-l-line {
+		height: 1px;
+		width: 100rpx;
+		margin: 0rpx 10rpx;
+	}
+
+	.zp-l-line-black {
+		background-color: #eeeeee;
+	}
+
+	.zp-l-line-white {
+		background-color: #efefef;
+	}
+
+	@keyframes loading-circle {
+		0% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		100% {
+			-webkit-transform: rotate(360deg);
+			transform: rotate(360deg);
+		}
+	}
+</style>

+ 284 - 0
h5_web/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue

@@ -0,0 +1,284 @@
+<!-- [z-paging]下拉刷新view -->
+
+<template>
+	<view style="height: 100%;">
+		<view
+			:class="['zp-r-container',{'zp-r-container-padding':showUpdateTime}]" style="height: 100%;">
+			<view class="zp-r-left">
+				<image v-if="status!==2" :class="refresherLeftImageClass"
+					:style="[{width: showUpdateTime?'36rpx':'30rpx',height: showUpdateTime?'36rpx':'30rpx','margin-right': showUpdateTime?'20rpx':'9rpx'},imgStyle]"
+					:src="defaultThemeStyle==='white'?(status===3?base64SuccessWhite:base64ArrowWhite):(status===3?base64Success:base64Arrow)">
+				</image>
+				<!-- #ifndef APP-NVUE -->
+				<image v-else class="zp-line-loading-image zp-r-left-image"
+					:style="[{width: showUpdateTime?'36rpx':'30rpx',height: showUpdateTime?'36rpx':'30rpx','margin-right': showUpdateTime?'20rpx':'9rpx'},imgStyle]"
+					:src="defaultThemeStyle==='white'?base64FlowerWhite:base64Flower">
+				</image>
+				<!-- #endif -->
+				<!-- #ifdef APP-NVUE -->
+				<view v-else :style="[{'margin-right':showUpdateTime?'18rpx':'12rpx'}]">
+					<loading-indicator
+						:class="systemInfo.platform==='ios'?'zp-loading-image-ios':'zp-loading-image-android'"
+						:style="[{color:defaultThemeStyle==='white'?'white':'#777777'},imgStyle]" :animating="true">
+					</loading-indicator>
+				</view>
+				<!-- #endif -->
+			</view>
+			<view class="zp-r-right">
+				<text class="zp-r-right-text"
+					:style="[refresherRightTextStyle,titleStyle]">{{refresherStatusTextMap[status]||defaultText}}
+				</text>
+				<text class="zp-r-right-text zp-r-right-time-text"
+					:style="[refresherRightTextStyle,updateTimeStyle]"
+					v-if="showUpdateTime&&refresherTimeText.length">{{refresherTimeText}}
+				</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	const systemInfo = uni.getSystemInfoSync();
+	import zStatic from '../js/z-paging-static'
+	import {
+		getRefesrherFormatTimeByKey
+	} from '../js/z-paging-utils'
+	export default {
+		name: 'z-paging-refresh',
+		data() {
+			return {
+				systemInfo: systemInfo,
+				base64Arrow: zStatic.base64Arrow,
+				base64ArrowWhite: zStatic.base64ArrowWhite,
+				base64Flower: zStatic.base64Flower,
+				base64FlowerWhite: zStatic.base64FlowerWhite,
+				base64Success: zStatic.base64Success,
+				base64SuccessWhite: zStatic.base64SuccessWhite,
+				refresherTimeText: '',
+				leftImageLoaded: false
+			};
+		},
+		props: {
+			'status': {
+				default: 0
+			},
+			'defaultThemeStyle': {},
+			'defaultText': {},
+			'pullingText': {},
+			'refreshingText': {},
+			'completeText': {},
+			'showUpdateTime': {
+				default: false
+			},
+			'updateTimeKey': {},
+			'imgStyle': {
+				default: {}
+			},
+			'titleStyle': {
+				default: {}
+			},
+			'updateTimeStyle': {
+				default: {}
+			},
+		},
+		computed: {
+			refresherStatusTextMap() {
+				this.updateTime(this.updateTimeKey);
+				return {
+					0: this.defaultText,
+					1: this.pullingText,
+					2: this.refreshingText,
+					3: this.completeText
+				};
+			},
+			refresherLeftImageClass() {
+				if(this.status === 3){
+					return 'zp-r-left-image-no-transform .zp-r-left-image-pre-size';
+				}
+				let refresherLeftImageClass = 'zp-r-left-image ';
+				if (this.status === 0) {
+					if (this.leftImageLoaded) {
+						refresherLeftImageClass += 'zp-r-arrow-down';
+					} else {
+						this.leftImageLoaded = true;
+						refresherLeftImageClass += 'zp-r-arrow-down-no-duration';
+					}
+				} else {
+					refresherLeftImageClass += 'zp-r-arrow-top';
+				}
+				return refresherLeftImageClass + ' zp-r-left-image-pre-size';
+			},
+			refresherRightTextStyle() {
+				let refresherRightTextStyle = {};
+				let color = '#555555';
+				if (this.defaultThemeStyle === 'white') {
+					color = '#efefef';
+				}
+				// #ifdef APP-NVUE
+				if (this.showUpdateTime) {
+					refresherRightTextStyle = {
+						'height': '40rpx',
+						'line-height': '40rpx'
+					};
+				} else {
+					refresherRightTextStyle = {
+						'height': '80rpx',
+						'line-height': '80rpx'
+					};
+				}
+				// #endif
+				refresherRightTextStyle['color'] = color;
+				return refresherRightTextStyle;
+			}
+		},
+		methods: {
+			updateTime(updateTimeKey) {
+				if (!updateTimeKey) {
+					updateTimeKey = this.updateTimeKey;
+				}
+				if (this.showUpdateTime) {
+					this.refresherTimeText = getRefesrherFormatTimeByKey(updateTimeKey);
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	@import "../css/z-paging-static.css";
+
+	.zp-r-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.zp-r-container-padding {
+		/* #ifdef APP-NVUE */
+		padding: 15rpx 0rpx;
+		/* #endif */
+	}
+
+	.zp-r-left {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		overflow: hidden;
+	}
+
+	.zp-r-left-image {
+		/* #ifndef APP-NVUE */
+		transform: rotate(180deg);
+		margin-top: 2rpx;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		transition-duration: .2s;
+		transition-property: transform;
+		color: #666666;
+		/* #endif */
+	}
+	
+	.zp-r-left-image-no-transform {
+		/* #ifndef APP-NVUE */
+		margin-top: 2rpx;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		transition-duration: .2s;
+		transition-property: transform;
+		color: #666666;
+		/* #endif */
+	}
+	
+	.zp-r-left-image-pre-size{
+		/* #ifndef APP-NVUE */
+		width: 30rpx;
+		width: 30rpx;
+		overflow: hidden;
+		/* #endif */
+	}
+
+	.zp-r-arrow-top {
+		/* #ifndef APP-NVUE */
+		animation: refresher-arrow-top .2s linear;
+		-webkit-animation: refresher-arrow-top .2s linear;
+		animation-fill-mode: forwards;
+		-webkit-animation-fill-mode: forwards;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		transform: rotate(0deg);
+		/* #endif */
+	}
+
+	.zp-r-arrow-down {
+		/* #ifndef APP-NVUE */
+		animation: refresher-arrow-down .2s linear;
+		-webkit-animation: refresher-arrow-down .2s linear;
+		animation-fill-mode: forwards;
+		-webkit-animation-fill-mode: forwards;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		transform: rotate(180deg);
+		/* #endif */
+	}
+
+	.zp-r-arrow-down-no-duration {
+		/* #ifndef APP-NVUE */
+		animation: refresher-arrow-down 0s linear;
+		-webkit-animation: refresher-arrow-down 0s linear;
+		animation-fill-mode: forwards;
+		-webkit-animation-fill-mode: forwards;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		transform: rotate(180deg);
+		/* #endif */
+	}
+
+	.zp-r-right {
+		font-size: 27rpx;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.zp-r-right-text {
+		/* #ifdef APP-NVUE */
+		font-size: 28rpx;
+		/* #endif */
+	}
+
+	.zp-r-right-time-text {
+		margin-top: 10rpx;
+		font-size: 24rpx;
+	}
+
+	@keyframes refresher-arrow-top {
+		0% {
+			-webkit-transform: rotate(180deg);
+			transform: rotate(180deg);
+		}
+
+		100% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+	}
+
+	@keyframes refresher-arrow-down {
+		0% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		100% {
+			-webkit-transform: rotate(180deg);
+			transform: rotate(180deg);
+		}
+	}
+</style>

+ 1 - 0
h5_web/uni_modules/z-paging/components/z-paging/config/index.js

@@ -0,0 +1 @@
+// z-paging全局配置文件,注意避免更新时此文件被覆盖,若被覆盖,可在此文件中右键->点击本地历史记录,找回覆盖前的配置

+ 181 - 0
h5_web/uni_modules/z-paging/components/z-paging/css/z-paging-main.css

@@ -0,0 +1,181 @@
+/* [z-paging]公共css*/
+
+.z-paging-content {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	width: 100%;
+	height: 100%;
+	/* #endif */
+	flex-direction: column;
+}
+
+.z-paging-content-fixed {
+	position: fixed;
+	/* #ifndef APP-NVUE */
+	height: auto;
+	width: auto;
+	/* #endif */
+	top: 0;
+	left: 0;
+	bottom: 0;
+	right: 0;
+}
+
+.zp-page-scroll-top,
+.zp-page-scroll-bottom {
+	/* #ifndef APP-NVUE */
+	width: auto;
+	/* #endif */
+	position: fixed;
+	left: 0;
+	right: 0;
+	z-index: 999;
+}
+
+.zp-scroll-view-super {
+	flex: 1;
+	position: relative;
+}
+
+.zp-custom-refresher-container {
+	overflow: hidden;
+}
+
+.zp-scroll-view {
+	height: 100%;
+	width: 100%;
+}
+
+.zp-scroll-view-absolute {
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+
+/* #ifndef APP-NVUE */
+.zp-scroll-view-hide-scrollbar ::-webkit-scrollbar {
+	display: none;
+	-webkit-appearance: none;
+	width: 0 !important;
+	height: 0 !important;
+	background: transparent;
+}
+
+/* #endif */
+
+.zp-paging-touch-view {
+	width: 100%;
+	height: 100%;
+	position: relative;
+}
+
+.zp-fixed-bac-view {
+	position: absolute;
+	width: 100%;
+	top: 0;
+	left: 0;
+	height: 200px;
+}
+
+.zp-paging-main {
+	height: 100%;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+}
+
+.zp-paging-container {
+	flex: 1;
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+}
+
+.zp-chat-record-loading-container {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	width: 100%;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	width: 750rpx;
+	/* #endif */
+	align-items: center;
+	justify-content: center;
+	height: 60rpx;
+	font-size: 26rpx;
+}
+
+.zp-chat-record-loading-custom-image {
+	width: 35rpx;
+	height: 35rpx;
+	/* #ifndef APP-NVUE */
+	animation: loading-flower 1s linear infinite;
+	/* #endif */
+}
+
+.zp-custom-refresher-container {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+.zp-back-to-top {
+	width: 76rpx;
+	height: 76rpx;
+	z-index: 999;
+	position: absolute;
+	bottom: 0rpx;
+	right: 25rpx;
+	transition-duration: .3s;
+	transition-property: opacity;
+}
+
+.zp-back-to-top-show {
+	opacity: 1;
+}
+
+.zp-back-to-top-hide {
+	opacity: 0;
+}
+
+.zp-back-to-top-img {
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	height: 100%;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	flex: 1;
+	/* #endif */
+	z-index: 999;
+}
+
+.zp-empty-view {
+	/* #ifdef APP-NVUE */
+	height: 100%;
+	/* #endif */
+	flex: 1;
+}
+
+.zp-empty-view-center {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+
+.zp-n-refresh-container {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: center;
+	width: 750rpx;
+}

+ 33 - 0
h5_web/uni_modules/z-paging/components/z-paging/css/z-paging-static.css

@@ -0,0 +1,33 @@
+/* [z-paging]公用的静态css资源 */
+
+.zp-line-loading-image {
+	margin-right: 8rpx;
+	width: 28rpx;
+	height: 28rpx;
+	/* #ifndef APP-NVUE */
+	animation: loading-flower 1s steps(12) infinite;
+	/* #endif */
+	color: #666666;
+}
+
+.zp-loading-image-ios{
+	width: 20px;
+	height: 20px;
+}
+
+.zp-loading-image-android{
+	width: 32rpx;
+	height: 32rpx;
+}
+
+@keyframes loading-flower {
+	0% {
+		-webkit-transform: rotate(0deg);
+		transform: rotate(0deg);
+	}
+
+	to {
+		-webkit-transform: rotate(1turn);
+		transform: rotate(1turn);
+	}
+}

+ 28 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-config.js

@@ -0,0 +1,28 @@
+// [z-paging]处理main.js中的配置信息工具
+
+let config = null;
+let getedStorage = false;
+const storageKey = 'Z-PAGING-CONFIG-STORAGE-KEY'
+
+function setConfig(value) {
+	try {
+		uni.setStorageSync(storageKey, value);
+	} catch {}
+}
+
+function getConfig() {
+	try {
+		if (getedStorage) {
+			return config;
+		}
+		config = uni.getStorageSync(storageKey);
+		getedStorage = true;
+	} catch {
+		return null;
+	}
+}
+
+module.exports = {
+	setConfig,
+	getConfig
+};

+ 25 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js

@@ -0,0 +1,25 @@
+// [z-paging]枚举
+
+const Enum = {
+	//当前加载类型 0-下拉刷新 1-上拉加载更多
+	LoadingType: {
+		Refresher: 0,
+		LoadingMore: 1
+	},
+	//下拉刷新状态 0-默认状态 1.松手立即刷新 2.刷新中 3.刷新结束
+	RefresherStatus: {
+		Default: 0,
+		PullToRefresh: 1,
+		Loading: 2,
+		Complete: 3
+	},
+	//底部加载更多状态 0-默认状态 1.加载中 2.没有更多数据 3.加载失败
+	LoadingMoreStatus: {
+		Default: 0,
+		Loading: 1,
+		NoMore: 2,
+		Fail: 3
+	}
+}
+
+module.exports = Enum;

+ 153 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js

@@ -0,0 +1,153 @@
+// z-paging国际化(支持中文、中文繁体和英文)
+
+const i18nUpdateKey = 'z-paging-i18n-update';
+
+const refresherDefaultText = {
+	'en': 'Pull down to refresh',
+	'zh-cn': '继续下拉刷新',
+	'zh-hant-cn': '繼續下拉重繪',
+}
+const refresherPullingText = {
+	'en': 'Release to refresh',
+	'zh-cn': '松开立即刷新',
+	'zh-hant-cn': '鬆開立即重繪',
+}
+const refresherRefreshingText = {
+	'en': 'Refreshing...',
+	'zh-cn': '正在刷新...',
+	'zh-hant-cn': '正在重繪...',
+}
+const refresherCompleteText = {
+	'en': 'Refresh succeeded',
+	'zh-cn': '刷新成功',
+	'zh-hant-cn': '重繪成功',
+}
+
+const loadingMoreDefaultText = {
+	'en': 'Click to load more',
+	'zh-cn': '点击加载更多',
+	'zh-hant-cn': '點擊加載更多',
+}
+const loadingMoreLoadingText = {
+	'en': 'Loading...',
+	'zh-cn': '正在加载...',
+	'zh-hant-cn': '正在加載...',
+}
+const loadingMoreNoMoreText = {
+	'en': 'No more data',
+	'zh-cn': '没有更多了',
+	'zh-hant-cn': '沒有更多了',
+}
+const loadingMoreFailText = {
+	'en': 'Load failed,click to reload',
+	'zh-cn': '加载失败,点击重新加载',
+	'zh-hant-cn': '加載失敗,點擊重新加載',
+}
+
+const emptyViewText = {
+	'en': 'No data',
+	'zh-cn': '没有数据哦~',
+	'zh-hant-cn': '沒有數據哦~',
+}
+
+const emptyViewReloadText = {
+	'en': 'Reload',
+	'zh-cn': '重新加载',
+	'zh-hant-cn': '重新加載',
+}
+
+const emptyViewErrorText = {
+	'en': 'Sorry,load failed',
+	'zh-cn': '很抱歉,加载失败',
+	'zh-hant-cn': '很抱歉,加載失敗',
+}
+
+const refresherUpdateTimeText = {
+	'en': 'Last update: ',
+	'zh-cn': '最后更新:',
+	'zh-hant-cn': '最後更新:',
+}
+
+const refresherUpdateTimeNoneText = {
+	'en': 'None',
+	'zh-cn': '无',
+	'zh-hant-cn': '無',
+}
+
+const refresherUpdateTimeTodayText = {
+	'en': 'Today',
+	'zh-cn': '今天',
+	'zh-hant-cn': '今天',
+}
+
+const refresherUpdateTimeYesterdayText = {
+	'en': 'Yesterday',
+	'zh-cn': '昨天',
+	'zh-hant-cn': '昨天',
+}
+
+// 获取当前语言,格式为:zh-cn、zh-hant-cn、en。followSystemLanguage:获取的结果是否是在不跟随系统语言下获取到的
+function getLanguage(followSystemLanguage = true) {
+	return _getPrivateLanguage(false, followSystemLanguage);
+}
+
+// 获取当前语言,格式为:简体中文、繁體中文、English。followSystemLanguage:获取的结果是否是在不跟随系统语言下获取到的
+function getLanguageName(followSystemLanguage = true) {
+	const language = getLanguage(followSystemLanguage);
+	const languageNameMap = {
+		'zh-cn': '简体中文',
+		'zh-hant-cn': '繁體中文',
+		'en': 'English'
+	};
+	return languageNameMap[language];
+}
+
+//设置当前语言,格式为:zh-cn、zh-hant-cn、en
+function setLanguage(myLanguage) {
+	uni.setStorageSync(i18nUpdateKey, myLanguage);
+	uni.$emit(i18nUpdateKey, myLanguage);
+}
+
+// 插件内部使用,请勿直接调用
+function _getPrivateLanguage(myLanguage, followSystemLanguage = true) {
+	let systemLanguage = '';
+	if (followSystemLanguage) {
+		systemLanguage = uni.getSystemInfoSync().language;
+	}
+	let language = myLanguage || uni.getStorageSync(i18nUpdateKey) || systemLanguage;
+	language = language.toLowerCase();
+	var reg = new RegExp('_', '');
+	language = language.replace(reg, '-');
+	if (language.indexOf('zh') !== -1) {
+		if (language === 'zh' || language === 'zh-cn' || language.indexOf('zh-hans') !== -1) {
+			return 'zh-cn';
+		}
+		return 'zh-hant-cn';
+	}
+	if (language.indexOf('en') !== -1) {
+		return 'en';
+	}
+	return 'zh-cn';
+}
+
+module.exports = {
+	refresherDefaultText,
+	refresherPullingText,
+	refresherRefreshingText,
+	refresherCompleteText,
+	refresherUpdateTimeText,
+	refresherUpdateTimeNoneText,
+	refresherUpdateTimeTodayText,
+	refresherUpdateTimeYesterdayText,
+	loadingMoreDefaultText,
+	loadingMoreLoadingText,
+	loadingMoreNoMoreText,
+	loadingMoreFailText,
+	emptyViewText,
+	emptyViewReloadText,
+	emptyViewErrorText,
+	getLanguage,
+	getLanguageName,
+	setLanguage,
+	_getPrivateLanguage,
+}

+ 3062 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-main.js

@@ -0,0 +1,3062 @@
+// [z-paging]核心js
+
+import zStatic from './z-paging-static'
+import zConfig from './z-paging-config'
+import zLocalConfig from '../config/index'
+import zUtils from './z-paging-utils'
+import zI18n from './z-paging-i18n'
+import zPagingRefresh from '../components/z-paging-refresh'
+import zPagingLoadMore from '../components/z-paging-load-more'
+import zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view'
+
+import Enum from './z-paging-enum'
+
+const currentVersion = 'V2.0.8';
+const systemInfo = uni.getSystemInfoSync();
+const commonDelayTime = 100;
+const i18nUpdateKey = 'z-paging-i18n-update';
+const errorUpdateKey = 'z-paging-error-emit';
+let config = null;
+// #ifdef APP-NVUE
+const weexDom = weex.requireModule('dom');
+const weexAnimation = weex.requireModule('animation');
+// #endif
+
+/*
+当z-paging未使用uni_modules管理时,控制台会有警告:WARNING: Module not found: Error: Can't resolve '@/uni_modules/z-paging'...
+此时注释下方try中的代码即可
+*/
+try {
+	const contextKeys = require.context('@/uni_modules/z-paging', false, /\z-paging-config$/).keys();
+	if (contextKeys.length) {
+		const suffix = '.js';
+		config = require('@/uni_modules/z-paging/z-paging-config' + suffix);
+	}
+} catch {}
+
+//获取默认配置信息
+function _getConfig(key, defaultValue) {
+	if (!config) {
+		if (zLocalConfig) {
+			config = zLocalConfig;
+		} else {
+			const temConfig = zConfig.getConfig();
+			if (zConfig && temConfig) {
+				config = temConfig;
+			}
+		}
+	}
+	if (!config) {
+		return defaultValue;
+	}
+	let value = config[toKebab(key)];
+	if (value === undefined) {
+		value = config[key];
+	}
+	if (value !== undefined) {
+		return value;
+	}
+	return defaultValue;
+}
+//驼峰转短横线
+function toKebab(value) {
+	return value.replace(/([A-Z])/g, "-$1").toLowerCase();
+}
+
+export default {
+	name: "z-paging",
+	components: {
+		zPagingRefresh,
+		zPagingLoadMore,
+		zPagingEmptyView
+	},
+	data() {
+		return {
+			//--------------静态资源---------------
+			base64Arrow: zStatic.base64Arrow,
+			base64Flower: zStatic.base64Flower,
+			base64BackToTop: zStatic.base64BackToTop,
+
+			//-------------全局数据相关--------------
+			currentData: [],
+			totalData: [],
+			realTotalData: [],
+			totalLocalPagingList: [],
+			pageNo: 1,
+			scrollTop: 0,
+			oldScrollTop: 0,
+			refresherTouchstartY: 0,
+			lastRefresherTouchmove: null,
+			refresherReachMaxAngle: true,
+			refresherTransform: 'translateY(0px)',
+			refresherTransition: '',
+			finalRefresherDefaultStyle: 'black',
+			//当前加载类型 0-下拉刷新 1-上拉加载更多
+			loadingType: Enum.LoadingType.Refresher,
+			//底部加载更多状态 0-默认状态 1.加载中 2.没有更多数据 3.加载失败
+			loadingStatus: Enum.LoadingMoreStatus.Default,
+			//下拉刷新状态 0-默认状态 1.松手立即刷新 2.刷新中
+			refresherStatus: Enum.RefresherStatus.Default,
+			scrollViewStyle: {},
+			scrollViewInStyle: {},
+			pullDownTimeStamp: 0,
+			pageScrollTop: -1,
+			chatRecordLoadingMoreText: '',
+			moveDistance: 0,
+			loadingMoreDefaultSlot: null,
+			backToTopClass: 'zp-back-to-top zp-back-to-top-hide',
+			tempLanguageUpdateKey: 0,
+			wxsPropType: '',
+			refresherRevealStackCount: 0,
+			renderPropScrollTop: -1,
+			renderPropUsePageScroll: -1,
+			checkScrolledToBottomTimeOut: null,
+			refresherCompleteTimeout: null,
+			refresherCompleteSubTimeout: null,
+			lastBackToTopShowTime: 0,
+			systemInfo: null,
+
+			//--------------状态&判断---------------
+			showLoadingMore: false,
+			insideOfPaging: -1,
+			refresherTriggered: false,
+			loading: false,
+			firstPageLoaded: false,
+			pagingLoaded: false,
+			loaded: false,
+			isUserReload: true,
+			scrollEnable: true,
+			isTouchmoving: false,
+			isLocalPaging: false,
+			isAddedData: false,
+			isTotalChangeFromAddData: false,
+			isTouchEnded: false,
+			isUserPullDown: false,
+			privateRefresherEnabled: -1,
+			privateScrollWithAnimation: -1,
+			privateConcat: true,
+			myParentQuery: -1,
+			showBackToTopClass: false,
+			isLoadFailed: false,
+			isIos: systemInfo.platform === 'ios',
+			privateShowRefresherWhenReload: false,
+			disabledBounce: false,
+			cacheScrollNodeHeight: -1,
+			customNoMore: -1,
+			customRefresherHeight: -1,
+			showCustomRefresher: false,
+			fromEmptyViewReload: false,
+			doRefreshAnimateAfter: false,
+			isRefresherInComplete: false,
+			isIos13: systemInfo.system && systemInfo.system.length && systemInfo.system.indexOf('iOS 13') != -1,
+
+			//--------------nvue相关---------------
+			nRefresherLoading: false,
+			nListIsDragging: false,
+			nShowBottom: true,
+			nFixFreezing: false,
+			nShowRefresherReveal: false,
+			nIsFirstPageAndNoMore: false,
+			nFirstPageAndNoMoreChecked: false,
+			nLoadingMoreFixedHeight: false,
+			nShowRefresherRevealHeight: 0,
+
+			//---------------wxs相关---------------
+			wxsIsScrollTopInTopRange: true,
+			wxsScrollTop: 0,
+			wxsPageScrollTop: 0,
+			wxsOnPullingDown: false,
+		};
+	},
+	props: {
+		//自定义pageNo,默认为1
+		defaultPageNo: {
+			type: [Number, String],
+			default: _getConfig('defaultPageNo', 1),
+			observer: function(newVal, oldVal) {
+				this.pageNo = newVal;
+			},
+		},
+		//自定义pageSize,默认为10
+		defaultPageSize: {
+			type: [Number, String],
+			default: _getConfig('defaultPageSize', 10),
+		},
+		//为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效
+		dataKey: {
+			type: [Number, Object],
+			default: function() {
+				return _getConfig('dataKey', null);
+			},
+		},
+		//自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值
+		autowireListName: {
+			type: String,
+			default: function() {
+				return _getConfig('autowireListName', '');
+			},
+		},
+		//自动注入的query名,可自动调用父view(包含ref="paging")中的query方法
+		autowireQueryName: {
+			type: String,
+			default: function() {
+				return _getConfig('autowireQueryName', '');
+			},
+		},
+		//调用complete后延迟处理的时间,单位为毫秒,默认0毫秒
+		delay: {
+			type: [Number, String],
+			default: _getConfig('delay', 0),
+		},
+		//i18n国际化设置语言,支持简体中文(zh-cn)、繁体中文(zh-hant-cn)和英文(en)
+		language: {
+			type: String,
+			default: _getConfig('language', '')
+		},
+		//i18n国际化默认是否跟随系统语言,默认为是
+		followSystemLanguage: {
+			type: Boolean,
+			default: _getConfig('followSystemLanguage', true)
+		},
+		//设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替
+		pagingStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('pagingStyle', {});
+			},
+		},
+		//z-paging的高度,优先级低于pagingStyle中设置的height;传字符串,如100px、100rpx、100%
+		height: {
+			type: String,
+			default: _getConfig('height', '')
+		},
+		//z-paging的宽度,优先级低于pagingStyle中设置的width;传字符串,如100px、100rpx、100%
+		width: {
+			type: String,
+			default: _getConfig('width', '')
+		},
+		//z-paging的背景色,优先级低于pagingStyle中设置的background-color。传字符串,如"#ffffff"
+		bgColor: {
+			type: String,
+			default: _getConfig('bgColor', '')
+		},
+		//设置z-paging的容器(插槽的父view)的style
+		pagingContentStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('pagingContentStyle', {});
+			},
+		},
+		//z-paging是否自动高度,若自动高度则会自动铺满屏幕
+		autoHeight: {
+			type: Boolean,
+			default: _getConfig('autoHeight', false)
+		},
+		//z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,若需要减少高度,则传负数
+		autoHeightAddition: {
+			type: [Number, String],
+			default: _getConfig('autoHeightAddition', '0px')
+		},
+		//loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black
+		defaultThemeStyle: {
+			type: String,
+			default: function() {
+				return _getConfig('defaultThemeStyle', 'black');
+			}
+		},
+		//下拉刷新的主题样式,支持black,white,默认black
+		refresherThemeStyle: {
+			type: String,
+			default: function() {
+				return _getConfig('refresherThemeStyle', '');
+			}
+		},
+		//自定义下拉刷新中左侧图标的样式
+		refresherImgStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('refresherImgStyle', {});
+			}
+		},
+		//自定义下拉刷新中右侧状态描述文字的样式
+		refresherTitleStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('refresherTitleStyle', {});
+			}
+		},
+		//自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效)
+		refresherUpdateTimeStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('refresherUpdateTimeStyle', {});
+			}
+		},
+		//底部加载更多的主题样式,支持black,white,默认black
+		loadingMoreThemeStyle: {
+			type: String,
+			default: function() {
+				return _getConfig('loadingMoreThemeStyle', '');
+			}
+		},
+		//是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否
+		refresherOnly: {
+			type: Boolean,
+			default: _getConfig('refresherOnly', false)
+		},
+		//自定义下拉刷新结束以后延迟回弹的时间,单位为毫秒,默认为0
+		refresherCompleteDelay: {
+			type: [Number, String],
+			default: _getConfig('refresherCompleteDelay', 0)
+		},
+		//自定义下拉刷新结束回弹动画时间,单位为毫秒,默认为300毫秒(refresherEndBounceEnabled为false时,refresherCompleteDuration为设定值的1/3),nvue无效
+		refresherCompleteDuration: {
+			type: [Number, String],
+			default: _getConfig('refresherCompleteDuration', 300)
+		},
+		//使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐
+		usePageScroll: {
+			type: Boolean,
+			default: _getConfig('usePageScroll', false)
+		},
+		//z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为否(当使用内置scroll-view滚动时有效)
+		fixed: {
+			type: Boolean,
+			default: _getConfig('fixed', true)
+		},
+		//是否开启底部安全区域适配
+		safeAreaInsetBottom: {
+			type: Boolean,
+			default: _getConfig('safeAreaInsetBottom', false)
+		},
+		//是否可以滚动,使用内置scroll-view和nvue时有效,默认为是
+		scrollable: {
+			type: Boolean,
+			default: _getConfig('scrollable', true)
+		},
+		//z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是。请使用简便写法:auto
+		mountedAutoCallReload: {
+			type: Boolean,
+			default: _getConfig('mountedAutoCallReload', true)
+		},
+		//z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是
+		auto: {
+			type: Boolean,
+			default: _getConfig('auto', true)
+		},
+		//reload时自动滚动到顶部,默认为是
+		autoScrollToTopWhenReload: {
+			type: Boolean,
+			default: _getConfig('autoScrollToTopWhenReload', true)
+		},
+		//reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的
+		autoCleanListWhenReload: {
+			type: Boolean,
+			default: _getConfig('autoCleanListWhenReload', true)
+		},
+		//调用reload方法时自动显示下拉刷新view,默认为否
+		showRefresherWhenReload: {
+			type: Boolean,
+			default: _getConfig('showRefresherWhenReload', false)
+		},
+		//调用reload方法时自动显示加载更多view,且为加载中状态,默认为否
+		showLoadingMoreWhenReload: {
+			type: Boolean,
+			default: _getConfig('showLoadingMoreWhenReload', false)
+		},
+		//是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新
+		useCustomRefresher: {
+			type: Boolean,
+			default: _getConfig('useCustomRefresher', true)
+		},
+		//自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题
+		refresherFps: {
+			type: [Number, String],
+			default: _getConfig('refresherFps', 40)
+		},
+		//自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发
+		refresherMaxAngle: {
+			type: [Number, String],
+			default: _getConfig('refresherMaxAngle', 40)
+		},
+		//自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否
+		refresherAngleEnableChangeContinued: {
+			type: Boolean,
+			default: _getConfig('refresherAngleEnableChangeContinued', false)
+		},
+		//自定义下拉刷新默认状态下的文字
+		refresherDefaultText: {
+			type: [String, Object],
+			default: _getConfig('refresherDefaultText', null)
+		},
+		//自定义下拉刷新松手立即刷新状态下的文字
+		refresherPullingText: {
+			type: [String, Object],
+			default: _getConfig('refresherPullingText', null)
+		},
+		//自定义下拉刷新刷新中状态下的文字
+		refresherRefreshingText: {
+			type: [String, Object],
+			default: _getConfig('refresherRefreshingText', null)
+		},
+		//自定义下拉刷新刷新结束状态下的文字
+		refresherCompleteText: {
+			type: [String, Object],
+			default: _getConfig('refresherCompleteText', null)
+		},
+		//是否开启自定义下拉刷新刷新结束回弹效果,默认为是
+		refresherEndBounceEnabled: {
+			type: Boolean,
+			default: _getConfig('refresherEndBounceEnabled', true)
+		},
+		//自定义底部加载更多样式
+		loadingMoreCustomStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('loadingMoreCustomStyle', {});
+			}
+		},
+		//自定义底部加载更多加载中动画样式
+		loadingMoreLoadingIconCustomStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('loadingMoreLoadingIconCustomStyle', {});
+			}
+		},
+		//自定义底部加载更多加载中动画图标类型,可选flower或circle,默认为flower
+		loadingMoreLoadingIconType: {
+			type: String,
+			default: _getConfig('loadingMoreLoadingIconType', 'flower')
+		},
+		//自定义底部加载更多加载中动画图标图片
+		loadingMoreLoadingIconCustomImage: {
+			type: String,
+			default: _getConfig('loadingMoreLoadingIconCustomImage', '')
+		},
+		//底部加载更多加载中view是否展示旋转动画,默认为是
+		loadingMoreLoadingAnimated: {
+			type: Boolean,
+			default: _getConfig('loadingMoreLoadingAnimated', true)
+		},
+		//是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是
+		loadingMoreEnabled: {
+			type: Boolean,
+			default: _getConfig('loadingMoreEnabled', true)
+		},
+		//是否启用滑动到底部加载更多数据,默认为是
+		toBottomLoadingMoreEnabled: {
+			type: Boolean,
+			default: _getConfig('toBottomLoadingMoreEnabled', true)
+		},
+		//滑动到底部"默认"文字,默认为【点击加载更多】
+		loadingMoreDefaultText: {
+			type: [String, Object],
+			default: _getConfig('loadingMoreDefaultText', null)
+		},
+		//滑动到底部"加载中"文字,默认为【正在加载...】
+		loadingMoreLoadingText: {
+			type: [String, Object],
+			default: _getConfig('loadingMoreLoadingText', null)
+		},
+		//滑动到底部"没有更多"文字,默认为【没有更多了】
+		loadingMoreNoMoreText: {
+			type: [String, Object],
+			default: _getConfig('loadingMoreNoMoreText', null)
+		},
+		//滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】
+		loadingMoreFailText: {
+			type: [String, Object],
+			default: _getConfig('loadingMoreFailText', null)
+		},
+		//当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为否
+		hideLoadingMoreWhenNoMoreAndInsideOfPaging: {
+			type: Boolean,
+			default: _getConfig('hideLoadingMoreWhenNoMoreAndInsideOfPaging', false)
+		},
+		//当没有更多数据且分页数组长度少于这个值时,隐藏没有更多数据的view,默认为0,代表不限制。
+		hideLoadingMoreWhenNoMoreByLimit: {
+			type: Number,
+			default: _getConfig('hideLoadingMoreWhenNoMoreByLimit', 0)
+		},
+		//当分页未满一屏时,是否自动加载更多,默认为否(nvue无效)
+		insideMore: {
+			type: Boolean,
+			default: _getConfig('insideMore', false)
+		},
+		//是否显示默认的加载更多text,默认为是
+		showDefaultLoadingMoreText: {
+			type: Boolean,
+			default: _getConfig('showDefaultLoadingMoreText', true)
+		},
+		//是否显示没有更多数据的view
+		showLoadingMoreNoMoreView: {
+			type: Boolean,
+			default: _getConfig('showLoadingMoreNoMoreView', true)
+		},
+		//是否显示没有更多数据的分割线,默认为是
+		showLoadingMoreNoMoreLine: {
+			type: Boolean,
+			default: _getConfig('showLoadingMoreNoMoreLine', true)
+		},
+		//自定义底部没有更多数据的分割线样式
+		loadingMoreNoMoreLineCustomStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('loadingMoreNoMoreLineCustomStyle', {});
+			},
+		},
+		//是否强制隐藏空数据图,默认为否
+		hideEmptyView: {
+			type: Boolean,
+			default: _getConfig('hideEmptyView', false)
+		},
+		//空数据图描述文字,默认为“没有数据哦~”
+		emptyViewText: {
+			type: [String, Object],
+			default: _getConfig('emptyViewText', null)
+		},
+		//是否显示空数据图重新加载按钮(无数据时),默认为否
+		showEmptyViewReload: {
+			type: Boolean,
+			default: _getConfig('showEmptyViewReload', false)
+		},
+		//加载失败时是否显示空数据图重新加载按钮,默认为是
+		showEmptyViewReloadWhenError: {
+			type: Boolean,
+			default: _getConfig('showEmptyViewReloadWhenError', true)
+		},
+		//空数据图点击重新加载文字,默认为“重新加载”
+		emptyViewReloadText: {
+			type: [String, Object],
+			default: _getConfig('emptyViewReloadText', null)
+		},
+		//空数据图图片,默认使用z-paging内置的图片
+		emptyViewImg: {
+			type: String,
+			default: _getConfig('emptyViewImg', '')
+		},
+		//空数据图“加载失败”描述文字,默认为“很抱歉,加载失败”
+		emptyViewErrorText: {
+			type: [String, Object],
+			default: _getConfig('emptyViewErrorText', null)
+		},
+		//空数据图“加载失败”图片,默认使用z-paging内置的图片
+		emptyViewErrorImg: {
+			type: String,
+			default: _getConfig('emptyViewErrorImg', '')
+		},
+		//空数据图样式
+		emptyViewStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('emptyViewStyle', {});
+			}
+		},
+		//空数据图img样式
+		emptyViewImgStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('emptyViewImgStyle', {});
+			}
+		},
+		//空数据图描述文字样式
+		emptyViewTitleStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('emptyViewTitleStyle', {});
+			}
+		},
+		//空数据图重新加载按钮样式
+		emptyViewReloadStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('emptyViewReloadStyle', {});
+			}
+		},
+		//空数据图片是否铺满z-paging,默认为是。若设置为否,则为填充满z-paging的剩余部分
+		emptyViewFixed: {
+			type: Boolean,
+			default: function() {
+				return _getConfig('emptyViewFixed', true)
+			}
+		},
+		//空数据图片是否垂直居中,默认为是。emptyViewFixed为false时有效
+		emptyViewCenter: {
+			type: Boolean,
+			default: function() {
+				return _getConfig('emptyViewCenter', true)
+			}
+		},
+		//加载中时是否自动隐藏空数据图,默认为是
+		autoHideEmptyViewWhenLoading: {
+			type: Boolean,
+			default: _getConfig('autoHideEmptyViewWhenLoading', true)
+		},
+		//第一次加载后自动隐藏loading slot,默认为是
+		autoHideLoadingAfterFirstLoaded: {
+			type: Boolean,
+			default: _getConfig('autoHideLoadingAfterFirstLoaded', true)
+		},
+		//自动显示点击返回顶部按钮,默认为否
+		autoShowBackToTop: {
+			type: Boolean,
+			default: _getConfig('autoShowBackToTop', false)
+		},
+		//点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx
+		backToTopThreshold: {
+			type: [Number, String],
+			default: _getConfig('backToTopThreshold', '400rpx')
+		},
+		//点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片
+		backToTopImg: {
+			type: String,
+			default: _getConfig('backToTopImg', '')
+		},
+		//点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是
+		backToTopWithAnimate: {
+			type: Boolean,
+			default: _getConfig('backToTopWithAnimate', true)
+		},
+		//点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx
+		backToTopBottom: {
+			type: [Number, String],
+			default: _getConfig('backToTopBottom', '160rpx')
+		},
+		//点击返回顶部按钮的自定义样式
+		backToTopStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('backToTopStyle', {});
+			},
+		},
+		//控制是否出现滚动条,默认为是
+		showScrollbar: {
+			type: Boolean,
+			default: _getConfig('showScrollbar', true)
+		},
+		//是否允许横向滚动,默认为否
+		scrollX: {
+			type: Boolean,
+			default: _getConfig('scrollX', false)
+		},
+		//iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。
+		scrollToTopBounceEnabled: {
+			type: Boolean,
+			default: _getConfig('scrollToTopBounceEnabled', false)
+		},
+		//iOS设备上滚动到底部时是否允许回弹效果,默认为是。
+		scrollToBottomBounceEnabled: {
+			type: Boolean,
+			default: _getConfig('scrollToBottomBounceEnabled', true)
+		},
+		//在设置滚动条位置时使用动画过渡,默认为否
+		scrollWithAnimation: {
+			type: Boolean,
+			default: _getConfig('scrollWithAnimation', false)
+		},
+		//值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
+		scrollIntoView: {
+			type: String,
+			default: _getConfig('scrollIntoView', '')
+		},
+		//距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx
+		lowerThreshold: {
+			type: [Number, String],
+			default: _getConfig('lowerThreshold', '100rpx')
+		},
+		//iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是
+		enableBackToTop: {
+			type: Boolean,
+			default: _getConfig('enableBackToTop', true)
+		},
+		//是否开启自定义下拉刷新,默认为是
+		refresherEnabled: {
+			type: Boolean,
+			default: _getConfig('refresherEnabled', true)
+		},
+		//设置自定义下拉刷新阈值,默认为80rpx
+		refresherThreshold: {
+			type: [Number, String],
+			default: _getConfig('refresherThreshold', '80rpx')
+		},
+		//设置系统下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black
+		refresherDefaultStyle: {
+			type: String,
+			default: _getConfig('refresherDefaultStyle', 'black')
+		},
+		//设置自定义下拉刷新区域背景
+		refresherBackground: {
+			type: String,
+			default: _getConfig('refresherBackground', '#ffffff00')
+		},
+		//设置固定的自定义下拉刷新区域背景
+		refresherFixedBackground: {
+			type: String,
+			default: _getConfig('refresherFixedBackground', '#ffffff00')
+		},
+		//设置固定的自定义下拉刷新区域高度,默认为0
+		refresherFixedBacHeight: {
+			type: [Number, String],
+			default: _getConfig('refresherFixedBacHeight', 0)
+		},
+		//设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例,范围0-1,值越大代表衰减越多。默认为0.7(nvue无效)
+		refresherOutRate: {
+			type: Number,
+			default: _getConfig('refresherOutRate', 0.7)
+		},
+		//是否显示最后更新时间,默认为否
+		showRefresherUpdateTime: {
+			type: Boolean,
+			default: _getConfig('showRefresherUpdateTime', false)
+		},
+		//如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串
+		refresherUpdateTimeKey: {
+			type: String,
+			default: _getConfig('refresherUpdateTimeKey', 'default')
+		},
+		//本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒
+		localPagingLoadingTime: {
+			type: [Number, String],
+			default: _getConfig('localPagingLoadingTime', 200)
+		},
+		//使用聊天记录模式,默认为否
+		useChatRecordMode: {
+			type: Boolean,
+			default: _getConfig('useChatRecordMode', false)
+		},
+		//slot="top"的view的z-index,默认为99,仅使用页面滚动时有效
+		topZIndex: {
+			type: Number,
+			default: _getConfig('topZIndex', 99)
+		},
+		//z-paging内容容器父view的z-index,默认为1
+		superContentZIndex: {
+			type: Number,
+			default: _getConfig('superContentZIndex', 1)
+		},
+		//z-paging内容容器部分的z-index,默认为10
+		contentZIndex: {
+			type: Number,
+			default: _getConfig('contentZIndex', 10)
+		},
+		//空数据view的z-index,默认为9
+		emptyViewZIndex: {
+			type: Number,
+			default: _getConfig('emptyViewZIndex', 9)
+		},
+		//使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为是
+		autoFullHeight: {
+			type: Boolean,
+			default: _getConfig('autoFullHeight', true)
+		},
+		//自动拼接complete中传过来的数组(使用聊天记录模式时无效)
+		concat: {
+			type: Boolean,
+			default: _getConfig('concat', true)
+		},
+		//nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list
+		nvueListIs: {
+			type: String,
+			default: _getConfig('nvueListIs', 'list')
+		},
+		//nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https://uniapp.dcloud.io/component/waterfall
+		nvueWaterfallConfig: {
+			type: Object,
+			default: function() {
+				return _getConfig('nvueWaterfallConfig', {});
+			}
+		},
+		//nvue 控制是否回弹效果,iOS不支持动态修改
+		nvueBounce: {
+			type: Boolean,
+			default: _getConfig('nvueBounce', true)
+		},
+		//nvue中通过代码滚动到顶部/底部时,是否加快动画效果(无滚动动画时无效),默认为否
+		nvueFastScroll: {
+			type: Boolean,
+			default: _getConfig('nvueFastScroll', false)
+		},
+		//nvue中list的id
+		nvueListId: {
+			type: String,
+			default: _getConfig('nvueListId', '')
+		},
+		//nvue中refresh组件的样式
+		nvueRefresherStyle: {
+			type: Object,
+			default: function() {
+				return _getConfig('nvueRefresherStyle', {});
+			}
+		},
+		//是否隐藏nvue列表底部的tagView,此view用于标识滚动到底部位置,若隐藏则滚动到底部功能将失效,在nvue中实现吸顶+swiper功能时需将最外层z-paging的此属性设置为true。默认为否
+		hideNvueBottomTag: {
+			type: Boolean,
+			default: _getConfig('hideNvueBottomTag', false)
+		},
+		//是否将错误信息打印至控制台,默认为是
+		showConsoleError: {
+			type: Boolean,
+			default: _getConfig('showConsoleError', true)
+		},
+		//父组件v-model所绑定的list的值
+		value: {
+			type: Array,
+			default: function() {
+				return [];
+			}
+		}
+	},
+	mounted() {
+		this.wxsPropType = (new Date()).getTime().toString();
+		this.renderJsIgnore;
+		if (!this.refresherOnly && (this.mountedAutoCallReload && this.auto)) {
+			this.$nextTick(() => {
+				this._preReload();
+			})
+		}
+		this.$nextTick(() => {
+			this.systemInfo = uni.getSystemInfoSync();
+			if (!this.usePageScroll && this.autoHeight) {
+				this._setAutoHeight();
+			}
+			this.loaded = true;
+		})
+		this.updatePageScrollTopHeight();
+		this.updatePageScrollBottomHeight();
+		if (this.finalRefresherEnabled && this.useCustomRefresher) {
+			this.$nextTick(() => {
+				this.isTouchmoving = true;
+			})
+		}
+		uni.$on(i18nUpdateKey, () => {
+			this.tempLanguageUpdateKey = (new Date()).getTime();
+		})
+		uni.$on(errorUpdateKey, () => {
+			if (this.loading) {
+				this.complete(false);
+			}
+		})
+		// #ifdef APP-NVUE
+		if (!this.isIos && !this.useChatRecordMode) {
+			this.nLoadingMoreFixedHeight = true;
+		}
+		// #endif
+	},
+	destroyed() {
+		uni.$off(i18nUpdateKey);
+		uni.$off(errorUpdateKey);
+	},
+	watch: {
+		value(newVal, oldVal) {
+			let dataType = Object.prototype.toString.call(newVal);
+			if (dataType === '[object Undefined]') {
+				zUtils.consoleErr('v-model所绑定的值不存在!');
+				return;
+			}
+			if (dataType !== '[object Array]') {
+				zUtils.consoleErr('v-model所绑定的值必须为Array类型!');
+				return;
+			}
+			if (!zUtils.arrayIsEqual(newVal, this.totalData)) {
+				this.isTotalChangeFromAddData = true;
+				this.totalData = newVal;
+			}
+		},
+		totalData(newVal, oldVal) {
+			if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length &&
+				oldVal.length) {
+				return;
+			}
+			newVal = [...newVal];
+			if (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) {
+				// #ifndef APP-NVUE
+				this.$nextTick(() => {
+					this._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => {
+						this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal,
+							scrollViewNode,
+							pagingContainerNode)
+					});
+				})
+				// #endif
+				// #ifdef APP-NVUE
+				this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal)
+				// #endif
+			} else {
+				this._preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal)
+			}
+			if (!this.usePageScroll && (this.pageNo === this.defaultPageNo || this.defaultPageNo + 1)) {
+				setTimeout(() => {
+					this._checkScrollViewOutOfPage();
+				}, commonDelayTime)
+			}
+			this.realTotalData = newVal;
+			this.$emit('input', newVal);
+			this.$emit('update:list', newVal);
+			this.$emit('listChange', newVal);
+			this._callMyParentList(newVal);
+			this.firstPageLoaded = false;
+			this.isTotalChangeFromAddData = false;
+			this.$nextTick(() => {
+				this._getNodeClientRect('.zp-paging-container-content').then((res) => {
+					if (res) {
+						this.$emit('pagingContentHeightChanged', res[0].height);
+					}
+				});
+				// #ifdef APP-NVUE
+				if (this.useChatRecordMode && this.nIsFirstPageAndNoMore && this.pageNo === this
+					.defaultPageNo && !this.nFirstPageAndNoMoreChecked) {
+					this.nFirstPageAndNoMoreChecked = true;
+					this._scrollToBottom(false);
+				}
+				// #endif
+			})
+		},
+		currentData(newVal, oldVal) {
+			this._currentDataChange(newVal, oldVal);
+		},
+		loadingStatus(newVal, oldVal) {
+			this.$emit('loadingStatusChange', newVal);
+			// #ifdef APP-NVUE
+			if (this.useChatRecordMode) {
+				if (this.pageNo === this.defaultPageNo && newVal === Enum.LoadingMoreStatus.NoMore) {
+					this.nIsFirstPageAndNoMore = true;
+					return;
+				}
+			}
+			this.nIsFirstPageAndNoMore = false;
+			//  #endif
+		},
+		oldScrollTop(newVal, oldVal) {
+			if (!this.usePageScroll) {
+				this.$emit('scrollTopChange', newVal);
+				this.$emit('update:scrollTop', newVal);
+				this._checkShouldShowBackToTop(newVal, oldVal);
+				if (this.isIos) {
+					if (newVal > 5) {
+						this.wxsScrollTop = 6;
+					} else {
+						this.wxsScrollTop = 0;
+					}
+				} else {
+					this.wxsScrollTop = newVal;
+				}
+			}
+		},
+		pageScrollTop(newVal, oldVal) {
+			if (this.usePageScroll) {
+				this.$emit('scrollTopChange', newVal);
+				this.$emit('update:scrollTop', newVal);
+				this._checkShouldShowBackToTop(newVal, oldVal);
+				if (this.isIos) {
+					if (newVal > 5) {
+						this.wxsPageScrollTop = 6;
+					} else {
+						this.wxsPageScrollTop = 0;
+					}
+				} else {
+					this.wxsPageScrollTop = newVal;
+				}
+			}
+		},
+		defaultThemeStyle: {
+			handler(newVal) {
+				if (newVal.length) {
+					this.finalRefresherDefaultStyle = newVal;
+				}
+			},
+			immediate: true
+		},
+		usePageScroll: {
+			handler(newVal) {
+				this.$nextTick(() => {
+					this.renderPropUsePageScroll = newVal;
+				})
+				if (this.loaded && this.autoHeight) {
+					this._setAutoHeight(!newVal);
+				}
+			},
+			immediate: true
+		},
+		autoHeight(newVal, oldVal) {
+			if (this.loaded && !this.usePageScroll) {
+				this._setAutoHeight(newVal);
+			}
+		},
+		autoHeightAddition(newVal, oldVal) {
+			if (this.loaded && !this.usePageScroll && this.autoHeight) {
+				this._setAutoHeight(newVal);
+			}
+		},
+		refresherDefaultStyle: {
+			handler(newVal) {
+				if (newVal.length) {
+					this.finalRefresherDefaultStyle = newVal;
+				}
+			},
+			immediate: true
+		},
+		refresherStatus(newVal, oldVal) {
+			if (newVal !== oldVal) {
+				this.$emit('refresherStatusChange', newVal);
+				this.$emit('update:refresherStatus', newVal);
+			}
+		},
+		useChatRecordMode(newVal, oldVal) {
+			if (newVal) {
+				this.nLoadingMoreFixedHeight = false;
+			}
+		},
+		finalScrollTop(newVal, oldVal) {
+			if (!this.useChatRecordMode) {
+				if (newVal < 6) {
+					this.renderPropScrollTop = 0;
+				} else {
+					this.renderPropScrollTop = 10;
+				}
+			}
+		},
+		nIsFirstPageAndNoMore: {
+			handler(newVal) {
+				const cellStyle = !this.useChatRecordMode || newVal ? {} : {
+					transform: 'rotate(180deg)'
+				};
+				this.$emit('update:cellStyle', cellStyle);
+			},
+			immediate: true
+		}
+	},
+	computed: {
+		pageSize() {
+			return this.defaultPageSize;
+		},
+		pullDownDisTimeStamp() {
+			return 1000 / this.refresherFps;
+		},
+		finalRefresherEnabled() {
+			if (this.useChatRecordMode) {
+				return false;
+			}
+			if (this.privateRefresherEnabled === -1) {
+				return this.refresherEnabled;
+			}
+			return this.privateRefresherEnabled === 1;
+		},
+		finalScrollWithAnimation() {
+			if (this.privateScrollWithAnimation !== -1) {
+				const scrollWithAnimation = this.privateScrollWithAnimation === 1;
+				this.privateScrollWithAnimation = -1;
+				return scrollWithAnimation;
+			}
+			return this.scrollWithAnimation;
+		},
+		zPagingLoadMoreConfig() {
+			return {
+				status: this.loadingStatus,
+				defaultThemeStyle: this.finalLoadingMoreThemeStyle,
+				customStyle: this.loadingMoreCustomStyle,
+				iconCustomStyle: this.loadingMoreLoadingIconCustomStyle,
+				loadingIconType: this.loadingMoreLoadingIconType,
+				loadingIconCustomImage: this.loadingMoreLoadingIconCustomImage,
+				loadingAnimated: this.loadingMoreLoadingAnimated,
+				showNoMoreLine: this.showLoadingMoreNoMoreLine,
+				noMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle,
+				defaultText: this.finalLoadingMoreDefaultText,
+				loadingText: this.finalLoadingMoreLoadingText,
+				noMoreText: this.finalLoadingMoreNoMoreText,
+				failText: this.finalLoadingMoreFailText
+			};
+		},
+		zScopedSlots() {
+			return this.$scopedSlots;
+		},
+		finalNvueListIs() {
+			if (this.usePageScroll) {
+				return 'view';
+			}
+			const nvueListIsLowerCase = this.nvueListIs.toLowerCase();
+			if (nvueListIsLowerCase === 'list' || nvueListIsLowerCase === 'waterfall' || nvueListIsLowerCase ===
+				'scroller') {
+				return nvueListIsLowerCase;
+			}
+			return 'list';
+		},
+		finalNvueSuperListIs() {
+			if (this.usePageScroll) {
+				return 'view';
+			}
+			return 'scroller';
+		},
+		finalNvueRefresherEnabled() {
+			return this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode;
+		},
+		finalPagingStyle() {
+			let pagingStyle = this.pagingStyle;
+			if (!this.systemInfo) {
+				return pagingStyle;
+			}
+			const windowTop = this.systemInfo.windowTop;
+			const windowBottom = this.systemInfo.windowBottom;
+			if (!this.usePageScroll && this.fixed) {
+				if (windowTop && windowTop !== undefined && !pagingStyle.top) {
+					pagingStyle.top = windowTop + 'px';
+				}
+				if (!pagingStyle.bottom) {
+					let bottom = 0;
+					if (windowBottom && windowBottom !== undefined) {
+						bottom = windowBottom;
+					}
+					if (this.safeAreaInsetBottom) {
+						bottom += this.safeAreaBottom;
+					}
+					pagingStyle.bottom = bottom + 'px';
+				}
+			}
+			if (this.bgColor.length && !pagingStyle['background']) {
+				pagingStyle['background-color'] = this.bgColor;
+			}
+			if (this.height.length && !pagingStyle['height']) {
+				pagingStyle['height'] = this.height;
+			}
+			if (this.width.length && !pagingStyle['width']) {
+				pagingStyle['width'] = this.width;
+			}
+			return pagingStyle;
+		},
+		finalEnableBackToTop() {
+			if (this.usePageScroll) {
+				return false;
+			}
+			return this.enableBackToTop;
+		},
+		finalBackToTopThreshold() {
+			return zUtils.convertTextToPx(this.backToTopThreshold);
+		},
+		finalLowerThreshold() {
+			return zUtils.convertTextToPx(this.lowerThreshold);
+		},
+		finalRefresherThreshold() {
+			let refresherThreshold = this.refresherThreshold;
+			let idDefault = false;
+			if (refresherThreshold === '80rpx') {
+				idDefault = true;
+				if (this.showRefresherUpdateTime) {
+					refresherThreshold = '120rpx';
+				}
+			}
+			if (idDefault && this.customRefresherHeight > 0) {
+				return this.customRefresherHeight;
+			}
+			return zUtils.convertTextToPx(refresherThreshold);
+		},
+		finalRefresherFixedBacHeight() {
+			return zUtils.convertTextToPx(this.refresherFixedBacHeight);
+		},
+		finalScrollTop() {
+			if (this.usePageScroll) {
+				return this.pageScrollTop;
+			}
+			return this.oldScrollTop;
+		},
+		finalBackToTopStyle() {
+			let tempBackToTopStyle = this.backToTopStyle;
+			if (!tempBackToTopStyle.bottom) {
+				tempBackToTopStyle.bottom = this.windowBottom + zUtils.convertTextToPx(this.backToTopBottom) + 'px';
+			}
+			if(!tempBackToTopStyle.position){
+				tempBackToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute';
+			}
+			return tempBackToTopStyle;
+		},
+		finalTempLanguage() {
+			if (this.language.length) {
+				return this.language;
+			}
+			return this.tempLanguage;
+		},
+		finalLanguage() {
+			let language = this.finalTempLanguage.toLowerCase();
+			return zI18n._getPrivateLanguage(language, this.followSystemLanguage);
+		},
+		finalRefresherDefaultText() {
+			return this._getI18nText('refresherDefaultText', this.refresherDefaultText);
+		},
+		finalRefresherPullingText() {
+			return this._getI18nText('refresherPullingText', this.refresherPullingText);
+		},
+		finalRefresherRefreshingText() {
+			return this._getI18nText('refresherRefreshingText', this.refresherRefreshingText);
+		},
+		finalRefresherCompleteText() {
+			return this._getI18nText('refresherCompleteText', this.refresherCompleteText);
+		},
+		finalLoadingMoreDefaultText() {
+			return this._getI18nText('loadingMoreDefaultText', this.loadingMoreDefaultText);
+		},
+		finalLoadingMoreLoadingText() {
+			return this._getI18nText('loadingMoreLoadingText', this.loadingMoreLoadingText);
+		},
+		finalLoadingMoreNoMoreText() {
+			return this._getI18nText('loadingMoreNoMoreText', this.loadingMoreNoMoreText);
+		},
+		finalLoadingMoreFailText() {
+			return this._getI18nText('loadingMoreFailText', this.loadingMoreFailText);
+		},
+		finalEmptyViewText() {
+			if (this.isLoadFailed) {
+				return this.finalEmptyViewErrorText;
+			} else {
+				return this._getI18nText('emptyViewText', this.emptyViewText);
+			}
+		},
+		finalEmptyViewReloadText() {
+			return this._getI18nText('emptyViewReloadText', this.emptyViewReloadText);
+		},
+		finalEmptyViewErrorText() {
+			return this._getI18nText('emptyViewErrorText', this.emptyViewErrorText);
+		},
+		finalEmptyViewImg() {
+			if (this.isLoadFailed) {
+				return this.emptyViewErrorImg;
+			} else {
+				return this.emptyViewImg;
+			}
+		},
+		finalShowEmptyViewReload() {
+			if (this.isLoadFailed) {
+				return this.showEmptyViewReloadWhenError;
+			} else {
+				return this.showEmptyViewReload;
+			}
+		},
+		finalRefresherThemeStyle() {
+			if (this.refresherThemeStyle.length) {
+				return this.refresherThemeStyle;
+			}
+			return this.defaultThemeStyle;
+		},
+		finalLoadingMoreThemeStyle() {
+			if (this.loadingMoreThemeStyle.length) {
+				return this.loadingMoreThemeStyle;
+			}
+			return this.defaultThemeStyle;
+		},
+		finalPagingContentStyle() {
+			if (this.contentZIndex != 1) {
+				this.pagingContentStyle['z-index'] = this.contentZIndex;
+				this.pagingContentStyle['position'] = 'relative';
+			}
+			return this.pagingContentStyle;
+		},
+		finalScrollViewStyle() {
+			if (this.superContentZIndex != 1) {
+				this.scrollViewStyle['z-index'] = this.superContentZIndex;
+				this.scrollViewStyle['position'] = 'relative';
+			}
+			return this.scrollViewStyle;
+		},
+		finalRefresherOutRate() {
+			if (this.refresherOutRate < 0) {
+				return 0;
+			}
+			if (this.refresherOutRate > 1) {
+				return 1;
+			}
+			return this.refresherOutRate;
+		},
+		finalRefresherTransform() {
+			if (this.refresherTransform === 'translateY(0px)') {
+				return 'none';
+			}
+			return this.refresherTransform;
+		},
+		finalConcat() {
+			return this.concat && this.privateConcat;
+		},
+		finalShowRefresherWhenReload() {
+			return this.showRefresherWhenReload || this.privateShowRefresherWhenReload;
+		},
+		finalRefresherTriggered() {
+			if(!(this.finalRefresherEnabled && !this.useCustomRefresher)){
+				return false;
+			}
+			return this.refresherTriggered;
+		},
+		showEmpty() {
+			const showEmpty = !this.refresherOnly && !this.totalData.length && (this.autoHideEmptyViewWhenLoading ? this
+				.isAddedData : true) && !this.hideEmptyView && (this.autoHideEmptyViewWhenLoading ? (!this
+				.firstPageLoaded && !this.loading) : true);
+			return showEmpty;
+		},
+		showLoading() {
+			const showLoading = !this.firstPageLoaded && (this.autoHideLoadingAfterFirstLoaded ? (this
+				.fromEmptyViewReload ? true : !this.pagingLoaded) : true) && this.loading;
+			return showLoading;
+		},
+		tempLanguage() {
+			let systemLanguage = false;
+			const temp = this.tempLanguageUpdateKey;
+			if (this.followSystemLanguage) {
+				systemLanguage = systemInfo.language;
+			}
+			return uni.getStorageSync(i18nUpdateKey) || systemLanguage || 'zh-cn';
+		},
+		safeAreaBottom() {
+			if (!this.systemInfo) {
+				return 0;
+			}
+			let safeAreaBottom = 0;
+			// #ifdef MP-WEIXIN
+			safeAreaBottom = this.systemInfo.screenHeight - this.systemInfo.safeArea.bottom;
+			// #endif
+			// #ifdef APP-PLUS || H5
+			safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;
+			// #endif
+			return Math.abs(safeAreaBottom);
+		},
+		renderJsIgnore() {
+			if ((this.usePageScroll && this.useChatRecordMode) || !this.refresherEnabled || !this.useCustomRefresher) {
+				this.$nextTick(() => {
+					this.renderPropScrollTop = 10;
+				})
+			}
+			return 0;
+		},
+		windowHeight() {
+			if (!this.systemInfo) {
+				return 0;
+			}
+			return this.systemInfo.windowHeight;
+		},
+		windowTop() {
+			if (!this.systemInfo) {
+				return 0;
+			}
+			const windowTop = this.systemInfo.windowTop;
+			return windowTop || 0;
+		},
+		windowBottom() {
+			if (!this.systemInfo) {
+				return 0;
+			}
+			let windowBottom = this.systemInfo.windowBottom || 0;
+			if (this.safeAreaInsetBottom) {
+				windowBottom += this.safeAreaBottom;
+			}
+			return windowBottom;
+		},
+		showRefresher() {
+			const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher && this.isTouchmoving;
+			// #ifndef APP-NVUE
+			if (this.customRefresherHeight === -1 && showRefresher) {
+				setTimeout(() => {
+					this.$nextTick(()=>{
+						this._updateCustomRefresherHeight();
+					})
+				}, 100)
+			}
+			// #endif
+			return showRefresher;
+		},
+		// #ifdef APP-NVUE
+		nWaterfallColumnCount() {
+			if (this.finalNvueListIs !== 'waterfall') {
+				return 0;
+			}
+			return this._getNvueWaterfallSingleConfig('column-count', 2);
+		},
+		nWaterfallColumnWidth() {
+			return this._getNvueWaterfallSingleConfig('column-width', 'auto');
+		},
+		nWaterfallColumnGap() {
+			return this._getNvueWaterfallSingleConfig('column-gap', 'normal');
+		},
+		nWaterfallLeftGap() {
+			return this._getNvueWaterfallSingleConfig('left-gap', 0);
+		},
+		nWaterfallRightGap() {
+			return this._getNvueWaterfallSingleConfig('right-gap', 0);
+		},
+		nViewIs() {
+			const finalNvueListIs = this.finalNvueListIs;
+			return finalNvueListIs === 'scroller' || finalNvueListIs === 'view' ? 'view' : finalNvueListIs ===
+				'waterfall' ? 'header' : 'cell';
+		},
+		nSafeAreaBottomHeight() {
+			return this.safeAreaInsetBottom ? this.safeAreaBottom : 0;
+		}
+		// #endif
+	},
+	methods: {
+		//请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认是是)
+		complete(data, success = true) {
+			this.customNoMore = -1;
+			this.addData(data, success);
+		},
+		//简写,与complete完全相同
+		end(data, success = true) {
+			this.complete(data, success);
+		},
+		//【保证数据一致】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为dataKey,需与:data-key绑定的一致,第三个参数为是否成功(默认为是)
+		completeByKey(data, dataKey = null, success = true) {
+			if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) {
+				return;
+			}
+			this.customNoMore = -1;
+			this.addData(data, success);
+		},
+		//简写,与completeByKey完全相同
+		endByKey(data, dataKey = null, success = true) {
+			this.completeByKey(data, dataKey, success);
+		},
+		//【通过totalCount判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为totalCount(列表总数),第三个参数为是否成功(默认为是)
+		completeByTotalCount(data, totalCount, success = true) {
+			if (totalCount == 'undefined') {
+				this.customNoMore = -1;
+			} else {
+				let dataTypeRes = this._checkDataType(data, success, false);
+				data = dataTypeRes.data;
+				success = dataTypeRes.success;
+				if (totalCount >= 0 && success) {
+					this.$nextTick(() => {
+						let nomore = true;
+						let realTotalDataCount = this.realTotalData.length;
+						if (this.pageNo == this.defaultPageNo) {
+							realTotalDataCount = 0;
+						}
+						let exceedCount = realTotalDataCount + data.length - totalCount;
+						if (exceedCount >= 0) {
+							nomore = false;
+							exceedCount = this.defaultPageSize - exceedCount;
+							if (exceedCount > 0 && exceedCount < data.length) {
+								data = data.splice(0, exceedCount);
+							}
+						}
+						this.completeByNoMore(data, nomore, success);
+					})
+					return;
+				}
+			}
+			this.addData(data, success);
+		},
+		//简写,与completeByTotalCount完全相同
+		completeByTotal(data, totalCount, success = true) {
+			this.completeByTotalCount(data, totalCount, success);
+		},
+		//简写,与completeByTotalCount完全相同
+		endByTotalCount(data, totalCount, success = true) {
+			this.completeByTotalCount(data, totalCount, success);
+		},
+		//简写,与completeByTotalCount完全相同
+		endByTotal(data, totalCount, success = true) {
+			this.completeByTotalCount(data, totalCount, success);
+		},
+		//【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否有更多数据,第三个参数为是否成功(默认是是)
+		completeByNoMore(data, nomore, success = true) {
+			if (nomore != 'undefined') {
+				this.customNoMore = nomore == true ? 1 : 0;
+			}
+			this.addData(data, success);
+		},
+		//简写,与completeByNoMore完全相同
+		endByNoMore(data, nomore, success = true) {
+			this.completeByNoMore(data, nomore, success);
+		},
+		//与上方complete方法功能一致,新版本中设置服务端回调数组请使用complete方法
+		addData(data, success = true) {
+			this.$nextTick(() => {
+				if (this.delay > 0) {
+					setTimeout(() => {
+						this._addData(data, success, false);
+					}, this.delay)
+				} else {
+					this._addData(data, success, false);
+				}
+			})
+		},
+		//设置i18n国际化语言
+		setI18n(language) {
+			zI18n.setLanguage(language);
+		},
+		//获取当前z-paging的语言
+		getLanguage() {
+			return this.finalLanguage;
+		},
+		//当前版本号
+		getVersion() {
+			return `z-paging ${currentVersion}`;
+		},
+		//添加聊天记录
+		addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) {
+			let dataType = Object.prototype.toString.call(data);
+			if (dataType !== '[object Array]') {
+				data = [data];
+			}
+			if (!this.useChatRecordMode) {
+				return;
+			}
+			this.isTotalChangeFromAddData = true;
+			//#ifndef APP-NVUE
+			this.totalData = [...this.totalData, ...data];
+			//#endif
+			//#ifdef APP-NVUE
+			if (this.nIsFirstPageAndNoMore) {
+				this.totalData = [...this.totalData, ...data];
+			} else {
+				this.totalData = [...data, ...this.totalData];
+			}
+			//#endif
+			if (toBottom) {
+				setTimeout(() => {
+					//#ifndef APP-NVUE
+					this._scrollToBottom(toBottomWithAnimate);
+					//#endif
+					//#ifdef APP-NVUE
+					if (this.nIsFirstPageAndNoMore) {
+						this._scrollToBottom(toBottomWithAnimate);
+					} else {
+						this._scrollToTop(toBottomWithAnimate);
+					}
+					//#endif
+				}, commonDelayTime)
+			}
+		},
+		//从顶部添加数据,不会影响分页的pageNo和pageSize
+		addDataFromTop(data, toTop = true, toTopWithAnimate = true) {
+			let dataType = Object.prototype.toString.call(data);
+			if (dataType !== '[object Array]') {
+				data = [data];
+			}
+			this.totalData = [...data, ...this.totalData];
+			if (toTop) {
+				setTimeout(() => {
+					this._scrollToTop(toTopWithAnimate);
+				}, commonDelayTime)
+			}
+		},
+		//重新设置列表数据,调用此方法不会影响pageNo和pageSize,也不会触发请求。适用场景:当需要删除列表中某一项时,将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时,请使用此方法,请勿直接修改page中:list.sync绑定的数组)
+		resetTotalData(data) {
+			if (data == undefined) {
+				if (this.showConsoleError) {
+					zUtils.consoleErr('方法resetTotalData参数缺失!');
+				}
+				return;
+			}
+			this.isTotalChangeFromAddData = true;
+			let dataType = Object.prototype.toString.call(data);
+			if (dataType !== '[object Array]') {
+				data = [data];
+			}
+			this.totalData = data;
+		},
+		//设置本地分页数据,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件)
+		setLocalPaging(data, success = true) {
+			this.isLocalPaging = true;
+			this.$nextTick(() => {
+				this._addData(data, success, true);
+			})
+		},
+		//重新加载分页数据,pageNo会恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false)
+		reload(animate = this.showRefresherWhenReload) {
+			if (animate) {
+				this.privateShowRefresherWhenReload = animate;
+				this.isUserPullDown = true;
+			}
+			this._preReload(animate, false);
+		},
+		//刷新列表数据,pageNo和pageSize不会重置,列表数据会重新从服务端获取。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致
+		refresh() {
+			const disPageNo = this.pageNo - this.defaultPageNo + 1;
+			if (disPageNo >= 1) {
+				this.loading = true;
+				this.privateConcat = false;
+				const totalPageSize = disPageNo * this.pageSize;
+				this.$emit('query', this.defaultPageNo, totalPageSize);
+				this._callMyParentQuery(this.defaultPageNo, totalPageSize);
+			}
+		},
+		//清空分页数据
+		clean() {
+			this._reload(true);
+			this._addData([], true, false);
+		},
+		//手动触发滚动到顶部加载更多,聊天记录模式时有效
+		doChatRecordLoadMore() {
+			if (this.useChatRecordMode) {
+				this._onLoadingMore('click');
+			}
+		},
+		//手动触发上拉加载更多(非必须,可依据具体需求使用)
+		doLoadMore() {
+			this._onLoadingMore('toBottom');
+		},
+		//手动停止下拉刷新加载
+		endRefresh() {
+			this.refresherTriggered = false;
+		},
+		//滚动到顶部,animate为是否展示滚动动画,默认为是
+		scrollToTop(animate,checkReverse = true) {
+			// #ifdef APP-NVUE
+			if (checkReverse && this.useChatRecordMode) {
+				if(!this.nIsFirstPageAndNoMore){
+					this.scrollToBottom(animate, false);
+					return;
+				}
+			}
+			// #endif
+			this.$nextTick(() => {
+				this._scrollToTop(animate, false);
+				// #ifdef APP-NVUE
+				if (this.nvueFastScroll && animate) {
+					setTimeout(() => {
+						this._scrollToTop(false, false);
+					}, 150);
+				}
+				// #endif
+			})
+		},
+		//滚动到底部,animate为是否展示滚动动画,默认为是
+		scrollToBottom(animate,checkReverse = true) {
+			// #ifdef APP-NVUE
+			if (checkReverse && this.useChatRecordMode) {
+				if(!this.nIsFirstPageAndNoMore){
+					this.scrollToTop(animate, false);
+					return;
+				}
+			}
+			// #endif
+			this.$nextTick(() => {
+				this._scrollToBottom(animate);
+				// #ifdef APP-NVUE
+				if (this.nvueFastScroll && animate) {
+					setTimeout(() => {
+						this._scrollToBottom(false);
+					}, 150);
+				}
+				// #endif
+			})
+		},
+		//滚动到指定view(vue中有效)。sel为需要滚动的view的id值,不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否
+		scrollIntoViewById(sel, offset, animate) {
+			this._scrollIntoView(sel, offset, animate);
+		},
+		//滚动到指定view(vue中有效)。nodeTop为需要滚动的view的top值(通过uni.createSelectorQuery()获取);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否
+		scrollIntoViewByNodeTop(nodeTop, offset, animate) {
+			this.scrollTop = this.oldScrollTop;
+			this.$nextTick(() => {
+				this._scrollIntoViewByNodeTop(nodeTop, offset, animate);
+			})
+		},
+		//滚动到指定view(nvue中有效)。index为需要滚动的view的index(第几个);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否
+		scrollIntoViewByIndex(index, offset, animate) {
+			this._scrollIntoView(index, offset, animate);
+		},
+		//滚动到指定view(nvue中有效)。view为需要滚动的view(通过`this.$refs.xxx`获取),不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否
+		scrollIntoViewByView(view, offset, animate) {
+			this._scrollIntoView(view, offset, animate);
+		},
+		//当使用页面滚动并且自定义下拉刷新时,请在页面的onPageScroll中调用此方法,告知z-paging当前的pageScrollTop,否则会导致在任意位置都可以下拉刷新
+		updatePageScrollTop(value) {
+			if (value == undefined) {
+				//zUtils.consoleErr('updatePageScrollTop方法缺少参数,请将页面onPageScroll事件中的scrollTop传递给此方法');
+				return;
+			}
+			this.pageScrollTop = value;
+		},
+		//当使用页面滚动并且设置了slot="top"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="top"的view高度动态改变时,在其高度需要更新时调用此方法
+		updatePageScrollTopHeight() {
+			this._updatePageScrollTopOrBottomHeight('top');
+		},
+		//当使用页面滚动并且设置了slot="bottom"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="bottom"的view高度动态改变时,在其高度需要更新时调用此方法
+		updatePageScrollBottomHeight() {
+			this._updatePageScrollTopOrBottomHeight('bottom');
+		},
+		//更新z-paging内置scroll-view的scrollTop
+		updateScrollViewScrollTop(scrollTop, animate = true) {
+			this.privateScrollWithAnimation = animate ? 1 : 0;
+			this.scrollTop = this.oldScrollTop;
+			this.$nextTick(() => {
+				this.scrollTop = scrollTop;
+				this.oldScrollTop = this.scrollTop;
+			});
+		},
+		//设置nvue List的specialEffects
+		setSpecialEffects(args) {
+			this.setListSpecialEffects(args);
+		},
+		//与setSpecialEffects等效,兼容旧版本
+		setListSpecialEffects(args) {
+			this.nFixFreezing = args !== {};
+			if (this.isIos) {
+				this.privateRefresherEnabled = 0;
+			}
+			if (!this.usePageScroll) {
+				this.$refs['n-list'].setSpecialEffects(args);
+			}
+		},
+		handleRefresherStatusChanged(func) {
+			this.refresherStatusChangedFunc = func;
+		},
+		//------------------ 私有方法 -------------------
+		//reload之前的一些处理
+		_preReload(animate = this.showRefresherWhenReload, isFromMounted = true) {
+			this.isUserReload = true;
+			if (animate) {
+				this.privateShowRefresherWhenReload = animate;
+				// #ifndef APP-NVUE
+				if (this.useCustomRefresher) {
+					this._doRefresherRefreshAnimate();
+				} else {
+					this.refresherTriggered = true;
+				}
+				// #endif
+				// #ifdef APP-NVUE
+				this.refresherStatus = Enum.RefresherStatus.Loading;
+				this.refresherRevealStackCount++;
+				setTimeout(() => {
+					this._getNodeClientRect('zp-n-refresh-container', false).then((node) => {
+						if (node) {
+							let nodeHeight = node[0].height;
+							this.nShowRefresherReveal = true;
+							this.nShowRefresherRevealHeight = nodeHeight;
+							setTimeout(() => {
+								this._nDoRefresherEndAnimation(0, -nodeHeight, false, false);
+								setTimeout(() => {
+									this._nDoRefresherEndAnimation(nodeHeight, 0);
+								}, 10)
+							}, 10)
+							this._reload(false, isFromMounted);
+						} else {
+							this._reload(false, isFromMounted);
+						}
+					});
+				}, 10)
+				return;
+				// #endif
+			} else {
+				this._refresherEnd(false, false);
+			}
+			this._reload(false, isFromMounted);
+		},
+		//重新加载分页数据
+		_reload(isClean = false, isFromMounted = false) {
+			this.isAddedData = false;
+			this.cacheScrollNodeHeight = -1;
+			this.insideOfPaging = -1;
+			this.pageNo = this.defaultPageNo;
+			if (!isClean) {
+				this._startLoading(true);
+			}
+			this.firstPageLoaded = true;
+			this.isTotalChangeFromAddData = false;
+			this.totalData = [];
+			if (!isClean) {
+				this.$emit('query', this.pageNo, this.defaultPageSize);
+				let delay = 0;
+				// #ifdef MP-TOUTIAO
+				delay = 5;
+				// #endif
+				setTimeout(() => {
+					this._callMyParentQuery();
+				}, delay)
+				if (!isFromMounted && this.autoScrollToTopWhenReload) {
+					let checkedNRefresherLoading = true;
+					// #ifdef APP-NVUE
+					checkedNRefresherLoading = !this.nRefresherLoading;
+					// #endif
+					if (checkedNRefresherLoading) {
+						this._scrollToTop(false);
+					}
+				}
+				// #ifndef APP-NVUE
+				if (!this.usePageScroll && this.useChatRecordMode) {
+					if (this.showConsoleError) {
+						zUtils.consoleWarn('使用聊天记录模式时,建议使用页面滚动,可将usePageScroll设置为true以启用页面滚动!!');
+					}
+				}
+				// #endif
+			}
+			this.$nextTick(() => {
+				if (!this.realTotalData.length) {
+					// #ifdef APP-NVUE
+					this.nShowBottom = false;
+					// #endif
+				}
+			})
+		},
+		//处理服务端返回的数组
+		_addData(data, success, isLocal) {
+			this.isAddedData = true;
+			this.fromEmptyViewReload = false;
+			this.isTotalChangeFromAddData = true;
+			if (!this.useCustomRefresher) {
+				uni.stopPullDownRefresh();
+			}
+			// #ifdef APP-NVUE
+			if (this.usePageScroll) {
+				uni.stopPullDownRefresh();
+			}
+			// #endif
+			const tempIsUserPullDown = this.isUserPullDown;
+			if (tempIsUserPullDown && this.showRefresherUpdateTime && this.pageNo === this.defaultPageNo) {
+				zUtils.setRefesrherTime((new Date()).getTime(), this.refresherUpdateTimeKey);
+				this.tempLanguageUpdateKey = (new Date()).getTime();
+				if (this.$refs.refresh) {
+					this.$refs.refresh.updateTime();
+				}
+			}
+			if (tempIsUserPullDown && this.pageNo === this.defaultPageNo) {
+				this.isUserPullDown = false;
+			}
+			let dataTypeRes = this._checkDataType(data, success, true);
+			data = dataTypeRes.data;
+			success = dataTypeRes.success;
+			if (this.refresherTriggered) {
+				this.refresherTriggered = false;
+			}
+			let delayTime = commonDelayTime;
+			// #ifdef APP-NVUE
+			if (this.useChatRecordMode) {
+				delayTime = 0
+			}
+			// #endif
+			setTimeout(() => {
+				this._refresherEnd(true, true, tempIsUserPullDown);
+				this.pagingLoaded = true;
+			}, delayTime)
+			if (this.pageNo === this.defaultPageNo) {
+				this.isLoadFailed = !success;
+			}
+			if (success) {
+				if (!(this.privateConcat === false && this.loadingStatus === Enum.LoadingMoreStatus.NoMore)) {
+					this.loadingStatus = Enum.LoadingMoreStatus.Default;
+				}
+				if (isLocal) {
+					this.totalLocalPagingList = data;
+					this._localPagingQueryList(this.defaultPageNo, this.defaultPageSize, 0, (res) => {
+						this.complete(res);
+					})
+				} else {
+					this._currentDataChange(data, this.currentData);
+				}
+			} else {
+				this._currentDataChange(data, this.currentData);
+				this.loadingStatus = Enum.LoadingMoreStatus.Fail;
+				if (this.loadingType === Enum.LoadingType.LoadingMore) {
+					this.pageNo--;
+				}
+			}
+		},
+		//当前数据改变时调用
+		_currentDataChange(newVal, oldVal) {
+			newVal = [...newVal];
+			// #ifndef APP-NVUE
+			if (this.useChatRecordMode) {
+				newVal.reverse();
+			}
+			// #endif
+			if (this.pageNo === this.defaultPageNo && this.finalConcat) {
+				this.totalData = [];
+			}
+			if (this.customNoMore !== -1) {
+				if (this.customNoMore === 0 || !newVal.length) {
+					this.loadingStatus = Enum.LoadingMoreStatus.NoMore;
+				}
+			} else {
+				if (!newVal.length ||
+					(newVal.length && newVal.length < this.defaultPageSize)) {
+					this.loadingStatus = Enum.LoadingMoreStatus.NoMore;
+				}
+			}
+			if (!this.totalData.length) {
+				if (this.finalConcat) {
+					// #ifdef APP-NVUE
+					if(this.useChatRecordMode && this.pageNo === this.defaultPageNo && this.loadingStatus === Enum.LoadingMoreStatus.NoMore){
+						newVal.reverse();
+					}
+					// #endif
+					this.totalData = newVal;
+				}
+				if (this.useChatRecordMode) {
+					// #ifndef APP-NVUE
+					this.$nextTick(() => {
+						this._scrollToBottom(false);
+					})
+					// #endif
+				}
+			} else {
+				if (this.useChatRecordMode) {
+					// #ifdef APP-NVUE
+					this.totalData = [...this.totalData, ...newVal];
+					// #endif
+					//#ifndef APP-NVUE
+					const idIndex = newVal.length;
+					let idIndexStr = `z-paging-${idIndex}`;
+					this.totalData = [...newVal, ...this.totalData];
+					if (this.pageNo !== this.defaultPageNo) {
+						this.privateScrollWithAnimation = 0;
+						let delayTime = 200;
+						//#ifdef H5
+						delayTime = 0;
+						//#endif
+						this.$emit('update:chatIndex', idIndex);
+						if (this.usePageScroll) {
+							this._scrollIntoView(idIndexStr, 30, false, () => {
+								this.$emit('update:chatIndex', 0);
+							});
+						} else {
+							setTimeout(() => {
+								this._scrollIntoView(idIndexStr, 30, false, () => {
+									this.$emit('update:chatIndex', 0);
+								});
+							}, delayTime)
+						}
+					} else {
+						this.$nextTick(() => {
+							this._scrollToBottom(false);
+						})
+					}
+					//#endif
+
+				} else {
+					if (this.finalConcat) {
+						this.totalData = [...this.totalData, ...newVal];
+					} else {
+						this.totalData = [...newVal];
+					}
+				}
+			}
+			this.privateConcat = true;
+		},
+		//通过@scroll事件检测是否滚动到了底部
+		_checkScrolledToBottom(scrollDiff, checked = false) {
+			if (this.checkScrolledToBottomTimeOut) {
+				clearTimeout(this.checkScrolledToBottomTimeOut);
+				this.checkScrolledToBottomTimeOut = null;
+			}
+			if (this.cacheScrollNodeHeight === -1) {
+				this._getNodeClientRect('.zp-scroll-view').then((res) => {
+					if (res) {
+						let pageScrollNodeHeight = res[0].height;
+						this.cacheScrollNodeHeight = pageScrollNodeHeight;
+						if (scrollDiff - pageScrollNodeHeight <= this.finalLowerThreshold) {
+							this._onLoadingMore('toBottom');
+						}
+					}
+				});
+			} else {
+				if (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) {
+					this._onLoadingMore('toBottom');
+				} else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) {
+					this.checkScrolledToBottomTimeOut = setTimeout(() => {
+						this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => {
+							this.oldScrollTop = res[0].scrollTop;
+							const newScrollDiff = res[0].scrollHeight - this.oldScrollTop;
+							this._checkScrolledToBottom(newScrollDiff, true);
+						})
+					}, 150)
+				}
+			}
+		},
+		//触发加载更多时调用,from:0-滑动到底部触发;1-点击加载更多触发
+		_onLoadingMore(from = 'click') {
+			if (from === 'toBottom') {
+				if (!this.scrollToBottomBounceEnabled) {
+					if (this.scrollEnable) {
+						this.scrollEnable = false;
+						this.$nextTick(() => {
+							this.scrollEnable = true;
+						})
+					}
+				}
+				//#ifdef APP-VUE || H5
+				if (this.isIos) {
+					this.renderPropUsePageScroll = -1;
+					this.$nextTick(() => {
+						this.renderPropUsePageScroll = this.usePageScroll;
+					})
+				}
+				//#endif
+			}
+			this.$emit('scrolltolower', from);
+			if (from === 'toBottom' && (!this.toBottomLoadingMoreEnabled || this.useChatRecordMode)) {
+				return;
+			}
+			if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.LoadingMoreStatus
+					.Default || this.loadingStatus === Enum.LoadingMoreStatus.Fail) || this.loading)
+				return;
+			this._doLoadingMore();
+		},
+		//当滚动到顶部时
+		_scrollToUpper() {
+			this.$emit('scrolltoupper');
+			this.$emit('scrollTopChange', 0);
+			this.$nextTick(() => {
+				this.oldScrollTop = 0;
+			})
+			if (!this.useChatRecordMode) {
+				return;
+			}
+			if (this.loadingStatus === Enum.LoadingMoreStatus.NoMore) {
+				return;
+			}
+			this._onLoadingMore('click');
+		},
+		//点击返回顶部
+		_backToTopClick() {
+			if (!this.backToTopWithAnimate) {
+				this._checkShouldShowBackToTop(1, 0);
+			}
+			this.scrollToTop(this.backToTopWithAnimate);
+		},
+		//滚动到顶部
+		_scrollToTop(animate, isPrivate = true) {
+			// #ifdef APP-NVUE
+			const el = this.$refs['zp-n-list-top-tag'];
+			if (this.usePageScroll) {
+				this._getNodeClientRect('zp-page-scroll-top', false).then((node) => {
+					let nodeHeight = 0;
+					if (node) {
+						nodeHeight = node[0].height;
+					}
+					weexDom.scrollToElement(el, {
+						offset: -nodeHeight,
+						animated: animate
+					});
+				});
+			} else {
+				weexDom.scrollToElement(el, {
+					offset: 0,
+					animated: animate
+				});
+			}
+			return;
+			// #endif
+			if (this.usePageScroll) {
+				this.$nextTick(() => {
+					uni.pageScrollTo({
+						scrollTop: 0,
+						duration: animate ? 100 : 0,
+					});
+				});
+				return;
+			}
+			this.privateScrollWithAnimation = animate ? 1 : 0;
+			this.scrollTop = this.oldScrollTop;
+			this.$nextTick(() => {
+				this.scrollTop = 0;
+				this.oldScrollTop = this.scrollTop;
+			});
+		},
+		//滚动到底部
+		async _scrollToBottom(animate = true) {
+			// #ifdef APP-NVUE
+			const el = this.$refs['zp-n-list-bottom-tag'];
+			if (el) {
+				weexDom.scrollToElement(el, {
+					offset: 0,
+					animated: animate
+				});
+			} else {
+				zUtils.consoleErr('滚动到底部失败,因为您设置了hideNvueBottomTag为true');
+			}
+			return;
+			// #endif
+			if (this.usePageScroll) {
+				this.$nextTick(() => {
+					uni.pageScrollTo({
+						scrollTop: Number.MAX_VALUE,
+						duration: animate ? 100 : 0,
+					});
+				});
+				return;
+			}
+			try {
+				this.privateScrollWithAnimation = animate ? 1 : 0;
+				let pagingContainerH = 0;
+				let scrollViewH = 0;
+				const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container');
+				const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');
+				if (pagingContainerNode) {
+					pagingContainerH = pagingContainerNode[0].height;
+				}
+				if (scrollViewNode) {
+					scrollViewH = scrollViewNode[0].height;
+				}
+				if (pagingContainerH > scrollViewH) {
+					this.scrollTop = this.oldScrollTop;
+					this.$nextTick(() => {
+						this.scrollTop = pagingContainerH - scrollViewH;
+						this.oldScrollTop = this.scrollTop;
+					});
+				}
+			} catch (e) {
+
+			}
+		},
+		//滚动到指定view
+		_scrollIntoView(sel, offset = 0, animate = false, finishCallback) {
+			try {
+				this.scrollTop = this.oldScrollTop;
+				this.$nextTick(() => {
+					// #ifdef APP-NVUE
+					const refs = this.$parent.$refs;
+					if (!refs) {
+						return;
+					}
+					const dataType = Object.prototype.toString.call(sel);
+					let el = null;
+					if (dataType === '[object Number]') {
+						const els = refs[`z-paging-${sel}`];
+						el = els ? els[0] : null;
+					} else if (dataType === '[object Array]') {
+						el = sel[0];
+					} else {
+						el = sel;
+					}
+					if (el) {
+						weexDom.scrollToElement(el, {
+							offset: -offset,
+							animated: animate
+						});
+					} else {
+						zUtils.consoleErr('在nvue中滚动到指定位置,cell必须设置 :ref="`z-paging-${index}`"');
+					}
+					return;
+					// #endif
+					if (sel.indexOf('#') != -1) {
+						sel = sel.replace('#', '');
+					}
+					this._getNodeClientRect('#' + sel, false).then((node) => {
+						if (node) {
+							let nodeTop = node[0].top;
+							this._scrollIntoViewByNodeTop(nodeTop, offset, animate);
+							if (finishCallback) {
+								finishCallback();
+							}
+						}
+					});
+				});
+			} catch (e) {
+
+			}
+		},
+		//通过nodeTop滚动到指定view
+		_scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) {
+			this.privateScrollWithAnimation = animate ? 1 : 0;
+			if (this.usePageScroll) {
+				uni.pageScrollTo({
+					scrollTop: nodeTop - offset,
+					duration: animate ? 100 : 0
+				});
+			} else {
+				nodeTop = nodeTop + this.oldScrollTop;
+				this.scrollTop = nodeTop - offset;
+				this.oldScrollTop = this.scrollTop;
+			}
+		},
+		//是否要展示上拉加载更多view
+		_shouldShowLoadingMore(type) {
+			if (!(this.loadingStatus === Enum.LoadingMoreStatus.Default ? this.nShowBottom : true)) {
+				return false;
+			}
+			if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum
+						.LoadingMoreStatus.Loading) && !this
+					.showLoadingMore) || (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this
+					.isUserPullDown || this.loadingStatus !== Enum.LoadingMoreStatus.Loading)) || this
+				.refresherOnly) {
+				return false;
+			}
+			if (this.useChatRecordMode && type !== 'loadingMoreLoading') {
+				return false;
+			}
+			if (!this.$slots) {
+				return false;
+			}
+			if (type === 'loadingMoreDefault') {
+				const res = this.loadingStatus === Enum.LoadingMoreStatus.Default && this.$slots.loadingMoreDefault;
+				if (res) {
+					// #ifdef APP-NVUE
+					if (!this.isIos) {
+						this.nLoadingMoreFixedHeight = false;
+					}
+					//  #endif
+				}
+				return res;
+			} else if (type === 'loadingMoreLoading') {
+				const res = this.loadingStatus === Enum.LoadingMoreStatus.Loading && this.$slots.loadingMoreLoading;
+				if (res) {
+					// #ifdef APP-NVUE
+					if (!this.isIos) {
+						this.nLoadingMoreFixedHeight = false;
+					}
+					//  #endif
+				}
+				return res;
+			} else if (type === 'loadingMoreNoMore') {
+				const res = this.loadingStatus === Enum.LoadingMoreStatus.NoMore && this.$slots.loadingMoreNoMore &&
+					this.showLoadingMoreNoMoreView;
+				if (res) {
+					// #ifdef APP-NVUE
+					if (!this.isIos) {
+						this.nLoadingMoreFixedHeight = false;
+					}
+					//  #endif
+				}
+				return res;
+			} else if (type === 'loadingMoreFail') {
+				const res = this.loadingStatus === Enum.LoadingMoreStatus.Fail && this.$slots.loadingMoreFail;
+				if (res) {
+					// #ifdef APP-NVUE
+					if (!this.isIos) {
+						this.nLoadingMoreFixedHeight = false;
+					}
+					//  #endif
+				}
+				return res;
+			} else if (type === 'loadingMoreCustom') {
+				const res = this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.LoadingMoreStatus.NoMore &&
+					!this
+					.showLoadingMoreNoMoreView);
+				return res;
+			}
+			return false;
+		},
+		//处理开始加载更多状态
+		_startLoading(isReload = false) {
+			if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) {
+				this.loadingStatus = Enum.LoadingMoreStatus.Loading;
+			}
+			this.loading = true;
+		},
+		//处理开始加载更多
+		_doLoadingMore() {
+			if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.LoadingMoreStatus.NoMore) {
+				this.pageNo++;
+				this._startLoading(false);
+				if (this.isLocalPaging) {
+					this._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, (
+						res) => {
+						this.addData(res);
+					})
+				} else {
+					this.$emit('query', this.pageNo, this.defaultPageSize);
+					this._callMyParentQuery();
+				}
+				this.loadingType = Enum.LoadingType.LoadingMore;
+			}
+		},
+		_scroll(e) {
+			this.$emit('scroll', e);
+			this.oldScrollTop = e.detail.scrollTop;
+			const scrollDiff = e.detail.scrollHeight - this.oldScrollTop;
+			if (!this.isIos) {
+				this._checkScrolledToBottom(scrollDiff);
+			}
+		},
+		_onRefresh(fromScrollView=false) {
+			if (fromScrollView){
+				if (!(this.finalRefresherEnabled && !this.useCustomRefresher)){
+					return;
+				}
+			}
+			this.$emit('onRefresh');
+			this.$emit('Refresh');
+			if (this.loading || this.isRefresherInComplete || this.nShowRefresherReveal) {
+				return;
+			}
+			this.isUserPullDown = true;
+			this.isUserReload = false;
+			this._startLoading(true);
+			this.refresherTriggered = true;
+			if (this.useChatRecordMode) {
+				this._onLoadingMore('click')
+			} else {
+				this._reload();
+			}
+			this.loadingType = Enum.LoadingType.Refresher;
+		},
+		//自定义下拉刷新被复位
+		_onRestore() {
+			this.refresherTriggered = 'restore';
+			this.$emit('onRestore');
+			this.$emit('Restore');
+		},
+		// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5
+		//拖拽开始
+		_refresherTouchstart(e) {
+			if (this._getRefresherTouchDisabled()) {
+				return;
+			}
+			const touch = zUtils.getCommonTouch(e);
+			this._handleRefresherTouchstart(touch);
+		},
+		// #endif
+		//进一步处理拖拽开始结果
+		_handleRefresherTouchstart(touch) {
+			if (!this.loading && this.isTouchEnded) {
+				this.isTouchmoving = false;
+			}
+			this.isTouchEnded = false;
+			if (this.isIos13) {
+				this.refresherTransition = '';
+			} else {
+				this.refresherTransition = 'transform .1s linear';
+			}
+			this.refresherTouchstartY = touch.touchY;
+			this.$emit('refresherTouchstart', this.refresherTouchstartY);
+			this.lastRefresherTouchmove = touch;
+			this._cleanRefresherCompleteTimeout();
+		},
+		// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5
+		//拖拽中
+		_refresherTouchmove(e) {
+			const currentTimeStamp = (new Date()).getTime();
+			if (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) {
+				return;
+			}
+			if (this._getRefresherTouchDisabled()) {
+				return;
+			}
+			this.pullDownTimeStamp = Number(currentTimeStamp);
+			const touch = zUtils.getCommonTouch(e);
+			let refresherTouchmoveY = touch.touchY;
+			let moveDistance = refresherTouchmoveY - this.refresherTouchstartY;
+			if (moveDistance < 0) {
+				return;
+			}
+			if (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this
+				.lastRefresherTouchmove.touchY <= refresherTouchmoveY) {
+				if (!moveDistance && !this.refresherAngleEnableChangeContinued && this.moveDistance < 1 && !this
+					.refresherReachMaxAngle) {
+					return;
+				}
+				const x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX);
+				const y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY);
+				const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
+				if ((x || y) && x > 1) {
+					const angle = Math.asin(y / z) / Math.PI * 180;
+					if (angle < this.refresherMaxAngle) {
+						this.lastRefresherTouchmove = touch;
+						this.refresherReachMaxAngle = false;
+						return;
+					}
+				}
+			}
+			moveDistance = this._getFinalRefresherMoveDistance(moveDistance);
+			this._handleRefresherTouchmove(moveDistance, touch);
+			if (!this.disabledBounce) {
+				this._handleScrollViewDisableBounce({
+					bounce: false
+				});
+				this.disabledBounce = true;
+			}
+		},
+		// #endif
+		//进一步处理拖拽中结果
+		_handleRefresherTouchmove(moveDistance, touch) {
+			this.refresherReachMaxAngle = true;
+			this.isTouchmoving = true;
+			//this.refresherTransition = '';
+			this.isTouchEnded = false;
+			if (moveDistance >= this.finalRefresherThreshold) {
+				this.refresherStatus = Enum.RefresherStatus.PullToRefresh;
+			} else {
+				this.refresherStatus = Enum.RefresherStatus.Default;
+			}
+			// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5
+			// this.scrollEnable = false;
+			this.refresherTransform = `translateY(${moveDistance}px)`;
+			this.lastRefresherTouchmove = touch;
+			// #endif
+			this.moveDistance = moveDistance;
+			this.$emit('refresherTouchmove', moveDistance);
+		},
+		// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5
+		//拖拽结束
+		_refresherTouchend(e) {
+			if (this._getRefresherTouchDisabled() || !this.isTouchmoving) {
+				return;
+			}
+			const touch = zUtils.getCommonTouch(e);
+			let refresherTouchendY = touch.touchY;
+			let moveDistance = refresherTouchendY - this.refresherTouchstartY;
+			moveDistance = this._getFinalRefresherMoveDistance(moveDistance);
+			this._handleRefresherTouchend(moveDistance);
+			this._handleScrollViewDisableBounce({
+				bounce: true
+			});
+			this.disabledBounce = false;
+		},
+		// #endif
+		//进一步处理拖拽结束结果
+		_handleRefresherTouchend(moveDistance) {
+			// #ifndef APP-PLUS || H5 || MP-WEIXIN
+			if (!this.isTouchmoving) {
+				return;
+			}
+			// #endif
+			this.refresherReachMaxAngle = true;
+			if (moveDistance < 0 && this.usePageScroll && this.loadingMoreEnabled && this.useCustomRefresher && this
+				.pageScrollTop === -1) {
+				if (this.showConsoleError) {
+					zUtils.consoleErr(
+						'usePageScroll为true并且自定义下拉刷新时必须引入mixin或在page滚动时通过调用z-paging组件的updatePageScrollTop方法设置当前的scrollTop'
+					)
+				}
+			}
+			this.isTouchEnded = true;
+			if (moveDistance >= this.finalRefresherThreshold && this.refresherStatus === Enum.RefresherStatus
+				.PullToRefresh) {
+				// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5
+				this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
+				// #endif
+				this.moveDistance = this.finalRefresherThreshold;
+				this.refresherStatus = Enum.RefresherStatus.Loading;
+				this._doRefresherLoad();
+			} else {
+				this._refresherEnd(true, false);
+				setTimeout(() => {
+					this.isTouchmoving = false;
+				}, commonDelayTime);
+			}
+			this.scrollEnable = true;
+			this.refresherTransition = 'transform .1s linear';
+			this.$emit('refresherTouchend', moveDistance);
+		},
+		//处理scroll-view bounce是否生效
+		_handleScrollViewDisableBounce(e) {
+			if (!this.usePageScroll && !this.scrollToTopBounceEnabled) {
+				if (this.isIos13) {
+					this.refresherTransition = '';
+				}
+				if (!e.bounce) {
+					if (this.scrollEnable) {
+						this.scrollEnable = false;
+					}
+				} else {
+					this.scrollEnable = true;
+				}
+			}
+		},
+		//wxs正在下拉处理
+		_handleWxsOnPullingDown(onPullingDown) {
+			this.wxsOnPullingDown = onPullingDown;
+			if (onPullingDown) {
+				if (!this.useChatRecordMode) {
+					this.renderPropScrollTop = 0;
+				}
+			}
+		},
+		//下拉刷新结束
+		_refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false) {
+			let refresherCompleteDelay = 0;
+			if(fromAddData && isUserPullDown){
+				refresherCompleteDelay = this.refresherCompleteDelay;
+				if(this.refresherCompleteDuration > 700){
+					refresherCompleteDelay = 1;
+				}
+			}
+			const refresherStatus = refresherCompleteDelay > 0 ? Enum.RefresherStatus.Complete : Enum.RefresherStatus.Default;
+			// #ifndef APP-NVUE
+			if (this.finalShowRefresherWhenReload) {
+				const stackCount = this.refresherRevealStackCount;
+				this.refresherRevealStackCount--;
+				if (stackCount > 1) {
+					return;
+				}
+				this.refresherStatus = refresherStatus;
+			} else {
+				setTimeout(() => {
+					this.refresherStatus = refresherStatus;
+				}, commonDelayTime);
+			}
+			if (refresherCompleteDelay > 0) {
+				this.isRefresherInComplete = true;
+			}
+			// #endif
+			// #ifdef APP-NVUE
+			if (this.finalShowRefresherWhenReload) {
+				const stackCount = this.refresherRevealStackCount;
+				this.refresherRevealStackCount--;
+				if (stackCount > 1) {
+					return;
+				}
+				this.refresherStatus = refresherStatus;
+			} else {
+				setTimeout(() => {
+					this.refresherStatus = refresherStatus;
+				}, commonDelayTime);
+			}
+			// #endif
+			if (shouldEndLoadingDelay) {
+				setTimeout(() => {
+					this.loading = false;
+				}, commonDelayTime);
+			} else {
+				this.loading = false;
+			}
+			this._cleanRefresherCompleteTimeout();
+			this.refresherCompleteTimeout = setTimeout(() => {
+				let animateDuration = 1;
+				if (fromAddData) {
+					const animateType = this.refresherEndBounceEnabled ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear';
+					animateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000;
+					this.refresherTransition = `transform ${animateDuration}s ${animateType}`;
+				}
+				// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5
+				this.refresherTransform = 'translateY(0px)';
+				// #endif
+				// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5
+				this.wxsPropType = 'end' + (new Date()).getTime();
+				// #endif
+				// #ifdef APP-NVUE
+				this._nRefresherEnd();
+				// #endif
+				this.moveDistance = 0;
+				// #ifndef APP-NVUE
+				if (refresherStatus === Enum.RefresherStatus.Complete) {
+					if (this.refresherCompleteSubTimeout) {
+						clearTimeout(this.refresherCompleteSubTimeout);
+						this.refresherCompleteSubTimeout = null;
+					}
+					this.refresherCompleteSubTimeout = setTimeout(() => {
+						this.$nextTick(() => {
+							this.refresherStatus = Enum.RefresherStatus.Default;
+							this.isRefresherInComplete = false;
+						})
+					}, animateDuration * 800);
+				}
+				// #endif
+			}, refresherCompleteDelay);
+			this.$emit('onRestore');
+			this.$emit('Restore');
+		},
+		//模拟用户手动触发下拉刷新
+		_doRefresherRefreshAnimate() {
+			this._cleanRefresherCompleteTimeout();
+			// #ifndef APP-NVUE
+			const doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this
+				.customRefresherHeight === -1 && this.refresherThreshold === '80rpx';
+			if (doRefreshAnimateAfter) {
+				this.doRefreshAnimateAfter = true;
+				return;
+			}
+			// #endif
+			this.refresherRevealStackCount++;
+			this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;
+			// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5
+			this.wxsPropType = 'begin' + (new Date()).getTime();
+			// #endif
+			this.moveDistance = this.finalRefresherThreshold;
+			this.refresherStatus = Enum.RefresherStatus.Loading;
+			this.isTouchmoving = true;
+		},
+		//触发下拉刷新
+		_doRefresherLoad() {
+			this._onRefresh();
+			this.loading = true;
+		},
+		//获取处理后的moveDistance
+		_getFinalRefresherMoveDistance(moveDistance) {
+			moveDistance = moveDistance * 0.85;
+			if (moveDistance >= this.finalRefresherThreshold) {
+				moveDistance = this.finalRefresherThreshold + (moveDistance - this.finalRefresherThreshold) * (1 - this
+					.finalRefresherOutRate);
+			}
+			return moveDistance;
+		},
+		//(预处理)判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view
+		_preCheckShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode, pagingContainerNode) {
+			if (this.loadingStatus === Enum.LoadingMoreStatus.NoMore && this.hideLoadingMoreWhenNoMoreByLimit > 0 &&
+				newVal.length) {
+				this.showLoadingMore = newVal.length > this.hideLoadingMoreWhenNoMoreByLimit;
+			} else if ((this.loadingStatus === Enum.LoadingMoreStatus.NoMore && this
+					.hideLoadingMoreWhenNoMoreAndInsideOfPaging && newVal.length) || (this.insideMore && this
+					.insideOfPaging !== false && newVal.length)) {
+				this.$nextTick(() => {
+					this._checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(newVal, scrollViewNode,
+						pagingContainerNode);
+				})
+				if (this.insideMore && this.insideOfPaging !== false &&
+					newVal.length) {
+					this.showLoadingMore = newVal.length;
+				}
+			} else {
+				this.showLoadingMore = newVal.length;
+			}
+		},
+		//判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view
+		async _checkShowLoadingMoreWhenNoMoreAndInsideOfPaging(totalData, oldScrollViewNode, oldPagingContainerNode) {
+			try {
+				const scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view');
+				if (this.usePageScroll) {
+					if (scrollViewNode) {
+						const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height;
+						this.insideOfPaging = scrollViewTotalH < this.windowHeight;
+						if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) {
+							this.showLoadingMore = !this.insideOfPaging;
+						}
+						this._updateInsideOfPaging();
+					}
+				} else {
+					let pagingContainerH = 0;
+					let scrollViewH = 0;
+					const pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect(
+						'.zp-paging-container-content');
+					if (pagingContainerNode) {
+						pagingContainerH = pagingContainerNode[0].height;
+					}
+					if (scrollViewNode) {
+						scrollViewH = scrollViewNode[0].height;
+					}
+					this.insideOfPaging = pagingContainerH < scrollViewH;
+					if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) {
+						this.showLoadingMore = !this.insideOfPaging;
+					}
+					this._updateInsideOfPaging();
+				}
+			} catch (e) {
+				this.insideOfPaging = !totalData.length;
+				if (this.hideLoadingMoreWhenNoMoreAndInsideOfPaging) {
+					this.showLoadingMore = !this.insideOfPaging;
+				}
+				this._updateInsideOfPaging();
+			}
+		},
+		//检测z-paging是否超出了页面高度
+		async _checkScrollViewOutOfPage() {
+			try {
+				const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');
+				if (scrollViewNode) {
+					const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height;
+					if (scrollViewTotalH > this.windowHeight + 100) {
+						if (this.showConsoleError) {
+							zUtils.consoleWarn(
+								'检测到z-paging的高度超出页面高度,这将导致滚动或展示出现异常,请设置【:fixed="true"】或【确保z-paging有确定的高度(如果通过百分比设置z-paging的高度,请保证z-paging的所有父view已设置高度,同时确保page也设置了height:100%,如:page{height:100%}】,此时z-paging的百分比高度才能生效。详情参考demo或访问:https://ext.dcloud.net.cn/plugin?id=3935)'
+							);
+						}
+					}
+				}
+			} catch (e) {
+
+			}
+		},
+		//检测z-paging是否要全屏覆盖(当使用页面滚动并且不满全屏时,默认z-paging需要铺满全屏,避免数据过少时内部的empty-view无法正确展示)
+		async _checkScrollViewShouldFullHeight(callback) {
+			try {
+				const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');
+				const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content');
+				if (!scrollViewNode || !pagingContainerNode) {
+					return;
+				}
+				const scrollViewHeight = pagingContainerNode[0].height;
+				const scrollViewTop = scrollViewNode[0].top;
+				if (this.isAddedData && scrollViewHeight + scrollViewTop <= this.windowHeight) {
+					this._setAutoHeight(true, scrollViewNode);
+					callback(scrollViewNode, pagingContainerNode);
+				} else {
+					this._setAutoHeight(false);
+					callback(null, null);
+				}
+			} catch (e) {
+				callback(null, null);
+			}
+		},
+		//设置z-paging高度
+		async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) {
+			let heightKey = 'height';
+			// #ifndef APP-NVUE
+			if (this.usePageScroll) {
+				heightKey = 'min-height';
+			}
+			// #endif
+			try {
+				if (shouldFullHeight) {
+					let finalScrollViewNode = scrollViewNode ? scrollViewNode : await this._getNodeClientRect(
+						'.scroll-view');
+					if (finalScrollViewNode) {
+						const scrollViewTop = finalScrollViewNode[0].top;
+						const scrollViewHeight = this.windowHeight - scrollViewTop;
+						let additionHeight = zUtils.convertTextToPx(this.autoHeightAddition);
+						this.$set(this.scrollViewStyle, heightKey, scrollViewHeight + additionHeight - (this
+							.insideMore ? 1 : 0) + 'px');
+						this.$set(this.scrollViewInStyle, heightKey, scrollViewHeight + additionHeight - (this
+							.insideMore ? 1 : 0) + 'px');
+					}
+				} else {
+					this.$delete(this.scrollViewStyle, heightKey);
+					this.$delete(this.scrollViewInStyle, heightKey);
+				}
+			} catch (e) {
+
+			}
+		},
+		//触发更新是否超出页面状态
+		_updateInsideOfPaging() {
+			if (this.insideMore && this.insideOfPaging === true) {
+				setTimeout(() => {
+					this.doLoadMore();
+				}, 200)
+			}
+		},
+		//获取节点尺寸
+		_getNodeClientRect(select, inThis = true, scrollOffset = false) {
+			// #ifdef APP-NVUE
+			select = select.replace('.', '').replace('#', '');
+			const ref = this.$refs[select];
+			if (ref) {
+				return new Promise((resolve, reject) => {
+					weexDom.getComponentRect(ref, option => {
+						if (option && option.result) {
+							resolve([option.size]);
+						} else {
+							resolve(false);
+						}
+					})
+				});
+			} else {
+				return new Promise((resolve, reject) => {
+					resolve(false);
+				});
+			}
+			return;
+			// #endif
+			let res = null;
+			if (inThis) {
+				res = uni.createSelectorQuery().in(this);
+			} else {
+				res = uni.createSelectorQuery();
+			}
+			//#ifdef MP-ALIPAY
+			res = uni.createSelectorQuery();
+			//#endif
+			if (scrollOffset) {
+				res.select(select).scrollOffset();
+			} else {
+				res.select(select).boundingClientRect();
+			}
+			return new Promise((resolve, reject) => {
+				res.exec(data => {
+					if (data && data != '' && data != undefined && data.length) {
+						resolve(data);
+					} else {
+						resolve(false);
+					}
+				});
+			});
+		},
+		//判断touch手势是否要触发
+		_getRefresherTouchDisabled() {
+			let checkOldScrollTop = this.oldScrollTop > 5;
+			const res = this.loading || this.isRefresherInComplete || this.useChatRecordMode || !this
+				.refresherEnabled || !this.useCustomRefresher ||
+				(
+					this.usePageScroll && this
+					.useCustomRefresher && this
+					.pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop);
+			return res;
+		},
+		//本地分页请求
+		_localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) {
+			pageNo = parseInt(pageNo);
+			pageSize = parseInt(pageSize);
+			if (pageNo < 0 || pageSize <= 0) {
+				callQueryResult(callback, []);
+				return;
+			}
+			if (pageNo == 0) {
+				pageNo = 1;
+			}
+			let totalPagingList = [...this.totalLocalPagingList];
+			let pageNoIndex = (pageNo - 1) * pageSize;
+			if (pageNoIndex + pageSize <= totalPagingList.length) {
+				this._localPagingQueryResult(callback, totalPagingList.splice(pageNoIndex, pageSize),
+					localPagingLoadingTime);
+			} else if (pageNoIndex < totalPagingList.length) {
+				this._localPagingQueryResult(callback, totalPagingList.splice(pageNoIndex, totalPagingList.length -
+						pageNoIndex),
+					localPagingLoadingTime);
+			} else {
+				this._localPagingQueryResult(callback, [], localPagingLoadingTime);
+			}
+		},
+		//本地分页请求回调
+		_localPagingQueryResult(callback, arg, localPagingLoadingTime) {
+			setTimeout(() => {
+				callback(arg);
+			}, localPagingLoadingTime)
+		},
+		//判断是否要显示返回顶部按钮
+		_checkShouldShowBackToTop(newVal, oldVal) {
+			if (!this.autoShowBackToTop) {
+				if (this.showBackToTopClass) {
+					this.showBackToTopClass = false;
+				}
+				return;
+			}
+			if (newVal !== oldVal) {
+				if (newVal > this.finalBackToTopThreshold) {
+					if (!this.showBackToTopClass) {
+						this.showBackToTopClass = true;
+						this.lastBackToTopShowTime = new Date().getTime();
+						setTimeout(() => {
+							this.backToTopClass = 'zp-back-to-top zp-back-to-top-show';
+						}, 300)
+					}
+				} else {
+					if (this.showBackToTopClass) {
+						const currentTime = new Date().getTime();
+						let dalayTime = 300;
+						if(currentTime - this.lastBackToTopShowTime < 500){
+							dalayTime = 0;
+						}
+						this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide';
+						setTimeout(() => {
+							this.showBackToTopClass = false;
+						}, dalayTime)
+					}
+				}
+			}
+		},
+		_updatePageScrollTopOrBottomHeight(type) {
+			// #ifndef APP-NVUE
+			if (!this.usePageScroll) {
+				return;
+			}
+			// #endif
+			const node = `.zp-page-scroll-${type}`;
+			const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`;
+			let safeAreaInsetBottomAdd = this.safeAreaInsetBottom;
+			// #ifdef APP-NVUE
+			if (!this.usePageScroll) {
+				safeAreaInsetBottomAdd = false;
+			}
+			// #endif
+			this.$nextTick(() => {
+				let delayTime = 0;
+				// #ifdef MP-BAIDU
+				delayTime = 10;
+				// #endif
+				setTimeout(() => {
+					this._getNodeClientRect(node).then((res) => {
+						if (res) {
+							let pageScrollNodeHeight = res[0].height;
+							if (type === 'bottom') {
+								if (safeAreaInsetBottomAdd) {
+									pageScrollNodeHeight += this.safeAreaBottom;
+								}
+							}
+							this.$set(this.scrollViewStyle, marginText,
+								`${pageScrollNodeHeight}px`);
+						} else if (safeAreaInsetBottomAdd) {
+							this.$set(this.scrollViewStyle, marginText, `${this.safeAreaBottom}px`);
+						}
+					});
+				}, delayTime)
+			})
+		},
+		_updateCustomRefresherHeight() {
+			this._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => {
+				if (res) {
+					this.customRefresherHeight = res[0].height;
+					if (this.customRefresherHeight > 0) {
+						this.showCustomRefresher = true;
+					}
+				} else {
+					this.customRefresherHeight = 0;
+				}
+				if (this.doRefreshAnimateAfter) {
+					this.doRefreshAnimateAfter = false;
+					this._doRefresherRefreshAnimate();
+				}
+			});
+		},
+		//点击了空数据view重新加载按钮
+		_emptyViewReload() {
+			let callbacked = false;
+			this.$emit('emptyViewReload', (reload) => {
+				if (reload === undefined || reload === true) {
+					this.fromEmptyViewReload = true;
+					this.reload();
+				}
+				callbacked = true;
+			});
+			this.$nextTick(() => {
+				if (!callbacked) {
+					this.fromEmptyViewReload = true;
+					this.reload();
+				}
+			})
+		},
+		//获取国际化转换后的文本
+		_getI18nText(key, value) {
+			const dataType = Object.prototype.toString.call(value);
+			if (dataType === '[object Object]') {
+				const nextValue = value[this.finalLanguage];
+				if (nextValue) {
+					return nextValue;
+				}
+			} else if (dataType === '[object String]') {
+				return value;
+			}
+			return zI18n[key][this.finalLanguage];
+		},
+		//修改父view的list
+		_callMyParentList(newVal) {
+			if (this.autowireListName.length) {
+				const myParent = zUtils.getParent(this.$parent);
+				if (myParent && myParent[this.autowireListName]) {
+					myParent[this.autowireListName] = newVal;
+				}
+			}
+		},
+		//调用父view的query
+		_callMyParentQuery(customPageNo = 0, customPageSize = 0) {
+			if (this.autowireQueryName) {
+				if (this.myParentQuery === -1) {
+					const myParent = zUtils.getParent(this.$parent);
+					if (myParent && myParent[this.autowireQueryName]) {
+						this.myParentQuery = myParent[this.autowireQueryName];
+					}
+				}
+				if (this.myParentQuery !== -1) {
+					if (customPageSize > 0) {
+						this.myParentQuery(customPageNo, customPageSize);
+					} else {
+						this.myParentQuery(this.pageNo, this.defaultPageSize);
+					}
+				}
+			}
+		},
+		//清除refresherCompleteTimeout
+		_cleanRefresherCompleteTimeout() {
+			if (this.refresherCompleteTimeout) {
+				clearTimeout(this.refresherCompleteTimeout);
+				this.refresherCompleteTimeout = null;
+			}
+		},
+		//检查complete data的类型
+		_checkDataType(data, success, isLocal) {
+			const dataType = Object.prototype.toString.call(data);
+			if (dataType === '[object Boolean]') {
+				success = data;
+				data = [];
+			} else if (dataType !== '[object Array]') {
+				data = [];
+				let methodStr = isLocal ? 'setLocalPaging' : 'complete';
+				if (dataType !== '[object Undefined]') {
+					if (this.showConsoleError) {
+						zUtils.consoleErr(`${methodStr}参数类型不正确,第一个参数类型必须为Array!`);
+					}
+				}
+			}
+			return {
+				data,
+				success
+			};
+		},
+		// ------------nvue独有的方法----------------
+		// #ifdef APP-NVUE
+		//列表滚动时触发
+		_nOnScroll(e) {
+			const contentOffsetY = e.contentOffset.y;
+			this.$emit('scroll', e);
+			this.nListIsDragging = e.isDragging;
+			this._checkShouldShowBackToTop(-e.contentOffset.y, -e.contentOffset.y - 1);
+		},
+		//下拉刷新刷新中
+		_nOnRrefresh() {
+			this.nRefresherLoading = true;
+			if (this.nShowRefresherReveal) {
+				return;
+			}
+			this.refresherStatus = Enum.RefresherStatus.Loading;
+			this._doRefresherLoad();
+		},
+		//下拉刷新下拉中
+		_nOnPullingdown(e) {
+			if (this.refresherStatus === Enum.RefresherStatus.Loading || (this.isIos && !this.nListIsDragging)) {
+				return;
+			}
+			const viewHeight = e.viewHeight;
+			const pullingDistance = e.pullingDistance;
+			if (pullingDistance >= viewHeight) {
+				this.refresherStatus = Enum.RefresherStatus.PullToRefresh;
+			} else {
+				this.refresherStatus = Enum.RefresherStatus.Default;
+			}
+		},
+		//下拉刷新结束
+		_nRefresherEnd() {
+			this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight);
+			if (!this.nShowBottom) {
+				setTimeout(() => {
+					this.$nextTick(() => {
+						this.nShowBottom = true;
+					})
+				}, 1000);
+			}
+			if (!this.usePageScroll) {
+				this.$refs["n-list"].resetLoadmore();
+			}
+			this.nRefresherLoading = false;
+		},
+		//执行主动触发下拉刷新动画
+		_nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) {
+			this._cleanRefresherCompleteTimeout();
+			if (!this.finalShowRefresherWhenReload) {
+				setTimeout(() => {
+					this.refresherStatus = Enum.RefresherStatus.Default;
+				}, commonDelayTime);
+				return;
+			}
+			const stackCount = this.refresherRevealStackCount;
+			if (height === 0 && checkStack) {
+				this.refresherRevealStackCount--;
+				if (stackCount > 1) {
+					return;
+				}
+				this.refresherStatus = Enum.RefresherStatus.Default;
+			}
+			if (stackCount > 1) {
+				this.refresherStatus = Enum.RefresherStatus.Loading;
+			}
+			const duration = animate ? 120 : 0;
+			weexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], {
+				styles: {
+					height: `${height}px`,
+					transform: `translateY(${translateY}px)`,
+				},
+				duration: duration,
+				timingFunction: 'linear',
+				needLayout: true,
+				delay: 0
+			})
+			setTimeout(() => {
+				if (animate) {
+					this.nShowRefresherReveal = height > 0;
+				}
+			}, duration > 0 ? duration - 100 : 0);
+		},
+		//滚动到底部加载更多
+		_nOnLoadmore() {
+			if (this.nShowRefresherReveal || !this.totalData.length) {
+				return;
+			}
+			if (this.useChatRecordMode) {
+				this.doChatRecordLoadMore();
+			} else {
+				this._onLoadingMore('toBottom');
+			}
+		},
+		//获取nvue waterfall单项配置
+		_getNvueWaterfallSingleConfig(key, defaultValue) {
+			const value = this.nvueWaterfallConfig[key];
+			if (value) {
+				return value;
+			}
+			return defaultValue;
+		}
+		// #endif
+	},
+};

+ 32 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js

@@ -0,0 +1,32 @@
+// [z-paging]使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法
+
+const ZPagingMixin = {
+	onPullDownRefresh() {
+		if (this.isPagingRefNotFound()) {
+			return;
+		}
+		this.$refs.paging.reload();
+	},
+	onPageScroll(e) {
+		if (this.isPagingRefNotFound()) {
+			return;
+		}
+		this.$refs.paging.updatePageScrollTop(e.scrollTop);
+		if (e.scrollTop < 10) {
+			this.$refs.paging.doChatRecordLoadMore();
+		}
+	},
+	onReachBottom() {
+		if (this.isPagingRefNotFound()) {
+			return;
+		}
+		this.$refs.paging.doLoadMore();
+	},
+	methods: {
+		isPagingRefNotFound() {
+			return !this.$refs.paging || this.$refs.paging === undefined;
+		}
+	}
+}
+
+export default ZPagingMixin;

文件差異過大導致無法顯示
+ 8 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-static.js


+ 199 - 0
h5_web/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js

@@ -0,0 +1,199 @@
+// [z-paging]工具类
+
+import zI18n from './z-paging-i18n'
+
+const storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY'
+
+//判断两个数组是否相等
+function arrayIsEqual(arr1, arr2) {
+	if (arr1 === arr2) {
+		return true;
+	}
+	if (arr1.length !== arr2.length) {
+		return false;
+	}
+	for (let i = 0; i < arr1.length; i++) {
+		if (arr1[i] !== arr2[i]) {
+			return false;
+		}
+	}
+	return true;
+}
+
+//获取最终的touch位置
+function getCommonTouch(e) {
+	let touch = null;
+	if (e.touches && e.touches.length) {
+		touch = e.touches[0];
+	} else if (e.changedTouches && e.changedTouches.length) {
+		touch = e.changedTouches[0];
+	} else if (e.datail && e.datail !== {}) {
+		touch = e.datail;
+	} else {
+		return {
+			touchX: 0,
+			touchY: 0
+		}
+	}
+	return {
+		touchX: touch.clientX,
+		touchY: touch.clientY
+	};
+}
+
+//判断当前手势是否在z-paging内触发
+function getTouchFromZPaging(target) {
+	if (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') {
+		var classList = target.classList;
+		if (classList && classList.contains('zp-paging-touch-view')) {
+			return true;
+		} else {
+			return getTouchFromZPaging(target.parentNode);
+		}
+	} else {
+		return false;
+	}
+}
+
+//获取z-paging所在的parent
+function getParent(parent) {
+	if (!parent) {
+		return null;
+	}
+	if (parent.$refs.paging) {
+		return parent;
+	}
+	return getParent(parent.$parent);
+}
+
+//打印错误信息
+function consoleErr(err) {
+	console.error(`[z-paging]${err}`);
+}
+
+//打印警告信息
+function consoleWarn(warn) {
+	console.warn(`[z-paging]${warn}`);
+}
+
+//设置下拉刷新时间
+function setRefesrherTime(time, key) {
+	try {
+		let datas = getRefesrherTime();
+		if (!datas) {
+			datas = {};
+		}
+		datas[key] = time;
+		uni.setStorageSync(storageKey, datas);
+	} catch {}
+}
+
+//获取下拉刷新时间
+function getRefesrherTime() {
+	try {
+		const datas = uni.getStorageSync(storageKey);
+		return datas;
+	} catch {
+		return null;
+	}
+}
+
+//通过下拉刷新标识key获取下拉刷新时间
+function getRefesrherTimeByKey(key) {
+	const datas = getRefesrherTime();
+	if (datas) {
+		const data = datas[key];
+		if (data) {
+			return data;
+		}
+	}
+	return null;
+}
+
+//通过下拉刷新标识key获取下拉刷新时间(格式化之后)
+function getRefesrherFormatTimeByKey(key) {
+	const time = getRefesrherTimeByKey(key);
+	let timeText = zI18n['refresherUpdateTimeNoneText'][zI18n.getLanguage()];
+	if (time) {
+		timeText = _timeFormat(time);
+	}
+	return `${zI18n['refresherUpdateTimeText'][zI18n.getLanguage()]}${timeText}`;
+}
+
+//将文本的px或者rpx转为px的值
+function convertTextToPx(text) {
+	const dataType = Object.prototype.toString.call(text);
+	if (dataType === '[object Number]') {
+		return text;
+	}
+	let isRpx = false;
+	if (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) {
+		text = text.replace('rpx', '').replace('upx', '');
+		isRpx = true;
+	} else if (text.indexOf('px') !== -1) {
+		text = text.replace('px', '');
+	}
+	if (!isNaN(text)) {
+		if (isRpx) {
+			return Number(uni.upx2px(text));
+		}
+		return Number(text);
+	}
+	return 0;
+}
+
+//------------------ 私有方法 ------------------------
+function _timeFormat(time) {
+	const date = new Date(time);
+	const currentDate = new Date();
+	const dateDay = new Date(time).setHours(0, 0, 0, 0);
+	const currentDateDay = new Date().setHours(0, 0, 0, 0);
+	const disTime = dateDay - currentDateDay;
+	let dayStr = '';
+	const timeStr = _dateTimeFormat(date);
+	if (disTime === 0) {
+		dayStr = zI18n['refresherUpdateTimeTodayText'][zI18n.getLanguage()];
+	} else if (disTime === -86400000) {
+		dayStr = zI18n['refresherUpdateTimeYesterdayText'][zI18n.getLanguage()];
+	} else {
+		dayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear());
+	}
+	return `${dayStr} ${timeStr}`;
+}
+
+function _dateDayFormat(date, showYear = true) {
+	const year = date.getFullYear();
+	const month = date.getMonth() + 1;
+	const day = date.getDate();
+	if (showYear) {
+		return `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`;
+	} else {
+		return `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`;
+	}
+}
+
+function _dateTimeFormat(date) {
+	const hour = date.getHours();
+	const minute = date.getMinutes();
+	return `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`;
+}
+
+function _fullZeroToTwo(str) {
+	str = str.toString();
+	if (str.length === 1) {
+		return '0' + str;
+	}
+	return str;
+}
+
+module.exports = {
+	setRefesrherTime,
+	getRefesrherFormatTimeByKey,
+	arrayIsEqual,
+	getCommonTouch,
+	getTouchFromZPaging,
+	getParent,
+	convertTextToPx,
+	consoleErr,
+	consoleWarn
+};

+ 54 - 0
h5_web/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js

@@ -0,0 +1,54 @@
+// [z-paging]使用renderjs在app-vue和h5中对touchmove事件冒泡进行处理
+
+import zUtils from '../js/z-paging-utils'
+var data = {
+	renderScrollTop: 0,
+	renderUsePageScroll: false,
+	renderIsIos: uni.getSystemInfoSync().platform === 'ios',
+	startY: 0,
+	isTouchFromZPaging: false
+}
+
+export default {
+	mounted() {
+		this._handleTouch();
+	},
+	methods: {
+		//接收逻辑层发送的数据
+		renderPropScrollTopChange(newVal, oldVal, ownerVm, vm) {
+			data.renderScrollTop = newVal;
+		},
+		renderPropUsePageScrollChange(newVal, oldVal, ownerVm, vm) {
+			if(newVal !== -1){
+				data.renderUsePageScroll = newVal;
+			}
+		},
+		//拦截处理touch事件
+		_handleTouch() {
+			if (window && !window.$zPagingRenderJsInited) {
+				window.$zPagingRenderJsInited = true;
+				window.addEventListener('touchstart', this._handleTouchstart, {
+					passive: true
+				})
+				window.addEventListener('touchmove', this._handleTouchmove, {
+					passive: false
+				})
+			}
+		},
+		_handleTouchstart(e) {
+			const touch = zUtils.getCommonTouch(e);
+			data.startY = touch.touchY;
+			data.isTouchFromZPaging = zUtils.getTouchFromZPaging(e.target);
+		},
+		_handleTouchmove(e) {
+			const touch = zUtils.getCommonTouch(e);
+			var moveY = touch.touchY - data.startY;
+			if ((data.isTouchFromZPaging && data.renderScrollTop < 1 && moveY > 0) || (data.isTouchFromZPaging && data.renderIsIos && !data.renderUsePageScroll && moveY < 0)) {
+				if (e.cancelable && !e.defaultPrevented) {
+					e.preventDefault();
+				}
+			}
+		},
+
+	}
+};

+ 342 - 0
h5_web/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs

@@ -0,0 +1,342 @@
+// [z-paging]微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能
+
+var currentMoveDistance = 0;
+
+function propObserver(newValue, oldValue, ownerInstance, instance) {
+	var state = ownerInstance.getState();
+	state.currentInstance = instance;
+	var dataset = instance.getDataset();
+	var loading = dataset.loading == true;
+	if (newValue.indexOf('end') != -1) {
+		_setTransform('translateY(0px)', instance, false)
+		state.moveDistance = 0;
+		state.oldMoveDistance = 0;
+		currentMoveDistance = 0;
+	} else if (newValue.indexOf('begin') != -1) {
+		var refresherThreshold = instance.getDataset().refresherthreshold
+		_setTransformValue(refresherThreshold, instance, state, false);
+	}
+}
+
+function touchstart(e, ownerInstance) {
+	var instance = ownerInstance.getState().currentInstance;
+	var state = instance.getState();
+	var dataset = instance.getDataset();
+	var isTouchEnded = state.isTouchEnded;
+	if (_getRefresherTouchDisabled(e, instance, 0)) {
+		return;
+	}
+	state.oldMoveDistance = 0;
+	var touch = _getCommonTouch(e);
+	var loading = _getIsTrue(dataset.loading);
+	state.startY = touch.touchY;
+	state.lastRefresherTouchmove = touch;
+	if (!loading && isTouchEnded) {
+		state.isTouchmoving = false;
+	}
+	state.isTouchEnded = false;
+	ownerInstance.callMethod('_handleRefresherTouchstart', touch);
+}
+
+function touchmove(e, ownerInstance) {
+	var touch = _getCommonTouch(e);
+	var instance = ownerInstance.getState().currentInstance;
+	var dataset = instance.getDataset();
+	var refresherThreshold = dataset.refresherthreshold;
+	var state = instance.getState();
+	if (_getRefresherTouchDisabled(e, instance, 1)) {
+		_handleTouchMovePullingDown(state, ownerInstance, false);
+		return true;
+	}
+	if (!_getAngleIsInRange(e, touch, state, dataset)) {
+		_handleTouchMovePullingDown(state, ownerInstance, false);
+		return true;
+	}
+	var moveDistanceObj = _getMoveDistance(e, instance);
+	var moveDistance = moveDistanceObj.currentMoveDistance;
+	var prevent = moveDistanceObj.isDown;
+	if (moveDistance < 0) {
+		_setTransformValue(0, instance, state, false);
+		_handleTouchMovePullingDown(state, ownerInstance, false);
+		return true;
+	}
+	if (prevent && !state.disabledBounce) {
+		ownerInstance.callMethod('_handleScrollViewDisableBounce', {
+			bounce: false
+		});
+		state.disabledBounce = true;
+		_handleTouchMovePullingDown(state, ownerInstance, prevent);
+		return !prevent;
+	}
+	_setTransformValue(moveDistance, instance, state, false);
+	var oldRefresherStatus = state.refresherStatus;
+	var dataset = instance.getDataset();
+	var oldIsTouchmoving = _getIsTrue(dataset.oldistouchmoving);
+	var isTouchmoving = state.isTouchmoving;
+	if (moveDistance >= refresherThreshold) {
+		state.refresherStatus = 1;
+	} else {
+		state.refresherStatus = 0;
+	}
+	if (!isTouchmoving) {
+		state.isTouchmoving = true;
+		isTouchmoving = true;
+	}
+	if (state.isTouchEnded) {
+		state.isTouchEnded = false;
+	}
+	if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving !=
+		isTouchmoving) {
+		ownerInstance.callMethod('_handleRefresherTouchmove', moveDistance, touch);
+	}
+	_handleTouchMovePullingDown(state, ownerInstance, prevent);
+	return !prevent;
+}
+
+function touchend(e, ownerInstance) {
+	var touch = _getCommonTouch(e);
+	var instance = ownerInstance.getState().currentInstance;
+	var dataset = instance.getDataset();
+	var state = instance.getState();
+	if (_getRefresherTouchDisabled(e, instance, 2)) {
+		return;
+	}
+	state.refresherReachMaxAngle = true;
+	state.hitReachMaxAngleCount = 0;
+	state.disabledBounce = false;
+	state.fixedIsTopHitCount = 0;
+	//ownerInstance.callMethod('_handleScrollViewDisableBounce', {bounce:true});
+	var isTouchmoving = state.isTouchmoving;
+	if (!isTouchmoving) {
+		return;
+	}
+	var oldRefresherStatus = state.refresherStatus;
+	var oldMoveDistance = state.moveDistance;
+	var refresherThreshold = instance.getDataset().refresherthreshold
+	var moveDistance = _getMoveDistance(e, instance).currentMoveDistance;
+	if (!(moveDistance >= refresherThreshold && oldRefresherStatus === 1)) {
+		state.isTouchmoving = false;
+	}
+	ownerInstance.callMethod('_handleRefresherTouchend', moveDistance);
+	state.isTouchEnded = true;
+	if (oldMoveDistance < refresherThreshold) {
+		return;
+	}
+	var animate = false;
+	if (moveDistance >= refresherThreshold) {
+		moveDistance = refresherThreshold;
+		var isIos13 = _getIsTrue(dataset.isios13);
+		if (isIos13) {
+			animate = true;
+		}
+	}
+	_setTransformValue(moveDistance, instance, state, animate);
+}
+
+// #ifdef H5
+function isPC() {
+	var userAgentInfo = navigator.userAgent;
+	var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+	var flag = true;
+	for (var v = 0; v < Agents.length - 1; v++) {
+		if (userAgentInfo.indexOf(Agents[v]) > 0) {
+			flag = false;
+			break;
+		}
+	}
+	return flag;
+}
+
+var movable = false;
+
+function mousedown(e, ins) {
+	if (!isPC()) return;
+	touchstart(e, ins);
+	movable = true;
+}
+
+function mousemove(e, ins) {
+	if (!isPC()) return;
+	if (!movable) return;
+	touchmove(e, ins);
+}
+
+function mouseup(e, ins) {
+	if (!isPC()) return;
+	touchend(e, ins);
+	movable = false;
+}
+
+function mouseleave(e, ins) {
+	if (!isPC()) return;
+	movable = false;
+}
+// #endif
+
+
+function _setTransformValue(value, instance, state, animate) {
+	value = value || 0;
+	if (state.moveDistance == value) {
+		return;
+	}
+	state.moveDistance = value;
+	_setTransform('translateY(' + value + 'px)', instance, animate);
+}
+
+function _setTransform(transform, instance, animate) {
+	if (transform == 'translateY(0px)') {
+		transform = 'none';
+	}
+	instance.requestAnimationFrame(function() {
+		if (animate) {
+			instance.setStyle({
+				'transform': transform,
+				'transition': 'transform .1s linear',
+			})
+		} else {
+			instance.setStyle({
+				'transform': transform
+			})
+		}
+	})
+}
+
+function _getMoveDistance(e, instance) {
+	var state = instance.getState();
+	var refresherThreshold = instance.getDataset().refresherthreshold;
+	var refresherOutRate = instance.getDataset().refresheroutrate;
+	refresherThreshold = parseFloat(refresherThreshold);
+	refresherOutRate = parseFloat(refresherOutRate);
+	var touch = _getCommonTouch(e);
+	var moveDistance = touch.touchY - state.startY;
+	var oldMoveDistance = state.oldMoveDistance || 0;
+	state.oldMoveDistance = moveDistance;
+	var diffDis = moveDistance - oldMoveDistance;
+	if (diffDis > 0) {
+		diffDis = diffDis * 0.85;
+		if (currentMoveDistance > refresherThreshold) {
+			diffDis = diffDis * (1 - refresherOutRate);
+		}
+	}
+	currentMoveDistance += diffDis;
+	if (currentMoveDistance < 0) {
+		currentMoveDistance = 0;
+	}
+	return {
+		currentMoveDistance: currentMoveDistance,
+		isDown: diffDis > 0
+	};
+}
+
+function _getCommonTouch(e) {
+	var touch = null;
+	if (e.touches && e.touches.length) {
+		touch = e.touches[0];
+	} else if (e.changedTouches && e.changedTouches.length) {
+		touch = e.changedTouches[0];
+	} else if (e.datail && e.datail !== {}) {
+		touch = e.datail;
+	} else {
+		touch = e;
+	}
+	return {
+		touchX: touch.clientX,
+		touchY: touch.clientY
+	};
+}
+
+function _getRefresherTouchDisabled(e, instance, processTag) {
+	var dataset = instance.getDataset();
+	var state = instance.getState();
+	var loading = _getIsTrue(dataset.loading);
+	var useChatRecordMode = _getIsTrue(dataset.usechatrecordmode);
+	var refresherEnabled = _getIsTrue(dataset.refresherenabled);
+	var useCustomRefresher = _getIsTrue(dataset.usecustomrefresher);
+	var usePageScroll = _getIsTrue(dataset.usepagescroll);
+	var pageScrollTop = parseFloat(dataset.pagescrolltop);
+	var scrollTop = parseFloat(dataset.scrolltop);
+	var finalScrollTop = usePageScroll ? pageScrollTop : scrollTop;
+	var fixedIsTop = false;
+	var isIos = _getIsTrue(dataset.isios);
+	if (!isIos && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) {
+		fixedIsTop = true;
+	}
+	var fixedIsTopHitCount = state.fixedIsTopHitCount || 0;
+	if (fixedIsTop) {
+		fixedIsTopHitCount++;
+		if (fixedIsTopHitCount <= 3) {
+			fixedIsTop = false;
+		}
+		state.fixedIsTopHitCount = fixedIsTopHitCount;
+	} else {
+		state.fixedIsTopHitCount = 0;
+	}
+	if (!isIos && processTag === 0) {
+		state.startScrollTop = finalScrollTop || 0;
+	}
+	if (!isIos && processTag === 2) {
+		fixedIsTop = true;
+	}
+	var res = loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || ((
+		usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || ((
+		!usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop);
+	return res;
+}
+
+function _getAngleIsInRange(e, touch, state, dataset) {
+	var refresherMaxAngle = dataset.refreshermaxangle;
+	var refresherAecc = _getIsTrue(dataset.refresheraecc);
+	var lastRefresherTouchmove = state.lastRefresherTouchmove;
+	var refresherReachMaxAngle = state.refresherReachMaxAngle;
+	var moveDistance = state.oldMoveDistance;
+	if (!lastRefresherTouchmove) {
+		return true;
+	}
+	if (refresherMaxAngle >= 0 && refresherMaxAngle <= 90 && lastRefresherTouchmove) {
+		if ((!moveDistance || moveDistance < 1) && !refresherAecc && refresherReachMaxAngle != null && !
+			refresherReachMaxAngle) {
+			return false;
+		}
+		var x = Math.abs(touch.touchX - lastRefresherTouchmove.touchX);
+		var y = Math.abs(touch.touchY - lastRefresherTouchmove.touchY);
+		var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
+		if ((x || y) && x > 1) {
+			var angle = Math.asin(y / z) / Math.PI * 180;
+			if (angle < refresherMaxAngle) {
+				var hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0;
+				state.hitReachMaxAngleCount = ++hitReachMaxAngleCount;
+				if (state.hitReachMaxAngleCount > 2) {
+					state.lastRefresherTouchmove = touch;
+					state.refresherReachMaxAngle = false;
+				}
+				return false;
+			}
+		}
+	}
+	state.lastRefresherTouchmove = touch;
+	return true;
+}
+
+function _handleTouchMovePullingDown(state, instance, onPullingDown) {
+	var oldOnPullingDown = state.onPullingDown || false;
+	if (oldOnPullingDown != onPullingDown) {
+		instance.callMethod('_handleWxsOnPullingDown', onPullingDown);
+	}
+	state.onPullingDown = onPullingDown;
+}
+
+function _getIsTrue(value) {
+	value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false;
+	return value == true || value == 'true';
+}
+
+module.exports = {
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	mousedown: mousedown,
+	mousemove: mousemove,
+	mouseup: mouseup,
+	mouseleave: mouseleave,
+	propObserver: propObserver
+}

+ 503 - 0
h5_web/uni_modules/z-paging/components/z-paging/z-paging.vue

@@ -0,0 +1,503 @@
+ <!--                        _             
+  ____     _ __   __ _  __ _(_)_ __   __ _ 
+ |_  /____| '_ \ / _` |/ _` | | '_ \ / _` |
+  / /_____| |_) | (_| | (_| | | | | | (_| |
+ /___|    | .__/ \__,_|\__, |_|_| |_|\__, |
+          |_|          |___/         |___/ 
+V2.0.8
+by ZXLee 2021-10-08
+-- >
+<!-- API文档地址:http://z-paging.com -->
+<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
+<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
+<!-- 反馈QQ群:790460711 -->
+
+<template name="z-paging">
+	<!-- #ifndef APP-NVUE -->
+	<view :class="!usePageScroll&&fixed?'z-paging-content z-paging-content-fixed':'z-paging-content'"
+		:style="[finalPagingStyle]">
+		<!-- 顶部固定的slot -->
+		<slot v-if="!usePageScroll&&$slots.top" name="top"></slot>
+		<view class="zp-page-scroll-top" v-else-if="usePageScroll&&$slots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
+			<slot name="top"></slot>
+		</view>
+		<view :class="{'zp-scroll-view-super':!usePageScroll}" :style="[finalScrollViewStyle]">
+			<scroll-view
+				:class="{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll,'zp-scroll-view-hide-scrollbar':!showScrollbar}"
+				:scroll-top="scrollTop" :scroll-x="scrollX"
+				:scroll-y="scrollable&&!usePageScroll&&scrollEnable&&refresherStatus!==3" :enable-back-to-top="finalEnableBackToTop"
+				:show-scrollbar="showScrollbar" :scroll-with-animation="finalScrollWithAnimation"
+				:scroll-into-view="scrollIntoView" :lower-threshold="finalLowerThreshold" :upper-threshold="5"
+				:refresher-enabled="finalRefresherEnabled&&!useCustomRefresher" :refresher-threshold="finalRefresherThreshold"
+				:refresher-default-style="finalRefresherDefaultStyle" :refresher-background="refresherBackground"
+				:refresher-triggered="finalRefresherTriggered" @scroll="_scroll" @scrolltolower="_onLoadingMore('toBottom')"
+				@scrolltoupper="_scrollToUpper" @refresherrestore="_onRestore" @refresherrefresh="_onRefresh(true)"  
+				>	
+				<view class="zp-paging-touch-view"
+				<!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5 -->
+				@touchstart="_refresherTouchstart" @touchmove="_refresherTouchmove" @touchend="_refresherTouchend" @touchcancel="_refresherTouchend"
+				<!-- #endif -->
+				<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
+				@touchstart="pagingWxs.touchstart" @touchmove="pagingWxs.touchmove" @touchend="pagingWxs.touchend" @touchcancel="pagingWxs.touchend"
+				@mousedown="pagingWxs.mousedown" @mousemove="pagingWxs.mousemove" @mouseup="pagingWxs.mouseup" @mouseleave="pagingWxs.mouseleave"
+				<!-- #endif -->
+				>	
+					<view v-if="finalRefresherFixedBacHeight>0" class="zp-fixed-bac-view" :style="[{'background': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]"></view>
+					<view class="zp-paging-main" :style="[scrollViewInStyle,{'transform': finalRefresherTransform,'transition': refresherTransition}]"
+					<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
+					:change:prop="pagingWxs.propObserver" :prop="wxsPropType"
+					:data-refresherThreshold="finalRefresherThreshold" :data-isIos="isIos" :data-isIos13="isIos13"
+					:data-loading="loading||isRefresherInComplete" :data-useChatRecordMode="useChatRecordMode" 
+					:data-refresherEnabled="refresherEnabled" :data-useCustomRefresher="useCustomRefresher" :data-pageScrollTop="wxsPageScrollTop"
+					:data-scrollTop="wxsScrollTop" :data-refresherMaxAngle="refresherMaxAngle" 
+					:data-refresherAecc="refresherAngleEnableChangeContinued" :data-usePageScroll="usePageScroll"
+					:data-oldIsTouchmoving="isTouchmoving" :data-refresherOutRate="finalRefresherOutRate"
+					<!-- #endif -->
+					<!-- #ifdef APP-VUE || H5 -->
+					:change:renderPropScrollTop="pagingRenderjs.renderPropScrollTopChange" :renderPropScrollTop="renderPropScrollTop"
+					:change:renderPropUsePageScroll="pagingRenderjs.renderPropUsePageScrollChange" :renderPropUsePageScroll="renderPropUsePageScroll"
+					<!-- #endif -->
+					>	
+						<view v-if="showRefresher" class="zp-custom-refresher-view"
+							:style="[{'margin-top': `-${finalRefresherThreshold}px`,'background': refresherBackground}]">
+							<view class="zp-custom-refresher-container" :style="[{'height': `${finalRefresherThreshold}px`,'background': refresherBackground}]">
+								<!-- 下拉刷新view -->
+								<view class="zp-custom-refresher-slot-view">
+									<slot
+									<!-- #ifndef MP-QQ -->
+									:refresherStatus="refresherStatus"
+									<!-- #endif -->
+									name="refresher" />
+								</view>
+								<z-paging-refresh ref="refresh" v-if="!showCustomRefresher" :style="[{'height': `${finalRefresherThreshold}px`}]" :status="refresherStatus"
+									:defaultThemeStyle="finalRefresherThemeStyle" :defaultText="finalRefresherDefaultText"
+									:pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText"
+									:showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey"
+									:imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle"></z-paging-refresh>
+							</view>
+						</view>
+						<view class="zp-paging-container">
+							<slot v-if="useChatRecordMode&&$slots.chatLoading&&loadingStatus!==2&&realTotalData.length"
+								name="chatLoading" />
+							<view v-else-if="useChatRecordMode&&loadingStatus!==2&&realTotalData.length"
+								class="zp-chat-record-loading-container">
+								<text v-if="loadingStatus!==1" @click="_scrollToUpper()"
+									:class="defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'">{{chatRecordLoadingMoreText}}</text>
+								<image v-else :src="base64Flower" class="zp-chat-record-loading-custom-image">
+								</image>
+							</view>
+							<!-- 全屏Loading -->
+							<slot v-if="$slots.loading&&showLoading" name="loading" />
+							<!-- 主体内容 -->
+							<view class="zp-paging-container-content" :style="[finalPagingContentStyle]">
+								<slot />
+								<!-- 上拉加载更多view -->
+								<!-- #ifndef MP-ALIPAY -->
+								<slot v-if="_shouldShowLoadingMore('loadingMoreDefault')" name="loadingMoreDefault" />
+								<slot v-else-if="_shouldShowLoadingMore('loadingMoreLoading')" name="loadingMoreLoading" />
+								<slot v-else-if="_shouldShowLoadingMore('loadingMoreNoMore')" name="loadingMoreNoMore" />
+								<slot v-else-if="_shouldShowLoadingMore('loadingMoreFail')" name="loadingMoreFail" />
+								<z-paging-load-more @click.native="_onLoadingMore('click')"
+									v-else-if="_shouldShowLoadingMore('loadingMoreCustom')" :zConfig="zPagingLoadMoreConfig">
+								</z-paging-load-more>
+								<!-- #endif -->
+								<!-- #ifdef MP-ALIPAY -->
+								<slot v-if="loadingStatus===0&&$slots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode"
+									name="loadingMoreDefault" />
+								<slot v-else-if="loadingStatus===1&&$slots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled"
+									name="loadingMoreLoading" />
+								<slot v-else-if="loadingStatus===2&&$slots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode"
+									name="loadingMoreNoMore" />
+								<slot v-else-if="loadingStatus===3&&$slots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode"
+									name="loadingMoreFail" />
+								<z-paging-load-more @click.native="_onLoadingMore('click')" v-else-if="showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===2&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode" :zConfig="zPagingLoadMoreConfig">
+								</z-paging-load-more>
+								<!-- #endif -->
+							</view>
+							<!-- 空数据图 -->
+							<view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}" v-if="showEmpty">
+								<slot v-if="$slots.empty" name="empty" />
+								<z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload" 
+								:emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle" 
+								:emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" 
+								@reload="_emptyViewReload">
+								</z-paging-empty-view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<!-- 底部固定的slot -->
+		<slot v-if="!usePageScroll&&$slots.bottom" name="bottom"></slot>
+		<view class="zp-page-scroll-bottom" v-else-if="usePageScroll&&$slots.bottom" :style="[{'bottom': `${windowBottom}px`}]">
+			<slot name="bottom"></slot>
+		</view>
+		<!-- 点击返回顶部view -->
+		<view v-if="showBackToTopClass" :class="backToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
+			<slot v-if="$slots.backToTop" name="backToTop" />
+			<image v-else class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop"></image>
+		</view>  
+	</view>
+	<!-- #endif -->
+	<!-- #ifdef APP-NVUE -->
+	<view :is="finalNvueSuperListIs" :style="[finalPagingStyle]" :class="{'z-paging-content-fixed':fixed&&!usePageScroll}">
+		<!-- 顶部固定的slot -->
+		<view ref="zp-page-scroll-top" :is="nViewIs" class="zp-page-scroll-top" v-if="$slots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
+			<slot name="top"></slot>
+		</view>
+		<view ref="n-list" :id="nvueListId" :style="[{'flex': 1},scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" :is="finalNvueListIs" alwaysScrollableVertical="true"
+			:fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar&&!useChatRecordMode" :loadmoreoffset="finalLowerThreshold" :enable-back-to-top="enableBackToTop"
+			:scrollable="scrollable&&scrollEnable&&refresherStatus!==3" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth"
+			:column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap"
+			@loadmore="_nOnLoadmore" @scroll="_nOnScroll">
+			<refresh class="zp-n-refresh" :style="[nvueRefresherStyle]" v-if="finalNvueRefresherEnabled" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh"
+				@pullingdown="_nOnPullingdown">
+				<view ref="zp-n-refresh-container" class="zp-n-refresh-container">
+					<!-- 下拉刷新view -->
+					<slot v-if="zScopedSlots.refresher" :refresherStatus="refresherStatus" name="refresher" />
+					<z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle"
+						:defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText"
+						:showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey"
+						:imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle"></z-paging-refresh>
+				</view>
+			</refresh>
+			<view ref="zp-n-list-top-tag" class="zp-n-list-top-tag" :style="[{height:finalNvueRefresherEnabled&&isIos?'0px':'1px'}]" :is="nViewIs"></view>
+			<view v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`,height:'0px'}]" :is="nViewIs">
+				<slot v-if="zScopedSlots.refresher" :refresherStatus="refresherStatus" name="refresher" />
+				<z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle"
+					:defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" 
+					:showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey"
+					:imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle"></z-paging-refresh>
+			</view>
+			<slot />
+			<!-- 空数据图 -->
+			<view class="z-paging-empty-view" :class="{'z-paging-content-fixed':usePageScroll}" style="flex: 1;" :style="[scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" v-if="showEmpty" :is="nViewIs">
+				<view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}">
+					<slot v-if="$slots.empty" name="empty" />
+					<z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload" 
+					:emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle" 
+					:emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" 
+					@reload="_emptyViewReload">
+					</z-paging-empty-view>
+				</view>
+			</view>
+			<view v-if="!hideNvueBottomTag" ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag" is="header"></view>
+			<!-- 全屏Loading -->
+			<view :class="{'z-paging-content-fixed':usePageScroll}" style="flex: 1;" :style="[scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" v-if="$slots.loading&&showLoading" :is="nViewIs">
+				<slot name="loading" />
+			</view>
+			<!-- 上拉加载更多view -->
+			<view :is="nViewIs" v-if="!refresherOnly&&loadingMoreEnabled">
+				<view v-if="useChatRecordMode">
+					<view v-if="loadingStatus!==2&&realTotalData.length">
+						<slot v-if="$slots.chatLoading"
+							name="chatLoading" />
+						<view v-else class="zp-chat-record-loading-container">
+							<text v-if="loadingStatus!==1" @click="_scrollToUpper()"
+								:class="defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'">{{chatRecordLoadingMoreText}}</text>
+							<view>
+								<loading-indicator v-if="loadingStatus===1" :animating="true"
+									class="zp-line-loading-image">
+								</loading-indicator>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:'80rpx'}:{}">
+					<slot v-if="_shouldShowLoadingMore('loadingMoreDefault')" name="loadingMoreDefault" />
+					<slot v-else-if="_shouldShowLoadingMore('loadingMoreLoading')" name="loadingMoreLoading" />
+					<slot v-else-if="_shouldShowLoadingMore('loadingMoreNoMore')" name="loadingMoreNoMore" />
+					<slot v-else-if="_shouldShowLoadingMore('loadingMoreFail')" name="loadingMoreFail" />
+					<z-paging-load-more @click.native="_onLoadingMore('click')"
+						v-else-if="_shouldShowLoadingMore('loadingMoreCustom')" :zConfig="zPagingLoadMoreConfig">
+					</z-paging-load-more>
+				</view>
+			</view>
+		</view>
+		<!-- 底部固定的slot -->
+		<slot name="bottom"></slot>
+		<!-- 点击返回顶部view -->
+		<view v-if="showBackToTopClass" :class="backToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
+			<slot v-if="$slots.backToTop" name="backToTop" />
+			<image v-else class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop"></image>
+		</view>
+	</view>
+	<!-- #endif -->
+</template>
+<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
+<script
+    src="./wxs/z-paging-wxs.wxs"
+    module="pagingWxs"
+    lang="wxs"
+></script>
+<!-- #endif -->
+<script module="pagingRenderjs" lang="renderjs">
+	import pagingRenderjs from './wxs/z-paging-renderjs.js';
+	/**
+	 * z-paging 分页组件
+	 * @description 【uni-app自动分页器】超简单,低耦合!仅需两步轻松完成完整分页逻辑(下拉刷新、上拉加载更多),分页全自动处理。支持自定义加载更多的文字或整个view,自定义下拉刷新样式,自动管理空数据view等。
+	 * @tutorial http://z-paging.com
+	 * @property {Number|String} default-page-no 自定义pageNo,默认为1
+	 * @property {Number|String} default-page-size 自定义pageSize,默认为10
+	 * @property {Number|Object} data-key 为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效
+	 * @property {String} autowire-list-name 【极简写法】自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值(z-paging标签必须设置`ref="paging"`)
+	 * @property {String} autowire-query-name 【极简写法】自动注入的query名,可自动调用父view(包含ref="paging")中的query方法(z-paging标签必须设置`ref="paging"`)
+	 * @property {Number|String} delay 调用complete后延迟处理的时间,单位为毫秒
+	 * @property {String} language i18n国际化设置语言,支持简体中文(zh-cn)、繁体中文(zh-hant-cn)和英文(en)
+	 * @property {Boolean} follow-system-language i18n国际化默认是否跟随系统语言,默认为是
+	 * @property {Object} paging-style 设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替
+	 * @property {String} height z-paging的高度,优先级低于pagingStyle中设置的height,传字符串,如100px、100rpx、100%
+	 * @property {String} width z-paging的宽度,优先级低于pagingStyle中设置的width,传字符串,如100px、100rpx、100%
+	 * @property {String} bg-color z-paging的背景色,优先级低于pagingStyle中设置的background-color。传字符串,如"#ffffff"
+	 * @property {Object} paging-content-style 设置z-paging的容器(插槽的父view)的style
+	 * @property {Boolean} auto-height z-paging是否自动高度,若自动高度则会自动铺满屏幕,默认为否
+	 * @property {Number|String} auto-height-addition z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,默认为px,若需要减少高度,请传负数
+	 * @property {String} default-theme-style loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black
+	 * @property {String} refresher-theme-style 下拉刷新的主题样式,支持black,white,默认black
+	 * @property {Object} refresher-img-style 自定义下拉刷新中左侧图标的样式
+	 * @property {Object} refresher-title-style 自定义下拉刷新中右侧状态描述文字的样式
+	 * @property {Object} refresher-update-time-style 自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效)
+	 * @property {String} loading-more-theme-style 底部加载更多的主题样式,支持black,white,默认black
+	 * @property {Boolean} refresher-only 是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否
+	 * @property {Number|String} refresher-complete-delay 自定义下拉刷新结束以后延迟回弹的时间,单位为毫秒,默认为0
+	 * @property {Number|String} refresher-complete-duration 自定义下拉刷新结束回弹动画时间,单位为毫秒,默认为300毫秒(refresherEndBounceEnabled为false时,refresherCompleteDuration为设定值的1/3),nvue无效
+	 * @property {Boolean} use-page-scroll 使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐
+	 * @property {Boolean} fixed z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为否(当使用内置scroll-view滚动时有效)
+	 * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区域适配,默认为否
+	 * @property {Boolean} scrollable 是否可以滚动,使用内置scroll-view和nvue时有效,默认为是
+	 * @property {Boolean} auto [z-paging]mounted后是否自动调用reload方法(mounted后自动调用接口),默认为是
+	 * @property {Boolean} auto-scroll-to-top-when-reload reload时是否自动滚动到顶部,默认为是
+	 * @property {Boolean} auto-clean-list-when-reload reload时是否立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的
+	 * @property {Boolean} show-refresher-when-reload 调用reload方法时是否自动显示下拉刷新view,默认为否
+	 * @property {Boolean} show-loading-more-when-reload 调用reload方法时自动显示加载更多view,且为加载中状态(仅初始设置有效,不可动态修改)
+	 * @property {Boolean} refresher-update-time-key 如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串
+	 * @property {Boolean} use-custom-refresher 是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新
+	 * @property {Number|String} refresher-fps 自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题
+	 * @property {Number|String} refresher-max-angle 自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发
+	 * @property {Boolean} refresher-angle-enable-change-continued 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否
+	 * @property {String|Object} refresher-default-text 自定义下拉刷新默认状态下的文字
+	 * @property {String|Object} refresher-pulling-text 自定义下拉刷新松手立即刷新状态下的文字
+	 * @property {String|Object} refresher-refreshing-text 自定义下拉刷新刷新中状态下的文字
+	 * @property {String|Object} refresher-complete-text 自定义下拉刷新刷新结束状态下的文字
+	 * @property {Boolean} refresher-end-bounce-enabled 是否开启自定义下拉刷新刷新结束回弹效果,默认为是
+	 * @property {Object} loading-more-custom-style 自定义底部加载更多样式
+	 * @property {Object} loading-more-loading-icon-custom-style 自定义底部加载更多加载中动画样式
+	 * @property {String} loading-more-loading-icon-type 自定义底部加载更多加载中动画图标类型,可选circle或flower,默认为circle
+	 * @property {String} loading-more-loading-icon-custom-image 自定义底部加载更多加载中动画图标图片
+	 * @property {Boolean} loading-more-loading-animated 底部加载更多加载中view是否展示旋转动画(loading-more-loading-icon-custom-image有值时有效,nvue无效)
+	 * @property {Boolean} loading-more-enabled 是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是
+	 * @property {Boolean} to-bottom-loading-more-enabled 是否启用滑动到底部加载更多数据
+	 * @property {String|Object} loading-more-default-text 滑动到底部"默认"文字,默认为【点击加载更多】
+	 * @property {String|Object} loading-more-loading-text 滑动到底部"加载中"文字,默认为【正在加载...】
+	 * @property {String|Object} loading-more-no-more-text 滑动到底部"没有更多"文字,默认为【没有更多了】
+	 * @property {String|Object} loading-more-fail-text 滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】
+	 * @property {Boolean} hide-loading-more-when-no-more-and-inside-of-paging 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为是
+	 * @property {Boolean} hide-loading-more-when-no-more-and-inside-of-paging 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为是
+	 * @property {Boolean} inside-more 当分页未满一屏时,是否自动加载更多(nvue无效),默认为否
+	 * @property {Boolean} show-default-loading-more-text 是否显示默认的加载更多text,默认为是
+	 * @property {Boolean} show-loading-more-no-more-line 是否显示没有更多数据的分割线,默认为是
+	 * @property {Object} loading-more-no-more-line-custom-style 自定义底部没有更多数据的分割线样式
+	 * @property {Boolean} hide-empty-view 是否强制隐藏空数据图,默认为否
+	 * @property {String|Object} empty-view-text 空数据图描述文字,默认为“没有数据哦~”
+	 * @property {Boolean} show-empty-view-reload 是否显示空数据图重新加载按钮(无数据时),默认为否
+	 * @property {Boolean} show-empty-view-reload-when-error 加载失败时是否显示空数据图重新加载按钮,默认为是
+	 * @property {String} empty-view-img 空数据图图片,默认使用z-paging内置的图片
+	 * @property {String|Object} empty-view-reload-text 空数据图点击重新加载文字
+	 * @property {String|Object} empty-view-error-text 空数据图“加载失败”描述文字
+	 * @property {String} empty-view-error-img 空数据图“加载失败”图片,默认使用z-paging内置的图片(建议使用绝对路径)
+	 * @property {Object} empty-view-style 空数据图样式
+	 * @property {Object} empty-view-img-style 空数据图img样式
+	 * @property {Object} empty-view-title-style 空数据图描述文字样式
+	 * @property {Object} empty-view-reload-style 空数据图重新加载按钮样式
+	 * @property {Boolean} empty-view-fixed 空数据图片是否铺满z-paging,默认为是。若设置为否,则为填充满z-paging的剩余部分
+	 * @property {Boolean} empty-view-center 空数据图片是否垂直居中,默认为是。emptyViewFixed为false时有效
+	 * @property {Boolean} auto-hide-empty-view-when-loading 加载中时是否自动隐藏空数据图,默认为是
+	 * @property {Boolean} auto-hide-loading-after-first-loaded 第一次加载后是否自动隐藏loading slot,默认为是
+	 * @property {Boolean} auto-show-back-to-top 自动显示点击返回顶部按钮,默认为否
+	 * @property {Number|String} back-to-top-threshold 点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx
+	 * @property {String} back-to-top-img 点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片
+	 * @property {Boolean} back-to-top-with-animate 点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是
+	 * @property {Number|String} back-to-top-bottom 点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx
+	 * @property {Object} back-to-top-style 点击返回顶部按钮的自定义样式
+	 * @property {Boolean} show-scrollbar 控制是否出现滚动条,默认为是
+	 * @property {Boolean} scroll-x 是否允许横向滚动,默认为否
+	 * @property {Boolean} scroll-to-top-bounce-enabled iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。
+	 * @property {Boolean} scroll-with-animation 控制是否出现滚动条,默认为否
+	 * @property {String} scroll-into-view 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
+	 * @property {Number|String} lower-threshold 距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx
+	 * @property {Boolean} enable-back-to-top iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是
+	 * @property {Boolean} refresher-enabled 是否开启自定义下拉刷新,默认为是
+	 * @property {Number|String} refresher-threshold 设置自定义下拉刷新阈值,默认为80rpx
+	 * @property {String} refresher-default-style 设置自定义下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black
+	 * @property {String} refresher-background 设置自定义下拉刷新区域背景颜色
+	 * @property {Boolean} show-refresher-update-time 是否显示上次下拉刷新更新时间,默认为否
+	 * @property {String} refresher-update-time-key 上次下拉刷新更新时间的key,用于区别不同的上次更新时间
+	 * @property {Number|String} local-paging-loading-time 本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒
+	 * @property {Boolean} use-chat-record-mode 使用聊天记录模式,默认为否
+	 * @property {Number} top-z-index slot="top"的view的z-index,仅使用页面滚动时有效,默认为99
+	 * @property {Number} super-content-z-index z-paging内容容器父view的z-index,默认为1
+	 * @property {Number} content-z-index z-paging内容容器部分的z-index,默认为10
+	 * @property {Number} empty-view-z-index 空数据view的z-index,默认为9
+	 * @property {Boolean} auto-full-height 使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为是
+	 * @property {Boolean} concat 自动拼接complete中传过来的数组(使用聊天记录模式时无效),默认为是
+	 * @property {String} nvue-list-is nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list
+	 * @property {Object} nvue-waterfall-config nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https://uniapp.dcloud.io/component/waterfall
+	 * @property {Boolean} nvue-bounce nvue 控制是否回弹效果,iOS不支持动态修改(若禁用回弹效果,下拉刷新将失效),默认为是
+	 * @property {Boolean} nvue-fast-scroll nvue中通过代码滚动到顶部/底部时,是否加快动画效果(无滚动动画时无效),默认为否
+	 * @property {String} nvue-list-id nvue中list的id
+	 * @property {Object} nvue-refresher-style nvue中refresh组件的样式
+	 * @property {Boolean} hide-nvue-bottom-tag 是否隐藏nvue列表底部的tagView,此view用于标识滚动到底部位置,若隐藏则滚动到底部功能将失效,在nvue中实现吸顶+swiper功能时需将最外层z-paging的此属性设置为true。默认为否
+	 * @property {Boolean} show-console-error 是否将错误信息打印至控制台,默认为是
+	 * @event {Function} query 下拉刷新或滚动到底部时会自动触发此方法。z-paging加载时也会触发(若要禁止,请设置:auto="false")。pageNo和pageSize会自动计算好,直接传给服务器即可。
+	 * @event {Function} refresherStatusChange 自定义下拉刷新状态改变(use-custom-refresher为true时生效)【注:通过`:refresher-status.sync`绑定当前data中的指定变量亦可】
+	 * @event {Function} loadingStatusChange 上拉加载更多状态改变
+	 * @event {Function} refresherTouchstart 自定义下拉刷新下拉开始(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
+	 * @event {Function} refresherTouchmove 自定义下拉刷新下拉中开始(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
+	 * @event {Function} refresherTouchend 自定义下拉刷新下拉结束(use-custom-refresher为true时生效)【注:当需要更细致定制自定义下拉刷新时使用,如果只需监听下拉刷新各个状态改变,使用`refresherStatusChange`即可】
+	 * @event {Function} onRefresh 自定义下拉刷新被触发
+	 * @event {Function} onRestore 自定义下拉刷新被复位
+	 * @event {Function} scroll `z-paging`内置的scroll-view滚动时触发
+	 * @event {Function} scrollTopChange scrollTop改变时触发,使用点击返回顶部时需要获取scrollTop时可使用此事件【注:通过`:scroll-top.sync`绑定当前data中的指定变量亦可】(@scrolltoupper触发时,也会自动触发此方法,且scrollTop=0)
+	 * @event {Function} scrolltolower `z-paging`内置的scroll-view滚动底部时触发
+	 * @event {Function} scrolltoupper `z-paging`内置的scroll-view滚动顶部时触发
+	 * @event {Function} listChange 分页渲染的数组改变时触发
+	 * @event {Function} emptyViewReload 点击了空数据图中的重新加载按钮
+	 * @example <z-paging ref="paging" v-model="dataList" @query="queryList"></z-paging>
+	 */
+	export default {
+		name:"z-paging",
+		// #ifdef APP-VUE || H5
+		mixins: [pagingRenderjs],
+		// #endif
+		// 以下代码是为了欺骗编译器使props的代码提示功能生效,不会被编译到项目中
+		// #ifdef QUICKAPP-WEBVIEW-UNION
+		props: {
+			defaultPageNo: {type: [Number, String]},
+			defaultPageSize: {type: [Number, String]},
+			dataKey: {type: [Number, Object]},
+			autowireListName: {type: String},
+			autowireQueryName: {type: String},
+			delay: {type: [Number, String]},
+			language: {type: String},
+			followSystemLanguage: {type: Boolean},
+			pagingStyle: {type: Object},
+			height: {type: String},
+			width: {type: String},
+			bgColor: {type: String},
+			pagingContentStyle: {type: Object},
+			autoHeight: {type: Boolean},
+			autoHeightAddition: {type: [Number, String]},
+			defaultThemeStyle: {type: String},
+			refresherThemeStyle: {type: String},
+			refresherImgStyle: {type: Object},
+			refresherTitleStyle: {type: Object},
+			refresherUpdateTimeStyle: {type: Object},
+			loadingMoreThemeStyle: {type: String},
+			refresherOnly: {type: Boolean},
+			refresherCompleteDelay: {type: [Number, String]},
+			refresherCompleteDuration: {type: [Number, String]},
+			usePageScroll: {type: Boolean},
+			fixed: {type: Boolean},
+			safeAreaInsetBottom: {type: Boolean},
+			scrollable: {type: Boolean},
+			mountedAutoCallReload: {type: Boolean},
+			auto: {type: Boolean},
+			autoScrollToTopWhenReload: {type: Boolean},
+			autoCleanListWhenReload: {type: Boolean},
+			showRefresherWhenReload: {type: Boolean},
+			showLoadingMoreWhenReload: {type: Boolean},
+			useCustomRefresher: {type: Boolean},
+			refresherFps: {type: [Number, String]},
+			refresherMaxAngle: {type: [Number, String]},
+			refresherAngleEnableChangeContinued: {type: Boolean},
+			refresherDefaultText: {type: [String, Object]},
+			refresherPullingText: {type: [String, Object]},
+			refresherRefreshingText: {type: [String, Object]},
+			refresherCompleteText: {type: [String, Object]},
+			refresherEndBounceEnabled: {type: Boolean},
+			loadingMoreCustomStyle: {type: Object},
+			loadingMoreLoadingIconCustomStyle: {type: Object},
+			loadingMoreLoadingIconType: {type: String},
+			loadingMoreLoadingIconCustomImage: {type: String},
+			loadingMoreLoadingAnimated: {type: Boolean},
+			loadingMoreEnabled: {type: Boolean},
+			toBottomLoadingMoreEnabled: {type: Boolean},
+			loadingMoreDefaultText: {type: [String, Object]},
+			loadingMoreLoadingText: {type: [String, Object]},
+			loadingMoreNoMoreText: {type: [String, Object]},
+			loadingMoreFailText: {type: [String, Object]},
+			hideLoadingMoreWhenNoMoreAndInsideOfPaging: {type: Boolean},
+			hideLoadingMoreWhenNoMoreByLimit: {type: Number},
+			insideMore: {type: Boolean},
+			showDefaultLoadingMoreText: {type: Boolean},
+			showLoadingMoreNoMoreView: {type: Boolean},
+			showLoadingMoreNoMoreLine: {type: Boolean},
+			loadingMoreNoMoreLineCustomStyle: {type: Object},
+			hideEmptyView: {type: Boolean},
+			emptyViewText: {type: [String, Object]},
+			showEmptyViewReload: {type: Boolean},
+			showEmptyViewReloadWhenError: {type: Boolean},
+			emptyViewReloadText: {type: [String, Object]},
+			emptyViewImg: {type: String},
+			emptyViewErrorText: {type: [String, Object]},
+			emptyViewErrorImg: {type: String},
+			emptyViewStyle: {type: Object},
+			emptyViewImgStyle: {type: Object},
+			emptyViewTitleStyle: {type: Object},
+			emptyViewReloadStyle: {type: Object},
+			emptyViewFixed: {type: Boolean},
+			emptyViewCenter: {type: Boolean},
+			autoHideEmptyViewWhenLoading: {type: Boolean},
+			autoHideLoadingAfterFirstLoaded: {type: Boolean},
+			autoShowBackToTop: {type: Boolean},
+			backToTopThreshold: {type: [Number, String]},
+			backToTopImg: {type: String},
+			backToTopWithAnimate: {type: Boolean},
+			backToTopBottom: {type: [Number, String]},
+			backToTopStyle: {type: Object},
+			showScrollbar: {type: Boolean},
+			scrollX: {type: Boolean},
+			scrollToTopBounceEnabled: {type: Boolean},
+			scrollToBottomBounceEnabled: {type: Boolean},
+			scrollWithAnimation: {type: Boolean},
+			scrollIntoView: {type: String},
+			lowerThreshold: {type: [Number, String]},
+			enableBackToTop: {type: Boolean},
+			refresherEnabled: {type: Boolean},
+			refresherThreshold: {type: [Number, String]},
+			refresherDefaultStyle: {type: String},
+			refresherBackground: {type: String},
+			refresherFixedBackground: {type: String},
+			refresherFixedBacHeight: {type: [Number, String]},
+			refresherOutRate: {type: Number},
+			showRefresherUpdateTime: {type: Boolean},
+			refresherUpdateTimeKey: {type: String},
+			localPagingLoadingTime: {type: [Number, String]},
+			useChatRecordMode: {type: Boolean},
+			topZIndex: {type: Number},
+			superContentZIndex: {type: Number},
+			contentZIndex: {type: Number},
+			emptyViewZIndex: {type: Number},
+			autoFullHeight: {type: Boolean},
+			concat: {type: Boolean},
+			nvueListIs: {type: String},
+			nvueWaterfallConfig: {type: Object},
+			nvueBounce: {type: Boolean},
+			nvueFastScroll: {type: Boolean},
+			nvueListId: {type: String},
+			nvueRefresherStyle: {type: Object},
+			hideNvueBottomTag: {type: Boolean},
+			showConsoleError: {type: Boolean},
+			value: {type: Array}
+		}
+		// #endif
+	}
+</script>
+<script
+    src="./js/z-paging-main.js"></script>
+	
+<style scoped>
+	@import "./css/z-paging-main.css";
+	@import "./css/z-paging-static.css";
+</style>

+ 84 - 0
h5_web/uni_modules/z-paging/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "z-paging",
+  "displayName": "【z-paging下拉刷新、上拉加载更多】超简单、低耦合!仅需两步轻松完成完整分页逻辑",
+  "version": "2.0.8",
+  "description": "【支持nvue,使用wxs+renderjs实现】全平台兼容,支持自定义下拉刷新、上拉加载更多,支持自动管理空数据图、点击返回顶部,支持聊天分页、本地分页,支持展示最后更新时间,支持国际化等等",
+  "keywords": [
+    "下拉刷新",
+    "上拉加载",
+    "分页器",
+    "nvue",
+    "wxs"
+],
+  "repository": "https://github.com/SmileZXLee/uni-z-paging",
+  "engines": {
+    "HBuilderX": "^3.0.7"
+  },
+  "dcloudext": {
+    "category": [
+        "前端组件",
+        "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": "393727164"
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "u"
+        }
+      }
+    }
+  }
+}

+ 46 - 0
h5_web/uni_modules/z-paging/readme.md

@@ -0,0 +1,46 @@
+# z-paging
+
+
+***  
+
+## 【注意】由V1.9.0起,fixed属性默认值为true,z-paging默认会铺满屏幕。老项目更新请注意,使用侧滑滚动切换选项卡或需要局部使用z-paging请设置:fixed="false"。如果您希望fixed属性默认为false,请参考文档:z-paging.com,将fixed默认值设置为false。
+*** 
+
+### API文档地址:[https://z-paging.com](http://z-paging.com)
+### 备用API文档地址:[https://www.zxlee.cn/z-paging/index.html](https://www.zxlee.cn/z-paging/index.html) 
+
+***  
+### 功能&特点
+* 【配置简单】仅需两步(绑定网络请求方法、绑定分页结果数组)轻松完成完整下拉刷新,上拉加载更多功能。
+* 【低耦合,低侵入】分页自动管理。在page中无需处理任何分页相关逻辑,无需在data中定义任何分页相关变量,全由z-paging内部处理。
+* 【超灵活,支持各种类型自定义】支持自定义下拉刷新,自定义上拉加载更多,自带自定义下拉刷新效果,及其他数十种自定义属性。
+* 【功能丰富】支持国际化,支持自定义且自动管理空数据图,支持主题模式切换,支持本地分页,支持聊天分页模式,支持展示最后更新时间,支持吸顶效果,支持内部scroll-view滚动与页面滚动,支持一键滚动到顶部等诸多功能。
+* 【多平台兼容,细致,流畅】支持nvue,支持h5、app及各家小程序;在app-vue、h5、微信小程序、QQ小程序上使用wxs实现下拉刷新,大幅提升性能。多处细节优化,给您精致流畅的体验。
+
+*** 
+### 反馈qq群(点击加群):[790460711](https://jq.qq.com/?_wv=1027&k=vU2fKZZH)
+ 
+*** 
+#### 关于自动引入组件
+
+> `z-paging` 支持[easycom组件规范](https://uniapp.dcloud.io/component/README?id=easycom组件规范),无需引用和注册组件即可直接使用,在正在运行的项目中导入`z-paging`可能会提示:`Unknown custom element:<z-paging> - did you register the component corrently?... `,此时需要重新运行项目即可。
+
+### 预览
+
+***
+
+|                 自定义下拉刷新效果+分页演示                  |                      吸顶效果+分页演示                       |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+| ![](http://www.zxlee.cn/github/uni-z-paging/uni-z-paging.gif) | ![](http://www.zxlee.cn/github/uni-z-paging/uni-z-paging2.gif) |
+
+|                   滑动切换选项卡+分页演示                    |                    聊天记录模式+分页演示                     |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+| ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo3.gif) | ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo4.gif) |
+
+### 在线demo体验地址:
+
+* [http://www.zxlee.cn/github/uni-z-paging/demo/index.html](http://www.zxlee.cn/github/uni-z-paging/demo/index.html)
+
+| 扫码体验                                                     |
+| ------------------------------------------------------------ |
+| ![](http://www.zxlee.cn/github/uni-z-paging/z-paging-demo.png) |

部分文件因文件數量過多而無法顯示