Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/qingduTicketing
| | |
| | | <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> |
| | |
| | | }, |
| | | height: { |
| | | type: Number, |
| | | default: 1545 |
| | | default: 387 |
| | | }, |
| | | isDetail: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | |
| | | } |
| | | |
| | | .dot { |
| | | bottom: 75rpx; |
| | | bottom: 19rpx; |
| | | right: 50%; |
| | | transform: translateX(50%); |
| | | } |
| | |
| | | |
| | | .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> |
| | |
| | | { |
| | | "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": {} |
| | | } |
| | |
| | | <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(() => { |
| | | |
| | | }) |
| | |
| | | |
| | | }) |
| | | |
| | | 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> |
| | |
| | | } |
| | | </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> |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | <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> |
| | |
| | | <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(() => { |
| | |
| | | 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> |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | import request from '@/utils/request.js' |
| | | |
| | | //获取用户协议和隐私协议 |
| | | export const getBannerDetail = (id) => { |
| | | return request.get(`/index/getBannerDetail/${id}`) |
| | | } |
| New file |
| | |
| | | <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> |
| | |
| | | |
| | | .safe-b { |
| | | padding-bottom: env(safe-area-inset-bottom); |
| | | } |
| | | |
| | | .w-fit{ |
| | | width: fit-content; |
| | | } |