luxf 4 months ago
parent
commit
8448cebdf1
100 changed files with 2822 additions and 9662 deletions
  1. 7 2
      api/user.js
  2. 4 4
      components/common/u-dropdown-select/index.vue
  3. 6 8
      components/common/u-panel/index.vue
  4. 0 2
      components/common/u-scroll-view/index.vue
  5. 13 2
      components/common/u-search/index.vue
  6. 18 7
      components/common/u-swiper/index.vue
  7. 21 11
      components/common/u-tabs/index.vue
  8. 44 26
      components/layout/nav-bar.vue
  9. 70 56
      components/layout/tab-bar.vue
  10. 87 20
      main.js
  11. 5 3
      manifest.json
  12. 2 2
      package.json
  13. 13 12
      pages.json
  14. 60 0
      pages/activity/components/activity-item.vue
  15. 6 22
      pages/activity/components/activity-recommend.vue
  16. 7 3
      pages/activity/detail.vue
  17. 10 2
      pages/activity/guest.vue
  18. 15 94
      pages/activity/index.vue
  19. 87 0
      pages/exhibitor/components/exhibit-item.vue
  20. 4 4
      pages/exhibitor/components/exhibit-recommend.vue
  21. 84 0
      pages/exhibitor/components/exhibitor-item.vue
  22. 25 8
      pages/exhibitor/detail.vue
  23. 24 7
      pages/exhibitor/exhibit-detail.vue
  24. 20 65
      pages/exhibitor/exhibit.vue
  25. 21 46
      pages/exhibitor/index.vue
  26. 92 0
      pages/index/components/contact-us.vue
  27. 138 0
      pages/index/components/popup-ad.vue
  28. 114 41
      pages/index/home.vue
  29. 6 3
      pages/index/index.vue
  30. 121 0
      pages/index/search.vue
  31. 2 2
      pages/index/webview.vue
  32. 83 0
      pages/news/components/news-item.vue
  33. 8 63
      pages/news/components/news-recommend.vue
  34. 68 0
      pages/news/index.vue
  35. 80 0
      pages/user/favorites.vue
  36. 189 0
      pages/user/index.vue
  37. 192 0
      pages/user/info-edit.vue
  38. 89 0
      pages/user/info.vue
  39. 72 0
      pages/user/like.vue
  40. 372 0
      pages/user/login.vue
  41. 64 0
      pages/user/setting.vue
  42. 71 0
      pages/user/vote.vue
  43. BIN
      static/font/Poppins-Regular.ttf
  44. BIN
      static/font/Poppins-SemiBold.ttf
  45. 0 539
      static/font/demo.css
  46. 0 5824
      static/font/demo_index.html
  47. 19 5
      static/font/iconfont.css
  48. 1 1
      static/font/iconfont.js
  49. 28 0
      static/font/iconfont.json
  50. 8 0
      static/font/iconfont.svg
  51. BIN
      static/font/iconfont.ttf
  52. BIN
      static/font/iconfont.woff
  53. BIN
      static/font/iconfont.woff2
  54. BIN
      static/img/example/ad_690x90.png
  55. BIN
      static/img/example/album/1.jpeg
  56. BIN
      static/img/example/album/2.jpeg
  57. BIN
      static/img/example/album/3.jpeg
  58. BIN
      static/img/example/album/4.jpeg
  59. BIN
      static/img/example/album/5.jpeg
  60. BIN
      static/img/example/album/6.jpeg
  61. BIN
      static/img/example/banner.png
  62. 0 1
      static/img/example/icon/car_line.svg
  63. 0 29
      static/img/example/icon/event.svg
  64. 0 25
      static/img/example/icon/house.svg
  65. 0 17
      static/img/example/icon/layers.svg
  66. 0 9
      static/img/example/icon/list.svg
  67. 0 21
      static/img/example/icon/news.svg
  68. BIN
      static/img/example/video.jpeg
  69. 19 50
      static/style/app.scss
  70. 63 0
      static/style/pages/activity-item.scss
  71. 23 0
      static/style/pages/exhibit-item.scss
  72. 11 1
      static/style/exhibitor-detail.scss
  73. 22 45
      static/style/exhibitor.scss
  74. 33 0
      static/style/pages/exhibitor.scss
  75. 17 0
      static/style/pages/user-like.scss
  76. 102 0
      static/style/vant.scss
  77. 5 2
      store/modules/user.js
  78. 7 6
      uni.scss
  79. 50 9
      utils/request.js
  80. 0 116
      wxcomponents/vant/action-sheet/index.vue
  81. 0 234
      wxcomponents/vant/area/index.vue
  82. 0 92
      wxcomponents/vant/button/index.vue
  83. 0 37
      wxcomponents/vant/calendar/calendar.vue
  84. 0 64
      wxcomponents/vant/calendar/components/header/index.vue
  85. 0 194
      wxcomponents/vant/calendar/components/month/index.vue
  86. 0 388
      wxcomponents/vant/calendar/index.vue
  87. 0 105
      wxcomponents/vant/card/index.vue
  88. 0 246
      wxcomponents/vant/cascader/index.vue
  89. 0 28
      wxcomponents/vant/cell-group/index.vue
  90. 0 76
      wxcomponents/vant/cell/index.vue
  91. 0 50
      wxcomponents/vant/checkbox-group/index.vue
  92. 0 102
      wxcomponents/vant/checkbox/index.vue
  93. 0 215
      wxcomponents/vant/circle/index.vue
  94. 0 23
      wxcomponents/vant/col/index.vue
  95. 0 86
      wxcomponents/vant/collapse-item/index.vue
  96. 0 60
      wxcomponents/vant/collapse/index.vue
  97. 0 23
      wxcomponents/vant/config-provider/index.vue
  98. 0 115
      wxcomponents/vant/count-down/index.vue
  99. 0 309
      wxcomponents/vant/datetime-picker/index.vue
  100. 0 0
      wxcomponents/vant/dialog/index.vue

+ 7 - 2
api/user.js

@@ -1,5 +1,10 @@
-import { get, post } from '@/utils/request'
+import { get, post, link, upload } from '@/utils/request'
 
 export const login = post('/api/user/login')
+export const wechatLogin = post('/api/user/wechat-login')
+export const phoneLogin = post('/api/user/phone-login')
+export const getSmsCode = get('/api/common/get-sms-code')
 export const getInfo = get('/api/user/info')
-export const logout = post('/api/user/logout')
+export const updateInfo = post('/api/user/update-info')
+export const logout = post('/api/user/logout')
+export const uploadFile = upload('/api/attachment/upload')

+ 4 - 4
components/common/u-dropdown-select/index.vue

@@ -7,7 +7,7 @@
 		<view v-if="showOptions" class="u-dropdown-select-mask" :style="{ 'top': offsetTop +'px' }" @click="showOptions = false"></view>
 		<view v-if="showOptions" class="u-dropdown-panel" :style="{ 'top': offsetTop +'px' }">
 			<view class="u-dropdown-tabs">
-				<u-tabs :active.sync="tabActive" :tabs="tabs" @change="tabChange"/>
+				<u-tabs :active.sync="tabActive" :tabs="tabs" tab-style="tag" @change="tabChange"/>
 			</view>
 			<view class="u-dropdown-options">
 				<template v-if="list.length">
@@ -217,7 +217,7 @@
 		--image-height: 160rpx;
 	}
 	.u-dropdown-select{
-		@extend .display-flex-between;
+		@include display-flex-between;
 		min-width: 211rpx;
 		height: 50rpx;
 		padding: 0 10rpx;
@@ -237,7 +237,7 @@
 	}
 	.u-dropdown-label{
 		max-width: 100%;
-		@extend .text-ellipsis;
+		@include text-ellipsis;
 		font-size: $fontSize1;
 	}
 	.u-dropdown-tabs{
@@ -263,7 +263,7 @@
 	}
 	.u-dropdown-option{
 		line-height: 50rpx;
-		@extend .display-flex-between;
+		@include display-flex-between;
 		font-size: $fontSize2;
 		&.active{
 			color: $buttonPrimaryColor;

+ 6 - 8
components/common/u-panel/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="u-panel">
-		<view class="u-panel-head display-flex-between">
+		<view class="u-panel-head">
 			<view class="u-panel-title">{{ title }}</view>
 			<view v-if="link" class="u-panel-link" @tap="onClickLink">
 				{{ linkText || '查看更多' }} <van-icon class="van-icon" name="arrow" />
@@ -38,11 +38,7 @@
 		},
 		methods: {
 			onClickLink() {
-				if (this.link.indexOf('http') === -1) {
-					uni.navigateTo({
-						url: this.link
-					})
-				}
+				this.navigateTo(this.link)
 			}
 		}
 	}
@@ -52,6 +48,7 @@
 		padding: 24rpx 28rpx;
 	}
 	.u-panel-head{
+		@include display-flex-between;
 		margin-bottom: 26rpx;
 		.u-panel-title{
 			position: relative;
@@ -60,13 +57,14 @@
 			font-weight: 500;
 			color: #000000;
 			&:after{
-				@extend .after;
+				@include after;
 				left: 0;
 				right: 0;
 				bottom: 0;
 				width: 34rpx;
 				height: 0;
-				border: 4rpx solid $buttonPrimaryColor;
+				border: 3rpx solid $buttonPrimaryColor;
+				border-radius: 2rpx;
 				margin: auto;
 			}
 		}

+ 0 - 2
components/common/u-scroll-view/index.vue

@@ -18,8 +18,6 @@
 				if (this.tabbarConflict) {
 					pageHeight = this.$config.pageHeight - uni.upx2px(150)
 				}
-				console.log("tabbarConflict")
-				console.log(this.tabbarConflict)
 				return 'height: ' + pageHeight + 'px'
 			}
 		},

+ 13 - 2
components/common/u-search/index.vue

@@ -2,7 +2,7 @@
 	<view class="u-search">
 		<view class="u-search-input">
 			<van-search :value="searchKeyword" :placeholder="placeholder" use-action-slot class="van-search"
-				@change="query">
+				@change="query" @search="onClickSearch">
 				<view class="u-search-text" slot="action" @tap="onClickSearch">搜索</view>
 			</van-search>
 		</view>
@@ -10,10 +10,16 @@
 </template>
 
 <script>
