Browse Source

6月18日推送

db 3 years ago
parent
commit
a7941a7023
100 changed files with 3980 additions and 442 deletions
  1. BIN
      .DS_Store
  2. 143 0
      components/modalDialog.vue
  3. 22 0
      config/api.js
  4. 39 7
      pages.json
  5. 692 0
      pages/activity/activity.vue
  6. 173 0
      pages/activityDetail/activityDetail.vue
  7. 2 2
      pages/reportDetail/reportDetail.vue
  8. 483 433
      pages/reportForm/reportForm.vue
  9. BIN
      wxcomponents/.DS_Store
  10. BIN
      wxcomponents/vant/.DS_Store
  11. 0 0
      wxcomponents/vant/dist/action-sheet/index.d.ts
  12. 70 0
      wxcomponents/vant/dist/action-sheet/index.js
  13. 8 0
      wxcomponents/vant/dist/action-sheet/index.json
  14. 69 0
      wxcomponents/vant/dist/action-sheet/index.wxml
  15. 0 0
      wxcomponents/vant/dist/action-sheet/index.wxss
  16. 0 0
      wxcomponents/vant/dist/area/index.d.ts
  17. 235 0
      wxcomponents/vant/dist/area/index.js
  18. 6 0
      wxcomponents/vant/dist/area/index.json
  19. 20 0
      wxcomponents/vant/dist/area/index.wxml
  20. 8 0
      wxcomponents/vant/dist/area/index.wxs
  21. 1 0
      wxcomponents/vant/dist/area/index.wxss
  22. 0 0
      wxcomponents/vant/dist/button/index.d.ts
  23. 63 0
      wxcomponents/vant/dist/button/index.js
  24. 7 0
      wxcomponents/vant/dist/button/index.json
  25. 53 0
      wxcomponents/vant/dist/button/index.wxml
  26. 39 0
      wxcomponents/vant/dist/button/index.wxs
  27. 0 0
      wxcomponents/vant/dist/button/index.wxss
  28. 67 0
      wxcomponents/vant/dist/calendar/calendar.wxml
  29. 1 0
      wxcomponents/vant/dist/calendar/components/header/index.d.ts
  30. 34 0
      wxcomponents/vant/dist/calendar/components/header/index.js
  31. 0 0
      wxcomponents/vant/dist/calendar/components/header/index.json
  32. 16 0
      wxcomponents/vant/dist/calendar/components/header/index.wxml
  33. 1 0
      wxcomponents/vant/dist/calendar/components/header/index.wxss
  34. 1 0
      wxcomponents/vant/dist/calendar/components/month/index.d.ts
  35. 163 0
      wxcomponents/vant/dist/calendar/components/month/index.js
  36. 3 0
      wxcomponents/vant/dist/calendar/components/month/index.json
  37. 39 0
      wxcomponents/vant/dist/calendar/components/month/index.wxml
  38. 71 0
      wxcomponents/vant/dist/calendar/components/month/index.wxs
  39. 0 0
      wxcomponents/vant/dist/calendar/components/month/index.wxss
  40. 1 0
      wxcomponents/vant/dist/calendar/index.d.ts
  41. 309 0
      wxcomponents/vant/dist/calendar/index.js
  42. 10 0
      wxcomponents/vant/dist/calendar/index.json
  43. 25 0
      wxcomponents/vant/dist/calendar/index.wxml
  44. 37 0
      wxcomponents/vant/dist/calendar/index.wxs
  45. 1 0
      wxcomponents/vant/dist/calendar/index.wxss
  46. 17 0
      wxcomponents/vant/dist/calendar/utils.d.ts
  47. 78 0
      wxcomponents/vant/dist/calendar/utils.js
  48. 25 0
      wxcomponents/vant/dist/calendar/utils.wxs
  49. 1 0
      wxcomponents/vant/dist/card/index.d.ts
  50. 49 0
      wxcomponents/vant/dist/card/index.js
  51. 6 0
      wxcomponents/vant/dist/card/index.json
  52. 56 0
      wxcomponents/vant/dist/card/index.wxml
  53. 0 0
      wxcomponents/vant/dist/card/index.wxss
  54. 1 0
      wxcomponents/vant/dist/cell-group/index.d.ts
  55. 10 0
      wxcomponents/vant/dist/cell-group/index.js
  56. 3 0
      wxcomponents/vant/dist/cell-group/index.json
  57. 9 0
      wxcomponents/vant/dist/cell-group/index.wxml
  58. 1 0
      wxcomponents/vant/dist/cell-group/index.wxss
  59. 1 0
      wxcomponents/vant/dist/cell/index.d.ts
  60. 38 0
      wxcomponents/vant/dist/cell/index.js
  61. 6 0
      wxcomponents/vant/dist/cell/index.json
  62. 47 0
      wxcomponents/vant/dist/cell/index.wxml
  63. 17 0
      wxcomponents/vant/dist/cell/index.wxs
  64. 0 0
      wxcomponents/vant/dist/cell/index.wxss
  65. 1 0
      wxcomponents/vant/dist/checkbox-group/index.d.ts
  66. 31 0
      wxcomponents/vant/dist/checkbox-group/index.js
  67. 3 0
      wxcomponents/vant/dist/checkbox-group/index.json
  68. 1 0
      wxcomponents/vant/dist/checkbox-group/index.wxml
  69. 1 0
      wxcomponents/vant/dist/checkbox-group/index.wxss
  70. 1 0
      wxcomponents/vant/dist/checkbox/index.d.ts
  71. 74 0
      wxcomponents/vant/dist/checkbox/index.js
  72. 6 0
      wxcomponents/vant/dist/checkbox/index.json
  73. 31 0
      wxcomponents/vant/dist/checkbox/index.wxml
  74. 20 0
      wxcomponents/vant/dist/checkbox/index.wxs
  75. 1 0
      wxcomponents/vant/dist/checkbox/index.wxss
  76. 6 0
      wxcomponents/vant/dist/circle/canvas.d.ts
  77. 43 0
      wxcomponents/vant/dist/circle/canvas.js
  78. 1 0
      wxcomponents/vant/dist/circle/index.d.ts
  79. 190 0
      wxcomponents/vant/dist/circle/index.js
  80. 3 0
      wxcomponents/vant/dist/circle/index.json
  81. 9 0
      wxcomponents/vant/dist/circle/index.wxml
  82. 1 0
      wxcomponents/vant/dist/circle/index.wxss
  83. 1 0
      wxcomponents/vant/dist/col/index.d.ts
  84. 9 0
      wxcomponents/vant/dist/col/index.js
  85. 3 0
      wxcomponents/vant/dist/col/index.json
  86. 9 0
      wxcomponents/vant/dist/col/index.wxml
  87. 18 0
      wxcomponents/vant/dist/col/index.wxs
  88. 1 0
      wxcomponents/vant/dist/col/index.wxss
  89. 6 0
      wxcomponents/vant/dist/collapse-item/animate.d.ts
  90. 70 0
      wxcomponents/vant/dist/collapse-item/animate.js
  91. 1 0
      wxcomponents/vant/dist/collapse-item/index.d.ts
  92. 59 0
      wxcomponents/vant/dist/collapse-item/index.js
  93. 6 0
      wxcomponents/vant/dist/collapse-item/index.json
  94. 44 0
      wxcomponents/vant/dist/collapse-item/index.wxml
  95. 1 0
      wxcomponents/vant/dist/collapse-item/index.wxss
  96. 1 0
      wxcomponents/vant/dist/collapse/index.d.ts
  97. 44 0
      wxcomponents/vant/dist/collapse/index.js
  98. 3 0
      wxcomponents/vant/dist/collapse/index.json
  99. 3 0
      wxcomponents/vant/dist/collapse/index.wxml
  100. 1 0
      wxcomponents/vant/dist/collapse/index.wxss

BIN
.DS_Store


+ 143 - 0
components/modalDialog.vue

