zjk
2025-12-30 34a7bca6d3c97c79fc4eea311ff31fed6799e521
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/qingduTicketing
2个文件已删除
20个文件已添加
5个文件已修改
1337 ■■■■■ 已修改文件
miniprogram/components/banner.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages.json 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages/home/home.vue 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages/notice/detail.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages/notice/notice.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages/strategy/detail.vue 318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pages/strategy/strategy.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pagesA/bannerDetail/bannerDetail.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pagesA/bannerDetail/service.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/pagesA/mapAndGuide/mapAndGuide.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/Group@2x (3).png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/Group@2x (4).png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/Group@2x (6).png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/Group@2x (7).png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/Shape@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/backImg.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/home/titleBg.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/back.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/bofang.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/bofang2.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/read.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/search.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/time.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/zanting.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/zuida.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/image/public/zuixiaohua.png 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/static/style/_app.scss 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
miniprogram/components/banner.vue
@@ -2,12 +2,9 @@
    <view v-if="list.length != 0" class="br-19 oh relative box-s1">
        <u-swiper :list="list" :height="height" @change="change" mode="none" name="imageUrl" :interval="3000"
            bgColor="#fff" border-radius="0" @click="toDetail"></u-swiper>
        <view v-if="!isDetail" class="absolute flex dot">
            <view class="w-12 h-12 br-6 mr-4 border-box bgcolor1 dotItem" :class="active === index && 'w-40 bgColor2'"
        <view class="absolute flex dot">
            <view class="w-12 h-12 br-192 mr-8 border-box bgcolor1 dotItem" :class="active === index && 'w-35 bgColor2'"
                v-for="(item, index) in list.length" :key="index"></view>
        </view>
        <view v-else class="absolute fs-27 white detailDot">
            <span class="font-bold">{{active + 1}}</span>/{{list.length}}
        </view>
        <slot name="btn"></slot>
    </view>
