Browse Source

品牌 美食 活动 服务 搜索

潮流
姜鑫 4 years ago
parent
commit
c628500fbc
  1. BIN
      src/assets/images/fly.png
  2. BIN
      src/assets/images/search/back.png
  3. 236
      src/components/ActivitiesList/ActivitiesList.vue
  4. 2
      src/components/ActivityDetail/ActivityDetail.vue
  5. 15
      src/components/Benefits/Benefits.vue
  6. 17
      src/components/BrandDetail/BrandDetail.vue
  7. 10
      src/components/BrandDetail/children/Activity.vue
  8. 8
      src/components/BrandDetail/children/Comment.vue
  9. 8
      src/components/BrandDetail/children/Goods.vue
  10. 8
      src/components/BrandDetail/children/Recommend.vue
  11. 104
      src/components/BrandRecommend/BrandRecommend.vue
  12. 52
      src/components/BrandScroll/BrandScroll.vue
  13. 20
      src/components/Busniness/Busniness.vue
  14. 11
      src/components/Industry/Industry.vue
  15. 2
      src/components/LoginByPhone/LoginByPhone.vue
  16. 34
      src/components/MallIntroduce/MallIntroduce.vue
  17. 23
      src/components/MovieDetail/MovieDetail.vue
  18. 48
      src/components/PlateInput/PlateInput.vue
  19. 16
      src/components/PlateKeyboard/PlateKeyboard.vue
  20. 315
      src/components/Search/Search.vue
  21. 11
      src/components/ServiceList/ServiceList.vue
  22. 13
      src/components/Traffic/Traffic.vue
  23. 2
      src/layouts/View.vue
  24. 7
      src/views/Activities/Activities.vue
  25. 219
      src/views/Brand/Brand.vue
  26. 244
      src/views/Foods/Foods.vue
  27. 27
      src/views/Member/Member.vue
  28. 6
      src/views/Member/tabs.js
  29. 170
      src/views/Movie/Movie.vue
  30. 2
      src/views/Nav/Nav.vue
  31. 107
      src/views/Parking/Parking.vue
  32. 9
      src/views/Service/Service.vue

BIN
src/assets/images/fly.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

BIN
src/assets/images/search/back.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

236
src/components/ActivitiesList/ActivitiesList.vue