@@ -0,0 +1,143 @@
+<template>
+	<view>
+			<u-modal v-model="show" :content="content" :content-style="{fontSize: '32rpx'}" @confirm="contentBtn" :show-title="false"></u-modal>
+			<u-modal v-model="goFollowShow" :content-style="{fontSize: '32rpx'}" @confirm="goFollowShowBtn" :show-cancel-button="true" confirm-text="去关注" @cancel="cancel" :show-title="false" :cancel-style="{borderRight:'1rpx solid #EBEBEB'}">
+				<view class="slot-content">
+								<rich-text :nodes="accounts"></rich-text>
+							</view>
+			</u-modal>
+						<u-modal v-model="cancelShow" :content="canceltext" :content-style="{fontSize: '32rpx',lineHeight: '80rpx'}"  @confirm="cancelShowBtn" @cancel="cancelBtn" :show-title="false" :show-cancel-button="true" :cancel-style="{borderRight:'1rpx solid #EBEBEB'}"></u-modal>
+	</view>
+</template>
+
+<script>
+	import {activity} from "@/config/api.js"
+	export default {
+		data() {
+			return {
+				goFollowShow:false,
+				show: false,
+				cancelShow:false,
+				content: '',
+				accounts:'',
+				canceltext:''
+			}
+		},
+		props:{
+			isShow:{
+				type:Boolean,
+				default:false
+			},
+			signupType:{
+				type:Number,
+			},
+			signupStatus:{
+				type:String
+			},
+			goFollow:{
+				type:Boolean
+			},
+			isCancelShow:{
+				type:Boolean,
+				default:false
+			},
+			idTypeCancel:{
+				type:Object
+			}
+		},
+		watch:{
+			goFollow(){
+				this.goFollowShow=this.goFollow
+			},
+			isShow(){
+				this.show=this.isShow
+			},
+			signupType(){
+				// if(this.signupStatus!=='Success') return
+					if(this.signupType==1){
+						this.content='预约成功,已加入您的活动日程'
+						this.accounts=`
+					预约成功,已加入您的活动日程<br/><br/>
+					
+					关注【弘则研究】公众号,及时获取活动时间变更通知
+				`
+					}else {
+						this.content='报名成功,已加入您的活动日程'
+						this.accounts=`
+							报名成功,已加入您的活动日程<br/><br/>
+							
+							关注【弘则研究】公众号,及时获取活动时间变更通知
+						`
+					}
+					
+			},
+			signupStatus(){
+				if(this.signupStatus=='FullStarffed') {
+					this.content='此活动报名人数已满,请留意下期活动'
+				}else if (this.signupStatus=='TwoPeople'){
+					this.content='单机构最多2人报名同一活动,您所在机构报名人数已满'
+				}else if (this.signupStatus=='BreakPromise'){
+					this.content='由于爽约次数过多,您暂时被限制报名资格'
+				}else if (this.signupStatus=='Overtime'){
+					this.content='活动开始前1小时内无法预约,请联系对口销售处理'
+				}
+			},
+			'idTypeCancel.type':{
+				 handler: function() {
+				if(this.idTypeCancel.type==1) {
+					this.canceltext="您要取消此次活动预约外呼吗?"
+				}else {
+					this.canceltext="您要取消此次活动预约报名吗?"
+				}
+				},
+				 deep: true
+			},
+			isCancelShow(){
+				this.cancelShow=this.isCancelShow
+			}
+		},
+		methods: {
+			contentBtn(){
+				this.$parent.isShow=false
+				this.show=false
+			},
+			goFollowShowBtn(){
+				this.$parent.goFollow=false
+				this.goFollowShow=false
+			},
+			cancel(){
+				this.$parent.goFollow=false
+				this.goFollowShow=false
+			},
+			cancelBtn(){
+				this.$parent.isCancelShow=false
+				this.cancelShow=false
+			},
+			cancelShowBtn(){
+				activity.signupCancel({
+					ActivityId:this.idTypeCancel.id,
+					SignupType:this.idTypeCancel.type,
+				}).then(res=>{
+					if(res.Ret==200){
+						console.log(res);
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.slot-content {
+			width: 100%;
+			padding: 50rpx;
+			text-align: center;
+			font-size: 32rpx;
+			color: #0F1826;
+			line-height: 48rpx;
+			
+		}
+		.u-model__footer__button.data-v-3626fcec {
+			border-right: 1rpx solid #333;
+		}
+</style>

+ 22 - 0
config/api.js

@@ -176,4 +176,26 @@ export const Reports = {
 	addStopTime: params => {
 		return postHttp('/article/addStopTime',params,0)
 	},
+}
+export const activity ={
+	/* 获取活动列表接口*/
+	getActivityList: params => {
+		return getHttp('/activity/list',params)
+	},
+	/* 获取活动列表接口*/
+	getActivityDetail: params => {
+		return getHttp('/activity/detail',params)
+	},
+	/* 获取活动详情接口*/
+	getUserSearchContent: params => {
+		return getHttp('/activity/getUserSearchContent',params)
+	},
+	/* 活动报名接口*/
+	signupAdd: params => {
+		return postHttp('/activity/signup/add',params)
+	},
+	/* 活动取消报名接口*/
+	signupCancel: params => {
+		return postHttp('/activity/signup/cancel',params)
+	},
 }

+ 39 - 7
pages.json

@@ -22,10 +22,23 @@
     	"path": "pages/reportForm/reportForm",
     	"style": {
     		"navigationBarTitleText": "报告",
-    		 "enablePullDownRefresh":true
+    		 "enablePullDownRefresh":true,
+			  "usingComponents": {
+			 			 "van-dropdown-menu": "/wxcomponents/vant/dist/dropdown-menu/index",
+			 			 "van-dropdown-item": "/wxcomponents/vant/dist/dropdown-item/index"
+			 }
     		
     	}
     },
+	{
+	    "path" : "pages/activity/activity",
+	    "style" :                                                                                    
+	    {
+	        "navigationBarTitleText": "活动",
+	        "enablePullDownRefresh": true
+	    }
+	    
+	},
 		{
             "path" : "pages/search/search",
             "style" : {
@@ -128,18 +141,30 @@
                 "navigationBarTitleText": "搜索"
             }
             
-        }
+        },
+		{
+		    "path" : "pages/activityDetail/activityDetail",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "活动详情",
+				"usingComponents": {
+				  "van-notice-bar": "/wxcomponents/vant/dist/notice-bar/index"
+				}
+		    }
+		    
+		}
     ],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "弘则研究",
 		"navigationBarBackgroundColor": "#fff",
 		"backgroundColor": "#F8F8F8",
-		"backgroundTextStyle":"dark"
-		// "usingComponents": {
-		//   "van-dropdown-menu": "vantComponents/vant/dropdown-menu/index",
-		//   "van-dropdown-item": "vantComponents/vant/dropdown-item/index"
-		// }
+		"backgroundTextStyle":"dark",
+			"usingComponents": {
+				  "van-dropdown-menu": "/wxcomponents/vant/dist/dropdown-menu/index",
+				  "van-dropdown-item": "/wxcomponents/vant/dist/dropdown-item/index",
+				   "van-notice-bar": "/wxcomponents/vant/dist/notice-bar/index"
+				}
 	},
 	"tabBar": {
 		"color": "#D0CFD5",
@@ -157,12 +182,19 @@
       		"iconPath": "static/img/tab/report_ico.png",
       		"selectedIconPath": "static/img/tab/report_actico.png"
       	},
+		{
+			"pagePath": "pages/activity/activity",
+			"text": "活动",
+			"iconPath": "static/img/tab/my_ico.png",
+			"selectedIconPath": "static/img/tab/my_actico.png"
+		},
 			{
 				"pagePath": "pages/my/my",
 				"text": "我的",
 				"iconPath": "static/img/tab/my_ico.png",
 				"selectedIconPath": "static/img/tab/my_actico.png"
 			}
+			
 		]
 	},
 	"easycom": {

+ 692 - 0
pages/activity/activity.vue

@@ -0,0 +1,692 @@
+<template>
+	<view class="activity-content">
+		<!-- tabs -->
+		<view class="top-content">
+			<view class="tab">
+				<view class="tab-item" v-for="(item,index) in tabs" :key="item.id">
+					<view class="scroll-tab-item" :class="{active:tabsActive==index}" @click="toggleTab(item,index)">{{item.name}}
+					<image src="@/static/img/border_act.png" class="border_act" v-if="tabsActive==index" mode=""></image>
+					</view>
+					
+				</view>
+			</view>
+			<!-- 搜索 -->
+			<view class="index-fixed">
+				<icon type="search" size="15" class="search_ico"/>
+				<text>请输入关键字</text>
+			</view>
+			<view class="select-conyent">
+				<van-dropdown-menu active-color="#333333">
+				<van-dropdown-item id="statusstate" :title="activeStateName">
+						<view class="menu-items">
+							<view class="menu-items-box" @click="overallBtn('statusstate',key)" v-for="key in listActivityStaus" :key="key.Id">
+								<view class="items-box">
+									<u-icon v-if="key.IsChoose" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+								</view>
+								<text>{{key.StatusName}}</text>
+							</view>
+						</view>
+						<view class="replacement-box">
+							<view class="replacement">
+								<text @click="replacementBtn('statusstate')" class="replacement-box">重置</text>
+								<text @click="replacementConfirm('statusstate')">确定</text>
+							</view>
+						</view>
+					</van-dropdown-item>
+				<van-dropdown-item id="industry" :title="chartPermissionName">
+					<view class="decide">
+						<view class="items-box">
+							<u-icon v-if="isShowJurisdiction" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+						</view>
+						<text @click="isJurisdiction">始终只展示有权限的行业</text>
+					</view>
+						<view class="menu-items">
+							<view class="menu-items-box" v-for="item in listChartPermission" :key="item.ChartPermissionId" @click="overallClick('industry',item)">
+								<view class="items-box">
+									<u-icon v-if="item.IsChoose" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+								</view>
+								<text>{{item.PermissionName}}</text>
+							</view>
+						</view>
+						<view class="replacement">
+							<text @click="replacementBtn('industry')" class="replacement-box">重置</text>
+							<text @click="replacementConfirm('industry')">确定</text>
+						</view>
+					</van-dropdown-item>
+				<van-dropdown-item id="genre" :title="activityTypeName">
+						<view class="menu-items">
+							<view class="menu-items-box" @click="overallActivity('genre',item)" v-for="(item,index) in listActivityType" :key="item.ActivityTypeId">
+								<view class="items-box">
+									<u-icon v-if="item.IsChoose" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+								</view>
+								<text>{{item.ActivityTypeName}}</text>
+							</view>
+						</view>
+						<view class="replacement">
+							<text @click="replacementBtn('genre')" class="replacement-box">重置</text>
+							<text @click="replacementConfirm('genre')">确定</text>
+						</view>
+					</van-dropdown-item>
+				
+				
+				
+				</van-dropdown-menu>
+			</view>
+			
+			</view>
+			<view class="box-content">
+				<view class="content-list" v-for="(item,index) in collectList" :key="index">
+					<view class="list-top" @click="goDetail(item)">
+					<view class="list-top-box">
+						<text>{{item.ActivityTypeName}}</text>
+						<view class="city">
+							<image src="../../static/img/advice_ico.png" mode=""></image>
+							<text>城市</text>
+						</view>
+					</view>
+						<text style="color: #2ACDD9; font-size: 26rpx;">{{item.ActiveState == 1 ? '未开始': item.ActiveState == 2 ?'进行中' :'已结束'}}</text>
+					</view>
+					<view class="list-center" @click="goDetail(item)">
+						<text class="title">{{item.ActivityName}}</text>
+						<text v-if="item.Expert">专家背景:{{item.Expert}}</text>
+						<text v-if="item.DistinguishedGuest">嘉宾:{{item.DistinguishedGuest}}</text>
+						<text>活动时间:{{item.ActivityTime}}</text>
+					</view>
+					<view class="list-bottom">
+						<view class="multi" v-if="item.ActivityTypeId==1||item.ActivityTypeId==2||(item.ActivityTypeId==3&&item.IsLimitPeople==0)">
+							<text v-if="item.IsSignup!==1" @click="signupAdd(item.ActivityId,1)">预约外呼</text>
+							<text v-else @click="signupCancel(item.ActivityId,1)">取消外呼</text>
+							<text style="border-left: 1px solid #E5E5E5;">会议提醒</text>
+						</view>
+						<view class="multi-text" v-else>
+							<text v-if="item.IsSignup!==1" @click="signupAdd(item.ActivityId,2)">我要报名({{item.SignupNum}}/{{item.LimitPeopleNum}})</text>
+							<text v-else @click="signupCancel(item.ActivityId,2)">取消报名({{item.SignupNum}}/{{item.LimitPeopleNum}})</text>
+						</view>
+					</view>
+				</view>
+					<u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="totalPage>1"/>
+			</view>
+			<modalDialog :isShow="isShow" :signupType="signupType" :goFollow="goFollow" :signupStatus="signupStatus" :isCancelShow="isCancelShow" :idTypeCancel="idTypeCancel"/>
+	</view>
+</template>
+
+<script>
+	import {activity} from "@/config/api.js"
+	import { Throttle } from '@/config/util.js'
+	import modalDialog from '@/components/modalDialog.vue'
+	let app = getApp()
+	export default {
+		data() {
+			return {
+				tabs:[{
+					name:'全部活动',
+					id:1
+				},
+				{
+					name:'我的日程',
+					id:2
+				},],
+				tabsActive:0,
+				page_no:1,
+				pageSize:10,
+				collectList:[],
+				status:'loadmore',
+				totalPage:'',
+				haveData:true,
+				loadText: {
+					loadmore: '上拉加载更多',
+					loading: '加载中',
+					nomore: '已经到底了'
+				},
+				listActivityStaus:[],//状态
+				listActivityType:[],//类型
+				listChartPermission:[],//分类
+				isShowJurisdiction:false,
+				activeState:'1',//活动进行状态
+				activityTypeIds:'',//活动类型id 多个用 , 隔开
+				chartPermissionIds:'',//行业id 多个用 , 隔开
+				activeStateName:'未开始',
+				chartPermissionName:'行业分类',
+				activityTypeName:'活动类型',
+				isShowJurisdiction:false,
+				isGain:true,
+				signupType:'',//关注类型
+				goFollow:false,//是否关注公众号
+				signupStatus:'Success',//4个不同的类型提示文案
+				isShow:false,//弹框
+				isCancelShow:false,
+				idTypeCancel:{
+					id:'',
+					type:1
+				}
+			}
+		},
+		computed:{
+			//是否仅展示有权限的,1是,0否 默认为0
+			isId(){	
+				return this.isShowJurisdiction ? 1:0
+			}
+		},
+		watch:{
+		},
+		components: {
+			modalDialog
+		},
+		onLoad(option) {
+			if(option.typeName) {
+				console.log(option);
+				this.activeState=option.statesId//活动进行状态
+				this.activityTypeIds=option.typeIds//活动类型id 多个用 , 隔开
+				this.chartPermissionIds=option.chartIds//行业id 多个用 , 隔开
+				this.activeStateName=option.stateName
+				this.chartPermissionName=option.chartName
+				this.activityTypeName=option.typeName
+				this.isGain=false
+				console.log(this.activeState);
+				console.log(this.activityTypeIds);
+				console.log(this.chartPermissionIds);
+			}else {
+				this.isGain=true
+			}
+			this.getUserSearchContent()
+		},
+		/* 触底 */
+		onReachBottom: Throttle(function() {
+				if(this.status === 'nomore') return ;
+				this.status = 'loading';
+				this.page_no++;
+				this.getList()
+			}),	
+		methods: {
+			//获取列表
+			getList(){
+				activity.getActivityList({
+					PageSize:this.pageSize,
+					CurrentIndex:this.page_no,
+					ActiveState:this.activeState,//活动进行状态
+					ActivityTypeIds:this.activityTypeIds,//活动类型id 多个用 , 隔开
+					ChartPermissionIds:this.chartPermissionIds,//行业id 多个用 , 隔开
+				}).then(res=>{
+					if(res.Ret !== 200) return
+					this.status = this.page_no < res.Data.Paging.Pages ? 'loadmore' : 'nomore';
+					this.totalPage = res.Data.Paging.Pages;//总页数
+					if(this.page_no === 1) {
+						this.collectList = res.Data.List || [];
+						this.haveData = this.collectList.length ? true : false
+						if(this.refresh) {
+							uni.stopPullDownRefresh();
+							this.refresh = false;
+						} 
+					}else {
+						this.collectList.push(...res.Data.List)
+					}
+				})
+			},
+			//获取活动详情接口
+			getUserSearchContent(){
+				activity.getUserSearchContent({
+					IsShowJurisdiction:this.isId
+				}).then(res=>{
+					this.isShowJurisdiction=res.Data.IsShowJurisdiction
+					this.listActivityStaus=res.Data.ListActivityStaus
+					this.listActivityType=res.Data.ListActivityType
+					this.listChartPermission=res.Data.ListChartPermission
+					if(this.isGain) {
+						this.preserve()
+					}else {
+						this.getList()
+					}
+					
+				})
+			},
+			//报名
+			signupAdd(id,type){
+				activity.signupAdd({
+					ActivityId:id,
+					SignupType:type,
+				}).then(res=>{
+					if(res.Ret==200){
+						console.log(res);
+						if(!res.Data.GoFollow){	
+							this.isShow=true
+							console.log(this.isShow);
+						}
+						this.signupType=res.Data.SignupType
+						this.goFollow=res.Data.GoFollow
+						this.signupStatus=res.Data.SignupStatus
+					}
+				})
+			},
+			//取消报名
+			signupCancel(id,type){
+				this.isCancelShow=true
+				this.idTypeCancel={
+					id,
+					type
+				}
+				// activity.signupCancel({
+				// 	ActivityId:id,
+				// 	SignupType:type,
+				// }).then(res=>{
+				// 	if(res.Ret==200){
+						
+				// 	}
+				// })
+			},
+			preserve(){
+				const arr=[]
+				const str=[]
+				this.listActivityStaus.forEach(item=>{
+					if(item.IsChoose) {
+						arr.push(item.Id)
+						str.push(item.StatusName)
+					}
+				})
+				if(str.length==this.listActivityStaus.length) {
+					this.activeStateName='所有状态'
+				}else if(str.length<=0) {
+					this.activeStateName='活动状态'
+				}else {
+					this.activeStateName=str.join(',')
+				}
+				this.activeState = arr.join(',')
+				const hyArr=[]
+				const hyStr=[]
+				this.listChartPermission.forEach(key=>{
+						if(key.IsChoose){
+							hyArr.push(key.ChartPermissionId)
+							hyStr.push(key.PermissionName)
+						}
+					})	
+					if(hyStr.length==this.listChartPermission.length) {
+						this.chartPermissionName='所有行业'
+					}else if(hyStr.length<=0){
+						this.chartPermissionName='行业分类'
+					}else {
+						this.chartPermissionName=hyStr.join(',')
+					}
+					this.chartPermissionIds = hyArr.join(',')
+					const lxArr=[]
+					const lxStr=[]
+					this.listActivityType.forEach(key=>{
+							if(key.IsChoose){
+								lxArr.push(key.ActivityTypeId)
+								lxStr.push(key.ActivityTypeName)
+							}
+						})	
+						if(lxStr.length==this.listActivityType.length) {
+							this.activityTypeName='所有活动'
+						}else if(lxStr.length<=0){
+							this.activityTypeName='活动类型'
+						}else{this.activityTypeName=lxStr.join(',')}
+						this.activityTypeIds = lxArr.join(',')
+						this.getList()
+			},
+			toggleTab(item,index){
+				if(this.tabsActive!==index) {
+					this.tabsActive=index
+				}
+			},
+			//状态的下拉选择
+			overallBtn(type,item){
+					const arr=[]
+					const str=[]
+				this.listActivityStaus.forEach(key=>{
+						if(key.Id==item.Id){
+							key.IsChoose=!key.IsChoose
+						}
+					})
+				this.listActivityStaus.forEach(key=>{
+						if(key.IsChoose){
+							arr.push(key.Id)
+							str.push(key.StatusName)
+						}
+					})	
+					if(str.length==this.listActivityStaus.length) {
+						this.activeStateName='所有状态'
+					}else if(str.length<=0) {
+						this.activeStateName='活动状态'
+					}else {
+						this.activeStateName=str.join(',')
+					}
+					this.activeState = arr.join(',')
+
+			},
+			// 行业的下拉选择
+			overallClick(type,item){
+				const arr=[]
+				const str=[]
+				this.listChartPermission.forEach(key=>{
+						if(key.ChartPermissionId==item.ChartPermissionId){
+							key.IsChoose=!key.IsChoose
+						}
+					})
+				this.listChartPermission.forEach(key=>{
+						if(key.IsChoose){
+							arr.push(key.ChartPermissionId)
+							str.push(key.PermissionName)
+						}
+					})	
+					if(str.length==this.listChartPermission.length) {
+						this.chartPermissionName='所有行业'
+					}else if(str.length<=0){
+						this.chartPermissionName='行业分类'
+					}else {
+						this.chartPermissionName=str.join(',')
+					}
+					this.chartPermissionIds = arr.join(',')
+				
+			},
+			//类型的下拉选择
+			overallActivity(type,item){
+				const arr=[]
+				const str=[]
+				this.listActivityType.forEach(key=>{
+						if(key.ActivityTypeId==item.ActivityTypeId){
+							key.IsChoose=!key.IsChoose
+						}
+					})
+				this.listActivityType.forEach(key=>{
+						if(key.IsChoose){
+							arr.push(key.ActivityTypeId)
+							str.push(key.ActivityTypeName)
+						}
+					})	
+					if(str.length==this.listActivityType.length) {
+						this.activityTypeName='所有活动'
+					}else if(str.length<=0){
+						this.activityTypeName='活动类型'
+					}else{this.activityTypeName=str.join(',')}
+					this.activityTypeIds = arr.join(',')
+			},
+			/* 新布局产业选项重置按钮 */
+			replacementBtn(type){
+				if(type=='statusstate'){
+					this.listActivityStaus.forEach(item=>item.IsChoose=false)
+					this.listActivityStaus[0].IsChoose=true
+					this.activeState='1'
+					this.activeStateName='未开始'
+				}else if(type=='industry') {
+					this.listChartPermission.forEach(item=>item.IsChoose=false)
+					this.chartPermissionIds=''
+					this.chartPermissionName='行业分类'
+				}else {
+					this.listActivityType.forEach(item=>item.IsChoose=false)
+					this.activityTypeIds=''
+					this.activityTypeName='活动类型'
+				}
+			},
+			/* 新布局产业选项确定按钮 */
+			replacementConfirm(type){
+				this.page_no=1
+				if(type=='statusstate'){
+					
+						console.log('状态');
+				}else if(type=='industry') {
+				
+					console.log('行业');
+				}else {
+				
+					console.log('活动');
+				}
+				this.getList()
+				this.selectComponent(`#${type}`).toggle();
+			},
+			goDetail(item){
+				this.$store.dispatch('checkHandle').then(res => {
+					app.globalData.isAuth = res.IsAuth;
+					app.globalData.isBind = res.IsBind;
+					if((!res.IsAuth) && (!res.IsBind)) { // 已授权已绑定
+						uni.navigateTo({
+							url:'/pages/activityDetail/activityDetail?id=' + item.ActivityId,
+						});
+					}else if(res.IsAuth) { //未授权
+						uni.navigateTo({
+							url:'/pages/authGuide/authGuide'
+						})
+					}else if(res.IsBind && !res.IsAuth){ //已授权未绑定
+						uni.navigateTo({
+							url:'/pages/login/login'
+						})
+					}
+				})
+				
+			},
+			isJurisdiction(){
+				this.isShowJurisdiction = !this.isShowJurisdiction
+				this.getUserSearchContent()
+			}
+		},	
+		/**
+		* 用户点击分享
+		*/
+		onShareAppMessage: function (res) {
+			return {
+				title: '活动',
+				path: '/pages/activity/activity?statesId='+this.activeState+'&typeIds='+this.activityTypeIds+'&chartIds='+this.chartPermissionIds+'&stateName='+this.activeStateName+'&chartName='+this.chartPermissionName+'&typeName='+this.activityTypeName ,
+				success: (res)=> {
+				},
+				fail: (err)=> {
+				}
+			}
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+.activity-content {
+	background-color: #f6f6f6;
+	.top-content{
+		width: 100%;
+		background-color: #fff;
+		padding: 0 30rpx;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 999;
+		.tab {
+			display: flex;
+			font-size: 32rpx;
+			color: #707070;
+			.tab-item {
+				flex: 1;
+				text-align: center;
+				.scroll-tab-item {
+					height: 78rpx;
+					line-height: 48rpx;
+					position: relative;
+					.border_act {
+						position: absolute;
+						height: 6rpx;
+						width: 340rpx;
+						left: 0;
+						bottom: 0rpx;
+					}
+				}
+				.active {
+					color: #3385FF;
+					font-weight: bold;
+					font-size: 34rpx;
+				}
+				image {
+					
+				}
+			}
+		}
+		.index-fixed {
+			margin-top: 40rpx;
+			width: 100%;
+			display: flex;
+			align-items: center;
+			height: 70rpx;
+			background: #F6F6F6;
+			border: 1rpx solid #E5E5E5;
+			opacity: 1;
+			border-radius: 35rpx;
+			padding-left: 34rpx;
+			color: #8D8D8D;
+			font-size: 24rpx; 
+			.search_ico {
+				padding-right: 16rpx;
+			}
+		}
+		.select-conyent {
+			margin-top: 10rpx;
+			.decide {
+				display: flex;
+				align-items: center;
+				margin: 0 auto;
+				height: 110rpx;
+				width: 690rpx;
+				border-bottom: 1px solid #E5E5E5;
+			}
+			.items-box {
+				 width: 40rpx;
+			}
+			.menu-items {
+					background-color: #fff;
+					 width: 100%;
+					  display: flex;
+					  flex-wrap:wrap;
+					  padding: 30rpx 30rpx 0;
+					  .menu-items-box {
+						  display: flex;
+						  width: 50%;
+						  font-size: 28rpx;
+						  font-weight: 400;
+						  margin-bottom: 40rpx;
+						 
+					  }
+			}
+			.replacement-box {
+				background-color: #fff;
+				padding-bottom: 40rpx;
+				border-radius: 0rpx 0rpx 16rpx 16rpx;
+			}
+			.replacement {
+			margin: 0rpx 30rpx 20rpx;
+			display: flex;
+			background-color: #2C83FF;
+			opacity: 1;
+			height: 60rpx;
+			line-height: 58rpx;
+			font-size: 28rpx;
+			font-weight: 400;
+			color: #FFFFFF;
+			border-radius: 30rpx;
+			text {
+				flex: 1;
+				text-align: center;
+				
+			}
+			
+			.replacement-box {
+				border: 1rpx solid #2C83FF;
+				opacity: 1;
+				color: #2C83FF;
+				background: #FFFFFF;
+				border-radius: 28rpx 0rpx 28rpx 28rpx;
+			}
+	 }
+		}
+	}
+	.box-content {
+		padding: 300rpx 34rpx 0;
+		.content-list {
+			box-sizing: border-box;
+			overflow: hidden;
+			margin-top: 30rpx;
+			height: 396rpx;
+			width: 100%;
+			background: #FFFFFF;
+			box-shadow: 0px 3rpx 6rpx rgba(141, 141, 141, 0.16);
+			border-radius: 16rpx;
+			font-size: 28rpx;
+			.list-top {
+				margin: 0 30rpx;
+				display: flex;
+				justify-content: space-between;
+				border-bottom:1rpx solid #E5E5E5 ;
+				height: 82rpx;
+				line-height: 82rpx;
+				color: #333333;
+				font-size: 32rpx;
+				.list-top-box {
+					display: flex;
+				}
+				.city {
+					margin-left: 40rpx;
+					display: flex;
+					color: #3385FF;
+					align-items: center;
+					font-size: 26rpx;
+					image {
+						width: 27rpx;
+						height: 32rpx;
+						margin-right:12rpx;
+					}
+				}
+			}
+			.list-center {
+				height: 234rpx;
+				width: 100%;
+				color: #333333;
+				line-height: 60rpx;
+				.title {
+					padding: 10rpx;
+					padding-left: 35rpx;
+					white-space:nowrap;
+					overflow:hidden;
+					text-overflow:ellipsis;
+				}
+				text {
+					padding-left: 50rpx;
+				}
+			}
+			.list-bottom {
+				height: 80rpx;
+				border-top: 1px solid #E5E5E5;
+				.multi {
+					display: flex;
+					text-align: center;
+					line-height: 80rpx;
+					color: #3385FF;
+					text {
+						width: 50%;
+					}
+				}
+				.multi-text {
+					line-height: 80rpx;
+					color: #3385FF;
+					width: 100%;
+					text-align: center;
+				}
+			}
+		}
+	}
+}
+/deep/.van-dropdown-menu {
+	  background-color: #fff;
+	  box-shadow: none !important;
+	  padding-top: 20rpx;
+  }
+ 
+/deep/.van-dropdown-menu__item{
+		box-sizing: border-box;
+		width: 190rpx;
+		margin-right:40rpx;
+		padding-right: 20rpx;
+		height: 51rpx;
+        border-radius: 26rpx;
+		background: #F8F8FA;
+	}
+/deep/.van-dropdown-item{
+	margin-top: -10rpx;
+}
+/deep/[data-index='2'] {
+		margin-right:0rpx;
+}
+/deep/ .van-ellipsis {
+	font-size: 24rpx;
+}
+</style>

+ 173 - 0
pages/activityDetail/activityDetail.vue

@@ -0,0 +1,173 @@
+<template>
+	<view class="activity-detail">
+		<view class="notice" v-if="detailData.IsLimitPeople==1">
+		<van-notice-bar color="#FFFFFF"  background="#FE9000"  text="该活动参与名额有限,报名客户请按时参加,爽约会影响您的后续报名资格"/>
+		</view>
+		<view class="content">
+			 <view v-if="detailData.ActivityName" class="dialog-title">{{detailData.ActivityName}}</view>
+			      <view class="city-box">
+			      	<text v-if="detailData.ActivityTypeName">活动类型:{{detailData.ActivityTypeName}}</text>
+			      	<view class="city">
+			      		<image src="../../static/img/advice_ico.png" mode=""></image>
+						<text>城市{{detailData.City}}</text>
+			      	</view>
+			      </view>
+				   <text v-if="detailData.ChartPermissionName">所属行业:{{detailData.ChartPermissionName}}</text>
+			        <text v-if="detailData.ActivityTimeText">活动时间:{{detailData.ActivityTimeText}}</text>
+			        <text v-if="detailData.DistinguishedGuest">嘉&nbsp;&nbsp; &nbsp; &nbsp;宾:{{detailData.DistinguishedGuest}}</text>
+			        <text v-if="detailData.Host">主&nbsp; 持&nbsp; 人:{{detailData.Host}}</text>
+			        <text v-if="detailData.Expert">专&nbsp;&nbsp; &nbsp; &nbsp;家:{{detailData.Expert}}</text>
+			        <text v-if="detailData.City">城&nbsp;&nbsp; &nbsp; &nbsp;市:{{detailData.City}}</text>
+			        <view v-if="detailData.MainlandTell">大陆拨入:
+					<text class="phone" @click="phonebtn(detailData.MainlandTell)">{{detailData.MainlandTell}}</text>
+					</view>
+			        <view v-if="detailData.HongKongTell">香港拨入:
+					<text @click="phonebtn(detailData.HongKongTell)" class="phone">{{detailData.HongKongTell}}</text>
+					</view>
+			        <view v-if="detailData.TaiwanTell">台湾拨入:
+					<text @click="phonebtn(detailData.TaiwanTell)" class="phone">{{detailData.TaiwanTell}}</text>
+					</view>
+			        <view v-if="detailData.AmericaTell">美国拨入:
+					<text @click="phonebtn(detailData.AmericaTell)" class="phone">{{detailData.AmericaTell}}</text>
+					</view>
+			        <text v-if="detailData.ReportLink">报告链接:{{detailData.ReportLink}}</text>
+			        <text v-if="detailData.OnlineParticipation">网络参会:{{detailData.OnlineParticipation}}</text>
+			        <text v-if="detailData.OnlineParticipation">参会密码:{{detailData.OnlineParticipation}}</text>
+			        <text v-if="detailData.Address">活动地址:{{detailData.Address}}</text>
+			        <text v-if="detailData.Highlights">活动亮点:{{detailData.Highlights}}</text>
+			        <text v-if="detailData.Theme">主&nbsp;&nbsp; &nbsp; &nbsp;题:{{detailData.Theme}}</text>
+			        <text v-if="detailData.Remarks">备&nbsp;&nbsp; &nbsp; &nbsp;注:{{detailData.Remarks}}</text>
+		</view>
+		<view class="content-bottom">
+			<view class="make-outbound">
+				预约外呼
+			</view>
+			<view class="make-outbound">
+				取消外呼
+			</view>
+			<view class="make-conference">
+				会议提醒
+				<text>(会前15分钟推送微信消息提醒)</text>
+			</view>
+			<view class="make-conference">
+				取消会议提醒
+				<text>(会前15分钟推送微信消息提醒)</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {activity} from "@/config/api.js"
+	export default {
+		data() {
+			return {
+				id:10,
+				detailData:{}
+			}
+		},
+		methods: {
+			getActivityDetail(){
+				activity.getActivityDetail({
+					ActivityId:this.id
+				}).then(res =>{
+					if(res.Ret==200){
+						this.detailData=res.Data
+					}
+					console.log(res);
+				})
+			},
+			phonebtn(phone) {
+				console.log(11);
+				console.log(phone);
+				uni.makePhoneCall({
+				    phoneNumber:phone
+				});
+			},
+		},
+		onLoad(option) {
+			// this.id=option.id
+			this.getActivityDetail()
+		}
+	}
+</script>
+
+<style lang="scss">
+	.activity-detail {
+		.notice {
+			height: 60rpx;
+			width: 100%;
+		}
+		.content {
+			padding: 34rpx;
+			color: #333333;
+			font-size: 28rpx;
+			view{padding-left:20rpx ;}
+			text {
+				line-height: 80rpx;
+				padding-left:20rpx ;
+			}
+			.phone {
+				padding: 0;
+				display: inline-block;
+				color: #2C83FF;
+			}
+			.dialog-title {
+				width: 682rpx;
+				padding:20rpx 0;
+				background: #F2F2F2;
+				opacity: 0.8;
+				font-size: 30rpx; 
+				font-weight: bold; 
+				margin-bottom: 15rpx;
+			}
+			.city-box {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				text {
+					padding: 0;
+				}
+				.city {
+					display: flex;
+					color: #2088FF;
+					align-items: center;
+					image {
+						width: 27rpx;
+						height: 32rpx;
+						margin-right:12rpx;
+					}
+				}
+			}
+		}
+		.content-bottom {
+			margin: 30rpx 0;
+			.make-outbound {
+				margin: 0 auto;
+				width: 368rpx;
+				height: 80rpx;
+				background: linear-gradient(268deg, #2DDBFF 0%, #1599FF 49%, #005EFF 100%);
+				opacity: 1;
+				border-radius: 4rpx;
+				color: #FFFFFF;
+				font-size: 34rpx;
+				line-height: 80rpx;
+				text-align: center;
+			}
+			.make-conference {
+				margin: 30rpx auto ;
+				width: 368rpx;
+				height: 80rpx;
+				border: 2px solid #2C83FF;
+				opacity: 1;
+				border-radius: 4rpx;
+				padding-top: 10rpx;
+				text-align: center;
+				color: #2C83FF;
+				text {
+					font-size: 16rpx;
+				}
+			}
+		}
+	}
+</style>

+ 2 - 2
pages/reportDetail/reportDetail.vue

@@ -59,8 +59,8 @@
 				access_token:'',//用户标识
 				isIphoneX:false,//判断机型
 				reportInfo:'',
-				linkurl:'https://details.hzinsights.com/raiReportDtl',//线上链接地址
-				//linkurl:' http://192.168.1.155:2000/raiReportDtl',//链接地址
+				//linkurl:'https://details.hzinsights.com/raiReportDtl',//线上链接地址
+				linkurl:'http://192.168.1.25:2000/raiReportDtl',//链接地址
 				showNav:false,
 				id:'',
 				idReport:null,

+ 483 - 433
pages/reportForm/reportForm.vue

@@ -1,27 +1,36 @@
 <template>
 	<view class="reportForm-container">
 		<!-- tabs -->
-		<view class="top-box">
-			<view class="top-tab-cont">
-				<view class="tab-cont">
-					<scroll-view scroll-x="true" scroll-with-animation class="scroll-tab"
-						:scroll-into-view="'_'+tabIndex">
-						<block v-for="(item, index) in tabBars" :key="item.ChartPermissionId">
-							<view :id="'_'+index" class="scroll-tab-item"
-								:class="{ active: tabAct_id == item.ChartPermissionId }"
-								@click.stop="toggleTab(item,index)">
-								{{item.PermissionName}}
-								<image src="@/static/img/border_act.png" mode="" class="border_act"
-									v-if="tabAct_id == item.ChartPermissionId"></image>
-							</view>
-						</block>
-					</scroll-view>
-
-				</view>
-				<view class="lucency" v-if="tabBars.length>6"></view>
+		 <!-- tabs -->
+			<view class="index-fixed">
+						<view class="index-header">
+							<input type="text" 
+							placeholder="搜索您想要的纪要" 
+							placeholder-class="sea_ipt_placeholder" 
+							class="sea_ipt"
+							v-model="searchTxt"
+							disabled
+							@click="goSearch"/>
+							<icon type="search" size="15" class="search_ico"/>
 			</view>
-		</view>
-		<!-- 内容 -->
+		     <view class="tab-cont">
+		     				<scroll-view 
+		     				scroll-x="true" 
+		     				scroll-with-animation 
+		     				class="scroll-tab" 
+		     				:scroll-into-view="'_'+tabIndex">
+		     					<block v-for="(item, index) in tabBars" :key="item.ChartPermissionId">
+		     						<view :id="'_'+index" class="scroll-tab-item" :class="{ active: tabAct_id === item.ChartPermissionId }" @click.stop="toggleTab(item,index)">
+		     						{{item.PermissionName}}
+		     						<image src="@/static/img/border_act.png" mode="" class="border_act" v-if="tabAct_id === item.ChartPermissionId"></image>
+		     						</view>
+		     					</block>
+		     				</scroll-view>
+		            
+		     			</view>
+		           <view class="lucency" v-if="tabBars.length>6"></view>
+		   </view>
+	  <!-- 内容 -->
 		<view class="strategy" v-if="strategyIndex==4">
 			<view class="tab-cont-two">
 				<scroll-view scroll-x="true" scroll-with-animation class="scroll-tab-tow">
@@ -71,24 +80,37 @@
 			<view class="industry">
 				<view style="height: 12rpx;" v-if="!tradeList"></view>
 				<view class="industry-top industry-sticky">
-					<view>
+					<view class="img-top-box">
 						<image src="@/static/img/property_ico.png" style="height: 50rpx;"></image>
 						<text class="text-sub">细分产业报告</text>
 					</view>
-					<text class="equilateral-triangle" v-if="isPitchOnShow"></text>
-					<view class="pop-box">
-						<!-- <image src="@/static/img/property_inco.png" style="height: 50rpx;" @click="isPitchOnShowBtn"></image> -->
-						<text @click="isPitchOnShowBtn" class="pop-text">
-							{{pitchOnName}}
-						</text>
-						<view class="pop-up" v-if="isPitchOnShow">
-							<view v-for="(item,index) in pitchOn" :key="item.id" @click="pitchClick(item,index)"
-								:class="pitchOnId==item.id?'pitch-on':''">{{item.name}}</view>
-
+					<van-dropdown-menu active-color="#333333">
+						<van-dropdown-item id="menuItem"  @open="isscroll" :title="overallArrangementName">
+							<view class="menu-items">
+								<view class="menu-items-box" @click="overallBtn(index,item)" v-for="(item,index) in overallArrangement" :key="item.id">
+									<view class="items-box">
+										<u-icon v-show="overallArrangementId==item.id" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+									</view>
+									<text>{{item.name}}</text>
+								</view>
+							</view>
+							<view class="replacement">
+								<text @click="replacementBtn" class="replacement-box">重置</text>
+								<text @click="replacementConfirm">确定</text>
+							</view>
+						</van-dropdown-item>
+					<van-dropdown-item id="menuPitch" class="adasdasdas"  @open="isscroll" :title="pitchOnName">
+						<view class="menu-items-tow">
+							<view class="items-tow" @click="pitchClick(item,index)" v-for="(item,index) in pitchOn" :key="item.id">
+								<view>
+									<u-icon v-show="pitchOnId==item.id" name="checkbox-mark"  color="#2C83FF" size="24"></u-icon>
+								</view>
+								<text>{{item.name}}</text>
+							</view>
 						</view>
-
-					</view>
-
+					</van-dropdown-item>
+										  
+					</van-dropdown-menu>
 				</view>
 				<!-- 需要循环的地方 -->
 				<view class="forindustry" v-for="item in industryList" :key="item.IndustrialManagementId">
@@ -132,9 +154,6 @@
 					v-if="totalPage>1" />
 			</view>
 		</view>
-
-		<u-mask :show="isPitchOnShow" @click="isPitchOnShow = false" :z-index="8"
-			:custom-style="{background: 'rgba(0, 0, 0, 0)'}"></u-mask>
 	</view>
 </template>
 
@@ -146,6 +165,7 @@
 	import {
 		Reports
 	} from '@/config/api.js'
+	 let app = getApp()
 	export default {
 		components: {
 			strategy
@@ -169,7 +189,6 @@
 				}],
 				pitchOnId: 'NewTime',
 				pitchOnName: '按最近更新排序',
-				isPitchOnShow: false,
 				isNum: 1,
 				strategyIndex: null,
 				strategyIndexTwo: 0,
@@ -189,6 +208,12 @@
 				haveData: true,
 				totalPage: '',
 				matchTypeName: '',
+				overallArrangement:[
+					{name:'新布局产业',id:'1'},{name:'深度研究产业',id:'2'},
+					],
+				overallArrangementId:1,
+				overallArrangementName:'新布局产业',
+				isScrollShow:false
 			}
 		},
 		onLoad(option) {
@@ -212,12 +237,19 @@
 					if (this.tabAct_id) {
 						this.OrderColumn = 'NewTime'
 						this.pitchOnId = 'NewTime'
+						this.overallArrangementName='新布局产业'
+						this.overallArrangementId=1//待完善
 						this.pitchOnName = '按最近更新排序'
 						this.page_no = 1;
 						this.refresh = true;
 						this.getIndustryList()
 						this.getTradeList()
 					}
+					if(this.isScrollShow){
+						this.selectComponent('#menuItem').toggle(false);
+						this.selectComponent('#menuPitch').toggle(false);
+						this.isScrollShow=false
+					}
 				},
 				immediate: true
 			}
@@ -246,7 +278,6 @@
 			//tabs切换事件
 			toggleTab(item, index) {
 				this.strategyIndex = index
-				this.isPitchOnShow = false
 				if (this.tabAct_id !== item.ChartPermissionId) {
 					this.tabAct_id = item.ChartPermissionId;
 					this.pageNum = 1;
@@ -269,10 +300,6 @@
 					});
 				}
 			},
