liujiaxin 4 mēneši atpakaļ
vecāks
revīzija
91ed44f6e2
100 mainītis faili ar 4470 papildinājumiem un 33695 dzēšanām
  1. 2 2
      common/request.js
  2. 1 1
      core/config/defaultConfig.js
  3. 0 275
      node_modules/mescroll-uni/README.md
  4. 0 55
      node_modules/mescroll-uni/components/mescroll-down.css
  5. 0 47
      node_modules/mescroll-uni/components/mescroll-down.vue
  6. 0 118
      node_modules/mescroll-uni/components/mescroll-empty.vue
  7. 0 83
      node_modules/mescroll-uni/components/mescroll-top.vue
  8. 0 47
      node_modules/mescroll-uni/components/mescroll-up.css
  9. 0 19
      node_modules/mescroll-uni/mescroll-body.css
  10. 0 15
      node_modules/mescroll-uni/mescroll-i18n.js
  11. 0 57
      node_modules/mescroll-uni/mescroll-mixins.js
  12. 0 36
      node_modules/mescroll-uni/mescroll-uni.css
  13. 0 799
      node_modules/mescroll-uni/mescroll-uni.js
  14. 0 47
      node_modules/mescroll-uni/mixins/mescroll-comp.js
  15. 0 66
      node_modules/mescroll-uni/mixins/mescroll-more-item.js
  16. 0 74
      node_modules/mescroll-uni/mixins/mescroll-more.js
  17. 0 41
      node_modules/mescroll-uni/package.json
  18. 0 109
      node_modules/mescroll-uni/wxs/mixins.js
  19. 0 92
      node_modules/mescroll-uni/wxs/renderjs.js
  20. 0 268
      node_modules/mescroll-uni/wxs/wxs.wxs
  21. 565 399
      pages/home/living.vue
  22. 2141 0
      pages_no/living.vue
  23. 1 2
      pages_shop/goods.vue
  24. 178 333
      pages_shop/store.vue
  25. 1 1
      pages_shop/storeOrderRefundDetails.vue
  26. 12 12
      pages_shop/storeOrderRefundList.vue
  27. 276 261
      pages_user/integralGoodsList.vue
  28. 0 8
      uni_modules/mescroll-uni/changelog.md
  29. 2 2
      uni_modules/mescroll-uni/components/mescroll-body/mescroll-body.vue
  30. 47 0
      uni_modules/mescroll-uni/components/mescroll-diy/beibei/components/mescroll-down.css
  31. 39 0
      uni_modules/mescroll-uni/components/mescroll-diy/beibei/components/mescroll-down.vue
  32. 47 90
      uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-body.vue
  33. 49 0
      uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-uni-option.js
  34. 45 88
      uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-uni.vue
  35. 44 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-down.css
  36. 53 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-down.vue
  37. 32 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-up.css
  38. 4 3
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-up.vue
  39. 380 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-body.vue
  40. 0 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-uni-option.js
  41. 462 0
      uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-uni.vue
  42. 3 3
      uni_modules/mescroll-uni/components/mescroll-empty/mescroll-empty.vue
  43. 13 29
      uni_modules/mescroll-uni/components/mescroll-uni/components/mescroll-top.vue
  44. 11 0
      uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js
  45. 6 9
      uni_modules/mescroll-uni/components/mescroll-uni/mescroll-uni.vue
  46. 9 0
      uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more-item.js
  47. 2 5
      uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more.js
  48. 1 1
      uni_modules/mescroll-uni/components/mescroll-uni/wxs/renderjs.js
  49. 0 1
      uni_modules/mescroll-uni/components/mescroll-uni/wxs/wxs.wxs
  50. 0 66
      uni_modules/mescroll-uni/hooks/useMescroll.js
  51. 0 56
      uni_modules/mescroll-uni/hooks/useMescrollComp.js
  52. 0 69
      uni_modules/mescroll-uni/hooks/useMescrollMore.js
  53. 15 11
      uni_modules/mescroll-uni/package.json
  54. 0 45
      uni_modules/mescroll-uni/readme.md
  55. 1 23
      unpackage/dist/dev/mp-weixin/api/home.js
  56. 1 7
      unpackage/dist/dev/mp-weixin/api/list.js
  57. 0 88
      unpackage/dist/dev/mp-weixin/api/live.js
  58. 1 35
      unpackage/dist/dev/mp-weixin/api/login.js
  59. 0 152
      unpackage/dist/dev/mp-weixin/api/order.js
  60. 1 61
      unpackage/dist/dev/mp-weixin/api/pay.js
  61. 1 116
      unpackage/dist/dev/mp-weixin/app.js
  62. 0 22198
      unpackage/dist/dev/mp-weixin/app.wxss
  63. 0 93
      unpackage/dist/dev/mp-weixin/common/assets.js
  64. 1 69
      unpackage/dist/dev/mp-weixin/common/request.js
  65. 1 1768
      unpackage/dist/dev/mp-weixin/common/vendor.js
  66. 1 20
      unpackage/dist/dev/mp-weixin/components/Loading.js
  67. 1 104
      unpackage/dist/dev/mp-weixin/components/evan-switch/evan-switch.js
  68. 1 53
      unpackage/dist/dev/mp-weixin/components/evan-switch/evan-switch.wxss
  69. 0 198
      unpackage/dist/dev/mp-weixin/components/px-popup-bottom/px-popup-bottom.js
  70. 1 119
      unpackage/dist/dev/mp-weixin/components/px-popup-bottom/px-popup-bottom.wxss
  71. 1 33
      unpackage/dist/dev/mp-weixin/core/app.js
  72. 1 11
      unpackage/dist/dev/mp-weixin/core/bootstrap.js
  73. 1 8
      unpackage/dist/dev/mp-weixin/core/config/defaultConfig.js
  74. 1 21
      unpackage/dist/dev/mp-weixin/core/config/index.js
  75. 1 13
      unpackage/dist/dev/mp-weixin/core/mixins/app.js
  76. 1 37
      unpackage/dist/dev/mp-weixin/core/mixins/share.js
  77. 1 7
      unpackage/dist/dev/mp-weixin/core/platform.js
  78. 1 88
      unpackage/dist/dev/mp-weixin/pages/auth/findpass.js
  79. 1 164
      unpackage/dist/dev/mp-weixin/pages/auth/findpass.wxss
  80. 1 88
      unpackage/dist/dev/mp-weixin/pages/auth/h5WxLogin.js
  81. 1 104
      unpackage/dist/dev/mp-weixin/pages/auth/h5WxLogin.wxss
  82. 0 456
      unpackage/dist/dev/mp-weixin/pages/auth/login.js
  83. 0 113
      unpackage/dist/dev/mp-weixin/pages/auth/login.wxss
  84. 1 103
      unpackage/dist/dev/mp-weixin/pages/auth/loginIndex.js
  85. 0 156
      unpackage/dist/dev/mp-weixin/pages/auth/loginIndex.wxss
  86. 0 150
      unpackage/dist/dev/mp-weixin/pages/auth/register.js
  87. 0 193
      unpackage/dist/dev/mp-weixin/pages/auth/register.wxss
  88. 1 13
      unpackage/dist/dev/mp-weixin/pages/games/index.js
  89. 0 203
      unpackage/dist/dev/mp-weixin/pages/home/index.js
  90. 1 57
      unpackage/dist/dev/mp-weixin/pages/home/index.wxss
  91. 0 405
      unpackage/dist/dev/mp-weixin/pages/home/live.js
  92. 1 156
      unpackage/dist/dev/mp-weixin/pages/home/live.wxss
  93. 0 1248
      unpackage/dist/dev/mp-weixin/pages/home/living.js
  94. 0 0
      unpackage/dist/dev/mp-weixin/pages/home/living.wxml
  95. 0 392
      unpackage/dist/dev/mp-weixin/pages/home/living.wxss
  96. 1 62
      unpackage/dist/dev/mp-weixin/pages/list/index.js
  97. 1 56
      unpackage/dist/dev/mp-weixin/pages/list/index.wxss
  98. 1 8
      unpackage/dist/dev/mp-weixin/pages/user/index.js
  99. 0 260
      unpackage/dist/dev/mp-weixin/pages_shop/cart.js
  100. 0 241
      unpackage/dist/dev/mp-weixin/pages_shop/cart.wxss

+ 2 - 2
common/request.js

@@ -5,10 +5,10 @@ export default class Request {
 	http(router, data = {}, method, contentType) {
 		let that = this;
 		// let path = 'http://nd383294.natappfree.cc'//余红奇
-		// let path = 'https://live.test.ylrztop.com/prod-api'//余红奇
+		let path = 'https://live.test.ylrztop.com/live-api'//余红奇
 		// let path = 'http://v56c9b8e.natappfree.cc'//余红奇
 		// let path = 'http://192.168.10.170:7114'//陈果
-		let path = 'http://192.168.10.166:7114' //余红奇
+		// let path = 'http://192.168.10.166:7114' //余红奇
 		// let path = 'http://h5api.wxcourse.cdwjyyh.com'
 		uni.setStorageSync('requestPath', path)
 		// 只在第一个请求时显示loading

+ 1 - 1
core/config/defaultConfig.js

@@ -17,7 +17,7 @@ const testUrl = 'https://wanbei.monvkeji.cn/'
 const developUrl = 'http://192.168.10.166:7114/'//余红奇
 // const developUrl = 'http://v56c9b8e.natappfree.cc/'//余红奇
 // const developUrl = 'http://nd383294.natappfree.cc/'//余红奇
-// const developUrl = 'https://live.test.ylrztop.com/prod-api/'//余红奇
+// const developUrl = 'https://live.test.ylrztop.com/live-api/'//余红奇
 // const developUrl = 'http://192.168.10.170:7114/'//陈果
 export default {
 	// 系统名称

+ 0 - 275
node_modules/mescroll-uni/README.md

@@ -1,275 +0,0 @@
-## mescroll --【wxs+renderjs实现】高性能的下拉刷新上拉加载组件
-1. mescroll的uni版本 是专门用在uni-app的下拉刷新和上拉加载的组件, 支持一套代码编译到iOS、Android、H5、小程序等多个平台
-
-2. mescroll的uni版本 继承了mescroll.js的实用功能: 自动处理分页, 自动控制无数据, 空布局提示, 回到顶部按钮 ..
-
-3. mescroll的uni版本 丰富的案例, 自由灵活的api, 超详细的注释, 可让您快速自定义真正属于自己的下拉上拉组件
-
-<br/>
-
-
-## 最新文档(1.3.7版本): <a href="http://www.mescroll.com/uni.html">http://www.mescroll.com/uni.html</a>
-2021-04-13 by mescroll (文档可能会有缓存,建议打开时刷新一下)
-
-
-## 近期已更新优化的内容:
-1. 微信小程序, app, h5使用高性能wxs和renderjs, 下拉刷新更流畅丝滑, 尤其能明显解决Android小程序下拉卡顿的问题
-2. 新增国际化`mescroll-i18n.vue`示例, 新增轮播吸顶菜单`mescroll-swiper-sticky.vue`示例,    
-3. 新增 "局部区域滚动" 的案例: mescroll-body-part.vue 和 mescroll-uni-part.vue  
-4. 新增 me-video 视频组件, 解决APP端视频下拉悬浮错位的问题, 参考 mescroll-options.vue 示例  
-5. 新增 me-tabs 组件,tabs支持水平滑动; 优化mescroll-more和mescroll-swiper的案例, 顶部tab支持水平滑动
-6. 吸顶悬浮提供了原生sticky和监听滚动条实现的示例: sticky.vue 和 sticky-scroll.vue (推荐使用sticky样式实现)
-7. mescroll.scrollTo(y)的y支持css选择器, 包括跨自定义组件的后代选择器, 支持滚动到子组件的view (参考 mescroll-options.vue)  
-8. topbar 顶部是否预留状态栏的高度, 默认false; 还可支持设置状态栏背景: 如 '#ffff00', 'url(xxx) 0 0/100% 100%', 'linear-gradient(xx)'
-9. down.bgColor 和 up.bgColor 加载区域的背景,不仅支持色值, 而且还是支持背景图和渐变: 如 'url(xxx) 0 0/100% 100%', 'linear-gradient(xx)'
-10. topbar,bgColor支持一行代码定义background: [https://www.runoob.com/cssref/css3-pr-background.html](https://www.runoob.com/cssref/css3-pr-background.html)
-<br/>
-<br/>
-<a href="https://ext.dcloud.net.cn/plugin?id=343&update_log">查看更多 ... </a>
-
-
-### 更新记录:
-
----
-#### 1.3.7版本 (2021/04/13)  
-1. 新增`mescroll-swiper-sticky.vue`的示例, 轮播吸顶菜单导航  
-2. 新增`mescroll-empty.vue`的示例, 单独使用空布局组件  
-3. 简化tabs在具体项目中的使用,并简化对应的示例  
-4. mescroll-uni 支持动态禁止滚动的属性 disableScroll (注: mescroll-body不支持)  
--by 小瑾同学
-
----
-#### 1.3.5版本 (2021/04/10)  
-1. 新增 `mescroll-i18n.vue` 的示例, 支持国际化的配置  
-2. down的`beforeEndDelay`不再默认配置 // (显示加载成功/失败的时长, android小程序设置此项结束下拉会卡顿, 配置后请注意测试)  
-3. mescroll-body-part.vue 和 mescroll-uni-part.vue 的示例新增参考代码: `异步加载左侧菜单(超简单)`  
-4. mescroll的极简示例新增参考代码: `先请求其他接口,再触发upCallback,无需配置auto为false(超简单)`  
-5. 修复mescroll-swiper的tabs在app或h5错位的问题  
--by 小瑾同学
-
----
-#### 1.3.3版本 (2020/09/15)  
-1. 新增下拉刷新成功和失败的文本配置, 可在 mescroll-uni-option.js 配置修改  
-1. 新增 me-video 视频组件, 解决APP端视频下拉悬浮错位的问题, 参考最新的 mescroll-options.vue 示例  
-2. 更新 mescroll-comp.vue 的示例, 支持 mescroll-body 子子..子组件 , 包括 mescroll-more.vue 也支持写在子子..子组件  
-3. mescroll-uni 的 down.offset 由原来的 80 调整为 150 , 避免超快速滑动列表到底部,偶尔出现无法再翻页的问题 (mescroll-body无此问题)  
-4. 修复 mescroll-more.vue 和 mescroll-swiper.vue 的示例在字节跳动小程序2.0.0以上新版编辑器无法正常运行的问题  
-5. 修复淘宝和美团的示例下拉卡顿的问题 ( 案例需重新下载 )  
--by mescroll  
-
----
-#### 1.3.2版本 (2020/08/05)
-1. mescroll-body新增sticky属性, 简化吸顶悬浮sticky.vue的示例  
-2. QQ小程序支持wxs,解决QQ小程序卡顿和无法隐藏加载状态的问题  
-3. mescroll.scrollTo(y)的y支持css选择器, 包括跨自定义组件的后代选择器, 支持滚动到子组件的view (参考 mescroll-options.vue)  
--by 小瑾同学
-
----
-#### 1.3.1版本 (2020/07/27)
-1. 修复Android小程序下拉刷新时, image 和 swiper 脱离文档流的问题  
-2. 修复H5端, 当配置down.use为false时, 返回其他页面无法滚动的问题  
-3. mescroll-comp.js支持mescroll-body写在子子子...组件中 (以前版本仅支持写在一级子组件) 
-4. 吸顶悬浮提供了sticky样式和监听滚动条实现的示例: sticky.vue 和 sticky-scroll.vue (推荐使用sticky样式实现)  
--by 小瑾同学
-
----
-#### 1.3.0版本 (2020/07/10)
-1. 微信小程序, app, h5使用高性能wxs和renderjs, 下拉刷新更流畅丝滑, 尤其能明显解决Android小程序下拉卡顿的问题
-2. 使用wxs和renderjs优化所有案例, 尤其是中高级案例, 建议大家重新下载最新的案例
-3. 废弃down的isBounce配置, 已通过renderjs自动判断, 无需配置mescroll-touch
-4. 废弃down的fps配置, 已通过wxs提高性能, 无需手动节流
-5. 新增 "局部区域滚动" 的案例: mescroll-body-part.vue 和 mescroll-uni-part.vue
-6. 解决swiper切换时,有时会触发下拉刷新的问题, 已避免swiper和下拉刷新相互冲突
-7. 解决钉钉小程序mescroll-uni下拉刷新有时无法触发的问题
-8. 解决上拉加载进度在部分Android手机显示不全的问题
-9. 提高 me-tabs 组件在部分Android手机的兼容性  
--by 小瑾同学
-
----
-#### 1.2.8版本 (2020/06/28)
-1. 解决 mescroll-uni 再某些情况下列表数据渲染不完全的问题 ( mescroll-body无此问题 )
-2. 优化 me-tabs 组件, 使用支付宝小程序可隐藏滚动条, 同时修复字节跳动小程序tab切换时渲染延迟的问题
--by 小瑾同学
-
----
-#### 1.2.7版本 (2020/06/24)
-1. 上拉加载结束隐藏底部加载区域,避免加载区域占位
-2. h5端的tab页默认偏移TabBar的高度,避免h5端列表被TabBar遮住 (如不想偏移,可通过配置 :bottombar="false" 取消)
-3. 新增 me-tabs 组件,tabs支持水平滑动; 优化mescroll-more和mescroll-swiper的案例, 顶部tab支持水平滑动
-
----
-#### 1.2.6版本 (2020/06/16)
-1. mescroll-uni 和 mescroll-body 的 scrollTo 正式支持 scroll-into-view (传入的 y 为view的id即可生效)
-2. topbar 顶部是否预留状态栏的高度, 默认false; 这个版本还可支持设置状态栏背景: 如 '#ffff00', 'url(xxx)', 'linear-gradient(xx)'
-3. down.bgColor 和 up.bgColor 加载区域的背景,不仅支持色值, 而且还是支持背景图和渐变: 如 'url(xxx)', 'linear-gradient(xx)'
-4. 通过css方式适配iPhoneX, 比之前通过style方式具有更好的兼容性, 也同时消除了edge浏览器重复设置相同属性的警告
-5. 移除非必须的标签选择器,避免微信小程序提示组件内不可使用标签选择器的警告
-6. 修复当配置up的use为false时,默认的下拉刷新有时候无法自动隐藏的问题
-7. 修复当配置down的native为true时,auto失效的问题
-8. 修复空布局在某些情况下图片和文本错位的问题
-
----
-#### 1.2.5版本 (2020/03/15)
-1. mescroll-body 的 props 支持 safearea 的配置 (需要适配iPhoneX时,配置为 true 即可, 默认 false)
-2. mescroll-uni 的 scrollTo 支持 scroll-into-view (当传入的 y 为view的id时, 即可生效)
-3. 新增 下拉加载聊天记录的案例 list-msg.vue, 类似微信QQ的聊天记录
-
----
-#### 1.2.4版本 (2020/03/11)
-1. down和up分别新增 bgColor 的配置: 下拉区域背景颜色,默认"transparent"
-2. down和up分别新增 textColor 的配置: 下拉文本的颜色,默认"gray" (当bgColor配置了颜色,而textColor未配置时,则自动默认为白色)
-3. 调整mescroll-more-item.js, 使mescroll-more的案例支持初始化tabIndex大于0的tab页
-4. mescroll-body支持isBounce的配置, 解决H5下拉刷新失效的问题
-5. 解决mescroll-body在Android真机小程序下拉卡顿的问题 (mescroll-uni无此问题)
-
----
-#### 1.2.3版本 (2020/02/18)
-新增3个mescroll的mixins, 极大简化了mescroll-comp, mescroll-more, mescroll-swiper的案例
-
-
-#### 1.2.2版本 (2020/02/16)
-1. 调整mescroll-more和mescroll-swiper的案例,确保各小程序平台可正确获取到mescroll对象  
-2. 修复字节跳动小程序初始化时的异常警告: <a href="http://www.mescroll.com/qa.html?v=20200216#q26">详情</a>
-
-
-#### 1.2.1版本 (2020/02/08)
-1. 新增 &lt;mescroll-body&gt; 组件, 用来填补 &lt;mescroll-uni&gt; 的不足.
-2. mescroll-body基于原生页的滚动,支持写入原生组件和fixed元素,不必固定高度,不必配置pages.json,简单性能好.
-3. mescroll-body可配置down的native:true, 可直接代理系统自带的下拉组件, 参考 mescroll-native 示例
-4. 新增mescroll-mixins.js,简化代码,兼容更多小程序平台
-5. 修复字节跳动小程序和支付宝小程序的部分异常警告
-
-#### 1.2.0版本 (2020/01/06)
-1. mescroll-uni.vue的props新增height. // 简单快捷设置mescroll的高度, 此项有值,则不使用fixed. 
-	使用场景: 当在弹窗或浮层中使用fixed固定mescroll高度比较麻烦时, 配置此项就很方便了
-	支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight
-2. mescroll-uni.vue的props新增safearea. // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用,此项值对回到顶部按钮生效)
-3. mescroll-uni.vue的props中,top和bottom不仅仅支持数字, 还支持"20rpx", "20px", "20%"格式的值
-4. 补充锁定上拉加载mescroll.lockUpScroll的方法
-5. down.fps默认值提高至80
-6. 独立出空布局的组件&lt;mescroll-empty&gt;, 以便在不使用mescroll的界面也能统一管理空布局
-```
-<template>
-		<view>
-			// 基本用法
-			<mescroll-empty v-if="list.length==0"></mescroll-empty>
-			// 所有配置项 (option同up.empty的配置一致)
-			<mescroll-empty v-if="isShowEmpty" :option="optEmpty" @emptyclick="emptyClick"></mescroll-empty>
-		</view>
-	</template>
-	
-	<script>
-		import MescrollEmpty from '@/components/mescroll-uni/components/mescroll-empty.vue';
-		export default {
-			components: {
-				MescrollEmpty
-			},
-			...
-		}
-```
-7. 为了更快速自定义回到顶部按钮, up.toTop新增以下配置项:
-```
-	toTop: {
-		zIndex: 9990, // fixed定位z-index值
-		right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
-		bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
-		safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false. 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取mescroll-uni.vue的safearea值)
-		width: 72, // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
-		radius: "50%", // 圆角, 默认"50%" (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
-		left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
-		duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项)
-		src: null, // (已有配置)
-		offset: 1000 // (已有配置)
-	}
-```
-
-
----
-#### 1.1.9版本 (2019/12/16)
-1. 解决左右滑动屏幕,某些情况下会触发上拉回调的bug
-2. mescroll-uni.vue的props新增topbar: top的偏移量是否加上状态栏高度 (当fixed为false时不生效; 使用场景:取消原生导航栏时,配置此项可自动加上状态栏高度的偏移量)
-
----
-#### 1.1.8版本 (2019/11/01)
-1. 解决Android小程序快速上拉可能会导致不断翻页直到没有数据为止的bug
-2. 过滤某些情况下touch的警告输出
-
----
-#### 1.1.7版本 (2019/10/15)
-1. 重点解决下拉刷新卡顿,特别是Android小程序卡顿的问题
-2. 补充之前版本遗漏的mescroll.lockUpScroll方法
-3. 支持数据不满屏时,仍可触发翻页的回调
-
----
-#### 1.1.5版本 (2019/07/25)
-1. up新增isBounce的配置, 默认值为false. 目的是解决H5在ios下拉出现灰色背景和android端无法正常下拉的问题. 详见: <a href="http://www.mescroll.com/qa.html?v=190725#q25">http://www.mescroll.com/qa.html?v=190725#q25</a>
-2. 修复setClientHeight某些情况下会提示undefined的问题
-3. 修复在mescroll-uni-option.js配置page会导致分页异常的问题
-
----
-#### 1.1.2版本 (2019/07/19)
-一. 修复和优化的内容:
-1. 修复列表不满屏时,无法上拉的问题
-2. 修复列表滚动到底部,有时无法上拉的问题
-3. 修复快速滚动到顶部时,滚动条的位置有时不为0的问题
-4. 修复配置page.num不生效的问题
-5. 修复小程序android端下拉卡顿的问题 (可配置down的supply,复杂的列表可适当调大值)
-6. 修复H5多mescroll的情况下回到顶部按钮错位的问题
-7. 优化和简化逻辑,去除冗余代码
-
-二. 完善获取节点信息的方式:
-1. 获取mescroll的唯一元素id: mescroll.viewId (可通过uni.createSelectorQuery进一步获取更多信息)
-2. 获取滚动内容的高度: mescroll.getScrollHeight()
-3. 获取mescroll的高度: mescroll.getClientHeight()
-4. 获取滚动条位置: mescroll.getScrollTop()
-5. 获取到底部的距离: mescroll.getScrollBottom()
-6. 获取滚动的方向: mescroll.isScrollUp // true向上滑; false向下滑
-7. 更多信息详见mescroll-options的示例
-
----
-#### 1.1.1版本 (2019/07/16)
-1. 修复滚动到顶部,有时无法下拉的问题
-2. 修复禁止上拉时,列表底部有空白区域的问题
-
----
-#### 1.1.0版本 (重要版本) (2019/07/01)
-一. 简化使用:
-1. **无需**在page.json中配置onReachBottomDistance<br/>
-2. **无需**在页面中注册onReachBottom 和 onPageScroll<br/>
-3. 初始化时@init**不再**是必须配置项<br/>
-4. 极大的**简化** list-mescroll-more.vue 的案例<br/>
-5. 全面**支持swiper**,详见 mescroll-swiper.vue 的案例<br/>
-6. 所有基础案例都有所简化, **建议**重新下载参考. (以前版本向下兼容)<br/> 
-7. 所有中高级案例自定义的部分,改动比较大, **必须**重新下载参考. (不兼容以前版本)
-
-二. 优化性能:
-1. 支持fixed定位,可实现局部**区域滚动**<br/>
-2. 支持swiper,scrollview**嵌套**使用<br/>
-3. 优化下拉逻辑,修复下拉刷新卡顿和抖动的问题<br/>
-4. 优化默认样式,避免某些情况出现双滚动条的问题<br/>
-5. up废弃errDistance配置, 内部已优化处理相关问题
-
-三. 新增配置:
-1. down和up新增fps节流配置.(默认40fps, 值越大每秒刷新频率越高)<br/>
-2. up新增offset配置: 距底部多远时,触发upCallback (默认80, 代替page.json的onReachBottomDistance)<br/>
-3. up新增onScroll配置: 是否监听滚动事件,默认false<br/>
-4. < mescroll-uni 新增 @scroll="scroll" 获取滚动条的位置和滚动方向, 需配置up的onScroll为true, 详见 mescroll-options.vue 的示例<br/>
-5. < mescroll-uni 新增 :fixed="true/false" 是否支持fixed定位, 默认 true. 
-<br/> 当:fixed="true", 此时 :top 和 :bottom 为 fixed 的 top 和 bottom
-<br/> 当:fixed="false", 此时 :top 和 :bottom 为 padding-top 和 padding-bottom
-
-
----
-#### 1.0.3版本 (2019/06/13)
-1. 默认设置page高度100%,使列表不满屏的时候,仍可下拉刷新<br/>
-2. 加入-webkit-overflow-scrolling: touch, 编译到H5和APP,使iOS列表滚动更流畅<br/>
-3. mescroll-empty加入box-sizing: border-box, 修复图标和文本不居中的问题<br/>
-4. 上拉配置新增errDistance,默认110 // mescroll.endErr()的时候需往上滑动一段距离,使其能再次触发上拉加载 (已在1.1.0版本废弃)<br/>
-5. mescroll.endErr(errDistance) 新增的参数 errDistance; 可单独配置异常往上滑动的距离 (已在1.1.0版本废弃)<br/>
-6. 修改了list-mescroll-more的160行为mescroll.endErr(0);(已在1.1.0版本优化)<br/>
-7. 新增mescroll.scrollTo(y,t) 滚动到指定的位置; 本质调用的是uni.pageScrollTo
-
----
-#### 1.0.2版本 (2019/05/28)  
-1. 组件根元素加入mescroll-uni的样式,empty新增fixed等配置项; <br/>
-2. 修复list-mescroll-more案例切换tabs,某些情况的page.num会错乱的问题

+ 0 - 55
node_modules/mescroll-uni/components/mescroll-down.css

@@ -1,55 +0,0 @@
-/* 下拉刷新区域 */
-.mescroll-downwarp {
-	position: absolute;
-	top: -100%;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	text-align: center;
-}
-
-/* 下拉刷新--内容区,定位于区域底部 */
-.mescroll-downwarp .downwarp-content {
-	position: absolute;
-	left: 0;
-	bottom: 0;
-	width: 100%;
-	min-height: 60rpx;
-	padding: 20rpx 0;
-	text-align: center;
-}
-
-/* 下拉刷新--提示文本 */
-.mescroll-downwarp .downwarp-tip {
-	display: inline-block;
-	font-size: 28rpx;
-	vertical-align: middle;
-	margin-left: 16rpx;
-	/* color: gray; 已在style设置color,此处删去*/
-}
-
-/* 下拉刷新--旋转进度条 */
-.mescroll-downwarp .downwarp-progress {
-	display: inline-block;
-	width: 32rpx;
-	height: 32rpx;
-	border-radius: 50%;
-	border: 2rpx solid gray;
-	border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/
-	vertical-align: middle;
-}
-
-/* 旋转动画 */
-.mescroll-downwarp .mescroll-rotate {
-	animation: mescrollDownRotate 0.6s linear infinite;
-}
-
-@keyframes mescrollDownRotate {
-	0% {
-		transform: rotate(0deg);
-	}
-
-	100% {
-		transform: rotate(360deg);
-	}
-}

+ 0 - 47
node_modules/mescroll-uni/components/mescroll-down.vue

@@ -1,47 +0,0 @@
-<!-- 下拉刷新区域 -->
-<template>
-	<view v-if="mOption.use" class="mescroll-downwarp" :style="{'background-color':mOption.bgColor,'color':mOption.textColor}">
-		<view class="downwarp-content">
-			<view class="downwarp-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mOption.textColor, 'transform':downRotate}"></view>
-			<view class="downwarp-tip">{{downText}}</view>
-		</view>
-	</view>
-</template>
-
-<script>
-export default {
-	props: {
-		option: Object , // down的配置项
-		type: Number, // 下拉状态(inOffset:1, outOffset:2, showLoading:3, endDownScroll:4)
-		rate: Number // 下拉比率 (inOffset: rate<1; outOffset: rate>=1)
-	},
-	computed: {
-		// 支付宝小程序需写成计算属性,prop定义default仍报错
-		mOption(){
-			return this.option || {}
-		},
-		// 是否在加载中
-		isDownLoading(){
-			return this.type === 3
-		},
-		// 旋转的角度
-		downRotate(){
-			return 'rotate(' + 360 * this.rate + 'deg)'
-		},
-		// 文本提示
-		downText(){
-			switch (this.type){
-				case 1: return this.mOption.textInOffset;
-				case 2: return this.mOption.textOutOffset;
-				case 3: return this.mOption.textLoading;
-				case 4: return this.mOption.textLoading;
-				default: return this.mOption.textInOffset;
-			}
-		}
-	}
-};
-</script>
-
-<style>
-@import "./mescroll-down.css";
-</style>

+ 0 - 118
node_modules/mescroll-uni/components/mescroll-empty.vue

@@ -1,118 +0,0 @@
-<!--空布局:
-
-可作为独立的组件, 不使用mescroll的页面也能单独引入, 以便APP全局统一管理:
-import MescrollEmpty from '@/components/mescroll-uni/components/mescroll-empty.vue';
-<mescroll-empty v-if="isShowEmpty" :option="optEmpty" @emptyclick="emptyClick"></mescroll-empty>
--->
-<template>
-	<view class="mescroll-empty" :class="{ 'empty-fixed': option.fixed }" :style="{ 'z-index': option.zIndex, top: option.top }">
-		<view> <image v-if="icon" class="empty-icon" :src="icon" mode="widthFix" /> </view>
-		<view v-if="tip" class="empty-tip">{{ tip }}</view>
-		<view v-if="btnText" class="empty-btn" @click="emptyClick">{{ btnText }}</view>
-	</view>
-</template>
-
-<script>
-// 引入全局配置
-import GlobalOption from './../mescroll-uni-option.js';
-// 引入国际化工具类
-import mescrollI18n from './../mescroll-i18n.js';
-export default {
-	props: {
-		// empty的配置项: 默认为GlobalOption.up.empty
-		option: {
-			type: Object,
-			default() {
-				return {};
-			}
-		}
-	},
-	// 使用computed获取配置,用于支持option的动态配置
-	computed: {
-		// 图标
-		icon() {
-			if (this.option.icon != null) { // 此处不使用短路求值, 用于支持传空串不显示图标
-				return this.option.icon
-			} else{
-				let i18nType = mescrollI18n.getType() // 国际化配置
-				if (this.option.i18n) {
-					return this.option.i18n[i18nType].icon
-				} else{
-					return GlobalOption.i18n[i18nType].up.empty.icon || GlobalOption.up.empty.icon
-				}
-			}
-		},
-		// 文本提示
-		tip() {
-			if (this.option.tip != null) { // 支持传空串不显示文本提示
-				return this.option.tip
-			} else{
-				let i18nType = mescrollI18n.getType() // 国际化配置
-				if (this.option.i18n) {
-					return this.option.i18n[i18nType].tip
-				} else{
-					return GlobalOption.i18n[i18nType].up.empty.tip || GlobalOption.up.empty.tip
-				}
-			}
-		},
-		// 按钮文本
-		btnText() {
-			if (this.option.i18n) {
-				let i18nType = mescrollI18n.getType() // 国际化配置
-				return this.option.i18n[i18nType].btnText
-			} else{
-				return this.option.btnText
-			}
-		}
-	},
-	methods: {
-		// 点击按钮
-		emptyClick() {
-			this.$emit('emptyclick');
-		}
-	}
-};
-</script>
-
-<style>
-/* 无任何数据的空布局 */
-.mescroll-empty {
-	box-sizing: border-box;
-	width: 100%;
-	padding: 100rpx 50rpx;
-	text-align: center;
-}
-
-.mescroll-empty.empty-fixed {
-	z-index: 99;
-	position: absolute; /*transform会使fixed失效,最终会降级为absolute */
-	top: 100rpx;
-	left: 0;
-}
-
-.mescroll-empty .empty-icon {
-	width: 280rpx;
-	height: 280rpx;
-}
-
-.mescroll-empty .empty-tip {
-	margin-top: 20rpx;
-	font-size: 24rpx;
-	color: gray;
-}
-
-.mescroll-empty .empty-btn {
-	display: inline-block;
-	margin-top: 40rpx;
-	min-width: 200rpx;
-	padding: 18rpx;
-	font-size: 28rpx;
-	border: 1rpx solid #e04b28;
-	border-radius: 60rpx;
-	color: #e04b28;
-}
-
-.mescroll-empty .empty-btn:active {
-	opacity: 0.75;
-}
-</style>

+ 0 - 83
node_modules/mescroll-uni/components/mescroll-top.vue

@@ -1,83 +0,0 @@
-<!-- 回到顶部的按钮 -->
-<template>
-	<image
-		v-if="mOption.src"
-		class="mescroll-totop"
-		:class="[value ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': mOption.safearea}]"
-		:style="{'z-index':mOption.zIndex, 'left': left, 'right': right, 'bottom':addUnit(mOption.bottom), 'width':addUnit(mOption.width), 'border-radius':addUnit(mOption.radius)}"
-		:src="mOption.src"
-		mode="widthFix"
-		@click="toTopClick"
-	/>
-</template>
-
-<script>
-export default {
-	props: {
-		// up.toTop的配置项
-		option: Object,
-		// 是否显示
-		value: false
-	},
-	computed: {
-		// 支付宝小程序需写成计算属性,prop定义default仍报错
-		mOption(){
-			return this.option || {}
-		},
-		// 优先显示左边
-		left(){
-			return this.mOption.left ? this.addUnit(this.mOption.left) : 'auto';
-		},
-		// 右边距离 (优先显示左边)
-		right() {
-			return this.mOption.left ? 'auto' : this.addUnit(this.mOption.right);
-		}
-	},
-	methods: {
-		addUnit(num){
-			if(!num) return 0;
-			if(typeof num === 'number') return num + 'rpx';
-			return num
-		},
-		toTopClick() {
-			this.$emit('input', false); // 使v-model生效
-			this.$emit('click'); // 派发点击事件
-		}
-	}
-};
-</script>
-
-<style>
-/* 回到顶部的按钮 */
-.mescroll-totop {
-	z-index: 9990;
-	position: fixed !important; /* 加上important避免编译到H5,在多mescroll中定位失效 */
-	right: 20rpx;
-	bottom: 120rpx;
-	width: 72rpx;
-	height: auto;
-	border-radius: 50%;
-	opacity: 0;
-	transition: opacity 0.5s; /* 过渡 */
-	margin-bottom: var(--window-bottom); /* css变量 */
-}
-
-/* 适配 iPhoneX */
-@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
-	.mescroll-totop-safearea {
-		margin-bottom: calc(var(--window-bottom) + constant(safe-area-inset-bottom)); /* window-bottom + 适配 iPhoneX */
-		margin-bottom: calc(var(--window-bottom) + env(safe-area-inset-bottom));
-	}
-}
-
-/* 显示 -- 淡入 */
-.mescroll-totop-in {
-	opacity: 1;
-}
-
-/* 隐藏 -- 淡出且不接收事件*/
-.mescroll-totop-out {
-	opacity: 0;
-	pointer-events: none;
-}
-</style>

+ 0 - 47
node_modules/mescroll-uni/components/mescroll-up.css

@@ -1,47 +0,0 @@
-/* 上拉加载区域 */
-.mescroll-upwarp {
-	box-sizing: border-box;
-	min-height: 110rpx;
-	padding: 30rpx 0;
-	text-align: center;
-	clear: both;
-}
-
-/*提示文本 */
-.mescroll-upwarp .upwarp-tip,
-.mescroll-upwarp .upwarp-nodata {
-	display: inline-block;
-	font-size: 28rpx;
-	vertical-align: middle;
-	/* color: gray; 已在style设置color,此处删去*/
-}
-
-.mescroll-upwarp .upwarp-tip {
-	margin-left: 16rpx;
-}
-
-/*旋转进度条 */
-.mescroll-upwarp .upwarp-progress {
-	display: inline-block;
-	width: 32rpx;
-	height: 32rpx;
-	border-radius: 50%;
-	border: 2rpx solid gray;
-	border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/
-	vertical-align: middle;
-}
-
-/* 旋转动画 */
-.mescroll-upwarp .mescroll-rotate {
-	animation: mescrollUpRotate 0.6s linear infinite;
-}
-
-@keyframes mescrollUpRotate {
-	0% {
-		transform: rotate(0deg);
-	}
-
-	100% {
-		transform: rotate(360deg);
-	}
-}

+ 0 - 19
node_modules/mescroll-uni/mescroll-body.css

@@ -1,19 +0,0 @@
-.mescroll-body {
-	position: relative; /* 下拉刷新区域相对自身定位 */
-	height: auto; /* 不可固定高度,否则overflow:hidden导致无法滑动; 同时使设置的最小高生效,实现列表不满屏仍可下拉*/
-	overflow: hidden; /* 当有元素写在mescroll-body标签前面时,可遮住下拉刷新区域 */
-	box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */
-}
-
-/* 使sticky生效: 父元素不能overflow:hidden或者overflow:auto属性 */
-.mescroll-body.mescorll-sticky{
-	overflow: unset !important
-}
-
-/* 适配 iPhoneX */
-@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
-	.mescroll-safearea {
-		padding-bottom: constant(safe-area-inset-bottom);
-		padding-bottom: env(safe-area-inset-bottom);
-	}
-}

+ 0 - 15
node_modules/mescroll-uni/mescroll-i18n.js

@@ -1,15 +0,0 @@
-// 国际化工具类
-const mescrollI18n = {
-	// 默认语言
-	def: "zh",
-	// 获取当前语言类型
-	getType(){
-		return uni.getStorageSync("mescroll-i18n") || this.def
-	},
-	// 设置当前语言类型
-	setType(type){
-		uni.setStorageSync("mescroll-i18n", type)
-	}
-}
-
-export default mescrollI18n

+ 0 - 57
node_modules/mescroll-uni/mescroll-mixins.js

@@ -1,57 +0,0 @@
-// mescroll-body 和 mescroll-uni 通用
-const MescrollMixin = {
-	data() {
-		return {
-			mescroll: null //mescroll实例对象
-		}
-	},
-	// 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
-	onPullDownRefresh(){
-		this.mescroll && this.mescroll.onPullDownRefresh();
-	},
-	// 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
-	onPageScroll(e) {
-		this.mescroll && this.mescroll.onPageScroll(e);
-	},
-	// 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
-	onReachBottom() {
-		this.mescroll && this.mescroll.onReachBottom();
-	},
-	methods: {
-		// mescroll组件初始化的回调,可获取到mescroll对象
-		mescrollInit(mescroll) {
-			this.mescroll = mescroll;
-			this.mescrollInitByRef(); // 兼容字节跳动小程序
-		},
-		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
-		mescrollInitByRef() {
-			if(!this.mescroll || !this.mescroll.resetUpScroll){
-				let mescrollRef = this.$refs.mescrollRef;
-				if(mescrollRef) this.mescroll = mescrollRef.mescroll
-			}
-		},
-		// 下拉刷新的回调 (mixin默认resetUpScroll)
-		downCallback() {
-			if(this.mescroll.optUp.use){
-				this.mescroll.resetUpScroll()
-			}else{
-				setTimeout(()=>{
-					this.mescroll.endSuccess();
-				}, 500)
-			}
-		},
-		// 上拉加载的回调
-		upCallback() {
-			// mixin默认延时500自动结束加载
-			setTimeout(()=>{
-				this.mescroll.endErr();
-			}, 500)
-		}
-	},
-	mounted() {
-		this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况
-	}
-	
-}
-
-export default MescrollMixin;

+ 0 - 36
node_modules/mescroll-uni/mescroll-uni.css

@@ -1,36 +0,0 @@
-.mescroll-uni-warp{
-	height: 100%;
-}
-
-.mescroll-uni-content{
-	height: 100%;
-}
-
-.mescroll-uni {
-	position: relative;
-	width: 100%;
-	height: 100%;
-	min-height: 200rpx;
-	overflow-y: auto;
-	box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */
-}
-
-/* 定位的方式固定高度 */
-.mescroll-uni-fixed{
-	z-index: 1;
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	width: auto; /* 使right生效 */
-	height: auto; /* 使bottom生效 */
-}
-
-/* 适配 iPhoneX */
-@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
-	.mescroll-safearea {
-		padding-bottom: constant(safe-area-inset-bottom);
-		padding-bottom: env(safe-area-inset-bottom);
-	}
-}

+ 0 - 799
node_modules/mescroll-uni/mescroll-uni.js

@@ -1,799 +0,0 @@
-/* mescroll
- * version 1.3.7
- * 2021-04-13 wenju
- * https://www.mescroll.com
- */
-
-export default function MeScroll(options, isScrollBody) {
-	let me = this;
-	me.version = '1.3.7'; // mescroll版本号
-	me.options = options || {}; // 配置
-	me.isScrollBody = isScrollBody || false; // 滚动区域是否为原生页面滚动; 默认为scroll-view
-
-	me.isDownScrolling = false; // 是否在执行下拉刷新的回调
-	me.isUpScrolling = false; // 是否在执行上拉加载的回调
-	let hasDownCallback = me.options.down && me.options.down.callback; // 是否配置了down的callback
-
-	// 初始化下拉刷新
-	me.initDownScroll();
-	// 初始化上拉加载,则初始化
-	me.initUpScroll();
-
-	// 自动加载
-	setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
-		// 自动触发下拉刷新 (只有配置了down的callback才自动触发下拉刷新)
-		if ((me.optDown.use || me.optDown.native) && me.optDown.auto && hasDownCallback) {
-			if (me.optDown.autoShowLoading) {
-				me.triggerDownScroll(); // 显示下拉进度,执行下拉回调
-			} else {
-				me.optDown.callback && me.optDown.callback(me); // 不显示下拉进度,直接执行下拉回调
-			}
-		}
-		// 自动触发上拉加载
-		if(!me.isUpAutoLoad){ // 部分小程序(头条小程序)emit是异步, 会导致isUpAutoLoad判断有误, 先延时确保先执行down的callback,再执行up的callback
-			setTimeout(function(){
-				me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll();
-			},100)
-		}
-	}, 30); // 需让me.optDown.inited和me.optUp.inited先执行
-}
-
-/* 配置参数:下拉刷新 */
-MeScroll.prototype.extendDownScroll = function(optDown) {
-	// 下拉刷新的配置
-	MeScroll.extend(optDown, {
-		use: true, // 是否启用下拉刷新; 默认true
-		auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true
-		native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
-		autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false
-		isLock: false, // 是否锁定下拉刷新,默认false;
-		offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调
-		startTop: 100, // scroll-view快速滚动到顶部时,此时的scroll-top可能大于0, 此值用于控制最大的误差
-		inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
-		outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
-		bottomOffset: 20, // 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行
-		minAngle: 45, // 向下滑动最少偏移的角度,取值区间  [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突;
-		textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本
-		textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本
-		textLoading: '加载中 ...', // 加载中的提示文本
-		textSuccess: '加载成功', // 加载成功的文本
-		textErr: '加载失败', // 加载失败的文本
-		beforeEndDelay: 0, // 延时结束的时长 (显示加载成功/失败的时长, android小程序设置此项结束下拉会卡顿, 配置后请注意测试)
-		bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorTop)
-		textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
-		inited: null, // 下拉刷新初始化完毕的回调
-		inOffset: null, // 下拉的距离进入offset范围内那一刻的回调
-		outOffset: null, // 下拉的距离大于offset那一刻的回调
-		onMoving: null, // 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度
-		beforeLoading: null, // 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】
-		showLoading: null, // 显示下拉刷新进度的回调
-		afterLoading: null, // 显示下拉刷新进度的回调之后,马上要执行的代码 (如: 在wxs中使用)
-		beforeEndDownScroll: null, // 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】
-		endDownScroll: null, // 结束下拉刷新的回调
-		afterEndDownScroll: null, // 结束下拉刷新的回调,马上要执行的代码 (如: 在wxs中使用)
-		callback: function(mescroll) {
-			// 下拉刷新的回调;默认重置上拉加载列表为第一页
-			mescroll.resetUpScroll();
-		}
-	})
-}
-
-/* 配置参数:上拉加载 */
-MeScroll.prototype.extendUpScroll = function(optUp) {
-	// 上拉加载的配置
-	MeScroll.extend(optUp, {
-		use: true, // 是否启用上拉加载; 默认true
-		auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true
-		isLock: false, // 是否锁定上拉加载,默认false;
-		isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发;
-		callback: null, // 上拉加载的回调;function(page,mescroll){ }
-		page: {
-			num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-			size: 10, // 每页数据的数量
-			time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复;
-		},
-		noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
-		offset: 150, // 距底部多远时,触发upCallback,仅mescroll-uni生效 ( mescroll-body配置的是pages.json的 onReachBottomDistance )
-		textLoading: '加载中 ...', // 加载中的提示文本
-		textNoMore: '-- END --', // 没有更多数据的提示文本
-		bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorBottom)
-		textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
-		inited: null, // 初始化完毕的回调
-		showLoading: null, // 显示加载中的回调
-		showNoMore: null, // 显示无更多数据的回调
-		hideUpScroll: null, // 隐藏上拉加载的回调
-		errDistance: 60, // endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效
-		toTop: {
-			// 回到顶部按钮,需配置src才显示
-			src: null, // 图片路径,默认null (绝对路径或网络图)
-			offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000
-			duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项)
-			btnClick: null, // 点击按钮的回调
-			onShow: null, // 是否显示的回调
-			zIndex: 9990, // fixed定位z-index值
-			left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
-			right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
-			bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
-			safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值)
-			width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
-			radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
-		},
-		empty: {
-			use: true, // 是否显示空布局
-			icon: null, // 图标路径
-			tip: '~ 暂无相关数据 ~', // 提示
-			btnText: '', // 按钮
-			btnClick: null, // 点击按钮的回调
-			onShow: null, // 是否显示的回调
-			fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute)
-			top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx")
-			zIndex: 99 // fixed定位z-index值
-		},
-		onScroll: false // 是否监听滚动事件
-	})
-}
-
-/* 配置参数 */
-MeScroll.extend = function(userOption, defaultOption) {
-	if (!userOption) return defaultOption;
-	for (let key in defaultOption) {
-		if (userOption[key] == null) {
-			let def = defaultOption[key];
-			if (def != null && typeof def === 'object') {
-				userOption[key] = MeScroll.extend({}, def); // 深度匹配
-			} else {
-				userOption[key] = def;
-			}
-		} else if (typeof userOption[key] === 'object') {
-			MeScroll.extend(userOption[key], defaultOption[key]); // 深度匹配
-		}
-	}
-	return userOption;
-}
-
-/* 简单判断是否配置了颜色 (非透明,非白色) */
-MeScroll.prototype.hasColor = function(color) {
-	if(!color) return false;
-	let c = color.toLowerCase();
-	return c != "#fff" && c != "#ffffff" && c != "transparent" && c != "white"
-}
-
-/* -------初始化下拉刷新------- */
-MeScroll.prototype.initDownScroll = function() {
-	let me = this;
-	// 配置参数
-	me.optDown = me.options.down || {};
-	if(!me.optDown.textColor && me.hasColor(me.optDown.bgColor)) me.optDown.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色
-	me.extendDownScroll(me.optDown);
-	
-	// 如果是mescroll-body且配置了native,则禁止自定义的下拉刷新
-	if(me.isScrollBody && me.optDown.native){
-		me.optDown.use = false
-	}else{
-		me.optDown.native = false // 仅mescroll-body支持,mescroll-uni不支持
-	}
-	
-	me.downHight = 0; // 下拉区域的高度
-
-	// 在页面中加入下拉布局
-	if (me.optDown.use && me.optDown.inited) {
-		// 初始化完毕的回调
-		setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
-			me.optDown.inited(me);
-		}, 0)
-	}
-}
-
-/* 列表touchstart事件 */
-MeScroll.prototype.touchstartEvent = function(e) {
-	if (!this.optDown.use) return;
-
-	this.startPoint = this.getPoint(e); // 记录起点
-	this.startTop = this.getScrollTop(); // 记录此时的滚动条位置
-	this.startAngle = 0; // 初始角度
-	this.lastPoint = this.startPoint; // 重置上次move的点
-	this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况)
-	this.inTouchend = false; // 标记不是touchend
-}
-
-/* 列表touchmove事件 */
-MeScroll.prototype.touchmoveEvent = function(e) {
-	if (!this.optDown.use) return;
-	let me = this;
-
-	let scrollTop = me.getScrollTop(); // 当前滚动条的距离
-	let curPoint = me.getPoint(e); // 当前点
-
-	let moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
-
-	// 向下拉 && 在顶部
-	// mescroll-body,直接判定在顶部即可
-	// scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove
-	// scroll-view滚动到顶部时,scrollTop不一定为0,也有可能大于0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等
-	if (moveY > 0 && (
-			(me.isScrollBody && scrollTop <= 0)
-			||
-			(!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop)) )
-		)) {
-		// 可下拉的条件
-		if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling &&
-				me.optUp.isBoth))) {
-
-			// 下拉的初始角度是否在配置的范围内
-			if(!me.startAngle) me.startAngle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90]
-			if (me.startAngle < me.optDown.minAngle) return; // 如果小于配置的角度,则不往下执行下拉刷新
-
-			// 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发
-			if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) {
-				me.inTouchend = true; // 标记执行touchend
-				me.touchendEvent(); // 提前触发touchend
-				return;
-			}
-			
-			me.preventDefault(e); // 阻止默认事件
-
-			let diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上)
-
-			// 下拉距离  < 指定距离
-			if (me.downHight < me.optDown.offset) {
-				if (me.movetype !== 1) {
-					me.movetype = 1; // 加入标记,保证只执行一次
-					me.isDownEndSuccess = null; // 重置是否加载成功的状态 (wxs执行的是wxs.wxs)
-					me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次
-					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
-				}
-				me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小
-
-				// 指定距离  <= 下拉距离
-			} else {
-				if (me.movetype !== 2) {
-					me.movetype = 2; // 加入标记,保证只执行一次
-					me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次
-					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
-				}
-				if (diff > 0) { // 向下拉
-					me.downHight += diff * me.optDown.outOffsetRate; // 越往下,高度变化越小
-				} else { // 向上收
-					me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度
-				}
-			}
-			
-			me.downHight = Math.round(me.downHight) // 取整
-			let rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值
-			me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行
-		}
-	}
-
-	me.lastPoint = curPoint; // 记录本次移动的点
-}
-
-/* 列表touchend事件 */
-MeScroll.prototype.touchendEvent = function(e) {
-	if (!this.optDown.use) return;
-	// 如果下拉区域高度已改变,则需重置回来
-	if (this.isMoveDown) {
-		if (this.downHight >= this.optDown.offset) {
-			// 符合触发刷新的条件
-			this.triggerDownScroll();
-		} else {
-			// 不符合的话 则重置
-			this.downHight = 0;
-			this.endDownScrollCall(this);
-		}
-		this.movetype = 0;
-		this.isMoveDown = false;
-	} else if (!this.isScrollBody && this.getScrollTop() === this.startTop) { // scroll-view到顶/左/右/底的滑动事件
-		let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
-		// 上滑
-		if (isScrollUp) {
-			// 需检查滑动的角度
-			let angle = this.getAngle(this.getPoint(e), this.startPoint); // 两点之间的角度,区间 [0,90]
-			if (angle > 80) {
-				// 检查并触发上拉
-				this.triggerUpScroll(true);
-			}
-		}
-	}
-}
-
-/* 根据点击滑动事件获取第一个手指的坐标 */
-MeScroll.prototype.getPoint = function(e) {
-	if (!e) {
-		return {
-			x: 0,
-			y: 0
-		}
-	}
-	if (e.touches && e.touches[0]) {
-		return {
-			x: e.touches[0].pageX,
-			y: e.touches[0].pageY
-		}
-	} else if (e.changedTouches && e.changedTouches[0]) {
-		return {
-			x: e.changedTouches[0].pageX,
-			y: e.changedTouches[0].pageY
-		}
-	} else {
-		return {
-			x: e.clientX,
-			y: e.clientY
-		}
-	}
-}
-
-/* 计算两点之间的角度: 区间 [0,90]*/
-MeScroll.prototype.getAngle = function(p1, p2) {
-	let x = Math.abs(p1.x - p2.x);
-	let y = Math.abs(p1.y - p2.y);
-	let z = Math.sqrt(x * x + y * y);
-	let angle = 0;
-	if (z !== 0) {
-		angle = Math.asin(y / z) / Math.PI * 180;
-	}
-	return angle
-}
-
-/* 触发下拉刷新 */
-MeScroll.prototype.triggerDownScroll = function() {
-	if (this.optDown.beforeLoading && this.optDown.beforeLoading(this)) {
-		//return true则处于完全自定义状态
-	} else {
-		this.showDownScroll(); // 下拉刷新中...
-		!this.optDown.native && this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据
-	}
-}
-
-/* 显示下拉进度布局 */
-MeScroll.prototype.showDownScroll = function() {
-	this.isDownScrolling = true; // 标记下拉中
-	if (this.optDown.native) {
-		uni.startPullDownRefresh(); // 系统自带的下拉刷新
-		this.showDownLoadingCall(0); // 仍触发showLoading,因为上拉加载用到
-	} else{
-		this.downHight = this.optDown.offset; // 更新下拉区域高度
-		this.showDownLoadingCall(this.downHight); // 下拉刷新中...
-	}
-}
-
-MeScroll.prototype.showDownLoadingCall = function(downHight) {
-	this.optDown.showLoading && this.optDown.showLoading(this, downHight); // 下拉刷新中...
-	this.optDown.afterLoading && this.optDown.afterLoading(this, downHight); // 下拉刷新中...触发之后马上要执行的代码
-}
-
-/* 显示系统自带的下拉刷新时需要处理的业务 */
-MeScroll.prototype.onPullDownRefresh = function() {
-	this.isDownScrolling = true; // 标记下拉中
-	this.showDownLoadingCall(0); // 仍触发showLoading,因为上拉加载用到
-	this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据
-}
-
-/* 结束下拉刷新 */
-MeScroll.prototype.endDownScroll = function() {
-	if (this.optDown.native) { // 结束原生下拉刷新
-		this.isDownScrolling = false;
-		this.endDownScrollCall(this);
-		uni.stopPullDownRefresh();
-		return
-	}
-	let me = this;
-	// 结束下拉刷新的方法
-	let endScroll = function() {
-		me.downHight = 0;
-		me.isDownScrolling = false;
-		me.endDownScrollCall(me);
-		if(!me.isScrollBody){
-			me.setScrollHeight(0) // scroll-view重置滚动区域,使数据不满屏时仍可检查触发翻页
-			me.scrollTo(0,0) // scroll-view需重置滚动条到顶部,避免startTop大于0时,对下拉刷新的影响
-		}
-	}
-	// 结束下拉刷新时的回调
-	let delay = 0;
-	if (me.optDown.beforeEndDownScroll) {
-		delay = me.optDown.beforeEndDownScroll(me); // 结束下拉刷新的延时,单位ms
-		if(me.isDownEndSuccess == null) delay = 0; // 没有执行加载中,则不延时
-	}
-	if (typeof delay === 'number' && delay > 0) {
-		setTimeout(endScroll, delay);
-	} else {
-		endScroll();
-	}
-}
-
-MeScroll.prototype.endDownScrollCall = function() {
-	this.optDown.endDownScroll && this.optDown.endDownScroll(this);
-	this.optDown.afterEndDownScroll && this.optDown.afterEndDownScroll(this);
-}
-
-/* 锁定下拉刷新:isLock=ture,null锁定;isLock=false解锁 */
-MeScroll.prototype.lockDownScroll = function(isLock) {
-	if (isLock == null) isLock = true;
-	this.optDown.isLock = isLock;
-}
-
-/* 锁定上拉加载:isLock=ture,null锁定;isLock=false解锁 */
-MeScroll.prototype.lockUpScroll = function(isLock) {
-	if (isLock == null) isLock = true;
-	this.optUp.isLock = isLock;
-}
-
-/* -------初始化上拉加载------- */
-MeScroll.prototype.initUpScroll = function() {
-	let me = this;
-	// 配置参数
-	me.optUp = me.options.up || {use: false}
-	if(!me.optUp.textColor && me.hasColor(me.optUp.bgColor)) me.optUp.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色
-	me.extendUpScroll(me.optUp);
-
-	if (me.optUp.use === false) return; // 配置不使用上拉加载时,则不初始化上拉布局
-	me.optUp.hasNext = true; // 如果使用上拉,则默认有下一页
-	me.startNum = me.optUp.page.num + 1; // 记录page开始的页码
-
-	// 初始化完毕的回调
-	if (me.optUp.inited) {
-		setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
-			me.optUp.inited(me);
-		}, 0)
-	}
-}
-
-/*滚动到底部的事件 (仅mescroll-body生效)*/
-MeScroll.prototype.onReachBottom = function() {
-	if (this.isScrollBody && !this.isUpScrolling) { // 只能支持下拉刷新的时候同时可以触发上拉加载,否则滚动到底部就需要上滑一点才能触发onReachBottom
-		if (!this.optUp.isLock && this.optUp.hasNext) {
-			this.triggerUpScroll();
-		}
-	}
-}
-
-/*列表滚动事件 (仅mescroll-body生效)*/
-MeScroll.prototype.onPageScroll = function(e) {
-	if (!this.isScrollBody) return;
-	
-	// 更新滚动条的位置 (主要用于判断下拉刷新时,滚动条是否在顶部)
-	this.setScrollTop(e.scrollTop);
-
-	// 顶部按钮的显示隐藏
-	if (e.scrollTop >= this.optUp.toTop.offset) {
-		this.showTopBtn();
-	} else {
-		this.hideTopBtn();
-	}
-}
-
-/*列表滚动事件*/
-MeScroll.prototype.scroll = function(e, onScroll) {
-	// 更新滚动条的位置
-	this.setScrollTop(e.scrollTop);
-	// 更新滚动内容高度
-	this.setScrollHeight(e.scrollHeight);
-
-	// 向上滑还是向下滑动
-	if (this.preScrollY == null) this.preScrollY = 0;
-	this.isScrollUp = e.scrollTop - this.preScrollY > 0;
-	this.preScrollY = e.scrollTop;
-
-	// 上滑 && 检查并触发上拉
-	this.isScrollUp && this.triggerUpScroll(true);
-
-	// 顶部按钮的显示隐藏
-	if (e.scrollTop >= this.optUp.toTop.offset) {
-		this.showTopBtn();
-	} else {
-		this.hideTopBtn();
-	}
-
-	// 滑动监听
-	this.optUp.onScroll && onScroll && onScroll()
-}
-
-/* 触发上拉加载 */
-MeScroll.prototype.triggerUpScroll = function(isCheck) {
-	if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) {
-		// 是否校验在底部; 默认不校验
-		if (isCheck === true) {
-			let canUp = false;
-			// 还有下一页 && 没有锁定 && 不在下拉中
-			if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) {
-				if (this.getScrollBottom() <= this.optUp.offset) { // 到底部
-					canUp = true; // 标记可上拉
-				}
-			}
-			if (canUp === false) return;
-		}
-		this.showUpScroll(); // 上拉加载中...
-		this.optUp.page.num++; // 预先加一页,如果失败则减回
-		this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调
-		this.num = this.optUp.page.num; // 把最新的页数赋值在mescroll上,避免对page的影响
-		this.size = this.optUp.page.size; // 把最新的页码赋值在mescroll上,避免对page的影响
-		this.time = this.optUp.page.time; // 把最新的页码赋值在mescroll上,避免对page的影响
-		this.optUp.callback(this); // 执行回调,联网加载数据
-	}
-}
-
-/* 显示上拉加载中 */
-MeScroll.prototype.showUpScroll = function() {
-	this.isUpScrolling = true; // 标记上拉加载中
-	this.optUp.showLoading && this.optUp.showLoading(this); // 回调
-}
-
-/* 显示上拉无更多数据 */
-MeScroll.prototype.showNoMore = function() {
-	this.optUp.hasNext = false; // 标记无更多数据
-	this.optUp.showNoMore && this.optUp.showNoMore(this); // 回调
-}
-
-/* 隐藏上拉区域**/
-MeScroll.prototype.hideUpScroll = function() {
-	this.optUp.hideUpScroll && this.optUp.hideUpScroll(this); // 回调
-}
-
-/* 结束上拉加载 */
-MeScroll.prototype.endUpScroll = function(isShowNoMore) {
-	if (isShowNoMore != null) { // isShowNoMore=null,不处理下拉状态,下拉刷新的时候调用
-		if (isShowNoMore) {
-			this.showNoMore(); // isShowNoMore=true,显示无更多数据
-		} else {
-			this.hideUpScroll(); // isShowNoMore=false,隐藏上拉加载
-		}
-	}
-	this.isUpScrolling = false; // 标记结束上拉加载
-}
-
-/* 重置上拉加载列表为第一页
- *isShowLoading 是否显示进度布局;
- * 1.默认null,不传参,则显示上拉加载的进度布局
- * 2.传参true, 则显示下拉刷新的进度布局
- * 3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据)
- */
-MeScroll.prototype.resetUpScroll = function(isShowLoading) {
-	if (this.optUp && this.optUp.use) {
-		let page = this.optUp.page;
-		this.prePageNum = page.num; // 缓存重置前的页码,加载失败可退回
-		this.prePageTime = page.time; // 缓存重置前的时间,加载失败可退回
-		page.num = this.startNum; // 重置为第一页
-		page.time = null; // 重置时间为空
-		if (!this.isDownScrolling && isShowLoading !== false) { // 如果不是下拉刷新触发的resetUpScroll并且不配置列表静默更新,则显示进度;
-			if (isShowLoading == null) {
-				this.removeEmpty(); // 移除空布局
-				this.showUpScroll(); // 不传参,默认显示上拉加载的进度布局
-			} else {
-				this.showDownScroll(); // 传true,显示下拉刷新的进度布局,不清空列表
-			}
-		}
-		this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调
-		this.num = page.num; // 把最新的页数赋值在mescroll上,避免对page的影响
-		this.size = page.size; // 把最新的页码赋值在mescroll上,避免对page的影响
-		this.time = page.time; // 把最新的页码赋值在mescroll上,避免对page的影响
-		this.optUp.callback && this.optUp.callback(this); // 执行上拉回调
-	}
-}
-
-/* 设置page.num的值 */
-MeScroll.prototype.setPageNum = function(num) {
-	this.optUp.page.num = num - 1;
-}
-
-/* 设置page.size的值 */
-MeScroll.prototype.setPageSize = function(size) {
-	this.optUp.page.size = size;
-}
-
-/* 联网回调成功,结束下拉刷新和上拉加载
- * dataSize: 当前页的数据量(必传)
- * totalPage: 总页数(必传)
- * systime: 服务器时间 (可空)
- */
-MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) {
-	let hasNext;
-	if (this.optUp.use && totalPage != null) hasNext = this.optUp.page.num < totalPage; // 是否还有下一页
-	this.endSuccess(dataSize, hasNext, systime);
-}
-
-/* 联网回调成功,结束下拉刷新和上拉加载
- * dataSize: 当前页的数据量(必传)
- * totalSize: 列表所有数据总数量(必传)
- * systime: 服务器时间 (可空)
- */
-MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) {
-	let hasNext;
-	if (this.optUp.use && totalSize != null) {
-		let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize; // 已加载的数据总数
-		hasNext = loadSize < totalSize; // 是否还有下一页
-	}
-	this.endSuccess(dataSize, hasNext, systime);
-}
-
-/* 联网回调成功,结束下拉刷新和上拉加载
- * dataSize: 当前页的数据个数(不是所有页的数据总和),用于上拉加载判断是否还有下一页.如果不传,则会判断还有下一页
- * hasNext: 是否还有下一页,布尔类型;用来解决这个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据dataSize判断,则需翻到第三页才会知道无更多数据,如果传了hasNext,则翻到第二页即可显示无更多数据.
- * systime: 服务器时间(可空);用来解决这个小问题:当准备翻下一页时,数据库新增了几条记录,此时翻下一页,前面的几条数据会和上一页的重复;这里传入了systime,那么upCallback的page.time就会有值,把page.time传给服务器,让后台过滤新加入的那几条记录
- */
-MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) {
-	let me = this;
-	// 结束下拉刷新
-	if (me.isDownScrolling) {
-		me.isDownEndSuccess = true
-		me.endDownScroll();
-	}
-
-	// 结束上拉加载
-	if (me.optUp.use) {
-		let isShowNoMore; // 是否已无更多数据
-		if (dataSize != null) {
-			let pageNum = me.optUp.page.num; // 当前页码
-			let pageSize = me.optUp.page.size; // 每页长度
-			// 如果是第一页
-			if (pageNum === 1) {
-				if (systime) me.optUp.page.time = systime; // 设置加载列表数据第一页的时间
-			}
-			if (dataSize < pageSize || hasNext === false) {
-				// 返回的数据不满一页时,则说明已无更多数据
-				me.optUp.hasNext = false;
-				if (dataSize === 0 && pageNum === 1) {
-					// 如果第一页无任何数据且配置了空布局
-					isShowNoMore = false;
-					me.showEmpty();
-				} else {
-					// 总列表数少于配置的数量,则不显示无更多数据
-					let allDataSize = (pageNum - 1) * pageSize + dataSize;
-					if (allDataSize < me.optUp.noMoreSize) {
-						isShowNoMore = false;
-					} else {
-						isShowNoMore = true;
-					}
-					me.removeEmpty(); // 移除空布局
-				}
-			} else {
-				// 还有下一页
-				isShowNoMore = false;
-				me.optUp.hasNext = true;
-				me.removeEmpty(); // 移除空布局
-			}
-		}
-
-		// 隐藏上拉
-		me.endUpScroll(isShowNoMore);
-	}
-}
-
-/* 回调失败,结束下拉刷新和上拉加载 */
-MeScroll.prototype.endErr = function(errDistance) {
-	// 结束下拉,回调失败重置回原来的页码和时间
-	if (this.isDownScrolling) {
-		this.isDownEndSuccess = false
-		let page = this.optUp.page;
-		if (page && this.prePageNum) {
-			page.num = this.prePageNum;
-			page.time = this.prePageTime;
-		}
-		this.endDownScroll();
-	}
-	// 结束上拉,回调失败重置回原来的页码
-	if (this.isUpScrolling) {
-		this.optUp.page.num--;
-		this.endUpScroll(false);
-		// 如果是mescroll-body,则需往回滚一定距离
-		if(this.isScrollBody && errDistance !== 0){ // 不处理0
-			if(!errDistance) errDistance = this.optUp.errDistance; // 不传,则取默认
-			this.scrollTo(this.getScrollTop() - errDistance, 0) // 往上回滚的距离
-		}
-	}
-}
-
-/* 显示空布局 */
-MeScroll.prototype.showEmpty = function() {
-	this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true)
-}
-
-/* 移除空布局 */
-MeScroll.prototype.removeEmpty = function() {
-	this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false)
-}
-
-/* 显示回到顶部的按钮 */
-MeScroll.prototype.showTopBtn = function() {
-	if (!this.topBtnShow) {
-		this.topBtnShow = true;
-		this.optUp.toTop.onShow && this.optUp.toTop.onShow(true);
-	}
-}
-
-/* 隐藏回到顶部的按钮 */
-MeScroll.prototype.hideTopBtn = function() {
-	if (this.topBtnShow) {
-		this.topBtnShow = false;
-		this.optUp.toTop.onShow && this.optUp.toTop.onShow(false);
-	}
-}
-
-/* 获取滚动条的位置 */
-MeScroll.prototype.getScrollTop = function() {
-	return this.scrollTop || 0
-}
-
-/* 记录滚动条的位置 */
-MeScroll.prototype.setScrollTop = function(y) {
-	this.scrollTop = y;
-}
-
-/* 滚动到指定位置 */
-MeScroll.prototype.scrollTo = function(y, t) {
-	this.myScrollTo && this.myScrollTo(y, t) // scrollview需自定义回到顶部方法
-}
-
-/* 自定义scrollTo */
-MeScroll.prototype.resetScrollTo = function(myScrollTo) {
-	this.myScrollTo = myScrollTo
-}
-
-/* 滚动条到底部的距离 */
-MeScroll.prototype.getScrollBottom = function() {
-	return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop()
-}
-
-/* 计步器
- star: 开始值
- end: 结束值
- callback(step,timer): 回调step值,计步器timer,可自行通过window.clearInterval(timer)结束计步器;
- t: 计步时长,传0则直接回调end值;不传则默认300ms
- rate: 周期;不传则默认30ms计步一次
- * */
-MeScroll.prototype.getStep = function(star, end, callback, t, rate) {
-	let diff = end - star; // 差值
-	if (t === 0 || diff === 0) {
-		callback && callback(end);
-		return;
-	}
-	t = t || 300; // 时长 300ms
-	rate = rate || 30; // 周期 30ms
-	let count = t / rate; // 次数
-	let step = diff / count; // 步长
-	let i = 0; // 计数
-	let timer = setInterval(function() {
-		if (i < count - 1) {
-			star += step;
-			callback && callback(star, timer);
-			i++;
-		} else {
-			callback && callback(end, timer); // 最后一次直接设置end,避免计算误差
-			clearInterval(timer);
-		}
-	}, rate);
-}
-
-/* 滚动容器的高度 */
-MeScroll.prototype.getClientHeight = function(isReal) {
-	let h = this.clientHeight || 0
-	if (h === 0 && isReal !== true) { // 未获取到容器的高度,可临时取body的高度 (可能会有误差)
-		h = this.getBodyHeight()
-	}
-	return h
-}
-MeScroll.prototype.setClientHeight = function(h) {
-	this.clientHeight = h;
-}
-
-/* 滚动内容的高度 */
-MeScroll.prototype.getScrollHeight = function() {
-	return this.scrollHeight || 0;
-}
-MeScroll.prototype.setScrollHeight = function(h) {
-	this.scrollHeight = h;
-}
-
-/* body的高度 */
-MeScroll.prototype.getBodyHeight = function() {
-	return this.bodyHeight || 0;
-}
-MeScroll.prototype.setBodyHeight = function(h) {
-	this.bodyHeight = h;
-}
-
-/* 阻止浏览器默认滚动事件 */
-MeScroll.prototype.preventDefault = function(e) {
-	// 小程序不支持e.preventDefault, 已在wxs中禁止
-	// app的bounce只能通过配置pages.json的style.app-plus.bounce为"none"来禁止, 或使用renderjs禁止
-	// cancelable:是否可以被禁用; defaultPrevented:是否已经被禁用
-	if (e && e.cancelable && !e.defaultPrevented) e.preventDefault()
-}

+ 0 - 47
node_modules/mescroll-uni/mixins/mescroll-comp.js

@@ -1,47 +0,0 @@
-/**
- * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期
- */
-const MescrollCompMixin = {
-	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 (一级)
-	onPageScroll(e) {
-		this.handlePageScroll(e)
-	},
-	onReachBottom() {
-		this.handleReachBottom()
-	},
-	// 当down的native: true时, 还需传递此方法进到子组件
-	onPullDownRefresh(){
-		this.handlePullDownRefresh()
-	},
-	data() {
-		return {
-			mescroll: { // mescroll-body写在子子子...组件的情况 (多级)
-				onPageScroll: e=>{
-					this.handlePageScroll(e)
-				},
-				onReachBottom: ()=>{
-					this.handleReachBottom()
-				},
-				onPullDownRefresh: ()=>{
-					this.handlePullDownRefresh()
-				}
-			}
-		}
-	},
-	methods:{
-		handlePageScroll(e){
-			let item = this.$refs["mescrollItem"];
-			if(item && item.mescroll) item.mescroll.onPageScroll(e);
-		},
-		handleReachBottom(){
-			let item = this.$refs["mescrollItem"];
-			if(item && item.mescroll) item.mescroll.onReachBottom();
-		},
-		handlePullDownRefresh(){
-			let item = this.$refs["mescrollItem"];
-			if(item && item.mescroll) item.mescroll.onPullDownRefresh();
-		}
-	}
-}
-
-export default MescrollCompMixin;

+ 0 - 66
node_modules/mescroll-uni/mixins/mescroll-more-item.js

@@ -1,66 +0,0 @@
-/**
- * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例)
- */
-const MescrollMoreItemMixin = {
-	// 支付宝小程序不支持props的mixin,需写在具体的页面中
-	// #ifndef MP-ALIPAY || MP-DINGTALK
-	props:{
-		i: Number, // 每个tab页的专属下标
-		index: { // 当前tab的下标
-			type: Number,
-			default(){
-				return 0
-			}
-		}
-	},
-	// #endif
-	data() {
-		return {
-			downOption:{
-				auto:false // 不自动加载
-			},
-			upOption:{
-				auto:false // 不自动加载
-			},
-			isInit: false // 当前tab是否已初始化
-		}
-	},
-	watch:{
-		// 监听下标的变化
-		index(val){
-			if (this.i === val && !this.isInit) this.mescrollTrigger()
-		}
-	},
-	methods: {
-		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
-		mescrollInitByRef() {
-			if(!this.mescroll || !this.mescroll.resetUpScroll){
-				// 字节跳动小程序编辑器不支持一个页面存在相同的ref, 多mescroll的ref需动态生成, 格式为'mescrollRef下标'
-				let mescrollRef = this.$refs.mescrollRef || this.$refs['mescrollRef'+this.i];
-				if(mescrollRef) this.mescroll = mescrollRef.mescroll
-			}
-		},
-		// mescroll组件初始化的回调,可获取到mescroll对象 (覆盖mescroll-mixins.js的mescrollInit, 为了标记isInit)
-		mescrollInit(mescroll) {
-			this.mescroll = mescroll;
-			this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序
-			// 自动加载当前tab的数据
-			if(this.i === this.index){
-				this.mescrollTrigger()
-			}
-		},
-		// 主动触发加载
-		mescrollTrigger(){
-			this.isInit = true; // 标记为true
-			if (this.mescroll) {
-				if (this.mescroll.optDown.use) {
-					this.mescroll.triggerDownScroll();
-				} else{
-					this.mescroll.triggerUpScroll();
-				}
-			}
-		}
-	}
-}
-
-export default MescrollMoreItemMixin;

+ 0 - 74
node_modules/mescroll-uni/mixins/mescroll-more.js

@@ -1,74 +0,0 @@
-/**
- * mescroll-body写在子组件时, 需通过mescroll的mixins补充子组件缺少的生命周期
- */
-const MescrollMoreMixin = {
-	data() {
-		return {
-			tabIndex: 0, // 当前tab下标
-			mescroll: { // mescroll-body写在子子子...组件的情况 (多级)
-				onPageScroll: e=>{
-					this.handlePageScroll(e)
-				},
-				onReachBottom: ()=>{
-					this.handleReachBottom()
-				},
-				onPullDownRefresh: ()=>{
-					this.handlePullDownRefresh()
-				}
-			}
-		}
-	},
-	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件
-	onPageScroll(e) {
-		this.handlePageScroll(e)
-	},
-	onReachBottom() {
-		this.handleReachBottom()
-	},
-	// 当down的native: true时, 还需传递此方法进到子组件
-	onPullDownRefresh(){
-		this.handlePullDownRefresh()
-	},
-	methods:{
-		handlePageScroll(e){
-			let mescroll = this.getMescroll(this.tabIndex);
-			mescroll && mescroll.onPageScroll(e);
-		},
-		handleReachBottom(){
-			let mescroll = this.getMescroll(this.tabIndex);
-			mescroll && mescroll.onReachBottom();
-		},
-		handlePullDownRefresh(){
-			let mescroll = this.getMescroll(this.tabIndex);
-			mescroll && mescroll.onPullDownRefresh();
-		},
-		// 根据下标获取对应子组件的mescroll
-		getMescroll(i){
-			if(!this.mescrollItems) this.mescrollItems = [];
-			if(!this.mescrollItems[i]) {
-				// v-for中的refs
-				let vForItem = this.$refs["mescrollItem"];
-				if(vForItem){
-					this.mescrollItems[i] = vForItem[i]
-				}else{
-					// 普通的refs,不可重复
-					this.mescrollItems[i] = this.$refs["mescrollItem"+i];
-				}
-			}
-			let item = this.mescrollItems[i]
-			return item ? item.mescroll : null
-		},
-		// 切换tab,恢复滚动条位置
-		tabChange(i){
-			let mescroll = this.getMescroll(i);
-			if(mescroll){
-				// 延时(比$nextTick靠谱一些),确保元素已渲染
-				setTimeout(()=>{
-					mescroll.scrollTo(mescroll.getScrollTop(),0)
-				},30)
-			}
-		}
-	}
-}
-
-export default MescrollMoreMixin;

+ 0 - 41
node_modules/mescroll-uni/package.json

@@ -1,41 +0,0 @@
-{
-  "_args": [
-    [
-      "mescroll-uni@1.3.7",
-      "C:\\Users\\Administrator\\Desktop\\项目\\直播\\liveH5-v3"
-    ]
-  ],
-  "_from": "mescroll-uni@1.3.7",
-  "_id": "mescroll-uni@1.3.7",
-  "_inBundle": false,
-  "_integrity": "sha512-1pQMtGA+iVRKhfJZZNXdBx05NnthIk6zm3hRbumswSA54eaKOMgpUDb9AQ2+rRdXmS6kLkEYSbW/fkb7/IyoAg==",
-  "_location": "/mescroll-uni",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "mescroll-uni@1.3.7",
-    "name": "mescroll-uni",
-    "escapedName": "mescroll-uni",
-    "rawSpec": "1.3.7",
-    "saveSpec": null,
-    "fetchSpec": "1.3.7"
-  },
-  "_requiredBy": [
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/mescroll-uni/-/mescroll-uni-1.3.7.tgz",
-  "_spec": "1.3.7",
-  "_where": "C:\\Users\\Administrator\\Desktop\\项目\\直播\\liveH5-v3",
-  "author": {
-    "name": "wenju"
-  },
-  "description": "mescroll的uni-app版本:【wxs+renderjs实现】高性能的下拉刷新上拉加载组件",
-  "license": "MIT",
-  "main": "mescroll-uni.vue",
-  "name": "mescroll-uni",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.3.7"
-}

+ 0 - 109
node_modules/mescroll-uni/wxs/mixins.js

@@ -1,109 +0,0 @@
-// 定义在wxs (含renderjs) 逻辑层的数据和方法, 与视图层相互通信
-const WxsMixin = {
-	data() {
-		return {
-			// 传入wxs视图层的数据 (响应式)
-			wxsProp: {
-				optDown:{}, // 下拉刷新的配置
-				scrollTop:0, // 滚动条的距离
-				bodyHeight:0, // body的高度
-				isDownScrolling:false, // 是否正在下拉刷新中
-				isUpScrolling:false, // 是否正在上拉加载中
-				isScrollBody:true, // 是否为mescroll-body滚动
-				isUpBoth:true, // 上拉加载时,是否同时可以下拉刷新
-				t: 0 // 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
-			},
-			
-			// 标记调用wxs视图层的方法
-			callProp: {
-				callType: '', // 方法名
-				t: 0 // 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
-			},
-			
-			// 不用wxs的平台使用此处的wxsBiz对象,抹平wxs的写法 (微信小程序和APP使用的wxsBiz对象是./wxs/wxs.wxs)
-			// #ifndef MP-WEIXIN || MP-QQ || APP-PLUS || H5
-			wxsBiz: {
-				//注册列表touchstart事件,用于下拉刷新
-				touchstartEvent: e=> {
-					this.mescroll.touchstartEvent(e);
-				},
-				//注册列表touchmove事件,用于下拉刷新
-				touchmoveEvent: e=> {
-					this.mescroll.touchmoveEvent(e);
-				},
-				//注册列表touchend事件,用于下拉刷新
-				touchendEvent: e=> {
-					this.mescroll.touchendEvent(e);
-				},
-				propObserver(){}, // 抹平wxs的写法
-				callObserver(){} // 抹平wxs的写法
-			},
-			// #endif
-			
-			// 不用renderjs的平台使用此处的renderBiz对象,抹平renderjs的写法 (app 和 h5 使用的renderBiz对象是./wxs/renderjs.js)
-			// #ifndef APP-PLUS || H5
-			renderBiz: {
-				propObserver(){} // 抹平renderjs的写法
-			}
-			// #endif
-		}
-	},
-	methods: {
-		// wxs视图层调用逻辑层的回调
-		wxsCall(msg){
-			if(msg.type === 'setWxsProp'){
-				// 更新wxsProp数据 (值改变才触发更新)
-				this.wxsProp = {
-					optDown: this.mescroll.optDown,
-					scrollTop: this.mescroll.getScrollTop(),
-					bodyHeight: this.mescroll.getBodyHeight(),
-					isDownScrolling: this.mescroll.isDownScrolling,
-					isUpScrolling: this.mescroll.isUpScrolling,
-					isUpBoth: this.mescroll.optUp.isBoth,
-					isScrollBody:this.mescroll.isScrollBody,
-					t: Date.now()
-				}
-			}else if(msg.type === 'setLoadType'){
-				// 设置inOffset,outOffset的状态
-				this.downLoadType = msg.downLoadType
-				// 状态挂载到mescroll对象, 以便在其他组件中使用, 比如<me-video>中
-				this.$set(this.mescroll, 'downLoadType', this.downLoadType)
-				// 重置是否加载成功的状态
-				this.$set(this.mescroll, 'isDownEndSuccess', null)
-			}else if(msg.type === 'triggerDownScroll'){
-				// 主动触发下拉刷新
-				this.mescroll.triggerDownScroll();
-			}else if(msg.type === 'endDownScroll'){
-				// 结束下拉刷新
-				this.mescroll.endDownScroll();
-			}else if(msg.type === 'triggerUpScroll'){
-				// 主动触发上拉加载
-				this.mescroll.triggerUpScroll(true);
-			}
-		}
-	},
-	mounted() {
-		// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5
-		// 配置主动触发wxs显示加载进度的回调
-		this.mescroll.optDown.afterLoading = ()=>{
-			this.callProp = {callType: "showLoading", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
-		}
-		// 配置主动触发wxs隐藏加载进度的回调
-		this.mescroll.optDown.afterEndDownScroll = ()=>{
-			this.callProp = {callType: "endDownScroll", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
-			let delay = 300 + (this.mescroll.optDown.beforeEndDelay || 0)
-			setTimeout(()=>{
-				if(this.downLoadType === 4 || this.downLoadType === 0){
-					this.callProp = {callType: "clearTransform", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
-				}
-				// 状态挂载到mescroll对象, 以便在其他组件中使用, 比如<me-video>中
-				this.$set(this.mescroll, 'downLoadType', this.downLoadType)
-			}, delay)
-		}
-		// 初始化wxs的数据
-		this.wxsCall({type: 'setWxsProp'})
-		// #endif
-	}
-}
-
-export default WxsMixin;

+ 0 - 92
node_modules/mescroll-uni/wxs/renderjs.js

@@ -1,92 +0,0 @@
-// 使用renderjs直接操作window对象,实现动态控制app和h5的bounce
-// bounce: iOS橡皮筋,Android半月弧,h5浏览器下拉背景等效果 (下拉刷新时禁止)
-// https://uniapp.dcloud.io/frame?id=renderjs
-
-// 与wxs的me实例一致
-var me = {}
-
-// 初始化window对象的touch事件 (仅初始化一次)
-if(window && !window.$mescrollRenderInit){
-	window.$mescrollRenderInit = true
-	
-	
-	window.addEventListener('touchstart', function(e){
-		if (me.disabled()) return;
-		me.startPoint = me.getPoint(e); // 记录起点
-	}, {passive: true})
-	
-	
-	window.addEventListener('touchmove', function(e){
-		if (me.disabled()) return;
-		if (me.getScrollTop() > 0) return; // 需在顶部下拉,才禁止bounce
-		
-		var curPoint = me.getPoint(e); // 当前点
-		var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
-		// 向下拉
-		if (moveY > 0) {
-			// 可下拉的条件
-			if (!me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && me.isUpBoth))) {
-				
-				// 只有touch在mescroll的view上面,才禁止bounce
-				var el = e.target;
-				var isMescrollTouch = false;
-				while (el && el.tagName && el.tagName !== 'UNI-PAGE-BODY' && el.tagName != "BODY") {
-					var cls = el.classList;
-					if (cls && cls.contains('mescroll-render-touch')) {
-						isMescrollTouch = true
-						break;
-					}
-					el = el.parentNode; // 继续检查其父元素
-				}
-				// 禁止bounce (不会对swiper和iOS侧滑返回造成影响)
-				if (isMescrollTouch && e.cancelable && !e.defaultPrevented) e.preventDefault();
-			}
-		}
-	}, {passive: false})
-}
-
-/* 获取滚动条的位置 */
-me.getScrollTop = function() {
-	return me.scrollTop || 0
-}
-
-/* 是否禁用下拉刷新 */
-me.disabled = function(){
-	return !me.optDown || !me.optDown.use || me.optDown.native
-}
-
-/* 根据点击滑动事件获取第一个手指的坐标 */
-me.getPoint = function(e) {
-	if (!e) {
-		return {x: 0,y: 0}
-	}
-	if (e.touches && e.touches[0]) {
-		return {x: e.touches[0].pageX,y: e.touches[0].pageY}
-	} else if (e.changedTouches && e.changedTouches[0]) {
-		return {x: e.changedTouches[0].pageX,y: e.changedTouches[0].pageY}
-	} else {
-		return {x: e.clientX,y: e.clientY}
-	}
-}
-
-/**
- * 监听逻辑层数据的变化 (实时更新数据)
- */
-function propObserver(wxsProp) {
-	me.optDown = wxsProp.optDown
-	me.scrollTop = wxsProp.scrollTop
-	me.isDownScrolling = wxsProp.isDownScrolling
-	me.isUpScrolling = wxsProp.isUpScrolling
-	me.isUpBoth = wxsProp.isUpBoth
-}
-
-/* 导出模块 */
-const renderBiz = {
-	data() {
-		return {
-			propObserver: propObserver,
-		}
-	}
-}
-
-export default renderBiz;

+ 0 - 268
node_modules/mescroll-uni/wxs/wxs.wxs

@@ -1,268 +0,0 @@
-// 使用wxs处理交互动画, 提高性能, 同时避免小程序bounce对下拉刷新的影响
-// https://uniapp.dcloud.io/frame?id=wxs
-// https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html 
-
-// 模拟mescroll实例, 与mescroll.js的写法尽量保持一致
-var me = {}
-
-// ------ 自定义下拉刷新动画 start ------
-
-/* 下拉过程中的回调,滑动过程一直在执行 (rate<1为inOffset; rate>1为outOffset) */
-me.onMoving = function (ins, rate, downHight){
-	ins.requestAnimationFrame(function () {
-		ins.selectComponent('.mescroll-wxs-content').setStyle({
-			'will-change': 'transform', // 可解决下拉过程中, image和swiper脱离文档流的问题
-			'transform': 'translateY(' + downHight + 'px)',
-			'transition': ''
-		})
-		// 环形进度条
-		var progress = ins.selectComponent('.mescroll-wxs-progress')
-		progress && progress.setStyle({transform: 'rotate(' + 360 * rate + 'deg)'})
-	})
-}
-
-/* 显示下拉刷新进度 */
-me.showLoading = function (ins){
-	me.downHight = me.optDown.offset
-	ins.requestAnimationFrame(function () {
-		ins.selectComponent('.mescroll-wxs-content').setStyle({
-			'will-change': 'auto',
-			'transform': 'translateY(' + me.downHight + 'px)',
-			'transition': 'transform 300ms'
-		})
-	})
-}
-
-/* 结束下拉 */
-me.endDownScroll = function (ins){
-	me.downHight = 0;
-	me.isDownScrolling = false;
-	ins.requestAnimationFrame(function () {
-		ins.selectComponent('.mescroll-wxs-content').setStyle({
-			'will-change': 'auto',
-			'transform': 'translateY(0)', // 不可以写空串,否则scroll-view渲染不完整 (延时350ms会调clearTransform置空)
-			'transition': 'transform 300ms'
-		})
-	})
-}
-
-/* 结束下拉动画执行完毕后, 清除transform和transition, 避免对列表内容样式造成影响, 如: h5的list-msg示例下拉进度条漏出来等 */
-me.clearTransform = function (ins){
-	ins.requestAnimationFrame(function () {
-		ins.selectComponent('.mescroll-wxs-content').setStyle({
-			'will-change': '',
-			'transform': '',
-			'transition': ''
-		})
-	})
-}
-
-// ------ 自定义下拉刷新动画 end ------
-
-/**
- * 监听逻辑层数据的变化 (实时更新数据)
- */
-function propObserver(wxsProp) {
-	me.optDown = wxsProp.optDown
-	me.scrollTop = wxsProp.scrollTop
-	me.bodyHeight = wxsProp.bodyHeight
-	me.isDownScrolling = wxsProp.isDownScrolling
-	me.isUpScrolling = wxsProp.isUpScrolling
-	me.isUpBoth = wxsProp.isUpBoth
-	me.isScrollBody = wxsProp.isScrollBody
-	me.startTop = wxsProp.scrollTop // 及时更新touchstart触发的startTop, 避免scroll-view快速惯性滚动到顶部取值不准确
-}
-
-/**
- * 监听逻辑层数据的变化 (调用wxs的方法)
- */
-function callObserver(callProp, oldValue, ins) {
-	if (me.disabled()) return;
-	if(callProp.callType){
-		// 逻辑层(App Service)的style已失效,需在视图层(Webview)设置style
-		if(callProp.callType === 'showLoading'){
-			me.showLoading(ins)
-		}else if(callProp.callType === 'endDownScroll'){
-			me.endDownScroll(ins)
-		}else if(callProp.callType === 'clearTransform'){
-			me.clearTransform(ins)
-		}
-	}
-}
-
-/**
- * touch事件
- */
-function touchstartEvent(e, ins) {
-	me.downHight = 0; // 下拉的距离
-	me.startPoint = me.getPoint(e); // 记录起点
-	me.startTop = me.getScrollTop(); // 记录此时的滚动条位置
-	me.startAngle = 0; // 初始角度
-	me.lastPoint = me.startPoint; // 重置上次move的点
-	me.maxTouchmoveY = me.getBodyHeight() - me.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况)
-	me.inTouchend = false; // 标记不是touchend
-	
-	me.callMethod(ins, {type: 'setWxsProp'}) // 同步更新wxsProp的数据 (小程序是异步的,可能touchmove先执行,才到propObserver; h5和app是同步)
-}
-
-function touchmoveEvent(e, ins) {
-	var isPrevent = true // false表示不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault (对小程序生效, h5和app无效)
-	
-	if (me.disabled()) return isPrevent;
-	
-	var scrollTop = me.getScrollTop(); // 当前滚动条的距离
-	var curPoint = me.getPoint(e); // 当前点
-	
-	var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
-	
-	// 向下拉 && 在顶部
-	// mescroll-body,直接判定在顶部即可
-	// scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove
-	// scroll-view滚动到顶部时,scrollTop不一定为0,也有可能大于0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等
-	if (moveY > 0 && (
-			(me.isScrollBody && scrollTop <= 0)
-			||
-			(!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop)) )
-		)) {
-		// 可下拉的条件
-		if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling &&
-				me.isUpBoth))) {
-	
-			// 下拉的角度是否在配置的范围内
-			if(!me.startAngle) me.startAngle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90]
-			if (me.startAngle < me.optDown.minAngle) return isPrevent; // 如果小于配置的角度,则不往下执行下拉刷新
-	
-			// 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发
-			if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) {
-				me.inTouchend = true; // 标记执行touchend
-				touchendEvent(e, ins); // 提前触发touchend
-				return isPrevent;
-			}
-			
-			isPrevent = false // 小程序是return false
-	
-			var diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上)
-	
-			// 下拉距离  < 指定距离
-			if (me.downHight < me.optDown.offset) {
-				if (me.movetype !== 1) {
-					me.movetype = 1; // 加入标记,保证只执行一次
-					// me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次
-					me.callMethod(ins, {type: 'setLoadType', downLoadType: 1})
-					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
-				}
-				me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小
-	
-				// 指定距离  <= 下拉距离
-			} else {
-				if (me.movetype !== 2) {
-					me.movetype = 2; // 加入标记,保证只执行一次
-					// me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次
-					me.callMethod(ins, {type: 'setLoadType', downLoadType: 2})
-					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
-				}
-				if (diff > 0) { // 向下拉
-					me.downHight += diff * me.optDown.outOffsetRate; // 越往下,高度变化越小
-				} else { // 向上收
-					me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度
-				}
-			}
-			
-			me.downHight = Math.round(me.downHight) // 取整
-			var rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值
-			// me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行
-			me.onMoving(ins, rate, me.downHight)
-		}
-	}
-	
-	me.lastPoint = curPoint; // 记录本次移动的点
-	
-	return isPrevent // false表示不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault (对小程序生效, h5和app无效)
-}
-
-function touchendEvent(e, ins) {
-	// 如果下拉区域高度已改变,则需重置回来
-	if (me.isMoveDown) {
-		if (me.downHight >= me.optDown.offset) {
-			// 符合触发刷新的条件
-			me.downHight = me.optDown.offset; // 更新下拉区域高度
-			// me.triggerDownScroll();
-			me.callMethod(ins, {type: 'triggerDownScroll'})
-		} else {
-			// 不符合的话 则重置
-			me.downHight = 0;
-			// me.optDown.endDownScroll && me.optDown.endDownScroll(me);
-			me.callMethod(ins, {type: 'endDownScroll'})
-		}
-		me.movetype = 0;
-		me.isMoveDown = false;
-	} else if (!me.isScrollBody && me.getScrollTop() === me.startTop) { // scroll-view到顶/左/右/底的滑动事件
-		var isScrollUp = me.getPoint(e).y - me.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
-		// 上滑
-		if (isScrollUp) {
-			// 需检查滑动的角度
-			var angle = me.getAngle(me.getPoint(e), me.startPoint); // 两点之间的角度,区间 [0,90]
-			if (angle > 80) {
-				// 检查并触发上拉
-				// me.triggerUpScroll(true);
-				me.callMethod(ins, {type: 'triggerUpScroll'})
-			}
-		}
-	}
-	me.callMethod(ins, {type: 'setWxsProp'}) // 同步更新wxsProp的数据 (小程序是异步的,可能touchmove先执行,才到propObserver; h5和app是同步)
-}
-
-/* 是否禁用下拉刷新 */
-me.disabled = function(){
-	return !me.optDown || !me.optDown.use || me.optDown.native
-}
-
-/* 根据点击滑动事件获取第一个手指的坐标 */
-me.getPoint = function(e) {
-	if (!e) {
-		return {x: 0,y: 0}
-	}
-	if (e.touches && e.touches[0]) {
-		return {x: e.touches[0].pageX,y: e.touches[0].pageY}
-	} else if (e.changedTouches && e.changedTouches[0]) {
-		return {x: e.changedTouches[0].pageX,y: e.changedTouches[0].pageY}
-	} else {
-		return {x: e.clientX,y: e.clientY}
-	}
-}
-
-/* 计算两点之间的角度: 区间 [0,90]*/
-me.getAngle = function (p1, p2) {
-	var x = Math.abs(p1.x - p2.x);
-	var y = Math.abs(p1.y - p2.y);
-	var z = Math.sqrt(x * x + y * y);
-	var angle = 0;
-	if (z !== 0) {
-		angle = Math.asin(y / z) / Math.PI * 180;
-	}
-	return angle
-}
-
-/* 获取滚动条的位置 */
-me.getScrollTop = function() {
-	return me.scrollTop || 0
-}
-
-/* 获取body的高度 */
-me.getBodyHeight = function() {
-	return me.bodyHeight || 0;
-}
-
-/* 调用逻辑层的方法 */
-me.callMethod = function(ins, param) {
-	if(ins) ins.callMethod('wxsCall', param)
-}
-
-/* 导出模块 */
-module.exports = {
-	propObserver: propObserver,
-	callObserver: callObserver,
-	touchstartEvent: touchstartEvent,
-	touchmoveEvent: touchmoveEvent,
-	touchendEvent: touchendEvent
-}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 565 - 399
pages/home/living.vue


+ 2141 - 0
pages_no/living.vue

@@ -0,0 +1,2141 @@
+<template>
+	<view class="container">
+		<!-- <view class="popup-video " v-if="!autoplay">
+			<view class="fs36 bold" v-if="livedata.status==1">——直播还未开始——</view>
+			<view class="fs36 bold" v-if="livedata.status==3">——直播已经结束——</view>
+			<view class="fs28 mtb20">了解更多,点击下方联系老师</view>
+			<view class="more" @click="showadd=!showadd">联系老师</view>
+		</view> -->
+
+		<!-- <image :src="livedata.liveImgUrl"
+	 :class="livedata.status!=2?'background-images':'background-image'"></image> -->
+		<view class="blackbg"></view>
+		<view class="content">
+			<!-- 页面内容 -->
+			<view style=" position: fixed;top: 0;z-index: 5;" class="content-top">
+				<view class="u-flex-y-center">
+					<image @click="goBack" style="width: 60rpx;height: 64rpx;margin-right: 26rpx;"
+						src="@/static/images/live/return.png"></image>
+					<view class=" align-center"
+						style="padding: 6rpx 4rpx;height: 64rpx;background: rgba(0,0,0,0.5);border-radius: 32rpx;">
+						<u-avatar :src="livedata.liveImgUrl||$img.logo" size="32"></u-avatar>
+						<view class="colorf" style="margin-left: 8rpx;">
+							<view>{{livedata.liveName?truncateString(livedata.liveName,5):"未命名"}}</view>
+							<view style="font-size: 16rpx;">
+								{{ liveViewData.follow || liveViewData.follow === 0 ? liveViewData.follow : 0 }}位粉丝
+							</view>
+						</view>
+						<view v-if="isFollow" @click="onFollow" class="follow-btn ml20">关注</view>
+						<view v-else @click="onFollow" class="follow-btn ml20">已关注</view>
+					</view>
+				</view>
+				<view class="u-flex-end align-center" @click="showadd=!showadd">
+					<image class="w52 h52 mr4" v-for="(item,index) in filteredViewers" :key="index"
+						style="border-radius: 26rpx;" :src="item.avatar||$img.logo"></image>
+					<view class="sum">{{liveUserTotal||0}}</view>
+				</view>
+			</view>
+
+			<!-- 页面内容 -->
+			<view style=" position: fixed;top:100rpx;left: 0rpx; z-index: 5;" class="content-top">
+				<view class="u-flex-y-center">
+					<image @click="onRed" v-if="redInfo?.redStatus==1" style="width: 70rpx;height: 70rpx;"
+						src="@/static/images/hongbao.png"></image>
+				</view>
+
+			</view>
+
+			<!-- 右边的 -->
+			<view :class=" showType==1 ? 'siderow-group' : 'side-group'">
+				<view class="side-item">
+					<image @click="onLike" src="/static/images/live/like.png"></image>
+					<view>{{liveViewData.like||0}}</view>
+				</view>
+				<view class="side-item">
+					<image @click="goStore()" src="/static/images/live/shop.png"></image>
+					<view>店铺</view>
+				</view>
+
+				<view class="side-item">
+					<button open-type="share">
+						<image src="/static/images/live/share.png" mode="widthFix"></image>
+					</button>
+					<view>分享</view>
+				</view>
+
+			</view>
+
+			<view class="shop-prompt u-flex-y-center" v-if="showPurchasePrompt&&orderUser?.count">
+				<image class="w32 h32 mr8" src="/static/images/live/shopping.png"></image>
+				<text> {{orderUser.userName ? maskString(orderUser.userName) : ''}} 等 {{orderUser.count || 0}}
+					人正在去购买</text>
+			</view>
+
+			<!-- object-fit:fill; -->
+			<view class="videolist " style="margin: auto 0">
+				<!-- <view class="video" :style="{height:isScreen?'100vh':''}"> -->
+				<view class="video" style="height:100vh">
+					<!-- 修改video组件以支持HLS -->
+					<!-- showType 1 横屏   2 竖屏 -->
+					<video v-if="livingUrl" id="myVideo" :class="showType == 1 ? 'video_row' : 'videotop'"
+						:src="livingUrl" :autoplay="autoplay" :controls='false' object-fit='contain'
+						:custom-cache="false" :enable-progress-gesture="false" vslide-gesture-in-fullscreen='true'
+						:show-center-play-btn="false" :http-cache="false" @error="videoError">
+					</video>
+
+					<video v-if="videoUrl" :class="showType == 1 ? 'video_row' : 'videotop'" :src="videoUrl"
+						:autoplay="autoplay" :controls='false' object-fit='contain' :custom-cache="false"
+						:enable-progress-gesture="false" vslide-gesture-in-fullscreen='true'
+						:show-center-play-btn="false" :http-cache="false" loop @error="videoError">
+					</video>
+				</view>
+			</view>
+			<view class="pb40  mt90" style="position: fixed;bottom: 0;">
+				<view class="w100 h300 mt20">
+					<scroll-view enable-flex scroll-y="true" class="talk p20 scrolly flex-1 column"
+						style="width: calc(100% - 40rpx);height: calc(100% - 40rpx);"
+						:scroll-into-view="scrollIntoView">
+						<view>
+							<view class="list justify-start" v-for="(item,index) in talklist" :key="index"
+								 v-show="item.cmd=='announcement'">
+								<view class="talk-list ml16 justify-start">
+									<view class="fs24">
+										<text class='fs24 colorf'> {{item.msg}}直播间{{messageContent}}</text>
+									</view>
+								</view>
+							</view>
+						</view>
+
+
+						<view class="list justify-start" v-for="(item,index) in talklist" :key="index"
+							:id="`list_${index}`" v-show="item.cmd!='red'&&item.cmd!='out'&&item.cmd!='entry'">
+							<view class="talk-list ml16 justify-start">
+								<view class="fs24">
+									<!-- <text style="color: #3fc69b;transform: scale(0.8);display: inline-block; "v-if="item.userId==userinfo.userId&&item.cmd=='sendMsg'">我</text> -->
+									<!-- <text style="color: #c84e1e;transform: scale(0.8);display: inline-block;" v-if="item.userType==1">[ 管理员 ]</text> -->
+									<text style="color: #FFDA73;">{{item.nickName}}:</text>
+									<text class='fs24 colorf'>{{item.msg}}</text>
+								</view>
+							</view>
+						</view>
+						<view v-if="showWelcomeMessage" class="welcome-message">
+							<view class="list justify-start" v-for="(item,index) in talklist" :key="index"
+								 v-show="item.cmd=='entry'||item.cmd=='out'">
+								<view class="talk-list ml16 justify-start">
+									<view class="fs24">
+										<text style="color: #ff89d6;">{{item.nickName}} </text>
+										<text class='fs24 colorf'> {{item.msg}}直播间{{messageContent}}</text>
+									</view>
+								</view>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+
+				<view class="justify-between p24">
+					<view class="u-flex-y-center"
+						style="background:rgba(157, 157, 157, 0.8);padding:18rpx 14rpx 18rpx 32rpx;width: 526rpx;box-sizing:border-box;border-radius:36rpx;">
+						<u-input :placeholder="placeholderText" border="none" customStyle='font-size:24rpx;'
+							v-model="value" shape='circle' color='#fff' placeholderStyle='color:#e7e7e7' class="ml20"
+							@keydown.enter="sendMsg" @confirm="sendMsg">
+						</u-input>
+						<!-- <image @click="sendMsg" class="w44 h44" src="@/static/images/live/like.png"></image> -->
+					</view>
+					<!-- :disabled='talkdisabled' ></u-input> -->
+					<!-- <view @click="sendMsg" class="colorf center ml10 fs24">发送</view> -->
+					<view class="justify-between mr30  align-center">
+						<!-- <view class="icon-bg ml20" @click="answerbtn=!answerbtn">
+							<image src="/static/images/redbag.png" class="w40 h40"></image>
+						</view> -->
+						<view class="icon-bg ml20" @click="shopping=!shopping">
+							<image src="/static/images/shopping.png" class="w48 h48"></image>
+						</view>
+						<view class="icon-bg ml20" @click="showziliao=!showziliao">
+							<image src="/static/images/more-icon.png" class="w48 h48"></image>
+						</view>
+						<!-- <view class="icon-bg ml20" :class="{ 'zoom-button-active': isZoom }"
+							@touchstart="handleTouchStart" @touchend="handleTouchEnd">
+							<image src="/static/images/dianzan.png" class="w40 h40"></image>
+						</view> -->
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- <u-popup :show="showadd" @close="close" @open="open" round='20rpx' bgColor='#fffee1'>
+			<view class="addchat p20">
+				<view class="u-flex-row-reverse u-flex">
+					<u-icon name="close" size="18" @click="showadd=!showadd"></u-icon>
+				</view>
+				<view class="column align-center">
+					<view class="fs36" style="color: #ff5c03;">扫码添加助教老师</view>
+					<view class="fs28 color6">扫码添加助教老师</view>
+					<view class="p10 mt40" style="border: #ff5c03 solid 2rpx;">
+						<image :src="codeimg" class="wh180" @touchstart="longPress" @touchend="cancelLongPress">
+						</image>
+					</view>
+					<view class="color6 mt20">长按识别二维码</view>
+				</view>
+			</view>
+		</u-popup> -->
+		<u-popup :show="showadd" @close="close" @open="openViews" round='20rpx' bgColor='#ffffff'>
+			<view class="view-box">
+				<view class="t-c fs30">在线观众</view>
+				<scroll-view scroll-y class="scroll-content" :style="{height: scrollHeight + 'px'}"
+					@scrolltolower="handleScrollToLower">
+					<view class="fs24 u-flex-y-center mb20" v-for="(item,index) in liveViewers" :key="index">
+						<view
+							:style="{color: index === 0 ? '#FF3B30' : index === 1 ? '#FF9500' : index === 2 ? '#FFCC00' :  '#8E8E93',fontWeight: index < 3 ? 'bold' : 'normal',width: '50rpx'}"
+							class="mr10">{{index+1}}</view>
+						<u-avatar :src="item.avatar||$img.logo" size="32"></u-avatar>
+						<text class="ml16">{{item.nickName||"未命名"}}</text>
+					</view>
+					<!-- <view class="loading-more" v-if="viewLoading">
+					    <u-loading mode="circle"></u-loading>
+					    <text>加载中...</text>
+					  </view> -->
+					<view class="no-more" v-if="viewNoMoreData && liveViewers.length > 0">
+						<text>没有更多了</text>
+					</view>
+				</scroll-view>
+				<view class="fs24 u-flex-y-center bottom">
+					<view class="mr10" style="width:50rpx">我</view>
+					<u-avatar :src="livedata.liveImgUrl||$img.logo" size="32"></u-avatar>
+					<text class="ml16">{{livedata.liveName||"未命名"}}</text>
+				</view>
+
+			</view>
+		</u-popup>
+		<!-- <u-popup :show="showziliao" @close="closes" round='20' bgColor='#fffee1'>
+			<view class="addchat p20 bgf" style="border-radius: 20rpx;">
+				<view class="u-flex-row-reverse u-flex">
+					<u-icon name="close" size="18" @click="showziliao=!showziliao"></u-icon>
+				</view>
+				<view class="column align-center h400">
+					<view class="fs36 " style="color: #ff5c03;">资料</view>
+					<view v-html="livedata.liveDesc"></view>
+				</view>
+			</view>
+		</u-popup> -->
+
+
+
+		<!-- 抽奖 -->
+		<!-- <u-popup :show="answerbtn" @close="closeanswer" round='40rpx' bgColor='#fff'>
+			<view class=" p20 bgf" style="border-radius: 40rpx;height: fit-content;">
+				<view class="u-flex-row-reverse u-flex">
+					<u-icon name="close" size="18" @click="answerbtn=!answerbtn"></u-icon>
+				</view>
+				<view class="column align-center h400">
+					<view class="fs36 " style="color: #000000;font-weight: bold;">答题获取红包/积分奖励</view>
+					<view class="answerpop" @click="noredanswer">
+						<view class="color6 w350 fs24">
+							边玩边学,解锁你的知识巅峰!
+						</view>
+						<view class="answera">答题挑战</view>
+					</view>
+					<view class="answerpop">
+
+						<view class="color6 fs24" v-if='redanswertips&&redanswertips.length>0'>
+							🔥 <text style="color: #ff5c03;" class="fs30 bold">{{redanswertips[1].probability}}</text>
+							%用户首抽得
+							<text style="color: #ff5c03;" class="fs40 bold">{{redanswertips[1].maxAmount}}</text>元
+						</view>
+						<view v-else class="color6 w350 fs24">
+							随机奖励
+						</view>
+						<view class="answera" @click="redbagAnswer">
+							<image src="/static/images/baganswer.png"></image>
+							<view> 获得红包</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup> -->
+
+
+		<!-- <u-popup :show="showAnswer" @close="closest" round='40' bgColor='#fffee1' mode="center">
+			<view class="answerbox p20 bgf">
+				<view class="u-flex-row-reverse u-flex">
+					<u-icon name="close" size="18" @click="closest"></u-icon>
+				</view>
+				<view class="column align-center ">
+					<view v-if="answerlist.type==1" style="width: 100%;">
+						<view class="mb40" style="text-align: center;">
+							<text class="color9 fs24">(单选)</text>{{answerlist.title}}
+						</view>
+						<view v-for="(item,index) in answerlist.content" :key="index"
+							:class=" checkboxValue[0]== item.label?'answeract itemanswer':'itemanswer' "
+							@click="handleCheckboxSelect(item.label)">{{item.label}}. {{item.content}}</view>
+					</view>
+					<view v-if="answerlist.type==2" style="width: 100%;">
+						<view class="mb40 " style="text-align: center;">
+							<text class="color9 fs24">(多选)</text>{{answerlist.title}}
+						</view>
+						<view v-for="(item,index) in answerlist.content" :key="index"
+							:class=" checkboxValue.includes(item.label)?'answeract itemanswer':'itemanswer' "
+							@click="handleCheckboxSelect(item.label)">{{item.label}}. {{item.content}}</view>
+						<view class=" submitbtn" @click="submitAnswers">确认</view>
+					</view>
+					<view class="fs24 mtb20 " style="color: #717171;">
+						{{answerfrist+1}}/{{Answerlistall}}
+					</view>
+				</view>
+			</view>
+		</u-popup> -->
+
+
+		<!-- 	<u-popup :show="showAnswerred" @close="closestred" round='40' bgColor='#fffee1' mode="center">
+			<view class="answerbox p20 bgf">
+				<view class="u-flex-row-reverse u-flex">
+					<u-icon name="close" size="18" @click="closestred"></u-icon>
+				</view>
+				<view class="column align-center ">
+					<view v-if="answerlist.type==1" style="width: 100%;">
+						<view class="mb40" style="text-align: center;">
+							<text class="color9 fs24">(单选)</text>{{answerlist.title}}
+						</view>
+						<view v-for="(item,index) in answerlist.content" :key="index"
+							:class=" checkboxValue[0]== item.label?'answeract itemanswer':'itemanswer' "
+							@click="handleCheckboxSelect(item.label)">{{item.label}}. {{item.content}}</view>
+					</view>
+					<view v-if="answerlist.type==2" style="width: 100%;">
+						<view class="mb40 " style="text-align: center;">
+							<text class="color9 fs24">(多选)</text>{{answerlist.title}}
+						</view>
+						<view v-for="(item,index) in answerlist.content" :key="index"
+							:class=" checkboxValue.includes(item.label)?'answeract itemanswer':'itemanswer' "
+							@click="handleCheckboxSelect(item.label)">{{item.label}}. {{item.content}}</view>
+						<view class=" submitbtn" @click="submitAnswers">确认</view>
+					</view>
+					<view class="fs24 mtb20 " style="color: #717171;">
+						{{answerfrist+1}}/{{Answerlistall}}
+					</view>
+				</view>
+			</view>
+		</u-popup> -->
+
+		<!-- 小黄车弹窗 -->
+		<u-popup :show="shopping" @close="closeShop" @open="openShop" round='20rpx' bgColor='#f3f5f9'>
+			<view class="shoppop">
+				<view class="shoppop-top">
+					<u-avatar :src="store.logoUrl" size="36" class="ml16"></u-avatar>
+					<view class="search-input u-flex-y-center">
+						<image style="width: 24rpx;height: 24rpx;margin-right: 16rpx;" src="@/static/images/search.png">
+						</image>
+						<input placeholder="请搜索商品" v-model="inputInfo" @input="handleSearchInput" />
+					</view>
+					<view class="t-c search-top" style="margin-right: 48rpx;">
+						<image @click="onStoreCollect" v-if="store.isFavorite" style="width: 32rpx;height: 32rpx;"
+							src="@/static/images/collect_select.png"></image>
+						<image v-else @click="onStoreCollect" style="width: 32rpx;height: 32rpx;"
+							src="@/static/images/collect.png"></image>
+						<view>收藏</view>
+					</view>
+					<view class="t-c search-top" @click="goOrderList">
+						<image style="width: 32rpx;height: 32rpx;" src="@/static/images/order.png"></image>
+						<view>订单</view>
+					</view>
+				</view>
+
+				<scroll-view enable-flex scroll-y class="shop-list" :style="{ height: boxHeight + 'px' }">
+					<view class="list-item " v-for="(item,index) in products" :key="index">
+						<view class="goods-img">
+							<image :src="item.imgUrl" mode="widthFix"></image>
+							<view class="goods-label">{{index+1}}</view>
+						</view>
+						<view class="goods-right">
+							<view class="goods-title">{{item.productName}}</view>
+							<!-- <view class="goods-details">{{item.productIntroduce}}</view> -->
+							<view class="goods-people">{{item.sales}} 人已购</view>
+							<view class="goods-shop">
+								<text class="nummber"><text style="font-size: 20rpx;font-weight: 600;">¥</text><text
+										style="font-size: 36rpx;font-weight: bold;">{{Math.trunc(item.price)}}</text>.{{getPureDecimal(item.price)?getPureDecimal(item.price):'00'}}/日</text>
+								<view class="btn-group  u-flex-y-center">
+									<view class="collect-btn">
+										<image v-if="item.isFavorite" @click="onGoodsCollect(item)"
+											style="width: 32rpx;height: 32rpx;" src="/static/images/collect_select.png">
+										</image>
+										<image v-else @click="onGoodsCollect(item)" style="width: 32rpx;height: 32rpx;"
+											src="/static/images/collect.png">
+										</image>
+									</view>
+									<view v-if="item.status==1" class="shop-btn"
+										@click="goShop(item.productId,item.goodsId)">去购买
+									</view>
+									<view v-else-if="item.status==0" @click="goShop(item.productId)" class="shop-btn">
+										已下架</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</u-popup>
+		<!-- 红包 -->
+		<!-- <u-popup :show="showRed" mode="center" @close="closeRed" round='20rpx' @open="openRed" bgColor='#ff3833'>
+			<view class="red-box" style="width: 500rpx;height: 500rpx; ">
+				<view class="button">立即领取</view>
+			</view>
+		</u-popup> -->
+	</view>
+</template>
+
+<script>
+	import Hls from 'hls.js';
+	import CryptoJS from 'crypto-js'
+	import {
+		liveList
+	} from '@/api/list'
+	import {
+		liveRed, // 点击领红包
+		liveDataLike, // 点赞
+		collectStore, // 店铺收藏/取消收藏
+		collectGoods, // 商品收藏/取消收藏
+		store, // 查询店铺
+		follow, // 关注/取消关注
+		watchUserList, //获取直播间用户(展示在线用户)
+		liveMsg, //获取最近聊天记录
+		// 小黄车
+		liveStore, //店铺展示,
+		// liveGoodsDetail, //商品详情,
+		liveOrderUser, //正在购买
+		getLiveInfo, //获取直播间信息接口
+		getLiveViewData //直播间点赞、关注、在线人数数据
+	} from '@/api/live'
+	import {
+		liveOrderList, // 订单列表
+	} from '@/api/order'
+
+	import parse from '../../uni_modules/uview-plus/libs/config/props/parse';
+	import {
+		LiveWS
+	} from '@/utils/liveWS.js'
+	import {
+		getlive,
+		// gettextlist,
+		getAnswerlist,
+		submitAnswer
+	} from '@/api/home'
+	// var wsUrl = "ws://192.168.10.166:7114/app/webSocket";
+
+	// var wsUrl = "ws://192.168.10.166:7114/app/webSocket"; //余红奇
+	// var wsUrl = "ws://192.168.10.125:7114/app/webSocket"; //涂小龙
+	var wsUrl = "wss://live.test.ylrztop.com/ws/live-api/app/webSocket"; //余红奇
+	// var wsUrl = "ws://nd383294.natappfree.cc/app/webSocket"; //余红奇
+	// var wsUrl = "ws://v56c9b8e.natappfree.cc/app/webSocket"; //余红奇
+	// var wsUrl = "ws://192.168.10.170:7114/app/webSocket"; //陈果
+	// var wsUrl = "ws://live.ylrzcloud.com/socket/app/webSocket";
+	var pingpangTimes = null;
+	var initTimes = null;
+	var isSocketOpen = false;
+	var socket = null;
+
+	export default {
+		data() {
+			return {
+				liveUserTotal: null,
+				viewPageSize: 10, // 每页数量
+				viewPageNum: 1, // 当前页码
+				viewLoading: false, // 是否正在加载
+				viewNoMoreData: false, // 是否没有更多数据
+				scrollHeight: 0,
+				scrollTimer: null, // 滚动防抖定时器
+
+
+				socketInstance: null, // 统一管理 socket 实例
+				reconnectCount: 0,
+				maxReconnectAttempts: 3,
+				isManualClose: false, // 标记是否手动关闭
+
+				showRed: true,
+				redInfo: {},
+				inputInfo: '',
+				searchTimer: null,
+				storeId: null,
+				reconnectCount: 0,
+				maxReconnectAttempts: 3,
+				reconnectTimer: null,
+				isCollect: false,
+				showPurchasePrompt: false,
+				purchasePromptTimer: null,
+				prevOrderCount: 0, // 用于记录上一次的购买人数
+				videoUrl: null,
+				showType: 1, //横屏1 竖屏2
+				boxHeight: 300, //小黄车高度
+				isFollow: true,
+				liveViewData: {},
+				liveViewers: [], //观众
+				likeName: 0,
+				hlsPlayer: null, // HLS播放器实例,
+				livingUrl: "",
+				products: {},
+				store: {},
+				orderUser: {}, //正在购买
+				userType: 0,
+				timestamp: '',
+				liveId: null,
+				// userId: uni.getStorageSync("userInfo.userId"),
+				codeimg: '',
+				placeholderText: '说点什么...',
+				isZoom: false, //点赞按钮控制是否放大
+				userinfo: '', //用户信息
+				// path: 'http://192.168.10.166/dev-api', //余红奇
+				// path: 'http://v56c9b8e.natappfree.cc', //余红奇
+				// path: 'live.test.ylrztop.com/prod-api', //余红奇
+				// path: 'http://192.168.10.170/dev-api', //陈果
+				value: '',
+				talkdisabled: false, //输入框是否禁用
+				autoplay: false, //视频自动播放
+				showadd: false,
+				talklist: [],
+				scrollIntoView: '',
+				bufferRate: 0, //视频缓冲时间
+				playDuration: 0, //视频播放时间
+				videoContext: '',
+				thistime: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd hh:MM:ss'),
+				upDown: true, //是否视频显示隐藏
+				isLongPress: false, // 是否长按
+				timeout: null, // 计时器
+				showWelcomeMessage: false,
+				isSubmit: false,
+				messageContent: "",
+				showziliao: false,
+				isScreen: true,
+				showAnswer: false, //展示答题
+				Answerlistall: {}, //所有题目
+				answerlist: {}, //当前题目
+				answerfrist: 0, //当前选择
+				checkboxValue: [], //多选数据
+				checkboxFormValue: "", //多选数据
+				allAnswerLists: [], // 新增:存储所有题目列表
+				showAnswerred: false, //展示红包答题
+				answerbtn: false, //答题按钮弹窗
+				redallAnswerLists: [], //储存所有红包答题列表
+				redanswerAll: [], //红包当前题目
+				redanswerList: [], //红包答题列表
+				redanswertips: [], //红包答题提示
+				shopping: false, //小黄车弹窗
+				scrollTop: 0, //弹幕
+				old: {
+					scrollTop: 0
+				},
+				livedata: {}, //直播间点赞、关注、在线人数数据
+
+			};
+		},
+
+
+		onLoad(options) {
+			this.userinfo = JSON.parse(uni.getStorageSync("userInfo"))
+			if (options.liveId) {
+				this.liveId = options.liveId; // 仅当 liveId 变化时更新
+			}
+			uni.showShareMenu({
+				withShareTicket: true
+			});
+		},
+		onShareAppMessage() {
+			return {
+				// title: this.product.title,
+				title: this.livedata.liveName,
+				path: '/pages/home/index',
+				imageUrl: this.products.image,
+				success(res) {
+					console.log("分享成功", res);
+				},
+				fail(err) {
+					console.error("分享失败", err);
+				}
+			};
+		},
+		computed: {
+			filteredViewers() {
+				if (!this.liveViewers) {
+					return
+				} else {
+					return this.liveViewers.slice(0, 3);
+				}
+
+			}
+		},
+		mounted() {
+			this.getLiveMsg() // 获取最近聊天记录
+			// this.onLike()
+			this.getliveViewData() ////直播间点赞、关注、在线人数数据
+
+			// this.intervalId = setInterval(() => {
+			// 	this.getliveViewData();
+			// }, 60 * 1000);
+			// this.getLiveinformation() // 获取直播间信息接口
+			this.getliveOrder() //正在购买
+			// this.getliveStore() // 获取小黄车 店铺展示
+			// this.getliveGoods() // 获取小黄车 商品详情
+			this.getliveUser() // 获取直播间用户
+			this.initTime()
+			// this.initWebSocket()
+			this.initSocket()
+			var that = this;
+			uni.$on('initSocket', () => {
+				that.initSocket()
+			})
+			uni.$on('sendMsg', (item) => {
+				that.sendMsg(item)
+			})
+			uni.$on('closeWebSocket', () => {
+				that.closeWebSocket()
+			})
+			this.getEWechatSdk();
+
+			this.getliving() //hls
+			// this.gettalklist()
+			// this.getAnswerlists()
+
+		},
+		onReady: function(res) {
+			this.videoContext = uni.createVideoContext('myVideo')
+			// console.log(this.videoContext)
+		},
+		onHide() {
+			clearInterval(this.intervalId); // 页面隐藏时清理
+		},
+		onUnload() {
+			this.closeWebSocket();
+			uni.$off('refreshOrder');
+			clearInterval(this.intervalId);
+
+			if (this.hlsPlayer) {
+				this.hlsPlayer.destroy(); // 清理 HLS 播放器
+			}
+			if (this.pingpangTimes) {
+				clearInterval(this.pingpangTimes); // 清除心跳定时器
+			}
+
+		},
+		watch: {
+			// 监听orderUser.count的变化
+			'orderUser.count': {
+				handler(newVal, oldVal) {
+					if (newVal !== this.prevOrderCount) {
+						this.prevOrderCount = newVal;
+						this.showPurchaseMessage();
+					}
+				},
+				immediate: true
+			}
+		},
+		methods: {
+			// 获取直播间列表
+			getList() {
+				const data = {
+					page: 1,
+					page_size: 10,
+				};
+				uni.showLoading({
+					title: "处理中..."
+				});
+				liveList(data)
+					.then(res => {
+						if (res.code == 200) {
+							this.list = res.rows; // 直接赋值给 this.list
+							console.log("list>>", this.list); // ✅ 打印已定义的 this.list
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					})
+					.catch(rej => {
+						console.log("请求失败:", JSON.stringify(rej));
+					})
+					.finally(() => {
+						uni.hideLoading();
+					});
+			},
+			openViews() {
+				// 计算scroll-view高度
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query.select('.view-box').boundingClientRect(data => {
+						if (data) {
+							// 减去标题和底部固定区域的高度
+							this.scrollHeight = data.height - 80 - 120; // 80是标题高度,120是底部高度
+						}
+					}).exec();
+				});
+			},
+
+
+			// 获取直播间用户
+			async getliveUser(isLoadMore = false) {
+				if (this.viewLoading || this.viewNoMoreData) return;
+
+				this.viewLoading = true;
+
+				try {
+					const res = await watchUserList(this.liveId, this.viewPageSize, this.viewPageNum, false);
+
+					if (res.code == 200) {
+						this.liveUserTotal = res.total
+						if (res.rows.length === 0) {
+							this.viewNoMoreData = true;
+							if (this.viewPageNum > 1) {
+								uni.showToast({
+									title: '没有更多数据了',
+									icon: 'none'
+								});
+							}
+							return;
+						}
+
+						if (isLoadMore) {
+							// 加载更多时追加数据
+							this.liveViewers = [...this.liveViewers, ...res.rows];
+						} else {
+							// 首次加载或刷新
+							this.liveViewers = res.rows;
+						}
+
+						// 只有成功获取数据后才增加页码
+						this.viewPageNum++;
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				} catch (error) {
+					console.error('获取观众列表失败:', error);
+					uni.showToast({
+						title: '获取数据失败',
+						icon: 'none'
+					});
+				} finally {
+					this.viewLoading = false;
+				}
+			},
+			// 滚动到底部触发
+			handleScrollToLower() {
+				// 清除上一次未执行的定时器,避免重复请求
+				if (this.scrollTimer) {
+					clearTimeout(this.scrollTimer);
+				}
+
+				// 延迟0.5秒(500毫秒)执行接口请求
+				this.scrollTimer = setTimeout(() => {
+					this.getliveUser(true); // 加载更多数据
+				}, 1000); // 延迟时间:500毫秒
+			},
+			// gettalklist() {
+			// 	if (!this.liveId) return;
+			// 	const param = {
+			// 		id: this.liveId
+			// 	}
+			// 	gettextlist(param).then(res => {
+			// 		if (res.code == 200) {
+			// 			this.talklist = res.data
+			// 			// console.log(res.data);
+			// 			this.$nextTick(() => {
+			// 				this.scrollIntoView = `list_${this.talklist.length-1}`
+			// 			})
+			// 		}
+			// 	})
+			// },
+			// 获取最近聊天记录
+			getLiveMsg() {
+				if (!this.liveId) return;
+				let pageSize = 30
+				let pageNum = 1
+				liveMsg(this.liveId, pageSize, pageNum).then(res => {
+					if (res.code == 200) {
+						// 使用Vue.set或直接赋值确保响应式更新
+						this.talklist = [...res.rows] // 使用展开运算符创建新数组
+						console.log("获取最近聊天记录>>", this.talklist)
+						this.$nextTick(() => {
+							this.scrollIntoView = `list_${this.talklist.length-1}`
+							console.log('应该滚动到:', this.scrollIntoView)
+						})
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				});
+			},
+			// 点击红包
+			onRed() {
+				console.log("点了")
+
+				if (!this.liveId) return;
+				console.log("点了this.liveId", this.liveId)
+				if (!this.redInfo?.redId) return;
+				console.log("点了this.redInfo?.redId", this.redInfo.redId)
+				console.log("点了this.userinfo.userId", this.userinfo.userId)
+				let data = {
+					liveId: this.liveId,
+					userId: this.userinfo.userId,
+					redId: this.redInfo.redId,
+				}
+				liveRed(data).then(res => {
+						if (res.code == 200) {} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			handleSearchInput() {
+				// 使用防抖优化性能,避免频繁请求
+				clearTimeout(this.searchTimer);
+				this.searchTimer = setTimeout(() => {
+					this.queryCollect();
+				}, 500); // 500毫秒延迟
+			},
+			// 显示购买提示信息
+			showPurchaseMessage() {
+				// 清除之前的定时器
+				if (this.purchasePromptTimer) {
+					clearTimeout(this.purchasePromptTimer);
+				}
+
+				// 显示提示
+				this.showPurchasePrompt = true;
+
+				// 2秒后自动隐藏
+				this.purchasePromptTimer = setTimeout(() => {
+					this.showPurchasePrompt = false;
+				}, 2000);
+			},
+			truncateString(str, maxLength) {
+				return str.length > maxLength ? str.slice(0, maxLength) + '...' : str;
+			},
+			goStore() {
+				console.log("带过去storeId", this.storeId)
+				uni.navigateTo({
+					url: '/pages_shop/store?liveId=' + this.liveId + "&storeId=" + this.storeId
+				})
+			},
+			// 去订单列表
+			goOrderList() {
+				uni.navigateTo({
+					url: "/pages_shop/order"
+				})
+			},
+
+			// 初始化HLS播放器
+			initHlsPlayer() {
+				if (Hls.isSupported() && this.livingUrl) {
+					const video = document.getElementById('myVideo');
+					if (video) {
+						this.hlsPlayer = new Hls();
+						this.hlsPlayer.loadSource(this.livingUrl);
+						this.hlsPlayer.attachMedia(video);
+						this.hlsPlayer.on(Hls.Events.MANIFEST_PARSED, () => {
+							video.play();
+						});
+					}
+				}
+			},
+
+			// 视频错误处理
+			videoError(e) {
+				console.error('视频播放错误:', e.detail.errMsg);
+				// 尝试重新加载或切换到备用流
+				if (this.livingUrl) {
+					setTimeout(() => {
+						this.videoContext.play();
+					}, 2000);
+				}
+			},
+
+			getliving() {
+				if (!this.liveId) return;
+				console.log("获取直播信息");
+				const param = {
+					id: this.liveId
+				};
+
+				getlive(param).then(res => {
+					if (res.code !== 200) {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+							duration: 2000
+						});
+						return;
+					}
+
+					this.livedata = res.data;
+					this.showType = res.data.showType;
+					this.storeId = res.storeId
+					this.queryCollect() //查询店铺
+					console.log("横屏1或竖屏2", this.showType)
+					// 1. 根据直播类型设置播放地址
+					if (res.data.liveType === 2) {
+						// 回放视频
+						this.videoUrl = res.data.videoUrl;
+						this.autoplay = true;
+						// this.placeholderText = "观看回放中";
+						this.placeholderText = "说点什么...";
+						this.talkdisabled = false;
+					} else if (res.data.liveType === 1) {
+						// 直播流
+						this.livingUrl = res.data.flvHlsUrl;
+						this.autoplay = true;
+						this.placeholderText = "说点什么...";
+						this.talkdisabled = false;
+					} else {
+						// 未开播
+						this.livingUrl = "";
+						this.autoplay = false;
+						this.placeholderText = "直播未开始,暂时无法发言";
+						this.talkdisabled = true;
+						return;
+					}
+
+					// 2. 根据不同平台处理播放逻辑
+					this.$nextTick(() => {
+						if (!this.livingUrl) return;
+
+						// H5 平台:使用 HLS.js 处理 .m3u8 流
+						// #ifdef H5
+						if (this.livingUrl.includes('.m3u8')) {
+							this.initHlsPlayer();
+							return;
+						}
+						// #endif
+
+						// 小程序/App 平台:直接使用 video 组件
+						if (!this.videoContext) {
+							this.videoContext = uni.createVideoContext('myVideo', this);
+						}
+
+						if (res.data.liveType === 1) {
+							// 回放:跳转到指定位置
+							this.videoContext.seek(res.data.nowDuration || 0);
+						} else {
+							// 直播:直接播放
+							this.videoContext.play();
+						}
+					});
+				}).catch(err => {
+					console.error("获取直播信息失败:", err);
+					uni.showToast({
+						title: "获取直播信息失败",
+						icon: 'none'
+					});
+				});
+			},
+			maskString(str, maskChar = '*') {
+				// 新增:如果str是undefined或null,直接返回空字符串
+				if (!str) return '';
+				// 确保str是字符串(如果是数字等类型,先转为字符串)
+				const strVal = String(str);
+				return strVal.split('').map((char, index) => (index === 0 ? char : maskChar)).join('');
+			},
+
+			getPureDecimal(num, precision = 6) {
+				const decimalPart = Math.abs(num).toFixed(precision).split('.')[1];
+				return decimalPart?.replace(/0+$/, '') || ''; // 移除末尾多余的0
+			},
+
+			// 返回上一个页面并关闭WebSocket
+			goBack() {
+				const pages = getCurrentPages();
+				// 如果页面栈长度大于1,说明有上一页可以返回
+				this.closeWebSocket();
+				if (pages.length > 1) {
+					uni.navigateBack();
+				} else {
+					// 如果没有上一页,跳转到默认页面(比如首页)
+					uni.switchTab({
+						url: '/pages/list/index' // 替换为你的首页路径
+					});
+
+				}
+
+			},
+
+			//直播间点赞、关注、在线人数数据
+			getliveViewData() {
+				if (!this.liveId) return;
+				getLiveViewData(this.liveId).then(res => {
+						if (res.code == 200) {
+							// console.log("直播间点赞、关注、在线人数数据>>>>", res)
+							this.liveViewData = res
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			//正在购买
+			getliveOrder() {
+				if (!this.liveId) return;
+				liveOrderUser(this.liveId).then(res => {
+						if (res.code == 200) {
+							console.log("正在购买>>>>", res)
+							this.orderUser = res
+
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			//小黄车 店铺展示
+			// getliveStore() {
+			// 	if (!this.liveId) return;
+			// 	let data = {
+			// 		pageSize: 10,
+			// 		page: 1
+			// 	}
+			// 	liveStore(this.liveId, data).then(res => {
+			// 			if (res.code == 200) {
+			// 				console.log("小黄车 店铺展示>>>>", res)
+			// 				this.products = res.data
+			// 				this.queryCollect()
+			// 			} else {
+			// 				uni.showToast({
+			// 					title: res.msg,
+			// 					icon: 'none'
+			// 				});
+			// 			}
+			// 		},
+			// 		rej => {}
+			// 	);
+			// },
+			// 获取直播间信息接口
+			getLiveinformation() {
+				if (!this.liveId) return;
+				getLiveInfo(this.liveId).then(res => {
+						if (res.code == 200) {
+							console.log("获取直播间信息接口>>>>", res)
+							this.livingUrl = res.livingUrl
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+
+
+			// 点赞
+			onLike() {
+				if (!this.liveId) return;
+				liveDataLike(this.liveId).then(res => {
+						if (res.code == 200) {
+							if (res.like) {
+								this.liveViewData.like++
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: 'none'
+								});
+							}
+
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+
+			},
+			// 去购买,跳商品详情
+			goShop(productId, goodsId) {
+				uni.navigateTo({
+					url: '/pages_shop/goods?productId=' + productId + '&liveId=' + this.liveId + '&goodsId=' +
+						goodsId + '&storeId=' + this.storeId
+				})
+			},
+
+			// 查询店铺
+			queryCollect() {
+				if (!this.storeId) return;
+				store(this.storeId, this.inputInfo).then(res => {
+						if (res.code == 200) {
+							console.log("查询店铺>>", res)
+							this.products = res.data.goodsList
+							this.store = res.data
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 店铺收藏
+			onStoreCollect() {
+				if (!this.storeId) return;
+				collectStore(this.storeId).then(res => {
+						if (res.code == 200) {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							this.store.isFavorite = !this.store.isFavorite
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 商品收藏
+			onGoodsCollect(item) {
+				if (!item || item.length === 0 || !item.goodsId) {
+					return;
+				}
+				collectGoods(item.goodsId).then(res => {
+						if (res.code == 200) {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							item.isFavorite = !item.isFavorite
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 关注
+			onFollow() {
+				if (!this.liveId) return;
+				follow(this.liveId).then(res => {
+						this.isFollow = !this.isFollow
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					},
+					rej => {}
+				);
+			},
+			// 时间戳
+			initTime() {
+				const now = new Date();
+				this.timestamp = now.getTime(); // 例如:'2023-04-01 12:00:00'
+			},
+			// initWebSocket() {
+			//       const liveWS = new LiveWS('ws://your-server.com', 123, 456);
+
+			//       // 从 URL 中解析 timestamp
+			//       const urlParams = new URL(liveWS.url).searchParams;
+			//       this.timestamp = urlParams.get('timestamp');
+			//       // console.log('Timestamp:', timestamp);
+			//     },
+
+			// 弹幕滚动
+			lowerChat: function(e) {
+				console.log(e)
+			},
+			scroll: function(e) {
+				console.log(e)
+				this.old.scrollTop = e.detail.scrollTop
+			},
+
+
+			loadmore() {
+				// for (let i = 0; i < 30; i++) {
+				//   this.indexList.push({
+				//     url: this.shopList[uni.$u.random(0, this.shopList.length - 1)],
+				//   });
+				// }
+			},
+
+			// 弹幕
+			scrollchat() {
+				// this.loadmore();
+			},
+
+
+			noredanswer() {
+				if (this.Answerlistall > 0) {
+					this.showAnswer = !this.this.showAnswer
+				} else {
+					uni.showToast({
+						title: '暂无题目',
+						icon: 'none',
+					});
+				}
+			},
+			redbagAnswer() {
+				this.showAnswerred = !this.showAnswerred
+				this.answerbtn = !this.answerbtn
+
+			},
+			submitAnswers() {
+				if (this.isSubmit) return;
+				this.isSubmit = true;
+				const data = {
+					questionId: this.answerlist.id,
+					answer: this.checkboxFormValue
+				}
+				submitAnswer(data).then(res => {
+					if (res.code == 200) {
+
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+					// 本地切换下一题
+					if (this.answerfrist < this.Answerlistall - 1) {
+						this.answerfrist++;
+						this.answerlist = this.allAnswerLists[this.answerfrist];
+						this.answerlist.content = JSON.parse(this.answerlist.content);
+					} else {
+						uni.showToast({
+							title: '已是最后一题',
+							icon: 'none'
+						});
+						this.showAnswer = false; // 自动关闭弹窗
+					}
+					this.checkboxValue = []
+					this.checkboxFormValue = "";
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					});
+				}).finally(e => {
+					this.isSubmit = false;
+				})
+			},
+			// handleCheckboxSelect(value) {
+			// 	const index = this.checkboxValue.indexOf(value)
+			// 	console.log(value)
+			// 	if (this.answerlist.type == 1) {
+			// 		this.checkboxValue = [value]
+			// 		this.checkboxFormValue = this.checkboxValue.join(',')
+			// 		setTimeout(() => {
+			// 		      uni.showToast({
+			// 		        title: '准备下一题',
+			// 		        icon: 'none',
+			// 		        duration: 2000
+			// 		      });
+			// 		    }, 1000);
+			// 		this.submitAnswers()
+			// 		console.log(this.checkboxValue)
+			// 	} else if (this.answerlist.type == 2) {
+			// 		if (index > -1) {
+			// 			this.checkboxValue.splice(index, 1)
+			// 			this.checkboxFormValue = this.checkboxValue.join(',')
+			// 		} else {
+			// 			this.checkboxValue.push(value)
+			// 			this.checkboxFormValue = this.checkboxValue.join(',')
+			// 		}
+			// 		console.log(this.checkboxFormValue)
+			// 	}
+			// },
+			getAnswerlists() {
+				if (!this.liveId) return;
+				const data = {
+					liveId: this.liveId
+				}
+				getAnswerlist(data).then(res => {
+					if (res.code == 200) {
+						if (res.data.length > 0) {
+							this.allAnswerLists = res.data; // 存储所有题目
+							this.Answerlistall = res.data.length;
+							if (this.allAnswerLists.length > 0) {
+								this.answerlist = this.allAnswerLists[0];
+								this.answerlist.content = JSON.parse(this.allAnswerLists[0].content);
+							}
+							this.showAnswer = true
+						} else {
+							this.showAnswer = false
+						}
+
+					}
+				})
+			},
+
+			openShop() {
+
+			},
+			openViews() {
+
+			},
+			close() {
+				this.showadd = !this.showadd
+			},
+			closes() {
+				this.showziliao = !this.showziliao
+			},
+			closest() {
+				this.showAnswer = !this.showAnswer
+			},
+			closestred() {
+				this.showAnswerred = !this.showAnswerred
+			},
+			closeanswer() {
+				this.answerbtn = !this.answerbtn
+			},
+			// 关闭小黄车
+			closeShop() {
+				this.shopping = !this.shopping
+			},
+			// 关闭红包
+			closeRed() {
+				this.showRed = !this.showRed
+			},
+			// longPress() {
+			// 	this.timeout = setTimeout(() => {
+			// 		this.isLongPress = true;
+			// 		// 执行保存图片的操作
+			// 		uni.saveImageToPhotosAlbum({
+			// 			filePath: this.livedata.qwQrCode, // 图片的本地路径或网络路径
+			// 			success: () => {
+			// 				uni.showToast({
+			// 					title: '保存成功'
+			// 				});
+			// 			},
+			// 			fail: () => {
+			// 				uni.showToast({
+			// 					title: '',
+			// 					icon: 'none'
+			// 				});
+			// 			}
+			// 		});
+			// 	}, 500); // 设置长按的阈值时间,这里是500毫秒
+			// },
+			// cancelLongPress() {
+			// 	clearTimeout(this.timeout);
+			// 	this.isLongPress = false;
+			// },
+			// 触摸开始
+			handleTouchStart() {
+				this.isZoom = true; // 触发放大效果
+			},
+			// 触摸结束
+			handleTouchEnd() {
+				this.isZoom = false; // 恢复原状
+			},
+			getEWechatSdk() {
+				// 只在H5平台执行
+				// #ifdef H5
+				let eWechatSdk = '';
+				if (/(Android)/i.test(navigator.userAgent)) {
+					eWechatSdk = 'jWeixin';
+				} else if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
+					eWechatSdk = 'wx';
+				} else {
+					eWechatSdk = 'jWeixin';
+				}
+				uni.setStorageSync("wxSdk", eWechatSdk);
+				// #endif
+			},
+			closeWebSocket() {
+				this.isManualClose = true;
+
+				// 清除所有定时器
+				clearInterval(this.pingpangTimes);
+				clearTimeout(this.reconnectTimer);
+
+				// 关闭 WebSocket 连接
+				if (this.socketInstance) {
+					try {
+						uni.closeSocket();
+						console.log('WebSocket 已安全关闭');
+					} catch (e) {
+						console.error('关闭 WebSocket 时出错:', e);
+					}
+					this.socketInstance = null;
+				}
+				isSocketOpen = false;
+			},
+			reConnect() {
+				var that = this;
+				try {
+					uni.closeSocket();
+				} catch (e) {
+
+				}
+				setTimeout(function() {
+					that.initSocket();
+				}, 10000);
+
+			},
+			startHeartbeat() {
+				clearInterval(this.pingpangTimes);
+
+				this.pingpangTimes = setInterval(() => {
+					if (!isSocketOpen) return;
+
+					const pingData = {
+						cmd: 'ping',
+						timestamp: Date.now()
+					};
+					uni.sendSocketMessage({
+						data: JSON.stringify(pingData),
+						success: () => console.debug('心跳发送成功'),
+						fail: (err) => {
+							console.error('心跳发送失败:', err);
+							this.scheduleReconnect();
+						}
+					});
+				}, 30000); // 30秒心跳间隔
+			},
+			initSocket() {
+				// 防止重复创建
+				if (isSocketOpen || this.reconnectCount >= this.maxReconnectAttempts) {
+					return;
+				}
+
+				this.closeWebSocket(); // 确保先关闭旧连接
+				this.isManualClose = false;
+
+				// 参数校验
+				if (!this.liveId) {
+					return;
+				}
+
+				// 生成签名
+				const signature = CryptoJS.HmacSHA256(
+					`${this.liveId}${this.userinfo.userId}${this.userType}${this.timestamp}`,
+					this.timestamp.toString()
+				).toString(CryptoJS.enc.Hex);
+
+				// 创建连接
+				try {
+					this.socketInstance = uni.connectSocket({
+						url: `${wsUrl}?userId=${this.userinfo.userId}&liveId=${this.liveId}&userType=${this.userType}&timestamp=${this.timestamp}&signature=${signature}`,
+						success: () => {
+							// 事件监听统一管理
+							this.setupSocketListeners();
+						},
+						fail: (err) => {
+							console.error('WebSocket 连接失败:', err);
+							this.scheduleReconnect();
+						}
+					});
+				} catch (e) {
+					console.error('创建 WebSocket 异常:', e);
+					this.scheduleReconnect();
+				}
+			},
+
+			// 设置 WebSocket 监听器
+			setupSocketListeners() {
+				uni.onSocketOpen(() => {
+					isSocketOpen = true;
+					this.reconnectCount = 0;
+					console.log('WebSocket 连接成功');
+					this.startHeartbeat();
+				});
+
+				uni.onSocketClose(() => {
+					isSocketOpen = false;
+					console.log('WebSocket 连接关闭');
+					if (!this.isManualClose) {
+						this.scheduleReconnect();
+					}
+				});
+
+				uni.onSocketError((err) => {
+					isSocketOpen = false;
+					console.error('WebSocket 错误:', err);
+					if (!this.isManualClose) {
+						this.scheduleReconnect();
+					}
+				});
+
+				uni.onSocketMessage((res) => {
+					try {
+						const redata = JSON.parse(res.data);
+						this.talklist.push(redata.data);
+						this.$nextTick(() => {
+							this.scrollIntoView = `list_${this.talklist.length - 1}`; // 最后一项的id
+						});
+						if (redata.data.cmd == 'deleteId') {
+							uni.$emit('deleteId');
+						}
+
+						// else if (redata.data.cmd == 'init') {
+						// 	uni.$emit('init', redata.data);
+						// } else if (redata.data.cmd == 'reload') {
+						// 	uni.$emit('reload');
+						// }
+						else if (redata.data.cmd == 'red') {
+							// 领红包
+							this.redInfo = JSON.parse(redata.data.data)
+							console.log(" 领红包1redata.data>>", redata.data)
+							console.log(" 领红包2redata.data.data>>", redata.data.data)
+							console.log(" 领红包3this.redInfo>>", this.redInfo)
+							console.log(" 领红包4this.redInfo.redId>>", this.redInfo.redId)
+							// let redId= this.redInfo.redId
+							// this.redInfo.redNum=redata.data.redNum
+							// this.redInfo.redStatus=redata.data.redStatus
+							// this.redInfo.duration=redata.data.duration
+
+						} else if (redata.data.cmd == 'sendRedPacketQuestion') {
+							const list = JSON.parse(redata.data.data)
+							this.redanswerAll = [...this.redanswerAll, ...list]
+							if (this.redanswerAll[1].randomAmount !== null) {
+								this.redanswertips = JSON.parse(this.redanswerAll[0]
+									.randomAmount)
+							}
+							console.log(this.redanswertips)
+							console.log(this.redanswerAll)
+						} else if (redata.data.cmd == 'entry') {
+							this.showWelcomeMessage = true
+							// setTimeout(() => {
+							// 	this.showWelcomeMessage = false;
+							//   }, 1000);
+							uni.$emit('entry', redata.data);
+						} else if (redata.data.cmd == 'live_start') {
+              // 直播开始
+						} else if (redata.data.cmd == 'live_end') {
+              // 直播结束
+						}
+					} catch (e) {
+						console.error('解析消息失败:', e);
+					}
+				})
+			},
+			scheduleReconnect() {
+				if (this.isManualClose || this.reconnectCount >= this.maxReconnectAttempts) return;
+
+				this.reconnectCount++;
+				const delay = Math.min(3000 * this.reconnectCount, 30000);
+
+				console.log(`将在 ${delay}ms 后重连 (尝试 ${this.reconnectCount}/${this.maxReconnectAttempts})`);
+
+				this.reconnectTimer = setTimeout(() => {
+					this.initSocket();
+				}, delay);
+			},
+			sendMsg() {
+				if (!isSocketOpen) {
+					uni.showToast({
+						title: "连接未建立,请稍后再试",
+						icon: 'none'
+					});
+					return;
+				}
+
+				if (!this.socketInstance) {
+					uni.showToast({
+						title: "连接异常",
+						icon: 'none'
+					});
+					return;
+				}
+
+				const data = {
+					liveId: this.liveId,
+					userId: this.userinfo.userId,
+					userType: 0,
+					cmd: "sendMsg",
+					msg: this.value,
+					nickName: this.userinfo.nickName,
+					avatar: this.userinfo.avatar
+				};
+
+				if (!this.value.trim()) { // 优化空消息判断
+					uni.showToast({
+						title: "不能发送空消息",
+						icon: 'none'
+					});
+					return;
+				}
+
+				// 使用正确的实例 this.socketInstance 发送消息
+				this.socketInstance.send({
+					data: JSON.stringify(data),
+					success: () => {
+						console.log("发送成功");
+						this.value = ''; // 清空输入框
+					},
+					fail: (err) => {
+						console.error("发送失败:", err);
+						uni.showToast({
+							title: "发送失败,请重试",
+							icon: 'none'
+						});
+					}
+				});
+			},
+		},
+	};
+</script>
+
+<style scoped lang="scss">
+	.loading-more,
+	.no-more {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding: 20rpx 0;
+		color: #999;
+		font-size: 24rpx;
+	}
+
+	.loading-more {
+		flex-direction: column;
+	}
+
+	/* button自带样式清除 */
+	.student-orther-icon button::after {
+		border: none !important;
+		padding: 0 !important;
+		margin: 0 !important;
+	}
+
+	.student-orther-icon button {
+		background-color: transparent !important;
+		padding: 0 !important;
+		line-height: inherit !important;
+		margin: 0 !important;
+		width: auto !important;
+		font-weight: 500 !important;
+		border-radius: none !important;
+	}
+
+	// 抽奖
+	// .answerpop {
+	// 	background: linear-gradient(to right, #fff7f8, #fee1e2);
+	// 	margin-top: 30rpx;
+	// 	padding: 10rpx 20rpx;
+	// 	width: calc(100% - 40rpx);
+	// 	border-radius: 20rpx;
+	// 	display: flex;
+	// 	align-items: center;
+	// 	justify-content: space-between;
+	// 	box-shadow: 2px 2px 4px 0 rgba(255, 124, 126, 0.1);
+
+	// 	.answera {
+	// 		display: flex;
+	// 		justify-content: center;
+	// 		background-color: #fff;
+	// 		padding: 20rpx 0;
+	// 		width: 35%;
+	// 		border-radius: 40rpx;
+	// 		align-items: center;
+	// 		margin: 10rpx 0;
+	// 		box-shadow: 2px 2px 4px 0 rgba(72, 72, 72, 0.1);
+
+	// 		image {
+	// 			width: 40rpx;
+	// 			height: 40rpx;
+	// 			margin-right: 10rpx;
+	// 		}
+	// 	}
+	// }
+
+	// .submitbtn {
+	// 	width: 260rpx;
+	// 	margin: 0 auto;
+	// 	text-align: center;
+	// 	border-radius: 80rpx;
+	// 	padding: 20rpx 0;
+	// 	color: #fff;
+	// 	background-color: #ff5c03;
+	// }
+
+	// .itemanswer {
+	// 	padding: 20rpx 20rpx;
+	// 	text-align: center;
+	// 	border-radius: 80rpx;
+	// 	border: 2rpx solid #dddddd;
+	// 	margin: 12rpx 0;
+	// 	color: #555;
+	// 	width: calc(100% - 40rpx);
+	// }
+
+	// .answeract {
+	// 	background-color: rgba(0, 202, 166, 1);
+	// 	color: #fff;
+	// }
+
+	// .answerbox {
+	// 	width: 600rpx;
+	// 	border-radius: 20rpx;
+	// }
+
+	.welcome-message {
+		position: fixed;
+		width: 100%;
+		bottom: 460rpx;
+		left: 50%;
+		transform: translateX(-50%);
+		color: white;
+		padding: 10px 20px;
+		border-radius: 20px;
+		animation: fadeOut 1s ease 1s forwards;
+		z-index: 1000;
+	}
+
+	@keyframes fadeOut {
+		from {
+			opacity: 1;
+		}
+
+		to {
+			opacity: 0;
+		}
+	}
+
+	// .container {
+	// 	position: relative;
+	// 	width: 100%;
+	// 	height: 100vh;
+	// 	overflow: hidden;
+	// }
+
+	// .talktext {
+	// 	border-radius: 8rpx;
+	// 	background-color: rgba(255, 255, 255, 0.1);
+
+	// 	view {
+	// 		width: 100%;
+	// 	}
+	// }
+
+	.talk-list {
+		border-radius: 30rpx;
+		background-color: rgba(33, 33, 33, 0.5);
+		padding: 10rpx 30rpx;
+	}
+
+	// .zoom-button-active {
+	// 	transform: scale(1.5);
+	// }
+
+	// .background-image {
+	// 	position: absolute;
+	// 	top: 0;
+	// 	left: -40rpx;
+	// 	width: 110%;
+	// 	height: 110%;
+	// 	object-fit: cover;
+	// 	filter: blur(20px);
+	// 	z-index: 0;
+	// }
+
+	// .background-images {
+	// 	position: absolute;
+	// 	top: 0;
+	// 	left: -40rpx;
+	// 	width: 110%;
+	// 	height: 110%;
+	// 	object-fit: cover;
+	// 	filter: blur(20px);
+	// 	z-index: 6;
+	// }
+
+	// .blackbg {
+	// 	position: absolute;
+	// 	top: 0;
+	// 	left: 0;
+	// 	width: 100%;
+	// 	height: 100%;
+	// 	background: rgba(0, 0, 0, 0.7);
+	// 	object-fit: cover;
+	// 	filter: blur(10px);
+	// 	z-index: 1;
+	// }
+
+	.content {
+		position: relative;
+		z-index: 2;
+		height: 100%;
+		width: 100%;
+		top: 0;
+		left: 0;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+
+		.content-top {
+			width: 100%;
+			margin-top: 150rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 0 24rpx;
+			box-sizing: border-box;
+
+			.sum {
+				width: 80rpx;
+				height: 52rpx;
+				background: rgba(0, 0, 0, 0.5);
+				border-radius: 26rpx 26rpx 26rpx 26rpx;
+				font-size: 24rpx;
+				color: #FFFFFF;
+				text-align: center;
+				line-height: 52rpx;
+
+			}
+		}
+
+		.follow-btn {
+			padding: 8rpx 16rpx;
+			background: linear-gradient(270deg, #FF5C03 0%, #FFAC64 100%);
+			border-radius: 26rpx;
+			font-weight: 500;
+			font-size: 26rpx;
+			color: #FFFFFF;
+		}
+	}
+
+	.videolist {
+		position: relative;
+	}
+
+	.video {
+		height: 100vh;
+		/* 占屏幕高度的80% */
+		width: 100%;
+		background-color: rgba(0, 0, 0, 0.8);
+	}
+
+	.videotop {
+		width: 100%;
+		height: 100%;
+	}
+
+	.video_row {
+		width: 100%;
+		max-height: 500rpx;
+		overflow: hidden;
+		margin-top: 360rpx;
+	}
+
+	.popup-video {
+		position: absolute;
+		top: 30%;
+		height: 500rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		width: 100%;
+		color: #fff;
+		z-index: 9;
+
+		.more {
+			background-color: #3280fe;
+			border-radius: 80rpx;
+			width: 280rpx;
+			text-align: center;
+			height: 60rpx;
+			line-height: 60rpx;
+		}
+	}
+
+	.icon-bg {
+		background-color: rgba(157, 157, 157, 0.8);
+		border-radius: 50%;
+		width: 72rpx;
+		height: 72rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		transition: transform 0.2s ease;
+	}
+
+	.list {
+		width: 80%;
+		margin-bottom: 20rpx;
+		animation: xxxawdawd .2s;
+	}
+
+	@keyframes xxxawdawd {
+		from {
+			margin-top: 0rpx;
+			opacity: 0;
+		}
+
+		to {
+			margin-top: 20rpx;
+			opacity: 1;
+		}
+	}
+
+	.shop-prompt {
+		position: absolute;
+		bottom: 600rpx;
+		left: 24rpx;
+		padding: 6rpx 20rpx;
+		background: rgba(230, 154, 34, 0.7);
+		border-radius: 24rpx;
+		z-index: 9;
+		font-weight: 500;
+		font-size: 26rpx;
+		color: #FFFFFF;
+		transition: opacity 0.3s ease;
+	}
+
+	.siderow-group {
+		position: absolute;
+		top: 56%;
+		right: 50rpx;
+		z-index: 9;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+
+		.side-item {
+			font-weight: 500;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			margin-bottom: 32rpx;
+			text-align: center;
+
+			button {
+				background-color: transparent;
+				margin: 0;
+				line-height: 1;
+				padding: 0;
+			}
+
+			image {
+				width: 72rpx;
+				height: 72rpx;
+			}
+		}
+	}
+
+	.side-group {
+		position: absolute;
+		// top: 30%;
+		top: 56%;
+		right: 50rpx;
+		z-index: 9;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+
+		.side-item {
+			font-weight: 500;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			margin-bottom: 32rpx;
+			text-align: center;
+
+			button {
+				background-color: transparent;
+				margin: 0;
+				line-height: 1;
+				padding: 0;
+			}
+
+			image {
+				width: 72rpx;
+				height: 72rpx;
+			}
+		}
+
+
+	}
+
+	.red-box {
+		.button {
+			margin: 0 auto;
+			width: 80%;
+			line-height: 88rpx;
+			height: 88rpx;
+			background: linear-gradient(90deg, #FF5701 0%, #FFB501 100%);
+			box-shadow: 0rpx 8rpx 8rpx 0rpx rgba(238, 124, 80, 0.2);
+			border-radius: 44rpx 44rpx 44rpx 44rpx;
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+
+	.view-box {
+		position: relative;
+		height: 40vh;
+		/* 设置弹出层高度为视窗高度的70% */
+		padding: 40rpx 0rpx 120rpx;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+
+		.scroll-content {
+			flex: 1;
+			overflow-y: auto;
+			padding: 0 40rpx;
+		}
+
+		.bottom {
+			padding: 20rpx 40rpx;
+			position: absolute;
+			bottom: 0;
+			width: 100%;
+			box-shadow: 0rpx -4rpx 10rpx 0rpx rgba(195, 195, 195, 0.3);
+			background: #fff;
+		}
+	}
+
+	.shoppop {
+		padding: 22rpx 16rpx;
+
+		.shoppop-top {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 0 16rpx 22rpx;
+
+			.search-input {
+				width: 414rpx;
+				height: 76rpx;
+				background: #FFFFFF;
+				border-radius: 36rpx;
+				margin-left: 20rpx;
+				padding: 0 32rpx;
+				box-sizing: border-box;
+				font-size: 24rpx;
+				margin-right: 24rpx;
+
+			}
+
+			.search-top {
+				font-size: 18rpx;
+				color: #222222;
+			}
+		}
+
+
+		.shop-list {
+			overflow: hidden;
+
+			.list-item {
+				display: flex;
+				align-items: center;
+				padding: 20rpx 16rpx;
+				background: #FFFFFF;
+				border-radius: 16rpx;
+				margin-bottom: 16rpx;
+
+				.goods-img {
+					width: 200rpx;
+					height: 200rpx;
+					border-radius: 16rpx;
+					overflow: hidden;
+					position: relative;
+					margin-right: 24rpx;
+
+					image {
+						width: 100%;
+						height: 100%;
+					}
+
+					.goods-label {
+						position: absolute;
+						top: 0;
+						width: 64rpx;
+						height: 40rpx;
+						background: rgba(0, 0, 0, 0.5);
+						border-radius: 16rpx 0rpx 16rpx 0rpx;
+						text-align: center;
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #FFFFFF;
+					}
+				}
+
+				.goods-right {
+					flex: 1;
+
+					.goods-title {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #000000;
+
+					}
+
+					.goods-details {
+						font-size: 24rpx;
+						color: #999999;
+						margin: 10rpx 0 20rpx;
+					}
+
+					.goods-people {
+						font-size: 22rpx;
+						color: #E69A22;
+						height: 56rpx;
+					}
+
+					.goods-shop {
+						display: flex;
+						justify-content: space-between;
+
+						.nummber {
+							color: #FF5C03;
+							font-size: 22rpx;
+							font-weight: 500;
+						}
+
+						.btn-group {
+							text-align: center;
+							line-height: 56rpx;
+
+							.collect-btn {
+								width: 72rpx;
+								background: #F5F7FA;
+								border-radius: 8rpx 0rpx 0rpx 8rpx;
+
+							}
+
+							.shop-btn {
+								width: 152rpx;
+								background: linear-gradient(270deg, #FF5C03 0%, #FFAC64 100%);
+								border-radius: 0rpx 8rpx 8rpx 0rpx;
+								font-weight: 500;
+								font-size: 26rpx;
+								color: #FFFFFF;
+
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	:deep(.u-list-item) {
+		width: 100%;
+		display: flex;
+		align-items: center;
+	}
+
+	:deep(.u-safe-area-inset-bottom) {
+		padding-bottom: 0
+	}
+</style>

+ 1 - 2
pages_shop/goods.vue

@@ -165,10 +165,9 @@
 					<image src="/static/images/googs1.png" mode=""></image>
 					<text class="label">店铺</text>
 				</view>
-					<view class="item"  @click="navgetTo('./storeOrderRefundList?liveId='+liveId)" style="position: relative;">
+					<view class="item"  @click="navgetTo('./storeOrderRefundList')" style="position: relative;">
 					<image src="/static/images/googs2.png" mode=""></image>
 					<text class="label">售后</text>
-					<button class="contact-btn" open-type="contact"></button>
 				</view>
 				<!-- <view class="item" style="position: relative;">
 					<image src="/static/images/googs2.png" mode=""></image>

+ 178 - 333
pages_shop/store.vue

@@ -1,5 +1,4 @@
 <template>
-	<!-- v-show="liveId" -->
 	<view class="content">
 		<view class="uni-nav-bar" style="background: linear-gradient(270deg, #FF5C03 0%, #FFAC64 100%);">
 			<view :style="{height: statusBarHeight + 'px',width: '100%'}"></view>
@@ -8,7 +7,7 @@
 					<u-icon name="arrow-left" color="#ffffff" size="20" @click="rightClick"></u-icon>
 				</view>
 				<view class="uni-nav-title">
-					<view class="inputbox" style="background: rgba(255, 255, 255, 0.4);width:70%;" @click="toSearch">
+					<view class="inputbox" style="background: rgba(255, 255, 255, 0.4);width:70%;">
 						<image class="icon-search" src="/static/images/search_white.png"></image>
 						<input placeholder="搜索本店" placeholder-style="color: #ffffff;" v-model="inputInfo"
 							@input="handleSearchInput" />
@@ -16,8 +15,7 @@
 				</view>
 			</view>
 		</view>
-		<!-- <view class="bg"></view> -->
-		<!-- <image class="bg" src="/static/images/chu_query.png" mode="widthFix"></image> -->
+
 		<view class="content-body">
 			<view class="store-head" v-show="storeInfo.storeName">
 				<view class="store-head-top">
@@ -34,87 +32,46 @@
 				</view>
 			</view>
 			<view class="storebox">
-				<!-- 商品 -->
 				<view class="medic-box">
-					<!-- <view class="cate-list">
-						<view v-for="(item,index) in cates" :key="index" :class="cateSelect == item.cateId?'item active':'item'" @click="choseCate(item)">
-							{{item.cateName }}</view>
-					</view> -->
 					<view class="medic">
-
-						<!-- <u-tabs :list="tabList" lineColor="linear-gradient( 90deg, #FE8227 0%, #FE4E12 100%)"
-								:activeStyle="{
-						             color: '#222222',
-						             fontWeight: '600',
-						             fontSize: '28rpx'
-						         }" :inactiveStyle="{
-						             color: '#757575',
-									 fontSize: '28rpx',
-						           fontWeight: '400'
-						         }" @click="selectTabList"></u-tabs> -->
-
-						<!-- 轮播图 -->
-						<!-- <view class="banner-box">
-							<swiper class="swiper" :indicator-dots="true" :circular="true" :autoplay="true"
-								:interval="3000" :duration="1000" indicator-color="rgba(255, 255, 255, 0.6)"
-								indicator-active-color="#ffffff">
-								<swiper-item class="swiper-item" v-for="(item,index) in advs" :key="index" @click="handleAdvClick(item)">
-									<image :src="item.imageUrl" mode=""></image>
-								</swiper-item>
-							</swiper>
-						</view> -->
-						<!-- 商品列表 -->
-						<view class="medic-list">
-							<view class="inner-list">
-								<view class="definite" v-for="(subItem,index) in products" :key="index"
-									@click="showProductList(subItem)">
-									<view class="img-box">
-										<image :src="subItem.imgUrl" mode="widthFix"></image>
-									</view>
-									<view class="name ellipsis2">{{subItem.productName}}</view>
-									<view class="price">
-										<text class="red"><text style="font-size: 20rpx;">¥</text><text
-												style="font-size: 36rpx;">{{Math.trunc(subItem.price)}}</text>.{{getPureDecimal(subItem.price)?getPureDecimal(subItem.price):'00'}}</text>
-										<text class="del">¥19.80</text>
+						<!-- 使用mescroll-body实现分页和刷新 -->
+						<mescroll-body :top="`calc(${statusBarHeight}px + 88rpx + 240rpx)`" bottom="0" ref="mescrollRef"
+							@init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption"
+							:up="upOption">
+							<view class="medic-list">
+								<view class="inner-list">
+									<view class="definite" v-for="(subItem,index) in products" :key="index"
+										@click="showProductList(subItem)">
+										<view class="img-box">
+											<image :src="subItem.imgUrl" mode="widthFix"></image>
+										</view>
+										<view class="name ellipsis2">{{subItem.productName}}</view>
+										<view class="price">
+											<text class="red"><text style="font-size: 20rpx;">¥</text><text
+													style="font-size: 36rpx;">{{Math.trunc(subItem.price)}}</text>.{{getPureDecimal(subItem.price)?getPureDecimal(subItem.price):'00'}}</text>
+											<text class="del">¥19.80</text>
+										</view>
 									</view>
 								</view>
-
-								<!-- 加载状态提示 -->
-								<view class="load-more" v-if="page > 1">
-									<text v-if="isLoading">加载中...</text>
-									<text v-else-if="!hasMore">没有更多数据了</text>
+								<!-- 空数据提示 -->
+								<view v-if="products.length === 0 && !loading" class="empty-data">
+									<image
+										src="https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png"
+										mode="aspectFit" class="empty-icon"></image>
+									<text class="empty-text">暂无商品数据</text>
 								</view>
 							</view>
-						</view>
+						</mescroll-body>
 					</view>
 				</view>
-				<!-- 商家信息 -->
-				<!-- <view class="storebox-info" :style="{height: divHeight}" v-show="current == 1">
-					<view class="storebox-map">
-						<u-icon name="map" color="#ccc" size="18"></u-icon>
-						<view style="margin-left: 10rpx;">{{storeInfo.address || "--"}}</view>
-					</view>
-					<view class="storebox-map" v-if="storeInfo.phone">
-						<u-icon name="phone" color="#ccc" size="18"></u-icon>
-						<view style="margin-left: 10rpx;">{{storeInfo.phone || "--"}}</view>
-					</view>
-					<view class="storebox-qualifications" v-if="storeInfo.descs">
-						<u-icon name="volume" color="#ccc" size="18"></u-icon>
-						<view style="margin-left: 10rpx;">{{storeInfo.descs || "--"}}</view>
-					</view>
-					<view class="storebox-qualifications">
-						<u-icon name="file-text" color="#ccc" size="18"></u-icon>
-						<view style="margin-left: 10rpx;">商家资质</view>
-					</view>
-					<view class="qualifications">
-						<view v-for="(img,i) in licenseImagesList" :key="i">
-							<u-image shape="square" lazyLoad :src="img" width="100%" mode="widthFix" radius="6"
-								@click="previewImage(i)"></u-image>
-						</view>
-					</view>
-				</view> -->
 			</view>
 		</view>
+
+		<!-- 加载提示 -->
+		<view v-if="loading" class="loading-mask">
+			<u-loading mode="circle" size="40" color="#FF5C03"></u-loading>
+			<text class="loading-text">加载中...</text>
+		</view>
 	</view>
 </template>
 
@@ -123,69 +80,62 @@
 		queryStore, //查询店铺
 		store // 小黄车查询店铺,
 	} from '@/api/live'
-	// import {getProductCate} from '@/api/product';
-	// import {getAdv} from '@/api/adv';
-	// import { getStoreById } from "@/api/store.js";
-
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
+		mixins: [MescrollMixin],
 		data() {
 			return {
-				page: 1, // 当前页码,初始为1
-				pageSize: 6, // 每页条数(和之前保持一致)
-				isLoading: false, // 是否正在加载数据,防止重复请求
-				hasMore: true, // 是否还有更多数据
-
+				// 分页相关配置
+				page: 1, // 当前页码
+				pageSize: 6, // 每页条数
+				total: 0, // 总数据量
+				loading: false, // 加载状态
+
+				// mescroll配置
+				mescroll: null,
+				downOption: {
+					use: true,
+					auto: true, // 改为true,进入页面自动刷新
+					offset: 80,
+					textinoffset: '下拉刷新',
+					textoutoffset: '释放更新',
+					textloading: '加载中...'
+				},
+				upOption: {
+					use: true, // 启用上拉加载
+					auto: true, // 进入页面自动加载
+					page: {
+						num: 0, // 初始页码
+						size: 6 // 每页数量
+					},
+					noMoreSize: 6, // 小于6条时显示无更多
+					textLoading: '加载中...',
+					textNoMore: '-- 没有更多数据了 --',
+					empty: {
+						use: false, // 不使用mescroll的空布局,使用自定义的
+						icon: '',
+						tip: ''
+					}
+				},
 
 				inputInfo: '',
 				searchTimer: null,
-				tabList: [{
-					name: '推荐',
-				}, {
-					name: '分类',
-				}],
 				products: [],
 				liveId: null,
-				storeId: null,
+				storeId: '',
 				statusBarHeight: uni.getWindowInfo().statusBarHeight,
-				// 右侧的胶囊距离右侧屏幕距离-px
-				menuRight: uni.getStorageSync('menuInfo').menuRight,
-				// 右侧的胶囊宽度-px
-				menuWidth: uni.getStorageSync('menuInfo').menuWidth,
-				opacity: 0,
-				opacityTxt: 0,
-				tabbar: [{
-					name: '商品',
-				}, {
-					name: '商家',
-				}],
-				current: 0,
 				storeInfo: {},
-				// logoUrl: "/static/images/adfd21c004854c9b8997d371d7a0ce8c.jpg",
-				// 商家资质图片
-				// licenseImagesList: ["/static/images/sjzz.jpg"],
-				divHeight: '0px',
-				allCates: [],
-				cates: [],
-				subCates: [],
-				// 选中药品分类
-				cateSelect: 0,
-				// 轮播图
-				advs: [],
-				// 'company'表示销售管理的进来的
-				from: ""
 			}
 		},
 		onLoad(options) {
 			console.log("接收到的options:", options);
 			if (options.liveId) {
 				this.liveId = options.liveId;
-				// this.getliveStore() // 获取小黄车 店铺展示
-				console.log("接收到的liveId:", this.liveId);
 			}
-
 			if (options.storeId) {
 				this.storeId = options.storeId || ""
-
+				// 加载店铺信息
+				this.queryCollect();
 			} else {
 				uni.showToast({
 					title: "storeId不存在~",
@@ -194,253 +144,149 @@
 			}
 		},
 		mounted() {
-			this.queryStore() //查询店铺
-			this.queryCollect()
+			// 初始化时不手动调用,由mescroll触发
 		},
 		onShow() {
 			this.divHeight = `calc(100vh - 44px - 88rpx - ${this.statusBarHeight}px)`
 		},
-		onPageScroll(e) {
-			if (e.scrollTop <= 44) {
-				this.opacityTxt = 0
-				this.opacity = e.scrollTop > this.statusBarHeight ? 0.6 : 0
-			} else if (e.scrollTop > 50) {
-				this.opacity = 1
-				this.opacityTxt = 1
-			}
-			// 监听滚动到底部(核心逻辑)
-			if (this.isLoading || !this.hasMore) return; // 过滤无效状态
-
-			// 获取页面可滚动高度、当前滚动位置、窗口高度
-			const {
-				scrollHeight,
-				scrollTop,
-				windowHeight
-			} = uni.getSystemInfoSync();
-			// 计算距离底部的距离(单位:px,1rpx ≈ 0.5px,这里按300rpx判断)
-			const distanceToBottom = scrollHeight - scrollTop - windowHeight;
-
-			// 当距离底部小于300rpx时,加载下一页
-			if (distanceToBottom < 300) {
-				this.page++; // 页码+1
-				this.queryStore(); // 触发下一页请求
-			}
-		},
 		methods: {
+			// 初始化mescroll
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+				console.log('mescroll初始化完成');
+			},
+
+			// 下拉刷新回调
+			async downCallback(mescroll) {
+				this.loading = true;
+				try {
+					// 重置页码,重新加载数据
+					this.page = 1;
+					await this.queryStore();
+
+					// 结束下拉刷新
+					mescroll.endSuccess();
+
+					// 重置上拉加载状态
+					mescroll.resetUpScroll();
+				} catch (error) {
+					console.error('下拉刷新失败:', error);
+					mescroll.endErr();
+				} finally {
+					this.loading = false;
+				}
+			},
+
+			// 上拉加载回调
+			async upCallback(page) {
+				this.loading = true;
+				try {
+					const pageNum = page.num;
+					const pageSize = page.size;
+
+					const res = await this.queryStore(pageNum, pageSize);
+
+					// 当前页数据
+					const curPageData = res.rows || [];
+					// 设置列表数据
+					if (pageNum == 1) {
+						this.products = []; // 如果是第一页需手动置空列表
+					}
+
+					// 追加新数据
+					this.products = this.products.concat(curPageData);
+
+					// 方法一(推荐): 后台接口有返回列表的总数据量 total
+					this.mescroll.endBySize(curPageData.length, res.total);
+
+					// 方法二(推荐): 后台接口有返回列表的总页数 pageCount
+					// this.mescroll.endByPage(curPageData.length, res.pageCount);
+
+				} catch (error) {
+					console.error('上拉加载失败:', error);
+					this.mescroll.endErr();
+				} finally {
+					this.loading = false;
+				}
+			},
+
 			handleSearchInput() {
-				// 搜索时重置分页(关键词变了,重新从第1页加载)
+				// 搜索时重置分页
 				clearTimeout(this.searchTimer);
 				this.searchTimer = setTimeout(() => {
-					this.page = 1; // 重置页码为1
-					this.hasMore = true; // 重置是否有更多数据
-					this.queryStore(); // 重新请求第一页
+					// 重置mescroll,重新加载第一
+					this.page = 1;
+					this.mescroll.resetUpScroll(true);
 				}, 500);
 			},
+
 			getPureDecimal(num, precision = 6) {
+				if (!num && num !== 0) return '00';
 				const decimalPart = Math.abs(num).toFixed(precision).split('.')[1];
-				return decimalPart?.replace(/0+$/, '') || ''; // 移除末尾多余的0
+				return decimalPart?.replace(/0+$/, '') || '00';
 			},
-			// // 店铺商品展示(支持分页)
-			// getliveStore() {
-			// 	// 如果正在加载或没有更多数据,直接返回
-			// 	if (this.isLoading || !this.hasMore) return;
-
-			// 	this.isLoading = true; // 标记为加载中
-			// 	const data = {
-			// 		pageSize: this.pageSize,
-			// 		page: this.page // 使用当前页码
-			// 	};
-
-			// 	liveStore(this.liveId, this.inputInfo, data)
-			// 		.then(res => {
-			// 			this.isLoading = false; // 结束加载状态
-			// 			if (res.code === 200) {
-			// 				const newProducts = res.data || [];
-			// 				// 如果是第一页,直接替换数据;否则合并数据
-			// 				if (this.page === 1) {
-			// 					this.products = newProducts;
-			// 				} else {
-			// 					this.products = [...this.products, ...newProducts];
-			// 				}
-			// 				// 判断是否还有更多数据(如果返回的数量小于每页条数,说明没有更多了)
-			// 				this.hasMore = newProducts.length >= this.pageSize;
-			// 			} else {
-			// 				uni.showToast({
-			// 					title: res.msg,
-			// 					icon: 'none'
-			// 				});
-			// 			}
-			// 		})
-			// 		.catch(rej => {
-			// 			this.isLoading = false; // 异常时也要结束加载状态
-			// 			uni.showToast({
-			// 				title: '加载失败',
-			// 				icon: 'none'
-			// 			});
-			// 		});
-			// },
-			//查询店铺
-			queryStore() {
-				if (!this.storeId) return;
-				if (this.isLoading || !this.hasMore) return;
-				this.isLoading = true; // 标记为加载中
-				queryStore(this.storeId, this.pageSize, this.page,this.inputInfo).then(res => {
-						this.isLoading = false; // 结束加载状态
-						if (res.code == 200) {
-							const newProducts = res.rows || [];
-							// 如果是第一页,直接替换数据;否则合并数据
-							if (this.page === 1) {
-								this.products = newProducts;
+
+			// 查询店铺商品
+			async queryStore(pageNum = 1, pageSize = 6) {
+				return new Promise((resolve, reject) => {
+					if (!this.storeId) {
+						reject('storeId不存在');
+						return;
+					}
+
+					queryStore(this.storeId, pageSize, pageNum, this.inputInfo)
+						.then(res => {
+							if (res.code == 200) {
+								resolve(res);
 							} else {
-								this.products = [...this.products, ...newProducts];
+								uni.showToast({
+									title: res.msg || '加载失败',
+									icon: 'none'
+								});
+								reject(res.msg);
 							}
-							// 判断是否还有更多数据(如果返回的数量小于每页条数,说明没有更多了)
-							this.hasMore = newProducts.length >= this.pageSize;
-						} else {
+						})
+						.catch(rej => {
 							uni.showToast({
-								title: res.msg,
+								title: '加载失败',
 								icon: 'none'
 							});
-						}
-					},
-					rej => {}
-				);
+							reject(rej);
+						});
+				});
 			},
+
 			// 小黄车查询店铺
 			queryCollect() {
 				if (!this.storeId) return;
-				store(this.storeId, '').then(res => {
-						if (res.code == 200) {
-							console.log("查询店铺>>", res)
-							this.storeInfo = res.data
-						} else {
-							uni.showToast({
-								title: res.msg,
-								icon: 'none'
-							});
-						}
-					},
-					rej => {}
-				);
+				let key = ''
+				store(this.storeId, key).then(res => {
+					if (res.code == 200) {
+						console.log("查询店铺>>", res)
+						this.storeInfo = res.data
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				}).catch(err => {
+					console.error('查询店铺信息失败:', err);
+				});
 			},
 
+
 			rightClick() {
-				// 获取页面栈
 				const pages = getCurrentPages();
-				// 如果页面栈长度大于1,说明有上一页可以返回
 				if (pages.length > 1) {
 					uni.navigateBack();
 				} else {
-					// 如果没有上一页,跳转到默认页面(比如首页)
 					uni.redirectTo({
-						url: '/pages/home/living' // 替换为你的首页路径
+						url: '/pages/home/living'
 					});
-
 				}
 			},
-			clickTab(item) {
-				this.current = item.index
-			},
-			// 预览图片
-			previewImage(index) {
-				uni.previewImage({
-					current: index,
-					urls: this.licenseImagesList
-				});
-			},
-			// getStoreInfo() {
-			// 	getStoreById({
-			// 		storeId: this.storeId
-			// 	}).then(
-			// 		res => {
-			// 			if (res.code == 200) {
-			// 				this.storeInfo = res.data || {}
-			// 				// this.licenseImagesList = this.storeInfo.licenseImages ? this.storeInfo.licenseImages.split(',') : []
-
-			// 			} else {
-			// 				uni.showToast({
-			// 					icon: 'none',
-			// 					title: res.msg,
-			// 				});
-			// 			}
-			// 		},
-			// 		rej => {}
-			// 	);
-			// },
-
-			handleAdvClick(item) {
-				if (item.showType == 1) {
-					uni.setStorageSync('url', item.advUrl);
-					uni.navigateTo({
-						url: "/pages/home/h5?storeId=" + this.storeId || ""
-					})
-				} else if (item.showType == 2) {
-					uni.navigateTo({
-						url: item.advUrl
-					})
-				} else if (item.showType == 3) {
-					uni.setStorageSync('content', item.content);
-					uni.navigateTo({
-						url: "/pages/home/content?storeId=" + this.storeId || ""
-					})
-				}
-
-			},
-			// getAdv() {
-			// 	let data = {
-			// 		advType: 2
-			// 	};
-			// 	getAdv(data).then(
-			// 		res => {
-			// 			if (res.code == 200) {
-			// 				this.advs = res.data;
-			// 			}
-			// 		},
-			// 		rej => {}
-			// 	);
-			// },
-			// getProductCate() {
-			// 	let data = {};
-			// 	getProductCate(data).then(
-			// 		res => {
-			// 			if (res.code == 200) {
-			// 				this.allCates = res.data;
-			// 				this.cates = this.allCates.filter(function(item) {
-			// 					return item.pid == 0
-			// 				});
-			// 				if (this.cates != null && this.cates.length > 0) {
-			// 					this.cateSelect = this.cates[0].cateId;
-			// 					this.getSubCate()
-			// 				}
-			// 			} else {
-			// 				uni.showToast({
-			// 					icon: 'none',
-			// 					title: "请求失败",
-			// 				});
-			// 			}
-			// 		},
-			// 		rej => {}
-			// 	);
-			// },
-			// 药品分类选择
-			choseCate(item) {
-				this.cateSelect = item.cateId;
-				this.getSubCate()
 
-			},
-			getSubCate() {
-				var that = this;
-				this.subCates = this.allCates.filter(function(item) {
-					// let subList = that.allCates.filter(child => {
-					// 	//返回每一项的子级数组
-					// 	return child.pid === item.cateId
-					// });
-					// subList.length > 0 ? item.children = subList : [];
-					return item.pid == that.cateSelect
-				});
-
-			},
-			// 查看药品详情
 			showProductList(item) {
 				uni.navigateTo({
 					url: '/pages_shop/goods?productId=' + item.productId + '&liveId=' + this.liveId + '&goodsId=' +
@@ -623,7 +469,6 @@
 		&-info {
 			padding: 24rpx 24rpx 0 24rpx;
 			background-color: #fff;
-			font-family: PingFang SC, PingFang SC;
 			font-size: 28rpx;
 			color: #333333;
 			position: relative;

+ 1 - 1
pages_shop/storeOrderRefundDetails.vue

@@ -155,7 +155,7 @@
 </template>
 
 <script>
-	import {getStoreAfterSalesById} from '@/api/order.js'
+	import {getStoreAfterSalesById,revoke} from '@/api/order.js'
 	// import {getDictByKey} from '@/api/common.js'
 	
 	// import {getStoreAfterSalesById,revoke} from '@/api/storeAfterSales.js'

+ 12 - 12
pages_shop/storeOrderRefundList.vue

@@ -3,7 +3,7 @@
 		<u-sticky>
 			<view class="top-fixed">
 				 <u-tabs
-				  :scrollable="false"
+				  :scrollable="true"
 				  :list="tabs"  
 				  lineColor="#FF5C03"
 				 @change="tabChange">
@@ -11,7 +11,7 @@
 			</view>
 		</u-sticky>
 		<!-- 订单列表 -->
-		<mescroll-body top="88rpx" bottom="0"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+		<mescroll-body top="110rpx" bottom="0"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
 			<view class="order-list">
 				<view v-for="(item,index) in dataList" :key="index" class="item"  >
 					<!-- 订单号,状态 -->
@@ -69,8 +69,6 @@
 
 <script>
 	import {getStoreAfterSalesList} from '@/api/order.js' //获取售后列表
-	// import {getDictByKey} from '@/api/common.js'
-	// import {getStoreAfterSalesList} from '@/api/storeAfterSales.js'
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
 		mixins: [MescrollMixin], 
@@ -79,15 +77,20 @@
 				userId:uni.getStorageSync("userInfo").userId,
 				statusOptions:[],
 				tabs: [
+					
 					// {name:"全部",id:"0"},
 					// {name:"售后中",id:"1"},
 					// {name:"已完成",id:"2"},
+					
+					
 					{name:"全部",status:""},
 					{name:"待平台审核",status:"0"},
 					{name:"待用户发货",status:"1"},
 					{name:"待仓库审核",status:"2"},
 					{name:"财务审核 ",status:"3"},
 					{name:"退款成功 ",status:"4"},
+					
+					
 					// {name:"已提交等待平台审核",id:"0"},
 					// {name:"平台已审核 等待用户发货",id:"1"},
 					// {name:"用户已发货待仓库审核",id:"2"},
@@ -155,13 +158,7 @@
 			upCallback(page) {
 				//联网加载数据
 				var that = this;
-				// var data = {
-				// 	userId:672,
-				// 	// status:this.status,
-				// 	pageNum: page.num,
-				// 	pageSize: page.size
-				// };
-				getStoreAfterSalesList(672,page.size,page.num,this.status).then(res => {
+				getStoreAfterSalesList(this.userId,page.size,page.num,this.status).then(res => {
 					if(res.code==200){
 						//设置列表数据
 						if (page.num == 1) {
@@ -195,13 +192,16 @@
 </script>
 
 <style lang="scss">
+	:deep(.u-tabs__wrapper__nav__line){
+		bottom: 10px !important;
+	}
 	.top-fixed{
 		width: 100%;
 		position: absolute;
 		top: 0;
 		left: 0;
 		z-index: 10;
-		height: 88upx;
+		height: 110upx;
 		background-color: #fff;
 	}
 	.order-list{

+ 276 - 261
pages_user/integralGoodsList.vue

@@ -17,317 +17,332 @@
 						</view>
 					</view>
 					<view class="tabs" v-if="tabs.length>0">
-						<u-tabs
-						 :current="tabIndex"
-						 :scrollable="true"
-						 :list="tabs"  
-						 lineColor="#FF5C03"
-						@change="tabChange">
+						<u-tabs :current="tabIndex" :scrollable="true" :list="tabs" lineColor="#FF5C03"
+							@change="tabChange">
 						</u-tabs>
 					</view>
 				</view>
 			</u-sticky>
-			<mescroll-body bottom="0"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
-			<view class="integral-box">
-				<view class="item"  @click="navTo('/pages/user/integral/integralGoodsDetails?goodsId='+item.goodsId)" v-for="(item,index) in dataList">
-					<view class="top">
-						<image :src="item.imgUrl"></image>
-					</view>
-					<view class="bottom">
-						<view class="title ellipsis2">
-							{{item.goodsName}}
+			<mescroll-body bottom="0" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
+				:down="downOption" :up="upOption">
+				<view class="integral-box">
+					<view class="item" @click="navTo('/pages/user/integral/integralGoodsDetails?goodsId='+item.goodsId)"
+						v-for="(item,index) in dataList">
+						<view class="top">
+							<image :src="item.imgUrl"></image>
 						</view>
-						<view class="price-box">
-							<view class="price">{{item.integral}}芳华币</view>
-							<view class="count">价值:{{item.otPrice.toFixed(2)}}元</view>
+						<view class="bottom">
+							<view class="title ellipsis2">
+								{{item.goodsName}}
+							</view>
+							<view class="price-box">
+								<view class="price">{{item.integral}}芳华币</view>
+								<view class="count">价值:{{item.otPrice.toFixed(2)}}元</view>
+							</view>
 						</view>
 					</view>
 				</view>
-			</view>
 			</mescroll-body>
 		</view>
-		
+
 	</view>
 </template>
 
 <script>
- // import {getDictByKey} from '@/api/common.js'
- // import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
- // import {getIntegralGoodsList} from '@/api/integral.js'
- // import {getUserInfo} from '@/api/user'
- export default {
-	mixins: [MescrollMixin], 
- 	data() {
- 		return {
-			integral:0,
-			type:"0",
-			typeOptions:[],
-			tabIndex:0,
-			tabs: [],
-			mescroll:null,
-			downOption: {   
-			                use: true,
-			                auto: false,
-			                textInOffset: '下拉刷新', // 可选:下拉提示文字
-			                textOutOffset: '释放更新', // 可选:释放提示文字
-			                textLoading: '加载中...' // 可选:加载中提示文字
-			            },
-			upOption: {
-				onScroll:false,
-				use: true, // 是否启用上拉加载; 默认true
-				page: {
-					pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-					size: 10 // 每页数据的数量,默认10
+	// import {getDictByKey} from '@/api/common.js'
+	// import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	// import {getIntegralGoodsList} from '@/api/integral.js'
+	// import {getUserInfo} from '@/api/user'
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				integral: 0,
+				type: "0",
+				typeOptions: [],
+				tabIndex: 0,
+				tabs: [],
+				mescroll: null,
+				downOption: {
+					use: true,
+					auto: false,
+					textInOffset: '下拉刷新', // 可选:下拉提示文字
+					textOutOffset: '释放更新', // 可选:释放提示文字
+					textLoading: '加载中...' // 可选:加载中提示文字
 				},
-				noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-				textNoMore:"已经到底了",
-				empty: {
-					icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
-					tip: '暂无数据'
-				}
-			},
-			dataList: []
- 		}
- 	},
-	onLoad() {
-		this.getDictByKey("sys_integral_goods_type");
-		this.getUserInfo();
-	},
- 	methods: {
-		getUserInfo(){
-			getUserInfo().then(
-				res => {
-					if(res.code==200){
-						if(res.user!=null){
-							this.integral=res.user.integral;
-						}
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: "请求失败",
-						});
+				upOption: {
+					onScroll: false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore: "已经到底了",
+					empty: {
+						icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
 					}
 				},
-				rej => {}
-			);
+				dataList: []
+			}
 		},
-		navTo(url) {
-			uni.navigateTo({
-				url: url
-			})
+		onLoad() {
+			this.getDictByKey("sys_integral_goods_type");
+			this.getUserInfo();
 		},
-		goIntegral() {
-			let pages = getCurrentPages();
-			let url = pages[ pages.length - 2];
-			if(pages.length > 1&&url&&url.route == 'pages/user/integral/points') {
-				uni.navigateBack()
-			} else {
+		methods: {
+			getUserInfo() {
+				getUserInfo().then(
+					res => {
+						if (res.code == 200) {
+							if (res.user != null) {
+								this.integral = res.user.integral;
+							}
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			navTo(url) {
 				uni.navigateTo({
-					url: '/pages/user/integral/points'
+					url: url
 				})
-			}
-		},
-		getDictByKey(key){
-			var data={key:key}
-			var that=this;
-			getDictByKey(data).then(
-				res => {
-					if(res.code==200){
-						this.typeOptions=res.data;
-						this.typeOptions.forEach(function(item,index){
-							var data={name:item.dictLabel};
-							that.tabs.push(data);
-						})
-						if(this.tabs.length>0){
-							this.tabIndex=0
+			},
+			goIntegral() {
+				let pages = getCurrentPages();
+				let url = pages[pages.length - 2];
+				if (pages.length > 1 && url && url.route == 'pages/user/integral/points') {
+					uni.navigateBack()
+				} else {
+					uni.navigateTo({
+						url: '/pages/user/integral/points'
+					})
+				}
+			},
+			getDictByKey(key) {
+				var data = {
+					key: key
+				}
+				var that = this;
+				getDictByKey(data).then(
+					res => {
+						if (res.code == 200) {
+							this.typeOptions = res.data;
+							this.typeOptions.forEach(function(item, index) {
+								var data = {
+									name: item.dictLabel
+								};
+								that.tabs.push(data);
+							})
+							if (this.tabs.length > 0) {
+								this.tabIndex = 0
+							}
+
 						}
-						
-					}
-				},
-				err => {
+					},
+					err => {}
+				);
+
+			},
+			tabChange(item) {
+				console.log(item.index)
+				this.type = this.typeOptions[item.index].dictValue;
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				if (this.type != null) {
+					data.goodsType = this.type
 				}
-			);
-			
-		},
-		tabChange(item){
-			console.log(item.index)
-			this.type=this.typeOptions[item.index].dictValue;
-			this.mescroll.resetUpScroll()
-		},
-		mescrollInit(mescroll) {
-			this.mescroll = mescroll;
-		},
-		/*下拉刷新的回调 */
-		downCallback(mescroll) {
-			mescroll.resetUpScroll()
-		},
-		upCallback(page) {
-			//联网加载数据
-			var that = this;
-			var data = {
-				pageNum: page.num,
-				pageSize: page.size
-			};
-			if(this.type!=null){
-				data.goodsType=this.type
-			}
-			getIntegralGoodsList(data).then(res => {
-				if(res.code==200){
-					//设置列表数据
-					if (page.num == 1) {
-						that.dataList = res.data.list; 
-						
+				getIntegralGoodsList(data).then(res => {
+					if (res.code == 200) {
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
 					} else {
-						that.dataList = that.dataList.concat(res.data.list);
-						 
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
 					}
-					that.mescroll.endBySize(res.data.list.length, res.data.total);
-					
-				}else{
-					uni.showToast({
-						icon:'none',
-						title: "请求失败",
-					});
-					that.dataList = null;
-					that.mescroll.endErr();
-				}
-			});
+				});
+			}
+
 		}
-		 
- 	}
- }
- 
- 
+	}
 </script>
 
 
 <style scoped lang="scss">
-page{
-	height: 100%;
-	background-color: #f5f5f5;
-}
-.content{
-	height: 100%;
-	.cont-box{
-		.top-box{
-			padding: 30rpx 30rpx 0 30rpx;
-			width: 100%;
-			background-color: #f5f5f5;
-			.my-integral{
-				height: 200rpx;
-				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
-				background: linear-gradient(#FF5C03, #E2C99E);
-				border-radius: 30rpx;
-				display: flex;
-				align-items: flex-start;
-				justify-content: space-between;
-				padding: 30rpx;
-				.integralbtn {
-					font-size: 24rpx;
-					font-family: PingFang SC;
-					color: #fff;
-					margin-left: 16rpx;
-					text-decoration: underline;
-				}
-				.btn{
-					margin-bottom: 30rpx;
-					background-color: #fff;
+	page {
+		height: 100%;
+		background-color: #f5f5f5;
+	}
+
+	.content {
+		height: 100%;
+
+		.cont-box {
+			.top-box {
+				padding: 30rpx 30rpx 0 30rpx;
+				width: 100%;
+				background-color: #f5f5f5;
+
+				.my-integral {
+					height: 200rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
+					background: linear-gradient(#FF5C03, #E2C99E);
 					border-radius: 30rpx;
 					display: flex;
-					align-items: center;
-					justify-content: center;
-					padding: 10rpx 15rpx;
-					font-size: 20upx;
-					font-family: PingFang SC;
-					color: #FF5C03;
-				}
-				.left{
-					.label{
-						font-size: 28upx;
+					align-items: flex-start;
+					justify-content: space-between;
+					padding: 30rpx;
+
+					.integralbtn {
+						font-size: 24rpx;
 						font-family: PingFang SC;
 						color: #fff;
+						margin-left: 16rpx;
+						text-decoration: underline;
 					}
-					.integral{
-						font-weight: bold;
-						font-size: 40upx;
+
+					.btn {
+						margin-bottom: 30rpx;
+						background-color: #fff;
+						border-radius: 30rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						padding: 10rpx 15rpx;
+						font-size: 20upx;
 						font-family: PingFang SC;
-						color: #fff;
+						color: #FF5C03;
+					}
+
+					.left {
+						.label {
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #fff;
+						}
+
+						.integral {
+							font-weight: bold;
+							font-size: 40upx;
+							font-family: PingFang SC;
+							color: #fff;
+						}
+					}
+
+					.btn-box {
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: flex-start;
 					}
 				}
-				.btn-box{
-					display: flex;
-					flex-direction: column;
-					align-items: flex-start;
-					justify-content: flex-start;
+
+				.tabs {
+					height: 88rpx;
 				}
 			}
-			.tabs{
-				height: 88rpx;
-			}
-		}
-		.integral-box{
-			padding: 0 30rpx 30rpx 30rpx;
-			display: flex;
-			align-items: flex-start;
-			justify-content: flex-start;
-			flex-wrap: wrap;
-			.item{
-				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
-				background-color: #fff;
-				width: calc(50% - 20rpx);
-				border-radius: 15rpx;
-				margin: 10rpx;
+
+			.integral-box {
+				padding: 0 30rpx 30rpx 30rpx;
 				display: flex;
-				flex-direction: column;
 				align-items: flex-start;
 				justify-content: flex-start;
-				&:last-child{
-				}
-				.top{
-					width:100%;
-					height:300rpx;
-					image{
-						border-radius: 15rpx 15rpx 0rpx 0rpx;
-						width:100%;
-						height:300rpx;
-					}
-					
-				}
-				.bottom{
-					width: 100%;
-					padding: 15rpx;
-					.title{
-						font-weight: bold;
-						font-size: 28upx;
-						font-family: PingFang SC;
-						color: #111111;
+				flex-wrap: wrap;
+
+				.item {
+					box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
+					background-color: #fff;
+					width: calc(50% - 20rpx);
+					border-radius: 15rpx;
+					margin: 10rpx;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+
+					&:last-child {}
+
+					.top {
+						width: 100%;
+						height: 300rpx;
+
+						image {
+							border-radius: 15rpx 15rpx 0rpx 0rpx;
+							width: 100%;
+							height: 300rpx;
+						}
+
 					}
-					.price-box{
-						margin-top: 10rpx;
-						display: flex;
-						align-items: center;
-						justify-content: space-between;
+
+					.bottom {
 						width: 100%;
-						.price{
-							padding: 5rpx 10rpx;
-							background-color: #FF5C03;
-							border-radius: 30rpx;
-							font-size: 20upx;
+						padding: 15rpx;
+
+						.title {
+							font-weight: bold;
+							font-size: 28upx;
 							font-family: PingFang SC;
-							color: #ffffff;
+							color: #111111;
 						}
-						.count{
-							font-size: 24upx;
-							font-family: PingFang SC;
-							color: #333333;
+
+						.price-box {
+							margin-top: 10rpx;
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							width: 100%;
+
+							.price {
+								padding: 5rpx 10rpx;
+								background-color: #FF5C03;
+								border-radius: 30rpx;
+								font-size: 20upx;
+								font-family: PingFang SC;
+								color: #ffffff;
+							}
+
+							.count {
+								font-size: 24upx;
+								font-family: PingFang SC;
+								color: #333333;
+							}
+
 						}
-						
 					}
 				}
 			}
 		}
 	}
-}
- 
-
-</style>
+</style>

+ 0 - 8
uni_modules/mescroll-uni/changelog.md

@@ -1,8 +0,0 @@
-## 1.3.8(2023-03-27)
-1. 新增useMescroll的hook, 支持vue3 script setup的写法  
-2. 新增vue3 script setup的示例 ( 根据vue2的示例,全部重写了一遍 )  
-3. mescroll-body 和 mescroll-uni 无需再写 ref="mescrollRef"  
-4. 解决mescroll-uni在页面渲染之后,无法动态设置height的问题  
-5. 解决renderjs在h5返回有时候无法正常滑动的问题  
-6. 修复小程序编辑器提示 Cannot read property 'nv_optDown' of undefined 的错误  
--by 小瑾同学

+ 2 - 2
uni_modules/mescroll-uni/components/mescroll-body/mescroll-body.vue

@@ -33,7 +33,7 @@
 			<!-- <mescroll-up v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" :option="mescroll.optUp" :type="upLoadType"></mescroll-up> -->
 			<view v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" class="mescroll-upwarp" :style="{'background':mescroll.optUp.bgColor,'color':mescroll.optUp.textColor}">
 				<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
-				<view v-if="upLoadType===1">
+				<view v-show="upLoadType===1">
 					<view class="upwarp-progress mescroll-rotate" :style="{'border-color':mescroll.optUp.textColor}"></view>
 					<view class="upwarp-tip">{{ mescroll.optUp.textLoading }}</view>
 				</view>
@@ -106,7 +106,7 @@
 	 * @event {Function} emptyclick 点击empty配置的btnText按钮回调
 	 * @event {Function} topclick 点击回到顶部的按钮回调
 	 * @event {Function} scroll 滚动监听 (需在 up 配置 onScroll:true 才生效)
-	 * @example <mescroll-body @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-body>
+	 * @example <mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-body>
 	 */
 	export default {
 		name: 'mescroll-body',

+ 47 - 0
uni_modules/mescroll-uni/components/mescroll-diy/beibei/components/mescroll-down.css

@@ -0,0 +1,47 @@
+/*下拉刷新--标语*/
+.mescroll-downwarp .downwarp-slogan{
+	display: block;
+	width: 420rpx;
+	height: 168rpx;
+	margin: auto;
+}
+/*下拉刷新--向下进度动画*/
+.mescroll-downwarp .downwarp-progress{
+	display: inline-block;
+	width: 40rpx;
+	height: 40rpx;
+	border: none;
+	margin: auto;
+	background-size: contain;
+	background-repeat: no-repeat;
+	background-position: center;
+	background-image: url(https://www.mescroll.com/img/beibei/mescroll-progress.png);
+	transition: all 300ms;
+}
+/*下拉刷新--进度条*/
+.mescroll-downwarp .downwarp-loading{
+	display: inline-block;
+	width: 32rpx;
+	height: 32rpx;
+	border-radius: 50%;
+	border: 2rpx solid #FF8095;
+	border-bottom-color: transparent;
+}
+/*下拉刷新--吉祥物*/
+.mescroll-downwarp .downwarp-mascot{
+	position: absolute;
+	right: 16rpx;
+	bottom: 0;
+	width: 100rpx;
+	height: 100rpx;
+	background-size: contain;
+	background-repeat: no-repeat;
+	animation: animMascot .6s steps(1,end) infinite;
+}
+@keyframes animMascot {
+	0% {background-image: url(https://www.mescroll.com/img/beibei/mescroll-bb1.png)}
+	25% {background-image: url(https://www.mescroll.com/img/beibei/mescroll-bb2.png)}
+	50% {background-image: url(https://www.mescroll.com/img/beibei/mescroll-bb3.png)}
+	75% {background-image: url(https://www.mescroll.com/img/beibei/mescroll-bb4.png)}
+	100% {background-image: url(https://www.mescroll.com/img/beibei/mescroll-bb1.png)}
+}

+ 39 - 0
uni_modules/mescroll-uni/components/mescroll-diy/beibei/components/mescroll-down.vue

@@ -0,0 +1,39 @@
+<!-- 下拉刷新区域 -->
+<template>
+	<view v-if="mOption.use" class="mescroll-downwarp" :style="{'background':mOption.bgColor,'color':mOption.textColor}">
+		<view class="downwarp-content">
+			<image class="downwarp-slogan" src="https://www.mescroll.com/img/beibei/mescroll-slogan.jpg?v=1" mode="widthFix"/>
+			<view v-if="isDownLoading" class="downwarp-loading mescroll-rotate"></view>
+			<view v-else class="downwarp-progress" :style="{'transform':downRotate}"></view>
+			<view class="downwarp-mascot"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		option: Object , // down的配置项
+		type: Number // 下拉状态(inOffset:1, outOffset:2, showLoading:3, endDownScroll:4)
+	},
+	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption(){
+			return this.option || {}
+		},
+		// 是否在加载中
+		isDownLoading(){
+			return this.type === 3
+		},
+		// 旋转的角度
+		downRotate(){
+			return this.type === 2 ? 'rotate(180deg)' : 'rotate(0deg)'
+		}
+	}
+};
+</script>
+
+<style>
+@import "../../../mescroll-uni/components/mescroll-down.css";
+@import "./mescroll-down.css";
+</style>

+ 47 - 90
node_modules/mescroll-uni/mescroll-body.vue → uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-body.vue

@@ -1,28 +1,31 @@
 <template>
 	<view 
-	class="mescroll-body mescroll-render-touch" 
-	:class="{'mescorll-sticky': sticky}"
-	:style="{'minHeight':minHeight, 'padding-top': padTop, 'padding-bottom': padBottom}" 
-	@touchstart="wxsBiz.touchstartEvent" 
-	@touchmove="wxsBiz.touchmoveEvent" 
-	@touchend="wxsBiz.touchendEvent" 
-	@touchcancel="wxsBiz.touchendEvent"
-	:change:prop="wxsBiz.propObserver"
-	:prop="wxsProp"
-	>
+		class="mescroll-body mescroll-render-touch" 
+		:style="{'minHeight':minHeight, 'padding-top': padTop, 'padding-bottom': padBottom}" 
+		:class="{'mescorll-sticky': sticky}"
+		@touchstart="wxsBiz.touchstartEvent" 
+		@touchmove="wxsBiz.touchmoveEvent" 
+		@touchend="wxsBiz.touchendEvent" 
+		@touchcancel="wxsBiz.touchendEvent"
+		:change:prop="wxsBiz.propObserver"
+		:prop="wxsProp"
+		>
+		
 		<!-- 状态栏 -->
 		<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
-		
+
 		<view class="mescroll-body-content mescroll-wxs-content" :style="{ transform: translateY, transition: transition }" :change:prop="wxsBiz.callObserver" :prop="callProp">
 			<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
-			<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType" :rate="downRate"></mescroll-down> -->
+			<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType"></mescroll-down> -->
 			<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
 				<view class="downwarp-content">
-					<view class="downwarp-progress mescroll-wxs-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mescroll.optDown.textColor, 'transform': downRotate}"></view>
-					<view class="downwarp-tip">{{downText}}</view>
+					<image class="downwarp-slogan" src="https://www.mescroll.com/img/beibei/mescroll-slogan.jpg?v=1" mode="widthFix"/>
+					<view v-if="isDownLoading" class="downwarp-loading mescroll-rotate"></view>
+					<view v-else class="downwarp-progress" :style="{'transform':downRotate}"></view>
+					<view class="downwarp-mascot"></view>
 				</view>
 			</view>
-	
+						
 			<!-- 列表内容 -->
 			<slot></slot>
 
@@ -42,7 +45,7 @@
 			</view>
 		</view>
 		
-		<!-- 底部是否偏移TabBar的高度(默认H5端的tab页生效) -->
+		<!-- 底部是否偏移TabBar的高度(仅H5端生效) -->
 		<!-- #ifdef H5 -->
 		<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
 		<!-- #endif -->
@@ -52,7 +55,7 @@
 		
 		<!-- 回到顶部按钮 (fixed元素需写在transform外面,防止降级为absolute)-->
 		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
-		
+
 		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
 		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
 		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
@@ -62,13 +65,13 @@
 
 <!-- 微信小程序, QQ小程序, app, h5使用wxs -->
 <!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
-<script src="./wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<script src="../../mescroll-uni/wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
 <!-- #endif -->
 
 <!-- app, h5使用renderjs -->
 <!-- #ifdef APP-PLUS || H5 -->
 <script module="renderBiz" lang="renderjs">
-	import renderBiz from './wxs/renderjs.js';
+	import renderBiz from '../../mescroll-uni/wxs/renderjs.js';
 	export default {
 		mixins: [renderBiz]
 	}
@@ -76,67 +79,21 @@
 <!-- #endif -->
 
 <script>
-	// 引入mescroll-uni.js,处理核心逻辑
-	import MeScroll from './mescroll-uni.js';
-	// 引入全局配置
+	import MeScroll from '../../mescroll-uni/mescroll-uni.js';
+	import MescrollTop from '../../mescroll-uni/components/mescroll-top.vue';
+	import WxsMixin from '../../mescroll-uni/wxs/mixins.js';
+	import mescrollI18n from '../../mescroll-uni/mescroll-i18n.js';
 	import GlobalOption from './mescroll-uni-option.js';
-	// 引入空布局组件
-	import MescrollEmpty from './components/mescroll-empty.vue';
-	// 引入国际化工具类
-	import mescrollI18n from './mescroll-i18n.js';
-	// 引入回到顶部组件
-	import MescrollTop from './components/mescroll-top.vue';
-	// 引入兼容wxs(含renderjs)写法的mixins
-	import WxsMixin from './wxs/mixins.js';
 	
-	/**
-	 * mescroll-body 基于page滚动的下拉刷新和上拉加载组件, 支持嵌套原生组件, 性能好
-	 * @property {Object} down 下拉刷新的参数配置
-	 * @property {Object} up 上拉加载的参数配置
-	 * @property {Object} i18n 国际化的参数配置
-	 * @property {String, Number} top 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
-	 * @property {Boolean, String} topbar 偏移量top是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
-	 * @property {String, Number} bottom 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
-	 * @property {Boolean} safearea 偏移量bottom是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
-	 * @property {Boolean} fixed 是否通过fixed固定mescroll的高度, 默认true
-	 * @property {String, Number} height 指定mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
-	 * @property {Boolean} bottombar 底部是否偏移TabBar的高度 (仅在H5端的tab页生效)
-	 * @property {Boolean} sticky 是否支持sticky,默认false; 当值配置true时,需避免在mescroll-body标签前面加非定位的元素,否则下拉区域无法隐藏
-	 * @event {Function} init 初始化完成的回调 
-	 * @event {Function} down 下拉刷新的回调
-	 * @event {Function} up 上拉加载的回调 
-	 * @event {Function} emptyclick 点击empty配置的btnText按钮回调
-	 * @event {Function} topclick 点击回到顶部的按钮回调
-	 * @event {Function} scroll 滚动监听 (需在 up 配置 onScroll:true 才生效)
-	 * @example <mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-body>
-	 */
 	export default {
-		name: 'mescroll-body',
 		mixins: [WxsMixin],
 		components: {
-			MescrollEmpty,
 			MescrollTop
 		},
-		props: {
-			down: Object,
-			up: Object,
-			i18n: Object,
-			top: [String, Number],
-			topbar: [Boolean, String],
-			bottom: [String, Number],
-			safearea: Boolean,
-			height: [String, Number],
-			bottombar:{
-				type: Boolean,
-				default: true
-			},
-			sticky: Boolean
-		},
 		data() {
 			return {
-				mescroll: {optDown:{},optUp:{}}, // mescroll实例
+				mescroll: null, // mescroll实例
 				downHight: 0, //下拉刷新: 容器高度
-				downRate: 0, // 下拉比率(inOffset: rate<1; outOffset: rate>=1)
 				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
 				upLoadType: 0, // 上拉加载状态:0(loading前),1(loading中),2(没有更多了,显示END文本提示),3(没有更多了,不显示END文本提示)
 				isShowEmpty: false, // 是否显示空布局
@@ -146,6 +103,21 @@
 				statusBarHeight: 0 // 状态栏高度
 			};
 		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			i18n: Object, // 国际化的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			height: [String, Number], // 指定mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			},
+			sticky: Boolean // 是否支持sticky,默认false; 当值配置true时,需避免在mescroll-body标签前面加非定位的元素,否则下拉区域无法会隐藏
+		},
 		computed: {
 			// mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
 			minHeight(){
@@ -182,18 +154,7 @@
 			},
 			// 旋转的角度
 			downRotate(){
-				return 'rotate(' + 360 * this.downRate + 'deg)'
-			},
-			// 文本提示
-			downText(){
-				if(!this.mescroll) return ""; // 避免头条小程序初始化时报错
-				switch (this.downLoadType){
-					case 1: return this.mescroll.optDown.textInOffset;
-					case 2: return this.mescroll.optDown.textOutOffset;
-					case 3: return this.mescroll.optDown.textLoading;
-					case 4: return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
-					default: return this.mescroll.optDown.textInOffset;
-				}
+				return this.downLoadType === 2 ? 'rotate(180deg)' : 'rotate(0deg)'
 			}
 		},
 		methods: {
@@ -245,16 +206,11 @@
 					onMoving(mescroll, rate, downHight) {
 						// 下拉过程中的回调,滑动过程一直在执行;
 						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
-						vm.downRate = rate; //下拉比率 (inOffset: rate<1; outOffset: rate>=1)
 					},
 					showLoading(mescroll, downHight) {
 						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
 						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
 					},
-					beforeEndDownScroll(mescroll){
-						vm.downLoadType = 4; 
-						return mescroll.optDown.beforeEndDelay // 延时结束的时长
-					},
 					endDownScroll() {
 						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
 						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
@@ -302,7 +258,7 @@
 					}
 				}
 			};
-			
+
 			let i18nType = mescrollI18n.getType() // 当前语言类型
 			let i18nOption = {type: i18nType} // 国际化配置
 			MeScroll.extend(i18nOption, vm.i18n) // 具体页面的国际化配置
@@ -397,7 +353,8 @@
 </script>
 
 <style>
-	@import "./mescroll-body.css";
+	@import "../../mescroll-body/mescroll-body.css";
+	@import "../../mescroll-uni/components/mescroll-down.css";
+	@import "../../mescroll-uni/components/mescroll-up.css";
 	@import "./components/mescroll-down.css";
-	@import './components/mescroll-up.css';
 </style>

+ 49 - 0
uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-uni-option.js

@@ -0,0 +1,49 @@
+// mescroll-uni和mescroll-body 的全局配置
+const GlobalOption = {
+	down: {
+		// 其他down的配置参数也可以写,这里只展示了常用的配置:
+		offset: uni.upx2px(140), // 在列表顶部,下拉大于140upx,松手即可触发下拉刷新的回调
+		native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
+	},
+	up: {
+		// 其他up的配置参数也可以写,这里只展示了常用的配置:
+		offset: 150, // 距底部多远时,触发upCallback
+		toTop: {
+			// 回到顶部按钮,需配置src才显示
+			src: "https://www.mescroll.com/img/mescroll-totop.png", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png )
+			offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px
+			right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+			bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+			width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+		},
+		empty: {
+			use: true, // 是否显示空布局
+			icon: "https://www.mescroll.com/img/mescroll-empty.png" // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png )
+		}
+	},
+	// 国际化配置
+	i18n: {
+		// 中文
+		zh: {
+			up: {
+				textLoading: '加载中 ...', // 加载中的提示文本
+				textNoMore: '-- END --', // 没有更多数据的提示文本
+				empty: {
+					tip: '~ 暂无相关数据 ~' // 空提示
+				}
+			}
+		},
+		// 英文
+		en: {
+			up: {
+				textLoading: 'loading ...',
+				textNoMore: '-- END --',
+				empty: {
+					tip: '~ absolutely empty ~'
+				}
+			}
+		}
+	}
+}
+
+export default GlobalOption

+ 45 - 88
node_modules/mescroll-uni/mescroll-uni.vue → uni_modules/mescroll-uni/components/mescroll-diy/beibei/mescroll-uni.vue

@@ -8,16 +8,19 @@
 			@touchcancel="wxsBiz.touchendEvent"
 			:change:prop="wxsBiz.propObserver"
 			:prop="wxsProp">
+						
 				<!-- 状态栏 -->
 				<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
-		
+							
 				<view class="mescroll-wxs-content" :style="{'transform': translateY, 'transition': transition}" :change:prop="wxsBiz.callObserver" :prop="callProp">
 					<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
-					<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType" :rate="downRate"></mescroll-down> -->
+					<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType"></mescroll-down> -->
 					<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
 						<view class="downwarp-content">
-							<view class="downwarp-progress mescroll-wxs-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mescroll.optDown.textColor, 'transform': downRotate}"></view>
-							<view class="downwarp-tip">{{downText}}</view>
+							<image class="downwarp-slogan" src="https://www.mescroll.com/img/beibei/mescroll-slogan.jpg?v=1" mode="widthFix"/>
+							<view v-if="isDownLoading" class="downwarp-loading mescroll-rotate"></view>
+							<view v-else class="downwarp-progress" :style="{'transform':downRotate}"></view>
+							<view class="downwarp-mascot"></view>
 						</view>
 					</view>
 
@@ -39,8 +42,8 @@
 						<view v-if="upLoadType===2" class="upwarp-nodata">{{ mescroll.optUp.textNoMore }}</view>
 					</view>
 				</view>
-			
-				<!-- 底部是否偏移TabBar的高度(默认H5端的tab页生效) -->
+				
+				<!-- 底部是否偏移TabBar的高度(仅H5端生效) -->
 				<!-- #ifdef H5 -->
 				<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
 				<!-- #endif -->
@@ -52,7 +55,7 @@
 
 		<!-- 回到顶部按钮 (fixed元素,需写在scroll-view外面,防止滚动的时候抖动)-->
 		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
-		
+
 		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
 		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
 		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
@@ -62,86 +65,36 @@
 
 <!-- 微信小程序, QQ小程序, app, h5使用wxs -->
 <!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
-<script src="./wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<script src="../../mescroll-uni/wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
 <!-- #endif -->
 
 <!-- app, h5使用renderjs -->
 <!-- #ifdef APP-PLUS || H5 -->
 <script module="renderBiz" lang="renderjs">
-	import renderBiz from './wxs/renderjs.js';
+	import renderBiz from '../../mescroll-uni/wxs/renderjs.js';
 	export default {
-		mixins:[renderBiz]
+		mixins: [renderBiz]
 	}
 </script>
 <!-- #endif -->
 
 <script>
-	// 引入mescroll-uni.js,处理核心逻辑
-	import MeScroll from './mescroll-uni.js';
-	// 引入全局配置
+	import MeScroll from '../../mescroll-uni/mescroll-uni.js';
+	import MescrollTop from '../../mescroll-uni/components/mescroll-top.vue';
+	import WxsMixin from '../../mescroll-uni/wxs/mixins.js';
+	import mescrollI18n from '../../mescroll-uni/mescroll-i18n.js';
 	import GlobalOption from './mescroll-uni-option.js';
-	// 引入空布局组件
-	import MescrollEmpty from './components/mescroll-empty.vue';
-	// 引入国际化工具类
-	import mescrollI18n from './mescroll-i18n.js';
-	// 引入回到顶部组件
-	import MescrollTop from './components/mescroll-top.vue';
-	// 引入兼容wxs(含renderjs)写法的mixins
-	import WxsMixin from './wxs/mixins.js';
 	
-	/**
-	 * mescroll-uni 嵌在页面某个区域的下拉刷新和上拉加载组件, 如嵌在弹窗,浮层,swiper中...
-	 * @property {Object} down 下拉刷新的参数配置
-	 * @property {Object} up 上拉加载的参数配置
-	 * @property {Object} i18n 国际化的参数配置
-	 * @property {String, Number} top 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
-	 * @property {Boolean, String} topbar 偏移量top是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
-	 * @property {String, Number} bottom 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
-	 * @property {Boolean} safearea 偏移量bottom是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
-	 * @property {Boolean} fixed 是否通过fixed固定mescroll的高度, 默认true
-	 * @property {String, Number} height 指定mescroll的高度, 此项有值,则不使用fixed. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
-	 * @property {Boolean} bottombar 底部是否偏移TabBar的高度 (仅在H5端的tab页生效)
-	 * @property {Boolean} disableScroll 是否禁止滚动, 默认false
-	 * @event {Function} init 初始化完成的回调 
-	 * @event {Function} down 下拉刷新的回调
-	 * @event {Function} up 上拉加载的回调 
-	 * @event {Function} emptyclick 点击empty配置的btnText按钮回调
-	 * @event {Function} topclick 点击回到顶部的按钮回调
-	 * @event {Function} scroll 滚动监听 (需在 up 配置 onScroll:true 才生效)
-	 * @example <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-uni>
-	 */
 	export default {
-		name: 'mescroll-uni',
 		mixins: [WxsMixin],
 		components: {
-			MescrollEmpty,
 			MescrollTop
 		},
-		props: {
-			down: Object,
-			up: Object,
-			i18n: Object,
-			top: [String, Number],
-			topbar: [Boolean, String],
-			bottom: [String, Number],
-			safearea: Boolean,
-			fixed: {
-				type: Boolean,
-				default: true
-			},
-			height: [String, Number],
-			bottombar:{
-				type: Boolean,
-				default: true
-			},
-			disableScroll: Boolean
-		},
 		data() {
 			return {
-				mescroll: {optDown:{},optUp:{}}, // mescroll实例
+				mescroll: null, // mescroll实例
 				viewId: 'id_' + Math.random().toString(36).substr(2,16), // 随机生成mescroll的id(不能数字开头,否则找不到元素)
 				downHight: 0, //下拉刷新: 容器高度
-				downRate: 0, // 下拉比率(inOffset: rate<1; outOffset: rate>=1)
 				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
 				upLoadType: 0, // 上拉加载状态: 0(loading前), 1loading中, 2没有更多了,显示END文本提示, 3(没有更多了,不显示END文本提示)
 				isShowEmpty: false, // 是否显示空布局
@@ -154,6 +107,25 @@
 				statusBarHeight: 0 // 状态栏高度
 			}
 		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			i18n: Object, // 国际化的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			fixed: { // 是否通过fixed固定mescroll的高度, 默认true
+				type: Boolean,
+				default: true
+			},
+			height: [String, Number], // 指定mescroll的高度, 此项有值,则不使用fixed. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			},
+			disableScroll: Boolean // 是否禁止滚动
+		},
 		computed: {
 			// 是否使用fixed定位 (当height有值,则不使用)
 			isFixed(){
@@ -195,10 +167,10 @@
 			},
 			// 过渡
 			transition() {
-				return this.isDownReset ? 'transform 300ms' : '';
+				return this.isDownReset ? 'transform 300ms' : ''
 			},
 			translateY() {
-				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : ''; // transform会使fixed失效,需注意把fixed元素写在mescroll之外
+				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : '' // transform会使fixed失效,需注意把fixed元素写在mescroll之外
 			},
 			// 列表是否可滑动
 			scrollable(){
@@ -211,18 +183,7 @@
 			},
 			// 旋转的角度
 			downRotate(){
-				return 'rotate(' + 360 * this.downRate + 'deg)'
-			},
-			// 文本提示
-			downText(){
-				if(!this.mescroll) return ""; // 避免头条小程序初始化时报错
-				switch (this.downLoadType){
-					case 1: return this.mescroll.optDown.textInOffset;
-					case 2: return this.mescroll.optDown.textOutOffset;
-					case 3: return this.mescroll.optDown.textLoading;
-					case 4: return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
-					default: return this.mescroll.optDown.textInOffset;
-				}
+				return this.downLoadType === 2 ? 'rotate(180deg)' : 'rotate(0deg)'
 			}
 		},
 		methods: {
@@ -307,16 +268,11 @@
 					onMoving(mescroll, rate, downHight) {
 						// 下拉过程中的回调,滑动过程一直在执行;
 						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
-						vm.downRate = rate; //下拉比率 (inOffset: rate<1; outOffset: rate>=1)
 					},
 					showLoading(mescroll, downHight) {
 						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
 						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
 					},
-					beforeEndDownScroll(mescroll){
-						vm.downLoadType = 4; 
-						return mescroll.optDown.beforeEndDelay // 延时结束的时长
-					},
 					endDownScroll() {
 						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
 						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
@@ -377,7 +333,8 @@
 			// 初始化MeScroll对象
 			vm.mescroll = new MeScroll(myOption);
 			vm.mescroll.viewId = vm.viewId; // 附带id
-			vm.mescroll.i18n = i18nOption; // 挂载语言包
+			// 挂载语言包
+			vm.mescroll.i18n = i18nOption;
 			// init回调mescroll对象
 			vm.$emit('init', vm.mescroll);
 			
@@ -442,7 +399,6 @@
 			if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null) {} else {
 				vm.mescroll.optUp.toTop.safearea = vm.safearea;
 			}
-			
 			// 全局配置监听
 			uni.$on("setMescrollGlobalOption", options=>{
 				if(!options) return;
@@ -474,7 +430,8 @@
 </script>
 
 <style>
-	@import "./mescroll-uni.css";
+	@import "../../mescroll-uni/mescroll-uni.css";
+	@import "../../mescroll-uni/components/mescroll-down.css";
+	@import "../../mescroll-uni/components/mescroll-up.css";
 	@import "./components/mescroll-down.css";
-	@import './components/mescroll-up.css';
 </style>

+ 44 - 0
uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-down.css

@@ -0,0 +1,44 @@
+/*下拉刷新--上下箭头*/
+.mescroll-downwarp .downwarp-arrow {
+	display: inline-block;
+	width: 20px;
+	height: 20px;
+	margin: 10px;
+	background-image: url(https://www.mescroll.com/img/xinlang/mescroll-arrow.png);
+	background-size: contain;
+	vertical-align: middle;
+	transition: all 300ms;
+}
+
+/*下拉刷新--旋转进度条*/
+.mescroll-downwarp .downwarp-progress{
+	width: 36px;
+	height: 36px;
+	border: none;
+	margin: auto;
+	background-size: contain;
+	animation: progressRotate 0.6s steps(6, start) infinite;
+}
+@keyframes progressRotate {
+	0% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress1.png);
+	}
+	16% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress2.png);
+	}
+	32% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress3.png);
+	}
+	48% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress4.png);
+	}
+	64% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress5.png);
+	}
+	80% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress6.png);
+	}
+	100% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress1.png);
+	}
+}

+ 53 - 0
uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-down.vue

@@ -0,0 +1,53 @@
+<!-- 下拉刷新区域 -->
+<template>
+	<view v-if="mOption.use" class="mescroll-downwarp" :style="{'background':mOption.bgColor,'color':mOption.textColor}">
+		<view class="downwarp-content">
+			<view v-if="isDownLoading" class="downwarp-progress"></view>
+			<view v-else class="downwarp-arrow" :style="{ transform: downRotate }"></view>
+			<view class="downwarp-tip">{{ downText }}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		option: Object, // down的配置项
+		type: Number // 下拉状态(inOffset:1, outOffset:2, showLoading:3, endDownScroll:4)
+	},
+	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption() {
+			return this.option || {};
+		},
+		// 是否在加载中
+		isDownLoading() {
+			return this.type === 3;
+		},
+		// 旋转的角度
+		downRotate() {
+			return this.type === 2 ? 'rotate(-180deg)' : 'rotate(0deg)';
+		},
+		// 文本提示
+		downText() {
+			switch (this.type) {
+				case 1:
+					return this.mOption.textInOffset;
+				case 2:
+					return this.mOption.textOutOffset;
+				case 3:
+					return this.mOption.textLoading;
+				case 4:
+					return this.mOption.textLoading;
+				default:
+					return this.mOption.textInOffset;
+			}
+		}
+	}
+};
+</script>
+
+<style>
+@import '../../../mescroll-uni/components/mescroll-down.css';
+@import './mescroll-down.css';
+</style>

+ 32 - 0
uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-up.css

@@ -0,0 +1,32 @@
+/*上拉加载--旋转进度条*/
+.mescroll-upwarp .upwarp-progress {
+	width: 36px;
+	height: 36px;
+	border: none;
+	margin: auto;
+	background-size: contain;
+	animation: progressRotate 0.6s steps(6, start) infinite;
+}
+@keyframes progressRotate {
+	0% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress1.png);
+	}
+	16% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress2.png);
+	}
+	32% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress3.png);
+	}
+	48% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress4.png);
+	}
+	64% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress5.png);
+	}
+	80% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress6.png);
+	}
+	100% {
+		background-image: url(https://www.mescroll.com/img/xinlang/mescroll-progress1.png);
+	}
+}

+ 4 - 3
node_modules/mescroll-uni/components/mescroll-up.vue → uni_modules/mescroll-uni/components/mescroll-diy/xinlang/components/mescroll-up.vue

@@ -1,9 +1,9 @@
 <!-- 上拉加载区域 -->
 <template>
-	<view class="mescroll-upwarp" :style="{'background-color':mOption.bgColor,'color':mOption.textColor}">
+	<view class="mescroll-upwarp" :style="{'background':mOption.bgColor,'color':mOption.textColor}">
 		<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
 		<view v-show="isUpLoading">
-			<view class="upwarp-progress mescroll-rotate" :style="{'border-color':mOption.textColor}"></view>
+			<view class="upwarp-progress mescroll-rotate"></view>
 			<view class="upwarp-tip">{{ mOption.textLoading }}</view>
 		</view>
 		<!-- 无数据 -->
@@ -15,7 +15,7 @@
 export default {
 	props: {
 		option: Object, // up的配置项
-		type: Number // 上拉加载的状态:0(loading前),1(loading中),2(没有更多了)
+		type: Number // 上拉加载的状态:0(loading前),1(loading中),2(没有更多了,显示END文本提示),3(没有更多了,不显示END文本提示
 	},
 	computed: {
 		// 支付宝小程序需写成计算属性,prop定义default仍报错
@@ -35,5 +35,6 @@ export default {
 </script>
 
 <style>
+@import '../../../mescroll-uni/components/mescroll-up.css';
 @import './mescroll-up.css';
 </style>

+ 380 - 0
uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-body.vue

@@ -0,0 +1,380 @@
+<template>
+	<view 
+		class="mescroll-body mescroll-render-touch" 
+		:style="{'minHeight':minHeight, 'padding-top': padTop, 'padding-bottom': padBottom}" 
+		:class="{'mescorll-sticky': sticky}"
+		@touchstart="wxsBiz.touchstartEvent" 
+		@touchmove="wxsBiz.touchmoveEvent" 
+		@touchend="wxsBiz.touchendEvent" 
+		@touchcancel="wxsBiz.touchendEvent"
+		:change:prop="wxsBiz.propObserver"
+		:prop="wxsProp"
+		>
+		
+		<!-- 状态栏 -->
+		<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
+		
+		<view class="mescroll-body-content mescroll-wxs-content" :style="{ transform: translateY, transition: transition }" :change:prop="wxsBiz.callObserver" :prop="callProp">
+			<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
+			<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType"></mescroll-down> -->
+			<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
+				<view class="downwarp-content">
+					<view v-if="isDownLoading" class="downwarp-progress"></view>
+					<view v-else class="downwarp-arrow" :style="{ transform: downRotate }"></view>
+					<view class="downwarp-tip">{{ downText }}</view>
+				</view>
+			</view>
+			
+			<!-- 列表内容 -->
+			<slot></slot>
+
+			<!-- 空布局 -->
+			<mescroll-empty v-if="isShowEmpty" :option="mescroll.optUp.empty" @emptyclick="emptyClick"></mescroll-empty>
+
+			<!-- 上拉加载区域 (下拉刷新时不显示,支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->
+			<!-- <mescroll-up v-if="mescroll.optUp.use && downLoadType !== 3" :option="mescroll.optUp" :type="upLoadType"></mescroll-up> -->
+			<view class="mescroll-upwarp" :style="{'background':mescroll.optUp.bgColor,'color':mescroll.optUp.textColor}">
+				<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
+				<view v-show="upLoadType===1">
+					<view class="upwarp-progress mescroll-rotate"></view>
+					<view class="upwarp-tip">{{ mescroll.optUp.textLoading }}</view>
+				</view>
+				<!-- 无数据 -->
+				<view v-if="upLoadType===2" class="upwarp-nodata">{{ mescroll.optUp.textNoMore }}</view>
+			</view>
+		</view>
+		
+		<!-- 底部是否偏移TabBar的高度(仅H5端生效) -->
+		<!-- #ifdef H5 -->
+		<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
+		<!-- #endif -->
+		
+		<!-- 适配iPhoneX -->
+		<view v-if="safearea" class="mescroll-safearea"></view>
+		
+		<!-- 回到顶部按钮 (fixed元素需写在transform外面,防止降级为absolute)-->
+		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
+		
+		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
+		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<!-- 微信小程序, QQ小程序, app, h5使用wxs -->
+<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+<script src="../../mescroll-uni/wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<!-- #endif -->
+
+<!-- app, h5使用renderjs -->
+<!-- #ifdef APP-PLUS || H5 -->
+<script module="renderBiz" lang="renderjs">
+	import renderBiz from '../../mescroll-uni/wxs/renderjs.js';
+	export default {
+		mixins: [renderBiz]
+	}
+</script>
+<!-- #endif -->
+
+<script>
+	import MeScroll from '../../mescroll-uni/mescroll-uni.js';
+	import MescrollTop from '../../mescroll-uni/components/mescroll-top.vue';
+	import WxsMixin from '../../mescroll-uni/wxs/mixins.js';
+	import mescrollI18n from '../../mescroll-uni/mescroll-i18n.js';
+	import GlobalOption from './mescroll-uni-option.js';
+
+	export default {
+		mixins: [WxsMixin],
+		components: {
+			MescrollTop
+		},
+		data() {
+			return {
+				mescroll: null, // mescroll实例
+				downHight: 0, //下拉刷新: 容器高度
+				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
+				upLoadType: 0, // 上拉加载状态:0(loading前),1(loading中),2(没有更多了,显示END文本提示),3(没有更多了,不显示END文本提示)
+				isShowEmpty: false, // 是否显示空布局
+				isShowToTop: false, // 是否显示回到顶部按钮
+				windowHeight: 0, // 可使用窗口的高度
+				windowBottom: 0, // 可使用窗口的底部位置
+				statusBarHeight: 0 // 状态栏高度
+			};
+		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			i18n: Object, // 国际化的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			height: [String, Number], // 指定mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			},
+			sticky: Boolean // 是否支持sticky,默认false; 当值配置true时,需避免在mescroll-body标签前面加非定位的元素,否则下拉区域无法会隐藏
+		},
+		computed: {
+			// mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
+			minHeight(){
+				return this.toPx(this.height || '100%') + 'px'
+			},
+			// 下拉布局往下偏移的距离 (px)
+			numTop() {
+				return this.toPx(this.top)
+			},
+			padTop() {
+				return this.numTop + 'px';
+			},
+			// 上拉布局往上偏移 (px)
+			numBottom() {
+				return this.toPx(this.bottom);
+			},
+			padBottom() {
+				return this.numBottom + 'px';
+			},
+			// 是否为重置下拉的状态
+			isDownReset() {
+				return this.downLoadType === 3 || this.downLoadType === 4;
+			},
+			// 过渡
+			transition() {
+				return this.isDownReset ? 'transform 300ms' : '';
+			},
+			translateY() {
+				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : ''; // transform会使fixed失效,需注意把fixed元素写在mescroll之外
+			},
+			// 是否在加载中
+			isDownLoading() {
+				return this.downLoadType === 3;
+			},
+			// 旋转的角度
+			downRotate() {
+				return this.downLoadType === 2 ? 'rotate(-180deg)' : 'rotate(0deg)';
+			},
+			// 文本提示
+			downText() {
+				if(!this.mescroll) return "";
+				switch (this.downLoadType) {
+					case 1:
+						return this.mescroll.optDown.textInOffset;
+					case 2:
+						return this.mescroll.optDown.textOutOffset;
+					case 3:
+						return this.mescroll.optDown.textLoading;
+					case 4:
+						return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
+					default:
+						return this.mescroll.optDown.textInOffset;
+				}
+			}
+		},
+		methods: {
+			//number,rpx,upx,px,% --> px的数值
+			toPx(num) {
+				if (typeof num === 'string') {
+					if (num.indexOf('px') !== -1) {
+						if (num.indexOf('rpx') !== -1) {
+							// "10rpx"
+							num = num.replace('rpx', '');
+						} else if (num.indexOf('upx') !== -1) {
+							// "10upx"
+							num = num.replace('upx', '');
+						} else {
+							// "10px"
+							return Number(num.replace('px', ''));
+						}
+					} else if (num.indexOf('%') !== -1) {
+						// 传百分比,则相对于windowHeight,传"10%"则等于windowHeight的10%
+						let rate = Number(num.replace('%', '')) / 100;
+						return this.windowHeight * rate;
+					}
+				}
+				return num ? uni.upx2px(Number(num)) : 0;
+			},
+			// 点击空布局的按钮回调
+			emptyClick() {
+				this.$emit('emptyclick', this.mescroll);
+			},
+			// 点击回到顶部的按钮回调
+			toTopClick() {
+				this.mescroll.scrollTo(0, this.mescroll.optUp.toTop.duration); // 执行回到顶部
+				this.$emit('topclick', this.mescroll); // 派发点击回到顶部按钮的回调
+			}
+		},
+		// 使用created初始化mescroll对象; 如果用mounted部分css样式编译到H5会失效
+		created() {
+			let vm = this;
+
+			let diyOption = {
+				// 下拉刷新的配置
+				down: {
+					inOffset() {
+						vm.downLoadType = 1; // 下拉的距离进入offset范围内那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					outOffset() {
+						vm.downLoadType = 2; // 下拉的距离大于offset那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					onMoving(mescroll, rate, downHight) {
+						// 下拉过程中的回调,滑动过程一直在执行;
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					showLoading(mescroll, downHight) {
+						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					beforeEndDownScroll(mescroll){
+						vm.downLoadType = 4; 
+						return mescroll.optDown.beforeEndDelay // 延时结束的时长
+					},
+					endDownScroll() {
+						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
+						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						if(vm.downResetTimer) {clearTimeout(vm.downResetTimer); vm.downResetTimer = null} // 移除重置倒计时
+						vm.downResetTimer = setTimeout(()=>{ // 过渡动画执行完毕后,需重置为0的状态,避免下次inOffset不及时显示textInOffset
+							if(vm.downLoadType === 4) vm.downLoadType = 0
+						},300)
+					},
+					// 派发下拉刷新的回调
+					callback: function(mescroll) {
+						vm.$emit('down', mescroll);
+					}
+				},
+				// 上拉加载的配置
+				up: {
+					// 显示加载中的回调
+					showLoading() {
+						vm.upLoadType = 1;
+					},
+					// 显示无更多数据的回调
+					showNoMore() {
+						vm.upLoadType = 2;
+					},
+					// 隐藏上拉加载的回调
+					hideUpScroll(mescroll) {
+						vm.upLoadType = mescroll.optUp.hasNext ? 0 : 3;
+					},
+					// 空布局
+					empty: {
+						onShow(isShow) {
+							// 显示隐藏的回调
+							vm.isShowEmpty = isShow;
+						}
+					},
+					// 回到顶部
+					toTop: {
+						onShow(isShow) {
+							// 显示隐藏的回调
+							vm.isShowToTop = isShow;
+						}
+					},
+					// 派发上拉加载的回调
+					callback: function(mescroll) {
+						vm.$emit('up', mescroll);
+					}
+				}
+			};
+
+			let i18nType = mescrollI18n.getType() // 当前语言类型
+			let i18nOption = {type: i18nType} // 国际化配置
+			MeScroll.extend(i18nOption, vm.i18n) // 具体页面的国际化配置
+			MeScroll.extend(i18nOption, GlobalOption.i18n) // 全局的国际化配置
+			MeScroll.extend(diyOption, i18nOption[i18nType]); // 混入国际化配置
+			MeScroll.extend(diyOption, {down:GlobalOption.down, up:GlobalOption.up}); // 混入全局的配置
+			let myOption = JSON.parse(JSON.stringify({down: vm.down,up: vm.up})); // 深拷贝,避免对props的影响
+			MeScroll.extend(myOption, diyOption); // 混入具体界面的配置
+
+			// 初始化MeScroll对象
+			vm.mescroll = new MeScroll(myOption, true); // 传入true,标记body为滚动区域
+			// 挂载语言包
+			vm.mescroll.i18n = i18nOption;
+			// init回调mescroll对象
+			vm.$emit('init', vm.mescroll);
+
+			// 设置高度
+			const sys = uni.getSystemInfoSync();
+			if (sys.windowHeight) vm.windowHeight = sys.windowHeight;
+			if (sys.windowBottom) vm.windowBottom = sys.windowBottom;
+			if (sys.statusBarHeight) vm.statusBarHeight = sys.statusBarHeight;
+			// 使down的bottomOffset生效
+			vm.mescroll.setBodyHeight(sys.windowHeight);
+			
+			// 因为使用的是page的scroll,这里需自定义scrollTo
+			vm.mescroll.resetScrollTo((y, t) => {
+				if(typeof y === 'string'){
+					// 滚动到指定view (y为css选择器)
+					setTimeout(()=>{ // 延时确保view已渲染; 不使用$nextTick
+						let selector;
+						if(y.indexOf('#')==-1 && y.indexOf('.')==-1){
+							selector = '#'+y // 不带#和. 则默认为id选择器
+						}else{
+							selector = y
+							// #ifdef APP-PLUS || H5 || MP-ALIPAY || MP-DINGTALK
+							if(y.indexOf('>>>')!=-1){ // 不支持跨自定义组件的后代选择器 (转为普通的选择器即可跨组件查询)
+								selector = y.split('>>>')[1].trim()
+							}
+							// #endif
+						}
+						uni.createSelectorQuery().select(selector).boundingClientRect(function(rect){
+							if (rect) {
+								let top = rect.top
+								top += vm.mescroll.getScrollTop()
+								uni.pageScrollTo({
+									scrollTop: top,
+									duration: t
+								})
+							} else{
+								console.error(selector + ' does not exist');
+							}
+						}).exec()
+					},30)
+				} else{
+					// 滚动到指定位置 (y必须为数字)
+					uni.pageScrollTo({
+						scrollTop: y,
+						duration: t
+					})
+				}
+			});
+			
+			// 具体的界面如果不配置up.toTop.safearea,则取本vue的safearea值
+			if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null) {} else {
+				vm.mescroll.optUp.toTop.safearea = vm.safearea;
+			}
+			
+			// 全局配置监听
+			uni.$on("setMescrollGlobalOption", options=>{
+				if(!options) return;
+				let i18nType = options.i18n ? options.i18n.type : null
+				if(i18nType && vm.mescroll.i18n.type != i18nType){
+					vm.mescroll.i18n.type = i18nType
+					mescrollI18n.setType(i18nType)
+					MeScroll.extend(options, vm.mescroll.i18n[i18nType])
+				}
+				if(options.down){
+					let down = MeScroll.extend({}, options.down)
+					vm.mescroll.optDown = MeScroll.extend(down, vm.mescroll.optDown)
+				}
+				if(options.up){
+					let up = MeScroll.extend({}, options.up)
+					vm.mescroll.optUp = MeScroll.extend(up, vm.mescroll.optUp)
+				}
+			})
+		},
+		destroyed() {
+			// 注销全局配置监听
+			uni.$off("setMescrollGlobalOption")
+		}
+	};
+</script>
+
+<style>
+	@import "../../mescroll-uni/mescroll-uni.css";
+	@import "../../mescroll-uni/components/mescroll-down.css";
+	@import "../../mescroll-uni/components/mescroll-up.css";
+	@import "./components/mescroll-down.css";
+	@import "./components/mescroll-up.css";
+</style>

+ 0 - 0
node_modules/mescroll-uni/mescroll-uni-option.js → uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-uni-option.js


+ 462 - 0
uni_modules/mescroll-uni/components/mescroll-diy/xinlang/mescroll-uni.vue

@@ -0,0 +1,462 @@
+<template>
+	<view class="mescroll-uni-warp">
+		<scroll-view :id="viewId" class="mescroll-uni" :class="{'mescroll-uni-fixed':isFixed}" :style="{'height':scrollHeight,'padding-top':padTop,'padding-bottom':padBottom,'top':fixedTop,'bottom':fixedBottom}" :scroll-top="scrollTop" :scroll-with-animation="scrollAnim" @scroll="scroll"  :scroll-y='scrollable' :enable-back-to-top="true" :throttle="false">
+			<view class="mescroll-uni-content mescroll-render-touch"
+			@touchstart="wxsBiz.touchstartEvent" 
+			@touchmove="wxsBiz.touchmoveEvent" 
+			@touchend="wxsBiz.touchendEvent" 
+			@touchcancel="wxsBiz.touchendEvent"
+			:change:prop="wxsBiz.propObserver"
+			:prop="wxsProp">
+			
+				<!-- 状态栏 -->
+				<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
+				
+				<view class="mescroll-wxs-content" :style="{'transform': translateY, 'transition': transition}" :change:prop="wxsBiz.callObserver" :prop="callProp">
+					<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
+					<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType"></mescroll-down> -->
+					<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
+						<view class="downwarp-content">
+							<view v-if="isDownLoading" class="downwarp-progress"></view>
+							<view v-else class="downwarp-arrow" :style="{ transform: downRotate }"></view>
+							<view class="downwarp-tip">{{ downText }}</view>
+						</view>
+					</view>
+
+					<!-- 列表内容 -->
+					<slot></slot>
+
+					<!-- 空布局 -->
+					<mescroll-empty v-if="isShowEmpty" :option="mescroll.optUp.empty" @emptyclick="emptyClick"></mescroll-empty>
+
+					<!-- 上拉加载区域 (下拉刷新时不显示,支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->
+					<!-- <mescroll-up v-if="mescroll.optUp.use && downLoadType !== 3" :option="mescroll.optUp" :type="upLoadType"></mescroll-up> -->
+					<view class="mescroll-upwarp" :style="{'background':mescroll.optUp.bgColor,'color':mescroll.optUp.textColor}">
+						<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
+						<view v-show="upLoadType===1">
+							<view class="upwarp-progress mescroll-rotate"></view>
+							<view class="upwarp-tip">{{ mescroll.optUp.textLoading }}</view>
+						</view>
+						<!-- 无数据 -->
+						<view v-if="upLoadType===2" class="upwarp-nodata">{{ mescroll.optUp.textNoMore }}</view>
+					</view>
+				</view>
+				
+				<!-- 底部是否偏移TabBar的高度(仅H5端生效) -->
+				<!-- #ifdef H5 -->
+				<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
+				<!-- #endif -->
+				
+				<!-- 适配iPhoneX -->
+				<view v-if="safearea" class="mescroll-safearea"></view>
+			
+			</view>
+		</scroll-view>
+
+		<!-- 回到顶部按钮 (fixed元素,需写在scroll-view外面,防止滚动的时候抖动)-->
+		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
+		
+		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
+		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<!-- 微信小程序, QQ小程序, app, h5使用wxs -->
+<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+<script src="../../mescroll-uni/wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<!-- #endif -->
+
+<!-- app, h5使用renderjs -->
+<!-- #ifdef APP-PLUS || H5 -->
+<script module="renderBiz" lang="renderjs">
+	import renderBiz from '../../mescroll-uni/wxs/renderjs.js';
+	export default {
+		mixins: [renderBiz]
+	}
+</script>
+<!-- #endif -->
+
+<script>
+	import MeScroll from '../../mescroll-uni/mescroll-uni.js';
+	import MescrollTop from '../../mescroll-uni/components/mescroll-top.vue';
+	import WxsMixin from '../../mescroll-uni/wxs/mixins.js';
+	import mescrollI18n from '../../mescroll-uni/mescroll-i18n.js';
+	import GlobalOption from './mescroll-uni-option.js';
+	
+	export default {
+		mixins: [WxsMixin],
+		components: {
+			MescrollTop
+		},
+		data() {
+			return {
+				mescroll: null, // mescroll实例
+				viewId: 'id_' + Math.random().toString(36).substr(2,16), // 随机生成mescroll的id(不能数字开头,否则找不到元素)
+				downHight: 0, //下拉刷新: 容器高度
+				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
+				upLoadType: 0, // 上拉加载状态: 0(loading前), 1loading中, 2没有更多了,显示END文本提示, 3(没有更多了,不显示END文本提示)
+				isShowEmpty: false, // 是否显示空布局
+				isShowToTop: false, // 是否显示回到顶部按钮
+				scrollTop: 0, // 滚动条的位置
+				scrollAnim: false, // 是否开启滚动动画
+				windowTop: 0, // 可使用窗口的顶部位置
+				windowBottom: 0, // 可使用窗口的底部位置
+				windowHeight: 0, // 可使用窗口的高度
+				statusBarHeight: 0 // 状态栏高度
+			}
+		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			i18n: Object, // 国际化的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			fixed: { // 是否通过fixed固定mescroll的高度, 默认true
+				type: Boolean,
+				default: true
+			},
+			height: [String, Number], // 指定mescroll的高度, 此项有值,则不使用fixed. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			},
+			disableScroll: Boolean // 是否禁止滚动
+		},
+		computed: {
+			// 是否使用fixed定位 (当height有值,则不使用)
+			isFixed(){
+				return !this.height && this.fixed
+			},
+			// mescroll的高度
+			scrollHeight(){
+				if (this.isFixed) {
+					return "auto"
+				} else if(this.height){
+					return this.toPx(this.height) + 'px'
+				}else{
+					return "100%"
+				}
+			},
+			// 下拉布局往下偏移的距离 (px)
+			numTop() {
+				return this.toPx(this.top)
+			},
+			fixedTop() {
+				return this.isFixed ? (this.numTop + this.windowTop) + 'px' : 0
+			},
+			padTop() {
+				return !this.isFixed ? this.numTop + 'px' : 0
+			},
+			// 上拉布局往上偏移 (px)
+			numBottom() {
+				return this.toPx(this.bottom)
+			},
+			fixedBottom() {
+				return this.isFixed ? (this.numBottom + this.windowBottom) + 'px' : 0
+			},
+			padBottom() {
+				return !this.isFixed ? this.numBottom + 'px' : 0
+			},
+			// 是否为重置下拉的状态
+			isDownReset(){
+				return this.downLoadType===3 || this.downLoadType===4
+			},
+			// 过渡
+			transition() {
+				return this.isDownReset ? 'transform 300ms' : ''
+			},
+			translateY() {
+				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : '' // transform会使fixed失效,需注意把fixed元素写在mescroll之外
+			},
+			// 列表是否可滑动
+			scrollable(){
+				if(this.disableScroll) return false
+				return this.downLoadType===0 || this.isDownReset
+			},
+			// 是否在加载中
+			isDownLoading() {
+				return this.downLoadType === 3;
+			},
+			// 旋转的角度
+			downRotate() {
+				return this.downLoadType === 2 ? 'rotate(-180deg)' : 'rotate(0deg)';
+			},
+			// 文本提示
+			downText() {
+				if(!this.mescroll) return "";
+				switch (this.downLoadType) {
+					case 1:
+						return this.mescroll.optDown.textInOffset;
+					case 2:
+						return this.mescroll.optDown.textOutOffset;
+					case 3:
+						return this.mescroll.optDown.textLoading;
+					case 4:
+						return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
+					default:
+						return this.mescroll.optDown.textInOffset;
+				}
+			}
+		},
+		methods: {
+			//number,rpx,upx,px,% --> px的数值
+			toPx(num){
+				if(typeof num === "string"){
+					if (num.indexOf('px') !== -1) {
+						if(num.indexOf('rpx') !== -1) { // "10rpx"
+							num = num.replace('rpx', '');
+						} else if(num.indexOf('upx') !== -1) { // "10upx"
+							num = num.replace('upx', '');
+						} else { // "10px"
+							return Number(num.replace('px', ''))
+						}
+					}else if (num.indexOf('%') !== -1){
+						// 传百分比,则相对于windowHeight,传"10%"则等于windowHeight的10%
+						let rate = Number(num.replace("%","")) / 100
+						return this.windowHeight * rate
+					}
+				}
+				return num ? uni.upx2px(Number(num)) : 0
+			},
+			//注册列表滚动事件,用于下拉刷新和上拉加载
+			scroll(e) {
+				this.mescroll.scroll(e.detail, () => {
+					this.$emit('scroll', this.mescroll) // 此时可直接通过 this.mescroll.scrollTop获取滚动条位置; this.mescroll.isScrollUp获取是否向上滑动
+				})
+			},
+			// 点击空布局的按钮回调
+			emptyClick() {
+				this.$emit('emptyclick', this.mescroll)
+			},
+			// 点击回到顶部的按钮回调
+			toTopClick() {
+				this.mescroll.scrollTo(0, this.mescroll.optUp.toTop.duration); // 执行回到顶部
+				this.$emit('topclick', this.mescroll); // 派发点击回到顶部按钮的回调
+			},
+			// 更新滚动区域的高度 (使内容不满屏和到底,都可继续翻页)
+			setClientHeight() {
+				if (this.mescroll.getClientHeight(true) === 0 && !this.isExec) {
+					this.isExec = true; // 避免多次获取
+					this.$nextTick(() => { // 确保dom已渲染
+						this.getClientInfo(data=>{
+							this.isExec = false;
+							if (data) {
+								this.mescroll.setClientHeight(data.height);
+							} else if (this.clientNum != 3) { // 极少部分情况,可能dom还未渲染完毕,递归获取,最多重试3次
+								this.clientNum = this.clientNum == null ? 1 : this.clientNum + 1;
+								setTimeout(() => {
+									this.setClientHeight()
+								}, this.clientNum * 100)
+							}
+						})
+					})
+				}
+			},
+			// 获取滚动区域的信息
+			getClientInfo(success){
+				let query = uni.createSelectorQuery();
+				// #ifndef MP-ALIPAY || MP-DINGTALK
+				query = query.in(this) // 支付宝小程序不支持in(this),而字节跳动小程序必须写in(this), 否则都取不到值
+				// #endif
+				let view = query.select('#' + this.viewId);
+				view.boundingClientRect(data => {
+					success(data)
+				}).exec();
+			}
+		},
+		// 使用created初始化mescroll对象; 如果用mounted部分css样式编译到H5会失效
+		created() {
+			let vm = this;
+
+			let diyOption = {
+				// 下拉刷新的配置
+				down: {
+					inOffset() {
+						vm.downLoadType = 1; // 下拉的距离进入offset范围内那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					outOffset() {
+						vm.downLoadType = 2; // 下拉的距离大于offset那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					onMoving(mescroll, rate, downHight) {
+						// 下拉过程中的回调,滑动过程一直在执行;
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					showLoading(mescroll, downHight) {
+						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					beforeEndDownScroll(mescroll){
+						vm.downLoadType = 4; 
+						return mescroll.optDown.beforeEndDelay // 延时结束的时长
+					},
+					endDownScroll() {
+						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
+						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						vm.downResetTimer && clearTimeout(vm.downResetTimer)
+						vm.downResetTimer = setTimeout(()=>{ // 过渡动画执行完毕后,需重置为0的状态,以便置空this.transition,避免iOS小程序列表渲染不完整
+							if(vm.downLoadType===4) vm.downLoadType = 0
+						},300)
+					},
+					// 派发下拉刷新的回调
+					callback: function(mescroll) {
+						vm.$emit('down', mescroll)
+					}
+				},
+				// 上拉加载的配置
+				up: {
+					// 显示加载中的回调
+					showLoading() {
+						vm.upLoadType = 1;
+					},
+					// 显示无更多数据的回调
+					showNoMore() {
+						vm.upLoadType = 2;
+					},
+					// 隐藏上拉加载的回调
+					hideUpScroll(mescroll) {
+						vm.upLoadType = mescroll.optUp.hasNext ? 0 : 3;
+					},
+					// 空布局
+					empty: {
+						onShow(isShow) { // 显示隐藏的回调
+							vm.isShowEmpty = isShow;
+						}
+					},
+					// 回到顶部
+					toTop: {
+						onShow(isShow) { // 显示隐藏的回调
+							vm.isShowToTop = isShow;
+						}
+					},
+					// 派发上拉加载的回调
+					callback: function(mescroll) {
+						vm.$emit('up', mescroll);
+						// 更新容器的高度 (多mescroll的情况)
+						vm.setClientHeight()
+					}
+				}
+			}
+
+			let i18nType = mescrollI18n.getType() // 当前语言类型
+			let i18nOption = {type: i18nType} // 国际化配置
+			MeScroll.extend(i18nOption, vm.i18n) // 具体页面的国际化配置
+			MeScroll.extend(i18nOption, GlobalOption.i18n) // 全局的国际化配置
+			MeScroll.extend(diyOption, i18nOption[i18nType]); // 混入国际化配置
+			MeScroll.extend(diyOption, {down:GlobalOption.down, up:GlobalOption.up}); // 混入全局的配置
+			let myOption = JSON.parse(JSON.stringify({
+				'down': vm.down,
+				'up': vm.up
+			})) // 深拷贝,避免对props的影响
+			MeScroll.extend(myOption, diyOption); // 混入具体界面的配置
+
+			// 初始化MeScroll对象
+			vm.mescroll = new MeScroll(myOption);
+			vm.mescroll.viewId = vm.viewId; // 附带id
+			// 挂载语言包
+			vm.mescroll.i18n = i18nOption;
+			// init回调mescroll对象
+			vm.$emit('init', vm.mescroll);
+			
+			// 设置高度
+			const sys = uni.getSystemInfoSync();
+			if(sys.windowTop) vm.windowTop = sys.windowTop;
+			if(sys.windowBottom) vm.windowBottom = sys.windowBottom;
+			if(sys.windowHeight) vm.windowHeight = sys.windowHeight;
+			if(sys.statusBarHeight) vm.statusBarHeight = sys.statusBarHeight;
+			// 使down的bottomOffset生效
+			vm.mescroll.setBodyHeight(sys.windowHeight);
+
+			// 因为使用的是scrollview,这里需自定义scrollTo
+			vm.mescroll.resetScrollTo((y, t) => {
+				vm.scrollAnim = (t !== 0); // t为0,则不使用动画过渡
+				if(typeof y === 'string'){
+					// 小程序不支持slot里面的scroll-into-view, 统一使用计算的方式实现
+					vm.getClientInfo(function(rect){
+						let mescrollTop = rect.top // mescroll到顶部的距离
+						let selector;
+						if(y.indexOf('#')==-1 && y.indexOf('.')==-1){
+							selector = '#'+y // 不带#和. 则默认为id选择器
+						}else{
+							selector = y
+							// #ifdef APP-PLUS || H5 || MP-ALIPAY || MP-DINGTALK
+							if(y.indexOf('>>>')!=-1){ // 不支持跨自定义组件的后代选择器 (转为普通的选择器即可跨组件查询)
+								selector = y.split('>>>')[1].trim()
+							}
+							// #endif
+						}
+						uni.createSelectorQuery().select(selector).boundingClientRect(function(rect){
+							if (rect) {
+								let curY = vm.mescroll.getScrollTop()
+								let top = rect.top - mescrollTop
+								top += curY
+								if(!vm.isFixed) top -= vm.numTop
+								vm.scrollTop = curY;
+								vm.$nextTick(function() {
+									vm.scrollTop = top
+								})
+							} else{
+								console.error(selector + ' does not exist');
+							}
+						}).exec()
+					})
+					return;
+				}
+				let curY = vm.mescroll.getScrollTop()
+				if (t === 0 || t === 300) { // 当t使用默认配置的300时,则使用系统自带的动画过渡
+					vm.scrollTop = curY;
+					vm.$nextTick(function() {
+						vm.scrollTop = y
+					})
+				} else {
+					vm.mescroll.getStep(curY, y, step => { // 此写法可支持配置t
+						vm.scrollTop = step
+					}, t)
+				}
+			})
+			
+			// 具体的界面如果不配置up.toTop.safearea,则取本vue的safearea值
+			if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null) {} else {
+				vm.mescroll.optUp.toTop.safearea = vm.safearea;
+			}
+			
+			// 全局配置监听
+			uni.$on("setMescrollGlobalOption", options=>{
+				if(!options) return;
+				let i18nType = options.i18n ? options.i18n.type : null
+				if(i18nType && vm.mescroll.i18n.type != i18nType){
+					vm.mescroll.i18n.type = i18nType
+					mescrollI18n.setType(i18nType)
+					MeScroll.extend(options, vm.mescroll.i18n[i18nType])
+				}
+				if(options.down){
+					let down = MeScroll.extend({}, options.down)
+					vm.mescroll.optDown = MeScroll.extend(down, vm.mescroll.optDown)
+				}
+				if(options.up){
+					let up = MeScroll.extend({}, options.up)
+					vm.mescroll.optUp = MeScroll.extend(up, vm.mescroll.optUp)
+				}
+			})
+		},
+		mounted() {
+			// 设置容器的高度
+			this.setClientHeight()
+		},
+		destroyed() {
+			// 注销全局配置监听
+			uni.$off("setMescrollGlobalOption")
+		}
+	}
+</script>
+
+<style>
+	@import "../../mescroll-uni/mescroll-uni.css";
+	@import "../../mescroll-uni/components/mescroll-down.css";
+	@import "../../mescroll-uni/components/mescroll-up.css";
+	@import "./components/mescroll-down.css";
+	@import "./components/mescroll-up.css";
+</style>

+ 3 - 3
uni_modules/mescroll-uni/components/mescroll-empty/mescroll-empty.vue

@@ -89,13 +89,13 @@ export default {
 }
 
 .mescroll-empty .empty-icon {
-	width: 280rpx;
-	height: 280rpx;
+	width: 372rpx;
+	height: 240rpx;
 }
 
 .mescroll-empty .empty-tip {
 	margin-top: 20rpx;
-	font-size: 24rpx;
+	font-size: 32rpx;
 	color: gray;
 }
 

+ 13 - 29
uni_modules/mescroll-uni/components/mescroll-uni/components/mescroll-top.vue

@@ -1,11 +1,11 @@
 <!-- 回到顶部的按钮 -->
 <template>
 	<image
-		v-if="option.src"
+		v-if="mOption.src"
 		class="mescroll-totop"
-		:class="[isShow ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': option.safearea}]"
-		:style="{'z-index':option.zIndex, 'left': left, 'right': right, 'bottom':addUnit(option.bottom), 'width':addUnit(option.width), 'border-radius':addUnit(option.radius)}"
-		:src="option.src"
+		:class="[value ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': mOption.safearea}]"
+		:style="{'z-index':mOption.zIndex, 'left': left, 'right': right, 'bottom':addUnit(mOption.bottom), 'width':addUnit(mOption.width), 'border-radius':addUnit(mOption.radius)}"
+		:src="mOption.src"
 		mode="widthFix"
 		@click="toTopClick"
 	/>
@@ -15,33 +15,22 @@
 export default {
 	props: {
 		// up.toTop的配置项
-		option: {
-			type: Object,
-			default(){
-				return {}
-			}
-		},
+		option: Object,
 		// 是否显示
-		value: false, // vue2
-		modelValue: false // vue3
+		value: false
 	},
 	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption(){
+			return this.option || {}
+		},
 		// 优先显示左边
 		left(){
-			return this.option.left ? this.addUnit(this.option.left) : 'auto';
+			return this.mOption.left ? this.addUnit(this.mOption.left) : 'auto';
 		},
 		// 右边距离 (优先显示左边)
 		right() {
-			return this.option.left ? 'auto' : this.addUnit(this.option.right);
-		},
-		// 是否显示
-		isShow(){
-			// #ifdef VUE3
-			return this.modelValue
-			// #endif
-			// #ifdef VUE2
-			return this.value
-			// #endif
+			return this.mOption.left ? 'auto' : this.addUnit(this.mOption.right);
 		}
 	},
 	methods: {
@@ -51,12 +40,7 @@ export default {
 			return num
 		},
 		toTopClick() {
-			// #ifdef VUE3
-			this.$emit("update:modelValue", false); // 使v-model生效 vue3
-			// #endif
-			// #ifdef VUE2
-			this.$emit('input', false); // 使v-model生效 vue2
-			// #endif
+			this.$emit('input', false); // 使v-model生效
 			this.$emit('click'); // 派发点击事件
 		}
 	}

+ 11 - 0
uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js

@@ -21,6 +21,14 @@ const MescrollMixin = {
 		// mescroll组件初始化的回调,可获取到mescroll对象
 		mescrollInit(mescroll) {
 			this.mescroll = mescroll;
+			this.mescrollInitByRef(); // 兼容字节跳动小程序
+		},
+		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
+		mescrollInitByRef() {
+			if(!this.mescroll || !this.mescroll.resetUpScroll){
+				let mescrollRef = this.$refs.mescrollRef;
+				if(mescrollRef) this.mescroll = mescrollRef.mescroll
+			}
 		},
 		// 下拉刷新的回调 (mixin默认resetUpScroll)
 		downCallback() {
@@ -39,6 +47,9 @@ const MescrollMixin = {
 				this.mescroll.endErr();
 			}, 500)
 		}
+	},
+	mounted() {
+		this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况
 	}
 	
 }

+ 6 - 9
uni_modules/mescroll-uni/components/mescroll-uni/mescroll-uni.vue

@@ -106,7 +106,7 @@
 	 * @event {Function} emptyclick 点击empty配置的btnText按钮回调
 	 * @event {Function} topclick 点击回到顶部的按钮回调
 	 * @event {Function} scroll 滚动监听 (需在 up 配置 onScroll:true 才生效)
-	 * @example <mescroll-uni @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-uni>
+	 * @example <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"> ... </mescroll-uni>
 	 */
 	export default {
 		name: 'mescroll-uni',
@@ -151,12 +151,6 @@
 				statusBarHeight: 0 // 状态栏高度
 			}
 		},
-		watch: {
-			height() {
-				// 设置容器的高度
-				this.setClientHeight()
-			}
-		},
 		computed: {
 			// 是否使用fixed定位 (当height有值,则不使用)
 			isFixed(){
@@ -265,7 +259,7 @@
 			},
 			// 更新滚动区域的高度 (使内容不满屏和到底,都可继续翻页)
 			setClientHeight() {
-				if (!this.isExec) {
+				if (this.mescroll.getClientHeight(true) === 0 && !this.isExec) {
 					this.isExec = true; // 避免多次获取
 					this.$nextTick(() => { // 确保dom已渲染
 						this.getClientInfo(data=>{
@@ -284,7 +278,10 @@
 			},
 			// 获取滚动区域的信息
 			getClientInfo(success){
-				let query = uni.createSelectorQuery().in(this);
+				let query = uni.createSelectorQuery();
+				// #ifndef MP-ALIPAY || MP-DINGTALK
+				query = query.in(this) // 支付宝小程序不支持in(this),而字节跳动小程序必须写in(this), 否则都取不到值
+				// #endif
 				let view = query.select('#' + this.viewId);
 				view.boundingClientRect(data => {
 					success(data)

+ 9 - 0
uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more-item.js

@@ -32,9 +32,18 @@ const MescrollMoreItemMixin = {
 		}
 	},
 	methods: {
+		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
+		mescrollInitByRef() {
+			if(!this.mescroll || !this.mescroll.resetUpScroll){
+				// 字节跳动小程序编辑器不支持一个页面存在相同的ref, 多mescroll的ref需动态生成, 格式为'mescrollRef下标'
+				let mescrollRef = this.$refs.mescrollRef || this.$refs['mescrollRef'+this.i];
+				if(mescrollRef) this.mescroll = mescrollRef.mescroll
+			}
+		},
 		// mescroll组件初始化的回调,可获取到mescroll对象 (覆盖mescroll-mixins.js的mescrollInit, 为了标记isInit)
 		mescrollInit(mescroll) {
 			this.mescroll = mescroll;
+			this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序
 			// 自动加载当前tab的数据
 			if(this.i === this.index){
 				this.mescrollTrigger()

+ 2 - 5
uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more.js

@@ -62,12 +62,9 @@ const MescrollMoreMixin = {
 		tabChange(i){
 			let mescroll = this.getMescroll(i);
 			if(mescroll){
-				// 恢复上次滚动条的位置
-				let y = mescroll.getScrollTop()
-				mescroll.scrollTo(y, 0)
-				// 再次恢复上次滚动条的位置, 确保元素已渲染
+				// 延时(比$nextTick靠谱一些),确保元素已渲染
 				setTimeout(()=>{
-					mescroll.scrollTo(y, 0)
+					mescroll.scrollTo(mescroll.getScrollTop(),0)
 				},30)
 			}
 		}

+ 1 - 1
uni_modules/mescroll-uni/components/mescroll-uni/wxs/renderjs.js

@@ -47,7 +47,7 @@ if(window && !window.$mescrollRenderInit){
 
 /* 获取滚动条的位置 */
 me.getScrollTop = function() {
-	return me.scrollTop || document.documentElement.scrollTop || document.body.scrollTop || 0
+	return me.scrollTop || 0
 }
 
 /* 是否禁用下拉刷新 */

+ 0 - 1
uni_modules/mescroll-uni/components/mescroll-uni/wxs/wxs.wxs

@@ -63,7 +63,6 @@ me.clearTransform = function (ins){
  * 监听逻辑层数据的变化 (实时更新数据)
  */
 function propObserver(wxsProp) {
-	if(!wxsProp) return
 	me.optDown = wxsProp.optDown
 	me.scrollTop = wxsProp.scrollTop
 	me.bodyHeight = wxsProp.bodyHeight

+ 0 - 66
uni_modules/mescroll-uni/hooks/useMescroll.js

@@ -1,66 +0,0 @@
-// 小程序无法在hook中使用页面级别生命周期,需单独传入: https://ask.dcloud.net.cn/question/161173
-// import { onPageScroll, onReachBottom, onPullDownRefresh} from '@dcloudio/uni-app';
-
-/** 
- * 初始化mescroll, 相当于vue2的mescroll-mixins.js文件 (mescroll-body 和 mescroll-uni 通用) 
- * mescroll-body需传入onPageScroll, onReachBottom
- * mescroll-uni无需传onPageScroll, onReachBottom
- * 当down.native为true时,需传入onPullDownRefresh
- */ 
-function useMescroll(onPageScroll, onReachBottom, onPullDownRefresh){
-	// mescroll实例对象
-	let mescroll = null;
-	
-	// mescroll组件初始化的回调,可获取到mescroll对象
-	const mescrollInit = (e)=> {
-		mescroll = e;
-	}
-	
-	// 获取mescroll对象, mescrollInit执行之后会有值, 生命周期created中会有值
-	const getMescroll = ()=>{
-		return mescroll
-	}
-	
-	// 下拉刷新的回调 (mixin默认resetUpScroll)
-	const downCallback = ()=> {
-		if(mescroll.optUp.use){
-			mescroll.resetUpScroll()
-		}else{
-			setTimeout(()=>{
-				mescroll.endSuccess();
-			}, 500)
-		}
-	}
-	
-	// 上拉加载的回调
-	const upCallback = ()=> {
-		// mixin默认延时500自动结束加载
-		setTimeout(()=>{
-			mescroll.endErr();
-		}, 500)
-	}
-	
-	// 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
-	onPullDownRefresh && onPullDownRefresh(() => {
-	  mescroll && mescroll.onPullDownRefresh();
-	})
-	
-	// 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
-	onPageScroll && onPageScroll(e=>{
-		mescroll && mescroll.onPageScroll(e);
-	})
-	
-	// 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
-	onReachBottom && onReachBottom(()=>{
-		mescroll && mescroll.onReachBottom();
-	}) 
-	
-	return {
-		getMescroll,
-		mescrollInit,
-		downCallback,
-		upCallback
-	}
-}
-
-export default useMescroll

+ 0 - 56
uni_modules/mescroll-uni/hooks/useMescrollComp.js

@@ -1,56 +0,0 @@
-import { ref } from 'vue';
-
-// 小程序无法在hook中使用页面级别生命周期,需单独传入: https://ask.dcloud.net.cn/question/161173
-// import { onPageScroll, onReachBottom, onPullDownRefresh} from '@dcloudio/uni-app';
-
-/** 
- * mescroll-body写在子组件时,需通过useMescrollComp补充子组件缺少的生命周期, 相当于vue2的mescroll-comp.js文件
- * 必须传入onPageScroll, onReachBottom
- * 当down.native为true时,需传入onPullDownRefresh
- */ 
-function useMescrollComp(onPageScroll, onReachBottom, onPullDownRefresh){
-	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件
-	onPageScroll(e=>{
-		handlePageScroll(e)
-	})
-	
-	onReachBottom(()=>{
-		handleReachBottom()
-	})
-	
-	// 当down的native: true时, 还需传递此方法进到子组件
-	onPullDownRefresh && onPullDownRefresh(()=>{
-		handlePullDownRefresh()
-	})
-	
-	const mescrollItem = ref(null)
-	
-	const handlePageScroll = (e)=>{
-		const mescroll = getMescroll()
-		mescroll && mescroll.onPageScroll(e);
-	}
-	
-	const handleReachBottom = ()=>{
-		const mescroll = getMescroll()
-		mescroll && mescroll.onReachBottom();
-	}
-	
-	const handlePullDownRefresh = ()=>{
-		const mescroll = getMescroll()
-		mescroll && mescroll.onPullDownRefresh();
-	}
-	
-	const getMescroll = ()=>{
-		if(mescrollItem.value && mescrollItem.value.getMescroll){
-			return mescrollItem.value.getMescroll()
-		}
-		return null
-	}
-	
-	return {
-		mescrollItem,
-		getMescroll
-	}
-}
-
-export default useMescrollComp

+ 0 - 69
uni_modules/mescroll-uni/hooks/useMescrollMore.js

@@ -1,69 +0,0 @@
-import { ref  } from 'vue';
-
-// 小程序无法在hook中使用页面级别生命周期,需单独传入: https://ask.dcloud.net.cn/question/161173
-// import { onPageScroll, onReachBottom, onPullDownRefresh} from '@dcloudio/uni-app';
-
-/** mescroll-more示例写在子组件时,需通过useMescrollMore补充子组件缺少的生命周期, 相当于vue2的mescroll-more.js文件 */ 
-function useMescrollMore(mescrollItems, onPageScroll, onReachBottom, onPullDownRefresh){
-	// 当前tab下标
-	const tabIndex = ref(0) 
-	
-	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件
-	onPageScroll && onPageScroll(e=>{
-		handlePageScroll(e)
-	})
-	
-	onReachBottom && onReachBottom(()=>{
-		handleReachBottom()
-	})
-	
-	// 当down的native: true时, 还需传递此方法进到子组件
-	onPullDownRefresh && onPullDownRefresh(()=>{
-		handlePullDownRefresh()
-	})
-	
-	const handlePageScroll = (e)=>{
-		let mescroll = getMescroll(tabIndex.value);
-		mescroll && mescroll.onPageScroll(e);
-	}
-	const handleReachBottom = ()=>{
-		let mescroll = getMescroll(tabIndex.value);
-		mescroll && mescroll.onReachBottom();
-	}
-		
-	const handlePullDownRefresh = ()=>{
-		let mescroll = getMescroll(tabIndex.value);
-		mescroll && mescroll.onPullDownRefresh();
-	}
-	
-	// 根据下标获取对应子组件的mescroll
-	const getMescroll = (i)=>{
-		if (mescrollItems && mescrollItems[i]) {
-			return mescrollItems[i].value.getMescroll()
-		} else{
-			return null
-		}
-	}
-	
-	// 切换tab,恢复滚动条位置
-	const scrollToLastY = ()=>{
-		let mescroll = getMescroll(tabIndex.value);
-		if(mescroll){
-			// 恢复上次滚动条的位置
-			let y = mescroll.getScrollTop()
-			mescroll.scrollTo(y, 0)
-			// 再次恢复上次滚动条的位置, 确保元素已渲染
-			setTimeout(()=>{
-				mescroll.scrollTo(y, 0)
-			},20)
-		}
-	}
-	
-	return {
-		tabIndex,
-		getMescroll,
-		scrollToLastY
-	}
-}
-
-export default useMescrollMore

+ 15 - 11
uni_modules/mescroll-uni/package.json

@@ -1,19 +1,24 @@
 {
   "id": "mescroll-uni",
-  "displayName": "高性能下拉刷新上拉加载组件 支持vue3 setup",
-  "version": "1.3.8",
-  "description": "wxs+renderjs实现, 支持原生页面和局部区域滚动, 支持vue3 script setup的写法",
+  "displayName": "【wxs+renderjs实现】高性能下拉刷新上拉加载组件",
+  "version": "1.3.7",
+  "description": "支持uni-app的下拉刷新和上拉加载的组件,支持原生页面和局部区域滚动,支持国际化",
   "keywords": [
+    "mescroll",
     "下拉刷新",
     "上拉加载",
-    "翻页分页",
-    "wxs",
-    "setup"
+    "翻页",
+    "分页"
 ],
   "repository": "https://github.com/mescroll/mescroll",
-"engines": {
+  "engines": {
+    "HBuilderX": "^3.1.0"
   },
-"dcloudext": {
+  "dcloudext": {
+    "category": [
+        "前端组件",
+        "通用组件"
+    ],
     "sale": {
       "regular": {
         "price": "0.00"
@@ -30,8 +35,7 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/mescroll-uni",
-    "type": "component-vue"
+    "npmurl": "https://www.npmjs.com/package/mescroll-uni"
   },
   "uni_modules": {
     "dependencies": [],
@@ -44,7 +48,7 @@
       "client": {
         "App": {
           "app-vue": "y",
-          "app-nvue": "y"
+          "app-nvue": "n"
         },
         "H5-mobile": {
           "Safari": "y",

+ 0 - 45
uni_modules/mescroll-uni/readme.md

@@ -1,45 +0,0 @@
-## mescroll --【wxs+renderjs实现】高性能的下拉刷新上拉加载组件
-1. mescroll的uni版本 是专门用在uni-app的下拉刷新和上拉加载的组件  
-
-2. mescroll的uni版本 继承了mescroll.js的实用功能: 自动处理分页, 自动控制无数据, 空布局提示, 回到顶部按钮 ..
-
-3. mescroll的uni版本 丰富的案例, 自由灵活的api, 超详细的注释, 可让您快速自定义真正属于自己的下拉上拉组件
-
-<br/>
-
-
-## 最新文档(1.3.8版本): <a href="https://www.mescroll.com/uni.html">https://www.mescroll.com/uni.html</a>
-2023-03-26 by 小瑾同学 (文档可能会有缓存,建议打开时刷新一下)
-
-
-## 1.3.5版本已调整为[uni_modules](https://uniapp.dcloud.io/uni_modules)
-uni_modules版本的mescroll-body 和 mescroll-empty 支持 [easycom规范](https://uniapp.dcloud.io/collocation/pages?id=easycom)  
-所以 main.js 无需再为mescroll-body注册全局组件  
-所以个别页面要单独使用 mescroll-empty , 也无需手动注册
-#### 1.3.5以前的用户升级为uni_modules版本:
-```
-1. 删除原来的 @/components/mescroll-uni 组件
-2. 删除 main.js 注册的 mescroll 组件
-3. 从插件市场导入最新mescroll组件 (1.3.5+uni_modules版本)
-4. 全局搜索 '@/components/mescroll-uni/' 替换为 '@/uni_modules/mescroll-uni/components/mescroll-uni/'
-5. mescroll-empty遵循easycom规范, 若某些页面单独使用 'mescroll-empty.vue', 可删除手动导入的代码
-```
-
-## 近期已更新优化的内容:
-1. 新增vue3 script setup的示例  
-2. 新增`入门极简`示例, 国际化`mescroll-i18n.vue`示例, 轮播吸顶菜单`mescroll-swiper-sticky.vue`示例  
-3. 新增 "局部区域滚动" 的案例: mescroll-body-part.vue 和 mescroll-uni-part.vue  
-4. 新增 me-video 视频组件, 解决APP端视频下拉悬浮错位的问题, 参考 mescroll-options.vue 示例  
-5. 新增 me-tabs 组件,tabs支持水平滑动; 优化mescroll-more和mescroll-swiper的案例, 顶部tab支持水平滑动  
-6. 吸顶悬浮提供了原生sticky和监听滚动条实现的示例: sticky.vue 和 sticky-scroll.vue (推荐使用sticky样式实现)  
-7. mescroll.scrollTo(y)的y支持css选择器, 包括跨自定义组件的后代选择器, 支持滚动到子组件的view (参考 mescroll-options.vue)  
-8. topbar 顶部是否预留状态栏的高度, 默认false; 还可支持设置状态栏背景: 如 '#ffff00', 'url(xxx) 0 0/100% 100%', 'linear-gradient(xx)'  
-9. down.bgColor 和 up.bgColor 加载区域的背景,不仅支持色值, 而且还是支持背景图和渐变: 如 'url(xxx) 0 0/100% 100%', 'linear-gradient(xx)'  
-10. topbar,bgColor支持一行代码定义background: [https://www.runoob.com/cssref/css3-pr-background.html](https://www.runoob.com/cssref/css3-pr-background.html)
-<br/>
-<br/>
-<a href="https://ext.dcloud.net.cn/plugin?id=343&update_log">查看更多 ... </a>
-
-<br/>
-
-#### mescroll不支持nvue,也暂无支持的计划哈,so sorry~

+ 1 - 23
unpackage/dist/dev/mp-weixin/api/home.js

@@ -1,23 +1 @@
-"use strict";
-const common_request = require("../common/request.js");
-let request = new common_request.Request().http;
-function loginByMp(data) {
-  return request("/app/user/loginByMp", data, "POST", "application/json;charset=UTF-8");
-}
-function getlive(data) {
-  return request("/app/live/live", data, "GET", "application/json;charset=UTF-8");
-}
-function gettextlist(data) {
-  return request("/app/live/msgList", data, "GET", "application/json;charset=UTF-8");
-}
-function getAnswerlist(data) {
-  return request("/app/question/questionList", data, "GET", "application/json;charset=UTF-8");
-}
-function submitAnswer(data) {
-  return request("/app/question/answer", data, "POST", "application/json;charset=UTF-8");
-}
-exports.getAnswerlist = getAnswerlist;
-exports.getlive = getlive;
-exports.gettextlist = gettextlist;
-exports.loginByMp = loginByMp;
-exports.submitAnswer = submitAnswer;
+"use strict";const i=require("../common/request.js");let e=new i.Request().http;function n(t){return e("/app/user/loginByMp",t,"POST","application/json;charset=UTF-8")}function s(t){return e("/app/live/live",t,"GET","application/json;charset=UTF-8")}function p(t){return e("/app/live/msgList",t,"GET","application/json;charset=UTF-8")}exports.getlive=s;exports.gettextlist=p;exports.loginByMp=n;

+ 1 - 7
unpackage/dist/dev/mp-weixin/api/list.js

@@ -1,7 +1 @@
-"use strict";
-const common_request = require("../common/request.js");
-let request = new common_request.Request().http;
-function liveList(data) {
-  return request("/app/live/liveList", data, "GET", "application/json;charset=UTF-8");
-}
-exports.liveList = liveList;
+"use strict";const t=require("../common/request.js");let i=new t.Request().http;function s(e){return i("/app/live/liveList",e,"GET","application/json;charset=UTF-8")}exports.liveList=s;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 88
unpackage/dist/dev/mp-weixin/api/live.js


+ 1 - 35
unpackage/dist/dev/mp-weixin/api/login.js

@@ -1,35 +1 @@
-"use strict";
-const common_request = require("../common/request.js");
-let request = new common_request.Request().http;
-const api = {
-  userLoginWX: "api/login/login",
-  userLloginApp: "api/login/loginApp",
-  userLoginH5: "api/login/loginH5",
-  doSmsSend: "api/sms/send",
-  checkSms: "api/sms/checkSms",
-  resetPassword: "api/login/resetPassword",
-  // 我写的登录
-  loginByApp: "/app/user/loginByApp",
-  //登录
-  captchaImage: "captchaImage",
-  checkLogin: "/app/user/checkLogin",
-  //验证是否登录
-  register: "/app/user/register",
-  //注册账号
-  loginByWeChat: "/app/user/loginByWeChat",
-  //微信登录
-  setPhone: "/app/user/setPhone"
-  //绑定手机号码
-};
-function loginByApp(data) {
-  return request(api.loginByApp, data, "POST", "application/json;charset=UTF-8");
-}
-function register(data) {
-  return request(api.register, data, "POST", "application/json;charset=UTF-8");
-}
-function loginByWeChat(data) {
-  return request(api.loginByWeChat, data, "POST", "application/json;charset=UTF-8");
-}
-exports.loginByApp = loginByApp;
-exports.loginByWeChat = loginByWeChat;
-exports.register = register;
+"use strict";const s=require("../common/request.js");let i=new s.Request().http;const n={userLoginWX:"api/login/login",userLloginApp:"api/login/loginApp",userLoginH5:"api/login/loginH5",doSmsSend:"api/sms/send",checkSms:"api/sms/checkSms",resetPassword:"api/login/resetPassword",loginByApp:"/app/user/loginByApp",captchaImage:"captchaImage",checkLogin:"/app/user/checkLogin",register:"/app/user/register",loginByWeChat:"/app/user/loginByWeChat",setPhone:"/app/user/setPhone"};function o(e){return i(n.loginByApp,e,"POST","application/json;charset=UTF-8")}function p(e){return i(n.register,e,"POST","application/json;charset=UTF-8")}function t(e){return i(n.loginByWeChat,e,"POST","application/json;charset=UTF-8")}exports.loginByApp=o;exports.loginByWeChat=t;exports.register=p;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 152
unpackage/dist/dev/mp-weixin/api/order.js


+ 1 - 61
unpackage/dist/dev/mp-weixin/api/pay.js

@@ -1,61 +1 @@
-"use strict";
-const common_vendor = require("../common/vendor.js");
-const common_request = require("../common/request.js");
-let request = new common_request.Request().http;
-const api = {
-  // 支付
-  zfbPayment: "/app/live/liveOrder/aliPayment",
-  // 支付宝付款
-  weChatPayment: "/app/live/liveOrder/weChatPayment"
-  // 微信付款
-  // updateConfirm: (orderId, type) => `/app/live/liveOrder/updateConfirm/${orderId}/${type} `, // 取消/支付订单确认
-};
-function weChatPayment(data) {
-  return new Promise((resolve, reject) => {
-    request(api.weChatPayment, data, "POST", "application/json;charset=UTF-8").then((res) => {
-      invokePayment(res.data).then(resolve).catch((err) => {
-        handlePaymentError(err);
-        reject(err);
-      });
-    }).catch((err) => {
-      handlePaymentError(err);
-      reject(err);
-    });
-  });
-}
-function invokePayment(payData) {
-  return new Promise((resolve, reject) => {
-    common_vendor.index.requestPayment({
-      provider: "wxpay",
-      ...payData,
-      // 直接展开小程序所需参数
-      success: (res) => {
-        common_vendor.index.showToast({
-          title: "支付成功"
-        });
-        resolve(res);
-      },
-      fail: (err) => {
-        reject(new Error(formatError(err)));
-      }
-    });
-  });
-}
-function formatError(err) {
-  if (err.errMsg) {
-    if (err.errMsg.includes("cancel"))
-      return "支付已取消";
-    if (err.errMsg.includes("fail"))
-      return "支付失败";
-  }
-  return err.message || "支付异常";
-}
-function handlePaymentError(err) {
-  console.error("[支付错误]", err);
-  common_vendor.index.showToast({
-    title: err.message,
-    icon: "none",
-    duration: 3e3
-  });
-}
-exports.weChatPayment = weChatPayment;
+"use strict";const r=require("../common/vendor.js"),s=require("../common/request.js");let c=new s.Request().http;const u={zfbPayment:"/app/live/liveOrder/aliPayment",weChatPayment:"/app/live/liveOrder/weChatPayment"};function m(e){return new Promise((a,t)=>{c(u.weChatPayment,e,"POST","application/json;charset=UTF-8").then(n=>{l(n.data).then(a).catch(i=>{o(i),t(i)})}).catch(n=>{o(n),t(n)})})}function l(e){return new Promise((a,t)=>{r.index.requestPayment({provider:"wxpay",...e,success:n=>{r.index.showToast({title:"支付成功"}),a(n)},fail:n=>{t(new Error(h(n)))}})})}function h(e){if(e.errMsg){if(e.errMsg.includes("cancel"))return"支付已取消";if(e.errMsg.includes("fail"))return"支付失败"}return e.message||"支付异常"}function o(e){console.error("[支付错误]",e),r.index.showToast({title:e.message,icon:"none",duration:3e3})}exports.weChatPayment=m;

+ 1 - 116
unpackage/dist/dev/mp-weixin/app.js

@@ -1,116 +1 @@
-"use strict";
-Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
-const common_vendor = require("./common/vendor.js");
-const utils_storage = require("./utils/storage.js");
-const store_index = require("./store/index.js");
-const core_bootstrap = require("./core/bootstrap.js");
-const utils_util = require("./utils/util.js");
-const core_mixins_share = require("./core/mixins/share.js");
-const core_mixins_app = require("./core/mixins/app.js");
-if (!Math) {
-  "./pages/home/index.js";
-  "./pages/home/living.js";
-  "./pages/user/index.js";
-  "./pages/list/index.js";
-  "./pages/home/live.js";
-  "./pages/games/index.js";
-  "./pages/auth/login.js";
-  "./pages/auth/findpass.js";
-  "./pages/auth/h5WxLogin.js";
-  "./pages/auth/loginIndex.js";
-  "./pages/auth/register.js";
-  "./pages_shop/cart.js";
-  "./pages_shop/goods.js";
-  "./pages_shop/store.js";
-  "./pages_shop/order.js";
-  "./pages_shop/confirmCreateOrder.js";
-  "./pages_shop/paymentOrder.js";
-  "./pages_shop/confirmPackageOrder.js";
-  "./pages_shop/storeOrder.js";
-  "./pages_shop/refundOrder.js";
-  "./pages_shop/refundOrderProduct.js";
-  "./pages_shop/storeOrderRefundList.js";
-  "./pages_shop/storeOrderRefundDetails.js";
-  "./pages_shop/storeOrderRefundSubmit.js";
-  "./pages_shop/success.js";
-  "./pages_shop/storeOrderDelivery.js";
-  "./pages_user/address.js";
-  "./pages_user/integral.js";
-  "./pages_user/integralGoodsList.js";
-  "./pages_user/addAddress.js";
-}
-const _sfc_main = {
-  onLaunch: function(options) {
-    const store = common_vendor.useStore();
-    let parent_id;
-    if (options.query && options.query.scene) {
-      parent_id = decodeURIComponent(options.query.scene).split("=")[1];
-    } else if (options.query && options.query.parent_id) {
-      parent_id = options.query.parent_id;
-    }
-    utils_storage.storage.set("PARENT_ID", parent_id, 30 * 86400 * 3);
-    store.commit("M_PARENT_ID", parent_id);
-    this.updateManager();
-  },
-  onShow: function() {
-    console.log("App Show");
-  },
-  onLoad() {
-    console.log("App Load");
-  },
-  onHide: function() {
-    console.log("App Hide");
-  },
-  methods: {
-    /**
-     * 小程序主动更新
-     */
-    updateManager() {
-      const updateManager = common_vendor.index.getUpdateManager();
-      updateManager.onCheckForUpdate((res) => {
-      });
-      updateManager.onUpdateReady(() => {
-        common_vendor.index.showModal({
-          title: "更新提示",
-          content: "新版本已经准备好,即将重启应用",
-          showCancel: false,
-          success(res) {
-            if (res.confirm) {
-              updateManager.applyUpdate();
-            }
-          }
-        });
-      });
-      updateManager.onUpdateFailed(() => {
-        common_vendor.index.showModal({
-          title: "更新提示",
-          content: "新版本下载失败",
-          showCancel: false
-        });
-      });
-    }
-  }
-};
-function createApp() {
-  const app = common_vendor.createSSRApp(_sfc_main);
-  app.use(common_vendor.uviewPlus);
-  app.use(store_index.store);
-  app.config.productionTip = false;
-  app.config.globalProperties.$img = {
-    img: "/static/images/img.png",
-    logo: "/static/images/logo.png"
-  };
-  app.config.globalProperties.$isLogin = utils_util.isLogin;
-  app.config.globalProperties.$isEmpty = utils_util.isEmpty;
-  app.config.globalProperties.$navTo = utils_util.navTo;
-  app.config.globalProperties.$getRegistrationID = utils_util.getRegistrationID;
-  app.config.globalProperties.$parsePhone = utils_util.parsePhone;
-  app.mixin(core_mixins_share.share);
-  app.mixin(core_mixins_app.mixin);
-  return {
-    app,
-    created: core_bootstrap.Initializer
-  };
-}
-createApp().app.mount("#app");
-exports.createApp = createApp;
+"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./common/vendor.js"),i=require("./utils/storage.js"),n=require("./store/index.js"),p=require("./core/bootstrap.js"),o=require("./utils/util.js"),g=require("./core/mixins/share.js"),d=require("./core/mixins/app.js"),c={onLaunch:function(e){const r=s.useStore();let a;e.query&&e.query.scene?a=decodeURIComponent(e.query.scene).split("=")[1]:e.query&&e.query.parent_id&&(a=e.query.parent_id),i.storage.set("PARENT_ID",a,30*86400*3),r.commit("M_PARENT_ID",a),this.updateManager()},onShow:function(){console.log("App Show")},onLoad(){console.log("App Load")},onHide:function(){console.log("App Hide")},methods:{updateManager(){const e=s.index.getUpdateManager();e.onCheckForUpdate(r=>{}),e.onUpdateReady(()=>{s.index.showModal({title:"更新提示",content:"新版本已经准备好,即将重启应用",showCancel:!1,success(r){r.confirm&&e.applyUpdate()}})}),e.onUpdateFailed(()=>{s.index.showModal({title:"更新提示",content:"新版本下载失败",showCancel:!1})})}}};function t(){const e=s.createSSRApp(c);return e.use(s.uviewPlus),e.use(n.store),e.config.productionTip=!1,e.config.globalProperties.$img={img:"/static/images/img.png",logo:"/static/images/logo.png"},e.config.globalProperties.$isLogin=o.isLogin,e.config.globalProperties.$isEmpty=o.isEmpty,e.config.globalProperties.$navTo=o.navTo,e.config.globalProperties.$getRegistrationID=o.getRegistrationID,e.config.globalProperties.$parsePhone=o.parsePhone,e.mixin(g.share),e.mixin(d.mixin),{app:e,created:p.Initializer}}t().app.mount("#app");exports.createApp=t;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 22198
unpackage/dist/dev/mp-weixin/app.wxss


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 93
unpackage/dist/dev/mp-weixin/common/assets.js


+ 1 - 69
unpackage/dist/dev/mp-weixin/common/request.js

@@ -1,69 +1 @@
-"use strict";
-var __defProp = Object.defineProperty;
-var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
-var __publicField = (obj, key, value) => {
-  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
-  return value;
-};
-const common_vendor = require("./vendor.js");
-const _Request = class _Request {
-  http(router, data = {}, method, contentType) {
-    let path = "http://192.168.10.166:7114";
-    common_vendor.index.setStorageSync("requestPath", path);
-    if (_Request.loadingCount === 0) {
-      common_vendor.index.showLoading({
-        title: "加载中",
-        mask: true
-      });
-    }
-    _Request.loadingCount++;
-    return new Promise((resolve, reject) => {
-      let token = common_vendor.index.getStorageSync("AppToken");
-      var httpContentType = "application/x-www-form-urlencoded";
-      if (contentType != void 0) {
-        httpContentType = contentType;
-      }
-      common_vendor.index.request({
-        header: {
-          // 'Content-Type': 'application/x-www-form-urlencoded',
-          "Content-Type": httpContentType,
-          "AppToken": token
-        },
-        url: `${path}${router}`,
-        data,
-        method,
-        success: (res) => {
-          if (res.code == 401) {
-            let pages = getCurrentPages();
-            let url = pages[pages.length - 1];
-            if (url != void 0 && url.route == "/pages/home/index") {
-              resolve(res.data);
-              return;
-            }
-            common_vendor.index.reLaunch({
-              url: "/pages/home/index"
-            });
-            return;
-          }
-          if (res.token) {
-            common_vendor.index.setStorageSync("AppToken", res.token);
-          }
-          resolve(res.data);
-        },
-        fail: (res) => {
-        },
-        complete: (res) => {
-          _Request.loadingCount--;
-          if (_Request.loadingCount <= 0) {
-            common_vendor.index.hideLoading();
-            _Request.loadingCount = 0;
-          }
-        }
-      });
-    });
-  }
-};
-// 添加一个计数器,确保多个请求不会互相干扰
-__publicField(_Request, "loadingCount", 0);
-let Request = _Request;
-exports.Request = Request;
+"use strict";var m=Object.defineProperty;var x=(a,e,n)=>e in a?m(a,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):a[e]=n;var c=(a,e,n)=>(x(a,typeof e!="symbol"?e+"":e,n),n);const i=require("./vendor.js"),t=class t{http(e,n={},h,r){let u="https://live.test.ylrztop.com/live-api";return i.index.setStorageSync("requestPath",u),t.loadingCount===0&&i.index.showLoading({title:"加载中",mask:!0}),t.loadingCount++,new Promise((l,C)=>{let f=i.index.getStorageSync("AppToken");var p="application/x-www-form-urlencoded";r!=null&&(p=r),i.index.request({header:{"Content-Type":p,AppToken:f},url:`${u}${e}`,data:n,method:h,success:o=>{if(o.code==401){let g=getCurrentPages(),s=g[g.length-1];if(s!=null&&s.route=="/pages/home/index"){l(o.data);return}i.index.reLaunch({url:"/pages/home/index"});return}o.token&&i.index.setStorageSync("AppToken",o.token),l(o.data)},fail:o=>{},complete:o=>{t.loadingCount--,t.loadingCount<=0&&(i.index.hideLoading(),t.loadingCount=0)}})})}};c(t,"loadingCount",0);let d=t;exports.Request=d;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1768
unpackage/dist/dev/mp-weixin/common/vendor.js


+ 1 - 20
unpackage/dist/dev/mp-weixin/components/Loading.js

@@ -1,20 +1 @@
-"use strict";
-const common_vendor = require("../common/vendor.js");
-const _sfc_main = {
-  name: "Loading",
-  props: {
-    loaded: Boolean,
-    loading: Boolean
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return common_vendor.e({
-    a: $props.loading || !$props.loaded
-  }, $props.loading || !$props.loaded ? common_vendor.e({
-    b: $props.loading
-  }, $props.loading ? {} : {}, {
-    c: !$props.loading
-  }, !$props.loading ? {} : {}) : {});
-}
-const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
-wx.createComponent(Component);
+"use strict";const e=require("../common/vendor.js"),o={name:"Loading",props:{loaded:Boolean,loading:Boolean}};function a(t,c,n,i,l,_){return e.e({a:n.loading||!n.loaded},n.loading||!n.loaded?e.e({b:n.loading},n.loading?{}:{},{c:!n.loading},n.loading?{}:{}):{})}const d=e._export_sfc(o,[["render",a]]);wx.createComponent(d);

+ 1 - 104
unpackage/dist/dev/mp-weixin/components/evan-switch/evan-switch.js

@@ -1,104 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const _sfc_main = {
-  name: "EvanSwitch",
-  props: {
-    value: {
-      type: [String, Number, Boolean],
-      default: false
-    },
-    activeColor: {
-      type: String,
-      default: "#108ee9"
-    },
-    inactiveColor: {
-      type: String,
-      default: "#fff"
-    },
-    size: {
-      type: Number,
-      default: 30
-    },
-    disabled: {
-      type: Boolean,
-      default: false
-    },
-    activeValue: {
-      type: [String, Number, Boolean],
-      default: true
-    },
-    inactiveValue: {
-      type: [String, Number, Boolean],
-      default: false
-    },
-    beforeChange: {
-      type: Function,
-      default: null
-    },
-    extraData: null,
-    contextLevel: {
-      type: Number,
-      default: 1
-    }
-  },
-  computed: {
-    switchHeight() {
-      return this.size + "px";
-    }
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(value) {
-        this.currentValue = value;
-      }
-    }
-  },
-  data() {
-    return {
-      currentValue: false
-    };
-  },
-  methods: {
-    toggle() {
-      if (!this.disabled) {
-        if (this.beforeChange && typeof this.beforeChange === "function") {
-          let context = this;
-          for (let i = 0; i < this.contextLevel; i++) {
-            context = context.$options.parent;
-          }
-          const result = this.beforeChange(
-            this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue,
-            this.extraData,
-            context
-          );
-          if (typeof result === "object") {
-            result.then(() => {
-              this.toggleValue();
-            }).catch(() => {
-            });
-          } else if (typeof result === "boolean" && result) {
-            this.toggleValue();
-          }
-        } else {
-          this.toggleValue();
-        }
-      }
-    },
-    toggleValue() {
-      this.currentValue = this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue;
-      this.$emit("input", this.currentValue);
-      this.$emit("change", this.currentValue);
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: $data.currentValue === $props.activeValue ? `translateX(${29}px)` : `translateX(0)`,
-    b: common_vendor.o((...args) => $options.toggle && $options.toggle(...args)),
-    c: $props.disabled ? 1 : "",
-    d: $data.currentValue === $props.activeValue ? $props.activeColor : $props.inactiveColor
-  };
-}
-const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-687346f1"]]);
-wx.createComponent(Component);
+"use strict";const n=require("../../common/vendor.js"),r={name:"EvanSwitch",props:{value:{type:[String,Number,Boolean],default:!1},activeColor:{type:String,default:"#108ee9"},inactiveColor:{type:String,default:"#fff"},size:{type:Number,default:30},disabled:{type:Boolean,default:!1},activeValue:{type:[String,Number,Boolean],default:!0},inactiveValue:{type:[String,Number,Boolean],default:!1},beforeChange:{type:Function,default:null},extraData:null,contextLevel:{type:Number,default:1}},computed:{switchHeight(){return this.size+"px"}},watch:{value:{immediate:!0,handler(t){this.currentValue=t}}},data(){return{currentValue:!1}},methods:{toggle(){if(!this.disabled)if(this.beforeChange&&typeof this.beforeChange=="function"){let t=this;for(let e=0;e<this.contextLevel;e++)t=t.$options.parent;const a=this.beforeChange(this.currentValue===this.activeValue?this.inactiveValue:this.activeValue,this.extraData,t);typeof a=="object"?a.then(()=>{this.toggleValue()}).catch(()=>{}):typeof a=="boolean"&&a&&this.toggleValue()}else this.toggleValue()},toggleValue(){this.currentValue=this.currentValue===this.activeValue?this.inactiveValue:this.activeValue,this.$emit("input",this.currentValue),this.$emit("change",this.currentValue)}}};function o(t,a,e,s,i,l){return{a:i.currentValue===e.activeValue?"translateX(29px)":"translateX(0)",b:n.o((...u)=>l.toggle&&l.toggle(...u)),c:e.disabled?1:"",d:i.currentValue===e.activeValue?e.activeColor:e.inactiveColor}}const c=n._export_sfc(r,[["render",o],["__scopeId","data-v-687346f1"]]);wx.createComponent(c);

+ 1 - 53
unpackage/dist/dev/mp-weixin/components/evan-switch/evan-switch.wxss

@@ -1,53 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-.evan-switch.data-v-687346f1 {
-  position: relative;
-  border-width: 1px;
-  border-color: rgba(0, 0, 0, 0.1);
-  border-style: solid;
-  transition: background-color 0.3s;
-  width: 100rpx;
-  height: 36rpx;
-  background: #0bb3f2;
-  border-radius: 18rpx;
-  box-sizing: content-box;
-}
-.evan-switch--disabled.data-v-687346f1 {
-  opacity: 0.3;
-}
-.evan-switch__circle.data-v-687346f1 {
-  position: absolute;
-  left: -4rpx;
-  top: -8rpx;
-  width: 50rpx;
-  height: 50rpx;
-  background: #FFFFFF;
-  box-shadow: 0px 2px 10px 0px rgba(166, 217, 212, 0.49);
-  border-radius: 50%;
-  box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
-  transition: transform 0.3s;
-}
+.evan-switch.data-v-687346f1{position:relative;border-width:1px;border-color:rgba(0,0,0,.1);border-style:solid;transition:background-color .3s;width:100rpx;height:36rpx;background:#0bb3f2;border-radius:18rpx;box-sizing:content-box}.evan-switch--disabled.data-v-687346f1{opacity:.3}.evan-switch__circle.data-v-687346f1{position:absolute;left:-4rpx;top:-8rpx;width:50rpx;height:50rpx;background:#fff;box-shadow:0 2px 10px rgba(166,217,212,.49);border-radius:50%;box-shadow:0 3px 1px rgba(0,0,0,.05),0 2px 2px rgba(0,0,0,.1),0 3px 3px rgba(0,0,0,.05);transition:transform .3s}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 198
unpackage/dist/dev/mp-weixin/components/px-popup-bottom/px-popup-bottom.js


+ 1 - 119
unpackage/dist/dev/mp-weixin/components/px-popup-bottom/px-popup-bottom.wxss

@@ -1,119 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-.popup.popup-show.data-v-4fac7f82 {
-  position: fixed;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  overflow: hidden;
-  z-index: 999;
-}
-.popup .mask.data-v-4fac7f82 {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  background-color: rgba(0, 0, 0, 0.5);
-  z-index: 999;
-}
-.popup .content.data-v-4fac7f82 {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  height: 0;
-  height: auto;
-  background-color: #ffffff;
-  transition: all 0.2s ease-in;
-  z-index: 1000;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  overflow: hidden;
-}
-.popup .content .title-bar.data-v-4fac7f82 {
-  width: 100%;
-  flex-shrink: 0;
-  text-align: center;
-  position: relative;
-  padding: 10rpx 70rpx 0;
-  box-sizing: border-box;
-  height: 80rpx;
-}
-.popup .content .title-bar .title.data-v-4fac7f82 {
-  font-size: 34rpx;
-  font-family: PingFang SC;
-  font-weight: bold !important;
-  color: #111111;
-  width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.popup .content .title-bar .close-wrap.data-v-4fac7f82 {
-  position: absolute;
-  top: 20rpx;
-  right: 10rpx;
-  padding: 10rpx 20rpx;
-  box-sizing: border-box;
-}
-.popup .content .title-bar .close-icon.data-v-4fac7f82 {
-  width: 40rpx;
-  height: 40rpx;
-}
-.popup .content .scroll-wrap.data-v-4fac7f82 {
-  flex: 1;
-  height: 0;
-  width: 100%;
-}
-.popup .content.visible.data-v-4fac7f82 {
-  max-height: 75%;
-  overflow-y: hidden;
-  height: auto;
-}
-.scroll-view.data-v-4fac7f82 ::-webkit-scrollbar {
-  display: none !important;
-  width: 0 !important;
-  height: 0 !important;
-  -webkit-appearance: none;
-  background: transparent;
-}
-.popup_content.data-v-4fac7f82 {
-  width: 100%;
-  padding: 0rpx 30rpx;
-  box-sizing: border-box;
-}
-.popup_content.data-v-4fac7f82::after {
-  display: block;
-  width: 100%;
-  content: " ";
-  overflow: hidden;
-  opacity: 0;
-  height: 1rpx;
-}
+.popup.popup-show.data-v-4fac7f82{position:fixed;top:0;right:0;left:0;bottom:0;overflow:hidden;z-index:999}.popup .mask.data-v-4fac7f82{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.5);z-index:999}.popup .content.data-v-4fac7f82{position:fixed;bottom:0;left:0;right:0;height:0;height:auto;background-color:#fff;transition:all .2s ease-in;z-index:1000;display:flex;flex-direction:column;align-items:center;overflow:hidden}.popup .content .title-bar.data-v-4fac7f82{width:100%;flex-shrink:0;text-align:center;position:relative;padding:10rpx 70rpx 0;box-sizing:border-box;height:80rpx}.popup .content .title-bar .title.data-v-4fac7f82{font-size:34rpx;font-family:PingFang SC;font-weight:700!important;color:#111;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popup .content .title-bar .close-wrap.data-v-4fac7f82{position:absolute;top:20rpx;right:10rpx;padding:10rpx 20rpx;box-sizing:border-box}.popup .content .title-bar .close-icon.data-v-4fac7f82{width:40rpx;height:40rpx}.popup .content .scroll-wrap.data-v-4fac7f82{flex:1;height:0;width:100%}.popup .content.visible.data-v-4fac7f82{max-height:75%;overflow-y:hidden;height:auto}.scroll-view.data-v-4fac7f82 ::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;-webkit-appearance:none;background:transparent}.popup_content.data-v-4fac7f82{width:100%;padding:0rpx 30rpx;box-sizing:border-box}.popup_content.data-v-4fac7f82:after{display:block;width:100%;content:"\a0";overflow:hidden;opacity:0;height:1rpx}

+ 1 - 33
unpackage/dist/dev/mp-weixin/core/app.js

@@ -1,33 +1 @@
-"use strict";
-const common_vendor = require("../common/vendor.js");
-require("../store/index.js");
-const utils_util = require("../utils/util.js");
-const getTabBarLinks = () => {
-  const tabBarLinks = [
-    "pages/home/index",
-    "pages/camp/index",
-    "pages/games/index",
-    "pages/user/index"
-  ];
-  return tabBarLinks;
-};
-const navTo = (url, query = {}, modo = "navigateTo") => {
-  if (!url || url.length == 0) {
-    return false;
-  }
-  if (utils_util.inArray(url, getTabBarLinks())) {
-    common_vendor.index.switchTab({
-      url: `/${url}`
-    });
-    return true;
-  }
-  const queryStr = query ? "?" + utils_util.urlEncode(query) : "";
-  modo === "navigateTo" && common_vendor.index.navigateTo({
-    url: `/${url}${queryStr}`
-  });
-  modo === "redirectTo" && common_vendor.index.redirectTo({
-    url: `/${url}${queryStr}`
-  });
-  return true;
-};
-exports.navTo = navTo;
+"use strict";const n=require("../common/vendor.js");require("../store/index.js");const a=require("../utils/util.js"),s=()=>["pages/home/index","pages/camp/index","pages/games/index","pages/user/index"],o=(e,r={},t="navigateTo")=>{if(!e||e.length==0)return!1;if(a.inArray(e,s()))return n.index.switchTab({url:`/${e}`}),!0;const i=r?"?"+a.urlEncode(r):"";return t==="navigateTo"&&n.index.navigateTo({url:`/${e}${i}`}),t==="redirectTo"&&n.index.redirectTo({url:`/${e}${i}`}),!0};exports.navTo=o;

+ 1 - 11
unpackage/dist/dev/mp-weixin/core/bootstrap.js

@@ -1,11 +1 @@
-"use strict";
-const store_index = require("../store/index.js");
-const utils_storage = require("../utils/storage.js");
-const core_platform = require("./platform.js");
-const store_mutationTypes = require("../store/mutation-types.js");
-function Initializer() {
-  store_index.store.commit("SET_PLATFORM", core_platform.platfrom);
-  store_index.store.commit("SET_TOKEN", utils_storage.storage.get(store_mutationTypes.ACCESS_TOKEN));
-  store_index.store.commit("SET_USER_ID", utils_storage.storage.get(store_mutationTypes.USER_ID));
-}
-exports.Initializer = Initializer;
+"use strict";const t=require("../store/index.js"),e=require("../utils/storage.js"),o=require("./platform.js"),r=require("../store/mutation-types.js");function i(){t.store.commit("SET_PLATFORM",o.platfrom),t.store.commit("SET_TOKEN",e.storage.get(r.ACCESS_TOKEN)),t.store.commit("SET_USER_ID",e.storage.get(r.USER_ID))}exports.Initializer=i;

+ 1 - 8
unpackage/dist/dev/mp-weixin/core/config/defaultConfig.js

@@ -1,8 +1 @@
-"use strict";
-const developUrl = "http://192.168.10.166:7114/";
-const defaultConfig = {
-  // 系统名称
-  name: "签约",
-  apiUrl: developUrl
-};
-exports.defaultConfig = defaultConfig;
+"use strict";const t="http://192.168.10.166:7114/",e={name:"签约",apiUrl:t};exports.defaultConfig=e;

+ 1 - 21
unpackage/dist/dev/mp-weixin/core/config/index.js

@@ -1,21 +1 @@
-"use strict";
-const core_config_defaultConfig = require("./defaultConfig.js");
-const mergeConfig = Object.assign({}, core_config_defaultConfig.defaultConfig);
-const config = {
-  // 获取全部配置
-  all() {
-    return mergeConfig;
-  },
-  // 获取指定配置
-  get(key, def = void 0) {
-    if (mergeConfig.hasOwnProperty(key)) {
-      return mergeConfig[key];
-    }
-    console.error(`检测到不存在的配置项: ${key}`);
-    return def;
-  },
-  getResource(imgName) {
-    return `${mergeConfig.apiUrl}images/${imgName}`;
-  }
-};
-exports.config = config;
+"use strict";const o=require("./defaultConfig.js"),r=Object.assign({},o.defaultConfig),t={all(){return r},get(e,n=void 0){return r.hasOwnProperty(e)?r[e]:(console.error(`检测到不存在的配置项: ${e}`),n)},getResource(e){return`${r.apiUrl}images/${e}`}};exports.config=t;

+ 1 - 13
unpackage/dist/dev/mp-weixin/core/mixins/app.js

@@ -1,13 +1 @@
-"use strict";
-require("../../common/vendor.js");
-require("../../store/index.js");
-const core_platform = require("../platform.js");
-const mixin = {
-  data() {
-    return {
-      platform: core_platform.platfrom
-    };
-  },
-  computed: {}
-};
-exports.mixin = mixin;
+"use strict";require("../../common/vendor.js");require("../../store/index.js");const r=require("../platform.js"),e={data(){return{platform:r.platfrom}},computed:{}};exports.mixin=e;

+ 1 - 37
unpackage/dist/dev/mp-weixin/core/mixins/share.js

@@ -1,37 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const core_config_index = require("../config/index.js");
-const share = {
-  data() {
-    return {
-      share: {
-        // 转发的标题 (默认标题)
-        title: core_config_index.config.get("name"),
-        // 默认是当前页面,必须是以‘/’开头的完整路径
-        path: `/pages/home/index`,
-        //自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径,
-        //支持PNG及JPG,不传入 imageUrl 则使用默认截图。显示图片长宽比是 5:4
-        imageUrl: core_config_index.config.getResource("logo.png")
-      }
-    };
-  },
-  // 发送给朋友
-  onShareAppMessage(res) {
-    let shareInfo = common_vendor.index.getStorageSync("shareInfo");
-    return {
-      title: shareInfo.title || this.share.title,
-      imageUrl: shareInfo.imgUrl || this.share.imageUrl,
-      path: shareInfo.path || this.share.path
-    };
-  },
-  //分享到朋友圈
-  onShareTimeline(res) {
-    let shareInfo = common_vendor.index.getStorageSync("shareInfo");
-    return {
-      title: shareInfo.title || this.share.title,
-      imageUrl: shareInfo.imgUrl || this.share.imageUrl,
-      path: shareInfo.path || this.share.path
-    };
-  }
-};
-exports.share = share;
+"use strict";const t=require("../../common/vendor.js"),r=require("../config/index.js"),i={data(){return{share:{title:r.config.get("name"),path:"/pages/home/index",imageUrl:r.config.getResource("logo.png")}}},onShareAppMessage(a){let e=t.index.getStorageSync("shareInfo");return{title:e.title||this.share.title,imageUrl:e.imgUrl||this.share.imageUrl,path:e.path||this.share.path}},onShareTimeline(a){let e=t.index.getStorageSync("shareInfo");return{title:e.title||this.share.title,imageUrl:e.imgUrl||this.share.imageUrl,path:e.path||this.share.path}}};exports.share=i;

+ 1 - 7
unpackage/dist/dev/mp-weixin/core/platform.js

@@ -1,7 +1 @@
-"use strict";
-const getPlatform = () => {
-  const platform = "wxapp";
-  return platform;
-};
-const platfrom = getPlatform();
-exports.platfrom = platfrom;
+"use strict";const t=()=>"wxapp",o=t();exports.platfrom=o;

+ 1 - 88
unpackage/dist/dev/mp-weixin/pages/auth/findpass.js

@@ -1,88 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-require("../../api/login.js");
-const _sfc_main = {
-  data() {
-    return {
-      userName: "",
-      password: "",
-      password1: "",
-      registrationID: "",
-      yzcode: ""
-    };
-  },
-  onLoad(option) {
-    let that = this;
-    common_vendor.index.$on("getRegistrationID", function(data) {
-      that.registrationID = data;
-    });
-    this.$getRegistrationID();
-  },
-  onShow() {
-  },
-  onUnload() {
-    common_vendor.index.$off("getRegistrationID");
-  },
-  mounted() {
-  },
-  methods: {
-    login() {
-      if (this.$isEmpty(this.userName)) {
-        common_vendor.index.showToast({
-          title: "请输入帐号",
-          icon: "none"
-        });
-        return;
-      }
-      if (this.$isEmpty(this.password)) {
-        common_vendor.index.showToast({
-          title: "请输入密码",
-          icon: "none"
-        });
-        return;
-      }
-      var data = {
-        userName: this.userName,
-        password: this.password,
-        jpushId: this.registrationID || common_vendor.index.getStorageSync("registrationID")
-      };
-      common_vendor.index.showLoading({
-        title: "处理中..."
-      });
-      login(data).then(
-        (res) => {
-          common_vendor.index.hideLoading();
-          if (res.code == 200) {
-            common_vendor.index.setStorageSync("AppToken", res.data.token);
-            this.$Router.pushTab({ name: "home" });
-          } else {
-            common_vendor.index.showToast({ title: res.msg, icon: "none" });
-          }
-        },
-        (rej) => {
-        }
-      );
-    },
-    goToRegister() {
-      this.$navTo("./register");
-    },
-    goToFindPass() {
-      this.$navTo("./findPass");
-    },
-    getRegistrationID() {
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: $data.userName,
-    b: common_vendor.o(($event) => $data.userName = $event.detail.value),
-    c: $data.password,
-    d: common_vendor.o(($event) => $data.password = $event.detail.value),
-    e: $data.yzcode,
-    f: common_vendor.o(($event) => $data.yzcode = $event.detail.value),
-    g: common_vendor.o((...args) => $options.login && $options.login(...args))
-  };
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
-wx.createPage(MiniProgramPage);
+"use strict";const e=require("../../common/vendor.js");require("../../api/login.js");const a={data(){return{userName:"",password:"",password1:"",registrationID:"",yzcode:""}},onLoad(s){let o=this;e.index.$on("getRegistrationID",function(n){o.registrationID=n}),this.$getRegistrationID()},onShow(){},onUnload(){e.index.$off("getRegistrationID")},mounted(){},methods:{login(){if(this.$isEmpty(this.userName)){e.index.showToast({title:"请输入帐号",icon:"none"});return}if(this.$isEmpty(this.password)){e.index.showToast({title:"请输入密码",icon:"none"});return}var s={userName:this.userName,password:this.password,jpushId:this.registrationID||e.index.getStorageSync("registrationID")};e.index.showLoading({title:"处理中..."}),login(s).then(o=>{e.index.hideLoading(),o.code==200?(e.index.setStorageSync("AppToken",o.data.token),this.$Router.pushTab({name:"home"})):e.index.showToast({title:o.msg,icon:"none"})},o=>{})},goToRegister(){this.$navTo("./register")},goToFindPass(){this.$navTo("./findPass")},getRegistrationID(){}}};function d(s,o,n,h,i,r){return{a:i.userName,b:e.o(t=>i.userName=t.detail.value),c:i.password,d:e.o(t=>i.password=t.detail.value),e:i.yzcode,f:e.o(t=>i.yzcode=t.detail.value),g:e.o((...t)=>r.login&&r.login(...t))}}const g=e._export_sfc(a,[["render",d]]);wx.createPage(g);

+ 1 - 164
unpackage/dist/dev/mp-weixin/pages/auth/findpass.wxss

@@ -1,164 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-page {
-  background-color: #ffffff;
-}
-.content {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  height: 100vh;
-  width: 100%;
-  justify-content: space-between;
-}
-.pageTop {
-  display: flex;
-  flex-direction: column;
-  width: 100%;
-}
-.content .head {
-  text-align: center;
-  width: 100%;
-  height: 522rpx;
-  background-size: cover;
-  box-sizing: border-box;
-}
-.content .head image {
-  width: 150rpx;
-  height: 150rpx;
-  border-radius: 10rpx;
-  box-shadow: 0px 0px 20rpx rgba(0, 0, 0, 0.2);
-}
-.title {
-  color: #141414;
-  margin: 50rpx 0rpx 30rpx 0rpx;
-  font-size: 38rpx;
-  font-weight: 500;
-}
-.desc {
-  color: #686866;
-  padding: 0 0 30rpx 0rpx;
-  font-size: 28rpx;
-}
-.loginBox {
-  padding: 10px 10px 30rpx;
-  width: calc(100% - 20px);
-  margin-top: 0rpx;
-  background: #FDFDFD;
-  border-radius: 7rpx;
-}
-.line {
-  height: 0.5rpx;
-  background-color: #efefef;
-  margin-top: 10rpx;
-}
-.input-account {
-  margin-top: 20rpx;
-  margin-bottom: 0rpx;
-  border-radius: 40rpx;
-  border: solid 0rpx #efefef;
-  height: 80rpx;
-  width: 100%;
-  background-size: 30rpx 30rpx;
-  background-position: 30rpx;
-}
-.input-yzcode {
-  margin-top: 20rpx;
-  margin-bottom: 0rpx;
-  border-radius: 40rpx;
-  border: solid 0rpx #efefef;
-  height: 80rpx;
-  width: 100%;
-  background-size: 30rpx 30rpx;
-  background-position: 30rpx;
-}
-.input-pwd {
-  margin-top: 40rpx;
-  margin-bottom: 20rpx;
-  border-radius: 40rpx;
-  border: solid 0rpx #efefef;
-  height: 80rpx;
-  width: 100%;
-  background-size: 30rpx 30rpx;
-  background-position: 30rpx;
-}
-input {
-  margin-left: 80rpx;
-  height: 80rpx;
-  line-height: 80rpx;
-}
-.footer {
-  color: #686866;
-  width: 100%;
-  position: fixed;
-  text-align: center;
-  bottom: 60rpx;
-  font-size: 28rpx;
-}
-.btns {
-  margin: 60rpx 0rpx;
-}
-.login-btn {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-  height: 80rpx;
-  background: linear-gradient(to right, #FF5C03 0%, #FF5C03 100%);
-  background: -moz-linear-gradient(to right, #FF5C03 0%, #FF5C03 100%);
-  box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
-  border-radius: 40rpx;
-  font-size: 30rpx;
-  font-family: PingFang SC;
-  font-weight: 500;
-  color: white;
-}
-.reg-box {
-  padding-bottom: 20rpx;
-  margin: 0 10px;
-}
-.reg-box .reg-btn {
-  font-size: 16px;
-  color: #FF5C03;
-}
-.pageBottom {
-  height: 260rpx;
-  width: 75%;
-  display: flex;
-  flex-direction: column;
-}
-.tips {
-  color: #999;
-  font-size: 36rpx;
-}
-.menu {
-  margin-top: 30rpx;
-}
-.menu image {
-  width: 78rpx;
-  height: 78rpx;
-}
+page{background-color:#fff}.content{display:flex;flex-direction:column;align-items:center;height:100vh;width:100%;justify-content:space-between}.pageTop{display:flex;flex-direction:column;width:100%}.content .head{text-align:center;width:100%;height:522rpx;background-size:cover;box-sizing:border-box}.content .head image{width:150rpx;height:150rpx;border-radius:10rpx;box-shadow:0 0 20rpx rgba(0,0,0,.2)}.title{color:#141414;margin:50rpx 0rpx 30rpx;font-size:38rpx;font-weight:500}.desc{color:#686866;padding:0 0 30rpx 0rpx;font-size:28rpx}.loginBox{padding:10px 10px 30rpx;width:calc(100% - 20px);margin-top:0rpx;background:#fdfdfd;border-radius:7rpx}.line{height:.5rpx;background-color:#efefef;margin-top:10rpx}.input-account,.input-yzcode{margin-top:20rpx;margin-bottom:0rpx;border-radius:40rpx;border:solid 0rpx #efefef;height:80rpx;width:100%;background-size:30rpx 30rpx;background-position:30rpx}.input-pwd{margin-top:40rpx;margin-bottom:20rpx;border-radius:40rpx;border:solid 0rpx #efefef;height:80rpx;width:100%;background-size:30rpx 30rpx;background-position:30rpx}input{margin-left:80rpx;height:80rpx;line-height:80rpx}.footer{color:#686866;width:100%;position:fixed;text-align:center;bottom:60rpx;font-size:28rpx}.btns{margin:60rpx 0rpx}.login-btn{display:flex;align-items:center;justify-content:center;width:100%;height:80rpx;background:linear-gradient(to right,#ff5c03,#ff5c03);background:-moz-linear-gradient(to right,#FF5C03 0%,#FF5C03 100%);box-shadow:0 7rpx 6rpx rgba(229,138,0,.22);border-radius:40rpx;font-size:30rpx;font-family:PingFang SC;font-weight:500;color:#fff}.reg-box{padding-bottom:20rpx;margin:0 10px}.reg-box .reg-btn{font-size:16px;color:#ff5c03}.pageBottom{height:260rpx;width:75%;display:flex;flex-direction:column}.tips{color:#999;font-size:36rpx}.menu{margin-top:30rpx}.menu image{width:78rpx;height:78rpx}

+ 1 - 88
unpackage/dist/dev/mp-weixin/pages/auth/h5WxLogin.js

@@ -1,88 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const api_login = require("../../api/login.js");
-const common_assets = require("../../common/assets.js");
-const isWechat = () => {
-  return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
-};
-const _sfc_main = {
-  data() {
-    return {
-      code: null
-    };
-  },
-  onLoad(option) {
-    this.getWechatCode();
-  },
-  onUnload() {
-  },
-  mounted() {
-  },
-  methods: {
-    loginByMp() {
-      if (this.code == null) {
-        return;
-      }
-      common_vendor.index.showLoading({
-        title: "处理中..."
-      });
-      let that = this;
-      var data = { code: this.code };
-      api_login.loginByWeChat(data).then(
-        (res) => {
-          common_vendor.index.hideLoading();
-          if (res.code == 200) {
-            common_vendor.index.setStorageSync("AppToken", res.token);
-            common_vendor.index.setStorageSync("userInfo", JSON.stringify(res.user));
-            common_vendor.index.$emit("refreshIM");
-            that.goToLanch();
-          } else {
-            common_vendor.index.showToast({ title: res.msg, icon: "none" });
-          }
-        },
-        (err) => {
-        }
-      );
-    },
-    getWechatCode() {
-      if (isWechat) {
-        let appid = "wx9ea36eecd281bcd3";
-        let code = this.getUrlCode().code;
-        let local = window.location.href;
-        if (code == null || code === "") {
-          window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodeURIComponent(local) + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
-        } else {
-          this.code = code;
-        }
-      }
-    },
-    getUrlCode() {
-      var url = location.search;
-      var theRequest = new Object();
-      if (url.indexOf("?") != -1) {
-        var str = url.substr(1);
-        var strs = str.split("&");
-        for (var i = 0; i < strs.length; i++) {
-          theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
-        }
-      }
-      console.log(theRequest);
-      return theRequest;
-    },
-    goToLanch() {
-      let beforLoginUrl = common_vendor.index.getStorageSync("beforLoginPage");
-      console.log("beforLoginUrl:" + beforLoginUrl);
-      common_vendor.index.reLaunch({
-        url: beforLoginUrl
-      });
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: common_assets._imports_0$5,
-    b: common_vendor.o(($event) => $options.loginByMp())
-  };
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
-wx.createPage(MiniProgramPage);
+"use strict";const n=require("../../common/vendor.js"),a=require("../../api/login.js"),s=require("../../common/assets.js"),d=()=>String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i))==="micromessenger",l={data(){return{code:null}},onLoad(e){this.getWechatCode()},onUnload(){},mounted(){},methods:{loginByMp(){if(this.code==null)return;n.index.showLoading({title:"处理中..."});let e=this;var o={code:this.code};a.loginByWeChat(o).then(t=>{n.index.hideLoading(),t.code==200?(n.index.setStorageSync("AppToken",t.token),n.index.setStorageSync("userInfo",JSON.stringify(t.user)),n.index.$emit("refreshIM"),e.goToLanch()):n.index.showToast({title:t.msg,icon:"none"})},t=>{})},getWechatCode(){if(d){let e="wx9ea36eecd281bcd3",o=this.getUrlCode().code,t=window.location.href;o==null||o===""?window.location.href="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+e+"&redirect_uri="+encodeURIComponent(t)+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect":this.code=o}},getUrlCode(){var e=location.search,o=new Object;if(e.indexOf("?")!=-1)for(var t=e.substr(1),i=t.split("&"),r=0;r<i.length;r++)o[i[r].split("=")[0]]=i[r].split("=")[1];return console.log(o),o},goToLanch(){let e=n.index.getStorageSync("beforLoginPage");console.log("beforLoginUrl:"+e),n.index.reLaunch({url:e})}}};function g(e,o,t,i,r,c){return{a:s._imports_0$5,b:n.o(u=>c.loginByMp())}}const h=n._export_sfc(l,[["render",g]]);wx.createPage(h);

+ 1 - 104
unpackage/dist/dev/mp-weixin/pages/auth/h5WxLogin.wxss

@@ -1,104 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-.container {
-  flex: 1;
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-start;
-  position: relative;
-}
-.force-login-wrap {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  z-index: 11111;
-  top: 0;
-}
-.force-login-wrap .force-login__content {
-  position: absolute;
-  left: 50%;
-  top: 40%;
-  transform: translate(-50%, -50%);
-}
-.force-login-wrap .force-login__content .logo {
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  align-items: center;
-}
-.force-login-wrap .force-login__content .logo .logo-img {
-  border: 4rpx solid #FFFFFF;
-  box-shadow: 0px 5px 15px 2px rgba(0, 0, 0, 0.1);
-  border-radius: 50%;
-  width: 80px;
-  height: 80px;
-}
-.force-login-wrap .force-login__content .logo .logo-img image {
-  border-radius: 50%;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-}
-.force-login-wrap .force-login__content .logo .title {
-  margin-top: 20rpx;
-  font-size: 35rpx;
-  font-family: PingFang SC;
-  font-weight: bold;
-  color: #000;
-  margin-bottom: 30rpx;
-}
-.force-login-wrap .force-login__content .login-notice {
-  font-size: 28rpx;
-  font-family: PingFang SC;
-  font-weight: 400;
-  color: #000;
-  line-height: 44rpx;
-  width: 500rpx;
-  text-align: center;
-  margin-bottom: 80rpx;
-}
-.force-login-wrap .force-login__content .btns {
-  position: relative;
-  width: 630rpx;
-  height: 80rpx;
-}
-.force-login-wrap .force-login__content .btns .author-btn {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  z-index: 100;
-  position: absolute;
-  width: 630rpx;
-  height: 80rpx;
-  background: linear-gradient(to right, #FF5C03 0%, #E2C99E 100%);
-  background: -moz-linear-gradient(to right, #FF5C03 0%, #E2C99E 100%);
-  border-radius: 40rpx;
-  font-size: 30rpx;
-  font-family: PingFang SC;
-  font-weight: 500;
-  color: white;
-}
+.container{flex:1;display:flex;flex-direction:column;justify-content:flex-start;position:relative}.force-login-wrap{width:100%;height:100%;overflow:hidden;z-index:11111;top:0}.force-login-wrap .force-login__content{position:absolute;left:50%;top:40%;transform:translate(-50%,-50%)}.force-login-wrap .force-login__content .logo{display:flex;flex-direction:column;justify-content:center;align-items:center}.force-login-wrap .force-login__content .logo .logo-img{border:4rpx solid #FFFFFF;box-shadow:0 5px 15px 2px rgba(0,0,0,.1);border-radius:50%;width:80px;height:80px}.force-login-wrap .force-login__content .logo .logo-img image{border-radius:50%;width:100%;height:100%;overflow:hidden}.force-login-wrap .force-login__content .logo .title{margin-top:20rpx;font-size:35rpx;font-family:PingFang SC;font-weight:700;color:#000;margin-bottom:30rpx}.force-login-wrap .force-login__content .login-notice{font-size:28rpx;font-family:PingFang SC;font-weight:400;color:#000;line-height:44rpx;width:500rpx;text-align:center;margin-bottom:80rpx}.force-login-wrap .force-login__content .btns{position:relative;width:630rpx;height:80rpx}.force-login-wrap .force-login__content .btns .author-btn{display:flex;justify-content:center;align-items:center;z-index:100;position:absolute;width:630rpx;height:80rpx;background:linear-gradient(to right,#ff5c03,#e2c99e);background:-moz-linear-gradient(to right,#FF5C03 0%,#E2C99E 100%);border-radius:40rpx;font-size:30rpx;font-family:PingFang SC;font-weight:500;color:#fff}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 456
unpackage/dist/dev/mp-weixin/pages/auth/login.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 113
unpackage/dist/dev/mp-weixin/pages/auth/login.wxss


+ 1 - 103
unpackage/dist/dev/mp-weixin/pages/auth/loginIndex.js

@@ -1,103 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-require("../../api/login.js");
-const common_assets = require("../../common/assets.js");
-const _sfc_main = {
-  data() {
-    return {
-      btnLoading: false,
-      agree: false
-    };
-  },
-  onLoad() {
-    if (!this.$isLogin()) {
-      let pages = getCurrentPages();
-      let url = pages[pages.length - 3];
-      if (pages.length > 2 && url && (url.route == "pages/auth/login" || url.route == "pages/auth/loginIndex" || url.route == "pages/common/launch")) {
-        common_vendor.index.navigateBack({
-          delta: 2
-        });
-      } else {
-        if (String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger") {
-          const pages2 = getCurrentPages();
-          if (pages2.length > 1) {
-            const url2 = pages2[pages2.length - 2];
-            const options = url2.options;
-            if (options && JSON.stringify(options) != "{}") {
-              let allurl = "/" + url2.route + common_vendor.index.$u.queryParams(options);
-              common_vendor.index.setStorageSync("beforLoginPage", allurl);
-            } else {
-              common_vendor.index.setStorageSync("beforLoginPage", "/" + url2.route);
-            }
-            common_vendor.index.redirectTo({
-              url: "/pages/auth/h5WxLogin"
-            });
-          } else {
-            this.submit();
-          }
-        } else {
-          common_vendor.index.redirectTo({
-            url: "/pages/auth/login"
-          });
-        }
-      }
-    }
-  },
-  onShow() {
-    if (this.$isLogin()) {
-      common_vendor.index.reLaunch({
-        url: "../course/index",
-        //url: '../course/video/living-app',
-        animationType: "none",
-        animationDuration: 2e3
-      });
-    }
-  },
-  methods: {
-    goToWeb(index) {
-      common_vendor.index.setStorageSync("url", index == 0 ? "https://userapp.his.cdwjyyh.com/web/userAgreement" : "https://userapp.his.cdwjyyh.com/web/privacyPolicy");
-      common_vendor.index.navigateTo({
-        url: "/pages/index/h5"
-      });
-    },
-    // 同意
-    handleAgree() {
-      this.agree = !this.agree;
-    },
-    // login
-    submit() {
-      this.$showLoginPage();
-    },
-    handleOtherLogin() {
-      common_vendor.index.redirectTo({
-        url: "/pages/auth/login"
-      });
-    },
-    // 关闭弹窗
-    close(val) {
-      this.$refs.popup.close();
-      if (val == "agree") {
-        this.agree = true;
-        this.submit();
-      }
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: $data.btnLoading,
-    b: $data.btnLoading,
-    c: common_vendor.o((...args) => $options.submit && $options.submit(...args)),
-    d: $data.btnLoading,
-    e: common_vendor.o((...args) => $options.handleOtherLogin && $options.handleOtherLogin(...args)),
-    f: common_assets._imports_0$6,
-    g: !$data.agree,
-    h: common_assets._imports_1$5,
-    i: $data.agree,
-    j: common_vendor.o((...args) => $options.handleAgree && $options.handleAgree(...args)),
-    k: common_vendor.o(($event) => $options.goToWeb(0)),
-    l: common_vendor.o(($event) => $options.goToWeb(1))
-  };
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-648b5fa7"]]);
-wx.createPage(MiniProgramPage);
+"use strict";const e=require("../../common/vendor.js");require("../../api/login.js");const g=require("../../common/assets.js"),u={data(){return{btnLoading:!1,agree:!1}},onLoad(){if(!this.$isLogin()){let t=getCurrentPages(),o=t[t.length-3];if(t.length>2&&o&&(o.route=="pages/auth/login"||o.route=="pages/auth/loginIndex"||o.route=="pages/common/launch"))e.index.navigateBack({delta:2});else if(String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i))==="micromessenger"){const s=getCurrentPages();if(s.length>1){const a=s[s.length-2],n=a.options;if(n&&JSON.stringify(n)!="{}"){let r="/"+a.route+e.index.$u.queryParams(n);e.index.setStorageSync("beforLoginPage",r)}else e.index.setStorageSync("beforLoginPage","/"+a.route);e.index.redirectTo({url:"/pages/auth/h5WxLogin"})}else this.submit()}else e.index.redirectTo({url:"/pages/auth/login"})}},onShow(){this.$isLogin()&&e.index.reLaunch({url:"../course/index",animationType:"none",animationDuration:2e3})},methods:{goToWeb(t){e.index.setStorageSync("url",t==0?"https://userapp.his.cdwjyyh.com/web/userAgreement":"https://userapp.his.cdwjyyh.com/web/privacyPolicy"),e.index.navigateTo({url:"/pages/index/h5"})},handleAgree(){this.agree=!this.agree},submit(){this.$showLoginPage()},handleOtherLogin(){e.index.redirectTo({url:"/pages/auth/login"})},close(t){this.$refs.popup.close(),t=="agree"&&(this.agree=!0,this.submit())}}};function h(t,o,s,a,n,r){return{a:n.btnLoading,b:n.btnLoading,c:e.o((...i)=>r.submit&&r.submit(...i)),d:n.btnLoading,e:e.o((...i)=>r.handleOtherLogin&&r.handleOtherLogin(...i)),f:g._imports_0$6,g:!n.agree,h:g._imports_1$5,i:n.agree,j:e.o((...i)=>r.handleAgree&&r.handleAgree(...i)),k:e.o(i=>r.goToWeb(0)),l:e.o(i=>r.goToWeb(1))}}const c=e._export_sfc(u,[["render",h],["__scopeId","data-v-648b5fa7"]]);wx.createPage(c);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 156
unpackage/dist/dev/mp-weixin/pages/auth/loginIndex.wxss


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 150
unpackage/dist/dev/mp-weixin/pages/auth/register.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 193
unpackage/dist/dev/mp-weixin/pages/auth/register.wxss


+ 1 - 13
unpackage/dist/dev/mp-weixin/pages/games/index.js

@@ -1,13 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const _sfc_main = {
-  data() {
-    return {};
-  },
-  methods: {}
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {};
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
-wx.createPage(MiniProgramPage);
+"use strict";const e=require("../../common/vendor.js"),r={data(){return{}},methods:{}};function t(c,o,s,a,_,i){return{}}const n=e._export_sfc(r,[["render",t]]);wx.createPage(n);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 203
unpackage/dist/dev/mp-weixin/pages/home/index.js


+ 1 - 57
unpackage/dist/dev/mp-weixin/pages/home/index.wxss

@@ -1,57 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-page.data-v-4978fed5 {
-  background-color: #fff;
-}
-.jianjie.data-v-4978fed5 {
-  font-size: 32rpx;
-  width: -webkit-fit-content;
-  width: fit-content;
-  border-bottom: #2962FE solid 4rpx;
-}
-.detail.data-v-4978fed5 {
-  border-top: solid #f5f5f5 12rpx;
-}
-.bot-box.data-v-4978fed5 {
-  border-top: #f5f5f5 solid 2rpx;
-  position: fixed;
-  bottom: 0;
-  width: 100%;
-}
-.bot-box view.data-v-4978fed5 {
-  width: 80%;
-  margin: 0 auto;
-  height: 80rpx;
-  display: flex;
-  align-items: center;
-  background-color: #5895F7;
-  color: #fff;
-  border-radius: 100rpx;
-}
-.addchat.data-v-4978fed5 {
-  height: 450rpx;
-}
+page.data-v-4978fed5{background-color:#fff}.jianjie.data-v-4978fed5{font-size:32rpx;width:-webkit-fit-content;width:fit-content;border-bottom:#2962FE solid 4rpx}.detail.data-v-4978fed5{border-top:solid #f5f5f5 12rpx}.bot-box.data-v-4978fed5{border-top:#f5f5f5 solid 2rpx;position:fixed;bottom:0;width:100%}.bot-box view.data-v-4978fed5{width:80%;margin:0 auto;height:80rpx;display:flex;align-items:center;background-color:#5895f7;color:#fff;border-radius:100rpx}.addchat.data-v-4978fed5{height:450rpx}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 405
unpackage/dist/dev/mp-weixin/pages/home/live.js


+ 1 - 156
unpackage/dist/dev/mp-weixin/pages/home/live.wxss

@@ -1,156 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-.welcome-message.data-v-81fcd0c9 {
-  position: fixed;
-  width: 100%;
-  bottom: 120rpx;
-  left: 50%;
-  transform: translateX(-50%);
-  color: #666;
-  padding: 10px 20px;
-  border-radius: 20px;
-  animation: fadeOut-81fcd0c9 1s ease 1s forwards;
-  /* 1秒后开始淡出 */
-  z-index: 1000;
-}
-@keyframes fadeOut-81fcd0c9 {
-from {
-    opacity: 1;
-}
-to {
-    opacity: 0;
-}
-}
-.live.data-v-81fcd0c9 {
-  height: 100%;
-  overflow: hidden;
-}
-.list.data-v-81fcd0c9 {
-  width: 80%;
-  margin-bottom: 20rpx;
-  animation: xxxawdawd-81fcd0c9 0.2s;
-}
-@keyframes xxxawdawd-81fcd0c9 {
-from {
-    margin-top: 0rpx;
-    opacity: 0;
-}
-to {
-    margin-top: 20rpx;
-    opacity: 1;
-}
-}
-.vedio.data-v-81fcd0c9 {
-  height: 500rpx;
-  width: 100%;
-  background-color: rgba(0, 0, 0, 0.6);
-  position: relative;
-}
-.videotop.data-v-81fcd0c9 {
-  width: 100%;
-  height: 100%;
-}
-.popup-video.data-v-81fcd0c9 {
-  position: absolute;
-  top: 0;
-  height: 500rpx;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-  color: #fff;
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.popup-video .more.data-v-81fcd0c9 {
-  background-color: #3280fe;
-  border-radius: 80rpx;
-  width: 280rpx;
-  text-align: center;
-  height: 60rpx;
-  line-height: 60rpx;
-}
-.textscll.data-v-81fcd0c9 {
-  position: absolute;
-  top: 0;
-  z-index: 999;
-}
-.reflash.data-v-81fcd0c9 {
-  border: 2rpx solid #888;
-  border-radius: 80rpx;
-  padding: 4rpx 16rpx;
-  color: #888;
-}
-.talktext.data-v-81fcd0c9 {
-  border-radius: 8rpx;
-}
-.talktext view.data-v-81fcd0c9 {
-  width: 100%;
-}
-.bot_talk.data-v-81fcd0c9 {
-  width: calc(100% - 40rpx);
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  position: fixed;
-  bottom: 0;
-  padding: 20rpx;
-}
-.bot_talk .sent.data-v-81fcd0c9 {
-  width: 120rpx;
-  text-align: center;
-  height: 60rpx;
-  line-height: 60rpx;
-  background-color: #3280fe;
-  color: #fff;
-  border-radius: 40rpx;
-  font-size: 24rpx;
-}
-.invite-member.data-v-81fcd0c9 {
-  height: 55px;
-  width: 50px;
-  position: fixed;
-  bottom: 80px;
-  right: 10px;
-  cursor: pointer;
-}
-.invite-member .weimg.data-v-81fcd0c9 {
-  position: relative;
-}
-.invite-member .addwe.data-v-81fcd0c9 {
-  position: absolute;
-  left: -7%;
-  bottom: 4rpx;
-  color: #fff;
-  background-color: #fc285c;
-  font-size: 24rpx;
-  border-radius: 20rpx;
-  padding: 4rpx 12rpx;
-}
-.addchat.data-v-81fcd0c9 {
-  height: 450rpx;
-}
+.welcome-message.data-v-81fcd0c9{position:fixed;width:100%;bottom:120rpx;left:50%;transform:translate(-50%);color:#666;padding:10px 20px;border-radius:20px;animation:fadeOut-81fcd0c9 1s ease 1s forwards;z-index:1000}@keyframes fadeOut-81fcd0c9{0%{opacity:1}to{opacity:0}}.live.data-v-81fcd0c9{height:100%;overflow:hidden}.list.data-v-81fcd0c9{width:80%;margin-bottom:20rpx;animation:xxxawdawd-81fcd0c9 .2s}@keyframes xxxawdawd-81fcd0c9{0%{margin-top:0rpx;opacity:0}to{margin-top:20rpx;opacity:1}}.vedio.data-v-81fcd0c9{height:500rpx;width:100%;background-color:rgba(0,0,0,.6);position:relative}.videotop.data-v-81fcd0c9{width:100%;height:100%}.popup-video.data-v-81fcd0c9{position:absolute;top:0;height:500rpx;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;color:#fff;background-color:rgba(0,0,0,.6)}.popup-video .more.data-v-81fcd0c9{background-color:#3280fe;border-radius:80rpx;width:280rpx;text-align:center;height:60rpx;line-height:60rpx}.textscll.data-v-81fcd0c9{position:absolute;top:0;z-index:999}.reflash.data-v-81fcd0c9{border:2rpx solid #888;border-radius:80rpx;padding:4rpx 16rpx;color:#888}.talktext.data-v-81fcd0c9{border-radius:8rpx}.talktext view.data-v-81fcd0c9{width:100%}.bot_talk.data-v-81fcd0c9{width:calc(100% - 40rpx);display:flex;justify-content:space-between;align-items:center;position:fixed;bottom:0;padding:20rpx}.bot_talk .sent.data-v-81fcd0c9{width:120rpx;text-align:center;height:60rpx;line-height:60rpx;background-color:#3280fe;color:#fff;border-radius:40rpx;font-size:24rpx}.invite-member.data-v-81fcd0c9{height:55px;width:50px;position:fixed;bottom:80px;right:10px;cursor:pointer}.invite-member .weimg.data-v-81fcd0c9{position:relative}.invite-member .addwe.data-v-81fcd0c9{position:absolute;left:-7%;bottom:4rpx;color:#fff;background-color:#fc285c;font-size:24rpx;border-radius:20rpx;padding:4rpx 12rpx}.addchat.data-v-81fcd0c9{height:450rpx}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 1248
unpackage/dist/dev/mp-weixin/pages/home/living.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/home/living.wxml


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 392
unpackage/dist/dev/mp-weixin/pages/home/living.wxss


+ 1 - 62
unpackage/dist/dev/mp-weixin/pages/list/index.js

@@ -1,62 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const api_list = require("../../api/list.js");
-const _sfc_main = {
-  data() {
-    return {
-      list: null,
-      liveId: null
-    };
-  },
-  onLoad(option) {
-    this.getList();
-  },
-  methods: {
-    goLive(item) {
-      this.liveId = item.liveId;
-      console.log("要传的liveId", this.liveId);
-      common_vendor.index.navigateTo({
-        url: "/pages/home/living?liveId=" + this.liveId
-        // url: `/pages/home/living?liveId=${encodeURIComponent(JSON.stringify(liveId))}`
-      });
-    },
-    getList() {
-      const data = {
-        page: 1,
-        page_size: 10
-      };
-      common_vendor.index.showLoading({
-        title: "处理中..."
-      });
-      api_list.liveList(data).then((res) => {
-        if (res.code == 200) {
-          this.list = res.rows;
-          console.log("list>>", this.list);
-        } else {
-          common_vendor.index.showToast({
-            title: res.msg,
-            icon: "none"
-          });
-        }
-      }).catch((rej) => {
-        console.log("请求失败:", JSON.stringify(rej));
-      }).finally(() => {
-        common_vendor.index.hideLoading();
-      });
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: common_vendor.f($data.list, (item, index, i0) => {
-      return {
-        a: item.liveImgUrl,
-        b: common_vendor.t(item.liveName),
-        c: common_vendor.o(($event) => $options.goLive(item), index),
-        d: index
-      };
-    })
-  };
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-7bd28468"]]);
-wx.createPage(MiniProgramPage);
+"use strict";const e=require("../../common/vendor.js"),a=require("../../api/list.js"),d={data(){return{list:null,liveId:null}},onLoad(t){this.getList()},methods:{goLive(t){this.liveId=t.liveId,console.log("要传的liveId",this.liveId),e.index.navigateTo({url:"/pages/home/living?liveId="+this.liveId})},getList(){const t={page:1,page_size:10};e.index.showLoading({title:"处理中..."}),a.liveList(t).then(i=>{i.code==200?(this.list=i.rows,console.log("list>>",this.list)):e.index.showToast({title:i.msg,icon:"none"})}).catch(i=>{console.log("请求失败:",JSON.stringify(i))}).finally(()=>{e.index.hideLoading()})}}};function c(t,i,g,v,n,l){return{a:e.f(n.list,(o,s,h)=>({a:o.liveImgUrl,b:e.t(o.liveName),c:e.o(_=>l.goLive(o),s),d:s}))}}const r=e._export_sfc(d,[["render",c],["__scopeId","data-v-7bd28468"]]);wx.createPage(r);

+ 1 - 56
unpackage/dist/dev/mp-weixin/pages/list/index.wxss

@@ -1,56 +1 @@
-/**
- * 这里是uni-app内置的常用样式变量
- *
- * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
- * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
- *
- */
-/**
- * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
- *
- * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
- */
-/* 颜色变量 */
-/* 行为相关颜色 */
-/* 文字基本颜色 */
-/* 背景颜色 */
-/* 边框颜色 */
-/* 尺寸变量 */
-/* 文字尺寸 */
-/* 图片尺寸 */
-/* Border Radius */
-/* 水平间距 */
-/* 垂直间距 */
-/* 透明度 */
-/* 文章场景相关 */
-/*自定义主题色 */
-.content.data-v-7bd28468 {
-  background-color: #111;
-  min-height: 100vh;
-  padding: 24rpx;
-}
-.content .list.data-v-7bd28468 {
-  display: flex;
-  justify-content: space-between;
-  flex-wrap: wrap;
-}
-.content .list .list-item.data-v-7bd28468 {
-  border-radius: 16rpx;
-  width: 340rpx;
-  height: 600rpx;
-  background-color: #0082f4;
-  margin-right: 10rpx;
-  margin-bottom: 24rpx;
-  overflow: hidden;
-  position: relative;
-}
-.content .list .list-item .info.data-v-7bd28468 {
-  position: absolute;
-  left: 20rpx;
-  bottom: 14rpx;
-  color: #ffffff;
-}
-.content .list .list-item image.data-v-7bd28468 {
-  width: 100%;
-  height: 100%;
-}
+.content.data-v-7bd28468{background-color:#111;min-height:100vh;padding:24rpx}.content .list.data-v-7bd28468{display:flex;justify-content:space-between;flex-wrap:wrap}.content .list .list-item.data-v-7bd28468{border-radius:16rpx;width:340rpx;height:600rpx;background-color:#0082f4;margin-right:10rpx;margin-bottom:24rpx;overflow:hidden;position:relative}.content .list .list-item .info.data-v-7bd28468{position:absolute;left:20rpx;bottom:14rpx;color:#fff}.content .list .list-item image.data-v-7bd28468{width:100%;height:100%}

+ 1 - 8
unpackage/dist/dev/mp-weixin/pages/user/index.js

@@ -1,8 +1 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const _sfc_main = {};
-function _sfc_render(_ctx, _cache) {
-  return {};
-}
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
-wx.createPage(MiniProgramPage);
+"use strict";const e=require("../../common/vendor.js"),r={};function c(t,o){return{}}const n=e._export_sfc(r,[["render",c]]);wx.createPage(n);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 260
unpackage/dist/dev/mp-weixin/pages_shop/cart.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 241
unpackage/dist/dev/mp-weixin/pages_shop/cart.wxss


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels