Explorar o código

feat: H5页面开发

szr190 hai 3 meses
pai
achega
69e320b640

+ 1 - 1
src/App.vue

@@ -25,7 +25,7 @@ onHide(() => {
25 25
 <style lang="scss">
26 26
 @import './uni_modules/vk-uview-ui/index.scss';
27 27
 page {
28
-  background-color: #f8f8f8;
28
+  background-color: #edf1f5;
29 29
 }
30 30
 /* @font-face {
31 31
   font-family: 'MyFont';

+ 116 - 0
src/base/base.scss

@@ -0,0 +1,116 @@
1
+.common-details-container {
2
+  .common-header-wrapper {
3
+    width: 100%;
4
+    height: 420rpx;
5
+    background-color: #f5f5f5;
6
+    position: relative;
7
+    z-index: 1;
8
+    &.join {
9
+      height: 403rpx;
10
+      image {
11
+        width: 100%;
12
+        height: 403rpx;
13
+      }
14
+    }
15
+    image {
16
+      width: 100%;
17
+      height: 420rpx;
18
+    }
19
+  }
20
+  .common-content-wrapper {
21
+    width: 694rpx;
22
+    margin: -42rpx auto 0 auto;
23
+    position: relative;
24
+    z-index: 2;
25
+  }
26
+  .common-card {
27
+    width: 694rpx;
28
+    box-sizing: border-box;
29
+    padding: 28rpx;
30
+    background-color: #fff;
31
+    border-radius: 14rpx;
32
+    margin-bottom: 24rpx;
33
+    .common-card-title {
34
+      font-size: 31rpx;
35
+      color: #333;
36
+      font-weight: 600;
37
+      margin-bottom: 10rpx;
38
+      display: flex;
39
+      align-items: center;
40
+      .text {
41
+        font-size: 31rpx;
42
+        color: #333;
43
+        font-weight: 600;
44
+      }
45
+      .card-tag {
46
+        box-sizing: border-box;
47
+        padding: 0 15rpx;
48
+        border-radius: 14rpx;
49
+        background-color: #f5840b;
50
+        font-size: 21rpx;
51
+        color: #fff;
52
+        margin-left: 14rpx;
53
+        display: flex;
54
+        align-items: center;
55
+        justify-content: center;
56
+        vertical-align: middle;
57
+      }
58
+    }
59
+    .common-sub-title {
60
+      font-size: 25rpx;
61
+      color: #333;
62
+      margin-top: 12rpx;
63
+      display: flex;
64
+      align-items: center;
65
+      justify-content: space-between;
66
+      .text {
67
+        font-size: 25rpx;
68
+        color: #333;
69
+      }
70
+      .sub-img-wrap {
71
+        width: 43rpx;
72
+        height: 43rpx;
73
+        image {
74
+          width: 43rpx;
75
+          height: 43rpx;
76
+        }
77
+      }
78
+    }
79
+    .common-card-content {
80
+      font-size: 22rpx;
81
+      color: #333;
82
+      line-height: 42rpx;
83
+      text {
84
+        display: inline-block;
85
+      }
86
+    }
87
+    .common-card-list {
88
+      display: flex;
89
+      flex-wrap: wrap;
90
+      justify-content: space-between;
91
+      margin-top: 24rpx;
92
+      .card-list-item {
93
+        display: flex;
94
+        flex-direction: column;
95
+        align-items: center;
96
+        justify-content: center;
97
+        margin-bottom: 22rpx;
98
+        .item-img-wrap {
99
+          width: 180rpx;
100
+          height: 180rpx;
101
+          background-color: #f5f5f5;
102
+          image {
103
+            width: 180rpx;
104
+            height: 180rpx;
105
+          }
106
+        }
107
+        .list-text {
108
+          font-size: 22rpx;
109
+          color: #333;
110
+          line-height: 42rpx;
111
+          margin-top: 12rpx;
112
+        }
113
+      }
114
+    }
115
+  }
116
+}

+ 69 - 0
src/base/common/charge.vue

@@ -0,0 +1,69 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image :src="minioUrl + '/img_chongdian_bg.png'" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">山高新能源海清高速服务区充电站</view>
10
+        <!-- sub title -->
11
+        <view class="common-sub-title">营业时间:24小时</view>
12
+        <view class="common-sub-title">客服电话:0532-8886666</view>
13
+      </view>
14
+      <view class="common-card">
15
+        <view class="common-card-title u-margin-bottom-20">当前电价</view>
16
+        <!-- 当前电价及时间展示 -->
17
+        <view class="charge-current-wrapper">
18
+          <view class="current-left-wrap">
19
+            <view class="text">1.36</view>
20
+            <view class="unit">元/度</view>
21
+          </view>
22
+          <view class="current-right-wrap">09:00-12:00</view>
23
+        </view>
24
+        <HyCharge />
25
+        <view class="common-card-title u-margin-top-45">温馨提示</view>
26
+        <view class="common-card-content">
27
+          <text>1、进出充电站时,请严格遵守交通规则和指示标识,注意观察礼让其他车辆。</text>
28
+          <text>2、充电前请确认车辆与充电桩兼容(如接口类型、功率匹配),优先选择支持直流快充的桩。</text>
29
+          <text>3、充电前确保车辆熄火(混动车型需熄火),连接充电枪后启动充电程序。</text>
30
+          <text>4、充电过程中若发现设备故障、异味或漏电,立即停止并联系工作人员。</text>
31
+          <text>5、充电结束时先关闭电源,再拔枪并妥善存放。</text>
32
+        </view>
33
+      </view>
34
+    </view>
35
+  </view>
36
+</template>
37
+
38
+<script setup lang="ts">
39
+import { ref } from 'vue'
40
+import { useGlobal } from '../../composables/index'
41
+const { minioUrl } = useGlobal()
42
+</script>
43
+
44
+<style lang="scss" scoepd>
45
+@import '../base.scss';
46
+.charge-current-wrapper {
47
+  display: flex;
48
+  align-items: center;
49
+  justify-content: space-between;
50
+  margin-bottom: 20rpx;
51
+  .current-left-wrap {
52
+    display: flex;
53
+    align-items: center;
54
+    .text {
55
+      font-size: 31rpx;
56
+      color: #ff3d28;
57
+      font-weight: 600;
58
+    }
59
+    .unit {
60
+      font-size: 21rpx;
61
+      color: #333;
62
+    }
63
+  }
64
+  .current-right-wrap {
65
+    font-size: 21rpx;
66
+    color: #999;
67
+  }
68
+}
69
+</style>

+ 37 - 0
src/base/common/driversHome.vue

@@ -0,0 +1,37 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image :src="minioUrl + '/img_sijizhijia_bg.png'" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">海清服务区司机之家</view>
10
+        <!-- sub title -->
11
+        <view class="common-sub-title">营业时间:24小时</view>
12
+        <view class="common-sub-title">客服电话:0532-8886666</view>
13
+      </view>
14
+      <view class="common-card">
15
+        <view class="common-card-title u-margin-bottom-20">基本介绍</view>
16
+        <view class="common-card-content">
17
+          “司机之家”是指主要为道路运输车辆及驾驶人员提供公共服务的场所和建筑设施,一般具有餐饮、休息、停车安保、宣传教育等服务功能。按照建设要求,“司机之家”应在高速公路服务区、普通国省干线公路服务区(站)、物流通道货物集散地或者物流园区等地建设,截至2025年4月全国30个省(自治区、直辖市)已建成1900余个“司机之家”线下服务点。
18
+        </view>
19
+        <view class="common-card-title u-margin-top-45">设施配置</view>
20
+        <view class="u-flex u-col-center u-margin-top-24">
21
+          <HyTag text="淋浴(有热水)" imgUrl="/icon_ly.png" />
22
+          <HyTag text="洗衣机" imgUrl="/icon_xyj.png" />
23
+        </view>
24
+      </view>
25
+    </view>
26
+  </view>
27
+</template>
28
+
29
+<script setup lang="ts">
30
+import { ref } from 'vue'
31
+import { useGlobal } from '../../composables/index'
32
+const { minioUrl } = useGlobal()
33
+</script>
34
+
35
+<style lang="scss" scoepd>
36
+@import '../base.scss';
37
+</style>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 25 - 0
src/base/common/join.vue


+ 49 - 0
src/base/common/nursingRoom.vue

@@ -0,0 +1,49 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image :src="minioUrl + '/img_muying_bg.png'" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">海清服务区母婴室</view>
10
+        <!-- sub title -->
11
+        <view class="common-sub-title">营业时间:24小时</view>
12
+        <view class="common-sub-title">客服电话:0532-8886666</view>
13
+      </view>
14
+      <view class="common-card">
15
+        <view class="common-card-title u-margin-bottom-20">基本介绍</view>
16
+        <view class="common-card-content">
17
+          母婴室,也称作母乳喂养室,通常建设于大型公共场所,如:商业综合体、交通枢纽、医疗机构、游乐场馆、文体教育场所等。以便于携婴父母出门在外照料哺乳期婴儿进行护理、哺乳、集乳、喂食、备餐的功能。建设主体包括商业场所及政府非营利性公共服务设施。
18
+        </view>
19
+        <view class="common-card-title u-margin-top-45">设施配置</view>
20
+        <view class="bottom-box-wrap">
21
+          <HyTag text="哺乳椅" imgUrl="/icon_muying_01.png" />
22
+          <HyTag text="饮水机(有热水)" imgUrl="/icon_muying_02.png" />
23
+          <HyTag text="尿布台" imgUrl="/icon_muying_03.png" />
24
+          <HyTag text="婴儿床" imgUrl="/icon_muying_04.png" />
25
+        </view>
26
+      </view>
27
+    </view>
28
+  </view>
29
+</template>
30
+
31
+<script setup lang="ts">
32
+import { ref } from 'vue'
33
+import { useGlobal } from '../../composables/index'
34
+const { minioUrl } = useGlobal()
35
+</script>
36
+
37
+<style lang="scss" scoepd>
38
+@import '../base.scss';
39
+.bottom-box-wrap {
40
+  display: flex;
41
+  flex-wrap: wrap;
42
+  align-items: center;
43
+  justify-content: space-between;
44
+  margin-top: 24rpx;
45
+  :deep(.tag-item-wrapper) {
46
+    margin-right: 30rpx;
47
+  }
48
+}
49
+</style>

+ 37 - 0
src/base/common/refuel.vue

@@ -0,0 +1,37 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image :src="minioUrl + '/img_jiayou_bg.png'" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">中石化海清高速服务区加油站</view>
10
+        <!-- sub title -->
11
+        <view class="common-sub-title">营业时间:24小时</view>
12
+        <view class="common-sub-title">客服电话:0532-8886666</view>
13
+      </view>
14
+      <view class="common-card">
15
+        <view class="common-card-title u-margin-bottom-20">当前油价</view>
16
+        <HyStation type="2" v-for="index in 4" :key="index"></HyStation>
17
+        <view class="common-card-title u-margin-top-45">温馨提示</view>
18
+        <view class="common-card-content">
19
+          <text>1、进出加油站时,请严格遵守交通规则和指示标识,注意观察礼让其他车辆。</text>
20
+          <text>2、加油前请熄火,不要拨打电话。</text>
21
+          <text>3、加油站区域内请勿吸烟、使用明火(如打火机)。</text>
22
+          <text>4、如需开具发票,请联系站内工作人员。</text>
23
+        </view>
24
+      </view>
25
+    </view>
26
+  </view>
27
+</template>
28
+
29
+<script setup lang="ts">
30
+import { ref } from 'vue'
31
+import { useGlobal } from '../../composables/index'
32
+const { minioUrl } = useGlobal()
33
+</script>
34
+
35
+<style lang="scss" scoepd>
36
+@import '../base.scss';
37
+</style>

+ 34 - 0
src/base/common/repair.vue

@@ -0,0 +1,34 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image :src="minioUrl + '/img_xiuche_bg.png'" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">驿驰汽修</view>
10
+        <!-- sub title -->
11
+        <view class="common-sub-title">营业时间:24小时</view>
12
+        <view class="common-sub-title">客服电话:0532-8886666</view>
13
+      </view>
14
+      <view class="common-card">
15
+        <view class="common-card-title u-margin-bottom-20">免费项目</view>
16
+        <view class="common-card-content">
17
+          <text>大货车免费汽修项目:启动搭电、胎压检测</text>
18
+          <text>小客车免费汽修项目:启动搭电、胎压检测、轮胎充气</text>
19
+        </view>
20
+        <view class="common-card-title u-margin-top-45">收费项目</view>
21
+      </view>
22
+    </view>
23
+  </view>
24
+</template>
25
+
26
+<script setup lang="ts">
27
+import { ref } from 'vue'
28
+import { useGlobal } from '../../composables/index'
29
+const { minioUrl } = useGlobal()
30
+</script>
31
+
32
+<style lang="scss" scoepd>
33
+@import '../base.scss';
34
+</style>

+ 45 - 0
src/base/common/spot.vue

@@ -0,0 +1,45 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image src="" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">
10
+          <view class="text">少海风景区</view>
11
+          <view class="card-tag">4A景区</view>
12
+        </view>
13
+        <!-- sub title -->
14
+        <view class="common-sub-title">开放时间:24小时</view>
15
+        <view class="common-sub-title">
16
+          <view class="text">地址:山东省青岛市胶州市香港路1号</view>
17
+          <view class="sub-img-wrap">
18
+            <image :src="minioUrl + '/icon_go.png'" mode="scaleToFill" />
19
+          </view>
20
+        </view>
21
+      </view>
22
+      <view class="common-card">
23
+        <view class="common-card-title">景区介绍</view>
24
+        <view class="common-card-content"
25
+          >少海风景区位于胶州市区东南侧,地处胶州湾与大沽河交汇处,规划面积22.91平方公里
26
+          。景区由南湖、北湖及云溪河构成水域体系,湿地覆盖率83.9%,拥有166种野生脊椎动物和93种维管束植物
27
+          ,形成"两湖、一带、三岛"的生态格局。作为山东省首家国家级湿地公园(2012年挂牌),景区融合16公里环湖景观带与仿古建筑群,复建板桥镇、慈云寺等文化地标
28
+          。设有游艇俱乐部、观景台等设施,2019年获评国家4A级旅游景区。</view
29
+        >
30
+        <view class="common-card-title u-margin-top-45">门票政策</view>
31
+        <view class="common-card-content">免费开放</view>
32
+      </view>
33
+    </view>
34
+  </view>
35
+</template>
36
+
37
+<script setup lang="ts">
38
+import { ref } from 'vue'
39
+import { useGlobal } from '../../composables/index'
40
+const { minioUrl } = useGlobal()
41
+</script>
42
+
43
+<style lang="scss" scoepd>
44
+@import '../base.scss';
45
+</style>

+ 42 - 0
src/base/shop/details.vue

@@ -0,0 +1,42 @@
1
+<template>
2
+  <view class="common-details-container">
3
+    <view class="common-header-wrapper">
4
+      <image src="" mode="scaleToFill" />
5
+    </view>
6
+    <view class="common-content-wrapper">
7
+      <view class="common-card">
8
+        <!-- common title -->
9
+        <view class="common-card-title">肯德基海清高速服务区店</view>
10
+        <!-- rate -->
11
+        <view class="common-card-rate">
12
+          <uni-rate allow-half :value="5" color="#ddd" activeColor="#ff5702" />
13
+        </view>
14
+        <!-- sub title -->
15
+        <view class="common-sub-title">营业时间: 08:00-24:00</view>
16
+      </view>
17
+      <view class="common-card">
18
+        <view class="common-card-title">店铺简介</view>
19
+        <view class="common-card-content"
20
+          >肯德基(Kentucky Fried Chicken),简称KFC,
21
+          全球炸鸡连锁餐厅,总部位于美国肯塔基州路易斯维尔市,在世界上105个国家和地区开设有15000多家肯德基餐厅,
22
+          隶属于全球最大的餐饮连锁企业百胜餐饮集团。 产品以鸡肉为主,并不断推出新产品。</view
23
+        >
24
+        <view class="common-card-title u-margin-top-12">精品推荐</view>
25
+        <view class="common-card-list">
26
+          <view class="card-list-item" v-for="index in 6" :key="index">
27
+            <view class="item-img-wrap">
28
+              <image src="" mode="scaleToFill" />
29
+            </view>
30
+            <view class="list-text">蜜汁全鸡</view>
31
+          </view>
32
+        </view>
33
+      </view>
34
+    </view>
35
+  </view>
36
+</template>
37
+
38
+<script lang="ts" setup></script>
39
+
40
+<style lang="scss" scoepd>
41
+@import '../base.scss';
42
+</style>

+ 14 - 0
src/base/shop/index.vue

@@ -0,0 +1,14 @@
1
+<template>
2
+  <view class="shop-index-container">
3
+    <HyShopItem v-for="index in 5" :key="index" />
4
+  </view>
5
+</template>
6
+
7
+<script lang="ts" setup></script>
8
+
9
+<style lang="scss" scoepd>
10
+.shop-index-container {
11
+  box-sizing: border-box;
12
+  padding: 32rpx 28rpx;
13
+}
14
+</style>

+ 14 - 0
src/base/shop/meal.vue

@@ -0,0 +1,14 @@
1
+<template>
2
+  <view class="shop-index-container">
3
+    <HyShopItem v-for="index in 5" :key="index" price />
4
+  </view>
5
+</template>
6
+
7
+<script lang="ts" setup></script>
8
+
9
+<style lang="scss" scoepd>
10
+.shop-index-container {
11
+  box-sizing: border-box;
12
+  padding: 32rpx 28rpx;
13
+}
14
+</style>

+ 94 - 2
src/base/suggest/record.vue

@@ -1,7 +1,99 @@
1 1
 <template>
2
-  <view></view>
2
+  <view class="suggest-record-container">
3
+    <view class="record-item">
4
+      <view class="record-item-header">
5
+        <view class="title u-line-2">功能还有不少需要提升的,需要改进的地方不少希望尽快处理提升完善</view>
6
+        <view class="pic-list">
7
+          <view class="pic-wrap">
8
+            <image src="" mode="scaleToFill" />
9
+          </view>
10
+          <view class="pic-wrap">
11
+            <image src="" mode="scaleToFill" />
12
+          </view>
13
+        </view>
14
+        <view class="time-status-wrap">
15
+          <view class="time-text">2025-10-12 12:36:50</view>
16
+          <view class="status-text">已完结</view>
17
+        </view>
18
+      </view>
19
+      <view class="record-item-bottom">
20
+        <view class="bottom-title-text">感谢您对我们的反馈,我们会持续优化, 继续完善!</view>
21
+        <view class="bottom-time-text">2025-10-12 12:36:50</view>
22
+      </view>
23
+    </view>
24
+  </view>
3 25
 </template>
4 26
 
5 27
 <script lang="ts" setup></script>
6 28
 
7
-<style lang="scss" scoped></style>
29
+<style lang="scss" scoped>
30
+.suggest-record-container {
31
+  box-sizing: border-box;
32
+  width: 100%;
33
+  padding: 34rpx 28rpx;
34
+  .record-item {
35
+    box-sizing: border-box;
36
+    padding: 34rpx 34rpx 38rpx 34rpx;
37
+    background-color: #fff;
38
+    border-radius: 14rpx;
39
+    .record-item-header {
40
+      box-sizing: border-box;
41
+      padding-bottom: 24rpx;
42
+      border-bottom: 1rpx solid #f4f5f9;
43
+      .title {
44
+        font-size: 28rpx;
45
+        color: #333;
46
+        font-weight: 600;
47
+      }
48
+      .pic-list {
49
+        display: flex;
50
+        align-items: center;
51
+        margin-top: 20rpx;
52
+        .pic-wrap {
53
+          width: 139rpx;
54
+          height: 139rpx;
55
+          border-radius: 8rpx;
56
+          background-color: #f4f5f9;
57
+          margin-right: 24rpx;
58
+          image {
59
+            width: 139rpx;
60
+            height: 139rpx;
61
+            border-radius: 8rpx;
62
+          }
63
+        }
64
+      }
65
+      .time-status-wrap {
66
+        display: flex;
67
+        align-items: center;
68
+        justify-content: space-between;
69
+        margin-top: 22rpx;
70
+        .time-text {
71
+          font-size: 25rpx;
72
+          color: #999;
73
+        }
74
+        .status-text {
75
+          font-size: 25rpx;
76
+          color: #999;
77
+          &.warning {
78
+            color: #ff7024;
79
+          }
80
+        }
81
+      }
82
+    }
83
+    .record-item-bottom {
84
+      box-sizing: border-box;
85
+      padding-top: 26rpx;
86
+      .bottom-title-text {
87
+        font-size: 28rpx;
88
+        font-weight: 500;
89
+        line-height: 42rpx;
90
+        margin-bottom: 20rpx;
91
+      }
92
+      .bottom-time-text {
93
+        font-size: 25rpx;
94
+        color: #999;
95
+      }
96
+    }
97
+  }
98
+}
99
+</style>

+ 86 - 2
src/base/suggest/suggest.vue

@@ -1,7 +1,91 @@
1 1
 <template>
2
-  <view></view>
2
+  <view class="suggest-submit-container">
3
+    <!-- 问题类型 -->
4
+    <HyCard title="请选择您要反馈的问题类型">
5
+      <view class="suggest-type-wrapper">
6
+        <view class="type-item active">现场环境</view>
7
+        <view class="type-item">商家服务</view>
8
+        <view class="type-item">商品问题</view>
9
+        <view class="type-item">价格问题</view>
10
+        <view class="type-item">其他</view>
11
+      </view>
12
+    </HyCard>
13
+    <!-- 描述问题 -->
14
+    <HyCard title="请描述您的问题">
15
+      <view class="suggest-common-wrapper">
16
+        <u-input
17
+          type="textarea"
18
+          :height="328"
19
+          :maxlength="200"
20
+          border
21
+          placeholder="请详细描述您的问题,以便于我们及时跟进及解决(最多可输入200字)"
22
+        ></u-input>
23
+      </view>
24
+    </HyCard>
25
+    <!-- 图片描述 -->
26
+    <HyCard title="图片描述(选填)">
27
+      <view class="suggest-common-wrapper">
28
+        <u-upload />
29
+      </view>
30
+    </HyCard>
31
+    <!-- 联系方式 -->
32
+    <HyCard title="联系方式">
33
+      <view class="suggest-common-wrapper">
34
+        <u-input placeholder="请输入您的联系方式" />
35
+      </view>
36
+    </HyCard>
37
+    <!-- 提交 -->
38
+    <view class="submit-btn-wrapper">提交</view>
39
+  </view>
3 40
 </template>
4 41
 
5 42
 <script lang="ts" setup></script>
6 43
 
7
-<style lang="scss" scoped></style>
44
+<style lang="scss" scoped>
45
+.suggest-submit-container {
46
+  box-sizing: border-box;
47
+  padding: 34rpx 28rpx 172rpx 28rpx;
48
+  .suggest-type-wrapper {
49
+    margin-top: 26rpx;
50
+    display: flex;
51
+    flex-wrap: wrap;
52
+    .type-item {
53
+      width: 201rpx;
54
+      height: 63rpx;
55
+      display: flex;
56
+      align-items: center;
57
+      justify-content: center;
58
+      background-color: #f6f7fb;
59
+      font-size: 28rpx;
60
+      color: #a2a8be;
61
+      border-radius: 14rpx;
62
+      margin-right: 16rpx;
63
+      margin-bottom: 15rpx;
64
+      &:nth-child(3n) {
65
+        margin-right: 0;
66
+      }
67
+      &.active {
68
+        background-color: #2375ff;
69
+        color: #fff;
70
+      }
71
+    }
72
+  }
73
+  .suggest-common-wrapper {
74
+    margin-top: 26rpx;
75
+  }
76
+  .submit-btn-wrapper {
77
+    width: 694rpx;
78
+    height: 83rpx;
79
+    display: flex;
80
+    align-items: center;
81
+    justify-content: center;
82
+    background-color: #2374ff;
83
+    font-size: 31rpx;
84
+    color: #fff;
85
+    border-radius: 42rpx;
86
+    position: fixed;
87
+    bottom: 31rpx;
88
+    left: 28rpx;
89
+  }
90
+}
91
+</style>

+ 68 - 0
src/base/travel/tips.vue

@@ -0,0 +1,68 @@
1
+<template>
2
+  <view class="travel-tips-container">
3
+    <!-- tabs -->
4
+    <u-tabs
5
+      v-model="tabActive"
6
+      :list="list"
7
+      :is-scroll="false"
8
+      inactive-color="#333"
9
+      active-color="#333"
10
+      :bar-style="{
11
+        backgroundColor: '#4a8cfe'
12
+      }"
13
+    ></u-tabs>
14
+    <!-- list -->
15
+    <view class="travel-tips-list">
16
+      <view class="tips-list-item">
17
+        <view class="title u-line-2">沈海高速海口方向K31+900M~K29+000M处养护施工的公告</view>
18
+        <view class="content"
19
+          >沈海高速山东段青岛往海口方向K31+900M~K29+000M处正在养护施工,占用主车道及应急车道,该路段目前超车道单道通行,请途经车辆谨慎驾驶,提前减速。</view
20
+        >
21
+        <view class="time">2025-10-12 12:36:50</view>
22
+      </view>
23
+    </view>
24
+  </view>
25
+</template>
26
+
27
+<script lang="ts" setup>
28
+import { ref } from 'vue'
29
+
30
+const list = ref([{ name: '路况信息' }, { name: '优惠促销' }, { name: '天气预警' }])
31
+const tabActive = ref(0)
32
+</script>
33
+
34
+<style lang="scss" scoped>
35
+.travel-tips-container {
36
+  box-sizing: border-box;
37
+  .travel-tips-list {
38
+    width: 694rpx;
39
+    margin: 0 auto;
40
+    box-sizing: border-box;
41
+    padding-top: 35rpx;
42
+    .tips-list-item {
43
+      width: 100%;
44
+      border-radius: 14rpx;
45
+      box-sizing: border-box;
46
+      padding: 33rpx;
47
+      background-color: #fff;
48
+      .title {
49
+        font-size: 28rpx;
50
+        color: #333;
51
+        line-height: 42rpx;
52
+        font-weight: 500;
53
+        margin-bottom: 24rpx;
54
+      }
55
+      .content {
56
+        font-size: 22rpx;
57
+        color: #333;
58
+        line-height: 33rpx;
59
+        margin-bottom: 22rpx;
60
+      }
61
+      .time {
62
+        font-size: 22rpx;
63
+        color: #999;
64
+      }
65
+    }
66
+  }
67
+}
68
+</style>

+ 7 - 1
src/components/HyCard.vue

@@ -6,7 +6,7 @@
6 6
   >
7 7
     <view class="main-title-box" v-if="title">
8 8
       <view class="text">{{ title }}</view>
9
-      <view v-if="isShowRight" class="right-text-wrap">
9
+      <view v-if="isShowRight" class="right-text-wrap" @click="handleClickRight">
10 10
         <text>{{ rightText }}</text>
11 11
         <u-icon name="arrow-right-double" size="21" color="#292e36"></u-icon>
12 12
       </view>
@@ -44,6 +44,12 @@ const props = defineProps({
44 44
     default: ''
45 45
   }
46 46
 })
47
+
48
+const emit = defineEmits(['clickRight'])
49
+
50
+const handleClickRight = () => {
51
+  emit('clickRight')
52
+}
47 53
 </script>
48 54
 
49 55
 <style lang="scss" scoped>

+ 1 - 1
src/components/HyPopup.vue

@@ -89,7 +89,7 @@ const props = withDefaults(defineProps<Props>(), {
89 89
   animationType: 'scale',
90 90
   position: 'center',
91 91
   width: '80%',
92
-  maxWidth: '600rpx',
92
+  maxWidth: '750rpx',
93 93
   backgroundColor: 'transparent',
94 94
   overlayBackgroundColor: 'rgba(0, 0, 0, 0.8)',
95 95
   borderRadius: 24,

+ 184 - 0
src/components/HySelect.vue

@@ -0,0 +1,184 @@
1
+<template>
2
+  <view class="select-container">
3
+    <!-- 下拉选择触发区域 -->
4
+    <view class="custom-select" @tap="toggleDropdown">
5
+      <text class="select-text">{{ selectedOptionText || placeholder }}</text>
6
+      <image class="select-icon" :class="{ rotate: dropdownVisible }" :src="minioUrl + '/icon_bottom_arrow.png'" mode="scaleToFill" />
7
+    </view>
8
+
9
+    <!-- 下拉菜单 -->
10
+    <view class="dropdown-menu" v-if="dropdownVisible" @tap.stop>
11
+      <view class="dropdown-item" v-for="item in parkList" :key="item.id" :class="{ selected: selectedValue === item.id }" @tap="selectItem(item)">
12
+        <text>{{ item.name }}</text>
13
+        <u-icon v-if="selectedValue === item.id" name="checkmark" color="#2979ff" size="32"></u-icon>
14
+      </view>
15
+    </view>
16
+
17
+    <!-- 点击外部区域关闭下拉菜单的遮罩 - 移动端使用tap事件 -->
18
+    <view class="dropdown-overlay" v-if="dropdownVisible" @tap="closeDropdown"></view>
19
+  </view>
20
+</template>
21
+
22
+<script setup lang="ts">
23
+import { ref, computed, watch } from 'vue'
24
+import { useGlobal } from '@/composables/index'
25
+const { minioUrl } = useGlobal()
26
+
27
+// 定义组件接收的props
28
+const props = defineProps({
29
+  // 当前选中的值
30
+  modelValue: {
31
+    type: String,
32
+    default: ''
33
+  },
34
+  // 占位符文本
35
+  placeholder: {
36
+    type: String,
37
+    default: '请选择'
38
+  }
39
+})
40
+
41
+// 定义组件触发的事件
42
+const emit = defineEmits(['update:modelValue', 'change'])
43
+
44
+// 内部状态
45
+const dropdownVisible = ref(false)
46
+const selectedValue = ref(props.modelValue)
47
+
48
+const parkList = ref([
49
+  { id: '1', name: '海青服务区' },
50
+  { id: '2', name: '黄岛服务区' },
51
+  { id: '3', name: '南村服务区' },
52
+  { id: '4', name: '胶州服务区' }
53
+])
54
+
55
+// 计算当前选中的选项文本
56
+const selectedOptionText = computed(() => {
57
+  const selected = parkList.value.find((item) => item.id === selectedValue.value)
58
+  return selected ? selected.name : ''
59
+})
60
+
61
+// 监听modelValue变化,同步内部状态
62
+watch(
63
+  () => props.modelValue,
64
+  (newValue) => {
65
+    selectedValue.value = newValue
66
+  }
67
+)
68
+
69
+// 切换下拉菜单显示/隐藏
70
+const toggleDropdown = () => {
71
+  dropdownVisible.value = !dropdownVisible.value
72
+}
73
+
74
+// 关闭下拉菜单
75
+const closeDropdown = () => {
76
+  dropdownVisible.value = false
77
+}
78
+
79
+// 选择选项
80
+const selectItem = (item: { id: string; name: string }) => {
81
+  selectedValue.value = item.id
82
+  dropdownVisible.value = false
83
+
84
+  // 触发事件通知父组件
85
+  emit('update:modelValue', item.id)
86
+  emit('change', item)
87
+}
88
+</script>
89
+
90
+<style lang="scss" scoped>
91
+.select-container {
92
+  position: relative;
93
+  z-index: 100;
94
+  .custom-select {
95
+    width: 100%;
96
+    height: 60rpx;
97
+    display: flex;
98
+    align-items: center;
99
+    justify-content: space-between;
100
+    // padding: 0 20rpx;
101
+    cursor: pointer;
102
+    transition: background-color 0.2s;
103
+
104
+    .select-text {
105
+      font-size: 30rpx;
106
+      color: #3b3c3b;
107
+      font-weight: 600;
108
+      overflow: hidden;
109
+      text-overflow: ellipsis;
110
+      white-space: nowrap;
111
+      flex: 1;
112
+    }
113
+
114
+    .select-icon {
115
+      width: 13rpx;
116
+      height: 10rpx;
117
+      margin-left: 10rpx;
118
+      transition: transform 0.2s;
119
+    }
120
+
121
+    .select-icon.rotate {
122
+      transform: rotate(180deg);
123
+    }
124
+  }
125
+
126
+  .dropdown-menu {
127
+    position: absolute;
128
+    top: 70rpx;
129
+    width: 384rpx;
130
+    max-height: 400rpx;
131
+    background-color: #fff;
132
+    border-radius: 12rpx;
133
+    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.1);
134
+    overflow-y: auto;
135
+    z-index: 200;
136
+    box-sizing: border-box;
137
+    padding: 15rpx;
138
+
139
+    .dropdown-item {
140
+      height: 80rpx;
141
+      padding: 0 24rpx;
142
+      display: flex;
143
+      align-items: center;
144
+      justify-content: space-between;
145
+      cursor: pointer;
146
+      transition: background-color 0.2s;
147
+
148
+      &:last-child {
149
+        border-bottom: none;
150
+      }
151
+
152
+      &.selected {
153
+        background-color: #f0f7ff;
154
+        color: #007aff;
155
+        border-radius: 8rpx;
156
+        text {
157
+          color: #007aff;
158
+          font-weight: 500;
159
+        }
160
+      }
161
+
162
+      text {
163
+        font-size: 26rpx;
164
+        color: #1d2129;
165
+      }
166
+
167
+      .check-icon {
168
+        width: 32rpx;
169
+        height: 32rpx;
170
+      }
171
+    }
172
+  }
173
+}
174
+/* 点击外部区域关闭下拉菜单的遮罩 */
175
+.dropdown-overlay {
176
+  position: fixed;
177
+  top: 0;
178
+  left: 0;
179
+  right: 0;
180
+  bottom: 0;
181
+  z-index: 99;
182
+  background-color: transparent;
183
+}
184
+</style>

+ 22 - 2
src/components/HyShopItem.vue

@@ -1,13 +1,14 @@
1 1
 <template>
2
-  <view class="shop-item-wrapper">
2
+  <view class="shop-item-wrapper" @click="navigateToDetails">
3 3
     <view class="item-left-wrap"></view>
4 4
     <view class="item-right-wrap">
5 5
       <view class="top">
6 6
         <view class="title u-line-1">肯德基</view>
7 7
         <view class="rate-box">
8
-          <uni-rate allow-half v-model="rate" color="#ddd" activeColor="#ff5702" />
8
+          <uni-rate allow-half v-model="rate" color="#ddd" activeColor="#ff5702" size="20" />
9 9
           <text class="rate-text">{{ rate }}</text>
10 10
         </view>
11
+        <view class="price" v-if="price">¥50/人</view>
11 12
       </view>
12 13
       <view class="bottom">
13 14
         <view class="tag-item">西式快餐</view>
@@ -21,6 +22,19 @@
21 22
 import { ref } from 'vue'
22 23
 
23 24
 const rate = ref(3.5)
25
+
26
+defineProps({
27
+  price: {
28
+    type: Boolean,
29
+    default: false
30
+  }
31
+})
32
+
33
+const navigateToDetails = () => {
34
+  uni.navigateTo({
35
+    url: '/base/shop/details'
36
+  })
37
+}
24 38
 </script>
25 39
 
26 40
 <style lang="scss" scoped>
@@ -31,6 +45,7 @@ const rate = ref(3.5)
31 45
   background-color: #fff;
32 46
   border-radius: 14rpx;
33 47
   display: flex;
48
+  margin-bottom: 32rpx;
34 49
   .item-left-wrap {
35 50
     width: 188rpx;
36 51
     height: 188rpx;
@@ -62,6 +77,11 @@ const rate = ref(3.5)
62 77
           margin-left: 14rpx;
63 78
         }
64 79
       }
80
+      .price {
81
+        font-size: 25rpx;
82
+        color: #ff5704;
83
+        margin-top: 4rpx;
84
+      }
65 85
     }