-			//产业报告筛选条件
-			isPitchOnShowBtn() {
-				this.isPitchOnShow = !this.isPitchOnShow
-			},
 			//点击产业报告的筛选条件
 			pitchClick(item) {
 				this.pitchOnName = item.name
@@ -283,11 +310,12 @@
 				this.page_no = 1;
 				this.refresh = true;
 				this.getIndustryList()
-				uni.pageScrollTo({
-					scrollTop: 0,
-					duration: 300
-				});
-				this.isPitchOnShow = false
+				this.selectComponent('#menuPitch').toggle();
+				// uni.pageScrollTo({
+				// 	scrollTop: 0,
+				// 	duration: 300
+				// });
+				// this.isPitchOnShow = false
 			},
 			//获取报告所有品种接口
 			getTradeList() {
@@ -359,7 +387,47 @@
 			},
 			hideIsred(is) {
 				this.tabBarsTow[this.strategyIndexTwo].IsRed = is
-			}
+			},
+			/* 新布局产业选项*/
+			overallBtn(index,item){
+				if(this.overallArrangementId!==item.id){
+					this.overallArrangementId=item.id
+				}
+				this.overallArrangementName=item.name
+			},
+			/* 新布局产业选项确定按钮 */
+			replacementConfirm(){
+				 this.selectComponent('#menuItem').toggle();
+			},
+			/* 新布局产业选项重置按钮 */
+			replacementBtn(){
+				this.overallArrangementId=1
+				this.overallArrangementName='新布局产业'
+			},
+			/* 判断页面滚动 */
+			isscroll(){
+				this.isScrollShow=true
+			},
+		 /* 搜索 */
+			goSearch() {
+			this.$store.dispatch('checkHandle').then(res => {
+				  		app.globalData.isAuth = res.IsAuth;
+				  		app.globalData.isBind = res.IsBind;
+				  		if((!res.IsAuth) && (!res.IsBind)) { //已授权已绑定
+				  			uni.navigateTo({
+				  				url:'/pages/reportSearch/reportSearch',
+				  			});
+				  		}else if(res.IsAuth) { //未授权
+				  			uni.navigateTo({
+				  				url:'/pages/authGuide/authGuide'
+				  			})
+				  		}else if(res.IsBind && !res.IsAuth){ //已授权未绑定
+				  			uni.navigateTo({
+				  				url:'/pages/login/login'
+				  			})
+				  		}
+				  	})
+			},
 		},
 		/* 触底 */
 		onReachBottom: Throttle(function() {
@@ -401,397 +469,379 @@
 				fail: (err) => {}
 			}
 		},
-
+		/**
+		 *监听页面滚动
+		 */
+		onPageScroll(){
+				if(this.isScrollShow){
+					this.selectComponent('#menuItem').toggle(false);
+					this.selectComponent('#menuPitch').toggle(false);
+					this.isScrollShow=false
+				}
+				 
+			}
 	}
 </script>
 
 <style lang="scss">