@@ -24,12 +21,8 @@
            },
            height: {
                type: Number,
                default: 1545
                default: 387
            },
            isDetail: {
                type: Boolean,
                default: false
            }
        },
        data() {
            return {
@@ -60,7 +53,7 @@
    }
    .dot {
        bottom: 75rpx;
        bottom: 19rpx;
        right: 50%;
        transform: translateX(50%);
    }
@@ -71,17 +64,5 @@
    .box-s1 {
        box-shadow: 0rpx 4rpx 19rpx 0rpx rgba(0, 0, 0, 0.08);
    }
    .detailDot {
        right: 0;
        bottom: 94rpx;
        line-height: 46rpx;
        text-align: center;
        border-radius: 27rpx 0 0 27rpx;
        background-color: rgba(0, 0, 0, .4);
        padding-left: 31rpx;
        padding-right: 29rpx;
        letter-spacing: 8rpx;
    }
</style>
miniprogram/pages.json
@@ -1,101 +1,145 @@
{
    "easycom": {
        "autoscan": true,
        "custom": {
            "^u-(.*)": "@/uni_modules/uview-pro/components/u-$1/u-$1.vue"
        }
    },
    "pages": [{
            "path": "pages/start/start",
            "style": {
                "navigationStyle": "custom", // 取消本页面的导航栏
                "app-plus": {
                    "animationType": "fade-in", // 设置fade-in淡入动画,为最合理的动画类型
                    "background": "transparent", // 背景透明
                    "backgroundColor": "rgba(0,0,0,0)", // 背景透明
                    "popGesture": "none" // 关闭IOS屏幕左边滑动关闭当前页面的功能
                }
            }
        },
        {
            "path": "pages/login/login",
            "style": {
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/home/home",
            "style": {
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/mine/mine",
            "style": {
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/strategy/strategy",
            "style": {
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/good/good",
            "style": {
                "navigationBarTitleText": ""
            }
        },
        {
            "path": "pages/tourist/tourist",
            "style": {
                "navigationBarTitleText": "选择游客"
            }
        },
        {
            "path": "pages/tourist/editTourist",
            "style": {
                "navigationBarTitleText": "编辑游客"
            }
        }
    ],
    "tabBar": {
        "color": "#A5A3AF",
        "selectedColor": "#06C584",
        "borderStyle": "black",
        "backgroundColor": "#ffffff",
        "list": [{
                "pagePath": "pages/home/home",
                "iconPath": "static/image/tabBar/nohome.png",
                "selectedIconPath": "static/image/tabBar/home.png",
                "text": "首页"
            },
            {
                "pagePath": "pages/good/good",
                "iconPath": "static/image/tabBar/nogood.png",
                "selectedIconPath": "static/image/tabBar/good.png",
                "text": "文创商城"
            },
            {
                "pagePath": "pages/strategy/strategy",
                "iconPath": "static/image/tabBar/nostrategy.png",
                "selectedIconPath": "static/image/tabBar/strategy.png",
                "text": "攻略"
            },
            {
                "pagePath": "pages/mine/mine",
                "iconPath": "static/image/tabBar/nomine.png",
                "selectedIconPath": "static/image/tabBar/mine.png",
                "text": "我的"
            }
        ]
    },
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "青城后山",
        "navigationBarBackgroundColor": "#fff",
        "backgroundColor": "#fff"
    },
    "uniIdRouter": {}
}
  "easycom": {
    "autoscan": true,
    "custom": {
      "^u-(.*)": "@/uni_modules/uview-pro/components/u-$1/u-$1.vue"
    }
  },
  "pages": [
    {
      "path": "pages/start/start",
      "style": {
        "navigationStyle": "custom", // 取消本页面的导航栏
        "app-plus": {
          "animationType": "fade-in", // 设置fade-in淡入动画,为最合理的动画类型
          "background": "transparent", // 背景透明
          "backgroundColor": "rgba(0,0,0,0)", // 背景透明
          "popGesture": "none" // 关闭IOS屏幕左边滑动关闭当前页面的功能
        }
      }
    },
    {
      "path": "pages/login/login",
      "style": {
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/home/home",
      "style": {
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/mine/mine",
      "style": {
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/strategy/strategy",
      "style": {
        "navigationBarTitleText": "攻略",
        "navigationBarBackgroundColor": "#fff"
      }
    },
    {
      "path": "pages/good/good",
      "style": {
        "navigationBarTitleText": ""
      }
    },
    {
      "path": "pages/tourist/tourist",
      "style": {
        "navigationBarTitleText": "选择游客"
      }
    },
    {
      "path": "pages/tourist/editTourist",
      "style": {
        "navigationBarTitleText": "编辑游客"
      }
    },
    {
      "path": "pages/strategy/detail",
      "style": {
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/notice/notice",
      "style": {
        "navigationBarTitleText": "景区公告",
        "navigationBarBackgroundColor": "#fff"
      }
    },
    {
      "path": "pages/notice/detail",
      "style": {
        "navigationBarTitleText": "景区公告",
        "navigationBarBackgroundColor": "#fff"
      }
    }
  ],
  "subPackages": [
    {
      "root": "pagesA",
      "pages": [
        {
          "path": "bannerDetail/bannerDetail",
          "style": {
            "navigationBarTitleText": "轮播图详情",
            "navigationBarBackgroundColor": "#fff"
          }
        },
        {
          "path": "mapAndGuide/mapAndGuide",
          "style": {
            "navigationBarTitleText": "景区导览",
            "navigationBarBackgroundColor": "#fff"
          }
        }
      ]
    }
  ],
  "tabBar": {
    "color": "#A5A3AF",
    "selectedColor": "#06C584",
    "borderStyle": "black",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/home/home",
        "iconPath": "static/image/tabBar/nohome.png",
        "selectedIconPath": "static/image/tabBar/home.png",
        "text": "首页"
      },
      {
        "pagePath": "pages/good/good",
        "iconPath": "static/image/tabBar/nogood.png",
        "selectedIconPath": "static/image/tabBar/good.png",
        "text": "文创商城"
      },
      {
        "pagePath": "pages/strategy/strategy",
        "iconPath": "static/image/tabBar/nostrategy.png",
        "selectedIconPath": "static/image/tabBar/strategy.png",
        "text": "攻略"
      },
      {
        "pagePath": "pages/mine/mine",
        "iconPath": "static/image/tabBar/nomine.png",
        "selectedIconPath": "static/image/tabBar/mine.png",
        "text": "我的"
      }
    ]
  },
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "青城后山",
    "navigationBarBackgroundColor": "#fff",
    "backgroundColor": "#fff"
  },
  "uniIdRouter": {}
}
miniprogram/pages/home/home.vue
@@ -1,17 +1,97 @@
<template>
    <view>
        <view class="bgImg1">
            <view class="flex a-center ml-27 pt-106">
                <image src="/static/image/home/bg2.png" class="w-58 h-58 shrink0 mr-15" />
                <view class="white fs-35 lh-35 font-bold">青城后山旅游官方平台</view>
            </view>
            <view class="mt-31 mx-23">
                <Banner :list="list" />
            </view>
        </view>
        <view class="flex a-center mt-17 mx-23 py-15 pl-19 pr-27 br-19 border1 bgcolor1">
            <image class="w-38 h-38 shrink0 mr-19" src="/static/image/home/notice.png" />
            <u-notice-bar color="#191F3F" bg-color="transparent" volume-size="0" font-size="25" mode="horizontal"
                :list="noticeList"></u-notice-bar>
        </view>
        <view class="iconList">
            <view class="relative br-19 bgcolor2 pt-27 pb-29">
                <view class="flex a-center br-154 py-12 px-12 ml-27 bgcolor3 w-fit">
                    <view class="fs-27 lh-23 font-bold mr-4 color1">景区门票</view>
                    <image class="w-19 h-19 ml-4 shrink0" src="/static/image/home/Group@2x (3).png" />
                </view>
                <view class="mt-17 fs-25 lh-35 color2 ml-29">快速预订门票</view>
                <image src="/static/image/home/bg1.png" class="w-115 h-92 absolute" style="right: 21rpx;top: 33rpx;" />
            </view>
            <view @tap.stop="toMap" class="relative br-19 bgcolor4 pt-27 pb-29">
                <view class="flex a-center br-154 py-12 px-12 ml-27 bgcolor5 w-fit">
                    <view class="fs-27 lh-23 font-bold mr-4 color3">景区导览</view>
                    <image class="w-19 h-19 ml-4 shrink0" src="/static/image/home/Group@2x (4).png" />
                </view>
                <view class="mt-17 fs-25 lh-35 color3 ml-29">景区地图</view>
                <image src="/static/image/home/bg2.png" class="w-154 h-115 absolute" style="right: 2rpx;top: 15rpx;" />
            </view>
            <view class="relative br-19 bgcolor6 pt-27 pb-29" @tap="toNotice()">
                <view class="flex a-center br-154 py-12 px-12 ml-27 bgcolor7 w-fit">
                    <view class="fs-27 lh-23 font-bold mr-4 color4">景区公告</view>
                    <image class="w-19 h-19 ml-4 shrink0" src="/static/image/home/Group@2x (7).png" />
                </view>
                <view class="mt-17 fs-25 lh-35 color4 ml-29">实时景区信息</view>
                <image src="/static/image/home/bg3.png" class="w-115 h-119 absolute" style="right: 21rpx;top: 6rpx;" />
            </view>
            <view @tap.stop="toMini" class="relative br-19 bgcolor8 pt-27 pb-29">
                <view class="flex a-center br-154 py-12 px-12 ml-27 bgcolor9 w-fit">
                    <view class="fs-27 lh-23 font-bold mr-4 color5">景区直通车</view>
                    <image class="w-19 h-19 ml-4 shrink0" src="/static/image/home/Group@2x (6).png" />
                </view>
                <view class="mt-17 fs-25 lh-35 color5 ml-29">直达景区交通</view>
                <image src="/static/image/home/bg4.png" class="w-154 h-115 absolute" style="right: 2rpx;top: 13rpx;" />
            </view>
        </view>
        <view class="mt-27">
            <view class="bgImg2">
                <view class="flex a-center j-between pt-50 ml-23 mr-38">
                    <view class="flex a-center">
                        <image src="/static/image/home/hot.png" class="w-37 h-38 shrink0 mr-17" />
                        <view class="fs-38 lh-54 font-bold">景区攻略精选</view>
                    </view>
                    <view class="fs-27 lh-38 color6">查看更多</view>
                </view>
            </view>
            <view class="listBox">
                <view v-for="item in 10" :key="item" class="relative">
                    <image class="br-19" style="height: 396rpx;width: 346rpx;"
                        src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/832d1c03-9536-4019-8a1f-3d1388ac836e.png" />
                    <view class="absolute flex a-center br-138 h-35 pl-15 pr-12 bgcolor10"
                        style="top: 12rpx;right: 12rpx;">
                        <image src="/static/image/home/Shape@2x.png" class="w-19 h-19 shrink0 mr-8" />
                        <view class="white fs-23 lh-23">2025-11-30</view>
                    </view>
                    <view class="mt-13 mx-12 line1 fs-29 lh-40 font-bold">青城后山徒步全攻略</view>
                    <view class="mt-8 mx-12 fs-23 lh-33 color7 line1">景区官方徒步路线推荐</view>
                </view>
            </view>
        </view>
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from "vue";
    import { onLoad, onShow, onReachBottom } from "@dcloudio/uni-app"
    import Banner from '@/components/banner.vue'
    const params = ref({
        pageNum: 1,
        pageSize: 10,
    })
    const list = ref(['https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/832d1c03-9536-4019-8a1f-3d1388ac836e.png', 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/832d1c03-9536-4019-8a1f-3d1388ac836e.png']);
    const noticeList = ref<string[]>([
        '寒雨连江夜入吴',
        '平明送客楚山孤',
        '洛阳亲友如相问',
        '一片冰心在玉壶'
    ])
    onShow(() => {
    })
@@ -23,8 +103,21 @@
    })
    const getBanner = () => {
    const toMap = () => {
        uni.navigateTo({
            url: '/pagesA/mapAndGuide/mapAndGuide'
        })
    }
    const toMini = () => {
        uni.navigateToMiniProgram({
            appId: 'wxe6843e111c37fa99'
        })
    }
    const toNotice = () => {
        uni.navigateTo({
            url: '/pages/notice/notice'
        })
    }
</script>
<style>
@@ -33,5 +126,107 @@
    }
</style>
<style scoped lang="scss">
    .color1 {
        color: #33733D;
    }
    .color2 {
        color: #377744;
    }
    .color3 {
        color: #0D5BBA;
    }
    .color4 {
        color: #774991;
    }
    .color5 {
        color: #764A1E;
    }
    .color6 {
        color: #4D4D4D;
    }
    .color7 {
        color: #8E92AA;
    }
    .bgImg1 {
        height: 602rpx;
        background-image: url('https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/832d1c03-9536-4019-8a1f-3d1388ac836e.png');
        background-size: 100% 100%;
    }
    .bgImg2 {
        height: 171rpx;
        background-image: url('https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/092af05d-7371-4768-82cb-83fd244d9534.png');
        background-size: 100% 100%;
    }
    .border1 {
        border: 2rpx solid rgba(0, 0, 0, 0.04);
    }
    .bgcolor1 {
        background: linear-gradient(180deg, #EDFBF6 0%, #F7FDFB 100%);
    }
    .bgcolor2 {
        background: #D1FFE8;
    }
    .bgcolor3 {
        background: linear-gradient(270deg, #8CFFC4 0%, #FFFFFF 100%);
    }
    .bgcolor4 {
        background: linear-gradient(270deg, #BCDCFF 0%, #E0E9FF 100%);
    }
    .bgcolor5 {
        background: linear-gradient(270deg, #6FACF1 0%, #FFFFFF 100%);
    }
    .bgcolor6 {
        background: linear-gradient(101deg, #FBF0FF 0%, #F5DCFF 100%);
    }
    .bgcolor7 {
        background: linear-gradient(270deg, #EEC9FF 0%, #FFFFFF 100%);
    }
    .bgcolor8 {
        background: linear-gradient(101deg, #FDF7E5 0%, #FFEEDF 100%);
    }
    .bgcolor9 {
        background: linear-gradient(270deg, #F1DB6F 0%, #FFFFFF 100%);
    }
    .bgcolor10 {
        background: rgba(0, 0, 0, 0.4);
    }
    ::v-deep .u-notice-bar {
        padding: 0 !important;
    }
    .iconList {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        gap: 19rpx;
        margin: 0 23rpx;
        margin-top: 27rpx;
    }
    .listBox {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        gap: 35rpx 19rpx;
        margin: 0 19rpx;
        transform: translateY(-40rpx);
    }
</style>
miniprogram/pages/notice/detail.vue
New file
@@ -0,0 +1,167 @@
<template>
    <view class="relative">
        <image @tap.stop="back" class="absolute w-19 h-34" src="/static/image/public/back.png"
            style="top: 104rpx;left: 27rpx;z-index: 99;" />
        <banner :list="list" :height="700"></banner>
        <view style="transform: translateY(-56rpx);">
            <view class="bgcolor1 br1 px-27 pt-38 pb-27">
                <view class="fs-46 font-bold lh-63">{{ detailInfo.name || '' }}</view>
                <view class="mt-27 flex a-center j-between mb-34">
                    <view class="flex a-center">
                        <image class="w-19 h-19 mr-6" src="/static/image/public/time.png" />
                        <view class="time">{{detailInfo.time||""}}</view>
                    </view>
                    <view class="flex a-center">
                        <image class="w-25 h-19 mr-6" src="/static/image/public/read.png" />
                        <view class="time">{{detailInfo.read||0}}</view>
                    </view>
                </view>
                <rich-text :nodes="content"></rich-text>
            </view>
        </view>
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from "vue";
    import { onLoad } from '@dcloudio/uni-app'
    import banner from "@/components/banner.vue";
    import config from '../../config/index.js'
    const list = ref([
        { imageUrl: 'https://images.pexels.com/photos/15286/pexels-photo.jpg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' },
        { imageUrl: 'https://cdn.pixabay.com/photo/2016/11/29/05/45/astronomy-1867616_1280.jpg' },
        { imageUrl: 'https://images.pexels.com/photos/2908986/pexels-photo-2908986.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' },
        { imageUrl: 'https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg' },
        { imageUrl: 'https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' }]);
    const content = ref<string>(`<h2 style="color: #1a5f7a; text-align: center; margin: 20px 0 10px; font-size: 18px;">丽江古城 - 高原上的水墨古城</h2>
        <p style="color: #333; font-size: 14px; line-height: 1.8; margin: 10px 8px; text-indent: 2em;">
          丽江古城位于云南省丽江市古城区,又名大研古城,是中国历史文化名城之一,也是世界文化遗产。古城始建于宋末元初,距今已有八百多年历史,这里没有规整的道路布局,依山傍水而建,青石板路蜿蜒曲折,小桥流水人家错落有致,宛如一幅流动的水墨画卷。
        </p>
        <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg" alt="丽江古城全景" style="width: 100%; height: auto; margin: 16px 0; border-radius: 10px;" />
        <p style="color: #333; font-size: 14px; line-height: 1.8; margin: 10px 8px;">
          古城内的四方街是核心区域,也是昔日的商贸集散地,如今依旧热闹非凡,摆满了各类特色小吃和手工艺品。夜晚的丽江古城更是迷人,红灯笼挂满街巷,河水倒映着光影,酒吧街的民谣声悠扬婉转,既有古色古香的韵味,又有现代文艺的气息。
        </p>
        <img src="https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1" alt="丽江古城小桥流水" style="width: 100%; height: auto; margin: 16px 0; border-radius: 10px;" />
        <p style="color: #666; font-size: 12px; line-height: 1.6; margin: 10px 8px;">
          旅行小贴士:1. 古城内石板路较多,建议穿舒适的平底鞋;2. 特色美食推荐腊排骨火锅、鸡豆凉粉;3. 避免在旺季(节假日、暑期)前往,可减少拥挤。
        </p>`);
    const detailInfo = ref({
        name: '泡温泉看电影 品美食看川剧 青城山下一起邂逅冬日浪漫',
        time: '2025-11-30', read: 0, id: ''
    })
    onLoad((query) => {
        // getBigInfo(query.id).then(res => {
        //     if (res.code == 200) {
        //         list.value = res.data.detailedImage.split(',').map(item => {
        //             return {
        //                 imageUrl: config.imageUrl + item
        //             }
        //         })
        //         if (res.data.detailedDescription) {
        //             res.data.detailedDescription = res.data.detailedDescription.replace(/<img/gi,
        //                 '<img style="max-width:100%;height:auto;margin:0 auto;display:block"')
        //         }
        //         content.value = res.data.detailedDescription
        //         detailInfo.value = res.data
        //     }
        // })
    })
    const back = () => {
        uni.navigateBack()
    }
</script>
<style>
    page {
        background-color: #f5f5f5;
    }
</style>
<style scoped lang="scss">
    .bgcolor1 {
        background-color: #fff;
    }
    .color1 {
        color: rgba(0, 0, 0, 0.5);
    }
    .color2 {
        color: #ff4d4f;
    }
    .color3 {
        color: rgba(0, 0, 0, 0.45);
    }
    .br1 {
        border-radius: 38rpx 38rpx 0rpx 0rpx;
    }
    .time {
        font-weight: bold;
        font-size: 23rpx;
        color: rgba(0, 0, 0, 0.45);
        line-height: 27rpx;
    }
    .videoContent {
        position: relative;
        z-index: 99;
        #myVideo {
            width: 100%;
            height: 603rpx;
            z-index: 99;
            // opacity: 0.2;
        }
        .midBOF {
            width: 81rpx;
            height: 81rpx;
            position: absolute;
            bottom: 256rpx;
            z-index: 999;
            left: 47%;
        }
        .video-controls {
            position: absolute;
            bottom: 59rpx;
            display: flex;
            z-index: 999;
            width: 100%;
            padding: 0 50rpx;
            box-sizing: border-box;
            justify-content: space-between;
            align-items: center;
        }
        .slideBox {
            display: inline-block;
            width: 80%;
            .videoTime {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 21rpx;
            }
            .nowtime {
                height: 16rpx;
                font-family: PingFang;
                font-weight: bold;
                font-size: 21rpx;
                color: #FFFFFF;
                line-height: 40rpx;
            }
        }
        .slider {
            width: 70%;
            // width: 500px;
        }
    }
</style>
miniprogram/pages/notice/notice.vue
New file
@@ -0,0 +1,161 @@
<template>
    <view class="px-27 py-27">
        <view class="search">
            <u-search placeholder-color="rgba(0,0,0,0.4)" search-icon-color="RGBA(152, 152, 152, 1)"
                placeholder="搜索公告标题" style="line-height: 62rpx;" :action-style="actionStyle" v-model="keyword"
                @search="fetchList" @custom="fetchList" @clear="fetchList"></u-search>
            <!-- <u-search></u-search> -->
        </view>
        <view class="px-11">
            <view class="list-item" v-for="(item,index) in list" @tap="toDetail(item)">
                <view class="flex flex-column j-between">
                    <view class="list-title mt-3 line2">{{item.title||''}}</view>
                    <view class="flex a-center">
                        <image src="/static/image/public/time.png" class="w-19 h-19 mr-5 shrink0" />
                        <view class="list-time">{{item.time||''}}</view>
                    </view>
                </view>
                <image :src="item.img" class="list-img" />
            </view>
        </view>
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from "vue";
    import { onLoad, onUnload, onShow, onReachBottom } from "@dcloudio/uni-app";
    const actionStyle = ref({
        'width': '135rpx',
        'height': '62rpx',
        'background': '#06C584',
        'border-radius': '67rpx',
        'font-weight': '500',
        'font-size': '23rpx',
        'color': '#FFFFFF',
        'line-height': '62rpx'
    })
    const keyword = ref('')
    const list = ref([{
        id: '1', img: 'https://images.pexels.com/photos/15286/pexels-photo.jpg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '2', img: 'https://cdn.pixabay.com/photo/2016/11/29/05/45/astronomy-1867616_1280.jpg', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '3', img: 'https://images.pexels.com/photos/2908986/pexels-photo-2908986.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '4', img: 'https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '5', img: 'https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }])
    onShow(() => {
    })
    onLoad(() => {
    })
    onReachBottom(() => {
    })
    const fetchList = () => {
        //         // if (loading.value || finished.value) return
        //         loading.value = true
        //         getMonitorList({
        //             nameOrCode: keyword.value || '',
        //             pageNum: searchParams.value.pageNum,
        //             pageSize: searchParams.value.pageSize
        //         }).then(res => {
        //             // PC 端类型定义:{ records, total, current, size }
        //             const data = res.data || res || {}
        //             const records = data.records || []
        //             const total = data.total || 0
        //             if (searchParams.value.pageNum === 1) {
        //                 list.value = records
        //             } else {
        //                 list.value = list.value.concat(records)
        //             }
        //             // 判断是否已全部加载
        //             if (!records.length || list.value.length >= total) {
        //                 finished.value = true
        //             } else {
        //                 searchParams.value.pageNum += 1
        //             }
        //         }).catch(() => {
        //             uni.showToast({
        //                 title: '获取巡检列表失败',
        //                 icon: 'none'
        //             })
        //         }).finally(() => {
        //             loading.value = false
        //         })
    }
    const toDetail = (item) => {
        uni.navigateTo({
            url: 'pages/notice/detail'
        })
    }
</script>
<style>
    page {
        background-color: #ffffff;
    }
</style>
<style scoped lang="scss">
    .u-search {
        width: 696rpx;
        height: 77rpx;
        background: rgba(255, 255, 255, 0.7);
        box-shadow: 0rpx 8rpx 31rpx 0rpx rgba(0, 99, 65, 0.1);
        border-radius: 38rpx;
        border: 2rpx solid #06C584;
    }
    .search {
        background: rgba(255, 255, 255, 0.7);
        box-shadow: 0rpx 8rpx 31rpx 0rpx rgba(0, 99, 65, 0.1);
        border-radius: 38rpx;
        border: 2rpx solid #06C584;
        padding: 7rpx;
        box-sizing: border-box;
    }
    .list-item {
        margin-top: 38rpx;
        border-radius: 19rpx;
        display: flex;
        // align-items: center;
        .list-img {
            width: 201.92rpx;
            height: 148.08rpx;
            border-radius: 19rpx;
            flex-shrink: 0;
            margin-left: 28rpx;
        }
        .list-title {
            font-weight: 600;
            font-size: 31rpx;
            color: #191F3F;
            line-height: 42rpx;
        }
        .list-instro {
            font-weight: 500;
            font-size: 27rpx;
            color: #8E92AA;
            line-height: 38rpx;
        }
        .list-time {
            font-weight: bold;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.45);
            line-height: 27rpx;
        }
    }
</style>
miniprogram/pages/strategy/detail.vue
New file
@@ -0,0 +1,318 @@
<template>
    <view class="relative">
        <image @tap.stop="back" class="absolute w-19 h-34" src="/static/image/public/back.png"
            style="top: 104rpx;left: 27rpx;z-index: 99;" />
        <banner :list="list" :height="700" v-if="type=='image'"></banner>
        <view class="h-700 videoContent" v-else>
            <video ref="videoPlayer" :show-center-play-btn="false" id="myVideo" :src="videoUrl" :autoplay="false"
                :show-loading="true" @timeupdate="handleTimeUpdate" @loadedmetadata="loadedmetadata"
                :controls="controls" @fullscreenchange="fullscreenchange" @play="playChange" @pause="pauseChange"
                @ended="ended">
            </video>
            <image v-if="!isPlay" src="/static/image/public/bofang.png" mode="" class="midBOF" @click="played">
            </image>
            <view class="video-controls">
                <view>
                    <image v-if="isPlay" src="/static/image/public/zanting.png" mode="" class="w-18 h-25"
                        @click="pause">
                    </image>
                    <image v-else src="/static/image/public/bofang2.png" mode="" class="w-20 h-25" @click="played">
                    </image>
                </view>
                <view class="slideBox">
                    <view class="videoTime">
                        <view class="nowtime">
                            {{formatTime(nowPlayTime) }}
                        </view>
                        <view class="nowtime">
                            {{formatTime(videoDuration)}}
                        </view>
                    </view>
                    <slider @changing="sliderDown" :disabled="sliderAble" style="margin: 0;" :value="value"
                        @change="sliderChange" activeColor="rgba(255, 255, 255, .3)"
                        backgroundColor="rgba(255, 255, 255, .3)" block-color="rgba(255, 255, 255, .5)"
                        :block-size="10" />
                </view>
                <view>
                    <image src="/static/image/public/zuida.png" mode="" class="w-33 h-34" @click="toggleFullscreen">
                    </image>
                </view>
            </view>
        </view>
        <view style="transform: translateY(-56rpx);position: relative;z-index: 999;">
            <view class="bgcolor1 br1 px-27 pt-38 pb-27">
                <view class="fs-46 font-bold lh-63">{{ detailInfo.name || '' }}</view>
                <view class="mt-27 flex a-center j-between mb-34">
                    <view class="flex a-center">
                        <image class="w-19 h-19 mr-6" src="/static/image/public/time.png" />
                        <view class="time">{{detailInfo.time||""}}</view>
                    </view>
                    <view class="flex a-center">
                        <image class="w-25 h-19 mr-6" src="/static/image/public/read.png" />
                        <view class="time">{{detailInfo.read||0}}</view>
                    </view>
                </view>
                <rich-text :nodes="content"></rich-text>
            </view>
        </view>
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from "vue";
    import { onLoad } from '@dcloudio/uni-app'
    import banner from "@/components/banner.vue";
    import config from '../../config/index.js'
    const list = ref([
        { imageUrl: 'https://images.pexels.com/photos/15286/pexels-photo.jpg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' },
        { imageUrl: 'https://cdn.pixabay.com/photo/2016/11/29/05/45/astronomy-1867616_1280.jpg' },
        { imageUrl: 'https://images.pexels.com/photos/2908986/pexels-photo-2908986.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' },
        { imageUrl: 'https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg' },
        { imageUrl: 'https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1' }]);
    const content = ref<string>(`<h2 style="color: #1a5f7a; text-align: center; margin: 20px 0 10px; font-size: 18px;">丽江古城 - 高原上的水墨古城</h2>
        <p style="color: #333; font-size: 14px; line-height: 1.8; margin: 10px 8px; text-indent: 2em;">
          丽江古城位于云南省丽江市古城区,又名大研古城,是中国历史文化名城之一,也是世界文化遗产。古城始建于宋末元初,距今已有八百多年历史,这里没有规整的道路布局,依山傍水而建,青石板路蜿蜒曲折,小桥流水人家错落有致,宛如一幅流动的水墨画卷。
        </p>
        <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg" alt="丽江古城全景" style="width: 100%; height: auto; margin: 16px 0; border-radius: 10px;" />
        <p style="color: #333; font-size: 14px; line-height: 1.8; margin: 10px 8px;">
          古城内的四方街是核心区域,也是昔日的商贸集散地,如今依旧热闹非凡,摆满了各类特色小吃和手工艺品。夜晚的丽江古城更是迷人,红灯笼挂满街巷,河水倒映着光影,酒吧街的民谣声悠扬婉转,既有古色古香的韵味,又有现代文艺的气息。
        </p>
        <img src="https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1" alt="丽江古城小桥流水" style="width: 100%; height: auto; margin: 16px 0; border-radius: 10px;" />
        <p style="color: #666; font-size: 12px; line-height: 1.6; margin: 10px 8px;">
          旅行小贴士:1. 古城内石板路较多,建议穿舒适的平底鞋;2. 特色美食推荐腊排骨火锅、鸡豆凉粉;3. 避免在旺季(节假日、暑期)前往,可减少拥挤。
        </p>`);
    const detailInfo = ref({
        name: '泡温泉看电影 品美食看川剧 青城山下一起邂逅冬日浪漫',
        time: '2025-11-30', read: 0, id: ''
    })
    const type = ref('video') //image或者video
    const videoUrl = ref('https://bdcloud-player-new.cdn.bcebos.com/testvideo/mp4/av1/1080p/liulangdiqiu-av1-1080-faststart.mp4')
    const isPlay = ref(false)
    const videoContext = ref(null)
    const videoDuration = ref(0)  //总播放时长
    const nowPlayTime = ref(0)  //当前播放时间
    const value = ref(0) //当前滑块的值
    const controls = ref(false) //是否隐藏默认控制器
    const isEnd = ref(false)
    const sliderAble = ref(true)
    const isSliderIng = ref(false)
    const playChange = () => {
        isPlay.value = true
    }
    const played = () => {
        setTimeout(() => {
            videoContext.value.play()
        }, 500);
    }
    /**
     * 暂停
     */
    const pause = () => {
        videoContext.value.pause()
    }
    /**
     * 全屏
     */
    const toggleFullscreen = (e) => {
        videoContext.value.requestFullScreen()
    }
    /**
     * 滑块进行拖动进度播放
     */
    const sliderChange = (e) => {
        console.log(1314);
        isSliderIng.value = false
        const t = e.detail.value / 100
        videoContext.value.seek(t * videoDuration.value);
        console.log(e.detail.value / 100);
    }
    /**
     * 播放后触发方法,获得播放总时长
     */
    const handleTimeUpdate = (e) => {
        // 设置滑块位置
        if (!isEnd.value && !isSliderIng.value) {
            value.value = nowPlayTime.value / videoDuration.value * 100
        }
        // 设置当前时间
        nowPlayTime.value = e.detail.currentTime
        // 首次获取到duration时存储它
        if (videoDuration.value === 0 && e.detail.duration > 0) {
            videoDuration.value = e.detail.duration;
        }
    }
    /**
     * 初始化获得视频总时长
     */
    const loadedmetadata = (e) => {
        videoDuration.value = e.detail.duration
    }
    const formatTime = (seconds) => {
        seconds = (seconds * 1).toFixed(0)
        const hours = Math.floor(seconds / 3600);
        const minutes = Math.floor((seconds % 3600) / 60);
        const remainingSeconds = seconds % 60;
        if (hours > 0) {
            return `${pad(hours)}:${pad(minutes)}:${pad(remainingSeconds)}`;
        } else {
            return `${pad(minutes)}:${pad(remainingSeconds)}`;
        }
    }
    const pad = (number) => {
        return number < 10 ? '0' + number : number;
    }
    /**
     * 监听是否为全屏,默认控制器是否显示
     */
    const fullscreenchange = (e) => {
        if (e.detail.fullScreen) {
            controls.value = true
        } else {
            controls.value = false
        }
    }
    /**
     * 监听是否暂停
     */
    const pauseChange = () => {
        isPlay.value = false
        sliderAble.value = true
    }
    /**
     * 是否播放完毕
     */
    const ended = (e) => {
        isEnd.value = true
        isPlay.value = false
        value.value = 0
        videoContext.value.seek(0);
    }
    /**
     * 滑块滑动期间
     */
    const sliderDown = () => {
        isSliderIng.value = true
    }
    onLoad((query) => {
        videoContext.value = uni.createVideoContext('myVideo', this)
        // getBigInfo(query.id).then(res => {
        //     if (res.code == 200) {
        //         list.value = res.data.detailedImage.split(',').map(item => {
        //             return {
        //                 imageUrl: config.imageUrl + item
        //             }
        //         })
        //         if (res.data.detailedDescription) {
        //             res.data.detailedDescription = res.data.detailedDescription.replace(/<img/gi,
        //                 '<img style="max-width:100%;height:auto;margin:0 auto;display:block"')
        //         }
        //         content.value = res.data.detailedDescription
        //         detailInfo.value = res.data
        //     }
        // })
    })
    const back = () => {
        uni.navigateBack()
    }
</script>
<style>
    page {
        background-color: #f5f5f5;
    }
</style>
<style scoped lang="scss">
    .bgcolor1 {
        background-color: #fff;
    }
    .color1 {
        color: rgba(0, 0, 0, 0.5);
    }
    .color2 {
        color: #ff4d4f;
    }
    .color3 {
        color: rgba(0, 0, 0, 0.45);
    }
    .br1 {
        border-radius: 38rpx 38rpx 0rpx 0rpx;
    }
    .time {
        font-weight: bold;
        font-size: 23rpx;
        color: rgba(0, 0, 0, 0.45);
        line-height: 27rpx;
    }
    .videoContent {
        position: relative;
        z-index: 99;
        #myVideo {
            width: 100%;
            height: 603rpx;
            z-index: 99;
            // opacity: 0.2;
        }
        .midBOF {
            width: 81rpx;
            height: 81rpx;
            position: absolute;
            bottom: 256rpx;
            z-index: 999;
            left: 47%;
        }
        .video-controls {
            position: absolute;
            bottom: 59rpx;
            display: flex;
            z-index: 999;
            width: 100%;
            padding: 0 50rpx;
            box-sizing: border-box;
            justify-content: space-between;
            align-items: center;
        }
        .slideBox {
            display: inline-block;
            width: 80%;
            .videoTime {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 21rpx;
            }
            .nowtime {
                height: 16rpx;
                font-family: PingFang;
                font-weight: bold;
                font-size: 21rpx;
                color: #FFFFFF;
                line-height: 40rpx;
            }
        }
        .slider {
            width: 70%;
            // width: 500px;
        }
    }
</style>
miniprogram/pages/strategy/strategy.vue
@@ -1,12 +1,54 @@
<template>
    <view>
    <view class="px-27 py-27">
        <view class="search">
            <u-search placeholder-color="rgba(0,0,0,0.4)" search-icon-color="RGBA(152, 152, 152, 1)"
                placeholder="请输入攻略标题" style="line-height: 62rpx;" :action-style="actionStyle" v-model="keyword"
                @search="fetchList" @custom="fetchList" @clear="fetchList"></u-search>
            <!-- <u-search></u-search> -->
        </view>
        <view class="list">
            <view class="list-item" v-for="(item,index) in list" @tap="toDetail(item)" :key="index">
                <image :src="item.img" class="list-img" />
                <view class="flex flex-column j-between">
                    <view>
                        <view class="list-title mb-15 line2">{{item.title||''}}</view>
                        <view class="list-instro">{{item.introduce||""}}</view>
                    </view>
                    <view class="flex a-center">
                        <image src="/static/image/public/time.png" class="w-19 h-19 mr-5 shrink0" />
                        <view class="list-time">{{item.time||''}}</view>
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from "vue";
    import { onLoad, onUnload, onShow, onReachBottom } from "@dcloudio/uni-app";
    const actionStyle = ref({
        'width': '135rpx',
        'height': '62rpx',
        'background': '#06C584',
        'border-radius': '67rpx',
        'font-weight': '500',
        'font-size': '23rpx',
        'color': '#FFFFFF',
        'line-height': '62rpx'
    })
    const keyword = ref('')
    const list = ref([{
        id: '1', img: 'https://images.pexels.com/photos/15286/pexels-photo.jpg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '2', img: 'https://cdn.pixabay.com/photo/2016/11/29/05/45/astronomy-1867616_1280.jpg', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '3', img: 'https://images.pexels.com/photos/2908986/pexels-photo-2908986.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '4', img: 'https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }, {
        id: '5', img: 'https://images.pexels.com/photos/129105/pexels-photo-129105.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', title: '泡温泉看电影 品美食看川剧 青城山下', introduce: '景区官方徒步路线推荐', time: '2025-11-30'
    }])
    onShow(() => {
@@ -18,20 +60,105 @@
    onReachBottom(() => {
    })
    const getList = () => {
    const fetchList = () => {
        //         // if (loading.value || finished.value) return
        //         loading.value = true
        //         getMonitorList({
        //             nameOrCode: keyword.value || '',
        //             pageNum: searchParams.value.pageNum,
        //             pageSize: searchParams.value.pageSize
        //         }).then(res => {
        //             // PC 端类型定义:{ records, total, current, size }
        //             const data = res.data || res || {}
        //             const records = data.records || []
        //             const total = data.total || 0
        //             if (searchParams.value.pageNum === 1) {
        //                 list.value = records
        //             } else {
        //                 list.value = list.value.concat(records)
        //             }
        //             // 判断是否已全部加载
        //             if (!records.length || list.value.length >= total) {
        //                 finished.value = true
        //             } else {
        //                 searchParams.value.pageNum += 1
        //             }
        //         }).catch(() => {
        //             uni.showToast({
        //                 title: '获取巡检列表失败',
        //                 icon: 'none'
        //             })
        //         }).finally(() => {
        //             loading.value = false
        //         })
    }
    const toOrderDetail = (item) => {
    const toDetail = (item) => {
        uni.navigateTo({
            url: '/pages/strategy/detail'
        })
    }
</script>
<style>
    page {
        background-color: #f5f5f5;
        background-color: #ffffff;
    }
</style>
<style scoped lang="scss">
    .u-search {
        width: 696rpx;
        height: 77rpx;
        background: rgba(255, 255, 255, 0.7);
        box-shadow: 0rpx 8rpx 31rpx 0rpx rgba(0, 99, 65, 0.1);
        border-radius: 38rpx;
        border: 2rpx solid #06C584;
    }
    .search {
        background: rgba(255, 255, 255, 0.7);
        box-shadow: 0rpx 8rpx 31rpx 0rpx rgba(0, 99, 65, 0.1);
        border-radius: 38rpx;
        border: 2rpx solid #06C584;
        padding: 7rpx;
        box-sizing: border-box;
    }
    .list-item {
        margin-top: 38rpx;
        border-radius: 19rpx;
        display: flex;
        // align-items: center;
        .list-img {
            width: 346rpx;
            height: 233rpx;
            border-radius: 19rpx;
            flex-shrink: 0;
            margin-right: 27rpx;
        }
        .list-title {
            font-weight: 500;
            font-size: 35rpx;
            color: #191F3F;
            line-height: 48rpx;
        }
        .list-instro {
            font-weight: 500;
            font-size: 27rpx;
            color: #8E92AA;
            line-height: 38rpx;
        }
        .list-time {
            font-weight: bold;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.45);
            line-height: 27rpx;
        }
    }
</style>
miniprogram/pagesA/bannerDetail/bannerDetail.vue
New file
@@ -0,0 +1,53 @@
<template>
    <view class="pt-38 px-27">
        <view class="fs-46 lh-63 font-bold">{{info.bannerName}}</view>
        <view class="mt-27 flex a-center j-between fs-23 color1 font-bold">
            <view class="flex a-center">
                <image src="/static/image/public/time.png" class="w-19 h-19 shrink0 mr-10" />
                <view>{{info.createTime}}</view>
            </view>
            <view class="flex a-center">
                <image src="/static/image/public/read.png" class="w-25 h-19 shrink0 mr-12" />
                <view>4983</view>
            </view>
        </view>
        <rich-text :nodes="content" class="mt-35"></rich-text>
    </view>
</template>
<script setup lang="ts">
    import { onLoad } from "@dcloudio/uni-app";
    import { ref } from "vue";
    import { getBannerDetail } from "./service.js";
    const content = ref<string>("");
    const info = ref({
        bannerName: '', createTime: ''
    })
    onLoad((params) => {
        getBannerDetail(params.id).then((res) => {
            if (res.code == 200) {
                info.value = res.data
                if (res.data.bannerDetail) {
                    res.data.bannerDetail = res.data.bannerDetail.replace(/<img/gi,
                        '<img style="max-width:100%;height:auto;margin:0 auto;display:block"')
                }
                content.value = res.data.bannerDetail || "";
            }
        });
    });
</script>
<style>
    page {
        background-color: #fff;
    }
</style>
<style lang="scss" scoped>
    .color1 {
        color: rgba(0, 0, 0, 0.45);
    }
</style>
miniprogram/pagesA/bannerDetail/service.js
New file
@@ -0,0 +1,6 @@
import request from '@/utils/request.js'
//获取用户协议和隐私协议
export const getBannerDetail = (id) => {
    return request.get(`/index/getBannerDetail/${id}`)
}
miniprogram/pagesA/mapAndGuide/mapAndGuide.vue
New file
@@ -0,0 +1,19 @@
<template>
    <view>
        <image @tap.stop="viewImg" src="/static/image/mine/bg.png" style="width: 100vw;" />
    </view>
</template>
<script setup lang="ts">
    import { ref, reactive } from 'vue'
    const viewImg = () => {
        uni.previewImage({
            urls: ['https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/832d1c03-9536-4019-8a1f-3d1388ac836e.png']
        })
    }
</script>
<style>
</style>
miniprogram/static/image/home/Group@2x (3).png
miniprogram/static/image/home/Group@2x (4).png
miniprogram/static/image/home/Group@2x (6).png
miniprogram/static/image/home/Group@2x (7).png
miniprogram/static/image/home/Shape@2x.png
miniprogram/static/image/home/backImg.png
Binary files differ
miniprogram/static/image/home/titleBg.png
Binary files differ
miniprogram/static/image/public/back.png
miniprogram/static/image/public/bofang.png
miniprogram/static/image/public/bofang2.png
miniprogram/static/image/public/read.png
miniprogram/static/image/public/search.png
miniprogram/static/image/public/time.png
miniprogram/static/image/public/zanting.png
miniprogram/static/image/public/zuida.png
miniprogram/static/image/public/zuixiaohua.png
miniprogram/static/style/_app.scss
@@ -1218,4 +1218,8 @@
.safe-b {
    padding-bottom: env(safe-area-inset-bottom);
}
.w-fit{
    width: fit-content;
}