66 86
     .bottom {
67 87
       display: flex;

+ 6 - 2
src/components/HyTag.vue

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <view class="tag-item-wrapper">
3 3
     <view class="tag-item-content" :class="{ 'need-border': needBorder }">
4
-      <image :src="minioUrl + '/icon_iot_canyin.png'" :style="{ width: imgWidth, height: imgHeight }" />
4
+      <image :src="minioUrl + imgUrl" :style="{ width: imgWidth, height: imgHeight }" />
5 5
       <view class="tag-item-text" :style="{ fontSize: fontSize }">{{ text }}</view>
6 6
     </view>
7 7
   </view>
@@ -21,6 +21,10 @@ defineProps({
21 21
     type: String,
22 22
     default: '25rpx'
23 23
   },
24
+  imgUrl: {
25
+    type: String,
26
+    default: '/icon_iot_canyin.png'
27
+  },
24 28
   text: {
25 29
     type: String,
26 30
     default: '餐饮'
@@ -41,12 +45,12 @@ defineProps({
41 45
   box-sizing: border-box;
42 46
   margin: 0 10rpx 20rpx 0;
43 47
   .tag-item-content {
44
-    padding: 4rpx 22rpx;
45 48
     border-radius: 4rpx;
46 49
     display: flex;
47 50
     align-items: center;
48 51
     width: fit-content;
49 52
     &.need-border {
53
+      padding: 4rpx 22rpx;
50 54
       border: 1rpx solid#2374ff;
51 55
       background-color: #e6efff;
52 56
     }

+ 20 - 5
src/manifest.json

@@ -52,18 +52,33 @@
52 52
     },
53 53
     /* 快应用特有相关 */
54 54
     "quickapp" : {},
55
-    "h5": {
56
-      "router": {
57
-        "base": "./"
58
-      }
55
+    "h5" : {
56
+        "router" : {
57
+            "base" : "./"
58
+        },
59
+        "sdkConfigs" : {
60
+            "maps" : {
61
+                "amap" : {
62
+                    "key" : "b0adb9cb4cae0dd05fae8d444c251492",
63
+                    "securityJsCode" : "337c8dbd6c3e800641d22c85ddb78b9e",
64
+                    "serviceHost" : ""
65
+                }
66
+            }
67
+        }
59 68
     },
60 69
     /* 小程序特有相关 */
61 70
     "mp-weixin" : {
62
-        "appid" : "wxa04f62d4bb823b36",
71
+        "appid" : "",
63 72
         "setting" : {
64 73
             "urlCheck" : false,
65 74
             "minified" : true
66 75
         },
76
+        "permission" : {
77
+            "scope.userLocation" : {
78
+                "desc" : "定位信息"
79
+            }
80
+        },
81
+        "requiredPrivateInfos" : [ "getLocation", "chooseLocation", "openLocation" ],
67 82
         "usingComponents" : true
68 83
     },
69 84
     "mp-alipay" : {

+ 79 - 3
src/pages.json

@@ -12,8 +12,7 @@
12 12
       "path": "pages/service",
13 13
       "style": {
14 14
         "navigationBarTitleText": "服务区",
15
-        "enablePullDownRefresh": true,
16
-        "navigationStyle": "custom"
15
+        "enablePullDownRefresh": false
17 16
       }
18 17
     },
19 18
     {
@@ -39,7 +38,7 @@
39 38
         {
40 39
           "path": "suggest/record",
41 40
           "style": {
42
-            "navigationBarTitleText": "反馈记录",
41
+            "navigationBarTitleText": "反馈历史",
43 42
             "enablePullDownRefresh": true
44 43
           }
45 44
         },
@@ -49,6 +48,83 @@
49 48
             "navigationBarTitleText": "投诉建议",
50 49
             "enablePullDownRefresh": false
51 50
           }
51
+        },
52
+        {
53
+          "path": "travel/tips",
54
+          "style": {
55
+            "navigationBarTitleText": "出行提示",
56
+            "enablePullDownRefresh": false
57
+          }
58
+        },
59
+        {
60
+          "path": "shop/index",
61
+          "style": {
62
+            "navigationBarTitleText": "精选商家",
63
+            "enablePullDownRefresh": false
64
+          }
65
+        },
66
+        {
67
+          "path": "shop/meal",
68
+          "style": {
69
+            "navigationBarTitleText": "我要吃饭",
70
+            "enablePullDownRefresh": false
71
+          }
72
+        },
73
+        {
74
+          "path": "shop/details",
75
+          "style": {
76
+            "navigationBarTitleText": "详情",
77
+            "enablePullDownRefresh": false
78
+          }
79
+        },
80
+        {
81
+          "path": "common/spot",
82
+          "style": {
83
+            "navigationBarTitleText": "景点",
84
+            "enablePullDownRefresh": false
85
+          }
86
+        },
87
+        {
88
+          "path": "common/join",
89
+          "style": {
90
+            "navigationBarTitleText": "招商加盟",
91
+            "enablePullDownRefresh": false
92
+          }
93
+        },
94
+        {
95
+          "path": "common/refuel",
96
+          "style": {
97
+            "navigationBarTitleText": "我要加油",
98
+            "enablePullDownRefresh": false
99
+          }
100
+        },
101
+        {
102
+          "path": "common/charge",
103
+          "style": {
104
+            "navigationBarTitleText": "我要充电",
105
+            "enablePullDownRefresh": false
106
+          }
107
+        },
108
+        {
109
+          "path": "common/repair",
110
+          "style": {
111
+            "navigationBarTitleText": "我要修车",
112
+            "enablePullDownRefresh": false
113
+          }
114
+        },
115
+        {
116
+          "path": "common/driversHome",
117
+          "style": {
118
+            "navigationBarTitleText": "司机之家",
119
+            "enablePullDownRefresh": false
120
+          }
121
+        },
122
+        {
123
+          "path": "common/nursingRoom",
124
+          "style": {
125
+            "navigationBarTitleText": "母婴室",
126
+            "enablePullDownRefresh": false
127
+          }
52 128
         }
53 129
       ]
54 130
     }

+ 200 - 20
src/pages/index.vue

@@ -12,24 +12,85 @@ const tabActive = ref(0)
12 12
 
13 13
 // 金刚区列表
14 14
 const navList = ref([
15
-  { image: `${minioUrl}/icon_nav_01.png`, text: '我要加油', path: '', w: '53rpx', h: '53rpx' },
16
-  { image: `${minioUrl}/icon_nav_02.png`, text: '我要充电', path: '', w: '60rpx', h: '53rpx' },
17
-  { image: `${minioUrl}/icon_nav_03.png`, text: '我要吃饭', path: '', w: '57rpx', h: '57rpx' },
18
-  { image: `${minioUrl}/icon_nav_04.png`, text: '我要修车', path: '', w: '60rpx', h: '56rpx' },
15
+  { image: `${minioUrl}/icon_nav_01.png`, text: '我要加油', path: '/base/common/refuel', w: '53rpx', h: '53rpx' },
16
+  { image: `${minioUrl}/icon_nav_02.png`, text: '我要充电', path: '/base/common/charge', w: '60rpx', h: '53rpx' },
17
+  { image: `${minioUrl}/icon_nav_03.png`, text: '我要吃饭', path: '/base/shop/meal', w: '57rpx', h: '57rpx' },
18
+  { image: `${minioUrl}/icon_nav_04.png`, text: '我要修车', path: '/base/common/repair', w: '60rpx', h: '56rpx' },
19 19
   { image: `${minioUrl}/icon_nav_05.png`, text: '投诉建议', path: '/base/suggest/index', w: '59rpx', h: '53rpx' },
20
-  { image: `${minioUrl}/icon_nav_06.png`, text: '一键救援', path: '', w: '76rpx', h: '76rpx' },
21
-  { image: `${minioUrl}/icon_nav_07.png`, text: '司机之家', path: '', w: '76rpx', h: '76rpx' },
22
-  { image: `${minioUrl}/icon_nav_08.png`, text: '母婴室', path: '', w: '76rpx', h: '76rpx' },
23
-  { image: `${minioUrl}/icon_nav_09.png`, text: '失物招领', path: '', w: '76rpx', h: '76rpx' },
24
-  { image: `${minioUrl}/icon_nav_10.png`, text: '招商加盟', path: '', w: '76rpx', h: '76rpx' }
20
+  { image: `${minioUrl}/icon_nav_06.png`, text: '一键救援', path: '', w: '76rpx', h: '76rpx', type: 'popup' },
21
+  { image: `${minioUrl}/icon_nav_07.png`, text: '司机之家', path: '/base/common/driversHome', w: '76rpx', h: '76rpx' },
22
+  { image: `${minioUrl}/icon_nav_08.png`, text: '母婴室', path: '/base/common/nursingRoom', w: '76rpx', h: '76rpx' },
23
+  { image: `${minioUrl}/icon_nav_09.png`, text: '失物招领', path: '', w: '76rpx', h: '76rpx', type: 'popup' },
24
+  { image: `${minioUrl}/icon_nav_10.png`, text: '招商加盟', path: '/base/common/join', w: '76rpx', h: '76rpx' }
25 25
 ])
26 26
 
27
+const selectedValue = ref('1')
28
+
29
+// 一键救援弹窗展示
30
+const isRescueShow = ref(false)
31
+// 失物招领弹窗展示
32
+const isLostFoundShow = ref(false)
33
+
27 34
 // 金刚区点击事件
28
-const navClick = (item: { path: string }) => {
35
+const navClick = (item: { path: string; type?: string; text?: string }) => {
36
+  if (item.type === 'popup') {
37
+    // 弹窗展示
38
+    if (item.text === '一键救援') {
39
+      isRescueShow.value = true
40
+    } else if (item.text === '失物招领') {
41
+      isLostFoundShow.value = true
42
+    }
43
+    return
44
+  }
29 45
   uni.navigateTo({
30 46
     url: item.path
31 47
   })
32 48
 }
49
+
50
+// 出行提示点击事件
51
+const navigateToTips = () => {
52
+  uni.navigateTo({
53
+    url: '/base/travel/tips'
54
+  })
55
+}
56
+
57
+// 精选商家点击事件
58
+const navigateToShop = () => {
59
+  uni.navigateTo({
60
+    url: '/base/shop/index'
61
+  })
62
+}
63
+
64
+// 景点点击事件
65
+const navigateToSpot = () => {
66
+  uni.navigateTo({
67
+    url: '/base/common/spot'
68
+  })
69
+}
70
+
71
+// 导航功能实现
72
+const goToNavigation = () => {
73
+  // 这里需要替换为实际的景点坐标
74
+  const latitude = 35.86166 // 示例纬度(琅琊台风景区)
75
+  const longitude = 119.97444 // 示例经度(琅琊台风景区)
76
+  const name = '琅琊台风景区'
77
+  // 使用uni-app的地图API打开系统地图进行导航
78
+  uni.openLocation({
79
+    latitude: latitude,
80
+    longitude: longitude,
81
+    name: name,
82
+    success: () => {
83
+      console.log('导航功能调用成功')
84
+    }
85
+  })
86
+}
87
+
88
+// 拨打电话
89
+const callPhone = (phone: string) => {
90
+  uni.makePhoneCall({
91
+    phoneNumber: phone
92
+  })
93
+}
33 94
 </script>
34 95
 
35 96
 <template>
@@ -41,12 +102,19 @@ const navClick = (item: { path: string }) => {
41 102
       <image :src="minioUrl + '/logo.png'" mode="scaleToFill" class="logo" />
42 103
       <view class="header-right-wrap">
43 104
         <view class="top-title-box">
44
-          <view class="title-text">海青服务区</view>
45
-          <image :src="minioUrl + '/icon_bottom_arrow.png'" mode="scaleToFill" />
105
+          <HySelect v-model="selectedValue" />
46 106
         </view>
47 107
         <image class="star-img" :src="minioUrl + '/star.png'" mode="scaleToFill" />
48 108
         <view class="bottom-box">
49 109
           <!-- 天气 -->
110
+          <iframe
111
+            scrolling="no"
112
+            src="https://widget.tianqiapi.com/?style=tv&skin=cucumber&color=333"
113
+            frameborder="0"
114
+            width="130"
115
+            height="25"
116
+            allowtransparency="true"
117
+          ></iframe>
50 118
           <!-- 营业状态 -->
51 119
           <view class="bottom-tag-item">正常营业</view>
52 120
         </view>
@@ -64,7 +132,7 @@ const navClick = (item: { path: string }) => {
64 132
       </view>
65 133
     </view>
66 134
     <!-- 出行提示 -->
67
-    <view class="index-tips-wrapper">
135
+    <view class="index-tips-wrapper" @click="navigateToTips">
68 136
       <image class="tips-img" :src="minioUrl + '/icon_chuxing.png'" mode="scaleToFill" />
69 137
       <view class="tips-line"></view>
70 138
       <view class="tips-content">临时交通管制的通知</view>
@@ -98,13 +166,13 @@ const navClick = (item: { path: string }) => {
98 166
       </template>
99 167
     </view>
100 168
     <!-- 服务设施 -->
101
-    <HyCard title="服务设施" marginBottom="24">
169
+    <HyCard title="服务设施" :marginBottom="24">
102 170
       <view class="index-service-wrapper">
103 171
         <HyService v-for="index in 6" :key="index"></HyService>
104 172
       </view>
105 173
     </HyCard>
106 174
     <!-- 人气优选商家 -->
107
-    <HyCard title="人气优选商家" rightText="更多商家" isShowRight marginBottom="24">
175
+    <HyCard title="人气优选商家" rightText="更多商家" isShowRight :marginBottom="24" @clickRight="navigateToShop">
108 176
       <view class="index-shop-wrapper">
109 177
         <view class="shop-item" v-for="index in 5" :key="index">
110 178
           <view class="img-wrap">
@@ -117,7 +185,7 @@ const navClick = (item: { path: string }) => {
117 185
     <!-- 附近景点 -->
118 186
     <HyCard title="附近景点" isBg :bgImg="minioUrl + '/index_spot_bg.png'">
119 187
       <view class="index-spot-wrapper">
120
-        <view class="spot-item" v-for="index in 5" :key="index">
188
+        <view class="spot-item" v-for="index in 5" :key="index" @click="navigateToSpot">
121 189
           <view class="spot-img-wrap">
122 190
             <image src="" mode="scaleToFill" />
123 191
           </view>
@@ -136,7 +204,7 @@ const navClick = (item: { path: string }) => {
136 204
                 <image class="icon-address" :src="minioUrl + '/icon_address.png'" mode="scaleToFill" />
137 205
                 <view class="address-text-wrap">距您<text>30.5</text>公里,驾车预计<text>40</text>分钟</view>
138 206
               </view>
139
-              <view class="right-go-icon">
207
+              <view class="right-go-icon" @click.stop="goToNavigation">
140 208
                 <image :src="minioUrl + '/icon_go.png'" mode="scaleToFill" />
141 209
               </view>
142 210
             </view>
@@ -144,10 +212,120 @@ const navClick = (item: { path: string }) => {
144 212
         </view>
145 213
       </view>
146 214
     </HyCard>
215
+    <!-- 一键救援 -->
216
+    <HyPopup v-model="isRescueShow" width="700rpx" showClose>
217
+      <view class="popup-content-wrapper">
218
+        <view class="popup-content-item" @click="callPhone('96659')">
219
+          <view class="p-item-left">
220
+            <view class="left-title">车辆救援</view>
221
+            <view class="left-sub-title">山东高速集团出行服务热线</view>
222
+          </view>
223
+          <view class="p-item-right">
224
+            <view class="mobile">96659</view>
225
+            <view class="icon-box">
226
+              <u-icon name="phone-fill" color="#fff" size="24"></u-icon>
227
+            </view>
228
+          </view>
229
+        </view>
230
+        <view class="popup-content-item" @click="callPhone('12122')">
231
+          <view class="p-item-left">
232
+            <view class="left-title">事故报警</view>
233
+            <view class="left-sub-title">山东高速交警报警热线</view>
234
+          </view>
235
+          <view class="p-item-right">
236
+            <view class="mobile">12122</view>
237
+            <view class="icon-box">
238
+              <u-icon name="phone-fill" color="#fff" size="24"></u-icon>
239
+            </view>
240
+          </view>
241
+        </view>
242
+      </view>
243
+    </HyPopup>
244
+    <!-- 失物招领 -->
245
+    <HyPopup v-model="isLostFoundShow" width="700rpx" showClose>
246
+      <view class="popup-content-wrapper">
247
+        <view class="popup-content-item column" @click="callPhone('0532-8889999')">
248
+          <view class="column-title">失物招领</view>
249
+          <view class="column-mobile">0532-8889999</view>
250
+          <view class="icon-box">
251
+            <u-icon name="phone-fill" color="#fff" size="24"></u-icon>
252
+          </view>
253
+        </view>
254
+      </view>
255
+    </HyPopup>
147 256
   </view>
148 257
 </template>
149 258
 
150 259
 <style lang="scss" scoped>
260
+.popup-content-wrapper {
261
+  height: 330rpx;
262
+  background-color: #fff;
263
+  border-radius: 14rpx;
264
+  .popup-content-item {
265
+    width: 100%;
266
+    display: flex;
267
+    align-items: center;
268
+    justify-content: space-between;
269
+    box-sizing: border-box;
270
+    padding: 48rpx 48rpx 24rpx 48rpx;
271
+    &.column {
272
+      flex-direction: column;
273
+      justify-content: center;
274
+      .column-title {
275
+        font-size: 28rpx;
276
+        color: #607f2f;
277
+      }
278
+      .column-mobile {
279
+        font-size: 42rpx;
280
+        color: #333;
281
+        font-weight: 600;
282
+        margin: 40rpx 0;
283
+      }
284
+      .icon-box {
285
+        width: 48rpx;
286
+        height: 48rpx;
287
+        background-color: #247d54;
288
+        display: flex;
289
+        align-items: center;
290
+        justify-content: center;
291
+        border-radius: 50%;
292
+        margin-left: 16rpx;
293
+      }
294
+    }
295
+    .p-item-left {
296
+      display: flex;
297
+      flex-direction: column;
298
+      .left-title {
299
+        font-size: 28rpx;
300
+        color: #607f2f;
301
+      }
302
+      .left-sub-title {
303
+        font-size: 24rpx;
304
+        color: #999;
305
+        margin-top: 8rpx;
306
+      }
307
+    }
308
+    .p-item-right {
309
+      display: flex;
310
+      align-items: center;
311
+      .mobile {
312
+        font-size: 42rpx;
313
+        color: #333;
314
+        font-weight: 600;
315
+      }
316
+      .icon-box {
317
+        width: 48rpx;
318
+        height: 48rpx;
319
+        background-color: #247d54;
320
+        display: flex;
321
+        align-items: center;
322
+        justify-content: center;
323
+        border-radius: 50%;
324
+        margin-left: 16rpx;
325
+      }
326
+    }
327
+  }
328
+}
151 329
 .index-container {
152 330
   width: 100%;
153 331
   min-height: 100dvh;
@@ -205,19 +383,21 @@ const navClick = (item: { path: string }) => {
205 383
         align-items: center;
206 384
         margin-top: 10rpx;
207 385
         .bottom-tag-item {
208
-          font-size: 18rpx;
386
+          font-size: 17rpx;
209 387
           color: #fff;
210 388
           box-sizing: border-box;
211
-          padding: 6rpx 12rpx;
389
+          padding: 0 12rpx;
212 390
           background-color: #3bb0b9;
213 391
           border-radius: 8rpx;
392
+          line-height: 40rpx;
393
+          margin-top: -15rpx;
214 394
         }
215 395
       }
216 396
     }
217 397
   }
218 398
   :deep(.u-swiper-wrap) {
219 399
     position: relative;
220
-    z-index: 2;
400
+    z-index: 1;
221 401
   }
222 402
   .index-nav-wrapper {
223 403
     display: flex;

+ 18 - 0
src/pages/service.vue

@@ -12,6 +12,7 @@ const { minioUrl } = useGlobal()
12 12
         <view class="item-header-wrap">
13 13
           <view class="header-img-box">
14 14
             <image src="" mode="scaleToFill" />
15
+            <view class="header-status-tag open-tag">开放中</view>
15 16
           </view>
16 17
           <view class="header-right-box">
17 18
             <view class="u-line-1 title">黄岛服务区(沈海高速沈阳方向)</view>
@@ -59,6 +60,23 @@ const { minioUrl } = useGlobal()
59 60
           width: 174rpx;
60 61
           height: 174rpx;
61 62
         }
63
+        .header-status-tag {
64
+          position: absolute;
65
+          top: 0;
66
+          right: 0;
67
+          width: 80rpx;
68
+          height: 30rpx;
69
+          background-color: #666666;
70
+          display: flex;
71
+          align-items: center;
72
+          justify-content: center;
73
+          border-radius: 0 14rpx 0 10rpx;
74
+          font-size: 21rpx;
75
+          color: #fff;
76
+          &.open-tag {
77
+            background-color: #ff5702;
78
+          }
79
+        }
62 80
       }
63 81
       .header-right-box {
64 82
         flex: 1;

BIN=BIN
src/static/images/bg_service_03.png


BIN=BIN
src/static/images/icon_service_01.png


BIN=BIN
src/static/images/icon_sm_jiayou.png


BIN=BIN
src/static/images/service_active.png


+ 6 - 7
vite.config.ts

@@ -1,10 +1,3 @@
1
-/*
2
- * @Author: wyd
3
- * @Date: 2024-02
4
- * @LastEditors: wyd
5
- * @LastEditTime: 2024-03
6
- * @Description:
7
- */
8 1
 import { defineConfig, loadEnv } from 'vite'
9 2
 import uni from '@dcloudio/vite-plugin-uni'
10 3
 // import { resolve } from 'path'
@@ -19,6 +12,9 @@ export default defineConfig(({ command, mode }) => {
19 12
       // envDir: resolve(__dirname, 'env'),
20 13
       define: {
21 14
         __VITE_BASE_URL__: JSON.stringify(env.VITE_BASE_URL)
15
+      },
16
+      server: {
17
+        port: 5174
22 18
       }
23 19
     }
24 20
   } else if (mode === 'production') {
@@ -46,6 +42,9 @@ export default defineConfig(({ command, mode }) => {
46 42
       // envDir: resolve(__dirname, 'env'),
47 43
       define: {
48 44
         __VITE_BASE_URL__: JSON.stringify(env.VITE_BASE_URL)
45
+      },
46
+      server: {
47
+        port: 5174
49 48
       }
50 49
     }
51 50
   }