-	.reportForm-container {
-		background-color: #f6f6f6;
-		height: 100vh;
-		.top-box {
-			position: fixed;
-			height: 100rpx;
-			width: 100%;
-			z-index: 99;
-			background-color: #fff;
-			top: 0;
-			left: 0;
-
-			.top-tab-cont {
-				height: 60rpx;
-				padding-bottom: 40rpx;
-				position: relative;
-				background-color: #FFF;
-
-				.lucency {
-					position: absolute;
-					top: 0;
-					right: 0;
-					width: 32px;
-					height: 30px;
-					opacity: 0.9;
-					background-color: #fff;
-				}
-
-				.tab-cont {
-					margin-top: 20rpx;
-					padding: retu;
-					padding: 0 26rpx;
-					background-color: #fff;
-					font-size: 32rpx;
-
-					.scroll-tab {
-						width: 100%;
-						white-space: nowrap;
-					}
-
-					.scroll-tab-item {
-						text-align: center;
-						display: inline-block;
-						padding: 0 8rpx 30rpx 8rpx;
-						margin-right: 43rpx;
-						border-bottom: 8rpx solid transparent;
-						position: relative;
-
-						&:last-child {
-							margin-right: 0;
-						}
-
-						&.active {
-							border-bottom: none;
-							color: #2C83FF;
-							font-weight: 700;
-						}
-
-						.border_act {
-							width: 100%;
-							height: 8rpx;
-							position: absolute;
-							bottom: 0;
-							left: 0;
-						}
-					}
-				}
-			}
-		}
-
-		.forindustry {
-			margin-bottom: 10rpx;
+  .reportForm-container {
+       background-color: #f6f6f6;
+	   height: 100vh;
+	   .index-fixed {
+	   	width: 750rpx;
+	   	position: fixed;
+	   	left: 0;
+	   	top: 0;
+	   	z-index: 999;
+	   	.index-header {
+	   		background-color: #fff;
+	   		padding: 32rpx 34rpx;
+	   		position: relative;
+	   		.sea_ipt_placeholder {
+	   			color: #8D8D8D;
+	   			opacity: 0.7;
+	   		}
+	   		.sea_ipt {
+	   			width: 100%;
+	   			height: 70rpx;
+	   			font-size: 30rpx;
+	   			color: #707070;
+	   			background-color: #F6F6F6;
+	   			padding: 0 34rpx 0 70rpx;
+	   			border-radius: 70rpx;
+	   			border: 1rpx solid #E5E5E5;
+	   		}
+	   		.search_ico {
+	   			display: block;
+	   			position: absolute;
+	   			color: #8D8D8D;
+	   			left: 60rpx;
+	   			top: 50%;
+	   			z-index: 100;
+	   			transform: translateY(-50%);
+	   		}
+	   	}
+	   	.tab-cont {
+	   		padding: 0 26rpx;
+	   		background-color: #fff;
+	   		font-size: 32rpx;
+	   		box-shadow: 0 3rpx 6rpx rgba(187,216,255,0.2);
+	   		.scroll-tab {
+	   			width: 100%;
+	   			white-space: nowrap;
+	   		}
+	   		.scroll-tab-item {
+	   			// flex-grow: 1;
+	   			text-align: center;
+	   			display: inline-block;
+	   			padding: 0 8rpx 30rpx 8rpx;
+	   			margin-right: 60rpx;
+	   			border-bottom: 8rpx solid transparent;
+	   			position: relative;
+	   			&:last-child {
+	   				margin-right: 0;
+	   			}
+	   			&.active {
+	   				border-bottom: none;
+	   				color: #2C83FF;
+	   				font-weight: 700;
+	   			}
+	   			.border_act {
+	   				width: 100%;
+	   				height: 8rpx;
+	   				position: absolute;
+	   				bottom: 0;
+	   				left: 0;
+	   			}
+	   		}
+	   	}
+	   }
+  .forindustry {
+	  margin-bottom: 10rpx;
+  }
+  .industrial_eport_one {
+	 padding-top: 180rpx;
+	 background-color:  #f6f6f6;
+	 padding-bottom: 10rpx;
+  }
+  .strategy {
+    margin-top: 20rpx;
+    height: 65rpx;
+    line-height: 65rpx;
+    background-color: #fff;
+    .row {
+      width: 100%;
+      height: 170rpx;
+      background-color: #f6f6f6;
+    }
+    .tab-cont-two {
+		position: fixed;
+		top: 100rpx;
+		left: 0;
+		width: 100%;
+		z-index: 99;
+		height: 100rpx;
+		background-color: #fff;
+       padding: 0 30rpx;
+      .scroll-tab-tow {
+		padding-top: 20rpx;
+        width: 100%;
+        white-space: nowrap;
+        .scroll-tab-item {
+          position: relative;
+          display: inline-block;
+          height: 54rpx;
+          line-height: 54rpx;
+          padding: 0 23rpx;
+          background: #F7F7F7;
+          border-radius: 27px;
+          color: #999999;
+          margin-right: 46rpx;
+          .reg-text {
+            position: absolute;
+            top: -6rpx;
+            right: -8rpx;
+            width: 14rpx;
+            height: 14rpx;
+            background-color: #FF0000;
+            border-radius: 50%;
+          }
+        }
+        .active {
+          color: #FFFFFF !important;
+          background-color: #2C83FF!important;
+        }
+      }
+    }
+  }
+  .industry {
+    margin-top: 20rpx;
+	.industry-sticky{
+		position: sticky;
+		top:210rpx;
+		z-index:99;
+	}
+    .industry-top {
+      display: flex;
+      background-color: #fff;
+      height: 90rpx;
+      padding: 0 30rpx;
+      color: #333333;
+      font-weight: 700;
+      font-size: 32rpx;
+      line-height:90rpx ;
+	  overflow: hidden;
+	  .img-top-box{
+		  display: flex;
+		  align-items: center;
+		  image {
+			  width: 44rpx;
+			  height: 44rpx;
+			  margin-right: 16rpx;
+		  }
+	  }
+	  .menu-items {
+		  display: flex;
+		  padding: 30rpx 30rpx 20rpx;
+		  .menu-items-box {
+			  flex: 1;
+			  display: flex;
+			  font-size: 28rpx;
+			  font-weight: 400;
+			  .items-box {
+				  width: 40rpx;
+			  }
+		  }
+	  }
+	  .menu-items-tow {
+		   padding: 30rpx 30rpx 20rpx;
+		   .items-tow {
+			  display: flex;
+			  flex: 100%;
+			  view {
+			  	width: 40rpx;
+			  }
+		   }   
+	  }
+	 .replacement {
+	 	margin: 0rpx 30rpx 20rpx;
+		display: flex;
+		background-color: #2C83FF;
+		opacity: 1;
+		height: 60rpx;
+		line-height: 58rpx;
+		font-size: 28rpx;
+		font-weight: 400;
+		color: #FFFFFF;
+		border-radius: 30rpx;
+		text {
+			flex: 1;
+			text-align: center;
+			
 		}
-
-		.industrial_eport_one {
-			padding-top: 80rpx;
-			background-color: #f6f6f6;
-			padding-bottom: 10rpx;
+		.replacement-box {
+			border: 1rpx solid #2C83FF;
+			opacity: 1;
+			color: #2C83FF;
+			background: #FFFFFF;
+			border-radius: 28rpx 0rpx 28rpx 28rpx;
 		}
-
-		.strategy {
-			margin-top: 20rpx;
-			height: 65rpx;
-			line-height: 65rpx;
-			background-color: #fff;
-
-			.row {
-				width: 100%;
-				height: 170rpx;
-				background-color: #f6f6f6;
-			}
-
-			.tab-cont-two {
-				position: fixed;
-				top: 100rpx;
-				left: 0;
-				width: 100%;
-				z-index: 99;
-				height: 100rpx;
-				background-color: #fff;
-				padding: 0 30rpx;
-
-				.scroll-tab-tow {
-					padding-top: 20rpx;
-					width: 100%;
-					white-space: nowrap;
-
-					.scroll-tab-item {
-						position: relative;
-						display: inline-block;
-						height: 54rpx;
-						line-height: 54rpx;
-						padding: 0 23rpx;
-						background: #F7F7F7;
-						border-radius: 27px;
-						color: #999999;
-						margin-right: 46rpx;
-
-						.reg-text {
-							position: absolute;
-							top: -6rpx;
-							right: -8rpx;
-							width: 14rpx;
-							height: 14rpx;
-							background-color: #FF0000;
-							border-radius: 50%;
-						}
-					}
-
-					.active {
-						color: #FFFFFF !important;
-						background-color: #2C83FF !important;
-					}
-				}
-			}
+	 }
+    }
+    .industry-box{
+      margin-top: 5rpx;
+      background-color: #fff;
+      height: 90rpx;
+      line-height: 90rpx;
+      padding: 0 30rpx;
+      display:flex;
+      justify-content: space-between; 
+      color: #000000;
+      font-size: 30rpx;
+      .box-left {
+        position: relative;
+        // width: 150rpx;
+		padding-right: 30rpx;
+        height: 90rpx;
+         text {
+           position: absolute;
+           top: 20rpx;
+           right: 5rpx;
+           width: 14rpx;
+           height: 14rpx;
+           background-color: #f00;
+           border-radius: 50%;
+         }
+         
+      }
+      .box-right { 
+        color: #999999;
+        font-size: 26rpx;
+		// width: 45%;
+        display: flex;
+		justify-content: flex-end;
+        // justify-content: space-between;
+		text-align: right;
+		align-items: right;
+        u-icon {
+          padding-left:15rpx;
+        }
+      }
+    }
+    .industry-content {
+      padding-left: 40rpx;
+      vertical-align:middle;
+	  display: flex;
+      margin-bottom: 3rpx;
+      image {
+      padding-right: 20rpx;
+        width: 24rpx;
+        height: 30rpx;
+      }
+      .industry-box-left {
+		  width: 48rpx;
+		image {
+			vertical-align: middle;
+			 margin-top: -8rpx; 
+			 padding:5rpx 20rpx 5rpx 0;
 		}
-
-		.industry {
-			margin-top: 20rpx;
-			.industry-sticky {
-				position: sticky;
-				top: 98rpx;
-				z-index: 99;
-			}
-
-			.industry-top {
-				display: flex;
-				justify-content: space-between;
-				background-color: #fff;
-				width: 100%;
-				height: 90rpx;
-				padding: 0 30rpx;
-				color: #333333;
-				font-weight: 700;
-				font-size: 32rpx;
-				line-height: 90rpx;
-
-				.equilateral-triangle {
-					position: relative;
-					bottom: -78rpx;
-					right: -300rpx;
-					padding: 0;
-					width: 0;
-					height: 0;
-					border-left: 18rpx solid transparent;
-					border-right: 18rpx solid transparent;
-					border-bottom: 20rpx solid #434343;
-				}
-
-				.pop-box {
-					position: relative;
-					width: 280rpx;
-					text-align: right;
-
-					.pop-up view:nth-child(2) {
-						border: none !important;
-					}
-
-					.pop-text {
-						font-size: 28rpx;
-						color: #2C83FF;
-					}
-
-					.pop-up {
-						position: absolute;
-						left: -30rpx;
-						bottom: -210rpx;
-						width: 317rpx;
-						text-align: center;
-						overflow: hidden;
-						font-size: 24rpx;
-						background-color: #434343;
-						border-radius: 10rpx;
-						z-index: 9;
-
-						.pitch-on {
-							color: #2C83FF !important;
-						}
-
-						view {
-							padding: 0;
-							height: 105rpx;
-							width: 258rpx;
-							font-size: 28rpx;
-							margin-left: 30rpx;
-							line-height: 104rpx;
-							border-bottom: 2rpx solid #f6f6f6;
-							text-align: center;
-							color: #FFFFFF;
-						}
-
-					}
-				}
-
-				.img-top-box {
-					padding-left: 5rpx;
-
-				}
-
-				image {
-					width: 44rpx;
-					height: 44rpx;
-					vertical-align: middle;
-					margin-top: -6rpx;
-				}
-
-				text {
-					display: inline-block;
-					padding-left: 16rpx;
-					vertical-align: middle;
-				}
-			}
-
-			.industry-box {
-				margin-top: 5rpx;
-				background-color: #fff;
-				height: 90rpx;
-				line-height: 90rpx;
-				padding: 0 30rpx;
-				display: flex;
-				justify-content: space-between;
-				color: #000000;
-				font-size: 30rpx;
-
-				.box-left {
-					position: relative;
-					// width: 150rpx;
-					padding-right: 30rpx;
-					height: 90rpx;
-
-					text {
-						position: absolute;
-						top: 20rpx;
-						right: 5rpx;
-						width: 14rpx;
-						height: 14rpx;
-						background-color: #f00;
-						border-radius: 50%;
-					}
-
-				}
-
-				.box-right {
-					color: #999999;
-					font-size: 26rpx;
-					// width: 45%;
-					display: flex;
-					justify-content: flex-end;
-					// justify-content: space-between;
-					text-align: right;
-					align-items: right;
-
-					u-icon {
-						padding-left: 15rpx;
-					}
-				}
-			}
-
-			.industry-content {
-				padding-left: 40rpx;
-				vertical-align: middle;
-				display: flex;
-				margin-bottom: 3rpx;
-
-				image {
-					padding-right: 20rpx;
-					width: 24rpx;
-					height: 30rpx;
-				}
-
-				.industry-box-left {
-					width: 48rpx;
-
-					image {
-						vertical-align: middle;
-						margin-top: -8rpx;
-						padding: 5rpx 20rpx 5rpx 0;
-					}
-				}
-
-				.industry-box-right {
-					width: 100%;
-					display: flex;
-					justify-content: space-between;
-
-					.ndustry-box-read {
-						position: relative;
-
-						.read {
-							position: absolute;
-							top: 20rpx;
-							right: -20rpx;
-							width: 14rpx;
-							height: 14rpx;
-							background-color: #FF0000;
-							border-radius: 50%;
-						}
-					}
-
-					.ndustry-box-arrow {
-						display: flex;
-
-						.ndustry-box-text {
-							font-size: 26rpx;
-							color: #999999;
-							padding-right: 20rpx;
-						}
-					}
-				}
-
-			}
-
-			.content-box {
-				background-color: #fff;
-				padding: 20rpx 25rpx 0;
-
-				.img-box {
-					display: flex;
-					height: 90rpx;
-					line-height: 90rpx;
-					box-sizing: border-box;
-					width: 100%;
-					vertical-align: middle !important;
-
-					image {
-						padding-top: 18rpx;
-						width: 44rpx;
-						height: 44rpx;
-						vertical-align: middle;
-					}
-
-					text {
-						display: inline-block;
-						padding-left: 16rpx;
-						vertical-align: middle !important;
-					}
-				}
-			}
-		}
-		.read-more {
-			margin-left: 60rpx;
-			display: flex;
-			flex-wrap: wrap;
-
-			.text-box {
-				// display: inline-block;
-				margin-bottom: 27rpx;
-				margin-right: 40rpx;
-				padding: 0;
-				font-size: 24rpx;
-				color: #408FFF;
-				width: 170rpx;
-				height: 46rpx;
-				line-height: 46rpx;
-				text-align: center !important;
-				background: url(../../static/img/report_bg.png) no-repeat;
-				background-size: 100% 100%;
-				text-indent: 0em;
-			}
-		}
-
+      }
+	  .industry-box-right {
+		  width: 100%;
+		  display: flex;
+		  justify-content: space-between;
+		  .ndustry-box-read {
+			  position: relative;
+			  .read {
+				  position: absolute;
+				  top: 20rpx;
+				  right: -20rpx;
+				  width: 14rpx;
+				  height: 14rpx;
+				  background-color: #FF0000;
+				  border-radius: 50%;
+			  }
+		  }
+		  .ndustry-box-arrow {
+			  display: flex;
+			  .ndustry-box-text {
+				  font-size: 26rpx;
+				  color: #999999;
+				  padding-right: 20rpx;
+			  }
+		  }
+	  }
+    
+  }
+  .content-box {
+    background-color: #fff;
+    padding: 20rpx 25rpx 0;
+      .img-box {
+         display: flex;
+        height: 90rpx;
+        line-height: 90rpx;
+       box-sizing: border-box;
+        width: 100%;
+        vertical-align:middle !important;
+        image {
+          padding-top: 18rpx;
+         width: 44rpx;
+         height: 44rpx;
+         vertical-align:middle;
+        }
+        text {
+          display: inline-block;
+          padding-left: 16rpx;
+           vertical-align:middle !important;
+        }
+      }
+    }
+  }
+  .read-more {
+   margin-left:60rpx;
+   display: flex;
+   flex-wrap: wrap;
+   .text-box {
+     // display: inline-block;
+     margin-bottom: 27rpx;
+     margin-right:40rpx;
+     padding: 0;
+     font-size: 24rpx;
+     color: #408FFF;
+     width: 170rpx;
+     height: 46rpx;
+     line-height: 46rpx;
+     text-align: center !important;
+     background:url(../../static/img/report_bg.png) no-repeat;
+     background-size: 100% 100%;
+     text-indent:0em;
+   }
+  }
+  
+  }
+  .text-bottom-none {
+	  width: 100%;
+  	  text-align: center;
+  }
+  .van-dropdown-menu {
+	  background-color: #fff;
+	   box-shadow: none !important;
+	  // align-items: center;
+	  padding-top: 20rpx;
+  }
+ 
+	.van-dropdown-menu__item{
+		width: 190rpx;
+		padding-right: 20rpx;
+		margin-left: 20rpx;
+		height: 51rpx;
+        border-radius: 26rpx;
+		background: #F8F8FA;
 	}
-
-	.text-bottom-none {
-		width: 100%;
-		text-align: center;
+	.adasdasdas {
+		height: 100%!important;
 	}
-	
+.van-dropdown-item{
+	margin-top: -10rpx;
+}
 </style>

BIN
wxcomponents/.DS_Store


BIN
wxcomponents/vant/.DS_Store


+ 0 - 0
vantComponents/vant-weapp/dropdown-item/index.d.ts → wxcomponents/vant/dist/action-sheet/index.d.ts


+ 70 - 0
wxcomponents/vant/dist/action-sheet/index.js

@@ -0,0 +1,70 @@
+import { VantComponent } from '../common/component';
+import { button } from '../mixins/button';
+VantComponent({
+  mixins: [button],
+  props: {
+    show: Boolean,
+    title: String,
+    cancelText: String,
+    description: String,
+    round: {
+      type: Boolean,
+      value: true,
+    },
+    zIndex: {
+      type: Number,
+      value: 100,
+    },
+    actions: {
+      type: Array,
+      value: [],
+    },
+    overlay: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickOverlay: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickAction: {
+      type: Boolean,
+      value: true,
+    },
+    safeAreaInsetBottom: {
+      type: Boolean,
+      value: true,
+    },
+  },
+  methods: {
+    onSelect(event) {
+      const { index } = event.currentTarget.dataset;
+      const { actions, closeOnClickAction, canIUseGetUserProfile } = this.data;
+      const item = actions[index];
+      if (item) {
+        this.$emit('select', item);
+        if (closeOnClickAction) {
+          this.onClose();
+        }
+        if (item.openType === 'getUserInfo' && canIUseGetUserProfile) {
+          wx.getUserProfile({
+            desc: item.getUserProfileDesc || '  ',
+            complete: (userProfile) => {
+              this.$emit('getuserinfo', userProfile);
+            },
+          });
+        }
+      }
+    },
+    onCancel() {
+      this.$emit('cancel');
+    },
+    onClose() {
+      this.$emit('close');
+    },
+    onClickOverlay() {
+      this.$emit('click-overlay');
+      this.onClose();
+    },
+  },
+});

+ 8 - 0
wxcomponents/vant/dist/action-sheet/index.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-popup": "../popup/index",
+    "van-loading": "../loading/index"
+  }
+}

+ 69 - 0
wxcomponents/vant/dist/action-sheet/index.wxml

@@ -0,0 +1,69 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<van-popup
+  show="{{ show }}"
+  position="bottom"
+  round="{{ round }}"
+  z-index="{{ zIndex }}"
+  overlay="{{ overlay }}"
+  custom-class="van-action-sheet"
+  safe-area-inset-bottom="{{ safeAreaInsetBottom }}"
+  close-on-click-overlay="{{ closeOnClickOverlay }}"
+  bind:close="onClickOverlay"
+>
+  <view wx:if="{{ title }}" class="van-action-sheet__header">
+    {{ title }}
+    <van-icon
+      name="cross"
+      custom-class="van-action-sheet__close"
+      bind:click="onClose"
+    />
+  </view>
+  <view wx:if="{{ description }}" class="van-action-sheet__description van-hairline--bottom">
+    {{ description }}
+  </view>
+  <view wx:if="{{ actions && actions.length }}">
+    <!-- button外包一层view,防止actions动态变化,导致渲染时button被打散 -->
+    <button
+      wx:for="{{ actions }}"
+      wx:key="index"
+      open-type="{{ item.disabled || item.loading || (canIUseGetUserProfile && item.openType === 'getUserInfo') ? '' : item.openType }}"
+      style="{{ item.color ? 'color: ' + item.color : '' }}"
+      class="{{ utils.bem('action-sheet__item', { disabled: item.disabled || item.loading }) }} {{ item.className || '' }}"
+      hover-class="van-action-sheet__item--hover"
+      data-index="{{ index }}"
+      bindtap="{{ item.disabled || item.loading ? '' : 'onSelect' }}"
+      bindgetuserinfo="onGetUserInfo"
+      bindcontact="onContact"
+      bindgetphonenumber="onGetPhoneNumber"
+      binderror="onError"
+      bindlaunchapp="onLaunchApp"
+      bindopensetting="onOpenSetting"
+      lang="{{ lang }}"
+      session-from="{{ sessionFrom }}"
+      send-message-title="{{ sendMessageTitle }}"
+      send-message-path="{{ sendMessagePath }}"
+      send-message-img="{{ sendMessageImg }}"
+      show-message-card="{{ showMessageCard }}"
+      app-parameter="{{ appParameter }}"
+    >
+      <block wx:if="{{ !item.loading }}">
+        {{ item.name }}
+        <view wx:if="{{ item.subname }}" class="van-action-sheet__subname" >{{ item.subname }}</view>
+      </block>
+      <van-loading wx:else custom-class="van-action-sheet__loading" size="22px" />
+    </button>
+  </view>
+  <slot />
+  <block wx:if="{{ cancelText }}">
+    <view class="van-action-sheet__gap" />
+    <view
+      class="van-action-sheet__cancel"
+      hover-class="van-action-sheet__cancel--hover"
+      hover-stay-time="70"
+      bind:tap="onCancel"
+    >
+      {{ cancelText }}
+    </view>
+  </block>
+</van-popup>

File diff suppressed because it is too large
+ 0 - 0
wxcomponents/vant/dist/action-sheet/index.wxss


+ 0 - 0
vantComponents/vant-weapp/dropdown-menu/index.d.ts → wxcomponents/vant/dist/area/index.d.ts


+ 235 - 0
wxcomponents/vant/dist/area/index.js

@@ -0,0 +1,235 @@
+import { VantComponent } from '../common/component';
+import { pickerProps } from '../picker/shared';
+import { requestAnimationFrame } from '../common/utils';
+const EMPTY_CODE = '000000';
+VantComponent({
+  classes: ['active-class', 'toolbar-class', 'column-class'],
+  props: Object.assign(Object.assign({}, pickerProps), {
+    value: {
+      type: String,
+      observer(value) {
+        this.code = value;
+        this.setValues();
+      },
+    },
+    areaList: {
+      type: Object,
+      value: {},
+      observer: 'setValues',
+    },
+    columnsNum: {
+      type: null,
+      value: 3,
+    },
+    columnsPlaceholder: {
+      type: Array,
+      observer(val) {
+        this.setData({
+          typeToColumnsPlaceholder: {
+            province: val[0] || '',
+            city: val[1] || '',
+            county: val[2] || '',
+          },
+        });
+      },
+    },
+  }),
+  data: {
+    columns: [{ values: [] }, { values: [] }, { values: [] }],
+    typeToColumnsPlaceholder: {},
+  },
+  mounted() {
+    requestAnimationFrame(() => {
+      this.setValues();
+    });
+  },
+  methods: {
+    getPicker() {
+      if (this.picker == null) {
+        this.picker = this.selectComponent('.van-area__picker');
+      }
+      return this.picker;
+    },
+    onCancel(event) {
+      this.emit('cancel', event.detail);
+    },
+    onConfirm(event) {
+      const { index } = event.detail;
+      let { value } = event.detail;
+      value = this.parseValues(value);
+      this.emit('confirm', { value, index });
+    },
+    emit(type, detail) {
+      detail.values = detail.value;
+      delete detail.value;
+      this.$emit(type, detail);
+    },
+    parseValues(values) {
+      const { columnsPlaceholder } = this.data;
+      return values.map((value, index) => {
+        if (
+          value &&
+          (!value.code || value.name === columnsPlaceholder[index])
+        ) {
+          return Object.assign(Object.assign({}, value), {
+            code: '',
+            name: '',
+          });
+        }
+        return value;
+      });
+    },
+    onChange(event) {
+      var _a;
+      const { index, picker, value } = event.detail;
+      this.code = value[index].code;
+      (_a = this.setValues()) === null || _a === void 0
+        ? void 0
+        : _a.then(() => {
+            this.$emit('change', {
+              picker,
+              values: this.parseValues(picker.getValues()),
+              index,
+            });
+          });
+    },
+    getConfig(type) {
+      const { areaList } = this.data;
+      return (areaList && areaList[`${type}_list`]) || {};
+    },
+    getList(type, code) {
+      if (type !== 'province' && !code) {
+        return [];
+      }
+      const { typeToColumnsPlaceholder } = this.data;
+      const list = this.getConfig(type);
+      let result = Object.keys(list).map((code) => ({
+        code,
+        name: list[code],
+      }));
+      if (code != null) {
+        // oversea code
+        if (code[0] === '9' && type === 'city') {
+          code = '9';
+        }
+        result = result.filter((item) => item.code.indexOf(code) === 0);
+      }
+      if (typeToColumnsPlaceholder[type] && result.length) {
+        // set columns placeholder
+        const codeFill =
+          type === 'province'
+            ? ''
+            : type === 'city'
+            ? EMPTY_CODE.slice(2, 4)
+            : EMPTY_CODE.slice(4, 6);
+        result.unshift({
+          code: `${code}${codeFill}`,
+          name: typeToColumnsPlaceholder[type],
+        });
+      }
+      return result;
+    },
+    getIndex(type, code) {
+      let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;
+      const list = this.getList(type, code.slice(0, compareNum - 2));
+      // oversea code
+      if (code[0] === '9' && type === 'province') {
+        compareNum = 1;
+      }
+      code = code.slice(0, compareNum);
+      for (let i = 0; i < list.length; i++) {
+        if (list[i].code.slice(0, compareNum) === code) {
+          return i;
+        }
+      }
+      return 0;
+    },
+    setValues() {
+      const picker = this.getPicker();
+      if (!picker) {
+        return;
+      }
+      let code = this.code || this.getDefaultCode();
+      const provinceList = this.getList('province');
+      const cityList = this.getList('city', code.slice(0, 2));
+      const stack = [];
+      const indexes = [];
+      const { columnsNum } = this.data;
+      if (columnsNum >= 1) {
+        stack.push(picker.setColumnValues(0, provinceList, false));
+        indexes.push(this.getIndex('province', code));
+      }
+      if (columnsNum >= 2) {
+        stack.push(picker.setColumnValues(1, cityList, false));
+        indexes.push(this.getIndex('city', code));
+        if (cityList.length && code.slice(2, 4) === '00') {
+          [{ code }] = cityList;
+        }
+      }
+      if (columnsNum === 3) {
+        stack.push(
+          picker.setColumnValues(
+            2,
+            this.getList('county', code.slice(0, 4)),
+            false
+          )
+        );
+        indexes.push(this.getIndex('county', code));
+      }
+      return Promise.all(stack)
+        .catch(() => {})
+        .then(() => picker.setIndexes(indexes))
+        .catch(() => {});
+    },
+    getDefaultCode() {
+      const { columnsPlaceholder } = this.data;
+      if (columnsPlaceholder.length) {
+        return EMPTY_CODE;
+      }
+      const countyCodes = Object.keys(this.getConfig('county'));
+      if (countyCodes[0]) {
+        return countyCodes[0];
+      }
+      const cityCodes = Object.keys(this.getConfig('city'));
+      if (cityCodes[0]) {
+        return cityCodes[0];
+      }
+      return '';
+    },
+    getValues() {
+      const picker = this.getPicker();
+      if (!picker) {
+        return [];
+      }
+      return this.parseValues(picker.getValues().filter((value) => !!value));
+    },
+    getDetail() {
+      const values = this.getValues();
+      const area = {
+        code: '',
+        country: '',
+        province: '',
+        city: '',
+        county: '',
+      };
+      if (!values.length) {
+        return area;
+      }
+      const names = values.map((item) => item.name);
+      area.code = values[values.length - 1].code;
+      if (area.code[0] === '9') {
+        area.country = names[1] || '';
+        area.province = names[2] || '';
+      } else {
+        area.province = names[0] || '';
+        area.city = names[1] || '';
+        area.county = names[2] || '';
+      }
+      return area;
+    },
+    reset(code) {
+      this.code = code || '';
+      return this.setValues();
+    },
+  },
+});

+ 6 - 0
wxcomponents/vant/dist/area/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-picker": "../picker/index"
+  }
+}

+ 20 - 0
wxcomponents/vant/dist/area/index.wxml

@@ -0,0 +1,20 @@
+<wxs src="./index.wxs" module="computed" />
+
+<van-picker
+  class="van-area__picker"
+  active-class="active-class"
+  toolbar-class="toolbar-class"
+  column-class="column-class"
+  show-toolbar
+  value-key="name"
+  title="{{ title }}"
+  loading="{{ loading }}"
+  columns="{{ computed.displayColumns(columns, columnsNum) }}"
+  item-height="{{ itemHeight }}"
+  visible-item-count="{{ visibleItemCount }}"
+  cancel-button-text="{{ cancelButtonText }}"
+  confirm-button-text="{{ confirmButtonText }}"
+  bind:change="onChange"
+  bind:confirm="onConfirm"
+  bind:cancel="onCancel"
+/>

+ 8 - 0
wxcomponents/vant/dist/area/index.wxs

@@ -0,0 +1,8 @@
+/* eslint-disable */
+function displayColumns(columns, columnsNum) {
+  return columns.slice(0, +columnsNum);
+}
+
+module.exports = {
+  displayColumns: displayColumns,
+};

+ 1 - 0
wxcomponents/vant/dist/area/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';

+ 0 - 0
vantComponents/vant-weapp/dropdown-item/shared.js → wxcomponents/vant/dist/button/index.d.ts


+ 63 - 0
wxcomponents/vant/dist/button/index.js

@@ -0,0 +1,63 @@
+import { VantComponent } from '../common/component';
+import { button } from '../mixins/button';
+import { canIUseFormFieldButton } from '../common/version';
+const mixins = [button];
+if (canIUseFormFieldButton()) {
+  mixins.push('wx://form-field-button');
+}
+VantComponent({
+  mixins,
+  classes: ['hover-class', 'loading-class'],
+  data: {
+    baseStyle: '',
+  },
+  props: {
+    formType: String,
+    icon: String,
+    classPrefix: {
+      type: String,
+      value: 'van-icon',
+    },
+    plain: Boolean,
+    block: Boolean,
+    round: Boolean,
+    square: Boolean,
+    loading: Boolean,
+    hairline: Boolean,
+    disabled: Boolean,
+    loadingText: String,
+    customStyle: String,
+    loadingType: {
+      type: String,
+      value: 'circular',
+    },
+    type: {
+      type: String,
+      value: 'default',
+    },
+    dataset: null,
+    size: {
+      type: String,
+      value: 'normal',
+    },
+    loadingSize: {
+      type: String,
+      value: '20px',
+    },
+    color: String,
+  },
+  methods: {
+    onClick(event) {
+      this.$emit('click', event);
+      const { canIUseGetUserProfile, openType, getUserProfileDesc } = this.data;
+      if (openType === 'getUserInfo' && canIUseGetUserProfile) {
+        wx.getUserProfile({
+          desc: getUserProfileDesc || '  ',
+          complete: (userProfile) => {
+            this.$emit('getuserinfo', userProfile);
+          },
+        });
+      }
+    },
+  },
+});

+ 7 - 0
wxcomponents/vant/dist/button/index.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-loading": "../loading/index"
+  }
+}

