Browse Source

Merge branch 'dev' of company:project-shenyangk11/sy_k11_H_base_daoshi_vue_ts into dev

pull/2/head
deepblues 3 years ago
parent
commit
9766115704
  1. 17
      public/static/offline/JSON/getParkingInfo.json
  2. BIN
      src/assets/images/index/activity.png
  3. BIN
      src/assets/images/index/art.png
  4. BIN
      src/assets/images/index/brand.png
  5. BIN
      src/assets/images/index/member.png
  6. BIN
      src/assets/images/index/park.png
  7. BIN
      src/assets/images/index/school.png
  8. BIN
      src/assets/images/index/ser.png
  9. BIN
      src/assets/images/search/resultPo.png
  10. BIN
      src/assets/images/traffic.png
  11. 5
      src/base/Message/Message.vue
  12. 139
      src/components/CarInfo/CarInfo.vue
  13. 72
      src/components/PlateInput/PlateInput.vue
  14. 52
      src/components/PlateKeyboard/PlateKeyboard.vue
  15. 10
      src/components/Search/Hot.vue
  16. 71
      src/components/Search/Key.vue
  17. 108
      src/components/Search/Result.vue
  18. 55
      src/components/Search/Search.vue
  19. 464
      src/components/Traffic/Traffic.vue
  20. 2
      src/components/TypeBtnList/TypeBtnList.vue
  21. 6
      src/composables/useHandleScreen.ts
  22. 11
      src/composables/useParkingKeyboard.ts
  23. 2
      src/http/api/parking/index.ts
  24. 4
      src/i18n/lang/en.json
  25. 4
      src/i18n/lang/tw.json
  26. 4
      src/i18n/lang/zh.json
  27. 8
      src/types/parking.d.ts
  28. 4
      src/views/Activity/Activity.vue
  29. 4
      src/views/Index/Index.vue
  30. 102
      src/views/Index/Middle.vue
  31. 8
      src/views/Member/Member.vue
  32. 186
      src/views/Parking/Parking.vue
  33. 4
      src/views/School/School.vue
  34. 4
      src/views/ServiceList/ServiceList.vue

17
public/static/offline/JSON/getParkingInfo.json

@ -1 +1,16 @@
{"code":200,"msg":"操作成功","data":{"title":"泊车介绍","titleEn":"Parking information","content":"1月9日,中共中央总书记、国家主席、中央军委主席习近平在中国共产党第二十届中央纪律检查委员会第二次全体会议上发表重要讲话。李强、赵乐际、王沪宁、蔡奇、丁薛祥、李希出席会议。新华社记者 张领 摄\n二十届中央纪委二次全会公报强调,时刻保持解决大党独有难题的清醒和坚定,坚定不移推动健全全面从严治党体系我们党作为长期执政的马克思主义政党和世界上第一大政党,党的远大目标和历史使命,党的队伍的庞大规模和广泛分布,党面临的重大风险和严峻挑战,都决定了只有整体地而不是局部地、系统地而不是零碎地、持久地而不是短暂地、高标准地而不是一般化地全面从严治党,才能把我们党建设好。","contentEn":"Parking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking information","fileList":["/iotFile/2023/04/18/3EbfJy1GEkeIUtpK3AwWB.png"],"qrFileList":[{"name":"二维码","nameEn":"QR code","fileUrl":"/iotFile/2023/04/18/97JzNgLukcEbLdBDKhWj1.png"}]}}
{
"code": 200,
"msg": "操作成功",
"data": {
"title": "泊车介绍",
"titleEn": "Parking information",
"content": "1月9日,中共中央总书记、国家主席、中央军委主席习近平在中国共产党第二十届中央纪律检查委员会第二次全体会议上发表重要讲话。李强、赵乐际、王沪宁、蔡奇、丁薛祥、李希出席会议。新华社记者 张领 摄\n二十届中央纪委二次全会公报强调,时刻保持解决大党独有难题的清醒和坚定,坚定不移推动健全全面从严治党体系我们党作为长期执政的马克思主义政党和世界上第一大政党,党的远大目标和历史使命,党的队伍的庞大规模和广泛分布,党面临的重大风险和严峻挑战,都决定了只有整体地而不是局部地、系统地而不是零碎地、持久地而不是短暂地、高标准地而不是一般化地全面从严治党,才能把我们党建设好。",
"contentEn": "Parking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking informationParking information",
"fileList": ["/iotFile/2023/04/18/3EbfJy1GEkeIUtpK3AwWB.png"],
"qrFileList": [{
"name": "二维码",
"nameEn": "QR code",
"fileUrl": "/iotFile/2023/04/18/97JzNgLukcEbLdBDKhWj1.png"
}]
}
}

BIN
src/assets/images/index/activity.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 172 KiB

BIN
src/assets/images/index/art.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 72 KiB

BIN
src/assets/images/index/brand.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 146 KiB

BIN
src/assets/images/index/member.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 119 KiB

BIN
src/assets/images/index/park.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 122 KiB

BIN
src/assets/images/index/school.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 79 KiB

BIN
src/assets/images/index/ser.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

BIN
src/assets/images/traffic.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

5
src/base/Message/Message.vue

