Browse Source

CI:appid更改

dev_des
1054425342@qq.com 3 months ago
parent
commit
0098af14d3
  1. 4
      App.vue
  2. 9
      components/CustomTabBar.vue
  3. 4
      components/ProductSection.vue
  4. 2
      manifest.json
  5. 6
      pages.json
  6. 7
      pages/index/index.vue
  7. 9
      pages/index/timeShopBank.vue
  8. 368
      pages/login/login.vue
  9. 706
      subPackages/equityGoods/detail.vue
  10. 4
      uni_modules/uni-transition/components/uni-transition/createAnimation.js
  11. 32
      uni_modules/uni-transition/components/uni-transition/uni-transition.vue

4
App.vue

@ -148,6 +148,10 @@
</script>
<style lang="scss">
@font-face {
font-family: 'Futura';
src: url(https://static.ticket.sz-trip.com/epicSoul/taozi/fonts/Futura.ttc);
}
/*每个页面公共css */
@import '@/uni_modules/uni-scss/index.scss';
@import "@/static/css/base.css";

9
components/CustomTabBar.vue

@ -35,10 +35,15 @@ export default {
selectColor: "#00FF00",
text: "阅读体",
},
// {
// pagePath: "pages/index/sensoryStore",
// selectColor: "#00FF00",
// text: "",
// },
{
pagePath: "pages/index/sensoryStore",
pagePath: "pages/index/timeShopBank",
selectColor: "#00FF00",
text: "有感商店",
text: "时间银行",
},
{
pagePath: "pages/index/intelligentAgent",

4
components/ProductSection.vue

@ -2,9 +2,9 @@
<view class="product-section">
<!-- 商品标题区域 -->
<view class="title-section" :style="{ background: titleBgColor }">
<div style="display: flex; align-items: center">
<div style="display: flex; align-items: center" @click="handleMoreClick">
<text class="title">{{ title }}</text>
<text class="more-btn" @click="handleMoreClick">更多</text>
<text class="more-btn">更多</text>
</div>
</view>

2
manifest.json

@ -1,6 +1,6 @@
{
"name" : "EpicSoul",
"appid" : "__UNI__14D5937",
"appid" : "__UNI__3D606DD",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",

6
pages.json

@ -198,6 +198,12 @@
"style": {
"navigationBarTitleText": "权益商品"
}
},
{
"path": "equityGoods/detail",
"style": {
"navigationBarTitleText": "权益商品"
}
}

7
pages/index/index.vue

@ -17,7 +17,7 @@
title="权益商品"
:productList="productList"
moreUrl="/subPackages/equityGoods/index"
detailUrlPrefix="/subPackages/techan/detail"
detailUrlPrefix="/subPackages/equityGoods/detail"
@more-click="goToMore"
@product-click="goToDetail"
@like-toggle="handleLikeToggle"
@ -90,7 +90,7 @@ export default {
],
productListFeeling: [
{
id: 1,
id: 32,
image:
"https://epic.js-dyyj.com/uploads/20250728/22e319f3feb1b63fbb539d425c51fe70.png",
title: "OUT OF SPACE 东方线香",
@ -99,7 +99,7 @@ export default {
isShop:true
},
{
id: 2,
id: 32,
image:
"https://epic.js-dyyj.com/uploads/20250728/cc9907153c887a6428283a407928db9a.png",
title: "AI-Agent智能玩具",
@ -118,7 +118,6 @@ export default {
},
onPageScroll(e) {
// ID
console.log('index页面滚动事件:', e.scrollTop);
uni.$emit("pageScroll_index_page", e.scrollTop);
},
onReachBottom() {},

9
pages/index/timeShopBank.vue

@ -141,7 +141,6 @@ export default {
// -
onPageScroll(e) {
// ID
console.log('timeShopBank页面滚动事件:', e.scrollTop);
uni.$emit('pageScroll_timeShopBank_page', e.scrollTop);
},
methods: {
@ -213,7 +212,6 @@ export default {
//
handleItemAdded(item) {
console.log("项目已添加:", item.title);
},
//
@ -229,11 +227,7 @@ export default {
}
this.waterfallItems.push(...newItems);
uni.showToast({
title: "已加载10篇新文章",
icon: "success",
duration: 1500,
});
},
// Tab
@ -246,7 +240,6 @@ export default {
// tab
loadTabContent(tabId) {
// tabId
console.log('切换到tab:', tabId);
//
this.initializeData();
},

368
pages/login/login.vue

@ -1,32 +1,59 @@
<template>
<view class="content" style="overflow-x: auto;">
<view class="content">
<!-- 顶部导航栏 -->
<view class="search-header" :style="{'height': height+'px','padding-top':statusBarHeight+'px'}">
<view class="title">epic soul</view>
<view class="title">Epic Soul</view>
<view class="subtitle">大运河非物质文化遗产</view>
</view>
<view :style="{'height':height+'px','flex-shrink':0}"></view>
<div style="padding-top: 88rpx;">
<div class="login-tip">epic soul 申请获得</div>
<div class="login-tip2">以下权限</div>
<div class="login-tip-box">
<text>获得你的公开信息昵称头像地区及性别</text>
</div>
<div class="btn-box">
<button bindtap="cancel" type="default" @click="redirectIndex">取消</button>
<button type="primary" @click="getUserInfo">同意</button>
</div>
<div class="flex-center article-box">
<radio-group @change="toggleAgreement">
<radio value="1" :checked="isAgreed" style="transform:scale(0.7)"></radio>
</radio-group>
<div>同意<text @click="gotoInfo">用户服务协议隐私政策</text></div>
</div>
<!-- 主要内容区域 -->
<view class="main-content">
<!-- 权限申请卡片 -->
<view class="permission-card">
<view class="app-icon">
<text class="icon-text">ES</text>
</view>
<view class="login-tip">Epic Soul 申请获得</view>
<view class="login-tip2">以下权限</view>
<view class="login-tip-box">
<view class="permission-item">
<text class="permission-icon">👤</text>
<text class="permission-text">获得你的公开信息昵称头像地区及性别</text>
</view>
</view>
</view>
<!-- 按钮区域 -->
<view class="btn-container">
<view class="btn-box">
<button class="cancel-btn" @click="redirectIndex">取消</button>
<button class="confirm-btn" @click="getUserInfo">同意</button>
</view>
<!-- 协议同意区域 -->
<view class="agreement-box">
<radio-group @change="toggleAgreement">
<label class="agreement-label">
<radio value="1" :checked="isAgreed" class="agreement-radio"></radio>
<text class="agreement-text">同意</text>
<text class="agreement-link" @click="gotoInfo">用户服务协议隐私政策</text>
</label>
</radio-group>
</view>
</view>
<!-- 手机号授权弹窗 -->
<uni-popup ref="popup" type="bottom" background-color="#fff">
<button type="default" open-type="getPhoneNumber" @getphonenumber="handlePhoneNumber" style="width: 100%;height: 12vh;line-height: 12vh;">点击授权手机号</button>
<view class="phone-auth-popup">
<view class="popup-title">手机号授权</view>
<view class="popup-desc">为了更好地为您提供服务需要获取您的手机号</view>
<button class="phone-auth-btn" open-type="getPhoneNumber" @getphonenumber="handlePhoneNumber">
点击授权手机号
</button>
</view>
</uni-popup>
</div>
</view>
</view>
</template>
@ -174,85 +201,274 @@ export default {
</script>
<style scoped lang="scss">
.search-header{
width: 100%;
position: fixed;
//
.content {
min-height: 100vh;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
position: relative;
}
//
.search-header {
width: 100%;
position: fixed;
top: 0;
left: 0;
right: 0;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
text-align: center;
z-index: 99;
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
.title {
font-size: 32rpx;
font-weight: 600;
color: #2c3e50;
letter-spacing: 1rpx;
}
.subtitle {
font-size: 24rpx;
color: #7f8c8d;
margin-top: 4rpx;
}
}
//
.main-content {
padding: 120rpx 40rpx 40rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 120rpx);
}
//
.permission-card {
background: white;
border-radius: 24rpx;
padding: 60rpx 40rpx;
margin-bottom: 60rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);
text-align: center;
position: relative;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
background: white;
text-align: center;
z-index:99;
.title{
font-size: 30rpx
}
.subtitle{
font-size: 22rpx;
}
height: 8rpx;
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
border-radius: 24rpx 24rpx 0 0;
}
}
.content {
min-height: 100vh;
//
.app-icon {
width: 120rpx;
height: 120rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 24rpx;
margin: 0 auto 40rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8rpx 24rpx rgba(102, 126, 234, 0.3);
.icon-text {
color: white;
font-size: 36rpx;
font-weight: bold;
letter-spacing: 2rpx;
}
}
//
.login-tip {
font-size: 28rpx;
margin: 0 60rpx;
margin-top: 40rpx;
font-size: 32rpx;
color: #2c3e50;
margin-bottom: 16rpx;
font-weight: 500;
}
.login-tip2 {
font-size: 44rpx;
margin: 0rpx 60rpx;
margin-top: 20rpx;
font-weight: 400;
font-size: 48rpx;
color: #2c3e50;
margin-bottom: 40rpx;
font-weight: 600;
}
//
.login-tip-box {
display: flex;
align-items: flex-start;
margin: 0 60rpx;
font-size: 28rpx;
margin-top: 40rpx;
line-height: 40rpx;
background: #f8f9fa;
border-radius: 16rpx;
padding: 32rpx;
margin-top: 32rpx;
border-left: 6rpx solid #667eea;
}
.login-tip-box .icon-gou1 {
line-height: 80rpx;
margin-top: -20rpx;
margin-right: 30rpx;
color: #666;
}
.permission-item {
display: flex;
align-items: flex-start;
gap: 16rpx;
.btn-box {
display: flex;
position: absolute;
bottom: 100rpx;
left: 0;
right: 0;
.permission-icon {
font-size: 32rpx;
line-height: 1;
margin-top: 4rpx;
}
.permission-text {
font-size: 28rpx;
color: #5a6c7d;
line-height: 1.6;
flex: 1;
}
}
.btn-box button {
width: 400rpx;
//
.btn-container {
margin-top: auto;
}
.article-box {
position: absolute;
left: 0;
right: 0;
justify-content: center;
font-size: 24rpx;
color: #1aad19;
bottom: 40rpx;
//
.btn-box {
display: flex;
gap: 24rpx;
margin-bottom: 40rpx;
button {
flex: 1;
height: 88rpx;
border-radius: 44rpx;
font-size: 32rpx;
font-weight: 500;
border: none;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
&::after {
border: none;
}
}
.cancel-btn {
background: #f8f9fa;
color: #6c757d;
border: 2rpx solid #e9ecef;
&:active {
background: #e9ecef;
transform: scale(0.98);
}
}
.confirm-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
box-shadow: 0 6rpx 20rpx rgba(102, 126, 234, 0.4);
&:active {
transform: scale(0.98);
box-shadow: 0 4rpx 16rpx rgba(102, 126, 234, 0.3);
}
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
transition: left 0.5s;
}
&:active::before {
left: 100%;
}
}
}
.article-box .iconfont {
margin-right: 10rpx;
font-size: 26rpx;
//
.agreement-box {
display: flex;
justify-content: center;
align-items: center;
.agreement-label {
display: flex;
align-items: center;
gap: 12rpx;
cursor: pointer;
}
.agreement-radio {
transform: scale(0.8);
margin: 0;
}
.agreement-text {
font-size: 26rpx;
color: #6c757d;
}
.agreement-link {
font-size: 26rpx;
color: #667eea;
text-decoration: underline;
margin-left: 8rpx;
&:active {
color: #5a67d8;
}
}
}
.article-box text {
border-bottom: 1px solid;
//
.phone-auth-popup {
padding: 60rpx 40rpx;
text-align: center;
border-radius: 24rpx 24rpx 0 0;
.popup-title {
font-size: 36rpx;
font-weight: 600;
color: #2c3e50;
margin-bottom: 24rpx;
}
.popup-desc {
font-size: 28rpx;
color: #6c757d;
line-height: 1.6;
margin-bottom: 60rpx;
}
.phone-auth-btn {
width: 100%;
height: 88rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 44rpx;
font-size: 32rpx;
font-weight: 500;
box-shadow: 0 6rpx 20rpx rgba(102, 126, 234, 0.4);
transition: all 0.3s ease;
&::after {
border: none;
}
&:active {
transform: scale(0.98);
box-shadow: 0 4rpx 16rpx rgba(102, 126, 234, 0.3);
}
}
}
</style>

706
subPackages/equityGoods/detail.vue

@ -0,0 +1,706 @@
<template>
<view class="detail-container">
<!-- 轮播图区域 -->
<view class="banner-content">
<swiper
class="top-banner"
:circular="true"
:interval="6000"
:duration="800"
:indicator-dots="false"
:autoplay="true"
@change="swiperChange"
>
<swiper-item v-for="(item, index) in topBanner" :key="index">
<image
class="top-banner"
:src="showImg(item)"
mode="aspectFill"
></image>
</swiper-item>
</swiper>
<view class="dot-container">
<view
:class="['dot-line', index == swiperIndex ? 'active' : '']"
v-for="(item, index) in topBanner"
:key="index"
></view>
</view>
<!-- 页码指示器 -->
<view class="page-indicator">
<text class="page-text"
>{{ swiperIndex + 1 }}/{{ topBanner.length }}</text
>
</view>
</view>
<!-- 商品信息区域 -->
<view class="product-info">
<!-- 标题和标签 -->
<view class="title-section">
<view class="product-title">食在苏州世界美食之都巡礼</view>
<view class="tags-container">
<view class="limit-tag">限量</view>
<view class="limit-count">1000</view>
<view class="remaining">剩余 900</view>
</view>
</view>
<!-- 价格和收藏 -->
<view class="price-section">
<view class="price-container">
<text class="currency">¥</text>
<text class="price">699.00</text>
</view>
<view class="collect-container">
<image
class="heart-icon"
src="https://epic.js-dyyj.com/uploads/20250728/2f3ae212c01fa3b67be81abc5723cf5c.png"
@click.stop="handleLikeClick(item, index)"
></image>
<text class="collect-count">1700收藏</text>
</view>
</view>
<!-- 权益信息 -->
<view class="equity-section">
<view class="equity-row">
<view class="equity-item">
<view class="equity-label">创作数字资产所属方者</view>
<view class="equity-value">苏州xxx博物馆</view>
</view>
<view class="equity-item">
<view class="equity-label">数字资产权力方</view>
<view class="equity-value">江苏大运河见</view>
</view>
<view class="equity-item">
<view class="equity-label">备案平台</view>
<view class="equity-value">江苏文交所</view>
</view>
</view>
</view>
<!-- 权益信息标题 -->
<view class="equity-title">
<view class="title-line"></view>
<text class="title-text">权益信息</text>
<view class="title-line"></view>
</view>
<!-- 权益详情 -->
<view class="equity-details">
<!-- 显示前两个权益项 -->
<view
class="equity-detail-item"
v-for="(item, index) in displayEquityList"
:key="index"
>
<view class="detail-content-wrapper">
<text class="detail-label">{{ item.label }}</text>
<text class="detail-content">{{ item.content }}</text>
</view>
<!-- 在最后一个显示项的右侧添加展开收起图标 -->
<view
v-if="index === displayEquityList.length - 1"
class="toggle-icon"
@click="toggleEquityExpand"
>
<text class="icon-text">{{
isEquityExpanded ? "收起" : "展开"
}}</text>
<text class="icon-arrow" :class="{ expanded: isEquityExpanded }"
></text
>
</view>
</view>
</view>
</view>
<!-- Tab切换区域 -->
<view class="tab-nav">
<view
v-for="(tab, index) in tabList"
:key="index"
:class="['tab-item', { active: currentTab === index }]"
@click="switchTab(index)"
>
<text class="tab-text">{{ tab.name }}</text>
</view>
</view>
<view class="tab-section">
<!-- Tab导航 -->
<!-- Tab内容 -->
<view class="tab-content">
<!-- 登记证书 -->
<view v-if="currentTab === 0" class="tab-panel">
<view class="certificate-container">
<image
class="certificate-image"
src="https://epic.js-dyyj.com/uploads/20250731/d7d5be03617e3cce94dc34e8de426395.png"
mode="widthFix"
></image>
</view>
</view>
<!-- IP资产详情 -->
<view v-if="currentTab === 1" class="tab-panel">
<view class="info-content">
<view class="info-item">
<text class="info-label">IP资产名称</text>
<text class="info-value">食在苏州世界美食之都巡礼</text>
</view>
<view class="info-item">
<text class="info-label">创作者</text>
<text class="info-value">苏州xxx博物馆</text>
</view>
<view class="info-item">
<text class="info-label">发行数量</text>
<text class="info-value">1000</text>
</view>
<view class="info-item">
<text class="info-label">发行时间</text>
<text class="info-value">2024年6月16日</text>
</view>
</view>
</view>
<!-- 数据商品详情 -->
<view v-if="currentTab === 2" class="tab-panel">
<image
:src="
showImg('/uploads/20250731/ecf91ddfb9f89658a7d82e3ff846f71c.png')
"
style="width: 100%"
mode="widthFix"
></image>
</view>
<!-- 权益信息 -->
<view v-if="currentTab === 3" class="tab-panel">
<view class="equity-info-content">
<view
class="equity-info-item"
v-for="(item, index) in equityList"
:key="index"
>
<text class="equity-info-label">{{ item.label }}</text>
<text class="equity-info-value">{{ item.content }}</text>
</view>
<view class="equity-description">
<text class="description-text">
本数字文创作品基于区块链技术发行具有唯一性和不可篡改性持有者享有以下权益
1.
数字资产所有权获得该数字文创作品的完整所有权包括展示收藏等权利
2.
实物权益兑换可凭此数字资产兑换相应的实物文创产品包括限量版公仔纪念品等
3.
文化体验权益享受苏州相关文化场所的优惠门票专属活动参与资格等特殊权益
4.
增值收益权作为限量发行的数字资产具有一定的收藏价值和增值潜力
5.
社区会员权益加入专属收藏者社区享受优先购买新品参与线下活动等会员特权
以上权益的具体实施细则以官方最终解释为准部分权益可能存在时效性限制
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 立即购买按钮 -->
<view class="purchase-section">
<view class="purchase-button" @click="handlePurchase">
<text class="purchase-text">立即购买</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
topBanner: [
"/uploads/20250731/5f6f00e6f037c5ca03423b3ed190c20d.png",
"/uploads/20250731/5f6f00e6f037c5ca03423b3ed190c20d.png",
],
list: [],
swiperIndex: 0,
isEquityExpanded: false, //
currentTab: 0, // tab
tabList: [
{ name: "登记证书" },
{ name: "IP资产详情" },
{ name: "资源商品详情" },
{ name: "权益信息详情" },
],
equityList: [
//
{ label: "权益1:", content: "数字资产*1、数字资产*1" },
{ label: "权益2:", content: "IP文创公仔*1、IP文创公仔*1" },
{ label: "权益3:", content: "XX园林门票*1、XX园林门票*1" },
],
};
},
computed: {
//
displayEquityList() {
return this.isEquityExpanded
? this.equityList
: this.equityList.slice(0, 2);
},
},
methods: {
swiperChange(e) {
this.swiperIndex = e.detail.current;
},
//
toggleEquityExpand() {
this.isEquityExpanded = !this.isEquityExpanded;
},
//
handlePurchase() {
console.log("立即购买");
//
},
//
handleLikeClick(item, index) {
console.log("收藏点击", item, index);
//
},
// tab
switchTab(index) {
this.currentTab = index;
},
},
};
</script>
<style lang="scss" scoped>
.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: 17rpx;
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;
}
</style>

4
uni_modules/uni-transition/components/uni-transition/createAnimation.js

@ -112,7 +112,9 @@ const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
MPAnimation.prototype[type] = function(...args) {
// #ifndef APP-NVUE
this.animation[type](...args)
if (this.animation && typeof this.animation[type] === 'function') {
this.animation[type](...args)
}
// #endif
// #ifdef APP-NVUE
this._nvuePushAnimates(type, args)

32
uni_modules/uni-transition/components/uni-transition/uni-transition.vue

@ -135,16 +135,20 @@ export default {
if (!this.animation) return
for (let i in obj) {
try {
if(typeof obj[i] === 'object'){
this.animation[i](...obj[i])
}else{
this.animation[i](obj[i])
if (typeof this.animation[i] === 'function') {
if(typeof obj[i] === 'object'){
this.animation[i](...obj[i])
}else{
this.animation[i](obj[i])
}
}
} catch (e) {
console.error(`方法 ${i} 不存在`)
}
}
this.animation.step(config)
if (this.animation && typeof this.animation.step === 'function') {
this.animation.step(config)
}
return this
},
/**
@ -152,7 +156,9 @@ export default {
*/
run(fn) {
if (!this.animation) return
this.animation.run(fn)
if (typeof this.animation.run === 'function') {
this.animation.run(fn)
}
},
//
open() {
@ -169,8 +175,12 @@ export default {
// TODO
this.timer = setTimeout(() => {
this.animation = createAnimation(this.config, this)
this.tranfromInit(false).step()
this.animation.run()
if (this.animation) {
this.tranfromInit(false).step()
if (typeof this.animation.run === 'function') {
this.animation.run()
}
}
this.$emit('change', {
detail: this.isShow
})
@ -217,6 +227,7 @@ export default {
},
//
tranfromInit(type) {
if (!this.animation) return this
let buildTranfrom = (type, mode) => {
let aniNum = null
if (mode === 'fade') {
@ -236,7 +247,10 @@ export default {
aniNum = type ? '100%' : '0'
}
}
this.animation[this.animationMode()[mode]](aniNum)
let methodName = this.animationMode()[mode]
if (this.animation && typeof this.animation[methodName] === 'function') {
this.animation[methodName](aniNum)
}
}
if (typeof this.modeClass === 'string') {
buildTranfrom(type, this.modeClass)

Loading…
Cancel
Save