+ 53 - 0
wxcomponents/vant/dist/button/index.wxml

@@ -0,0 +1,53 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+<wxs src="./index.wxs" module="computed" />
+
+<button
+  id="{{ id }}"
+  data-detail="{{ dataset }}"
+  class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}"
+  hover-class="van-button--active hover-class"
+  lang="{{ lang }}"
+  form-type="{{ formType }}"
+  style="{{ computed.rootStyle({ plain, color, customStyle }) }}"
+  open-type="{{ disabled || loading || (canIUseGetUserProfile && openType === 'getUserInfo') ? '' : openType }}"
+  business-id="{{ businessId }}"
+  session-from="{{ sessionFrom }}"
+  send-message-title="{{ sendMessageTitle }}"
+  send-message-path="{{ sendMessagePath }}"
+  send-message-img="{{ sendMessageImg }}"
+  show-message-card="{{ showMessageCard }}"
+  app-parameter="{{ appParameter }}"
+  aria-label="{{ ariaLabel }}"
+  bindtap="{{ disabled || loading ? '' : 'onClick' }}"
+  bindgetuserinfo="onGetUserInfo"
+  bindcontact="onContact"
+  bindgetphonenumber="onGetPhoneNumber"
+  binderror="onError"
+  bindlaunchapp="onLaunchApp"
+  bindopensetting="onOpenSetting"
+>
+  <block wx:if="{{ loading }}">
+    <van-loading
+      custom-class="loading-class"
+      size="{{ loadingSize }}"
+      type="{{ loadingType }}"
+      color="{{ computed.loadingColor({ type, color, plain }) }}"
+    />
+    <view wx:if="{{ loadingText }}" class="van-button__loading-text">
+      {{ loadingText }}
+    </view>
+  </block>
+  <block wx:else>
+    <van-icon
+      wx:if="{{ icon }}"
+      size="1.2em"
+      name="{{ icon }}"
+      class-prefix="{{ classPrefix }}"
+      class="van-button__icon"
+      custom-style="line-height: inherit;"
+    />
+    <view class="van-button__text">
+      <slot />
+    </view>
+  </block>
+</button>

+ 39 - 0
wxcomponents/vant/dist/button/index.wxs

@@ -0,0 +1,39 @@
+/* eslint-disable */
+var style = require('../wxs/style.wxs');
+
+function rootStyle(data) {
+  if (!data.color) {
+    return data.customStyle;
+  }
+
+  var properties = {
+    color: data.plain ? data.color : '#fff',
+    background: data.plain ? null : data.color,
+  };
+
+  // hide border when color is linear-gradient
+  if (data.color.indexOf('gradient') !== -1) {
+    properties.border = 0;
+  } else {
+    properties['border-color'] = data.color;
+  }
+
+  return style([properties, data.customStyle]);
+}
+
+function loadingColor(data) {
+  if (data.plain) {
+    return data.color ? data.color : '#c9c9c9';
+  }
+
+  if (data.type === 'default') {
+    return '#c9c9c9';
+  }
+
+  return '#fff';
+}
+
+module.exports = {
+  rootStyle: rootStyle,
+  loadingColor: loadingColor,
+};

File diff suppressed because it is too large
+ 0 - 0
wxcomponents/vant/dist/button/index.wxss


+ 67 - 0
wxcomponents/vant/dist/calendar/calendar.wxml

@@ -0,0 +1,67 @@
+<view class="van-calendar">
+  <header
+    title="{{ title }}"
+    showTitle="{{ showTitle }}"
+    subtitle="{{ subtitle }}"
+    showSubtitle="{{ showSubtitle }}"
+    firstDayOfWeek="{{ firstDayOfWeek }}"
+  >
+    <slot name="title" slot="title"></slot>
+  </header>
+
+  <scroll-view
+    class="van-calendar__body"
+    scroll-y
+    scroll-into-view="{{ scrollIntoView }}"
+  >
+    <month
+      wx:for="{{ computed.getMonths(minDate, maxDate) }}"
+      wx:key="index"
+      id="month{{ index }}"
+      class="month"
+      data-date="{{ item }}"
+      date="{{ item }}"
+      type="{{ type }}"
+      color="{{ color }}"
+      minDate="{{ minDate }}"
+      maxDate="{{ maxDate }}"
+      showMark="{{ showMark }}"
+      formatter="{{ formatter }}"
+      rowHeight="{{ rowHeight }}"
+      currentDate="{{ currentDate }}"
+      showSubtitle="{{ showSubtitle }}"
+      allowSameDay="{{ allowSameDay }}"
+      showMonthTitle="{{ index !== 0 || !showSubtitle }}"
+      firstDayOfWeek="{{ firstDayOfWeek }}"
+      bind:click="onClickDay"
+    />
+  </scroll-view>
+
+  <view
+    class="{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}"
+  >
+    <slot name="footer"></slot>
+  </view>
+
+  <view
+    class="{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}"
+  >
+    <van-button
+      wx:if="{{ showConfirm }}"
+      round
+      block
+      type="danger"
+      color="{{ color }}"
+      custom-class="van-calendar__confirm"
+      disabled="{{ computed.getButtonDisabled(type, currentDate) }}"
+      nativeType="text"
+      bind:click="onConfirm"
+    >
+      {{
+        computed.getButtonDisabled(type, currentDate)
+          ? confirmDisabledText
+          : confirmText
+      }}
+    </van-button>
+  </view>
+</view>

+ 1 - 0
wxcomponents/vant/dist/calendar/components/header/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 34 - 0
wxcomponents/vant/dist/calendar/components/header/index.js

@@ -0,0 +1,34 @@
+import { VantComponent } from '../../../common/component';
+VantComponent({
+  props: {
+    title: {
+      type: String,
+      value: '日期选择',
+    },
+    subtitle: String,
+    showTitle: Boolean,
+    showSubtitle: Boolean,
+    firstDayOfWeek: {
+      type: Number,
+      observer: 'initWeekDay',
+    },
+  },
+  data: {
+    weekdays: [],
+  },
+  created() {
+    this.initWeekDay();
+  },
+  methods: {
+    initWeekDay() {
+      const defaultWeeks = ['日', '一', '二', '三', '四', '五', '六'];
+      const firstDayOfWeek = this.data.firstDayOfWeek || 0;
+      this.setData({
+        weekdays: [
+          ...defaultWeeks.slice(firstDayOfWeek, 7),
+          ...defaultWeeks.slice(0, firstDayOfWeek),
+        ],
+      });
+    },
+  },
+});