+	
+	import VanSearch from '@/wxcomponents/vant/search/index'
+	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
+		components: {
+			VanSearch
+		},
 		props: {
 			value: String,
 			placeholder: {
@@ -25,6 +31,9 @@
 		watch: {
 			searchKeyword(val) {
 				this.$emit('input', val)
+			},
+			value(val) {
+				this.searchKeyword = this.value
 			}
 		},
 		data() {
@@ -32,7 +41,9 @@
 				searchKeyword: ''
 			}
 		},
-		created() {},
+		created() {
+			this.searchKeyword = this.value
+		},
 		mounted() {},
 		methods: {
 			query(e) {

+ 18 - 7
components/common/u-swiper/index.vue

@@ -3,13 +3,12 @@
 		<swiper class="swiper" circular :indicator-dots="false" :circular="circular" :next-margin="nextMargin" :autoplay="autoplay" :interval="interval"
 					:duration="duration" :style="style" @change="onSwiperChange">
 			<template v-for="(item, index) in items">
-				<swiper-item>
-					<view class="image-wrapper">
-						<image v-if="item.src" :mode="imageMode" :src="item.src" :style="imageStyle" @tap="onImageClick(item)"/>
-						<template v-else>
-							<slot :scope="item" :style="style"></slot>
-						</template>
+				<swiper-item :key="index">
+					<view class="image-wrapper" @tap="onImageClick(item)">
+						<image v-if="item.src" :mode="imageMode" :src="item.src" :style="imageStyle"/>
+						<slot v-else :scope="item"></slot>
 						<view class="video-play" v-if="item.url && item.url.indexOf('.mp4') !== -1">
+							<view class="iconfont icon-playcircle"></view>
 						</view>
 					</view>
 				</swiper-item>
@@ -25,7 +24,7 @@
 			></view>
 		</view>
 		<van-overlay :show="showOverlay" @tap="onClickHideOverlay">
-		  <view class="overlay-wrapper display-flex-center">
+		  <view class="overlay-wrapper">
 				<video v-if="videoUrl" :src="videoUrl" controls autoplay loop @tap.stop></video>
 		  </view>
 		</van-overlay>
@@ -33,10 +32,16 @@
 </template>
 
 <script>
+	
+	import VanOverlay from '@/wxcomponents/vant/overlay/index'
+	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
+		components: {
+			VanOverlay
+		},
 		props: {
 			items: Array,
 			borderRadius: {
@@ -145,6 +150,7 @@
 	.image-wrapper {
 		position: relative;
 		.video-play{
+			@include display-flex-center;
 			position: absolute;
 			top: 0;
 			bottom: 0;
@@ -156,12 +162,17 @@
 			margin: auto;
 			background-color: rgba(229, 117, 25, 0.5);
 			z-index: 1;
+			.iconfont{
+				color: #FFFFFF;
+				font-size: 62rpx;
+			}
 		}
 		image{
 			width: 100%;
 		}
 	}
 	.overlay-wrapper{
+		@include display-flex-center;
 		height: 100%;
 		video{
 			width: 100%;

+ 21 - 11
components/common/u-tabs/index.vue

@@ -1,16 +1,24 @@
 <template>
 	<van-tabs :class="clazz" :active="tabActive" :ellipsis="false" @change="tabChange">
 		<template v-for="(item, index) in tabs">
+			
 			<van-tab class="u-tab" :title="item.label" :name="item.value" :key="item.value"></van-tab>
 		</template>
 	</van-tabs>
 </template>
 
 <script>
+	import VanTabs from '@/wxcomponents/vant/tabs/index'
+	import VanTab from '@/wxcomponents/vant/tab/index'
+	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
+		components: {
+			VanTabs,
+			VanTab
+		},
 		props: {
 			tabStyle: String,
 			active: [String, Number],
@@ -20,6 +28,8 @@
 			clazz() {
 				if (this.tabStyle === 'default') {
 					return 'u-tabs u-tabs-detault'
+				} else if (this.tabStyle === 'tag') {
+					return 'u-tabs u-tabs-tag'
 				} else {
 					return 'u-tabs'
 				}
@@ -27,7 +37,7 @@
 		},
 		watch: {
 			active(val) {
-				// this.tabActive = val
+				this.tabActive = val
 			}
 		},
 		data() {
@@ -55,19 +65,19 @@
 			}
 		},
 		created() {
-			// this.tabActive = this.active
+			this.tabActive = this.active
 		},
 		mounted() {
 		},
 		methods: {
-			tabChange(e) {
-				const detail = e.detail
+			tabChange(tab) {
+				const e = {}
 				e.detail = {
-					index: detail.index,
-					label: detail.title,
-					value: detail.name
+					index: tab.index,
+					label: tab.title,
+					value: tab.name
 				}
-				this.tabActive = e.detail.name
+				this.tabActive = e.detail.value
 				this.$emit('update:active', this.tabActive)
 				this.$emit('change', e)
 			}
@@ -75,7 +85,7 @@
 	}
 </script>
 <style lang="scss">
-	.u-tabs{
+	.u-tabs.u-tabs-tag {
 		--tabs-line-height: 64rpx;
 		--tabs-card-height: 64rpx;
 		--tabs-bottom-bar-height: rpx;
@@ -102,7 +112,7 @@
 		--tab-active-text-color: #FFFFFF;
 		--tab-background-color: #FFFFFF;
 		--tab-active-background-color: #E57519;
-		--tab-margin-right: 13rpx;
+		--tab-margin-right: 12rpx;
 		--tab-border-radius: 6rpx;
 		.van-tabs__nav{
 			padding: 0;
@@ -119,7 +129,7 @@
 		}
 		.van-tabs__wrap--scrollable .van-tab--complete{
 			flex: none!important;
-			padding: 0 32rpx;
+			padding: 0 30rpx;
 		}
 		.van-tabs--line{
 			height: 50rpx;

+ 44 - 26
components/layout/nav-bar.vue

@@ -1,9 +1,9 @@
 <template>
-	<view class="nav-bar">
+	<view class="nav-bar" :class="{ 'nav-bar-transparent': transparent }">
 		<view class="nav-bar-status" :style="{ height: statusBarHeight + 'px' }">
 		</view>
 		<view class="nav-bar-title" :style="{ height: titleBarHeight +'px' }">
-			<template v-if="title">
+			<template v-if="showTitle">
 				<view class="btn-back" @click="goBack">
 					<van-icon v-if="hasParent" name="arrow-left" />
 				</view>
@@ -11,16 +11,22 @@
 				<view></view>
 			</template>
 			<template v-else>
-				 <view><slot></slot></view>
+				 <slot></slot>
 			</template>
 		</view>
 	</view>
+	
 </template>
 
 <script>
 	export default {
 		props: {
-			title: String
+			title: String,
+			transparent: Boolean,
+			showTitle: {
+				type: Boolean,
+				default: true
+			}
 		},
 		computed: {
 			hasParent() {
@@ -47,36 +53,48 @@
 			})
 		},
 		methods: {
+			hasSlot() {
+				const nodes = this.getRelationNodes(`view`);
+				return nodes.length > 0;
+			},
 			goBack() {
-				wx.navigateBack()
+				uni.navigateBack()
 			}
 		}
 	}
 </script>
 
-<style lang="scss" scoped>
+<style lang="scss">
 	.nav-bar {
 		background: linear-gradient( 270deg, #2b2359 9%, #405491 44%, #2b2359 92%), rgba(0,0,0,0.2);
-	}
-	.nav-bar-title{
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		padding: 0 32rpx;
-		view{
-			color: #ffffff;
+		&.nav-bar-transparent{
+			background: none;
+			.nav-bar-title{
+				view{
+					color: #333333;
+				}
+			}
+		}
+		.nav-bar-title{
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 0 32rpx;
+			view{
+				color: #ffffff;
+			}
+		}
+		.nav-bar-title-text{
+			flex: 1;
+			font-weight: 500;
+			font-size: $fontSize5;
+			line-height: 42rpx;
+			text-align: left;
+			text-transform: none;
+			padding-left: 8rpx;
+		}
+		.btn-back{
+			padding: 0 6rpx;
 		}
-	}
-	.nav-bar-title-text{
-		flex: 1;
-		font-weight: 500;
-		font-size: $fontSize5;
-		line-height: 42rpx;
-		text-align: left;
-		text-transform: none;
-		padding-left: 8rpx;
-	}
-	.btn-back{
-		padding: 0 6rpx;
 	}
 </style>

+ 70 - 56
components/layout/tab-bar.vue

@@ -1,5 +1,5 @@
 <template>
-	<van-tabbar :active="tabbarActive" @change="onChange" :placeholder="true" active-color="#E57519"
+	<van-tabbar class="u-tabbar" :active="tabbarActive" @change="onChange" :placeholder="true" active-color="#E57519"
 		inactive-color="#7D7D7D">
 		<template v-for="(item, index) in list">
 			<van-tabbar-item v-if="index !== 2" :name="item.name" :key="index" :icon="item.icon" icon-prefix="tabbar-icon">
@@ -23,13 +23,25 @@
 </template>
 
 <script>
+	import VanTabbar from '@/wxcomponents/vant/tabbar/index'
+	import VanTabbarItem from '@/wxcomponents/vant/tabbar-item/index'
+	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
+		components: {
+			VanTabbar,
+			VanTabbarItem
+		},
 		props: {
 			active: String
 		},
+		watch: {
+			active(val) {
+				this.tabbarActive = val
+			}
+		},
 		data() {
 			return {
 				tabbarActive: 'home',
@@ -69,10 +81,10 @@
 			this.tabbarActive = this.active
 		},
 		methods: {
-			onChange(e) {
-				this.tabbarActive = e.detail
-				this.$emit('update:active', e.detail)
-				this.$emit('change', e.detail)
+			onChange(active) {
+				this.tabbarActive = active
+				this.$emit('update:active', active)
+				this.$emit('change', active)
 			},
 			onClickCenter() {
 				uni.navigateTo({
@@ -83,65 +95,67 @@
 	}
 </script>
 <style lang="scss">
-	.van-tabbar-item__text {
-		font-size: $fontSize2;
-		color: #7D7D7D;
-	}
-
-	.van-tabbar-item--active {
+	.u-tabbar{
 		.van-tabbar-item__text {
-			color: $textActionColor;
+			font-size: $fontSize2;
+			color: #7D7D7D;
 		}
-	}
-
-	.tabbar-center-item {
-		position: relative;
-		top: -50rpx;
-		z-index: 1;
-		flex: 1;
-
-		&.active {
-			.tabbar-center-text {
+		
+		.van-tabbar-item--active {
+			.van-tabbar-item__text {
 				color: $textActionColor;
 			}
 		}
-	}
-
-	.tabbar-center-text {
-		font-size: $fontSize2;
-		color: #7D7D7D;
-		margin-top: 10rpx;
-		text-align: center;
-	}
-
-	.tabbar-center-round {
-		@extend .display-flex-center;
-		width: 100rpx;
-		height: 100rpx;
-		border-radius: 50%;
-		background-color: $buttonPrimaryColor;
-		margin: auto;
-
-		&>view {
-			@extend .display-flex-center;
-			width: 96rpx;
-			height: 96rpx;
+		
+		.tabbar-center-item {
+			position: relative;
+			top: -50rpx;
+			z-index: 1;
+			flex: 1;
+		
+			&.active {
+				.tabbar-center-text {
+					color: $textActionColor;
+				}
+			}
+		}
+		
+		.tabbar-center-text {
+			font-size: $fontSize2;
+			color: #7D7D7D;
+			margin-top: 10rpx;
+			text-align: center;
+		}
+		
+		.tabbar-center-round {
+			@include display-flex-center;
+			width: 100rpx;
+			height: 100rpx;
 			border-radius: 50%;
-			border: 1rpx solid #FFFFFF;
-			color: #FFFFFF;
 			background-color: $buttonPrimaryColor;
-
-			.tabbar-icon {
-				font-size: 60rpx;
+			margin: auto;
+		
+			&>view {
+				@include display-flex-center;
+				width: 96rpx;
+				height: 96rpx;
+				border-radius: 50%;
+				border: 1rpx solid #FFFFFF;
+				color: #FFFFFF;
+				background-color: $buttonPrimaryColor;
+		
+				.tabbar-icon {
+					font-size: 60rpx;
+				}
 			}
 		}
-	}
-
-	.tabbar-icon-activity {
-		font-size: 40rpx;
-	}
-
-	.tabbar-icon-user {
-		font-size: 48rpx;
+		
+		.tabbar-icon-activity {
+			font-size: 40rpx;
+		}
+		
+		.tabbar-icon-user {
+			font-size: 48rpx;
+		}
 	}
 </style>

+ 87 - 20
main.js

@@ -2,15 +2,8 @@ import App from './App'
 
 // #ifndef VUE3
 import Vue from 'vue'
-import Store from './store'
+import store from './store'
 import { initLocale } from '@/locales/i18n'
-import NavBar from '@/components/layout/nav-bar'
-import UScrollView from '@/components/common/u-scroll-view'
-import UPanel from '@/components/common/u-panel'
-import USearch from '@/components/common/u-search'
-import USwiper from '@/components/common/u-swiper'
-import UDropdownSelect from '@/components/common/u-dropdown-select'
-import UTabs from '@/components/common/u-tabs'
 
 import './uni.promisify.adaptor'
 Vue.config.productionTip = false
@@ -19,24 +12,98 @@ Vue.prototype.$config = {
 }
 Vue.prototype.onInitNavbar = function(e) {
 	this.$config.pageHeight = e.detail.pageHeight
-	console.log("this.$config.pageHeight")
-	console.log(this.$config.pageHeight)
-}
-// 自定义公供组件
-Vue.component('NavBar', NavBar)
-Vue.component('UScrollView', UScrollView)
-Vue.component('UPanel', UPanel)
-Vue.component('USearch', USearch)
-Vue.component('USwiper', USwiper)
-Vue.component('UDropdownSelect', UDropdownSelect)
-Vue.component('UTabs', UTabs)
+}
+Vue.prototype.checkAuth = function(pagePath) {
+	if (!store.getters.user) {
+		this.redirectTo('/pages/user/login?redirect=' + encodeURIComponent(pagePath))
+		return false
+	} else {
+		return true
+	}
+}
+Vue.prototype.redirectTo = function(pagePath) {
+	if (pagePath.indexOf('https') === -1) {
+		uni.redirectTo({
+			url: pagePath
+		})
+	} else {
+		uni.redirectTo({
+			url: '/pages/index/webview?url=' + encodeURIComponent(pagePath)
+		})
+	}
+}
+Vue.prototype.navigateTo = function(pagePath) {
+	if (pagePath.indexOf('https') === -1) {
+		uni.navigateTo({
+			url: pagePath
+		})
+	} else {
+		this.webviewTo(pagePath)
+	}
+}
+Vue.prototype.webviewTo = function(url) {
+	uni.navigateTo({
+		url: '/pages/index/webview?url=' + encodeURIComponent(url)
+	})
+}
+
+Vue.prototype.showToast = function(title, complete) {
+	uni.showToast({
+		icon: 'none',
+		title: title
+	})
+	if (complete)
+		setTimeout(complete, 2000)
+}
+Vue.prototype.showSuccessToast = function(title, complete) {
+	uni.showToast({
+		icon: 'success',
+		title: title,
+		duration: 2000
+	})
+	if (complete)
+		setTimeout(complete, 2000)
+}
+Vue.prototype.showFailToast = function(title, complete) {
+	uni.showToast({
+		icon: 'fail',
+		title: title,
+		duration: 2000
+	})
+	if (complete)
+		setTimeout(complete, 2000)
+}
+
+Vue.prototype.showLoading = function(options) {
+	options = options || {
+		forbidClick: true,
+		loadingType: 'spinner',
+	}
+	if (!options.title) {
+		options.title = '加载中'
+	}
+	uni.showLoading(options)
+}
+
+Vue.prototype.hideLoading = function() {
+	uni.hideLoading()
+}
 
 App.mpType = 'app'
 const app = new Vue({
 	App,
-	Store
+	store
 })
 app.$mount()
+const token = uni.getStorageSync('token')
+const user = uni.getStorageSync('user')
+if (user) {
+	store.commit('SET_USER', user)
+}
+if (token) {
+	store.commit('SET_TOKEN', token)
+	store.dispatch('getInfo')
+}
 
 initLocale()
 // #endif

+ 5 - 3
manifest.json

@@ -50,11 +50,13 @@
     "quickapp" : {},
     /* 小程序特有相关 */
     "mp-weixin" : {
-        "appid" : "wxb75cc4008ddb9669",
+        "appid" : "wx9f592948a2d18446",
         "setting" : {
-            "urlCheck" : false
+            "urlCheck" : false,
+            "minified" : true
         },
-        "usingComponents" : true
+        "usingComponents" : true,
+        "lazyCodeLoading" : "requiredComponents"
     },
     "mp-alipay" : {
         "usingComponents" : true

+ 2 - 2
package.json

@@ -17,7 +17,7 @@
 					"UNI_PLATFORM": "mp-weixin",
 					"NAME": "dev",
 					"TOKEN_KEY": "token",
-					"BASE_API": "https://starify-api-dev.matchexpo.cn"
+					"BASE_API": "https://mp-test-onlinecatelogue.matchexpo.cn"
 				},
 				"define": {
 					"MP-CJN": true
@@ -29,7 +29,7 @@
 					"UNI_PLATFORM": "mp-weixin",
 					"NAME": "test",
 					"TOKEN_KEY": "token",
-					"BASE_API": "https://starify-api-dev.matchexpo.cn"
+					"BASE_API": "https://mp-test-onlinecatelogue.matchexpo.cn"
 				},
 				"define": {
 					"MP-CJN": true

+ 13 - 12
pages.json

@@ -6,6 +6,8 @@
 				"navigationBarTitleText": "uni-app"
 			}
 		},
+		{ "path": "pages/news/index" },
+		
 		{ "path": "pages/activity/index" },
 		{ "path": "pages/activity/detail" },
 		{ "path": "pages/activity/guest" },
@@ -13,8 +15,18 @@
 		{ "path": "pages/exhibitor/exhibit" },
 		{ "path": "pages/exhibitor/exhibit-detail" },
 		{ "path": "pages/exhibitor/detail" },
+		
+		{ "path": "pages/user/index" },
+		{ "path": "pages/user/login" },
+		{ "path": "pages/user/setting" },
+		{ "path": "pages/user/info" },
+		{ "path": "pages/user/info-edit" },
+		{ "path": "pages/user/like" },
+		{ "path": "pages/user/favorites" },
+		{ "path": "pages/user/vote" },
 		// 组件页面
 		{ "path": "pages/components/index" },
+		{ "path": "pages/index/search" },
 		// WEBVIEW
 		{ "path": "pages/index/webview", "style": { "navigationStyle": "default", "navigationBarTitleText": "加载中...", "navigationBarBackgroundColor": "#332968" }}
 	],
@@ -26,19 +38,8 @@
 		"backgroundColor": "#F8F8F8",
 		"usingComponents": {
 			"van-icon": "/wxcomponents/vant/icon/index",
-			"van-tabs": "/wxcomponents/vant/tabs/index",
-			"van-tab": "/wxcomponents/vant/tab/index",
 			"van-empty": "/wxcomponents/vant/empty/index",
-			"van-button": "/wxcomponents/vant/button/index",
-			"van-picker": "/wxcomponents/vant/picker/index",
-			"van-tabbar": "/wxcomponents/vant/tabbar/index",
-			"van-tabbar-item": "/wxcomponents/vant/tabbar-item/index",
-			"van-collapse": "/wxcomponents/vant/collapse/index",
-			"van-collapse-item": "/wxcomponents/vant/collapse-item/index",
-			"van-search": "/wxcomponents/vant/search/index",
-			"van-overlay": "/wxcomponents/vant/overlay/index"	,
-			"van-collapse": "/wxcomponents/vant/collapse/index",
-			"van-collapse-item": "/wxcomponents/vant/collapse-item/index"
+			"van-button": "/wxcomponents/vant/button/index"
 		}
 	},
 	"uniIdRouter": {}

+ 60 - 0
pages/activity/components/activity-item.vue

@@ -0,0 +1,60 @@
+<template>
+	<view class="activity-item" hover-class="active" @click="onClickActivity(item)">
+		<view class="activity-title">
+			<view>TGV先进材料及封装产业化机遇高峰论坛</view>
+			<view v-if="!favoritesHidden" class="activity-favourites" :class="{ 'active': index === 1 }">
+				<view v-if="item.favourited" class="iconfont icon-favourites-filled-star-symbol active"></view>
+				<view v-else class="iconfont icon-Favourites-Add-Large"></view>
+				<view class="activity-favourites-text">收藏</view>
+			</view>
+		</view>
+		<view class="activity-time">2024年03月20日 | E1馆二楼M16会议室</view>
+		<view class="activity-views">浏览:1080</view>
+		<view class="activity-desc">
+			<view>
+				本次论坛将探讨玻璃基芯片板级封装载板在Mini/Micro直显、MIP封装、2.5D/3D封装、射频芯片载板、光通信芯片载板以及其他芯片载板,尤其是半导体先进封装领域的应用。
+			</view>
+			<view>
+				<van-button class="activity-detail-link" type="primary">
+					<template>
+						<view>了解详情</view> <view class="arrow iconfont icon-right-s"></view>
+					</template>
+				</van-button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+		},
+		props: {
+			// 数据
+			item: Object,
+			favoritesHidden: Boolean
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+		},
+		methods: {
+			onClickActivity(item){
+				uni.navigateTo({
+					url: '/pages/activity/detail'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	a{
+		
+	}
+</style>

+ 6 - 22
pages/activity/components/activity-recommend.vue

@@ -1,11 +1,8 @@
 <template>
 	<view class="activity-recommend">
-		<view v-if="recommendType === 'home'" class="activity-tab">
-			<u-tabs :active.sync="tabActive" :tabs="tabs" tab-style="default" @change="tabChange"/>
-		</view>
 		<view class="activity-list">
 			<template v-for="(item, index) in [1, 2, 3]">
-					<view class="activity-item" :key="index">
+					<view class="activity-item" :key="index" @click="onClickActivity(item)">
 						<view class="activity-title">KOSHINE 新品上线,解锁防脱生发新方式</view>
 						<view class="activity-time">2024年03月20日 | E1馆二楼M16会议室</view>
 						<view class="activity-summary">
@@ -30,29 +27,16 @@
 		},
 		components: {
 		},
-		props: {
-			recommendType: {
-				type: String,
-				default: 'home'
-			}
-		},
+		props: {},
 		data() {
 			return {
-				tabActive: '1',
-				tabs: [{
-					label: '展会新闻',
-					value: 1
-				}, {
-					label: '展商新闻',
-					value: 2
-				}]
 			}
 		},
 		created() {
 		},
 		methods: {
-			tabChange() {
-				
+			onClickActivity() {
+				this.navigateTo('https://mp-test-onlinecatelogue.matchexpo.cn/Xiaomi-Computer-Technology-Exhibition-16')
 			}
 		}
 	}
@@ -73,7 +57,7 @@
 		padding: 24rpx 30rpx;
 	}
 	.activity-title{
-		@extend .text-ellipsis-line;
+		@include text-ellipsis-line;
 		font-family: Arial, Arial;
 		font-weight: bold;
 		font-size: $fontSize2;
@@ -100,7 +84,7 @@
 		.text{
 			padding-right: 30rpx;
 			color: #555555;
-			@extend .text-ellipsis-line;
+			@include text-ellipsis-line;
 			-webkit-line-clamp: 2;  
 		}
 		.arrow{

+ 7 - 3
pages/activity/detail.vue

@@ -110,7 +110,7 @@
 						</view>	
 					</view>
 					<view class="activity-schedule-image">
-						<image src="https://www.productronicachina.com.cn/resources/files/0812/66b9c058eb46a/TGV.jpg" mode="widthFix" />
+						<image src="https://www.productronicachina.com.cn/resources/files/0812/66b9c058eb46a/TGV.jpg" mode="aspectFit" />
 					</view>
 				</view>
 				<view class="activity-operation">
@@ -132,12 +132,16 @@
 </template>
 
 <script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
 	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView
 		},
 		computed: {
 		},
@@ -175,7 +179,7 @@
 			}
 		}
 		.activity-operation{
-			@extend .display-flex-between;
+			@include display-flex-between;
 			margin-top: 32rpx;
 		}
 		.activity-views{
@@ -244,7 +248,7 @@
 			}
 		}
 		.activity-info-flag{
-			@extend .display-flex-center;
+			@include display-flex-center;
 			height: 48rpx;
 			margin-top: 37rpx;
 			margin-bottom: 16rpx;

+ 10 - 2
pages/activity/guest.vue

@@ -70,12 +70,20 @@
 </template>
 
 <script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCollapse from '@/wxcomponents/vant/collapse/index'
+	import VanCollapseItem from '@/wxcomponents/vant/collapse-item/index'
 	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView,
+			VanCollapse,
+			VanCollapseItem
 		},
 		computed: {
 		},
@@ -130,7 +138,7 @@
 			}
 		}
 		.activity-operation{
-			@extend .display-flex-between;
+			@include display-flex-between;
 			margin-top: 32rpx;
 		}
 		.activity-views{
@@ -200,7 +208,7 @@
 				background-color: transparent;
 				font-size: $fontSize1;
 				color: #333333;
-				@extend .text-ellipsis;
+				@include text-ellipsis;
 			}
 		}
 		.subject-collapse{

+ 15 - 94
pages/activity/index.vue

@@ -7,32 +7,10 @@
 					<view class="activity-head-title">同期活动</view>
 					<view class="activity-head-desc">今年慕尼黑上海电子生产设备展将围绕四大行业主题开展共计9场同期论坛,论坛围绕工业机器人、柔性制造、储能与新能源、汽车线束、智能座舱、智能制造、TGV先进材料、封装、胶粘剂、新能源汽车等热门话题展开更多探讨与交流。</view>
 				</view>
-				<view class="activity-list">
-					<template v-for="(item, index) in [1, 2, 3, 4]">
-						<view class="activity-item" hover-class="active" :key="index" @click="onClickActivity(item)">
-							<view class="activity-title">
-								<view>TGV先进材料及封装产业化机遇高峰论坛</view>
-								<view class="activity-favourites" :class="{ 'active': index === 1 }">
-									<view v-if="index == 1" class="iconfont icon-favourites-filled-star-symbol"></view>
-									<view v-else class="iconfont icon-Favourites-Add-Large"></view>
-									<view class="activity-favourites-text">收藏</view>
-								</view>
-							</view>
-							<view class="activity-time">2024年03月20日 | E1馆二楼M16会议室</view>
-							<view class="activity-views">浏览:1080</view>
-							<view class="activity-desc">
-								<view>
-									本次论坛将探讨玻璃基芯片板级封装载板在Mini/Micro直显、MIP封装、2.5D/3D封装、射频芯片载板、光通信芯片载板以及其他芯片载板,尤其是半导体先进封装领域的应用。
-								</view>
-								<view>
-									<van-button class="activity-detail-link" type="primary">
-										<template>
-											<view>了解详情</view> <view class="arrow iconfont icon-right-s"></view>
-										</template>
-									</van-button>
-								</view>
-							</view>
-						</view>
+				<van-empty v-if="activityList.length === 0" description="暂无数据" />
+				<view v-else class="activity-list">
+					<template v-for="(item, index) in activityList">
+						<activity-item :item="item" :key="index" />
 					</template>
 				</view>
 			</view>
@@ -41,23 +19,27 @@
 </template>
 
 <script>
-
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import ActivityItem from '@/pages/activity/components/activity-item.vue'
+	
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView,
+			ActivityItem
 		},
 		data() {
-			return {}
+			return {
+				activityList: [{ favourited: true }, {}, {}],
+			}
 		},
 		created() {},
 		methods: {
-			onClickActivity(item){
-				uni.navigateTo({
-					url: '/pages/activity/detail'
-				})
-			}
+			
 		}
 	}
 </script>
@@ -83,65 +65,4 @@
 		margin-top: 40rpx;
 		color: #333333;
 	}
-	.activity-item{
-		padding: 20rpx;
-		background-color: #FFFFFF;
-		box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.15);
-		&.active{
-			border: 4rpx solid rgba(232,116,0,0.34);
-			padding: 16rpx 16rpx;
-			.activity-favourites{
-				color: $textActionColor;
-			}
-		}
-		.activity-favourites{
-			@extend .display-flex-center;
-			font-size: $fontSize1;
-			&.active{
-				color: $textActionColor;
-			}
-			.iconfont{
-				font-size: $fontSize1;
-				margin-right: 4rpx;
-			}
-		}
-		.activity-title{
-			@extend .display-flex-between;
-			flex: 1;
-			line-height: 38rpx;
-			&>view:first-child{
-				font-weight: bold;
-				font-size: $fontSize3;
-			}
-		}
-		.activity-time{
-			margin-top: 15rpx;
-			font-family: Inter, Inter;
-			font-size: $fontSize1;
-		}
-		.activity-views{
-			margin-top: 15rpx;
-			font-family: Inter, Inter;
-			font-size: $fontSize0;
-			color: #7D7D7D;
-			line-height: 19rpx;
-		}
-		.activity-desc{
-			@extend .display-flex-between;
-			margin-top: 15rpx;
-			&>view:first-child{
-				@extend .text-ellipsis-line;
-				flex: 1;
-				margin-right: 51rpx;
-				font-size: 18rpx;
-				line-height: 30rpx;
-			}
-		}
-		.activity-detail-link{
-			flex-shrink: 0;
-			.van-button__text{
-				font-size: 18rpx;
-			}
-		}
-	}
 </style>

+ 87 - 0
pages/exhibitor/components/exhibit-item.vue

@@ -0,0 +1,87 @@
+<template>
+	<view class="exhibit-item exhibitor-item" hover-class="active" @click="onClickExhibit(item)">
+		<view class="exhibit-body">
+			<view class="exhibitor-body">
+				<view class="exhibitor-logo"><image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70b4f4b0.png?x-oss-process=image/resize,w_400" mode="aspectFit" /></view>
+				<view class="exhibitor-name">汽车连接器 86W MLK 1,2 SD-HOLDER</view>
+				<view class="exhibitor-number">
+					<view class="exhibitor-number-label">展位号:</view>
+					<view class="exhibitor-number-text">E1.1101</view>
+				</view>
+			</view>
+			<view class="exhibitor-name">
+				<view class="exhibitor-name-cn">科世达(上海)连接器有限公司</view>
+				<view class="exhibitor-name-en">Leopold Kostal GmbH & Co. KG</view>
+			</view>
+		</view>
+		<view v-if="!footerHidden" class="exhibitor-footer">
+			<view class="exhibitor-views">浏览:30911</view>
+			<view class="exhibitor-action">
+				<view>
+					<button open-type="share" @click.stop="onShare(item)">
+						<view>
+							<view class="iconfont icon-zhuanfa"></view>
+							<view>分享</view>
+						</view>
+					</button>
+				</view>
+				<view>
+					<view v-if="item.favourited" class="iconfont icon-favourites-filled-star-symbol active"></view>
+					<view v-else class="iconfont icon-Favourites-Add-Large"></view>
+					<view>收藏</view>
+				</view>
+				<view>
+					<view v-if="item.liked" class="iconfont icon-aixin active"></view>
+					<view v-else class="iconfont icon-Heart"></view>
+					<view>点赞</view>
+				</view>
+				<view>
+					<view v-if="item.voted" class="iconfont icon-Ticket1 active"></view>
+					<view v-else class="iconfont icon-xiaochengxu-toupiaoicon"></view>
+					<view>投票</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+		},
+		props: {
+			// 数据
+			item: Object,
+			footerHidden: Boolean
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+		},
+		methods: {
+			onShareAppMessage() {
+				const item = ops.target.dataset.item
+				return {
+					title: item.name || '分享展品',
+					path: `/pages/exhibitor/exhibit-detail`,
+					imageUrl: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png'
+				};
+			},
+			onShare(item) {
+			},
+			onClickExhibit(item) {
+				uni.navigateTo({
+					url: '/pages/exhibitor/exhibit-detail'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss">
+</style>

+ 4 - 4
pages/exhibitor/components/exhibit-recommend.vue

@@ -2,9 +2,9 @@
 	<view class="exhibit-recommend">
 		<view class="exhibit-list">
 			<template v-for="(item, index) in [1, 2, 3, 4]">
-				<view class="exhibit-item" hover-class="active" :key="index">
+				<view class="exhibit-item" hover-class="active" :key="index" @click="onClickExhibit(item)">
 					<view class="exhibit-image">
-						<image src="/static/img/example/exhibit.png"/>
+						<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70b4f4b0.png?x-oss-process=image/resize,w_400" mode="aspectFit"/>
 					</view>
 					<view class="exhibit-name">汽车连接器 86W MLK 1,2 SD-HOLDER</view>
 					<view class="exhibit-tag">常规产品</view>
@@ -29,8 +29,8 @@
 		created() {
 		},
 		methods: {
-			tabChange() {
-				
+			onClickExhibit() {
+				this.navigateTo('/pages/exhibitor/detail')
 			}
 		}
 	}

+ 84 - 0
pages/exhibitor/components/exhibitor-item.vue

@@ -0,0 +1,84 @@
+<template>
+	<view class="exhibitor-item" hover-class="active" @click="onClickExhibitor">
+		<view class="exhibitor-body">
+			<view class="exhibitor-logo"><image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png?x-oss-process=image/resize,w_200" mode="aspectFit" /></view>
+			<view class="exhibitor-name">
+				<view class="exhibitor-name-cn">科世达(上海)连接器有限公司</view>
+				<view class="exhibitor-name-en">Leopold Kostal GmbH & Co. KG</view>
+			</view>
+			<view class="exhibitor-number">
+				<view class="exhibitor-number-label">展位号:</view>
+				<view class="exhibitor-number-text">E1.1101</view>
+			</view>
+		</view>
+		<view v-if="!footerHidden" class="exhibitor-footer">
+			<view class="exhibitor-views">浏览:30911</view>
+			<view class="exhibitor-action">
+				<view>
+					<button open-type="share" @click.stop="onShare(item)">
+						<view>
+							<view class="iconfont icon-zhuanfa"></view>
+							<view>分享</view>
+						</view>
+					</button>
+				</view>
+				<view>
+					<view v-if="item.favourited" class="iconfont icon-favourites-filled-star-symbol active"></view>
+					<view v-else class="iconfont icon-Favourites-Add-Large"></view>
+					<view>收藏</view>
+				</view>
+				<view>
+					<view v-if="item.liked" class="iconfont icon-aixin active"></view>
+					<view v-else class="iconfont icon-Heart"></view>
+					<view>点赞</view>
+				</view>
+				<view>
+					<view v-if="item.voted" class="iconfont icon-Ticket1 active"></view>
+					<view v-else class="iconfont icon-xiaochengxu-toupiaoicon"></view>
+					<view>投票</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+		},
+		props: {
+			// 数据
+			item: Object,
+			footerHidden: Boolean
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+		},
+		methods: {
+			onShareAppMessage(ops) {
+				const item = ops.target.dataset.item
+				return {
+					title: item.name || '分享展商',
+					path: `/pages/exhibitor/exhibit-detail`,
+					imageUrl: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png'
+				};
+			},
+			onShare(item) {
+			},
+			onClickExhibitor() {
+				uni.navigateTo({
+					url: '/pages/exhibitor/detail'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss">
+</style>

+ 25 - 8
pages/exhibitor/detail.vue

@@ -5,11 +5,12 @@
 			<view class="main-container">
 				<view class="exhibitor-main">
 					<view class="exhibitor-logo">
-						<image src="/static/img/example/exhibitor_logo.png" mode="widthFix" />
+						
+						<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png?x-oss-process=image/resize,w_200" mode="aspectFit" />
 					</view>
 					<view class="exhibitor-title">
 						<view class="exhibitor-title-1">
-							科世达(上海)连接器有限公司 AB
+							科世达(上海)连接器有限公司
 						</view>
 						<view class="exhibitor-title-2">
 							 Leopold Kostal GmbH & Co. KG
@@ -51,8 +52,12 @@
 							<view>人气:11192</view>
 						</view>
 						<view>
-							<view class="iconfont icon-zhuanfa"></view>
-							<view>分享</view>
+							<button open-type="share">
+								<view>
+									<view class="iconfont icon-zhuanfa"></view>
+									<view>分享</view>
+								</view>
+							</button>
 						</view>
 						<view>
 							<view class="iconfont icon-Favourites-Add-Large"></view>
@@ -70,22 +75,24 @@
 				</view>
 				<u-panel title="展品资料">
 					<exhibit-recommend />
-					<view class="click-more"><van-button type="primary">点击展开更多展品</van-button></view>
+					<view class="click-more"><van-button type="primary" @click="navigateTo('/pages/exhibitor/exhibit')">点击展开更多展品</van-button></view>
 				</u-panel>
 				<u-panel title="展商新闻">
 					<news-recommend recommend-type="detail" />
-					<view class="click-more"><van-button type="primary">点击展开更多新闻</van-button></view>
 				</u-panel>
 				<u-panel title="展商活动">
 					<activity-recommend recommend-type="detail" />
-					<view class="click-more"><van-button type="primary">点击展开更多活动</van-button></view>
 				</u-panel>
+				<view class="click-more"><van-button type="primary" @click="navigateTo('/pages/exhibitor/index')">点击查看更多展商信息</van-button></view>
 			</view>
 		</u-scroll-view>
 	</view>
 </template>
 
 <script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import UPanel from '@/components/common/u-panel'
 	import ExhibitRecommend from '@/pages/exhibitor/components/exhibit-recommend.vue'
 	import NewsRecommend from '@/pages/news/components/news-recommend.vue'
 	import ActivityRecommend from '@/pages/activity/components/activity-recommend.vue'
@@ -95,6 +102,9 @@
 			// styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView,
+			UPanel,
 			ExhibitRecommend,
 			ActivityRecommend,
 			NewsRecommend
@@ -109,12 +119,19 @@
 		created() {
 		},
 		methods: {
+			onShareAppMessage() {
+				return {
+					title: '分享展商详情',
+					path: `/pages/exhibitor/exhibit-detail`,
+					imageUrl: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png'
+				}
+			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	@import "@/static/style/exhibitor-detail.scss";
+	@import "@/static/style/pages/exhibitor-detail.scss";
 	.exhibitor-detail{
 		.exhibitor-main{
 			display: flex;

+ 24 - 7
pages/exhibitor/exhibit-detail.vue

@@ -34,8 +34,12 @@
 							<view>人气:11192</view>
 						</view>
 						<view>
-							<view class="iconfont icon-zhuanfa"></view>
-							<view>分享</view>
+							<button open-type="share">
+								<view>
+									<view class="iconfont icon-zhuanfa"></view>
+									<view>分享</view>
+								</view>
+							</button>
 						</view>
 						<view>
 							<view class="iconfont icon-Favourites-Add-Large"></view>
@@ -55,7 +59,7 @@
 					<view class="exhibitor-card">
 						<view class="exhibitor-info">
 							<view class="exhibitor-logo">
-								<image src="/static/img/example/kostal_log.png" mode="widthFix" />
+								<image src="/static/img/example/kostal_log.png" mode="aspectFit" />
 							</view>
 							<view class="exhibitor-name-cn">科世达(上海)连接器有限公司</view>
 							<view class="exhibitor-name-en">Leopold Kostal GmbH & Co. KG</view>
@@ -79,12 +83,18 @@
 </template>
 
 <script>
-
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import UPanel from '@/components/common/u-panel'
+	
 	export default {
 		options: {
-			// styleIsolation: 'shared'
+			styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView,
+			UPanel
 		},
 		computed: {},
 		data() {
@@ -93,6 +103,13 @@
 		created() {
 		},
 		methods: {
+			onShareAppMessage() {
+				return {
+					title: '分享展品详情',
+					path: `/pages/exhibitor/exhibit-detail`,
+					imageUrl: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70c02212.png'
+				}
+			},
 			onClickDetail(e) {
 				uni.navigateTo({
 					url: '/pages/exhibitor/detail'
@@ -103,7 +120,7 @@
 </script>
 
 <style lang="scss">
-	@import "@/static/style/exhibitor-detail.scss";
+	@import "@/static/style/pages/exhibitor-detail.scss";
 	.exhibit-detail{
 		.exhibit-image{
 			position: relative;
@@ -164,7 +181,7 @@
 				font-size: $fontSize1;
 			}
 			.exhibitor-number{
-				@extend .display-flex-center;
+				@include display-flex-center;
 				flex-direction: column;
 				width: 267rpx;
 				background-color: $buttonPrimaryColor;

+ 20 - 65
pages/exhibitor/exhibit.vue

@@ -19,47 +19,12 @@
 			</view>
 			<u-search v-model="searchKeyword" placeholder="搜索展商 / 展品名称 / 会议" @search="onSearch" />
 			<view class="ad-space">
-				<image src="/static/img/example/ad_690x90.png" mode="aspectFill"/>
+				<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70a6c76a.png?x-oss-process=image/resize,w_200" mode="aspectFill"/>
 			</view>
-			<view class="exhibitor-list">
-				<template v-for="item in [1, 2, 3]">
-					<view class="exhibit-item exhibitor-item" hover-class="active" @click="onClickExhibit(item)">
-						<view class="exhibit-body">
-							<view class="exhibitor-body">
-								<view class="exhibitor-logo"><image src="/static/img/example/exhibit.png" mode="widthFix" /></view>
-								<view class="exhibitor-name">汽车连接器 86W MLK 1,2 SD-HOLDER</view>
-								<view class="exhibitor-number">
-									<view class="exhibitor-number-label">展位号:</view>
-									<view class="exhibitor-number-text">E1.1101</view>
-								</view>
-							</view>
-							<view class="exhibitor-name">
-								<view class="exhibitor-name-cn">科世达(上海)连接器有限公司</view>
-								<view class="exhibitor-name-en">Leopold Kostal GmbH & Co. KG</view>
-							</view>
-						</view>
-						<view class="exhibitor-footer">
-							<view class="exhibitor-views">浏览:30911</view>
-							<view class="exhibitor-action">
-								<view>
-									<view class="iconfont icon-zhuanfa"></view>
-									<view>分享</view>
-								</view>
-								<view>
-									<view class="iconfont icon-Favourites-Add-Large"></view>
-									<view>收藏</view>
-								</view>
-								<view>
-									<view class="iconfont icon-Heart"></view>
-									<view>点赞</view>
-								</view>
-								<view>
-									<view class="iconfont icon-xiaochengxu-toupiaoicon"></view>
-									<view>投票</view>
-								</view>
-							</view>
-						</view>
-					</view>
+			<van-empty v-if="exhibitList.length === 0" description="暂无数据" />
+			<view v-else class="exhibit-list exhibitor-list">
+				<template v-for="(item, index) in exhibitList">
+					<exhibit-item :item="item" :key="index" />
 				</template>	
 			</view>
 		</view>
@@ -68,12 +33,22 @@
 </template>
 
 <script>
-
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import USearch from '@/components/common/u-search'
+	import UDropdownSelect from '@/components/common/u-dropdown-select'
+	import ExhibitItem from '@/pages/exhibitor/components/exhibit-item.vue'
+	
 	export default {
 		options: {
 			// styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			UScrollView,
+			USearch,
+			UDropdownSelect,
+			ExhibitItem
 		},
 		computed: {
 		},
@@ -81,6 +56,7 @@
 			return {
 				scrollviewHeight: 0,
 				searchKeyword: '',
+				exhibitList: [{ favourited: true }, { liked: true }, { voted: true }, {} ],
 				categories: [{
 					label: '表面贴装',
 					value: 1,
@@ -137,34 +113,13 @@
 				})
 			},
 			onSearch() {
+				uni.navigateTo({
+					url: '/pages/index/search?query=' + this.searchKeyword
+				})
 			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	@import "@/static/style/exhibitor.scss";
-	.exhibit-index{
-		.exhibit-body{
-			display: flex;
-			flex-direction: column;
-			&>.exhibitor-name{
-				margin-left: 113rpx;
-			}
-			.exhibitor-name-cn{
-				margin-bottom: 5rpx;
-			}
-			.exhibitor-name-cn,.exhibitor-name-en{
-				color: #7d7d7d;
-				font-size: $fontSize1;
-				font-weight: normal;
-			}
-		}
-		.exhibitor-body{
-			&>.exhibitor-name{
-				margin-left: 23rpx;
-				line-height: 40rpx;
-			}
-		}
-	}
 </style>

+ 21 - 46
pages/exhibitor/index.vue

@@ -19,44 +19,12 @@
 				</view>
 				<u-search v-model="searchKeyword" placeholder="搜索展商 / 展品名称 / 会议" @search="onSearch" />
 				<view class="ad-space">
-					<image src="/static/img/example/ad_690x90.png" mode="aspectFill"/>
+					<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70a6c76a.png?x-oss-process=image/resize,w_200" mode="aspectFill"/>
 				</view>
-				<view class="exhibitor-list">
-					<template v-for="item in [1, 2, 3, 4, 5, 6, 7, 8]">
-						<view class="exhibitor-item" hover-class="active" @click="onClickExhibitor">
-							<view class="exhibitor-body">
-								<view class="exhibitor-logo"><image src="/static/img/example/exhibitor_logo.png" mode="widthFix" /></view>
-								<view class="exhibitor-name">
-									<view class="exhibitor-name-cn">科世达(上海)连接器有限公司</view>
-									<view class="exhibitor-name-en">Leopold Kostal GmbH & Co. KG</view>
-								</view>
-								<view class="exhibitor-number">
-									<view class="exhibitor-number-label">展位号:</view>
-									<view class="exhibitor-number-text">E1.1101</view>
-								</view>
-							</view>
-							<view class="exhibitor-footer">
-							<view class="exhibitor-views">浏览:30911</view>
-							<view class="exhibitor-action">
-								<view>
-									<view class="iconfont icon-zhuanfa"></view>
-									<view>分享</view>
-								</view>
-								<view>
-									<view class="iconfont icon-Favourites-Add-Large"></view>
-									<view>收藏</view>
-								</view>
-								<view>
-									<view class="iconfont icon-Heart"></view>
-									<view>点赞</view>
-								</view>
-								<view>
-									<view class="iconfont icon-xiaochengxu-toupiaoicon"></view>
-									<view>投票</view>
-								</view>
-							</view>
-						</view>
-						</view>
+				<van-empty v-if="exhibitorList.length === 0" description="暂无数据" />
+				<view v-else class="exhibitor-list">
+					<template v-for="(item, index) in exhibitorList">
+						<exhibitor-item :item="item" :key="index" />
 					</template>	
 				</view>
 			</view>
@@ -65,16 +33,27 @@
 </template>
 
 <script>
-
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import USearch from '@/components/common/u-search'
+	import UDropdownSelect from '@/components/common/u-dropdown-select'
+	import ExhibitorItem from '@/pages/exhibitor/components/exhibitor-item.vue'
+	
 	export default {
 		options: {
-			// styleIsolation: 'shared'
+			styleIsolation: 'shared'
 		},
 		components: {
+			NavBar,
+			USearch,
+			UScrollView,
+			UDropdownSelect,
+			ExhibitorItem
 		},
 		data() {
 			return {
 				searchKeyword: '',
+				exhibitorList: [{ favourited: true }, { liked: true }, { voted: true }, {}, {}, {}],
 				categories: [{
 					label: '表面贴装',
 					value: 1,
@@ -117,11 +96,6 @@
 		},
 		created() {},
 		methods: {
-			onClickExhibitor() {
-				uni.navigateTo({
-					url: '/pages/exhibitor/detail'
-				})
-			},
 			onSelectDropdown(index) {
 				['select1', 'select2', 'select3'].forEach(v => {
 					if (v !== 'select' + index) {
@@ -130,12 +104,13 @@
 				})
 			},
 			onSearch() {
-				
+				uni.navigateTo({
+					url: '/pages/index/search?query=' + this.searchKeyword
+				})
 			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	@import "@/static/style/exhibitor.scss";
 </style>

+ 92 - 0
pages/index/components/contact-us.vue

@@ -0,0 +1,92 @@
+<template>
+	<van-overlay :show="show">
+		<view class="contact-us-wrapper">
+			<view class="contact-us">
+				<view class="contact-us-qrcode">
+					<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70d643d9.jpg?x-oss-process=image/resize,w_400" />
+				</view>
+				<view class="contact-us-label-1">联系我们</view>
+				<view class="contact-us-label-2">在线客服1v1实时回复</view>
+				<view class="contact-us-service-list">
+					<view>参展咨询:邢女士,021-2020 5553</view>
+					<view>论坛咨询:顾女士,021-2020 5691</view>
+					<view>参观咨询:张女士,021-2020 5611</view>
+				</view>
+				<view class="contact-us-close" @click="onClickClose">
+					<van-icon name="close" />
+				</view>
+			</view>
+		</view>
+	</van-overlay>
+</template>
+
+<script>
+	import VanOverlay from '@/wxcomponents/vant/overlay/index'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			VanOverlay
+		},
+		props: {
+			show: Boolean
+		},
+		data() {
+			return {
+			}
+		},
+		created() {},
+		methods: {
+			onClickClose() {
+				this.$emit('update:show', false)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.contact-us-wrapper{
+		@include display-flex-center;
+		height: 100%;
+		.contact-us{
+			@include display-flex-center;
+			position: relative;
+			flex-direction: column;
+			width: 500rpx;
+			height: 689rpx;
+			background-color: $buttonPrimaryColor;
+			border-radius: 15rpx 15rpx 15rpx 15rpx;
+			color: #FFFFFF;
+		}
+		.contact-us-qrcode{
+			width: 279rpx;
+			height: 279rpx;
+			margin-top: 69rpx auto 0 auto;
+		}
+		.contact-us-label-1{
+			margin-top: 30rpx;
+			font-size: $fontSize5;
+		}
+		.contact-us-label-2{
+			margin-top: 13rpx;
+			font-size: $fontSize5;
+		}
+		.contact-us-service-list{
+			display: grid;
+			grid-template-columns: 1fr;
+			grid-row-gap: 10rpx;
+			margin-top: 20rpx;
+			font-size: $fontSize2;
+		}
+		.contact-us-close{
+			position: absolute;
+			top: -70rpx;
+			right: -70rpx;
+			.van-icon-close{
+				font-size: 69rpx;
+			}
+		}
+	}
+</style>

+ 138 - 0
pages/index/components/popup-ad.vue

@@ -0,0 +1,138 @@
+<template>
+	<van-overlay :show="show">
+		<view class="popup-ad-wrapper">
+			<view class="popup-ad">
+				<view class="popup-ad-image" @click="onClickImage">
+					<image :src="adImage" mode="widthFix"/>
+				</view>
+				<view class="popup-ad-close" @click="onClickClose">
+					<van-icon name="close" />
+				</view>
+			</view>
+		</view>
+		<van-action-sheet
+		  :show="showActionSheet"
+		  :actions="actions"
+		  @select="onActionSelect"
+			@cancel="onActionCancel"
+			:close-on-click-overlay="true"
+			:close-on-click-action="true"
+			cancel-text="取消"
+		/>
+	</van-overlay>
+</template>
+
+<script>
+  import VanOverlay from '@/wxcomponents/vant/overlay/index'
+	import VanActionSheet from '@/wxcomponents/vant/action-sheet/index'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			VanOverlay,
+			VanActionSheet
+		},
+		props: {
+			show: Boolean
+		},
+		data() {
+			return {
+				adUrl: 'https://file.smarket.net.cn/s/template/hOM48k/index.html?customFormId=2310071208827845&instanceId=387836&linkId=345547&configId=3439487%23%2Fwap_index%3FrandNum%3D1709540499#/pc_index?randNum=1709540499',
+				adImage: 'https://oss.starify.cn/prod/starify/up/0001018678/20241107/672c895e605c9.png',
+				showActionSheet: false,
+				actions: [{
+						name: '保存图片',
+						value: 'save'
+				}, {
+						name: '识别二唯码',
+						value: 'open'
+				}]
+			}
+		},
+		created() {
+			
+		},
+		methods: {
+			onClickClose() {
+				this.$emit('update:show', false)
+			},
+			onClickImage() {
+				this.showActionSheet = true
+				// uni.previewImage({
+				// 	current: this.adImage,
+				// 	urls: [this.adImage],
+				// })
+			},
+			onActionSelect(e) {
+				if (e.detail.value === 'save') {
+					uni.getImageInfo({
+						src: this.adImage,
+						success: (res) => {
+							uni.saveImageToPhotosAlbum({
+								filePath: res.path,
+								success() {
+									uni.showToast({
+										title: '保存成功',
+										icon: 'success',
+									})
+								},
+								fail(err) {
+									uni.showToast({
+										title: '保存失败',
+										icon: 'none',
+									});
+									console.error(err);
+								},
+							})
+						},
+						fail(err) {
+							uni.showToast({
+								title: '获取图片失败',
+								icon: 'none',
+							})
+							console.error(err)
+						},
+					})
+				} else if (e.detail.value === 'open') {
+					this.navigateTo(this.adUrl)
+				}
+				this.showActionSheet = false
+			},
+			onActionCancel() {
+				this.showActionSheet = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.popup-ad-wrapper{
+		@include display-flex-center;
+		height: 100%;
+		.popup-ad{
+			@include display-flex-center;
+			width: 100%;
+			position: relative;
+			flex-direction: column;
+			padding: 36rpx;
+		}
+		.popup-ad-image{
+			width: 100%;
+			image{
+				width: 100%;
+				height: auto;
+				border-radius: 10rpx;
+				overflow: hidden;
+			}
+		}
+		.popup-ad-close{
+			margin-top: 50rpx;
+			.van-icon-close{
+				font-size: 69rpx;
+				color: #ffffff;
+			}
+		}
+	}
+</style>

+ 114 - 41
pages/index/home.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="content">
-		<nav-bar>
+		<nav-bar :show-title="false">
 			<view class="top-container">
 				<image class="logo" src="/static/logo.png" />
 				<view class="countdown">
@@ -13,8 +13,8 @@
 			<u-search v-model="searchKeyword" placeholder="搜索展商 / 展品名称 / 会议" @search="onClickSearch"/>
 			<view class="nav-icons">
 				<template v-for="(item, index) in navIcons">
-					<view class="nav-icon-wrapper display-flex-center" :key="index">
-						<view class="nav-icon display-flex-center">
+					<view class="nav-icon-wrapper" :key="index">
+						<view class="nav-icon" @click="onClickNavIcon(item)">
 							<view v-if="item.icon.indexOf('.svg') !== -1" :style="'background-image:url(' + item.icon +  ')'"></view>
 							<view v-else-if="item.icon.indexOf('icon-') !== -1" :class="'iconfont ' + item.icon"></view>
 						</view>
@@ -24,28 +24,28 @@
 					</view>
 				</template>
 			</view>
-			<u-panel title="精彩视频" link="/pages/components/index">
+			<u-panel title="精彩视频" link="https://www.productronicachina.com.cn/for-journalists-impression-videos">
 				<u-swiper :items="videos" :height="360" :autoplay="false" :border-radius="10" :image-width="508" :image-height="286"
 					next-margin="100rpx" />
 			</u-panel>
-			<u-panel title="精彩图集" link="/pages/components/index">
+			<u-panel title="精彩图集" link="https://www.productronicachina.com.cn/for-journalists-impression-videos">
 				<view class="album">
 					<template v-for="(item, index) in albumPics">
-						<view class="album-pic">
+						<view class="album-pic" :key="index" @click="onClickAlbum(index)">
 							<image :src="item.src" mode="aspectFill" />
 						</view>
 					</template>
 				</view>
 			</u-panel>
-			<u-panel title="新闻" link="/pages/components/index">
+			<u-panel title="新闻" link="/pages/news/index">
 				<news-recommend />
 			</u-panel>
-			<u-panel title="战略合作方" link="/pages/components/index">
+			<u-panel title="战略合作方" link="https://www.productronicachina.com.cn/partners">
 				<u-swiper :items="partners" :height="250">
 					<template v-slot="{ scope }">
 						<view class="partners">
-							<template v-for="item in scope.children">
-								<view class="partner">
+							<template v-for="(item, index) in scope.children">
+								<view class="partner" :key="index">
 									<image :src="item.icon" />
 								</view>
 							</template>
@@ -53,12 +53,12 @@
 					</template>
 				</u-swiper>
 			</u-panel>
-			<u-panel title="推荐展商" link="/pages/components/index">
+			<u-panel title="推荐展商" link="https://www.productronicachina.com.cn/partners">
 				<u-swiper :items="partners" :height="250">
 					<template v-slot="{ scope }">
 						<view class="partners">
-							<template v-for="item in scope.children">
-								<view class="partner">
+							<template v-for="(item, index) in scope.children">
+								<view class="partner" :key="index">
 									<image :src="item.icon" />
 								</view>
 							</template>
@@ -66,12 +66,12 @@
 					</template>
 				</u-swiper>
 			</u-panel>
-			<u-panel title="合作媒体" link="/pages/components/index">
+			<u-panel title="合作媒体" link="https://www.productronicachina.com.cn/partners">
 				<u-swiper :items="partners" :autoplay="false" :height="250">
 					<template v-slot="{ scope }">
 						<view class="partners">
-							<template v-for="item in scope.children">
-								<view class="partner">
+							<template v-for="(item, index) in scope.children">
+								<view class="partner" :key="index">
 									<image :src="item.icon" />
 								</view>
 							</template>
@@ -80,86 +80,112 @@
 				</u-swiper>
 			</u-panel>
 		</view>
+		<contact-us :show.sync="showContactUs" />
+		<popup-ad :show.sync="showPopupAd" />
+		<view class="floating-buttons">
+			<view hover-class="hover" @click="showPopupAd = true">
+				<view class="iconfont icon-xiaochengxu-canguandengjiicon"></view>
+				<view class="floating-button-label">参观登记</view>
+			</view>
+			<view hover-class="hover" @click="showContactUs = true">
+				<view class="iconfont icon-xiaochengxu-lianxiwomenicon"></view>
+				<view class="floating-button-label">联系我们</view>
+			</view>
+		</view>
 	</view>
 </template>
 
 <script>
-
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import USwiper from '@/components/common/u-swiper'
+	import USearch from '@/components/common/u-search'
+	import UPanel from '@/components/common/u-panel'
 	import NewsRecommend from '@/pages/news/components/news-recommend.vue'
+	import ContactUs from '@/pages/index/components/contact-us.vue'
+	import PopupAd from '@/pages/index/components/popup-ad.vue'
 
 	export default {
 		options: {
 			styleIsolation: 'shared'
 		},
 		components: {
-			NewsRecommend
+			NavBar,
+			UScrollView,
+			USwiper,
+			USearch,
+			UPanel,
+			NewsRecommend,
+			ContactUs,
+			PopupAd
 		},
 		data() {
 			return {
 				searchKeyword: '',
+				showContactUs: false,
+				showPopupAd: false,
 				navIcons: [{
 					icon: 'icon-xiaochengxu-guanyuzhanhuiicon',
 					name: '关于展会',
-					url: ''
+					link: ''
 				}, {
 					icon: 'icon-xiaochengxu-zhanshangmingluicon',
 					name: '展商名录',
-					url: ''
+					link: '/pages/exhibitor/index'
 				}, {
 					icon: 'icon-zhanpinziliaoicon',
 					name: '展商产品',
-					url: ''
+					link: '/pages/exhibitor/exhibit'
 				}, {
 					icon: 'icon-zhantaihuodongicon',
 					name: '同期活动',
-					url: ''
+					link: '/pages/activity/index'
 				}, {
 					icon: 'icon-zhanshangxinwenicon',
 					name: '展商新闻',
-					url: ''
+					link: '/pages/news/index?type=exhibitor'
 				}, {
 					icon: 'icon-xiaochengxu-zhanguanpingmiantuicon',
 					name: '展馆平面图',
-					url: ''
+					link: ''
 				}, {
 					icon: 'icon-xiaochengxu-guanzhongzhinanicon',
 					name: '观众指南',
-					url: ''
+					link: ''
 				}, {
 					icon: 'icon-xiaochengxu-jiaotongzhinanicon',
 					name: '交通指南',
-					url: ''
+					link: ''
 				}],
 				images: [{
-					src: '/static/img/example/banner.png',
-					url: 'https://www.productronicachina.com.cn/',
-					
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da5a7dd374.png?x-oss-process=image/resize,w_750',
+					url: 'https://www.productronicachina.com.cn/'
 				}, {
-					src: '/static/img/example/banner.png',
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da5a7dd374.png?x-oss-process=image/resize,w_750',
 					url: 'https://www.productronicachina.com.cn/'
 				}, {
-					src: '/static/img/example/banner.png',
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da5a7dd374.png?x-oss-process=image/resize,w_750',
 					url: 'https://www.productronicachina.com.cn/'
 				}],
 				videos: [{
-					src: '/static/img/example/video.jpeg',
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da5a8add02.jpeg?x-oss-process=image/resize,w_500',
 					url: 'https://matchexpo.obs.cn-north-1.myhuaweicloud.com/common/2023/1113/655190052f376.mp4'
 				}, {
-					src: '/static/img/example/video.jpeg',
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da5a8add02.jpeg?x-oss-process=image/resize,w_500',
 					url: 'https://matchexpo.obs.cn-north-1.myhuaweicloud.com/common/2023/1113/655190052f376.mp4'
 				}],
 				albumPics: [{
-					src: '/static/img/example/album/1.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d0387b5.jpeg?x-oss-process=image/resize,w_200'
 				}, {
-					src: '/static/img/example/album/2.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d081488.jpeg?x-oss-process=image/resize,w_200'
 				}, {
-					src: '/static/img/example/album/3.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d0dd2a1.jpeg?x-oss-process=image/resize,w_200'
 				}, {
-					src: '/static/img/example/album/4.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d13e734.jpeg?x-oss-process=image/resize,w_200'
 				}, {
-					src: '/static/img/example/album/5.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d1a47e6.jpeg?x-oss-process=image/resize,w_200'
 				}, {
-					src: '/static/img/example/album/6.jpeg'
+					src: 'https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da4d214927.jpeg?x-oss-process=image/resize,w_200'
 				}],
 				// 合作方列表
 				partners: [{
@@ -220,8 +246,26 @@
 			})
 		},
 		methods: {
+			onClickNavIcon(item) {
+				if (item.link === '/pages/exhibitor/index') {
+					this.$emit('switch-tab', 'exhibitor')
+					return
+				}
+				this.navigateTo(item.link)
+			},
 			onClickSearch() {
-				console.log(this.searchKeyword)
+				uni.navigateTo({
+					url: '/pages/index/search?query=' + this.searchKeyword
+				})
+			},
+			onClickAlbum(index) {
+				const pics = this.albumPics.map(v => {
+					return v.src
+				})
+				uni.previewImage({
+					current: index,
+					urls: pics
+				})
 			}
 		}
 	}
@@ -303,6 +347,7 @@
 		margin-bottom: 41rpx;
 
 		.nav-icon-wrapper {
+			@include display-flex-center;
 			flex-direction: column;
 		}
 
@@ -313,6 +358,7 @@
 		}
 
 		.nav-icon {
+			@include display-flex-center;
 			width: 73rpx;
 			height: 73rpx;
 			border-radius: 50%;
@@ -389,7 +435,7 @@
 		grid-column-gap: 9rpx;
 		grid-row-gap: 13rpx;
 		.partner{
-			@extend .display-flex-center;
+			@include display-flex-center;
 			width: 150rpx;
 			height: 91rpx;
 		}
@@ -398,5 +444,32 @@
 			height: 25rpx;
 		}
 	}
+	.floating-buttons{
+		position: fixed;
+		right: 30rpx;
+		bottom: 200rpx;
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-row-gap: 19rpx;
+		&>view{
+			@include display-flex-center;
+			flex-direction: column;
+			width: 100rpx;
+			height: 100rpx;
+			background-color: #FFFFFF;
+			box-shadow: 0rpx 0rpx 20rpx 0rpx rgba(0,0,0,0.25);
+			border-radius: 50%;
+		}
+		.floating-button-label{
+			width: 64rpx;
+			margin-top: 6rpx;
+			font-size: $fontSize0;
+			color: #94A3B8;
+		}
+		.iconfont{
+			font-size: 44rpx;
+			color: $textActionColor;
+		}
+	}
 	
 </style>

+ 6 - 3
pages/index/index.vue

@@ -1,8 +1,9 @@
 <template>
 	<view class="content">
-		<home v-if="tabbarActive === 'home'" />
+		<home v-if="tabbarActive === 'home'" @switch-tab="tabbarActive = 'exhibitor'"/>
 		<exhibitor v-if="tabbarActive === 'exhibitor'" />
 		<activity v-if="tabbarActive === 'activity'" />
+		<user v-if="tabbarActive === 'user'" />
 		<tab-bar :active.sync="tabbarActive"></tab-bar>
 	</view>
 </template>
@@ -12,16 +13,18 @@
 	import Home from '@/pages/index/home.vue'
 	import Exhibitor from '@/pages/exhibitor/index.vue'
 	import Activity from '@/pages/activity/index.vue'
+	import User from '@/pages/user/index.vue'
 
 	export default {
 		options: {
-			// styleIsolation: 'shared'
+			styleIsolation: 'shared'
 		},
 		components: {
 			TabBar,
 			Home,
 			Exhibitor,
-			Activity
+			Activity,
+			User
 		},
 		data() {
 			return {

+ 121 - 0
pages/index/search.vue

@@ -0,0 +1,121 @@
+<template>
+	<view class="search-index">
+		<nav-bar title="搜索" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<view class="main-container">
+				<u-search v-model="searchKeyword" placeholder="搜索展商 / 展品名称 / 会议" @search="onClickSearch"/>
+				<view class="search-result-text">搜索结果</view>
+				<template v-if="isEmpty">
+					<van-empty description="暂无数据" />
+				</template>
+				<template v-else>
+					<u-tabs :active.sync="tabActive" :tabs="tabs" tab-style="default" @change="tabChange"/>
+					<view v-if="tabActive === 1" class="search-result-list exhibit-list">
+						<template v-for="(item, index) in [1, 2, 3]">
+							<exhibitor-item :item="item" :key="index" />
+						</template>
+					</view>
+					<view v-else-if="tabActive === 2" class="search-result-list exhibit-list">
+						<template v-for="(item, index) in [1, 2, 3]">
+							<exhibit-item :item="item" :key="index" />
+						</template>
+					</view>
+					<view v-else-if="tabActive === 3" class="search-result-list exhibit-list">
+						<template v-for="(item, index) in [1, 2, 3, 4, 5]">
+							<news-item :item="item" :key="index" />
+						</template>
+					</view>
+					<view v-else-if="tabActive === 4" class="search-result-list exhibit-list">
+						<template v-for="(item, index) in [1, 2, 3, 4, 5]">
+							<activity-item :item="item" :key="index" />
+						</template>
+					</view>
+					<view v-else-if="tabActive === 5" class="search-result-list exhibit-list">
+						<template v-for="(item, index) in [1, 2, 3, 4, 5]">
+							<activity-item :item="item" :key="index" />
+						</template>
+					</view>
+				</template>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UTabs from '@/components/common/u-tabs'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import USearch from '@/components/common/u-search'
+	import ExhibitItem from '@/pages/exhibitor/components/exhibit-item.vue'
+	import ExhibitorItem from '@/pages/exhibitor/components/exhibitor-item.vue'
+	import NewsItem from '@/pages/news/components/news-item.vue'
+	import ActivityItem from '@/pages/activity/components/activity-item.vue'
+
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UScrollView,
+			UTabs,
+			USearch,
+			ExhibitItem,
+			ExhibitorItem,
+			NewsItem,
+			ActivityItem
+		},
+		data() {
+			return {
+				searchKeyword: '',
+				tabActive: 1,
+				isEmpty: false,
+				tabs: [{
+					label: '展商',
+					value: 1
+				}, {
+					label: '展品',
+					value: 2
+				}, {
+					label: '展商新闻',
+					value: 3
+				}, {
+					label: '展商活动',
+					value: 4
+				}, {
+					label: '同期活动',
+					value: 5
+				}]
+			}
+		},
+		onLoad(options) {
+			console.log('options')
+			console.log(options.query)
+			this.searchKeyword = options.query
+		},
+		created() {},
+		methods: {
+			tabChange() {
+				
+			},
+			onClickSearch() {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.search-result-text{
+		margin: 33rpx 0;
+		display: block;
+		font-size: $fontSize2;
+		color: #000000;
+	}
+	.search-result-list{
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-row-gap: 28rpx;
+		margin-top: 32rpx;
+	}
+</style>

+ 2 - 2
pages/index/webview.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script>
-
+	
 	export default {
 		components: {
 		},
@@ -15,7 +15,7 @@
 			}
 		},
 		onLoad(options) {
-			this.url = options.url
+			this.url = decodeURIComponent(options.url)
 			console.log(options.url)
 		},
 		created() {

+ 83 - 0
pages/news/components/news-item.vue

@@ -0,0 +1,83 @@
+<template>
+	<view class="news-item" @click="onClickDetail(item)">
+		<view class="news-title">组装自动化与测试测量深度融合,赋能电子制造业高质量发展2024</view>
+		<view class="news-time">2024年6月28日</view>
+		<view class="news-summary">
+			<view class="text">在人类历史长河中,工业生产一直是社会进步的重要驱动力,而自动化技术的飞速发展,使其正在经历前所未有的变革。特别是在电子生产制造领域,传统的人工操作由于易疲劳、品质不稳定以及</view>
+			<view class="to-detail"><view>了解详情</view> <view class="arrow iconfont icon-right-s"></view></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		components: {
+		},
+		props: {
+			item: Object
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+		},
+		methods: {
+			onClickDetail(item) {
+				uni.navigateTo({
+					url: '/pages/index/webview?url=https://www.productronicachina.com.cn/2025%E6%85%95%E5%B0%BC%E9%BB%91%E4%B8%8A%E6%B5%B7%E7%94%B5%E5%AD%90%E7%94%9F%E4%BA%A7%E8%AE%BE%E5%A4%87%E5%B1%953%E6%9C%88%E5%A5%8F%E5%93%8D%E6%96%B0%E7%AF%87%E7%AB%A0-%E6%8E%A2%E7%B4%A2%E7%94%B5%E5%AD%90%E5%88%B6%E9%80%A0%E7%9A%84%E6%97%A0%E9%99%90%E5%8F%AF%E8%83%BD'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.news-item{
+		display: flex;
+		flex-direction: column;
+		height: 210rpx;
+		background-color: #F6F6F6;
+		border-radius: 10rpx;
+		padding: 24rpx 30rpx;
+	}
+	.news-summary{
+		display: flex;
+		align-items: center;
+	}
+	.news-title{
+		@include text-ellipsis-line;
+		font-family: Arial, Arial;
+		font-weight: bold;
+		font-size: $fontSize2;
+		line-height: 35rpx;
+	}
+	.news-time{
+		font-size: $fontSize0;
+		color: #555555;
+		margin: 12rpx 0;
+	}
+	.news-summary{
+		font-size: 18rpx;
+		line-height: 25rpx;
+		.text{
+			padding-right: 30rpx;
+			color: #555555;
+			@include text-ellipsis-line;
+			-webkit-line-clamp: 2;  
+		}
+		.to-detail{
+			display: flex;
+			align-items: center;
+			flex-shrink: 0;
+			color: $buttonPrimaryColor;
+			font-size: 16rpx;
+			font-weight: bold;
+			padding: 0 24rpx;
+		}
+		.arrow{
+			margin-left: 12rpx;
+			font-size: $fontSize0;
+		}
+	}
+</style>

+ 8 - 63
pages/news/components/news-recommend.vue

@@ -4,24 +4,21 @@
 			<u-tabs :active.sync="tabActive" :tabs="tabs" tab-style="default" @change="tabChange"/>
 		</view>
 		<view class="news-list">
-			<template v-for="(item, index) in [1, 2, 3]">
-					<view class="news-item" :key="index">
-						<view class="news-title">组装自动化与测试测量深度融合,赋能电子制造业高质量发展2024</view>
-						<view class="news-time">2024年6月28日</view>
-						<view class="news-summary">
-							<view class="text">在人类历史长河中,工业生产一直是社会进步的重要驱动力,而自动化技术的飞速发展,使其正在经历前所未有的变革。特别是在电子生产制造领域,传统的人工操作由于易疲劳、品质不稳定以及</view>
-							<view class="to-detail" @click="onClickDetail(item)"><view>了解详情</view> <view class="arrow iconfont icon-right-s"></view></view>
-						</view>
-					</view>
+			<template v-for="(item, index) in newsList">
+					<news-item :item="item" :key="index" />
 			</template>
 		</view>
 	</view>
 </template>
 
 <script>
+	import UTabs from '@/components/common/u-tabs'
+	import NewsItem from '@/pages/news/components/news-item.vue'
 	
 	export default {
 		components: {
+			UTabs,
+			NewsItem
 		},
 		props: {
 			recommendType: {
@@ -38,7 +35,8 @@
 				}, {
 					label: '展商新闻',
 					value: 2
-				}]
+				}],
+				newsList: [{}, {}, {}]
 			}
 		},
 		created() {
@@ -62,57 +60,4 @@
 		grid-row-gap: 18rpx;
 		margin-top: 28rpx;
 	}
-	.news-item{
-		display: flex;
-		flex-direction: column;
-		height: 210rpx;
-		background-color: #F6F6F6;
-		border-radius: 10rpx;
-		padding: 24rpx 30rpx;
-	}
-	.news-summary{
-		display: flex;
-		align-items: center;
-	}
-	.news-title{
-		@extend .text-ellipsis-line;
-		font-family: Arial, Arial;
-		font-weight: bold;
-		font-size: $fontSize2;
-		line-height: 35rpx;
-	}
-	.news-time{
-		font-size: $fontSize0;
-		color: #555555;
-		margin: 12rpx 0;
-	}
-	.news-summary{
-		font-size: 18rpx;
-		line-height: 25rpx;
-		.text{
-			padding-right: 30rpx;
-			color: #555555;
-			@extend .text-ellipsis-line;
-			-webkit-line-clamp: 2;  
-		}
-		.to-detail{
-			display: flex;
-			align-items: center;
-			flex-shrink: 0;
-			color: $buttonPrimaryColor;
-			font-size: 16rpx;
-			font-weight: bold;
-			padding: 0 24rpx;
-		}
-		.arrow{
-			margin-left: 12rpx;
-			font-size: $fontSize0;
-		}
-	}
-	
-	.news-tab{
-		van-button{
-			margin-right: 13rpx;
-		}
-	}
 </style>

+ 68 - 0
pages/news/index.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="news-index">
+		<nav-bar title="新闻" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view :tabbar-conflict="false">
+			<view class="main-container">
+				<u-tabs :active.sync="tabActive" :tabs="tabs" tab-style="default" @change="tabChange"/>
+				<van-empty v-if="newsList.length === 0" description="暂无数据" />
+				<view v-else class="news-list">	
+					<template v-for="(item, index) in newsList">
+						<news-item :item="item" :key="index" />
+					</template>	
+				</view>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UTabs from '@/components/common/u-tabs'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import NewsItem from '@/pages/news/components/news-item.vue'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UTabs,
+			UScrollView,
+			NewsItem
+		},
+		data() {
+			return {
+				tabActive: 'exhibition',
+				tabs: [{
+					label: '展会新闻',
+					value: 'exhibition'
+				}, {
+					label: '展商新闻',
+					value: 'exhibitor'
+				}],
+				newsList: [{}, {}, {}, {}, {}, {}]
+			}
+		},
+		onLoad(options) {
+			if (options.type) {
+				this.tabActive = options.type
+			}
+		},
+		created() {},
+		methods: {
+			tabChange() {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.news-list{
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-row-gap: 18rpx;
+		margin-top: 28rpx;
+	}
+</style>

+ 80 - 0
pages/user/favorites.vue

@@ -0,0 +1,80 @@
+<template>
+	<view class="user-favorites user-like">
+		<nav-bar title="我的收藏" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<view class="user-favorites-tabs user-like-tabs">
+				<u-tabs :active.sync="tabActive" :tabs="tabs" @change="tabChange" />
+			</view>
+			<view class="main-container">
+				<view class="user-favorites-list user-like-list">
+					<template v-for="(item, index) in favoritesList">
+						<template v-if="tabActive === 'exhibitor'">
+							<exhibitor-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+						<template v-else-if="tabActive === 'exhibit'">
+							<exhibit-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+						<template v-else-if="tabActive === 'activity'">
+							<activity-item :item="item" :favorites-hidden="true" :key="index" />
+						</template>
+					</template>
+				</view>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UTabs from '@/components/common/u-tabs'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import ExhibitItem from '@/pages/exhibitor/components/exhibit-item.vue'
+	import ExhibitorItem from '@/pages/exhibitor/components/exhibitor-item.vue'
+	import ActivityItem from '@/pages/activity/components/activity-item.vue'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UTabs,
+			UScrollView,
+			ExhibitItem,
+			ExhibitorItem,
+			ActivityItem
+		},
+		computed: {
+		},
+		data() {
+			return {
+				tabActive: 'exhibitor',
+				tabs: [{
+					label: '展商',
+					value: 'exhibitor'
+				}, {
+					label: '展品',
+					value: 'exhibit'
+				}, {
+					label: '同期活动',
+					value: 'activity'
+				}],
+				favoritesList: [{}, {}, {}, {}, {}, {}],
+			}
+		},
+		created() {
+			this.checkAuth('/pages/user/favorites')
+		},
+		onShow() {
+		}, 
+		methods: {
+			tabChange() {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/static/style/pages/user-like.scss";
+</style>

+ 189 - 0
pages/user/index.vue

@@ -0,0 +1,189 @@
+<template>
+	<view class="user-index">
+		<nav-bar title="个人中心" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view :tabbar-conflict="true">
+			<view class="main-container">
+				<view class="user-info" @click="onClickUserInfo">
+					<view class="user-avator">
+						<image v-if="isLoginState && avatar" :src="avatar" />
+						<van-icon v-else class="icon" name="user" />
+					</view>
+					<view class="user-title">
+						<view class="user-name">
+							<template v-if="isLoginState">{{ nickName || phone }}</template>
+							<template v-else>请登录/注册</template>
+						</view>
+						<view v-if="isLoginState && nickName" class="user-phone">手机号:{{ phone }}</view>
+					</view>
+				</view>
+				<view class="user-grid-menu">
+					<view hover-class="active" @click="navigateTo('/pages/user/like')">
+						<view class="iconfont icon-Heart"></view>
+						<view>点赞</view>
+					</view>
+					<view hover-class="active" @click="navigateTo('/pages/user/favorites')">
+						<view class="iconfont icon-Favourites-Add-Large"></view>
+						<view>收藏</view>
+					</view>
+					<view hover-class="active" @click="navigateTo('/pages/user/vote')">
+						<view class="iconfont icon-xiaochengxu-toupiaoicon"></view>
+						<view>投票</view>
+					</view>
+					<view hover-class="active">
+						<view class="iconfont icon-xiaochengxu-guanzhongyudengjiicon"></view>
+						<view>预登记</view>
+					</view>
+				</view>
+				<view class="user-list-item">
+					<van-cell-group>
+						<van-cell title="设置" is-link @click="onClickSetting">
+							<view slot="icon" class="iconfont icon-setting" />
+						</van-cell>	
+					</van-cell-group>
+				</view>
+				<view class="ad-space">
+					<image src="https://oss.starify.cn/prod/starify/up/0001018678/20241108/672da70adbdbe.png?x-oss-process=image/resize,w_200" mode="aspectFill" />
+				</view>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCell from '@/wxcomponents/vant/cell/index'
+	import VanCellGroup from '@/wxcomponents/vant/cell-group/index'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UScrollView,
+			VanCell,
+			VanCellGroup
+		},
+		computed: {
+			isLoginState() {
+				return this.$store.getters.user !== null
+			},
+			avatar() {
+				const user = this.$store.getters.user
+				if (user) {
+					return user.avatar
+				} else {
+					return ''
+				}
+			},
+			nickName() {
+				const user = this.$store.getters.user
+				if (user) {
+					return user.nick_name
+				} else {
+					return ''
+				}
+			},
+			phone() {
+				const user = this.$store.getters.user
+				if (user) {
+					return user.phone
+				} else {
+					return ''
+				}
+			}
+		},
+		data() {
+			return {
+			}
+		},
+		created() {},
+		onShow() {
+		}, 
+		methods: {
+			onClickSetting() {
+				if (!this.isLoginState) {
+					uni.navigateTo({
+						url: '/pages/user/login'
+					})
+				} else {
+					uni.navigateTo({
+						url: '/pages/user/setting'
+					})
+				}
+			},
+			onClickUserInfo(){
+				if (!this.isLoginState) {
+					uni.navigateTo({
+						url: '/pages/user/login'
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.user-index{
+		.user-info{
+			display: flex;
+			align-items: center;
+			.user-avator{
+				@include display-flex-center;
+				width: 111rpx;
+				height: 111rpx;
+				border-radius: 50%;
+				overflow: hidden;
+				margin-right: 23rpx;
+				background-color: $buttonPrimaryColor;
+				.icon{
+					color: #ffffff;
+					opacity: 0.67;
+					font-size: 70rpx;
+				}
+			}
+			.user-name{
+				font-size: 30rpx;
+				color: #333333;
+			}
+			.user-phone{
+				font-size: $fontSize2;
+				color: #7d7d7d;
+			}
+		}
+		.user-grid-menu{
+			display: grid;
+			grid-template-columns: repeat(4, 1fr);
+			height: 192rpx;
+			margin-top: 60rpx;
+			background-color: #FFFFFF;
+			&>view{
+				@include display-flex-center;
+				flex-direction: column;
+				font-size: $fontSize2;
+				color: #333333;
+				&.active{
+					background-color: rgba(0, 0, 0, 0.05)
+				}
+			}
+			.iconfont{
+				margin-bottom: 19rpx;
+				font-size: 44rpx;
+			}
+			.icon-Heart,.icon-xiaochengxu-toupiaoicon{
+				font-size: 48rpx;
+			}
+		}
+		.user-list-item{
+			margin-top: 23rpx;
+			.van-cell{
+				--cell-horizontal-padding: 58rpx;
+			}
+		}
+		.ad-space{
+			height: 180rpx;
+			margin-top: 23rpx;
+		}
+	}
+</style>

+ 192 - 0
pages/user/info-edit.vue

@@ -0,0 +1,192 @@
+<template>
+	<view class="user-info-edit">
+		<nav-bar title="个人信息" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<form @submit="onSubmit">
+				<van-cell-group>
+					<van-cell title="头像" class="user-avatar-cell van-cell--clickable">
+						<view class="right-icon" slot="right-icon">
+							<button class="btn-choose" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"></button>
+							<view class="user-avator">
+								<image v-if="avatar" :src="avatar" mode="aspectFill" />
+								<image v-else src="https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132" mode="aspectFill" />
+							</view>
+							<van-button type="primary" plain>点击修改</van-button>
+						</view>
+					</van-cell>
+				  <van-field required type="nickname" name="nickname" :value="nick_name" placeholder="请输入呢称" :border="false" label="呢称" clearable @change="(e) => onFieldChange('nick_name', e)" />
+				  <van-field :value="company_name" placeholder="请输入公司" :border="false" label="公司" clearable  @change="(e) => onFieldChange('company_name', e)" />
+				  <van-field :value="title" placeholder="请输入职业" :border="false" label="职业" clearable @change="(e) => onFieldChange('title', e)" />
+				</van-cell-group>
+				<view class="user-info-submit">
+					<van-button type="primary" form-type="submit" :loading="saveLoading" size="large">保存</van-button>
+				</view>
+			</form>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCellGroup from '@/wxcomponents/vant/cell-group/index'
+	import VanCell from '@/wxcomponents/vant/cell/index'
+	import VanField from '@/wxcomponents/vant/field/index'
+	import { updateInfo, uploadFile } from '@/api/user'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UScrollView,
+			VanCellGroup,
+			VanCell,
+			VanField
+		},
+		computed: {
+		},
+		data() {
+			return {
+				redirectUrl: '',
+				avatar: '',
+				nick_name: '',
+				title: '',
+				company_name: '',
+				saveLoading: false
+			}
+		},
+		onLoad(options) {
+			console.log(options)
+			if (options.avatar) {
+				this.avatar = decodeURIComponent(options.avatar)
+			} else {
+				this.avatar = ''
+			}
+			if (options.redirect) {
+				this.redirectUrl = decodeURIComponent(options.redirect)
+			} else {
+				this.redirectUrl = ''
+			}
+		},
+		created() {
+			this.checkAuth('/pages/user/info-edit')
+		},
+		onShow() {
+			this.$store.dispatch('getInfo').then(res => {
+				this.nick_name = res.data.nick_name
+				this.company_name = res.data.company_name
+				this.title = res.data.title
+				if (!this.avatar) {
+					this.avatar = res.data.avatar
+				}
+			})
+		}, 
+		methods: {
+			onChooseAvatar(e) {
+				this.avatar = e.detail.avatarUrl
+			},
+			onSubmit(e) {
+				this.saveLoading = true
+				if (this.avatar.indexOf('http://tmp') === 0) {
+					uploadFile({
+						filePath: this.avatar,
+					}).then(res => {
+						console.log("上传微信头像:", res)
+						if (res.data) {
+							this.avatar = res.data.url
+							this.doUpdateInfo()
+						}
+					}).then(error => {
+						this.saveLoading = false
+					})
+				} else {
+					this.doUpdateInfo()
+				}
+			},
+			onFieldChange(field, value) {
+				this[field] = value
+			},
+			doUpdateInfo() {
+				if (!this.nick_name) {
+					this.showToast('请填写呢称')
+					return
+				}
+				updateInfo({
+					avatar: this.avatar,
+					nick_name: this.nick_name,
+					title: this.title,
+					company_name: this.company_name
+				}).then(() => {
+					this.$store.dispatch('getInfo')
+					this.saveLoading = false
+					this.showSuccessToast('保存成功', () => {
+						if (this.redirectUrl) {
+							this.redirectTo(this.redirectUrl)
+						} else {
+							const pages = getCurrentPages()
+							if (pages.length > 1) {
+								const parentPagePath = pages[pages.length - 2].$page.fullPath
+								if (parentPagePath === '/pages/user/info') {
+									uni.navigateBack()
+									return
+								}
+							}
+							this.redirectTo('/pages/user/index')
+						}
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.user-info-edit{
+		.right-icon{
+			position: relative;
+			.btn-choose{
+				position: absolute;
+				background-color: transparent;
+				width: 100%;
+				height: 100%;
+				top: 0;
+				left: 0;
+				z-index: 2;
+			}
+		}
+		.user-info-submit{
+			width: 400rpx;
+			margin: 60rpx auto 0 auto;
+		}
+		.van-cell__title{
+			max-width: 180rpx!important;
+			min-width: 180rpx!important;
+			margin-right: 24rpx!important;
+		}
+		.user-avatar-cell{
+			.van-cell__title{
+				flex: unset;
+			}
+			.right-icon{
+				display: flex;
+				justify-content: space-between;
+				flex: 1;
+			}
+		}
+		.user-avator{
+			@include display-flex-center;
+			width: 111rpx;
+			height: 111rpx;
+			border-radius: 50%;
+			overflow: hidden;
+			margin-right: 13rpx;
+			.icon{
+				color: #ffffff;
+				opacity: 0.67;
+				font-size: 70rpx;
+			}
+		}
+	}
+</style>

+ 89 - 0
pages/user/info.vue

@@ -0,0 +1,89 @@
+<template>
+	<view class="user-info">
+		<nav-bar title="个人信息" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<van-cell-group>
+				<van-cell title="头像" class="van-cell--clickable" @click="navigateTo('/pages/user/info-edit')">
+					<view class="right-icon" slot="right-icon">
+						<view class="user-avator">
+							<image v-if="user.avatar" :src="user.avatar" mode="aspectFill" />
+							<image v-else src="https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132" mode="aspectFill" />
+						</view>
+						<van-icon
+						  name="arrow"
+						  class="van-cell__right-icon-wrap right-icon-class"
+						  custom-class="van-cell__right-icon"
+						/>
+					</view>
+				</van-cell>	
+				<van-cell title="呢称" is-link :value="user.nick_name || '微信呢称'" @click="navigateTo('/pages/user/info-edit')">
+				</van-cell>
+				<van-cell title="公司" is-link :value="user.company_name || '点击设置'" @click="navigateTo('/pages/user/info-edit')">
+				</van-cell>
+				<van-cell title="职业" is-link :value="user.title || '点击设置'" @click="navigateTo('/pages/user/info-edit')">
+				</van-cell>
+			</van-cell-group>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCellGroup from '@/wxcomponents/vant/cell-group/index'
+	import VanCell from '@/wxcomponents/vant/cell/index'
+	import VanActionSheet from '@/wxcomponents/vant/action-sheet/index'
+	import { updateInfo } from '../../api/user'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UScrollView,
+			VanCell,
+			VanCellGroup,
+			VanActionSheet
+		},
+		computed: {
+			user() {
+				return this.$store.getters.user || {}
+			}
+		},
+		data() {
+			return {}
+		},
+		created() {
+			this.checkAuth('/pages/user/info')
+		},
+		onShow() {
+		}, 
+		methods: {
+			onChooseAvatar(e) {
+				this.navigateTo('/pages/user/info-edit?avatar=' + e.detail.avatarUrl)
+			},
+			onCellClick() {
+				this.navigateTo('/pages/user/setting-edit')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.user-info{
+		.user-avator{
+			@include display-flex-center;
+			width: 111rpx;
+			height: 111rpx;
+			border-radius: 50%;
+			overflow: hidden;
+			margin-right: 13rpx;
+			.icon{
+				color: #ffffff;
+				opacity: 0.67;
+				font-size: 70rpx;
+			}
+		}
+	}
+</style>

+ 72 - 0
pages/user/like.vue

@@ -0,0 +1,72 @@
+<template>
+	<view class="user-like">
+		<nav-bar title="我的点赞" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<view class="user-like-tabs">
+				<u-tabs :active.sync="tabActive" :tabs="tabs" @change="tabChange"/>
+			</view>
+			<view class="main-container">
+				<view class="user-like-list">
+					<template v-for="(item, index) in likeList">
+						<template v-if="tabActive === 'exhibitor'">
+							<exhibitor-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+						<template v-else>
+							<exhibit-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+					</template>
+				</view>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UTabs from '@/components/common/u-tabs'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import ExhibitItem from '@/pages/exhibitor/components/exhibit-item.vue'
+	import ExhibitorItem from '@/pages/exhibitor/components/exhibitor-item.vue'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UTabs,
+			UScrollView,
+			ExhibitItem,
+			ExhibitorItem
+		},
+		computed: {
+		},
+		data() {
+			return {
+				tabActive: 'exhibitor',
+				tabs: [{
+					label: '展商',
+					value: 'exhibitor'
+				}, {
+					label: '展品',
+					value: 'exhibit'
+				}],
+				likeList: [{}, {}, {}, {}, {}, {}],
+			}
+		},
+		created() {
+			this.checkAuth('/pages/user/like')
+		},
+		onShow() {
+		}, 
+		methods: {
+			tabChange() {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/static/style/pages/user-like.scss";
+</style>

+ 372 - 0
pages/user/login.vue

@@ -0,0 +1,372 @@
+<template>
+	<view class="user-login">
+		<nav-bar :transparent="true" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<view class="main-container">
+				<view class="user-login-box">
+					<view class="user-login-logo">
+						<image src="/static/logo.jpg" mode="aspectFill" />
+					</view>
+					<view class="user-login-button">
+						<van-button type="primary" size="large" :open-type="protocolChecked?'getPhoneNumber': ''" @getphonenumber="onPhoneLogin" @click="onPhoneLoginClick">手机号快捷登录</van-button>
+						<van-button type="default" size="large" @click="onPhoneLoginOther">其它手机号登录</van-button>
+					</view>
+					<view class="user-login-protocol" :class="{ 'protocol-shake': protocolShake }">
+						<van-checkbox :value="protocolChecked" shape="square" @change="onCheckChange">
+							<view class="user-login-protocol-text">
+								<text>我已仔细阅读主办方的</text>
+								<text class="link-text" @click="navigateTo('https://www.productronicachina.com.cn/%E9%9A%90%E7%A7%81%E6%9D%A1%E6%AC%BE')">《隐私政策》</text>
+								<text>和</text>
+								<text class="link-text" @click="navigateTo('https://www.productronicachina.com.cn/%E6%B3%95%E5%BE%8B%E4%BF%A1%E6%81%AF')">《法律条款》</text>
+								<text>的全部内容并同意尊守</text>
+							</view>
+						</van-checkbox>
+					</view>
+				</view>
+			</view>
+			<van-overlay :show="showPhoneLogin" @click="onClickPhoneLoginOverlay">
+			  <view class="user-phone-login-wrapper">
+					<view class="user-phone-login" @click.stop>
+					  <view>获取手机号</view>
+						<view class="input-phone-number">
+							 <input v-model="phoneNumber" placeholder="请输入手机号" type="number" />
+							 <view v-if="phoneNumber" class="clear" @click="onClearPhoneNumber" ><van-icon name="clear" /></view>
+						</view>
+						<view class="input-check-code">
+							 <input v-model="validCode" placeholder="请输入短信验证码" type="number" maxlength="6"/>
+							 <view v-if="validCode" class="clear" @click="onClearCheckCode" ><van-icon name="clear" /></view>
+							 <van-button type="primary" :loading="validCodeLoading" :disabled="countDown > 0" @click="onSendValidCode">
+								<template v-if="countDown === 0">
+									发送验证码
+								</template>
+								<template v-else>
+									重新发送({{ countDown }}s)
+								</template>
+							 </van-button>
+						</view>
+						<view class="user-phone-login-protocol" :class="{ 'protocol-shake': protocolShake }">
+							<van-checkbox :value="protocolChecked" shape="square" @change="onCheckChange">	
+								<view class="user-login-protocol-text">
+									<text>我已仔细阅读主办方的</text>
+									<text class="link-text" @click="navigateTo('https://www.productronicachina.com.cn/%E9%9A%90%E7%A7%81%E6%9D%A1%E6%AC%BE')">《隐私政策》</text>
+									<text>和</text>
+									<text class="link-text" @click="navigateTo('https://www.productronicachina.com.cn/%E6%B3%95%E5%BE%8B%E4%BF%A1%E6%81%AF')">《法律条款》</text>
+									<text>的全部内容并同意尊守</text>
+								</view>
+							</van-checkbox>
+						</view>
+						<view class="submit">
+							<van-button type="primary" :loading="loginLoading" size="large" @click="onPhoneSubmit">提交</van-button>
+						</view>
+					</view>
+				</view>
+			</van-overlay>
+			<van-dialog 
+				:show.sync="showGetProfile" 
+				title="登录成功"
+				message="设置您的的头像和呢称?" 
+				show-cancel-button
+				confirm-button-open-type="chooseAvatar"
+				@chooseavatar="onConfirmGetProfile" 
+				@cancel="onCancelGetProfile"
+			>
+			</van-dialog>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import { login, wechatLogin, getInfo, updateInfo, phoneLogin, getSmsCode } from '@/api/user'
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCheckbox from '@/wxcomponents/vant/checkbox/index'
+	import VanOverlay from '@/wxcomponents/vant/overlay/index'
+	import VanDialog from '@/wxcomponents/vant/dialog/index'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			VanCheckbox,
+			VanOverlay,
+			UScrollView,
+			VanDialog
+		},
+		data() {
+			return {
+				showGetProfile: false,
+				protocolChecked: false,
+				protocolShake: false,
+				showPhoneLogin: false,
+				phoneNumber: '',
+				validCode: '',
+				validCodeLoading: false,
+				redirectUrl: '',
+				uesrId: 0,
+				countDown: 0,
+				countDownTimer: null,
+				loginLoading: false
+			}
+		},
+		onLoad(options) {
+			if (options.redirect) {
+				this.redirectUrl = decodeURIComponent(options.redirect)
+			} else {
+				this.redirectUrl = ''
+			}
+		},
+		created() {
+			const openId = uni.getStorageSync('openId')
+			uni.login({
+				provider: 'weixin',
+				success: res => {
+					wechatLogin({
+						code: res.code
+					}).then(res => {
+						uni.setStorageSync('openId', res.data)
+					})
+				}
+			})
+		},
+		methods: {
+			onSendValidCode() {
+				this.phoneNumber = this.phoneNumber.trim()
+				if (!this.checkProtocol()) {
+					return
+				}
+				if (!this.phoneNumber) {
+					this.showToast('请填写手机号')
+					return
+				}
+				this.validCodeLoading = true
+				getSmsCode({
+					phone: this.phoneNumber
+				}).then(res => {
+					this.validCodeLoading = false
+					this.showToast('短信已发送')
+					this.countDown = 60
+					this.countDownTimer = setInterval(() => {
+						this.countDown--
+						if (this.countDown === 0) {
+							clearInterval(this.countDownTimer)
+							this.countDownTimer = null
+						}
+					}, 1000)
+				})
+			},
+			checkProtocol() {
+				if (!this.protocolChecked) {
+					this.showToast('请查看协议并同意')
+					this.protocolShake = true
+					setTimeout(() => {
+						this.protocolShake = false
+					}, 500)
+				}
+				return this.protocolChecked
+			},
+			onCancelGetProfile() {
+				this.redirectTo(this.redirectUrl || '/pages/user/index')
+			},
+			onConfirmGetProfile(e) {
+				let pagePath = '/pages/user/info-edit?avatar=' + encodeURIComponent(e.avatarUrl)
+				if (this.redirectUrl) {
+					pagePath += '&redirect=' + encodeURIComponent(this.redirectUrl)
+				}
+				this.redirectTo(pagePath)
+			},
+			onCheckChange(checked) {
+				this.protocolChecked = checked
+			},
+			onClickPhoneLoginOverlay() {
+				this.showPhoneLogin = false
+			},
+			onClearPhoneNumber() {
+				this.phoneNumber = ''
+			},
+			onClearCheckCode() {
+				this.checkCode = ''
+			},
+			onPhoneLoginClick() {
+				this.checkProtocol()
+			},
+			onPhoneLogin(e) {
+				const openId = uni.getStorageSync('openId')
+				if (e.detail.code) {
+					login({
+						open_id: openId,
+						code: e.detail.code,
+						encrypted_data: e.detail.encryptedData,
+						iv: e.detail.iv
+					}).then(res => {
+						if (res.data) {
+							this.$store.commit('SET_TOKEN', res.data)
+							this.$store.dispatch('getInfo').then(res => {
+								const user = res.data
+								if (!user.nick_name || !user.avatar) {
+									this.showGetProfile = true
+								} else {
+									this.redirectTo(this.redirectUrl || '/pages/user/index')
+								}
+							})
+						} else {
+							this.showToast('微信服务器忙线中,稍候再试')
+						}
+					})
+				}
+			},
+			onPhoneLoginOther() {
+				this.showPhoneLogin = true
+			},
+			onPhoneSubmit() {
+				const openId = uni.getStorageSync('openId')
+				if (!this.checkProtocol()) {
+					return
+				}
+				this.phoneNumber = this.phoneNumber.trim()
+				this.validCode = this.validCode.trim()
+				if (!this.phoneNumber) {
+					this.showToast('请填写手机号')
+					return
+				}
+				if (!this.validCode) {
+					this.showToast('请填写验证码')
+					return
+				}
+				this.loginLoading = true
+				phoneLogin({
+					phone: this.phoneNumber,
+					valid_code: this.validCode,
+					open_id: openId
+				}).then(res => {
+					console.log("手机验证码登录:", res)
+					this.loginLoading = false
+					if (res.data) {
+						this.$store.commit('SET_TOKEN', res.data)
+						this.$store.dispatch('getInfo').then(res => {
+							const user = res.data
+							if (!user.nick_name || !user.avatar) {
+								this.showGetProfile = true
+							} else {
+								this.redirectTo(this.redirectUrl || '/pages/user/index')
+							}
+						})
+						this.showPhoneLogin = false
+					} else {
+						this.showToast('微信服务器忙线中,稍候再试')
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+.user-login{
+	.main-container{
+		@include display-flex-center;
+		flex-direction: column;
+		height: 100%;
+	}
+	.user-login-box{
+		width: 565rpx;
+	}
+	.user-login-logo{
+		width: 377rpx;
+		height: 93rpx;
+		margin: 0 auto;
+	}
+	.user-login-button{
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-row-gap: 22rpx;
+		margin-top: 254rpx;
+	}
+	.user-login-protocol-text{
+		margin-top: 39rpx;
+		font-size: $fontSize1;
+		color: #555555;
+		line-height: 30rpx;
+	}
+	.user-phone-login-wrapper{
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		height: 100%;
+	}
+	.user-phone-login{
+		width: 670rpx;
+		padding: 51rpx 59rpx 96rpx 59rpx;
+		background-color: #ffffff;
+		border-radius: 10rpx;
+		&>view:first-child{
+			font-size: $fontSize2;
+			color: #333333;
+			text-align: center;
+		}
+		.input-phone-number{
+			margin-top: 54rpx;
+			border-bottom: 1rpx solid #D9D9D9;
+			padding-bottom: 31rpx;
+			height: 60rpx;
+		}
+		.input-phone-number,.input-check-code{
+			position: relative;
+			font-size: $fontSize2;
+			.clear{
+				position: absolute;
+				right: 10rpx;
+				top: 10rpx;
+				z-index: 1;
+			}
+			.van-icon {
+				color: #555555;
+			}
+		}
+		.input-check-code{
+			display: flex;
+			align-items: center;
+			margin-top: 44rpx;
+			.van-button{
+				width: 205rpx;
+				height: 80rpx;
+				border-radius: 50rpx;
+			}
+			.clear{
+				top: 26rpx;
+				right: 250rpx;
+			}
+			input{
+				flex: 1;
+			}
+			padding-bottom: 0;
+		}
+		.submit{
+			margin-top: 50rpx;
+		}
+	}
+	/* 定义振动动画 */
+	@keyframes shake {
+	  0% {
+	    transform: translateX(0);
+	  }
+	  25% {
+	    transform: translateX(-10rpx);
+	  }
+	  50% {
+	    transform: translateX(10rpx);
+	  }
+	  75% {
+	    transform: translateX(-10rpx);
+	  }
+	  100% {
+	    transform: translateX(0);
+	  }
+	}
+	.protocol-shake {
+	  display: inline-block; 
+	  animation: shake 0.3s ease-in-out infinite;
+	}
+}
+</style>

+ 64 - 0
pages/user/setting.vue

@@ -0,0 +1,64 @@
+<template>
+	<view class="user-setting">
+		<nav-bar title="设置" @init="onInitNavbar"></nav-bar>
+		<van-cell-group>
+			<van-cell title="个人信息" is-link @click="navigateTo('/pages/user/info')">
+			</van-cell>
+			<van-cell class="user-logout" title="退出登录" is-link @click="onLogout">
+			</van-cell>
+		</van-cell-group>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import VanCellGroup from '@/wxcomponents/vant/cell-group/index'
+	import VanCell from '@/wxcomponents/vant/cell/index'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UScrollView,
+			VanCellGroup,
+			VanCell
+		},
+		computed: {
+		},
+		data() {
+			return {}
+		},
+		created() {
+			this.checkAuth('/pages/user/setting')
+		},
+		onShow() {}, 
+		methods: {
+			onLogout() {
+				// this.$store.dispatch('logout').then(() => {
+				// 	uni.navigateTo({
+				// 		url: '/pages/user/login'
+				// 	})
+				// })
+				this.$store.dispatch('logout').then(() => {
+					this.redirectTo('/pages/user/login')
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.user-setting{
+		.user-logout{
+			.van-cell__title{
+				@include display-flex-center;
+			}
+			.van-icon{
+				display: none;
+			}
+		}
+	}
+</style>

+ 71 - 0
pages/user/vote.vue

@@ -0,0 +1,71 @@
+<template>
+	<view class="user-vote user-like">
+		<nav-bar title="我的投票" @init="onInitNavbar"></nav-bar>
+		<u-scroll-view>
+			<view class="user-vote-tabs user-like-tabs">
+				<u-tabs :active.sync="tabActive" :tabs="tabs" @change="tabChange" />
+			</view>
+			<view class="main-container">
+				<view class="user-vote-list user-like-list">
+					<template v-for="(item, index) in favoritesList">
+						<template v-if="tabActive === 'exhibitor'">
+							<exhibitor-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+						<template v-else-if="tabActive === 'exhibit'">
+							<exhibit-item :item="item" :footer-hidden="true" :key="index" />
+						</template>
+					</template>
+				</view>
+			</view>
+		</u-scroll-view>
+	</view>
+</template>
+
+<script>
+	import NavBar from '@/components/layout/nav-bar'
+	import UTabs from '@/components/common/u-tabs'
+	import UScrollView from '@/components/common/u-scroll-view'
+	import ExhibitItem from '@/pages/exhibitor/components/exhibit-item.vue'
+	import ExhibitorItem from '@/pages/exhibitor/components/exhibitor-item.vue'
+	
+	export default {
+		options: {
+			styleIsolation: 'shared'
+		},
+		components: {
+			NavBar,
+			UTabs,
+			ExhibitItem,
+			ExhibitorItem
+		},
+		computed: {
+		},
+		data() {
+			return {
+				tabActive: 'exhibitor',
+				tabs: [{
+					label: '展商',
+					value: 'exhibitor'
+				}, {
+					label: '展品',
+					value: 'exhibit'
+				}],
+				favoritesList: [{}, {}, {}, {}, {}, {}],
+			}
+		},
+		created() {
+			this.checkAuth('/pages/user/vote')
+		},
+		onShow() {
+		}, 
+		methods: {
+			tabChange() {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/static/style/pages/user-like.scss";
+</style>

BIN
static/font/Poppins-Regular.ttf


BIN
static/font/Poppins-SemiBold.ttf


+ 0 - 539
static/font/demo.css

@@ -1,539 +0,0 @@
-/* Logo 字体 */
-@font-face {
-  font-family: "iconfont logo";
-  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
-  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
-    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
-    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
-    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
-}
-
-.logo {
-  font-family: "iconfont logo";
-  font-size: 160px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-/* tabs */
-.nav-tabs {
-  position: relative;
-}
-
-.nav-tabs .nav-more {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  height: 42px;
-  line-height: 42px;
-  color: #666;
-}
-
-#tabs {
-  border-bottom: 1px solid #eee;
-}
-
-#tabs li {
-  cursor: pointer;
-  width: 100px;
-  height: 40px;
-  line-height: 40px;
-  text-align: center;
-  font-size: 16px;
-  border-bottom: 2px solid transparent;
-  position: relative;
-  z-index: 1;
-  margin-bottom: -1px;
-  color: #666;
-}
-
-
-#tabs .active {
-  border-bottom-color: #f00;
-  color: #222;
-}
-
-.tab-container .content {
-  display: none;
-}
-
-/* 页面布局 */
-.main {
-  padding: 30px 100px;
-  width: 960px;
-  margin: 0 auto;
-}
-
-.main .logo {
-  color: #333;
-  text-align: left;
-  margin-bottom: 30px;
-  line-height: 1;
-  height: 110px;
-  margin-top: -50px;
-  overflow: hidden;
-  *zoom: 1;
-}
-
-.main .logo a {
-  font-size: 160px;
-  color: #333;
-}
-
-.helps {
-  margin-top: 40px;
-}
-
-.helps pre {
-  padding: 20px;
-  margin: 10px 0;
-  border: solid 1px #e7e1cd;
-  background-color: #fffdef;
-  overflow: auto;
-}
-
-.icon_lists {
-  width: 100% !important;
-  overflow: hidden;
-  *zoom: 1;
-}
-
-.icon_lists li {
-  width: 100px;
-  margin-bottom: 10px;
-  margin-right: 20px;
-  text-align: center;
-  list-style: none !important;
-  cursor: default;
-}
-
-.icon_lists li .code-name {
-  line-height: 1.2;
-}
-
-.icon_lists .icon {
-  display: block;
-  height: 100px;
-  line-height: 100px;
-  font-size: 42px;
-  margin: 10px auto;
-  color: #333;
-  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
-  -moz-transition: font-size 0.25s linear, width 0.25s linear;
-  transition: font-size 0.25s linear, width 0.25s linear;
-}
-
-.icon_lists .icon:hover {
-  font-size: 100px;
-}
-
-.icon_lists .svg-icon {
-  /* 通过设置 font-size 来改变图标大小 */
-  width: 1em;
-  /* 图标和文字相邻时,垂直对齐 */
-  vertical-align: -0.15em;
-  /* 通过设置 color 来改变 SVG 的颜色/fill */
-  fill: currentColor;
-  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
-      normalize.css 中也包含这行 */
-  overflow: hidden;
-}
-
-.icon_lists li .name,
-.icon_lists li .code-name {
-  color: #666;
-}
-
-/* markdown 样式 */
-.markdown {
-  color: #666;
-  font-size: 14px;
-  line-height: 1.8;
-}
-
-.highlight {
-  line-height: 1.5;
-}
-
-.markdown img {
-  vertical-align: middle;
-  max-width: 100%;
-}
-
-.markdown h1 {
-  color: #404040;
-  font-weight: 500;
-  line-height: 40px;
-  margin-bottom: 24px;
-}
-
-.markdown h2,
-.markdown h3,
-.markdown h4,
-.markdown h5,
-.markdown h6 {
-  color: #404040;
-  margin: 1.6em 0 0.6em 0;
-  font-weight: 500;
-  clear: both;
-}
-
-.markdown h1 {
-  font-size: 28px;
-}
-
-.markdown h2 {
-  font-size: 22px;
-}
-
-.markdown h3 {
-  font-size: 16px;
-}
-
-.markdown h4 {
-  font-size: 14px;
-}
-
-.markdown h5 {
-  font-size: 12px;
-}
-
-.markdown h6 {
-  font-size: 12px;
-}
-
-.markdown hr {
-  height: 1px;
-  border: 0;
-  background: #e9e9e9;
-  margin: 16px 0;
-  clear: both;
-}
-
-.markdown p {
-  margin: 1em 0;
-}
-
-.markdown>p,
-.markdown>blockquote,
-.markdown>.highlight,
-.markdown>ol,
-.markdown>ul {
-  width: 80%;
-}
-
-.markdown ul>li {
-  list-style: circle;
-}
-
-.markdown>ul li,
-.markdown blockquote ul>li {
-  margin-left: 20px;
-  padding-left: 4px;
-}
-
-.markdown>ul li p,
-.markdown>ol li p {
-  margin: 0.6em 0;
-}
-
-.markdown ol>li {
-  list-style: decimal;
-}
-
-.markdown>ol li,
-.markdown blockquote ol>li {
-  margin-left: 20px;
-  padding-left: 4px;
-}
-
-.markdown code {
-  margin: 0 3px;
-  padding: 0 5px;
-  background: #eee;
-  border-radius: 3px;
-}
-
-.markdown strong,
-.markdown b {
-  font-weight: 600;
-}
-
-.markdown>table {
-  border-collapse: collapse;
-  border-spacing: 0px;
-  empty-cells: show;
-  border: 1px solid #e9e9e9;
-  width: 95%;
-  margin-bottom: 24px;
-}
-
-.markdown>table th {
-  white-space: nowrap;
-  color: #333;
-  font-weight: 600;
-}
-
-.markdown>table th,
-.markdown>table td {
-  border: 1px solid #e9e9e9;
-  padding: 8px 16px;
-  text-align: left;
-}
-
-.markdown>table th {
-  background: #F7F7F7;
-}
-
-.markdown blockquote {
-  font-size: 90%;
-  color: #999;
-  border-left: 4px solid #e9e9e9;
-  padding-left: 0.8em;
-  margin: 1em 0;
-}
-
-.markdown blockquote p {
-  margin: 0;
-}
-
-.markdown .anchor {
-  opacity: 0;
-  transition: opacity 0.3s ease;
-  margin-left: 8px;
-}
-
-.markdown .waiting {
-  color: #ccc;
-}
-
-.markdown h1:hover .anchor,
-.markdown h2:hover .anchor,
-.markdown h3:hover .anchor,
-.markdown h4:hover .anchor,
-.markdown h5:hover .anchor,
-.markdown h6:hover .anchor {
-  opacity: 1;
-  display: inline-block;
-}
-
-.markdown>br,
-.markdown>p>br {
-  clear: both;
-}
-
-
-.hljs {
-  display: block;
-  background: white;
-  padding: 0.5em;
-  color: #333333;
-  overflow-x: auto;
-}
-
-.hljs-comment,
-.hljs-meta {
-  color: #969896;
-}
-
-.hljs-string,
-.hljs-variable,
-.hljs-template-variable,
-.hljs-strong,
-.hljs-emphasis,
-.hljs-quote {
-  color: #df5000;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-type {
-  color: #a71d5d;
-}
-
-.hljs-literal,
-.hljs-symbol,
-.hljs-bullet,
-.hljs-attribute {
-  color: #0086b3;
-}
-
-.hljs-section,
-.hljs-name {
-  color: #63a35c;
-}
-
-.hljs-tag {
-  color: #333333;
-}
-
-.hljs-title,
-.hljs-attr,
-.hljs-selector-id,
-.hljs-selector-class,
-.hljs-selector-attr,
-.hljs-selector-pseudo {
-  color: #795da3;
-}
-
-.hljs-addition {
-  color: #55a532;
-  background-color: #eaffea;
-}
-
-.hljs-deletion {
-  color: #bd2c00;
-  background-color: #ffecec;
-}
-
-.hljs-link {
-  text-decoration: underline;
-}
-
-/* 代码高亮 */
-/* PrismJS 1.15.0
-https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
-/**
- * prism.js default theme for JavaScript, CSS and HTML
- * Based on dabblet (http://dabblet.com)
- * @author Lea Verou
- */
-code[class*="language-"],
-pre[class*="language-"] {
-  color: black;
-  background: none;
-  text-shadow: 0 1px white;
-  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
-  text-align: left;
-  white-space: pre;
-  word-spacing: normal;
-  word-break: normal;
-  word-wrap: normal;
-  line-height: 1.5;
-
-  -moz-tab-size: 4;
-  -o-tab-size: 4;
-  tab-size: 4;
-
-  -webkit-hyphens: none;
-  -moz-hyphens: none;
-  -ms-hyphens: none;
-  hyphens: none;
-}
-
-pre[class*="language-"]::-moz-selection,
-pre[class*="language-"] ::-moz-selection,
-code[class*="language-"]::-moz-selection,
-code[class*="language-"] ::-moz-selection {
-  text-shadow: none;
-  background: #b3d4fc;
-}
-
-pre[class*="language-"]::selection,
-pre[class*="language-"] ::selection,
-code[class*="language-"]::selection,
-code[class*="language-"] ::selection {
-  text-shadow: none;
-  background: #b3d4fc;
-}
-
-@media print {
-
-  code[class*="language-"],
-  pre[class*="language-"] {
-    text-shadow: none;
-  }
-}
-
-/* Code blocks */
-pre[class*="language-"] {
-  padding: 1em;
-  margin: .5em 0;
-  overflow: auto;
-}
-
-:not(pre)>code[class*="language-"],
-pre[class*="language-"] {
-  background: #f5f2f0;
-}
-
-/* Inline code */
-:not(pre)>code[class*="language-"] {
-  padding: .1em;
-  border-radius: .3em;
-  white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
-  color: slategray;
-}
-
-.token.punctuation {
-  color: #999;
-}
-
-.namespace {
-  opacity: .7;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol,
-.token.deleted {
-  color: #905;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
-  color: #690;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
-  color: #9a6e3a;
-  background: hsla(0, 0%, 100%, .5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword {
-  color: #07a;
-}
-
-.token.function,
-.token.class-name {
-  color: #DD4A68;
-}
-
-.token.regex,
-.token.important,
-.token.variable {
-  color: #e90;
-}
-
-.token.important,
-.token.bold {
-  font-weight: bold;
-}
-
-.token.italic {
-  font-style: italic;
-}
-
-.token.entity {
-  cursor: help;
-}

File diff suppressed because it is too large
+ 0 - 5824
static/font/demo_index.html


+ 19 - 5
static/font/iconfont.css

@@ -2,10 +2,10 @@
   font-family: "iconfont"; /* Project id 4563472 */
   src: url('~@/static/font/iconfont.woff2') format('woff2'),
        url('~@/static/font/iconfont.woff') format('woff'),
-       url('~@/static/font/iconfont.ttf') format('truetype'),
-       url('~@/static/font/iconfont.svg') format('svg');
+       url('~@/static/font/iconfont.ttf') format('truetype')
 }
 
+
 .iconfont {
   font-family: "iconfont" !important;
   font-size: 16px;
@@ -14,6 +14,22 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-Ticket1:before {
+  content: "\e696";
+}
+
+.icon-aixin:before {
+  content: "\e66a";
+}
+
+.icon-playcircle:before {
+  content: "\e80f";
+}
+
+.icon-setting:before {
+  content: "\e886";
+}
+
 .icon-favourites-filled-star-symbol:before {
   content: "\e669";
 }
@@ -992,6 +1008,4 @@
 
 .icon-oe-a:before {
   content: "\e802";
-}
-
-
+}

File diff suppressed because it is too large
+ 1 - 1
static/font/iconfont.js


+ 28 - 0
static/font/iconfont.json

@@ -6,6 +6,34 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "30056873",
+      "name": "Ticket",
+      "font_class": "Ticket1",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "8727224",
+      "name": "爱心",
+      "font_class": "aixin",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "6151262",
+      "name": "play circle",
+      "font_class": "playcircle",
+      "unicode": "e80f",
+      "unicode_decimal": 59407
+    },
+    {
+      "icon_id": "18991735",
+      "name": "setting",
+      "font_class": "setting",
+      "unicode": "e886",
+      "unicode_decimal": 59526
+    },
+    {
       "icon_id": "8945265",
       "name": "favourites-filled-star-symbol",
       "font_class": "favourites-filled-star-symbol",

File diff suppressed because it is too large
+ 8 - 0
static/font/iconfont.svg


BIN
static/font/iconfont.ttf


BIN
static/font/iconfont.woff


BIN
static/font/iconfont.woff2


BIN
static/img/example/ad_690x90.png


BIN
static/img/example/album/1.jpeg


BIN
static/img/example/album/2.jpeg


BIN
static/img/example/album/3.jpeg


BIN
static/img/example/album/4.jpeg


BIN
static/img/example/album/5.jpeg


BIN
static/img/example/album/6.jpeg


BIN
static/img/example/banner.png


File diff suppressed because it is too large
+ 0 - 1
static/img/example/icon/car_line.svg


+ 0 - 29
static/img/example/icon/event.svg

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#ffffff;}
-</style>
-<g>
-	<path class="st0" d="M739.92,110.02l-13.44,11.2c-3.8,3.18-9.32,3.23-13.18,0.1l-51.56-41.25c-26.67-21.3-64.48-21.3-91.15,0
-		l-52.08,41.72c-3.8,3.02-9.22,3.02-13.02,0l-52.08-41.72c-26.67-21.3-64.48-21.3-91.15,0l-51.56,41.25
-		c-3.85,3.13-9.38,3.07-13.18-0.1l-13.44-11.2c-54.27-45.26-136.67-6.67-136.67,64.01v675.94c0,70.68,82.4,109.27,136.67,64.01
-		l13.44-11.2c3.8-3.18,9.32-3.23,13.18-0.1l51.56,41.25c26.67,21.3,64.48,21.3,91.15,0l52.08-41.72c3.8-3.02,9.22-3.02,13.02,0
-		l52.08,41.72c26.67,21.3,64.48,21.3,91.15,0l51.56-41.25c3.85-3.13,9.38-3.07,13.18,0.1l13.44,11.2
-		c54.27,45.26,136.67,6.67,136.67-64.01V174.03C876.58,103.35,794.19,64.76,739.92,110.02z M814.08,849.97
-		c0,17.66-20.62,27.29-34.17,15.99l-13.44-11.2c-26.62-22.19-65.16-22.55-92.24-0.89l-51.56,41.25c-3.8,3.02-9.22,3.02-13.02,0
-		l-52.08-41.72c-26.67-21.3-64.48-21.3-91.15,0l-52.08,41.72c-3.8,3.02-9.22,3.02-13.02,0l-51.56-41.25
-		c-27.08-21.67-65.63-21.3-92.24,0.89l-13.44,11.2c-13.54,11.3-34.17,1.67-34.17-15.99V174.03c0-17.66,20.62-27.29,34.17-15.99
-		l13.44,11.2c26.61,22.19,65.16,22.55,92.24,0.89l51.56-41.25c3.8-3.02,9.22-3.02,13.02,0l52.08,41.72
-		c26.67,21.3,64.48,21.3,91.15,0l52.08-41.72c3.8-3.02,9.22-3.02,13.02,0l51.56,41.25c27.08,21.67,65.63,21.3,92.24-0.89l13.44-11.2
-		c13.54-11.3,34.17-1.67,34.17,15.99V849.97z"/>
-	<path class="st0" d="M686.27,440l-99.43-24.84l-48.85-73.28c-5.78-8.7-15.52-13.91-25.99-13.91c-10.47,0-20.21,5.21-25.99,13.91
-		l-48.85,73.28L337.73,440c-10.89,2.76-19.53,11.15-22.5,21.98c-3.02,10.83,0.05,22.5,8.02,30.47l70.83,70.78l-23.49,93.96
-		c-2.87,11.46,0.94,23.59,9.9,31.25c8.96,7.71,21.51,9.74,32.4,5.21l99.11-41.3l99.11,41.3c10.89,4.53,23.44,2.5,32.4-5.21
-		c8.96-7.66,12.76-19.79,9.9-31.25l-23.49-93.96l70.83-70.78c7.97-7.97,11.04-19.64,8.02-30.47
-		C705.8,451.15,697.16,442.76,686.27,440z M573.25,531.56c-7.76,7.76-10.89,19.01-8.23,29.69l12.71,50.73l-53.7-22.34
-		c-7.71-3.23-16.36-3.23-24.06,0l-53.7,22.34l12.71-50.73c2.66-10.68-0.47-21.93-8.23-29.69l-44.27-44.32l57.55-14.38
-		c7.55-1.88,14.11-6.51,18.44-12.97L512,415.57l29.53,44.32c4.32,6.46,10.89,11.09,18.44,12.97l57.55,14.38L573.25,531.56z"/>
-</g>
-</svg>

+ 0 - 25
static/img/example/icon/house.svg

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#ffffff;}
-</style>
-<path class="st0" d="M953.92,328.06c-3.18-15-7.66-32.81-12.66-51.72c-10.05-37.92-22.81-81.25-33.54-116.82
-	c-17.19-56.82-69.69-94.95-128.54-94.95H243.97c-58.85,0-111.35,38.12-128.54,94.95c-10.73,35.57-23.49,78.91-33.54,116.82
-	c-5,18.91-9.48,36.72-12.66,51.72c-3.02,14.01-5.57,28.28-5.57,38.59c0,70.73,27.6,115.52,62.5,142.19v274.48
-	c0,97.81,79.27,177.08,177.08,177.08h135.19v-73.93h0.23V741.66c0-17.24,14.01-31.25,31.25-31.25h83.33
-	c17.24,0,31.25,14.01,31.25,31.25v144.82h0v73.93h135.42c97.81,0,177.08-79.27,177.08-177.08V509.16
-	c34.95-26.67,62.5-71.56,62.5-142.5C959.49,356.34,956.94,342.07,953.92,328.06z M834.49,783.32c0,63.28-51.3,114.58-114.58,114.58
-	h-72.92V741.66c0-51.77-41.98-93.75-93.75-93.75h-83.33c-51.77,0-93.75,41.98-93.75,93.75v156.25h-72.92
-	c-63.28,0-114.58-51.3-114.58-114.58v-244.9c12.81,3.18,23.39,4.43,29.69,4.95c4.06,0.31,8.07,0.52,12.19,0.62
-	c19.64,0.57,87.86-1.88,135.99-57.71c37.5,40.78,92.5,60.05,145.05,60.05s107.6-19.27,145.1-60.1
-	c48.07,55.78,116.35,58.33,136.15,57.81c4.22-0.16,8.33-0.37,12.55-0.68c6.25-0.52,16.62-1.72,29.12-4.79V783.32z M856.73,461.24
-	c-21.56,15.36-46.3,19.06-56.25,19.84c-3.12,0.21-6.2,0.36-9.32,0.47c-18.23,0.47-77.6-2.97-105.21-65.1
-	c-5-11.25-16.09-18.49-28.39-18.54c-12.34-0.05-23.49,7.14-28.59,18.33c-19.74,43.39-66.41,67.6-117.4,67.6s-97.66-24.22-117.4-67.6
-	c-5.1-11.2-16.25-18.39-28.59-18.33c-12.29,0.05-23.39,7.29-28.39,18.54c-27.71,62.29-86.98,65.62-104.9,65.1
-	c-3.02-0.1-5.99-0.26-9.01-0.47c-9.9-0.78-34.79-4.48-56.56-19.95c-19.9-14.11-40.57-40.36-40.57-94.48
-	c0-2.81,1.09-11.04,4.17-25.52c2.92-13.54,7.08-30.31,11.98-48.75c9.79-36.88,22.29-79.43,32.97-114.79
-	c9.06-30,36.88-50.52,68.7-50.52h535.21c31.82,0,59.64,20.52,68.7,50.52c10.68,35.37,23.18,77.92,32.97,114.79
-	c4.9,18.44,9.06,35.21,11.98,48.75c3.07,14.48,4.17,22.71,4.17,25.52C896.99,420.93,876.42,447.18,856.73,461.24z"/>
-</svg>

+ 0 - 17
static/img/example/icon/layers.svg

@@ -1,17 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1729242510996"
-	class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2977"
-	xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
-	<path
-		fill="#ffffff"
-		d="M106.88 317.76l400 184a41.6 41.6 0 0 0 17.6 3.84 39.68 39.68 0 0 0 16-3.2l375.36-160a40.96 40.96 0 0 0 25.28-36.8 41.6 41.6 0 0 0-22.72-38.72l-384-192a42.88 42.88 0 0 0-34.88 0L107.84 241.92a41.6 41.6 0 0 0 0 75.84z m408-160L800 301.44l-275.52 117.12-297.6-137.28z"
-		p-id="2978"></path>
-	<path
-	fill="#ffffff"
-		d="M883.52 490.56l-358.4 152-384-176.32a41.6 41.6 0 0 0-34.88 75.52l400 184a41.6 41.6 0 0 0 17.6 3.84 39.68 39.68 0 0 0 16-3.2l375.36-160a41.6 41.6 0 0 0-32-76.48z"
-		p-id="2979"></path>
-	<path
-		fill="#ffffff"
-		d="M883.52 714.56l-358.4 152-384-176.32a41.6 41.6 0 0 0-34.88 75.52l400 184a41.6 41.6 0 0 0 17.6 3.84 39.68 39.68 0 0 0 16-3.2l375.36-160a41.6 41.6 0 1 0-32-76.48z"
-		p-id="2980"></path>
-</svg>

File diff suppressed because it is too large
+ 0 - 9
static/img/example/icon/list.svg


+ 0 - 21
static/img/example/icon/news.svg

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#ffffff;}
-</style>
-<g>
-	<path class="st0" d="M907.83,522.42H772.42V199.4c0-74.84-60.68-135.31-135.42-135.31H199.5c-74.79,0-135.42,60.62-135.42,135.42
-		v583.33c0,97.81,79.27,177.08,177.08,177.08H824.5c1.15,0,2.34-0.05,3.49-0.21c2.29,0.16,4.58,0.21,6.93,0.21
-		c69.01,0,125-55.99,125-125V574.5C959.92,545.75,936.58,522.42,907.83,522.42z M241.17,897.42c-63.28,0-114.58-51.3-114.58-114.58
-		V199.5c0-40.26,32.66-72.92,72.92-72.92H637c40.31,0,72.92,32.6,72.92,72.81v635.52c0,22.76,6.09,44.11,16.72,62.5H241.17z
-		 M897.42,834.92c0,34.53-27.97,62.5-62.5,62.5c-34.53,0-62.5-27.97-62.5-62.5v-250h125V834.92z"/>
-	<path class="st0" d="M579.77,309.07h-312.5c-17.24,0-31.25,14.01-31.25,31.25c0,17.24,14.01,31.25,31.25,31.25h312.5
-		c17.24,0,31.25-14.01,31.25-31.25C611.02,323.08,597.01,309.07,579.77,309.07z"/>
-	<path class="st0" d="M579.77,475.74h-312.5c-17.24,0-31.25,14.01-31.25,31.25s14.01,31.25,31.25,31.25h312.5
-		c17.24,0,31.25-14.01,31.25-31.25S597.01,475.74,579.77,475.74z"/>
-	<path class="st0" d="M413.11,642.4H267.27c-17.24,0-31.25,14.01-31.25,31.25s14.01,31.25,31.25,31.25h145.83
-		c17.24,0,31.25-14.01,31.25-31.25S430.35,642.4,413.11,642.4z"/>
-</g>
-</svg>

BIN
static/img/example/video.jpeg


+ 19 - 50
static/style/app.scss

@@ -1,4 +1,10 @@
 @import "~@/static/font/iconfont.css";
+@import "@/static/style/vant.scss";
+@import "@/static/style/pages/exhibitor.scss";
+@import "@/static/style/pages/activity-item.scss";
+@import "@/static/style/pages/exhibitor-item.scss";
+@import "@/static/style/pages/exhibit-item.scss";
+
 .tabbar-icon {
   font-family: "iconfont";
 }
@@ -18,18 +24,12 @@
 	content: "\e68d";
 }
 
-$fontSize1: 20rpx;
-$fontSize2: 24rpx;
-$fontSize3: 28rpx;
-$fontSize4: 32rpx;
-$fontSize5: 36rpx;
-
 * {
 	font-family: Inter, Inter;
 	box-sizing: border-box;
 }
 page{
-	background-color: #FAFAFA;
+	background-color: $pageBackgroundColor;
 }
 image{
 	width: 100%;
@@ -40,52 +40,21 @@ view,input{
 	font-family: Arial, Arial;
 }
 .main-container {
-	padding: 30rpx;
-	background-color: #FAFAFA;
+	padding: 30rpx 30rpx 100rpx 30rpx;
+	background-color: $pageBackgroundColor;
  }
-// 字体大小
-.font-size-1{
-	font-size: $fontSize1;
-}
-.font-size-2{
-	font-size: $fontSize2;
+.link-text{
+	color: $textActionColor;
 }
-.font-size-3{
-	font-size: $fontSize3;
+.hover{
+	background-color: $hoverBackgroundColor!important;
 }
-.font-size-4{
-	font-size: $fontSize4;
-}
-.font-size-5{
-	font-size: $fontSize5;
-}
-
-.van-button{
-	font-size: 20rpx;
+.icon-Star-Filled.active,.icon-favourites-filled-star-symbol{
+	color: $textActionColor;
 }
-.van-button--normal{
-	.van-button__text{
-		display: flex!important;
-		align-items: center;
-	}
-	.iconfont{
-		margin-left: 12rpx;
-		font-size: $fontSize0;
-	}
+.icon-aixin.active{
+	color: red;
 }
-.van-button--primary {
-	--button-primary-background-color: #E57519;
-	--button-primary-border-color: #E57519;
-	--button-primary-color: #ffffff;
-	--button-border-radius: 6rpx;
-	--button-default-height: 50rpx;
-	--button-normal-font-size: 20rpx;
+.icon-Ticket1.active{
+	color: #405491;
 }
-.van-button--default {
-	--button-primary-background-color: #FFFFFF;
-	--button-primary-border-color: #7D7D7D;
-	--button-primary-color: #ffffff;
-	--button-border-radius: 6rpx;
-	--button-default-height: 50rpx;
-	--button-normal-font-size: 20rpx;
-}

+ 63 - 0
static/style/pages/activity-item.scss

@@ -0,0 +1,63 @@
+
+	.activity-item{
+		padding: 20rpx;
+		background-color: #FFFFFF;
+		box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.15);
+		&.active{
+			border: 4rpx solid rgba(232,116,0,0.34);
+			padding: 16rpx 16rpx;
+			.activity-favourites{
+				color: $textActionColor;
+			}
+		}
+		.activity-favourites{
+			@include display-flex-center;
+			font-size: $fontSize1;
+			&.active{
+				color: $textActionColor;
+			}
+			.iconfont{
+				font-size: $fontSize1;
+				margin-right: 4rpx;
+			}
+		}
+		.activity-title{
+			@include display-flex-between;
+			flex: 1;
+			line-height: 38rpx;
+			&>view:first-child{
+				font-weight: bold;
+				font-size: $fontSize3;
+			}
+		}
+		.activity-time{
+			margin-top: 15rpx;
+			font-family: Inter, Inter;
+			font-size: $fontSize1;
+		}
+		.activity-views{
+			margin-top: 15rpx;
+			font-family: Inter, Inter;
+			font-size: $fontSize0;
+			color: #7D7D7D;
+			line-height: 19rpx;
+		}
+		.activity-desc{
+			@include display-flex-between;
+			margin-top: 15rpx;
+			&>view:first-child{
+				@include text-ellipsis-line;
+				flex: 1;
+				margin-right: 51rpx;
+				font-size: 18rpx;
+				line-height: 30rpx;
+			}
+		}
+		.activity-detail-link{
+			flex-shrink: 0;
+			.van-button__text{
+				font-size: 18rpx;
+			}
+		}
+	}
+	

+ 23 - 0
static/style/pages/exhibit-item.scss

@@ -0,0 +1,23 @@
+.exhibit-item {
+	.exhibit-body{
+		display: flex;
+		flex-direction: column;
+		&>.exhibitor-name{
+			margin-left: 113rpx;
+		}
+		.exhibitor-name-cn{
+			margin-bottom: 5rpx;
+		}
+		.exhibitor-name-cn,.exhibitor-name-en{
+			color: #7d7d7d;
+			font-size: $fontSize1;
+			font-weight: normal;
+		}
+	}
+	.exhibitor-body{
+		&>.exhibitor-name{
+			margin-left: 23rpx;
+			line-height: 40rpx;
+		}
+	}
+}

+ 11 - 1
static/style/exhibitor-detail.scss

@@ -16,7 +16,7 @@
 			padding-top: 4rpx;
 		}
 		.exhibitor-tag{
-			@extend .display-flex-center;
+			@include display-flex-center;
 			height: 29rpx;
 			padding: 8rpx;
 			background-color: #E3E9F1;
@@ -42,6 +42,16 @@
 				align-items: center;
 				white-space: nowrap;
 			}
+			button{
+				font-size: $fontSize0;
+				white-space: nowrap;
+				line-height: inherit;
+				view{
+					display: flex;
+					align-items: center;
+					font-size: $fontSize0;
+				}
+			}
 			.iconfont{
 				font-size: 28rpx;
 				margin-right: 4rpx;

+ 22 - 45
static/style/exhibitor.scss

@@ -1,36 +1,12 @@
-.exhibitor-index{
-	.exhibitor-filter{
-		display: grid;
-		grid-template-columns: repeat(3, minmax(0, 1fr));
-		grid-gap: 29rpx;
-		font-size: $fontSize2;
-		color: #333333;
-		.exhibitor-filter-label{
-			font-family: Arial, Arial;
-			font-size: $fontSize2;
-			color: #333333;
-			margin-bottom: 8rpx;
-		}
-	}
-	.u-search{
-		margin-top: 34rpx;
-		margin-bottom: 42rpx;
-	}
-	.exhibitor-list{
-		display: grid;
-		grid-template-columns: 1fr;
-		grid-gap: 23rpx;
-	}
-	.exhibitor-item{
-		border-radius: 8rpx;
-		background: #FFFFFF;
-		box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.15);
-		padding: 26rpx 23rpx;
-		border: 1rpx solid #D9D9D9;
-		&.active{
-			border: 4rpx solid rgba(232,116,0,0.34);
-			padding: 24rpx 21rpx;
-		}
+.exhibitor-item{
+	border-radius: 8rpx;
+	background: #FFFFFF;
+	box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.15);
+	padding: 26rpx 23rpx;
+	border: 1rpx solid #D9D9D9;
+	&.active{
+		border: 4rpx solid rgba(232,116,0,0.34);
+		padding: 24rpx 21rpx;
 	}
 	.exhibitor-body{
 		display: flex;
@@ -44,7 +20,7 @@
 			margin-right: 28rpx;
 			&>view{
 				width: 100%;
-				@extend .text-ellipsis-line;
+				@include text-ellipsis-line;
 				-webkit-line-clamp: 2; 
 			}
 		}
@@ -93,10 +69,20 @@
 			grid-template-columns: repeat(4, 1fr);
 			font-size: $fontSize1;
 			color: #555555;
-			&>view{
+			&>view, &>button{
 				display: flex;
 				align-items: center;
 			}
+			button{
+				font-size: $fontSize1;
+				white-space: nowrap;
+				line-height: inherit;
+				view{
+					display: flex;
+					align-items: center;
+					font-size: $fontSize1;
+				}
+			}
 			.iconfont{
 				font-size: 28rpx;
 				margin-right: 4rpx;
@@ -111,13 +97,4 @@
 			margin-right: 57rpx;
 		}
 	}
-	.ad-space{
-		height: 90rpx;
-		background-color: #FEF1E8;
-		margin-bottom: 42rpx;
-		image{
-			width: 100%;
-			height: 100%;
-		}
-	}
-}
+}

+ 33 - 0
static/style/pages/exhibitor.scss

@@ -0,0 +1,33 @@
+.exhibitor-index{
+	.exhibitor-filter{
+		display: grid;
+		grid-template-columns: repeat(3, minmax(0, 1fr));
+		grid-gap: 29rpx;
+		font-size: $fontSize2;
+		color: #333333;
+		.exhibitor-filter-label{
+			font-family: Arial, Arial;
+			font-size: $fontSize2;
+			color: #333333;
+			margin-bottom: 8rpx;
+		}
+	}
+	.u-search{
+		margin-top: 34rpx;
+		margin-bottom: 42rpx;
+	}
+	.exhibitor-list{
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-gap: 23rpx;
+	}
+	.ad-space{
+		height: 90rpx;
+		background-color: #FEF1E8;
+		margin-bottom: 42rpx;
+		image{
+			width: 100%;
+			height: 100%;
+		}
+	}
+}

+ 17 - 0
static/style/pages/user-like.scss

@@ -0,0 +1,17 @@
+.user-like{
+	.user-like-tabs{
+		width: 400rpx;
+		.van-tabs__line{
+			width: 34rpx!important;
+		}
+		.van-tab{
+			color: #000000;
+			font-size: $fontSize2;
+		}
+	}
+	.user-like-list{
+		display: grid;
+		grid-template-columns: 1fr;
+		grid-row-gap: 25rpx;
+	}
+}

+ 102 - 0
static/style/vant.scss

@@ -0,0 +1,102 @@
+.van-button{
+	font-size: $fontSize1!important;
+}
+.van-empty__description{
+	font-size: $fontSize1!important;
+}
+@mixin van-button--base{
+	.van-button__text{
+		display: flex!important;
+		align-items: center;
+		white-space: nowrap;
+	}
+	.iconfont{
+		margin-left: 12rpx;
+		font-size: $fontSize0;
+	}
+}
+.van-button--large{
+	@include van-button--base;
+	--button-large-height: 89rpx!important;
+	--button-border-radius: 50rpx!important;
+	.van-button__text{
+		font-size: $fontSize3;
+	}
+	
+}
+.van-button--normal{
+	@include van-button--base;
+}
+.van-button--primary {
+	background-color: $buttonPrimaryColor!important;
+	border: 2rpx solid $buttonPrimaryColor!important;
+	--button-primary-color: #ffffff;
+	--button-border-radius: 6rpx;
+	--button-default-height: 50rpx;
+	--button-normal-font-size: 20rpx;
+}
+.van-button--default {
+	--button-default-background-color: #FFFFFF;
+	--button-primary-border-color: #ebedf0;
+	--button-default-color: #555555;
+	--button-border-radius: 6rpx;
+	--button-default-height: 50rpx;
+	--button-normal-font-size: 20rpx;
+}
+.van-checkbox{
+	.van-checkbox__icon--square{
+		width: 24rpx;
+		height: 24rpx;
+	}
+	.van-checkbox__icon--checked {
+		background-color: $buttonPrimaryColor!important;
+		border-color: $buttonPrimaryColor!important;
+	}
+	.van-icon{
+		font-size: 20rpx!important;
+		line-height: 30rpx;
+	}
+}
+.van-cell-group{
+	display: grid;
+	grid-template-columns: 1fr;
+	grid-row-gap: 17rpx;
+	.van-cell__title{
+		font-size: $fontSize3;
+		color: #333333;
+		padding-left: 8rpx;
+	}
+	.van-cell__title{
+		display: flex;
+		align-items: center;
+	}
+	.van-cell{
+		--cell-line-height: inherit;
+		--cell-vertical-padding: 30rpx;
+		--cell-horizontal-padding: 30rpx;
+		&.van-cell--hover{
+			background-color:var(--cell-active-color, #f2f3f5)
+		}
+	}
+	.van-cell__value{
+		font-size: $fontSize3;
+	}
+	.right-icon{
+		display: flex;
+		align-items: center;
+	}
+	.iconfont{
+		font-size: 40rpx;
+	}
+}
+.van-transition{
+	z-index: 2!important;
+}
+
+.van-dialog__footer{
+	.van-dialog__button:last-child{
+		.van-button__text{
+			color: $buttonPrimaryColor;
+		}
+	}
+}

+ 5 - 2
store/modules/user.js

@@ -18,17 +18,19 @@ import store from '@/store'
 const user = {
 	state: {
 		token: getToken(),
-		user: {}
+		user: null
 	},
 
 	mutations: {
 		SET_TOKEN: (state, token) => {
 			state.token = token
+			uni.setStorageSync('token', token)
 			setToken(token)
 		},
 		SET_USER: (state, user) => {
 			state.user = user
-			// 触发菜单更新
+			console.log('设置用户', user)
+			uni.setStorageSync('user', user)
 			EventBus.$emit(Events.USER_INFO_UPDATE, {
 				'user': user
 			})
@@ -118,6 +120,7 @@ const user = {
 			return new Promise(resolve => {
 				removeToken()
 				commit('SET_TOKEN', '')
+				commit('SET_USER', null)
 				resolve()
 			})
 		}

+ 7 - 6
uni.scss

@@ -1,5 +1,6 @@
 // 继承样式
-$primaryColor: #123456;
+$hoverBackgroundColor: #F2F3F5;
+$pageBackgroundColor: #FAFAFA;
 $buttonPrimaryColor: #E57519;
 $textActionColor: #E57519;
 $border: 2rpx solid #aaaaaa;
@@ -13,25 +14,25 @@ $fontSize3: 28rpx;
 $fontSize4: 32rpx;
 $fontSize5: 36rpx;
 
-.display-flex-center {
+@mixin display-flex-center {
 	display: flex;
 	justify-content: center;
 	align-items: center;
 }
 
-.display-flex-between {
+@mixin display-flex-between {
 	display: flex;
 	justify-content: space-between;
 	align-items: center;
 }
 
-.text-ellipsis {
+@mixin text-ellipsis {
 	white-space: nowrap;
 	overflow: hidden;
 	text-overflow: ellipsis;
 }
 
-.text-ellipsis-line {
+@mixin text-ellipsis-line {
   display: -webkit-box;
 	width: 100%;
 	overflow: hidden;
@@ -40,7 +41,7 @@ $fontSize5: 36rpx;
   -webkit-line-clamp: 2;
 }
 
-.after{
+@mixin after{
 	position: absolute;
 	display: block;
 	content: ' ';

+ 50 - 9
utils/request.js

@@ -65,6 +65,10 @@ class Request {
 			if (typeof uni !== 'undefined') {
 				weixin = uni
 			}
+			if (process.env.name !== 'dev') {
+				console.log("请求地址:" + this.url, this.data)
+			}
+			
 			weixin.request({
 				url: this.url,
 				method: this.method,
@@ -104,11 +108,13 @@ request.beforeRequest = _request => {
 	_request.header['X-Requested-With'] = 'XMLHttpRequest'
 	const apiToken = getToken()
 	if (apiToken) {
-		_request.header.Authorization = `Bearer ${apiToken}`
+		_request.header.token = `${apiToken}`
 	}
 }
 request.afterRequest = response => {
-	console.log(response)
+	if (process.env.name !== 'dev') {
+		console.log("返回数据", response)
+	}
 	if (response.header && response.header['authorization']) {
 		// 刷新token
 		const token = response.header['authorization'].replace('Bearer ', '')
@@ -117,19 +123,19 @@ request.afterRequest = response => {
 		}
 	}
 	const res = response.data
-	if (res.ret !== 0) {
-		if (res.ret === 401) {
-			if (response.data.msg === 'Token has expired') {
-				response.data.msg = '登录超时'
+	if (res.code !== 0) {
+		if (res.code === 401) {
+			if (res.message === 'Token has expired') {
+				res.message = '登录超时'
 			}
 			store.dispatch('fedLogOut').then(() => {
 				uni.navigateTo({
-					url: '/login-new'
+					url: '/pages/user/login'
 				})
 			})
 		} else {
 			uni.showModal({
-				content: res.msg || 'Error',
+				content: res.message || 'Error',
 				success(r) {
 					if (r.confirm) {
 					} else if (r.cancel) {
@@ -137,7 +143,7 @@ request.afterRequest = response => {
 				}
 			})
 		}
-		return Promise.reject(new Error(res.msg || 'Error'))
+		return Promise.reject(new Error(res.message || 'Error'))
 	} else {
 		return res
 	}
@@ -165,4 +171,39 @@ export const post = (url) => (params) => {
 
 export const link = (url) => {
 	return process.env.BASE_API + url
+}
+
+export const upload = (url) =>  (params) => {
+	return new Promise((resolve, reject) => {
+		uni.uploadFile({
+		  url: process.env.BASE_API + url,
+		  filePath: params.filePath,
+		  name: params.name || 'file',
+			header: {
+				'X-Requested-With': 'XMLHttpRequest',
+				'token': getToken(),
+				'Content-Type': 'application/json;charset=UTF-8'
+			},
+		  success(res) {
+				if (res.data) {
+					try {
+						res.data = JSON.parse(res.data)
+						resolve(res.data)
+						return
+					} catch(e) {}
+				}
+				uni.showToast({
+					icon: 'error',
+					title: '上传文件失败'
+				})
+		  },
+		  fail(error) {
+				uni.showToast({
+					icon: 'none',
+					title: error.message
+				})
+				reject(error)
+		  }
+		})
+	})
 }

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


File diff suppressed because it is too large
+ 0 - 234
wxcomponents/vant/area/index.vue


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


+ 0 - 37
wxcomponents/vant/calendar/calendar.vue

@@ -1,37 +0,0 @@
-<template>
-<uni-shadow-root class="vant-calendar-calendar"><view class="van-calendar">
-  <header :title="title" :showTitle="showTitle" :subtitle="subtitle" :showSubtitle="showSubtitle" :firstDayOfWeek="firstDayOfWeek" @click-subtitle="onClickSubtitle">
-    <slot name="title" slot="title"></slot>
-  </header>
-
-  <scroll-view class="van-calendar__body" scroll-y :scroll-into-view="scrollIntoView">
-    <month v-for="(item,index) in (computed.getMonths(minDate, maxDate))" :key="item.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" @click="onClickDay"></month>
-  </scroll-view>
-
-  <view :class="utils.bem('calendar__footer', { safeAreaInsetBottom })">
-    <slot name="footer"></slot>
-  </view>
-
-  <view :class="utils.bem('calendar__footer', { safeAreaInsetBottom })">
-    <van-button v-if="showConfirm" round block type="danger" :color="color" custom-class="van-calendar__confirm" :disabled="computed.getButtonDisabled(type, currentDate, minRange)" nativeType="text" @click="onConfirm">
-      {{
-        computed.getButtonDisabled(type, currentDate, minRange)
-          ? confirmDisabledText
-          : confirmText
-      }}
-    </van-button>
-  </view>
-</view></uni-shadow-root>
-</template>
-<wxs src="./index.wxs" module="computed"></wxs><wxs src="../wxs/utils.wxs" module="utils"></wxs>
-<script>
-
-global['__wxRoute'] = 'vant/calendar/calendar'
-
-Component({})
-
-export default global['__wxComponents']['vant/calendar/calendar']
-</script>
-<style platform="mp-weixin">
-
-</style>

File diff suppressed because it is too large
+ 0 - 64
wxcomponents/vant/calendar/components/header/index.vue


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


File diff suppressed because it is too large
+ 0 - 388
wxcomponents/vant/calendar/index.vue


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


File diff suppressed because it is too large
+ 0 - 246
wxcomponents/vant/cascader/index.vue


+ 0 - 28
wxcomponents/vant/cell-group/index.vue

@@ -1,28 +0,0 @@
-<template>
-<uni-shadow-root class="vant-cell-group-index"><view v-if="title" :class="utils.bem('cell-group__title', { inset })">
-  {{ title }}
-</view>
-<view :class="'custom-class '+(utils.bem('cell-group', { inset }))+' '+(border ? 'van-hairline--top-bottom' : '')">
-  <slot></slot>
-</view></uni-shadow-root>
-</template>
-<wxs src="../wxs/utils.wxs" module="utils"></wxs>
-<script>
-
-global['__wxRoute'] = 'vant/cell-group/index'
-import { VantComponent } from '../common/component';
-VantComponent({
-    props: {
-        title: String,
-        border: {
-            type: Boolean,
-            value: true,
-        },
-        inset: Boolean,
-    },
-});
-export default global['__wxComponents']['vant/cell-group/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';.van-cell-group--inset{border-radius:var(--cell-group-inset-border-radius,8px);margin:var(--cell-group-inset-padding,0 16px);overflow:hidden}.van-cell-group__title{color:var(--cell-group-title-color,#969799);font-size:var(--cell-group-title-font-size,14px);line-height:var(--cell-group-title-line-height,16px);padding:var(--cell-group-title-padding,16px 16px 8px)}.van-cell-group__title--inset{padding:var(--cell-group-inset-title-padding,16px 16px 8px 32px)}
-</style>

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


+ 0 - 50
wxcomponents/vant/checkbox-group/index.vue

@@ -1,50 +0,0 @@
-<template>
-<uni-shadow-root class="vant-checkbox-group-index"><view :class="utils.bem('checkbox-group', [{ horizontal: direction === 'horizontal' }])">
-  <slot></slot>
-</view></uni-shadow-root>
-</template>
-<wxs src="../wxs/utils.wxs" module="utils"></wxs>
-<script>
-
-global['__wxRoute'] = 'vant/checkbox-group/index'
-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',
-        },
-        direction: {
-            type: String,
-            value: 'vertical',
-        },
-    },
-    methods: {
-        updateChildren() {
-            this.children.forEach((child) => this.updateChild(child));
-        },
-        updateChild(child) {
-            const { value, disabled, direction } = this.data;
-            child.setData({
-                value: value.indexOf(child.data.name) !== -1,
-                parentDisabled: disabled,
-                direction,
-            });
-        },
-    },
-});
-export default global['__wxComponents']['vant/checkbox-group/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';.van-checkbox-group--horizontal{display:flex;flex-wrap:wrap}
-</style>

File diff suppressed because it is too large
+ 0 - 102
wxcomponents/vant/checkbox/index.vue


+ 0 - 215
wxcomponents/vant/circle/index.vue

@@ -1,215 +0,0 @@
-<template>
-<uni-shadow-root class="vant-circle-index"><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 v-if="(!text)" class="van-circle__text">
-    <slot></slot>
-  </view>
-  <cover-view v-else class="van-circle__text">{{ text }}</cover-view>
-</view></uni-shadow-root>
-</template>
-<wxs src="../wxs/utils.wxs" module="utils"></wxs>
-<script>
-
-global['__wxRoute'] = 'vant/circle/index'
-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) => {
-                    if (!context)
-                        return;
-                    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) => {
-                if (!context)
-                    return;
-                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.clearMockInterval();
-            this.currentValue = this.currentValue || 0;
-            const run = () => {
-                this.interval = setTimeout(() => {
-                    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);
-                        run();
-                    }
-                    else {
-                        this.clearMockInterval();
-                    }
-                }, 1000 / speed);
-            };
-            run();
-        },
-        clearMockInterval() {
-            if (this.interval) {
-                clearTimeout(this.interval);
-                this.interval = null;
-            }
-        },
-    },
-    mounted() {
-        this.currentValue = this.data.value;
-        this.setHoverColor().then(() => {
-            this.drawCircle(this.currentValue);
-        });
-    },
-    destroyed() {
-        this.clearMockInterval();
-    },
-});
-export default global['__wxComponents']['vant/circle/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';.van-circle{display:inline-block;position:relative;text-align:center}.van-circle__text{color:var(--circle-text-color,#323233);left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%}
-</style>

File diff suppressed because it is too large
+ 0 - 23
wxcomponents/vant/col/index.vue


File diff suppressed because it is too large
+ 0 - 86
wxcomponents/vant/collapse-item/index.vue


+ 0 - 60
wxcomponents/vant/collapse/index.vue

@@ -1,60 +0,0 @@
-<template>
-<uni-shadow-root class="vant-collapse-index"><view :class="'custom-class van-collapse '+(border ? 'van-hairline--top-bottom' : '')">
-  <slot></slot>
-</view></uni-shadow-root>
-</template>
-
-<script>
-
-global['__wxRoute'] = 'vant/collapse/index'
-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);
-        },
-    },
-});
-export default global['__wxComponents']['vant/collapse/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';
-</style>

+ 0 - 23
wxcomponents/vant/config-provider/index.vue

@@ -1,23 +0,0 @@
-<template>
-<uni-shadow-root class="vant-config-provider-index"><view class="van-config-provider" :style="computed.mapThemeVarsToCSSVars(themeVars)">
-  <slot></slot>
-</view></uni-shadow-root>
-</template>
-<wxs src="./index.wxs" module="computed"></wxs>
-<script>
-
-global['__wxRoute'] = 'vant/config-provider/index'
-import { VantComponent } from '../common/component';
-VantComponent({
-    props: {
-        themeVars: {
-            type: Object,
-            value: {},
-        },
-    },
-});
-export default global['__wxComponents']['vant/config-provider/index']
-</script>
-<style platform="mp-weixin">
-
-</style>

+ 0 - 115
wxcomponents/vant/count-down/index.vue

@@ -1,115 +0,0 @@
-<template>
-<uni-shadow-root class="vant-count-down-index"><view class="van-count-down">
-  <slot v-if="useSlot"></slot>
-  <block v-else>{{ formattedTime }}</block>
-</view></uni-shadow-root>
-</template>
-
-<script>
-
-global['__wxRoute'] = 'vant/count-down/index'
-import { VantComponent } from '../common/component';
-import { isSameSecond, parseFormat, parseTimeData } from './utils';
-function simpleTick(fn) {
-    return setTimeout(fn, 30);
-}
-VantComponent({
-    props: {
-        useSlot: Boolean,
-        millisecond: Boolean,
-        time: {
-            type: Number,
-            observer: 'reset',
-        },
-        format: {
-            type: String,
-            value: 'HH:mm:ss',
-        },
-        autoStart: {
-            type: Boolean,
-            value: true,
-        },
-    },
-    data: {
-        timeData: parseTimeData(0),
-        formattedTime: '0',
-    },
-    destroyed() {
-        clearTimeout(this.tid);
-        this.tid = null;
-    },
-    methods: {
-        // 开始
-        start() {
-            if (this.counting) {
-                return;
-            }
-            this.counting = true;
-            this.endTime = Date.now() + this.remain;
-            this.tick();
-        },
-        // 暂停
-        pause() {
-            this.counting = false;
-            clearTimeout(this.tid);
-        },
-        // 重置
-        reset() {
-            this.pause();
-            this.remain = this.data.time;
-            this.setRemain(this.remain);
-            if (this.data.autoStart) {
-                this.start();
-            }
-        },
-        tick() {
-            if (this.data.millisecond) {
-                this.microTick();
-            }
-            else {
-                this.macroTick();
-            }
-        },
-        microTick() {
-            this.tid = simpleTick(() => {
-                this.setRemain(this.getRemain());
-                if (this.remain !== 0) {
-                    this.microTick();
-                }
-            });
-        },
-        macroTick() {
-            this.tid = simpleTick(() => {
-                const remain = this.getRemain();
-                if (!isSameSecond(remain, this.remain) || remain === 0) {
-                    this.setRemain(remain);
-                }
-                if (this.remain !== 0) {
-                    this.macroTick();
-                }
-            });
-        },
-        getRemain() {
-            return Math.max(this.endTime - Date.now(), 0);
-        },
-        setRemain(remain) {
-            this.remain = remain;
-            const timeData = parseTimeData(remain);
-            if (this.data.useSlot) {
-                this.$emit('change', timeData);
-            }
-            this.setData({
-                formattedTime: parseFormat(this.data.format, timeData),
-            });
-            if (remain === 0) {
-                this.pause();
-                this.$emit('finish');
-            }
-        },
-    },
-});
-export default global['__wxComponents']['vant/count-down/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';.van-count-down{color:var(--count-down-text-color,#323233);font-size:var(--count-down-font-size,14px);line-height:var(--count-down-line-height,20px)}
-</style>

+ 0 - 309
wxcomponents/vant/datetime-picker/index.vue

@@ -1,309 +0,0 @@
-<template>
-<uni-shadow-root class="vant-datetime-picker-index"><van-picker class="van-datetime-picker" active-class="active-class" toolbar-class="toolbar-class" column-class="column-class" :title="title" :columns="columns" :item-height="itemHeight" :show-toolbar="showToolbar" :visible-item-count="visibleItemCount" :confirm-button-text="confirmButtonText" :cancel-button-text="cancelButtonText" @change="onChange" @confirm="onConfirm" @cancel="onCancel"></van-picker></uni-shadow-root>
-</template>
-
-<script>
-import VanPicker from '../picker/index.vue'
-global['__wxVueOptions'] = {components:{'van-picker': VanPicker}}
-
-global['__wxRoute'] = 'vant/datetime-picker/index'
-import { VantComponent } from '../common/component';
-import { isDef } from '../common/validator';
-import { pickerProps } from '../picker/shared';
-const currentYear = new Date().getFullYear();
-function isValidDate(date) {
-    return isDef(date) && !isNaN(new Date(date).getTime());
-}
-function range(num, min, max) {
-    return Math.min(Math.max(num, min), max);
-}
-function padZero(val) {
-    return `00${val}`.slice(-2);
-}
-function times(n, iteratee) {
-    let index = -1;
-    const result = Array(n < 0 ? 0 : n);
-    while (++index < n) {
-        result[index] = iteratee(index);
-    }
-    return result;
-}
-function getTrueValue(formattedValue) {
-    if (formattedValue === undefined) {
-        formattedValue = '1';
-    }
-    while (isNaN(parseInt(formattedValue, 10))) {
-        formattedValue = formattedValue.slice(1);
-    }
-    return parseInt(formattedValue, 10);
-}
-function getMonthEndDay(year, month) {
-    return 32 - new Date(year, month - 1, 32).getDate();
-}
-const defaultFormatter = (type, value) => value;
-VantComponent({
-    classes: ['active-class', 'toolbar-class', 'column-class'],
-    props: Object.assign(Object.assign({}, pickerProps), { value: {
-            type: null,
-            observer: 'updateValue',
-        }, filter: null, type: {
-            type: String,
-            value: 'datetime',
-            observer: 'updateValue',
-        }, showToolbar: {
-            type: Boolean,
-            value: true,
-        }, formatter: {
-            type: null,
-            value: defaultFormatter,
-        }, minDate: {
-            type: Number,
-            value: new Date(currentYear - 10, 0, 1).getTime(),
-            observer: 'updateValue',
-        }, maxDate: {
-            type: Number,
-            value: new Date(currentYear + 10, 11, 31).getTime(),
-            observer: 'updateValue',
-        }, minHour: {
-            type: Number,
-            value: 0,
-            observer: 'updateValue',
-        }, maxHour: {
-            type: Number,
-            value: 23,
-            observer: 'updateValue',
-        }, minMinute: {
-            type: Number,
-            value: 0,
-            observer: 'updateValue',
-        }, maxMinute: {
-            type: Number,
-            value: 59,
-            observer: 'updateValue',
-        } }),
-    data: {
-        innerValue: Date.now(),
-        columns: [],
-    },
-    methods: {
-        updateValue() {
-            const { data } = this;
-            const val = this.correctValue(data.value);
-            const isEqual = val === data.innerValue;
-            this.updateColumnValue(val).then(() => {
-                if (!isEqual) {
-                    this.$emit('input', val);
-                }
-            });
-        },
-        getPicker() {
-            if (this.picker == null) {
-                this.picker = this.selectComponent('.van-datetime-picker');
-                const { picker } = this;
-                const { setColumnValues } = picker;
-                picker.setColumnValues = (...args) => setColumnValues.apply(picker, [...args, false]);
-            }
-            return this.picker;
-        },
-        updateColumns() {
-            const { formatter = defaultFormatter } = this.data;
-            const results = this.getOriginColumns().map((column) => ({
-                values: column.values.map((value) => formatter(column.type, value)),
-            }));
-            return this.set({ columns: results });
-        },
-        getOriginColumns() {
-            const { filter } = this.data;
-            const results = this.getRanges().map(({ type, range }) => {
-                let values = times(range[1] - range[0] + 1, (index) => {
-                    const value = range[0] + index;
-                    return type === 'year' ? `${value}` : padZero(value);
-                });
-                if (filter) {
-                    values = filter(type, values);
-                }
-                return { type, values };
-            });
-            return results;
-        },
-        getRanges() {
-            const { data } = this;
-            if (data.type === 'time') {
-                return [
-                    {
-                        type: 'hour',
-                        range: [data.minHour, data.maxHour],
-                    },
-                    {
-                        type: 'minute',
-                        range: [data.minMinute, data.maxMinute],
-                    },
-                ];
-            }
-            const { maxYear, maxDate, maxMonth, maxHour, maxMinute, } = this.getBoundary('max', data.innerValue);
-            const { minYear, minDate, minMonth, minHour, minMinute, } = this.getBoundary('min', data.innerValue);
-            const result = [
-                {
-                    type: 'year',
-                    range: [minYear, maxYear],
-                },
-                {
-                    type: 'month',
-                    range: [minMonth, maxMonth],
-                },
-                {
-                    type: 'day',
-                    range: [minDate, maxDate],
-                },
-                {
-                    type: 'hour',
-                    range: [minHour, maxHour],
-                },
-                {
-                    type: 'minute',
-                    range: [minMinute, maxMinute],
-                },
-            ];
-            if (data.type === 'date')
-                result.splice(3, 2);
-            if (data.type === 'year-month')
-                result.splice(2, 3);
-            return result;
-        },
-        correctValue(value) {
-            const { data } = this;
-            // validate value
-            const isDateType = data.type !== 'time';
-            if (isDateType && !isValidDate(value)) {
-                value = data.minDate;
-            }
-            else if (!isDateType && !value) {
-                const { minHour } = data;
-                value = `${padZero(minHour)}:00`;
-            }
-            // time type
-            if (!isDateType) {
-                let [hour, minute] = value.split(':');
-                hour = padZero(range(hour, data.minHour, data.maxHour));
-                minute = padZero(range(minute, data.minMinute, data.maxMinute));
-                return `${hour}:${minute}`;
-            }
-            // date type
-            value = Math.max(value, data.minDate);
-            value = Math.min(value, data.maxDate);
-            return value;
-        },
-        getBoundary(type, innerValue) {
-            const value = new Date(innerValue);
-            const boundary = new Date(this.data[`${type}Date`]);
-            const year = boundary.getFullYear();
-            let month = 1;
-            let date = 1;
-            let hour = 0;
-            let minute = 0;
-            if (type === 'max') {
-                month = 12;
-                date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
-                hour = 23;
-                minute = 59;
-            }
-            if (value.getFullYear() === year) {
-                month = boundary.getMonth() + 1;
-                if (value.getMonth() + 1 === month) {
-                    date = boundary.getDate();
-                    if (value.getDate() === date) {
-                        hour = boundary.getHours();
-                        if (value.getHours() === hour) {
-                            minute = boundary.getMinutes();
-                        }
-                    }
-                }
-            }
-            return {
-                [`${type}Year`]: year,
-                [`${type}Month`]: month,
-                [`${type}Date`]: date,
-                [`${type}Hour`]: hour,
-                [`${type}Minute`]: minute,
-            };
-        },
-        onCancel() {
-            this.$emit('cancel');
-        },
-        onConfirm() {
-            this.$emit('confirm', this.data.innerValue);
-        },
-        onChange() {
-            const { data } = this;
-            let value;
-            const picker = this.getPicker();
-            const originColumns = this.getOriginColumns();
-            if (data.type === 'time') {
-                const indexes = picker.getIndexes();
-                value = `${+originColumns[0].values[indexes[0]]}:${+originColumns[1]
-                    .values[indexes[1]]}`;
-            }
-            else {
-                const indexes = picker.getIndexes();
-                const values = indexes.map((value, index) => originColumns[index].values[value]);
-                const year = getTrueValue(values[0]);
-                const month = getTrueValue(values[1]);
-                const maxDate = getMonthEndDay(year, month);
-                let date = getTrueValue(values[2]);
-                if (data.type === 'year-month') {
-                    date = 1;
-                }
-                date = date > maxDate ? maxDate : date;
-                let hour = 0;
-                let minute = 0;
-                if (data.type === 'datetime') {
-                    hour = getTrueValue(values[3]);
-                    minute = getTrueValue(values[4]);
-                }
-                value = new Date(year, month - 1, date, hour, minute);
-            }
-            value = this.correctValue(value);
-            this.updateColumnValue(value).then(() => {
-                this.$emit('input', value);
-                this.$emit('change', picker);
-            });
-        },
-        updateColumnValue(value) {
-            let values = [];
-            const { type } = this.data;
-            const formatter = this.data.formatter || defaultFormatter;
-            const picker = this.getPicker();
-            if (type === 'time') {
-                const pair = value.split(':');
-                values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
-            }
-            else {
-                const date = new Date(value);
-                values = [
-                    formatter('year', `${date.getFullYear()}`),
-                    formatter('month', padZero(date.getMonth() + 1)),
-                ];
-                if (type === 'date') {
-                    values.push(formatter('day', padZero(date.getDate())));
-                }
-                if (type === 'datetime') {
-                    values.push(formatter('day', padZero(date.getDate())), formatter('hour', padZero(date.getHours())), formatter('minute', padZero(date.getMinutes())));
-                }
-            }
-            return this.set({ innerValue: value })
-                .then(() => this.updateColumns())
-                .then(() => picker.setValues(values));
-        },
-    },
-    created() {
-        const innerValue = this.correctValue(this.data.value);
-        this.updateColumnValue(innerValue).then(() => {
-            this.$emit('input', innerValue);
-        });
-    },
-});
-export default global['__wxComponents']['vant/datetime-picker/index']
-</script>
-<style platform="mp-weixin">
-@import '../common/index.css';
-</style>

+ 0 - 0
wxcomponents/vant/dialog/index.vue


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