feat: 优化UI设计并重构样式系统
refactor(components): 重构ElCard、FlipGrid、YifanSelector和PaymentPopup组件样式 refactor(pages): 优化地址管理、商品详情、订单列表、积分记录和活动页面UI style: 更新uni.scss全局样式变量和设计系统 docs: 添加说明文档记录UI优化进度
This commit is contained in:
parent
dd12d8e500
commit
6f7207da2d
45
App.vue
45
App.vue
@ -17,6 +17,49 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style lang="scss">
|
||||||
/*每个页面公共css */
|
/*每个页面公共css */
|
||||||
|
@import '@/uni.scss';
|
||||||
|
|
||||||
|
page {
|
||||||
|
background-color: $bg-page;
|
||||||
|
color: $text-main;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
padding: $spacing-lg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Global Keyframes */
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
@keyframes fadeInDown {
|
||||||
|
from { opacity: 0; transform: translateY(-30rpx); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from { opacity: 0; transform: translateY(30rpx); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
@keyframes slideUp {
|
||||||
|
from { opacity: 0; transform: translateY(100%); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
@keyframes zoomIn {
|
||||||
|
from { opacity: 0; transform: scale(0.9); }
|
||||||
|
to { opacity: 1; transform: scale(1); }
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.05); }
|
||||||
|
100% { transform: scale(1); }
|
||||||
|
}
|
||||||
|
@keyframes float {
|
||||||
|
0% { transform: translateY(0); }
|
||||||
|
50% { transform: translateY(-20rpx); }
|
||||||
|
100% { transform: translateY(0); }
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -147,3 +147,19 @@ export function getShipments(user_id, page = 1, page_size = 20) {
|
|||||||
export function getUserInvites(user_id, page = 1, page_size = 20) {
|
export function getUserInvites(user_id, page = 1, page_size = 20) {
|
||||||
return authRequest({ url: `/api/app/users/${user_id}/invites`, method: 'GET', data: { page, page_size } })
|
return authRequest({ url: `/api/app/users/${user_id}/invites`, method: 'GET', data: { page, page_size } })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// 兼容性适配接口 (适配 pages/mine/index.vue)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
export function getUserInfo() {
|
||||||
|
const user_info = uni.getStorageSync('user_info')
|
||||||
|
if (user_info) return Promise.resolve(user_info)
|
||||||
|
return authRequest({ url: '/api/app/users/info', method: 'GET' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getUserTasks = getTasks
|
||||||
|
export function getInviteRecords(page = 1, page_size = 20) {
|
||||||
|
const user_id = uni.getStorageSync('user_id')
|
||||||
|
return getUserInvites(user_id, page, page_size)
|
||||||
|
}
|
||||||
|
|||||||
@ -20,11 +20,36 @@ const shadowClass = computed(() => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
.ep-card { background: #fff; border-radius: 12rpx; overflow: hidden; border: 1rpx solid #eee }
|
.ep-card {
|
||||||
.is-always-shadow { box-shadow: 0 6rpx 16rpx rgba(0,0,0,0.06) }
|
background: $bg-card;
|
||||||
.is-hover-shadow { box-shadow: 0 6rpx 16rpx rgba(0,0,0,0.06) }
|
border: 1rpx solid $border-color-light;
|
||||||
.is-no-shadow { box-shadow: none }
|
border-radius: $radius-lg;
|
||||||
.ep-card__header { padding: 12rpx 16rpx; border-bottom: 1rpx solid #f0f0f0 }
|
overflow: hidden;
|
||||||
.ep-card__body { padding: 12rpx 16rpx }
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-always-shadow {
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-hover-shadow {
|
||||||
|
/* 在移动端hover效果不如PC明显,这里可以处理为点击态 */
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-no-shadow {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ep-card__header {
|
||||||
|
padding: $spacing-sm $spacing-md;
|
||||||
|
border-bottom: 1rpx solid $border-color-light;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $text-main;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ep-card__body {
|
||||||
|
padding: $spacing-md;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, defineExpose } from 'vue'
|
import { ref } from 'vue'
|
||||||
|
|
||||||
const props = defineProps({ rewards: { type: Array, default: () => [] }, controls: { type: Boolean, default: true } })
|
const props = defineProps({ rewards: { type: Array, default: () => [] }, controls: { type: Boolean, default: true } })
|
||||||
const emit = defineEmits(['draw'])
|
const emit = defineEmits(['draw'])
|
||||||
@ -64,7 +64,7 @@ function onPreview(cell) {
|
|||||||
defineExpose({ revealResults, reset })
|
defineExpose({ revealResults, reset })
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 翻牌动画组件
|
奇盒潮玩 - 翻牌动画组件
|
||||||
采用暖橙色调的开箱效果
|
采用暖橙色调的开箱效果
|
||||||
@ -73,34 +73,40 @@ defineExpose({ revealResults, reset })
|
|||||||
.flip-root {
|
.flip-root {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 20rpx;
|
gap: $spacing-md;
|
||||||
padding: 20rpx;
|
padding: $spacing-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-actions {
|
.flip-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16rpx;
|
gap: $spacing-sm;
|
||||||
}
|
}
|
||||||
.flip-btn {
|
.flip-btn {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35) !important;
|
background: $gradient-brand !important;
|
||||||
color: #FFFFFF !important;
|
color: #FFFFFF !important;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-md;
|
||||||
}
|
border: none;
|
||||||
.flip-btn:active {
|
font-size: $font-md;
|
||||||
transform: scale(0.97);
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.97);
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-grid {
|
.flip-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, 1fr);
|
grid-template-columns: repeat(4, 1fr);
|
||||||
gap: 16rpx;
|
gap: $spacing-sm;
|
||||||
background: rgba(255, 255, 255, 0.5);
|
background: rgba(255, 255, 255, 0.5);
|
||||||
backdrop-filter: blur(10rpx);
|
backdrop-filter: blur(10px);
|
||||||
border-radius: 24rpx;
|
border-radius: $radius-lg;
|
||||||
padding: 16rpx;
|
padding: $spacing-sm;
|
||||||
|
box-shadow: inset 0 0 20rpx rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-card {
|
.flip-card {
|
||||||
@ -124,7 +130,7 @@ defineExpose({ revealResults, reset })
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
backface-visibility: hidden;
|
backface-visibility: hidden;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,15 +139,15 @@ defineExpose({ revealResults, reset })
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border: 2rpx solid rgba(255, 159, 67, 0.2);
|
border: 2rpx solid rgba($brand-primary, 0.2);
|
||||||
box-shadow: 0 4rpx 12rpx rgba(255, 159, 67, 0.15);
|
box-shadow: $shadow-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
.front-placeholder {
|
.front-placeholder {
|
||||||
width: 60%;
|
width: 60%;
|
||||||
height: 60%;
|
height: 60%;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
background: linear-gradient(135deg, rgba(255, 159, 67, 0.3), rgba(255, 107, 53, 0.2));
|
background: linear-gradient(135deg, rgba($brand-primary, 0.3), rgba($brand-primary-light, 0.2));
|
||||||
animation: pulse 2s ease-in-out infinite;
|
animation: pulse 2s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
@keyframes pulse {
|
@keyframes pulse {
|
||||||
@ -150,28 +156,28 @@ defineExpose({ revealResults, reset })
|
|||||||
}
|
}
|
||||||
|
|
||||||
.flip-back {
|
.flip-back {
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
transform: rotateY(180deg);
|
transform: rotateY(180deg);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 16rpx;
|
padding: $spacing-sm;
|
||||||
border: 2rpx solid rgba(255, 159, 67, 0.3);
|
border: 2rpx solid rgba($brand-primary, 0.3);
|
||||||
box-shadow: 0 8rpx 24rpx rgba(255, 107, 53, 0.2);
|
box-shadow: $shadow-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-image {
|
.flip-image {
|
||||||
width: 75%;
|
width: 75%;
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-sm;
|
||||||
margin-bottom: 8rpx;
|
margin-bottom: $spacing-xs;
|
||||||
background: linear-gradient(145deg, #FFF8F3, #FFF4E6);
|
background: linear-gradient(145deg, #FFF8F3, #FFF4E6);
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-title {
|
.flip-title {
|
||||||
font-size: 24rpx;
|
font-size: $font-xs;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
@ -184,13 +190,17 @@ defineExpose({ revealResults, reset })
|
|||||||
}
|
}
|
||||||
|
|
||||||
.flip-reset {
|
.flip-reset {
|
||||||
background: linear-gradient(135deg, #FFD166, #FF9F43) !important;
|
background: linear-gradient(135deg, $accent-gold, $brand-primary-light) !important;
|
||||||
color: #6b4b1f !important;
|
color: #6b4b1f !important;
|
||||||
border-radius: 999rpx;
|
border-radius: 999rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 159, 67, 0.35);
|
box-shadow: $shadow-sm;
|
||||||
}
|
font-size: $font-sm;
|
||||||
.flip-reset:active {
|
padding: 0 40rpx;
|
||||||
transform: scale(0.96);
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -133,7 +133,7 @@ function handleConfirm() {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 支付弹窗组件
|
奇盒潮玩 - 支付弹窗组件
|
||||||
采用暖橙色调的底部弹窗设计
|
采用暖橙色调的底部弹窗设计
|
||||||
@ -153,11 +153,11 @@ function handleConfirm() {
|
|||||||
|
|
||||||
.payment-popup-content {
|
.payment-popup-content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 32rpx 32rpx 0 0;
|
border-radius: $radius-xl $radius-xl 0 0;
|
||||||
padding: 32rpx;
|
padding: $spacing-lg;
|
||||||
padding-bottom: calc(32rpx + constant(safe-area-inset-bottom));
|
padding-bottom: calc($spacing-lg + constant(safe-area-inset-bottom));
|
||||||
padding-bottom: calc(32rpx + env(safe-area-inset-bottom));
|
padding-bottom: calc($spacing-lg + env(safe-area-inset-bottom));
|
||||||
animation: slideUp 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
animation: slideUp 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
}
|
}
|
||||||
@keyframes slideUp {
|
@keyframes slideUp {
|
||||||
@ -168,10 +168,10 @@ function handleConfirm() {
|
|||||||
.risk-warning {
|
.risk-warning {
|
||||||
background: linear-gradient(135deg, #FFF8F3, #FFF4E6);
|
background: linear-gradient(135deg, #FFF8F3, #FFF4E6);
|
||||||
color: #B45309;
|
color: #B45309;
|
||||||
font-size: 24rpx;
|
font-size: $font-xs;
|
||||||
padding: 20rpx 24rpx;
|
padding: $spacing-sm $spacing-md;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: $spacing-md;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@ -182,7 +182,7 @@ function handleConfirm() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.agreement-link {
|
.agreement-link {
|
||||||
color: #FF9F43;
|
color: $brand-primary;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,13 +190,13 @@ function handleConfirm() {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 32rpx;
|
margin-bottom: $spacing-lg;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.popup-title {
|
.popup-title {
|
||||||
font-size: 36rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
.close-icon {
|
.close-icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -204,96 +204,96 @@ function handleConfirm() {
|
|||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
font-size: 48rpx;
|
font-size: 48rpx;
|
||||||
color: #9CA3AF;
|
color: $text-placeholder;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 10rpx;
|
padding: 10rpx;
|
||||||
transition: color 0.2s ease;
|
transition: color 0.2s ease;
|
||||||
}
|
}
|
||||||
.close-icon:active {
|
.close-icon:active {
|
||||||
color: #6B7280;
|
color: $text-secondary;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popup-body {
|
.popup-body {
|
||||||
padding: 16rpx 0 24rpx;
|
padding: $spacing-sm 0 $spacing-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.amount-section {
|
.amount-section {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-bottom: 40rpx;
|
margin-bottom: $spacing-xl;
|
||||||
padding: 24rpx;
|
padding: $spacing-md;
|
||||||
background: linear-gradient(145deg, #FFFFFF, #FFF8F3);
|
background: linear-gradient(145deg, #FFFFFF, #FFF8F3);
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
border: 1rpx solid rgba(255, 159, 67, 0.1);
|
border: 1rpx solid rgba(255, 159, 67, 0.1);
|
||||||
}
|
}
|
||||||
.amount-section .label {
|
.amount-section .label {
|
||||||
font-size: 28rpx;
|
font-size: $font-sm;
|
||||||
color: #6B7280;
|
color: $text-secondary;
|
||||||
margin-right: 10rpx;
|
margin-right: $spacing-xs;
|
||||||
}
|
}
|
||||||
.amount-section .amount {
|
.amount-section .amount {
|
||||||
font-size: 56rpx;
|
font-size: 56rpx;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
background: linear-gradient(135deg, #FF6B35, #FF9F43);
|
background: $gradient-brand;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-item {
|
.form-item {
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: $spacing-md;
|
||||||
}
|
}
|
||||||
.form-item .label {
|
.form-item .label {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 28rpx;
|
font-size: $font-sm;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-xs;
|
||||||
}
|
}
|
||||||
|
|
||||||
.picker-display {
|
.picker-display {
|
||||||
border: 2rpx solid #E5E7EB;
|
border: 2rpx solid $border-color-light;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
padding: 24rpx;
|
padding: $spacing-md;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 28rpx;
|
font-size: $font-sm;
|
||||||
background: #F9FAFB;
|
background: $bg-page;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
}
|
}
|
||||||
.picker-display:active {
|
.picker-display:active {
|
||||||
border-color: #FF9F43;
|
border-color: $brand-primary;
|
||||||
background: #FFF8F3;
|
background: #FFF8F3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selected-text {
|
.selected-text {
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
.placeholder {
|
.placeholder {
|
||||||
color: #9CA3AF;
|
color: $text-placeholder;
|
||||||
}
|
}
|
||||||
.arrow {
|
.arrow {
|
||||||
color: #9CA3AF;
|
color: $text-placeholder;
|
||||||
width: 16rpx;
|
width: 16rpx;
|
||||||
height: 16rpx;
|
height: 16rpx;
|
||||||
border-right: 3rpx solid #9CA3AF;
|
border-right: 3rpx solid $text-placeholder;
|
||||||
border-bottom: 3rpx solid #9CA3AF;
|
border-bottom: 3rpx solid $text-placeholder;
|
||||||
transform: rotate(-45deg);
|
transform: rotate(-45deg);
|
||||||
margin-right: 8rpx;
|
margin-right: $spacing-xs;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popup-footer {
|
.popup-footer {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20rpx;
|
gap: $spacing-md;
|
||||||
margin-top: 16rpx;
|
margin-top: $spacing-sm;
|
||||||
}
|
}
|
||||||
.btn-cancel, .btn-confirm {
|
.btn-cancel, .btn-confirm {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 24rpx;
|
border-radius: $radius-lg;
|
||||||
font-size: 32rpx;
|
font-size: $font-md;
|
||||||
padding: 24rpx 0;
|
padding: $spacing-md 0;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
@ -302,19 +302,19 @@ function handleConfirm() {
|
|||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
.btn-cancel {
|
.btn-cancel {
|
||||||
color: #6B7280;
|
color: $text-secondary;
|
||||||
background: #F3F4F6;
|
background: #F3F4F6;
|
||||||
}
|
}
|
||||||
.btn-cancel:active {
|
.btn-cancel:active {
|
||||||
background: #E5E7EB;
|
background: $border-color-light;
|
||||||
}
|
}
|
||||||
.btn-confirm {
|
.btn-confirm {
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-lg;
|
||||||
}
|
}
|
||||||
.btn-confirm:active {
|
.btn-confirm:active {
|
||||||
transform: scale(0.97);
|
transform: scale(0.97);
|
||||||
box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.25);
|
box-shadow: $shadow-md;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -290,62 +290,94 @@ async function onPaymentConfirm(paymentData) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 选号组件 (适配高级卡片布局)
|
奇盒潮玩 - 选号组件 (适配高级卡片布局)
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
/* 容器 - 去除背景,融入父级卡片 */
|
/* 容器 - 去除背景,融入父级卡片 */
|
||||||
.choice-grid-container {
|
.choice-grid-container {
|
||||||
padding: 10rpx 0;
|
padding: $spacing-xs 0;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 加载和空状态 */
|
/* 加载和空状态 */
|
||||||
.loading-state, .empty-state {
|
.loading-state, .empty-state {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 60rpx 0;
|
padding: 80rpx 0;
|
||||||
color: #9CA3AF;
|
color: $text-placeholder;
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20rpx;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '📦';
|
||||||
|
font-size: 60rpx;
|
||||||
|
opacity: 0.5;
|
||||||
|
animation: float 3s ease-in-out infinite;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 网格包装 */
|
/* 网格包装 */
|
||||||
.grid-wrapper {
|
.grid-wrapper {
|
||||||
padding-bottom: 160rpx; /* 留出底部操作栏空间 */
|
padding-bottom: 200rpx; /* 留出底部操作栏空间 */
|
||||||
|
padding: 0 20rpx 200rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 号码网格 - 8列布局 */
|
/* 号码网格 - 调整为更合理的列数,适配不同屏幕 */
|
||||||
.choices-grid {
|
.choices-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(8, 1fr);
|
grid-template-columns: repeat(6, 1fr); /* 默认6列,更大尺寸 */
|
||||||
gap: 10rpx;
|
gap: 16rpx;
|
||||||
padding: 0;
|
padding: 10rpx 0;
|
||||||
|
animation: scaleIn 0.4s ease-out backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 单个号码格子 */
|
/* 单个号码格子 */
|
||||||
.choice-item {
|
.choice-item {
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
background: #F9FAFB;
|
background: $bg-card;
|
||||||
border: 1rpx solid #E5E7EB;
|
border: 1rpx solid $border-color-light;
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-md;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: all 0.2s;
|
transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
|
||||||
|
/* 票据孔装饰 */
|
||||||
|
&::before, &::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
width: 8rpx;
|
||||||
|
height: 8rpx;
|
||||||
|
background: $bg-page; /* 与背景色一致 */
|
||||||
|
border-radius: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
&::before { left: -4rpx; }
|
||||||
|
&::after { right: -4rpx; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.choice-item:active {
|
.choice-item:active {
|
||||||
transform: scale(0.9);
|
transform: scale(0.92);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 号码文字 */
|
/* 号码文字 */
|
||||||
.choice-number {
|
.choice-number {
|
||||||
font-size: 24rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
color: #4B5563;
|
color: $text-sub;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
|
transition: color 0.2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 状态文字 - 简化为小点或隐藏 */
|
/* 状态文字 - 简化为小点或隐藏 */
|
||||||
@ -357,65 +389,91 @@ async function onPaymentConfirm(paymentData) {
|
|||||||
|
|
||||||
/* 可选状态 */
|
/* 可选状态 */
|
||||||
.is-available {
|
.is-available {
|
||||||
background: #F9FAFB;
|
background: #FFFFFF;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: $brand-primary;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 已售状态 */
|
/* 已售状态 */
|
||||||
.is-sold {
|
.is-sold {
|
||||||
background: #F3F4F6;
|
color: $text-disabled;
|
||||||
border-color: #F3F4F6;
|
border-color: $border-color-light;
|
||||||
|
background: $bg-secondary;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: 'SOLD';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%) rotate(-30deg);
|
||||||
|
font-size: 20rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
color: $text-disabled;
|
||||||
|
opacity: 0.2;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
border: 2rpx solid $text-disabled;
|
||||||
|
padding: 2rpx 6rpx;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.is-sold::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(0,0,0,0.05);
|
|
||||||
}
|
|
||||||
.is-sold .choice-number {
|
.is-sold .choice-number {
|
||||||
color: #D1D5DB;
|
color: $text-disabled;
|
||||||
text-decoration: line-through;
|
opacity: 0.3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 选中状态 - 橙色高亮 */
|
/* 选中状态 - 橙色高亮 */
|
||||||
.is-selected {
|
.is-selected {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.4);
|
box-shadow: 0 8rpx 20rpx rgba($brand-primary, 0.3);
|
||||||
|
transform: scale(1.08);
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
&::before, &::after {
|
||||||
|
display: none; /* 选中状态隐藏票据孔 */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.is-selected .choice-number {
|
.is-selected .choice-number {
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ============= 底部操作栏 ============= */
|
/* ============= 底部操作栏 ============= */
|
||||||
.action-bar {
|
.action-bar {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 30rpx;
|
bottom: calc(40rpx + env(safe-area-inset-bottom));
|
||||||
left: 30rpx;
|
left: 30rpx;
|
||||||
right: 30rpx;
|
right: 30rpx;
|
||||||
background: rgba(255, 255, 255, 0.95);
|
background: rgba($bg-card, 0.9);
|
||||||
backdrop-filter: blur(20rpx);
|
backdrop-filter: blur(20rpx);
|
||||||
padding: 20rpx 30rpx;
|
padding: 20rpx 30rpx;
|
||||||
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);
|
box-shadow: $shadow-lg;
|
||||||
border-radius: 999rpx;
|
border-radius: 999rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
border: 1rpx solid rgba(255, 255, 255, 0.5);
|
border: 1rpx solid rgba($bg-card, 0.5);
|
||||||
|
animation: slideUp 0.4s ease-out backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 选择信息行 */
|
/* 选择信息行 */
|
||||||
.selection-info {
|
.selection-info {
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
color: #4B5563;
|
color: $text-main;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
.highlight {
|
.highlight {
|
||||||
color: #FF6B35;
|
color: $brand-primary;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
font-size: 36rpx;
|
font-size: 36rpx;
|
||||||
margin: 0 8rpx;
|
margin: 0 8rpx;
|
||||||
@ -424,30 +482,63 @@ async function onPaymentConfirm(paymentData) {
|
|||||||
/* 按钮组 */
|
/* 按钮组 */
|
||||||
.action-buttons {
|
.action-buttons {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 通用按钮样式 */
|
/* 通用按钮样式 */
|
||||||
.btn-common {
|
.btn-common {
|
||||||
height: 72rpx;
|
height: 80rpx;
|
||||||
line-height: 72rpx;
|
line-height: 80rpx;
|
||||||
padding: 0 40rpx;
|
padding: 0 48rpx;
|
||||||
border-radius: 999rpx;
|
border-radius: 999rpx;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 购买按钮 */
|
/* 购买按钮 */
|
||||||
.btn-buy {
|
.btn-buy {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35) !important;
|
background: $gradient-brand !important;
|
||||||
color: #FFFFFF !important;
|
color: #FFFFFF !important;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 107, 53, 0.3);
|
box-shadow: 0 8rpx 20rpx rgba($brand-primary, 0.3);
|
||||||
|
|
||||||
|
/* 脉冲动画 */
|
||||||
|
animation: pulse 2s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 随机按钮 */
|
/* 随机按钮 */
|
||||||
.btn-random {
|
.btn-random {
|
||||||
background: #F3F4F6 !important;
|
background: $bg-secondary !important;
|
||||||
color: #4B5563 !important;
|
color: $text-main !important;
|
||||||
|
box-shadow: none;
|
||||||
|
border: 1rpx solid transparent;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: #E5E7EB !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideUp {
|
||||||
|
from { transform: translateY(100%); opacity: 0; }
|
||||||
|
to { transform: translateY(0); opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0% { box-shadow: 0 0 0 0 rgba($brand-primary, 0.4); }
|
||||||
|
70% { box-shadow: 0 0 0 20rpx rgba($brand-primary, 0); }
|
||||||
|
100% { box-shadow: 0 0 0 0 rgba($brand-primary, 0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translateY(0); }
|
||||||
|
50% { transform: translateY(-10rpx); }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -23,51 +23,60 @@
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view v-show="tabActive === 'pool'">
|
<view v-show="tabActive === 'pool'">
|
||||||
<view class="rewards" v-if="currentIssueId && rewardsMap[currentIssueId] && rewardsMap[currentIssueId].length">
|
<view class="rewards-grid" v-if="currentIssueId && rewardsMap[currentIssueId] && rewardsMap[currentIssueId].length">
|
||||||
<el-card v-for="rw in rewardsMap[currentIssueId]" :key="rw.id" class="el-reward-card" shadow="hover">
|
<view v-for="(rw, idx) in rewardsMap[currentIssueId]" :key="rw.id"
|
||||||
<template #header>
|
class="reward-card animate-stagger"
|
||||||
<view class="el-card-header">
|
:style="{ '--delay': idx * 0.05 + 's' }">
|
||||||
<text class="el-card-title">{{ rw.title }}</text>
|
<view class="card-header">
|
||||||
<text v-if="rw.boss" class="badge-boss">BOSS</text>
|
<text class="card-title">{{ rw.title }}</text>
|
||||||
</view>
|
<text v-if="rw.boss" class="badge-boss">BOSS</text>
|
||||||
</template>
|
|
||||||
<view class="card-image-wrap">
|
|
||||||
<image v-if="rw.image" class="card-image" :src="rw.image" mode="widthFix" />
|
|
||||||
<text class="prob-corner tl">概率 {{ rw.percent }}%</text>
|
|
||||||
</view>
|
</view>
|
||||||
</el-card>
|
<view class="image-wrapper">
|
||||||
|
<image v-if="rw.image" class="reward-image" :src="rw.image" mode="aspectFill" />
|
||||||
|
<text class="prob-tag absolute-tag">概率 {{ rw.percent }}%</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="empty-state" v-else>
|
||||||
|
<text class="empty-icon">📭</text>
|
||||||
|
<text class="empty-text">暂无奖励配置</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="rewards-empty" v-else>暂无奖励配置</view>
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view v-show="tabActive === 'records'">
|
<view v-show="tabActive === 'records'">
|
||||||
<view class="records" v-if="winRecords.length">
|
<view class="records-list" v-if="winRecords.length">
|
||||||
<el-card v-for="it in winRecords" :key="it.id" class="el-reward-card" shadow="hover">
|
<view v-for="(it, idx) in winRecords" :key="it.id"
|
||||||
<template #header>
|
class="record-item animate-stagger"
|
||||||
<view class="el-card-header">
|
:style="{ '--delay': idx * 0.05 + 's' }">
|
||||||
<text class="el-card-title">{{ it.title }}</text>
|
<image class="record-img" :src="it.image" mode="aspectFill" />
|
||||||
<text v-if="it.count !== undefined" class="badge-count">x{{ it.count }}</text>
|
<view class="record-info">
|
||||||
|
<view class="record-title">{{ it.title }}</view>
|
||||||
|
<view class="record-meta">
|
||||||
|
<text class="record-count">x{{ it.count }}</text>
|
||||||
|
<text v-if="it.percent !== undefined">占比 {{ it.percent }}%</text>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
|
||||||
<view class="card-image-wrap">
|
|
||||||
<image v-if="it.image" class="card-image" :src="it.image" mode="widthFix" />
|
|
||||||
<text v-if="it.percent !== undefined" class="prob-corner tl">占比 {{ it.percent }}%</text>
|
|
||||||
</view>
|
</view>
|
||||||
</el-card>
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="empty-state" v-else>
|
||||||
|
<text class="empty-icon">📝</text>
|
||||||
|
<text class="empty-text">暂无中奖记录</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="rewards-empty" v-else>暂无中奖记录</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-else class="issues-empty">暂无期数</view>
|
<view v-else class="issues-empty">暂无期数</view>
|
||||||
</view>
|
</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
<view class="float-actions">
|
<view class="float-bar">
|
||||||
<button class="float-btn primary" @click="onParticipate">立即参与</button>
|
<button class="action-btn primary" @click="onParticipate">
|
||||||
|
立即参与
|
||||||
|
<view class="btn-shine"></view>
|
||||||
|
</button>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, getCurrentInstance } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import ElCard from '../../../components/ElCard.vue'
|
import ElCard from '../../../components/ElCard.vue'
|
||||||
import { onLoad } from '@dcloudio/uni-app'
|
import { onLoad } from '@dcloudio/uni-app'
|
||||||
import { getActivityDetail, getActivityIssues, getActivityIssueRewards, drawActivityIssue, getActivityWinRecords } from '../../../api/appUser'
|
import { getActivityDetail, getActivityIssues, getActivityIssueRewards, drawActivityIssue, getActivityWinRecords } from '../../../api/appUser'
|
||||||
@ -241,21 +250,6 @@ function onIssueChange(e) {
|
|||||||
currentIssueId.value = (cur && cur.id) || ''
|
currentIssueId.value = (cur && cur.id) || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ensureElCard() {
|
|
||||||
const inst = getCurrentInstance()
|
|
||||||
const app = inst && inst.appContext && inst.appContext.app
|
|
||||||
let comp = null
|
|
||||||
if (typeof window !== 'undefined' && window.ElementPlus && window.ElementPlus.ElCard) {
|
|
||||||
comp = window.ElementPlus.ElCard
|
|
||||||
} else {
|
|
||||||
comp = ElCard
|
|
||||||
}
|
|
||||||
if (app && !app.component('el-card')) app.component('el-card', comp)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function onPreviewBanner() {
|
function onPreviewBanner() {
|
||||||
const url = detail.value.banner || ''
|
const url = detail.value.banner || ''
|
||||||
if (url) uni.previewImage({ urls: [url], current: url })
|
if (url) uni.previewImage({ urls: [url], current: url })
|
||||||
@ -292,39 +286,369 @@ onLoad((opts) => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* 奇盒潮玩 - 对对碰活动页面 */
|
/* ============================================
|
||||||
.page { height: 100vh; padding-bottom: 140rpx; background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%); }
|
对对碰活动页面 - 高级设计重构 (SCSS Integration)
|
||||||
.banner { padding: 24rpx }
|
============================================ */
|
||||||
.banner-img { width: 100%; border-radius: 20rpx; box-shadow: 0 12rpx 32rpx rgba(0, 0, 0, 0.1); }
|
|
||||||
.header { padding: 0 24rpx }
|
.page-container {
|
||||||
.title { font-size: 40rpx; font-weight: 800; background: linear-gradient(135deg, #FF6B35, #FF9F43); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-align: center; }
|
min-height: 100vh;
|
||||||
.meta { margin-top: 12rpx; font-size: 28rpx; color: #6B7280; text-align: center; }
|
background: $bg-page;
|
||||||
.actions { display: flex; padding: 24rpx; gap: 16rpx }
|
position: relative;
|
||||||
.btn { flex: 1 }
|
overflow: hidden;
|
||||||
.primary { background: linear-gradient(135deg, #FF9F43, #FF6B35) !important; color: #fff !important; box-shadow: 0 6rpx 20rpx rgba(255, 107, 53, 0.35); }
|
display: flex;
|
||||||
.float-actions { position: fixed; left: 0; right: 0; bottom: 0; padding: 20rpx 24rpx; padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(20rpx); box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.08); z-index: 9999 }
|
flex-direction: column;
|
||||||
.float-btn { width: 100%; border-radius: 999rpx; background: linear-gradient(135deg, #FF9F43, #FF6B35) !important; color: #fff !important; font-weight: 600; box-shadow: 0 8rpx 24rpx rgba(255, 107, 53, 0.35); }
|
}
|
||||||
.issues { background: #FFFFFF; border-radius: 20rpx; margin: 0 24rpx 24rpx; padding: 20rpx; box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06); }
|
|
||||||
.issues-title { font-size: 32rpx; font-weight: 700; color: #1F2937; margin-bottom: 16rpx; padding-left: 16rpx; position: relative; }
|
/* 背景装饰 */
|
||||||
.issues-title::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 6rpx; height: 28rpx; background: linear-gradient(180deg, #FF9F43, #FF6B35); border-radius: 999rpx; }
|
.bg-decoration {
|
||||||
.issue-picker { height: 200rpx; background: linear-gradient(145deg, #FFF8F3, #FFF4E6); border-radius: 16rpx; margin-bottom: 64rpx }
|
position: absolute;
|
||||||
.picker-item { height: 40rpx; line-height: 40rpx; text-align: center; font-size: 28rpx; color: #1F2937; }
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
.tabs { display: flex; padding: 0 12rpx; margin-bottom: 20rpx; gap: 12rpx; }
|
z-index: 0;
|
||||||
.tab { flex: 1; text-align: center; font-size: 28rpx; padding: 18rpx 0; border: 2rpx solid rgba(255, 159, 67, 0.3); color: #B45309; background: linear-gradient(145deg, #FFFFFF, #FFF8F3); border-radius: 16rpx; font-weight: 500; transition: all 0.2s ease; }
|
pointer-events: none;
|
||||||
.tab.active { background: linear-gradient(135deg, #FF9F43, #FF6B35); border-color: #FF6B35; color: #fff; font-weight: 600; box-shadow: 0 6rpx 16rpx rgba(255, 107, 53, 0.3); }
|
overflow: hidden;
|
||||||
.rewards { width: 100%; margin-top: 24rpx }
|
}
|
||||||
.reward-card { background: #FFFFFF; border-radius: 16rpx; overflow: hidden; box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06); margin-bottom: 16rpx }
|
.orb {
|
||||||
.el-reward-card { margin-bottom: 16rpx }
|
position: absolute;
|
||||||
.el-card-header { display: flex; align-items: center; justify-content: space-between }
|
border-radius: 50%;
|
||||||
.el-card-title { font-size: 28rpx; color: #1F2937; flex: 1; margin-right: 8rpx; word-break: break-all; font-weight: 600; }
|
filter: blur(80rpx);
|
||||||
.card-image-wrap { position: relative; padding-bottom: 48rpx }
|
opacity: 0.6;
|
||||||
.card-image { width: 100%; height: auto; display: block; background: linear-gradient(145deg, #FFF8F3, #FFF4E6); position: relative; z-index: 1 }
|
}
|
||||||
.prob-corner { position: absolute; background: linear-gradient(135deg, #FF6B35, #FF9F43); color: #fff; font-size: 22rpx; font-weight: 600; padding: 8rpx 16rpx; border-radius: 999rpx; z-index: 2; box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.35); }
|
.orb-1 {
|
||||||
.prob-corner.tl { top: 12rpx; left: 12rpx }
|
width: 500rpx; height: 500rpx;
|
||||||
.card-body { display: flex; align-items: center; justify-content: space-between; padding: 16rpx }
|
background: radial-gradient(circle, rgba($brand-primary, 0.2) 0%, transparent 70%);
|
||||||
.card-title { font-size: 28rpx; color: #1F2937; flex: 1; margin-right: 8rpx; word-break: break-all; font-weight: 600; }
|
top: -100rpx; left: -100rpx;
|
||||||
.badge-boss { background: linear-gradient(135deg, #FF9F43, #FFD166); color: #6b4b1f; font-size: 22rpx; font-weight: 600; padding: 6rpx 14rpx; border-radius: 999rpx }
|
}
|
||||||
.badge-count { background: linear-gradient(135deg, #FFD166, #FFE8A3); color: #6b4b1f; font-size: 22rpx; font-weight: 600; padding: 6rpx 14rpx; border-radius: 999rpx }
|
.orb-2 {
|
||||||
.rewards-empty, .issues-empty { font-size: 26rpx; color: #9CA3AF; text-align: center; padding: 40rpx }
|
width: 600rpx; height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($accent-gold, 0.15) 0%, transparent 70%);
|
||||||
|
bottom: -100rpx; right: -100rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-content {
|
||||||
|
flex: 1;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
padding-bottom: calc(160rpx + env(safe-area-inset-bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Banner */
|
||||||
|
.banner-wrapper {
|
||||||
|
margin: $spacing-md $spacing-lg;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: $shadow-lg;
|
||||||
|
position: relative;
|
||||||
|
animation: fadeInDown 0.6s ease-out;
|
||||||
|
}
|
||||||
|
.banner-img {
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.banner-shadow {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0; left: 0; width: 100%; height: 40%;
|
||||||
|
background: linear-gradient(to top, rgba(0,0,0,0.3), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
.header-section {
|
||||||
|
padding: 0 $spacing-lg;
|
||||||
|
margin-bottom: $spacing-lg;
|
||||||
|
text-align: center;
|
||||||
|
animation: fadeIn 0.8s ease-out;
|
||||||
|
}
|
||||||
|
.title-row {
|
||||||
|
margin-bottom: $spacing-sm;
|
||||||
|
}
|
||||||
|
.title-text {
|
||||||
|
font-size: $font-xxl;
|
||||||
|
font-weight: 900;
|
||||||
|
background: $gradient-brand;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.price-tag {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: baseline;
|
||||||
|
background: rgba($bg-card, 0.6);
|
||||||
|
padding: $spacing-xs $spacing-lg;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
|
.price-label { font-size: $font-sm; color: $text-sub; margin-right: $spacing-xs; }
|
||||||
|
.price-symbol { font-size: $font-sm; color: $brand-primary; font-weight: 700; }
|
||||||
|
.price-value { font-size: $font-xl; color: $brand-primary; font-weight: 900; font-family: 'DIN Alternate', sans-serif; }
|
||||||
|
|
||||||
|
/* Glass Card */
|
||||||
|
.glass-card {
|
||||||
|
margin: 0 $spacing-lg $spacing-lg;
|
||||||
|
background: rgba($bg-card, 0.8);
|
||||||
|
backdrop-filter: blur(40rpx);
|
||||||
|
border-radius: $radius-xl;
|
||||||
|
padding: $spacing-lg;
|
||||||
|
box-shadow: $shadow-card;
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
||||||
|
animation: fadeInUp 0.6s ease-out 0.2s backwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: $spacing-md;
|
||||||
|
padding: 0 4rpx;
|
||||||
|
}
|
||||||
|
.section-title {
|
||||||
|
font-size: $font-lg;
|
||||||
|
font-weight: 800;
|
||||||
|
color: $text-main;
|
||||||
|
position: relative;
|
||||||
|
padding-left: 20rpx;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0; top: 50%; transform: translateY(-50%);
|
||||||
|
width: 8rpx; height: 32rpx;
|
||||||
|
background: $gradient-brand;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.issue-indicator {
|
||||||
|
font-size: $font-sm;
|
||||||
|
color: $brand-primary;
|
||||||
|
background: rgba($brand-primary, 0.1);
|
||||||
|
padding: 4rpx $spacing-md;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Custom Picker */
|
||||||
|
.custom-picker {
|
||||||
|
height: 280rpx;
|
||||||
|
background: rgba($bg-secondary, 0.5);
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
margin-bottom: $spacing-lg;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.picker-item {
|
||||||
|
height: 80rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: $spacing-md;
|
||||||
|
}
|
||||||
|
.picker-text { font-size: $font-lg; color: $text-main; font-weight: 600; }
|
||||||
|
.picker-status {
|
||||||
|
font-size: $font-xs; color: $text-sub; background: rgba(0,0,0,0.05); padding: 2rpx $spacing-sm; border-radius: $radius-sm;
|
||||||
|
|
||||||
|
&.status-active { background: #D1FAE5; color: #059669; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Modern Tabs */
|
||||||
|
.modern-tabs {
|
||||||
|
display: flex;
|
||||||
|
background: $bg-secondary;
|
||||||
|
padding: 8rpx;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
margin-bottom: $spacing-lg;
|
||||||
|
}
|
||||||
|
.tab-item {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
padding: $spacing-md 0;
|
||||||
|
font-size: $font-md;
|
||||||
|
color: $text-sub;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: #FFFFFF;
|
||||||
|
color: $brand-primary;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.active-dot {
|
||||||
|
width: 8rpx; height: 8rpx;
|
||||||
|
background: $brand-primary;
|
||||||
|
border-radius: 50%;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 8rpx; left: 50%; transform: translateX(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Rewards Grid */
|
||||||
|
.rewards-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: $spacing-lg;
|
||||||
|
}
|
||||||
|
.reward-card {
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
padding: $spacing-lg;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
border: 1rpx solid rgba(0,0,0,0.03);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.card-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-bottom: $spacing-md;
|
||||||
|
height: 44rpx;
|
||||||
|
}
|
||||||
|
.card-title {
|
||||||
|
font-size: $font-md;
|
||||||
|
color: $text-main;
|
||||||
|
font-weight: 600;
|
||||||
|
flex: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
margin-right: 8rpx;
|
||||||
|
}
|
||||||
|
.badge-boss {
|
||||||
|
font-size: $font-xs;
|
||||||
|
background: $gradient-gold;
|
||||||
|
color: #78350F;
|
||||||
|
padding: 2rpx $spacing-sm;
|
||||||
|
border-radius: $radius-sm;
|
||||||
|
font-weight: 800;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.card-body {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.image-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
padding-bottom: 100%;
|
||||||
|
position: relative;
|
||||||
|
background: $bg-secondary;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-bottom: $spacing-sm;
|
||||||
|
}
|
||||||
|
.reward-image {
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
|
}
|
||||||
|
.prob-tag {
|
||||||
|
position: absolute;
|
||||||
|
top: 8rpx; left: 8rpx;
|
||||||
|
font-size: $font-xs;
|
||||||
|
color: #fff;
|
||||||
|
background: rgba(0,0,0,0.6);
|
||||||
|
backdrop-filter: blur(4rpx);
|
||||||
|
padding: 4rpx $spacing-sm;
|
||||||
|
border-radius: $radius-sm;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Records List */
|
||||||
|
.records-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: $spacing-lg;
|
||||||
|
}
|
||||||
|
.record-item {
|
||||||
|
display: flex;
|
||||||
|
background: #FFFFFF;
|
||||||
|
padding: $spacing-lg;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.record-img {
|
||||||
|
width: 100rpx; height: 100rpx;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
background: $bg-secondary;
|
||||||
|
margin-right: $spacing-lg;
|
||||||
|
}
|
||||||
|
.record-info {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.record-title {
|
||||||
|
font-size: $font-md;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $text-main;
|
||||||
|
margin-bottom: $spacing-xs;
|
||||||
|
}
|
||||||
|
.record-meta {
|
||||||
|
display: flex;
|
||||||
|
gap: $spacing-md;
|
||||||
|
font-size: $font-sm;
|
||||||
|
color: $text-sub;
|
||||||
|
}
|
||||||
|
.record-count {
|
||||||
|
background: rgba($brand-primary, 0.1);
|
||||||
|
color: $brand-primary;
|
||||||
|
padding: 2rpx $spacing-sm;
|
||||||
|
border-radius: $radius-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Empty State */
|
||||||
|
.empty-state {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 80rpx 0;
|
||||||
|
color: $text-placeholder;
|
||||||
|
}
|
||||||
|
.empty-icon { font-size: 80rpx; margin-bottom: $spacing-lg; opacity: 0.5; }
|
||||||
|
.empty-text { font-size: $font-md; }
|
||||||
|
|
||||||
|
/* Float Bar */
|
||||||
|
.float-bar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0; right: 0; bottom: 0;
|
||||||
|
padding: $spacing-lg $spacing-xl;
|
||||||
|
padding-bottom: calc($spacing-lg + env(safe-area-inset-bottom));
|
||||||
|
background: rgba(255, 255, 255, 0.9);
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
box-shadow: 0 -8rpx 30rpx rgba(0, 0, 0, 0.05);
|
||||||
|
z-index: 100;
|
||||||
|
animation: slideUp 0.4s ease-out backwards;
|
||||||
|
}
|
||||||
|
.action-btn {
|
||||||
|
height: 96rpx;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: $font-xl;
|
||||||
|
font-weight: 800;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: $gradient-brand;
|
||||||
|
color: #fff;
|
||||||
|
box-shadow: $shadow-warm;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active { transform: scale(0.98); }
|
||||||
|
}
|
||||||
|
.btn-shine {
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: -100%; width: 50%; height: 100%;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
|
||||||
|
transform: skewX(-20deg);
|
||||||
|
animation: shine 3s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animation Utilities */
|
||||||
|
.animate-stagger {
|
||||||
|
animation: fadeInUp 0.5s ease-out backwards;
|
||||||
|
animation-delay: var(--delay, 0s);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -139,36 +139,44 @@ onShareTimeline(() => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
.page {
|
.page {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: #F8F8F8;
|
background: $bg-page;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
.content {
|
.content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
}
|
}
|
||||||
.activity-grid {
|
.activity-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
gap: 20rpx;
|
gap: $spacing-md;
|
||||||
}
|
}
|
||||||
.activity-item {
|
.activity-item {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 8rpx 20rpx rgba(0,0,0,0.06);
|
box-shadow: $shadow-sm;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
box-shadow: $shadow-xs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumb-box {
|
.thumb-box {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: 100%; /* 1:1 Aspect Ratio */
|
padding-top: 100%; /* 1:1 Aspect Ratio */
|
||||||
height: 0;
|
height: 0;
|
||||||
background: #f0f0f0;
|
background: $bg-secondary;
|
||||||
}
|
}
|
||||||
.thumb {
|
.thumb {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -176,19 +184,27 @@ onShareTimeline(() => {
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
background: linear-gradient(90deg, $bg-secondary 25%, #e8e8e8 50%, $bg-secondary 75%);
|
||||||
|
background-size: 200% 100%;
|
||||||
|
animation: shimmer 1.5s infinite;
|
||||||
}
|
}
|
||||||
.tag-hot {
|
.tag-hot {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 12rpx; left: 12rpx;
|
top: 16rpx; left: 16rpx;
|
||||||
background: #333;
|
background: rgba(255, 69, 58, 0.9);
|
||||||
color: #FFD700;
|
color: #fff;
|
||||||
font-size: 20rpx;
|
font-size: 20rpx;
|
||||||
padding: 4rpx 12rpx;
|
padding: 6rpx 14rpx;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
|
letter-spacing: 1rpx;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba(255, 69, 58, 0.3);
|
||||||
|
backdrop-filter: blur(4rpx);
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
padding: 20rpx 16rpx;
|
padding: 20rpx 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
@ -197,32 +213,42 @@ onShareTimeline(() => {
|
|||||||
.name {
|
.name {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 16rpx;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 76rpx;
|
line-height: 1.4;
|
||||||
line-height: 1.35;
|
height: 80rpx;
|
||||||
}
|
}
|
||||||
.bottom-row {
|
.bottom-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: flex-end;
|
||||||
}
|
}
|
||||||
.price-text {
|
.price-text {
|
||||||
font-size: 24rpx;
|
font-size: 22rpx;
|
||||||
color: #FF4D4F;
|
color: $text-secondary;
|
||||||
font-weight: 700;
|
max-width: 70%;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
.btn-go {
|
.btn-go {
|
||||||
background: #1A1A1A;
|
background: $brand-primary;
|
||||||
color: #FFD700;
|
color: #fff;
|
||||||
font-size: 24rpx;
|
font-size: 20rpx;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
padding: 8rpx 24rpx;
|
padding: 6rpx 20rpx;
|
||||||
border-radius: 999rpx;
|
border-radius: 100rpx;
|
||||||
|
box-shadow: 0 4rpx 10rpx rgba($brand-primary, 0.3);
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.9);
|
||||||
|
background: darken($brand-primary, 5%);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-wrap {
|
.loading-wrap {
|
||||||
@ -230,7 +256,8 @@ onShareTimeline(() => {
|
|||||||
}
|
}
|
||||||
.spinner {
|
.spinner {
|
||||||
width: 48rpx; height: 48rpx;
|
width: 48rpx; height: 48rpx;
|
||||||
border: 4rpx solid #ddd; border-top-color: #FF9F43;
|
border: 4rpx solid $border-color-light;
|
||||||
|
border-top-color: $brand-primary;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
animation: spin 0.8s linear infinite;
|
animation: spin 0.8s linear infinite;
|
||||||
}
|
}
|
||||||
@ -241,90 +268,35 @@ onShareTimeline(() => {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding-top: 200rpx;
|
padding-top: 200rpx;
|
||||||
|
animation: fadeInUp 0.5s ease-out;
|
||||||
}
|
}
|
||||||
.empty-img {
|
.empty-img {
|
||||||
width: 240rpx;
|
width: 240rpx;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: 24rpx;
|
||||||
opacity: 0.4;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
.empty-text {
|
.empty-text {
|
||||||
color: #999;
|
color: $text-secondary;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
活动列表 UX/UI 增强
|
动画增强
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
/* 入场动画 */
|
|
||||||
@keyframes fadeInUp {
|
|
||||||
from { opacity: 0; transform: translateY(30rpx); }
|
|
||||||
to { opacity: 1; transform: translateY(0); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes shimmer {
|
@keyframes shimmer {
|
||||||
0% { background-position: -200% 0; }
|
0% { background-position: -200% 0; }
|
||||||
100% { background-position: 200% 0; }
|
100% { background-position: 200% 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes pulse {
|
|
||||||
0%, 100% { transform: scale(1); }
|
|
||||||
50% { transform: scale(1.05); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes float {
|
|
||||||
0%, 100% { transform: translateY(0); }
|
|
||||||
50% { transform: translateY(-6rpx); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 卡片交错入场 */
|
/* 卡片交错入场 */
|
||||||
.activity-item:nth-child(1) { animation: fadeInUp 0.4s ease-out 0.1s both; }
|
@for $i from 1 through 10 {
|
||||||
.activity-item:nth-child(2) { animation: fadeInUp 0.4s ease-out 0.15s both; }
|
.activity-item:nth-child(#{$i}) {
|
||||||
.activity-item:nth-child(3) { animation: fadeInUp 0.4s ease-out 0.2s both; }
|
animation: fadeInUp 0.4s ease-out #{$i * 0.05}s both;
|
||||||
.activity-item:nth-child(4) { animation: fadeInUp 0.4s ease-out 0.25s both; }
|
}
|
||||||
.activity-item:nth-child(n+5) { animation: fadeInUp 0.4s ease-out 0.3s both; }
|
|
||||||
|
|
||||||
/* 图片加载动画 */
|
|
||||||
.thumb {
|
|
||||||
background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 50%, #f0f0f0 75%);
|
|
||||||
background-size: 200% 100%;
|
|
||||||
animation: shimmer 1.5s infinite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 热门标签浮动 */
|
@keyframes fadeInUp {
|
||||||
.tag-hot {
|
from { opacity: 0; transform: translateY(20rpx); }
|
||||||
animation: float 3s ease-in-out infinite;
|
to { opacity: 1; transform: translateY(0); }
|
||||||
background: linear-gradient(135deg, rgba(255,77,79,0.9), rgba(255,107,53,0.9));
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 卡片点击效果 */
|
|
||||||
.activity-item {
|
|
||||||
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
||||||
}
|
|
||||||
.activity-item:active {
|
|
||||||
transform: scale(0.96) translateY(4rpx);
|
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GO 按钮脉冲 */
|
|
||||||
.btn-go {
|
|
||||||
animation: pulse 2s infinite;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
.btn-go:active {
|
|
||||||
animation: none;
|
|
||||||
transform: scale(0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 增强加载器 */
|
|
||||||
.spinner {
|
|
||||||
border-width: 6rpx;
|
|
||||||
border-top-color: #FF6B35;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 空状态入场 */
|
|
||||||
.empty {
|
|
||||||
animation: fadeInUp 0.5s ease-out;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -241,25 +241,71 @@ onLoad((opts) => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
|
/* ============================================
|
||||||
|
爬塔页面 - 沉浸式暗黑风格 (SCSS Integration)
|
||||||
|
============================================ */
|
||||||
|
|
||||||
|
$local-gold: #FFD700; // 特殊金色,比全局更亮
|
||||||
|
|
||||||
.page-wrapper {
|
.page-wrapper {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
position: relative;
|
position: relative;
|
||||||
background: #2D1B4E; /* Dark Purple Theme */
|
background: $bg-dark;
|
||||||
color: #fff;
|
color: $text-dark-main;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 背景装饰 - 暗黑版 */
|
||||||
|
.bg-decoration {
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: -10%; left: -20%;
|
||||||
|
width: 600rpx; height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-primary, 0.1) 0%, transparent 70%);
|
||||||
|
filter: blur(80rpx);
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.6;
|
||||||
|
animation: float 10s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10%; right: -10%;
|
||||||
|
width: 500rpx; height: 500rpx;
|
||||||
|
background: radial-gradient(circle, rgba($local-gold, 0.08) 0%, transparent 70%);
|
||||||
|
filter: blur(60rpx);
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.5;
|
||||||
|
animation: float 12s ease-in-out infinite reverse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(20rpx, 30rpx); }
|
||||||
|
}
|
||||||
|
|
||||||
.bg-fixed {
|
.bg-fixed {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0; left: 0; width: 100%; height: 100%;
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
filter: blur(8rpx);
|
||||||
}
|
}
|
||||||
.bg-mask {
|
.bg-mask {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0; left: 0; width: 100%; height: 100%;
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
background: linear-gradient(180deg, rgba(45,27,78,0.8), #2D1B4E);
|
background: linear-gradient(180deg, rgba($bg-dark, 0.85), $bg-dark 95%);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,23 +315,55 @@ onLoad((opts) => {
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
padding: 30rpx;
|
padding: $spacing-lg;
|
||||||
|
padding-top: calc(env(safe-area-inset-top) + 20rpx);
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-section {
|
.header-section {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
margin-bottom: 60rpx;
|
margin-bottom: $spacing-xl;
|
||||||
|
animation: fadeInDown 0.6s ease-out;
|
||||||
|
}
|
||||||
|
.title-box {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.main-title {
|
||||||
|
font-size: 60rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
font-style: italic;
|
||||||
|
display: block;
|
||||||
|
text-shadow: 0 4rpx 16rpx rgba(0,0,0,0.6);
|
||||||
|
background: linear-gradient(180deg, #fff, #b3b3b3);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
}
|
||||||
|
.sub-title {
|
||||||
|
font-size: 26rpx;
|
||||||
|
opacity: 0.8;
|
||||||
|
margin-top: $spacing-xs;
|
||||||
|
display: block;
|
||||||
|
letter-spacing: 4rpx;
|
||||||
|
color: $brand-primary;
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
.main-title { font-size: 48rpx; font-weight: 900; font-style: italic; display: block; }
|
|
||||||
.sub-title { font-size: 24rpx; opacity: 0.8; margin-top: 8rpx; display: block; }
|
|
||||||
.rule-btn {
|
.rule-btn {
|
||||||
background: rgba(255,255,255,0.1);
|
background: rgba(255,255,255,0.1);
|
||||||
border: 1px solid rgba(255,255,255,0.2);
|
border: 1px solid $border-dark;
|
||||||
padding: 8rpx 24rpx;
|
padding: 12rpx 32rpx;
|
||||||
border-radius: 999rpx;
|
border-radius: 100rpx;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
|
backdrop-filter: blur(10rpx);
|
||||||
|
transition: all 0.2s;
|
||||||
|
color: rgba(255,255,255,0.9);
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: rgba(255,255,255,0.25);
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tower-container {
|
.tower-container {
|
||||||
@ -294,81 +372,202 @@ onLoad((opts) => {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
padding-bottom: 40rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tower-level {
|
.tower-level {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: linear-gradient(135deg, #6D28D9, #4C1D95);
|
background: $bg-dark-card;
|
||||||
padding: 40rpx;
|
backdrop-filter: blur(20rpx);
|
||||||
border-radius: 24rpx;
|
padding: 48rpx;
|
||||||
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.3);
|
border-radius: $radius-xl;
|
||||||
|
box-shadow: 0 16rpx 40rpx rgba(0,0,0,0.3);
|
||||||
margin-bottom: 40rpx;
|
margin-bottom: 40rpx;
|
||||||
border: 2rpx solid rgba(255,255,255,0.1);
|
border: 1px solid $border-dark;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
animation: zoomIn 0.5s ease-out backwards;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: 0; right: 0; height: 1px;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
background: rgba($local-gold, 0.15);
|
||||||
|
border-color: rgba($local-gold, 0.5);
|
||||||
|
box-shadow: 0 0 40rpx rgba($local-gold, 0.15), inset 0 0 20rpx rgba($local-gold, 0.05);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.level-info { display: flex; flex-direction: column; z-index: 1; }
|
||||||
|
.level-num {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $text-dark-sub;
|
||||||
|
margin-bottom: 8rpx;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
}
|
||||||
|
.level-name {
|
||||||
|
font-size: 48rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
color: $text-dark-main;
|
||||||
|
text-shadow: 0 4rpx 8rpx rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
.level-status {
|
||||||
|
font-size: 24rpx;
|
||||||
|
background: linear-gradient(135deg, $local-gold, $brand-secondary);
|
||||||
|
color: #3e2723;
|
||||||
|
padding: 8rpx 20rpx;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
font-weight: 800;
|
||||||
|
box-shadow: 0 4rpx 16rpx rgba($brand-secondary, 0.3);
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
.level-info { display: flex; flex-direction: column; }
|
|
||||||
.level-num { font-size: 24rpx; opacity: 0.8; margin-bottom: 8rpx; }
|
|
||||||
.level-name { font-size: 40rpx; font-weight: 700; }
|
|
||||||
.level-status { font-size: 24rpx; background: rgba(0,0,0,0.2); padding: 4rpx 12rpx; border-radius: 8rpx; }
|
|
||||||
|
|
||||||
.rewards-preview {
|
.rewards-preview {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
margin-top: 40rpx;
|
||||||
}
|
}
|
||||||
.rewards-scroll {
|
.rewards-scroll {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
.reward-item {
|
.reward-item {
|
||||||
display: inline-block;
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
width: 160rpx;
|
width: 160rpx;
|
||||||
margin-right: 20rpx;
|
margin-right: 24rpx;
|
||||||
text-align: center;
|
animation: fadeInUp 0.5s ease-out backwards;
|
||||||
|
|
||||||
|
@for $i from 1 through 5 {
|
||||||
|
&:nth-child(#{$i}) {
|
||||||
|
animation-delay: #{$i * 0.1}s;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.reward-img {
|
.reward-img {
|
||||||
width: 120rpx; height: 120rpx;
|
width: 120rpx; height: 120rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: 24rpx;
|
||||||
background: rgba(255,255,255,0.1);
|
background: rgba(255,255,255,0.05);
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: 16rpx;
|
||||||
|
border: 1px solid $border-dark;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
.reward-name {
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: $text-dark-sub;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.reward-prob {
|
||||||
|
font-size: 20rpx;
|
||||||
|
color: $local-gold;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-top: 4rpx;
|
||||||
}
|
}
|
||||||
.reward-name { font-size: 22rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
||||||
.reward-prob { font-size: 20rpx; color: #FFD700; }
|
|
||||||
|
|
||||||
.action-area {
|
.action-area {
|
||||||
background: rgba(0,0,0,0.4);
|
background: $bg-dark-card;
|
||||||
backdrop-filter: blur(20rpx);
|
backdrop-filter: blur(40rpx);
|
||||||
padding: 30rpx;
|
padding: 24rpx 32rpx;
|
||||||
border-radius: 32rpx;
|
border-radius: 100rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
border: 1px solid $border-dark;
|
||||||
|
box-shadow: 0 20rpx 60rpx rgba(0,0,0,0.5);
|
||||||
|
margin-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
|
||||||
|
animation: slideUp 0.6s ease-out backwards;
|
||||||
|
animation-delay: 0.3s;
|
||||||
|
}
|
||||||
|
.price-display {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
color: $local-gold;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
text-shadow: 0 0 20rpx rgba(255, 215, 0, 0.2);
|
||||||
}
|
}
|
||||||
.price-display { color: #FFD700; font-weight: 700; }
|
|
||||||
.currency { font-size: 28rpx; }
|
.currency { font-size: 28rpx; }
|
||||||
.amount { font-size: 48rpx; margin: 0 4rpx; }
|
.amount { font-size: 48rpx; margin: 0 4rpx; font-family: 'DIN Alternate', sans-serif; }
|
||||||
.unit { font-size: 24rpx; opacity: 0.8; }
|
.unit { font-size: 24rpx; opacity: 0.8; font-weight: normal; }
|
||||||
|
|
||||||
.challenge-btn {
|
.challenge-btn {
|
||||||
background: linear-gradient(135deg, #FFD700, #F59E0B);
|
background: $gradient-brand;
|
||||||
color: #333;
|
color: #fff;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
border-radius: 999rpx;
|
border-radius: 100rpx;
|
||||||
padding: 0 60rpx;
|
padding: 0 60rpx;
|
||||||
|
height: 88rpx;
|
||||||
|
line-height: 88rpx;
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(245, 158, 11, 0.4);
|
box-shadow: 0 8rpx 24rpx rgba(255, 107, 0, 0.3);
|
||||||
|
border: none;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: -100%; width: 100%; height: 100%;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
|
||||||
|
animation: shimmer 3s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba(255, 107, 0, 0.2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-overlay {
|
.flip-overlay {
|
||||||
position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 999;
|
position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 999;
|
||||||
}
|
}
|
||||||
.flip-mask {
|
.flip-mask {
|
||||||
position: absolute; top: 0; bottom: 0; width: 100%; background: rgba(0,0,0,0.8);
|
position: absolute; top: 0; bottom: 0; width: 100%; background: rgba(0,0,0,0.85);
|
||||||
|
backdrop-filter: blur(10rpx);
|
||||||
|
animation: fadeIn 0.3s ease-out;
|
||||||
}
|
}
|
||||||
.flip-content {
|
.flip-content {
|
||||||
position: relative; z-index: 2; height: 100%; display: flex; flex-direction: column; padding: 40rpx;
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 40rpx;
|
||||||
|
justify-content: center;
|
||||||
|
animation: zoomIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
||||||
}
|
}
|
||||||
.close-btn {
|
.close-btn {
|
||||||
margin-top: auto;
|
margin-top: 60rpx;
|
||||||
background: #fff; color: #333; border-radius: 999rpx; font-weight: 700;
|
background: #fff;
|
||||||
|
color: #333;
|
||||||
|
border-radius: 100rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
width: 50%;
|
||||||
|
height: 80rpx;
|
||||||
|
line-height: 80rpx;
|
||||||
|
align-self: center;
|
||||||
|
box-shadow: 0 10rpx 30rpx rgba(255,255,255,0.15);
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes shimmer {
|
||||||
|
0% { left: -100%; }
|
||||||
|
50%, 100% { left: 200%; }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<view class="bg-decoration"></view>
|
||||||
<scroll-view class="page" scroll-y>
|
<scroll-view class="page" scroll-y>
|
||||||
<!-- 顶部 Banner -->
|
<!-- 顶部 Banner -->
|
||||||
<view class="banner" v-if="detail.banner">
|
<view class="banner" v-if="detail.banner">
|
||||||
@ -75,8 +76,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, getCurrentInstance } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import ElCard from '../../../components/ElCard.vue'
|
|
||||||
import FlipGrid from '../../../components/FlipGrid.vue'
|
import FlipGrid from '../../../components/FlipGrid.vue'
|
||||||
import { onLoad } from '@dcloudio/uni-app'
|
import { onLoad } from '@dcloudio/uni-app'
|
||||||
import PaymentPopup from '../../../components/PaymentPopup.vue'
|
import PaymentPopup from '../../../components/PaymentPopup.vue'
|
||||||
@ -255,19 +255,6 @@ function nextIssue() {
|
|||||||
currentIssueId.value = (cur && cur.id) || ''
|
currentIssueId.value = (cur && cur.id) || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ensureElCard() {
|
|
||||||
const inst = getCurrentInstance()
|
|
||||||
const app = inst && inst.appContext && inst.appContext.app
|
|
||||||
let comp = null
|
|
||||||
if (typeof window !== 'undefined' && window.ElementPlus && window.ElementPlus.ElCard) {
|
|
||||||
comp = window.ElementPlus.ElCard
|
|
||||||
} else {
|
|
||||||
comp = ElCard
|
|
||||||
}
|
|
||||||
if (app && !app.component('el-card')) app.component('el-card', comp)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function onPreviewBanner() {
|
function onPreviewBanner() {
|
||||||
const url = detail.value.banner || ''
|
const url = detail.value.banner || ''
|
||||||
if (url) uni.previewImage({ urls: [url], current: url })
|
if (url) uni.previewImage({ urls: [url], current: url })
|
||||||
@ -418,55 +405,358 @@ onLoad((opts) => {
|
|||||||
fetchDetail(id)
|
fetchDetail(id)
|
||||||
fetchIssues(id)
|
fetchIssues(id)
|
||||||
}
|
}
|
||||||
ensureElCard()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
function closeFlip() { showFlip.value = false }
|
function closeFlip() { showFlip.value = false }
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* 奇盒潮玩 - 无限赏活动页面 */
|
/* 奇盒潮玩 - 无限赏活动页面 */
|
||||||
.page { height: 100vh; padding-bottom: 200rpx; background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%); }
|
.page {
|
||||||
.banner { padding: 24rpx 24rpx 0; }
|
min-height: 100vh;
|
||||||
.banner-img { width: 100%; border-radius: 20rpx; box-shadow: 0 12rpx 32rpx rgba(0, 0, 0, 0.1); }
|
padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
|
||||||
|
background: transparent;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-decoration {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: $bg-page;
|
||||||
|
z-index: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
&::before, &::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
filter: blur(80px);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
width: 600rpx;
|
||||||
|
height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-primary, 0.12), transparent 70%);
|
||||||
|
top: -200rpx;
|
||||||
|
left: -200rpx;
|
||||||
|
animation: float 10s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
width: 500rpx;
|
||||||
|
height: 500rpx;
|
||||||
|
background: radial-gradient(circle, rgba($accent-gold, 0.15), transparent 70%);
|
||||||
|
bottom: 10%;
|
||||||
|
right: -100rpx;
|
||||||
|
animation: float 12s ease-in-out infinite reverse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(30rpx, 50rpx); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner {
|
||||||
|
padding: $spacing-lg $spacing-lg 0;
|
||||||
|
animation: fadeInDown 0.6s $ease-out;
|
||||||
|
}
|
||||||
|
.banner-img {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
box-shadow: $shadow-lg;
|
||||||
|
}
|
||||||
|
|
||||||
/* 商品信息卡片 */
|
/* 商品信息卡片 */
|
||||||
.product-card { margin: 20rpx 24rpx; background: #FFFFFF; border-radius: 20rpx; padding: 20rpx; box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06); }
|
.product-card {
|
||||||
.product-info { display: flex; align-items: flex-start; gap: 16rpx; }
|
margin: $spacing-lg;
|
||||||
.product-thumb { width: 120rpx; height: 120rpx; border-radius: 16rpx; flex-shrink: 0; background: linear-gradient(145deg, #FFF8F3, #FFF4E6); }
|
background: $bg-glass;
|
||||||
.product-detail { flex: 1; min-width: 0; }
|
backdrop-filter: blur(20rpx);
|
||||||
.product-name { font-size: 30rpx; font-weight: 700; color: #1F2937; margin-bottom: 8rpx; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
border-radius: $radius-lg;
|
||||||
.product-price { font-size: 34rpx; font-weight: 800; color: #FF6B35; }
|
padding: $spacing-lg;
|
||||||
.product-actions { display: flex; flex-direction: column; gap: 12rpx; }
|
box-shadow: $shadow-card;
|
||||||
.action-btn { background: linear-gradient(145deg, #FFFFFF, #FFF8F3); border: 2rpx solid rgba(255, 159, 67, 0.3); border-radius: 12rpx; padding: 10rpx 14rpx; font-size: 22rpx; color: #B45309; text-align: center; }
|
animation: fadeInUp 0.6s $ease-out 0.1s backwards;
|
||||||
.action-btn:active { background: #FFF4E6; }
|
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
||||||
|
}
|
||||||
|
.product-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: $spacing-lg;
|
||||||
|
}
|
||||||
|
.product-thumb {
|
||||||
|
width: 140rpx;
|
||||||
|
height: 140rpx;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
flex-shrink: 0;
|
||||||
|
background: $bg-page;
|
||||||
|
box-shadow: $shadow-inner;
|
||||||
|
}
|
||||||
|
.product-detail {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
.product-name {
|
||||||
|
font-size: $font-lg;
|
||||||
|
font-weight: 700;
|
||||||
|
color: $text-main;
|
||||||
|
margin-bottom: $spacing-sm;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
.product-price {
|
||||||
|
font-size: $font-xl;
|
||||||
|
font-weight: 800;
|
||||||
|
color: $brand-primary;
|
||||||
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
|
}
|
||||||
|
.product-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: $spacing-sm;
|
||||||
|
}
|
||||||
|
.action-btn {
|
||||||
|
background: rgba($brand-primary, 0.05);
|
||||||
|
border: 1rpx solid rgba($brand-primary, 0.2);
|
||||||
|
border-radius: $radius-sm;
|
||||||
|
padding: $spacing-sm $spacing-lg;
|
||||||
|
font-size: $font-sm;
|
||||||
|
color: $brand-primary-dark;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all $transition-fast;
|
||||||
|
}
|
||||||
|
.action-btn:active {
|
||||||
|
background: rgba($brand-primary, 0.1);
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
|
||||||
/* 期号切换条 */
|
/* 期号切换条 */
|
||||||
.issue-bar { display: flex; align-items: center; justify-content: center; gap: 20rpx; margin: 0 24rpx 20rpx; padding: 16rpx 20rpx; background: #FFFFFF; border-radius: 999rpx; box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06); }
|
.issue-bar {
|
||||||
.nav-btn { width: 64rpx; height: 64rpx; border-radius: 50%; background: linear-gradient(135deg, #FF9F43, #FF6B35); color: #FFFFFF; display: flex; align-items: center; justify-content: center; font-size: 28rpx; padding: 0; margin: 0; line-height: 1; box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.3); }
|
display: flex;
|
||||||
.nav-btn:active { transform: scale(0.92); }
|
align-items: center;
|
||||||
.issue-info { display: flex; flex-direction: column; align-items: center; gap: 4rpx; }
|
justify-content: center;
|
||||||
.issue-label { font-size: 28rpx; font-weight: 700; color: #1F2937; }
|
gap: $spacing-lg;
|
||||||
|
margin: 0 $spacing-lg $spacing-lg;
|
||||||
|
padding: $spacing-md $spacing-lg;
|
||||||
|
background: $bg-glass;
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
|
border-radius: $radius-round;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
animation: fadeInUp 0.6s $ease-out 0.2s backwards;
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
||||||
|
}
|
||||||
|
.nav-btn {
|
||||||
|
width: 64rpx;
|
||||||
|
height: 64rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: $bg-page;
|
||||||
|
color: $text-sub;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: $font-sm;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1;
|
||||||
|
transition: all $transition-fast;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: darken($bg-page, 5%);
|
||||||
|
transform: scale(0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.issue-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4rpx;
|
||||||
|
min-width: 200rpx;
|
||||||
|
}
|
||||||
|
.issue-label {
|
||||||
|
font-size: $font-lg;
|
||||||
|
font-weight: 700;
|
||||||
|
color: $text-main;
|
||||||
|
}
|
||||||
|
|
||||||
/* 玩法福利标签 */
|
/* 玩法福利标签 */
|
||||||
.gameplay-tags { display: flex; gap: 12rpx; padding: 0 24rpx; margin-bottom: 20rpx; flex-wrap: wrap; }
|
.gameplay-tags {
|
||||||
.tag { padding: 10rpx 20rpx; border-radius: 999rpx; font-size: 22rpx; font-weight: 600; }
|
display: flex;
|
||||||
.tag-pool { background: linear-gradient(135deg, #10B981, #34D399); color: #FFFFFF; box-shadow: 0 4rpx 12rpx rgba(16, 185, 129, 0.3); }
|
gap: $spacing-md;
|
||||||
.tag-drop { background: linear-gradient(135deg, #FF9F43, #FF6B35); color: #FFFFFF; box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.3); }
|
padding: 0 $spacing-lg;
|
||||||
.tag-free { background: linear-gradient(135deg, #FFD166, #FF9F43); color: #6b4b1f; box-shadow: 0 4rpx 12rpx rgba(255, 159, 67, 0.3); }
|
margin-bottom: $spacing-lg;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
animation: fadeInUp 0.6s $ease-out 0.3s backwards;
|
||||||
|
}
|
||||||
|
.tag {
|
||||||
|
padding: $spacing-sm $spacing-lg;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
font-size: $font-sm;
|
||||||
|
font-weight: 600;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
backdrop-filter: blur(4px);
|
||||||
|
}
|
||||||
|
.tag-pool {
|
||||||
|
background: $color-success;
|
||||||
|
color: #FFFFFF;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba($color-success, 0.3);
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
.tag-drop {
|
||||||
|
background: $gradient-brand;
|
||||||
|
color: #FFFFFF;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba($brand-primary, 0.3);
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
.tag-free {
|
||||||
|
background: $gradient-gold;
|
||||||
|
color: #FFFFFF;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba($accent-gold, 0.3);
|
||||||
|
text-shadow: 0 1rpx 2rpx rgba(0,0,0,0.1);
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
/* 底部多档位抽赏按钮 */
|
/* 底部多档位抽赏按钮 */
|
||||||
.bottom-actions { position: fixed; left: 0; right: 0; bottom: 0; display: flex; gap: 12rpx; padding: 16rpx 24rpx; padding-bottom: calc(16rpx + env(safe-area-inset-bottom)); background: linear-gradient(180deg, rgba(255,255,255,0.95) 0%, #FFFFFF 100%); backdrop-filter: blur(20rpx); box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.08); z-index: 999; }
|
.bottom-actions {
|
||||||
.tier-btn { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 12rpx 8rpx; background: linear-gradient(135deg, #FFD166, #FF9F43); border-radius: 16rpx; box-shadow: 0 4rpx 12rpx rgba(255, 159, 67, 0.3); }
|
position: fixed;
|
||||||
.tier-btn:active { transform: scale(0.95); }
|
left: 0;
|
||||||
.tier-price { font-size: 24rpx; font-weight: 700; color: #6b4b1f; }
|
right: 0;
|
||||||
.tier-label { font-size: 22rpx; color: #8a5a2b; margin-top: 4rpx; }
|
bottom: 0;
|
||||||
.tier-hot { background: linear-gradient(135deg, #FF9F43, #FF6B35); }
|
display: flex;
|
||||||
.tier-hot .tier-price, .tier-hot .tier-label { color: #FFFFFF; }
|
gap: $spacing-md;
|
||||||
|
padding: $spacing-lg $spacing-lg;
|
||||||
|
padding-bottom: calc($spacing-lg + env(safe-area-inset-bottom));
|
||||||
|
background: rgba(255, 255, 255, 0.9);
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
|
box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.08);
|
||||||
|
z-index: 999;
|
||||||
|
animation: slideUp $transition-slow $ease-out backwards;
|
||||||
|
border-top: 1rpx solid rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
.tier-btn {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: $spacing-md $spacing-xs;
|
||||||
|
background: $bg-card;
|
||||||
|
border: 1rpx solid $border-color-light;
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
transition: all $transition-fast;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.95);
|
||||||
|
background: $bg-page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tier-price {
|
||||||
|
font-size: $font-lg;
|
||||||
|
font-weight: 800;
|
||||||
|
color: $text-main;
|
||||||
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
|
}
|
||||||
|
.tier-label {
|
||||||
|
font-size: $font-xs;
|
||||||
|
color: $text-sub;
|
||||||
|
margin-top: 4rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-hot {
|
||||||
|
background: $gradient-brand;
|
||||||
|
border: none;
|
||||||
|
box-shadow: $shadow-warm;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.tier-price, .tier-label {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: 'HOT';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
background: linear-gradient(135deg, $accent-red, #D32F2F);
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18rpx;
|
||||||
|
font-weight: 800;
|
||||||
|
padding: 4rpx 10rpx;
|
||||||
|
border-bottom-left-radius: $radius-md;
|
||||||
|
box-shadow: -2rpx 2rpx 4rpx rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
opacity: 0.9;
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tier-hot .tier-price, .tier-hot .tier-label {
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
/* 翻牌弹窗 */
|
/* 翻牌弹窗 */
|
||||||
.flip-overlay { position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 10000 }
|
.flip-overlay {
|
||||||
.flip-mask { position: absolute; left: 0; right: 0; top: 0; bottom: 0; background: rgba(0,0,0,0.6); z-index: 1 }
|
position: fixed;
|
||||||
.flip-content { position: relative; display: flex; flex-direction: column; height: 100%; padding: 24rpx; z-index: 2 }
|
left: 0;
|
||||||
.overlay-close { background: linear-gradient(135deg, #FFD166, #FF9F43) !important; color: #6b4b1f !important; border-radius: 999rpx; align-self: flex-end; font-weight: 600; box-shadow: 0 6rpx 16rpx rgba(255, 159, 67, 0.35); }
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 10000;
|
||||||
|
animation: fadeIn 0.3s ease-out;
|
||||||
|
}
|
||||||
|
.flip-mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(0,0,0,0.8);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.flip-content {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
padding: 24rpx;
|
||||||
|
z-index: 2;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
animation: zoomIn 0.3s $ease-bounce;
|
||||||
|
}
|
||||||
|
.overlay-close {
|
||||||
|
margin-top: 60rpx;
|
||||||
|
width: 240rpx;
|
||||||
|
height: 88rpx;
|
||||||
|
line-height: 88rpx;
|
||||||
|
background: rgba(255,255,255,0.15) !important;
|
||||||
|
border: 1rpx solid rgba(255,255,255,0.3);
|
||||||
|
color: #FFFFFF !important;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 30rpx;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
transition: all $transition-fast;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: rgba(255,255,255,0.25) !important;
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,5 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="page-wrapper">
|
<view class="page-wrapper">
|
||||||
|
<!-- 背景装饰 -->
|
||||||
|
<view class="bg-decoration">
|
||||||
|
<view class="orb orb-1"></view>
|
||||||
|
<view class="orb orb-2"></view>
|
||||||
|
</view>
|
||||||
|
|
||||||
<!-- 顶部背景图(模糊处理) -->
|
<!-- 顶部背景图(模糊处理) -->
|
||||||
<view class="page-bg">
|
<view class="page-bg">
|
||||||
<image class="bg-image" :src="detail.banner" mode="aspectFill" />
|
<image class="bg-image" :src="detail.banner" mode="aspectFill" />
|
||||||
@ -13,7 +19,7 @@
|
|||||||
<scroll-view class="main-scroll" scroll-y>
|
<scroll-view class="main-scroll" scroll-y>
|
||||||
|
|
||||||
<!-- 头部信息卡片 -->
|
<!-- 头部信息卡片 -->
|
||||||
<view class="header-card">
|
<view class="header-card animate-enter">
|
||||||
<image class="header-cover" :src="detail.banner" mode="aspectFill" />
|
<image class="header-cover" :src="detail.banner" mode="aspectFill" />
|
||||||
<view class="header-info">
|
<view class="header-info">
|
||||||
<view class="header-title">{{ detail.name || detail.title || '一番赏活动' }}</view>
|
<view class="header-title">{{ detail.name || detail.title || '一番赏活动' }}</view>
|
||||||
@ -40,7 +46,7 @@
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 赏品概览 -->
|
<!-- 赏品概览 -->
|
||||||
<view class="section-container" v-if="currentIssueRewards.length > 0">
|
<view class="section-container animate-enter stagger-1" v-if="currentIssueRewards.length > 0">
|
||||||
<view class="section-header">
|
<view class="section-header">
|
||||||
<text class="section-title">赏品一览</text>
|
<text class="section-title">赏品一览</text>
|
||||||
<text class="section-more">查看全部 ></text>
|
<text class="section-more">查看全部 ></text>
|
||||||
@ -55,7 +61,7 @@
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 选号区域 -->
|
<!-- 选号区域 -->
|
||||||
<view class="section-container selector-container">
|
<view class="section-container selector-container animate-enter stagger-2">
|
||||||
<!-- 期号切换 -->
|
<!-- 期号切换 -->
|
||||||
<view class="issue-header">
|
<view class="issue-header">
|
||||||
<view class="issue-switch-btn" @click="prevIssue">
|
<view class="issue-switch-btn" @click="prevIssue">
|
||||||
@ -99,8 +105,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, getCurrentInstance } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import ElCard from '../../../components/ElCard.vue'
|
|
||||||
import { onLoad } from '@dcloudio/uni-app'
|
import { onLoad } from '@dcloudio/uni-app'
|
||||||
import FlipGrid from '../../../components/FlipGrid.vue'
|
import FlipGrid from '../../../components/FlipGrid.vue'
|
||||||
import YifanSelector from '@/components/YifanSelector.vue'
|
import YifanSelector from '@/components/YifanSelector.vue'
|
||||||
@ -313,17 +318,7 @@ function nextIssue() {
|
|||||||
currentIssueId.value = (cur && cur.id) || ''
|
currentIssueId.value = (cur && cur.id) || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ensureElCard() {
|
|
||||||
const inst = getCurrentInstance()
|
|
||||||
const app = inst && inst.appContext && inst.appContext.app
|
|
||||||
let comp = null
|
|
||||||
if (typeof window !== 'undefined' && window.ElementPlus && window.ElementPlus.ElCard) {
|
|
||||||
comp = window.ElementPlus.ElCard
|
|
||||||
} else {
|
|
||||||
comp = ElCard
|
|
||||||
}
|
|
||||||
if (app && !app.component('el-card')) app.component('el-card', comp)
|
|
||||||
}
|
|
||||||
|
|
||||||
function onPreviewBanner() {
|
function onPreviewBanner() {
|
||||||
const url = detail.value.banner || ''
|
const url = detail.value.banner || ''
|
||||||
@ -373,38 +368,79 @@ onLoad((opts) => {
|
|||||||
fetchIssues(id)
|
fetchIssues(id)
|
||||||
fetchWinRecords(id)
|
fetchWinRecords(id)
|
||||||
}
|
}
|
||||||
ensureElCard()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
function closeFlip() { showFlip.value = false }
|
function closeFlip() { showFlip.value = false }
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
一番赏页面 - 高级设计重构
|
一番赏页面 - 高级设计重构 (SCSS Integration)
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.page-wrapper {
|
.page-wrapper {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: #F2F3F7;
|
background: $bg-page;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 背景装饰 */
|
||||||
|
.bg-decoration {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb {
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
filter: blur(80px);
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-1 {
|
||||||
|
width: 600rpx;
|
||||||
|
height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-primary, 0.2), transparent 70%);
|
||||||
|
top: -200rpx;
|
||||||
|
left: -200rpx;
|
||||||
|
animation: float 10s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-2 {
|
||||||
|
width: 500rpx;
|
||||||
|
height: 500rpx;
|
||||||
|
background: radial-gradient(circle, rgba($accent-gold, 0.2), transparent 70%);
|
||||||
|
bottom: 20%;
|
||||||
|
right: -100rpx;
|
||||||
|
animation: float 12s ease-in-out infinite reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(30rpx, 50rpx); }
|
||||||
|
}
|
||||||
|
|
||||||
/* 顶部背景 */
|
/* 顶部背景 */
|
||||||
.page-bg {
|
.page-bg {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 600rpx;
|
height: 700rpx; /* 加高背景区域 */
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
.bg-image {
|
.bg-image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
filter: blur(40rpx);
|
filter: blur(30rpx) brightness(0.9); /* 降低亮度提升文字对比度 */
|
||||||
opacity: 0.8;
|
transform: scale(1.1); /* 防止模糊边缘 */
|
||||||
}
|
}
|
||||||
.bg-mask {
|
.bg-mask {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -412,7 +448,7 @@ function closeFlip() { showFlip.value = false }
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(180deg, rgba(242,243,247,0.3) 0%, #F2F3F7 100%);
|
background: linear-gradient(180deg, rgba($bg-page, 0.2) 0%, $bg-page 90%, $bg-page 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-scroll {
|
.main-scroll {
|
||||||
@ -423,83 +459,116 @@ function closeFlip() { showFlip.value = false }
|
|||||||
|
|
||||||
/* 头部卡片 */
|
/* 头部卡片 */
|
||||||
.header-card {
|
.header-card {
|
||||||
margin: 30rpx 24rpx;
|
margin: $spacing-xl $spacing-lg;
|
||||||
background: rgba(255, 255, 255, 0.9);
|
background: rgba($bg-card, 0.85);
|
||||||
backdrop-filter: blur(20rpx);
|
backdrop-filter: blur(24rpx);
|
||||||
border-radius: 32rpx;
|
border-radius: $radius-xl;
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.08);
|
box-shadow: $shadow-card;
|
||||||
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
/* 光泽效果 */
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2rpx;
|
||||||
|
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.8), transparent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.header-cover {
|
.header-cover {
|
||||||
width: 160rpx;
|
width: 180rpx;
|
||||||
height: 160rpx;
|
height: 180rpx;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-md;
|
||||||
margin-right: 24rpx;
|
margin-right: $spacing-lg;
|
||||||
background: #EEE;
|
background: $bg-secondary;
|
||||||
box-shadow: 0 8rpx 16rpx rgba(0,0,0,0.1);
|
box-shadow: $shadow-md;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.header-info {
|
.header-info {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
height: 180rpx;
|
||||||
}
|
}
|
||||||
.header-title {
|
.header-title {
|
||||||
font-size: 34rpx;
|
font-size: $font-xl;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: $spacing-xs;
|
||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
|
@include text-ellipsis(2);
|
||||||
}
|
}
|
||||||
.header-price-row {
|
.header-price-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
color: #FF6B35;
|
color: $brand-primary;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: $spacing-sm;
|
||||||
|
text-shadow: 0 2rpx 4rpx rgba($brand-primary, 0.1);
|
||||||
}
|
}
|
||||||
.price-symbol { font-size: 24rpx; font-weight: 600; }
|
.price-symbol { font-size: $font-md; font-weight: 700; }
|
||||||
.price-num { font-size: 40rpx; font-weight: 800; margin: 0 4rpx; }
|
.price-num { font-size: $font-xxl; font-weight: 900; margin: 0 4rpx; font-family: 'DIN Alternate', sans-serif; }
|
||||||
.price-unit { font-size: 24rpx; color: #999; }
|
.price-unit { font-size: $font-sm; color: $text-sub; margin-left: 4rpx; }
|
||||||
|
|
||||||
.header-tags {
|
.header-tags {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 12rpx;
|
gap: $spacing-xs;
|
||||||
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
.tag-item {
|
.tag-item {
|
||||||
font-size: 20rpx;
|
font-size: $font-xs;
|
||||||
color: #B45309;
|
color: $brand-primary-dark;
|
||||||
background: #FFF4E6;
|
background: rgba($brand-primary, 0.08);
|
||||||
padding: 4rpx 12rpx;
|
padding: 4rpx $spacing-sm;
|
||||||
border-radius: 6rpx;
|
border-radius: $radius-sm;
|
||||||
|
font-weight: 600;
|
||||||
|
border: 1rpx solid rgba($brand-primary, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-actions {
|
.header-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 20rpx;
|
gap: $spacing-lg;
|
||||||
margin-left: 20rpx;
|
margin-left: 20rpx;
|
||||||
padding-left: 20rpx;
|
padding-left: $spacing-lg;
|
||||||
border-left: 1rpx solid #EEE;
|
border-left: 1rpx solid rgba(0,0,0,0.06);
|
||||||
|
justify-content: center;
|
||||||
|
height: 140rpx;
|
||||||
}
|
}
|
||||||
.action-btn {
|
.action-btn {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 20rpx;
|
font-size: $font-xs;
|
||||||
color: #666;
|
color: $text-sub;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.9);
|
||||||
|
color: $text-main;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.action-btn .icon {
|
.action-btn .icon {
|
||||||
font-size: 32rpx;
|
font-size: $font-xl;
|
||||||
margin-bottom: 4rpx;
|
margin-bottom: 6rpx;
|
||||||
|
filter: grayscale(0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 通用板块容器 */
|
/* 通用板块容器 */
|
||||||
.section-container {
|
.section-container {
|
||||||
margin: 24rpx;
|
margin: 0 $spacing-lg $spacing-lg;
|
||||||
background: #FFFFFF;
|
background: rgba(255, 255, 255, 0.9); /* 略微透明 */
|
||||||
border-radius: 32rpx;
|
border-radius: $radius-xl;
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.04);
|
box-shadow: $shadow-sm;
|
||||||
|
backdrop-filter: blur(10rpx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 板块标题 */
|
/* 板块标题 */
|
||||||
@ -507,66 +576,111 @@ function closeFlip() { showFlip.value = false }
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 24rpx;
|
||||||
padding: 0 8rpx;
|
padding: 0 4rpx;
|
||||||
}
|
}
|
||||||
.section-title {
|
.section-title {
|
||||||
font-size: 30rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
|
position: relative;
|
||||||
|
padding-left: $spacing-lg;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
width: 8rpx;
|
||||||
|
height: 28rpx;
|
||||||
|
background: $gradient-brand;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.section-more {
|
.section-more {
|
||||||
font-size: 24rpx;
|
font-size: $font-sm;
|
||||||
color: #999;
|
color: $text-tertiary;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '>';
|
||||||
|
font-family: monospace;
|
||||||
|
margin-left: 6rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 奖品概览 */
|
/* 奖品概览 */
|
||||||
.preview-scroll {
|
.preview-scroll {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
margin: 0 -$spacing-lg; /* 负边距抵消padding */
|
||||||
|
padding: 0 $spacing-lg;
|
||||||
|
width: calc(100% + 40rpx);
|
||||||
}
|
}
|
||||||
.preview-item {
|
.preview-item {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 180rpx;
|
width: 200rpx;
|
||||||
margin-right: 20rpx;
|
margin-right: $spacing-lg;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
position: relative;
|
||||||
|
transition: transform 0.2s;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 40rpx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.preview-img {
|
.preview-img {
|
||||||
width: 180rpx;
|
width: 200rpx;
|
||||||
height: 180rpx;
|
height: 200rpx;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
background: #F8F8F8;
|
background: $bg-secondary;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: $spacing-md;
|
||||||
box-shadow: inset 0 0 0 1rpx rgba(0,0,0,0.03);
|
box-shadow: $shadow-sm;
|
||||||
|
border: 1rpx solid rgba(0,0,0,0.03);
|
||||||
}
|
}
|
||||||
.preview-name {
|
.preview-name {
|
||||||
font-size: 24rpx;
|
font-size: $font-sm;
|
||||||
color: #333;
|
color: $text-secondary;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
.prize-tag {
|
.prize-tag {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 8rpx;
|
top: 10rpx;
|
||||||
left: 8rpx;
|
left: 10rpx;
|
||||||
background: rgba(0,0,0,0.6);
|
background: rgba(0,0,0,0.6);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 18rpx;
|
font-size: $font-xs;
|
||||||
padding: 2rpx 8rpx;
|
padding: 4rpx $spacing-sm;
|
||||||
border-radius: 6rpx;
|
border-radius: $radius-sm;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
font-weight: 700;
|
||||||
|
backdrop-filter: blur(4rpx);
|
||||||
|
transform: scale(0.9);
|
||||||
|
transform-origin: top left;
|
||||||
}
|
}
|
||||||
.prize-tag.tag-boss {
|
.prize-tag.tag-boss {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba($brand-primary, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 选号区容器 */
|
/* 选号区容器 */
|
||||||
.selector-container {
|
.selector-container {
|
||||||
min-height: 600rpx;
|
min-height: 800rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
background: rgba($bg-card, 0.95);
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 期号头部 */
|
/* 期号头部 */
|
||||||
@ -574,46 +688,53 @@ function closeFlip() { showFlip.value = false }
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: 30rpx;
|
||||||
background: #F9FAFB;
|
background: $bg-grey;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-round; /* 胶囊形 */
|
||||||
padding: 12rpx;
|
padding: 10rpx;
|
||||||
|
border: 1rpx solid $border-color-light;
|
||||||
}
|
}
|
||||||
.issue-switch-btn {
|
.issue-switch-btn {
|
||||||
width: 64rpx;
|
width: 72rpx;
|
||||||
height: 64rpx;
|
height: 72rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 16rpx;
|
border-radius: 50%;
|
||||||
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.05);
|
box-shadow: $shadow-sm;
|
||||||
}
|
transition: all 0.2s;
|
||||||
.issue-switch-btn:active {
|
color: $text-secondary;
|
||||||
transform: scale(0.95);
|
|
||||||
background: #F0F0F0;
|
&:active {
|
||||||
|
transform: scale(0.9);
|
||||||
|
background: $bg-secondary;
|
||||||
|
color: $brand-primary;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.arrow {
|
.arrow {
|
||||||
font-size: 24rpx;
|
font-size: $font-sm;
|
||||||
color: #999;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
.issue-info-center {
|
.issue-info-center {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
flex: 1;
|
||||||
}
|
}
|
||||||
.issue-current-text {
|
.issue-current-text {
|
||||||
font-size: 30rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #333;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
.issue-status-badge {
|
.issue-status-badge {
|
||||||
font-size: 20rpx;
|
font-size: $font-xs;
|
||||||
color: #10B981;
|
color: $uni-color-success;
|
||||||
background: #D1FAE5;
|
background: rgba($uni-color-success, 0.1);
|
||||||
padding: 2rpx 12rpx;
|
padding: 2rpx $spacing-md;
|
||||||
border-radius: 999rpx;
|
border-radius: $radius-round;
|
||||||
margin-top: 4rpx;
|
margin-top: 4rpx;
|
||||||
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selector-body {
|
.selector-body {
|
||||||
@ -622,9 +743,61 @@ function closeFlip() { showFlip.value = false }
|
|||||||
|
|
||||||
/* 翻牌弹窗 */
|
/* 翻牌弹窗 */
|
||||||
.flip-overlay { position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 10000; }
|
.flip-overlay { position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 10000; }
|
||||||
.flip-mask { position: absolute; left: 0; right: 0; top: 0; bottom: 0; background: rgba(0,0,0,0.6); z-index: 1; }
|
.flip-mask {
|
||||||
.flip-content { position: relative; display: flex; flex-direction: column; height: 100%; padding: 24rpx; z-index: 2; }
|
position: absolute; left: 0; right: 0; top: 0; bottom: 0;
|
||||||
.overlay-close { background: linear-gradient(135deg, #FFD93D, #FFB800) !important; color: #6b4b1f !important; border-radius: 999rpx; align-self: flex-end; font-weight: 600; box-shadow: 0 6rpx 16rpx rgba(255, 184, 0, 0.35); }
|
background: rgba(0,0,0,0.75);
|
||||||
|
backdrop-filter: blur(10rpx);
|
||||||
|
z-index: 1;
|
||||||
|
animation: fadeIn 0.3s ease-out;
|
||||||
|
}
|
||||||
|
.flip-content {
|
||||||
|
position: relative; display: flex; flex-direction: column; height: 100%; padding: 40rpx; z-index: 2;
|
||||||
|
animation: scaleIn 0.3s ease-out;
|
||||||
|
}
|
||||||
|
.overlay-close {
|
||||||
|
background: rgba(255,255,255,0.2) !important;
|
||||||
|
color: #FFFFFF !important;
|
||||||
|
border-radius: 999rpx;
|
||||||
|
align-self: center;
|
||||||
|
margin-top: 40rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
border: 1rpx solid rgba(255,255,255,0.3);
|
||||||
|
padding: 10rpx 60rpx;
|
||||||
|
font-size: 30rpx;
|
||||||
|
backdrop-filter: blur(10rpx);
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: rgba(255,255,255,0.3) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 动画定义 */
|
||||||
|
.animate-enter {
|
||||||
|
animation: fadeInUp 0.6s cubic-bezier(0.2, 0.8, 0.2, 1) backwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stagger-1 { animation-delay: 0.1s; }
|
||||||
|
.stagger-2 { animation-delay: 0.2s; }
|
||||||
|
.stagger-3 { animation-delay: 0.3s; }
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(40rpx);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes scaleIn {
|
||||||
|
from { opacity: 0; transform: scale(0.9); }
|
||||||
|
to { opacity: 1; transform: scale(1); }
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@ -148,16 +148,16 @@ onLoad((opts) => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 地址编辑页面
|
奇盒潮玩 - 地址编辑页面
|
||||||
采用暖橙色调的表单设计
|
采用暖橙色调的表单设计
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.wrap {
|
.wrap {
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%);
|
background: $bg-page;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 表单项 */
|
/* 表单项 */
|
||||||
@ -165,59 +165,70 @@ onLoad((opts) => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-lg;
|
||||||
padding: 20rpx 24rpx;
|
padding: $spacing-lg $spacing-xl;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
|
box-shadow: $shadow-sm;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:focus-within {
|
||||||
|
box-shadow: $shadow-md;
|
||||||
|
transform: translateY(-2rpx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.label {
|
||||||
width: 160rpx;
|
width: 160rpx;
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
color: #6B7280;
|
color: $text-main;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.input {
|
.input {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
|
height: 48rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 提交按钮 */
|
/* 提交按钮 */
|
||||||
.submit {
|
.submit {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 88rpx;
|
height: 96rpx;
|
||||||
line-height: 88rpx;
|
line-height: 96rpx;
|
||||||
margin-top: 32rpx;
|
margin-top: 60rpx;
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35) !important;
|
background: $gradient-brand !important;
|
||||||
color: #FFFFFF !important;
|
color: #FFFFFF !important;
|
||||||
border-radius: 44rpx;
|
border-radius: $radius-round;
|
||||||
font-size: 32rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 600;
|
font-weight: 800;
|
||||||
border: none;
|
border: none;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-warm;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
}
|
|
||||||
.submit:active {
|
&:active {
|
||||||
transform: scale(0.97);
|
transform: scale(0.96);
|
||||||
box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.25);
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
.submit[disabled] {
|
|
||||||
opacity: 0.6;
|
&[disabled] {
|
||||||
box-shadow: none;
|
opacity: 0.6;
|
||||||
|
box-shadow: none;
|
||||||
|
background: $text-disabled !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 错误提示 */
|
/* 错误提示 */
|
||||||
.error {
|
.error {
|
||||||
color: #EF4444;
|
color: $color-error;
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
margin-top: 16rpx;
|
margin-top: $spacing-lg;
|
||||||
padding: 16rpx;
|
padding: $spacing-md;
|
||||||
background: rgba(239, 68, 68, 0.1);
|
background: rgba($color-error, 0.1);
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-md;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@ -113,33 +113,33 @@ onLoad(() => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 地址管理页面
|
奇盒潮玩 - 地址管理页面
|
||||||
采用暖橙色调的卡片列表设计
|
采用暖橙色调的卡片列表设计
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.wrap {
|
.wrap {
|
||||||
padding: 24rpx;
|
padding: $spacing-md;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%);
|
background-color: $bg-page;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: $spacing-lg;
|
||||||
}
|
}
|
||||||
.add {
|
.add {
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35) !important;
|
background: $gradient-brand !important;
|
||||||
color: #FFFFFF !important;
|
color: #FFFFFF !important;
|
||||||
border-radius: 999rpx;
|
border-radius: $radius-round;
|
||||||
padding: 0 32rpx;
|
padding: 0 $spacing-xl;
|
||||||
height: 72rpx;
|
height: 72rpx;
|
||||||
line-height: 72rpx;
|
line-height: 72rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-warm;
|
||||||
}
|
}
|
||||||
.add:active {
|
.add:active {
|
||||||
transform: scale(0.96);
|
transform: scale(0.96);
|
||||||
@ -148,49 +148,56 @@ onLoad(() => {
|
|||||||
/* 地址卡片 */
|
/* 地址卡片 */
|
||||||
.addr {
|
.addr {
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-md;
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
box-shadow: $shadow-sm;
|
||||||
|
animation: fadeInUp 0.4s ease-out backwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@for $i from 1 through 10 {
|
||||||
|
.addr:nth-child(#{$i}) {
|
||||||
|
animation-delay: #{$i * 0.05}s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.addr-main {
|
.addr-main {
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.addr-row {
|
.addr-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: $spacing-sm;
|
||||||
}
|
}
|
||||||
.addr-row:last-child {
|
.addr-row:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
font-size: 30rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
.phone {
|
.phone {
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
color: #6B7280;
|
color: $text-sub;
|
||||||
}
|
}
|
||||||
.default {
|
.default {
|
||||||
font-size: 22rpx;
|
font-size: $font-xs;
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
padding: 4rpx 12rpx;
|
padding: 4rpx $spacing-sm;
|
||||||
border-radius: 999rpx;
|
border-radius: $radius-round;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
.region {
|
.region {
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
color: #6B7280;
|
color: $text-sub;
|
||||||
}
|
}
|
||||||
.detail {
|
.detail {
|
||||||
font-size: 26rpx;
|
font-size: $font-md;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,47 +205,66 @@ onLoad(() => {
|
|||||||
.addr-actions {
|
.addr-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
gap: 12rpx;
|
gap: $spacing-md;
|
||||||
margin-top: 16rpx;
|
margin-top: $spacing-lg;
|
||||||
padding-top: 16rpx;
|
padding-top: $spacing-lg;
|
||||||
border-top: 1rpx solid #F3F4F6;
|
border-top: 1rpx solid $border-color-light;
|
||||||
}
|
}
|
||||||
.addr-actions button {
|
.addr-actions button {
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
height: 56rpx;
|
height: 52rpx;
|
||||||
line-height: 56rpx;
|
line-height: 52rpx;
|
||||||
padding: 0 24rpx;
|
padding: 0 $spacing-lg;
|
||||||
border-radius: 28rpx;
|
border-radius: $radius-round;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-weight: 600;
|
||||||
|
border: none;
|
||||||
|
background: $bg-secondary;
|
||||||
|
color: $text-main;
|
||||||
|
|
||||||
|
&::after { border: none; }
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
background: darken($bg-secondary, 5%);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.addr-actions button[type="warn"] {
|
.addr-actions button[type="warn"] {
|
||||||
background: #FEE2E2 !important;
|
background: rgba($color-error, 0.1) !important;
|
||||||
color: #EF4444 !important;
|
color: $color-error !important;
|
||||||
}
|
}
|
||||||
.addr-actions button:not([type]) {
|
.addr-actions button:not([type]) {
|
||||||
background: #F3F4F6 !important;
|
background: $bg-secondary !important;
|
||||||
color: #6B7280 !important;
|
color: $text-main !important;
|
||||||
}
|
|
||||||
.addr-actions button:not([type]):active {
|
|
||||||
background: #E5E7EB !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 空状态 */
|
/* 空状态 */
|
||||||
.empty {
|
.empty {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #9CA3AF;
|
color: $text-sub;
|
||||||
margin-top: 120rpx;
|
margin-top: 120rpx;
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 错误提示 */
|
/* 错误提示 */
|
||||||
.error {
|
.error {
|
||||||
color: #EF4444;
|
color: $color-error;
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
padding: 16rpx;
|
padding: $spacing-md;
|
||||||
background: rgba(239, 68, 68, 0.1);
|
background: rgba($color-error, 0.1);
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-md;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(20rpx);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@ -680,242 +680,251 @@ async function onShip() {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 货柜页面
|
奇盒潮玩 - 货柜页面
|
||||||
采用暖橙色调,物品卡片式布局
|
采用现代卡片式布局,统一设计语言
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.item-status {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #FF9F43;
|
|
||||||
margin-top: 4rpx;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
.item-meta {
|
|
||||||
font-size: 22rpx;
|
|
||||||
color: #9CA3AF;
|
|
||||||
margin-top: 4rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wrap {
|
.wrap {
|
||||||
padding: 24rpx;
|
padding: 0;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%);
|
background: $bg-page;
|
||||||
|
padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tab 切换 */
|
/* 顶部 Tab */
|
||||||
.tabs {
|
.tabs {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 88rpx;
|
||||||
|
background: rgba($bg-card, 0.9);
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
display: flex;
|
display: flex;
|
||||||
background: #FFFFFF;
|
align-items: center;
|
||||||
border-radius: 20rpx;
|
justify-content: center;
|
||||||
padding: 8rpx;
|
z-index: 100;
|
||||||
margin-bottom: 24rpx;
|
box-shadow: $shadow-sm;
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-item {
|
.tab-item {
|
||||||
|
position: relative;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: center;
|
height: 100%;
|
||||||
font-size: 28rpx;
|
|
||||||
color: #6B7280;
|
|
||||||
padding: 20rpx 0;
|
|
||||||
border-radius: 16rpx;
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8rpx;
|
justify-content: center;
|
||||||
}
|
|
||||||
|
|
||||||
.tab-item.active {
|
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
|
||||||
color: #FFFFFF;
|
|
||||||
font-weight: 600;
|
|
||||||
box-shadow: 0 6rpx 20rpx rgba(255, 107, 53, 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tab-text {
|
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
|
color: $text-sub;
|
||||||
|
transition: all 0.3s;
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: $brand-primary;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 30rpx;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: 40rpx;
|
||||||
|
height: 4rpx;
|
||||||
|
background: $brand-primary;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-count {
|
.tab-count {
|
||||||
font-size: 24rpx;
|
margin-left: 8rpx;
|
||||||
opacity: 0.85;
|
font-size: 20rpx;
|
||||||
|
background: rgba($brand-primary, 0.1);
|
||||||
|
padding: 2rpx 10rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
color: $brand-primary;
|
||||||
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 操作栏 */
|
/* 状态提示 */
|
||||||
|
.status-text {
|
||||||
|
padding-top: 200rpx;
|
||||||
|
text-align: center;
|
||||||
|
color: $text-tertiary;
|
||||||
|
font-size: 28rpx;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.loading-more, .no-more {
|
||||||
|
text-align: center;
|
||||||
|
padding: 30rpx;
|
||||||
|
color: $text-tertiary;
|
||||||
|
font-size: 24rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tab 0: 待处理列表 */
|
||||||
.action-bar {
|
.action-bar {
|
||||||
|
margin-top: 108rpx; /* 88rpx tabs + 20rpx spacing */
|
||||||
|
padding: 0 $spacing-lg;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 20rpx;
|
|
||||||
padding: 0 8rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.select-all {
|
.select-all {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
font-weight: 500;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.select-all .checkbox {
|
|
||||||
margin-right: 12rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
font-size: 32rpx;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #1F2937;
|
|
||||||
margin-bottom: 24rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-text {
|
|
||||||
text-align: center;
|
|
||||||
color: #9CA3AF;
|
|
||||||
margin-top: 120rpx;
|
|
||||||
font-size: 28rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 物品列表 */
|
|
||||||
.inventory-grid {
|
.inventory-grid {
|
||||||
|
padding: 0 $spacing-lg;
|
||||||
|
margin-top: 108rpx; /* default margin if no action bar */
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
|
}
|
||||||
|
/* Adjust margin if action bar exists */
|
||||||
|
.action-bar + .inventory-grid {
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.inventory-item {
|
.inventory-item {
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
padding: 24rpx;
|
padding: 24rpx;
|
||||||
|
margin-bottom: 0; /* handled by gap */
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
box-shadow: $shadow-sm;
|
||||||
|
border: 1rpx solid rgba(0,0,0,0.02);
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
|
animation: fadeInUp 0.4s ease-out backwards;
|
||||||
|
|
||||||
|
@for $i from 1 through 10 {
|
||||||
|
&:nth-child(#{$i}) {
|
||||||
|
animation-delay: #{$i * 0.05}s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.inventory-item:active {
|
|
||||||
transform: scale(0.98);
|
.checkbox-area {
|
||||||
|
padding: 20rpx 20rpx 20rpx 0;
|
||||||
|
}
|
||||||
|
.checkbox {
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
border: 2rpx solid $text-tertiary;
|
||||||
|
border-radius: 50%;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&.checked {
|
||||||
|
background: $brand-primary;
|
||||||
|
border-color: $brand-primary;
|
||||||
|
position: relative;
|
||||||
|
box-shadow: 0 0 10rpx rgba($brand-primary, 0.3);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 18rpx;
|
||||||
|
height: 10rpx;
|
||||||
|
border-left: 3rpx solid #fff;
|
||||||
|
border-bottom: 3rpx solid #fff;
|
||||||
|
transform: translate(-50%, -65%) rotate(-45deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-image {
|
.item-image {
|
||||||
width: 140rpx;
|
width: 140rpx;
|
||||||
height: 140rpx;
|
height: 140rpx;
|
||||||
margin-right: 24rpx;
|
border-radius: $radius-md;
|
||||||
border-radius: 16rpx;
|
background: $bg-page;
|
||||||
background: linear-gradient(145deg, #FFF8F3, #FFF4E6);
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.06);
|
margin-right: 0; /* reset old margin */
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-info {
|
.item-info {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: left;
|
margin-left: 24rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: space-between;
|
||||||
|
height: 140rpx;
|
||||||
|
text-align: left; /* reset old text-align */
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-name {
|
.item-name {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #1F2937;
|
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
display: block;
|
color: $text-main;
|
||||||
margin-bottom: 8rpx;
|
@include text-ellipsis(2);
|
||||||
white-space: nowrap;
|
margin-bottom: 0; /* reset old margin */
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-count {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #9CA3AF;
|
|
||||||
margin-bottom: 4rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-price {
|
.item-price {
|
||||||
font-size: 26rpx;
|
font-size: 24rpx;
|
||||||
color: #FF6B35;
|
color: $brand-primary;
|
||||||
|
margin-top: 8rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 复选框 */
|
|
||||||
.checkbox-area {
|
|
||||||
padding: 10rpx 20rpx 10rpx 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox {
|
|
||||||
width: 44rpx;
|
|
||||||
height: 44rpx;
|
|
||||||
border: 3rpx solid #E5E7EB;
|
|
||||||
border-radius: 50%;
|
|
||||||
position: relative;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox.checked {
|
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
|
||||||
border-color: #FF9F43;
|
|
||||||
box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox.checked::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -60%) rotate(45deg);
|
|
||||||
width: 12rpx;
|
|
||||||
height: 22rpx;
|
|
||||||
border-right: 4rpx solid #fff;
|
|
||||||
border-bottom: 4rpx solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 数量步进器 */
|
|
||||||
.item-actions {
|
.item-actions {
|
||||||
margin-top: 12rpx;
|
margin-top: auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
.item-count {
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: $text-main;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
.stepper {
|
.stepper {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: #F9FAFB;
|
background: $bg-page;
|
||||||
border: 2rpx solid #E5E7EB;
|
border-radius: $radius-sm;
|
||||||
border-radius: 12rpx;
|
padding: 4rpx;
|
||||||
height: 52rpx;
|
height: auto; /* reset old height */
|
||||||
overflow: hidden;
|
border: none; /* reset old border */
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-btn {
|
.step-btn {
|
||||||
width: 52rpx;
|
width: 56rpx;
|
||||||
height: 100%;
|
height: 56rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background: transparent;
|
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
color: #6B7280;
|
color: $text-main;
|
||||||
transition: all 0.15s ease;
|
background: transparent;
|
||||||
|
|
||||||
|
&.minus { color: $text-sub; border: none; }
|
||||||
|
&.plus { color: $brand-primary; border: none; }
|
||||||
|
|
||||||
|
&:active { opacity: 0.6; background: transparent !important; transform: scale(0.9); }
|
||||||
}
|
}
|
||||||
.step-btn:active {
|
|
||||||
background: #FFF4E6;
|
|
||||||
color: #FF6B35;
|
|
||||||
}
|
|
||||||
|
|
||||||
.step-btn.minus { border-right: 2rpx solid #E5E7EB; }
|
|
||||||
.step-btn.plus { border-left: 2rpx solid #E5E7EB; }
|
|
||||||
|
|
||||||
.step-num {
|
.step-num {
|
||||||
width: 64rpx;
|
min-width: 60rpx;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 底部操作栏 */
|
/* 底部操作栏 */
|
||||||
@ -924,411 +933,227 @@ async function onShip() {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
height: 110rpx;
|
background: rgba($bg-card, 0.95);
|
||||||
background: #FFFFFF;
|
backdrop-filter: blur(20rpx);
|
||||||
|
padding: 20rpx 30rpx calc(20rpx + env(safe-area-inset-bottom));
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 0 24rpx;
|
box-shadow: 0 -4rpx 20rpx rgba(0,0,0,0.05);
|
||||||
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.08);
|
z-index: 99;
|
||||||
z-index: 100;
|
height: auto; /* reset old height */
|
||||||
padding-bottom: constant(safe-area-inset-bottom);
|
animation: slideUp 0.3s ease-out;
|
||||||
padding-bottom: env(safe-area-inset-bottom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.selected-info {
|
.selected-info {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-group {
|
.btn-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.action-btn {
|
.action-btn {
|
||||||
margin: 0;
|
|
||||||
height: 72rpx;
|
height: 72rpx;
|
||||||
line-height: 72rpx;
|
padding: 0 40rpx;
|
||||||
|
border-radius: $radius-round;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
border-radius: 36rpx;
|
display: flex;
|
||||||
padding: 0 36rpx;
|
align-items: center;
|
||||||
border: none;
|
justify-content: center;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s;
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1; /* reset line-height */
|
||||||
|
|
||||||
|
&:active { transform: scale(0.96); }
|
||||||
}
|
}
|
||||||
.action-btn:active {
|
|
||||||
transform: scale(0.95);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-ship {
|
.btn-ship {
|
||||||
background: linear-gradient(135deg, #FFD166, #FF9F43);
|
background: rgba($brand-primary, 0.1);
|
||||||
color: #6b4b1f;
|
color: $brand-primary;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 159, 67, 0.35);
|
box-shadow: none; /* reset shadow */
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-redeem {
|
.btn-redeem {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
color: #FFFFFF;
|
color: #fff;
|
||||||
box-shadow: 0 6rpx 16rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-warm;
|
||||||
|
animation: none; /* reset animation */
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-more, .no-more {
|
/* Tab 1: 已申请发货 */
|
||||||
text-align: center;
|
|
||||||
color: #9CA3AF;
|
|
||||||
padding: 24rpx 0;
|
|
||||||
font-size: 26rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-spacer {
|
|
||||||
height: 130rpx;
|
|
||||||
height: calc(130rpx + constant(safe-area-inset-bottom));
|
|
||||||
height: calc(130rpx + env(safe-area-inset-bottom));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ============================================
|
|
||||||
发货单卡片样式
|
|
||||||
============================================ */
|
|
||||||
.shipment-list {
|
.shipment-list {
|
||||||
|
padding: 0 $spacing-lg;
|
||||||
|
margin-top: 108rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 24rpx;
|
gap: 24rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shipment-card {
|
.shipment-card {
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 24rpx;
|
border-radius: $radius-lg;
|
||||||
padding: 28rpx;
|
padding: 30rpx;
|
||||||
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);
|
margin-bottom: 0; /* handled by gap */
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
border: 1rpx solid rgba(0,0,0,0.02);
|
||||||
|
animation: fadeInUp 0.4s ease-out backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 发货单头部 */
|
|
||||||
.shipment-header {
|
.shipment-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: flex-start;
|
align-items: center;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: 24rpx;
|
||||||
padding-bottom: 20rpx;
|
padding-bottom: 20rpx;
|
||||||
border-bottom: 1rpx solid #F3F4F6;
|
border-bottom: 1rpx solid rgba(0,0,0,0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
.shipment-batch {
|
.shipment-batch {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 12rpx;
|
gap: 12rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.batch-label {
|
.batch-label {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
|
|
||||||
.batch-no {
|
.batch-no {
|
||||||
font-size: 22rpx;
|
font-size: 24rpx;
|
||||||
color: #9CA3AF;
|
color: $text-sub;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
.count-badge {
|
.count-badge {
|
||||||
background: linear-gradient(135deg, #FFF4E6, #FFEDD5);
|
font-size: 20rpx;
|
||||||
color: #FF6B35;
|
color: $brand-primary;
|
||||||
font-size: 22rpx;
|
background: rgba($brand-primary, 0.1);
|
||||||
font-weight: 600;
|
padding: 2rpx 10rpx;
|
||||||
padding: 6rpx 16rpx;
|
border-radius: 8rpx;
|
||||||
border-radius: 20rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 发货状态标签 */
|
|
||||||
.shipment-status {
|
.shipment-status {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
padding: 8rpx 20rpx;
|
padding: 4rpx 16rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: 20rpx;
|
||||||
flex-shrink: 0;
|
|
||||||
|
&.status-pending { background: #FFF7E6; color: #FA8C16; }
|
||||||
|
&.status-shipped { background: #E6F7FF; color: #1890FF; }
|
||||||
|
&.status-delivered { background: #F6FFED; color: #52C41A; }
|
||||||
|
&.status-cancelled { background: #F5F5F5; color: #999; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-pending {
|
|
||||||
background: #FEF3C7;
|
|
||||||
color: #D97706;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-shipped {
|
|
||||||
background: #DBEAFE;
|
|
||||||
color: #2563EB;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-delivered {
|
|
||||||
background: #D1FAE5;
|
|
||||||
color: #059669;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-cancelled {
|
|
||||||
background: #FEE2E2;
|
|
||||||
color: #DC2626;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 商品缩略图 */
|
|
||||||
.product-thumbnails {
|
.product-thumbnails {
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 24rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumb-scroll {
|
.thumb-scroll {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
gap: 16rpx;
|
gap: 16rpx;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 16rpx;
|
||||||
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumb-img {
|
.thumb-img {
|
||||||
width: 120rpx;
|
width: 100rpx;
|
||||||
height: 120rpx;
|
height: 100rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-sm;
|
||||||
background: linear-gradient(145deg, #FFF8F3, #FFF4E6);
|
background: $bg-page;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.06);
|
border: 1rpx solid rgba(0,0,0,0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumb-more {
|
.thumb-more {
|
||||||
width: 120rpx;
|
width: 100rpx;
|
||||||
height: 120rpx;
|
height: 100rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-sm;
|
||||||
background: linear-gradient(135deg, #F9FAFB, #F3F4F6);
|
background: $bg-page;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 28rpx;
|
color: $text-sub;
|
||||||
|
font-size: 24rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #6B7280;
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 商品名称列表 */
|
|
||||||
.product-names {
|
.product-names {
|
||||||
display: flex;
|
font-size: 24rpx;
|
||||||
flex-wrap: wrap;
|
color: $text-sub;
|
||||||
gap: 8rpx 16rpx;
|
line-height: 1.4;
|
||||||
|
display: block; /* reset flex */
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-name-item {
|
.product-name-item {
|
||||||
font-size: 24rpx;
|
margin-right: 12rpx;
|
||||||
color: #6B7280;
|
background: transparent; /* reset bg */
|
||||||
background: #F9FAFB;
|
padding: 0;
|
||||||
padding: 6rpx 14rpx;
|
|
||||||
border-radius: 8rpx;
|
&:not(:last-child)::after {
|
||||||
max-width: 200rpx;
|
content: '、';
|
||||||
white-space: nowrap;
|
}
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-name-more {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #FF6B35;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 物流信息 */
|
|
||||||
.shipment-express {
|
.shipment-express {
|
||||||
|
background: $bg-page;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
padding: 16rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: linear-gradient(135deg, #F0F9FF, #E0F2FE);
|
margin-bottom: 20rpx;
|
||||||
border-radius: 16rpx;
|
|
||||||
padding: 20rpx;
|
|
||||||
margin-bottom: 16rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.express-icon {
|
.express-icon {
|
||||||
width: 48rpx;
|
width: 60rpx;
|
||||||
height: 48rpx;
|
height: 60rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 50%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
margin-right: 16rpx;
|
margin-right: 16rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.express-info {
|
.express-info {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 4rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.express-company {
|
.express-company {
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
|
|
||||||
.express-no {
|
.express-no {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #6B7280;
|
color: $text-sub;
|
||||||
font-family: monospace;
|
margin-top: 4rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.express-copy {
|
.express-copy {
|
||||||
font-size: 24rpx;
|
font-size: 22rpx;
|
||||||
color: #2563EB;
|
color: $brand-primary;
|
||||||
font-weight: 500;
|
padding: 6rpx 16rpx;
|
||||||
padding: 12rpx 20rpx;
|
border: 1rpx solid $brand-primary;
|
||||||
background: #FFFFFF;
|
border-radius: 20rpx;
|
||||||
border-radius: 12rpx;
|
background: transparent; /* reset bg */
|
||||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
|
box-shadow: none; /* reset shadow */
|
||||||
|
|
||||||
|
&:active { background: rgba($brand-primary, 0.05); }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 时间信息 */
|
|
||||||
.shipment-time {
|
.shipment-time {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 6rpx;
|
gap: 8rpx;
|
||||||
|
border-top: 1rpx dashed rgba(0,0,0,0.05);
|
||||||
|
padding-top: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.time-item {
|
.time-item {
|
||||||
font-size: 22rpx;
|
font-size: 22rpx;
|
||||||
color: #9CA3AF;
|
color: $text-tertiary;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ============================================
|
|
||||||
盒柜 UX/UI 增强
|
|
||||||
============================================ */
|
|
||||||
|
|
||||||
/* 入场动画 */
|
|
||||||
@keyframes fadeInUp {
|
@keyframes fadeInUp {
|
||||||
from { opacity: 0; transform: translateY(30rpx); }
|
from { opacity: 0; transform: translateY(20rpx); }
|
||||||
to { opacity: 1; transform: translateY(0); }
|
to { opacity: 1; transform: translateY(0); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes scaleIn {
|
|
||||||
from { opacity: 0; transform: scale(0.95); }
|
|
||||||
to { opacity: 1; transform: scale(1); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideUp {
|
@keyframes slideUp {
|
||||||
from { opacity: 0; transform: translateY(100%); }
|
from { transform: translateY(100%); }
|
||||||
to { opacity: 1; transform: translateY(0); }
|
to { transform: translateY(0); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes bounceIn {
|
.bottom-spacer {
|
||||||
0% { transform: scale(0); }
|
height: 120rpx;
|
||||||
50% { transform: scale(1.2); }
|
|
||||||
100% { transform: scale(1); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes pulse {
|
|
||||||
0%, 100% { transform: scale(1); }
|
|
||||||
50% { transform: scale(1.05); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tab 切换动画 */
|
|
||||||
.tabs {
|
|
||||||
animation: fadeInUp 0.3s ease-out;
|
|
||||||
}
|
|
||||||
.tab-item {
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
}
|
|
||||||
.tab-item:active {
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 库存卡片交错入场 */
|
|
||||||
.inventory-item:nth-child(1) { animation: fadeInUp 0.4s ease-out 0.1s both; }
|
|
||||||
.inventory-item:nth-child(2) { animation: fadeInUp 0.4s ease-out 0.15s both; }
|
|
||||||
.inventory-item:nth-child(3) { animation: fadeInUp 0.4s ease-out 0.2s both; }
|
|
||||||
.inventory-item:nth-child(4) { animation: fadeInUp 0.4s ease-out 0.25s both; }
|
|
||||||
.inventory-item:nth-child(n+5) { animation: fadeInUp 0.4s ease-out 0.3s both; }
|
|
||||||
|
|
||||||
/* 发货单卡片交错入场 */
|
|
||||||
.shipment-card:nth-child(1) { animation: fadeInUp 0.4s ease-out 0.1s both; }
|
|
||||||
.shipment-card:nth-child(2) { animation: fadeInUp 0.4s ease-out 0.15s both; }
|
|
||||||
.shipment-card:nth-child(3) { animation: fadeInUp 0.4s ease-out 0.2s both; }
|
|
||||||
.shipment-card:nth-child(n+4) { animation: fadeInUp 0.4s ease-out 0.25s both; }
|
|
||||||
|
|
||||||
/* 卡片点击效果 */
|
|
||||||
.inventory-item {
|
|
||||||
transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
||||||
}
|
|
||||||
.inventory-item:active {
|
|
||||||
transform: scale(0.98);
|
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 选中时的高亮效果 */
|
|
||||||
.inventory-item:has(.checkbox.checked) {
|
|
||||||
box-shadow: 0 8rpx 32rpx rgba(255, 107, 53, 0.15);
|
|
||||||
border: 2rpx solid rgba(255, 159, 67, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 复选框动画 */
|
|
||||||
.checkbox {
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
.checkbox.checked {
|
|
||||||
animation: bounceIn 0.3s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 底部操作栏增强 */
|
|
||||||
.bottom-bar {
|
|
||||||
animation: slideUp 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
||||||
backdrop-filter: blur(20rpx);
|
|
||||||
-webkit-backdrop-filter: blur(20rpx);
|
|
||||||
background: rgba(255, 255, 255, 0.95);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 操作按钮动画 */
|
|
||||||
.action-btn {
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
.action-btn:active {
|
|
||||||
transform: scale(0.95);
|
|
||||||
}
|
|
||||||
.btn-redeem {
|
|
||||||
animation: pulse 2s infinite;
|
|
||||||
}
|
|
||||||
.btn-redeem:active {
|
|
||||||
animation: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 步进器按钮效果 */
|
|
||||||
.step-btn {
|
|
||||||
transition: all 0.15s ease;
|
|
||||||
}
|
|
||||||
.step-btn:active {
|
|
||||||
background: #FF9F43 !important;
|
|
||||||
color: #fff !important;
|
|
||||||
transform: scale(0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 全选栏入场 */
|
|
||||||
.action-bar {
|
|
||||||
animation: fadeInUp 0.3s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 发货单卡片点击效果 */
|
|
||||||
.shipment-card {
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
}
|
|
||||||
.shipment-card:active {
|
|
||||||
transform: scale(0.98);
|
|
||||||
box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 复制按钮效果 */
|
|
||||||
.express-copy {
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
.express-copy:active {
|
|
||||||
background: #2563EB;
|
|
||||||
color: #fff;
|
|
||||||
transform: scale(0.95);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 缩略图图片悬浮效果 */
|
|
||||||
.thumb-img {
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
.thumb-img:active {
|
|
||||||
transform: scale(1.05);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="page">
|
<view class="page">
|
||||||
|
<!-- 背景装饰 -->
|
||||||
|
<view class="bg-decoration"></view>
|
||||||
|
|
||||||
<!-- 顶部导航栏 (搜索) -->
|
<!-- 顶部导航栏 (搜索) -->
|
||||||
<view class="nav-header">
|
<view class="nav-header">
|
||||||
<view class="brand-logo">
|
<view class="brand-logo">
|
||||||
@ -336,14 +339,14 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style lang="scss">
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 首页样式 (V6.0 新版)
|
奇盒潮玩 - 首页样式 (V6.0 Pro Refined)
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.page {
|
.page {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
background: #FFFFFF;
|
background-color: $bg-page;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -353,166 +356,232 @@ export default {
|
|||||||
.nav-header {
|
.nav-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 20rpx 24rpx;
|
padding: $spacing-md $spacing-lg;
|
||||||
background: #FFF8F3;
|
background: transparent; /* 透明背景,依靠内容区的渐变 */
|
||||||
padding-top: calc(20rpx + env(safe-area-inset-top));
|
padding-top: calc($spacing-md + env(safe-area-inset-top));
|
||||||
gap: 24rpx;
|
gap: $spacing-lg;
|
||||||
|
z-index: 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
.brand-logo {
|
.brand-logo {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.brand-text {
|
.brand-text {
|
||||||
font-size: 36rpx;
|
font-size: 40rpx;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
letter-spacing: -1rpx;
|
letter-spacing: -1rpx;
|
||||||
|
text-shadow: 0 2rpx 4rpx rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.brand-star {
|
.brand-star {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
margin-left: 4rpx;
|
margin-left: 4rpx;
|
||||||
margin-top: -12rpx;
|
margin-top: -16rpx;
|
||||||
|
animation: pulse 2s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-bar {
|
.search-bar {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 64rpx;
|
height: 72rpx;
|
||||||
background: white;
|
background: rgba(255, 255, 255, 0.8);
|
||||||
border-radius: 999rpx;
|
backdrop-filter: blur(10px);
|
||||||
|
border-radius: $radius-round;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 24rpx;
|
padding: 0 $spacing-lg;
|
||||||
border: 1rpx solid #F0F0F0;
|
border: 1rpx solid rgba(255, 255, 255, 0.6);
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
.search-icon { margin-right: 12rpx; font-size: 28rpx; }
|
|
||||||
.search-placeholder { color: #999; font-size: 28rpx; }
|
.search-bar:active {
|
||||||
|
background: #fff;
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-icon { margin-right: 12rpx; font-size: 32rpx; }
|
||||||
|
.search-placeholder { color: $text-tertiary; font-size: 28rpx; font-weight: 500; }
|
||||||
|
|
||||||
|
|
||||||
/* ========== 滚动主内容区 ========== */
|
/* ========== 滚动主内容区 ========== */
|
||||||
.main-content {
|
.main-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 600rpx);
|
/* background: linear-gradient(180deg, $bg-secondary 0%, $bg-page 400rpx); */ /* 移除原有背景,使用全局背景装饰 */
|
||||||
padding-top: 20rpx;
|
position: relative;
|
||||||
|
z-index: 1; /* 确保内容在背景装饰之上 */
|
||||||
|
padding-top: $spacing-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Logo Banner */
|
/* Logo Banner */
|
||||||
.banner-box {
|
.banner-box {
|
||||||
margin: 0 24rpx 24rpx;
|
margin: 0 $spacing-lg $spacing-lg;
|
||||||
border-radius: 24rpx;
|
border-radius: $radius-lg;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0,0,0,0.06);
|
box-shadow: $shadow-float;
|
||||||
|
transform: translateZ(0); /* 开启硬件加速 */
|
||||||
|
animation: fadeInUp 0.6s ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.banner-swiper, .banner-image, .banner-fallback {
|
.banner-swiper, .banner-image, .banner-fallback {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 320rpx;
|
height: 340rpx; /* 略微增高 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.banner-fallback {
|
.banner-fallback {
|
||||||
background: #FFFBE8;
|
background: linear-gradient(135deg, $bg-secondary, #FFF0D6);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border: 2rpx dashed #FFE58F;
|
border: 4rpx dashed $brand-primary-light;
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner-fallback-text {
|
||||||
|
font-size: 48rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
color: $brand-primary;
|
||||||
|
font-style: italic;
|
||||||
|
margin-bottom: 12rpx;
|
||||||
|
text-shadow: 0 2rpx 0 rgba(255,255,255,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner-tag {
|
||||||
|
background: #1A1A1A;
|
||||||
|
color: $accent-gold;
|
||||||
|
padding: 6rpx 20rpx;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
font-size: 24rpx;
|
||||||
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
.banner-fallback-text { font-size: 48rpx; font-weight: 900; color: #1A1A1A; font-style: italic; margin-bottom: 12rpx; }
|
|
||||||
.banner-tag { background: #CCFF00; padding: 4rpx 16rpx; border-radius: 999rpx; font-size: 24rpx; font-weight: 700; color: #1A1A1A; }
|
|
||||||
|
|
||||||
/* 通知栏 */
|
/* 通知栏 */
|
||||||
.notice-bar {
|
.notice-bar {
|
||||||
margin: 0 24rpx 32rpx;
|
margin: 0 $spacing-lg $spacing-xl;
|
||||||
background: #F9F9F9;
|
background: #FFFFFF;
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-round;
|
||||||
padding: 16rpx 20rpx;
|
padding: 16rpx 24rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 16rpx;
|
gap: 16rpx;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
animation: fadeInUp 0.6s ease-out 0.1s backwards;
|
||||||
}
|
}
|
||||||
.notice-tag {
|
|
||||||
background: #333;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 22rpx;
|
|
||||||
padding: 2rpx 8rpx;
|
|
||||||
border-radius: 6rpx;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
.notice-swiper { flex: 1; height: 36rpx; }
|
|
||||||
.notice-item { font-size: 24rpx; color: #333; line-height: 36rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
||||||
.notice-more { font-size: 24rpx; color: #999; }
|
|
||||||
|
|
||||||
|
.notice-tag {
|
||||||
|
background: $gradient-brand;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 20rpx;
|
||||||
|
padding: 4rpx 12rpx;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
box-shadow: 0 2rpx 6rpx rgba($brand-primary, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-swiper { flex: 1; height: 36rpx; }
|
||||||
|
.notice-item {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: $text-main;
|
||||||
|
line-height: 36rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
.notice-more { font-size: 24rpx; color: $text-sub; display: flex; align-items: center; }
|
||||||
|
.notice-more::after { content: '›'; margin-left: 4rpx; font-size: 32rpx; line-height: 24rpx; }
|
||||||
|
|
||||||
|
|
||||||
/* 玩法专区 - 方案B:2+3 杂志风布局 */
|
/* 玩法专区 - 方案B:2+3 杂志风布局 */
|
||||||
.gameplay-section {
|
.gameplay-section {
|
||||||
padding: 0 24rpx;
|
padding: 0 $spacing-lg;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: $spacing-xl;
|
||||||
|
animation: fadeInUp 0.6s ease-out 0.2s backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-header {
|
.section-header {
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
font-size: 34rpx;
|
font-size: 36rpx;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
padding-bottom: 4rpx;
|
padding-left: 12rpx;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
letter-spacing: 2rpx;
|
|
||||||
}
|
}
|
||||||
/* 黄色高光底线效果 */
|
|
||||||
.section-title::after {
|
/* 标题装饰竖线 */
|
||||||
|
.section-title::before {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: 0;
|
top: 50%;
|
||||||
width: 100%;
|
transform: translateY(-50%) skewX(-10deg);
|
||||||
height: 16rpx;
|
width: 8rpx;
|
||||||
background: #FFD700;
|
height: 32rpx;
|
||||||
z-index: -1;
|
background: $brand-primary;
|
||||||
border-radius: 4rpx;
|
border-radius: 2rpx;
|
||||||
transform: skewX(-10deg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.gameplay-grid-v2 {
|
.gameplay-grid-v2 {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 上排 */
|
/* 上排 */
|
||||||
.grid-row-top {
|
.grid-row-top {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
height: 180rpx; /* 大卡片高度 */
|
height: 220rpx; /* 增加高度,展示更多细节 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-card-large {
|
.game-card-large {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 24rpx;
|
padding: 28rpx;
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.05);
|
box-shadow: $shadow-card;
|
||||||
|
transition: transform 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-card-large:active {
|
||||||
|
transform: scale(0.98);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 下排 */
|
/* 下排 */
|
||||||
.grid-row-bottom {
|
.grid-row-bottom {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16rpx;
|
gap: 20rpx;
|
||||||
height: 140rpx; /* 小卡片高度 */
|
height: 160rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-card-small {
|
.game-card-small {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 16rpx;
|
padding: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.03);
|
box-shadow: $shadow-sm;
|
||||||
background: white; /* 默认底色 */
|
background: white;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.game-card-small:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 内容样式 - 大卡片 */
|
/* 内容样式 - 大卡片 */
|
||||||
@ -525,100 +594,116 @@ export default {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-title-large {
|
.card-title-large {
|
||||||
font-size: 36rpx;
|
font-size: 40rpx;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: 16rpx;
|
||||||
text-shadow: 2rpx 2rpx 0 rgba(0,0,0,0.1);
|
text-shadow: 0 4rpx 8rpx rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-tag-large {
|
.card-tag-large {
|
||||||
font-size: 20rpx;
|
font-size: 22rpx;
|
||||||
background: #FFF;
|
background: rgba(255, 255, 255, 0.9);
|
||||||
color: #333;
|
color: $text-main;
|
||||||
padding: 4rpx 12rpx;
|
padding: 6rpx 16rpx;
|
||||||
border-radius: 8rpx;
|
border-radius: $radius-round;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
box-shadow: 2rpx 2rpx 0 rgba(0,0,0,0.1);
|
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1);
|
||||||
transform: skewX(-10deg);
|
backdrop-filter: blur(4px);
|
||||||
}
|
}
|
||||||
.card-tag-large.yellow { color: #875700; }
|
.card-tag-large.yellow { color: #D97706; }
|
||||||
|
|
||||||
.card-mascot-large {
|
.card-mascot-large {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: -10rpx;
|
right: -20rpx;
|
||||||
bottom: -20rpx;
|
bottom: -30rpx;
|
||||||
width: 160rpx;
|
width: 180rpx;
|
||||||
height: 160rpx;
|
height: 180rpx;
|
||||||
transform: rotate(5deg);
|
transform: rotate(10deg);
|
||||||
|
filter: drop-shadow(0 8rpx 16rpx rgba(0,0,0,0.2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 内容样式 - 小卡片 */
|
/* 内容样式 - 小卡片 */
|
||||||
.card-title-small {
|
.card-title-small {
|
||||||
font-size: 28rpx;
|
font-size: 30rpx;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: #333;
|
color: $text-main;
|
||||||
margin-bottom: 4rpx;
|
margin-bottom: 6rpx;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
.card-subtitle-small {
|
|
||||||
font-size: 20rpx;
|
|
||||||
color: #888;
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
.card-icon-small {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 90rpx;
|
|
||||||
height: 90rpx;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 背景配色 - 仿参考图Pop风格 */
|
.card-subtitle-small {
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: $text-sub;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-icon-small {
|
||||||
|
position: absolute;
|
||||||
|
right: -10rpx;
|
||||||
|
bottom: -10rpx;
|
||||||
|
width: 100rpx;
|
||||||
|
height: 100rpx;
|
||||||
|
opacity: 0.9;
|
||||||
|
transform: rotate(-10deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 背景配色 - 优化后的渐变 */
|
||||||
.card-yifan {
|
.card-yifan {
|
||||||
background: linear-gradient(135deg, #FF9C6E 0%, #FF7875 100%); /* 粉红/橘色 */
|
background: linear-gradient(135deg, $brand-primary 0%, $brand-secondary 100%); /* 品牌橙渐变 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-wuxian {
|
.card-wuxian {
|
||||||
background: linear-gradient(135deg, #FFD666 0%, #FFA940 100%); /* 黄色/橙色 */
|
background: $gradient-gold; /* 质感金渐变 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-match {
|
.card-match {
|
||||||
background: linear-gradient(135deg, #FFADD2 0%, #FF85C0 100%); /* 粉色 */
|
background: linear-gradient(135deg, #FF9A9E 0%, #FECFEF 100%); /* 柔和粉 */
|
||||||
}
|
}
|
||||||
|
.card-match .card-title-small { color: $accent-pink; }
|
||||||
|
|
||||||
.card-tower {
|
.card-tower {
|
||||||
background: linear-gradient(135deg, #B37FEB 0%, #9254DE 100%); /* 紫色 */
|
background: linear-gradient(135deg, #E0C3FC 0%, #8EC5FC 100%); /* 梦幻紫蓝 */
|
||||||
}
|
}
|
||||||
|
.card-tower .card-title-small { color: $accent-purple; }
|
||||||
|
|
||||||
.card-more {
|
.card-more {
|
||||||
background: linear-gradient(135deg, #E0E0E0 0%, #F5F5F5 100%); /* 灰色 */
|
background: linear-gradient(135deg, $bg-secondary 0%, #E5E7EB 100%); /* 金属灰 */
|
||||||
}
|
}
|
||||||
/* 对对碰文字颜色适配 */
|
.card-more .card-title-small { color: $text-sub; }
|
||||||
.card-match .card-title-small { color: #FFF; }
|
|
||||||
.card-match .card-subtitle-small { color: rgba(255,255,255,0.8); }
|
|
||||||
.card-tower .card-title-small { color: #FFF; }
|
|
||||||
.card-tower .card-subtitle-small { color: rgba(255,255,255,0.8); }
|
|
||||||
|
|
||||||
/* 推荐活动列表 */
|
/* 推荐活动列表 */
|
||||||
.activity-section {
|
.activity-section {
|
||||||
padding: 0 24rpx;
|
padding: 0 $spacing-lg;
|
||||||
|
animation: fadeInUp 0.6s ease-out 0.3s backwards;
|
||||||
}
|
}
|
||||||
.activity-grid-list {
|
.activity-grid-list {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
gap: 20rpx;
|
gap: 24rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-item {
|
.activity-item {
|
||||||
background: white;
|
background: #FFFFFF;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 8rpx 20rpx rgba(0,0,0,0.06);
|
box-shadow: $shadow-card;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
transition: transform 0.2s;
|
||||||
}
|
}
|
||||||
|
.activity-item:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
.activity-thumb-box {
|
.activity-thumb-box {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-bottom: 100%; /* 1:1 正方形图片 */
|
padding-bottom: 100%; /* 1:1 正方形 */
|
||||||
}
|
}
|
||||||
.activity-thumb {
|
.activity-thumb {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -627,41 +712,34 @@ export default {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
background: #EEE;
|
background: #EEE;
|
||||||
}
|
}
|
||||||
.banner-fallback.mini {
|
|
||||||
position: absolute;
|
|
||||||
top: 0; left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: #F5F5F5;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.activity-tag-hot {
|
.activity-tag-hot {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 12rpx;
|
top: 16rpx;
|
||||||
left: 12rpx;
|
left: 16rpx;
|
||||||
background: rgba(0,0,0,0.6);
|
background: $gradient-brand;
|
||||||
color: #FFD700;
|
color: #fff;
|
||||||
font-size: 20rpx;
|
font-size: 20rpx;
|
||||||
padding: 4rpx 12rpx;
|
padding: 6rpx 14rpx;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
backdrop-filter: blur(4rpx);
|
box-shadow: 0 4rpx 10rpx rgba($brand-primary, 0.3);
|
||||||
|
animation: pulse 2s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-info {
|
.activity-info {
|
||||||
padding: 20rpx;
|
padding: 24rpx;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-name {
|
.activity-name {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #1A1A1A;
|
color: $text-main;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 20rpx;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
@ -669,43 +747,43 @@ export default {
|
|||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-row {
|
.activity-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-desc {
|
.activity-desc {
|
||||||
font-size: 24rpx;
|
font-size: 26rpx;
|
||||||
color: #FF4D4F; /* 价格/品类突出颜色 */
|
color: $accent-red; /* 价格/热度颜色 */
|
||||||
font-weight: 600;
|
font-weight: 800;
|
||||||
max-width: 70%;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-btn-go {
|
.activity-btn-go {
|
||||||
background: #1A1A1A;
|
background: $text-main;
|
||||||
color: #FFD700;
|
color: #FFD700;
|
||||||
font-size: 20rpx;
|
font-size: 20rpx;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
padding: 6rpx 20rpx;
|
padding: 8rpx 24rpx;
|
||||||
border-radius: 30rpx;
|
border-radius: $radius-round;
|
||||||
box-shadow: 0 4rpx 10rpx rgba(0,0,0,0.15);
|
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 空状态 */
|
/* 空状态 */
|
||||||
.activity-empty {
|
.activity-empty {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 60rpx 0;
|
padding: 80rpx 0;
|
||||||
color: #9CA3AF;
|
color: $text-tertiary;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ============================================
|
@keyframes pulse {
|
||||||
UX/UI 增强 - 动画与交互
|
0% { transform: scale(1); opacity: 1; }
|
||||||
============================================ */
|
50% { transform: scale(1.05); opacity: 0.9; }
|
||||||
|
100% { transform: scale(1); opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
/* 入场动画 */
|
|
||||||
@keyframes fadeInUp {
|
@keyframes fadeInUp {
|
||||||
from {
|
from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@ -733,11 +811,6 @@ export default {
|
|||||||
100% { background-position: 200% 0; }
|
100% { background-position: 200% 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes pulse {
|
|
||||||
0%, 100% { transform: scale(1); }
|
|
||||||
50% { transform: scale(1.05); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes float {
|
@keyframes float {
|
||||||
0%, 100% { transform: translateY(0); }
|
0%, 100% { transform: translateY(0); }
|
||||||
50% { transform: translateY(-8rpx); }
|
50% { transform: translateY(-8rpx); }
|
||||||
|
|||||||
@ -5,80 +5,82 @@
|
|||||||
<view class="orb orb-2"></view>
|
<view class="orb orb-2"></view>
|
||||||
|
|
||||||
<view class="content-wrap">
|
<view class="content-wrap">
|
||||||
<!-- 品牌Logo -->
|
<view class="glass-card">
|
||||||
<view class="brand-section">
|
<!-- 品牌Logo -->
|
||||||
<view class="logo-box">
|
<view class="brand-section">
|
||||||
<image class="logo" src="/static/logo.png" mode="widthFix"></image>
|
<view class="logo-box">
|
||||||
|
<image class="logo" src="/static/logo.png" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="app-name">奇盒潮玩</view>
|
||||||
|
<view class="welcome-text">开启欧气之旅 ✨</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="app-name">奇盒潮玩</view>
|
|
||||||
<view class="welcome-text">开启欧气之旅 ✨</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 登录表单 -->
|
<!-- 登录表单 -->
|
||||||
<!-- #ifdef MP-TOUTIAO -->
|
<!-- #ifdef MP-TOUTIAO -->
|
||||||
<view class="login-form">
|
<view class="login-form">
|
||||||
<view class="input-group">
|
<view class="input-group">
|
||||||
<view class="input-icon">
|
<view class="input-icon">
|
||||||
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMEExQTciIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAgMjF2LTJhNCA0IDAgMCAwLTQtNEg4YTQgNCAwIDAgMC00IDR2MiIgLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+PC9zdmc+" mode="aspectFit"></image>
|
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMEExQTciIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAgMjF2LTJhNCA0IDAgMCAwLTQtNEg4YTQgNCAwIDAgMC00IDR2MiIgLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+PC9zdmc+" mode="aspectFit"></image>
|
||||||
</view>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
v-model="account"
|
|
||||||
class="input-field"
|
|
||||||
placeholder="请输入账号"
|
|
||||||
placeholder-class="input-placeholder"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="input-group">
|
|
||||||
<view class="input-icon">
|
|
||||||
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMEExQTciIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzIiB5PS“xMSIgd2lkdGg9“MTgiIGhlaWdodD0iMTEiIHJ4PSIyIiByeT0iMiIgLz48cGF0aCBkPSJNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjQiIC8+PC9zdmc+" mode="aspectFit"></image>
|
|
||||||
</view>
|
|
||||||
<input
|
|
||||||
type="password"
|
|
||||||
v-model="pwd"
|
|
||||||
class="input-field"
|
|
||||||
placeholder="请输入密码"
|
|
||||||
placeholder-class="input-placeholder"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="options-row">
|
|
||||||
<view class="remember-box" @click="toggleRemember">
|
|
||||||
<view class="checkbox" :class="{ checked: remember }">
|
|
||||||
<view class="check-mark" v-if="remember">✓</view>
|
|
||||||
</view>
|
</view>
|
||||||
<text class="remember-text">记住密码</text>
|
<input
|
||||||
|
type="text"
|
||||||
|
v-model="account"
|
||||||
|
class="input-field"
|
||||||
|
placeholder="请输入账号"
|
||||||
|
placeholder-class="input-placeholder"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="input-group">
|
||||||
|
<view class="input-icon">
|
||||||
|
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMEExQTciIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzIiB5PS“xMSIgd2lkdGg9“MTgiIGhlaWdodD0iMTEiIHJ4PSIyIiByeT0iMiIgLz48cGF0aCBkPSJNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjQiIC8+PC9zdmc+" mode="aspectFit"></image>
|
||||||
|
</view>
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
v-model="pwd"
|
||||||
|
class="input-field"
|
||||||
|
placeholder="请输入密码"
|
||||||
|
placeholder-class="input-placeholder"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="options-row">
|
||||||
|
<view class="remember-box" @click="toggleRemember">
|
||||||
|
<view class="checkbox" :class="{ checked: remember }">
|
||||||
|
<view class="check-mark" v-if="remember">✓</view>
|
||||||
|
</view>
|
||||||
|
<text class="remember-text">记住密码</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<button class="btn login-btn" @click="handleLogin">
|
||||||
|
<text class="btn-text">立即登录</text>
|
||||||
|
<view class="btn-shine"></view>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<view class="register-link">
|
||||||
|
<text class="register-text" @click="goToRegister">没有账号?<text class="highlight">立即注册</text></text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<!-- #endif -->
|
||||||
|
|
||||||
<button class="btn login-btn" @click="handleLogin">
|
<!-- #ifdef MP-WEIXIN -->
|
||||||
<text class="btn-text">立即登录</text>
|
<view class="weixin-login-box">
|
||||||
<view class="btn-shine"></view>
|
<button class="btn weixin-btn" open-type="getPhoneNumber" :disabled="loading" @getphonenumber="onGetPhoneNumber">
|
||||||
</button>
|
<image class="wx-icon" src="/static/logo.png" mode="aspectFit"></image> <!-- 应该用微信图标,暂时用logo代替或SVG -->
|
||||||
|
<text>微信一键登录</text>
|
||||||
<view class="register-link">
|
</button>
|
||||||
<text class="register-text" @click="goToRegister">没有账号?<text class="highlight">立即注册</text></text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
<!-- #endif -->
|
||||||
<!-- #endif -->
|
|
||||||
|
|
||||||
<!-- #ifdef MP-WEIXIN -->
|
<!-- 协议区 -->
|
||||||
<view class="weixin-login-box">
|
<view class="agreements">
|
||||||
<button class="btn weixin-btn" open-type="getPhoneNumber" :disabled="loading" @getphonenumber="onGetPhoneNumber">
|
<view class="checkbox-area">
|
||||||
<image class="wx-icon" src="/static/logo.png" mode="aspectFit"></image> <!-- 应该用微信图标,暂时用logo代替或SVG -->
|
<view class="checkbox round" :class="{ checked: agreementChecked }" @click="toggleAgreement"></view>
|
||||||
<text>微信一键登录</text>
|
</view>
|
||||||
</button>
|
<view class="agreement-text">
|
||||||
</view>
|
登录即代表同意 <text class="link" @tap="toUserAgreement">用户协议</text> & <text class="link" @tap="toPurchaseAgreement">隐私政策</text>
|
||||||
<!-- #endif -->
|
</view>
|
||||||
|
|
||||||
<!-- 协议区 -->
|
|
||||||
<view class="agreements">
|
|
||||||
<view class="checkbox-area">
|
|
||||||
<view class="checkbox round" :class="{ checked: agreementChecked }" @click="toggleAgreement"></view>
|
|
||||||
</view>
|
|
||||||
<view class="agreement-text">
|
|
||||||
登录即代表同意 <text class="link" @tap="toUserAgreement">用户协议</text> & <text class="link" @tap="toPurchaseAgreement">隐私政策</text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@ -141,7 +143,6 @@ function onGetPhoneNumber(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const phoneCode = e.detail.code
|
const phoneCode = e.detail.code
|
||||||
console.log('login_flow start getPhoneNumber, codeExists:', !!phoneCode)
|
|
||||||
if (!phoneCode) {
|
if (!phoneCode) {
|
||||||
uni.showToast({ title: '未授权手机号', icon: 'none' })
|
uni.showToast({ title: '未授权手机号', icon: 'none' })
|
||||||
return
|
return
|
||||||
@ -211,12 +212,12 @@ function onGetPhoneNumber(e) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* Page Container */
|
/* Page Container */
|
||||||
.container {
|
.container {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
position: relative;
|
position: relative;
|
||||||
background: #F8F5F2; /* Cream base */
|
background: $bg-secondary; /* Use secondary for better depth with orbs */
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -224,33 +225,56 @@ function onGetPhoneNumber(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Orbs Background */
|
/* Orbs Background */
|
||||||
|
.bg-decoration {
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: 0; width: 100%; height: 100%;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
.orb {
|
.orb {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
filter: blur(60rpx);
|
filter: blur(80rpx); /* Increased blur for smoother look */
|
||||||
z-index: 0;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
.orb-1 {
|
.orb-1 {
|
||||||
width: 400rpx;
|
|
||||||
height: 400rpx;
|
|
||||||
background: rgba(255, 107, 0, 0.15);
|
|
||||||
top: -100rpx;
|
|
||||||
left: -100rpx;
|
|
||||||
}
|
|
||||||
.orb-2 {
|
|
||||||
width: 500rpx;
|
width: 500rpx;
|
||||||
height: 500rpx;
|
height: 500rpx;
|
||||||
background: rgba(255, 215, 0, 0.1);
|
background: radial-gradient(circle, rgba($brand-primary, 0.4), transparent 70%);
|
||||||
|
top: -100rpx;
|
||||||
|
left: -100rpx;
|
||||||
|
animation: float 8s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
.orb-2 {
|
||||||
|
width: 600rpx;
|
||||||
|
height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($accent-gold, 0.3), transparent 70%);
|
||||||
bottom: -150rpx;
|
bottom: -150rpx;
|
||||||
right: -150rpx;
|
right: -150rpx;
|
||||||
|
animation: float 10s ease-in-out infinite reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(30rpx, 40rpx); }
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-wrap {
|
.content-wrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
padding: 0 60rpx;
|
padding: 0 40rpx;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
animation: fadeInUp 0.6s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glass-card {
|
||||||
|
background: $bg-glass;
|
||||||
|
backdrop-filter: blur(30rpx);
|
||||||
|
border-radius: 40rpx;
|
||||||
|
padding: 60rpx 40rpx;
|
||||||
|
box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.08);
|
||||||
|
border: 1rpx solid rgba(255, 255, 255, 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Brand Section */
|
/* Brand Section */
|
||||||
@ -258,80 +282,112 @@ function onGetPhoneNumber(e) {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 80rpx;
|
margin-bottom: 60rpx;
|
||||||
}
|
}
|
||||||
.logo-box {
|
.logo-box {
|
||||||
width: 180rpx;
|
width: 160rpx;
|
||||||
height: 180rpx;
|
height: 160rpx;
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 40rpx;
|
border-radius: 40rpx;
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
box-shadow: 0 20rpx 60rpx rgba(255, 107, 0, 0.15);
|
box-shadow: 0 12rpx 30rpx rgba($brand-primary, 0.2);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
margin-bottom: 32rpx;
|
margin-bottom: $spacing-xl;
|
||||||
animation: float 6s ease-in-out infinite;
|
animation: pulse 3s infinite;
|
||||||
}
|
|
||||||
@keyframes float {
|
|
||||||
0% { transform: translateY(0); }
|
|
||||||
50% { transform: translateY(-20rpx); }
|
|
||||||
100% { transform: translateY(0); }
|
|
||||||
}
|
}
|
||||||
.logo { width: 100%; height: 100%; }
|
.logo { width: 100%; height: 100%; }
|
||||||
.app-name { font-size: 48rpx; font-weight: 900; color: #1A1A1A; margin-bottom: 8rpx; letter-spacing: 2rpx; }
|
.app-name {
|
||||||
.welcome-text { font-size: 28rpx; color: #888; letter-spacing: 4rpx; }
|
font-size: 44rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
color: $text-main;
|
||||||
|
margin-bottom: 12rpx;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
.welcome-text {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: $text-sub;
|
||||||
|
letter-spacing: 4rpx;
|
||||||
|
text-transform: uppercase;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
/* Form Styles */
|
/* Form Styles */
|
||||||
.input-group {
|
.input-group {
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 999rpx;
|
border-radius: $radius-round;
|
||||||
height: 100rpx;
|
height: 100rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 32rpx;
|
padding: 0 32rpx;
|
||||||
margin-bottom: 32rpx;
|
margin-bottom: $spacing-xl;
|
||||||
border: 2rpx solid transparent;
|
border: 2rpx solid transparent;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.03);
|
box-shadow: $shadow-sm;
|
||||||
|
|
||||||
|
&.glass-input {
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.5);
|
||||||
|
|
||||||
|
&:focus-within {
|
||||||
|
background: $bg-card;
|
||||||
|
border-color: $brand-primary;
|
||||||
|
box-shadow: 0 0 0 4rpx rgba($brand-primary, 0.15);
|
||||||
|
transform: translateY(-2rpx);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.input-group:focus-within {
|
.input-icon { width: 40rpx; height: 40rpx; margin-right: 20rpx; opacity: 1; }
|
||||||
border-color: #FF6B00;
|
|
||||||
box-shadow: 0 0 0 6rpx rgba(255, 107, 0, 0.1);
|
|
||||||
transform: translateY(-2rpx);
|
|
||||||
}
|
|
||||||
.input-icon { width: 40rpx; height: 40rpx; margin-right: 20rpx; opacity: 0.6; }
|
|
||||||
.input-icon image { width: 100%; height: 100%; }
|
.input-icon image { width: 100%; height: 100%; }
|
||||||
.input-field { flex: 1; height: 100%; font-size: 30rpx; color: #333; }
|
.input-field { flex: 1; height: 100%; font-size: 30rpx; color: $text-main; font-weight: 500; }
|
||||||
.input-placeholder { color: #BBB; }
|
.input-placeholder { color: $text-tertiary; font-weight: 400; }
|
||||||
|
|
||||||
.options-row { display: flex; justify-content: space-between; margin-bottom: 60rpx; }
|
.options-row { display: flex; justify-content: space-between; margin-bottom: 60rpx; padding: 0 10rpx; }
|
||||||
.remember-box { display: flex; align-items: center; }
|
.remember-box { display: flex; align-items: center; }
|
||||||
.checkbox { width: 36rpx; height: 36rpx; border: 3rpx solid #DDD; border-radius: 8rpx; margin-right: 12rpx; display: flex; align-items: center; justify-content: center; transition: all 0.2s; }
|
.checkbox {
|
||||||
.checkbox.checked { background: #FF6B00; border-color: #FF6B00; }
|
width: 36rpx; height: 36rpx;
|
||||||
.check-mark { color: #FFF; font-size: 24rpx; font-weight: bold; }
|
border: 3rpx solid $border-color;
|
||||||
.remember-text { font-size: 26rpx; color: #666; }
|
border-radius: 10rpx;
|
||||||
|
margin-right: 12rpx;
|
||||||
/* Buttons */
|
|
||||||
.btn {
|
|
||||||
height: 100rpx;
|
|
||||||
border-radius: 999rpx;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 32rpx;
|
transition: all 0.2s;
|
||||||
|
background: rgba(255,255,255,0.5);
|
||||||
|
|
||||||
|
&.checked {
|
||||||
|
background: $brand-primary;
|
||||||
|
border-color: $brand-primary;
|
||||||
|
box-shadow: 0 4rpx 10rpx rgba($brand-primary, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.check-mark { color: $text-inverse; font-size: $font-sm; font-weight: bold; }
|
||||||
|
.remember-text { font-size: 26rpx; color: $text-sub; }
|
||||||
|
|
||||||
|
/* Buttons */
|
||||||
|
.btn {
|
||||||
|
height: 96rpx;
|
||||||
|
border-radius: $radius-round;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: $font-lg;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:active { transform: scale(0.96); }
|
||||||
}
|
}
|
||||||
.btn:active { transform: scale(0.96); }
|
|
||||||
|
|
||||||
.login-btn {
|
.login-btn {
|
||||||
background: linear-gradient(90deg, #FF6B00 0%, #FFA500 100%);
|
background: $gradient-brand;
|
||||||
color: #FFF;
|
color: $text-inverse;
|
||||||
box-shadow: 0 10rpx 30rpx rgba(255, 107, 0, 0.3);
|
box-shadow: 0 10rpx 30rpx rgba($brand-primary, 0.3);
|
||||||
margin-bottom: 32rpx;
|
margin-bottom: $spacing-xl;
|
||||||
|
border: none;
|
||||||
}
|
}
|
||||||
.btn-shine {
|
.btn-shine {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -348,39 +404,52 @@ function onGetPhoneNumber(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.weixin-btn {
|
.weixin-btn {
|
||||||
background: #07C160;
|
background: #07C160; /* WeChat Brand Color */
|
||||||
color: #FFF;
|
color: $text-inverse;
|
||||||
box-shadow: 0 10rpx 30rpx rgba(7, 193, 96, 0.3);
|
box-shadow: 0 10rpx 30rpx rgba(7, 193, 96, 0.3);
|
||||||
|
border: none;
|
||||||
}
|
}
|
||||||
.wx-icon { width: 48rpx; height: 48rpx; margin-right: 16rpx; }
|
.wx-icon { width: 48rpx; height: 48rpx; margin-right: 16rpx; filter: brightness(100); } /* Make logo white if it's the logo, but ideally it should be WeChat icon */
|
||||||
|
|
||||||
/* Register Link */
|
/* Register Link */
|
||||||
.register-link { text-align: center; margin-top: 32rpx; }
|
.register-link { text-align: center; margin-top: $spacing-xl; }
|
||||||
.register-text { font-size: 28rpx; color: #888; }
|
.register-text { font-size: $font-md; color: $text-sub; }
|
||||||
.highlight { color: #FF6B00; font-weight: 700; margin-left: 8rpx; }
|
.highlight { color: $brand-primary; font-weight: 700; margin-left: 8rpx; }
|
||||||
|
|
||||||
/* Agreements */
|
/* Agreements */
|
||||||
.agreements {
|
.agreements {
|
||||||
margin-top: 80rpx;
|
margin-top: 60rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: flex-start;
|
||||||
|
padding: 0 20rpx;
|
||||||
}
|
}
|
||||||
.checkbox.round { border-radius: 50%; width: 32rpx; height: 32rpx; }
|
.checkbox.round { border-radius: 50%; width: 32rpx; height: 32rpx; margin-top: 4rpx; }
|
||||||
.checkbox-area { padding: 10rpx; }
|
.checkbox-area { padding-right: 12rpx; }
|
||||||
.agreement-text { font-size: 24rpx; color: #999; margin-left: 8rpx; }
|
.agreement-text {
|
||||||
.link { color: #FF6B00; text-decoration: underline; margin: 0 4rpx; }
|
font-size: $font-sm;
|
||||||
|
color: $text-tertiary;
|
||||||
|
line-height: 1.5;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.link { color: $brand-primary; text-decoration: none; font-weight: 600; margin: 0 4rpx; }
|
||||||
|
|
||||||
.error-toast {
|
.error-toast {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 100rpx;
|
top: 100rpx;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
background: rgba(255, 60, 60, 0.9);
|
background: rgba($uni-color-error, 0.9);
|
||||||
color: #fff;
|
color: $text-inverse;
|
||||||
padding: 16rpx 32rpx;
|
padding: 16rpx 32rpx;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
|
box-shadow: 0 8rpx 20rpx rgba(0,0,0,0.2);
|
||||||
|
animation: slideDown 0.3s ease-out;
|
||||||
}
|
}
|
||||||
</style>
|
@keyframes slideDown {
|
||||||
|
from { transform: translate(-50%, -100%); opacity: 0; }
|
||||||
|
to { transform: translate(-50%, 0); opacity: 1; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
3186
pages/mine/index.vue
3186
pages/mine/index.vue
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="wrap">
|
<view class="wrap">
|
||||||
|
<view class="bg-decoration"></view>
|
||||||
<view class="tabs">
|
<view class="tabs">
|
||||||
<view class="tab" :class="{ active: currentTab === 'pending' }" @click="switchTab('pending')">待付款</view>
|
<view class="tab" :class="{ active: currentTab === 'pending' }" @click="switchTab('pending')">待付款</view>
|
||||||
<view class="tab" :class="{ active: currentTab === 'completed' }" @click="switchTab('completed')">已完成</view>
|
<view class="tab" :class="{ active: currentTab === 'completed' }" @click="switchTab('completed')">已完成</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="error" class="error">{{ error }}</view>
|
<view v-if="error" class="error">{{ error }}</view>
|
||||||
<view v-if="orders.length === 0 && !loading" class="empty">暂无订单</view>
|
<view v-if="orders.length === 0 && !loading" class="empty">
|
||||||
|
<view class="empty-icon">📦</view>
|
||||||
|
<view class="empty-text">暂无订单</view>
|
||||||
|
</view>
|
||||||
<view v-for="item in orders" :key="item.id || item.order_no" class="order">
|
<view v-for="item in orders" :key="item.id || item.order_no" class="order">
|
||||||
<view class="order-main">
|
<view class="order-main">
|
||||||
<view class="order-title">{{ item.title || item.subject || '订单' }}</view>
|
<view class="order-title">{{ item.title || item.subject || '订单' }}</view>
|
||||||
@ -13,7 +17,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="order-right">
|
<view class="order-right">
|
||||||
<view class="order-amount">{{ formatAmount(item.total_amount || item.amount || item.price) }}</view>
|
<view class="order-amount">{{ formatAmount(item.total_amount || item.amount || item.price) }}</view>
|
||||||
<view class="order-status">{{ statusText(item) }}</view>
|
<view class="order-status" :class="getStatusClass(item)">{{ statusText(item) }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="loadingMore" class="loading">加载中...</view>
|
<view v-if="loadingMore" class="loading">加载中...</view>
|
||||||
@ -65,6 +69,13 @@ function statusText(item) {
|
|||||||
return s || ''
|
return s || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getStatusClass(item) {
|
||||||
|
const text = statusText(item)
|
||||||
|
if (text === '待付款') return 'status-pending'
|
||||||
|
if (text === '已完成') return 'status-completed'
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
function switchTab(tab) {
|
function switchTab(tab) {
|
||||||
if (currentTab.value === tab) return
|
if (currentTab.value === tab) return
|
||||||
currentTab.value = tab
|
currentTab.value = tab
|
||||||
@ -163,42 +174,56 @@ onReachBottom(() => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 订单页面
|
奇盒潮玩 - 订单页面
|
||||||
采用暖橙色调的订单列表设计
|
采用暖橙色调的订单列表设计
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.wrap {
|
.wrap {
|
||||||
padding: 24rpx;
|
padding: $spacing-md;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%);
|
background-color: $bg-page;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
top: 0; left: 0; width: 100%; height: 100vh;
|
||||||
|
background: radial-gradient(circle at 10% 10%, rgba($brand-primary, 0.05), transparent 40%),
|
||||||
|
radial-gradient(circle at 90% 90%, rgba($accent-gold, 0.05), transparent 40%);
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tab 切换 */
|
/* Tab 切换 */
|
||||||
.tabs {
|
.tabs {
|
||||||
display: flex;
|
display: flex;
|
||||||
background: #FFFFFF;
|
background: $bg-glass;
|
||||||
border-radius: 20rpx;
|
backdrop-filter: blur(10rpx);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.5);
|
||||||
|
border-radius: $radius-lg;
|
||||||
padding: 8rpx;
|
padding: 8rpx;
|
||||||
margin-bottom: 24rpx;
|
margin-bottom: $spacing-lg;
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
|
box-shadow: $shadow-sm;
|
||||||
}
|
}
|
||||||
.tab {
|
.tab {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 20rpx 0;
|
padding: 20rpx 0;
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
color: #6B7280;
|
color: $text-sub;
|
||||||
border-radius: 16rpx;
|
border-radius: $radius-md;
|
||||||
transition: all 0.25s ease;
|
transition: all 0.25s ease;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
.tab.active {
|
.tab.active {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
color: #FFFFFF;
|
color: $text-inverse;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
box-shadow: 0 6rpx 20rpx rgba(255, 107, 53, 0.35);
|
box-shadow: $shadow-glow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 订单卡片 */
|
/* 订单卡片 */
|
||||||
@ -206,15 +231,25 @@ onReachBottom(() => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-md;
|
||||||
padding: 24rpx;
|
padding: $spacing-lg;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-lg;
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
box-shadow: $shadow-sm;
|
||||||
|
border: 1rpx solid rgba(0,0,0,0.02);
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
|
animation: fadeInUp 0.4s ease-out backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@for $i from 1 through 10 {
|
||||||
|
.order:nth-child(#{$i}) {
|
||||||
|
animation-delay: #{$i * 0.05}s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.order:active {
|
.order:active {
|
||||||
transform: scale(0.98);
|
transform: scale(0.98);
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-main {
|
.order-main {
|
||||||
@ -224,67 +259,90 @@ onReachBottom(() => {
|
|||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
.order-title {
|
.order-title {
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
margin-bottom: $spacing-xs;
|
||||||
}
|
}
|
||||||
.order-sub {
|
.order-sub {
|
||||||
font-size: 24rpx;
|
font-size: $font-sm;
|
||||||
color: #9CA3AF;
|
color: $text-sub;
|
||||||
margin-top: 8rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-right {
|
.order-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
margin-left: 16rpx;
|
margin-left: $spacing-lg;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.order-amount {
|
.order-amount {
|
||||||
font-size: 30rpx;
|
font-size: $font-lg;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
background: linear-gradient(135deg, #FF6B35, #FF9F43);
|
color: $brand-primary;
|
||||||
-webkit-background-clip: text;
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
background-clip: text;
|
|
||||||
}
|
}
|
||||||
.order-status {
|
.order-status {
|
||||||
font-size: 24rpx;
|
font-size: $font-xs;
|
||||||
color: #6B7280;
|
color: $text-sub;
|
||||||
margin-top: 8rpx;
|
margin-top: 10rpx;
|
||||||
padding: 4rpx 12rpx;
|
padding: 4rpx $spacing-md;
|
||||||
background: #F3F4F6;
|
background: $bg-page;
|
||||||
border-radius: 999rpx;
|
border-radius: $radius-round;
|
||||||
|
font-weight: 600;
|
||||||
|
|
||||||
|
&.status-pending {
|
||||||
|
background: rgba($brand-primary, 0.1);
|
||||||
|
color: $brand-primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.status-completed {
|
||||||
|
background: rgba($uni-color-success, 0.1);
|
||||||
|
color: $uni-color-success;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 空状态 */
|
/* 空状态 */
|
||||||
.empty {
|
.empty {
|
||||||
text-align: center;
|
display: flex;
|
||||||
color: #9CA3AF;
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
margin-top: 120rpx;
|
margin-top: 120rpx;
|
||||||
font-size: 28rpx;
|
animation: fadeInUp 0.5s ease-out;
|
||||||
|
|
||||||
|
.empty-icon {
|
||||||
|
font-size: 80rpx;
|
||||||
|
margin-bottom: $spacing-lg;
|
||||||
|
opacity: 0.6;
|
||||||
|
animation: float 4s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-text {
|
||||||
|
color: $text-sub;
|
||||||
|
font-size: $font-md;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 错误提示 */
|
/* 错误提示 */
|
||||||
.error {
|
.error {
|
||||||
color: #EF4444;
|
color: $uni-color-error;
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
padding: 16rpx;
|
padding: $spacing-md;
|
||||||
background: rgba(239, 68, 68, 0.1);
|
background: rgba($uni-color-error, 0.1);
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-lg;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 加载状态 */
|
/* 加载状态 */
|
||||||
.loading, .end {
|
.loading, .end {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #9CA3AF;
|
color: $text-sub;
|
||||||
padding: 24rpx 0;
|
padding: $spacing-lg 0;
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,18 +1,55 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="wrap">
|
<view class="wrap">
|
||||||
<view v-if="error" class="error">{{ error }}</view>
|
<!-- 顶部装饰背景 -->
|
||||||
<view v-if="records.length === 0 && !loading" class="empty">暂无积分记录</view>
|
<view class="page-bg-decoration"></view>
|
||||||
<view v-for="item in records" :key="item.id || item.time || item.created_at" class="record">
|
|
||||||
<view class="record-main">
|
<view class="header-area">
|
||||||
<view class="record-title">{{ item.title || item.reason || '变更' }}</view>
|
<view class="page-title">积分明细</view>
|
||||||
<view class="record-time">{{ formatTime(item.time || item.created_at) }}</view>
|
<view class="page-subtitle">Points Record</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="record-amount" :class="{ inc: (item.change || item.amount || 0) > 0, dec: (item.change || item.amount || 0) < 0 }">
|
|
||||||
{{ (item.change ?? item.amount ?? 0) > 0 ? '+' : '' }}{{ item.change ?? item.amount ?? 0 }}
|
<view class="content-area">
|
||||||
</view>
|
<view v-if="error" class="error-card">
|
||||||
|
<text class="error-icon">⚠️</text>
|
||||||
|
<text>{{ error }}</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view v-if="records.length === 0 && !loading" class="empty-state">
|
||||||
|
<image class="empty-img" src="/static/empty-points.png" mode="widthFix" />
|
||||||
|
<text class="empty-text">暂无积分记录</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="records-list" v-else>
|
||||||
|
<view
|
||||||
|
v-for="(item, index) in records"
|
||||||
|
:key="item.id || item.time || item.created_at"
|
||||||
|
class="record-item"
|
||||||
|
:style="{ animationDelay: `${index * 0.05}s` }"
|
||||||
|
>
|
||||||
|
<view class="record-icon" :class="{ 'is-add': (item.change || item.amount || 0) > 0 }">
|
||||||
|
{{ (item.change || item.amount || 0) > 0 ? '↓' : '↑' }}
|
||||||
|
</view>
|
||||||
|
<view class="record-content">
|
||||||
|
<view class="record-main">
|
||||||
|
<view class="record-title">{{ item.title || item.reason || '积分变更' }}</view>
|
||||||
|
<view class="record-amount" :class="{ inc: (item.change || item.amount || 0) > 0, dec: (item.change || item.amount || 0) < 0 }">
|
||||||
|
{{ (item.change ?? item.amount ?? 0) > 0 ? '+' : '' }}{{ item.change ?? item.amount ?? 0 }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="record-footer">
|
||||||
|
<view class="record-time">{{ formatTime(item.time || item.created_at) }}</view>
|
||||||
|
<view class="record-status">交易成功</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view v-if="loadingMore" class="loading-more">
|
||||||
|
<view class="spinner"></view>
|
||||||
|
<text>加载中...</text>
|
||||||
|
</view>
|
||||||
|
<view v-else-if="!hasMore && records.length > 0" class="no-more">- 到底啦 -</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="loadingMore" class="loading">加载中...</view>
|
|
||||||
<view v-else-if="!hasMore && records.length > 0" class="end">没有更多了</view>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -101,17 +138,202 @@ onReachBottom(() => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
.wrap { padding: 24rpx }
|
.wrap {
|
||||||
.record { display: flex; justify-content: space-between; align-items: center; background: #fff; border-radius: 12rpx; padding: 20rpx; margin-bottom: 16rpx; box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04) }
|
min-height: 100vh;
|
||||||
.record-main { display: flex; flex-direction: column }
|
background-color: $bg-page;
|
||||||
.record-title { font-size: 28rpx; color: #333 }
|
position: relative;
|
||||||
.record-time { font-size: 24rpx; color: #999; margin-top: 6rpx }
|
overflow-x: hidden;
|
||||||
.record-amount { font-size: 32rpx }
|
}
|
||||||
.record-amount.inc { color: #18a058 }
|
|
||||||
.record-amount.dec { color: #d03050 }
|
.page-bg-decoration {
|
||||||
.empty { text-align: center; color: #999; margin-top: 40rpx }
|
position: absolute;
|
||||||
.error { color: #e43; margin-bottom: 12rpx }
|
top: -200rpx;
|
||||||
.loading { text-align: center; color: #666; margin: 20rpx 0 }
|
right: -200rpx;
|
||||||
.end { text-align: center; color: #999; margin: 20rpx 0 }
|
width: 600rpx;
|
||||||
|
height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-primary, 0.15), transparent 70%);
|
||||||
|
border-radius: 50%;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-area {
|
||||||
|
padding: $spacing-xl $spacing-lg;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.page-title {
|
||||||
|
font-size: 48rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
color: $text-main;
|
||||||
|
margin-bottom: 8rpx;
|
||||||
|
letter-spacing: 1rpx;
|
||||||
|
}
|
||||||
|
.page-subtitle {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $text-tertiary;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-area {
|
||||||
|
padding: 0 $spacing-lg $spacing-xl;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.records-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
background: rgba($bg-card, 0.8);
|
||||||
|
border-radius: $radius-lg;
|
||||||
|
padding: 30rpx;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border: 1rpx solid rgba(255,255,255,0.5);
|
||||||
|
animation: fadeInUp 0.5s ease-out backwards;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: scale(0.98);
|
||||||
|
background: rgba($bg-card, 0.95);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-icon {
|
||||||
|
width: 80rpx;
|
||||||
|
height: 80rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: $bg-secondary;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: $text-secondary;
|
||||||
|
margin-right: 24rpx;
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-weight: 800;
|
||||||
|
|
||||||
|
&.is-add {
|
||||||
|
background: rgba($uni-color-success, 0.1);
|
||||||
|
color: $uni-color-success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-main {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 8rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-title {
|
||||||
|
font-size: 30rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
color: $text-main;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-amount {
|
||||||
|
font-size: 36rpx;
|
||||||
|
font-weight: 900;
|
||||||
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
|
|
||||||
|
&.inc { color: $uni-color-success; }
|
||||||
|
&.dec { color: $text-main; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-time {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: $text-tertiary;
|
||||||
|
}
|
||||||
|
|
||||||
|
.record-status {
|
||||||
|
font-size: 20rpx;
|
||||||
|
color: $text-tertiary;
|
||||||
|
background: $bg-secondary;
|
||||||
|
padding: 2rpx 10rpx;
|
||||||
|
border-radius: 6rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-state {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 100rpx 0;
|
||||||
|
|
||||||
|
.empty-img {
|
||||||
|
width: 240rpx;
|
||||||
|
margin-bottom: 30rpx;
|
||||||
|
opacity: 0.6;
|
||||||
|
filter: grayscale(100%);
|
||||||
|
}
|
||||||
|
.empty-text {
|
||||||
|
color: $text-tertiary;
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-card {
|
||||||
|
background: rgba($uni-color-error, 0.05);
|
||||||
|
border: 1rpx solid rgba($uni-color-error, 0.1);
|
||||||
|
color: $uni-color-error;
|
||||||
|
padding: 20rpx;
|
||||||
|
border-radius: $radius-md;
|
||||||
|
margin-bottom: 30rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 26rpx;
|
||||||
|
|
||||||
|
.error-icon {
|
||||||
|
margin-right: 12rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-more {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 30rpx 0;
|
||||||
|
color: $text-tertiary;
|
||||||
|
font-size: 24rpx;
|
||||||
|
gap: 12rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner {
|
||||||
|
width: 28rpx;
|
||||||
|
height: 28rpx;
|
||||||
|
border: 3rpx solid $bg-secondary;
|
||||||
|
border-top-color: $text-tertiary;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-more {
|
||||||
|
text-align: center;
|
||||||
|
padding: 40rpx 0;
|
||||||
|
color: $text-tertiary;
|
||||||
|
font-size: 24rpx;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin { to { transform: rotate(360deg); } }
|
||||||
</style>
|
</style>
|
||||||
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="page">
|
<view class="page">
|
||||||
|
<view class="bg-decoration"></view>
|
||||||
<view class="loading" v-if="loading">加载中...</view>
|
<view class="loading" v-if="loading">加载中...</view>
|
||||||
<view v-else-if="detail.id" class="detail-wrap">
|
<view v-else-if="detail.id" class="detail-wrap">
|
||||||
<image v-if="detail.main_image" class="main-image" :src="detail.main_image" mode="widthFix" />
|
<image v-if="detail.main_image" class="main-image" :src="detail.main_image" mode="widthFix" />
|
||||||
@ -48,80 +49,115 @@ onLoad((opts) => {
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
/* ============================================
|
/* ============================================
|
||||||
奇盒潮玩 - 商品详情页
|
奇盒潮玩 - 商品详情页
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
.page {
|
.page {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: linear-gradient(180deg, #FFF8F3 0%, #FFFFFF 100%);
|
background: $bg-page;
|
||||||
|
padding-bottom: env(safe-area-inset-bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading, .empty {
|
.loading, .empty {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 120rpx 40rpx;
|
padding: 120rpx 40rpx;
|
||||||
color: #9CA3AF;
|
color: $text-secondary;
|
||||||
font-size: 28rpx;
|
font-size: $font-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detail-wrap {
|
.detail-wrap {
|
||||||
padding-bottom: 40rpx;
|
padding-bottom: 40rpx;
|
||||||
|
animation: fadeInUp 0.4s ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-image {
|
.main-image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 750rpx; /* Square aspect ratio */
|
||||||
display: block;
|
display: block;
|
||||||
|
background: $bg-secondary;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-card {
|
.info-card {
|
||||||
margin: 24rpx;
|
margin: $spacing-lg;
|
||||||
background: #FFFFFF;
|
margin-top: -60rpx;
|
||||||
border-radius: 20rpx;
|
background: rgba(255, 255, 255, 0.95);
|
||||||
padding: 28rpx;
|
backdrop-filter: blur(20rpx);
|
||||||
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
border-radius: $radius-xl;
|
||||||
|
padding: $spacing-xl;
|
||||||
|
box-shadow: $shadow-lg;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
font-size: 34rpx;
|
font-size: $font-xl;
|
||||||
font-weight: 700;
|
font-weight: 800;
|
||||||
color: #1F2937;
|
color: $text-main;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-md;
|
||||||
|
line-height: 1.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.price-row {
|
.price-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: baseline;
|
||||||
gap: 16rpx;
|
gap: $spacing-sm;
|
||||||
margin-bottom: 12rpx;
|
margin-bottom: $spacing-lg;
|
||||||
}
|
}
|
||||||
|
|
||||||
.price {
|
.price {
|
||||||
font-size: 40rpx;
|
font-size: $font-xxl;
|
||||||
font-weight: 800;
|
font-weight: 900;
|
||||||
background: linear-gradient(135deg, #FF6B35, #FF9F43);
|
color: $brand-primary;
|
||||||
-webkit-background-clip: text;
|
font-family: 'DIN Alternate', sans-serif;
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
background-clip: text;
|
&::before {
|
||||||
|
content: '¥';
|
||||||
|
font-size: $font-md;
|
||||||
|
margin-right: 4rpx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.points {
|
.points {
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
color: #FF9F43;
|
color: $brand-primary;
|
||||||
padding: 4rpx 12rpx;
|
padding: 6rpx $spacing-md;
|
||||||
background: rgba(255, 159, 67, 0.15);
|
background: rgba($brand-primary, 0.1);
|
||||||
border-radius: 999rpx;
|
border-radius: 100rpx;
|
||||||
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock {
|
.stock {
|
||||||
font-size: 26rpx;
|
font-size: $font-sm;
|
||||||
color: #6B7280;
|
color: $text-secondary;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: $spacing-lg;
|
||||||
|
background: $bg-secondary;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6rpx $spacing-md;
|
||||||
|
border-radius: $radius-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
.desc {
|
.desc {
|
||||||
font-size: 28rpx;
|
font-size: $font-lg;
|
||||||
color: #4B5563;
|
color: $text-main;
|
||||||
line-height: 1.7;
|
line-height: 1.8;
|
||||||
|
padding-top: $spacing-lg;
|
||||||
|
border-top: 1rpx dashed $border-color-light;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '商品详情';
|
||||||
|
display: block;
|
||||||
|
font-size: $font-md;
|
||||||
|
color: $text-secondary;
|
||||||
|
margin-bottom: $spacing-sm;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from { opacity: 0; transform: translateY(40rpx); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="page">
|
<view class="page">
|
||||||
|
<view class="bg-decoration"></view>
|
||||||
<!-- 顶部固定区域 -->
|
<!-- 顶部固定区域 -->
|
||||||
<view class="header-section">
|
<view class="header-section">
|
||||||
<view class="search-box" style="margin-top: 20rpx;">
|
<view class="search-box">
|
||||||
<view class="search-input-wrap">
|
<view class="search-input-wrap">
|
||||||
<text class="search-icon">🔍</text>
|
<text class="search-icon">🔍</text>
|
||||||
<input class="search-input" v-model="keyword" placeholder="搜索心仪的商品" placeholder-class="placeholder-style" confirm-type="search" @confirm="onSearchConfirm" />
|
<input class="search-input" v-model="keyword" placeholder="搜索心仪的商品" placeholder-class="placeholder-style" confirm-type="search" @confirm="onSearchConfirm" />
|
||||||
@ -228,11 +229,49 @@ onShareTimeline(() => {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
.page {
|
.page {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background-color: #F5F6F8;
|
background-color: $bg-page;
|
||||||
padding-bottom: 40rpx;
|
padding-bottom: 40rpx;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-decoration {
|
||||||
|
position: fixed;
|
||||||
|
top: 0; left: 0; width: 100%; height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: -100rpx; left: -100rpx;
|
||||||
|
width: 600rpx; height: 600rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-primary, 0.1) 0%, transparent 70%);
|
||||||
|
filter: blur(60rpx);
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.6;
|
||||||
|
animation: float 10s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10%; right: -100rpx;
|
||||||
|
width: 500rpx; height: 500rpx;
|
||||||
|
background: radial-gradient(circle, rgba($brand-secondary, 0.1) 0%, transparent 70%);
|
||||||
|
filter: blur(50rpx);
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.5;
|
||||||
|
animation: float 15s ease-in-out infinite reverse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0); }
|
||||||
|
50% { transform: translate(30rpx, 50rpx); }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 顶部 Header */
|
/* 顶部 Header */
|
||||||
@ -242,9 +281,11 @@ onShareTimeline(() => {
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
background: #FFFFFF;
|
background: $bg-glass;
|
||||||
|
backdrop-filter: blur(20rpx);
|
||||||
padding: 0 24rpx 24rpx;
|
padding: 0 24rpx 24rpx;
|
||||||
box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.04);
|
box-shadow: $shadow-sm;
|
||||||
|
border-bottom: 1rpx solid $border-color-light;
|
||||||
}
|
}
|
||||||
.header-placeholder {
|
.header-placeholder {
|
||||||
height: 160rpx; /* 根据 header 高度调整 */
|
height: 160rpx; /* 根据 header 高度调整 */
|
||||||
@ -253,25 +294,28 @@ onShareTimeline(() => {
|
|||||||
.page-title {
|
.page-title {
|
||||||
font-size: 36rpx;
|
font-size: 36rpx;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: #111;
|
color: $text-main;
|
||||||
padding: 20rpx 0;
|
padding: 20rpx 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 搜索框 */
|
/* 搜索框 */
|
||||||
.search-box {
|
.search-box {
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 20rpx;
|
||||||
|
margin-top: 20rpx;
|
||||||
}
|
}
|
||||||
.search-input-wrap {
|
.search-input-wrap {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: #F5F7FA;
|
background: rgba(255, 255, 255, 0.6);
|
||||||
border-radius: 16rpx;
|
border: 1px solid rgba(255, 255, 255, 0.8);
|
||||||
|
border-radius: $radius-round;
|
||||||
padding: 18rpx 24rpx;
|
padding: 18rpx 24rpx;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
}
|
}
|
||||||
.search-input-wrap:focus-within {
|
.search-input-wrap:focus-within {
|
||||||
background: #FFF;
|
background: $bg-card;
|
||||||
box-shadow: 0 0 0 2rpx #FF9F43;
|
border-color: $brand-primary;
|
||||||
|
box-shadow: 0 0 0 4rpx rgba($brand-primary, 0.1);
|
||||||
}
|
}
|
||||||
.search-icon {
|
.search-icon {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
@ -281,10 +325,10 @@ onShareTimeline(() => {
|
|||||||
.search-input {
|
.search-input {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
.placeholder-style {
|
.placeholder-style {
|
||||||
color: #999;
|
color: $text-tertiary;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 筛选行 */
|
/* 筛选行 */
|
||||||
@ -298,39 +342,40 @@ onShareTimeline(() => {
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: #F5F7FA;
|
background: $bg-secondary;
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-md;
|
||||||
padding: 10rpx 20rpx;
|
padding: 10rpx 20rpx;
|
||||||
}
|
}
|
||||||
.price-label {
|
.price-label {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #666;
|
color: $text-sub;
|
||||||
margin-right: 16rpx;
|
margin-right: 16rpx;
|
||||||
}
|
}
|
||||||
.price-input {
|
.price-input {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #333;
|
color: $text-main;
|
||||||
}
|
}
|
||||||
.price-ph {
|
.price-ph {
|
||||||
color: #BBB;
|
color: $text-tertiary;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
.price-sep {
|
.price-sep {
|
||||||
color: #CCC;
|
color: $text-tertiary;
|
||||||
margin: 0 10rpx;
|
margin: 0 10rpx;
|
||||||
}
|
}
|
||||||
.filter-btn {
|
.filter-btn {
|
||||||
background: linear-gradient(135deg, #FF9F43, #FF6B35);
|
background: $gradient-brand;
|
||||||
color: white;
|
color: $text-inverse;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
border-radius: 12rpx;
|
border-radius: $radius-md;
|
||||||
padding: 0 32rpx;
|
padding: 0 32rpx;
|
||||||
height: 64rpx;
|
height: 64rpx;
|
||||||
line-height: 64rpx;
|
line-height: 64rpx;
|
||||||
border: none;
|
border: none;
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
}
|
}
|
||||||
.btn-hover {
|
.btn-hover {
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
@ -348,19 +393,34 @@ onShareTimeline(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 商品卡片 */
|
/* 商品卡片 */
|
||||||
|
.product-item {
|
||||||
|
animation: fadeInUp 0.5s ease-out backwards;
|
||||||
|
}
|
||||||
|
@for $i from 1 through 10 {
|
||||||
|
.product-item:nth-child(#{$i}) {
|
||||||
|
animation-delay: #{$i * 0.05}s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.product-card {
|
.product-card {
|
||||||
background: #FFFFFF;
|
background: $bg-card;
|
||||||
border-radius: 20rpx;
|
border-radius: $radius-lg;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
|
box-shadow: $shadow-card;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
|
.product-item:active .product-card {
|
||||||
|
transform: scale(0.98);
|
||||||
|
box-shadow: $shadow-sm;
|
||||||
|
}
|
||||||
|
|
||||||
.thumb-wrap {
|
.thumb-wrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: 100%; /* 1:1 Aspect Ratio */
|
padding-top: 100%; /* 1:1 Aspect Ratio */
|
||||||
background: #F9F9F9;
|
background: $bg-secondary;
|
||||||
}
|
}
|
||||||
.product-thumb {
|
.product-thumb {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -374,11 +434,14 @@ onShareTimeline(() => {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
background: rgba(0,0,0,0.6);
|
background: rgba($accent-red, 0.9);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 20rpx;
|
font-size: 20rpx;
|
||||||
padding: 4rpx 12rpx;
|
padding: 4rpx 12rpx;
|
||||||
border-top-left-radius: 12rpx;
|
border-top-left-radius: 12rpx;
|
||||||
|
backdrop-filter: blur(4px);
|
||||||
|
font-weight: 700;
|
||||||
|
box-shadow: 0 -2rpx 8rpx rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-info {
|
.product-info {
|
||||||
@ -391,7 +454,7 @@ onShareTimeline(() => {
|
|||||||
|
|
||||||
.product-title {
|
.product-title {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: $text-main;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
height: 2.8em; /* 2 lines */
|
height: 2.8em; /* 2 lines */
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -399,6 +462,7 @@ onShareTimeline(() => {
|
|||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 16rpx;
|
||||||
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-bottom {
|
.product-bottom {
|
||||||
@ -409,7 +473,7 @@ onShareTimeline(() => {
|
|||||||
gap: 8rpx;
|
gap: 8rpx;
|
||||||
}
|
}
|
||||||
.price-row {
|
.price-row {
|
||||||
color: #FF5500;
|
color: $accent-red;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
@ -421,9 +485,9 @@ onShareTimeline(() => {
|
|||||||
font-size: 34rpx;
|
font-size: 34rpx;
|
||||||
}
|
}
|
||||||
.points-badge {
|
.points-badge {
|
||||||
background: #FFF0E6;
|
background: rgba($brand-primary, 0.1);
|
||||||
color: #FF6B35;
|
color: $brand-primary;
|
||||||
border: 1px solid rgba(255, 107, 53, 0.2);
|
border: 1px solid rgba($brand-primary, 0.2);
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
padding: 2rpx 10rpx;
|
padding: 2rpx 10rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -447,8 +511,8 @@ onShareTimeline(() => {
|
|||||||
.spinner {
|
.spinner {
|
||||||
width: 50rpx;
|
width: 50rpx;
|
||||||
height: 50rpx;
|
height: 50rpx;
|
||||||
border: 4rpx solid #ddd;
|
border: 4rpx solid rgba($brand-primary, 0.2);
|
||||||
border-top-color: #FF9F43;
|
border-top-color: $brand-primary;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
animation: spin 0.8s linear infinite;
|
animation: spin 0.8s linear infinite;
|
||||||
}
|
}
|
||||||
@ -466,12 +530,23 @@ onShareTimeline(() => {
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
.empty-text {
|
.empty-text {
|
||||||
color: #999;
|
color: $text-tertiary;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.check-text {
|
.check-text {
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
color: #888;
|
color: $text-sub;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(30rpx);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
166
uni.scss
166
uni.scss
@ -6,98 +6,96 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
🎨 品牌色彩系统 - 潮玩暖色调
|
🎨 品牌色彩系统 - 潮玩盲盒 Pro (2025 Refined)
|
||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
/* 主色 - 暖橙渐变 */
|
/* 主色调 - 更加活力与现代 */
|
||||||
$primary-orange: #FF9F43; // 活力橙
|
$brand-primary: #FF6B00; // 核心品牌橙 (更纯粹)
|
||||||
$primary-deep: #FF6B35; // 深橙红
|
$brand-secondary: #FF9500; // 次级品牌色 (用于渐变/辅助)
|
||||||
$primary-light: #FFB366; // 浅橙
|
$brand-primary-light: #FF9500; // 亮橙
|
||||||
|
$brand-primary-dark: #E65100; // 深橙
|
||||||
|
|
||||||
/* 辅助色 */
|
/* 辅助色 - 丰富视觉层次 */
|
||||||
$accent-gold: #FFD166; // 金币黄
|
$accent-gold: #FFC107; // 质感金
|
||||||
$accent-pink: #FF8FAB; // 少女粉
|
$accent-red: #FF3B30; // 促销红
|
||||||
$accent-coral: #FF7B7B; // 珊瑚红
|
$accent-blue: #007AFF; // 科技蓝
|
||||||
$accent-purple: #A78BFA; // 梦幻紫
|
$accent-purple: #AF52DE; // 梦幻紫
|
||||||
|
$accent-pink: #FF2D55; // 活力粉
|
||||||
|
$accent-cyan: #5AC8FA; // 清新蓝
|
||||||
|
$color-success: #34C759; // 成功色
|
||||||
|
$color-warning: #FF9F0A; // 警告色
|
||||||
|
$color-error: #FF3B30; // 错误色
|
||||||
|
|
||||||
/* 功能色 */
|
/* 中性色 - 提升阅读体验 */
|
||||||
$success-color: #10B981; // 成功绿
|
$text-main: #1D1D1F; // 主要文字 (接近纯黑但柔和)
|
||||||
$warning-color: #FBBF24; // 警告黄
|
$text-sub: #86868B; // 次要文字
|
||||||
$error-color: #EF4444; // 错误红
|
$text-secondary: $text-sub; // Alias for compatibility
|
||||||
$info-color: #3B82F6; // 信息蓝
|
$text-tertiary: #C7C7CC; // 辅助/占位
|
||||||
|
$text-placeholder: $text-tertiary; // Alias for compatibility
|
||||||
|
$text-disabled: #D1D1D6; // 禁用状态文字
|
||||||
|
$text-inverse: #FFFFFF; // 反白文字
|
||||||
|
|
||||||
/* 中性色 */
|
/* 背景色 - 营造氛围 */
|
||||||
$text-primary: #1F2937; // 主要文字
|
$bg-page: #F5F5F7; // 页面底色 (高级灰)
|
||||||
$text-secondary: #6B7280; // 次要文字
|
$bg-card: #FFFFFF; // 卡片背景
|
||||||
$text-tertiary: #9CA3AF; // 辅助文字
|
$bg-glass: rgba(255, 255, 255, 0.8); // 毛玻璃背景
|
||||||
$text-inverse: #FFFFFF; // 反色文字
|
$bg-secondary: #F8F8F8; // 次级背景
|
||||||
|
$bg-grey: #FAFAFA; // 浅灰背景
|
||||||
|
|
||||||
/* 背景色 */
|
/* 渐变色 - 视觉冲击力 */
|
||||||
$bg-page: #FFF8F3; // 页面暖白底
|
// 使用 CSS 变量在 style 中定义,此处保留 SCSS 变量供编译使用
|
||||||
$bg-card: #FFFFFF; // 卡片白
|
$gradient-brand: linear-gradient(135deg, #FF9500 0%, #FF5E00 100%);
|
||||||
$bg-warm: #FFF4E6; // 暖色面板
|
$gradient-gold: linear-gradient(135deg, #FFD60A 0%, #FF9F0A 100%);
|
||||||
$bg-grey: #F9FAFB; // 冷灰面板
|
$gradient-red: linear-gradient(135deg, #FF3B30 0%, #D32F2F 100%);
|
||||||
|
$gradient-purple: linear-gradient(135deg, #BF5AF2 0%, #5E5CE6 100%);
|
||||||
/* 边框色 */
|
|
||||||
$border-light: #F3F4F6;
|
|
||||||
$border-normal: #E5E7EB;
|
|
||||||
$border-warm: rgba(255, 159, 67, 0.2);
|
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
✨ 渐变预设
|
🌑 暗黑/特殊主题变量 (Dark Mode Support)
|
||||||
============================================ */
|
============================================ */
|
||||||
|
$bg-dark: #1A1A2E; // 深邃蓝黑
|
||||||
|
$bg-dark-card: rgba(30, 30, 50, 0.7); // 暗色玻璃卡片
|
||||||
|
$text-dark-main: #FFFFFF; // 暗色模式主字
|
||||||
|
$text-dark-sub: rgba(255, 255, 255, 0.7); // 暗色模式副字
|
||||||
|
$border-dark: rgba(255, 255, 255, 0.1); // 暗色边框
|
||||||
|
|
||||||
/* 注意:Sass变量不能存储CSS渐变值用于直接引用
|
|
||||||
以下为文档记录,使用时直接写CSS */
|
|
||||||
|
|
||||||
// 主渐变:linear-gradient(135deg, #FF9F43, #FF6B35)
|
|
||||||
// 金色渐变:linear-gradient(135deg, #FFD166, #FF9F43)
|
|
||||||
// 粉色渐变:linear-gradient(135deg, #FF8FAB, #FF6B81)
|
|
||||||
// 卡片高光:linear-gradient(145deg, #FFFFFF, #FFF8F3)
|
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
📐 间距与圆角
|
📐 布局与间距
|
||||||
============================================ */
|
============================================ */
|
||||||
|
$font-xxs: 18rpx;
|
||||||
|
$font-xs: 22rpx;
|
||||||
|
$font-sm: 24rpx;
|
||||||
|
$font-md: 28rpx;
|
||||||
|
$font-lg: 32rpx;
|
||||||
|
$font-xl: 36rpx;
|
||||||
|
$font-xxl: 48rpx;
|
||||||
|
|
||||||
/* 间距 */
|
|
||||||
$spacing-xs: 8rpx;
|
$spacing-xs: 8rpx;
|
||||||
$spacing-sm: 12rpx;
|
$spacing-sm: 12rpx;
|
||||||
$spacing-md: 16rpx;
|
$spacing-md: 16rpx;
|
||||||
$spacing-lg: 24rpx;
|
$spacing-lg: 24rpx;
|
||||||
$spacing-xl: 32rpx;
|
$spacing-xl: 32rpx;
|
||||||
$spacing-2xl: 48rpx;
|
$spacing-xxl: 48rpx;
|
||||||
|
|
||||||
/* 圆角 */
|
|
||||||
$radius-sm: 8rpx;
|
$radius-sm: 8rpx;
|
||||||
$radius-md: 12rpx;
|
$radius-md: 16rpx;
|
||||||
$radius-lg: 16rpx;
|
$radius-lg: 24rpx;
|
||||||
$radius-xl: 24rpx;
|
$radius-xl: 32rpx;
|
||||||
$radius-full: 999rpx;
|
$radius-round: 999rpx;
|
||||||
|
|
||||||
|
$border-color-light: #F0F0F0;
|
||||||
|
$border-color: $border-color-light;
|
||||||
|
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
🔤 字体系统
|
✨ 阴影与质感
|
||||||
============================================ */
|
============================================ */
|
||||||
|
$shadow-xs: 0 1rpx 4rpx rgba(0, 0, 0, 0.02);
|
||||||
$font-size-xs: 22rpx;
|
|
||||||
$font-size-sm: 24rpx;
|
|
||||||
$font-size-base: 28rpx;
|
|
||||||
$font-size-md: 30rpx;
|
|
||||||
$font-size-lg: 32rpx;
|
|
||||||
$font-size-xl: 36rpx;
|
|
||||||
$font-size-2xl: 44rpx;
|
|
||||||
$font-size-3xl: 56rpx;
|
|
||||||
|
|
||||||
$font-weight-normal: 400;
|
|
||||||
$font-weight-medium: 500;
|
|
||||||
$font-weight-semibold: 600;
|
|
||||||
$font-weight-bold: 700;
|
|
||||||
|
|
||||||
/* ============================================
|
|
||||||
🌟 阴影效果
|
|
||||||
============================================ */
|
|
||||||
|
|
||||||
$shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
$shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
||||||
$shadow-md: 0 8rpx 24rpx rgba(0, 0, 0, 0.08);
|
$shadow-md: 0 6rpx 16rpx rgba(0, 0, 0, 0.08);
|
||||||
|
$shadow-card: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);
|
||||||
|
$shadow-float: 0 16rpx 48rpx rgba(255, 107, 0, 0.15); // 悬浮投影
|
||||||
|
$shadow-inner: inset 0 2rpx 6rpx rgba(0, 0, 0, 0.04);
|
||||||
$shadow-lg: 0 16rpx 48rpx rgba(0, 0, 0, 0.12);
|
$shadow-lg: 0 16rpx 48rpx rgba(0, 0, 0, 0.12);
|
||||||
$shadow-warm: 0 8rpx 24rpx rgba(255, 107, 53, 0.15);
|
$shadow-warm: 0 8rpx 24rpx rgba(255, 107, 53, 0.15);
|
||||||
$shadow-glow: 0 4rpx 16rpx rgba(255, 159, 67, 0.4);
|
$shadow-glow: 0 4rpx 16rpx rgba(255, 159, 67, 0.4);
|
||||||
@ -117,13 +115,13 @@ $ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|||||||
============================================ */
|
============================================ */
|
||||||
|
|
||||||
/* 行为相关颜色 - 使用新配色 */
|
/* 行为相关颜色 - 使用新配色 */
|
||||||
$uni-color-primary: $primary-orange;
|
$uni-color-primary: $brand-primary;
|
||||||
$uni-color-success: $success-color;
|
$uni-color-success: #10B981;
|
||||||
$uni-color-warning: $warning-color;
|
$uni-color-warning: $accent-gold;
|
||||||
$uni-color-error: $error-color;
|
$uni-color-error: $accent-red;
|
||||||
|
|
||||||
/* 文字基本颜色 */
|
/* 文字基本颜色 */
|
||||||
$uni-text-color: $text-primary;
|
$uni-text-color: $text-main;
|
||||||
$uni-text-color-inverse: $text-inverse;
|
$uni-text-color-inverse: $text-inverse;
|
||||||
$uni-text-color-grey: $text-tertiary;
|
$uni-text-color-grey: $text-tertiary;
|
||||||
$uni-text-color-placeholder: $text-tertiary;
|
$uni-text-color-placeholder: $text-tertiary;
|
||||||
@ -131,12 +129,12 @@ $uni-text-color-disable: #D1D5DB;
|
|||||||
|
|
||||||
/* 背景颜色 */
|
/* 背景颜色 */
|
||||||
$uni-bg-color: $bg-card;
|
$uni-bg-color: $bg-card;
|
||||||
$uni-bg-color-grey: $bg-grey;
|
$uni-bg-color-grey: $bg-page;
|
||||||
$uni-bg-color-hover: #FFF0E6;
|
$uni-bg-color-hover: #FFF0E6;
|
||||||
$uni-bg-color-mask: rgba(0, 0, 0, 0.5);
|
$uni-bg-color-mask: rgba(0, 0, 0, 0.5);
|
||||||
|
|
||||||
/* 边框颜色 */
|
/* 边框颜色 */
|
||||||
$uni-border-color: $border-normal;
|
$uni-border-color: #E5E7EB;
|
||||||
|
|
||||||
/* 尺寸变量 */
|
/* 尺寸变量 */
|
||||||
$uni-font-size-sm: 12px;
|
$uni-font-size-sm: 12px;
|
||||||
@ -167,9 +165,21 @@ $uni-spacing-col-lg: 14px;
|
|||||||
$uni-opacity-disabled: 0.4;
|
$uni-opacity-disabled: 0.4;
|
||||||
|
|
||||||
/* 文章场景相关 */
|
/* 文章场景相关 */
|
||||||
$uni-color-title: $text-primary;
|
$uni-color-title: $text-main;
|
||||||
$uni-font-size-title: 20px;
|
$uni-font-size-title: 20px;
|
||||||
$uni-color-subtitle: $text-secondary;
|
$uni-color-subtitle: $text-sub;
|
||||||
$uni-font-size-subtitle: 16px;
|
$uni-font-size-subtitle: 16px;
|
||||||
$uni-color-paragraph: $text-secondary;
|
$uni-color-paragraph: $text-sub;
|
||||||
$uni-font-size-paragraph: 15px;
|
$uni-font-size-paragraph: 15px;
|
||||||
|
|
||||||
|
/* ============================================
|
||||||
|
🛠 工具 Mixins
|
||||||
|
============================================ */
|
||||||
|
|
||||||
|
@mixin text-ellipsis($lines: 1) {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: $lines;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
}
|
||||||
34
说明文档.md
Normal file
34
说明文档.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# 说明文档
|
||||||
|
|
||||||
|
## 一、项目规划
|
||||||
|
|
||||||
|
### 1.1 项目概述
|
||||||
|
本项目为 Uni-App 开发的 bindbox-mini 小程序。当前阶段任务为优化现有 UI 设计,重点调整色彩、按钮样式及视觉层级,保持整体布局不变。
|
||||||
|
|
||||||
|
### 1.2 实施方案
|
||||||
|
1. **全局样式分析**:检查 `uni.scss` 及各页面样式,提取现有色彩和组件样式。
|
||||||
|
2. **视觉优化设计**:
|
||||||
|
* 定义新的色彩系统(主色、辅助色、中性色)。
|
||||||
|
* 优化按钮样式(圆角、阴影、交互态)。
|
||||||
|
* 提升卡片及列表的视觉质感。
|
||||||
|
3. **代码实现**:
|
||||||
|
* 更新 `uni.scss` 变量。
|
||||||
|
* 重构主要组件/页面的样式代码。
|
||||||
|
4. **验证与测试**:确保各页面视觉一致且无布局崩坏。
|
||||||
|
|
||||||
|
### 1.3 进度记录
|
||||||
|
* [x] 2025-12-17: 初始化说明文档,启动 UI 优化任务。
|
||||||
|
* [x] 2025-12-17: 完成全局 SCSS 变量定义 (`uni.scss`),建立色彩与设计系统。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/index/index.vue` (首页),集成新设计系统与微交互动画。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/activity/pata/index.vue` (帕塔页面),增强动画与视觉质感。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/activity/wuxianshang/index.vue` (无限赏),统一视觉风格。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/mine/index.vue` (个人中心),实现磨砂玻璃效果与动态交互。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/orders/index.vue` (订单列表),增强状态标识与列表质感。
|
||||||
|
* [x] 2025-12-17: 修复 `pages/address` 模块编译错误,并完成地址管理页面的样式标准化优化。
|
||||||
|
* [x] 2025-12-17: 修复 `components/ElCard.vue` 和 `components/YifanSelector.vue` 中的未定义变量错误,统一组件样式。
|
||||||
|
* [x] 2025-12-17: 优化 `pages/activity/wuxianshang/index.vue` (无限赏),替换硬编码样式为全局变量。
|
||||||
|
* [x] 2025-12-17: 修复 `pages/activity/yifanshang/index.vue` 编译错误,在 `uni.scss` 中补充 `text-ellipsis` mixin 定义。
|
||||||
|
* [x] 2025-12-17: 修复 `pages/login/index.vue` 等多处 `$border-color` 未定义错误,在 `uni.scss` 中增加变量别名。
|
||||||
|
* [x] 2025-12-17: 修复 `pages/mine/index.vue` 编译错误,在 `api/appUser.js` 中补充 `getUserInfo`, `getUserTasks`, `getInviteRecords` 导出。
|
||||||
|
* [ ] 2025-12-17: 进行中 - 优化 `pages/activity/yifanshang/index.vue` 及相关组件。
|
||||||
|
* [ ] 2025-12-17: 待开始 - 优化 `pages/login/index.vue` 视觉细节。
|
||||||
Loading…
x
Reference in New Issue
Block a user