+ 0 - 0
vantComponents/vant-weapp/dropdown-menu/index.json → wxcomponents/vant/dist/calendar/components/header/index.json


+ 16 - 0
wxcomponents/vant/dist/calendar/components/header/index.wxml

@@ -0,0 +1,16 @@
+<view class="van-calendar__header">
+  <block wx:if="{{ showTitle }}">
+    <view class="van-calendar__header-title"><slot name="title"></slot></view>
+    <view class="van-calendar__header-title">{{ title }}</view>
+  </block>
+
+  <view wx:if="{{ showSubtitle }}" class="van-calendar__header-subtitle">
+    {{ subtitle }}
+  </view>
+
+  <view class="van-calendar__weekdays">
+    <view wx:for="{{ weekdays }}" wx:key="index" class="van-calendar__weekday">
+      {{ item }}
+    </view>
+  </view>
+</view>

+ 1 - 0
wxcomponents/vant/dist/calendar/components/header/index.wxss

@@ -0,0 +1 @@
+@import '../../../common/index.wxss';.van-calendar__header{-webkit-flex-shrink:0;flex-shrink:0;box-shadow:0 2px 10px rgba(125,126,128,.16);box-shadow:var(--calendar-header-box-shadow,0 2px 10px rgba(125,126,128,.16))}.van-calendar__header-subtitle,.van-calendar__header-title{text-align:center;height:44px;height:var(--calendar-header-title-height,44px);font-weight:500;font-weight:var(--font-weight-bold,500);line-height:44px;line-height:var(--calendar-header-title-height,44px)}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:-webkit-flex;display:flex}.van-calendar__weekday{-webkit-flex:1;flex:1;text-align:center;font-size:12px;font-size:var(--calendar-weekdays-font-size,12px);line-height:30px;line-height:var(--calendar-weekdays-height,30px)}

+ 1 - 0
wxcomponents/vant/dist/calendar/components/month/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 163 - 0
wxcomponents/vant/dist/calendar/components/month/index.js

@@ -0,0 +1,163 @@
+import { VantComponent } from '../../../common/component';
+import {
+  getMonthEndDay,
+  compareDay,
+  getPrevDay,
+  getNextDay,
+} from '../../utils';
+VantComponent({
+  props: {
+    date: {
+      type: null,
+      observer: 'setDays',
+    },
+    type: {
+      type: String,
+      observer: 'setDays',
+    },
+    color: String,
+    minDate: {
+      type: null,
+      observer: 'setDays',
+    },
+    maxDate: {
+      type: null,
+      observer: 'setDays',
+    },
+    showMark: Boolean,
+    rowHeight: null,
+    formatter: {
+      type: null,
+      observer: 'setDays',
+    },
+    currentDate: {
+      type: null,
+      observer: 'setDays',
+    },
+    firstDayOfWeek: {
+      type: Number,
+      observer: 'setDays',
+    },
+    allowSameDay: Boolean,
+    showSubtitle: Boolean,
+    showMonthTitle: Boolean,
+  },
+  data: {
+    visible: true,
+    days: [],
+  },
+  methods: {
+    onClick(event) {
+      const { index } = event.currentTarget.dataset;
+      const item = this.data.days[index];
+      if (item.type !== 'disabled') {
+        this.$emit('click', item);
+      }
+    },
+    setDays() {
+      const days = [];
+      const startDate = new Date(this.data.date);
+      const year = startDate.getFullYear();
+      const month = startDate.getMonth();
+      const totalDay = getMonthEndDay(
+        startDate.getFullYear(),
+        startDate.getMonth() + 1
+      );
+      for (let day = 1; day <= totalDay; day++) {
+        const date = new Date(year, month, day);
+        const type = this.getDayType(date);
+        let config = {
+          date,
+          type,
+          text: day,
+          bottomInfo: this.getBottomInfo(type),
+        };
+        if (this.data.formatter) {
+          config = this.data.formatter(config);
+        }
+        days.push(config);
+      }
+      this.setData({ days });
+    },
+    getMultipleDayType(day) {
+      const { currentDate } = this.data;
+      if (!Array.isArray(currentDate)) {
+        return '';
+      }
+      const isSelected = (date) =>
+        currentDate.some((item) => compareDay(item, date) === 0);
+      if (isSelected(day)) {
+        const prevDay = getPrevDay(day);
+        const nextDay = getNextDay(day);
+        const prevSelected = isSelected(prevDay);
+        const nextSelected = isSelected(nextDay);
+        if (prevSelected && nextSelected) {
+          return 'multiple-middle';
+        }
+        if (prevSelected) {
+          return 'end';
+        }
+        return nextSelected ? 'start' : 'multiple-selected';
+      }
+      return '';
+    },
+    getRangeDayType(day) {
+      const { currentDate, allowSameDay } = this.data;
+      if (!Array.isArray(currentDate)) {
+        return '';
+      }
+      const [startDay, endDay] = currentDate;
+      if (!startDay) {
+        return '';
+      }
+      const compareToStart = compareDay(day, startDay);
+      if (!endDay) {
+        return compareToStart === 0 ? 'start' : '';
+      }
+      const compareToEnd = compareDay(day, endDay);
+      if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {
+        return 'start-end';
+      }
+      if (compareToStart === 0) {
+        return 'start';
+      }
+      if (compareToEnd === 0) {
+        return 'end';
+      }
+      if (compareToStart > 0 && compareToEnd < 0) {
+        return 'middle';
+      }
+      return '';
+    },
+    getDayType(day) {
+      const { type, minDate, maxDate, currentDate } = this.data;
+      if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) {
+        return 'disabled';
+      }
+      if (type === 'single') {
+        return compareDay(day, currentDate) === 0 ? 'selected' : '';
+      }
+      if (type === 'multiple') {
+        return this.getMultipleDayType(day);
+      }
+      /* istanbul ignore else */
+      if (type === 'range') {
+        return this.getRangeDayType(day);
+      }
+      return '';
+    },
+    getBottomInfo(type) {
+      if (this.data.type === 'range') {
+        if (type === 'start') {
+          return '开始';
+        }
+        if (type === 'end') {
+          return '结束';
+        }
+        if (type === 'start-end') {
+          return '开始/结束';
+        }
+      }
+    },
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/calendar/components/month/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 39 - 0
wxcomponents/vant/dist/calendar/components/month/index.wxml

@@ -0,0 +1,39 @@
+<wxs src="./index.wxs" module="computed"></wxs>
+<wxs src="../../../wxs/utils.wxs" module="utils" />
+
+<view class="van-calendar__month" style="{{ computed.getMonthStyle(visible, date, rowHeight) }}">
+  <view wx:if="{{ showMonthTitle }}" class="van-calendar__month-title">
+    {{ computed.formatMonthTitle(date) }}
+  </view>
+
+  <view wx:if="{{ visible }}" class="van-calendar__days">
+    <view wx:if="{{ showMark }}" class="van-calendar__month-mark">
+      {{ computed.getMark(date) }}
+    </view>
+
+    <view
+      wx:for="{{ days }}"
+      wx:key="index"
+      style="{{ computed.getDayStyle(item.type, index, date, rowHeight, color, firstDayOfWeek) }}"
+      class="{{ utils.bem('calendar__day', [item.type]) }} {{ item.className }}"
+      data-index="{{ index }}"
+      bindtap="onClick"
+    >
+      <view wx:if="{{ item.type === 'selected' }}" class="van-calendar__selected-day" style="background: {{ color }}">
+        <view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view>
+        {{ item.text }}
+        <view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info">
+          {{ item.bottomInfo }}
+        </view>
+      </view>
+
+      <view wx:else>
+        <view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view>
+        {{ item.text }}
+        <view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info">
+          {{ item.bottomInfo }}
+        </view>
+      </view>
+    </view>
+  </view>
+</view>

+ 71 - 0
wxcomponents/vant/dist/calendar/components/month/index.wxs

@@ -0,0 +1,71 @@
+/* eslint-disable */
+var utils = require('../../utils.wxs');
+
+function getMark(date) {
+  return getDate(date).getMonth() + 1;
+}
+
+var ROW_HEIGHT = 64;
+
+function getDayStyle(type, index, date, rowHeight, color, firstDayOfWeek) {
+  var style = [];
+  var current = getDate(date).getDay() || 7;
+  var offset = current < firstDayOfWeek ? (7 - firstDayOfWeek + current) :
+               current === 7 && firstDayOfWeek === 0 ? 0 :
+               (current - firstDayOfWeek);
+
+  if (index === 0) {
+    style.push(['margin-left', (100 * offset) / 7 + '%']);
+  }
+
+  if (rowHeight !== ROW_HEIGHT) {
+    style.push(['height', rowHeight + 'px']);
+  }
+
+  if (color) {
+    if (
+      type === 'start' ||
+      type === 'end' ||
+      type === 'start-end' ||
+      type === 'multiple-selected' ||
+      type === 'multiple-middle'
+    ) {
+      style.push(['background', color]);
+    } else if (type === 'middle') {
+      style.push(['color', color]);
+    }
+  }
+
+  return style
+    .map(function(item) {
+      return item.join(':');
+    })
+    .join(';');
+}
+
+function formatMonthTitle(date) {
+  date = getDate(date);
+  return date.getFullYear() + '年' + (date.getMonth() + 1) + '月';
+}
+
+function getMonthStyle(visible, date, rowHeight) {
+  if (!visible) {
+    date = getDate(date);
+
+    var totalDay = utils.getMonthEndDay(
+      date.getFullYear(),
+      date.getMonth() + 1
+    );
+    var offset = getDate(date).getDay();
+    var padding = Math.ceil((totalDay + offset) / 7) * rowHeight;
+
+    return 'padding-bottom:' + padding + 'px';
+  }
+}
+
+module.exports = {
+  getMark: getMark,
+  getDayStyle: getDayStyle,
+  formatMonthTitle: formatMonthTitle,
+  getMonthStyle: getMonthStyle
+};

File diff suppressed because it is too large
+ 0 - 0
wxcomponents/vant/dist/calendar/components/month/index.wxss


+ 1 - 0
wxcomponents/vant/dist/calendar/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 309 - 0
wxcomponents/vant/dist/calendar/index.js

@@ -0,0 +1,309 @@
+import { VantComponent } from '../common/component';
+import {
+  ROW_HEIGHT,
+  getNextDay,
+  compareDay,
+  copyDates,
+  calcDateNum,
+  formatMonthTitle,
+  compareMonth,
+  getMonths,
+  getDayByOffset,
+} from './utils';
+import Toast from '../toast/toast';
+import { requestAnimationFrame } from '../common/utils';
+VantComponent({
+  props: {
+    title: {
+      type: String,
+      value: '日期选择',
+    },
+    color: String,
+    show: {
+      type: Boolean,
+      observer(val) {
+        if (val) {
+          this.initRect();
+          this.scrollIntoView();
+        }
+      },
+    },
+    formatter: null,
+    confirmText: {
+      type: String,
+      value: '确定',
+    },
+    rangePrompt: String,
+    showRangePrompt: {
+      type: Boolean,
+      value: true,
+    },
+    defaultDate: {
+      type: null,
+      observer(val) {
+        this.setData({ currentDate: val });
+        this.scrollIntoView();
+      },
+    },
+    allowSameDay: Boolean,
+    confirmDisabledText: String,
+    type: {
+      type: String,
+      value: 'single',
+      observer: 'reset',
+    },
+    minDate: {
+      type: null,
+      value: Date.now(),
+    },
+    maxDate: {
+      type: null,
+      value: new Date(
+        new Date().getFullYear(),
+        new Date().getMonth() + 6,
+        new Date().getDate()
+      ).getTime(),
+    },
+    position: {
+      type: String,
+      value: 'bottom',
+    },
+    rowHeight: {
+      type: null,
+      value: ROW_HEIGHT,
+    },
+    round: {
+      type: Boolean,
+      value: true,
+    },
+    poppable: {
+      type: Boolean,
+      value: true,
+    },
+    showMark: {
+      type: Boolean,
+      value: true,
+    },
+    showTitle: {
+      type: Boolean,
+      value: true,
+    },
+    showConfirm: {
+      type: Boolean,
+      value: true,
+    },
+    showSubtitle: {
+      type: Boolean,
+      value: true,
+    },
+    safeAreaInsetBottom: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickOverlay: {
+      type: Boolean,
+      value: true,
+    },
+    maxRange: {
+      type: null,
+      value: null,
+    },
+    firstDayOfWeek: {
+      type: Number,
+      value: 0,
+    },
+  },
+  data: {
+    subtitle: '',
+    currentDate: null,
+    scrollIntoView: '',
+  },
+  created() {
+    this.setData({
+      currentDate: this.getInitialDate(),
+    });
+  },
+  mounted() {
+    if (this.data.show || !this.data.poppable) {
+      this.initRect();
+      this.scrollIntoView();
+    }
+  },
+  methods: {
+    reset() {
+      this.setData({ currentDate: this.getInitialDate() });
+      this.scrollIntoView();
+    },
+    initRect() {
+      if (this.contentObserver != null) {
+        this.contentObserver.disconnect();
+      }
+      const contentObserver = this.createIntersectionObserver({
+        thresholds: [0, 0.1, 0.9, 1],
+        observeAll: true,
+      });
+      this.contentObserver = contentObserver;
+      contentObserver.relativeTo('.van-calendar__body');
+      contentObserver.observe('.month', (res) => {
+        if (res.boundingClientRect.top <= res.relativeRect.top) {
+          // @ts-ignore
+          this.setData({ subtitle: formatMonthTitle(res.dataset.date) });
+        }
+      });
+    },
+    getInitialDate() {
+      const { type, defaultDate, minDate } = this.data;
+      if (type === 'range') {
+        const [startDay, endDay] = defaultDate || [];
+        return [
+          startDay || minDate,
+          endDay || getNextDay(new Date(minDate)).getTime(),
+        ];
+      }
+      if (type === 'multiple') {
+        return defaultDate || [minDate];
+      }
+      return defaultDate || minDate;
+    },
+    scrollIntoView() {
+      requestAnimationFrame(() => {
+        const {
+          currentDate,
+          type,
+          show,
+          poppable,
+          minDate,
+          maxDate,
+        } = this.data;
+        // @ts-ignore
+        const targetDate = type === 'single' ? currentDate : currentDate[0];
+        const displayed = show || !poppable;
+        if (!targetDate || !displayed) {
+          return;
+        }
+        const months = getMonths(minDate, maxDate);
+        months.some((month, index) => {
+          if (compareMonth(month, targetDate) === 0) {
+            this.setData({ scrollIntoView: `month${index}` });
+            return true;
+          }
+          return false;
+        });
+      });
+    },
+    onOpen() {
+      this.$emit('open');
+    },
+    onOpened() {
+      this.$emit('opened');
+    },
+    onClose() {
+      this.$emit('close');
+    },
+    onClosed() {
+      this.$emit('closed');
+    },
+    onClickDay(event) {
+      const { date } = event.detail;
+      const { type, currentDate, allowSameDay } = this.data;
+      if (type === 'range') {
+        // @ts-ignore
+        const [startDay, endDay] = currentDate;
+        if (startDay && !endDay) {
+          const compareToStart = compareDay(date, startDay);
+          if (compareToStart === 1) {
+            this.select([startDay, date], true);
+          } else if (compareToStart === -1) {
+            this.select([date, null]);
+          } else if (allowSameDay) {
+            this.select([date, date]);
+          }
+        } else {
+          this.select([date, null]);
+        }
+      } else if (type === 'multiple') {
+        let selectedIndex;
+        // @ts-ignore
+        const selected = currentDate.some((dateItem, index) => {
+          const equal = compareDay(dateItem, date) === 0;
+          if (equal) {
+            selectedIndex = index;
+          }
+          return equal;
+        });
+        if (selected) {
+          // @ts-ignore
+          const cancelDate = currentDate.splice(selectedIndex, 1);
+          this.setData({ currentDate });
+          this.unselect(cancelDate);
+        } else {
+          // @ts-ignore
+          this.select([...currentDate, date]);
+        }
+      } else {
+        this.select(date, true);
+      }
+    },
+    unselect(dateArray) {
+      const date = dateArray[0];
+      if (date) {
+        this.$emit('unselect', copyDates(date));
+      }
+    },
+    select(date, complete) {
+      if (complete && this.data.type === 'range') {
+        const valid = this.checkRange(date);
+        if (!valid) {
+          // auto selected to max range if showConfirm
+          if (this.data.showConfirm) {
+            this.emit([
+              date[0],
+              getDayByOffset(date[0], this.data.maxRange - 1),
+            ]);
+          } else {
+            this.emit(date);
+          }
+          return;
+        }
+      }
+      this.emit(date);
+      if (complete && !this.data.showConfirm) {
+        this.onConfirm();
+      }
+    },
+    emit(date) {
+      const getTime = (date) => (date instanceof Date ? date.getTime() : date);
+      this.setData({
+        currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),
+      });
+      this.$emit('select', copyDates(date));
+    },
+    checkRange(date) {
+      const { maxRange, rangePrompt, showRangePrompt } = this.data;
+      if (maxRange && calcDateNum(date) > maxRange) {
+        if (showRangePrompt) {
+          Toast({
+            duration: 0,
+            context: this,
+            message: rangePrompt || `选择天数不能超过 ${maxRange} 天`,
+          });
+        }
+        this.$emit('over-range');
+        return false;
+      }
+      return true;
+    },
+    onConfirm() {
+      if (
+        this.data.type === 'range' &&
+        !this.checkRange(this.data.currentDate)
+      ) {
+        return;
+      }
+      wx.nextTick(() => {
+        // @ts-ignore
+        this.$emit('confirm', copyDates(this.data.currentDate));
+      });
+    },
+  },
+});

+ 10 - 0
wxcomponents/vant/dist/calendar/index.json

@@ -0,0 +1,10 @@
+{
+  "component": true,
+  "usingComponents": {
+    "header": "./components/header/index",
+    "month": "./components/month/index",
+    "van-button": "../button/index",
+    "van-popup": "../popup/index",
+    "van-toast": "../toast/index"
+  }
+}

+ 25 - 0
wxcomponents/vant/dist/calendar/index.wxml

@@ -0,0 +1,25 @@
+<wxs src="./index.wxs" module="computed" />
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<import src="./calendar.wxml" />
+
+<van-popup
+  wx:if="{{ poppable }}"
+  custom-class="van-calendar__popup--{{ position }}"
+  close-icon-class="van-calendar__close-icon"
+  show="{{ show }}"
+  round="{{ round }}"
+  position="{{ position }}"
+  closeable="{{ showTitle || showSubtitle }}"
+  close-on-click-overlay="{{ closeOnClickOverlay }}"
+  bind:enter="onOpen"
+  bind:close="onClose"
+  bind:after-enter="onOpened"
+  bind:after-leave="onClosed"
+>
+  <include src="calendar.wxml" />
+</van-popup>
+
+<include wx:else src="calendar.wxml" />
+
+<van-toast id="van-toast" />

+ 37 - 0
wxcomponents/vant/dist/calendar/index.wxs

@@ -0,0 +1,37 @@
+/* eslint-disable */
+var utils = require('./utils.wxs');
+
+function getMonths(minDate, maxDate) {
+  var months = [];
+  var cursor = getDate(minDate);
+
+  cursor.setDate(1);
+
+  do {
+    months.push(cursor.getTime());
+    cursor.setMonth(cursor.getMonth() + 1);
+  } while (utils.compareMonth(cursor, getDate(maxDate)) !== 1);
+
+  return months;
+}
+
+function getButtonDisabled(type, currentDate) {
+  if (currentDate == null) {
+    return true;
+  }
+
+  if (type === 'range') {
+    return !currentDate[0] || !currentDate[1];
+  }
+
+  if (type === 'multiple') {
+    return !currentDate.length;
+  }
+
+  return !currentDate;
+}
+
+module.exports = {
+  getMonths: getMonths,
+  getButtonDisabled: getButtonDisabled
+};

+ 1 - 0
wxcomponents/vant/dist/calendar/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-calendar{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:100%;height:var(--calendar-height,100%);background-color:#fff;background-color:var(--calendar-background-color,#fff)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:80%;height:var(--calendar-popup-height,80%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-flex:1;flex:1;overflow:auto;-webkit-overflow-scrolling:touch}.van-calendar__footer{-webkit-flex-shrink:0;flex-shrink:0;padding:0 16px;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:36px!important;height:var(--calendar-confirm-button-height,36px)!important;margin:7px 0!important;margin:var(--calendar-confirm-button-margin,7px 0)!important;line-height:34px!important;line-height:var(--calendar-confirm-button-line-height,34px)!important}

+ 17 - 0
wxcomponents/vant/dist/calendar/utils.d.ts

@@ -0,0 +1,17 @@
+export declare const ROW_HEIGHT = 64;
+export declare function formatMonthTitle(date: Date): string;
+export declare function compareMonth(
+  date1: Date | number,
+  date2: Date | number
+): 1 | -1 | 0;
+export declare function compareDay(
+  day1: Date | number,
+  day2: Date | number
+): 1 | -1 | 0;
+export declare function getDayByOffset(date: Date, offset: number): Date;
+export declare function getPrevDay(date: Date): Date;
+export declare function getNextDay(date: Date): Date;
+export declare function calcDateNum(date: [Date, Date]): number;
+export declare function copyDates(dates: Date | Date[]): Date | Date[];
+export declare function getMonthEndDay(year: number, month: number): number;
+export declare function getMonths(minDate: number, maxDate: number): number[];

+ 78 - 0
wxcomponents/vant/dist/calendar/utils.js

@@ -0,0 +1,78 @@
+export const ROW_HEIGHT = 64;
+export function formatMonthTitle(date) {
+  if (!(date instanceof Date)) {
+    date = new Date(date);
+  }
+  return `${date.getFullYear()}年${date.getMonth() + 1}月`;
+}
+export function compareMonth(date1, date2) {
+  if (!(date1 instanceof Date)) {
+    date1 = new Date(date1);
+  }
+  if (!(date2 instanceof Date)) {
+    date2 = new Date(date2);
+  }
+  const year1 = date1.getFullYear();
+  const year2 = date2.getFullYear();
+  const month1 = date1.getMonth();
+  const month2 = date2.getMonth();
+  if (year1 === year2) {
+    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
+  }
+  return year1 > year2 ? 1 : -1;
+}
+export function compareDay(day1, day2) {
+  if (!(day1 instanceof Date)) {
+    day1 = new Date(day1);
+  }
+  if (!(day2 instanceof Date)) {
+    day2 = new Date(day2);
+  }
+  const compareMonthResult = compareMonth(day1, day2);
+  if (compareMonthResult === 0) {
+    const date1 = day1.getDate();
+    const date2 = day2.getDate();
+    return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
+  }
+  return compareMonthResult;
+}
+export function getDayByOffset(date, offset) {
+  date = new Date(date);
+  date.setDate(date.getDate() + offset);
+  return date;
+}
+export function getPrevDay(date) {
+  return getDayByOffset(date, -1);
+}
+export function getNextDay(date) {
+  return getDayByOffset(date, 1);
+}
+export function calcDateNum(date) {
+  const day1 = new Date(date[0]).getTime();
+  const day2 = new Date(date[1]).getTime();
+  return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;
+}
+export function copyDates(dates) {
+  if (Array.isArray(dates)) {
+    return dates.map((date) => {
+      if (date === null) {
+        return date;
+      }
+      return new Date(date);
+    });
+  }
+  return new Date(dates);
+}
+export function getMonthEndDay(year, month) {
+  return 32 - new Date(year, month - 1, 32).getDate();
+}
+export function getMonths(minDate, maxDate) {
+  const months = [];
+  const cursor = new Date(minDate);
+  cursor.setDate(1);
+  do {
+    months.push(cursor.getTime());
+    cursor.setMonth(cursor.getMonth() + 1);
+  } while (compareMonth(cursor, maxDate) !== 1);
+  return months;
+}

+ 25 - 0
wxcomponents/vant/dist/calendar/utils.wxs

@@ -0,0 +1,25 @@
+/* eslint-disable */
+function getMonthEndDay(year, month) {
+  return 32 -  getDate(year, month - 1, 32).getDate();
+}
+
+function compareMonth(date1, date2) {
+  date1 = getDate(date1);
+  date2 = getDate(date2);
+
+  var year1 = date1.getFullYear();
+  var year2 = date2.getFullYear();
+  var month1 = date1.getMonth();
+  var month2 = date2.getMonth();
+
+  if (year1 === year2) {
+    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
+  }
+
+  return year1 > year2 ? 1 : -1;
+}
+
+module.exports = {
+  getMonthEndDay: getMonthEndDay,
+  compareMonth: compareMonth
+};

+ 1 - 0
wxcomponents/vant/dist/card/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 49 - 0
wxcomponents/vant/dist/card/index.js

@@ -0,0 +1,49 @@
+import { link } from '../mixins/link';
+import { VantComponent } from '../common/component';
+VantComponent({
+  classes: [
+    'num-class',
+    'desc-class',
+    'thumb-class',
+    'title-class',
+    'price-class',
+    'origin-price-class',
+  ],
+  mixins: [link],
+  props: {
+    tag: String,
+    num: String,
+    desc: String,
+    thumb: String,
+    title: String,
+    price: {
+      type: String,
+      observer: 'updatePrice',
+    },
+    centered: Boolean,
+    lazyLoad: Boolean,
+    thumbLink: String,
+    originPrice: String,
+    thumbMode: {
+      type: String,
+      value: 'aspectFit',
+    },
+    currency: {
+      type: String,
+      value: '¥',
+    },
+  },
+  methods: {
+    updatePrice() {
+      const { price } = this.data;
+      const priceArr = price.toString().split('.');
+      this.setData({
+        integerStr: priceArr[0],
+        decimalStr: priceArr[1] ? `.${priceArr[1]}` : '',
+      });
+    },
+    onClickThumb() {
+      this.jumpLink('thumbLink');
+    },
+  },
+});

+ 6 - 0
wxcomponents/vant/dist/card/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-tag": "../tag/index"
+  }
+}