@ -59,15 +59,12 @@ onMounted(() => {
top: 200px;
left: 50%;
z-index: 9999;
min-width: 300px;
height: 50px;
padding: 0 25px;
padding: 40px 80px;
color: #999;
background: #f5f5f5;
border: 1px solid #e4e4e4;
border-radius: 100px;
transform: translate3d(-50%, 0, 0);
line-height: 50px;
.text-tips {
font-size: 24px;

139
src/components/CarInfo/CarInfo.vue

@ -0,0 +1,139 @@
<template>
<div class="car-info-wrapper">
<div class="masker" @click="close"></div>
<div class="car-content">
<img src="" class="car-img" alt="" />
<div class="car">
<div class="car-group mr120">
<span class="tip">车牌号</span>
<span class="text">辽A88888</span>
</div>
<div class="car-group mr120">
<span class="tip">车位号</span>
<span class="text">E-666</span>
</div>
<div class="car-group">
<span class="tip">停车时长</span>
<span class="text">1小时</span>
</div>
</div>
<div class="go" @click="go">
<svg class="go-icon" width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M28.9853 7.64401L23.6663 26.259L19.1063 17.139L10.6508 13.7565L28.9853 7.64401ZM32.0843 3.45001L3.87533 12.852C3.72933 12.9004 3.60174 12.9925 3.50985 13.1159C3.41796 13.2392 3.36621 13.3878 3.36163 13.5416C3.35705 13.6953 3.39984 13.8467 3.48422 13.9754C3.5686 14.104 3.69047 14.2035 3.83333 14.2605L16.9328 19.5L23.5703 32.775C23.6379 32.9102 23.7447 33.0218 23.8767 33.0953C24.0088 33.1687 24.16 33.2005 24.3104 33.1866C24.4609 33.1726 24.6037 33.1136 24.72 33.0171C24.8363 32.9206 24.9208 32.7913 24.9623 32.646L33.0428 4.36651C33.0803 4.23513 33.0811 4.09603 33.0453 3.96421C33.0094 3.83239 32.9382 3.71286 32.8394 3.61853C32.7406 3.5242 32.6179 3.45865 32.4846 3.42895C32.3513 3.39925 32.2123 3.40653 32.0828 3.45001H32.0843Z"
fill="white"
/>
</svg>
<div class="line"></div>
GO
</div>
<svg class="close-icon" width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" @click="close">
<rect width="100" height="100" rx="50" fill="#C7C2B7" />
<path
d="M50 47.172L59.9 37.272L62.728 40.1L52.828 50L62.728 59.9L59.9 62.728L50 52.828L40.1 62.728L37.272 59.9L47.172 50L37.272 40.1L40.1 37.272L50 47.172Z"
fill="white"
/>
</svg>
</div>
</div>
</template>
<script setup lang="ts">
defineProps({
carInfo: {
type: Object,
default: () => ({})
}
})
const emits = defineEmits(['close', 'go'])
function close() {
emits('close')
}
function go() {
emits('go')
}
</script>
<style scoped>
.car-info-wrapper {
position: fixed;
z-index: 20;
background: rgb(0 0 0 / 50%);
inset: 0;
.masker {
position: absolute;
inset: 0;
z-index: 2;
}
.car-content {
position: absolute;
top: 50%;
left: 50%;
z-index: 3;
width: 717px;
border-radius: 16px;
transform: translate3d(-50%, -50%, 0);
}
.close-icon {
position: absolute;
top: -50px;
right: -50px;
width: 100px;
height: 100px;
}
.car-img {
width: 717px;
height: 403px;
}
.car {
display: flex;
align-items: center;
padding: 48px 56px;
background: #fff;
}
.car-group {
display: flex;
flex-direction: column;
&.mr120 {
margin-right: 120px;
}
.tip {
padding-bottom: 16px;
font-size: 20px;
color: #736661;
line-height: 28px;
}
.text {
font-size: 28px;
font-family: 'font_bold';
color: #595447;
font-weight: 700;
line-height: 36px;
}
}
.go {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
font-size: 36px;
text-align: center;
color: #fff;
background: #d4a866;
border-radius: 0 0 16px 16px;
font-weight: 700;
line-height: 44px;
.go-icon {
width: 36px;
height: 36px;
}
.line {
width: 1px;
height: 20px;
margin: 0 24px;
border: 1px solid rgb(255 255 255 / 50%);
}
}
}
</style>

72
src/components/PlateInput/PlateInput.vue

@ -1,10 +1,10 @@
<template>
<div class="plate-container">
<div class="input-wrapper">
<div class="plate-container" :class="{ 'space-wrapper': searchMethod === '车位' }">
<TransitionGroup appear mode="out-in" tag="div" name="zoom" class="input-wrapper">
<div
v-for="(item, index) of renderInputLength"
:key="item"
:class="{ active: index === list.length && list.length <= 7 }"
:class="{ active: index === list.length && list.length <= 7, space: searchMethod === '车位' }"
class="input"
@click="handleEnergy"
>
@ -16,8 +16,8 @@
</div>
</transition>
</div>
</div>
<div class="btn" @click="confirm">
</TransitionGroup>
<div class="btn disabled" @click="confirm">
<slot></slot>
<span>{{ btnText }}</span>
</div>
@ -61,21 +61,40 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
$height: 90px;
$width: 90px;
$font-color: rgb(0 0 0 / 80%);
$input-bg: rgb(0 0 0 / 10%);
$input-radius: 8px;
$height: 80px;
$width: 64px;
$font-color: #595447;
$input-bg: #fff;
$input-radius: 12px;
$font-size: 32px;
$font-energy-size: 12px;
$btn-bg: #535d75;
$font-energy-size: 14px;
$btn-bg: #d4a866;
$btn-color: #fff;
$btn-font-size: 20px;
$btn-width: 197px;
$btn-font-size: 28px;
$btn-width: 218px;
.plate-container {
position: relative;
display: flex;
justify-content: space-between;
margin-bottom: 24px;
&::before {
position: absolute;
top: 50%;
left: 158px;
width: 2px;
height: 24px;
background: rgb(0 0 0 / 20%);
border-radius: 1px;
transition: all 0.3s;
content: '';
transform: translateY(-50%);
}
&.space-wrapper {
&::before {
left: 100px;
}
}
.input-wrapper {
display: flex;
}
@ -86,6 +105,7 @@ $btn-width: 197px;
align-items: center;
width: $width;
height: $height;
margin-right: 8px;
font-size: $font-size;
font-family: 'font_bold';
text-align: center;
@ -93,9 +113,20 @@ $btn-width: 197px;
background: $input-bg;
border-radius: $input-radius;
font-weight: 700;
&:nth-child(2) {
margin-right: 42px;
}
&.active {
border: 1px solid orange;
border: 2px solid #d4a866;
}
&.space {
width: 80px;
margin-right: 10px;
&:nth-child(1) {
margin-right: 42px;
}
}
.text {
display: flex;
flex-direction: column;
@ -105,8 +136,14 @@ $btn-width: 197px;
&.energy {
animation-duration: 0.3s;
}
i {
color: #7bb756;
}
b {
font-size: $font-energy-size;
color: #7bb756;
line-height: 22px;
}
}
}
@ -117,10 +154,15 @@ $btn-width: 197px;
width: $btn-width;
height: $height;
padding: 0 58px;
margin-right: 14px;
font-size: $btn-font-size;
color: $btn-color;
background: $btn-bg;
border-radius: 12px;
box-shadow: 1px 16px 32px rgb(96 94 116 / 20%);
&.disabled {
opacity: 0.5;
}
span {
white-space: nowrap;
transition: all 0.3s;

52
src/components/PlateKeyboard/PlateKeyboard.vue

@ -49,7 +49,7 @@ const list = computed(() => (props.searchMethods === '车位' ? keyboard.filter(
const emits = defineEmits(['handle-keyboard', 'del'])
const keyboardIdx = ref(-1)
const keyboardTimer = ref<any>()
const keyboardTimer = ref()
function handleKeyboard(item: string, index: number) {
item === 'del' ? emits('del') : emits('handle-keyboard', item)
clearTimeout(keyboardTimer.value)
@ -70,45 +70,63 @@ onBeforeUnmount(() => {
.keyboard-wrapper {
display: flex;
flex-wrap: wrap;
width: 1010px;
width: 880px;
.keyboard-item {
width: 48px;
height: 48px;
width: 40px;
height: 44px;
margin-right: 8px;
margin-bottom: 8px;
font-size: 18px;
font-family: 'font_medium';
text-align: center;
color: rgb(0 0 0 / 80%);
background: rgb(255 255 255 / 60%);
border-radius: 6px;
box-shadow: 0 4px 8px rgb(0 0 0 / 3%), inset 0 -1px 0 rgb(177 189 220 / 10%);
color: #595447;
background: #fff;
border-radius: 8px;
line-height: 48px;
&:nth-child(9),
&:nth-child(15),
&:nth-child(27),
&:nth-child(33),
&:nth-child(45),
&:nth-child(51),
&:nth-child(69),
&:nth-child(63) {
margin-right: 16px;
}
.parking-keyboard-del {
width: 22px;
height: 18px;
}
&.space {
width: 104px;
width: 88px;
&:nth-child(6),
&:nth-child(15),
&:nth-child(24),
&:nth-child(33) {
margin-right: 24px;
}
&:nth-child(9),
&:nth-child(27),
&:nth-child(45),
&:nth-child(51),
&:nth-child(69),
&:nth-child(63) {
margin-right: 8px;
}
&.del {
width: 216px;
width: 184px;
}
}
&.uppercase {
background: #fff;
}
&.del {
display: flex;
justify-content: center;
align-items: center;
width: 104px;
background: rgb(0 0 0 / 5%);
width: 88px;
line-height: initial;
}
&.active {
color: #fff;
background: #f1b33e;
box-shadow: 0 4px 8px rgb(0 0 0 / 3%), inset 0 -1px 0 rgb(177 189 220 / 10%);
background: #d4a866;
}
}
}

10
src/components/Search/Hot.vue

@ -3,7 +3,7 @@
<div class="title">{{ $t('hot') }}</div>
<ScrollView class="myScoll" :list="list" :pull-up="false">
<div class="shop_list">
<div v-for="item in list" :key="item.shopCode" class="shop_item">
<div v-for="item in list" :key="item.shopCode" class="shop_item" @click="show(item)">
<div class="top">
<img v-lazy="item.logoUrl" alt="" />
</div>
@ -23,11 +23,18 @@
<script setup lang="ts">
import { ref } from 'vue'
import { getIndexJson } from '@/http/api/base'
import { useRootStore } from '@/store/root'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
const list = ref<HotSearch[]>()
getIndexJson().then(({ data }) => {
list.value = data.hotSearch
})
const store = useRootStore()
function show(item: any) {
store.SET_SHOP(item)
store.SET_SHOW_DETAIL(true)
}
</script>
<style lang="scss" scoped>
@ -51,6 +58,7 @@ getIndexJson().then(({ data }) => {
display: grid;
gap: 12px 12px;
grid-template-columns: 1fr 1fr 1fr;
padding-bottom: 10px;
.shop_item {
width: 230px;
height: 270px;

71
src/components/Search/Key.vue

@ -2,14 +2,22 @@
<div class="key-container">
<div class="inp">
<img src="@/assets/images/search/searchi.png" alt="" />
<div class="ph">搜索</div>
<div v-if="!word" class="ph">搜索</div>
<div v-if="word" class="keyword">{{ word }}</div>
<div v-if="word" class="line animate__animated animate__fadeIn animate__infinite"></div>
</div>
<div class="board-container">
<ul class="letter-items">
<li v-for="(item, index) of letter" :key="item" class="letter" :class="{ 'active-btn': current === index }">
<li
v-for="(item, index) of letter"
:key="item"
class="letter"
:class="{ 'active-btn': current === index }"
@click="handleLetter(item, index)"
>
{{ item }}
</li>
<li class="letter del" :class="{ 'active-btn': current === 37 }">
<li class="letter del" :class="{ 'active-btn': current === 37 }" @click="del()">
<img src="@/assets/images/search/del.png" alt="" />
</li>
</ul>
@ -19,7 +27,12 @@
<script setup lang="ts">
import { ref } from 'vue'
type Props = {
word: string
}
const props = defineProps<Props>()
const emit = defineEmits(['change', 'del'])
//
const letter = [
'Q',
@ -50,12 +63,29 @@ const letter = [
'M'
]
const current = ref(-1)
//
function handleLetter(item: string | number, index: number) {
if (current.value === index) {
current.value = -1
}
if (props.word.length < 10) {
emit('change', item)
current.value = index
}
}
//
function del() {
emit('del')
}
</script>
<style lang="scss" scoped>
.key-container {
margin: 68px 52px 286px 100px;
.inp {
@include fl();
position: relative;
width: 714px;
height: 80px;
@ -78,6 +108,21 @@ const current = ref(-1)
font-weight: 700;
line-height: 36px;
}
.keyword {
margin-right: 12px;
font-size: 28px;
font-family: 'font_bold';
color: #9b8c85;
font-style: normal;
font-weight: 700;
line-height: 36px;
}
.line {
width: 3px;
height: 32px;
background: #be9b75;
}
}
.board-container {
width: 714px;
@ -124,4 +169,24 @@ const current = ref(-1)
}
}
}
@keyframes gradient {
0% {
background: #f4f4f4;
}
25% {
color: #fff;
background: #9b8c85;
}
50% {
color: #fff;
background: #9b8c85;
}
75% {
background: #f4f4f4;
}
100% {
background: #f4f4f4;
}
}
</style>

108
src/components/Search/Result.vue

@ -0,0 +1,108 @@
<template>
<div class="result-container">
<ScrollView class="myScoll" :list="list" :pull-up="false">
<div class="shop_list">
<div v-for="item in list" :key="item.shopCode" class="shop_item" @click="show(item)">
<div class="left">
<img v-lazy="item.logoUrl" alt="" />
</div>
<div class="info">
<div class="name">{{ switchLanguage(item, 'shopName') }}</div>
<div class="right">
<img src="@/assets/images/search/position.png" alt="" />
<div class="hose_num">{{ item.houseNumber }}</div>
</div>
</div>
</div>
</div>
</ScrollView>
</div>
</template>
<script setup lang="ts">
import { useRootStore } from '@/store/root'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
type ShopList = {
list: Shop[]
}
defineProps<ShopList>()
const store = useRootStore()
function show(item: Shop) {
store.SET_SHOP(item)
store.SET_SHOW_DETAIL(true)
}
</script>
<style lang="scss" scoped>
.result-container {
width: 714px;
height: 694px;
padding-top: 64px;
padding-left: 65px;
background: #fff;
border-radius: 12px;
.myScoll {
overflow: hidden;
height: 630px;
}
.shop_list {
display: grid;
gap: 32px 180px;
grid-template-columns: 1fr 1fr;
padding-bottom: 10px;
.shop_item {
@include fl();
width: 192px;
height: 80px;
.left {
@include fl(center);
width: 80px;
height: 80px;
margin-right: 16px;
background: #fff;
border: 1px solid rgb(155 140 133 / 50%);
border-radius: 4px;
img {
width: 64px;
height: 64px;
}
}
.info {
width: 96px;
height: 60px;
.name {
@include no-wrap;
width: 96px;
height: 32px;
margin-bottom: 6px;
font-size: 24px;
font-family: 'font_bold';
color: #736661;
font-style: normal;
font-weight: 700;
line-height: 32px;
}
.right {
@include fl();
img {
width: 18px;
height: 18px;
margin-right: 4px;
}
.hose_num {
font-size: 14px;
font-family: 'font_bold';
color: #9b8c85;
font-style: normal;
font-weight: 700;
line-height: 22px;
}
}
}
}
}
}
</style>

55
src/components/Search/Search.vue

@ -1,24 +1,63 @@
<template>
<div class="search-container">
<img class="close" src="@/assets/images/search/close.png" alt="" @click="close" />
<div class="bg">
<Quick />
<div class="content">
<Key />
<Hot />
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut">
<div class="search-container">
<img class="close" src="@/assets/images/search/close.png" alt="" @click="close" />
<div class="bg">
<Quick />
<div class="content">
<Key :word="word" @del="del" @change="change" />
<Hot v-if="!word" />
<Result v-if="word" :list="selectedShopList" />
</div>
</div>
</div>
</div>
</transition>
</template>
<script setup lang="ts">
import { toRefs, ref, watch } from 'vue'
import { useRootStore } from '@/store/root'
import Quick from './Quick.vue'
import Hot from './Hot.vue'
import Key from './Key.vue'
import Result from './Result.vue'
const store = useRootStore()
const selectedShopList = ref()
const { shopList } = toRefs(store)
const emits = defineEmits(['close'])
//
function close() {
emits('close')
}
const word = ref('')
//
function change(item: string | number) {
if (word.value.length < 10) {
word.value += item
}
}
//
function del() {
word.value = word.value.slice(0, -1)
}
//
watch(
() => word,
newVal => {
if (newVal.value.length) {
selectedShopList.value = shopList.value.filter(
item => item.initials?.includes(newVal.value) || item.shopName.includes(newVal.value) || item.shopNameEn?.includes(newVal.value)
)
} else {
selectedShopList.value = []
}
},
{
deep: true
}
)
</script>
<style lang="scss" scoped>

464
src/components/Traffic/Traffic.vue

@ -0,0 +1,464 @@
<template>
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<div class="traffic-container">
<div class="left">
<img class="bg" src="@/assets/images/traffic.png" alt="" />
<div class="qing_1">
<svg width="637" height="242" viewBox="0 0 637 242" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M626.5 0H637L25.5 241.5L0 237L626.5 0Z" :fill="roadList[6].color" />
</svg>
</div>
<div class="qing_2">
<svg width="659" height="234" viewBox="0 0 659 234" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M649 0.5H658.5L25.5 234L0 229L649 0.5Z" :fill="roadList[7].color" />
</svg>
</div>
<div class="qing_bg">
<svg width="700" height="246" viewBox="0 0 700 246" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M657 0L700 1L94.9994 245.5L0 226.5L657 0Z" fill="white" />
</svg>
</div>
<div class="label qing">青年大桥</div>
<div class="bo_1">
<svg width="805" height="174" viewBox="0 0 805 174" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 2.5L9 0.5L804.5 165L782 174L0 2.5Z" :fill="roadList[5].color" />
</svg>
</div>
<div class="bo_2">
<svg width="819" height="163" viewBox="0 0 819 163" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.5 1.5L7 0L818.5 155.5L801.5 162.5L0.5 1.5Z" :fill="roadList[4].color" />
</svg>
</div>
<div class="bo_bg">
<svg width="856" height="185" viewBox="0 0 856 185" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 8.5L34.5 0.5L855.5 152L773 184.5L0 8.5Z" fill="white" />
</svg>
</div>
<div class="label bo">博览路</div>
<div class="jiu_1">
<svg width="669" height="147" viewBox="0 0 669 147" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M659.5 0L668.5 0.5L17.5 147L0.5 144L659.5 0Z" :fill="roadList[2].color" />
</svg>
</div>
<div class="jiu_2">
<svg width="681" height="145" viewBox="0 0 681 145" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M672.5 0.5L680.5 1L18.5 144.5L0 141L672.5 0.5Z" :fill="roadList[1].color" />
</svg>
</div>
<div class="jiu_bg">
<svg width="718" height="151" viewBox="0 0 718 151" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M681.5 0L717.473 3.23145L68.5 151L0 139L681.5 0Z" fill="white" />
</svg>
</div>
<div class="label jiu">九龙街</div>
<div class="shen_1">
<svg width="622" height="72" viewBox="0 0 622 72" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.5 1.5L6.5 0.5L622 67.5L611.5 72L0.5 1.5Z" :fill="roadList[1].color" />
</svg>
</div>
<div class="shen_2">
<svg width="626" height="67" viewBox="0 0 626 67" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 1L5 0L625.5 62.5L616.5 66.5L0 1Z" :fill="roadList[0].color" />
</svg>
</div>
<div class="shen_bg">
<svg width="650" height="78" viewBox="0 0 650 78" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.5 5.5L26.5169 0.5L649.504 61L611 78L0.5 5.5Z" fill="white" />
</svg>
</div>
<div class="label shen">沈水路</div>
</div>
<div class="right">
<div class="title">{{ $t('road') + ':' }}</div>
<div class="road-list">
<div v-for="item in statusList" :key="item.name" class="road">
<div class="w" :style="'background:' + item.color"></div>
<div class="type">{{ switchLanguage(item, 'name') }}</div>
</div>
</div>
<div class="info-container">
<div class="item">
<div class="name">博览路</div>
<div class="road" style="margin-right: 24px">
<div class="w" :style="'background:' + roadList[4].color"></div>
<div class="type">{{ switchLanguage(roadList[4], 'status') }}</div>
</div>
<div class="road">
<div class="w" :style="'background:' + roadList[5].color"></div>
<div class="type">{{ switchLanguage(roadList[5], 'status') }}</div>
</div>
</div>
<div class="item">
<div class="name">九龙街</div>
<div class="road" style="margin-right: 24px">
<div class="w" :style="'background:' + roadList[2].color"></div>
<div class="type">{{ switchLanguage(roadList[2], 'status') }}</div>
</div>
<div class="road">
<div class="w" :style="'background:' + roadList[3].color"></div>
<div class="type">{{ switchLanguage(roadList[3], 'status') }}</div>
</div>
</div>
<div class="item">
<div class="name">沈水路</div>
<div class="road" style="margin-right: 24px">
<div class="w" :style="'background:' + roadList[0].color"></div>
<div class="type">{{ switchLanguage(roadList[0], 'status') }}</div>
</div>
<div class="road">
<div class="w" :style="'background:' + roadList[1].color"></div>
<div class="type">{{ switchLanguage(roadList[1], 'status') }}</div>
</div>
</div>
<div class="item">
<div class="name">青年大桥</div>
<div class="road" style="margin-right: 24px">
<div class="w" :style="'background:' + roadList[6].color"></div>
<div class="type">{{ switchLanguage(roadList[6], 'status') }}</div>
</div>
<div class="road">
<div class="w" :style="'background:' + roadList[7].color"></div>
<div class="type">{{ switchLanguage(roadList[7], 'status') }}</div>
</div>
</div>
</div>
</div>
</div>
</transition>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const statusList = [
{
name: '畅通',
nameEn: 'Clear',
color: '#68B753'
},
{
name: '缓行',
nameEn: 'Slow',
color: '#F5BD44'
},
{
name: '拥堵',
nameEn: 'Jam',
color: '#E53F3B'
},
{
name: '非常拥堵',
nameEn: 'Congested',
color: '#A91A1F'
}
]
const roadList = ref([
{
roadName: '沈水路',
direction: '东向西',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '沈水路',
direction: '西向东',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '九龙街',
direction: '南向北',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '九龙街',
direction: '北向南',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '博览路',
direction: '东向西',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '博览路',
direction: '西向东',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '青年大街',
direction: '南向北',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
},
{
roadName: '青年大街',
direction: '北向南',
color: '#68B753',
status: '畅通',
statusEn: 'Clear'
}
])
const resList = [
{
roadName: '九龙街',
sectionDesc: '南向北',
status: '拥堵',
speed: 21.37,
distance: 740
},
{
roadName: '青年大街',
sectionDesc: '南向北',
status: '拥堵',
speed: 21.38,
distance: 730
}
]
resList.forEach(item => {
switch (item.roadName) {
case '沈水路':
item.sectionDesc === '东向西' ? changeStatus(item.status, roadList.value[0]) : changeStatus(item.status, roadList.value[1])
break
case '九龙街':
item.sectionDesc === '南向北' ? changeStatus(item.status, roadList.value[2]) : changeStatus(item.status, roadList.value[3])
break
case '博览路':
item.sectionDesc === '东向西' ? changeStatus(item.status, roadList.value[4]) : changeStatus(item.status, roadList.value[5])
break
case '青年大街':
item.sectionDesc === '南向北' ? changeStatus(item.status, roadList.value[6]) : changeStatus(item.status, roadList.value[7])
break
default:
break
}
})
function changeStatus(status: string, item: any) {
switch (status) {
case '畅通':
item.status = '畅通'
item.statusEn = 'Clear'
item.color = '#68B753'
break
case '缓行':
item.status = '缓行'
item.statusEn = 'Slow'
item.color = '#F5BD44'
break
case '拥堵':
item.status = '拥堵'
item.statusEn = 'Jam'
item.color = '#E53F3B'
break
case '严重拥堵':
item.status = '非常拥堵'
item.statusEn = 'Congested'
item.color = '#A91A1F'
break
default:
break
}
}
</script>
<style lang="scss" scoped>
.traffic-container {
@include fl(flex-start, flex-start);
position: fixed;
top: 306px;
left: 112px;
.left {
position: relative;
width: 1218px;
height: 600px;
.bg {
position: absolute;
top: 0;
left: 236px;
z-index: 10;
width: 693px;
height: 420px;
}
.qing {
position: absolute;
top: 350px;
left: 890px;
transform: rotate(-23.66deg);
}
.qing_1 {
position: absolute;
top: 249px;
left: 545px;
z-index: 15;
}
.qing_2 {
position: absolute;
top: 249px;
left: 502px;
z-index: 15;
}
.qing_bg {
position: absolute;
top: 248px;
left: 488px;
z-index: 14;
}
.bo {
position: absolute;
top: 390px;
left: 279px;
transform: rotate(13.14deg);
}
.bo_1 {
position: absolute;
top: 308.5px;
left: 29px;
z-index: 7;
}
.bo_2 {
position: absolute;
top: 304px;
left: 49.5px;
z-index: 7;
}
.bo_bg {
position: absolute;
top: 303.5px;
left: 24px;
z-index: 6;
}
.jiu {
position: absolute;
top: 245px;
left: 155px;
transform: rotate(-12.85deg);
}
.jiu_1 {
position: absolute;
top: 206px;
left: 41.5px;
z-index: 9;
}
.jiu_2 {
position: absolute;
top: 204.5px;
left: 13px;
z-index: 9;
}
.jiu_bg {
position: absolute;
top: 204px;
left: 0;
z-index: 8;
}
.shen {
position: absolute;
top: 205px;
left: 950px;
transform: rotate(6.52deg);
}
.shen_1 {
position: absolute;
top: 212px;
left: 574.5px;
z-index: 5;
}
.shen_2 {
position: absolute;
top: 210px;
left: 586px;
z-index: 5;
}
.shen_bg {
position: absolute;
top: 209.5px;
left: 568.5px;
z-index: 4;
}
.label {
font-size: 36px;
font-family: 'font_regular';
color: #595447;
font-style: normal;
font-weight: 400;
line-height: 44px;
}
}
.right {
margin-top: 80px;
margin-left: 59px;
.title {
margin-bottom: 24px;
font-size: 28px;
font-family: 'font_bold';
color: #736661;
font-style: normal;
font-weight: 700;
line-height: 36px;
}
.road-list {
@include fl();
margin-bottom: 48px;
}
.road {
@include fl();
margin-right: 40px;
.w {
width: 20px;
height: 20px;
margin-right: 8px;
}
.type {
font-size: 20px;
font-family: 'font_regular';
color: #9b8c85;
font-style: normal;
font-weight: 400;
line-height: 28px;
}
}
.info-container {
width: 452px;
height: 356px;
padding: 40px 48px 12px;
background: #fff;
border-radius: 16px;
.item {
@include fl();
margin-bottom: 48px;
.name {
width: 100px;
margin-right: 40px;
font-size: 20px;
font-family: 'font_bold';
color: #736661;
font-style: normal;
font-weight: 700;
line-height: 28px;
}
}
}
}
}
</style>

2
src/components/TypeBtnList/TypeBtnList.vue

@ -45,7 +45,7 @@ function changeType(item: TypeItem, index: number) {
display: flex;
h4 {
width: 96px;
// width: 96px;
height: 40px;
font-size: 24px;
font-family: 'font_regular';

6
src/composables/useHandleScreen.ts

@ -84,9 +84,11 @@ export const useHandleScreen = (callback: () => void) => {
onMounted(() => {
//获取返回首页和进入屏保的具体时间
getBackTime().then(({ data }) => {
totalTime.value = data
const noWallpaper = data[1] === 0 //判断有无屏保 为0时没有
const paperTime = noWallpaper ? -1 : data[1]
totalTime.value = [data[0], paperTime]
toIndexTime.value = data[0]
toWallpaperTime.value = data[1]
toWallpaperTime.value = paperTime
})
})
return {

11
src/composables/useParkingKeyboard.ts

@ -1,15 +1,17 @@
import { ref, computed } from 'vue'
import { isZhWord, isUppercaseWord } from '@/utils/utils'
type SearchMethods = '车牌' | '车位'
export const useParkingKeyboard = () => {
const NOT_ENERGY_PLATE = 7 //非能源车牌长度
const ENERGY_PLATE = 8 //能源车牌长度
const SPACE_MAX_LENGTH = 6 //车位最大允许长度
const SPACE_MAX_LENGTH = 4 //车位最大允许长度
const LICENSE = ['苏', 'A'] //默认车牌前缀
const plate = ref(LICENSE.slice())
const plateToString = computed(() => plate.value.join(''))
const searchMethod = ref<'车牌' | '车位'>('车牌')
const searchMethod = ref<SearchMethods>('车牌')
const inputLength = computed(() => (searchMethod.value === '车牌' ? ENERGY_PLATE : SPACE_MAX_LENGTH))
const isEnergy = ref(false)
function handleEnergy(energy: boolean) {
@ -42,6 +44,9 @@ export const useParkingKeyboard = () => {
function del() {
plate.value.pop()
}
function changeSearchMethod(method: SearchMethods) {
searchMethod.value = method
}
return { del, handleKeyboard, handleEnergy, inputLength, plate, plateToString, LICENSE, searchMethod }
return { del, handleKeyboard, handleEnergy, inputLength, plate, plateToString, LICENSE, searchMethod, changeSearchMethod }
}

2
src/http/api/parking/index.ts

@ -1,3 +1,5 @@
import { request } from '../../http'
//找车
export const getFindCar = (license: string) => request<CarInfo>({ url: `/ThirdPark/GetPlaceInfo?carCode=${license}` })
export const getParkingInfo = () => request<ParkingInfo>({ url: `/JSON/getParkingInfo.json` })

4
src/i18n/lang/en.json

@ -23,5 +23,7 @@
"dispoint": "Activity and Discount",
"service": "Service",
"school": "College Of Culture",
"hot": "Hot Shop"
"hot": "Hot Shop",
"searB": "Search Brand",
"road": "Traffic"
}

4
src/i18n/lang/tw.json

@ -23,5 +23,7 @@
"dispoint": "優惠與活動",
"service": "貼心服務",
"school": "文化學院",
"hot": "熱門店鋪"
"hot": "熱門店鋪",
"searB": "搜索品牌",
"road": "路況說明"
}

4
src/i18n/lang/zh.json

@ -23,5 +23,7 @@
"dispoint": "优惠与活动",
"service": "贴心服务",
"school": "文化学院",
"hot": "热门店铺"
"hot": "热门店铺",
"searB": "搜索品牌",
"road": "路况说明"
}

8
src/types/parking.d.ts

@ -0,0 +1,8 @@
declare interface ParkingInfo {
title: string
titleEn: string
content: string
contentEn: string
fileList: string[]
qrFileList: Array<{ name: string; nameEn: string; fileUrl: string }>
}

4
src/views/Activity/Activity.vue

@ -1,10 +1,10 @@
<template>
<div class="po">{{ $t('dispoint') }}</div>
<Transition name="zoom">
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<div class="carousel">
<Carousel :ac-list="aclist" />
</div>
</Transition>
</transition>
</template>
<script setup lang="ts">

4
src/views/Index/Index.vue

@ -1,6 +1,8 @@
<template>
<Top />
<Middle />
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<Middle />
</transition>
</template>
<script setup lang="ts">

102
src/views/Index/Middle.vue

@ -1,20 +1,64 @@
<template>
<Transition name="zoom">
<div class="middle-container">
<div class="brand" @click="go('brand')"></div>
<div class="activity" @click="go('activity')"></div>
<div class="art" @click="go('art')"></div>
<div class="school" @click="go('school')"></div>
<div class="service" @click="go('service')"></div>
<div class="member" @click="go('member')"></div>
<div class="parking" @click="go('parking')"></div>
<div class="brand" @click="go('brand')">
<div class="txt_w">{{ switchLanguage(list[0], 'title') }}</div>
<div class="sear">{{ $t('searB') }}</div>
</div>
<div class="activity" @click="go('activity')">
<div class="txt">{{ switchLanguage(list[1], 'title') }}</div>
</div>
<div class="art" @click="go('art')">
<div class="txt_w">{{ switchLanguage(list[6], 'title') }}</div>
</div>
<div class="school" @click="go('school')">
<div class="txt_w">{{ switchLanguage(list[5], 'title') }}</div>
</div>
<div class="service" @click="go('service')">
<div class="txt_w">{{ switchLanguage(list[3], 'title') }}</div>
</div>
<div class="member" @click="go('member')">
<div class="txt_w">{{ switchLanguage(list[2], 'title') }}</div>
</div>
<div class="parking" @click="go('parking')">
<div class="txt">{{ switchLanguage(list[4], 'title') }}</div>
</div>
</div>
</Transition>
</template>
<script setup lang="ts">
import { useRouter } from 'vue-router'
const list = [
{
title: '店铺导航',
titleEn: 'Brand'
},
{
title: '优惠活动',
titleEn: 'Activity'
},
{
title: '会员尊享',
titleEn: 'Member'
},
{
title: '客户服务',
titleEn: 'Service'
},
{
title: '停车缴费',
titleEn: 'Parking'
},
{
title: '文化学院',
titleEn: 'School'
},
{
title: '艺术中心',
titleEn: 'Art'
}
]
const router = useRouter()
function go(path: string) {
router.push(path)
@ -31,16 +75,32 @@ function go(path: string) {
.brand {
@include ab(0, 0, 1);
position: relative;
width: 270px;
height: 536px;
padding-top: 32px;
padding-left: 24px;
background: url('@/assets/images/index/brand.png') no-repeat;
background-size: 100% 100%;
.sear {
position: absolute;
top: 125px;
left: 24px;
font-size: 16px;
font-family: 'font_regular';
color: rgb(255 255 255 / 80%);
font-style: normal;
font-weight: 400;
line-height: 24px;
}
}
.activity {
@include ab(0, 280px, 1);
width: 520px;
height: 263px;
padding-top: 32px;
padding-left: 24px;
background: url('@/assets/images/index/activity.png') no-repeat;
background-size: 100% 100%;
}
@ -49,6 +109,8 @@ function go(path: string) {
width: 220px;
height: 263px;
padding-top: 24px;
padding-left: 24px;
background: url('@/assets/images/index/art.png') no-repeat;
background-size: 100% 100%;
}
@ -57,6 +119,8 @@ function go(path: string) {
width: 290px;
height: 263px;
padding-top: 24px;
padding-left: 24px;
background: url('@/assets/images/index/school.png') no-repeat;
background-size: 100% 100%;
}
@ -65,6 +129,8 @@ function go(path: string) {
width: 255px;
height: 263px;
padding-top: 24px;
padding-left: 24px;
background: url('@/assets/images/index/ser.png') no-repeat;
background-size: 100% 100%;
}
@ -73,6 +139,8 @@ function go(path: string) {
width: 255px;
height: 263px;
padding-top: 24px;
padding-left: 24px;
background: url('@/assets/images/index/member.png') no-repeat;
background-size: 100% 100%;
}
@ -81,8 +149,26 @@ function go(path: string) {
width: 520px;
height: 263px;
padding-top: 32px;
padding-left: 24px;
background: url('@/assets/images/index/park.png') no-repeat;
background-size: 100% 100%;
}
}
.txt {
font-size: 36px;
font-family: 'font_bold';
color: rgb(0 0 0 / 90%);
font-style: normal;
font-weight: 700;
line-height: 44px;
}
.txt_w {
font-size: 34px;
font-family: 'font_bold';
color: #fff;
font-style: normal;
font-weight: 700;
line-height: 51px;
}
</style>

8
src/views/Member/Member.vue

@ -1,8 +1,10 @@
<template>
<typeBtnGroup class="top" :list="list" />
<div class="carousel">
<Carousel :ac-list="memberInfo" />
</div>
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<div class="carousel">
<Carousel :ac-list="memberInfo" />
</div> </transition
>>
</template>
<script setup lang="ts">

186
src/views/Parking/Parking.vue

@ -1,22 +1,198 @@
<template>
<PlateInput :list="plate" :search-method="searchMethod" :space-length="inputLength" @confirm="onConfirm" @handle-energy="handleEnergy">
<Loading v-if="loading" fill="#fff" :size="20" />
</PlateInput>
<PlateKeyboard @del="del" @handle-keyboard="handleKeyboard" />
<div class="parking-container">
<div class="tabs">
<div v-for="(item, index) of tabs" :key="item.title" class="tab-item" @click="handleTab(index)">
<span class="text" :class="{ active: tabIdx === index }">{{ switchLanguage(item, 'title') }}</span>
<div v-if="index !== tabs.length - 1" class="line"></div>
</div>
</div>
<div v-if="tabIdx !== 2" class="content">
<div class="content-left">
<PlateInput
:list="plate"
:search-method="searchMethod"
:space-length="inputLength"
@confirm="onConfirm"
@handle-energy="handleEnergy"
>
<Loading v-if="loading" fill="#fff" :size="20" />
</PlateInput>
<PlateKeyboard :search-methods="searchMethod" @del="del" @handle-keyboard="handleKeyboard" />
</div>
<div class="content-right">
<div class="parking-carousel">
<EffectFade></EffectFade>
</div>
<h1 class="title">{{ switchLanguage(parkingInfo, 'title') }}</h1>
<ScrollView class="parking-scroll" scrollbar :list="switchLanguage(parkingInfo, 'content')">
<div class="intro">{{ switchLanguage(parkingInfo, 'content') }}</div>
</ScrollView>
</div>
</div>
<Traffic v-else />
</div>
<CarInfo v-if="showCarDetail" @close="showCarDetail = false" @go="onConfirm" />
</template>
<script setup lang="ts">
import { ref, shallowRef, defineAsyncComponent } from 'vue'
import { useFindCar } from '@/composables/useFindCar'
import { useParkingKeyboard } from '@/composables/useParkingKeyboard'
import { getParkingInfo } from '@/http/api/parking'
import PlateInput from '@/components/PlateInput/PlateInput.vue'
import PlateKeyboard from '@/components/PlateKeyboard/PlateKeyboard.vue'
import Loading from '@/base/Loading/Loading.vue'
import EffectFade from '@/components/EffectFade/EffectFade.vue'
import ScrollView from '@/base/ScrollView/ScrollView.vue'
const CarInfo = defineAsyncComponent(() => import('@/components/CarInfo/CarInfo.vue'))
const Traffic = defineAsyncComponent(() => import('@/components/Traffic/Traffic.vue'))
const { del, handleKeyboard, handleEnergy, inputLength, plate, plateToString, searchMethod, LICENSE } = useParkingKeyboard()
const tabs = [
{
title: '车牌号寻车',
titleEn: 'License Plate Number'
},
{
title: '车位号找车',
titleEn: 'Parking Lot Number'
},
{
title: '周边交通',
titleEn: 'Surrounding Transportation'
}
] as const
const tabIdx = ref(0)
function handleTab(index: number) {
tabIdx.value = index
if (index === 0) {
plate.value = LICENSE.slice()
changeSearchMethod('车牌')
} else if (index === 1) {
plate.value = []
changeSearchMethod('车位')
}
}
const { del, handleKeyboard, handleEnergy, inputLength, plate, plateToString, searchMethod, LICENSE, changeSearchMethod } =
useParkingKeyboard()
const { confirm, loading, showCarDetail, result } = useFindCar()
function onConfirm() {
plate.value = LICENSE
confirm(plateToString.value)
}
const parkingInfo = shallowRef<ParkingInfo>({} as ParkingInfo)
getParkingInfo().then(({ data }) => {
parkingInfo.value = data ?? {}
})
</script>
<style lang="scss" scoped>
.parking-container {
position: absolute;
top: 140px;
z-index: 20;
// padding-top: 140px;
.tabs {
display: flex;
justify-content: center;
align-items: center;
width: 1920px;
margin-bottom: 64px;
.tab-item {
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
color: #84754e;
font-weight: 400;
}
.text {
position: relative;
display: block;
padding-bottom: 10px;
line-height: 32px;
&.active {
&::before {
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 4px;
background-color: #84754e;
content: '';
}
}
}
.line {
width: 2px;
height: 26px;
margin: -5px 40px 0;
background: #84754e;
}
}
.content {
display: flex;
justify-content: space-between;
margin: 0 226px;
.content-left {
width: 900px;
height: 400px;
padding-top: 40px;
padding-left: 14px;
background: rgb(0 0 0 / 4%);
border-radius: 16px;
}
.content-right {
overflow: hidden;
width: 540px;
background: rgb(255 255 255 / 40%);
border-radius: 8px;
.parking-carousel {
position: relative;
width: 540px;
height: 304px;
margin-bottom: 40px;
background-color: #fff;
:deep(.stay-tuned) {
height: 200px;
}
}
.title {
margin: 0 48px 12px;
font-size: 24px;
color: #595447;
font-weight: 700;
line-height: 32px;
}
.parking-scroll {
position: relative;
overflow: hidden;
height: 238px;
margin: 0 18px 40px 48px;
:deep(.bscroll-vertical-scrollbar) {
width: 6px !important;
height: 120px !important;
background: rgb(0 0 0 / 3%) !important;
opacity: 1 !important;
.bscroll-indicator {
height: 40px !important;
background: #fff !important;
border: none !important;
box-shadow: 0 8px 20px rgb(0 0 0 / 10%) !important;
}
}
.intro {
padding-right: 24px;
font-size: 14px;
text-align: justify;
color: #736661;
line-height: 28px;
}
}
}
}
}
</style>

4
src/views/School/School.vue

@ -1,10 +1,10 @@
<template>
<div class="po">{{ $t('school') }}</div>
<Transition name="zoom">
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<div class="carousel">
<Carousel :ac-list="aclist" />
</div>
</Transition>
</transition>
</template>
<script setup lang="ts">

4
src/views/ServiceList/ServiceList.vue

@ -1,6 +1,6 @@
<template>
<div class="po">{{ $t('service') }}</div>
<Transition name="zoom">
<transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__zoomOut">
<div class="list-container">
<div class="list">
<div v-for="item in serviceList" :key="item.name" class="list-item">
@ -9,7 +9,7 @@
</div>
</div>
</div>
</Transition>
</transition>
<div class="btn" @click="go">
<span class="text">导航至</span>
<span class="textC">服务台</span>

Loading…
Cancel
Save