@ -1,38 +1,27 @@
<template> <template>
<div class="activity-wrapper">
<Swiper
@tap="tap"
@init="init"
:loop="true"
:centered-slides="true"
:loop-additional-slides="2"
:slide-to-clicked-slide="true"
:modules="[Pagination, EffectCoverflow]"
effect="coverflow"
:space-between="40"
:coverflow-effect="{ rotate: 68, stretch: 0, depth: 100, modifier: 1, slideShadows: false }"
:pagination="true"
>
<SwiperSlide v-for="item of list" :key="item.activityId">
<div class="banner-box">
<img class="banner" :src="config.sourceUrl + item.fileUrl" alt="" />
<div class="masker">
<slot :item="item">
<div class="flex">
<h1 class="activity-name">{{ switchLanguage(item, 'activityName') }}</h1>
<div class="line"></div>
<div class="time-wrapper">
<p class="common first">{{ $t('ActivityTime') }}{{ item.startDate }} {{ $t('zhi') + item.endDate }}</p>
<p class="common">{{ $t('activityAddress') }}{{ switchLanguage(item, 'activityAddress') }}</p>
</div>
</div>
</slot>
<div class="btn">查看详情</div>
<ScrollView class="scroll" :list="list">
<TransitionGroup name="zoom" tag="div" class="scroll-content">
<div class="content-item" v-for="item of list" :key="item.activityId" @click="handleActivity(item)">
<div class="item-left">
<img :src="config.sourceUrl + item.fileUrl" alt="" />
</div>
<div class="item-right">
<div class="full">
<h1 class="activity-name">{{ switchLanguage(item, 'activityName') }}</h1>
<div class="common-box">
<div class="common">{{ $t('ActivityTime') }}</div>
<div class="info">{{ item.startDate }} {{ $t('zhi') + item.endDate }}</div>
</div>
<div class="common-box">
<div class="common">{{ $t('activityAddress') }}</div>
<div class="info">{{ switchLanguage(item, 'activityAddress') }}</div>
</div>
</div> </div>
<div class="btn">查看活动</div>
</div> </div>
</SwiperSlide>
</Swiper>
</div>
</div>
</TransitionGroup>
</ScrollView>
<Teleport to="body"> <Teleport to="body">
<Transition enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut"> <Transition enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut">
<ActivityDetail @close="showDetail = false" :config="config" :activity="activity" v-if="showDetail" /> <ActivityDetail @close="showDetail = false" :config="config" :activity="activity" v-if="showDetail" />
@ -41,20 +30,17 @@
</template> </template>
<script setup> <script setup>
import { watch, ref } from 'vue'
import { ref } from 'vue'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { useStore } from '@/store/root' import { useStore } from '@/store/root'
import SwiperCore, { Pagination, EffectCoverflow } from 'swiper'
import { Swiper, SwiperSlide } from 'swiper/vue'
import ActivityDetail from '../ActivityDetail/ActivityDetail.vue' import ActivityDetail from '../ActivityDetail/ActivityDetail.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
import 'swiper/css' import 'swiper/css'
import 'swiper/css/pagination' import 'swiper/css/pagination'
import 'swiper/css/effect-coverflow' import 'swiper/css/effect-coverflow'
SwiperCore.use([Pagination, EffectCoverflow])
const props = defineProps({
defineProps({
list: { list: {
type: Array, type: Array,
default: () => [] default: () => []
@ -63,137 +49,89 @@ const props = defineProps({
const showDetail = ref(false) const showDetail = ref(false)
const activity = ref({}) const activity = ref({})
function tap(_swiper, event) {
const { target } = event
if (target.className === 'btn') {
const realIndex = _swiper.realIndex
activity.value = props.list[realIndex]
showDetail.value = true
}
}
const swiper = ref(null)
function init(_swiper) {
swiper.value = _swiper
function handleActivity(item) {
activity.value = item
showDetail.value = true
} }
const store = useStore() const store = useStore()
const { config } = storeToRefs(store) const { config } = storeToRefs(store)
watch(
() => props.list,
newVal => {
if (newVal.length) {
setTimeout(() => {
swiper.value.update()
swiper.value.slideToLoop(0, 0, false)
}, 0)
}
}
)
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.activity-wrapper {
position: relative;
width: 870px;
height: 490px;
border-radius: 12px;
margin: 0 auto;
:deep(.swiper) {
overflow: visible;
.swiper-slide {
border-radius: 12px;
}
.swiper-slide-active .masker {
display: block;
}
.swiper-pagination {
bottom: -80px;
}
.swiper-pagination-bullet {
width: 16px;
height: 3px;
background: rgba(0, 0, 0, 0.5);
border-radius: 3px;
opacity: auto !important;
display: inline-block;
margin-right: 4px;
}
.swiper-pagination-bullet-active {
background: #f1b33e;
}
}
.banner-box {
width: 870px;
height: 490px;
.scroll {
position: absolute;
top: 360px;
left: 170px;
right: 40px;
bottom: 0;
overflow: hidden;
.content-item {
display: flex;
height: 340px;
background: #ffffff;
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
.banner {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 12px;
}
.masker {
display: none;
position: absolute;
height: 72px;
left: 0px;
right: 0;
bottom: 0px;
background: rgba(0, 0, 0, 0.4);
padding: 16px 32px 0 32px;
border-radius: 0 0 12px 12px;
.flex {
display: flex;
margin-bottom: 24px;
.item-left {
flex-shrink: 0;
width: 600px;
height: 340px;
img {
width: 100%;
height: 100%;
object-fit: cover;
} }
.activity-name {
}
.item-right {
display: flex;
flex-direction: column;
flex: 1;
padding: 32px 0 0 0;
.full {
flex: 1; flex: 1;
}
.btn {
font-weight: 700; font-weight: 700;
font-size: 18px;
font-size: 16px;
line-height: 56px;
text-align: center;
font-family: 'font_bold'; font-family: 'font_bold';
color: #ffffff;
color: rgba(0, 0, 0, 0.6);
height: 56px;
border-top: 1px solid rgba(0, 0, 0, 0.05);
} }
.line {
margin-left: 50px;
margin-right: 25px;
width: 2px;
height: 34px;
background: rgba(255, 255, 255, 0.4);
border-radius: 2px;
.activity-name {
font-weight: 700;
font-size: 20px;
line-height: 150%;
text-align: justify;
color: rgba(0, 0, 0, 0.8);
font-family: 'font_bold';
margin: 0 32px;
margin-bottom: 49px;
@include more-wrap(3);
} }
.common {
.common-box {
margin-bottom: 16px;
font-weight: 700; font-weight: 700;
font-size: 14px;
margin-left: 32px;
margin-right: 32px;
font-family: 'font_bold'; font-family: 'font_bold';
color: #ffffff;
&.first {
padding-bottom: 8px;
.common {
font-size: 12px;
color: rgba(0, 0, 0, 0.6);
padding-bottom: 6px;
}
.info {
font-size: 10px;
color: rgba(0, 0, 0, 0.4);
} }
} }
} }
.btn {
position: absolute;
width: 216px;
height: 48px;
line-height: 48px;
left: 50%;
transform: translateX(-50%);
bottom: -24px;
background: linear-gradient(90deg, #f6a62c 0%, #ffbc3f 100%);
box-shadow: 0px 20px 30px rgba(221, 152, 55, 0.2);
border-radius: 53px;
font-weight: 700;
font-family: 'font_bold';
font-size: 16px;
text-align: center;
color: #ffffff;
}
} }
} }
</style> </style>

2
src/components/ActivityDetail/ActivityDetail.vue

@ -82,7 +82,7 @@ function back() {
position: relative; position: relative;
width: 700px; width: 700px;
margin: 0 auto; margin: 0 auto;
margin-top: 124px;
margin-top: 350px;
z-index: 2; z-index: 2;
.thumbs { .thumbs {
position: absolute; position: absolute;

15
src/components/Benefits/Benefits.vue

@ -64,17 +64,15 @@ const showLoginError = ref(false)
<style lang="scss" scoped> <style lang="scss" scoped>
.benefits-wrapper { .benefits-wrapper {
display: flex;
width: 1776px;
height: 510px;
width: 870px;
left: 72px; left: 72px;
top: 344px; top: 344px;
background: rgba(255, 255, 255, 0.4); background: rgba(255, 255, 255, 0.4);
box-shadow: inset 1px 0px 0px #ffffff; box-shadow: inset 1px 0px 0px #ffffff;
border-radius: 12px; border-radius: 12px;
margin-left: 72px;
margin-top: 98px;
padding-left: 48px;
margin-left: 170px;
margin-top: 58px;
padding-bottom: 56px;
:deep(.swiper-pagination-bullet) { :deep(.swiper-pagination-bullet) {
width: 16px !important; width: 16px !important;
@ -106,6 +104,7 @@ const showLoginError = ref(false)
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding-right: 56px; padding-right: 56px;
margin-left: 56px;
} }
.bottom-right { .bottom-right {
display: flex; display: flex;
@ -152,15 +151,17 @@ const showLoginError = ref(false)
line-height: 28px; line-height: 28px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
padding-bottom: 32px; padding-bottom: 32px;
margin-left: 56px;
} }
.intro-scroll { .intro-scroll {
position: relative; position: relative;
height: 156px; height: 156px;
overflow: hidden; overflow: hidden;
margin-left: 56px;
margin-right: 34px; margin-right: 34px;
padding-right: 16px; padding-right: 16px;
margin-bottom: 52px;
margin-bottom: 67px;
.intro { .intro {
font-weight: 400; font-weight: 400;
font-size: 14px; font-size: 14px;

17
src/components/BrandDetail/BrandDetail.vue

@ -1,6 +1,6 @@
<template> <template>
<Dialog @close="back"> <Dialog @close="back">
<div class="content">
<div class="content" :class="{ active: shop.activityList.length || shop.thirdKouCode }">
<div class="left"> <div class="left">
<div class="carousel"> <div class="carousel">
<EffectFade :list="shop.doorMaterialList"> <EffectFade :list="shop.doorMaterialList">
@ -141,11 +141,13 @@ function back() {
<style lang="scss" scoped> <style lang="scss" scoped>
.content { .content {
position: absolute; position: absolute;
display: flex;
top: 50%;
top: 350px;
left: 50%; left: 50%;
transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, 0, 0);
z-index: 2; z-index: 2;
&.active {
top: 100px;
}
&::before { &::before {
content: ''; content: '';
position: absolute; position: absolute;
@ -169,8 +171,12 @@ function back() {
.left { .left {
width: 700px; width: 700px;
.carousel { .carousel {
position: relative;
width: 700px; width: 700px;
height: 393px; height: 393px;
background-color: #fff;
border-radius: 12px;
overflow: hidden;
.like-wrapper { .like-wrapper {
position: absolute; position: absolute;
left: 571px; left: 571px;
@ -181,6 +187,7 @@ function back() {
padding: 0 14px; padding: 0 14px;
background: rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2);
border-radius: 54px; border-radius: 54px;
z-index: 1; z-index: 1;
.like-num { .like-num {
padding-left: 8px; padding-left: 8px;
@ -425,7 +432,7 @@ function back() {
.right { .right {
width: 700px; width: 700px;
flex: 1; flex: 1;
margin-left: 40px;
margin-top: 40px;
} }
.btn { .btn {
position: absolute; position: absolute;

10
src/components/BrandDetail/children/Activity.vue

@ -68,15 +68,11 @@ function handleActivity(item) {
<style lang="scss" scoped> <style lang="scss" scoped>
.activity-scroll { .activity-scroll {
position: absolute;
right: 0;
top: 120px;
width: 700px;
bottom: 0;
position: relative;
overflow: hidden; overflow: hidden;
height: 880px;
height: 690px;
&.active { &.active {
top: 0;
height: 860px;
} }
.title { .title {
font-weight: 700; font-weight: 700;

8
src/components/BrandDetail/children/Comment.vue

@ -70,11 +70,8 @@ function starList() {
margin-bottom: 24px; margin-bottom: 24px;
} }
.scroll { .scroll {
position: absolute;
width: 700px;
top: 244px;
right: 0;
height: 784px;
position: relative;
height: 618px;
overflow: hidden; overflow: hidden;
.comments { .comments {
display: flex; display: flex;
@ -110,6 +107,7 @@ function starList() {
.score-wrapper { .score-wrapper {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 25px;
.score-num { .score-num {
font-weight: 700; font-weight: 700;
font-family: 'font_bold'; font-family: 'font_bold';

8
src/components/BrandDetail/children/Goods.vue

@ -66,13 +66,9 @@ function show(flag) {
margin-bottom: 24px; margin-bottom: 24px;
} }
.scroll { .scroll {
position: absolute;
right: 0;
top: 169px;
width: 700px;
bottom: 0;
position: relative;
overflow: hidden; overflow: hidden;
height: 830px;
height: 690px;
} }
.goods { .goods {
padding-bottom: 8px; padding-bottom: 8px;

8
src/components/BrandDetail/children/Recommend.vue

@ -37,13 +37,9 @@ const recommendList = ref([
margin-bottom: 24px; margin-bottom: 24px;
} }
.scroll { .scroll {
position: absolute;
right: 0;
top: 169px;
width: 700px;
bottom: 0;
position: relative;
overflow: hidden; overflow: hidden;
height: 830px;
height: 690px;
.recommends { .recommends {
display: grid; display: grid;
grid-template-columns: repeat(3, 220px); grid-template-columns: repeat(3, 220px);

104
src/components/BrandRecommend/BrandRecommend.vue

@ -0,0 +1,104 @@
<template>
<div class="brand-recommend">
<p class="title">热门推荐</p>
<ScrollView :list="list" scroll-x class="content">
<div class="recommend-content">
<div class="group-item" @click="handleShop(item)" v-for="item of list" :key="item.shopId">
<div class="logo-wrapper">
<img loading="lazy" :src="config.sourceUrl + item.materialList?.[0]" alt="" class="shop-logo" />
</div>
<p class="name">
<span class="shop-name">{{ switchLanguage(item, 'shopName') }}</span>
<span class="name-right"><img :src="config.sourceUrl + item.industryUrl" class="format-icon" alt="" />{{ item.floor }}</span>
</p>
</div>
</div>
</ScrollView>
</div>
</template>
<script setup>
import ScrollView from '@/base/ScrollView/ScrollView.vue'
defineProps({
list: Array,
config: Object
})
const emits = defineEmits(['click'])
function handleShop(item) {
emits('click', item)
}
</script>
<style lang="scss" scoped>
.brand-recommend {
margin-left: 170px;
.title {
font-weight: 700;
font-size: 24px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.8);
padding-bottom: 12px;
}
.content {
width: 910px;
overflow: hidden;
margin-bottom: 40px;
}
.recommend-content {
display: inline-block;
white-space: nowrap;
padding-top: 32px;
height: 255px;
}
.group-item {
display: inline-block;
width: 320px;
height: 220px;
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
overflow: hidden;
margin-right: 16px;
}
.logo-wrapper {
width: 320px;
height: 180px;
background-color: #fff;
}
.shop-logo {
width: 100%;
height: 100%;
border-radius: 8px;
object-fit: cover;
}
.name {
display: flex;
align-items: center;
justify-content: space-between;
padding: 13px 12px;
}
.shop-name {
font-weight: 700;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
}
.name-right {
font-weight: 700;
display: flex;
align-items: center;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.4);
}
.format-icon {
width: 14px;
height: 14px;
margin-right: 8px;
}
}
</style>

52
src/components/BrandScroll/BrandScroll.vue

@ -0,0 +1,52 @@
<template>
<ScrollView class="brand-scroll" :list="list">
<div class="brand-content">
<div class="groups" v-for="item of list" v-show="item.shopList.length" :key="item.name">
<h1 class="info">{{ item.name }}</h1>
<TransitionGroup name="zoom" mode="out-in" tag="div" class="group">
<ShopItem :config="config" :shop="shop" @click="handleShop(shop)" v-for="shop of item.shopList" :key="shop.shopId" />
</TransitionGroup>
</div>
</div>
</ScrollView>
</template>
<script setup>
import ShopItem from '@/base/ShopItem/ShopItem.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
defineProps({
list: Array,
config: Object
})
const emits = defineEmits(['click'])
function handleShop(item) {
emits('click', item)
}
</script>
<style lang="scss" scoped>
.brand-scroll {
overflow: hidden;
height: 1255px;
margin-left: 170px;
}
.brand-content {
padding-top: 20px;
padding-bottom: 180px;
}
.info {
font-weight: 700;
font-size: 24px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.8);
padding-bottom: 20px;
}
.group {
display: grid;
grid-template-columns: repeat(3, 212px);
gap: 24px 8px;
margin-bottom: 24px;
}
</style>

20
src/components/Busniness/Busniness.vue

@ -1,5 +1,5 @@
<template> <template>
<ScrollView scroll-x class="business-scroll">
<ScrollView class="business-scroll">
<div class="business-content"> <div class="business-content">
<div class="three-wrapper" :class="{ active: cardIdx === index }" v-for="(item, index) of 10" :key="item"> <div class="three-wrapper" :class="{ active: cardIdx === index }" v-for="(item, index) of 10" :key="item">
<div class="front"> <div class="front">
@ -42,18 +42,19 @@ function handleCard(item, index) {
<style lang="scss" scoped> <style lang="scss" scoped>
.business-scroll { .business-scroll {
position: relative; position: relative;
// overflow: hidden;
margin-left: 72px;
margin-top: 48px;
height: 600px;
margin-left: 170px;
overflow: hidden;
margin-top: 58px;
height: 1560px;
.business-content { .business-content {
display: inline-block;
white-space: nowrap;
display: grid;
grid-template-columns: repeat(2, 420px);
gap: 56px 30px;
} }
.three-wrapper { .three-wrapper {
display: inline-block; display: inline-block;
width: 528px;
width: 420px;
height: 528px; height: 528px;
position: relative; position: relative;
transform-style: preserve-3d; transform-style: preserve-3d;
@ -68,7 +69,7 @@ function handleCard(item, index) {
} }
.front, .front,
.back { .back {
width: 528px;
width: 420px;
height: 528px; height: 528px;
backface-visibility: hidden; backface-visibility: hidden;
background: url('../../assets/images/member/line.png') no-repeat center 445px rgba(255, 255, 255, 0.8); background: url('../../assets/images/member/line.png') no-repeat center 445px rgba(255, 255, 255, 0.8);
@ -131,6 +132,7 @@ function handleCard(item, index) {
font-size: 24px; font-size: 24px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
margin-bottom: 40px; margin-bottom: 40px;
font-family: 'font_bold';
margin-left: 56px; margin-left: 56px;
} }
.intro-scroll { .intro-scroll {

11
src/components/Industry/Industry.vue

@ -93,17 +93,18 @@ function handleChildFormat(child, childIdx) {
overflow: hidden; overflow: hidden;
height: 810px; height: 810px;
border-radius: 8px; border-radius: 8px;
width: 312px;
background: rgba(255, 255, 255, 0.6);
width: 200px;
margin-top: 18px;
.format-scroll { .format-scroll {
padding-bottom: 220px;
overflow: hidden;
border-radius: 8px;
} }
.format-item { .format-item {
width: 312px;
width: 200px;
background-color: #fff; background-color: #fff;
.parent { .parent {
height: 56px; height: 56px;
padding: 0 24px 0 45px;
padding: 0 12px 0 24px;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
&.active { &.active {

2
src/components/LoginByPhone/LoginByPhone.vue

@ -155,7 +155,7 @@ function handleClose() {
width: 484px; width: 484px;
height: 732px; height: 732px;
margin: 0 auto; margin: 0 auto;
margin-top: 158px;
margin-top: 594px;
background: #ffffff; background: #ffffff;
box-shadow: 0px 40px 60px rgba(0, 0, 0, 0.08); box-shadow: 0px 40px 60px rgba(0, 0, 0, 0.08);
border-radius: 12px; border-radius: 12px;

34
src/components/MallIntroduce/MallIntroduce.vue

@ -9,14 +9,12 @@
</template> </template>
</EffectFade> </EffectFade>
</div> </div>
<div class="mall-right">
<h1 class="title">{{ $t('mallIntroduce') }}</h1>
<ScrollView :list="introduce.content" scrollbar class="mall-intro-scroll">
<p class="mall-intro">
{{ switchLanguage(introduce, 'content') }}
</p>
</ScrollView>
</div>
<h1 class="title">{{ $t('mallIntroduce') }}</h1>
<ScrollView :list="introduce.content" scrollbar class="mall-intro-scroll">
<p class="mall-intro">
{{ switchLanguage(introduce, 'content') }}
</p>
</ScrollView>
</div> </div>
</template> </template>
@ -40,22 +38,20 @@ getMallInfoList().then(({ data }) => {
<style lang="scss" scoped> <style lang="scss" scoped>
.mall-wrapper { .mall-wrapper {
width: 1776px;
height: 510px;
display: inline-flex;
margin-left: 72px;
margin-top: 50px;
width: 870px;
margin-left: 170px;
margin-right: 40px;
margin-top: 58px;
background: rgba(255, 255, 255, 0.4); background: rgba(255, 255, 255, 0.4);
box-shadow: inset 1px 0px 0px #ffffff; box-shadow: inset 1px 0px 0px #ffffff;
border-radius: 12px; border-radius: 12px;
padding-left: 48px;
padding-bottom: 52px;
.carousel { .carousel {
width: 870px; width: 870px;
height: 490px; height: 490px;
background: #ffffff; background: #ffffff;
margin-right: 56px; margin-right: 56px;
border-radius: 8px; border-radius: 8px;
margin-top: -28px;
overflow: hidden; overflow: hidden;
.banner-wrapper { .banner-wrapper {
width: 870px; width: 870px;
@ -67,12 +63,11 @@ getMallInfoList().then(({ data }) => {
object-fit: cover; object-fit: cover;
} }
} }
.mall-right {
flex: 1;
}
.title { .title {
padding-top: 48px; padding-top: 48px;
padding-bottom: 32px; padding-bottom: 32px;
margin-left: 56px;
font-weight: 700; font-weight: 700;
font-size: 24px; font-size: 24px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
@ -81,7 +76,8 @@ getMallInfoList().then(({ data }) => {
.mall-intro-scroll { .mall-intro-scroll {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
height: 350px;
height: 758px;
margin-left: 56px;
margin-right: 34px; margin-right: 34px;
padding-right: 16px; padding-right: 16px;
.mall-intro { .mall-intro {

23
src/components/MovieDetail/MovieDetail.vue

@ -70,7 +70,7 @@
<div class="type">IMAX</div> <div class="type">IMAX</div>
<div class="ting">激光 3 </div> <div class="ting">激光 3 </div>
</td> </td>
<td class="w-150 line">
<td class="w-190 line">
<div class="ticket">06<i></i></div> <div class="ticket">06<i></i></div>
<div class="rest">余票</div> <div class="rest">余票</div>
</td> </td>
@ -138,7 +138,7 @@ function close() {
position: relative; position: relative;
display: flex; display: flex;
margin: 0 auto; margin: 0 auto;
margin-top: 150px;
margin-top: 360px;
width: max-content; width: max-content;
z-index: 10; z-index: 10;
@ -160,7 +160,7 @@ function close() {
background: #ffffff; background: #ffffff;
border-radius: 12px; border-radius: 12px;
padding: 4px; padding: 4px;
margin-right: 40px;
margin-right: 24px;
.poster-wrapper { .poster-wrapper {
width: 252px; width: 252px;
height: 380px; height: 380px;
@ -233,17 +233,16 @@ function close() {
.date-scroll { .date-scroll {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
width: 950px;
height: 80px;
width: 680px;
height: 128px;
background: rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2);
border-radius: 12px; border-radius: 12px;
padding: 6px 0;
padding: 6px;
margin-bottom: 24px; margin-bottom: 24px;
.date-content { .date-content {
display: inline-block; display: inline-block;
white-space: nowrap; white-space: nowrap;
padding: 0 6px;
&::before { &::before {
position: absolute; position: absolute;
content: ''; content: '';
@ -253,7 +252,7 @@ function close() {
border-radius: 8px; border-radius: 8px;
border: 1px solid rgba(255, 189, 53, 1); border: 1px solid rgba(255, 189, 53, 1);
width: 134px; width: 134px;
height: 68px;
height: 116px;
z-index: 0; z-index: 0;
transition: all 0.5s; transition: all 0.5s;
transform: translate3d(v-bind(distance), 0, 0); transform: translate3d(v-bind(distance), 0, 0);
@ -266,7 +265,7 @@ function close() {
} }
.flex { .flex {
width: 134px; width: 134px;
height: 68px;
height: 116px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@ -297,7 +296,7 @@ function close() {
overflow: hidden; overflow: hidden;
border-radius: 8px; border-radius: 8px;
table { table {
width: 950px;
width: 680px;
tr { tr {
display: block; display: block;
background-color: #fff; background-color: #fff;
@ -387,8 +386,8 @@ function close() {
} }
.btn { .btn {
position: absolute; position: absolute;
right: -112px;
top: 0;
right: 0;
top: -104px;
} }
} }
</style> </style>

48
src/components/PlateInput/PlateInput.vue

@ -18,7 +18,7 @@
<span class="text" v-if="!_isEnergy">新能源</span> <span class="text" v-if="!_isEnergy">新能源</span>
<span class="text" v-else>{{ _isEnergy ? (license.length === ENERGY_PLATE && license[license.length - 1]) || '' : '' }}</span> <span class="text" v-else>{{ _isEnergy ? (license.length === ENERGY_PLATE && license[license.length - 1]) || '' : '' }}</span>
</div> </div>
<div key="btn" class="btn" :class="{ active: searchMethods === '车位' }">
<div key="btn" class="btn">
<img src="../../assets/images/parking/search-parking.png" class="icon" alt="" /> <img src="../../assets/images/parking/search-parking.png" class="icon" alt="" />
</div> </div>
</TransitionGroup> </TransitionGroup>
@ -64,13 +64,12 @@ function handleEnergy() {
<style lang="scss" scoped> <style lang="scss" scoped>
.plateinput-wrapper { .plateinput-wrapper {
display: flex; display: flex;
margin-left: 72px;
position: relative; position: relative;
margin-bottom: 40px;
padding-right: 160px;
margin-bottom: 32px;
margin-left: 170px;
&.active { &.active {
&::before { &::before {
left: 102px;
left: 141px;
} }
} }
&::before { &::before {
@ -80,7 +79,7 @@ function handleEnergy() {
height: 63px; height: 63px;
background: rgba(0, 0, 0, 0.1); background: rgba(0, 0, 0, 0.1);
border-radius: 2px; border-radius: 2px;
left: 204px;
left: 176px;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
transition: left 0.5s; transition: left 0.5s;
@ -89,18 +88,23 @@ function handleEnergy() {
.input { .input {
position: relative; position: relative;
border-radius: 8px; border-radius: 8px;
width: 90px;
height: 90px;
margin-right: 12px;
width: 80px;
height: 100px;
margin-right: 8px;
font-weight: 700; font-weight: 700;
font-size: 32px; font-size: 32px;
line-height: 90px;
line-height: 100px;
text-align: center; text-align: center;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
font-family: 'font_bold'; font-family: 'font_bold';
background: #ffffff;
box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.03);
border-radius: 8px;
&.space { &.space {
margin-right: 8px !important;
width: 132px;
&:first-child { &:first-child {
margin-right: 24px;
margin-right: 22px !important;
} }
} }
.text { .text {
@ -109,8 +113,8 @@ function handleEnergy() {
} }
&::after { &::after {
width: 90px;
height: 90px;
width: 80px;
height: 100px;
left: 0; left: 0;
top: 0; top: 0;
content: ''; content: '';
@ -139,7 +143,7 @@ function handleEnergy() {
} }
} }
&:nth-child(2) { &:nth-child(2) {
margin-right: 24px;
margin-right: 18px;
} }
} }
@ -168,8 +172,8 @@ function handleEnergy() {
background: transparent; background: transparent;
} }
.text { .text {
width: 90px;
height: 90px;
width: 80px;
height: 100px;
display: inline-block; display: inline-block;
font-weight: 700; font-weight: 700;
font-size: 18px; font-size: 18px;
@ -184,21 +188,17 @@ function handleEnergy() {
.btn { .btn {
position: absolute; position: absolute;
right: 8px;
right: 40px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
margin-left: 12px; margin-left: 12px;
width: 160px;
height: 90px;
width: 156px;
height: 100px;
background: linear-gradient(90deg, #ffbd35 0%, #ffd260 100%); background: linear-gradient(90deg, #ffbd35 0%, #ffd260 100%);
box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.03), inset 0px -4px 0px rgba(243, 176, 36, 0.5); box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.03), inset 0px -4px 0px rgba(243, 176, 36, 0.5);
border-radius: 8px; border-radius: 8px;
transition: all 0.5s; transition: all 0.5s;
&.active {
transform: translateX(-306px);
transition-delay: 0.05s;
}
.icon { .icon {
width: 32px; width: 32px;
@ -207,7 +207,7 @@ function handleEnergy() {
.width-enter-active, .width-enter-active,
.width-leave-active { .width-leave-active {
width: 90px;
width: 80px;
transition: all 0.5s; transition: all 0.5s;
transition-timing-function: cubic-bezier(0.75, 0, 0.24, 1); transition-timing-function: cubic-bezier(0.75, 0, 0.24, 1);
} }

16
src/components/PlateKeyboard/PlateKeyboard.vue

@ -45,27 +45,28 @@ function handleKeyboard(item, index) {
<style lang="scss" scoped> <style lang="scss" scoped>
.keyboard-wrapper { .keyboard-wrapper {
width: 1008px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
margin-left: 72px;
margin-left: 170px;
margin-right: 32px;
margin-bottom: 56px;
.keyboard-item { .keyboard-item {
width: 48px;
width: 41.76px;
height: 48px; height: 48px;
background: rgba(255, 255, 255, 0.6); background: rgba(255, 255, 255, 0.6);
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.03), inset 0px -1px 0px rgba(177, 189, 220, 0.1); box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.03), inset 0px -1px 0px rgba(177, 189, 220, 0.1);
border-radius: 6px; border-radius: 6px;
text-align: center; text-align: center;
margin-right: 8px;
margin-right: 7px;
margin-bottom: 8px; margin-bottom: 8px;
font-size: 18px; font-size: 18px;
font-family: 'font_medium'; font-family: 'font_medium';
line-height: 48px; line-height: 48px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
&.space { &.space {
width: 104px;
width: 90.48px;
&.del { &.del {
width: 216px;
width: 187.92px;
} }
} }
&.uppercase { &.uppercase {
@ -75,9 +76,10 @@ function handleKeyboard(item, index) {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 104px;
width: 90px;
line-height: initial; line-height: initial;
background: rgba(0, 0, 0, 0.05); background: rgba(0, 0, 0, 0.05);
box-shadow: inset 0px -1px 0px rgba(0, 0, 0, 0.1);
} }
&.active { &.active {
background: #f1b33e; background: #f1b33e;

315
src/components/Search/Search.vue

@ -3,47 +3,19 @@
<View title="全局搜索" sub-title="Global search" :show-input="false"> <View title="全局搜索" sub-title="Global search" :show-input="false">
<div class="search-content"> <div class="search-content">
<div class="search-left"> <div class="search-left">
<div class="left-box" v-show="!keywords.length && !showVoice">
<h1 class="title">万象热搜</h1>
<h1 class="title-en">MIXC hot search</h1>
<ScrollView class="hot-scroll" :list="hotRecommend" scrollbar>
<div class="hot-box">
<div class="recommend-item" v-for="item of hotRecommend" :key="item.shopId" @click="handleShop(item)">{{ item.shopName }}</div>
</div>
</ScrollView>
<h1 class="title">常见问题</h1>
<h1 class="title-en">common problem</h1>
<div class="question-box">
<QuestionList />
<div class="more-question" @click="showClassify = true">{{ $t('more') }}</div>
<Teleport to="body">
<Transition enter-active-class="animate__animated animate__fadeInDown" leave-active-class="animate__animated animate__fadeOutUp">
<QuestionClassify @close="showClassify = false" v-if="showClassify" />
</Transition>
</Teleport>
</div>
</div>
<SearchResultList
@handle-shop="handleShop"
@handle-activity="handleActivity"
:list="searchShopListRef"
:config="config"
v-show="keywords.length && !showVoice"
/>
</div>
<div class="search-right">
<div class="input-wrapper"> <div class="input-wrapper">
<img src="../../assets/images/index/index_search.png" class="search-icon" alt="" /> <img src="../../assets/images/index/index_search.png" class="search-icon" alt="" />
<input @click="setSearch" v-model="keywords" placeholder="输入首字母搜索店铺" type="text" readonly class="input" /> <input @click="setSearch" v-model="keywords" placeholder="输入首字母搜索店铺" type="text" readonly class="input" />
<img @click="setVoice" src="../../assets/images/search/search-voice.png" class="voice-icon" alt="" /> <img @click="setVoice" src="../../assets/images/search/search-voice.png" class="voice-icon" alt="" />
</div> </div>
<div class="right-box" v-show="!showVoice">
<h1 class="title align-right">快捷入口</h1>
<h1 class="title-en align-right">Quick entrance</h1>
<div class="facility-list">
<FacilityItem class="margin" :facility="item" v-for="item of facilityList" :key="item.title" />
<div class="flex">
<div class="right-box" v-show="!showVoice">
<h1 class="title">快捷入口</h1>
<h1 class="title-en">Quick entrance</h1>
<div class="facility-list">
<FacilityItem class="margin" :facility="item" v-for="item of facilityList" :key="item.title" />
</div>
</div> </div>
<div class="keyboard-wrapper"> <div class="keyboard-wrapper">
<Tabs @click="handleTab" :list="list" class="width" /> <Tabs @click="handleTab" :list="list" class="width" />
@ -51,10 +23,48 @@
<keyboardByWritten @del="del" @handle-word="handleLetter" v-else /> <keyboardByWritten @del="del" @handle-word="handleLetter" v-else />
</div> </div>
</div> </div>
<Voice @handle-question="showClassify = true" v-if="showVoice" />
<!-- <div class="left-box" v-show="!keywords.length && !showVoice">
</div>
<SearchResultList
@handle-shop="handleShop"
@handle-activity="handleActivity"
:list="searchShopListRef"
:config="config"
v-show="keywords.length && !showVoice"
/> -->
</div> </div>
<h1 class="title">万象热搜</h1>
<h1 class="title-en">MIXC hot search</h1>
<ScrollView class="hot-scroll" :list="hotRecommend" scrollbar>
<div class="hot-box">
<div class="recommend-item" v-for="item of hotRecommend" :key="item.shopId" @click="handleShop(item)">{{ item.shopName }}</div>
</div>
</ScrollView>
<h1 class="title">常见问题</h1>
<h1 class="title-en">common problem</h1>
<div class="question-box">
<QuestionList />
<div class="more-question" @click="showClassify = true">{{ $t('more') }}</div>
<Teleport to="body">
<Transition enter-active-class="animate__animated animate__fadeInDown" leave-active-class="animate__animated animate__fadeOutUp">
<QuestionClassify @close="showClassify = false" v-if="showClassify" />
</Transition>
</Teleport>
</div>
<!-- <div class="search-right">
<Voice @handle-question="showClassify = true" v-if="showVoice" />
</div> -->
</div>
<div class="search-btn" @click="close">
<img src="../../assets/images/search/back.png" alt="" />
</div> </div>
<Button class="search-btn" @click="close" />
</View> </View>
</Dialog> </Dialog>
</template> </template>
@ -68,7 +78,6 @@ import { list } from './tabs'
import { useSearchShop } from '@/composables/useSearchShop' import { useSearchShop } from '@/composables/useSearchShop'
import View from '@/layouts/View.vue' import View from '@/layouts/View.vue'
import Dialog from '@/layouts/Dialog.vue' import Dialog from '@/layouts/Dialog.vue'
import Button from '@/base/Button/Button.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue' import ScrollView from '@/base/ScrollView/ScrollView.vue'
import QuestionList from '@/components/QuestionList/QuestionList.vue' import QuestionList from '@/components/QuestionList/QuestionList.vue'
import FacilityItem from '@/base/FacilityItem/FacilityItem.vue' import FacilityItem from '@/base/FacilityItem/FacilityItem.vue'
@ -131,6 +140,13 @@ onBeforeUnmount(() => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.header-left) {
padding-left: 80px;
}
:deep(.view-container) {
position: relative;
z-index: 50;
}
::-webkit-input-placeholder { ::-webkit-input-placeholder {
position: relative; position: relative;
top: -8px; top: -8px;
@ -144,6 +160,7 @@ onBeforeUnmount(() => {
bottom: 0; bottom: 0;
left: 0; left: 0;
display: flex; display: flex;
flex-direction: column;
align-items: stretch; align-items: stretch;
z-index: -1; z-index: -1;
.title { .title {
@ -151,6 +168,7 @@ onBeforeUnmount(() => {
font-size: 24px; font-size: 24px;
color: rgba(0, 0, 0, 0.6); color: rgba(0, 0, 0, 0.6);
font-family: 'font_bold'; font-family: 'font_bold';
padding-left: 64px;
padding-bottom: 4px; padding-bottom: 4px;
} }
.title-en { .title-en {
@ -158,72 +176,124 @@ onBeforeUnmount(() => {
line-height: 16px; line-height: 16px;
text-transform: uppercase; text-transform: uppercase;
color: rgba(0, 0, 0, 0.4); color: rgba(0, 0, 0, 0.4);
padding-left: 64px;
margin-bottom: 32px; margin-bottom: 32px;
} }
.align-right {
text-align: right;
}
} }
.search-left {
padding-top: 180px;
flex: 1;
padding-left: 72px;
.input-wrapper {
display: flex;
align-items: center;
padding-right: 5px;
padding-left: 32px;
width: 552px;
height: 88px;
background: #ffffff;
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3), inset 0px 4px 30px rgba(0, 0, 0, 0.02);
border-radius: 51px;
margin-bottom: 56px;
margin-top: 174px;
margin-left: 432px;
.hot-scroll {
position: relative;
margin-bottom: 64px;
margin-right: 20px;
overflow: hidden;
height: 142px;
:deep(.bscroll-vertical-scrollbar) {
.search-icon {
width: 40px;
margin-right: 24px;
}
.input {
border: none;
outline: none;
width: 255px;
height: 78px;
background: transparent;
font-weight: 700;
font-size: 48px;
color: rgba(0, 0, 0, 0.8);
}
.voice-icon {
width: 190px;
}
}
.flex {
display: flex;
justify-content: space-between;
padding-right: 56px;
}
.facility-list {
width: 432px;
display: flex;
flex-wrap: wrap;
padding-left: 64px;
.margin {
margin-right: 40px;
margin-bottom: 38px;
}
}
.width {
width: 552px;
}
.hot-scroll {
position: relative;
margin-bottom: 64px;
margin-right: 20px;
overflow: hidden;
margin-left: 64px;
height: 142px;
:deep(.bscroll-vertical-scrollbar) {
width: 6px !important;
background: rgba(0, 0, 0, 0.02) !important;
border-radius: 6px !important;
opacity: 1 !important;
.bscroll-indicator {
width: 6px !important; width: 6px !important;
background: rgba(0, 0, 0, 0.02) !important;
background: rgba(0, 0, 0, 0.1) !important;
border-radius: 6px !important; border-radius: 6px !important;
opacity: 1 !important;
.bscroll-indicator {
width: 6px !important;
background: rgba(0, 0, 0, 0.1) !important;
border-radius: 6px !important;
border: none !important;
}
border: none !important;
} }
} }
.recommend-item {
display: inline-block;
height: 59px;
padding: 0 32px;
font-weight: 700;
font-family: 'font_bold';
font-size: 16px;
line-height: 59px;
text-align: center;
color: var(--color-black-opacity-6);
background: var(--color-white-opacity);
border-radius: 50px;
}
.recommend-item {
display: inline-block;
height: 59px;
padding: 0 32px;
font-weight: 700;
font-family: 'font_bold';
font-size: 16px;
line-height: 59px;
text-align: center;
color: var(--color-black-opacity-6);
background: var(--color-white-opacity);
border-radius: 50px;
margin-right: 16px;
margin-bottom: 24px;
}
.question-box {
display: flex;
margin-left: 64px;
:deep(.question_item) {
margin-right: 16px; margin-right: 16px;
margin-bottom: 24px;
} }
.question-box {
.more-question {
display: flex; display: flex;
:deep(.question_item) {
margin-right: 16px;
}
.more-question {
display: flex;
justify-content: center;
align-items: center;
background: rgba(255, 255, 255, 0.4);
width: 160px;
height: 225px;
border-radius: 12px;
font-weight: 700;
font-size: 20px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
padding: 0 60px;
}
justify-content: center;
align-items: center;
background: rgba(255, 255, 255, 0.4);
width: 160px;
height: 225px;
border-radius: 12px;
font-weight: 700;
font-size: 20px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
padding: 0 60px;
} }
} }
.search-left {
width: 1048px;
height: 722px;
background: rgba(255, 255, 255, 0.6);
border-radius: 12px;
margin: 16px 16px 64px 16px;
}
.search-right { .search-right {
position: relative; position: relative;
background: rgba(255, 255, 255, 0.6); background: rgba(255, 255, 255, 0.6);
@ -238,57 +308,26 @@ onBeforeUnmount(() => {
bottom: 56px; bottom: 56px;
top: 684px; top: 684px;
} }
.width {
width: 552px;
}
.title, .title,
.title-en { .title-en {
margin-right: 76px; margin-right: 76px;
} }
.input-wrapper {
display: flex;
align-items: center;
padding-right: 5px;
padding-left: 32px;
width: 568px;
height: 88px;
background: #ffffff;
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3), inset 0px 4px 30px rgba(0, 0, 0, 0.02);
border-radius: 51px;
margin-bottom: 56px;
.search-icon {
width: 40px;
margin-right: 24px;
}
.input {
border: none;
outline: none;
width: 277px;
height: 78px;
background: transparent;
font-weight: 700;
font-size: 48px;
color: rgba(0, 0, 0, 0.8);
}
.voice-icon {
width: 190px;
}
}
.facility-list {
display: flex;
flex-direction: row-reverse;
margin-right: 76px;
flex-wrap: wrap;
.margin {
margin-left: 40px;
margin-bottom: 20px;
}
}
} }
.search-btn { .search-btn {
position: absolute;
left: 72px;
bottom: 56px;
width: 132px;
display: flex;
align-items: center;
justify-content: center;
position: fixed;
left: 80px;
top: 190px;
width: 88px;
height: 88px;
z-index: 52;
background: linear-gradient(90deg, #f6a62c 0%, #ffbc3f 100%);
border-radius: 12px;
img {
width: 56px;
}
} }
</style> </style>

11
src/components/ServiceList/ServiceList.vue

@ -1,6 +1,6 @@
<template> <template>
<ScrollView class="serve-scroll" :list="serveList"> <ScrollView class="serve-scroll" :list="serveList">
<div class="serve-content">
<TransitionGroup name="zoom" tag="div" class="serve-content">
<div class="serve-item" v-for="item of serveList" :key="item.name"> <div class="serve-item" v-for="item of serveList" :key="item.name">
<div class="white-bg"> <div class="white-bg">
<div class="icon-box"> <div class="icon-box">
@ -10,7 +10,7 @@
<p class="name">{{ item.name }}</p> <p class="name">{{ item.name }}</p>
<p class="en">{{ item.nameEn }}</p> <p class="en">{{ item.nameEn }}</p>
</div> </div>
</div>
</TransitionGroup>
</ScrollView> </ScrollView>
</template> </template>
@ -34,12 +34,15 @@ getServeList().then(({ data }) => {
.serve-scroll { .serve-scroll {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
margin-left: 72px;
margin-left: 170px;
margin-right: 24px;
margin-top: 58px;
height: 1560px;
.serve-content { .serve-content {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
.serve-item { .serve-item {
width: 240px;
width: 279px;
height: 225px; height: 225px;
// TODO // TODO
background: #fcf8ec; background: #fcf8ec;

13
src/components/Traffic/Traffic.vue

@ -29,18 +29,21 @@ getTrafficList().then(({ data }) => {
<style lang="scss" scoped> <style lang="scss" scoped>
.carousel { .carousel {
position: relative; position: relative;
width: 1130px;
height: 616px;
margin: 0 auto;
width: 870px;
height: 1300px;
margin-top: 58px;
margin-left: 170px;
margin-right: 40px;
} }
.banner-wrapper { .banner-wrapper {
width: 1130px;
height: 616px;
width: 870px;
height: 1300px;
overflow: hidden; overflow: hidden;
} }
.banner { .banner {
width: 100%; width: 100%;
height: 100%; height: 100%;
border-radius: 10px;
object-fit: cover; object-fit: cover;
} }
</style> </style>

2
src/layouts/View.vue

@ -99,7 +99,7 @@ function handleVoice() {
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
width: 420px;
width: 365px;
height: 88px; height: 88px;
background: var(--color-black-opacity-05); background: var(--color-black-opacity-05);
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3), inset 0px 4px 30px rgba(0, 0, 0, 0.02); box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3), inset 0px 4px 30px rgba(0, 0, 0, 0.02);

7
src/views/Activities/Activities.vue

@ -34,9 +34,10 @@ function _getActivityList(type) {
<style lang="scss" scoped> <style lang="scss" scoped>
.width { .width {
position: absolute;
top: 214px;
left: 170px;
width: 440px; width: 440px;
margin-left: 72px;
margin-top: 30px;
margin-bottom: 54px;
height: 88px;
} }
</style> </style>

219
src/views/Brand/Brand.vue

@ -1,65 +1,38 @@
<template> <template>
<View title="品牌列表" sub-title="Brand list"> <View title="品牌列表" sub-title="Brand list">
<div class="container flex"> <div class="container flex">
<BrandRecommend @click="handleShop" :config="config" :list="recommendList" />
<div class="brand-left"> <div class="brand-left">
<div class="top-title"> <div class="top-title">
<p class="title">{{ selectedTitle }}</p> <p class="title">{{ selectedTitle }}</p>
<div class="currentfloor mr-16">
<div class="currentfloor">
<img src="../../assets/images/guide/guide_zhong.png" class="zhong" alt="" /> <img src="../../assets/images/guide/guide_zhong.png" class="zhong" alt="" />
<span class="floor"><i>当前楼层</i>{{ currentFloor.floor }}</span> <span class="floor"><i>当前楼层</i>{{ currentFloor.floor }}</span>
</div> </div>
</div> </div>
<ScrollView class="brand-scroll" :list="selectedList">
<div class="brand-content">
<div class="groups" v-for="item of selectedList" v-show="item.shopList.length" :key="item.name">
<h1 class="info">{{ item.name }}</h1>
<TransitionGroup name="zoom" mode="out-in" tag="div" class="group">
<div class="group-item" @click="handleShop(shop)" v-for="shop of item.shopList" :key="shop.shopId">
<div class="logo-wrapper">
<img loading="lazy" :src="config.sourceUrl + shop.logoUrl" alt="" class="shop-logo" />
</div>
<p class="name">
<span class="shop-name">{{ switchLanguage(shop, 'shopName') }}</span>
<span class="name-right"><img :src="config.sourceUrl + shop.industryUrl" class="format-icon" alt="" />{{ shop.floor }}</span>
</p>
<div class="line"></div>
<div class="bottom-content">
<BrandScroll @click="handleShop" :list="selectedList" :config="config" />
<div class="brand-middle">
<Tabs class="width" :list="list" @click="handleTab" />
<Transition name="zoom" mode="out-in">
<Industry @click="handleFormat" v-if="tabIdx === 0" :config="config" :list="formatList" />
<div v-else class="floor-list">
<div
class="floor-item"
@click="handleFloor(item, index)"
:class="[index === 0 ? 'width' : '', index === floorIdx ? 'active' : '']"
v-for="(item, index) of mergeFloorsList"
:key="item.floor"
>
{{ item.floor }}
</div> </div>
</TransitionGroup>
</div>
</div>
</ScrollView>
</div>
<div class="brand-middle">
<Tabs class="mb-24 width" :list="list" @click="handleTab" />
<Transition name="zoom" mode="out-in">
<Industry @click="handleFormat" v-if="tabIdx === 0" :config="config" :list="formatList" />
<div v-else class="floor-list">
<div
class="floor-item"
@click="handleFloor(item, index)"
:class="[index === 0 ? 'width' : '', index === floorIdx ? 'active' : '']"
v-for="(item, index) of mergeFloorsList"
:key="item.floor"
>
{{ item.floor }}
</div>
</div>
</Transition>
</div>
<div class="brand-right">
<p class="title">热门推荐</p>
<ScrollView :list="recommendList" class="content">
<div class="recommend-content">
<div class="group-item" @click="handleShop(item)" v-for="item of recommendList" :key="item.shopId">
<div class="logo-wrapper">
<img loading="lazy" :src="config.sourceUrl + item.materialList?.[0]" alt="" class="shop-logo" />
</div> </div>
<p class="name">
<span class="shop-name">{{ switchLanguage(item, 'shopName') }}</span>
<span class="name-right"><img :src="config.sourceUrl + item.industryUrl" class="format-icon" alt="" />{{ item.floor }}</span>
</p>
</div>
</Transition>
</div> </div>
</ScrollView>
</div>
</div> </div>
</div> </div>
</View> </View>
@ -72,9 +45,10 @@ import { useStore } from '@/store/root'
import { getBrandList, getBrandListByFormat, getBrandListByFloor } from '@/http/brand/api' import { getBrandList, getBrandListByFormat, getBrandListByFloor } from '@/http/brand/api'
import { list } from './Tabs' import { list } from './Tabs'
import View from '@/layouts/View.vue' import View from '@/layouts/View.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
import Industry from '@/components/Industry/Industry.vue' import Industry from '@/components/Industry/Industry.vue'
import Tabs from '@/components/Tabs/Tabs.vue' import Tabs from '@/components/Tabs/Tabs.vue'
import BrandRecommend from '@/components/BrandRecommend/BrandRecommend.vue'
import BrandScroll from '@/components/BrandScroll/BrandScroll.vue'
const ALL_BRAND = '全部品牌' const ALL_BRAND = '全部品牌'
@ -160,19 +134,6 @@ function handleShop(item) {
<style lang="scss" scoped> <style lang="scss" scoped>
.flex { .flex {
position: relative; position: relative;
display: flex;
align-items: stretch;
height: 100%;
padding-top: 46px;
&::before {
content: '';
position: absolute;
left: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #fff;
top: 80px;
}
} }
.title { .title {
font-weight: 700; font-weight: 700;
@ -181,19 +142,27 @@ function handleShop(item) {
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
padding-bottom: 12px; padding-bottom: 12px;
} }
.mr-16 {
margin-right: 16px;
}
.width {
width: 312px !important;
.bottom-content {
display: flex;
justify-content: space-between;
margin-right: 40px;
} }
.brand-left { .brand-left {
width: 1024px;
margin-left: 72px;
.top-title { .top-title {
margin-left: 170px;
margin-right: 258px;
margin-bottom: 14px;
display: flex; display: flex;
align-items: baseline; align-items: baseline;
justify-content: space-between; justify-content: space-between;
.title {
padding-bottom: 0;
}
}
.line {
border-bottom: 1px solid rgba(255, 255, 255, 0.4);
} }
.currentfloor { .currentfloor {
@ -217,53 +186,34 @@ function handleShop(item) {
padding-right: 17px; padding-right: 17px;
} }
} }
.brand-scroll {
overflow: hidden;
height: 883px;
}
.brand-content {
padding-top: 32px;
padding-bottom: 180px;
}
.info {
font-weight: 700;
font-size: 24px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.8);
padding-bottom: 20px;
}
.group {
display: flex;
flex-wrap: wrap;
}
} }
.brand-middle { .brand-middle {
flex: 1;
padding-left: 24px;
padding-top: 36px;
padding-right: 35px;
.mb-24 {
margin-bottom: 24px;
margin-top: 32px;
padding-top: 20px;
.width {
height: 180px;
flex-direction: column;
width: 200px;
:deep(.tab) {
height: 90px;
}
} }
.floor-list { .floor-list {
display: flex;
flex-wrap: wrap;
width: 324px;
width: 200px;
border-radius: 8px;
overflow: hidden;
margin-top: 18px;
} }
.floor-item { .floor-item {
width: 96px;
height: 96px;
width: 200px;
height: 72px;
background: rgba(255, 255, 255, 0.6); background: rgba(255, 255, 255, 0.6);
border-radius: 8px;
line-height: 96px;
line-height: 72px;
text-align: center; text-align: center;
font-family: 'font_bold'; font-family: 'font_bold';
font-weight: 700; font-weight: 700;
font-size: 20px; font-size: 20px;
color: rgba(0, 0, 0, 0.6); color: rgba(0, 0, 0, 0.6);
margin-right: 12px;
margin-bottom: 12px;
&.active { &.active {
background: linear-gradient(90deg, #ffbd35 0%, #ffd260 100%); background: linear-gradient(90deg, #ffbd35 0%, #ffd260 100%);
@ -271,63 +221,4 @@ function handleShop(item) {
} }
} }
} }
.brand-right {
.content {
height: 883px;
width: 440px;
background: rgba(0, 0, 0, 0.03);
border-left: 1px solid #fff;
overflow: hidden;
}
.recommend-content {
padding-top: 32px;
padding-left: 48px;
padding-bottom: 180px;
}
.group-item {
width: 320px;
height: 220px;
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
overflow: hidden;
margin-bottom: 32px;
}
.logo-wrapper {
width: 320px;
height: 180px;
background-color: #fff;
}
.shop-logo {
width: 100%;
height: 100%;
object-fit: cover;
}
.name {
display: flex;
align-items: center;
justify-content: space-between;
padding: 13px 12px;
}
.shop-name {
font-weight: 700;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
}
.name-right {
font-weight: 700;
display: flex;
align-items: center;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.4);
}
.format-icon {
width: 14px;
height: 14px;
margin-right: 8px;
}
}
</style> </style>

244
src/views/Foods/Foods.vue

@ -1,6 +1,7 @@
<template> <template>
<View title="品牌列表" sub-title="Brand list"> <View title="品牌列表" sub-title="Brand list">
<div class="container flex"> <div class="container flex">
<BrandRecommend @click="handleShop" :config="config" :list="recommendList" />
<div class="brand-left"> <div class="brand-left">
<div class="top-title"> <div class="top-title">
<p class="title">{{ selectedTitle }}</p> <p class="title">{{ selectedTitle }}</p>
@ -9,55 +10,26 @@
<span class="floor"><i>当前楼层</i>{{ currentFloor.floor }}</span> <span class="floor"><i>当前楼层</i>{{ currentFloor.floor }}</span>
</div> </div>
</div> </div>
<ScrollView class="brand-scroll" :list="selectedList">
<div class="brand-content">
<div class="groups" v-for="item of selectedList" v-show="item.shopList.length" :key="item.name">
<h1 class="info">{{ item.name }}</h1>
<TransitionGroup appear name="zoom" mode="out-in" tag="div" class="group">
<div class="group-item" @click="handleShop(shop)" v-for="shop of item.shopList" :key="shop.shopId">
<div class="logo-wrapper">
<img loading="lazy" :src="config.sourceUrl + shop.logoUrl" alt="" class="shop-logo" />
</div>
<p class="name">
<span class="shop-name">{{ switchLanguage(shop, 'shopName') }}</span>
<span class="name-right"><img :src="config.sourceUrl + shop.industryUrl" class="format-icon" alt="" />{{ shop.floor }}</span>
</p>
<div class="line"></div>
<div class="bottom-content">
<BrandScroll @click="handleShop" :list="selectedList" :config="config" />
<div class="brand-middle">
<Transition appear name="zoom" mode="out-in">
<div class="format-wrapper">
<div
class="format-item"
@click="handleFormat(item, index)"
:class="{ active: formatIdx === index }"
v-for="(item, index) of formatList"
:key="item.industryId"
>
{{ switchLanguage(item, 'industryName') }}
</div> </div>
</TransitionGroup>
</div>
</div>
</ScrollView>
</div>
<div class="brand-middle">
<Transition appear name="zoom" mode="out-in">
<div class="format-wrapper">
<div
class="format-item"
@click="handleFormat(item, index)"
:class="{ active: formatIdx === index }"
v-for="(item, index) of formatList"
:key="item.industryId"
>
{{ switchLanguage(item, 'industryName') }}
</div>
</div>
</Transition>
</div>
<div class="brand-right">
<p class="title">热门推荐</p>
<ScrollView :list="recommendList" class="content">
<TransitionGroup appear tag="div" name="zoom" class="recommend-content">
<div class="group-item" @click="handleShop(item)" v-for="item of recommendList" :key="item.shopId">
<div class="logo-wrapper">
<img loading="lazy" :src="config.sourceUrl + item.materialList?.[0]" alt="" class="shop-logo" />
</div> </div>
<p class="name">
<span class="shop-name">{{ switchLanguage(item, 'shopName') }}</span>
<span class="name-right"><img :src="config.sourceUrl + item.industryUrl" class="format-icon" alt="" />{{ item.floor }}</span>
</p>
</div>
</TransitionGroup>
</ScrollView>
</Transition>
</div>
</div>
</div> </div>
</div> </div>
</View> </View>
@ -69,7 +41,8 @@ import { storeToRefs } from 'pinia'
import { useStore } from '@/store/root' import { useStore } from '@/store/root'
import { getBrandList, getBrandListByFloor } from '@/http/brand/api' import { getBrandList, getBrandListByFloor } from '@/http/brand/api'
import View from '@/layouts/View.vue' import View from '@/layouts/View.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
import BrandRecommend from '@/components/BrandRecommend/BrandRecommend.vue'
import BrandScroll from '@/components/BrandScroll/BrandScroll.vue'
const ALL_BRAND = '全部品牌' const ALL_BRAND = '全部品牌'
@ -129,19 +102,6 @@ function handleShop(item) {
<style lang="scss" scoped> <style lang="scss" scoped>
.flex { .flex {
position: relative; position: relative;
display: flex;
align-items: stretch;
height: 100%;
padding-top: 46px;
&::before {
content: '';
position: absolute;
left: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #fff;
top: 80px;
}
} }
.title { .title {
font-weight: 700; font-weight: 700;
@ -150,19 +110,26 @@ function handleShop(item) {
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
padding-bottom: 12px; padding-bottom: 12px;
} }
.mr-16 {
margin-right: 16px;
}
.width {
width: 312px !important;
.bottom-content {
display: flex;
justify-content: space-between;
margin-right: 40px;
} }
.brand-left { .brand-left {
width: 1024px;
margin-left: 72px;
.top-title { .top-title {
margin-left: 170px;
margin-right: 258px;
margin-bottom: 14px;
display: flex; display: flex;
align-items: baseline; align-items: baseline;
justify-content: space-between; justify-content: space-between;
.title {
padding-bottom: 0;
}
}
.line {
border-bottom: 1px solid rgba(255, 255, 255, 0.4);
} }
.currentfloor { .currentfloor {
@ -186,90 +153,20 @@ function handleShop(item) {
padding-right: 17px; padding-right: 17px;
} }
} }
.brand-scroll {
overflow: hidden;
height: 883px;
}
.brand-content {
padding-top: 32px;
padding-bottom: 180px;
}
.info {
font-weight: 700;
font-size: 24px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.8);
padding-bottom: 20px;
}
.group {
display: flex;
flex-wrap: wrap;
}
.group-item {
width: 240px;
height: 220px;
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
overflow: hidden;
margin-right: 16px;
margin-bottom: 32px;
}
.logo-wrapper {
width: 240px;
height: 180px;
padding: 15px 45px;
background-color: #fff;
}
.shop-logo {
width: 100%;
height: 100%;
object-fit: contain;
}
.name {
display: flex;
align-items: center;
justify-content: space-between;
padding: 13px 12px;
}
.shop-name {
font-weight: 700;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
}
.name-right {
display: flex;
align-items: center;
font-weight: 700;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.4);
}
.format-icon {
width: 14px;
margin-right: 8px;
height: 14px;
}
} }
.brand-middle { .brand-middle {
flex: 1;
padding-left: 24px;
padding-top: 36px;
padding-right: 35px;
.format-wrapper { .format-wrapper {
width: 200px;
background: rgba(255, 255, 255, 0.6); background: rgba(255, 255, 255, 0.6);
width: 312px;
margin-top: 32px;
margin-top: 20px;
border-radius: 12px;
overflow: hidden;
.format-item { .format-item {
height: 64px;
line-height: 64px;
height: 72px;
line-height: 72px;
text-align: center; text-align: center;
font-weight: 700; font-weight: 700;
font-size: 14px; font-size: 14px;
line-height: 64px;
text-align: center; text-align: center;
font-family: 'font_bold'; font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6); color: rgba(0, 0, 0, 0.6);
@ -281,63 +178,4 @@ function handleShop(item) {
} }
} }
} }
.brand-right {
.content {
height: 883px;
width: 440px;
background: rgba(0, 0, 0, 0.03);
border-left: 1px solid #fff;
overflow: hidden;
}
.recommend-content {
padding-top: 32px;
padding-left: 48px;
padding-bottom: 180px;
}
.group-item {
width: 320px;
height: 220px;
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
overflow: hidden;
margin-bottom: 32px;
}
.logo-wrapper {
width: 320px;
height: 180px;
background-color: #fff;
}
.shop-logo {
width: 100%;
height: 100%;
object-fit: cover;
}
.name {
display: flex;
align-items: center;
justify-content: space-between;
padding: 13px 12px;
}
.shop-name {
font-weight: 700;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.6);
}
.name-right {
font-weight: 700;
display: flex;
align-items: center;
font-size: 12px;
line-height: 14px;
font-family: 'font_bold';
color: rgba(0, 0, 0, 0.4);
}
.format-icon {
width: 14px;
height: 14px;
margin-right: 8px;
}
}
</style> </style>

27
src/views/Member/Member.vue

@ -1,14 +1,8 @@
<template> <template>
<View title="会员专享" sub-title="member privileges"> <View title="会员专享" sub-title="member privileges">
<Tabs class="width" @click="handleTab" :list="list" /> <Tabs class="width" @click="handleTab" :list="list" />
<div class="mt-54" v-if="tabIdx === 0">
<ActivitiesList :list="activityList">
<template v-slot="{ item }">
<h1 class="title">{{ switchLanguage(item, 'activityName') }}</h1>
</template>
</ActivitiesList>
</div>
<ActivitiesList :list="activityList" v-if="tabIdx === 0" />
<Benefits :benefits="benefits" v-else-if="tabIdx === 1" /> <Benefits :benefits="benefits" v-else-if="tabIdx === 1" />
<Busniness v-else /> <Busniness v-else />
</View> </View>
@ -60,19 +54,10 @@ function _getMemberBenefits() {
<style lang="scss" scoped> <style lang="scss" scoped>
.width { .width {
width: 660px;
margin-left: 72px;
margin-top: 30px;
}
.mt-54 {
margin-top: 54px;
}
.title {
font-weight: 700;
font-size: 18px;
line-height: 21px;
font-family: 'font_bold';
text-align: center;
color: #ffffff;
position: absolute;
top: 214px;
left: 170px;
width: 491px;
height: 88px;
} }
</style> </style>

6
src/views/Member/tabs.js

@ -1,19 +1,19 @@
export const list = [ export const list = [
{ {
name: '会员活动', name: '会员活动',
nameEn: 'member activities',
nameEn: 'activities',
icon: require('@/assets/images/member/activity.png'), icon: require('@/assets/images/member/activity.png'),
iconActive: require('@/assets/images/member/activity_active.png') iconActive: require('@/assets/images/member/activity_active.png')
}, },
{ {
name: '会员权益', name: '会员权益',
nameEn: 'member benefits',
nameEn: 'benefits',
icon: require('@/assets/images/member/benefits.png'), icon: require('@/assets/images/member/benefits.png'),
iconActive: require('@/assets/images/member/benefits_active.png') iconActive: require('@/assets/images/member/benefits_active.png')
}, },
{ {
name: '会员业务', name: '会员业务',
nameEn: 'member business',
nameEn: 'business',
icon: require('@/assets/images/member/business.png'), icon: require('@/assets/images/member/business.png'),
iconActive: require('@/assets/images/member/business_active.png') iconActive: require('@/assets/images/member/business_active.png')
} }

170
src/views/Movie/Movie.vue

@ -11,29 +11,38 @@
</template> </template>
</EffectFade> </EffectFade>
</div> </div>
<h1 class="title">{{ switchLanguage(cinema, 'shopName') }}</h1>
<ScrollView class="intro-scroll" scrollbar :list="cinema.content">
<p class="intro">{{ switchLanguage(cinema, 'intro') }}</p>
</ScrollView>
<Go />
<div class="top-right">
<div class="go">
<img src="../../assets/images/fly.png" class="fly" alt="" />
<div class="text-wrapper">
<p class="en">GO HERE</p>
<p class="text">去这里!</p>
</div>
</div>
<h1 class="title">{{ switchLanguage(cinema, 'shopName') }}</h1>
</div>
</div> </div>
<ScrollView scroll-x class="movie-scroll">
<ScrollView class="intro-scroll" scrollbar :list="cinema.content">
<p class="intro">
欧时力(香港)集团全权代理意大利品牌欧时力(OCHIRLY)并组建欧时力(中国)有限公司全权负责OCHIRLY在大中华区的品牌经营欧时力自1999年进入中国市场以来欧时力以前所未有的速度在中国市场发展壮大在短短的两三年间迅速于中国60多个一二类主要消费城市的160余家加盟店以及专柜年销售额达到2.5亿销售业绩评效均名列前茅整体业绩不断上扬在女装市场享有一定的知名度和美誉度欧时力(香港)集团全权代理意大利品牌欧时力(OCHIRLY)并组建欧时力(中国)有限公司全权负责OCHIRLY在大中华区的品牌经营欧时力自1999年进入中国市场以来欧时力以前所未有的速度在中国市场发展壮大在短短的两三年间迅速于中国60多个一二类主要消费城市的160余家加盟店以及专柜年销售额达到2.5亿在短短的两三年间迅速于中国60多个一二类主要消费城市的160余家加盟店以及专柜年销售额达到2.5亿在短短的两三年间迅速于中
</p>
</ScrollView>
<ScrollView class="movie-scroll">
<div class="scroll-content"> <div class="scroll-content">
<div class="flex">
<div class="movie-item" v-for="item of list" @click="handleMovie(item)" :key="item.id">
<div class="poster-wrapper">
<img class="poster" :src="item.posterPath" alt="" />
</div>
<p class="name">{{ item.showName }}</p>
<div class="info">{{ item.duration }}{{ $t('fenzhong') }} | {{ item.type }} | {{ item.language }} | {{ item.director }}</div>
<div class="remark">
<span>{{ $t('rate') }}</span>
{{ item.remark }}
</div>
<div class="price">
<div class="price-num">¥<i>36</i></div>
<div class="buy">{{ $t('ticket') }}</div>
</div>
<div class="movie-item" v-for="item of list" @click="handleMovie(item)" :key="item.id">
<div class="poster-wrapper">
<img class="poster" :src="item.posterPath" alt="" />
</div>
<p class="name">{{ item.showName }}</p>
<div class="info">{{ item.duration }}{{ $t('fenzhong') }} | {{ item.type }} | {{ item.language }} | {{ item.director }}</div>
<div class="remark">
<span>{{ $t('rate') }}</span>
{{ item.remark }}
</div>
<div class="price">
<div class="price-num">¥<i>36</i></div>
<div class="buy">{{ $t('ticket') }}</div>
</div> </div>
</div> </div>
</div> </div>
@ -54,7 +63,6 @@ import { getCinemaInfo } from '@/http/api'
import View from '@/layouts/View.vue' import View from '@/layouts/View.vue'
import EffectFade from '@/components/EffectFade/EffectFade.vue' import EffectFade from '@/components/EffectFade/EffectFade.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue' import ScrollView from '@/base/ScrollView/ScrollView.vue'
import Go from '@/base/Go/Go.vue'
import MovieDetail from '@/components/MovieDetail/MovieDetail.vue' import MovieDetail from '@/components/MovieDetail/MovieDetail.vue'
const store = useStore() const store = useStore()
@ -77,20 +85,53 @@ function handleMovie(item) {
<style lang="scss" scoped> <style lang="scss" scoped>
.content { .content {
display: flex;
margin-top: 92px;
width: 870px;
height: 1504px;
margin-left: 170px;
margin-top: 58px;
background: rgba(255, 255, 255, 0.4);
border-radius: 12px;
} }
.flex { .flex {
display: flex; display: flex;
} }
.movie-left { .movie-left {
display: flex;
position: relative; position: relative;
width: 500px;
height: 600px;
margin-right: 72px;
margin-left: 72px;
background: rgba(255, 255, 255, 0.4);
border-radius: 12px; border-radius: 12px;
margin-bottom: 32px;
.go {
position: relative;
display: flex;
align-items: center;
width: 282px;
height: 80px;
background: linear-gradient(90deg, #f6a62c 0%, #ffbc3f 100%);
font-weight: 700;
font-family: 'font_bold';
color: #ffffff;
margin-top: 32px;
border-radius: 53px;
&::before {
position: absolute;
content: '';
top: 25px;
left: 105px;
width: 1px;
height: 30px;
background: rgba(255, 255, 255, 0.2);
}
.fly {
width: 40px;
margin: 0 40px;
}
.en {
font-size: 20px;
}
.text {
font-size: 16px;
}
}
:deep(.swiper) { :deep(.swiper) {
overflow: visible !important; overflow: visible !important;
z-index: auto; z-index: auto;
@ -113,9 +154,20 @@ function handleMovie(item) {
} }
} }
.carousel { .carousel {
flex-shrink: 0;
position: relative; position: relative;
display: inline-block;
margin-left: 40px;
margin-right: 24px;
width: 500px; width: 500px;
height: 282px; height: 282px;
margin-top: -40px;
background-color: #fff;
border-radius: 10px;
overflow: hidden;
:deep(.stay-tuned) {
height: 200px;
}
} }
.banner-wrapper { .banner-wrapper {
width: 500px; width: 500px;
@ -131,53 +183,57 @@ function handleMovie(item) {
} }
.title { .title {
padding: 48px 0 32px 40px;
font-weight: 700; font-weight: 700;
font-size: 24px; font-size: 24px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
font-family: 'font_bold'; font-family: 'font_bold';
padding-top: 102px;
text-align: right;
padding-right: 40px;
} }
.intro-scroll {
position: relative;
margin: 0 18px 23px 40px;
padding-right: 16px;
overflow: hidden;
height: 152px;
:deep(.bscroll-vertical-scrollbar) {
}
.intro-scroll {
position: relative;
margin: 0 18px 52px 40px;
padding-right: 16px;
overflow: hidden;
height: 131px;
z-index: 1;
:deep(.bscroll-vertical-scrollbar) {
width: 6px !important;
background: rgba(0, 0, 0, 0.02) !important;
border-radius: 6px !important;
opacity: 1 !important;
.bscroll-indicator {
width: 6px !important; width: 6px !important;
background: rgba(0, 0, 0, 0.02) !important;
background: rgba(0, 0, 0, 0.1) !important;
border-radius: 6px !important; border-radius: 6px !important;
opacity: 1 !important;
.bscroll-indicator {
width: 6px !important;
background: rgba(0, 0, 0, 0.1) !important;
border-radius: 6px !important;
border: none !important;
}
}
.intro {
font-weight: 400;
font-size: 14px;
line-height: 200%;
text-align: justify;
color: rgba(0, 0, 0, 0.6);
border: none !important;
} }
} }
.intro {
font-weight: 400;
font-size: 14px;
line-height: 200%;
text-align: justify;
color: rgba(0, 0, 0, 0.6);
}
} }
.movie-scroll { .movie-scroll {
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
border-radius: 12px 0 0 12px; border-radius: 12px 0 0 12px;
margin-left: 40px;
height: 1103px;
.scroll-content { .scroll-content {
display: inline-block;
white-space: nowrap;
padding-right: 24px;
display: grid;
grid-template-columns: repeat(3, 260px);
gap: 36px 8px;
padding-bottom: 36px;
} }
.movie-item { .movie-item {
display: inline-block;
width: 260px; width: 260px;
height: 600px; height: 600px;
background: #ffffff; background: #ffffff;

2
src/views/Nav/Nav.vue

@ -57,7 +57,7 @@ const { shop, currentFloor, config } = storeToRefs(store)
const { replay, pause, speedUp, handleReplay, togglePause, handleSpeedUp, setPause } = useMapNavControl() const { replay, pause, speedUp, handleReplay, togglePause, handleSpeedUp, setPause } = useMapNavControl()
const { directionInfo, pathShopList, backPathArray } = useStartNavi(shop, currentFloor, setPause) const { directionInfo, pathShopList, backPathArray } = useStartNavi(shop, currentFloor, setPause)
const { methodIdx, handleControl } = useChangeNavMethod(backPathArray) const { methodIdx, handleControl } = useChangeNavMethod(backPathArray)
const { cameraViewsImage, cameraViewsText, setCameraViews } = useSetCameraViews(pause)
const { cameraViewsImage, setCameraViews } = useSetCameraViews(pause)
window.Map_QM.changeWindowResize(1366, 1080) window.Map_QM.changeWindowResize(1366, 1080)

107
src/views/Parking/Parking.vue

@ -1,26 +1,22 @@
<template> <template>
<View class="bef" title="泊车缴费" sub-title="parking payment"> <View class="bef" title="泊车缴费" sub-title="parking payment">
<div class="flex">
<div class="parking-left">
<Tabs class="width" @click="handleTab" :list="list" />
<PlateInput @handle-energy="handleEnergy" :search-methods="searchMethods" :license="license" :needsEnergy="needsEnergy" />
<PlateKeyboard @del="del" @handle-keyboard="handleKeyboard" :search-methods="searchMethods" />
</div>
<div class="parking-right">
<div class="carousel">
<EffectFade :list="banners">
<template v-slot="{ item }">
<div class="banner-wrapper">
<img :src="config.sourceUrl + item" class="banner" alt="" />
</div>
</template>
</EffectFade>
</div>
<h1 class="title">{{ switchLanguage(parkingInfo, 'title') }}</h1>
<ScrollView class="intro-scroll" scrollbar :list="parkingInfo.content">
<p class="intro">{{ switchLanguage(parkingInfo, 'content') }}</p>
</ScrollView>
</div>
<Tabs class="width" @click="handleTab" :list="list" />
<div class="carousel">
<EffectFade :list="banners">
<template v-slot="{ item }">
<div class="banner-wrapper">
<img :src="config.sourceUrl + item" class="banner" alt="" />
</div>
</template>
</EffectFade>
</div>
<PlateInput @handle-energy="handleEnergy" :search-methods="searchMethods" :license="license" :needsEnergy="needsEnergy" />
<PlateKeyboard @del="del" @handle-keyboard="handleKeyboard" :search-methods="searchMethods" />
<div class="parking-info">
<h1 class="title">{{ switchLanguage(parkingInfo, 'title') }}</h1>
<ScrollView class="intro-scroll" scrollbar :list="parkingInfo.content">
<p class="intro">{{ switchLanguage(parkingInfo, 'content') }}</p>
</ScrollView>
</div> </div>
</View> </View>
<Transition enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut"> <Transition enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut">
@ -118,31 +114,25 @@ const showCarInfo = ref(false)
justify-content: space-between; justify-content: space-between;
} }
.width { .width {
width: 660px;
margin-left: 72px;
margin-top: 30px;
margin-bottom: 182px;
}
.parking-left {
flex: 1;
margin-right: 68px;
overflow: hidden;
position: absolute;
top: 214px;
left: 170px;
width: 468px;
height: 88px;
} }
.parking-right {
width: 700px;
margin-right: 72px;
margin-top: 30px;
background: rgba(255, 255, 255, 0.4);
border-radius: 12px;
.carousel {
position: relative;
width: 870px;
height: 490px;
margin-left: 170px;
margin-top: 58px;
margin-bottom: 80px;
:deep(.swiper) { :deep(.swiper) {
overflow: visible !important; overflow: visible !important;
z-index: auto; z-index: auto;
} }
:deep(.swiper-pagination) { :deep(.swiper-pagination) {
right: 32px;
left: auto;
bottom: -15px;
width: auto;
bottom: -24px;
} }
:deep(.swiper-pagination-bullet) { :deep(.swiper-pagination-bullet) {
width: 16px !important; width: 16px !important;
@ -155,23 +145,26 @@ const showCarInfo = ref(false)
border-radius: 3px !important; border-radius: 3px !important;
} }
} }
.carousel {
position: relative;
width: 700px;
height: 400px;
}
.banner-wrapper {
width: 700px;
height: 400px;
overflow: hidden;
border-radius: 8px;
background: #ffffff;
.banner {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.banner-wrapper {
width: 870px;
height: 490px;
overflow: hidden;
border-radius: 8px;
background: #ffffff;
.banner {
width: 100%;
height: 100%;
object-fit: cover;
} }
}
.parking-info {
margin-left: 170px;
margin-right: 40px;
background: rgba(255, 255, 255, 0.4);
border-radius: 12px;
height: 532px;
.title { .title {
padding: 48px 0 32px 56px; padding: 48px 0 32px 56px;
@ -185,7 +178,7 @@ const showCarInfo = ref(false)
position: relative; position: relative;
margin: 0 34px 0 56px; margin: 0 34px 0 56px;
overflow: hidden; overflow: hidden;
height: 180px;
height: 372px;
:deep(.bscroll-vertical-scrollbar) { :deep(.bscroll-vertical-scrollbar) {
width: 6px !important; width: 6px !important;
background: rgba(0, 0, 0, 0.02) !important; background: rgba(0, 0, 0, 0.02) !important;

9
src/views/Service/Service.vue

@ -27,9 +27,10 @@ const currentComp = computed(() => dynamicComList[tabIdx.value])
<style lang="scss" scoped> <style lang="scss" scoped>
.width { .width {
width: 660px;
margin-left: 72px;
margin-top: 30px;
margin-bottom: 48px;
position: absolute;
top: 214px;
left: 170px;
width: 491px;
height: 88px;
} }
</style> </style>

Loading…
Cancel
Save