+ 56 - 0
wxcomponents/vant/dist/card/index.wxml

@@ -0,0 +1,56 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<view class="custom-class van-card">
+  <view class="{{ utils.bem('card__header', { center: centered }) }}">
+    <view class="van-card__thumb" bind:tap="onClickThumb">
+      <image
+        wx:if="{{ thumb }}"
+        src="{{ thumb }}"
+        mode="{{ thumbMode }}"
+        lazy-load="{{ lazyLoad }}"
+        class="van-card__img thumb-class"
+      />
+      <slot wx:else name="thumb" />
+      <van-tag
+        wx:if="{{ tag }}"
+        mark
+        type="danger"
+        custom-class="van-card__tag"
+      >
+        {{ tag }}
+      </van-tag>
+      <slot wx:else name="tag" />
+    </view>
+
+    <view class="van-card__content {{ utils.bem('card__content', { center: centered }) }}">
+      <view>
+        <view wx:if="{{ title }}" class="van-card__title title-class">{{ title }}</view>
+        <slot wx:else name="title" />
+
+        <view wx:if="{{ desc }}" class="van-card__desc desc-class">{{ desc }}</view>
+        <slot wx:else name="desc" />
+
+        <slot name="tags" />
+      </view>
+
+      <view class="van-card__bottom">
+        <slot name="price-top" />
+        <view wx:if="{{ price || price === 0 }}" class="van-card__price price-class">
+          <text>{{ currency }}</text>
+          <text class="van-card__price-integer">{{ integerStr }}</text>
+          <text class="van-card__price-decimal">{{ decimalStr }}</text>
+        </view>
+        <slot wx:else name="price" />
+        <view wx:if="{{ originPrice || originPrice === 0 }}" class="van-card__origin-price origin-price-class">{{ currency }} {{ originPrice }}</view>
+        <slot wx:else name="origin-price" />
+        <view wx:if="{{ num }}" class="van-card__num num-class">x {{ num }}</view>
+        <slot wx:else  name="num" />
+        <slot name="bottom" />
+      </view>
+    </view>
+  </view>
+
+  <view class="van-card__footer">
+    <slot name="footer" />
+  </view>
+</view>

File diff suppressed because it is too large
+ 0 - 0
wxcomponents/vant/dist/card/index.wxss


+ 1 - 0
wxcomponents/vant/dist/cell-group/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 10 - 0
wxcomponents/vant/dist/cell-group/index.js

