diff --git a/components/ProductSection.vue b/components/ProductSection.vue index 028a921..694c228 100644 --- a/components/ProductSection.vue +++ b/components/ProductSection.vue @@ -184,18 +184,18 @@ export default { // 标题区域 .title-section { - padding: 18rpx 24rpx; + padding: 14rpx 24rpx 8rpx ; margin: 40rpx 16rpx 0rpx; display: inline-block; border-radius: 14rpx 14rpx 0 0; .title { font-size: 36rpx; - font-weight: bold; + font-weight: 500; color: #4d4d4d; } .more-btn { - font-size: 18rpx; + font-size: 20rpx; color: #999999; margin-left: 35rpx; } @@ -295,6 +295,7 @@ export default { // 卡片内容 .card-content { padding: 24rpx 0; + padding-bottom: 0; } .title-price-heart { diff --git a/components/WaterfallLayout.vue b/components/WaterfallLayout.vue index 1796127..b528c8a 100644 --- a/components/WaterfallLayout.vue +++ b/components/WaterfallLayout.vue @@ -27,7 +27,7 @@ {{ item.user.name }} - + {{ item.likes }} @@ -61,7 +61,7 @@ {{ item.user.name }} - + {{ item.likes }} diff --git a/pages/index/iSoul.vue b/pages/index/iSoul.vue index 52a93d3..64c103f 100644 --- a/pages/index/iSoul.vue +++ b/pages/index/iSoul.vue @@ -1,79 +1,100 @@ \ No newline at end of file +view { + box-sizing: border-box; +} + +.profile-container { + background: white; + min-height: 100vh; + padding-bottom: 200rpx; + color: white; +} + +/* 状态栏占位 */ +.status-bar-placeholder { + height: var(--status-bar-height); + width: 100%; +} + +/* 顶部导航 */ +.header { + display: flex; + justify-content: space-between; + align-items: center; + height: 48px; +} + +.back-btn, +.more-btn { + width: 60rpx; + height: 60rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 40rpx; + color: white; +} + +.dots { + font-size: 32rpx; + font-weight: bold; +} + +/* 用户信息区域 */ +.user-section { + display: flex; + align-items: center; + padding: 0 40rpx 30rpx; +} + +.user-avatar { + width: 120rpx; + height: 120rpx; + border-radius: 50%; + overflow: hidden; + margin-right: 30rpx; +} + +.avatar-img { + width: 100%; + height: 100%; +} + +.user-info { + flex: 1; +} + +.username { + font-size: 36rpx; + font-weight: bold; + color: white; + margin-bottom: 10rpx; +} + +.user-id { + font-size: 24rpx; + color: rgba(255, 255, 255, 0.8); + margin-bottom: 10rpx; +} + +.location { + display: flex; + align-items: center; + font-size: 24rpx; + color: rgba(255, 255, 255, 0.8); +} + +.location-icon, +.info-icon { + margin-right: 8rpx; +} + +/* 城市艺术漫游 */ +.city-art { + padding: 0 40rpx 20rpx; + display: flex; + align-items: center; + justify-content: space-between; +} + +.city-title { + display: flex; + align-items: center; + font-size: 28rpx; + color: rgba(255, 255, 255, 0.9); +} + +.pin-icon { + margin-right: 8rpx; +} + +.city-name { + font-size: 28rpx; + color: white; + font-weight: bold; +} + +.gender-icon { + width: 40rpx; + height: 40rpx; + background: rgba(255, 255, 255, 0.2); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 24rpx; +} + +/* 统计数据 */ +.stats-section { + display: flex; + justify-content: space-around; + margin-top: 80rpx; + padding-bottom: 50rpx; +} + +.stat-item { + text-align: center; +} + +.stat-number { + font-size: 32rpx; + font-weight: bold; + color: white; + margin-bottom: 8rpx; +} + +.stat-label { + font-size: 24rpx; + color: rgba(255, 255, 255, 0.8); +} + +/* 操作按钮 */ +.action-buttons { + display: flex; + padding: 0 40rpx 40rpx; + gap: 20rpx; +} + +.follow-btn { + flex: 1; + background: #ff4757; + border-radius: 50rpx; + padding: 20rpx; + text-align: center; + color: white; + font-size: 28rpx; + font-weight: bold; +} + +.message-btn { + flex: 1; + background: rgba(255, 255, 255, 0.2); + border-radius: 50rpx; + padding: 20rpx; + text-align: center; + color: white; + font-size: 28rpx; + font-weight: bold; +} + +/* 待激活的Agent */ +.agent-section { + margin: 0 47rpx; + border-radius: 20rpx; + margin-bottom: 30rpx; + overflow: hidden; + display: flex; + align-items: center; + padding: 30rpx 0; +} + +.agent-header { + margin-right: 30rpx; + flex-shrink: 0; +} + +.agent-title { + font-size: 28rpx; + color: #000000; +} + +.agent-content { + flex: 1; +} + +.agent-scroll { + width: 430rpx; + white-space: nowrap; + /* 微信小程序隐藏横向滚动条 */ + overflow: hidden; + /* Webkit浏览器 */ + &::-webkit-scrollbar { + display: none !important; + width: 0 !important; + height: 0 !important; + } + /* Firefox */ + scrollbar-width: none; + /* IE和Edge */ + -ms-overflow-style: none; +} + +.agent-avatars { + display: inline-flex; + gap: 20rpx; +} + +.agent-avatar { + width: 104rpx; + height: 104rpx; + border-radius: 50%; + overflow: hidden; + flex-shrink: 0; +} + +.agent-img { + width: 100%; + height: 100%; +} + +/* 数字资产权益 */ +.digital-assets { + margin: 0 30rpx 0rpx; +} + +.asset-card { + border-radius: 20rpx; + overflow: hidden; +} + +.asset-bg { + padding: 40rpx 30rpx 30rpx; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + position: relative; + overflow: hidden; +} + +.asset-bg::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: url('data:image/svg+xml,'); + pointer-events: none; +} + +.asset-title { + font-size: 32rpx; + color: white; + font-weight: 600; + position: relative; + z-index: 1; +} + +.asset-actions { + display: flex; + padding: 20rpx 0; + + background: white; + font-size: 25rpx; +} + +.asset-action { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + padding: 0 10rpx; + font-size: 24rpx; + color: #666; + position: relative; +} + +.asset-action.active { + color: #ff4757; +} + +.action-icon { + width: 36rpx; + height: 36rpx; + border-radius: 50%; + margin-bottom: 12rpx; +} + +.action-icon.red { + background: #ff4757; +} + +.action-icon.gray { + background: #ccc; +} + +/* 有感商品 */ +.feeling-goods { + margin: 20rpx 30rpx 30rpx; +} + +.goods-card { + border-radius: 20rpx; + overflow: hidden; +} + +.goods-bg { + padding: 40rpx 30rpx 20rpx; + position: relative; +} + +.goods-title { + font-size: 32rpx; + color: white; + font-weight: bold; + margin-bottom: 10rpx; +} + +.goods-brand { + font-size: 36rpx; + color: white; + font-weight: bold; + margin-bottom: 5rpx; +} + +.goods-subtitle { + font-size: 24rpx; + color: rgba(255, 255, 255, 0.8); +} + +.goods-actions { + display: flex; + background: white; +} + +.goods-action { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + padding: 20rpx 10rpx; + font-size: 24rpx; + color: #666; +} + +.goods-action.active { + color: #ff4757; +} + +/* 数字资产纪念册 */ +.memorial-section { + margin: 0 47rpx; + margin-bottom: 30rpx; +} + +.memorial-divider { + display: flex; + align-items: center; + padding: 30rpx 0; + margin-bottom: 30rpx; +} + +.divider-line { + flex: 1; + height: 2rpx; + background: #e0e0e0; +} + +.divider-text { + padding: 0 30rpx; + font-size: 28rpx; + color: #000000; + font-weight: 500; + white-space: nowrap; +} + +.memorial-cards { + display: flex; + gap: 20rpx; +} + +.memorial-card { + flex: 1; + border-radius: 10rpx; + overflow: hidden; + background: white; +} + +.memorial-img { + width: 100%; + height: 425rpx; +} + +.memorial-info { + padding: 20rpx 10rpx; + display: flex; + justify-content: space-between; + align-items: center; +} + +.memorial-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 22rpx; + color: #000000; + flex: 1; +} + +.memorial-more { + font-size: 14rpx; + color: #999; +} + +/* 底部菜单 */ +.bottom-menu { + padding: 40rpx 30rpx; + background: white; + margin: 0 30rpx; + border-radius: 20rpx; + margin-bottom: 30rpx; +} + +.menu-item { + padding: 30rpx 0; + border-bottom: 1rpx solid #f5f5f5; + font-size: 28rpx; + color: #333; +} + +.menu-item:last-child { + border-bottom: none; +} + +.user-top { +} + +.digital-img { + height: 265rpx; + width: 100%; + border-radius: 20rpx; +} + diff --git a/pages/index/index.vue b/pages/index/index.vue index 156e9ad..59b4995 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -18,8 +18,6 @@ :productList="productList" moreUrl="/subPackages/equityGoods/index" detailUrlPrefix="/subPackages/equityGoods/detail" - @more-click="goToMore" - @product-click="goToDetail" @like-toggle="handleLikeToggle" /> @@ -115,6 +111,9 @@ export default { }, onShow() { this.browse_record({ type: "page", title: "首页" }); + this.$nextTick(() =>{ + this.$refs.dynamicIsland.getUserInfo(); + }) }, onPageScroll(e) { // 只触发带页面ID的事件,避免不同页面间的状态冲突 @@ -166,12 +165,7 @@ export default { encodeURIComponent(JSON.stringify(item)), }); }, - // 跳转到商品详情 - goToDetail(item) { - uni.navigateTo({ - url: "/subPackages/techan/detail?id=" + item.id, - }); - }, + // 处理收藏状态切换 handleLikeToggle({ item, index }) { this.productList[index] = item; @@ -201,7 +195,11 @@ export default { }, }; - + + .detail-container { + background: #f5f5f5; + min-height: 100vh; + } + + .banner-content { + width: 100%; + height: 700rpx; + position: relative; + + .top-banner { + width: 100%; + height: 100%; + } + + .dot-container { + position: absolute; + bottom: 43rpx; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + left: 0; + + .dot-line { + width: 52rpx; + height: 4rpx; + margin: 0 8rpx; + background: RGBA(189, 170, 173, 0.8); + + &.active { + background: #ff1e55; + } + } + } + + .page-indicator { + position: absolute; + bottom: 20rpx; + right: 20rpx; + // background: rgba(0, 0, 0, 0.5); + border-radius: 10rpx; + padding: 10rpx 20rpx; + + .page-text { + font-size: 24rpx; + color: #fff; + font-weight: 500; + } + } + } + + .product-info { + background: white; + padding: 40rpx 30rpx; + margin: 20rpx; + border-radius: 20rpx 20rpx 0 0; + padding-bottom: 20rpx; + + .title-section { + margin-bottom: 30rpx; + + .product-title { + font-size: 31rpx; + font-weight: bold; + color: #000000; + line-height: 1.4; + margin-bottom: 20rpx; + } + + .tags-container { + display: flex; + align-items: center; + flex-wrap: wrap; + + .limit-tag { + background: #ff1e55; + color: white; + padding: 8rpx 16rpx; + font-size: 20rpx; + border-radius: 6rpx 0 0 6rpx; + } + + .limit-count { + background: #f0f0f0; + color: #000000; + padding: 8rpx 16rpx; + font-size: 20rpx; + border-radius: 0rpx 6rpx 6rpx 0; + } + + .remaining { + color: #808080; + font-size: 22rpx; + margin-left: auto; + } + } + } + + .price-section { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 40rpx; + + .price-container { + display: flex; + align-items: baseline; + + .currency { + font-size: 28rpx; + color: #333; + font-weight: bold; + } + + .price { + font-size: 40rpx; + color: #333; + font-weight: bold; + font-family: "Futura"; + } + } + + .collect-container { + display: flex; + align-items: center; + gap: 10rpx; + + .heart-icon { + width: 35rpx; + height: 29rpx; + transition: all 0.3s ease; + flex-shrink: 0; + + &.liked { + opacity: 1; + filter: hue-rotate(320deg) saturate(2); + } + + &:active { + transform: scale(1.2); + } + } + + .collect-count { + color: #231815; + font-size: 28rpx; + font-weight: 500; + } + } + } + + .equity-section { + margin-bottom: 40rpx; + border-top: 0.5rpx solid #e5e5e5; + border-bottom: 0.5rpx solid #e5e5e5; + padding: 40rpx 0; + + .equity-row { + display: flex; + justify-content: space-between; + gap: 20rpx; + + .equity-item { + text-align: left; + + .equity-label { + font-size: 23rpx; + color: #231815; + font-weight: bold; + margin-bottom: 10rpx; + line-height: 1.3; + } + + .equity-value { + font-size: 20rpx; + color: #595757; + font-weight: 500; + line-height: 1.3; + } + } + } + } + + .equity-title { + display: flex; + align-items: center; + justify-content: center; + margin: 40rpx 0 30rpx; + + .title-line { + width: 30rpx; + height: 2rpx; + background: #ff1e55; + } + + .title-text { + padding: 0 30rpx; + font-size: 25rpx; + color: #ff1e55; + font-weight: bold; + } + } + + .equity-details { + .equity-detail-item { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20rpx; + line-height: 1.5; + + .detail-content-wrapper { + display: flex; + flex: 1; + + .detail-label { + font-size: 23rpx; + color: #231815; + font-weight: 500; + } + + .detail-content { + font-size: 23rpx; + color: #231815; + flex: 1; + font-weight: 500; + } + } + + .toggle-icon { + display: flex; + align-items: center; + gap: 8rpx; + cursor: pointer; + padding: 10rpx; + margin-left: 20rpx; + + .icon-text { + font-size: 22rpx; + color: #666; + } + + .icon-arrow { + font-size: 20rpx; + color: #666; + transition: transform 0.3s ease; + transform: rotate(0deg); + + &.expanded { + transform: rotate(180deg); + } + } + + &:active { + opacity: 0.7; + } + } + } + } + } + + // Tab导航 + .tab-nav { + margin: 0 40rpx; + margin-top: 40rpx; + display: flex; + justify-content: space-between; + + .tab-item { + padding: 10rpx 20rpx; + text-align: center; + color: #3e3a39; + cursor: pointer; + transition: all 0.3s ease; + + &.active { + background-color: #ff1e55; + color: #fff; + border-radius: 20rpx 20rpx 0 0; + } + + .tab-text { + font-size: 23rpx; + font-weight: bold; + } + } + } + + // Tab切换区域 + .tab-section { + margin: 0 20rpx; + background-color: #fff; + border-radius: 20rpx; + overflow: hidden; + margin-bottom: calc(20px + constant(safe-area-inset-bottom)); + margin-bottom: calc(20px + env(safe-area-inset-bottom)); + + // Tab内容 + .tab-content { + padding: 30rpx; + + .tab-panel { + min-height: 400rpx; + + // 证书容器 + .certificate-container { + display: flex; + justify-content: center; + align-items: center; + + .certificate-image { + width: 100%; + max-width: 600rpx; + height: auto; + border-radius: 12rpx; + } + } + + // 信息内容 + .info-content { + padding: 20rpx 0; + + .info-item { + display: flex; + margin-bottom: 20rpx; + align-items: flex-start; + + .info-label { + font-size: 28rpx; + color: #666; + min-width: 160rpx; + flex-shrink: 0; + } + + .info-value { + font-size: 28rpx; + color: #333; + flex: 1; + line-height: 1.5; + } + } + } + + // 权益信息内容 + .equity-info-content { + padding: 20rpx 0; + + .equity-info-item { + display: flex; + margin-bottom: 20rpx; + align-items: flex-start; + + .equity-info-label { + font-size: 28rpx; + color: #666; + min-width: 160rpx; + flex-shrink: 0; + } + + .equity-info-value { + font-size: 28rpx; + color: #333; + flex: 1; + line-height: 1.5; + } + } + + .equity-description { + margin-top: 30rpx; + padding: 20rpx; + background-color: #f8f9fa; + border-radius: 12rpx; + + .description-text { + font-size: 26rpx; + color: #666; + line-height: 1.6; + } + } + } + } + } + } + + // 立即购买按钮 + .purchase-section { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: white; + padding: 20rpx 30rpx 40rpx; + border-top: 1rpx solid #e5e5e5; + z-index: 100; + padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); + padding-bottom: calc(constant(safe-area-inset-bottom) + 20rpx); + + .purchase-button { + width: 100%; + height: 88rpx; + background: linear-gradient(135deg, #ff1e55 0%, #ff4081 100%); + border-radius: 44rpx; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 8rpx 20rpx rgba(255, 30, 85, 0.3); + transition: all 0.3s ease; + + &:active { + transform: scale(0.98); + box-shadow: 0 4rpx 10rpx rgba(255, 30, 85, 0.2); + } + + .purchase-text { + font-size: 32rpx; + font-weight: bold; + color: white; + } + } + } + + // 为底部按钮预留空间 + .detail-container { + padding-bottom: 140rpx; + } + \ No newline at end of file diff --git a/subPackages/equityGoods/list.vue b/subPackages/equityGoods/list.vue index 798cf45..3ae87d5 100644 --- a/subPackages/equityGoods/list.vue +++ b/subPackages/equityGoods/list.vue @@ -2,6 +2,14 @@ + + 扬州 + + 扬州数字资产权益产品 @@ -338,4 +346,27 @@ justify-content: space-between; margin-bottom: 10rpx; } + .location-selector { + position: absolute; + top: 20rpx; + left: 20rpx; + display: flex; + align-items: center; + padding: 8rpx 16rpx; + // border: 2rpx solid #e0e0e0; + border-radius: 20rpx; + min-width: 100rpx; + margin-right: 20rpx; + + .location-text { + font-size: 30rpx; + color: white; + margin-right: 8rpx; + } + + .dropdown-icon { + width: 24rpx; + height: 16rpx; + } + } \ No newline at end of file diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue index a721cf4..d5d0ace 100644 --- a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -132,10 +132,10 @@ export default { * @param {Object} obj */ step(obj, config = {}) { - if (!this.animation) return + if (!this.animation) return this for (let i in obj) { try { - if (typeof this.animation[i] === 'function') { + if (this.animation && typeof this.animation[i] === 'function') { if(typeof obj[i] === 'object'){ this.animation[i](...obj[i]) }else{ @@ -143,11 +143,15 @@ export default { } } } catch (e) { - console.error(`方法 ${i} 不存在`) + console.error(`方法 ${i} 不存在:`, e) } } - if (this.animation && typeof this.animation.step === 'function') { - this.animation.step(config) + try { + if (this.animation && typeof this.animation.step === 'function') { + this.animation.step(config) + } + } catch (e) { + console.error('动画step执行错误:', e) } return this }, @@ -156,8 +160,12 @@ export default { */ run(fn) { if (!this.animation) return - if (typeof this.animation.run === 'function') { - this.animation.run(fn) + try { + if (this.animation && typeof this.animation.run === 'function') { + this.animation.run(fn) + } + } catch (e) { + console.error('动画执行错误:', e) } }, // 开始过度动画 @@ -174,12 +182,19 @@ export default { this.$nextTick(() => { // TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器 this.timer = setTimeout(() => { - this.animation = createAnimation(this.config, this) - if (this.animation) { - this.tranfromInit(false).step() - if (typeof this.animation.run === 'function') { - this.animation.run() + try { + this.animation = createAnimation(this.config, this) + if (this.animation) { + let result = this.tranfromInit(false) + if (result && typeof result.step === 'function') { + result.step() + if (typeof result.run === 'function') { + result.run() + } + } } + } catch (e) { + console.error('动画初始化错误:', e) } this.$emit('change', { detail: this.isShow @@ -190,19 +205,27 @@ export default { // 关闭过度动画 close(type) { if (!this.animation) return - this.tranfromInit(true) - .step() - .run(() => { - this.isShow = false - this.animationData = null - this.animation = null - let { opacity, transform } = this.styleInit(false) - this.opacity = opacity || 1 - this.transform = transform - this.$emit('change', { - detail: this.isShow - }) - }) + try { + let result = this.tranfromInit(true) + if (result && typeof result.step === 'function') { + result.step() + if (typeof result.run === 'function') { + result.run(() => { + this.isShow = false + this.animationData = null + this.animation = null + let { opacity, transform } = this.styleInit(false) + this.opacity = opacity || 1 + this.transform = transform + this.$emit('change', { + detail: this.isShow + }) + }) + } + } + } catch (e) { + console.error('动画关闭错误:', e) + } }, // 处理动画开始前的默认样式 styleInit(type) {