@@ -0,0 +1,10 @@
+import { VantComponent } from '../common/component';
+VantComponent({
+  props: {
+    title: String,
+    border: {
+      type: Boolean,
+      value: true,
+    },
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/cell-group/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 9 - 0
wxcomponents/vant/dist/cell-group/index.wxml

@@ -0,0 +1,9 @@
+<view
+  wx:if="{{ title }}"
+  class="van-cell-group__title"
+>
+  {{ title }}
+</view>
+<view class="custom-class van-cell-group {{ border ? 'van-hairline--top-bottom' : '' }}">
+  <slot />
+</view>

+ 1 - 0
wxcomponents/vant/dist/cell-group/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-cell-group__title{padding:16px 16px 8px;padding:var(--cell-group-title-padding,16px 16px 8px);font-size:14px;font-size:var(--cell-group-title-font-size,14px);line-height:16px;line-height:var(--cell-group-title-line-height,16px);color:#969799;color:var(--cell-group-title-color,#969799)}

+ 1 - 0
wxcomponents/vant/dist/cell/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 38 - 0
wxcomponents/vant/dist/cell/index.js

@@ -0,0 +1,38 @@
+import { link } from '../mixins/link';
+import { VantComponent } from '../common/component';
+VantComponent({
+  classes: [
+    'title-class',
+    'label-class',
+    'value-class',
+    'right-icon-class',
+    'hover-class',
+  ],
+  mixins: [link],
+  props: {
+    title: null,
+    value: null,
+    icon: String,
+    size: String,
+    label: String,
+    center: Boolean,
+    isLink: Boolean,
+    required: Boolean,
+    clickable: Boolean,
+    titleWidth: String,
+    customStyle: String,
+    arrowDirection: String,
+    useLabelSlot: Boolean,
+    border: {
+      type: Boolean,
+      value: true,
+    },
+    titleStyle: String,
+  },
+  methods: {
+    onClick(event) {
+      this.$emit('click', event.detail);
+      this.jumpLink();
+    },
+  },
+});

+ 6 - 0
wxcomponents/vant/dist/cell/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index"
+  }
+}

+ 47 - 0
wxcomponents/vant/dist/cell/index.wxml

@@ -0,0 +1,47 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+<wxs src="./index.wxs" module="computed" />
+
+<view
+  class="custom-class {{ utils.bem('cell', [size, { center, required, borderless: !border, clickable: isLink || clickable }]) }}"
+  hover-class="van-cell--hover hover-class"
+  hover-stay-time="70"
+  style="{{ customStyle }}"
+  bind:tap="onClick"
+>
+  <van-icon
+    wx:if="{{ icon }}"
+    name="{{ icon }}"
+    class="van-cell__left-icon-wrap"
+    custom-class="van-cell__left-icon"
+  />
+  <slot wx:else name="icon" />
+
+  <view
+    style="{{ computed.titleStyle({ titleWidth, titleStyle }) }}"
+    class="van-cell__title title-class"
+  >
+
+    <block wx:if="{{ title }}">{{ title }}</block>
+    <slot wx:else name="title" />
+
+    <view wx:if="{{ label || useLabelSlot }}" class="van-cell__label label-class">
+      <slot wx:if="{{ useLabelSlot }}" name="label" />
+      <block wx:elif="{{ label }}">{{ label }}</block>
+    </view>
+  </view>
+
+  <view class="van-cell__value value-class">
+    <block wx:if="{{ value || value === 0 }}">{{ value }}</block>
+    <slot wx:else />
+  </view>
+
+  <van-icon
+    wx:if="{{ isLink }}"
+    name="{{ arrowDirection ? 'arrow' + '-' + arrowDirection : 'arrow' }}"
+    class="van-cell__right-icon-wrap right-icon-class"
+    custom-class="van-cell__right-icon"
+  />
+  <slot wx:else name="right-icon" />
+
+  <slot name="extra" />
+</view>

+ 17 - 0
wxcomponents/vant/dist/cell/index.wxs

@@ -0,0 +1,17 @@
+/* eslint-disable */
+var style = require('../wxs/style.wxs');
+var addUnit = require('../wxs/add-unit.wxs');
+
+function titleStyle(data) {
+  return style([
+    {
+      'max-width': addUnit(data.titleWidth),
+      'min-width': addUnit(data.titleWidth),
+    },
+    data.titleStyle,
+  ]);
+}
+
+module.exports = {
+  titleStyle: titleStyle,
+};

File diff suppressed because it is too large
+ 0 - 0
wxcomponents/vant/dist/cell/index.wxss


+ 1 - 0
wxcomponents/vant/dist/checkbox-group/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 31 - 0
wxcomponents/vant/dist/checkbox-group/index.js

@@ -0,0 +1,31 @@
+import { useChildren } from '../common/relation';
+import { VantComponent } from '../common/component';
+VantComponent({
+  field: true,
+  relation: useChildren('checkbox', function (target) {
+    this.updateChild(target);
+  }),
+  props: {
+    max: Number,
+    value: {
+      type: Array,
+      observer: 'updateChildren',
+    },
+    disabled: {
+      type: Boolean,
+      observer: 'updateChildren',
+    },
+  },
+  methods: {
+    updateChildren() {
+      this.children.forEach((child) => this.updateChild(child));
+    },
+    updateChild(child) {
+      const { value, disabled } = this.data;
+      child.setData({
+        value: value.indexOf(child.data.name) !== -1,
+        parentDisabled: disabled,
+      });
+    },
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/checkbox-group/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 1 - 0
wxcomponents/vant/dist/checkbox-group/index.wxml

@@ -0,0 +1 @@
+<slot />

+ 1 - 0
wxcomponents/vant/dist/checkbox-group/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';

+ 1 - 0
wxcomponents/vant/dist/checkbox/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 74 - 0
wxcomponents/vant/dist/checkbox/index.js

@@ -0,0 +1,74 @@
+import { useParent } from '../common/relation';
+import { VantComponent } from '../common/component';
+function emit(target, value) {
+  target.$emit('input', value);
+  target.$emit('change', value);
+}
+VantComponent({
+  field: true,
+  relation: useParent('checkbox-group'),
+  classes: ['icon-class', 'label-class'],
+  props: {
+    value: Boolean,
+    disabled: Boolean,
+    useIconSlot: Boolean,
+    checkedColor: String,
+    labelPosition: {
+      type: String,
+      value: 'right',
+    },
+    labelDisabled: Boolean,
+    shape: {
+      type: String,
+      value: 'round',
+    },
+    iconSize: {
+      type: null,
+      value: 20,
+    },
+  },
+  data: {
+    parentDisabled: false,
+  },
+  methods: {
+    emitChange(value) {
+      if (this.parent) {
+        this.setParentValue(this.parent, value);
+      } else {
+        emit(this, value);
+      }
+    },
+    toggle() {
+      const { parentDisabled, disabled, value } = this.data;
+      if (!disabled && !parentDisabled) {
+        this.emitChange(!value);
+      }
+    },
+    onClickLabel() {
+      const { labelDisabled, parentDisabled, disabled, value } = this.data;
+      if (!disabled && !labelDisabled && !parentDisabled) {
+        this.emitChange(!value);
+      }
+    },
+    setParentValue(parent, value) {
+      const parentValue = parent.data.value.slice();
+      const { name } = this.data;
+      const { max } = parent.data;
+      if (value) {
+        if (max && parentValue.length >= max) {
+          return;
+        }
+        if (parentValue.indexOf(name) === -1) {
+          parentValue.push(name);
+          emit(parent, parentValue);
+        }
+      } else {
+        const index = parentValue.indexOf(name);
+        if (index !== -1) {
+          parentValue.splice(index, 1);
+          emit(parent, parentValue);
+        }
+      }
+    },
+  },
+});

+ 6 - 0
wxcomponents/vant/dist/checkbox/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index"
+  }
+}

+ 31 - 0
wxcomponents/vant/dist/checkbox/index.wxml

@@ -0,0 +1,31 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+<wxs src="./index.wxs" module="computed" />
+
+<view class="van-checkbox custom-class">
+  <view
+    wx:if="{{ labelPosition === 'left' }}"
+    class="label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}"
+    bindtap="onClickLabel"
+  >
+    <slot />
+  </view>
+  <view class="van-checkbox__icon-wrap" bindtap="toggle">
+    <slot wx:if="{{ useIconSlot }}" name="icon" />
+    <van-icon
+      wx:else
+      name="success"
+      size="0.8em"
+      class="{{ utils.bem('checkbox__icon', [shape, { disabled: disabled || parentDisabled, checked: value }]) }}"
+      style="{{ computed.iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) }}"
+      custom-class="icon-class"
+      custom-style="line-height: 1.25em;"
+    />
+  </view>
+  <view
+    wx:if="{{ labelPosition === 'right' }}"
+    class="label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}"
+    bindtap="onClickLabel"
+  >
+    <slot />
+  </view>
+</view>

+ 20 - 0
wxcomponents/vant/dist/checkbox/index.wxs

@@ -0,0 +1,20 @@
+/* eslint-disable */
+var style = require('../wxs/style.wxs');
+var addUnit = require('../wxs/add-unit.wxs');
+
+function iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) {
+  var styles = {
+    'font-size': addUnit(iconSize),
+  };
+
+  if (checkedColor && value && !disabled && !parentDisabled) {
+    styles['border-color'] = checkedColor;
+    styles['background-color'] = checkedColor;
+  }
+
+  return style(styles);
+}
+
+module.exports = {
+  iconStyle: iconStyle,
+};

+ 1 - 0
wxcomponents/vant/dist/checkbox/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-checkbox{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:20px;line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{-webkit-flex:none;flex:none}.van-checkbox__icon{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;width:1em;height:1em;color:transparent;text-align:center;transition-property:color,border-color,background-color;font-size:20px;font-size:var(--checkbox-size,20px);border:1px solid #c8c9cc;border:1px solid var(--checkbox-border-color,#c8c9cc);transition-duration:.2s;transition-duration:var(--checkbox-transition-duration,.2s)}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{color:#fff;color:var(--white,#fff);background-color:#1989fa;background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:#1989fa;border-color:var(--checkbox-checked-icon-color,#1989fa)}.van-checkbox__icon--disabled{background-color:#ebedf0;background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:#c8c9cc;border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:#c8c9cc;color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;margin-left:10px;margin-left:var(--checkbox-label-margin,10px);color:#323233;color:var(--checkbox-label-color,#323233)}.van-checkbox__label--left{float:left;margin:0 10px 0 0;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:#c8c9cc;color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0}

+ 6 - 0
wxcomponents/vant/dist/circle/canvas.d.ts

@@ -0,0 +1,6 @@
+/// <reference types="miniprogram-api-typings" />
+declare type CanvasContext = WechatMiniprogram.CanvasContext;
+export declare function adaptor(
+  ctx: CanvasContext & Record<string, unknown>
+): CanvasContext;
+export {};

+ 43 - 0
wxcomponents/vant/dist/circle/canvas.js

@@ -0,0 +1,43 @@
+export function adaptor(ctx) {
+  // @ts-ignore
+  return Object.assign(ctx, {
+    setStrokeStyle(val) {
+      ctx.strokeStyle = val;
+    },
+    setLineWidth(val) {
+      ctx.lineWidth = val;
+    },
+    setLineCap(val) {
+      ctx.lineCap = val;
+    },
+    setFillStyle(val) {
+      ctx.fillStyle = val;
+    },
+    setFontSize(val) {
+      ctx.font = String(val);
+    },
+    setGlobalAlpha(val) {
+      ctx.globalAlpha = val;
+    },
+    setLineJoin(val) {
+      ctx.lineJoin = val;
+    },
+    setTextAlign(val) {
+      ctx.textAlign = val;
+    },
+    setMiterLimit(val) {
+      ctx.miterLimit = val;
+    },
+    setShadow(offsetX, offsetY, blur, color) {
+      ctx.shadowOffsetX = offsetX;
+      ctx.shadowOffsetY = offsetY;
+      ctx.shadowBlur = blur;
+      ctx.shadowColor = color;
+    },
+    setTextBaseline(val) {
+      ctx.textBaseline = val;
+    },
+    createCircularGradient() {},
+    draw() {},
+  });
+}

+ 1 - 0
wxcomponents/vant/dist/circle/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 190 - 0
wxcomponents/vant/dist/circle/index.js

@@ -0,0 +1,190 @@
+import { BLUE, WHITE } from '../common/color';
+import { VantComponent } from '../common/component';
+import { getSystemInfoSync } from '../common/utils';
+import { isObj } from '../common/validator';
+import { canIUseCanvas2d } from '../common/version';
+import { adaptor } from './canvas';
+function format(rate) {
+  return Math.min(Math.max(rate, 0), 100);
+}
+const PERIMETER = 2 * Math.PI;
+const BEGIN_ANGLE = -Math.PI / 2;
+const STEP = 1;
+VantComponent({
+  props: {
+    text: String,
+    lineCap: {
+      type: String,
+      value: 'round',
+    },
+    value: {
+      type: Number,
+      value: 0,
+      observer: 'reRender',
+    },
+    speed: {
+      type: Number,
+      value: 50,
+    },
+    size: {
+      type: Number,
+      value: 100,
+      observer() {
+        this.drawCircle(this.currentValue);
+      },
+    },
+    fill: String,
+    layerColor: {
+      type: String,
+      value: WHITE,
+    },
+    color: {
+      type: null,
+      value: BLUE,
+      observer() {
+        this.setHoverColor().then(() => {
+          this.drawCircle(this.currentValue);
+        });
+      },
+    },
+    type: {
+      type: String,
+      value: '',
+    },
+    strokeWidth: {
+      type: Number,
+      value: 4,
+    },
+    clockwise: {
+      type: Boolean,
+      value: true,
+    },
+  },
+  data: {
+    hoverColor: BLUE,
+  },
+  methods: {
+    getContext() {
+      const { type, size } = this.data;
+      if (type === '' || !canIUseCanvas2d()) {
+        const ctx = wx.createCanvasContext('van-circle', this);
+        return Promise.resolve(ctx);
+      }
+      const dpr = getSystemInfoSync().pixelRatio;
+      return new Promise((resolve) => {
+        wx.createSelectorQuery()
+          .in(this)
+          .select('#van-circle')
+          .node()
+          .exec((res) => {
+            const canvas = res[0].node;
+            const ctx = canvas.getContext(type);
+            if (!this.inited) {
+              this.inited = true;
+              canvas.width = size * dpr;
+              canvas.height = size * dpr;
+              ctx.scale(dpr, dpr);
+            }
+            resolve(adaptor(ctx));
+          });
+      });
+    },
+    setHoverColor() {
+      const { color, size } = this.data;
+      if (isObj(color)) {
+        return this.getContext().then((context) => {
+          const LinearColor = context.createLinearGradient(size, 0, 0, 0);
+          Object.keys(color)
+            .sort((a, b) => parseFloat(a) - parseFloat(b))
+            .map((key) =>
+              LinearColor.addColorStop(parseFloat(key) / 100, color[key])
+            );
+          this.hoverColor = LinearColor;
+        });
+      }
+      this.hoverColor = color;
+      return Promise.resolve();
+    },
+    presetCanvas(context, strokeStyle, beginAngle, endAngle, fill) {
+      const { strokeWidth, lineCap, clockwise, size } = this.data;
+      const position = size / 2;
+      const radius = position - strokeWidth / 2;
+      context.setStrokeStyle(strokeStyle);
+      context.setLineWidth(strokeWidth);
+      context.setLineCap(lineCap);
+      context.beginPath();
+      context.arc(position, position, radius, beginAngle, endAngle, !clockwise);
+      context.stroke();
+      if (fill) {
+        context.setFillStyle(fill);
+        context.fill();
+      }
+    },
+    renderLayerCircle(context) {
+      const { layerColor, fill } = this.data;
+      this.presetCanvas(context, layerColor, 0, PERIMETER, fill);
+    },
+    renderHoverCircle(context, formatValue) {
+      const { clockwise } = this.data;
+      // 结束角度
+      const progress = PERIMETER * (formatValue / 100);
+      const endAngle = clockwise
+        ? BEGIN_ANGLE + progress
+        : 3 * Math.PI - (BEGIN_ANGLE + progress);
+      this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle);
+    },
+    drawCircle(currentValue) {
+      const { size } = this.data;
+      this.getContext().then((context) => {
+        context.clearRect(0, 0, size, size);
+        this.renderLayerCircle(context);
+        const formatValue = format(currentValue);
+        if (formatValue !== 0) {
+          this.renderHoverCircle(context, formatValue);
+        }
+        context.draw();
+      });
+    },
+    reRender() {
+      // tofector 动画暂时没有想到好的解决方案
+      const { value, speed } = this.data;
+      if (speed <= 0 || speed > 1000) {
+        this.drawCircle(value);
+        return;
+      }
+      this.clearInterval();
+      this.currentValue = this.currentValue || 0;
+      this.interval = setInterval(() => {
+        if (this.currentValue !== value) {
+          if (Math.abs(this.currentValue - value) < STEP) {
+            this.currentValue = value;
+          } else {
+            if (this.currentValue < value) {
+              this.currentValue += STEP;
+            } else {
+              this.currentValue -= STEP;
+            }
+          }
+          this.drawCircle(this.currentValue);
+        } else {
+          this.clearInterval();
+        }
+      }, 1000 / speed);
+    },
+    clearInterval() {
+      if (this.interval) {
+        clearInterval(this.interval);
+        this.interval = null;
+      }
+    },
+  },
+  mounted() {
+    this.currentValue = this.data.value;
+    this.setHoverColor().then(() => {
+      this.drawCircle(this.currentValue);
+    });
+  },
+  destroyed() {
+    this.clearInterval();
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/circle/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 9 - 0
wxcomponents/vant/dist/circle/index.wxml

@@ -0,0 +1,9 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<view class="van-circle">
+  <canvas class="van-circle__canvas" type="{{ type }}" style="width: {{ utils.addUnit(size) }};height:{{ utils.addUnit(size) }}" id="van-circle" canvas-id="van-circle"></canvas>
+  <view wx:if="{{ !text }}" class="van-circle__text">
+    <slot></slot>
+  </view>
+  <cover-view wx:else class="van-circle__text">{{ text }}</cover-view>
+</view>

+ 1 - 0
wxcomponents/vant/dist/circle/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-circle{position:relative;display:inline-block;text-align:center}.van-circle__text{position:absolute;top:50%;left:0;width:100%;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#323233;color:var(--circle-text-color,#323233)}

+ 1 - 0
wxcomponents/vant/dist/col/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 9 - 0
wxcomponents/vant/dist/col/index.js

@@ -0,0 +1,9 @@
+import { useParent } from '../common/relation';
+import { VantComponent } from '../common/component';
+VantComponent({
+  relation: useParent('row'),
+  props: {
+    span: Number,
+    offset: Number,
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/col/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 9 - 0
wxcomponents/vant/dist/col/index.wxml

@@ -0,0 +1,9 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+<wxs src="./index.wxs" module="computed" />
+
+<view
+  class="custom-class {{ utils.bem('col', [span]) }} {{ offset ? 'van-col--offset-' + offset : '' }}"
+  style="{{ computed.rootStyle({ gutter }) }}"
+>
+  <slot />
+</view>

+ 18 - 0
wxcomponents/vant/dist/col/index.wxs

@@ -0,0 +1,18 @@
+/* eslint-disable */
+var style = require('../wxs/style.wxs');
+var addUnit = require('../wxs/add-unit.wxs');
+
+function rootStyle(data) {
+  if (!data.gutter) {
+    return '';
+  }
+
+  return style({
+    'padding-right': addUnit(data.gutter / 2),
+    'padding-left': addUnit(data.gutter / 2),
+  });
+}
+
+module.exports = {
+  rootStyle: rootStyle,
+};

+ 1 - 0
wxcomponents/vant/dist/col/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-col{float:left;box-sizing:border-box}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%}

+ 6 - 0
wxcomponents/vant/dist/collapse-item/animate.d.ts

@@ -0,0 +1,6 @@
+/// <reference types="miniprogram-api-typings" />
+export declare function setContentAnimate(
+  context: WechatMiniprogram.Component.TrivialInstance,
+  expanded: boolean,
+  mounted: boolean
+): void;

+ 70 - 0
wxcomponents/vant/dist/collapse-item/animate.js

@@ -0,0 +1,70 @@
+import { canIUseAnimate } from '../common/version';
+import { getRect } from '../common/utils';
+function useAnimate(context, expanded, mounted, height) {
+  const selector = '.van-collapse-item__wrapper';
+  if (expanded) {
+    context.animate(
+      selector,
+      [
+        { height: 0, ease: 'ease-in-out', offset: 0 },
+        { height: `${height}px`, ease: 'ease-in-out', offset: 1 },
+        { height: `auto`, ease: 'ease-in-out', offset: 1 },
+      ],
+      mounted ? 300 : 0,
+      () => {
+        context.clearAnimation(selector);
+      }
+    );
+    return;
+  }
+  context.animate(
+    selector,
+    [
+      { height: `${height}px`, ease: 'ease-in-out', offset: 0 },
+      { height: 0, ease: 'ease-in-out', offset: 1 },
+    ],
+    300,
+    () => {
+      context.clearAnimation(selector);
+    }
+  );
+}
+function useAnimation(context, expanded, mounted, height) {
+  const animation = wx.createAnimation({
+    duration: 0,
+    timingFunction: 'ease-in-out',
+  });
+  if (expanded) {
+    if (height === 0) {
+      animation.height('auto').top(1).step();
+    } else {
+      animation
+        .height(height)
+        .top(1)
+        .step({
+          duration: mounted ? 300 : 1,
+        })
+        .height('auto')
+        .step();
+    }
+    context.setData({
+      animation: animation.export(),
+    });
+    return;
+  }
+  animation.height(height).top(0).step({ duration: 1 }).height(0).step({
+    duration: 300,
+  });
+  context.setData({
+    animation: animation.export(),
+  });
+}
+export function setContentAnimate(context, expanded, mounted) {
+  getRect(context, '.van-collapse-item__content')
+    .then((rect) => rect.height)
+    .then((height) => {
+      canIUseAnimate()
+        ? useAnimate(context, expanded, mounted, height)
+        : useAnimation(context, expanded, mounted, height);
+    });
+}

+ 1 - 0
wxcomponents/vant/dist/collapse-item/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 59 - 0
wxcomponents/vant/dist/collapse-item/index.js

@@ -0,0 +1,59 @@
+import { VantComponent } from '../common/component';
+import { useParent } from '../common/relation';
+import { setContentAnimate } from './animate';
+VantComponent({
+  classes: ['title-class', 'content-class'],
+  relation: useParent('collapse'),
+  props: {
+    name: null,
+    title: null,
+    value: null,
+    icon: String,
+    label: String,
+    disabled: Boolean,
+    clickable: Boolean,
+    border: {
+      type: Boolean,
+      value: true,
+    },
+    isLink: {
+      type: Boolean,
+      value: true,
+    },
+  },
+  data: {
+    expanded: false,
+  },
+  mounted() {
+    this.updateExpanded();
+    this.mounted = true;
+  },
+  methods: {
+    updateExpanded() {
+      if (!this.parent) {
+        return;
+      }
+      const { value, accordion } = this.parent.data;
+      const { children = [] } = this.parent;
+      const { name } = this.data;
+      const index = children.indexOf(this);
+      const currentName = name == null ? index : name;
+      const expanded = accordion
+        ? value === currentName
+        : (value || []).some((name) => name === currentName);
+      if (expanded !== this.data.expanded) {
+        setContentAnimate(this, expanded, this.mounted);
+      }
+      this.setData({ index, expanded });
+    },
+    onClick() {
+      if (this.data.disabled) {
+        return;
+      }
+      const { name, expanded } = this.data;
+      const index = this.parent.children.indexOf(this);
+      const currentName = name == null ? index : name;
+      this.parent.switch(currentName, !expanded);
+    },
+  },
+});

+ 6 - 0
wxcomponents/vant/dist/collapse-item/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-cell": "../cell/index"
+  }
+}

+ 44 - 0
wxcomponents/vant/dist/collapse-item/index.wxml

@@ -0,0 +1,44 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<view class="van-collapse-item custom-class {{ index !== 0 ? 'van-hairline--top' : '' }}">
+  <van-cell
+    title="{{ title }}"
+    title-class="title-class"
+    icon="{{ icon }}"
+    value="{{ value }}"
+    label="{{ label }}"
+    is-link="{{ isLink }}"
+    clickable="{{ clickable }}"
+    border="{{ border && expanded }}"
+    class="{{ utils.bem('collapse-item__title', { disabled, expanded }) }}"
+    right-icon-class="van-cell__right-icon"
+    custom-class="van-cell"
+    hover-class="van-cell--hover"
+    bind:click="onClick"
+  >
+    <slot
+      name="title"
+      slot="title"
+    />
+    <slot
+      name="icon"
+      slot="icon"
+    />
+    <slot name="value" />
+    <slot
+      name="right-icon"
+      slot="right-icon"
+    />
+  </van-cell>
+  <view
+    class="{{ utils.bem('collapse-item__wrapper') }}"
+    style="height: 0;"
+    animation="{{ animation }}"
+  >
+    <view
+      class="van-collapse-item__content content-class"
+    >
+      <slot />
+    </view>
+  </view>
+</view>

+ 1 - 0
wxcomponents/vant/dist/collapse-item/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{-webkit-transform:rotate(90deg);transform:rotate(90deg);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;transition:-webkit-transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s),-webkit-transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:#c8c9cc!important;color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important;background-color:var(--white,#fff)!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__content{padding:15px;padding:var(--collapse-item-content-padding,15px);color:#969799;color:var(--collapse-item-content-text-color,#969799);font-size:13px;font-size:var(--collapse-item-content-font-size,13px);line-height:1.5;line-height:var(--collapse-item-content-line-height,1.5);background-color:#fff;background-color:var(--collapse-item-content-background-color,#fff)}

+ 1 - 0
wxcomponents/vant/dist/collapse/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 44 - 0
wxcomponents/vant/dist/collapse/index.js

@@ -0,0 +1,44 @@
+import { VantComponent } from '../common/component';
+import { useChildren } from '../common/relation';
+VantComponent({
+  relation: useChildren('collapse-item'),
+  props: {
+    value: {
+      type: null,
+      observer: 'updateExpanded',
+    },
+    accordion: {
+      type: Boolean,
+      observer: 'updateExpanded',
+    },
+    border: {
+      type: Boolean,
+      value: true,
+    },
+  },
+  methods: {
+    updateExpanded() {
+      this.children.forEach((child) => {
+        child.updateExpanded();
+      });
+    },
+    switch(name, expanded) {
+      const { accordion, value } = this.data;
+      const changeItem = name;
+      if (!accordion) {
+        name = expanded
+          ? (value || []).concat(name)
+          : (value || []).filter((activeName) => activeName !== name);
+      } else {
+        name = expanded ? name : '';
+      }
+      if (expanded) {
+        this.$emit('open', changeItem);
+      } else {
+        this.$emit('close', changeItem);
+      }
+      this.$emit('change', name);
+      this.$emit('input', name);
+    },
+  },
+});

+ 3 - 0
wxcomponents/vant/dist/collapse/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 3 - 0
wxcomponents/vant/dist/collapse/index.wxml

@@ -0,0 +1,3 @@
+<view class="custom-class van-collapse {{ border ? 'van-hairline--top-bottom' : '' }}">
+  <slot />
+</view>

+ 1 - 0
wxcomponents/vant/dist/collapse/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';

Some files were not shown because too many files changed in this diff