Merge branch 'milestone-20251031-简版功能开发' of http://39.101.133.168:8807/qimaohong/deepChartVueApp into hongxilin/feature-20251023103318-行情数据及页面
zhaowenkang/feature-20251028181547-行情页面
-
1api/deepExploration/deepExploration.js
-
5common/util.js
-
409components/deepExploration_header.vue
-
2components/footerBar.vue
-
3manifest.json
-
57pages.json
-
69pages/blank/blank.vue
-
100pages/blank/institutionalTrendsBriefing.vue
-
100pages/blank/notice.vue
-
736pages/deepExploration/MainForceActions.vue
-
354pages/deepExploration/stockSelectDetail.vue
-
27pages/deepMate/deepMate.vue
-
448pages/home/deepExploration.vue
-
579pages/home/globalIndex.vue
-
488pages/home/marketDetail.vue
-
920pages/home/marketSituation.vue
-
655pages/marketSituation/chartExample.vue
-
493pages/marketSituation/countryMarket.vue
-
301pages/marketSituation/forexMetals.vue
-
574pages/marketSituation/globalIndex.vue
-
0pages/marketSituation/marketCondition.vue
-
485pages/marketSituation/marketDetail.vue
-
733pages/marketSituation/marketOverview.vue
-
593pages/marketSituation/marketSituation.vue
-
BINstatic/deepExploration-images/1.png
-
BINstatic/deepExploration-images/2.png
-
BINstatic/deepExploration-images/3.png
-
BINstatic/deepExploration-images/4.png
-
BINstatic/deepExploration-images/ASC.png
-
BINstatic/deepExploration-images/Americle.png
-
BINstatic/deepExploration-images/DESC.png
-
BINstatic/deepExploration-images/all.png
-
BINstatic/deepExploration-images/close.png
-
BINstatic/deepExploration-images/delete.png
-
BINstatic/deepExploration-images/history.png
-
BINstatic/deepExploration-images/icon1.png
-
BINstatic/deepExploration-images/icon2.png
-
BINstatic/deepExploration-images/icon3.png
-
BINstatic/deepExploration-images/icon4.png
-
BINstatic/deepExploration-images/last.png
-
BINstatic/deepExploration-images/next.png
-
BINstatic/deepExploration-images/notice.png
-
BINstatic/deepExploration-images/plus.png
-
BINstatic/deepExploration-images/search.png
-
BINstatic/deepExploration-images/showAll.png
-
BINstatic/icons/Left_(左).png
-
BINstatic/images/缺省.png
-
BINstatic/marketSituation-image/cool.png
-
BINstatic/marketSituation-image/hot.png
-
BINstatic/marketSituation-image/warm.png
-
320uni_modules/qiun-data-charts/changelog.md
-
1618uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
-
46uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
-
162uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue
-
170uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue
-
173uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue
-
222uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue
-
229uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue
-
36uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue
-
422uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js
-
606uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js
-
5uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md
-
7706uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
-
18uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
-
201uni_modules/qiun-data-charts/license.md
-
80uni_modules/qiun-data-charts/package.json
-
84uni_modules/qiun-data-charts/readme.md
-
23uni_modules/qiun-data-charts/static/app-plus/echarts.min.js
-
23uni_modules/qiun-data-charts/static/h5/echarts.min.js
@ -0,0 +1 @@ |
|||||
|
import { http } from '@/utils/http.js' |
||||
@ -0,0 +1,409 @@ |
|||||
|
<template> |
||||
|
<view class="titleContent"> |
||||
|
<view class="left"> |
||||
|
<uni-icons @click="handleBack" type="back" size="23" color="#111"></uni-icons> |
||||
|
</view> |
||||
|
<view class="title">深度探索</view> |
||||
|
<view class="right"> |
||||
|
<image class="notice" src="/static/deepExploration-images/notice.png" mode="aspectFill"></image> |
||||
|
<image @click="handleHistory" class="history" src="/static/deepExploration-images/history.png" |
||||
|
mode="aspectFill"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<view class="drawer-overlay" v-show="showHistoryDrawer"></view> |
||||
|
|
||||
|
<view class="drawer-panel" v-show="showHistoryDrawer" @click.stop @touchmove.stop.prevent |
||||
|
:style="{ transform: 'translateY(' + drawerOffsetY + 'px)' }"> |
||||
|
<view class="drawer-header"> |
||||
|
<text class="drawer-title">历史对话</text> |
||||
|
<view class="drawer-actions"> |
||||
|
<view class="delete-all-container"> |
||||
|
<image class="delete-icon" src="/static/deepExploration-images/delete.png"></image> |
||||
|
<text class="delete-all" @click="clearAllHistory">删除全部</text> |
||||
|
</view> |
||||
|
<view class="drawer-close" @click="closeHistoryDrawer"> |
||||
|
<image src="/static/deepExploration-images/close.png" mode="aspectFill"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<scroll-view scroll-y="true" class="drawer-content"> |
||||
|
<view class="drawer-inner"> |
||||
|
<view v-if="historyList.length === 0" class="empty-history"> |
||||
|
<text>暂无历史记录</text> |
||||
|
</view> |
||||
|
<view v-for="(section, sIdx) in historyList" :key="sIdx" class="history-section"> |
||||
|
<text class="section-title">{{ section.title }}</text> |
||||
|
<view v-for="(item, idx) in section.items" :key="idx" class="history-item"> |
||||
|
<view class="history-left"> |
||||
|
<view class="flag-circle"> |
||||
|
<image :src="item.icon" mode="aspectFill"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="history-main" @click="itemClick(item)"> |
||||
|
<text class="history-query">{{ item.stockName }}</text> |
||||
|
<text class="history-query">({{ item.stockCode }})</text> |
||||
|
</view> |
||||
|
<text class="history-time">{{ item.createdTime }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { |
||||
|
ref, |
||||
|
onMounted |
||||
|
} from 'vue' |
||||
|
|
||||
|
const props = defineProps({ |
||||
|
name: { |
||||
|
type: String, |
||||
|
default: '' |
||||
|
} |
||||
|
}) |
||||
|
const showHistoryDrawer = ref(false) |
||||
|
const drawerOffsetY = ref(0); |
||||
|
const handleHistory = () => { |
||||
|
showHistoryDrawer.value = true |
||||
|
} |
||||
|
|
||||
|
const clearAllHistory = () => { |
||||
|
uni.setStorageSync("search_history", []); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
//返回上一页 |
||||
|
const handleBack = ()=>{ |
||||
|
uni.navigateBack() |
||||
|
} |
||||
|
|
||||
|
const closeHistoryDrawer = () => { |
||||
|
showHistoryDrawer.value = false; |
||||
|
}; |
||||
|
// const onDrawerBackClick = () => { |
||||
|
// const hideDistance = uni.upx2px(900); |
||||
|
// drawerOffsetY.value = hideDistance; |
||||
|
// setTimeout(() => { |
||||
|
// closeHistoryDrawer(); |
||||
|
// drawerOffsetY.value = 0; |
||||
|
// }, 180); |
||||
|
// }; |
||||
|
|
||||
|
// 历史记录详情 |
||||
|
async function itemClick(item) { |
||||
|
// const res = await postHistoryDetail({ |
||||
|
// recordId: item.id, |
||||
|
// parentId: item.parentId, |
||||
|
// model: 5, |
||||
|
// }); |
||||
|
|
||||
|
// if (res.code == 200) { |
||||
|
// const message = res.data.wokeFlowData.One.markdown; |
||||
|
// messages.value = []; |
||||
|
// const botMsg = { |
||||
|
// content: message, |
||||
|
// isUser: false, |
||||
|
// isTyping: false, |
||||
|
// isThinking: false, |
||||
|
// }; |
||||
|
// messages.value.push(botMsg); |
||||
|
// } |
||||
|
} |
||||
|
const historyList = ref([{ |
||||
|
title: "今天", // 分组标题(如“今天”“昨天”“更早”) |
||||
|
items: [{ |
||||
|
|
||||
|
icon: '/static/deepExploration-images/Americle.png', |
||||
|
stockName: "TechCore", // 股票名称 |
||||
|
stockCode: "600001", // 6位数字股票代码 |
||||
|
createdTime: "14:35" // 时间格式(时:分) |
||||
|
}, |
||||
|
{ |
||||
|
icon: '/static/deepExploration-images/Americle.png', |
||||
|
stockName: "MediaLink", |
||||
|
stockCode: "600002", |
||||
|
createdTime: "10:12" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
title: "昨天", |
||||
|
items: [{ |
||||
|
icon: '/static/deepExploration-images/Americle.png', |
||||
|
stockName: "FinServ", |
||||
|
stockCode: "600003", |
||||
|
createdTime: "09:48" |
||||
|
}] |
||||
|
} |
||||
|
]); |
||||
|
|
||||
|
onMounted(() => { |
||||
|
|
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
* { |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.titleContent { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding: 30rpx 60rpx 40rpx 35rpx; |
||||
|
box-shadow: 2rpx 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
|
||||
|
.left { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
width: 36rpx; |
||||
|
height: 36rpx; |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
transform: translateX(-50%); |
||||
|
color: #000000; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 19px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 25px; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.right { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 20rpx; |
||||
|
|
||||
|
.notice { |
||||
|
width: 35rpx; |
||||
|
height: 35rpx; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.history { |
||||
|
width: 32rpx; |
||||
|
height: 32rpx; |
||||
|
align-items: center; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* 搜索历史侧拉框样式 */ |
||||
|
.drawer-overlay { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
top: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background-color: rgba(0, 0, 0, 0.35); |
||||
|
z-index: 900; |
||||
|
} |
||||
|
|
||||
|
.drawer-panel { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
height: 75vh; |
||||
|
max-height: 80vh; |
||||
|
width: 100%; |
||||
|
background: #ffffff; |
||||
|
box-shadow: 0 -8rpx 20rpx rgba(0, 0, 0, 0.06); |
||||
|
z-index: 1000; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
border-top-left-radius: 20rpx; |
||||
|
border-top-right-radius: 20rpx; |
||||
|
transition: transform 0.22s ease; |
||||
|
} |
||||
|
|
||||
|
.drawer-back { |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: -14px; |
||||
|
transform: translateX(-50%); |
||||
|
width: 28px; |
||||
|
height: 48px; |
||||
|
border-radius: 12px; |
||||
|
background: #fff; |
||||
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.drawer-back-icon { |
||||
|
font-size: 16px; |
||||
|
color: #8a8a8a; |
||||
|
} |
||||
|
|
||||
|
.drawer-actions { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.delete-all-container { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 14rpx; |
||||
|
} |
||||
|
|
||||
|
.delete-icon { |
||||
|
width: 28rpx; |
||||
|
height: 32rpx; |
||||
|
} |
||||
|
|
||||
|
.delete-all { |
||||
|
font-size: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.drawer-close { |
||||
|
width: 48rpx; |
||||
|
height: 48rpx; |
||||
|
border-radius: 24rpx; |
||||
|
/* background: #f5f5f5; */ |
||||
|
/* box-shadow: 0 2px 8px rgba(0,0,0,0.08); */ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
|
||||
|
image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.drawer-header { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding: 52rpx 28rpx 0rpx 28rpx; |
||||
|
/* border-bottom: 2rpx solid #f0f0f0; */ |
||||
|
} |
||||
|
|
||||
|
.drawer-title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 600; |
||||
|
color: #333333; |
||||
|
} |
||||
|
|
||||
|
.drawer-content { |
||||
|
flex: 1; |
||||
|
min-height: 0; |
||||
|
/* 让 flex 子元素可在容器内收缩以启用滚动 */ |
||||
|
height: 100%; |
||||
|
overscroll-behavior-y: contain; |
||||
|
/* 防止滚动串联到页面 */ |
||||
|
-webkit-overflow-scrolling: touch; |
||||
|
/* iOS 惯性滚动 */ |
||||
|
touch-action: pan-y; |
||||
|
/* 优化触控滚动,仅垂直 */ |
||||
|
} |
||||
|
|
||||
|
.drawer-inner { |
||||
|
padding: 20rpx 24rpx 20rpx 24rpx; |
||||
|
} |
||||
|
|
||||
|
.history-section { |
||||
|
margin-bottom: 20rpx; |
||||
|
/* margin: 0 24rpx; */ |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
font-size: 26rpx; |
||||
|
color: #888; |
||||
|
margin: 10rpx 6rpx 16rpx; |
||||
|
} |
||||
|
|
||||
|
.history-item { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
padding: 19rpx 18rpx; |
||||
|
background-color: #f6f7f9; |
||||
|
border-radius: 12rpx; |
||||
|
margin-bottom: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.history-left { |
||||
|
margin-right: 20rpx; |
||||
|
width: 50rpx; |
||||
|
height: 50rpx; |
||||
|
} |
||||
|
|
||||
|
.flag-circle { |
||||
|
width: 50rpx; |
||||
|
height: 50rpx; |
||||
|
border-radius: 50%; |
||||
|
background: #fff; |
||||
|
border: 2rpx solid #eee; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
image{ |
||||
|
width: 50rpx; |
||||
|
height: 50rpx; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.history-main { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.history-query { |
||||
|
color: #000000; |
||||
|
text-align: center; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 400; |
||||
|
line-height: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.history-time { |
||||
|
font-size: 22rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.history-card { |
||||
|
background-color: #fff; |
||||
|
border: 2rpx solid #f2f2f2; |
||||
|
border-left: 8rpx solid rgb(220, 31, 29); |
||||
|
border-radius: 12rpx; |
||||
|
padding: 18rpx 20rpx; |
||||
|
margin-bottom: 16rpx; |
||||
|
box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, 0.03); |
||||
|
} |
||||
|
|
||||
|
.history-query { |
||||
|
font-size: 28rpx; |
||||
|
color: #333333; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.history-time { |
||||
|
margin-top: 8rpx; |
||||
|
font-size: 22rpx; |
||||
|
color: #888888; |
||||
|
} |
||||
|
|
||||
|
.empty-history { |
||||
|
padding: 40rpx; |
||||
|
color: #999999; |
||||
|
text-align: center; |
||||
|
} |
||||
|
</style> |
||||
@ -1,69 +0,0 @@ |
|||||
<template> |
|
||||
<view class="blank-page"> |
|
||||
<!-- 返回按钮 --> |
|
||||
<view class="back-button" @click="goBack"> |
|
||||
<text class="back-icon">←</text> |
|
||||
<text class="back-text">返回</text> |
|
||||
</view> |
|
||||
|
|
||||
<text class="tip">当前特斯拉该如何布局?</text> |
|
||||
</view> |
|
||||
</template> |
|
||||
|
|
||||
<script setup> |
|
||||
// 返回到 deepMate 页面 |
|
||||
const goBack = () => { |
|
||||
uni.navigateTo({ |
|
||||
url: '/pages/deepMate/deepMate' |
|
||||
}); |
|
||||
}; |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
.blank-page { |
|
||||
display: flex; |
|
||||
flex-direction: column; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
height: 100vh; |
|
||||
background-color: #ffffff; |
|
||||
position: relative; |
|
||||
} |
|
||||
|
|
||||
.back-button { |
|
||||
position: absolute; |
|
||||
top: 60rpx; |
|
||||
left: 30rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
padding: 20rpx 30rpx; |
|
||||
background-color: #f5f5f5; |
|
||||
border-radius: 50rpx; |
|
||||
cursor: pointer; |
|
||||
transition: all 0.3s ease; |
|
||||
} |
|
||||
|
|
||||
.back-button:hover { |
|
||||
background-color: #e0e0e0; |
|
||||
} |
|
||||
|
|
||||
.back-button:active { |
|
||||
transform: scale(0.95); |
|
||||
} |
|
||||
|
|
||||
.back-icon { |
|
||||
font-size: 32rpx; |
|
||||
color: #333333; |
|
||||
margin-right: 10rpx; |
|
||||
} |
|
||||
|
|
||||
.back-text { |
|
||||
font-size: 28rpx; |
|
||||
color: #333333; |
|
||||
} |
|
||||
|
|
||||
.tip { |
|
||||
color: #999999; |
|
||||
font-size: 28rpx; |
|
||||
} |
|
||||
</style> |
|
||||
@ -0,0 +1,100 @@ |
|||||
|
<template> |
||||
|
|
||||
|
<view class="blank-page"> |
||||
|
<view class="header" :style="{ paddingTop: safeAreaInsets?.top + 'px' }"> |
||||
|
<!-- 返回按钮 --> |
||||
|
<view class="head-left"> |
||||
|
<image class="back-button" @click="goBack" src="/static/icons/Left_(左).png"> |
||||
|
|
||||
|
|
||||
|
<!-- <text class="tip">当前特斯拉该如何布局?</text> --> |
||||
|
</image> |
||||
|
</view> |
||||
|
<view class="header-center"> |
||||
|
<text class="title" :style="{ paddingTop: safeAreaInsets?.top + 'px' }" |
||||
|
>机构动向解析</text |
||||
|
> |
||||
|
</view> |
||||
|
</view> |
||||
|
<image class="picture" src="/static/images/缺省.png" /> |
||||
|
<text class="tip">暂无内容~</text> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
// 返回到 deepMate 页面 |
||||
|
const goBack = () => { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepMate/deepMate' |
||||
|
}); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.blank-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
position: fixed; |
||||
|
/* 充满视口,彻底禁用页面滚动 */ |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
height: 100vh; |
||||
|
overflow: hidden; |
||||
|
/* 锁定页面滚动 */ |
||||
|
background-color: #ffffff; |
||||
|
padding: 20rpx 0rpx; |
||||
|
} |
||||
|
.header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 20rpx 30rpx; |
||||
|
background-color: #ffffff; |
||||
|
box-shadow: 0 2rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
.head-left { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.back-button { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
.header-center .title { |
||||
|
position: fixed; |
||||
|
top: 25rpx; |
||||
|
left: 50%; |
||||
|
transform: translateX(-50%); |
||||
|
font-size: 36rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333333; |
||||
|
} |
||||
|
.back-button:hover { |
||||
|
background-color: #e0e0e0; |
||||
|
} |
||||
|
|
||||
|
.back-button:active { |
||||
|
transform: scale(0.95); |
||||
|
} |
||||
|
|
||||
|
.back-icon { |
||||
|
font-size: 32rpx; |
||||
|
color: #333333; |
||||
|
margin-right: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.picture { |
||||
|
display: block; |
||||
|
margin: 200rpx auto 0; /* 图片水平居中 */ |
||||
|
width: 60%; |
||||
|
height: 600rpx; |
||||
|
} |
||||
|
.tip { |
||||
|
color: #999999; |
||||
|
font-size: 28rpx; |
||||
|
text-align: center; |
||||
|
margin-top: 20rpx; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,100 @@ |
|||||
|
<template> |
||||
|
|
||||
|
<view class="blank-page"> |
||||
|
<view class="header" :style="{ paddingTop: safeAreaInsets?.top + 'px' }"> |
||||
|
<!-- 返回按钮 --> |
||||
|
<view class="head-left"> |
||||
|
<image class="back-button" @click="goBack" src="/static/icons/Left_(左).png"> |
||||
|
|
||||
|
|
||||
|
<!-- <text class="tip">当前特斯拉该如何布局?</text> --> |
||||
|
</image> |
||||
|
</view> |
||||
|
<view class="header-center"> |
||||
|
<text class="title" :style="{ paddingTop: safeAreaInsets?.top + 'px' }" |
||||
|
>消息推送通知</text |
||||
|
> |
||||
|
</view> |
||||
|
</view> |
||||
|
<image class="picture" src="/static/images/缺省.png" /> |
||||
|
<text class="tip">暂无内容~</text> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
// 返回到 deepMate 页面 |
||||
|
const goBack = () => { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepMate/deepMate' |
||||
|
}); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.blank-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
position: fixed; |
||||
|
/* 充满视口,彻底禁用页面滚动 */ |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
height: 100vh; |
||||
|
overflow: hidden; |
||||
|
/* 锁定页面滚动 */ |
||||
|
background-color: #ffffff; |
||||
|
padding: 20rpx 0rpx; |
||||
|
} |
||||
|
.header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 20rpx 30rpx; |
||||
|
background-color: #ffffff; |
||||
|
box-shadow: 0 2rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
.head-left { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.back-button { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
.header-center .title { |
||||
|
position: fixed; |
||||
|
top: 25rpx; |
||||
|
left: 50%; |
||||
|
transform: translateX(-50%); |
||||
|
font-size: 36rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333333; |
||||
|
} |
||||
|
.back-button:hover { |
||||
|
background-color: #e0e0e0; |
||||
|
} |
||||
|
|
||||
|
.back-button:active { |
||||
|
transform: scale(0.95); |
||||
|
} |
||||
|
|
||||
|
.back-icon { |
||||
|
font-size: 32rpx; |
||||
|
color: #333333; |
||||
|
margin-right: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.picture { |
||||
|
display: block; |
||||
|
margin: 200rpx auto 0; /* 图片水平居中 */ |
||||
|
width: 60%; |
||||
|
height: 600rpx; |
||||
|
} |
||||
|
.tip { |
||||
|
color: #999999; |
||||
|
font-size: 28rpx; |
||||
|
text-align: center; |
||||
|
margin-top: 20rpx; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,736 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<!-- 顶部状态栏占位 --> |
||||
|
<view class="top" :style="{height:iSMT+'px'}"></view> |
||||
|
<deepExploration_header></deepExploration_header> |
||||
|
|
||||
|
<view class="search"> |
||||
|
<input v-model="stockName" class="searchInput" type="text" placeholder="请输入股票名称、股票代码" |
||||
|
placeholder-style="color: #A6A6A6; font-size: 22rpx;" /> |
||||
|
<image @click="searchStock" class="seachIcon" src="/static/deepExploration-images/search.png" |
||||
|
mode="aspectFill"></image> |
||||
|
</view> |
||||
|
|
||||
|
<view class="content"> |
||||
|
<view class="select"> |
||||
|
<image class="img" :src="navItems[currentIndex].icon" mode=""></image> |
||||
|
<view v-for="(item, index) in navItems" :key="index" class="selectItem" |
||||
|
:class="{ active: currentIndex === index }" @click="handleModel(index)"> |
||||
|
<button class="btn"></button> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="graphAndTxt"> |
||||
|
<view class="graph"> |
||||
|
<view class="graph_header"> |
||||
|
<view class="left">TESA</view> |
||||
|
<view class="center"> |
||||
|
<image class="last" src="/static/deepExploration-images/last.png" mode="aspectFill"></image> |
||||
|
<text>Taewlkj.sejssssssssf</text> |
||||
|
<image class="next" src="/static/deepExploration-images/next.png" mode="aspectFill"></image> |
||||
|
</view> |
||||
|
<view class="right">2025/10/26</view> |
||||
|
</view> |
||||
|
<view class="graph_data"> |
||||
|
<text>435.900</text> |
||||
|
<text>22.410</text> |
||||
|
<text>5.120%</text> |
||||
|
</view> |
||||
|
<view class="graph_content"> |
||||
|
<view class="charts-box"> |
||||
|
<!-- uCharts 蜡烛图组件 --> |
||||
|
<qiun-data-charts type="candle" :opts="opts" :chartData="chartData" :disableScroll="true" |
||||
|
:ontouch="true" :onzoom="true" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="txt"> |
||||
|
<view class="txtHeader"> |
||||
|
<image src="/static/deepExploration-images/plus.png" mode="aspectFill"></image> |
||||
|
<text>主力追踪</text> |
||||
|
</view> |
||||
|
<view class="txtContent"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部切换栏 --> |
||||
|
<footerBar class="static-footer" :type="type"></footerBar> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { |
||||
|
ref, |
||||
|
onMounted |
||||
|
} from 'vue' |
||||
|
import deepExploration_header from '@/components/deepExploration_header.vue' |
||||
|
import footerBar from '@/components/footerBar.vue' |
||||
|
import { |
||||
|
onLoad |
||||
|
} from '@dcloudio/uni-app' |
||||
|
|
||||
|
// 响应式变量定义 |
||||
|
const type = ref('deepExploration') |
||||
|
const iSMT = ref(0) |
||||
|
const currentIndex = ref(0) |
||||
|
const navItems = ref([{ |
||||
|
name: '主力追踪', |
||||
|
icon: '/static/deepExploration-images/1.png' |
||||
|
}, |
||||
|
{ |
||||
|
name: '主力雷达', |
||||
|
icon: '/static/deepExploration-images/2.png' |
||||
|
}, |
||||
|
{ |
||||
|
name: '主力解码', |
||||
|
icon: '/static/deepExploration-images/3.png' |
||||
|
}, |
||||
|
{ |
||||
|
name: '主力资金流', |
||||
|
icon: '/static/deepExploration-images/4.png' |
||||
|
}, |
||||
|
]) |
||||
|
|
||||
|
//点击四大模块 |
||||
|
const handleModel = (index) => { |
||||
|
currentIndex.value = index |
||||
|
if (currentIndex.value == 0) { |
||||
|
console.log(index); |
||||
|
handleTrack() |
||||
|
} else if (currentIndex.value == 1) { |
||||
|
console.log(index); |
||||
|
handleRadar() |
||||
|
} else if (currentIndex.value == 2) { |
||||
|
console.log(index); |
||||
|
handleDecode() |
||||
|
} else if (currentIndex.value == 3) { |
||||
|
console.log(index); |
||||
|
handleCapitalFlow() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//点击主力追踪 |
||||
|
const handleTrack = () => { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//点击主力雷达 |
||||
|
const handleRadar = () => { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//点击主力解码 |
||||
|
const handleDecode = () => { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//点击主力资金流 |
||||
|
const handleCapitalFlow = () => { |
||||
|
|
||||
|
} |
||||
|
const stockName = ref('TSLA') |
||||
|
//搜索股票 |
||||
|
const searchStock = () => { |
||||
|
console.log('搜索参数:', stockName.value); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// 1. K线图配置 |
||||
|
const opts = ref({ |
||||
|
rotate: false, |
||||
|
rotateLock: false, |
||||
|
color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"], |
||||
|
padding: [15, 15, 0, 15], |
||||
|
dataLabel: false, |
||||
|
enableScroll: true, |
||||
|
enableMarkLine: false, |
||||
|
legend: {}, |
||||
|
xAxis: { |
||||
|
labelCount: 4, |
||||
|
itemCount: 30, |
||||
|
disableGrid: true, |
||||
|
gridColor: "#CCCCCC", |
||||
|
gridType: "solid", |
||||
|
dashLength: 4, |
||||
|
scrollShow: false, |
||||
|
scrollAlign: "left", |
||||
|
scrollColor: "#A6A6A6", |
||||
|
scrollBackgroundColor: "#EFEBEF", |
||||
|
labelColor: "#8C8C8C", |
||||
|
fontSize: 9 |
||||
|
}, |
||||
|
yAxis: { |
||||
|
labelColor: "#8C8C8C", |
||||
|
fontSize: 9 |
||||
|
}, |
||||
|
extra: { |
||||
|
candle: { |
||||
|
color: { |
||||
|
upLine: "#f04864", |
||||
|
upFill: "#f04864", |
||||
|
downLine: "#2fc25b", |
||||
|
downFill: "#2fc25b" |
||||
|
}, |
||||
|
average: { |
||||
|
show: false, |
||||
|
name: ["MA5", "MA10", "MA30"], |
||||
|
day: [5, 10, 20], |
||||
|
color: ["#1890ff", "#2fc25b", "#facc14"] |
||||
|
} |
||||
|
}, |
||||
|
markLine: { |
||||
|
type: "dash", |
||||
|
dashLength: 5, |
||||
|
data: [{ |
||||
|
value: 2150, |
||||
|
lineColor: "#f04864", |
||||
|
showLabel: false |
||||
|
}, |
||||
|
{ |
||||
|
value: 2350, |
||||
|
lineColor: "#f04864", |
||||
|
showLabel: false |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
tooltip: { |
||||
|
showCategory: true |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 2. K线图数据(响应式定义) |
||||
|
const chartData = ref({}) |
||||
|
|
||||
|
// 获取K线数据函数(直接定义,无需methods) |
||||
|
const getServerData = () => { |
||||
|
// 模拟服务器请求延时 |
||||
|
setTimeout(() => { |
||||
|
const res = { |
||||
|
"categories": [ |
||||
|
"2025/08/25", |
||||
|
"2025/08/26", |
||||
|
"2025/08/27", |
||||
|
"2025/08/28", |
||||
|
"2025/08/29", |
||||
|
"2025/09/01", |
||||
|
"2025/09/02", |
||||
|
"2025/09/03", |
||||
|
"2025/09/04", |
||||
|
"2025/09/05", |
||||
|
"2025/09/08", |
||||
|
"2025/09/09", |
||||
|
"2025/09/10", |
||||
|
"2025/09/11", |
||||
|
"2025/09/12", |
||||
|
"2025/09/15", |
||||
|
"2025/09/16", |
||||
|
"2025/09/17", |
||||
|
"2025/09/18", |
||||
|
"2025/09/19", |
||||
|
"2025/09/22", |
||||
|
"2025/09/23", |
||||
|
"2025/09/24", |
||||
|
"2025/09/25", |
||||
|
"2025/09/26", |
||||
|
"2025/09/29", |
||||
|
"2025/09/30", |
||||
|
"2025/10/09", |
||||
|
"2025/10/10", |
||||
|
"2025/10/13", |
||||
|
"2025/10/14", |
||||
|
"2025/10/15", |
||||
|
"2025/10/16", |
||||
|
"2025/10/17", |
||||
|
"2025/10/20", |
||||
|
"2025/10/21", |
||||
|
"2025/10/22", |
||||
|
"2025/10/23", |
||||
|
"2025/10/24", |
||||
|
"2025/10/27" |
||||
|
], |
||||
|
series: [{ |
||||
|
"name": "贵州茅台", |
||||
|
"data": [ |
||||
|
[ |
||||
|
1470.01, |
||||
|
1496.0, |
||||
|
1466.0, |
||||
|
1499.33 |
||||
|
], |
||||
|
[ |
||||
|
1490.32, |
||||
|
1474.23, |
||||
|
1480.01, |
||||
|
1481.61 |
||||
|
], |
||||
|
[ |
||||
|
1481.88, |
||||
|
1484.93, |
||||
|
1448.0, |
||||
|
1448.0 |
||||
|
], |
||||
|
[ |
||||
|
1447.97, |
||||
|
1456.1, |
||||
|
1438.77, |
||||
|
1446.1 |
||||
|
], |
||||
|
[ |
||||
|
1453.0, |
||||
|
1482.58, |
||||
|
1452.0, |
||||
|
1480.0 |
||||
|
], |
||||
|
[ |
||||
|
1482.2, |
||||
|
1488.0, |
||||
|
1465.7, |
||||
|
1476.1 |
||||
|
], |
||||
|
[ |
||||
|
1478.66, |
||||
|
1509.0, |
||||
|
1478.0, |
||||
|
1491.3 |
||||
|
], |
||||
|
[ |
||||
|
1491.0, |
||||
|
1503.5, |
||||
|
1466.0, |
||||
|
1480.55 |
||||
|
], |
||||
|
[ |
||||
|
1472.0, |
||||
|
1479.3, |
||||
|
1460.47, |
||||
|
1480.66 |
||||
|
], |
||||
|
[ |
||||
|
1471.0, |
||||
|
1486.97, |
||||
|
1464.0, |
||||
|
1483.0 |
||||
|
], |
||||
|
[ |
||||
|
1483.0, |
||||
|
1506.44, |
||||
|
1477.5, |
||||
|
1501.23 |
||||
|
], |
||||
|
[ |
||||
|
1505.0, |
||||
|
1509.95, |
||||
|
1493.42, |
||||
|
1505.0 |
||||
|
], |
||||
|
[ |
||||
|
1506.66, |
||||
|
1529.95, |
||||
|
1496.0, |
||||
|
1522.01 |
||||
|
], |
||||
|
[ |
||||
|
1522.01, |
||||
|
1526.02, |
||||
|
1508.5, |
||||
|
1523.5 |
||||
|
], |
||||
|
[ |
||||
|
1526.0, |
||||
|
1538.02, |
||||
|
1510.53, |
||||
|
1516.0 |
||||
|
], |
||||
|
[ |
||||
|
1515.87, |
||||
|
1517.48, |
||||
|
1501.5, |
||||
|
1515.1 |
||||
|
], |
||||
|
[ |
||||
|
1515.1, |
||||
|
1520.99, |
||||
|
1496.21, |
||||
|
1499.98 |
||||
|
], |
||||
|
[ |
||||
|
1499.99, |
||||
|
1510.28, |
||||
|
1490.01, |
||||
|
1493.0 |
||||
|
], |
||||
|
[ |
||||
|
1492.0, |
||||
|
1497.8, |
||||
|
1463.5, |
||||
|
1467.96 |
||||
|
], |
||||
|
[ |
||||
|
1467.99, |
||||
|
1475.5, |
||||
|
1457.01, |
||||
|
1467.97 |
||||
|
], |
||||
|
[ |
||||
|
1465.09, |
||||
|
1467.97, |
||||
|
1450.01, |
||||
|
1453.35 |
||||
|
], |
||||
|
[ |
||||
|
1450.5, |
||||
|
1457.5, |
||||
|
1440.0, |
||||
|
1447.42 |
||||
|
], |
||||
|
[ |
||||
|
1434.07, |
||||
|
1456.78, |
||||
|
1434.07, |
||||
|
1442.0 |
||||
|
], |
||||
|
[ |
||||
|
1442.83, |
||||
|
1445.21, |
||||
|
1436.0, |
||||
|
1439.0 |
||||
|
], |
||||
|
[ |
||||
|
1441.18, |
||||
|
1447.11, |
||||
|
1428.01, |
||||
|
1435.0 |
||||
|
], |
||||
|
[ |
||||
|
1439.38, |
||||
|
1469.99, |
||||
|
1435.0, |
||||
|
1460.86 |
||||
|
], |
||||
|
[ |
||||
|
1460.0, |
||||
|
1460.76, |
||||
|
1440.0, |
||||
|
1443.99 |
||||
|
], |
||||
|
[ |
||||
|
1436.0, |
||||
|
1439.38, |
||||
|
1420.0, |
||||
|
1436.78 |
||||
|
], |
||||
|
[ |
||||
|
1437.6, |
||||
|
1439.94, |
||||
|
1427.5, |
||||
|
1430.0 |
||||
|
], |
||||
|
[ |
||||
|
1415.7, |
||||
|
1422.85, |
||||
|
1415.12, |
||||
|
1419.2 |
||||
|
], |
||||
|
[ |
||||
|
1429.99, |
||||
|
1464.0, |
||||
|
1429.99, |
||||
|
1451.02 |
||||
|
], |
||||
|
[ |
||||
|
1450.98, |
||||
|
1463.0, |
||||
|
1445.08, |
||||
|
1462.0 |
||||
|
], |
||||
|
[ |
||||
|
1461.92, |
||||
|
1484.95, |
||||
|
1458.88, |
||||
|
1484.91 |
||||
|
], |
||||
|
[ |
||||
|
1483.1, |
||||
|
1488.0, |
||||
|
1454.03, |
||||
|
1455.0 |
||||
|
], |
||||
|
[ |
||||
|
1455.0, |
||||
|
1469.5, |
||||
|
1454.88, |
||||
|
1457.93 |
||||
|
], |
||||
|
[ |
||||
|
1459.0, |
||||
|
1469.94, |
||||
|
1455.5, |
||||
|
1462.26 |
||||
|
], |
||||
|
[ |
||||
|
1462.08, |
||||
|
1465.73, |
||||
|
1456.0, |
||||
|
1458.7 |
||||
|
], |
||||
|
[ |
||||
|
1455.0, |
||||
|
1468.8, |
||||
|
1447.2, |
||||
|
1467.98 |
||||
|
], |
||||
|
[ |
||||
|
1467.95, |
||||
|
1478.88, |
||||
|
1449.34, |
||||
|
1450.0 |
||||
|
], |
||||
|
[ |
||||
|
1440.0, |
||||
|
1452.49, |
||||
|
1435.99, |
||||
|
1440.41 |
||||
|
] |
||||
|
], |
||||
|
}] |
||||
|
} |
||||
|
// 给响应式变量赋值(需修改.value) |
||||
|
chartData.value = JSON.parse(JSON.stringify(res)) |
||||
|
}, 500) |
||||
|
} |
||||
|
|
||||
|
// 生命周期钩子:组件挂载后执行(替代onReady) |
||||
|
onMounted(() => { |
||||
|
iSMT.value = uni.getSystemInfoSync().statusBarHeight |
||||
|
getServerData() // 调用数据获取函数 |
||||
|
}) |
||||
|
|
||||
|
// 页面加载时执行 |
||||
|
onLoad((e) => { |
||||
|
if (e.index) { |
||||
|
currentIndex.value = e.index - 1 |
||||
|
console.log('模块:', currentIndex.value) |
||||
|
} |
||||
|
if (e.stockName) { |
||||
|
stockName.value = e.stockName |
||||
|
console.log('股票名称:', stockName.value) |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
.main { |
||||
|
width: 100%; |
||||
|
height: 100vh; |
||||
|
background-color: #fff; |
||||
|
|
||||
|
.search { |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
background-color: #F3F3F3; |
||||
|
width: calc(100% - 60rpx); |
||||
|
height: 80rpx; |
||||
|
border-radius: 50rpx; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
padding: 0 40rpx; |
||||
|
margin: 15rpx 30rpx 0 30rpx; |
||||
|
|
||||
|
.seachIcon { |
||||
|
position: absolute; |
||||
|
right: 50rpx; |
||||
|
width: 32rpx; |
||||
|
height: 32rpx; |
||||
|
} |
||||
|
|
||||
|
.searchInput { |
||||
|
color: #111; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.content { |
||||
|
margin-top: 30rpx; |
||||
|
padding-top: 30rpx; |
||||
|
background-color: rgb(248, 248, 248); |
||||
|
|
||||
|
.select { |
||||
|
position: relative; |
||||
|
margin-bottom: -5rpx; |
||||
|
|
||||
|
.img { |
||||
|
width: 750rpx; |
||||
|
height: 198rpx; |
||||
|
} |
||||
|
|
||||
|
.selectItem { |
||||
|
.btn { |
||||
|
position: absolute; |
||||
|
width: 120rpx; |
||||
|
height: 150rpx; |
||||
|
background-color: transparent; |
||||
|
|
||||
|
&::after { |
||||
|
border: none; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
&:nth-of-type(1) .btn { |
||||
|
top: 30rpx; |
||||
|
left: 60rpx; |
||||
|
} |
||||
|
|
||||
|
&:nth-of-type(2) .btn { |
||||
|
top: 30rpx; |
||||
|
left: 230rpx; |
||||
|
} |
||||
|
|
||||
|
&:nth-of-type(3) .btn { |
||||
|
top: 30rpx; |
||||
|
left: 400rpx; |
||||
|
} |
||||
|
|
||||
|
&:nth-of-type(4) .btn { |
||||
|
top: 30rpx; |
||||
|
left: 570rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.graphAndTxt { |
||||
|
height: 300rpx; |
||||
|
background-color: #fff; |
||||
|
border-radius: 50rpx 50rpx 0 0; |
||||
|
padding: 68.6rpx 36.5rpx 0 36.5rpx; |
||||
|
|
||||
|
.graph { |
||||
|
border: 1rpx solid #e2e2e2; |
||||
|
border-radius: 30rpx 30rpx 0 0; |
||||
|
|
||||
|
.graph_header { |
||||
|
padding: 32rpx 20.5rpx 0 24rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
|
||||
|
.left { |
||||
|
color: #333333; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 15px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 15px; |
||||
|
} |
||||
|
|
||||
|
.center { |
||||
|
margin-left: 105rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
|
||||
|
text { |
||||
|
width: 160rpx; |
||||
|
height: 36rpx; |
||||
|
padding-left: 10rpx; |
||||
|
color: #000000; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
text-align: center; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 18px; |
||||
|
font-style: normal; |
||||
|
font-weight: 500; |
||||
|
line-height: 18px; |
||||
|
} |
||||
|
|
||||
|
.last { |
||||
|
width: 15rpx; |
||||
|
height: 20rpx; |
||||
|
margin-right: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.next { |
||||
|
width: 15rpx; |
||||
|
height: 20rpx; |
||||
|
margin-left: 30rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.right { |
||||
|
margin-left: 50rpx; |
||||
|
color: #6a6a6a; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 13px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 15px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.graph_data { |
||||
|
display: flex; |
||||
|
padding: 48rpx 24rpx; |
||||
|
|
||||
|
text { |
||||
|
display: flex; |
||||
|
color: #25ba5d; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 17px; |
||||
|
line-height: 17px; |
||||
|
} |
||||
|
|
||||
|
text:nth-child(2) { |
||||
|
margin-left: 120rpx; |
||||
|
} |
||||
|
|
||||
|
text:nth-child(3) { |
||||
|
margin-left: 150rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.graph_content { |
||||
|
.charts-box { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.txt { |
||||
|
background-color: #F3F3F3; |
||||
|
margin-top: 48rpx; |
||||
|
border-radius: 30rpx; |
||||
|
|
||||
|
.txtHeader { |
||||
|
padding: 30rpx 24rpx; |
||||
|
|
||||
|
image { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
} |
||||
|
|
||||
|
text { |
||||
|
background-color: #FFFFFF; |
||||
|
color: #000000; |
||||
|
padding: 0 22rpx; |
||||
|
border-radius: 22rpx; |
||||
|
font-size: 28rpx; |
||||
|
font-weight: 400; |
||||
|
line-height: 37rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.txtContent { |
||||
|
min-height: 200rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
width: 100%; |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,354 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<view class="table"> |
||||
|
<view class="tableHeader"> |
||||
|
<scroll-view class="tabs" scroll-x="true"> |
||||
|
<view v-for="(item,index) in tabsData" :key="index" class="tabItem" @click="handleTab(item)"> |
||||
|
{{item}} |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
<view class="tableContent"> |
||||
|
<image class="showAll" src="/static/deepExploration-images/showAll.png" mode="aspectFill"></image> |
||||
|
<scroll-view scroll-x="true" show-scrollbar="false"> |
||||
|
<view class="tableBox"> |
||||
|
<view class="box_header"> |
||||
|
<view class="name">名称</view> |
||||
|
<view class="other" v-for="(item,index) in tableContentHeaderData" :key="index"> |
||||
|
<text>{{item}}</text> |
||||
|
<image v-show="ifASC" src="/static/deepExploration-images/ASC.png" mode="aspectFill"> |
||||
|
</image> |
||||
|
<image v-show="!ifASC" src="/static/deepExploration-images/DESC.png" mode="aspectFill"> |
||||
|
</image> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="box_content"> |
||||
|
<view class="row" v-for="(item,index) in fakeData" :key="index" :class="{ 'increase-positive': item.increase.startsWith('+'), |
||||
|
'increase-negative': item.increase.startsWith('-')}"> |
||||
|
<view class="name_colum"> |
||||
|
<text class="stockName">{{item.name}}</text> |
||||
|
<text class="stockCode">{{item.stockCode}}</text> |
||||
|
</view> |
||||
|
<view class="other_colum">{{item.latest}}</view> |
||||
|
<view class="other_colum">{{item.increase}}</view> |
||||
|
<view class="other_colum">{{item.decrease}}</view> |
||||
|
<view class="other_colum">{{item.previousClose}}</view> |
||||
|
<view class="other_colum">{{item.volume}}</view> |
||||
|
<view class="other_colum">{{item.turnover}}</view> |
||||
|
<view class="other_colum">{{item.openingPrice}}</view> |
||||
|
<view class="other_colum">{{item.highestPrice}}</view> |
||||
|
<view class="other_colum">{{item.lowestPrice}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { |
||||
|
ref |
||||
|
} from 'vue' |
||||
|
|
||||
|
const tabsData = ref(['全部', '抄底卖顶', '波段行情', '价值投资', '资金及仓位管理', '价值投资', '价值投资', '价值投资', ]) |
||||
|
const handleTab = (item) => { |
||||
|
uni.showToast({ |
||||
|
title: `查看 ${item} 详情`, |
||||
|
icon: 'none', |
||||
|
duration: 2000 |
||||
|
}) |
||||
|
} |
||||
|
//表头是否升序 |
||||
|
const ifASC = ref(true) |
||||
|
//表头数据 |
||||
|
const tableContentHeaderData = ref(['最新', '涨幅', '跌幅', '昨收', '成交量', '成交额', '开盘价', '最高价', '最低价']) |
||||
|
const fakeData = [{ |
||||
|
name: "TechCore", |
||||
|
stockCode: "600001", |
||||
|
latest: 1315.00, |
||||
|
increase: "+5.2%", |
||||
|
decrease: "+5.2%", |
||||
|
previousClose: 1250.00, |
||||
|
volume: 12000, |
||||
|
turnover: "15780K", |
||||
|
openingPrice: 1237.50, |
||||
|
highestPrice: 1320.00, |
||||
|
lowestPrice: 1230.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "MediaLink", |
||||
|
stockCode: "600002", |
||||
|
latest: 1138.70, |
||||
|
increase: "-3.5%", |
||||
|
decrease: "-3.5%", |
||||
|
previousClose: 1180.00, |
||||
|
volume: 8500, |
||||
|
turnover: "967.9K", |
||||
|
openingPrice: 1191.80, |
||||
|
highestPrice: 1195.00, |
||||
|
lowestPrice: 1130.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "FinServ", |
||||
|
stockCode: "600003", |
||||
|
latest: 1413.72, |
||||
|
increase: "+7.1%", |
||||
|
decrease: "+7.1%", |
||||
|
previousClose: 1320.00, |
||||
|
volume: 15000, |
||||
|
turnover: "2120.6K", |
||||
|
openingPrice: 1293.60, |
||||
|
highestPrice: 1420.00, |
||||
|
lowestPrice: 1290.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "AutoDrive", |
||||
|
stockCode: "600004", |
||||
|
latest: 1080.40, |
||||
|
increase: "+2.8%", |
||||
|
decrease: "+2.8%", |
||||
|
previousClose: 1050.00, |
||||
|
volume: 9000, |
||||
|
turnover: "972.4K", |
||||
|
openingPrice: 1055.25, |
||||
|
highestPrice: 1085.00, |
||||
|
lowestPrice: 1050.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "EduSmart", |
||||
|
stockCode: "600005", |
||||
|
latest: 968.24, |
||||
|
increase: "-1.2%", |
||||
|
decrease: "-1.2%", |
||||
|
previousClose: 980.00, |
||||
|
volume: 7000, |
||||
|
turnover: "677.8K", |
||||
|
openingPrice: 975.10, |
||||
|
highestPrice: 978.00, |
||||
|
lowestPrice: 965.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "HealthPlusqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", |
||||
|
stockCode: "600006", |
||||
|
latest: 1463.00, |
||||
|
increase: "+4.5%", |
||||
|
decrease: "+4.5%", |
||||
|
previousClose: 1400.00, |
||||
|
volume: 13000, |
||||
|
turnover: "1901.9K", |
||||
|
openingPrice: 1393.00, |
||||
|
highestPrice: 1470.00, |
||||
|
lowestPrice: 1385.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "AgriTech", |
||||
|
stockCode: "600007", |
||||
|
latest: 1038.36, |
||||
|
increase: "+1.8%", |
||||
|
decrease: "+1.8%", |
||||
|
previousClose: 1020.00, |
||||
|
volume: 6500, |
||||
|
turnover: "674.9K", |
||||
|
openingPrice: 1028.16, |
||||
|
highestPrice: 1040.00, |
||||
|
lowestPrice: 1025.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "LogiFlow", |
||||
|
stockCode: "600008", |
||||
|
latest: 1094.24, |
||||
|
increase: "-2.3%", |
||||
|
decrease: "-2.3%", |
||||
|
previousClose: 1120.00, |
||||
|
volume: 8000, |
||||
|
turnover: "875.4K", |
||||
|
openingPrice: 1122.24, |
||||
|
highestPrice: 1125.00, |
||||
|
lowestPrice: 1090.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "EnergySol", |
||||
|
stockCode: "600009", |
||||
|
latest: 1435.05, |
||||
|
increase: "+6.3%", |
||||
|
decrease: "+6.3%", |
||||
|
previousClose: 1350.00, |
||||
|
volume: 14000, |
||||
|
turnover: "2009.1K", |
||||
|
openingPrice: 1339.75, |
||||
|
highestPrice: 1440.00, |
||||
|
lowestPrice: 1335.00 |
||||
|
}, |
||||
|
{ |
||||
|
name: "RealEstate", |
||||
|
stockCode: "600010", |
||||
|
latest: 995.00, |
||||
|
increase: "-0.5%", |
||||
|
decrease: "-0.5%", |
||||
|
previousClose: 1000.00, |
||||
|
volume: 7500, |
||||
|
turnover: "746.3K", |
||||
|
openingPrice: 1003.00, |
||||
|
highestPrice: 1005.00, |
||||
|
lowestPrice: 990.00 |
||||
|
} |
||||
|
]; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
.main { |
||||
|
width: 100%; |
||||
|
height: 100vh; |
||||
|
background-color: #fff; |
||||
|
|
||||
|
|
||||
|
.table { |
||||
|
margin-top: 10rpx; |
||||
|
box-shadow: 0 -2rpx 3rpx -1rpx rgba(0, 0, 0, 0.5); |
||||
|
|
||||
|
.tableHeader { |
||||
|
.tabs { |
||||
|
white-space: nowrap; |
||||
|
padding-top: 20rpx; |
||||
|
padding-left: 40rpx; |
||||
|
|
||||
|
::-webkit-scrollbar { |
||||
|
//隐藏 滚动条 |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
.tabItem { |
||||
|
display: inline-block; |
||||
|
color: rgb(175, 175, 175); |
||||
|
border-radius: 10rpx; |
||||
|
padding: 5rpx 30rpx; |
||||
|
margin-right: 20rpx; |
||||
|
font-size: 28rpx; |
||||
|
background-color: rgb(243, 243, 243); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.tableContent { |
||||
|
width: 100%; |
||||
|
|
||||
|
position: relative; |
||||
|
|
||||
|
.showAll { |
||||
|
position: absolute; |
||||
|
top: 35rpx; |
||||
|
right: 20rpx; |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
z-index: 100; |
||||
|
} |
||||
|
|
||||
|
scroll-view { |
||||
|
width: 100%; |
||||
|
white-space: nowrap; |
||||
|
|
||||
|
::-webkit-scrollbar { |
||||
|
//隐藏 滚动条 |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.tableBox { |
||||
|
padding-left: 40rpx; |
||||
|
|
||||
|
.box_header { |
||||
|
margin-bottom: 19rpx; |
||||
|
display: flex; |
||||
|
width: max-content; |
||||
|
margin-top: 40rpx; |
||||
|
color: rgb(109, 109, 109); |
||||
|
border-radius: 10rpx; |
||||
|
margin-right: 20rpx; |
||||
|
font-size: 23rpx; |
||||
|
|
||||
|
|
||||
|
.name { |
||||
|
flex: 0 0 375rpx; |
||||
|
} |
||||
|
|
||||
|
.other { |
||||
|
flex: 0 0 195rpx; |
||||
|
|
||||
|
text { |
||||
|
margin-right: 5rpx; |
||||
|
} |
||||
|
|
||||
|
image { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.box_content { |
||||
|
width: max-content; |
||||
|
|
||||
|
.row { |
||||
|
padding: 5rpx; |
||||
|
display: flex; |
||||
|
border-top: 1rpx dashed #eee; |
||||
|
width: 210%; |
||||
|
|
||||
|
&.increase-positive { |
||||
|
.other_colum { |
||||
|
color: #2DD357; |
||||
|
font-weight: 200; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
&.increase-negative { |
||||
|
.other_colum { |
||||
|
color: #FF4150; |
||||
|
font-weight: 200; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.name_colum { |
||||
|
flex: 0 0 375rpx; |
||||
|
|
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 4rpx; |
||||
|
|
||||
|
.stockName { |
||||
|
color: #333333; |
||||
|
width: 100%; |
||||
|
max-width: 305rpx; |
||||
|
font-size: 28rpx; |
||||
|
font-weight: 400; |
||||
|
line-height: 36rpx; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
} |
||||
|
|
||||
|
.stockCode { |
||||
|
color: #c5c5c5; |
||||
|
; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 400; |
||||
|
line-height: 30rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.other_colum { |
||||
|
flex: 0 0 195rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -1,63 +1,427 @@ |
|||||
<template> |
<template> |
||||
|
<view class="main"> |
||||
|
<!-- 顶部状态栏占位 --> |
||||
|
<view class="top" :style="{height:iSMT+'px'}"></view> |
||||
|
<!-- 标题图标部分 --> |
||||
|
<deepExploration_header></deepExploration_header> |
||||
|
<view class="search"> |
||||
|
<input v-model="stockName" class="searchInput" type="text" placeholder="请输入股票名称、股票代码" |
||||
|
placeholder-style="color: #A6A6A6; font-size: 22rpx;" /> |
||||
|
<image @click="searchStock" class="seachIcon" src="/static/deepExploration-images/search.png" |
||||
|
mode="aspectFill"></image> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 四大功能模块 --> |
||||
|
<view class="select"> |
||||
|
<view class="selectItem" @click="toMain('主力追踪')"> |
||||
|
<image class="img" src="/static/deepExploration-images/icon3.png" mode="aspectFill"></image> |
||||
|
<view class="txt">主力追踪</view> |
||||
|
</view> |
||||
|
<view class="selectItem" @click="toMain('主力雷达')"> |
||||
|
<image class="img" src="/static/deepExploration-images/icon2.png" mode="aspectFill"></image> |
||||
|
<view class="txt">主力雷达</view> |
||||
|
</view> |
||||
|
<view class="selectItem" @click="toMain('主力解码')"> |
||||
|
<image class="img" src="/static/deepExploration-images/icon1.png" mode="aspectFill"></image> |
||||
|
<view class="txt">主力解码</view> |
||||
|
</view> |
||||
|
<view class="selectItem" @click="toMain('主力资金流')"> |
||||
|
<image class="img" src="/static/deepExploration-images/icon4.png" mode="aspectFill"></image> |
||||
|
<view class="txt">主力资金流</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 灰色间隔 --> |
||||
|
<view class="gap"></view> |
||||
|
<!-- 选股策略 --> |
||||
|
<view class="stockSelection"> |
||||
|
<view class="stockSelection_top"> |
||||
|
<view class="txt"> |
||||
|
<text>选股策略</text> |
||||
|
</view> |
||||
|
<view class="viewAll" @click='viewAll'> |
||||
|
<text>查看全部</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="stockSelection_content"> |
||||
|
<view class="selectionItem"> |
||||
|
<view class="header"> |
||||
|
<view class="left"> |
||||
|
<image src="/static/deepExploration-images/plus.png" mode="aspectFill"></image> |
||||
|
<text>抄底卖顶</text> |
||||
|
</view> |
||||
|
<view class="right"> |
||||
|
<image src="/static/deepExploration-images/Americle.png" mode="aspectFill"></image> |
||||
|
<text>美股</text> |
||||
|
</view> |
||||
|
|
||||
|
</view> |
||||
<view class="content"> |
<view class="content"> |
||||
<view class="text-area"> </view> |
|
||||
<LoginPrompt ref="loginPrompt"></LoginPrompt> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
|
|
||||
<button @click="showLoginPrompt">deepMate</button> |
|
||||
<text class="title" @click="showLoginPrompt">{{ title }}</text> |
|
||||
|
<view class="contentTitle"> |
||||
|
<view class="contentTitle_name">股票名称</view> |
||||
|
<view class="contentTitle_close">最新收盘价</view> |
||||
|
<view class="contentTitle_price">选股价格</view> |
||||
|
</view> |
||||
|
<view class="contentItem"> |
||||
|
<view class="row" v-for="(item,index) in stockData" :key="index"> |
||||
|
<view class="nameItem">{{item.name}}</view> |
||||
|
<view class="closeItem">{{item.close}}</view> |
||||
|
<view class="priceItem">{{item.select}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="stockSelection_content"> |
||||
|
<view class="selectionItem"> |
||||
|
<view class="header"> |
||||
|
<view class="left"> |
||||
|
<image src="/static/deepExploration-images/plus.png" mode="aspectFill"></image> |
||||
|
<text>抄底卖顶</text> |
||||
|
</view> |
||||
|
<view class="right"> |
||||
|
<image src="/static/deepExploration-images/Americle.png" mode="aspectFill"></image> |
||||
|
<text>美股</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="content"> |
||||
|
<view class="contentTitle"> |
||||
|
<view class="contentTitle_name">股票名称</view> |
||||
|
<view class="contentTitle_close">最新收盘价</view> |
||||
|
<view class="contentTitle_price">选股价格</view> |
||||
|
</view> |
||||
|
<view class="contentItem"> |
||||
|
<view class="row" v-for="(item,index) in stockData" :key="index"> |
||||
|
<view class="nameItem">{{item.name}}</view> |
||||
|
<view class="closeItem">{{item.close}}</view> |
||||
|
<view class="priceItem">{{item.select}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<footerBar class="static-footer" :type="type"></footerBar> |
||||
</view> |
</view> |
||||
</template> |
</template> |
||||
|
|
||||
<script setup> |
<script setup> |
||||
import { ref } from "vue"; |
|
||||
import { useUserStore } from "../../stores/modules/userInfo"; |
|
||||
const title = ref("请先登录"); |
|
||||
const loginPrompt = ref(null); |
|
||||
|
import { |
||||
|
ref, |
||||
|
onMounted |
||||
|
} from 'vue' |
||||
|
import footerBar from '@/components/footerBar.vue' |
||||
|
import deepExploration_header from '@/components/deepExploration_header.vue' |
||||
|
|
||||
|
const type = ref('deepExploration') |
||||
|
const iSMT = ref(0) |
||||
|
|
||||
|
//查看全部选股策略 |
||||
|
const toMain = (val) => { |
||||
|
if (val == '主力追踪') { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepExploration/MainForceActions?index=1' |
||||
|
}) |
||||
|
} else if (val == '主力雷达') { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepExploration/MainForceActions?index=2' |
||||
|
}) |
||||
|
} else if (val == '主力解码') { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepExploration/MainForceActions?index=3' |
||||
|
}) |
||||
|
} else if (val == '主力资金流') { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/deepExploration/MainForceActions?index=4' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
const userStore = useUserStore(); |
|
||||
function showLoginPrompt() { |
|
||||
userStore.clearUserInfo(); |
|
||||
} |
|
||||
|
} |
||||
|
|
||||
console.log(userStore.userInfo); |
|
||||
|
const stockName = ref('') |
||||
|
//搜索股票 |
||||
|
const searchStock = () => { |
||||
|
console.log('搜索参数:', stockName.value); |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages/deepExploration/MainForceActions?stockName=${stockName.value}` |
||||
|
}) |
||||
|
} |
||||
|
|
||||
function toDeepMate() { |
|
||||
|
//查看全部选股策略 |
||||
|
const viewAll = () => { |
||||
uni.navigateTo({ |
uni.navigateTo({ |
||||
url: "/pages/deepMate/deepMate", |
|
||||
}); |
|
||||
} |
|
||||
|
url: '/pages/deepExploration/stockSelectDetail' |
||||
|
}) |
||||
|
} |
||||
|
//选股策略数据 |
||||
|
const stockData = [{ |
||||
|
name: "(MKTW)MarketWise Inc", |
||||
|
close: "$14.190", |
||||
|
select: "$13.180" |
||||
|
}, |
||||
|
{ |
||||
|
name: "(MTCH)Match Group Inc", |
||||
|
close: "$32.120", |
||||
|
select: "$28.120" |
||||
|
}, |
||||
|
{ |
||||
|
name: "(MKTW)MarketWise Inc", |
||||
|
close: "$14.190", |
||||
|
select: "$13.180" |
||||
|
} |
||||
|
]; |
||||
|
onMounted(() => { |
||||
|
// 状态栏高度 |
||||
|
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
||||
|
}) |
||||
</script> |
</script> |
||||
|
|
||||
<style> |
|
||||
.content { |
|
||||
|
<style scoped lang="scss"> |
||||
|
.main { |
||||
|
width: 100%; |
||||
|
height: 100vh; |
||||
|
background-color: #fff; |
||||
|
|
||||
|
.search { |
||||
|
position: relative; |
||||
display: flex; |
display: flex; |
||||
flex-direction: column; |
|
||||
align-items: center; |
align-items: center; |
||||
|
background-color: #F3F3F3; |
||||
|
width: calc(100% - 60rpx); |
||||
|
height: 80rpx; |
||||
|
border-radius: 50rpx; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
padding: 0 40rpx; |
||||
|
margin: 15rpx 30rpx 0 30rpx; |
||||
|
|
||||
|
.seachIcon { |
||||
|
position: absolute; |
||||
|
right: 50rpx; |
||||
|
width: 32rpx; |
||||
|
height: 32rpx; |
||||
|
} |
||||
|
|
||||
|
.searchInput { |
||||
|
color: #111; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.select { |
||||
|
display: flex; |
||||
|
padding: 60rpx 10rpx 30rpx 30rpx; |
||||
|
gap: 70rpx; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
|
||||
|
.selectItem { |
||||
|
.img { |
||||
|
width: 80rpx; |
||||
|
height: 80rpx; |
||||
|
display: block; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
|
||||
|
.txt { |
||||
|
color: #6a6a6a; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 11px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 14.5px; |
||||
|
margin-top: 13rpx; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.gap { |
||||
|
width: 100%; |
||||
|
height: 15rpx; |
||||
|
background-color: #F3F3F3; |
||||
|
} |
||||
|
|
||||
|
.stockSelection { |
||||
|
width: 100%; |
||||
|
padding: 32rpx 15rpx; |
||||
|
|
||||
|
.stockSelection_top { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
|
||||
|
.txt { |
||||
|
color: #000000; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 38rpx; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 50rpx; |
||||
|
} |
||||
|
|
||||
|
.viewAll { |
||||
|
background-color: #000000; |
||||
|
border-radius: 10rpx; |
||||
|
padding: 6rpx 20rpx; |
||||
|
color: #ffffff; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 10rpx; |
||||
|
font-style: normal; |
||||
|
font-weight: 100; |
||||
|
line-height: 29rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.stockSelection_content { |
||||
|
.selectionItem { |
||||
|
background-color: #F3F3F3; |
||||
|
padding: 30rpx 15rpx 17rpx 30rpx; |
||||
|
border-radius: 30rpx; |
||||
|
margin-top: 30rpx; |
||||
|
|
||||
|
.header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
|
||||
|
.left { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
|
||||
|
image { |
||||
|
display: flex; |
||||
justify-content: center; |
justify-content: center; |
||||
} |
|
||||
|
align-items: center; |
||||
|
width: 15rpx; |
||||
|
height: 15rpx; |
||||
|
} |
||||
|
|
||||
|
text { |
||||
|
margin-left: 15rpx; |
||||
|
color: #000000; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 28rpx; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 18.5px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
.logo { |
|
||||
height: 200rpx; |
|
||||
width: 200rpx; |
|
||||
margin-top: 200rpx; |
|
||||
margin-left: auto; |
|
||||
margin-right: auto; |
|
||||
margin-bottom: 50rpx; |
|
||||
} |
|
||||
|
.right { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
border-radius: 15rpx; |
||||
|
background-color: #FFFFFF; |
||||
|
padding: 6rpx 20rpx; |
||||
|
|
||||
.text-area { |
|
||||
|
image { |
||||
display: flex; |
display: flex; |
||||
justify-content: center; |
justify-content: center; |
||||
} |
|
||||
|
align-items: center; |
||||
|
width: 40rpx; |
||||
|
height: 26.5rpx; |
||||
|
} |
||||
|
|
||||
|
text { |
||||
|
margin-left: 10rpx; |
||||
|
color: #6a6a6a; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 18rpx; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 24rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.content { |
||||
|
.contentTitle { |
||||
|
display: flex; |
||||
|
color: #6a6a6a; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 11px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 14.5px; |
||||
|
margin-top: 24rpx; |
||||
|
margin-bottom: 20rpx; |
||||
|
|
||||
|
.contentTitle_name { |
||||
|
width: 100rpx; |
||||
|
} |
||||
|
|
||||
|
.contentTitle_close { |
||||
|
width: 130rpx; |
||||
|
margin-left: 260rpx; |
||||
|
} |
||||
|
|
||||
|
.contentTitle_price { |
||||
|
width: 120rpx; |
||||
|
margin-left: 60rpx; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.contentItem { |
||||
|
.row { |
||||
|
display: flex; |
||||
|
box-shadow: 0 -2rpx 5rpx rgba(0, 0, 0, 0.05); |
||||
|
padding: 10rpx 0; |
||||
|
margin-bottom: 10rpx; |
||||
|
|
||||
|
.nameItem { |
||||
|
width: 260rpx; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
color: #000000; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 13px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 17.5px; |
||||
|
} |
||||
|
|
||||
|
.closeItem { |
||||
|
width: 120rpx; |
||||
|
margin-left: 100rpx; |
||||
|
color: #25ba5d; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 13px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 17.5px; |
||||
|
} |
||||
|
|
||||
|
.priceItem { |
||||
|
width: 120rpx; |
||||
|
margin-left: 73rpx; |
||||
|
color: #25ba5d; |
||||
|
font-family: "PingFang SC"; |
||||
|
font-size: 13px; |
||||
|
font-style: normal; |
||||
|
font-weight: 400; |
||||
|
line-height: 17.5px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
.title { |
|
||||
font-size: 36rpx; |
|
||||
color: #8f8f94; |
|
||||
} |
|
||||
|
* { |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
</style> |
</style> |
||||
@ -1,579 +0,0 @@ |
|||||
<!-- @format --> |
|
||||
|
|
||||
<template> |
|
||||
<view class="main"> |
|
||||
<!-- 固定头部 --> |
|
||||
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
|
||||
<view class="header_content"> |
|
||||
<view class="header_back" @click="goBack"> |
|
||||
<image src="/static/marketSituation-image/back.png" mode=""></image> |
|
||||
</view> |
|
||||
<view class="header_input_wrapper"> |
|
||||
<image class="search_icon" src="/static/marketSituation-image/search.png" mode="" @click="onSearchClick"></image> |
|
||||
<input class="header_input" type="text" placeholder="搜索" placeholder-style="color: #A6A6A6; font-size: 22rpx;" v-model="searchValue" @input="onSearchInput" @confirm="onSearchConfirm" /> |
|
||||
</view> |
|
||||
<view class="header_icons"> |
|
||||
<view class="header_icon" @click="selected"> |
|
||||
<image src="/static/marketSituation-image/mySeclected.png" mode=""></image> |
|
||||
</view> |
|
||||
<view class="header_icon" @click="history"> |
|
||||
<image src="/static/marketSituation-image/history.png" mode=""></image> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="warn"> |
|
||||
<image src="/static/marketSituation-image/warn.png" mode="aspectFit"></image> |
|
||||
<view class="warn_text_container"> |
|
||||
<text :class="warnTextClass">{{ $t("marketSituation.warn") }}</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 内容区域 --> |
|
||||
<scroll-view class="content" :style="{ top: contentTopPosition + 'px' }" scroll-y="true"> |
|
||||
<!-- 亚太-中华 --> |
|
||||
<view class="market-section"> |
|
||||
<view class="market-header"> |
|
||||
<text class="market-title">亚太-中华</text> |
|
||||
<view class="market-more" @click="viewMore('asia-china')"> |
|
||||
<text class="more-text">查看更多</text> |
|
||||
<text class="more-arrow">></text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="cards-grid-three"> |
|
||||
<view v-for="(item, index) in asiachinaIndexes" :key="index" class="card-item"> |
|
||||
<IndexCard :flagIcon="item.flagIcon" :stockName="item.stockName" :currentPrice="item.currentPrice" :changeAmount="item.changeAmount" :changePercent="item.changePercent" :isRising="item.isRising" @click="viewIndexDetail(item)" /> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 亚太 --> |
|
||||
<view class="market-section"> |
|
||||
<view class="market-header"> |
|
||||
<text class="market-title">亚太</text> |
|
||||
<view class="market-more" @click="viewMore('asia')"> |
|
||||
<text class="more-text">查看更多</text> |
|
||||
<text class="more-arrow">></text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="cards-grid-three"> |
|
||||
<view v-for="(item, index) in asiaIndexes" :key="index" class="card-item"> |
|
||||
<IndexCard :flagIcon="item.flagIcon" :stockName="item.stockName" :currentPrice="item.currentPrice" :changeAmount="item.changeAmount" :changePercent="item.changePercent" :isRising="item.isRising" @click="viewIndexDetail(item)" /> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 美洲 --> |
|
||||
<view class="market-section"> |
|
||||
<view class="market-header"> |
|
||||
<text class="market-title">美洲</text> |
|
||||
<view class="market-more" @click="viewMore('america')"> |
|
||||
<text class="more-text">查看更多</text> |
|
||||
<text class="more-arrow">></text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="cards-grid-three"> |
|
||||
<view v-for="(item, index) in americaIndexes" :key="index" class="card-item"> |
|
||||
<IndexCard :flagIcon="item.flagIcon" :stockName="item.stockName" :currentPrice="item.currentPrice" :changeAmount="item.changeAmount" :changePercent="item.changePercent" :isRising="item.isRising" @click="viewIndexDetail(item)" /> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 底部安全区域 --> |
|
||||
<view class="bottom-safe-area"></view> |
|
||||
</scroll-view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 底部导航栏 --> |
|
||||
<footerBar class="static-footer" :type="'marketSituation'"></footerBar> |
|
||||
</template> |
|
||||
|
|
||||
<script setup> |
|
||||
import { ref, onMounted, computed, nextTick, watch } from "vue"; |
|
||||
import footerBar from "../../components/footerBar.vue"; |
|
||||
import IndexCard from "../../components/IndexCard.vue"; |
|
||||
|
|
||||
// 响应式数据 |
|
||||
const iSMT = ref(0); // 状态栏高度 |
|
||||
const contentHeight = ref(0); |
|
||||
const headerHeight = ref(0); // 头部高度 |
|
||||
const searchValue = ref(""); // 搜索值 |
|
||||
const isWarnTextOverflow = ref(false); // warn文字是否溢出 |
|
||||
|
|
||||
// warn文字的class计算属性 |
|
||||
const warnTextClass = computed(() => { |
|
||||
return isWarnTextOverflow.value ? "warn_text scroll-active" : "warn_text"; |
|
||||
}); |
|
||||
|
|
||||
// 检测warn文字是否溢出 |
|
||||
const checkWarnTextOverflow = () => { |
|
||||
nextTick(() => { |
|
||||
setTimeout(() => { |
|
||||
const query = uni.createSelectorQuery(); |
|
||||
|
|
||||
// 同时查询容器和文字元素 |
|
||||
query.select(".warn_text_container").boundingClientRect(); |
|
||||
query.select(".warn_text").boundingClientRect(); |
|
||||
query.exec((res) => { |
|
||||
const containerRect = res[0]; |
|
||||
const textRect = res[1]; |
|
||||
|
|
||||
if (!containerRect || !textRect) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
// 判断文字是否超出容器(留一些余量) |
|
||||
const isOverflow = textRect.width > containerRect.width - 10; |
|
||||
|
|
||||
isWarnTextOverflow.value = isOverflow; |
|
||||
}); |
|
||||
}, 500); |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 亚太-中华指数数据 |
|
||||
const asiachinaIndexes = ref([ |
|
||||
{ |
|
||||
flagIcon: "/static/c1.png", |
|
||||
stockName: "上证指数", |
|
||||
stockCode: "1A0001", |
|
||||
currentPrice: "3933.96", |
|
||||
changeAmount: "+24.32", |
|
||||
changePercent: "+0.62%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c2.png", |
|
||||
stockName: "深证成指", |
|
||||
stockCode: "2A01", |
|
||||
currentPrice: "45757.90", |
|
||||
changeAmount: "-123.45", |
|
||||
changePercent: "-0.27%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c3.png", |
|
||||
stockName: "创业板指", |
|
||||
stockCode: "399006", |
|
||||
currentPrice: "6606.08", |
|
||||
changeAmount: "+89.76", |
|
||||
changePercent: "+1.38%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c4.png", |
|
||||
stockName: "沪深300", |
|
||||
stockCode: "1B0300", |
|
||||
currentPrice: "45757.90", |
|
||||
changeAmount: "-89.12", |
|
||||
changePercent: "-0.19%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c5.png", |
|
||||
stockName: "上证50", |
|
||||
stockCode: "1B0011", |
|
||||
currentPrice: "45757.90", |
|
||||
changeAmount: "+234.56", |
|
||||
changePercent: "+0.52%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c6.png", |
|
||||
stockName: "科创50", |
|
||||
stockCode: "1B0688", |
|
||||
currentPrice: "22333.96", |
|
||||
changeAmount: "+156.78", |
|
||||
changePercent: "+0.71%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
]); |
|
||||
|
|
||||
// 亚太指数数据 |
|
||||
const asiaIndexes = ref([ |
|
||||
{ |
|
||||
flagIcon: "/static/c7.png", |
|
||||
stockName: "日经225", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "28456.78", |
|
||||
changeAmount: "+234.56", |
|
||||
changePercent: "+0.83%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c8.png", |
|
||||
stockName: "韩国KOSPI", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "2567.89", |
|
||||
changeAmount: "-12.34", |
|
||||
changePercent: "-0.48%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c9.png", |
|
||||
stockName: "印度孟买", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "65432.10", |
|
||||
changeAmount: "+456.78", |
|
||||
changePercent: "+0.70%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
]); |
|
||||
|
|
||||
// 美洲指数数据 |
|
||||
const americaIndexes = ref([ |
|
||||
{ |
|
||||
flagIcon: "/static/c7.png", |
|
||||
stockName: "道琼斯指数", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "34567.89", |
|
||||
changeAmount: "+123.45", |
|
||||
changePercent: "+0.36%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c8.png", |
|
||||
stockName: "纳斯达克", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "13456.78", |
|
||||
changeAmount: "-67.89", |
|
||||
changePercent: "-0.50%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "/static/c9.png", |
|
||||
stockName: "标普500", |
|
||||
stockCode: "noCode", |
|
||||
currentPrice: "4234.56", |
|
||||
changeAmount: "+23.45", |
|
||||
changePercent: "+0.56%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
]); |
|
||||
|
|
||||
// 计算属性:内容区域顶部位置 |
|
||||
const contentTopPosition = computed(() => { |
|
||||
const statusBarHeight = iSMT.value || 0; |
|
||||
const currentHeaderHeight = headerHeight.value > 0 ? headerHeight.value : 100; |
|
||||
return statusBarHeight + currentHeaderHeight; |
|
||||
}); |
|
||||
|
|
||||
// 方法:返回上一页 |
|
||||
const goBack = () => { |
|
||||
uni.navigateBack(); |
|
||||
}; |
|
||||
|
|
||||
// 方法:搜索输入 |
|
||||
const onSearchInput = (e) => { |
|
||||
searchValue.value = e.detail.value; |
|
||||
}; |
|
||||
|
|
||||
// 方法:清除搜索 |
|
||||
const clearSearch = () => { |
|
||||
searchValue.value = ""; |
|
||||
}; |
|
||||
|
|
||||
// 方法:查看更多 |
|
||||
const viewMore = (market) => { |
|
||||
console.log("查看更多:", market); |
|
||||
uni.navigateTo({ |
|
||||
url: `/pages/home/marketDetail?market=${market}`, |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 方法:查看指数详情 |
|
||||
const viewIndexDetail = (item) => { |
|
||||
console.log("查看指数详情:", item.stockName); |
|
||||
// uni.showToast({ |
|
||||
// title: `查看 ${item.stockName} 详情`, |
|
||||
// icon: 'none', |
|
||||
// duration: 2000 |
|
||||
// }) |
|
||||
// 这里可以跳转到具体的指数详情页面 |
|
||||
uni.navigateTo({ |
|
||||
url: `/pages/home/marketCondition?stockInformation=${encodeURIComponent(JSON.stringify(item))}`, |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 生命周期:页面挂载 |
|
||||
onMounted(() => { |
|
||||
// 获取系统信息 |
|
||||
const systemInfo = uni.getSystemInfoSync(); |
|
||||
iSMT.value = systemInfo.statusBarHeight || 0; |
|
||||
|
|
||||
console.log("全球指数页面加载完成"); |
|
||||
// 动态计算header实际高度 |
|
||||
uni |
|
||||
.createSelectorQuery() |
|
||||
.select(".header_fixed") |
|
||||
.boundingClientRect((rect) => { |
|
||||
if (rect) { |
|
||||
headerHeight.value = rect.height; |
|
||||
console.log("Header实际高度:", headerHeight.value, "px"); |
|
||||
} |
|
||||
}) |
|
||||
.exec(); |
|
||||
// 检测warn文字是否溢出 |
|
||||
checkWarnTextOverflow(); |
|
||||
}); |
|
||||
|
|
||||
// 监听headerHeight变化,重新计算contentHeight |
|
||||
watch(headerHeight, (newHeight) => { |
|
||||
if (newHeight > 0) { |
|
||||
const systemInfo = uni.getSystemInfoSync(); |
|
||||
const windowHeight = systemInfo.windowHeight; |
|
||||
const statusBarHeight = systemInfo.statusBarHeight || 0; |
|
||||
const footerHeight = 100; |
|
||||
|
|
||||
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight; |
|
||||
console.log("重新计算contentHeight:", contentHeight.value); |
|
||||
} |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<style lang="scss" scoped> |
|
||||
.main { |
|
||||
position: relative; |
|
||||
height: 100vh; |
|
||||
overflow: hidden; |
|
||||
background-color: #f5f5f5; |
|
||||
} |
|
||||
|
|
||||
/* 状态栏占位 */ |
|
||||
.top { |
|
||||
position: fixed; |
|
||||
top: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1001; |
|
||||
background-color: #ffffff; |
|
||||
} |
|
||||
|
|
||||
/* 固定头部样式 */ |
|
||||
.header_fixed { |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1000; |
|
||||
background-color: #ffffff; |
|
||||
padding: 20rpx 0 0 0; |
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
|
||||
} |
|
||||
|
|
||||
.header_content { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: space-between; |
|
||||
height: 80rpx; |
|
||||
padding: 0 20rpx; |
|
||||
margin-bottom: 10rpx; |
|
||||
} |
|
||||
|
|
||||
.header_back { |
|
||||
margin-right: 20rpx; |
|
||||
width: 25rpx; |
|
||||
height: 30rpx; |
|
||||
} |
|
||||
|
|
||||
.header_back image { |
|
||||
width: 25rpx; |
|
||||
height: 30rpx; |
|
||||
} |
|
||||
|
|
||||
.header_input_wrapper { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
width: 100%; |
|
||||
margin: 0 20rpx 0 0; |
|
||||
height: 70rpx; |
|
||||
border-radius: 35rpx; |
|
||||
background-color: #ffffff; |
|
||||
border: 1rpx solid #e9ecef; |
|
||||
padding: 0 80rpx 0 30rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #5c5c5c; |
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
|
||||
} |
|
||||
|
|
||||
.search_icon { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
opacity: 0.6; |
|
||||
} |
|
||||
|
|
||||
.header_input { |
|
||||
margin-left: 10rpx; |
|
||||
} |
|
||||
|
|
||||
.header_icons { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
gap: 15rpx; |
|
||||
} |
|
||||
|
|
||||
.header_icon { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
} |
|
||||
|
|
||||
.header_icon image { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
} |
|
||||
|
|
||||
.warn { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: flex-start; |
|
||||
gap: 10rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #666666; |
|
||||
padding: 20rpx; |
|
||||
max-width: 100%; |
|
||||
overflow: hidden; |
|
||||
position: relative; |
|
||||
} |
|
||||
|
|
||||
.warn image { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
flex-shrink: 0; |
|
||||
/* 防止图片被压缩 */ |
|
||||
position: relative; |
|
||||
z-index: 2; |
|
||||
/* 确保图片在最上层 */ |
|
||||
} |
|
||||
|
|
||||
.warn_text_container { |
|
||||
flex: 1; |
|
||||
overflow: hidden; |
|
||||
position: relative; |
|
||||
min-width: 0; |
|
||||
/* 允许容器收缩 */ |
|
||||
} |
|
||||
|
|
||||
.warn_text { |
|
||||
display: block; |
|
||||
white-space: nowrap; |
|
||||
will-change: transform; |
|
||||
/* 优化动画性能 */ |
|
||||
} |
|
||||
|
|
||||
/* 文字滚动动画 */ |
|
||||
@keyframes scrollText { |
|
||||
0% { |
|
||||
transform: translateX(0); |
|
||||
} |
|
||||
|
|
||||
20% { |
|
||||
transform: translateX(0); |
|
||||
} |
|
||||
|
|
||||
80% { |
|
||||
transform: translateX(-85%); |
|
||||
} |
|
||||
|
|
||||
100% { |
|
||||
transform: translateX(-85%); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/* 当文字超长时启用滚动动画 */ |
|
||||
.warn_text.scroll-active { |
|
||||
animation: scrollText 12s linear infinite; |
|
||||
animation-delay: 2s; |
|
||||
/* 延迟2秒开始滚动,让用户先看到开头 */ |
|
||||
} |
|
||||
|
|
||||
/* 内容区域 */ |
|
||||
.content { |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
bottom: 120rpx; |
|
||||
background-color: #f5f5f5; |
|
||||
padding: 0; |
|
||||
} |
|
||||
|
|
||||
/* 市场分组 */ |
|
||||
.market-section { |
|
||||
background-color: white; |
|
||||
border-radius: 20rpx; |
|
||||
} |
|
||||
|
|
||||
.market-header { |
|
||||
margin: 20rpx 20rpx 0 20rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: space-between; |
|
||||
margin-bottom: 10rpx; |
|
||||
padding-bottom: 10rpx; |
|
||||
border-bottom: 2rpx solid #f0f0f0; |
|
||||
} |
|
||||
|
|
||||
.market-title { |
|
||||
font-size: 32rpx; |
|
||||
font-weight: 600; |
|
||||
color: #333; |
|
||||
} |
|
||||
|
|
||||
.market-more { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
gap: 8rpx; |
|
||||
} |
|
||||
|
|
||||
.more-text { |
|
||||
font-size: 24rpx; |
|
||||
color: #666; |
|
||||
} |
|
||||
|
|
||||
.more-arrow { |
|
||||
font-size: 20rpx; |
|
||||
color: #666; |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
/* 三列卡片网格 */ |
|
||||
.cards-grid-three { |
|
||||
display: grid; |
|
||||
grid-template-columns: repeat(3, 1fr); |
|
||||
} |
|
||||
|
|
||||
.card-item { |
|
||||
background-color: white; |
|
||||
border-radius: 16rpx; |
|
||||
overflow: hidden; |
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease; |
|
||||
} |
|
||||
|
|
||||
.card-item:active { |
|
||||
transform: scale(0.98); |
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.12); |
|
||||
} |
|
||||
|
|
||||
/* 底部安全区域 */ |
|
||||
.bottom-safe-area { |
|
||||
height: 40rpx; |
|
||||
background-color: transparent; |
|
||||
} |
|
||||
|
|
||||
/* 底部导航栏 */ |
|
||||
.static-footer { |
|
||||
position: fixed; |
|
||||
bottom: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1000; |
|
||||
} |
|
||||
|
|
||||
/* 响应式设计 */ |
|
||||
@media (max-width: 400rpx) { |
|
||||
.cards-grid-three { |
|
||||
grid-template-columns: repeat(2, 1fr); |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
||||
@ -1,488 +0,0 @@ |
|||||
<!-- @format --> |
|
||||
|
|
||||
<template> |
|
||||
<view class="main"> |
|
||||
<!-- 自定义导航栏 --> |
|
||||
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
|
||||
<view class="header-content"> |
|
||||
<view class="header-left" @click="goBack"> |
|
||||
<text class="back-text">‹</text> |
|
||||
</view> |
|
||||
<view class="header-center"> |
|
||||
<text class="header-title">{{ marketTitle }}</text> |
|
||||
</view> |
|
||||
<view class="header-right"> |
|
||||
<image src="/static/marketSituation-image/search.png" class="header-icon" mode="aspectFit"></image> |
|
||||
<text class="more-text">···</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<!-- 表头 --> |
|
||||
<view class="table-header"> |
|
||||
<view class="header-item name-column"> |
|
||||
<text class="header-text">名称</text> |
|
||||
</view> |
|
||||
<view class="header-item price-column" @click="sortByPrice"> |
|
||||
<text class="header-text">最新</text> |
|
||||
<text class="sort-icon">{{ sortType === "price" ? (sortOrder === "asc" ? "↑" : "↓") : "↕" }}</text> |
|
||||
</view> |
|
||||
<view class="header-item change-column" @click="sortByChange"> |
|
||||
<text class="header-text">涨幅</text> |
|
||||
<text class="sort-icon">{{ sortType === "change" ? (sortOrder === "asc" ? "↑" : "↓") : "↕" }}</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 内容区域 --> |
|
||||
<scroll-view class="content" :style="{ top: contentTopPosition + 'px' }" scroll-y="true"> |
|
||||
<!-- 股票列表 --> |
|
||||
<view class="stock-list"> |
|
||||
<view class="stock-row" v-for="(stock, index) in sortedStockList" :key="index" @click="viewStockDetail(stock)"> |
|
||||
<view class="stock-cell name-column"> |
|
||||
<view class="stock-name">{{ stock.stockName }}</view> |
|
||||
<view class="stock-code">{{ stock.stockCode }}</view> |
|
||||
</view> |
|
||||
<view class="stock-cell price-column"> |
|
||||
<text class="stock-price" :class="stock.isRising ? 'rising' : 'falling'"> |
|
||||
{{ typeof stock.price === "number" ? stock.price.toFixed(2) : stock.price }} |
|
||||
</text> |
|
||||
</view> |
|
||||
<view class="stock-cell change-column"> |
|
||||
<text class="stock-change" :class="stock.isRising ? 'rising' : 'falling'"> |
|
||||
{{ stock.change || stock.changePercent }} |
|
||||
</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 底部安全区域 --> |
|
||||
<!-- <view class="bottom-safe-area"></view> --> |
|
||||
</scroll-view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 底部导航栏 --> |
|
||||
<!-- <footerBar class="static-footer" :type="'marketSituation'"></footerBar> --> |
|
||||
</template> |
|
||||
|
|
||||
<script setup> |
|
||||
import { ref, computed, onMounted, watch } from "vue"; |
|
||||
import { onLoad } from "@dcloudio/uni-app"; |
|
||||
import footerBar from "@/components/footerBar.vue"; |
|
||||
|
|
||||
// 响应式数据 |
|
||||
const iSMT = ref(0); |
|
||||
const headerHeight = ref(80); |
|
||||
const marketType = ref("america"); |
|
||||
const marketTitle = ref("美洲"); |
|
||||
const sortType = ref(""); // 排序类型:'price' 或 'change' |
|
||||
const sortOrder = ref("desc"); // 排序顺序:'asc' 或 'desc' |
|
||||
|
|
||||
// 股票数据 |
|
||||
const stockList = ref([ |
|
||||
{ |
|
||||
stockName: "Telecommunication", |
|
||||
stockCode: "888607", |
|
||||
price: 1349.47, |
|
||||
change: "+7.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Other", |
|
||||
stockCode: "888607", |
|
||||
price: 1349.47, |
|
||||
change: "+6.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1349.47, |
|
||||
change: "+5.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Telecommunication", |
|
||||
stockCode: "888607", |
|
||||
price: 1349.47, |
|
||||
change: "+4.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Other", |
|
||||
stockCode: "888611", |
|
||||
price: 1359.47, |
|
||||
change: "+3.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1349.47, |
|
||||
change: "+2.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Telecommunication", |
|
||||
stockCode: "888607", |
|
||||
price: 1349.47, |
|
||||
change: "+1.67%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Other", |
|
||||
stockCode: "888611", |
|
||||
price: 1009.98, |
|
||||
change: "-1.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1009.98, |
|
||||
change: "-0.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Telecommunication", |
|
||||
stockCode: "888607", |
|
||||
price: 1009.98, |
|
||||
change: "-0.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Other", |
|
||||
stockCode: "888611", |
|
||||
price: 1009.98, |
|
||||
change: "-1.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1009.98, |
|
||||
change: "-4.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1009.98, |
|
||||
change: "-3.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
stockName: "Consumer Discretio...", |
|
||||
stockCode: "888610", |
|
||||
price: 1009.98, |
|
||||
change: "-3.67%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
]); |
|
||||
|
|
||||
// 计算属性 |
|
||||
const contentTopPosition = computed(() => { |
|
||||
return iSMT.value + headerHeight.value; |
|
||||
}); |
|
||||
|
|
||||
const sortedStockList = computed(() => { |
|
||||
console.log("计算sortedStockList,原始数据长度:", stockList.value.length); |
|
||||
let list = [...stockList.value]; |
|
||||
|
|
||||
if (sortType.value === "price") { |
|
||||
list.sort((a, b) => { |
|
||||
return sortOrder.value === "asc" ? a.price - b.price : b.price - a.price; |
|
||||
}); |
|
||||
} else if (sortType.value === "change") { |
|
||||
list.sort((a, b) => { |
|
||||
const aChange = parseFloat(a.change.replace(/[+%-]/g, "")); |
|
||||
const bChange = parseFloat(b.change.replace(/[+%-]/g, "")); |
|
||||
return sortOrder.value === "asc" ? aChange - bChange : bChange - aChange; |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
console.log("排序后数据长度:", list.length); |
|
||||
return list; |
|
||||
}); |
|
||||
|
|
||||
// 页面加载时接收参数 |
|
||||
onLoad((options) => { |
|
||||
if (options && options.market) { |
|
||||
marketType.value = options.market; |
|
||||
switch (options.market) { |
|
||||
case "america": |
|
||||
marketTitle.value = "美洲"; |
|
||||
break; |
|
||||
case "asia": |
|
||||
marketTitle.value = "亚太"; |
|
||||
break; |
|
||||
case "asia-china": |
|
||||
marketTitle.value = "亚太-中华"; |
|
||||
break; |
|
||||
default: |
|
||||
marketTitle.value = "全球指数"; |
|
||||
} |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
// 方法 |
|
||||
const goBack = () => { |
|
||||
uni.navigateBack(); |
|
||||
}; |
|
||||
|
|
||||
const sortByPrice = () => { |
|
||||
if (sortType.value === "price") { |
|
||||
sortOrder.value = sortOrder.value === "asc" ? "desc" : "asc"; |
|
||||
} else { |
|
||||
sortType.value = "price"; |
|
||||
sortOrder.value = "desc"; |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
const sortByChange = () => { |
|
||||
if (sortType.value === "change") { |
|
||||
sortOrder.value = sortOrder.value === "asc" ? "desc" : "asc"; |
|
||||
} else { |
|
||||
sortType.value = "change"; |
|
||||
sortOrder.value = "desc"; |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
const viewStockDetail = (stock) => { |
|
||||
console.log("查看股票详情:", stock); |
|
||||
// 这里可以跳转到股票详情页面 |
|
||||
uni.navigateTo({ |
|
||||
url: `/pages/home/marketCondition?stockInformation=${encodeURIComponent(JSON.stringify(stock))}`, |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
onMounted(() => { |
|
||||
// 获取状态栏高度 |
|
||||
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
|
||||
// 动态计算header实际高度 |
|
||||
uni |
|
||||
.createSelectorQuery() |
|
||||
.select(".header_fixed") |
|
||||
.boundingClientRect((rect) => { |
|
||||
if (rect) { |
|
||||
headerHeight.value = rect.height; |
|
||||
console.log("Header实际高度:", headerHeight.value, "px"); |
|
||||
} |
|
||||
}) |
|
||||
.exec(); |
|
||||
}); |
|
||||
|
|
||||
// 监听headerHeight变化,重新计算contentHeight |
|
||||
watch(headerHeight, (newHeight) => { |
|
||||
if (newHeight > 0) { |
|
||||
const systemInfo = uni.getSystemInfoSync(); |
|
||||
const windowHeight = systemInfo.windowHeight; |
|
||||
const statusBarHeight = systemInfo.statusBarHeight || 0; |
|
||||
const footerHeight = 100; |
|
||||
|
|
||||
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight; |
|
||||
console.log("重新计算contentHeight:", contentHeight.value); |
|
||||
} |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
.main { |
|
||||
width: 100%; |
|
||||
height: 100vh; |
|
||||
background-color: #f5f5f5; |
|
||||
position: relative; |
|
||||
} |
|
||||
|
|
||||
/* 自定义导航栏 */ |
|
||||
.header_fixed { |
|
||||
position: fixed; |
|
||||
top: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1000; |
|
||||
background-color: #ffffff; |
|
||||
border-bottom: 1px solid #f0f0f0; |
|
||||
} |
|
||||
|
|
||||
.header-content { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: space-between; |
|
||||
height: 44px; |
|
||||
padding: 0 15px; |
|
||||
} |
|
||||
|
|
||||
.header-left, |
|
||||
.header-right { |
|
||||
width: 60px; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.header-left { |
|
||||
justify-content: flex-start; |
|
||||
} |
|
||||
|
|
||||
.header-right { |
|
||||
justify-content: flex-end; |
|
||||
gap: 10px; |
|
||||
} |
|
||||
|
|
||||
.back-text { |
|
||||
font-size: 24px; |
|
||||
color: #333333; |
|
||||
font-weight: 500; |
|
||||
line-height: 1; |
|
||||
} |
|
||||
|
|
||||
.header-center { |
|
||||
flex: 1; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
} |
|
||||
|
|
||||
.header-title { |
|
||||
font-size: 18px; |
|
||||
font-weight: 600; |
|
||||
color: #333333; |
|
||||
} |
|
||||
|
|
||||
.header-icon { |
|
||||
width: 20px; |
|
||||
height: 20px; |
|
||||
} |
|
||||
|
|
||||
.more-text { |
|
||||
font-size: 20px; |
|
||||
color: #666666; |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
/* 内容区域 */ |
|
||||
.content { |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
bottom: 0; |
|
||||
background-color: #ffffff; |
|
||||
} |
|
||||
|
|
||||
/* 表头样式 */ |
|
||||
.table-header { |
|
||||
display: flex; |
|
||||
padding: 12px 15px; |
|
||||
background-color: #f8f9fa; |
|
||||
border-bottom: 1px solid #e9ecef; |
|
||||
} |
|
||||
|
|
||||
.header-item { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
cursor: pointer; |
|
||||
} |
|
||||
|
|
||||
.header-item.name-column { |
|
||||
flex: 2; |
|
||||
justify-content: flex-start; |
|
||||
} |
|
||||
|
|
||||
.header-item.price-column, |
|
||||
.header-item.change-column { |
|
||||
flex: 1; |
|
||||
justify-content: center; |
|
||||
} |
|
||||
|
|
||||
.header-text { |
|
||||
font-size: 14px; |
|
||||
color: #666666; |
|
||||
font-weight: 500; |
|
||||
} |
|
||||
|
|
||||
.sort-icon { |
|
||||
margin-left: 4px; |
|
||||
font-size: 12px; |
|
||||
color: #999999; |
|
||||
} |
|
||||
|
|
||||
/* 股票列表 */ |
|
||||
.stock-list { |
|
||||
background-color: #ffffff; |
|
||||
} |
|
||||
|
|
||||
.stock-row { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
padding: 12px 15px; |
|
||||
border-bottom: 1px solid #f5f5f5; |
|
||||
} |
|
||||
|
|
||||
.stock-row:active { |
|
||||
background-color: #f8f8f8; |
|
||||
} |
|
||||
|
|
||||
.stock-cell { |
|
||||
display: flex; |
|
||||
flex-direction: column; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.stock-cell.name-column { |
|
||||
flex: 2; |
|
||||
align-items: flex-start; |
|
||||
} |
|
||||
|
|
||||
.stock-cell.price-column, |
|
||||
.stock-cell.change-column { |
|
||||
flex: 1; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.stock-name { |
|
||||
font-size: 15px; |
|
||||
color: #333333; |
|
||||
font-weight: 500; |
|
||||
line-height: 1.2; |
|
||||
margin-bottom: 2px; |
|
||||
} |
|
||||
|
|
||||
.stock-code { |
|
||||
font-size: 11px; |
|
||||
color: #999999; |
|
||||
line-height: 1.2; |
|
||||
} |
|
||||
|
|
||||
.stock-price { |
|
||||
font-size: 15px; |
|
||||
font-weight: 600; |
|
||||
line-height: 1.2; |
|
||||
} |
|
||||
|
|
||||
.stock-change { |
|
||||
font-size: 13px; |
|
||||
font-weight: 500; |
|
||||
line-height: 1.2; |
|
||||
} |
|
||||
|
|
||||
.rising { |
|
||||
color: #00c851; |
|
||||
} |
|
||||
|
|
||||
.falling { |
|
||||
color: #ff4444; |
|
||||
} |
|
||||
|
|
||||
/* 底部安全区域 */ |
|
||||
/* .bottom-safe-area { |
|
||||
height: 20px; |
|
||||
} */ |
|
||||
|
|
||||
/* 底部导航栏 */ |
|
||||
/* .static-footer { |
|
||||
position: fixed; |
|
||||
bottom: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1000; |
|
||||
} */ |
|
||||
</style> |
|
||||
@ -1,920 +0,0 @@ |
|||||
<!-- @format --> |
|
||||
|
|
||||
<template> |
|
||||
<view class="main"> |
|
||||
<!-- 固定头部 --> |
|
||||
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
|
||||
<view class="header_content"> |
|
||||
<view class="header_input_wrapper"> |
|
||||
<image class="search_icon" src="/static/marketSituation-image/search.png" mode="" @click="onSearchClick"></image> |
|
||||
<input class="header_input" type="text" placeholder="搜索" placeholder-style="color: #A6A6A6; font-size: 22rpx;" v-model="searchValue" @input="onSearchInput" @confirm="onSearchConfirm" /> |
|
||||
</view> |
|
||||
<view class="header_icons"> |
|
||||
<view class="header_icon" @click="selected"> |
|
||||
<image src="/static/marketSituation-image/mySeclected.png" mode=""></image> |
|
||||
</view> |
|
||||
<view class="header_icon" @click="history"> |
|
||||
<image src="/static/marketSituation-image/history.png" mode=""></image> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="channel_li" v-if="channelData.length > 0"> |
|
||||
<scroll-view class="channel_wrap" scroll-x="true" :scroll-into-view="scrollToView" :scroll-with-animation="true" show-scrollbar="false"> |
|
||||
<view class="channel_innerWrap"> |
|
||||
<view v-for="(item, index) in channelData" :key="item.id" :id="'nav' + item.id" :class="['channel_item', index === pageIndex ? 'active' : '']" @click="navClick(index)"> |
|
||||
<text class="channel_text">{{ item.title }}</text> |
|
||||
<view v-if="index === pageIndex" class="active_indicator"></view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</scroll-view> |
|
||||
<view class="scroll_indicator" @click="channel_more"> |
|
||||
<image src="/static/marketSituation-image/menu.png" mode="aspectFit"></image> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 可滚动内容区域 --> |
|
||||
<scroll-view class="content_scroll" scroll-y="true" :style="{ top: contentTopPosition + 'px' }"> |
|
||||
<view class="content"> |
|
||||
<view class="map"> |
|
||||
<image src="/static/marketSituation-image/map.png" mode="widthFix"></image> |
|
||||
</view> |
|
||||
<view class="global_index"> |
|
||||
<view class="global_index_title"> |
|
||||
{{ $t("marketSituation.globalIndex") }} |
|
||||
</view> |
|
||||
<view class="global_index_more" @click="goToGlobalIndex"> |
|
||||
<text>{{ $t("marketSituation.globalIndexMore") }}</text> |
|
||||
<image src="/static/marketSituation-image/more.png" mode="aspectFit"></image> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<!-- 卡片网格 --> |
|
||||
<view class="cards_grid"> |
|
||||
<view v-for="(card, index) in cardData" :key="index" class="card_item"> |
|
||||
<IndexCard :flagIcon="card.flagIcon" :stockName="card.stockName" :currentPrice="card.currentPrice" :changeAmount="card.changeAmount" :changePercent="card.changePercent" :isRising="card.isRising" @click="viewIndexDetail(card)" /> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="warn"> |
|
||||
<image src="/static/marketSituation-image/warn.png" mode="aspectFit"></image> |
|
||||
<view class="warn_text_container"> |
|
||||
<text :class="warnTextClass">{{ $t("marketSituation.warn") }}</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<!-- 底部安全区域,防止被导航栏遮挡 --> |
|
||||
<view class="bottom_safe_area"></view> |
|
||||
</view> |
|
||||
</scroll-view> |
|
||||
</view> |
|
||||
|
|
||||
<footerBar class="static-footer" :type="type"></footerBar> |
|
||||
|
|
||||
<!-- 更多tab弹窗 --> |
|
||||
<view v-if="showCountryModal" class="modal_overlay" @click="closeModal"> |
|
||||
<view class="modal_content" @click.stop> |
|
||||
<view class="modal_header"> |
|
||||
<text class="modal_title">全部栏目</text> |
|
||||
<view class="modal_close" @click="closeModal"> |
|
||||
<text>×</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="modal_body"> |
|
||||
<view class="country_grid"> |
|
||||
<view v-for="(country, index) in countryList" :key="index" :class="['country_item', selectedCountry === country ? 'selected' : '']" @click="selectCountry(country)"> |
|
||||
<text class="country_text">{{ country }}</text> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</template> |
|
||||
|
|
||||
<script setup> |
|
||||
import { ref, onMounted, watch, nextTick, computed } from "vue"; |
|
||||
import util from "../../common/util.js"; |
|
||||
import footerBar from "../../components/footerBar.vue"; |
|
||||
import IndexCard from "../../components/IndexCard.vue"; |
|
||||
|
|
||||
const type = ref("marketSituation"); |
|
||||
const iSMT = ref(0); |
|
||||
const searchValue = ref(""); |
|
||||
const contentHeight = ref(0); |
|
||||
const headerHeight = ref(0); // 动态计算的header高度 |
|
||||
const isWarnTextOverflow = ref(false); // warn文字是否溢出 |
|
||||
|
|
||||
// Tab 栏相关数据 |
|
||||
const channelData = ref([ |
|
||||
{ id: 1, title: "概况" }, |
|
||||
{ id: 2, title: "新加坡" }, |
|
||||
{ id: 3, title: "马来西亚" }, |
|
||||
{ id: 4, title: "印度尼西亚" }, |
|
||||
{ id: 5, title: "美国" }, |
|
||||
{ id: 6, title: "中国香港" }, |
|
||||
{ id: 7, title: "泰国" }, |
|
||||
{ id: 8, title: "中国" }, |
|
||||
{ id: 9, title: "加拿大" }, |
|
||||
{ id: 10, title: "越南" }, |
|
||||
{ id: 11, title: "外汇" }, |
|
||||
{ id: 12, title: "贵金属" }, |
|
||||
]); |
|
||||
const pageIndex = ref(0); |
|
||||
const scrollToView = ref(""); |
|
||||
|
|
||||
// 计算属性:精准计算content区域的top值 |
|
||||
const contentTopPosition = computed(() => { |
|
||||
const statusBarHeight = iSMT.value || 0; |
|
||||
const currentHeaderHeight = headerHeight.value > 0 ? headerHeight.value : 140; |
|
||||
return statusBarHeight + currentHeaderHeight; |
|
||||
}); |
|
||||
|
|
||||
// warn文字的class计算属性 |
|
||||
const warnTextClass = computed(() => { |
|
||||
return isWarnTextOverflow.value ? "warn_text scroll-active" : "warn_text"; |
|
||||
}); |
|
||||
|
|
||||
// 弹窗相关数据 |
|
||||
const showCountryModal = ref(false); |
|
||||
const selectedCountry = ref("概况"); |
|
||||
const countryList = ref(["概况", "新加坡", "马来西亚", "印度尼西亚", "美国", "中国香港", "泰国", "中国", "加拿大", "越南", "外汇", "贵金属"]); |
|
||||
|
|
||||
// 卡片数据 |
|
||||
const cardData = ref([ |
|
||||
{ |
|
||||
flagIcon: "🇺🇸", |
|
||||
stockName: "道琼斯", |
|
||||
stockCode: "DJIA", |
|
||||
currentPrice: "45757.90", |
|
||||
changeAmount: "-125.22", |
|
||||
changePercent: "-0.27%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇺🇸", |
|
||||
stockName: "纳斯达克", |
|
||||
stockCode: "NDX", |
|
||||
currentPrice: "22333.96", |
|
||||
changeAmount: "+125.22", |
|
||||
changePercent: "+0.47%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇺🇸", |
|
||||
stockName: "标普500", |
|
||||
stockCode: "SPX", |
|
||||
currentPrice: "6606.08", |
|
||||
changeAmount: "+125.22", |
|
||||
changePercent: "+0.27%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇨🇳", |
|
||||
stockName: "上证指数", |
|
||||
stockCode: "1A0001", |
|
||||
currentPrice: "3333.96", |
|
||||
changeAmount: "+125.22", |
|
||||
changePercent: "+0.27%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇨🇳", |
|
||||
stockName: "科创50", |
|
||||
stockCode: "1B0688", |
|
||||
currentPrice: "757.90", |
|
||||
changeAmount: "-25.22", |
|
||||
changePercent: "-0.27%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇭🇰", |
|
||||
stockName: "恒生指数", |
|
||||
stockCode: "HSI", |
|
||||
currentPrice: "19757.90", |
|
||||
changeAmount: "-125.22", |
|
||||
changePercent: "-0.63%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇸🇬", |
|
||||
stockName: "道琼斯", |
|
||||
stockCode: "DJIA", |
|
||||
currentPrice: "3757.90", |
|
||||
changeAmount: "+85.22", |
|
||||
changePercent: "+2.31%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇲🇾", |
|
||||
stockName: "纳斯达克", |
|
||||
stockCode: "NDX", |
|
||||
currentPrice: "1657.90", |
|
||||
changeAmount: "-15.22", |
|
||||
changePercent: "-0.91%", |
|
||||
isRising: false, |
|
||||
}, |
|
||||
{ |
|
||||
flagIcon: "🇹🇭", |
|
||||
stockName: "标普500", |
|
||||
stockCode: "SPX", |
|
||||
currentPrice: "1457.90", |
|
||||
changeAmount: "+35.22", |
|
||||
changePercent: "+2.48%", |
|
||||
isRising: true, |
|
||||
}, |
|
||||
]); |
|
||||
|
|
||||
// 搜索输入事件 |
|
||||
const onSearchInput = (e) => { |
|
||||
searchValue.value = e.detail.value; |
|
||||
}; |
|
||||
|
|
||||
// 搜索确认事件 |
|
||||
const onSearchConfirm = (e) => { |
|
||||
console.log("搜索内容:", e.detail.value); |
|
||||
// 这里可以添加搜索逻辑 |
|
||||
performSearch(e.detail.value); |
|
||||
}; |
|
||||
|
|
||||
// 搜索图标点击事件 |
|
||||
const onSearchClick = () => { |
|
||||
if (searchValue.value.trim()) { |
|
||||
performSearch(searchValue.value); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
// 执行搜索 |
|
||||
const performSearch = (keyword) => { |
|
||||
if (!keyword.trim()) { |
|
||||
uni.showToast({ |
|
||||
title: "请输入搜索内容", |
|
||||
icon: "none", |
|
||||
}); |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
uni.showToast({ |
|
||||
title: `搜索: ${keyword}`, |
|
||||
icon: "none", |
|
||||
}); |
|
||||
// 这里添加实际的搜索逻辑 |
|
||||
}; |
|
||||
|
|
||||
// 我的收藏点击事件 |
|
||||
const selected = () => { |
|
||||
uni.showToast({ |
|
||||
title: "我的收藏", |
|
||||
icon: "none", |
|
||||
}); |
|
||||
// 这里可以跳转到收藏页面 |
|
||||
}; |
|
||||
|
|
||||
// 历史记录点击事件 |
|
||||
const history = () => { |
|
||||
uni.showToast({ |
|
||||
title: "历史记录", |
|
||||
icon: "none", |
|
||||
}); |
|
||||
// 这里可以跳转到历史页面 |
|
||||
}; |
|
||||
|
|
||||
// Tab 栏点击事件 |
|
||||
const navClick = (index) => { |
|
||||
pageIndex.value = index; |
|
||||
const currentItem = channelData.value[index]; |
|
||||
scrollToView.value = "nav" + currentItem.id; |
|
||||
|
|
||||
// 同步更新弹窗中的选中状态 |
|
||||
selectedCountry.value = currentItem.title; |
|
||||
|
|
||||
uni.showToast({ |
|
||||
title: `切换到: ${currentItem.title}`, |
|
||||
icon: "none", |
|
||||
}); |
|
||||
|
|
||||
// 这里可以添加切换 tab 后的数据加载逻辑 |
|
||||
console.log("当前选中的 tab:", currentItem); |
|
||||
}; |
|
||||
|
|
||||
// 更多选项点击事件 |
|
||||
const channel_more = () => { |
|
||||
showCountryModal.value = true; |
|
||||
}; |
|
||||
|
|
||||
// 选择国家 |
|
||||
const selectCountry = (country) => { |
|
||||
selectedCountry.value = country; |
|
||||
|
|
||||
// 查找对应的tab索引 |
|
||||
const targetIndex = channelData.value.findIndex((item) => item.title === country); |
|
||||
|
|
||||
if (targetIndex !== -1) { |
|
||||
// 同步更新页面tab |
|
||||
pageIndex.value = targetIndex; |
|
||||
const currentItem = channelData.value[targetIndex]; |
|
||||
scrollToView.value = "nav" + currentItem.id; |
|
||||
|
|
||||
console.log("选中了:" + country + ",同步到tab索引:" + targetIndex); |
|
||||
uni.showToast({ |
|
||||
title: "已切换到:" + country, |
|
||||
icon: "none", |
|
||||
duration: 2000, |
|
||||
}); |
|
||||
} else { |
|
||||
// 如果是"概况"或其他特殊选项,默认切换到第一个tab |
|
||||
if (country === "概况" || country === "全部") { |
|
||||
pageIndex.value = 0; |
|
||||
scrollToView.value = "nav" + channelData.value[0].id; |
|
||||
} |
|
||||
|
|
||||
console.log("选中了:" + country); |
|
||||
uni.showToast({ |
|
||||
title: "已选择:" + country, |
|
||||
icon: "none", |
|
||||
duration: 2000, |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
// 这里可以添加切换到对应国家/地区数据的逻辑 |
|
||||
// 例如:loadMarketData(country) |
|
||||
closeModal(); |
|
||||
}; |
|
||||
|
|
||||
// 关闭弹窗 |
|
||||
const closeModal = () => { |
|
||||
showCountryModal.value = false; |
|
||||
}; |
|
||||
|
|
||||
// 检测warn文字是否溢出 |
|
||||
const checkWarnTextOverflow = () => { |
|
||||
nextTick(() => { |
|
||||
setTimeout(() => { |
|
||||
const query = uni.createSelectorQuery(); |
|
||||
|
|
||||
// 同时查询容器和文字元素 |
|
||||
query.select(".warn_text_container").boundingClientRect(); |
|
||||
query.select(".warn_text").boundingClientRect(); |
|
||||
query.exec((res) => { |
|
||||
const containerRect = res[0]; |
|
||||
const textRect = res[1]; |
|
||||
|
|
||||
if (!containerRect || !textRect) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
// 判断文字是否超出容器(留一些余量) |
|
||||
const isOverflow = textRect.width > containerRect.width - 10; |
|
||||
|
|
||||
isWarnTextOverflow.value = isOverflow; |
|
||||
}); |
|
||||
}, 500); |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 跳转到全球指数页面 |
|
||||
const goToGlobalIndex = () => { |
|
||||
uni.navigateTo({ |
|
||||
url: "/pages/home/globalIndex", |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
// 方法:查看指数详情 |
|
||||
const viewIndexDetail = (item) => { |
|
||||
console.log("查看指数详情:", item.stockName); |
|
||||
// uni.showToast({ |
|
||||
// title: `查看 ${item.stockName} 详情`, |
|
||||
// icon: 'none', |
|
||||
// duration: 2000 |
|
||||
// }) |
|
||||
// 这里可以跳转到具体的指数详情页面 |
|
||||
uni.navigateTo({ |
|
||||
url: `/pages/home/marketCondition?stockInformation=${encodeURIComponent(JSON.stringify(item))}`, |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
onMounted(() => { |
|
||||
// 状态栏高度 |
|
||||
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
|
||||
|
|
||||
// 初始化 tab 栏 |
|
||||
if (channelData.value.length > 0) { |
|
||||
pageIndex.value = 0; |
|
||||
scrollToView.value = "nav" + channelData.value[0].id; |
|
||||
} |
|
||||
|
|
||||
util.request( |
|
||||
"link/api/brain/privilege", |
|
||||
(res) => { |
|
||||
console.log(res); |
|
||||
}, |
|
||||
{ |
|
||||
token: "9ior41AF0xTIbIG2pRnnbZi0+fEeMx8pywnIlrmTwo5FbqJ9lWrSWOxp9MkpKiNtedtUafqvzIwpFKrwuMs", |
|
||||
}, |
|
||||
(err) => { |
|
||||
console.log(err); |
|
||||
} |
|
||||
); |
|
||||
|
|
||||
// 确保DOM渲染完成后再查询高度 |
|
||||
nextTick(() => { |
|
||||
// 动态计算header实际高度 |
|
||||
uni |
|
||||
.createSelectorQuery() |
|
||||
.select(".header_fixed") |
|
||||
.boundingClientRect((rect) => { |
|
||||
if (rect) { |
|
||||
headerHeight.value = rect.height; |
|
||||
console.log("Header实际高度:", headerHeight.value, "px"); |
|
||||
} |
|
||||
}) |
|
||||
.exec(); |
|
||||
|
|
||||
// 检测warn文字是否溢出 |
|
||||
checkWarnTextOverflow(); |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
// 监听headerHeight变化,重新计算contentHeight |
|
||||
watch(headerHeight, (newHeight) => { |
|
||||
if (newHeight > 0) { |
|
||||
const systemInfo = uni.getSystemInfoSync(); |
|
||||
const windowHeight = systemInfo.windowHeight; |
|
||||
const statusBarHeight = systemInfo.statusBarHeight || 0; |
|
||||
const footerHeight = 100; |
|
||||
|
|
||||
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight; |
|
||||
console.log("重新计算contentHeight:", contentHeight.value); |
|
||||
} |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
/* 状态栏占位 */ |
|
||||
.top { |
|
||||
position: fixed; |
|
||||
top: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1001; |
|
||||
background-color: #ffffff; |
|
||||
} |
|
||||
|
|
||||
/* 固定头部样式 */ |
|
||||
.header_fixed { |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1000; |
|
||||
background-color: #ffffff; |
|
||||
padding: 20rpx 0 0 0; |
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
|
||||
} |
|
||||
|
|
||||
/* 可滚动内容区域 */ |
|
||||
.content_scroll { |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
bottom: 100rpx; |
|
||||
/* 底部导航栏高度 */ |
|
||||
overflow-y: auto; |
|
||||
} |
|
||||
|
|
||||
.header_content { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: space-between; |
|
||||
height: 80rpx; |
|
||||
padding: 0 20rpx; |
|
||||
margin-bottom: 10rpx; |
|
||||
} |
|
||||
|
|
||||
.header_input_wrapper { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
width: 100%; |
|
||||
margin: 0 20rpx 0 0; |
|
||||
height: 70rpx; |
|
||||
border-radius: 35rpx; |
|
||||
background-color: #ffffff; |
|
||||
border: 1rpx solid #e9ecef; |
|
||||
padding: 0 80rpx 0 30rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #5c5c5c; |
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
|
||||
} |
|
||||
|
|
||||
.search_icon { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
opacity: 0.6; |
|
||||
} |
|
||||
|
|
||||
.header_input { |
|
||||
margin-left: 10rpx; |
|
||||
} |
|
||||
|
|
||||
.header_icons { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
gap: 15rpx; |
|
||||
} |
|
||||
|
|
||||
.header_icon { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
} |
|
||||
|
|
||||
.header_icon image { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
} |
|
||||
|
|
||||
/* Tab 栏样式 */ |
|
||||
.channel_li { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
height: 80rpx; |
|
||||
background-color: #ffffff; |
|
||||
border-bottom: 1rpx solid #f0f0f0; |
|
||||
} |
|
||||
|
|
||||
.channel_wrap { |
|
||||
width: calc(100% - 60rpx); |
|
||||
height: 100%; |
|
||||
overflow: hidden; |
|
||||
flex-shrink: 0; |
|
||||
} |
|
||||
|
|
||||
.channel_innerWrap { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
height: 100%; |
|
||||
padding: 0 20rpx; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.channel_item { |
|
||||
position: relative; |
|
||||
display: flex; |
|
||||
flex-direction: column; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
height: 60rpx; |
|
||||
padding: 0 20rpx; |
|
||||
border-radius: 30rpx; |
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
|
||||
cursor: pointer; |
|
||||
white-space: nowrap; |
|
||||
flex-shrink: 0; |
|
||||
} |
|
||||
|
|
||||
.channel_item:active { |
|
||||
transform: scale(0.98); |
|
||||
} |
|
||||
|
|
||||
.channel_item.active { |
|
||||
color: #333; |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
.channel_text { |
|
||||
font-size: 28rpx; |
|
||||
font-weight: 500; |
|
||||
color: #666666; |
|
||||
transition: color 0.3s ease; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.channel_item.active .channel_text { |
|
||||
color: #333333; |
|
||||
font-weight: 400; |
|
||||
z-index: 2; |
|
||||
} |
|
||||
|
|
||||
.active_indicator { |
|
||||
position: absolute; |
|
||||
left: 50%; |
|
||||
top: 60%; |
|
||||
transform: translateX(-45%); |
|
||||
width: calc(100% - 20rpx); |
|
||||
min-width: 40rpx; |
|
||||
max-width: 120rpx; |
|
||||
height: 8rpx; |
|
||||
background-image: url("/static/marketSituation-image/bg.png"); |
|
||||
background-size: cover; |
|
||||
background-position: center; |
|
||||
background-repeat: no-repeat; |
|
||||
animation: slideIn 0.1s ease; |
|
||||
border-radius: 8rpx; |
|
||||
z-index: 1; |
|
||||
} |
|
||||
|
|
||||
@keyframes slideIn { |
|
||||
from { |
|
||||
width: 0; |
|
||||
opacity: 0; |
|
||||
} |
|
||||
|
|
||||
to { |
|
||||
width: 40rpx; |
|
||||
opacity: 1; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
.scroll_indicator { |
|
||||
border-left: 1rpx solid #b6b6b6; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
width: 60rpx; |
|
||||
height: 30rpx; |
|
||||
background-color: #ffffff; |
|
||||
flex-shrink: 0; |
|
||||
} |
|
||||
|
|
||||
.scroll_indicator image { |
|
||||
width: 20rpx; |
|
||||
height: 20rpx; |
|
||||
opacity: 0.5; |
|
||||
} |
|
||||
|
|
||||
.content { |
|
||||
margin-top: 20rpx; |
|
||||
background-color: white; |
|
||||
} |
|
||||
|
|
||||
.map { |
|
||||
width: calc(100% - 60rpx); |
|
||||
margin: 0 30rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
background-color: #f3f3f3; |
|
||||
border-radius: 30rpx; |
|
||||
border: 1rpx solid #e0e0e0; |
|
||||
padding: 30rpx 20rpx; |
|
||||
box-sizing: border-box; |
|
||||
/* 设置最小高度保护,但允许内容撑开 */ |
|
||||
min-height: 200rpx; |
|
||||
} |
|
||||
|
|
||||
.map image { |
|
||||
width: 100%; |
|
||||
height: auto; |
|
||||
max-width: 100%; |
|
||||
display: block; |
|
||||
/* widthFix模式下,高度会自动按比例调整 */ |
|
||||
/* 设置最大高度避免图片过大 */ |
|
||||
max-height: 60vh; |
|
||||
/* 添加平滑过渡效果 */ |
|
||||
transition: all 0.3s ease; |
|
||||
max-height: 60vh; |
|
||||
} |
|
||||
|
|
||||
/* 响应式优化 */ |
|
||||
@media screen and (max-width: 750rpx) { |
|
||||
.map { |
|
||||
margin: 0 20rpx; |
|
||||
width: calc(100% - 40rpx); |
|
||||
padding: 20rpx 15rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@media screen and (max-width: 480rpx) { |
|
||||
.map { |
|
||||
margin: 0 15rpx; |
|
||||
width: calc(100% - 30rpx); |
|
||||
padding: 15rpx 10rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
.static-footer { |
|
||||
position: fixed; |
|
||||
bottom: 0; |
|
||||
} |
|
||||
|
|
||||
/* 弹窗样式 */ |
|
||||
.modal_overlay { |
|
||||
position: fixed; |
|
||||
top: 0; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
bottom: 0; |
|
||||
background-color: rgba(0, 0, 0, 0.5); |
|
||||
display: flex; |
|
||||
align-items: flex-end; |
|
||||
z-index: 1000; |
|
||||
} |
|
||||
|
|
||||
.modal_content { |
|
||||
width: 100%; |
|
||||
background-color: #fff; |
|
||||
border-radius: 20rpx 20rpx 0 0; |
|
||||
max-height: 80vh; |
|
||||
overflow: hidden; |
|
||||
} |
|
||||
|
|
||||
.modal_header { |
|
||||
position: relative; |
|
||||
display: flex; |
|
||||
justify-content: center; |
|
||||
align-items: center; |
|
||||
padding: 30rpx 40rpx; |
|
||||
border-bottom: 1rpx solid #f0f0f0; |
|
||||
} |
|
||||
|
|
||||
.modal_title { |
|
||||
font-size: 32rpx; |
|
||||
font-weight: bold; |
|
||||
color: #333333; |
|
||||
text-align: center; |
|
||||
} |
|
||||
|
|
||||
.modal_close { |
|
||||
position: absolute; |
|
||||
right: 40rpx; |
|
||||
top: 50%; |
|
||||
transform: translateY(-50%); |
|
||||
width: 60rpx; |
|
||||
height: 60rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
font-size: 40rpx; |
|
||||
color: #999; |
|
||||
} |
|
||||
|
|
||||
.modal_body { |
|
||||
padding: 40rpx; |
|
||||
} |
|
||||
|
|
||||
.country_grid { |
|
||||
display: grid; |
|
||||
grid-template-columns: 1fr 1fr; |
|
||||
gap: 20rpx; |
|
||||
} |
|
||||
|
|
||||
.country_item { |
|
||||
padding: 24rpx 30rpx; |
|
||||
border-radius: 12rpx; |
|
||||
background-color: #f8f8f8; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: center; |
|
||||
transition: all 0.3s ease; |
|
||||
} |
|
||||
|
|
||||
.country_item.selected { |
|
||||
background-color: #ff4444; |
|
||||
color: #fff; |
|
||||
} |
|
||||
|
|
||||
.country_text { |
|
||||
font-size: 28rpx; |
|
||||
color: #333; |
|
||||
} |
|
||||
|
|
||||
.country_item.selected .country_text { |
|
||||
color: #fff; |
|
||||
} |
|
||||
|
|
||||
.global_index { |
|
||||
margin: 30rpx 20rpx 0 20rpx; |
|
||||
display: flex; |
|
||||
justify-content: space-between; |
|
||||
} |
|
||||
|
|
||||
.global_index_title { |
|
||||
margin-left: 20rpx; |
|
||||
font-size: 40rpx; |
|
||||
font-weight: 100; |
|
||||
color: #333333; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.global_index_more { |
|
||||
display: flex; |
|
||||
gap: 10rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #333333; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.global_index_more image { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
/* 卡片网格样式 */ |
|
||||
.cards_grid { |
|
||||
display: grid; |
|
||||
grid-template-columns: repeat(3, 1fr); |
|
||||
margin: 0; |
|
||||
box-sizing: border-box; |
|
||||
width: 100%; |
|
||||
} |
|
||||
|
|
||||
.card_item { |
|
||||
width: 100%; |
|
||||
box-sizing: border-box; |
|
||||
min-width: 0; |
|
||||
/* 防止内容溢出 */ |
|
||||
} |
|
||||
|
|
||||
/* 响应式布局 - 小屏幕时改为两列 */ |
|
||||
@media (max-width: 600rpx) { |
|
||||
.cards_grid { |
|
||||
grid-template-columns: repeat(2, 1fr); |
|
||||
padding: 30rpx 20rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/* 超小屏幕时改为单列 */ |
|
||||
@media (max-width: 400rpx) { |
|
||||
.cards_grid { |
|
||||
grid-template-columns: 1fr; |
|
||||
padding: 30rpx 20rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
.warn { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
justify-content: flex-start; |
|
||||
gap: 10rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #666666; |
|
||||
padding: 20rpx; |
|
||||
max-width: 100%; |
|
||||
overflow: hidden; |
|
||||
position: relative; |
|
||||
} |
|
||||
|
|
||||
.warn image { |
|
||||
width: 40rpx; |
|
||||
height: 40rpx; |
|
||||
flex-shrink: 0; |
|
||||
/* 防止图片被压缩 */ |
|
||||
position: relative; |
|
||||
z-index: 2; |
|
||||
/* 确保图片在最上层 */ |
|
||||
} |
|
||||
|
|
||||
.warn_text_container { |
|
||||
flex: 1; |
|
||||
overflow: hidden; |
|
||||
position: relative; |
|
||||
min-width: 0; |
|
||||
/* 允许容器收缩 */ |
|
||||
} |
|
||||
|
|
||||
.warn_text { |
|
||||
display: block; |
|
||||
white-space: nowrap; |
|
||||
will-change: transform; |
|
||||
/* 优化动画性能 */ |
|
||||
} |
|
||||
|
|
||||
/* 文字滚动动画 */ |
|
||||
@keyframes scrollText { |
|
||||
0% { |
|
||||
transform: translateX(0); |
|
||||
} |
|
||||
|
|
||||
20% { |
|
||||
transform: translateX(0); |
|
||||
} |
|
||||
|
|
||||
80% { |
|
||||
transform: translateX(-85%); |
|
||||
} |
|
||||
|
|
||||
100% { |
|
||||
transform: translateX(-85%); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/* 当文字超长时启用滚动动画 */ |
|
||||
.warn_text.scroll-active { |
|
||||
animation: scrollText 12s linear infinite; |
|
||||
animation-delay: 2s; |
|
||||
/* 延迟2秒开始滚动,让用户先看到开头 */ |
|
||||
} |
|
||||
|
|
||||
/* 底部安全区域 */ |
|
||||
.bottom_safe_area { |
|
||||
height: 40rpx; |
|
||||
background-color: transparent; |
|
||||
} |
|
||||
|
|
||||
/* 主容器样式调整 */ |
|
||||
.main { |
|
||||
position: relative; |
|
||||
height: 100vh; |
|
||||
overflow: hidden; |
|
||||
background-color: white; |
|
||||
} |
|
||||
</style> |
|
||||
@ -0,0 +1,655 @@ |
|||||
|
<template> |
||||
|
<view style="width: 750rpx; height: 750rpx;"> |
||||
|
<l-echart ref="chartRef" @finished="initChart"></l-echart> |
||||
|
</view> |
||||
|
</template> |
||||
|
<script setup> |
||||
|
import { ref, computed, onMounted } from 'vue'; |
||||
|
|
||||
|
const chartRef = ref(null) |
||||
|
// 获取系统信息,替代 window.innerWidth |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
const screenWidth = ref(systemInfo.screenWidth || 375) // 默认值 375px |
||||
|
|
||||
|
// 生成30天的交易信号数据 |
||||
|
const generateAIGoldBullData = () => { |
||||
|
const data = [] |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
// 模拟交易信号 [索引, 买入信号, 卖出信号, 持有信号, 强度, 成交量] |
||||
|
const buySignal = Math.random() > 0.7 ? 1 : 0 // 30%概率买入信号 |
||||
|
const sellSignal = Math.random() > 0.8 ? 1 : 0 // 20%概率卖出信号 |
||||
|
const holdSignal = Math.random() > 0.5 ? 1 : 0 // 50%概率持有信号 |
||||
|
const strength = Math.floor(Math.random() * 3) + 1 // 信号强度1-3 |
||||
|
const volume = Math.floor(Math.random() * 2000) + 500 // 成交量500-2500 |
||||
|
|
||||
|
data.push([i, buySignal, sellSignal, holdSignal, strength, volume]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 添加缺失的变量定义 |
||||
|
var option |
||||
|
const AIGoldBull = ref({ |
||||
|
JN: generateAIGoldBullData() |
||||
|
}) |
||||
|
|
||||
|
// 模拟多语言数据 |
||||
|
const t = ref({ |
||||
|
suoxie: 'zh', |
||||
|
tianxian: '天线', |
||||
|
feixian: '飞线', |
||||
|
zhoongxian: '中线', |
||||
|
liuxian: '流线', |
||||
|
Klinetext_5: 'K线5', |
||||
|
Klinetext_6: 'K线6', |
||||
|
maipan: '买盘', |
||||
|
maipan1: '卖盘' |
||||
|
}) |
||||
|
|
||||
|
// 生成30天的模拟K线数据 [日期, 开盘, 最高, 最低, 收盘] |
||||
|
const generateKLineData = () => { |
||||
|
const data = [] |
||||
|
let basePrice = 2450 // 黄金基础价格 |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const date = new Date(2024, 0, i + 1).toISOString().split('T')[0] |
||||
|
|
||||
|
// 模拟价格波动 |
||||
|
const volatility = (Math.random() - 0.5) * 50 // ±25的波动 |
||||
|
const open = basePrice + volatility |
||||
|
|
||||
|
const highVolatility = Math.random() * 30 + 10 // 10-40的向上波动 |
||||
|
const lowVolatility = Math.random() * 30 + 10 // 10-40的向下波动 |
||||
|
|
||||
|
const high = Math.max(open, open + highVolatility) |
||||
|
const low = Math.min(open, open - lowVolatility) |
||||
|
|
||||
|
const closeVolatility = (Math.random() - 0.5) * 20 |
||||
|
const close = Math.max(low, Math.min(high, open + closeVolatility)) |
||||
|
|
||||
|
data.push([date, |
||||
|
Math.round(open * 100) / 100, |
||||
|
Math.round(high * 100) / 100, |
||||
|
Math.round(low * 100) / 100, |
||||
|
Math.round(close * 100) / 100 |
||||
|
]) |
||||
|
|
||||
|
basePrice = close // 下一天的基础价格 |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成30天的成交量和技术指标数据 [日期, 成交量1, 成交量2, 指标1, 指标2, 指标3] |
||||
|
const generateWaveVolData = () => { |
||||
|
const data = [] |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const date = new Date(2024, 0, i + 1).toISOString().split('T')[0] |
||||
|
|
||||
|
// 模拟成交量数据 |
||||
|
const vol1 = Math.floor(Math.random() * 2000) + 800 // 800-2800 |
||||
|
const vol2 = Math.floor(Math.random() * 1500) + 600 // 600-2100 |
||||
|
|
||||
|
// 模拟技术指标 |
||||
|
const indicator1 = Math.floor(Math.random() * 30) + 40 // 40-70 |
||||
|
const indicator2 = Math.floor(Math.random() * 40) + 50 // 50-90 |
||||
|
const indicator3 = Math.floor(Math.random() * 35) + 60 // 60-95 |
||||
|
|
||||
|
data.push([date, vol1, vol2, indicator1, indicator2, indicator3]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成30天的移动平均线数据 [MA5, MA10, MA20, MA30] |
||||
|
const generateFTLineData = () => { |
||||
|
const data = [] |
||||
|
let ma5Base = 2450 |
||||
|
let ma10Base = 2445 |
||||
|
let ma20Base = 2440 |
||||
|
let ma30Base = 2435 |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
// 模拟移动平均线的平滑变化 |
||||
|
ma5Base += (Math.random() - 0.5) * 10 |
||||
|
ma10Base += (Math.random() - 0.5) * 8 |
||||
|
ma20Base += (Math.random() - 0.5) * 6 |
||||
|
ma30Base += (Math.random() - 0.5) * 4 |
||||
|
|
||||
|
data.push([ |
||||
|
Math.round(ma5Base * 100) / 100, |
||||
|
Math.round(ma10Base * 100) / 100, |
||||
|
Math.round(ma20Base * 100) / 100, |
||||
|
Math.round(ma30Base * 100) / 100 |
||||
|
]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成模拟数据 |
||||
|
const mockKLineData = generateKLineData() |
||||
|
const mockWaveVolData = generateWaveVolData() |
||||
|
const mockFTLineData = generateFTLineData() |
||||
|
|
||||
|
// 生成RSI指标数据 (相对强弱指数) |
||||
|
const generateRSIData = () => { |
||||
|
const data = [] |
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const rsi = Math.random() * 60 + 20 // RSI值在20-80之间 |
||||
|
data.push(Math.round(rsi * 100) / 100) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成MACD指标数据 |
||||
|
const generateMACDData = () => { |
||||
|
const data = [] |
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const macd = (Math.random() - 0.5) * 20 // MACD值在-10到10之间 |
||||
|
const signal = (Math.random() - 0.5) * 15 // 信号线 |
||||
|
const histogram = macd - signal // 柱状图 |
||||
|
|
||||
|
data.push([ |
||||
|
Math.round(macd * 100) / 100, |
||||
|
Math.round(signal * 100) / 100, |
||||
|
Math.round(histogram * 100) / 100 |
||||
|
]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成布林带数据 |
||||
|
const generateBollingerData = () => { |
||||
|
const data = [] |
||||
|
let middleLine = 2450 |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
middleLine += (Math.random() - 0.5) * 10 |
||||
|
const upperBand = middleLine + Math.random() * 30 + 20 // 上轨 |
||||
|
const lowerBand = middleLine - Math.random() * 30 - 20 // 下轨 |
||||
|
|
||||
|
data.push([ |
||||
|
Math.round(upperBand * 100) / 100, |
||||
|
Math.round(middleLine * 100) / 100, |
||||
|
Math.round(lowerBand * 100) / 100 |
||||
|
]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成成交量分析数据 |
||||
|
const generateVolumeAnalysisData = () => { |
||||
|
const data = [] |
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const buyVolume = Math.floor(Math.random() * 1500) + 500 // 买入量 |
||||
|
const sellVolume = Math.floor(Math.random() * 1500) + 500 // 卖出量 |
||||
|
const netVolume = buyVolume - sellVolume // 净买入量 |
||||
|
|
||||
|
data.push([buyVolume, sellVolume, netVolume]) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成市场情绪数据 |
||||
|
const generateMarketSentimentData = () => { |
||||
|
const sentiments = ['极度恐慌', '恐慌', '中性', '贪婪', '极度贪婪'] |
||||
|
const data = [] |
||||
|
|
||||
|
for (let i = 0; i < 30; i++) { |
||||
|
const sentimentIndex = Math.floor(Math.random() * 100) // 0-100的情绪指数 |
||||
|
const sentimentLabel = sentiments[Math.floor(sentimentIndex / 20)] |
||||
|
|
||||
|
data.push({ |
||||
|
date: new Date(2024, 0, i + 1).toISOString().split('T')[0], |
||||
|
index: sentimentIndex, |
||||
|
label: sentimentLabel, |
||||
|
fearGreedRatio: Math.random() * 100 |
||||
|
}) |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 生成重要新闻事件数据 |
||||
|
const generateNewsEventsData = () => { |
||||
|
const events = [ |
||||
|
'美联储利率决议', |
||||
|
'非农就业数据发布', |
||||
|
'通胀数据公布', |
||||
|
'地缘政治紧张', |
||||
|
'央行政策变化', |
||||
|
'经济数据超预期', |
||||
|
'市场技术突破', |
||||
|
'大宗商品价格波动' |
||||
|
] |
||||
|
|
||||
|
const data = [] |
||||
|
for (let i = 0; i < 10; i++) { // 生成10个随机事件 |
||||
|
const randomDay = Math.floor(Math.random() * 30) + 1 |
||||
|
const event = events[Math.floor(Math.random() * events.length)] |
||||
|
const impact = Math.floor(Math.random() * 5) + 1 // 影响力1-5 |
||||
|
|
||||
|
data.push({ |
||||
|
date: new Date(2024, 0, randomDay).toISOString().split('T')[0], |
||||
|
event: event, |
||||
|
impact: impact, |
||||
|
type: Math.random() > 0.5 ? 'positive' : 'negative' |
||||
|
}) |
||||
|
} |
||||
|
return data.sort((a, b) => new Date(a.date) - new Date(b.date)) |
||||
|
} |
||||
|
|
||||
|
// 生成价格预测数据 |
||||
|
const generatePricePredictionData = () => { |
||||
|
const data = [] |
||||
|
let currentPrice = 2450 |
||||
|
|
||||
|
for (let i = 0; i < 7; i++) { // 未来7天预测 |
||||
|
const date = new Date(2024, 1, i + 1).toISOString().split('T')[0] // 2月份 |
||||
|
|
||||
|
// 模拟AI预测的价格区间 |
||||
|
const prediction = currentPrice + (Math.random() - 0.5) * 100 |
||||
|
const confidence = Math.random() * 40 + 60 // 60-100%的置信度 |
||||
|
const upperBound = prediction + Math.random() * 50 |
||||
|
const lowerBound = prediction - Math.random() * 50 |
||||
|
|
||||
|
data.push({ |
||||
|
date: date, |
||||
|
predicted_price: Math.round(prediction * 100) / 100, |
||||
|
confidence: Math.round(confidence), |
||||
|
upper_bound: Math.round(upperBound * 100) / 100, |
||||
|
lower_bound: Math.round(lowerBound * 100) / 100 |
||||
|
}) |
||||
|
|
||||
|
currentPrice = prediction |
||||
|
} |
||||
|
return data |
||||
|
} |
||||
|
|
||||
|
// 模拟提取的绘图数据 |
||||
|
const extractedDrawData = { |
||||
|
KLine20: mockKLineData, |
||||
|
WAVEVOL: mockWaveVolData, |
||||
|
FTLINE: mockFTLineData, |
||||
|
RSI: generateRSIData(), |
||||
|
MACD: generateMACDData(), |
||||
|
BOLLINGER: generateBollingerData(), |
||||
|
VOLUME_ANALYSIS: generateVolumeAnalysisData(), |
||||
|
MARKET_SENTIMENT: generateMarketSentimentData(), |
||||
|
NEWS_EVENTS: generateNewsEventsData(), |
||||
|
PRICE_PREDICTION: generatePricePredictionData() |
||||
|
} |
||||
|
|
||||
|
const fnShowEcharts4 = (extractedDrawData) => { |
||||
|
const splitData = (b) => { |
||||
|
const a = JSON.parse(JSON.stringify(b)) |
||||
|
let categoryData = [] |
||||
|
let values = [] |
||||
|
for (let i = 0; i < a.length; i++) { |
||||
|
categoryData.push(a[i].splice(0, 1)[0]) |
||||
|
values.push(a[i]) |
||||
|
} |
||||
|
return { |
||||
|
categoryData, |
||||
|
values |
||||
|
} |
||||
|
} |
||||
|
var bodongliang = splitData(extractedDrawData.WAVEVOL) |
||||
|
function bodongliangData(values, i) { |
||||
|
return values.map((subArray) => subArray[i]) |
||||
|
} |
||||
|
function calculateMA(index, data) { |
||||
|
let result = [] |
||||
|
if (data.FTLINE) { |
||||
|
data.FTLINE.forEach((item) => { |
||||
|
result.push(item[index]) |
||||
|
}) |
||||
|
} |
||||
|
return result |
||||
|
} |
||||
|
function vwToPx(vw) { |
||||
|
return (screenWidth.value * vw) / 100 |
||||
|
} |
||||
|
var dealData = splitData(extractedDrawData.KLine20) |
||||
|
var dealGnBullData = AIGoldBull.value.JN |
||||
|
const textEcharts = t.value |
||||
|
const firstLegend = computed(() => { |
||||
|
if (screenWidth.value < 768) { |
||||
|
if (textEcharts.suoxie === 'en' || textEcharts.suoxie === 'th') { |
||||
|
return '2%' |
||||
|
} else if (textEcharts.suoxie === 'kr') { |
||||
|
return '2%' |
||||
|
} else { |
||||
|
return '2%' |
||||
|
} |
||||
|
} else { |
||||
|
return textEcharts.suoxie === 'en' || |
||||
|
textEcharts.suoxie === 'th' || |
||||
|
textEcharts.suoxie === 'kr' |
||||
|
? '9%' |
||||
|
: '9%' |
||||
|
} |
||||
|
}) |
||||
|
const processBarData = (data) => { |
||||
|
const barData = [] |
||||
|
data.forEach((item) => { |
||||
|
let color |
||||
|
switch (item[4]) { |
||||
|
case 1: |
||||
|
color = '#13E113' |
||||
|
break |
||||
|
case 2: |
||||
|
color = '#FF0E00' |
||||
|
break |
||||
|
case 3: |
||||
|
color = '#0000FE' |
||||
|
break |
||||
|
case 4: |
||||
|
color = '#1397FF' |
||||
|
break |
||||
|
} |
||||
|
barData.push({ |
||||
|
value: item[5], |
||||
|
itemStyle: { |
||||
|
normal: { |
||||
|
color: color |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}) |
||||
|
return { barData } |
||||
|
} |
||||
|
const { barData } = processBarData(dealGnBullData) |
||||
|
option = { |
||||
|
tooltip: { |
||||
|
trigger: 'axis', |
||||
|
axisPointer: { |
||||
|
type: 'cross' |
||||
|
}, |
||||
|
backgroundColor: 'rgba(119, 120, 125, 0.6)', |
||||
|
borderWidth: 1, |
||||
|
borderColor: '#77787D', |
||||
|
padding: 10, |
||||
|
textStyle: { |
||||
|
color: '#fff' |
||||
|
} |
||||
|
}, |
||||
|
axisPointer: { |
||||
|
link: [ |
||||
|
{ |
||||
|
xAxisIndex: 'all' |
||||
|
} |
||||
|
], |
||||
|
label: { |
||||
|
backgroundColor: '#77787D' |
||||
|
} |
||||
|
}, |
||||
|
toolbox: { |
||||
|
show: false |
||||
|
}, |
||||
|
grid: [ |
||||
|
{ |
||||
|
left: screenWidth.value > 768 ? '10%' : '12%', |
||||
|
right: screenWidth.value > 768 ? '4%' : '6%', |
||||
|
top: screenWidth.value > 768 ? '10%' : '12%', |
||||
|
height: screenWidth.value > 768 ? '35%' : '34%', |
||||
|
containLabel: false |
||||
|
}, |
||||
|
{ |
||||
|
left: screenWidth.value > 768 ? '10%' : '12%', |
||||
|
right: screenWidth.value > 768 ? '4%' : '6%', |
||||
|
top: screenWidth.value > 768 ? '48%' : '48%', |
||||
|
height: screenWidth.value > 768 ? '19%' : '21%', |
||||
|
containLabel: false |
||||
|
}, |
||||
|
{ |
||||
|
left: screenWidth.value > 768 ? '10%' : '12%', |
||||
|
right: screenWidth.value > 768 ? '4%' : '6%', |
||||
|
top: screenWidth.value > 768 ? '70%' : '71%', |
||||
|
height: screenWidth.value > 768 ? '19%' : '21%', |
||||
|
containLabel: false |
||||
|
} |
||||
|
], |
||||
|
xAxis: [ |
||||
|
{ |
||||
|
type: 'category', |
||||
|
data: dealData.categoryData, |
||||
|
boundaryGap: true, |
||||
|
axisLine: { onZero: false }, |
||||
|
splitLine: { show: false }, |
||||
|
min: 'dataMin', |
||||
|
max: 'dataMax', |
||||
|
axisPointer: { |
||||
|
z: 100, |
||||
|
label: { |
||||
|
show: false // 不显示标签 |
||||
|
} |
||||
|
}, |
||||
|
axisLine: { |
||||
|
lineStyle: { |
||||
|
color: 'black' |
||||
|
} |
||||
|
}, // |
||||
|
axisLabel: { show: false }, |
||||
|
axisTick: { show: false } |
||||
|
}, |
||||
|
{ |
||||
|
type: 'category', |
||||
|
gridIndex: 1, |
||||
|
data: dealData.categoryData, |
||||
|
boundaryGap: true, |
||||
|
axisPointer: { |
||||
|
z: 100, |
||||
|
label: { |
||||
|
show: false // 不显示标签 |
||||
|
} |
||||
|
}, |
||||
|
axisLine: { lineStyle: { color: 'black' } }, |
||||
|
axisLabel: { |
||||
|
show: false, |
||||
|
interval: 'auto' |
||||
|
}, |
||||
|
axisTick: { show: false } |
||||
|
}, |
||||
|
{ |
||||
|
type: 'category', |
||||
|
gridIndex: 2, |
||||
|
data: dealData.categoryData, |
||||
|
boundaryGap: true, |
||||
|
axisLine: { lineStyle: { color: 'black' } }, |
||||
|
axisLabel: { |
||||
|
show: true, |
||||
|
interval: 'auto', |
||||
|
fontSize: screenWidth.value > 768 ? 15 : 9 |
||||
|
}, |
||||
|
axisTick: { show: false } |
||||
|
} |
||||
|
], |
||||
|
yAxis: [ |
||||
|
{ |
||||
|
scale: true, |
||||
|
gridIndex: 0, |
||||
|
position: 'left', |
||||
|
axisLabel: { |
||||
|
inside: false, |
||||
|
align: 'right', |
||||
|
fontSize: screenWidth.value > 768 ? 15 : 9 |
||||
|
}, |
||||
|
axisLine: { |
||||
|
show: true, |
||||
|
lineStyle: { |
||||
|
fontSize: '', |
||||
|
color: 'black' |
||||
|
} |
||||
|
}, |
||||
|
axisTick: { show: false }, |
||||
|
splitLine: { show: false } |
||||
|
}, |
||||
|
{ |
||||
|
scale: true, |
||||
|
gridIndex: 1, |
||||
|
splitNumber: 4, |
||||
|
min: 0, |
||||
|
minInterval: 1, |
||||
|
axisLabel: { |
||||
|
show: true, |
||||
|
fontSize: screenWidth.value > 768 ? 15 : 9, |
||||
|
margin: 8, |
||||
|
}, |
||||
|
axisLine: { show: true, lineStyle: { color: 'black' } }, |
||||
|
axisTick: { show: false }, |
||||
|
splitLine: { show: true, lineStyle: { type: 'dashed' } }, |
||||
|
boundaryGap: ['20%', '20%'] |
||||
|
}, |
||||
|
{ |
||||
|
scale: true, |
||||
|
gridIndex: 2, |
||||
|
splitNumber: 2, |
||||
|
axisLabel: { |
||||
|
show: true, |
||||
|
fontSize: screenWidth.value > 768 ? 15 : 9 |
||||
|
}, |
||||
|
axisLine: { show: true, lineStyle: { color: 'black' } }, |
||||
|
axisTick: { show: false }, |
||||
|
splitLine: { show: false } |
||||
|
} |
||||
|
], |
||||
|
dataZoom: [ |
||||
|
{ |
||||
|
type: 'inside', |
||||
|
xAxisIndex: [0, 1, 2], |
||||
|
start: 50, |
||||
|
end: 100 |
||||
|
}, |
||||
|
{ |
||||
|
show: true, |
||||
|
xAxisIndex: [0, 1, 2], |
||||
|
type: 'slider', |
||||
|
start: 50, |
||||
|
end: 100 |
||||
|
} |
||||
|
], |
||||
|
series: [ |
||||
|
{ |
||||
|
type: 'candlestick', |
||||
|
name: '日K', |
||||
|
xAxisIndex: 0, |
||||
|
yAxisIndex: 0, |
||||
|
data: dealData.values, |
||||
|
itemStyle: { |
||||
|
normal: { |
||||
|
color0: 'red', |
||||
|
color: 'green', |
||||
|
borderColor0: 'red', |
||||
|
borderColor: 'green' |
||||
|
} |
||||
|
}, |
||||
|
gridIndex: 1 |
||||
|
}, |
||||
|
{ |
||||
|
name: '成交量', |
||||
|
type: 'bar', |
||||
|
barWidth: '70%', |
||||
|
xAxisIndex: 1, |
||||
|
yAxisIndex: 1, |
||||
|
data: barData, |
||||
|
}, |
||||
|
// { |
||||
|
// name: textEcharts.feixian, |
||||
|
// type: 'line', |
||||
|
// data: calculateMA(1, extractedDrawData), |
||||
|
// smooth: true, |
||||
|
// symbol: 'none', |
||||
|
// xAxisIndex: 2, |
||||
|
// yAxisIndex: 2, |
||||
|
// itemStyle: { |
||||
|
// normal: { |
||||
|
// color: '#00a32e', |
||||
|
// lineStyle: { |
||||
|
// color: '#00a32e', |
||||
|
// width: 2, |
||||
|
// type: 'solid' |
||||
|
// } |
||||
|
// } |
||||
|
// } |
||||
|
// }, |
||||
|
// { |
||||
|
// name: textEcharts.zhoongxian, |
||||
|
// type: 'line', |
||||
|
// data: calculateMA(2, extractedDrawData), |
||||
|
// smooth: true, |
||||
|
// symbol: 'none', |
||||
|
// xAxisIndex: 2, |
||||
|
// yAxisIndex: 2, |
||||
|
// itemStyle: { |
||||
|
// normal: { |
||||
|
// color: '#de0000', |
||||
|
// lineStyle: { |
||||
|
// color: '#de0000', |
||||
|
// width: 2, |
||||
|
// type: 'solid' |
||||
|
// } |
||||
|
// } |
||||
|
// } |
||||
|
// }, |
||||
|
// { |
||||
|
// name: textEcharts.tianxian, |
||||
|
// type: 'line', |
||||
|
// data: calculateMA(3, extractedDrawData), |
||||
|
// smooth: true, |
||||
|
// symbol: 'none', |
||||
|
// xAxisIndex: 2, |
||||
|
// yAxisIndex: 2, |
||||
|
// itemStyle: { |
||||
|
// normal: { |
||||
|
// color: '#ffb300', |
||||
|
// lineStyle: { |
||||
|
// color: '#ffb300', |
||||
|
// width: 2, |
||||
|
// type: 'solid' |
||||
|
// } |
||||
|
// } |
||||
|
// } |
||||
|
// }, |
||||
|
// { |
||||
|
// name: textEcharts.liuxian, |
||||
|
// type: 'line', |
||||
|
// data: calculateMA(4, extractedDrawData), |
||||
|
// smooth: true, |
||||
|
// symbol: 'none', |
||||
|
// xAxisIndex: 2, |
||||
|
// yAxisIndex: 2, |
||||
|
// itemStyle: { |
||||
|
// normal: { |
||||
|
// color: '#00c8ff', |
||||
|
// lineStyle: { |
||||
|
// color: '#00c8ff', |
||||
|
// width: 2, |
||||
|
// type: 'solid' |
||||
|
// } |
||||
|
// } |
||||
|
// } |
||||
|
// }, |
||||
|
] |
||||
|
} |
||||
|
initChart() |
||||
|
} |
||||
|
|
||||
|
// 组件挂载时初始化图表 |
||||
|
onMounted(() => { |
||||
|
// 调用图表初始化函数 |
||||
|
fnShowEcharts4(extractedDrawData) |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
// 初始化图表 |
||||
|
const initChart = async () => { |
||||
|
if (!chartRef.value) return |
||||
|
|
||||
|
try { |
||||
|
const chart = await chartRef.value.init(echarts) |
||||
|
chart.setOption(option) |
||||
|
} catch (error) { |
||||
|
console.error('图表初始化失败:', error) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
@ -0,0 +1,493 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<!-- 市场子Tab --> |
||||
|
<view class="sub_tabs"> |
||||
|
<view v-for="(tab, i) in marketTabs" :key="tab" :class="['tab_item', i === activeTabIndex ? 'active' : '']" |
||||
|
@click="switchTab(i)"> |
||||
|
<text>{{ tab }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 大盘指数 --> |
||||
|
<view class="section"> |
||||
|
<view class="section_header"> |
||||
|
<text class="section_title">大盘指数</text> |
||||
|
<text class="section_action" @click="viewMore('indices')">查看更多 ></text> |
||||
|
</view> |
||||
|
<view class="indices_grid"> |
||||
|
<view v-for="(index, i) in countryInfo.mainIndices" :key="i" class="index_item"> |
||||
|
<IndexCard :flagIcon="countryInfo.flag" :indexName="index.name" :currentPrice="index.price" |
||||
|
:changeAmount="index.change" :changePercent="index.changePercent" :isRising="index.isRising" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 今日市场情绪温度 --> |
||||
|
<view class="sentiment"> |
||||
|
<view class="section_subtitle"> |
||||
|
<text>今日市场情绪温度</text> |
||||
|
</view> |
||||
|
<view class="meters"> |
||||
|
<view class="meter_item" v-for="(m, i) in sentimentMeters" :key="i"> |
||||
|
<image class="meter_icon" :class="m.theme" :src="selectIcons[m.theme]" mode="aspectFit"></image> |
||||
|
<view class="meter_info"> |
||||
|
<text class="meter_value" :class="m.theme">{{ m.value }}°C</text> |
||||
|
<text class="meter_label" :class="m.theme">{{ m.label }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 板块 --> |
||||
|
<view class="section"> |
||||
|
<view class="section_header"> |
||||
|
<text class="section_title">板块</text> |
||||
|
<text class="section_action" @click="viewMore('sectors')">查看更多 ></text> |
||||
|
</view> |
||||
|
<view class="sectors_grid"> |
||||
|
<view v-for="(sec, i) in sectors" :key="i" class="sector_item"> |
||||
|
<view class="sector_header"> |
||||
|
<text class="sector_name">{{ sec.name }}</text> |
||||
|
<text :class="['sector_change', sec.isRising ? 'rising' : 'falling']"> |
||||
|
{{ sec.change }} |
||||
|
</text> |
||||
|
</view> |
||||
|
<view class="sector_price">{{ sec.price }}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 股票 --> |
||||
|
<view class="section"> |
||||
|
<view class="section_header"> |
||||
|
<text class="section_title">股票</text> |
||||
|
<text class="section_action" @click="viewMore('stocks')">查看更多 ></text> |
||||
|
</view> |
||||
|
<view class="table"> |
||||
|
<view class="table_header"> |
||||
|
<text class="cell name">名称</text> |
||||
|
<text class="cell price">最新</text> |
||||
|
<text class="cell change">涨幅</text> |
||||
|
</view> |
||||
|
<view class="table_row" v-for="(stk, i) in stocks" :key="i"> |
||||
|
<view class="cell name"> |
||||
|
<text class="stk_name">{{ stk.name }}</text> |
||||
|
<text class="stk_code">{{ stk.code }}</text> |
||||
|
</view> |
||||
|
<view class="cell price"> |
||||
|
<text class="stk_price">{{ stk.price }}</text> |
||||
|
</view> |
||||
|
<view class="cell change"> |
||||
|
<text :class="['stk_change', stk.isRising ? 'rising' : 'falling']"> |
||||
|
{{ stk.change }} |
||||
|
</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部安全区域 --> |
||||
|
<view class="bottom_safe_area"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, onMounted } from 'vue' |
||||
|
import IndexCard from '../../components/IndexCard.vue' |
||||
|
|
||||
|
// 子Tab与操作 |
||||
|
const marketTabs = ['全部', '美股', '纽交所', '纳斯达克'] |
||||
|
const activeTabIndex = ref(0) |
||||
|
const switchTab = (i) => { |
||||
|
activeTabIndex.value = i |
||||
|
} |
||||
|
|
||||
|
// 今日情绪温度示例数据 |
||||
|
const sentimentMeters = [ |
||||
|
{ value: 90, label: '道琼斯', theme: 'hot' }, |
||||
|
{ value: 60, label: '纳斯达克', theme: 'warm' }, |
||||
|
{ value: 20, label: '标普500', theme: 'cool' } |
||||
|
] |
||||
|
|
||||
|
// 图标映射 |
||||
|
const selectIcons = { |
||||
|
hot: '/static/marketSituation-image/hot.png', |
||||
|
warm: '/static/marketSituation-image/warm.png', |
||||
|
cool: '/static/marketSituation-image/cool.png' |
||||
|
} |
||||
|
|
||||
|
// Props |
||||
|
const props = defineProps({ |
||||
|
countryId: { |
||||
|
type: Number, |
||||
|
required: true |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 国家/地区信息映射 |
||||
|
const countryInfoMap = { |
||||
|
2: { // 新加坡 |
||||
|
name: '新加坡', |
||||
|
flag: '🇸🇬', |
||||
|
isMarketOpen: true, |
||||
|
mainIndices: [ |
||||
|
{ name: '海峡时报指数', price: '3,234.56', change: '+12.34', changePercent: '+0.38%', isRising: true }, |
||||
|
{ name: 'FTSE ST Mid Cap', price: '1,234.56', change: '-5.67', changePercent: '-0.46%', isRising: false } |
||||
|
], |
||||
|
hotStocks: [ |
||||
|
{ name: '星展银行', code: 'D05.SI', price: '35.20', change: '+0.15', isRising: true }, |
||||
|
{ name: '华侨银行', code: 'O39.SI', price: '13.45', change: '-0.05', isRising: false } |
||||
|
] |
||||
|
}, |
||||
|
3: { // 马来西亚 |
||||
|
name: '马来西亚', |
||||
|
flag: '🇲🇾', |
||||
|
isMarketOpen: false, |
||||
|
mainIndices: [ |
||||
|
{ name: '富时大马KLCI指数', price: '1,567.89', change: '+8.90', changePercent: '+0.57%', isRising: true } |
||||
|
], |
||||
|
hotStocks: [ |
||||
|
{ name: '马来亚银行', code: '1155.KL', price: '9.85', change: '+0.10', isRising: true }, |
||||
|
{ name: '大众银行', code: '1295.KL', price: '4.32', change: '-0.02', isRising: false } |
||||
|
] |
||||
|
}, |
||||
|
4: { // 印度尼西亚 |
||||
|
name: '印度尼西亚', |
||||
|
flag: '🇮🇩', |
||||
|
isMarketOpen: true, |
||||
|
mainIndices: [ |
||||
|
{ name: '雅加达综合指数', price: '7,234.56', change: '+45.67', changePercent: '+0.63%', isRising: true } |
||||
|
], |
||||
|
hotStocks: [] |
||||
|
}, |
||||
|
5: { // 美国 |
||||
|
name: '美国', |
||||
|
flag: '🇺🇸', |
||||
|
isMarketOpen: false, |
||||
|
mainIndices: [ |
||||
|
{ name: '道琼斯', price: '45,757.90', change: '-125.22', changePercent: '-0.27%', isRising: false }, |
||||
|
{ name: '纳斯达克', price: '22,333.96', change: '+125.22', changePercent: '+0.47%', isRising: true }, |
||||
|
{ name: '标普500', price: '6,606.08', change: '+125.22', changePercent: '+0.27%', isRising: true } |
||||
|
], |
||||
|
hotStocks: [ |
||||
|
{ name: '苹果', code: 'AAPL', price: '195.89', change: '+2.34', isRising: true }, |
||||
|
{ name: '微软', code: 'MSFT', price: '378.85', change: '-1.23', isRising: false } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 计算当前国家信息 |
||||
|
const countryInfo = computed(() => { |
||||
|
return countryInfoMap[props.countryId] || { |
||||
|
name: '未知地区', |
||||
|
flag: '🌍', |
||||
|
isMarketOpen: false, |
||||
|
mainIndices: [], |
||||
|
hotStocks: [] |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 计算当前国家的板块与股票 |
||||
|
const sectors = computed(() => { |
||||
|
return countryInfoMap[props.countryId]?.sectors || [] |
||||
|
}) |
||||
|
const stocks = computed(() => { |
||||
|
return countryInfoMap[props.countryId]?.stocks || [] |
||||
|
}) |
||||
|
|
||||
|
// 查看更多占位 |
||||
|
const viewMore = (type) => { |
||||
|
// 可根据 type 跳转到相应页面或加载更多 |
||||
|
// 例如:indices/sectors/stocks |
||||
|
// uni.navigateTo({ url: `/pages/marketSituation/${type}List` }) |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.content { |
||||
|
padding: 0 20rpx 20rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 子Tab */ |
||||
|
.sub_tabs { |
||||
|
display: flex; |
||||
|
gap: 16rpx; |
||||
|
padding: 0 20rpx 20rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
.tab_item { |
||||
|
padding: 6rpx 20rpx; |
||||
|
border-radius: 5rpx; |
||||
|
background: #f5f5f5; |
||||
|
color: #666; |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.tab_item.active { |
||||
|
background: #ff4444; |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.section { |
||||
|
padding: 20rpx; |
||||
|
border-radius: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.section_header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.section_title { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.section_action { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.indices_grid { |
||||
|
padding: 20rpx; |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
gap: 20rpx; |
||||
|
background-color: #F6F6F6; |
||||
|
} |
||||
|
|
||||
|
/* 情绪温度 */ |
||||
|
.sentiment { |
||||
|
background-color: #F6F6F6; |
||||
|
padding: 0 20rpx 20rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
.section_subtitle { |
||||
|
font-size: 24rpx; |
||||
|
color: #000000; |
||||
|
padding: 20rpx 0; |
||||
|
} |
||||
|
|
||||
|
.meters { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.meter_item { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
/* padding: 10rpx; */ |
||||
|
background: #ffffff; |
||||
|
border-radius: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.meter_item image { |
||||
|
width: 100rpx; |
||||
|
height: 100rpx; |
||||
|
} |
||||
|
|
||||
|
.meter_info { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
} |
||||
|
|
||||
|
.meter_value { |
||||
|
font-size: 36rpx; |
||||
|
} |
||||
|
|
||||
|
.meter_value.hot { |
||||
|
color: #ff6b6b; |
||||
|
} |
||||
|
|
||||
|
.meter_value.warm { |
||||
|
color: #ffd166; |
||||
|
} |
||||
|
|
||||
|
.meter_value.cool { |
||||
|
color: #60a5fa; |
||||
|
} |
||||
|
|
||||
|
.meter_label { |
||||
|
font-size: 22rpx; |
||||
|
} |
||||
|
|
||||
|
.meter_label.hot { |
||||
|
color: #ff6b6b; |
||||
|
} |
||||
|
|
||||
|
.meter_label.warm { |
||||
|
color: #ffd166; |
||||
|
} |
||||
|
|
||||
|
.meter_label.cool { |
||||
|
color: #60a5fa; |
||||
|
} |
||||
|
|
||||
|
/* 板块 */ |
||||
|
.sectors_grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.sector_item { |
||||
|
background: #fafafa; |
||||
|
border-radius: 12rpx; |
||||
|
padding: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.sector_header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.sector_name { |
||||
|
font-size: 24rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.sector_change { |
||||
|
font-size: 22rpx; |
||||
|
} |
||||
|
|
||||
|
.sector_change.rising { |
||||
|
color: #e74c3c; |
||||
|
} |
||||
|
|
||||
|
.sector_change.falling { |
||||
|
color: #27ae60; |
||||
|
} |
||||
|
|
||||
|
.sector_price { |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
/* 股票表 */ |
||||
|
.table { |
||||
|
background: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.table_header, |
||||
|
.table_row { |
||||
|
display: grid; |
||||
|
grid-template-columns: 2fr 1fr 1fr; |
||||
|
padding: 18rpx 20rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.table_header { |
||||
|
background: #fafafa; |
||||
|
} |
||||
|
|
||||
|
.cell.name { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
} |
||||
|
|
||||
|
.stk_name { |
||||
|
font-size: 26rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.stk_code { |
||||
|
font-size: 22rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.stk_price { |
||||
|
font-size: 26rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.stk_change { |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.stk_change.rising { |
||||
|
color: #e74c3c; |
||||
|
} |
||||
|
|
||||
|
.stk_change.falling { |
||||
|
color: #27ae60; |
||||
|
} |
||||
|
|
||||
|
.index_item { |
||||
|
background: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.hot_stocks { |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.stocks_list { |
||||
|
background: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.stock_item { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 24rpx 20rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.stock_item:last-child { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.stock_info { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.stock_name { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
display: block; |
||||
|
margin-bottom: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.stock_code { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.stock_price { |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.price { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
display: block; |
||||
|
margin-bottom: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.change { |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.change.rising { |
||||
|
color: #e74c3c; |
||||
|
} |
||||
|
|
||||
|
.change.falling { |
||||
|
color: #27ae60; |
||||
|
} |
||||
|
|
||||
|
.bottom_safe_area { |
||||
|
height: 120rpx; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,301 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<view class="section" v-if="type === 'forex'"> |
||||
|
<view class="section_title"> |
||||
|
<text class="title_icon">💱</text> |
||||
|
<text>外汇市场</text> |
||||
|
</view> |
||||
|
<view class="forex_grid"> |
||||
|
<view v-for="(item, index) in forexData" :key="index" class="forex_item"> |
||||
|
<view class="forex_pair"> |
||||
|
<text class="base_currency">{{ item.base }}</text> |
||||
|
<text class="separator">/</text> |
||||
|
<text class="quote_currency">{{ item.quote }}</text> |
||||
|
</view> |
||||
|
<view class="forex_price"> |
||||
|
<text class="price">{{ item.price }}</text> |
||||
|
<text :class="['change', item.isRising ? 'rising' : 'falling']"> |
||||
|
{{ item.change }} |
||||
|
</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="section" v-if="type === 'metals'"> |
||||
|
<view class="section_title"> |
||||
|
<text class="title_icon">🥇</text> |
||||
|
<text>贵金属</text> |
||||
|
</view> |
||||
|
<view class="metals_grid"> |
||||
|
<view v-for="(item, index) in metalsData" :key="index" class="metal_item"> |
||||
|
<view class="metal_info"> |
||||
|
<text class="metal_icon">{{ item.icon }}</text> |
||||
|
<text class="metal_name">{{ item.name }}</text> |
||||
|
</view> |
||||
|
<view class="metal_price"> |
||||
|
<text class="price">{{ item.price }}</text> |
||||
|
<text class="unit">{{ item.unit }}</text> |
||||
|
<text :class="['change', item.isRising ? 'rising' : 'falling']"> |
||||
|
{{ item.change }} |
||||
|
</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 市场动态 --> |
||||
|
<view class="market_news"> |
||||
|
<view class="section_title"> |
||||
|
<text class="title_icon">📰</text> |
||||
|
<text>市场动态</text> |
||||
|
</view> |
||||
|
<view class="news_list"> |
||||
|
<view v-for="(news, index) in newsData" :key="index" class="news_item"> |
||||
|
<view class="news_content"> |
||||
|
<text class="news_title">{{ news.title }}</text> |
||||
|
<text class="news_time">{{ news.time }}</text> |
||||
|
</view> |
||||
|
<view class="news_impact" :class="news.impact"> |
||||
|
<text>{{ news.impactText }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部安全区域 --> |
||||
|
<view class="bottom_safe_area"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed } from 'vue' |
||||
|
|
||||
|
// Props |
||||
|
const props = defineProps({ |
||||
|
countryId: { |
||||
|
type: Number, |
||||
|
required: true |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 判断类型 |
||||
|
const type = computed(() => { |
||||
|
return props.countryId === 11 ? 'forex' : 'metals' |
||||
|
}) |
||||
|
|
||||
|
// 外汇数据 |
||||
|
const forexData = ref([ |
||||
|
{ base: 'USD', quote: 'CNY', price: '7.2456', change: '+0.0123', isRising: true }, |
||||
|
{ base: 'EUR', quote: 'USD', price: '1.0876', change: '-0.0034', isRising: false }, |
||||
|
{ base: 'GBP', quote: 'USD', price: '1.2654', change: '+0.0087', isRising: true }, |
||||
|
{ base: 'USD', quote: 'JPY', price: '149.87', change: '+0.45', isRising: true }, |
||||
|
{ base: 'AUD', quote: 'USD', price: '0.6543', change: '-0.0021', isRising: false }, |
||||
|
{ base: 'USD', quote: 'SGD', price: '1.3456', change: '+0.0012', isRising: true } |
||||
|
]) |
||||
|
|
||||
|
// 贵金属数据 |
||||
|
const metalsData = ref([ |
||||
|
{ icon: '🥇', name: '黄金', price: '2,034.56', unit: 'USD/盎司', change: '+12.34', isRising: true }, |
||||
|
{ icon: '🥈', name: '白银', price: '24.87', unit: 'USD/盎司', change: '-0.23', isRising: false }, |
||||
|
{ icon: '⚪', name: '铂金', price: '987.65', unit: 'USD/盎司', change: '+5.67', isRising: true }, |
||||
|
{ icon: '⚫', name: '钯金', price: '1,234.56', unit: 'USD/盎司', change: '-8.90', isRising: false } |
||||
|
]) |
||||
|
|
||||
|
// 新闻数据 |
||||
|
const newsData = ref([ |
||||
|
{ |
||||
|
title: '美联储暗示可能暂停加息', |
||||
|
time: '2小时前', |
||||
|
impact: 'high', |
||||
|
impactText: '高影响' |
||||
|
}, |
||||
|
{ |
||||
|
title: '欧洲央行维持利率不变', |
||||
|
time: '4小时前', |
||||
|
impact: 'medium', |
||||
|
impactText: '中影响' |
||||
|
}, |
||||
|
{ |
||||
|
title: '黄金价格创新高', |
||||
|
time: '6小时前', |
||||
|
impact: 'medium', |
||||
|
impactText: '中影响' |
||||
|
}, |
||||
|
{ |
||||
|
title: '美元指数小幅下跌', |
||||
|
time: '8小时前', |
||||
|
impact: 'low', |
||||
|
impactText: '低影响' |
||||
|
} |
||||
|
]) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.content { |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.section { |
||||
|
margin-bottom: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.section_title { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.title_icon { |
||||
|
font-size: 32rpx; |
||||
|
margin-right: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.forex_grid, .metals_grid { |
||||
|
background: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.forex_item, .metal_item { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 24rpx 20rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.forex_item:last-child, .metal_item:last-child { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.forex_pair { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.base_currency { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.separator { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
margin: 0 8rpx; |
||||
|
} |
||||
|
|
||||
|
.quote_currency { |
||||
|
font-size: 28rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
.forex_price, .metal_price { |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.price { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
display: block; |
||||
|
margin-bottom: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.unit { |
||||
|
font-size: 20rpx; |
||||
|
color: #999; |
||||
|
margin-left: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.change { |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.change.rising { |
||||
|
color: #e74c3c; |
||||
|
} |
||||
|
|
||||
|
.change.falling { |
||||
|
color: #27ae60; |
||||
|
} |
||||
|
|
||||
|
.metal_info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.metal_icon { |
||||
|
font-size: 32rpx; |
||||
|
margin-right: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.metal_name { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.market_news { |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.news_list { |
||||
|
background: #fff; |
||||
|
border-radius: 12rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.news_item { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 24rpx 20rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.news_item:last-child { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.news_content { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.news_title { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
display: block; |
||||
|
margin-bottom: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.news_time { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.news_impact { |
||||
|
padding: 6rpx 12rpx; |
||||
|
border-radius: 16rpx; |
||||
|
font-size: 20rpx; |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.news_impact.high { |
||||
|
background: #e74c3c; |
||||
|
} |
||||
|
|
||||
|
.news_impact.medium { |
||||
|
background: #f39c12; |
||||
|
} |
||||
|
|
||||
|
.news_impact.low { |
||||
|
background: #95a5a6; |
||||
|
} |
||||
|
|
||||
|
.bottom_safe_area { |
||||
|
height: 120rpx; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,574 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<!-- 固定头部 --> |
||||
|
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
||||
|
<view class="header_content"> |
||||
|
<view class="header_back" @click="goBack"> |
||||
|
<image src="/static/marketSituation-image/back.png" mode=""></image> |
||||
|
</view> |
||||
|
<view class="header_input_wrapper"> |
||||
|
<image class="search_icon" src="/static/marketSituation-image/search.png" mode="" |
||||
|
@click="onSearchClick"></image> |
||||
|
<input class="header_input" type="text" placeholder="搜索" |
||||
|
placeholder-style="color: #A6A6A6; font-size: 22rpx;" v-model="searchValue" |
||||
|
@input="onSearchInput" @confirm="onSearchConfirm" /> |
||||
|
</view> |
||||
|
<view class="header_icons"> |
||||
|
<view class="header_icon" @click="selected"> |
||||
|
<image src="/static/marketSituation-image/mySeclected.png" mode=""></image> |
||||
|
</view> |
||||
|
<view class="header_icon" @click="history"> |
||||
|
<image src="/static/marketSituation-image/history.png" mode=""></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="warn"> |
||||
|
<image src="/static/marketSituation-image/warn.png" mode="aspectFit"></image> |
||||
|
<view class="warn_text_container"> |
||||
|
<text :class="warnTextClass">{{ $t('marketSituation.warn') }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 内容区域 --> |
||||
|
<scroll-view class="content" :style="{ top: contentTopPosition + 'px' }" scroll-y="true"> |
||||
|
<!-- 亚太-中华 --> |
||||
|
<view class="market-section"> |
||||
|
<view class="market-header"> |
||||
|
<text class="market-title">亚太-中华</text> |
||||
|
<view class="market-more" @click="viewMore('asia-china')"> |
||||
|
<text class="more-text">查看更多</text> |
||||
|
<text class="more-arrow">></text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="cards-grid-three"> |
||||
|
<view v-for="(item, index) in asiachinaIndexes" :key="index" class="card-item"> |
||||
|
<IndexCard :flagIcon="item.flagIcon" :indexName="item.indexName" |
||||
|
:currentPrice="item.currentPrice" :changeAmount="item.changeAmount" |
||||
|
:changePercent="item.changePercent" :isRising="item.isRising" |
||||
|
@click="viewIndexDetail(item)" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 亚太 --> |
||||
|
<view class="market-section"> |
||||
|
<view class="market-header"> |
||||
|
<text class="market-title">亚太</text> |
||||
|
<view class="market-more" @click="viewMore('asia')"> |
||||
|
<text class="more-text">查看更多</text> |
||||
|
<text class="more-arrow">></text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="cards-grid-three"> |
||||
|
<view v-for="(item, index) in asiaIndexes" :key="index" class="card-item"> |
||||
|
<IndexCard :flagIcon="item.flagIcon" :indexName="item.indexName" |
||||
|
:currentPrice="item.currentPrice" :changeAmount="item.changeAmount" |
||||
|
:changePercent="item.changePercent" :isRising="item.isRising" |
||||
|
@click="viewIndexDetail(item)" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 美洲 --> |
||||
|
<view class="market-section"> |
||||
|
<view class="market-header"> |
||||
|
<text class="market-title">美洲</text> |
||||
|
<view class="market-more" @click="viewMore('america')"> |
||||
|
<text class="more-text">查看更多</text> |
||||
|
<text class="more-arrow">></text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="cards-grid-three"> |
||||
|
<view v-for="(item, index) in americaIndexes" :key="index" class="card-item"> |
||||
|
<IndexCard :flagIcon="item.flagIcon" :indexName="item.indexName" |
||||
|
:currentPrice="item.currentPrice" :changeAmount="item.changeAmount" |
||||
|
:changePercent="item.changePercent" :isRising="item.isRising" |
||||
|
@click="viewIndexDetail(item)" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部安全区域 --> |
||||
|
<view class="bottom-safe-area"></view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部导航栏 --> |
||||
|
<footerBar class="static-footer" :type="'marketSituation'"></footerBar> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, onMounted, computed, nextTick, watch } from 'vue' |
||||
|
import footerBar from '../../components/footerBar.vue' |
||||
|
import IndexCard from '../../components/IndexCard.vue' |
||||
|
|
||||
|
// 响应式数据 |
||||
|
const iSMT = ref(0) // 状态栏高度 |
||||
|
const contentHeight = ref(0) |
||||
|
const headerHeight = ref(0) // 头部高度 |
||||
|
const searchValue = ref('') // 搜索值 |
||||
|
const isWarnTextOverflow = ref(false) // warn文字是否溢出 |
||||
|
|
||||
|
// warn文字的class计算属性 |
||||
|
const warnTextClass = computed(() => { |
||||
|
return isWarnTextOverflow.value ? 'warn_text scroll-active' : 'warn_text' |
||||
|
}) |
||||
|
|
||||
|
// 检测warn文字是否溢出 |
||||
|
const checkWarnTextOverflow = () => { |
||||
|
nextTick(() => { |
||||
|
setTimeout(() => { |
||||
|
const query = uni.createSelectorQuery() |
||||
|
|
||||
|
// 同时查询容器和文字元素 |
||||
|
query.select('.warn_text_container').boundingClientRect() |
||||
|
query.select('.warn_text').boundingClientRect() |
||||
|
query.exec((res) => { |
||||
|
const containerRect = res[0] |
||||
|
const textRect = res[1] |
||||
|
|
||||
|
if (!containerRect || !textRect) { |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 判断文字是否超出容器(留一些余量) |
||||
|
const isOverflow = textRect.width > (containerRect.width - 10) |
||||
|
|
||||
|
isWarnTextOverflow.value = isOverflow |
||||
|
}) |
||||
|
}, 500) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 亚太-中华指数数据 |
||||
|
const asiachinaIndexes = ref([ |
||||
|
{ |
||||
|
flagIcon: '/static/c1.png', |
||||
|
indexName: '上证指数', |
||||
|
currentPrice: '3933.96', |
||||
|
changeAmount: '+24.32', |
||||
|
changePercent: '+0.62%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c2.png', |
||||
|
indexName: '深证成指', |
||||
|
currentPrice: '45757.90', |
||||
|
changeAmount: '-123.45', |
||||
|
changePercent: '-0.27%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c3.png', |
||||
|
indexName: '创业板指', |
||||
|
currentPrice: '6606.08', |
||||
|
changeAmount: '+89.76', |
||||
|
changePercent: '+1.38%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c4.png', |
||||
|
indexName: 'HSI50', |
||||
|
currentPrice: '22333.96', |
||||
|
changeAmount: '+156.78', |
||||
|
changePercent: '+0.71%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c5.png', |
||||
|
indexName: '沪深300', |
||||
|
currentPrice: '45757.90', |
||||
|
changeAmount: '-89.12', |
||||
|
changePercent: '-0.19%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c6.png', |
||||
|
indexName: '上证50', |
||||
|
currentPrice: '45757.90', |
||||
|
changeAmount: '+234.56', |
||||
|
changePercent: '+0.52%', |
||||
|
isRising: true |
||||
|
} |
||||
|
]) |
||||
|
|
||||
|
// 亚太指数数据 |
||||
|
const asiaIndexes = ref([ |
||||
|
{ |
||||
|
flagIcon: '/static/c7.png', |
||||
|
indexName: '日经225', |
||||
|
currentPrice: '28456.78', |
||||
|
changeAmount: '+234.56', |
||||
|
changePercent: '+0.83%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c8.png', |
||||
|
indexName: '韩国KOSPI', |
||||
|
currentPrice: '2567.89', |
||||
|
changeAmount: '-12.34', |
||||
|
changePercent: '-0.48%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c9.png', |
||||
|
indexName: '印度孟买', |
||||
|
currentPrice: '65432.10', |
||||
|
changeAmount: '+456.78', |
||||
|
changePercent: '+0.70%', |
||||
|
isRising: true |
||||
|
} |
||||
|
]) |
||||
|
|
||||
|
// 美洲指数数据 |
||||
|
const americaIndexes = ref([ |
||||
|
{ |
||||
|
flagIcon: '/static/c7.png', |
||||
|
indexName: '道琼斯指数', |
||||
|
currentPrice: '34567.89', |
||||
|
changeAmount: '+123.45', |
||||
|
changePercent: '+0.36%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c8.png', |
||||
|
indexName: '纳斯达克', |
||||
|
currentPrice: '13456.78', |
||||
|
changeAmount: '-67.89', |
||||
|
changePercent: '-0.50%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '/static/c9.png', |
||||
|
indexName: '标普500', |
||||
|
currentPrice: '4234.56', |
||||
|
changeAmount: '+23.45', |
||||
|
changePercent: '+0.56%', |
||||
|
isRising: true |
||||
|
} |
||||
|
]) |
||||
|
|
||||
|
// 计算属性:内容区域顶部位置 |
||||
|
const contentTopPosition = computed(() => { |
||||
|
const statusBarHeight = iSMT.value || 0 |
||||
|
const currentHeaderHeight = headerHeight.value > 0 ? headerHeight.value : 100 |
||||
|
return statusBarHeight + currentHeaderHeight |
||||
|
}) |
||||
|
|
||||
|
// 方法:返回上一页 |
||||
|
const goBack = () => { |
||||
|
uni.navigateBack() |
||||
|
} |
||||
|
|
||||
|
// 方法:搜索输入 |
||||
|
const onSearchInput = (e) => { |
||||
|
searchValue.value = e.detail.value |
||||
|
} |
||||
|
|
||||
|
// 方法:清除搜索 |
||||
|
const clearSearch = () => { |
||||
|
searchValue.value = '' |
||||
|
} |
||||
|
|
||||
|
// 方法:查看更多 |
||||
|
const viewMore = (market) => { |
||||
|
console.log('查看更多:', market) |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages/marketSituation/marketDetail?market=${market}` |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 方法:查看指数详情 |
||||
|
const viewIndexDetail = (item) => { |
||||
|
console.log('查看指数详情:', item.indexName) |
||||
|
uni.showToast({ |
||||
|
title: `查看 ${item.indexName} 详情`, |
||||
|
icon: 'none', |
||||
|
duration: 2000 |
||||
|
}) |
||||
|
// 这里可以跳转到具体的指数详情页面 |
||||
|
// uni.navigateTo({ |
||||
|
// url: `/pages/detail/indexDetail?id=${item.id}` |
||||
|
// }) |
||||
|
} |
||||
|
|
||||
|
// 生命周期:页面挂载 |
||||
|
onMounted(() => { |
||||
|
// 获取系统信息 |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
iSMT.value = systemInfo.statusBarHeight || 0 |
||||
|
|
||||
|
console.log('全球指数页面加载完成') |
||||
|
// 动态计算header实际高度 |
||||
|
uni.createSelectorQuery().select('.header_fixed').boundingClientRect((rect) => { |
||||
|
if (rect) { |
||||
|
headerHeight.value = rect.height |
||||
|
console.log('Header实际高度:', headerHeight.value, 'px') |
||||
|
} |
||||
|
}).exec() |
||||
|
// 检测warn文字是否溢出 |
||||
|
checkWarnTextOverflow() |
||||
|
}) |
||||
|
|
||||
|
// 监听headerHeight变化,重新计算contentHeight |
||||
|
watch(headerHeight, (newHeight) => { |
||||
|
if (newHeight > 0) { |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
const windowHeight = systemInfo.windowHeight |
||||
|
const statusBarHeight = systemInfo.statusBarHeight || 0 |
||||
|
const footerHeight = 100 |
||||
|
|
||||
|
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight |
||||
|
console.log('重新计算contentHeight:', contentHeight.value) |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.main { |
||||
|
position: relative; |
||||
|
height: 100vh; |
||||
|
overflow: hidden; |
||||
|
background-color: #f5f5f5; |
||||
|
} |
||||
|
|
||||
|
/* 状态栏占位 */ |
||||
|
.top { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1001; |
||||
|
background-color: #ffffff; |
||||
|
} |
||||
|
|
||||
|
/* 固定头部样式 */ |
||||
|
.header_fixed { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
background-color: #ffffff; |
||||
|
padding: 20rpx 0 0 0; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.header_content { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
height: 80rpx; |
||||
|
padding: 0 20rpx; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_back { |
||||
|
margin-right: 20rpx; |
||||
|
width: 25rpx; |
||||
|
height: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.header_back image { |
||||
|
width: 25rpx; |
||||
|
height: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.header_input_wrapper { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
width: 100%; |
||||
|
margin: 0 20rpx 0 0; |
||||
|
height: 70rpx; |
||||
|
border-radius: 35rpx; |
||||
|
background-color: #ffffff; |
||||
|
border: 1rpx solid #e9ecef; |
||||
|
padding: 0 80rpx 0 30rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #5c5c5c; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.search_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
opacity: 0.6; |
||||
|
} |
||||
|
|
||||
|
.header_input { |
||||
|
margin-left: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icons { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 15rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.header_icon image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.warn { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: flex-start; |
||||
|
gap: 10rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #666666; |
||||
|
padding: 20rpx; |
||||
|
max-width: 100%; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.warn image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
flex-shrink: 0; |
||||
|
/* 防止图片被压缩 */ |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
/* 确保图片在最上层 */ |
||||
|
} |
||||
|
|
||||
|
.warn_text_container { |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
min-width: 0; |
||||
|
/* 允许容器收缩 */ |
||||
|
} |
||||
|
|
||||
|
.warn_text { |
||||
|
display: block; |
||||
|
white-space: nowrap; |
||||
|
will-change: transform; |
||||
|
/* 优化动画性能 */ |
||||
|
} |
||||
|
|
||||
|
/* 文字滚动动画 */ |
||||
|
@keyframes scrollText { |
||||
|
0% { |
||||
|
transform: translateX(0); |
||||
|
} |
||||
|
|
||||
|
20% { |
||||
|
transform: translateX(0); |
||||
|
} |
||||
|
|
||||
|
80% { |
||||
|
transform: translateX(-85%); |
||||
|
} |
||||
|
|
||||
|
100% { |
||||
|
transform: translateX(-85%); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 当文字超长时启用滚动动画 */ |
||||
|
.warn_text.scroll-active { |
||||
|
animation: scrollText 12s linear infinite; |
||||
|
animation-delay: 2s; |
||||
|
/* 延迟2秒开始滚动,让用户先看到开头 */ |
||||
|
} |
||||
|
|
||||
|
/* 内容区域 */ |
||||
|
.content { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 120rpx; |
||||
|
background-color: #f5f5f5; |
||||
|
padding: 0; |
||||
|
} |
||||
|
|
||||
|
/* 市场分组 */ |
||||
|
.market-section { |
||||
|
background-color: white; |
||||
|
border-radius: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.market-header { |
||||
|
margin: 20rpx 20rpx 0 20rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
margin-bottom: 10rpx; |
||||
|
padding-bottom: 10rpx; |
||||
|
border-bottom: 2rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.market-title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.market-more { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.more-text { |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
.more-arrow { |
||||
|
font-size: 20rpx; |
||||
|
color: #666; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 三列卡片网格 */ |
||||
|
.cards-grid-three { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
} |
||||
|
|
||||
|
.card-item { |
||||
|
background-color: white; |
||||
|
border-radius: 16rpx; |
||||
|
overflow: hidden; |
||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.card-item:active { |
||||
|
transform: scale(0.98); |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.12); |
||||
|
} |
||||
|
|
||||
|
/* 底部安全区域 */ |
||||
|
.bottom-safe-area { |
||||
|
height: 40rpx; |
||||
|
background-color: transparent; |
||||
|
} |
||||
|
|
||||
|
/* 底部导航栏 */ |
||||
|
.static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
} |
||||
|
|
||||
|
/* 响应式设计 */ |
||||
|
@media (max-width: 400rpx) { |
||||
|
.cards-grid-three { |
||||
|
grid-template-columns: repeat(2, 1fr); |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,485 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<!-- 自定义导航栏 --> |
||||
|
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
||||
|
<view class="header-content"> |
||||
|
<view class="header-left" @click="goBack"> |
||||
|
<text class="back-text">‹</text> |
||||
|
</view> |
||||
|
<view class="header-center"> |
||||
|
<text class="header-title">{{ marketTitle }}</text> |
||||
|
</view> |
||||
|
<view class="header-right"> |
||||
|
<image src="/static/marketSituation-image/search.png" class="header-icon" mode="aspectFit"></image> |
||||
|
<text class="more-text">···</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<!-- 表头 --> |
||||
|
<view class="table-header"> |
||||
|
<view class="header-item name-column"> |
||||
|
<text class="header-text">名称</text> |
||||
|
</view> |
||||
|
<view class="header-item price-column" @click="sortByPrice"> |
||||
|
<text class="header-text">最新</text> |
||||
|
<text class="sort-icon">{{ sortType === 'price' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕' }}</text> |
||||
|
</view> |
||||
|
<view class="header-item change-column" @click="sortByChange"> |
||||
|
<text class="header-text">涨幅</text> |
||||
|
<text class="sort-icon">{{ sortType === 'change' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕' }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 内容区域 --> |
||||
|
<scroll-view class="content" :style="{ top: contentTopPosition + 'px' }" scroll-y="true"> |
||||
|
|
||||
|
|
||||
|
<!-- 股票列表 --> |
||||
|
<view class="stock-list"> |
||||
|
<view class="stock-row" v-for="(stock, index) in sortedStockList" :key="index" |
||||
|
@click="viewStockDetail(stock)"> |
||||
|
<view class="stock-cell name-column"> |
||||
|
<view class="stock-name">{{ stock.name }}</view> |
||||
|
<view class="stock-code">{{ stock.code }}</view> |
||||
|
</view> |
||||
|
<view class="stock-cell price-column"> |
||||
|
<text class="stock-price" |
||||
|
:class="stock.isRising ? 'rising' : 'falling'"> |
||||
|
{{ typeof stock.price === 'number' ? stock.price.toFixed(2) : stock.price }} |
||||
|
</text> |
||||
|
</view> |
||||
|
<view class="stock-cell change-column"> |
||||
|
<text class="stock-change" |
||||
|
:class="stock.isRising ? 'rising' : 'falling'"> |
||||
|
{{ stock.change || stock.changePercent }} |
||||
|
</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部安全区域 --> |
||||
|
<!-- <view class="bottom-safe-area"></view> --> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部导航栏 --> |
||||
|
<!-- <footerBar class="static-footer" :type="'marketSituation'"></footerBar> --> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, onMounted, watch } from 'vue' |
||||
|
import { onLoad } from '@dcloudio/uni-app' |
||||
|
import footerBar from '@/components/footerBar.vue' |
||||
|
|
||||
|
// 响应式数据 |
||||
|
const iSMT = ref(0) |
||||
|
const contentHeight = ref(0) |
||||
|
const headerHeight = ref(80) |
||||
|
const marketType = ref('america') |
||||
|
const marketTitle = ref('美洲') |
||||
|
const sortType = ref('') // 排序类型:'price' 或 'change' |
||||
|
const sortOrder = ref('desc') // 排序顺序:'asc' 或 'desc' |
||||
|
|
||||
|
// 股票数据 |
||||
|
const stockList = ref([ |
||||
|
{ |
||||
|
name: 'Telecommunication', |
||||
|
code: '888607', |
||||
|
price: 1349.47, |
||||
|
change: '+7.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Other', |
||||
|
code: '888607', |
||||
|
price: 1349.47, |
||||
|
change: '+6.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1349.47, |
||||
|
change: '+5.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Telecommunication', |
||||
|
code: '888607', |
||||
|
price: 1349.47, |
||||
|
change: '+4.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Other', |
||||
|
code: '888611', |
||||
|
price: 1359.47, |
||||
|
change: '+3.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1349.47, |
||||
|
change: '+2.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Telecommunication', |
||||
|
code: '888607', |
||||
|
price: 1349.47, |
||||
|
change: '+1.67%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Other', |
||||
|
code: '888611', |
||||
|
price: 1009.98, |
||||
|
change: '-1.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1009.98, |
||||
|
change: '-0.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Telecommunication', |
||||
|
code: '888607', |
||||
|
price: 1009.98, |
||||
|
change: '-0.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Other', |
||||
|
code: '888611', |
||||
|
price: 1009.98, |
||||
|
change: '-1.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1009.98, |
||||
|
change: '-4.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1009.98, |
||||
|
change: '-3.67%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
name: 'Consumer Discretio...', |
||||
|
code: '888610', |
||||
|
price: 1009.98, |
||||
|
change: '-3.67%', |
||||
|
isRising: false |
||||
|
} |
||||
|
]) |
||||
|
|
||||
|
// 计算属性 |
||||
|
const contentTopPosition = computed(() => { |
||||
|
return iSMT.value + headerHeight.value |
||||
|
}) |
||||
|
|
||||
|
const sortedStockList = computed(() => { |
||||
|
console.log('计算sortedStockList,原始数据长度:', stockList.value.length); |
||||
|
let list = [...stockList.value] |
||||
|
|
||||
|
if (sortType.value === 'price') { |
||||
|
list.sort((a, b) => { |
||||
|
return sortOrder.value === 'asc' ? a.price - b.price : b.price - a.price |
||||
|
}) |
||||
|
} else if (sortType.value === 'change') { |
||||
|
list.sort((a, b) => { |
||||
|
const aChange = parseFloat(a.change.replace(/[+%-]/g, '')) |
||||
|
const bChange = parseFloat(b.change.replace(/[+%-]/g, '')) |
||||
|
return sortOrder.value === 'asc' ? aChange - bChange : bChange - aChange |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
console.log('排序后数据长度:', list.length); |
||||
|
return list |
||||
|
}) |
||||
|
|
||||
|
// 页面加载时接收参数 |
||||
|
onLoad((options) => { |
||||
|
if (options && options.market) { |
||||
|
marketType.value = options.market |
||||
|
switch (options.market) { |
||||
|
case 'america': |
||||
|
marketTitle.value = '美洲' |
||||
|
break |
||||
|
case 'asia': |
||||
|
marketTitle.value = '亚太' |
||||
|
break |
||||
|
case 'asia-china': |
||||
|
marketTitle.value = '亚太-中华' |
||||
|
break |
||||
|
default: |
||||
|
marketTitle.value = '全球指数' |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 方法 |
||||
|
const goBack = () => { |
||||
|
uni.navigateBack() |
||||
|
} |
||||
|
|
||||
|
const sortByPrice = () => { |
||||
|
if (sortType.value === 'price') { |
||||
|
sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc' |
||||
|
} else { |
||||
|
sortType.value = 'price' |
||||
|
sortOrder.value = 'desc' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const sortByChange = () => { |
||||
|
if (sortType.value === 'change') { |
||||
|
sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc' |
||||
|
} else { |
||||
|
sortType.value = 'change' |
||||
|
sortOrder.value = 'desc' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const viewStockDetail = (stock) => { |
||||
|
console.log('查看股票详情:', stock) |
||||
|
// 这里可以跳转到股票详情页面 |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
// 获取状态栏高度 |
||||
|
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
||||
|
// 动态计算header实际高度 |
||||
|
uni.createSelectorQuery().select('.header_fixed').boundingClientRect((rect) => { |
||||
|
if (rect) { |
||||
|
headerHeight.value = rect.height |
||||
|
console.log('Header实际高度:', headerHeight.value, 'px') |
||||
|
} |
||||
|
}).exec() |
||||
|
}) |
||||
|
|
||||
|
// 监听headerHeight变化,重新计算contentHeight |
||||
|
watch(headerHeight, (newHeight) => { |
||||
|
if (newHeight > 0) { |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
const windowHeight = systemInfo.windowHeight |
||||
|
const statusBarHeight = systemInfo.statusBarHeight || 0 |
||||
|
const footerHeight = 100 |
||||
|
|
||||
|
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight |
||||
|
console.log('重新计算contentHeight:', contentHeight.value) |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.main { |
||||
|
width: 100%; |
||||
|
height: 100vh; |
||||
|
background-color: #f5f5f5; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
/* 自定义导航栏 */ |
||||
|
.header_fixed { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
background-color: #ffffff; |
||||
|
border-bottom: 1px solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.header-content { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
height: 44px; |
||||
|
padding: 0 15px; |
||||
|
} |
||||
|
|
||||
|
.header-left, |
||||
|
.header-right { |
||||
|
width: 60px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.header-left { |
||||
|
justify-content: flex-start; |
||||
|
} |
||||
|
|
||||
|
.header-right { |
||||
|
justify-content: flex-end; |
||||
|
gap: 10px; |
||||
|
} |
||||
|
|
||||
|
.back-text { |
||||
|
font-size: 24px; |
||||
|
color: #333333; |
||||
|
font-weight: 500; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
|
||||
|
.header-center { |
||||
|
flex: 1; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.header-title { |
||||
|
font-size: 18px; |
||||
|
font-weight: 600; |
||||
|
color: #333333; |
||||
|
} |
||||
|
|
||||
|
.header-icon { |
||||
|
width: 20px; |
||||
|
height: 20px; |
||||
|
} |
||||
|
|
||||
|
.more-text { |
||||
|
font-size: 20px; |
||||
|
color: #666666; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
/* 内容区域 */ |
||||
|
.content { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background-color: #ffffff; |
||||
|
} |
||||
|
|
||||
|
/* 表头样式 */ |
||||
|
.table-header { |
||||
|
display: flex; |
||||
|
padding: 12px 15px; |
||||
|
background-color: #f8f9fa; |
||||
|
border-bottom: 1px solid #e9ecef; |
||||
|
} |
||||
|
|
||||
|
.header-item { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
|
||||
|
.header-item.name-column { |
||||
|
flex: 2; |
||||
|
justify-content: flex-start; |
||||
|
} |
||||
|
|
||||
|
.header-item.price-column, |
||||
|
.header-item.change-column { |
||||
|
flex: 1; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.header-text { |
||||
|
font-size: 14px; |
||||
|
color: #666666; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.sort-icon { |
||||
|
margin-left: 4px; |
||||
|
font-size: 12px; |
||||
|
color: #999999; |
||||
|
} |
||||
|
|
||||
|
/* 股票列表 */ |
||||
|
.stock-list { |
||||
|
background-color: #ffffff; |
||||
|
} |
||||
|
|
||||
|
.stock-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
padding: 12px 15px; |
||||
|
border-bottom: 1px solid #f5f5f5; |
||||
|
} |
||||
|
|
||||
|
.stock-row:active { |
||||
|
background-color: #f8f8f8; |
||||
|
} |
||||
|
|
||||
|
.stock-cell { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.stock-cell.name-column { |
||||
|
flex: 2; |
||||
|
align-items: flex-start; |
||||
|
} |
||||
|
|
||||
|
.stock-cell.price-column, |
||||
|
.stock-cell.change-column { |
||||
|
flex: 1; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.stock-name { |
||||
|
font-size: 15px; |
||||
|
color: #333333; |
||||
|
font-weight: 500; |
||||
|
line-height: 1.2; |
||||
|
margin-bottom: 2px; |
||||
|
} |
||||
|
|
||||
|
.stock-code { |
||||
|
font-size: 11px; |
||||
|
color: #999999; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
.stock-price { |
||||
|
font-size: 15px; |
||||
|
font-weight: 600; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
.stock-change { |
||||
|
font-size: 13px; |
||||
|
font-weight: 500; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
.rising { |
||||
|
color: #00C851; |
||||
|
} |
||||
|
|
||||
|
.falling { |
||||
|
color: #FF4444; |
||||
|
} |
||||
|
|
||||
|
/* 底部安全区域 */ |
||||
|
/* .bottom-safe-area { |
||||
|
height: 20px; |
||||
|
} */ |
||||
|
|
||||
|
/* 底部导航栏 */ |
||||
|
/* .static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
} */ |
||||
|
</style> |
||||
@ -0,0 +1,733 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<!-- 可滚动内容区域 --> |
||||
|
<scroll-view class="content_scroll" scroll-y="true" :style="{ top: contentTopPosition + 'px' }"> |
||||
|
<view class="content"> |
||||
|
<button @click="goToChartExample">图表</button> |
||||
|
<view class="map"> |
||||
|
<image src="/static/marketSituation-image/map.png" mode="widthFix"></image> |
||||
|
</view> |
||||
|
<view class="global_index"> |
||||
|
<view class="global_index_title"> |
||||
|
{{ $t('marketSituation.globalIndex') }} |
||||
|
</view> |
||||
|
<view class="global_index_more" @click="goToGlobalIndex"> |
||||
|
<text>{{ $t('marketSituation.globalIndexMore') }}</text> |
||||
|
<image src="/static/marketSituation-image/more.png" mode="aspectFit"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 卡片网格 --> |
||||
|
<view class="cards_grid"> |
||||
|
<view v-for="(card, index) in cardData" :key="index" class="card_item"> |
||||
|
<IndexCard :flagIcon="card.flagIcon" :indexName="card.indexName" |
||||
|
:currentPrice="card.currentPrice" :changeAmount="card.changeAmount" |
||||
|
:changePercent="card.changePercent" :isRising="card.isRising" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="warn"> |
||||
|
<image src="/static/marketSituation-image/warn.png" mode="aspectFit"></image> |
||||
|
<view class="warn_text_container"> |
||||
|
<text :class="warnTextClass">{{ $t('marketSituation.warn') }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<!-- 底部安全区域,防止被导航栏遮挡 --> |
||||
|
<view class="bottom_safe_area"></view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, onMounted, watch, nextTick, computed } from 'vue' |
||||
|
import util from '../../common/util.js' |
||||
|
import IndexCard from '../../components/IndexCard.vue' |
||||
|
|
||||
|
const iSMT = ref(0) |
||||
|
const searchValue = ref('') |
||||
|
const contentHeight = ref(0) |
||||
|
const headerHeight = ref(0) // 动态计算的header高度 |
||||
|
const isWarnTextOverflow = ref(false) // warn文字是否溢出 |
||||
|
|
||||
|
const pageIndex = ref(0) |
||||
|
const scrollToView = ref('') |
||||
|
|
||||
|
// 跳转图表示例页面 |
||||
|
const goToChartExample = () => { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/marketSituation/chartExample' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 计算属性:精准计算content区域的top值 |
||||
|
const contentTopPosition = computed(() => { |
||||
|
const statusBarHeight = iSMT.value || 0 |
||||
|
const currentHeaderHeight = headerHeight.value > 0 ? headerHeight.value : 140 |
||||
|
return statusBarHeight + currentHeaderHeight |
||||
|
}) |
||||
|
|
||||
|
// warn文字的class计算属性 |
||||
|
const warnTextClass = computed(() => { |
||||
|
return isWarnTextOverflow.value ? 'warn_text scroll-active' : 'warn_text' |
||||
|
}) |
||||
|
|
||||
|
// 弹窗相关数据 |
||||
|
const showCountryModal = ref(false) |
||||
|
const selectedCountry = ref('概况') |
||||
|
const countryList = ref([ |
||||
|
'概况', '新加坡', '马来西亚', '印度尼西亚', '美国', '中国香港', |
||||
|
'泰国', '中国', '加拿大', '越南', '外汇', '贵金属' |
||||
|
]) |
||||
|
|
||||
|
// 卡片数据 |
||||
|
const cardData = ref([ |
||||
|
{ |
||||
|
flagIcon: '🇺🇸', |
||||
|
indexName: '道琼斯', |
||||
|
currentPrice: '45757.90', |
||||
|
changeAmount: '-125.22', |
||||
|
changePercent: '-0.27%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇺🇸', |
||||
|
indexName: '纳斯达克', |
||||
|
currentPrice: '22333.96', |
||||
|
changeAmount: '+125.22', |
||||
|
changePercent: '+0.47%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇺🇸', |
||||
|
indexName: '标普500', |
||||
|
currentPrice: '6606.08', |
||||
|
changeAmount: '+125.22', |
||||
|
changePercent: '+0.27%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇨🇳', |
||||
|
indexName: '上证指数', |
||||
|
currentPrice: '3333.96', |
||||
|
changeAmount: '+125.22', |
||||
|
changePercent: '+0.27%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇨🇳', |
||||
|
indexName: '科创50', |
||||
|
currentPrice: '757.90', |
||||
|
changeAmount: '-25.22', |
||||
|
changePercent: '-0.27%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇭🇰', |
||||
|
indexName: '恒生指数', |
||||
|
currentPrice: '19757.90', |
||||
|
changeAmount: '-125.22', |
||||
|
changePercent: '-0.63%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇸🇬', |
||||
|
indexName: '道琼斯', |
||||
|
currentPrice: '3757.90', |
||||
|
changeAmount: '+85.22', |
||||
|
changePercent: '+2.31%', |
||||
|
isRising: true |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇲🇾', |
||||
|
indexName: '纳斯达克', |
||||
|
currentPrice: '1657.90', |
||||
|
changeAmount: '-15.22', |
||||
|
changePercent: '-0.91%', |
||||
|
isRising: false |
||||
|
}, |
||||
|
{ |
||||
|
flagIcon: '🇹🇭', |
||||
|
indexName: '标普500', |
||||
|
currentPrice: '1457.90', |
||||
|
changeAmount: '+35.22', |
||||
|
changePercent: '+2.48%', |
||||
|
isRising: true |
||||
|
} |
||||
|
]) |
||||
|
|
||||
|
// 搜索输入事件 |
||||
|
const onSearchInput = (e) => { |
||||
|
searchValue.value = e.detail.value |
||||
|
} |
||||
|
|
||||
|
// 搜索确认事件 |
||||
|
const onSearchConfirm = (e) => { |
||||
|
console.log('搜索内容:', e.detail.value) |
||||
|
// 这里可以添加搜索逻辑 |
||||
|
performSearch(e.detail.value) |
||||
|
} |
||||
|
|
||||
|
// 搜索图标点击事件 |
||||
|
const onSearchClick = () => { |
||||
|
if (searchValue.value.trim()) { |
||||
|
performSearch(searchValue.value) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 执行搜索 |
||||
|
const performSearch = (keyword) => { |
||||
|
if (!keyword.trim()) { |
||||
|
uni.showToast({ |
||||
|
title: '请输入搜索内容', |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
uni.showToast({ |
||||
|
title: `搜索: ${keyword}`, |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
// 这里添加实际的搜索逻辑 |
||||
|
} |
||||
|
|
||||
|
// 检测warn文字是否溢出 |
||||
|
const checkWarnTextOverflow = () => { |
||||
|
nextTick(() => { |
||||
|
setTimeout(() => { |
||||
|
const query = uni.createSelectorQuery() |
||||
|
|
||||
|
// 同时查询容器和文字元素 |
||||
|
query.select('.warn_text_container').boundingClientRect() |
||||
|
query.select('.warn_text').boundingClientRect() |
||||
|
query.exec((res) => { |
||||
|
const containerRect = res[0] |
||||
|
const textRect = res[1] |
||||
|
|
||||
|
if (!containerRect || !textRect) { |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 判断文字是否超出容器(留一些余量) |
||||
|
const isOverflow = textRect.width > (containerRect.width - 10) |
||||
|
|
||||
|
isWarnTextOverflow.value = isOverflow |
||||
|
}) |
||||
|
}, 500) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 跳转到全球指数页面 |
||||
|
const goToGlobalIndex = () => { |
||||
|
uni.navigateTo({ |
||||
|
url: '/pages/marketSituation/globalIndex' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
// 状态栏高度 |
||||
|
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
||||
|
|
||||
|
// 确保DOM渲染完成后再查询高度 |
||||
|
nextTick(() => { |
||||
|
// 动态计算header实际高度 |
||||
|
uni.createSelectorQuery().select('.header_fixed').boundingClientRect((rect) => { |
||||
|
if (rect) { |
||||
|
headerHeight.value = rect.height |
||||
|
console.log('Header实际高度:', headerHeight.value, 'px') |
||||
|
} |
||||
|
}).exec() |
||||
|
|
||||
|
// 检测warn文字是否溢出 |
||||
|
checkWarnTextOverflow() |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
// 监听headerHeight变化,重新计算contentHeight |
||||
|
watch(headerHeight, (newHeight) => { |
||||
|
if (newHeight > 0) { |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
const windowHeight = systemInfo.windowHeight |
||||
|
const statusBarHeight = systemInfo.statusBarHeight || 0 |
||||
|
const footerHeight = 100 |
||||
|
|
||||
|
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight |
||||
|
console.log('重新计算contentHeight:', contentHeight.value) |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
/* 状态栏占位 */ |
||||
|
.top { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1001; |
||||
|
background-color: #ffffff; |
||||
|
} |
||||
|
|
||||
|
/* 固定头部样式 */ |
||||
|
.header_fixed { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
background-color: #ffffff; |
||||
|
padding: 20rpx 0 0 0; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
/* 可滚动内容区域 */ |
||||
|
.content_scroll { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 100rpx; |
||||
|
/* 底部导航栏高度 */ |
||||
|
overflow-y: auto; |
||||
|
} |
||||
|
|
||||
|
.header_content { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
height: 80rpx; |
||||
|
padding: 0 20rpx; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_input_wrapper { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
width: 100%; |
||||
|
margin: 0 20rpx 0 0; |
||||
|
height: 70rpx; |
||||
|
border-radius: 35rpx; |
||||
|
background-color: #ffffff; |
||||
|
border: 1rpx solid #e9ecef; |
||||
|
padding: 0 80rpx 0 30rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #5c5c5c; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.search_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
opacity: 0.6; |
||||
|
} |
||||
|
|
||||
|
.header_input { |
||||
|
margin-left: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icons { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 15rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.header_icon image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
|
||||
|
/* Tab 栏样式 */ |
||||
|
.channel_li { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 80rpx; |
||||
|
background-color: #ffffff; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.channel_wrap { |
||||
|
width: calc(100% - 60rpx); |
||||
|
height: 100%; |
||||
|
overflow: hidden; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.channel_innerWrap { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 100%; |
||||
|
padding: 0 20rpx; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.channel_item { |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
height: 60rpx; |
||||
|
padding: 0 20rpx; |
||||
|
border-radius: 30rpx; |
||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
||||
|
cursor: pointer; |
||||
|
white-space: nowrap; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.channel_item:active { |
||||
|
transform: scale(0.98); |
||||
|
} |
||||
|
|
||||
|
.channel_item.active { |
||||
|
color: #333; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.channel_text { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: 500; |
||||
|
color: #666666; |
||||
|
transition: color 0.3s ease; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.channel_item.active .channel_text { |
||||
|
color: #333333; |
||||
|
font-weight: 400; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.active_indicator { |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: 60%; |
||||
|
transform: translateX(-45%); |
||||
|
width: calc(100% - 20rpx); |
||||
|
min-width: 40rpx; |
||||
|
max-width: 120rpx; |
||||
|
height: 8rpx; |
||||
|
background-image: url('/static/marketSituation-image/bg.png'); |
||||
|
background-size: cover; |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
animation: slideIn 0.1s ease; |
||||
|
border-radius: 8rpx; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
@keyframes slideIn { |
||||
|
from { |
||||
|
width: 0; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
to { |
||||
|
width: 40rpx; |
||||
|
opacity: 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.scroll_indicator { |
||||
|
border-left: 1rpx solid #b6b6b6; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
width: 60rpx; |
||||
|
height: 30rpx; |
||||
|
background-color: #ffffff; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.scroll_indicator image { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
opacity: 0.5; |
||||
|
} |
||||
|
|
||||
|
.content { |
||||
|
margin-top: 20rpx; |
||||
|
background-color: white; |
||||
|
} |
||||
|
|
||||
|
.map { |
||||
|
width: calc(100% - 60rpx); |
||||
|
margin: 0 30rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
background-color: #F3F3F3; |
||||
|
border-radius: 30rpx; |
||||
|
border: 1rpx solid #E0E0E0; |
||||
|
padding: 30rpx 20rpx; |
||||
|
box-sizing: border-box; |
||||
|
/* 设置最小高度保护,但允许内容撑开 */ |
||||
|
min-height: 200rpx; |
||||
|
} |
||||
|
|
||||
|
.map image { |
||||
|
width: 100%; |
||||
|
height: auto; |
||||
|
max-width: 100%; |
||||
|
display: block; |
||||
|
/* widthFix模式下,高度会自动按比例调整 */ |
||||
|
/* 设置最大高度避免图片过大 */ |
||||
|
max-height: 60vh; |
||||
|
/* 添加平滑过渡效果 */ |
||||
|
transition: all 0.3s ease; |
||||
|
max-height: 60vh; |
||||
|
} |
||||
|
|
||||
|
/* 响应式优化 */ |
||||
|
@media screen and (max-width: 750rpx) { |
||||
|
.map { |
||||
|
margin: 0 20rpx; |
||||
|
width: calc(100% - 40rpx); |
||||
|
padding: 20rpx 15rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@media screen and (max-width: 480rpx) { |
||||
|
.map { |
||||
|
margin: 0 15rpx; |
||||
|
width: calc(100% - 30rpx); |
||||
|
padding: 15rpx 10rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
} |
||||
|
|
||||
|
/* 弹窗样式 */ |
||||
|
.modal_overlay { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background-color: rgba(0, 0, 0, 0.5); |
||||
|
display: flex; |
||||
|
align-items: flex-end; |
||||
|
z-index: 1000; |
||||
|
} |
||||
|
|
||||
|
.modal_content { |
||||
|
width: 100%; |
||||
|
background-color: #fff; |
||||
|
border-radius: 20rpx 20rpx 0 0; |
||||
|
max-height: 80vh; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.modal_header { |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
padding: 30rpx 40rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.modal_title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333333; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.modal_close { |
||||
|
position: absolute; |
||||
|
right: 40rpx; |
||||
|
top: 50%; |
||||
|
transform: translateY(-50%); |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
font-size: 40rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.modal_body { |
||||
|
padding: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.country_grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: 1fr 1fr; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.country_item { |
||||
|
padding: 24rpx 30rpx; |
||||
|
border-radius: 12rpx; |
||||
|
background-color: #f8f8f8; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.country_item.selected { |
||||
|
background-color: #ff4444; |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.country_text { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.country_item.selected .country_text { |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.global_index { |
||||
|
margin: 30rpx 20rpx 0 20rpx; |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
} |
||||
|
|
||||
|
.global_index_title { |
||||
|
margin-left: 20rpx; |
||||
|
font-size: 40rpx; |
||||
|
font-weight: 100; |
||||
|
color: #333333; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.global_index_more { |
||||
|
display: flex; |
||||
|
gap: 10rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #333333; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.global_index_more image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
/* 卡片网格样式 */ |
||||
|
.cards_grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
margin: 0; |
||||
|
box-sizing: border-box; |
||||
|
width: 100%; |
||||
|
padding: 30rpx 20rpx; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.card_item { |
||||
|
width: 100%; |
||||
|
box-sizing: border-box; |
||||
|
min-width: 0; |
||||
|
/* 防止内容溢出 */ |
||||
|
} |
||||
|
|
||||
|
/* 响应式布局 - 小屏幕时改为两列 */ |
||||
|
@media (max-width: 600rpx) { |
||||
|
.cards_grid { |
||||
|
grid-template-columns: repeat(2, 1fr); |
||||
|
padding: 30rpx 20rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 超小屏幕时改为单列 */ |
||||
|
@media (max-width: 400rpx) { |
||||
|
.cards_grid { |
||||
|
grid-template-columns: 1fr; |
||||
|
padding: 30rpx 20rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.warn { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: flex-start; |
||||
|
gap: 10rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #666666; |
||||
|
padding: 20rpx; |
||||
|
max-width: 100%; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.warn image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
flex-shrink: 0; |
||||
|
/* 防止图片被压缩 */ |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
/* 确保图片在最上层 */ |
||||
|
} |
||||
|
|
||||
|
.warn_text_container { |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
min-width: 0; |
||||
|
/* 允许容器收缩 */ |
||||
|
} |
||||
|
|
||||
|
.warn_text { |
||||
|
display: block; |
||||
|
white-space: nowrap; |
||||
|
will-change: transform; |
||||
|
/* 优化动画性能 */ |
||||
|
} |
||||
|
|
||||
|
/* 文字滚动动画 */ |
||||
|
@keyframes scrollText { |
||||
|
0% { |
||||
|
transform: translateX(0); |
||||
|
} |
||||
|
|
||||
|
20% { |
||||
|
transform: translateX(0); |
||||
|
} |
||||
|
|
||||
|
80% { |
||||
|
transform: translateX(-85%); |
||||
|
} |
||||
|
|
||||
|
100% { |
||||
|
transform: translateX(-85%); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 当文字超长时启用滚动动画 */ |
||||
|
.warn_text.scroll-active { |
||||
|
animation: scrollText 12s linear infinite; |
||||
|
animation-delay: 2s; |
||||
|
/* 延迟2秒开始滚动,让用户先看到开头 */ |
||||
|
} |
||||
|
|
||||
|
/* 底部安全区域 */ |
||||
|
.bottom_safe_area { |
||||
|
height: 40rpx; |
||||
|
background-color: transparent; |
||||
|
} |
||||
|
|
||||
|
/* 主容器样式调整 */ |
||||
|
.main { |
||||
|
position: relative; |
||||
|
height: 100vh; |
||||
|
overflow: hidden; |
||||
|
background-color: white; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,593 @@ |
|||||
|
<template> |
||||
|
<view> |
||||
|
<view class="main"> |
||||
|
<!-- 固定头部 --> |
||||
|
<view class="header_fixed" :style="{ top: iSMT + 'px' }"> |
||||
|
<view class="header_content"> |
||||
|
<view class="header_input_wrapper"> |
||||
|
<image class="search_icon" src="/static/marketSituation-image/search.png" mode="" |
||||
|
@click="onSearchClick"></image> |
||||
|
<input class="header_input" type="text" placeholder="搜索" |
||||
|
placeholder-style="color: #A6A6A6; font-size: 22rpx;" v-model="searchValue" |
||||
|
@input="onSearchInput" @confirm="onSearchConfirm" /> |
||||
|
</view> |
||||
|
<view class="header_icons"> |
||||
|
<view class="header_icon" @click="selected"> |
||||
|
<image src="/static/marketSituation-image/mySeclected.png" mode=""></image> |
||||
|
</view> |
||||
|
<view class="header_icon" @click="history"> |
||||
|
<image src="/static/marketSituation-image/history.png" mode=""></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="channel_li" v-if="channelData.length > 0"> |
||||
|
<scroll-view class="channel_wrap" scroll-x="true" :scroll-into-view="scrollToView" |
||||
|
:scroll-with-animation="true" show-scrollbar="false"> |
||||
|
<view class="channel_innerWrap"> |
||||
|
<view v-for="(item, index) in channelData" :key="item.id" :id="'nav' + item.id" |
||||
|
:class="['channel_item', index === pageIndex ? 'active' : '']" @click="navClick(index)"> |
||||
|
<text class="channel_text">{{ item.title }}</text> |
||||
|
<view v-if="index === pageIndex" class="active_indicator"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
<view class="scroll_indicator" @click="channel_more"> |
||||
|
<image src="/static/marketSituation-image/menu.png" mode="aspectFit"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 可滚动内容区域 --> |
||||
|
<scroll-view class="content_scroll" scroll-y="true" :style="{ top: contentTopPosition + 'px' }"> |
||||
|
<!-- 动态组件切换 --> |
||||
|
<component :is="currentComponent" :countryId="currentChannelId" /> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<footerBar class="static-footer" :type="type"></footerBar> |
||||
|
|
||||
|
<!-- 更多tab弹窗 --> |
||||
|
<view v-if="showCountryModal" class="modal_overlay" @click="closeModal"> |
||||
|
<view class="modal_content" @click.stop> |
||||
|
<view class="modal_header"> |
||||
|
<text class="modal_title">全部栏目</text> |
||||
|
<view class="modal_close" @click="closeModal"> |
||||
|
<text>×</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="modal_body"> |
||||
|
<view class="country_grid"> |
||||
|
<view v-for="(country, index) in countryList" :key="index" |
||||
|
:class="['country_item', selectedCountry === country ? 'selected' : '']" |
||||
|
@click="selectCountry(country)"> |
||||
|
<text class="country_text">{{ country }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, onMounted, watch, nextTick, computed } from 'vue' |
||||
|
import footerBar from '../../components/footerBar.vue' |
||||
|
import forexMetals from './forexMetals.vue' |
||||
|
import marketOverview from './marketOverview.vue' |
||||
|
import countryMarket from './countryMarket.vue' |
||||
|
|
||||
|
const type = ref('marketSituation') |
||||
|
const iSMT = ref(0) |
||||
|
const searchValue = ref('') |
||||
|
const contentHeight = ref(0) |
||||
|
const headerHeight = ref(0) // 动态计算的header高度 |
||||
|
|
||||
|
// Tab 栏相关数据 |
||||
|
const channelData = ref([ |
||||
|
{ id: 1, title: '概况' }, |
||||
|
{ id: 2, title: '新加坡' }, |
||||
|
{ id: 3, title: '马来西亚' }, |
||||
|
{ id: 4, title: '印度尼西亚' }, |
||||
|
{ id: 5, title: '美国' }, |
||||
|
{ id: 6, title: '中国香港' }, |
||||
|
{ id: 7, title: '泰国' }, |
||||
|
{ id: 8, title: '中国' }, |
||||
|
{ id: 9, title: '加拿大' }, |
||||
|
{ id: 10, title: '越南' }, |
||||
|
{ id: 11, title: '外汇' }, |
||||
|
{ id: 12, title: '贵金属' }, |
||||
|
]) |
||||
|
const pageIndex = ref(0) |
||||
|
const scrollToView = ref('') |
||||
|
|
||||
|
// 动态组件相关 |
||||
|
const currentChannelId = computed(() => { |
||||
|
return channelData.value[pageIndex.value]?.id || 1 |
||||
|
}) |
||||
|
|
||||
|
const currentComponent = computed(() => { |
||||
|
const channelId = currentChannelId.value |
||||
|
|
||||
|
// 概况页面使用 MarketOverview 组件 |
||||
|
if (pageIndex.value === 0) { |
||||
|
return marketOverview |
||||
|
} |
||||
|
// 外汇(id=11)和贵金属(id=12)使用 ForexMetals 组件 |
||||
|
else if (channelId === 11 || channelId === 12) { |
||||
|
return forexMetals |
||||
|
} |
||||
|
// 其他国家/地区页面使用 CountryMarket 组件 |
||||
|
else { |
||||
|
return countryMarket |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
// 计算属性:精准计算content区域的top值 |
||||
|
const contentTopPosition = computed(() => { |
||||
|
const statusBarHeight = iSMT.value || 0 |
||||
|
const currentHeaderHeight = headerHeight.value > 0 ? headerHeight.value : 140 |
||||
|
return statusBarHeight + currentHeaderHeight |
||||
|
}) |
||||
|
|
||||
|
// 弹窗相关数据 |
||||
|
const showCountryModal = ref(false) |
||||
|
const selectedCountry = ref('概况') |
||||
|
const countryList = ref([ |
||||
|
'概况', '新加坡', '马来西亚', '印度尼西亚', '美国', '中国香港', |
||||
|
'泰国', '中国', '加拿大', '越南', '外汇', '贵金属' |
||||
|
]) |
||||
|
|
||||
|
// 搜索输入事件 |
||||
|
const onSearchInput = (e) => { |
||||
|
searchValue.value = e.detail.value |
||||
|
} |
||||
|
|
||||
|
// 搜索确认事件 |
||||
|
const onSearchConfirm = (e) => { |
||||
|
console.log('搜索内容:', e.detail.value) |
||||
|
// 这里可以添加搜索逻辑 |
||||
|
performSearch(e.detail.value) |
||||
|
} |
||||
|
|
||||
|
// 搜索图标点击事件 |
||||
|
const onSearchClick = () => { |
||||
|
if (searchValue.value.trim()) { |
||||
|
performSearch(searchValue.value) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 执行搜索 |
||||
|
const performSearch = (keyword) => { |
||||
|
if (!keyword.trim()) { |
||||
|
uni.showToast({ |
||||
|
title: '请输入搜索内容', |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
uni.showToast({ |
||||
|
title: `搜索: ${keyword}`, |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
// 这里添加实际的搜索逻辑 |
||||
|
} |
||||
|
|
||||
|
// 我的收藏点击事件 |
||||
|
const selected = () => { |
||||
|
uni.showToast({ |
||||
|
title: '我的收藏', |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
// 这里可以跳转到收藏页面 |
||||
|
} |
||||
|
|
||||
|
// 历史记录点击事件 |
||||
|
const history = () => { |
||||
|
uni.showToast({ |
||||
|
title: '历史记录', |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
// 这里可以跳转到历史页面 |
||||
|
} |
||||
|
|
||||
|
// Tab 栏点击事件 |
||||
|
const navClick = (index) => { |
||||
|
pageIndex.value = index |
||||
|
const currentItem = channelData.value[index] |
||||
|
scrollToView.value = 'nav' + currentItem.id |
||||
|
|
||||
|
// 同步更新弹窗中的选中状态 |
||||
|
selectedCountry.value = currentItem.title |
||||
|
|
||||
|
uni.showToast({ |
||||
|
title: `切换到: ${currentItem.title}`, |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
|
||||
|
// 这里可以添加切换 tab 后的数据加载逻辑 |
||||
|
console.log('当前选中的 tab:', currentItem) |
||||
|
} |
||||
|
|
||||
|
// 更多选项点击事件 |
||||
|
const channel_more = () => { |
||||
|
showCountryModal.value = true |
||||
|
} |
||||
|
|
||||
|
// 选择国家 |
||||
|
const selectCountry = (country) => { |
||||
|
selectedCountry.value = country |
||||
|
|
||||
|
// 查找对应的tab索引 |
||||
|
const targetIndex = channelData.value.findIndex(item => item.title === country) |
||||
|
|
||||
|
if (targetIndex !== -1) { |
||||
|
// 同步更新页面tab |
||||
|
pageIndex.value = targetIndex |
||||
|
const currentItem = channelData.value[targetIndex] |
||||
|
scrollToView.value = 'nav' + currentItem.id |
||||
|
|
||||
|
console.log('选中了:' + country + ',同步到tab索引:' + targetIndex) |
||||
|
uni.showToast({ |
||||
|
title: '已切换到:' + country, |
||||
|
icon: 'none', |
||||
|
duration: 2000 |
||||
|
}) |
||||
|
} else { |
||||
|
// 如果是"概况"或其他特殊选项,默认切换到第一个tab |
||||
|
if (country === '概况' || country === '全部') { |
||||
|
pageIndex.value = 0 |
||||
|
scrollToView.value = 'nav' + channelData.value[0].id |
||||
|
} |
||||
|
|
||||
|
console.log('选中了:' + country) |
||||
|
uni.showToast({ |
||||
|
title: '已选择:' + country, |
||||
|
icon: 'none', |
||||
|
duration: 2000 |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 这里可以添加切换到对应国家/地区数据的逻辑 |
||||
|
// 例如:loadMarketData(country) |
||||
|
closeModal() |
||||
|
} |
||||
|
|
||||
|
// 关闭弹窗 |
||||
|
const closeModal = () => { |
||||
|
showCountryModal.value = false |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
// 状态栏高度 |
||||
|
iSMT.value = uni.getSystemInfoSync().statusBarHeight; |
||||
|
|
||||
|
// 初始化 tab 栏 |
||||
|
if (channelData.value.length > 0) { |
||||
|
pageIndex.value = 0 |
||||
|
scrollToView.value = 'nav' + channelData.value[0].id |
||||
|
} |
||||
|
|
||||
|
// 确保DOM渲染完成后再查询高度 |
||||
|
nextTick(() => { |
||||
|
// 动态计算header实际高度 |
||||
|
uni.createSelectorQuery().select('.header_fixed').boundingClientRect((rect) => { |
||||
|
if (rect) { |
||||
|
headerHeight.value = rect.height |
||||
|
console.log('Header实际高度:', headerHeight.value, 'px') |
||||
|
} |
||||
|
}).exec() |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
// 监听headerHeight变化,重新计算contentHeight |
||||
|
watch(headerHeight, (newHeight) => { |
||||
|
if (newHeight > 0) { |
||||
|
const systemInfo = uni.getSystemInfoSync() |
||||
|
const windowHeight = systemInfo.windowHeight |
||||
|
const statusBarHeight = systemInfo.statusBarHeight || 0 |
||||
|
const footerHeight = 100 |
||||
|
|
||||
|
contentHeight.value = windowHeight - statusBarHeight - newHeight - footerHeight |
||||
|
console.log('重新计算contentHeight:', contentHeight.value) |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
/* 主容器样式调整 */ |
||||
|
.main { |
||||
|
position: relative; |
||||
|
height: 100vh; |
||||
|
overflow: hidden; |
||||
|
background-color: white; |
||||
|
} |
||||
|
|
||||
|
/* 状态栏占位 */ |
||||
|
.top { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1001; |
||||
|
background-color: #ffffff; |
||||
|
} |
||||
|
|
||||
|
/* 固定头部样式 */ |
||||
|
.header_fixed { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
z-index: 1000; |
||||
|
background-color: #ffffff; |
||||
|
padding: 20rpx 0 0 0; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
/* 可滚动内容区域 */ |
||||
|
.content_scroll { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 100rpx; |
||||
|
/* 底部导航栏高度 */ |
||||
|
overflow-y: auto; |
||||
|
} |
||||
|
|
||||
|
.header_content { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
height: 80rpx; |
||||
|
padding: 0 20rpx; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_input_wrapper { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
width: 100%; |
||||
|
margin: 0 20rpx 0 0; |
||||
|
height: 70rpx; |
||||
|
border-radius: 35rpx; |
||||
|
background-color: #ffffff; |
||||
|
border: 1rpx solid #e9ecef; |
||||
|
padding: 0 80rpx 0 30rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #5c5c5c; |
||||
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.search_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
opacity: 0.6; |
||||
|
} |
||||
|
|
||||
|
.header_input { |
||||
|
margin-left: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icons { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 15rpx; |
||||
|
} |
||||
|
|
||||
|
.header_icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.header_icon image { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
|
||||
|
/* Tab 栏样式 */ |
||||
|
.channel_li { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 80rpx; |
||||
|
background-color: #ffffff; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.channel_wrap { |
||||
|
width: calc(100% - 60rpx); |
||||
|
height: 100%; |
||||
|
overflow: hidden; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.channel_innerWrap { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 100%; |
||||
|
padding: 0 20rpx; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.channel_item { |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
height: 60rpx; |
||||
|
padding: 0 20rpx; |
||||
|
border-radius: 30rpx; |
||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
||||
|
cursor: pointer; |
||||
|
white-space: nowrap; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.channel_item:active { |
||||
|
transform: scale(0.98); |
||||
|
} |
||||
|
|
||||
|
.channel_item.active { |
||||
|
color: #333; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.channel_text { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: 500; |
||||
|
color: #666666; |
||||
|
transition: color 0.3s ease; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.channel_item.active .channel_text { |
||||
|
color: #333333; |
||||
|
font-weight: 400; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.active_indicator { |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
top: 60%; |
||||
|
transform: translateX(-45%); |
||||
|
width: calc(100% - 20rpx); |
||||
|
min-width: 40rpx; |
||||
|
max-width: 120rpx; |
||||
|
height: 8rpx; |
||||
|
background-image: url('/static/marketSituation-image/bg.png'); |
||||
|
background-size: cover; |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
animation: slideIn 0.1s ease; |
||||
|
border-radius: 8rpx; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
@keyframes slideIn { |
||||
|
from { |
||||
|
width: 0; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
to { |
||||
|
width: 40rpx; |
||||
|
opacity: 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.scroll_indicator { |
||||
|
border-left: 1rpx solid #b6b6b6; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
width: 60rpx; |
||||
|
height: 30rpx; |
||||
|
background-color: #ffffff; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.scroll_indicator image { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
opacity: 0.5; |
||||
|
} |
||||
|
|
||||
|
.content { |
||||
|
margin-top: 20rpx; |
||||
|
background-color: white; |
||||
|
} |
||||
|
|
||||
|
.static-footer { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
} |
||||
|
|
||||
|
/* 弹窗样式 */ |
||||
|
.modal_overlay { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background-color: rgba(0, 0, 0, 0.5); |
||||
|
display: flex; |
||||
|
align-items: flex-end; |
||||
|
z-index: 1000; |
||||
|
} |
||||
|
|
||||
|
.modal_content { |
||||
|
width: 100%; |
||||
|
background-color: #fff; |
||||
|
border-radius: 20rpx 20rpx 0 0; |
||||
|
max-height: 80vh; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.modal_header { |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
padding: 30rpx 40rpx; |
||||
|
border-bottom: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.modal_title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333333; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.modal_close { |
||||
|
position: absolute; |
||||
|
right: 40rpx; |
||||
|
top: 50%; |
||||
|
transform: translateY(-50%); |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
font-size: 40rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.modal_body { |
||||
|
padding: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.country_grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: 1fr 1fr; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.country_item { |
||||
|
padding: 24rpx 30rpx; |
||||
|
border-radius: 12rpx; |
||||
|
background-color: #f8f8f8; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.country_item.selected { |
||||
|
background-color: #ff4444; |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.country_text { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.country_item.selected .country_text { |
||||
|
color: #fff; |
||||
|
} |
||||
|
</style> |
||||
|
After Width: 750 | Height: 198 | Size: 35 KiB |
|
After Width: 750 | Height: 198 | Size: 36 KiB |
|
After Width: 750 | Height: 198 | Size: 37 KiB |
|
After Width: 750 | Height: 198 | Size: 35 KiB |
|
After Width: 200 | Height: 200 | Size: 4.8 KiB |
|
After Width: 305 | Height: 200 | Size: 7.9 KiB |
|
After Width: 200 | Height: 200 | Size: 4.8 KiB |
|
After Width: 48 | Height: 48 | Size: 1.6 KiB |
|
After Width: 24 | Height: 24 | Size: 232 B |
|
After Width: 28 | Height: 31 | Size: 894 B |
|
After Width: 16 | Height: 15 | Size: 797 B |
|
After Width: 40 | Height: 40 | Size: 1.9 KiB |
|
After Width: 40 | Height: 40 | Size: 2.6 KiB |
|
After Width: 40 | Height: 40 | Size: 1.7 KiB |
|
After Width: 40 | Height: 40 | Size: 1.5 KiB |
|
After Width: 200 | Height: 200 | Size: 3.1 KiB |
|
After Width: 200 | Height: 200 | Size: 4.4 KiB |
|
After Width: 18 | Height: 18 | Size: 523 B |
|
After Width: 9 | Height: 9 | Size: 274 B |
|
After Width: 16 | Height: 16 | Size: 522 B |
|
After Width: 34 | Height: 34 | Size: 292 B |
|
After Width: 20 | Height: 20 | Size: 247 B |
|
After Width: 213 | Height: 228 | Size: 16 KiB |
|
After Width: 50 | Height: 110 | Size: 11 KiB |
|
After Width: 50 | Height: 109 | Size: 11 KiB |
|
After Width: 50 | Height: 110 | Size: 12 KiB |
@ -0,0 +1,320 @@ |
|||||
|
## 2.5.0-20230101(2023-01-01) |
||||
|
- 秋云图表组件 修改条件编译顺序,确保uniapp的cli方式的项目依赖不完整时可以正常显示 |
||||
|
- 秋云图表组件 恢复props属性directory的使用,以修复vue3项目中,开启echarts后,echarts目录识别错误的bug |
||||
|
- uCharts.js 修复区域图、混合图只有一个数据时图表显示不正确的bug |
||||
|
- uCharts.js 修复折线图、区域图中时间轴类别图表tooltip指示点显示不正确的bug |
||||
|
- uCharts.js 修复x轴使用labelCount时,并且boundaryGap = 'justify' 并且关闭Y轴显示的时候,最后一个坐标值不显示的bug |
||||
|
- uCharts.js 修复折线图只有一组数据时 ios16 渲染颜色不正确的bug |
||||
|
- uCharts.js 修复玫瑰图半径显示不正确的bug |
||||
|
- uCharts.js 柱状图、山峰图增加正负图功能,y轴网格如果需要显示0轴则由 min max 及 splitNumber 确定,后续版本优化自动显示0轴 |
||||
|
- uCharts.js 柱状图column增加 opts.extra.column.labelPosition,数据标签位置,有效值为 outside外部, insideTop内顶部, center内中间, bottom内底部 |
||||
|
- uCharts.js 雷达图radar增加 opts.extra.radar.labelShow,否显示各项标识文案是,默认true |
||||
|
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.boxPadding,提示窗边框填充距离,默认3px |
||||
|
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.fontSize,提示窗字体大小配置,默认13px |
||||
|
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.lineHeight,提示窗文字行高,默认20px |
||||
|
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShow,是否显示左侧图例,默认true |
||||
|
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShape,图例形状,图例标识样式,有效值为 auto自动跟随图例, diamond◆, circle●, triangle▲, square■, rect▬, line- |
||||
|
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelFontSize,字体大小配置,默认13px |
||||
|
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelPadding,标签边框内填充距离,默认6px |
||||
|
- uCharts.js 折线图line增加 opts.extra.line.linearType,渐变色类型,可选值 none关闭渐变色,custom 自定义渐变色。使用自定义渐变色时请赋值serie.linearColor作为颜色值 |
||||
|
- uCharts.js 折线图line增加 serie.linearColor,渐变色数组,格式为2维数组[起始位置,颜色值],例如[[0,'#0EE2F8'],[0.3,'#2BDCA8'],[0.6,'#1890FF'],[1,'#9A60B4']] |
||||
|
- uCharts.js 折线图line增加 opts.extra.line.onShadow,是否开启折线阴影,开启后请赋值serie.setShadow阴影设置 |
||||
|
- uCharts.js 折线图line增加 serie.setShadow,阴影配置,格式为4位数组:[offsetX,offsetY,blur,color] |
||||
|
- uCharts.js 折线图line增加 opts.extra.line.animation,动画效果方向,可选值为vertical 垂直动画效果,horizontal 水平动画效果 |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.lineHeight,X轴字体行高,默认20px |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.marginTop,X轴文字距离轴线的距离,默认0px |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.title,当前X轴标题 |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontSize,标题字体大小,默认13px |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetY,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetX,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
||||
|
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontColor,标题字体颜色,默认#666666 |
||||
|
|
||||
|
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
||||
|
- 如果是uni-modules版本组件,请先登录HBuilderX账号; |
||||
|
- 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
||||
|
- 如果是cli项目请使用码云上的非uniCloud版本组件; |
||||
|
- 或者添加uniCloud的依赖; |
||||
|
- 或者使用原生uCharts; |
||||
|
## 2.4.5-20221130(2022-11-30) |
||||
|
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
||||
|
- uCharts.js 折线图修复特殊情况下只有单点数据,并改变线宽后点变为圆形的bug |
||||
|
- uCharts.js 修复Y轴disabled启用后无效并报错的bug |
||||
|
- uCharts.js 修复仪表盘起始结束角度特殊情况下显示不正确的bug |
||||
|
- uCharts.js 雷达图新增参数 opts.extra.radar.radius , 自定义雷达图半径 |
||||
|
- uCharts.js 折线图、区域图增加tooltip指示点,opts.extra.line.activeType/opts.extra.area.activeType,可选值"none"不启用激活指示点,"hollow"空心点模式,"solid"实心点模式 |
||||
|
## 2.4.4-20221102(2022-11-02) |
||||
|
- 秋云图表组件 修复使用echarts时reload、reshow无法调用重新渲染的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/40) |
||||
|
- 秋云图表组件 修复使用echarts时,初始化时宽高不正确的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/42) |
||||
|
- 秋云图表组件 修复uniapp的h5使用history模式时,无法加载echarts的bug |
||||
|
- 秋云图表组件 小程序端@complete、@scrollLeft、@scrollRight、@getTouchStart、@getTouchMove、@getTouchEnd事件增加opts参数传出,方便一些特殊需求的交互获取数据。 |
||||
|
|
||||
|
- uCharts.js 修复calTooltipYAxisData方法内formatter格式化方法未与y轴方法同步的问题,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/43) |
||||
|
- uCharts.js 地图新增参数opts.series[i].fillOpacity,以透明度方式来设置颜色过度效果,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/38) |
||||
|
- uCharts.js 地图新增参数opts.extra.map.active,是否启用点击激活变色 |
||||
|
- uCharts.js 地图新增参数opts.extra.map.activeTextColor,是否启用点击激活变色 |
||||
|
- uCharts.js 地图新增渲染完成事件renderComplete |
||||
|
- uCharts.js 漏斗图修复当部分数据相同时tooltip提示窗点击错误的bug |
||||
|
- uCharts.js 漏斗图新增参数series.data[i].centerText 居中标签文案 |
||||
|
- uCharts.js 漏斗图新增参数series.data[i].centerTextSize 居中标签文案字体大小,默认opts.fontSize |
||||
|
- uCharts.js 漏斗图新增参数series.data[i].centerTextColor 居中标签文案字体颜色,默认#FFFFFF |
||||
|
- uCharts.js 漏斗图新增参数opts.extra.funnel.minSize 最小值的最小宽度,默认0 |
||||
|
- uCharts.js 进度条新增参数opts.extra.arcbar.direction,动画方向,可选值为cw顺时针、ccw逆时针 |
||||
|
- uCharts.js 混合图新增参数opts.extra.mix.line.width,折线的宽度,默认2 |
||||
|
- uCharts.js 修复tooltip开启horizentalLine水平横线标注时,图表显示错位的bug |
||||
|
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
||||
|
- uCharts.js 修复开启滚动条后X轴文字超出绘图区域后的隐藏逻辑 |
||||
|
- uCharts.js 柱状图、条状图修复堆叠模式不能通过{value,color}赋值单个柱子颜色的问题 |
||||
|
- uCharts.js 气泡图修复不识别series.textSize和series.textColor的bug |
||||
|
|
||||
|
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
||||
|
1. 如果是uni-modules版本组件,请先登录HBuilderX账号; |
||||
|
2. 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
||||
|
3. 如果是cli项目请使用码云上的非uniCloud版本组件; |
||||
|
4. 或者添加uniCloud的依赖; |
||||
|
5. 或者使用原生uCharts; |
||||
|
## 2.4.3-20220505(2022-05-05) |
||||
|
- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug |
||||
|
- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1 |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel, 是否显示刻度点值,默认false |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0 |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3 |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变 |
||||
|
- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"] |
||||
|
- uCharts.js 雷达图优化支持series.textColor、series.textSize属性 |
||||
|
- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表 |
||||
|
- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位 |
||||
|
- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色 |
||||
|
- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2 |
||||
|
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图 |
||||
|
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图 |
||||
|
- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法 |
||||
|
- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){} |
||||
|
- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug |
||||
|
- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug |
||||
|
- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2) |
||||
|
|
||||
|
## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6) |
||||
|
> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0" |
||||
|
## 2.4.2-20220421(2022-04-21) |
||||
|
- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题 |
||||
|
## 2.4.2-20220420(2022-04-20) |
||||
|
## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题 |
||||
|
- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图 |
||||
|
- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘 |
||||
|
- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug |
||||
|
- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响) |
||||
|
- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。 |
||||
|
- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。 |
||||
|
- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。 |
||||
|
- uCharts.js 新增dobuleZoom双指缩放功能 |
||||
|
- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示 |
||||
|
- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug |
||||
|
- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug |
||||
|
- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用 |
||||
|
- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY |
||||
|
- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug |
||||
|
- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug |
||||
|
- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug |
||||
|
- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90) |
||||
|
- uCharts.js 修复地图文字标签层级显示不正确的bug |
||||
|
- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug |
||||
|
- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug |
||||
|
|
||||
|
## 另外我们还开发了各大原生小程序组件,已发布至码云和npm |
||||
|
[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts) |
||||
|
[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun) |
||||
|
|
||||
|
## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网 |
||||
|
[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/) |
||||
|
## 2.3.7-20220122(2022-01-22) |
||||
|
## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本 |
||||
|
- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。 |
||||
|
## 2.3.7-20220118(2022-01-18) |
||||
|
## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder! |
||||
|
## 2.3.67-20220118(2022-01-18) |
||||
|
- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改: |
||||
|
1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。 |
||||
|
2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。 |
||||
|
3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端) |
||||
|
## 2.3.6-20220111(2022-01-11) |
||||
|
- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0) |
||||
|
## 2.3.6-20211201(2021-12-01) |
||||
|
- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug |
||||
|
## 2.3.5-20211014(2021-10-15) |
||||
|
- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新) |
||||
|
## 2.3.4-20211012(2021-10-12) |
||||
|
- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug |
||||
|
## 2.3.3-20210706(2021-07-06) |
||||
|
- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示 |
||||
|
## 2.3.2-20210627(2021-06-27) |
||||
|
- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug |
||||
|
## 2.3.1-20210616(2021-06-16) |
||||
|
- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug |
||||
|
## 2.3.0-20210612(2021-06-12) |
||||
|
- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts) |
||||
|
- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件 |
||||
|
- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数 |
||||
|
- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法 |
||||
|
## 2.2.1-20210603(2021-06-03) |
||||
|
- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug |
||||
|
- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置 |
||||
|
## 2.2.0-20210529(2021-05-29) |
||||
|
- uCharts.js 增加条状图type="bar" |
||||
|
- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo |
||||
|
## 2.1.7-20210524(2021-05-24) |
||||
|
- uCharts.js 修复大数据量模式下曲线图不平滑的bug |
||||
|
## 2.1.6-20210523(2021-05-23) |
||||
|
- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug |
||||
|
## 2.1.5-2021051702(2021-05-17) |
||||
|
- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug |
||||
|
## 2.1.5-20210517(2021-05-17) |
||||
|
- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug |
||||
|
## 2.1.4-20210516(2021-05-16) |
||||
|
- 秋云图表组件 优化onWindowResize防抖方法 |
||||
|
- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug |
||||
|
- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug |
||||
|
- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表 |
||||
|
## 2.1.3-20210513(2021-05-13) |
||||
|
- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点 |
||||
|
- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ |
||||
|
- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug |
||||
|
- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法 |
||||
|
- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false |
||||
|
- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug |
||||
|
- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug |
||||
|
- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug |
||||
|
- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index |
||||
|
- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo |
||||
|
- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo |
||||
|
## 2.1.2-20210509(2021-05-09) |
||||
|
秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug |
||||
|
## 2.1.1-20210509(2021-05-09) |
||||
|
- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。 |
||||
|
- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。 |
||||
|
- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。 |
||||
|
## 2.1.0-20210507(2021-05-07) |
||||
|
- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug |
||||
|
- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug |
||||
|
- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug |
||||
|
## 2.1.0-20210506(2021-05-06) |
||||
|
- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug |
||||
|
- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug |
||||
|
- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid") |
||||
|
- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例 |
||||
|
- uCharts.js 升级至v2.1.0版本 |
||||
|
- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug |
||||
|
- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug |
||||
|
- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug |
||||
|
- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug |
||||
|
- uCharts.js 修复 词云图获取点击索引偶尔不准的bug |
||||
|
- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter) |
||||
|
- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid") |
||||
|
- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble") |
||||
|
- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。 |
||||
|
## 2.0.0-20210502(2021-05-02) |
||||
|
- uCharts.js 修复词云图获取点击索引不正确的bug |
||||
|
## 2.0.0-20210501(2021-05-01) |
||||
|
- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug |
||||
|
## 2.0.0-20210426(2021-04-26) |
||||
|
- 秋云图表组件 修复QQ小程序不支持canvas2d的bug |
||||
|
- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug |
||||
|
- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距 |
||||
|
- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
||||
|
- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
||||
|
- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px |
||||
|
## 2.0.0-20210422-2(2021-04-22) |
||||
|
秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug |
||||
|
## 2.0.0-20210422(2021-04-22) |
||||
|
- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug |
||||
|
## 2.0.0-20210421(2021-04-21) |
||||
|
- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug |
||||
|
## 2.0.0-20210420(2021-04-20) |
||||
|
- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug |
||||
|
- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件 |
||||
|
## 2.0.0-20210419(2021-04-19) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
|
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
|
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
|
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
|
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
|
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
|
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug |
||||
|
- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug |
||||
|
## 2.0.0-20210418(2021-04-18) |
||||
|
- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug |
||||
|
## 2.0.0-20210416(2021-04-16) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
|
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
|
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
|
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
|
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
|
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
|
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
||||
|
- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
||||
|
- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug |
||||
|
## 2.0.0-20210415(2021-04-15) |
||||
|
- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug |
||||
|
- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug |
||||
|
## 2.0.0-20210414(2021-04-14) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
|
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
|
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
|
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
|
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
|
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
|
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug |
||||
|
- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue) |
||||
|
- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor |
||||
|
- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug |
||||
|
## 2.0.0-20210413(2021-04-13) |
||||
|
- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug |
||||
|
- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug |
||||
|
- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件 |
||||
|
- uCharts.js 修复饼图类数据格式series属性不生效的bug |
||||
|
- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue |
||||
|
## 2.0.0-20210412-2(2021-04-12) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
|
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
|
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug |
||||
|
- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例 |
||||
|
## 2.0.0-20210412(2021-04-12) |
||||
|
- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化 |
||||
|
- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug |
||||
|
## 2.0.0-20210411(2021-04-11) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
|
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。 |
||||
|
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue |
||||
|
- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug |
||||
|
- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug |
||||
|
## 2.0.0-20210410(2021-04-10) |
||||
|
- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug |
||||
|
- 增加标记线及柱状图自定义颜色的demo |
||||
|
## 2.0.0-20210409(2021-04-08) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug |
||||
|
- 修复组件在支付宝小程序端点击位置不准确的bug |
||||
|
## 2.0.0-20210408(2021-04-07) |
||||
|
- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复) |
||||
|
- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug |
||||
|
## 2.0.0-20210407(2021-04-06) |
||||
|
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
|
## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode` |
||||
|
## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
|
## 2.0.0-20210406(2021-04-05) |
||||
|
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
||||
|
## 2.0.0(2021-04-05) |
||||
|
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
||||
1618
uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
File diff suppressed because it is too large
View File
46
uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
File diff suppressed because it is too large
View File
@ -0,0 +1,162 @@ |
|||||
|
<template> |
||||
|
<view class="container loading1"> |
||||
|
<view class="shape shape1"></view> |
||||
|
<view class="shape shape2"></view> |
||||
|
<view class="shape shape3"></view> |
||||
|
<view class="shape shape4"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'loading1', |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped="true"> |
||||
|
.container { |
||||
|
width: 30px; |
||||
|
height: 30px; |
||||
|
position: relative; |
||||
|
} |
||||
|
.container.loading1 { |
||||
|
-webkit-transform: rotate(45deg); |
||||
|
transform: rotate(45deg); |
||||
|
} |
||||
|
|
||||
|
.container .shape { |
||||
|
position: absolute; |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 1px; |
||||
|
} |
||||
|
.container .shape.shape1 { |
||||
|
left: 0; |
||||
|
background-color: #1890FF; |
||||
|
} |
||||
|
.container .shape.shape2 { |
||||
|
right: 0; |
||||
|
background-color: #91CB74; |
||||
|
} |
||||
|
.container .shape.shape3 { |
||||
|
bottom: 0; |
||||
|
background-color: #FAC858; |
||||
|
} |
||||
|
.container .shape.shape4 { |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
background-color: #EE6666; |
||||
|
} |
||||
|
|
||||
|
.loading1 .shape1 { |
||||
|
-webkit-animation: animation1shape1 0.5s ease 0s infinite alternate; |
||||
|
animation: animation1shape1 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation1shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(16px, 16px); |
||||
|
transform: translate(16px, 16px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation1shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(16px, 16px); |
||||
|
transform: translate(16px, 16px); |
||||
|
} |
||||
|
} |
||||
|
.loading1 .shape2 { |
||||
|
-webkit-animation: animation1shape2 0.5s ease 0s infinite alternate; |
||||
|
animation: animation1shape2 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation1shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-16px, 16px); |
||||
|
transform: translate(-16px, 16px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation1shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-16px, 16px); |
||||
|
transform: translate(-16px, 16px); |
||||
|
} |
||||
|
} |
||||
|
.loading1 .shape3 { |
||||
|
-webkit-animation: animation1shape3 0.5s ease 0s infinite alternate; |
||||
|
animation: animation1shape3 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation1shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(16px, -16px); |
||||
|
transform: translate(16px, -16px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation1shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(16px, -16px); |
||||
|
transform: translate(16px, -16px); |
||||
|
} |
||||
|
} |
||||
|
.loading1 .shape4 { |
||||
|
-webkit-animation: animation1shape4 0.5s ease 0s infinite alternate; |
||||
|
animation: animation1shape4 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation1shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-16px, -16px); |
||||
|
transform: translate(-16px, -16px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation1shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-16px, -16px); |
||||
|
transform: translate(-16px, -16px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,170 @@ |
|||||
|
<template> |
||||
|
<view class="container loading2"> |
||||
|
<view class="shape shape1"></view> |
||||
|
<view class="shape shape2"></view> |
||||
|
<view class="shape shape3"></view> |
||||
|
<view class="shape shape4"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'loading2', |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped="true"> |
||||
|
.container { |
||||
|
width: 30px; |
||||
|
height: 30px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.container.loading2 { |
||||
|
-webkit-transform: rotate(10deg); |
||||
|
transform: rotate(10deg); |
||||
|
} |
||||
|
.container.loading2 .shape { |
||||
|
border-radius: 5px; |
||||
|
} |
||||
|
.container.loading2{ |
||||
|
-webkit-animation: rotation 1s infinite; |
||||
|
animation: rotation 1s infinite; |
||||
|
} |
||||
|
|
||||
|
.container .shape { |
||||
|
position: absolute; |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 1px; |
||||
|
} |
||||
|
.container .shape.shape1 { |
||||
|
left: 0; |
||||
|
background-color: #1890FF; |
||||
|
} |
||||
|
.container .shape.shape2 { |
||||
|
right: 0; |
||||
|
background-color: #91CB74; |
||||
|
} |
||||
|
.container .shape.shape3 { |
||||
|
bottom: 0; |
||||
|
background-color: #FAC858; |
||||
|
} |
||||
|
.container .shape.shape4 { |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
background-color: #EE6666; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.loading2 .shape1 { |
||||
|
-webkit-animation: animation2shape1 0.5s ease 0s infinite alternate; |
||||
|
animation: animation2shape1 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation2shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(20px, 20px); |
||||
|
transform: translate(20px, 20px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation2shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(20px, 20px); |
||||
|
transform: translate(20px, 20px); |
||||
|
} |
||||
|
} |
||||
|
.loading2 .shape2 { |
||||
|
-webkit-animation: animation2shape2 0.5s ease 0s infinite alternate; |
||||
|
animation: animation2shape2 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation2shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-20px, 20px); |
||||
|
transform: translate(-20px, 20px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation2shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-20px, 20px); |
||||
|
transform: translate(-20px, 20px); |
||||
|
} |
||||
|
} |
||||
|
.loading2 .shape3 { |
||||
|
-webkit-animation: animation2shape3 0.5s ease 0s infinite alternate; |
||||
|
animation: animation2shape3 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation2shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(20px, -20px); |
||||
|
transform: translate(20px, -20px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation2shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(20px, -20px); |
||||
|
transform: translate(20px, -20px); |
||||
|
} |
||||
|
} |
||||
|
.loading2 .shape4 { |
||||
|
-webkit-animation: animation2shape4 0.5s ease 0s infinite alternate; |
||||
|
animation: animation2shape4 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation2shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-20px, -20px); |
||||
|
transform: translate(-20px, -20px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation2shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-20px, -20px); |
||||
|
transform: translate(-20px, -20px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,173 @@ |
|||||
|
<template> |
||||
|
<view class="container loading3"> |
||||
|
<view class="shape shape1"></view> |
||||
|
<view class="shape shape2"></view> |
||||
|
<view class="shape shape3"></view> |
||||
|
<view class="shape shape4"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'loading3', |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped="true"> |
||||
|
.container { |
||||
|
width: 30px; |
||||
|
height: 30px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.container.loading3 { |
||||
|
-webkit-animation: rotation 1s infinite; |
||||
|
animation: rotation 1s infinite; |
||||
|
} |
||||
|
.container.loading3 .shape1 { |
||||
|
border-top-left-radius: 10px; |
||||
|
} |
||||
|
.container.loading3 .shape2 { |
||||
|
border-top-right-radius: 10px; |
||||
|
} |
||||
|
.container.loading3 .shape3 { |
||||
|
border-bottom-left-radius: 10px; |
||||
|
} |
||||
|
.container.loading3 .shape4 { |
||||
|
border-bottom-right-radius: 10px; |
||||
|
} |
||||
|
|
||||
|
.container .shape { |
||||
|
position: absolute; |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 1px; |
||||
|
} |
||||
|
.container .shape.shape1 { |
||||
|
left: 0; |
||||
|
background-color: #1890FF; |
||||
|
} |
||||
|
.container .shape.shape2 { |
||||
|
right: 0; |
||||
|
background-color: #91CB74; |
||||
|
} |
||||
|
.container .shape.shape3 { |
||||
|
bottom: 0; |
||||
|
background-color: #FAC858; |
||||
|
} |
||||
|
.container .shape.shape4 { |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
background-color: #EE6666; |
||||
|
} |
||||
|
|
||||
|
.loading3 .shape1 { |
||||
|
-webkit-animation: animation3shape1 0.5s ease 0s infinite alternate; |
||||
|
animation: animation3shape1 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation3shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(5px, 5px); |
||||
|
transform: translate(5px, 5px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation3shape1 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(5px, 5px); |
||||
|
transform: translate(5px, 5px); |
||||
|
} |
||||
|
} |
||||
|
.loading3 .shape2 { |
||||
|
-webkit-animation: animation3shape2 0.5s ease 0s infinite alternate; |
||||
|
animation: animation3shape2 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation3shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-5px, 5px); |
||||
|
transform: translate(-5px, 5px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation3shape2 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-5px, 5px); |
||||
|
transform: translate(-5px, 5px); |
||||
|
} |
||||
|
} |
||||
|
.loading3 .shape3 { |
||||
|
-webkit-animation: animation3shape3 0.5s ease 0s infinite alternate; |
||||
|
animation: animation3shape3 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation3shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(5px, -5px); |
||||
|
transform: translate(5px, -5px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation3shape3 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(5px, -5px); |
||||
|
transform: translate(5px, -5px); |
||||
|
} |
||||
|
} |
||||
|
.loading3 .shape4 { |
||||
|
-webkit-animation: animation3shape4 0.5s ease 0s infinite alternate; |
||||
|
animation: animation3shape4 0.5s ease 0s infinite alternate; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation3shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-5px, -5px); |
||||
|
transform: translate(-5px, -5px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation3shape4 { |
||||
|
from { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
to { |
||||
|
-webkit-transform: translate(-5px, -5px); |
||||
|
transform: translate(-5px, -5px); |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,222 @@ |
|||||
|
<template> |
||||
|
<view class="container loading5"> |
||||
|
<view class="shape shape1"></view> |
||||
|
<view class="shape shape2"></view> |
||||
|
<view class="shape shape3"></view> |
||||
|
<view class="shape shape4"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'loading5', |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped="true"> |
||||
|
.container { |
||||
|
width: 30px; |
||||
|
height: 30px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.container.loading5 .shape { |
||||
|
width: 15px; |
||||
|
height: 15px; |
||||
|
} |
||||
|
|
||||
|
.container .shape { |
||||
|
position: absolute; |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 1px; |
||||
|
} |
||||
|
.container .shape.shape1 { |
||||
|
left: 0; |
||||
|
background-color: #1890FF; |
||||
|
} |
||||
|
.container .shape.shape2 { |
||||
|
right: 0; |
||||
|
background-color: #91CB74; |
||||
|
} |
||||
|
.container .shape.shape3 { |
||||
|
bottom: 0; |
||||
|
background-color: #FAC858; |
||||
|
} |
||||
|
.container .shape.shape4 { |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
background-color: #EE6666; |
||||
|
} |
||||
|
|
||||
|
.loading5 .shape1 { |
||||
|
animation: animation5shape1 2s ease 0s infinite reverse; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation5shape1 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, 15px); |
||||
|
transform: translate(0, 15px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(15px, 15px); |
||||
|
transform: translate(15px, 15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(15px, 0); |
||||
|
transform: translate(15px, 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation5shape1 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, 15px); |
||||
|
transform: translate(0, 15px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(15px, 15px); |
||||
|
transform: translate(15px, 15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(15px, 0); |
||||
|
transform: translate(15px, 0); |
||||
|
} |
||||
|
} |
||||
|
.loading5 .shape2 { |
||||
|
animation: animation5shape2 2s ease 0s infinite reverse; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation5shape2 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(-15px, 0); |
||||
|
transform: translate(-15px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-15px, 15px); |
||||
|
transform: translate(-15px, 15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, 15px); |
||||
|
transform: translate(0, 15px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation5shape2 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(-15px, 0); |
||||
|
transform: translate(-15px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-15px, 15px); |
||||
|
transform: translate(-15px, 15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, 15px); |
||||
|
transform: translate(0, 15px); |
||||
|
} |
||||
|
} |
||||
|
.loading5 .shape3 { |
||||
|
animation: animation5shape3 2s ease 0s infinite reverse; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation5shape3 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(15px, 0); |
||||
|
transform: translate(15px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(15px, -15px); |
||||
|
transform: translate(15px, -15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, -15px); |
||||
|
transform: translate(0, -15px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation5shape3 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(15px, 0); |
||||
|
transform: translate(15px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(15px, -15px); |
||||
|
transform: translate(15px, -15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, -15px); |
||||
|
transform: translate(0, -15px); |
||||
|
} |
||||
|
} |
||||
|
.loading5 .shape4 { |
||||
|
animation: animation5shape4 2s ease 0s infinite reverse; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation5shape4 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, -15px); |
||||
|
transform: translate(0, -15px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-15px, -15px); |
||||
|
transform: translate(-15px, -15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(-15px, 0); |
||||
|
transform: translate(-15px, 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation5shape4 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, -15px); |
||||
|
transform: translate(0, -15px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-15px, -15px); |
||||
|
transform: translate(-15px, -15px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(-15px, 0); |
||||
|
transform: translate(-15px, 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,229 @@ |
|||||
|
<template> |
||||
|
<view class="container loading6"> |
||||
|
<view class="shape shape1"></view> |
||||
|
<view class="shape shape2"></view> |
||||
|
<view class="shape shape3"></view> |
||||
|
<view class="shape shape4"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'loading6', |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped="true"> |
||||
|
.container { |
||||
|
width: 30px; |
||||
|
height: 30px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.container.loading6 { |
||||
|
-webkit-animation: rotation 1s infinite; |
||||
|
animation: rotation 1s infinite; |
||||
|
} |
||||
|
.container.loading6 .shape { |
||||
|
width: 12px; |
||||
|
height: 12px; |
||||
|
border-radius: 2px; |
||||
|
} |
||||
|
.container .shape { |
||||
|
position: absolute; |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 1px; |
||||
|
} |
||||
|
.container .shape.shape1 { |
||||
|
left: 0; |
||||
|
background-color: #1890FF; |
||||
|
} |
||||
|
.container .shape.shape2 { |
||||
|
right: 0; |
||||
|
background-color: #91CB74; |
||||
|
} |
||||
|
.container .shape.shape3 { |
||||
|
bottom: 0; |
||||
|
background-color: #FAC858; |
||||
|
} |
||||
|
.container .shape.shape4 { |
||||
|
bottom: 0; |
||||
|
right: 0; |
||||
|
background-color: #EE6666; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.loading6 .shape1 { |
||||
|
-webkit-animation: animation6shape1 2s linear 0s infinite normal; |
||||
|
animation: animation6shape1 2s linear 0s infinite normal; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation6shape1 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, 18px); |
||||
|
transform: translate(0, 18px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(18px, 18px); |
||||
|
transform: translate(18px, 18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(18px, 0); |
||||
|
transform: translate(18px, 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation6shape1 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, 18px); |
||||
|
transform: translate(0, 18px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(18px, 18px); |
||||
|
transform: translate(18px, 18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(18px, 0); |
||||
|
transform: translate(18px, 0); |
||||
|
} |
||||
|
} |
||||
|
.loading6 .shape2 { |
||||
|
-webkit-animation: animation6shape2 2s linear 0s infinite normal; |
||||
|
animation: animation6shape2 2s linear 0s infinite normal; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation6shape2 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(-18px, 0); |
||||
|
transform: translate(-18px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-18px, 18px); |
||||
|
transform: translate(-18px, 18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, 18px); |
||||
|
transform: translate(0, 18px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation6shape2 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(-18px, 0); |
||||
|
transform: translate(-18px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-18px, 18px); |
||||
|
transform: translate(-18px, 18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, 18px); |
||||
|
transform: translate(0, 18px); |
||||
|
} |
||||
|
} |
||||
|
.loading6 .shape3 { |
||||
|
-webkit-animation: animation6shape3 2s linear 0s infinite normal; |
||||
|
animation: animation6shape3 2s linear 0s infinite normal; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation6shape3 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(18px, 0); |
||||
|
transform: translate(18px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(18px, -18px); |
||||
|
transform: translate(18px, -18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, -18px); |
||||
|
transform: translate(0, -18px); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation6shape3 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(18px, 0); |
||||
|
transform: translate(18px, 0); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(18px, -18px); |
||||
|
transform: translate(18px, -18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(0, -18px); |
||||
|
transform: translate(0, -18px); |
||||
|
} |
||||
|
} |
||||
|
.loading6 .shape4 { |
||||
|
-webkit-animation: animation6shape4 2s linear 0s infinite normal; |
||||
|
animation: animation6shape4 2s linear 0s infinite normal; |
||||
|
} |
||||
|
|
||||
|
@-webkit-keyframes animation6shape4 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, -18px); |
||||
|
transform: translate(0, -18px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-18px, -18px); |
||||
|
transform: translate(-18px, -18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(-18px, 0); |
||||
|
transform: translate(-18px, 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes animation6shape4 { |
||||
|
0% { |
||||
|
-webkit-transform: translate(0, 0); |
||||
|
transform: translate(0, 0); |
||||
|
} |
||||
|
25% { |
||||
|
-webkit-transform: translate(0, -18px); |
||||
|
transform: translate(0, -18px); |
||||
|
} |
||||
|
50% { |
||||
|
-webkit-transform: translate(-18px, -18px); |
||||
|
transform: translate(-18px, -18px); |
||||
|
} |
||||
|
75% { |
||||
|
-webkit-transform: translate(-18px, 0); |
||||
|
transform: translate(-18px, 0); |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,36 @@ |
|||||
|
<template> |
||||
|
<view> |
||||
|
<Loading1 v-if="loadingType==1"/> |
||||
|
<Loading2 v-if="loadingType==2"/> |
||||
|
<Loading3 v-if="loadingType==3"/> |
||||
|
<Loading4 v-if="loadingType==4"/> |
||||
|
<Loading5 v-if="loadingType==5"/> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import Loading1 from "./loading1.vue"; |
||||
|
import Loading2 from "./loading2.vue"; |
||||
|
import Loading3 from "./loading3.vue"; |
||||
|
import Loading4 from "./loading4.vue"; |
||||
|
import Loading5 from "./loading5.vue"; |
||||
|
export default { |
||||
|
components:{Loading1,Loading2,Loading3,Loading4,Loading5}, |
||||
|
name: 'qiun-loading', |
||||
|
props: { |
||||
|
loadingType: { |
||||
|
type: Number, |
||||
|
default: 2 |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
}; |
||||
|
}, |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,422 @@ |
|||||
|
/* |
||||
|
* uCharts® |
||||
|
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
||||
|
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
||||
|
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
|
* 复制使用请保留本段注释,感谢支持开源! |
||||
|
* |
||||
|
* uCharts®官方网站 |
||||
|
* https://www.uCharts.cn
|
||||
|
* |
||||
|
* 开源地址: |
||||
|
* https://gitee.com/uCharts/uCharts
|
||||
|
* |
||||
|
* uni-app插件市场地址: |
||||
|
* http://ext.dcloud.net.cn/plugin?id=271
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
// 通用配置项
|
||||
|
|
||||
|
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
||||
|
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
||||
|
|
||||
|
const cfe = { |
||||
|
//demotype为自定义图表类型
|
||||
|
"type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"], |
||||
|
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
|
||||
|
"categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"], |
||||
|
//instance为实例变量承载属性,option为eopts承载属性,不要删除
|
||||
|
"instance": {}, |
||||
|
"option": {}, |
||||
|
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
||||
|
"formatter":{ |
||||
|
"tooltipDemo1":function(res){ |
||||
|
let result = '' |
||||
|
for (let i in res) { |
||||
|
if (i == 0) { |
||||
|
result += res[i].axisValueLabel + '年销售额' |
||||
|
} |
||||
|
let value = '--' |
||||
|
if (res[i].data !== null) { |
||||
|
value = res[i].data |
||||
|
} |
||||
|
// #ifdef H5
|
||||
|
result += '\n' + res[i].seriesName + ':' + value + ' 万元' |
||||
|
// #endif
|
||||
|
|
||||
|
// #ifdef APP-PLUS
|
||||
|
result += '<br/>' + res[i].marker + res[i].seriesName + ':' + value + ' 万元' |
||||
|
// #endif
|
||||
|
} |
||||
|
return result; |
||||
|
}, |
||||
|
legendFormat:function(name){ |
||||
|
return "自定义图例+"+name; |
||||
|
}, |
||||
|
yAxisFormatDemo:function (value, index) { |
||||
|
return value + '元'; |
||||
|
}, |
||||
|
seriesFormatDemo:function(res){ |
||||
|
return res.name + '年' + res.value + '元'; |
||||
|
} |
||||
|
}, |
||||
|
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
|
||||
|
"demotype":{ |
||||
|
"color": color, |
||||
|
//在这里填写echarts的option即可
|
||||
|
|
||||
|
}, |
||||
|
//下面是自定义配置,请添加项目所需的通用配置
|
||||
|
"column": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'axis' |
||||
|
}, |
||||
|
"grid": { |
||||
|
"top": 30, |
||||
|
"bottom": 50, |
||||
|
"right": 15, |
||||
|
"left": 40 |
||||
|
}, |
||||
|
"legend": { |
||||
|
"bottom": 'left', |
||||
|
}, |
||||
|
"toolbox": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"xAxis": { |
||||
|
"type": 'category', |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
"boundaryGap": true, |
||||
|
"data": [] |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"type": 'value', |
||||
|
"axisTick": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'bar', |
||||
|
"data": [], |
||||
|
"barwidth": 20, |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"color": "#666666", |
||||
|
"position": 'top', |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"line": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'axis' |
||||
|
}, |
||||
|
"grid": { |
||||
|
"top": 30, |
||||
|
"bottom": 50, |
||||
|
"right": 15, |
||||
|
"left": 40 |
||||
|
}, |
||||
|
"legend": { |
||||
|
"bottom": 'left', |
||||
|
}, |
||||
|
"toolbox": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"xAxis": { |
||||
|
"type": 'category', |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
"boundaryGap": true, |
||||
|
"data": [] |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"type": 'value', |
||||
|
"axisTick": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'line', |
||||
|
"data": [], |
||||
|
"barwidth": 20, |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"color": "#666666", |
||||
|
"position": 'top', |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"area": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'axis' |
||||
|
}, |
||||
|
"grid": { |
||||
|
"top": 30, |
||||
|
"bottom": 50, |
||||
|
"right": 15, |
||||
|
"left": 40 |
||||
|
}, |
||||
|
"legend": { |
||||
|
"bottom": 'left', |
||||
|
}, |
||||
|
"toolbox": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"xAxis": { |
||||
|
"type": 'category', |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
"boundaryGap": true, |
||||
|
"data": [] |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"type": 'value', |
||||
|
"axisTick": { |
||||
|
"show": false, |
||||
|
}, |
||||
|
"axisLabel": { |
||||
|
"color": '#666666' |
||||
|
}, |
||||
|
"axisLine": { |
||||
|
"lineStyle": { |
||||
|
"color": '#CCCCCC' |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'line', |
||||
|
"data": [], |
||||
|
"areaStyle": {}, |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"color": "#666666", |
||||
|
"position": 'top', |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"pie": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'item' |
||||
|
}, |
||||
|
"grid": { |
||||
|
"top": 40, |
||||
|
"bottom": 30, |
||||
|
"right": 15, |
||||
|
"left": 15 |
||||
|
}, |
||||
|
"legend": { |
||||
|
"bottom": 'left', |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'pie', |
||||
|
"data": [], |
||||
|
"radius": '50%', |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"color": "#666666", |
||||
|
"position": 'top', |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"ring": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'item' |
||||
|
}, |
||||
|
"grid": { |
||||
|
"top": 40, |
||||
|
"bottom": 30, |
||||
|
"right": 15, |
||||
|
"left": 15 |
||||
|
}, |
||||
|
"legend": { |
||||
|
"bottom": 'left', |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'pie', |
||||
|
"data": [], |
||||
|
"radius": ['40%', '70%'], |
||||
|
"avoidLabelOverlap": false, |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"color": "#666666", |
||||
|
"position": 'top', |
||||
|
}, |
||||
|
"labelLine": { |
||||
|
"show": true |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"rose": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'item' |
||||
|
}, |
||||
|
"legend": { |
||||
|
"top": 'bottom' |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'pie', |
||||
|
"data": [], |
||||
|
"radius": "55%", |
||||
|
"center": ['50%', '50%'], |
||||
|
"roseType": 'area', |
||||
|
}, |
||||
|
}, |
||||
|
"funnel": { |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"tooltip": { |
||||
|
"trigger": 'item', |
||||
|
"formatter": "{b} : {c}%" |
||||
|
}, |
||||
|
"legend": { |
||||
|
"top": 'bottom' |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'funnel', |
||||
|
"left": '10%', |
||||
|
"top": 60, |
||||
|
"bottom": 60, |
||||
|
"width": '80%', |
||||
|
"min": 0, |
||||
|
"max": 100, |
||||
|
"minSize": '0%', |
||||
|
"maxSize": '100%', |
||||
|
"sort": 'descending', |
||||
|
"gap": 2, |
||||
|
"label": { |
||||
|
"show": true, |
||||
|
"position": 'inside' |
||||
|
}, |
||||
|
"labelLine": { |
||||
|
"length": 10, |
||||
|
"lineStyle": { |
||||
|
"width": 1, |
||||
|
"type": 'solid' |
||||
|
} |
||||
|
}, |
||||
|
"itemStyle": { |
||||
|
"bordercolor": '#fff', |
||||
|
"borderwidth": 1 |
||||
|
}, |
||||
|
"emphasis": { |
||||
|
"label": { |
||||
|
"fontSize": 20 |
||||
|
} |
||||
|
}, |
||||
|
"data": [], |
||||
|
}, |
||||
|
}, |
||||
|
"gauge": { |
||||
|
"color": color, |
||||
|
"tooltip": { |
||||
|
"formatter": '{a} <br/>{b} : {c}%' |
||||
|
}, |
||||
|
"seriesTemplate": { |
||||
|
"name": '业务指标', |
||||
|
"type": 'gauge', |
||||
|
"detail": {"formatter": '{value}%'}, |
||||
|
"data": [{"value": 50, "name": '完成率'}] |
||||
|
}, |
||||
|
}, |
||||
|
"candle": { |
||||
|
"xAxis": { |
||||
|
"data": [] |
||||
|
}, |
||||
|
"yAxis": {}, |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"text": '' |
||||
|
}, |
||||
|
"dataZoom": [{ |
||||
|
"type": 'inside', |
||||
|
"xAxisIndex": [0, 1], |
||||
|
"start": 10, |
||||
|
"end": 100 |
||||
|
}, |
||||
|
{ |
||||
|
"show": true, |
||||
|
"xAxisIndex": [0, 1], |
||||
|
"type": 'slider', |
||||
|
"bottom": 10, |
||||
|
"start": 10, |
||||
|
"end": 100 |
||||
|
} |
||||
|
], |
||||
|
"seriesTemplate": { |
||||
|
"name": '', |
||||
|
"type": 'k', |
||||
|
"data": [], |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export default cfe; |
||||
@ -0,0 +1,606 @@ |
|||||
|
/* |
||||
|
* uCharts® |
||||
|
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
||||
|
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
||||
|
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
|
* 复制使用请保留本段注释,感谢支持开源! |
||||
|
* |
||||
|
* uCharts®官方网站 |
||||
|
* https://www.uCharts.cn
|
||||
|
* |
||||
|
* 开源地址: |
||||
|
* https://gitee.com/uCharts/uCharts
|
||||
|
* |
||||
|
* uni-app插件市场地址: |
||||
|
* http://ext.dcloud.net.cn/plugin?id=271
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
||||
|
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
||||
|
|
||||
|
//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
|
||||
|
const formatDateTime = (timeStamp, returnType)=>{ |
||||
|
var date = new Date(); |
||||
|
date.setTime(timeStamp * 1000); |
||||
|
var y = date.getFullYear(); |
||||
|
var m = date.getMonth() + 1; |
||||
|
m = m < 10 ? ('0' + m) : m; |
||||
|
var d = date.getDate(); |
||||
|
d = d < 10 ? ('0' + d) : d; |
||||
|
var h = date.getHours(); |
||||
|
h = h < 10 ? ('0' + h) : h; |
||||
|
var minute = date.getMinutes(); |
||||
|
var second = date.getSeconds(); |
||||
|
minute = minute < 10 ? ('0' + minute) : minute; |
||||
|
second = second < 10 ? ('0' + second) : second; |
||||
|
if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;} |
||||
|
if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;} |
||||
|
if(returnType == 'h:m'){return h +':' + minute;} |
||||
|
if(returnType == 'h:m:s'){return h +':' + minute +':' + second;} |
||||
|
return [y, m, d, h, minute, second]; |
||||
|
} |
||||
|
|
||||
|
const cfu = { |
||||
|
//demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
|
||||
|
"type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"], |
||||
|
"range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"], |
||||
|
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
|
||||
|
//自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
|
||||
|
"categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"], |
||||
|
//instance为实例变量承载属性,不要删除
|
||||
|
"instance":{}, |
||||
|
//option为opts及eopts承载属性,不要删除
|
||||
|
"option":{}, |
||||
|
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
||||
|
"formatter":{ |
||||
|
"yAxisDemo1":function(val, index, opts){return val+'元'}, |
||||
|
"yAxisDemo2":function(val, index, opts){return val.toFixed(2)}, |
||||
|
"xAxisDemo1":function(val, index, opts){return val+'年';}, |
||||
|
"xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')}, |
||||
|
"seriesDemo1":function(val, index, series, opts){return val+'元'}, |
||||
|
"tooltipDemo1":function(item, category, index, opts){ |
||||
|
if(index==0){ |
||||
|
return '随便用'+item.data+'年' |
||||
|
}else{ |
||||
|
return '其他我没改'+item.data+'天' |
||||
|
} |
||||
|
}, |
||||
|
"pieDemo":function(val, index, series, opts){ |
||||
|
if(index !== undefined){ |
||||
|
return series[index].name+':'+series[index].data+'元' |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
|
||||
|
"demotype":{ |
||||
|
//我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
|
||||
|
"type": "line", |
||||
|
"color": color, |
||||
|
"padding": [15,10,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 2, |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"line": { |
||||
|
"type": "curve", |
||||
|
"width": 2 |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
//下面是自定义配置,请添加项目所需的通用配置
|
||||
|
"pie":{ |
||||
|
"type": "pie", |
||||
|
"color": color, |
||||
|
"padding": [5,5,5,5], |
||||
|
"extra": { |
||||
|
"pie": { |
||||
|
"activeOpacity": 0.5, |
||||
|
"activeRadius": 10, |
||||
|
"offsetAngle": 0, |
||||
|
"labelWidth": 15, |
||||
|
"border": true, |
||||
|
"borderWidth": 3, |
||||
|
"borderColor": "#FFFFFF" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"ring":{ |
||||
|
"type": "ring", |
||||
|
"color": color, |
||||
|
"padding": [5,5,5,5], |
||||
|
"rotate": false, |
||||
|
"dataLabel": true, |
||||
|
"legend": { |
||||
|
"show": true, |
||||
|
"position": "right", |
||||
|
"lineHeight": 25, |
||||
|
}, |
||||
|
"title": { |
||||
|
"name": "收益率", |
||||
|
"fontSize": 15, |
||||
|
"color": "#666666" |
||||
|
}, |
||||
|
"subtitle": { |
||||
|
"name": "70%", |
||||
|
"fontSize": 25, |
||||
|
"color": "#7cb5ec" |
||||
|
}, |
||||
|
"extra": { |
||||
|
"ring": { |
||||
|
"ringWidth":30, |
||||
|
"activeOpacity": 0.5, |
||||
|
"activeRadius": 10, |
||||
|
"offsetAngle": 0, |
||||
|
"labelWidth": 15, |
||||
|
"border": true, |
||||
|
"borderWidth": 3, |
||||
|
"borderColor": "#FFFFFF" |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
"rose":{ |
||||
|
"type": "rose", |
||||
|
"color": color, |
||||
|
"padding": [5,5,5,5], |
||||
|
"legend": { |
||||
|
"show": true, |
||||
|
"position": "left", |
||||
|
"lineHeight": 25, |
||||
|
}, |
||||
|
"extra": { |
||||
|
"rose": { |
||||
|
"type": "area", |
||||
|
"minRadius": 50, |
||||
|
"activeOpacity": 0.5, |
||||
|
"activeRadius": 10, |
||||
|
"offsetAngle": 0, |
||||
|
"labelWidth": 15, |
||||
|
"border": false, |
||||
|
"borderWidth": 2, |
||||
|
"borderColor": "#FFFFFF" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"word":{ |
||||
|
"type": "word", |
||||
|
"color": color, |
||||
|
"extra": { |
||||
|
"word": { |
||||
|
"type": "normal", |
||||
|
"autoColors": false |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"funnel":{ |
||||
|
"type": "funnel", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,15], |
||||
|
"extra": { |
||||
|
"funnel": { |
||||
|
"activeOpacity": 0.3, |
||||
|
"activeWidth": 10, |
||||
|
"border": true, |
||||
|
"borderWidth": 2, |
||||
|
"borderColor": "#FFFFFF", |
||||
|
"fillOpacity": 1, |
||||
|
"labelAlign": "right" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"map":{ |
||||
|
"type": "map", |
||||
|
"color": color, |
||||
|
"padding": [0,0,0,0], |
||||
|
"dataLabel": true, |
||||
|
"extra": { |
||||
|
"map": { |
||||
|
"border": true, |
||||
|
"borderWidth": 1, |
||||
|
"borderColor": "#666666", |
||||
|
"fillOpacity": 0.6, |
||||
|
"activeBorderColor": "#F04864", |
||||
|
"activeFillColor": "#FACC14", |
||||
|
"activeFillOpacity": 1 |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"arcbar":{ |
||||
|
"type": "arcbar", |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"name": "百分比", |
||||
|
"fontSize": 25, |
||||
|
"color": "#00FF00" |
||||
|
}, |
||||
|
"subtitle": { |
||||
|
"name": "默认标题", |
||||
|
"fontSize": 15, |
||||
|
"color": "#666666" |
||||
|
}, |
||||
|
"extra": { |
||||
|
"arcbar": { |
||||
|
"type": "default", |
||||
|
"width": 12, |
||||
|
"backgroundColor": "#E9E9E9", |
||||
|
"startAngle": 0.75, |
||||
|
"endAngle": 0.25, |
||||
|
"gap": 2 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"line":{ |
||||
|
"type": "line", |
||||
|
"color": color, |
||||
|
"padding": [15,10,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 2, |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"line": { |
||||
|
"type": "straight", |
||||
|
"width": 2, |
||||
|
"activeType": "hollow" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"tline":{ |
||||
|
"type": "line", |
||||
|
"color": color, |
||||
|
"padding": [15,10,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": false, |
||||
|
"boundaryGap":"justify", |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 2, |
||||
|
"data":[ |
||||
|
{ |
||||
|
"min":0, |
||||
|
"max":80 |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"line": { |
||||
|
"type": "curve", |
||||
|
"width": 2, |
||||
|
"activeType": "hollow" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"tarea":{ |
||||
|
"type": "area", |
||||
|
"color": color, |
||||
|
"padding": [15,10,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
"boundaryGap":"justify", |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 2, |
||||
|
"data":[ |
||||
|
{ |
||||
|
"min":0, |
||||
|
"max":80 |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"area": { |
||||
|
"type": "curve", |
||||
|
"opacity": 0.2, |
||||
|
"addLine": true, |
||||
|
"width": 2, |
||||
|
"gradient": true, |
||||
|
"activeType": "hollow" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"column":{ |
||||
|
"type": "column", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,5], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"data":[{"min":0}] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"column": { |
||||
|
"type": "group", |
||||
|
"width": 30, |
||||
|
"activeBgColor": "#000000", |
||||
|
"activeBgOpacity": 0.08 |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"mount":{ |
||||
|
"type": "mount", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,5], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"data":[{"min":0}] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"mount": { |
||||
|
"type": "mount", |
||||
|
"widthRatio": 1.5, |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"bar":{ |
||||
|
"type": "bar", |
||||
|
"color": color, |
||||
|
"padding": [15,30,0,5], |
||||
|
"xAxis": { |
||||
|
"boundaryGap":"justify", |
||||
|
"disableGrid":false, |
||||
|
"min":0, |
||||
|
"axisLine":false |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"bar": { |
||||
|
"type": "group", |
||||
|
"width": 30, |
||||
|
"meterBorde": 1, |
||||
|
"meterFillColor": "#FFFFFF", |
||||
|
"activeBgColor": "#000000", |
||||
|
"activeBgOpacity": 0.08 |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"area":{ |
||||
|
"type": "area", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 2, |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"area": { |
||||
|
"type": "straight", |
||||
|
"opacity": 0.2, |
||||
|
"addLine": true, |
||||
|
"width": 2, |
||||
|
"gradient": false, |
||||
|
"activeType": "hollow" |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"radar":{ |
||||
|
"type": "radar", |
||||
|
"color": color, |
||||
|
"padding": [5,5,5,5], |
||||
|
"dataLabel": false, |
||||
|
"legend": { |
||||
|
"show": true, |
||||
|
"position": "right", |
||||
|
"lineHeight": 25, |
||||
|
}, |
||||
|
"extra": { |
||||
|
"radar": { |
||||
|
"gridType": "radar", |
||||
|
"gridColor": "#CCCCCC", |
||||
|
"gridCount": 3, |
||||
|
"opacity": 0.2, |
||||
|
"max": 200, |
||||
|
"labelShow": true |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"gauge":{ |
||||
|
"type": "gauge", |
||||
|
"color": color, |
||||
|
"title": { |
||||
|
"name": "66Km/H", |
||||
|
"fontSize": 25, |
||||
|
"color": "#2fc25b", |
||||
|
"offsetY": 50 |
||||
|
}, |
||||
|
"subtitle": { |
||||
|
"name": "实时速度", |
||||
|
"fontSize": 15, |
||||
|
"color": "#1890ff", |
||||
|
"offsetY": -50 |
||||
|
}, |
||||
|
"extra": { |
||||
|
"gauge": { |
||||
|
"type": "default", |
||||
|
"width": 30, |
||||
|
"labelColor": "#666666", |
||||
|
"startAngle": 0.75, |
||||
|
"endAngle": 0.25, |
||||
|
"startNumber": 0, |
||||
|
"endNumber": 100, |
||||
|
"labelFormat": "", |
||||
|
"splitLine": { |
||||
|
"fixRadius": 0, |
||||
|
"splitNumber": 10, |
||||
|
"width": 30, |
||||
|
"color": "#FFFFFF", |
||||
|
"childNumber": 5, |
||||
|
"childWidth": 12 |
||||
|
}, |
||||
|
"pointer": { |
||||
|
"width": 24, |
||||
|
"color": "auto" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"candle":{ |
||||
|
"type": "candle", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,15], |
||||
|
"enableScroll": true, |
||||
|
"enableMarkLine": true, |
||||
|
"dataLabel": false, |
||||
|
"xAxis": { |
||||
|
"labelCount": 4, |
||||
|
"itemCount": 40, |
||||
|
"disableGrid": true, |
||||
|
"gridColor": "#CCCCCC", |
||||
|
"gridType": "solid", |
||||
|
"dashLength": 4, |
||||
|
"scrollShow": true, |
||||
|
"scrollAlign": "left", |
||||
|
"scrollColor": "#A6A6A6", |
||||
|
"scrollBackgroundColor": "#EFEBEF" |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"candle": { |
||||
|
"color": { |
||||
|
"upLine": "#f04864", |
||||
|
"upFill": "#f04864", |
||||
|
"downLine": "#2fc25b", |
||||
|
"downFill": "#2fc25b" |
||||
|
}, |
||||
|
"average": { |
||||
|
"show": true, |
||||
|
"name": ["MA5","MA10","MA30"], |
||||
|
"day": [5,10,20], |
||||
|
"color": ["#1890ff","#2fc25b","#facc14"] |
||||
|
} |
||||
|
}, |
||||
|
"markLine": { |
||||
|
"type": "dash", |
||||
|
"dashLength": 5, |
||||
|
"data": [ |
||||
|
{ |
||||
|
"value": 2150, |
||||
|
"lineColor": "#f04864", |
||||
|
"showLabel": true |
||||
|
}, |
||||
|
{ |
||||
|
"value": 2350, |
||||
|
"lineColor": "#f04864", |
||||
|
"showLabel": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"mix":{ |
||||
|
"type": "mix", |
||||
|
"color": color, |
||||
|
"padding": [15,15,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": true, |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"disabled": false, |
||||
|
"disableGrid": false, |
||||
|
"splitNumber": 5, |
||||
|
"gridType": "dash", |
||||
|
"dashLength": 4, |
||||
|
"gridColor": "#CCCCCC", |
||||
|
"padding": 10, |
||||
|
"showTitle": true, |
||||
|
"data": [] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"mix": { |
||||
|
"column": { |
||||
|
"width": 20 |
||||
|
} |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"scatter":{ |
||||
|
"type": "scatter", |
||||
|
"color":color, |
||||
|
"padding":[15,15,0,15], |
||||
|
"dataLabel":false, |
||||
|
"xAxis": { |
||||
|
"disableGrid": false, |
||||
|
"gridType":"dash", |
||||
|
"splitNumber":5, |
||||
|
"boundaryGap":"justify", |
||||
|
"min":0 |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"disableGrid": false, |
||||
|
"gridType":"dash", |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"scatter": { |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
"bubble":{ |
||||
|
"type": "bubble", |
||||
|
"color":color, |
||||
|
"padding":[15,15,0,15], |
||||
|
"xAxis": { |
||||
|
"disableGrid": false, |
||||
|
"gridType":"dash", |
||||
|
"splitNumber":5, |
||||
|
"boundaryGap":"justify", |
||||
|
"min":0, |
||||
|
"max":250 |
||||
|
}, |
||||
|
"yAxis": { |
||||
|
"disableGrid": false, |
||||
|
"gridType":"dash", |
||||
|
"data":[{ |
||||
|
"min":0, |
||||
|
"max":150 |
||||
|
}] |
||||
|
}, |
||||
|
"legend": { |
||||
|
}, |
||||
|
"extra": { |
||||
|
"bubble": { |
||||
|
"border":2, |
||||
|
"opacity": 0.5, |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export default cfu; |
||||
@ -0,0 +1,5 @@ |
|||||
|
# uCharts JSSDK说明 |
||||
|
1、如不使用uCharts组件,可直接引用u-charts.js,打包编译后会`自动压缩`,压缩后体积约为`120kb`。 |
||||
|
2、如果120kb的体积仍需压缩,请手到uCharts官网通过在线定制选择您需要的图表。 |
||||
|
3、config-ucharts.js为uCharts组件的用户配置文件,升级前请`自行备份config-ucharts.js`文件,以免被强制覆盖。 |
||||
|
4、config-echarts.js为ECharts组件的用户配置文件,升级前请`自行备份config-echarts.js`文件,以免被强制覆盖。 |
||||
7706
uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
File diff suppressed because it is too large
View File
18
uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
File diff suppressed because it is too large
View File
@ -0,0 +1,201 @@ |
|||||
|
Apache License |
||||
|
Version 2.0, January 2004 |
||||
|
http://www.apache.org/licenses/ |
||||
|
|
||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
||||
|
|
||||
|
1. Definitions. |
||||
|
|
||||
|
"License" shall mean the terms and conditions for use, reproduction, |
||||
|
and distribution as defined by Sections 1 through 9 of this document. |
||||
|
|
||||
|
"Licensor" shall mean the copyright owner or entity authorized by |
||||
|
the copyright owner that is granting the License. |
||||
|
|
||||
|
"Legal Entity" shall mean the union of the acting entity and all |
||||
|
other entities that control, are controlled by, or are under common |
||||
|
control with that entity. For the purposes of this definition, |
||||
|
"control" means (i) the power, direct or indirect, to cause the |
||||
|
direction or management of such entity, whether by contract or |
||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
||||
|
outstanding shares, or (iii) beneficial ownership of such entity. |
||||
|
|
||||
|
"You" (or "Your") shall mean an individual or Legal Entity |
||||
|
exercising permissions granted by this License. |
||||
|
|
||||
|
"Source" form shall mean the preferred form for making modifications, |
||||
|
including but not limited to software source code, documentation |
||||
|
source, and configuration files. |
||||
|
|
||||
|
"Object" form shall mean any form resulting from mechanical |
||||
|
transformation or translation of a Source form, including but |
||||
|
not limited to compiled object code, generated documentation, |
||||
|
and conversions to other media types. |
||||
|
|
||||
|
"Work" shall mean the work of authorship, whether in Source or |
||||
|
Object form, made available under the License, as indicated by a |
||||
|
copyright notice that is included in or attached to the work |
||||
|
(an example is provided in the Appendix below). |
||||
|
|
||||
|
"Derivative Works" shall mean any work, whether in Source or Object |
||||
|
form, that is based on (or derived from) the Work and for which the |
||||
|
editorial revisions, annotations, elaborations, or other modifications |
||||
|
represent, as a whole, an original work of authorship. For the purposes |
||||
|
of this License, Derivative Works shall not include works that remain |
||||
|
separable from, or merely link (or bind by name) to the interfaces of, |
||||
|
the Work and Derivative Works thereof. |
||||
|
|
||||
|
"Contribution" shall mean any work of authorship, including |
||||
|
the original version of the Work and any modifications or additions |
||||
|
to that Work or Derivative Works thereof, that is intentionally |
||||
|
submitted to Licensor for inclusion in the Work by the copyright owner |
||||
|
or by an individual or Legal Entity authorized to submit on behalf of |
||||
|
the copyright owner. For the purposes of this definition, "submitted" |
||||
|
means any form of electronic, verbal, or written communication sent |
||||
|
to the Licensor or its representatives, including but not limited to |
||||
|
communication on electronic mailing lists, source code control systems, |
||||
|
and issue tracking systems that are managed by, or on behalf of, the |
||||
|
Licensor for the purpose of discussing and improving the Work, but |
||||
|
excluding communication that is conspicuously marked or otherwise |
||||
|
designated in writing by the copyright owner as "Not a Contribution." |
||||
|
|
||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity |
||||
|
on behalf of whom a Contribution has been received by Licensor and |
||||
|
subsequently incorporated within the Work. |
||||
|
|
||||
|
2. Grant of Copyright License. Subject to the terms and conditions of |
||||
|
this License, each Contributor hereby grants to You a perpetual, |
||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
|
copyright license to reproduce, prepare Derivative Works of, |
||||
|
publicly display, publicly perform, sublicense, and distribute the |
||||
|
Work and such Derivative Works in Source or Object form. |
||||
|
|
||||
|
3. Grant of Patent License. Subject to the terms and conditions of |
||||
|
this License, each Contributor hereby grants to You a perpetual, |
||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
|
(except as stated in this section) patent license to make, have made, |
||||
|
use, offer to sell, sell, import, and otherwise transfer the Work, |
||||
|
where such license applies only to those patent claims licensable |
||||
|
by such Contributor that are necessarily infringed by their |
||||
|
Contribution(s) alone or by combination of their Contribution(s) |
||||
|
with the Work to which such Contribution(s) was submitted. If You |
||||
|
institute patent litigation against any entity (including a |
||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work |
||||
|
or a Contribution incorporated within the Work constitutes direct |
||||
|
or contributory patent infringement, then any patent licenses |
||||
|
granted to You under this License for that Work shall terminate |
||||
|
as of the date such litigation is filed. |
||||
|
|
||||
|
4. Redistribution. You may reproduce and distribute copies of the |
||||
|
Work or Derivative Works thereof in any medium, with or without |
||||
|
modifications, and in Source or Object form, provided that You |
||||
|
meet the following conditions: |
||||
|
|
||||
|
(a) You must give any other recipients of the Work or |
||||
|
Derivative Works a copy of this License; and |
||||
|
|
||||
|
(b) You must cause any modified files to carry prominent notices |
||||
|
stating that You changed the files; and |
||||
|
|
||||
|
(c) You must retain, in the Source form of any Derivative Works |
||||
|
that You distribute, all copyright, patent, trademark, and |
||||
|
attribution notices from the Source form of the Work, |
||||
|
excluding those notices that do not pertain to any part of |
||||
|
the Derivative Works; and |
||||
|
|
||||
|
(d) If the Work includes a "NOTICE" text file as part of its |
||||
|
distribution, then any Derivative Works that You distribute must |
||||
|
include a readable copy of the attribution notices contained |
||||
|
within such NOTICE file, excluding those notices that do not |
||||
|
pertain to any part of the Derivative Works, in at least one |
||||
|
of the following places: within a NOTICE text file distributed |
||||
|
as part of the Derivative Works; within the Source form or |
||||
|
documentation, if provided along with the Derivative Works; or, |
||||
|
within a display generated by the Derivative Works, if and |
||||
|
wherever such third-party notices normally appear. The contents |
||||
|
of the NOTICE file are for informational purposes only and |
||||
|
do not modify the License. You may add Your own attribution |
||||
|
notices within Derivative Works that You distribute, alongside |
||||
|
or as an addendum to the NOTICE text from the Work, provided |
||||
|
that such additional attribution notices cannot be construed |
||||
|
as modifying the License. |
||||
|
|
||||
|
You may add Your own copyright statement to Your modifications and |
||||
|
may provide additional or different license terms and conditions |
||||
|
for use, reproduction, or distribution of Your modifications, or |
||||
|
for any such Derivative Works as a whole, provided Your use, |
||||
|
reproduction, and distribution of the Work otherwise complies with |
||||
|
the conditions stated in this License. |
||||
|
|
||||
|
5. Submission of Contributions. Unless You explicitly state otherwise, |
||||
|
any Contribution intentionally submitted for inclusion in the Work |
||||
|
by You to the Licensor shall be under the terms and conditions of |
||||
|
this License, without any additional terms or conditions. |
||||
|
Notwithstanding the above, nothing herein shall supersede or modify |
||||
|
the terms of any separate license agreement you may have executed |
||||
|
with Licensor regarding such Contributions. |
||||
|
|
||||
|
6. Trademarks. This License does not grant permission to use the trade |
||||
|
names, trademarks, service marks, or product names of the Licensor, |
||||
|
except as required for reasonable and customary use in describing the |
||||
|
origin of the Work and reproducing the content of the NOTICE file. |
||||
|
|
||||
|
7. Disclaimer of Warranty. Unless required by applicable law or |
||||
|
agreed to in writing, Licensor provides the Work (and each |
||||
|
Contributor provides its Contributions) on an "AS IS" BASIS, |
||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||
|
implied, including, without limitation, any warranties or conditions |
||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the |
||||
|
appropriateness of using or redistributing the Work and assume any |
||||
|
risks associated with Your exercise of permissions under this License. |
||||
|
|
||||
|
8. Limitation of Liability. In no event and under no legal theory, |
||||
|
whether in tort (including negligence), contract, or otherwise, |
||||
|
unless required by applicable law (such as deliberate and grossly |
||||
|
negligent acts) or agreed to in writing, shall any Contributor be |
||||
|
liable to You for damages, including any direct, indirect, special, |
||||
|
incidental, or consequential damages of any character arising as a |
||||
|
result of this License or out of the use or inability to use the |
||||
|
Work (including but not limited to damages for loss of goodwill, |
||||
|
work stoppage, computer failure or malfunction, or any and all |
||||
|
other commercial damages or losses), even if such Contributor |
||||
|
has been advised of the possibility of such damages. |
||||
|
|
||||
|
9. Accepting Warranty or Additional Liability. While redistributing |
||||
|
the Work or Derivative Works thereof, You may choose to offer, |
||||
|
and charge a fee for, acceptance of support, warranty, indemnity, |
||||
|
or other liability obligations and/or rights consistent with this |
||||
|
License. However, in accepting such obligations, You may act only |
||||
|
on Your own behalf and on Your sole responsibility, not on behalf |
||||
|
of any other Contributor, and only if You agree to indemnify, |
||||
|
defend, and hold each Contributor harmless for any liability |
||||
|
incurred by, or claims asserted against, such Contributor by reason |
||||
|
of your accepting any such warranty or additional liability. |
||||
|
|
||||
|
END OF TERMS AND CONDITIONS |
||||
|
|
||||
|
APPENDIX: How to apply the Apache License to your work. |
||||
|
|
||||
|
To apply the Apache License to your work, attach the following |
||||
|
boilerplate notice, with the fields enclosed by brackets "[]" |
||||
|
replaced with your own identifying information. (Don't include |
||||
|
the brackets!) The text should be enclosed in the appropriate |
||||
|
comment syntax for the file format. We also recommend that a |
||||
|
file or class name and description of purpose be included on the |
||||
|
same "printed page" as the copyright notice for easier |
||||
|
identification within third-party archives. |
||||
|
|
||||
|
Copyright [yyyy] [name of copyright owner] |
||||
|
|
||||
|
Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
you may not use this file except in compliance with the License. |
||||
|
You may obtain a copy of the License at |
||||
|
|
||||
|
http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
|
||||
|
Unless required by applicable law or agreed to in writing, software |
||||
|
distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
See the License for the specific language governing permissions and |
||||
|
limitations under the License. |
||||
@ -0,0 +1,80 @@ |
|||||
|
{ |
||||
|
"id": "qiun-data-charts", |
||||
|
"displayName": "秋云 ucharts echarts 高性能跨全端图表组件", |
||||
|
"version": "2.5.0-20230101", |
||||
|
"description": "uCharts 新增正负柱状图!支持H5及APP用 ucharts echarts 渲染图表,uniapp可视化首选组件", |
||||
|
"keywords": [ |
||||
|
"ucharts", |
||||
|
"echarts", |
||||
|
"f2", |
||||
|
"图表", |
||||
|
"可视化" |
||||
|
], |
||||
|
"repository": "https://gitee.com/uCharts/uCharts", |
||||
|
"engines": { |
||||
|
}, |
||||
|
"dcloudext": { |
||||
|
"sale": { |
||||
|
"regular": { |
||||
|
"price": "0.00" |
||||
|
}, |
||||
|
"sourcecode": { |
||||
|
"price": "0.00" |
||||
|
} |
||||
|
}, |
||||
|
"contact": { |
||||
|
"qq": "474119" |
||||
|
}, |
||||
|
"declaration": { |
||||
|
"ads": "无", |
||||
|
"data": "插件不采集任何数据", |
||||
|
"permissions": "无" |
||||
|
}, |
||||
|
"npmurl": "https://www.npmjs.com/~qiun", |
||||
|
"type": "component-vue" |
||||
|
}, |
||||
|
"uni_modules": { |
||||
|
"dependencies": [], |
||||
|
"encrypt": [], |
||||
|
"platforms": { |
||||
|
"cloud": { |
||||
|
"tcb": "y", |
||||
|
"aliyun": "y" |
||||
|
}, |
||||
|
"client": { |
||||
|
"App": { |
||||
|
"app-vue": "y", |
||||
|
"app-nvue": "y" |
||||
|
}, |
||||
|
"H5-mobile": { |
||||
|
"Safari": "y", |
||||
|
"Android Browser": "y", |
||||
|
"微信浏览器(Android)": "y", |
||||
|
"QQ浏览器(Android)": "y" |
||||
|
}, |
||||
|
"H5-pc": { |
||||
|
"Chrome": "y", |
||||
|
"IE": "y", |
||||
|
"Edge": "y", |
||||
|
"Firefox": "y", |
||||
|
"Safari": "y" |
||||
|
}, |
||||
|
"小程序": { |
||||
|
"微信": "y", |
||||
|
"阿里": "y", |
||||
|
"百度": "y", |
||||
|
"字节跳动": "y", |
||||
|
"QQ": "y" |
||||
|
}, |
||||
|
"快应用": { |
||||
|
"华为": "y", |
||||
|
"联盟": "y" |
||||
|
}, |
||||
|
"Vue": { |
||||
|
"vue2": "y", |
||||
|
"vue3": "y" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,84 @@ |
|||||
|
 |
||||
|
|
||||
|
|
||||
|
[](https://gitee.com/uCharts/uCharts/stargazers) |
||||
|
[](https://gitee.com/uCharts/uCharts/members) |
||||
|
[](https://www.apache.org/licenses/LICENSE-2.0.html) |
||||
|
[](https://www.npmjs.com/~qiun) |
||||
|
|
||||
|
|
||||
|
## uCharts简介 |
||||
|
|
||||
|
`uCharts`是一款基于`canvas API`开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等更多支持 canvas API 的平台。 |
||||
|
|
||||
|
## 官方网站 |
||||
|
|
||||
|
## [https://www.ucharts.cn](https://www.ucharts.cn) |
||||
|
|
||||
|
## 快速体验 |
||||
|
|
||||
|
一套代码编到多个平台,依次扫描二维码,亲自体验uCharts图表跨平台效果!其他平台请自行编译。 |
||||
|
|
||||
|
 |
||||
|
|
||||
|
 |
||||
|
|
||||
|
## 致开发者 |
||||
|
|
||||
|
感谢各位开发者`五年`来对秋云及uCharts的支持,uCharts的进步离不开各位开发者的鼓励与贡献。为更好的帮助各位开发者使用图表工具,我们推出了新版官网,增加了在线定制、问答社区、在线配置等一些增值服务,为确保您能更好的应用图表组件,建议您先`仔细阅读官网指南`以及`常见问题`,而不是下载下来`直接使用`。如仍然不能解决,请到`官网社区`或开通会员后加入`专属VIP会员群`提问将会很快得到回答。 |
||||
|
|
||||
|
## 视频教程 |
||||
|
|
||||
|
## [uCharts新手入门教程](https://www.bilibili.com/video/BV1qA411Q7se/?share_source=copy_web&vd_source=42a1242f9aaade6427736af69eb2e1d9) |
||||
|
|
||||
|
|
||||
|
## 社群支持 |
||||
|
|
||||
|
uCharts官方拥有5个2000人的QQ群及专属VIP会员群支持,庞大的用户量证明我们一直在努力,请各位放心使用!uCharts的开源图表组件的开发,团队付出了大量的时间与精力,经过四来的考验,不会有比较明显的bug,请各位放心使用。如果您有更好的想法,可以在`码云提交Pull Requests`以帮助更多开发者完成需求,再次感谢各位对uCharts的鼓励与支持! |
||||
|
|
||||
|
#### 官方交流群 |
||||
|
- 交流群1:371774600(已满) |
||||
|
- 交流群2:619841586(已满) |
||||
|
- 交流群3:955340127(已满) |
||||
|
- 交流群4:641669795(已满) |
||||
|
- 交流群5:236294809(只能扫码加入) |
||||
|
|
||||
|
 |
||||
|
|
||||
|
- 口令`uniapp` |
||||
|
|
||||
|
#### 专属VIP会员群 |
||||
|
- 开通会员后详见【账号详情】页面中顶部的滚动通知 |
||||
|
- 口令`您的用户ID` |
||||
|
|
||||
|
## 版权信息 |
||||
|
|
||||
|
uCharts始终坚持开源,遵循 [Apache Licence 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) 开源协议,意味着您无需支付任何费用,即可将uCharts应用到您的产品中。 |
||||
|
|
||||
|
注意:这并不意味着您可以将uCharts应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷或法律问题,uCharts相关方及秋云科技不承担任何责任。 |
||||
|
|
||||
|
## 合作伙伴 |
||||
|
|
||||
|
[](https://www.diygw.com/) |
||||
|
[](https://gitee.com/howcode/has-chat) |
||||
|
[](https://www.uviewui.com/) |
||||
|
[](https://ext.dcloud.net.cn/plugin?id=7088) |
||||
|
[](https://ext.dcloud.net.cn/publisher?id=202) |
||||
|
[](https://www.firstui.cn/) |
||||
|
[](https://ext.dcloud.net.cn/plugin?id=5169) |
||||
|
[](https://www.graceui.com/) |
||||
|
|
||||
|
|
||||
|
## 更新记录 |
||||
|
|
||||
|
详见官网指南中说明,[点击此处查看](https://www.ucharts.cn/v2/#/guide/index?id=100) |
||||
|
|
||||
|
|
||||
|
## 相关链接 |
||||
|
- [uCharts官网](https://www.ucharts.cn) |
||||
|
- [DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=271) |
||||
|
- [uCharts码云开源托管地址](https://gitee.com/uCharts/uCharts) [](https://gitee.com/uCharts/uCharts/stargazers) |
||||
|
- [uCharts npm开源地址](https://www.ucharts.cn) |
||||
|
- [ECharts官网](https://echarts.apache.org/zh/index.html) |
||||
|
- [ECharts配置手册](https://echarts.apache.org/zh/option.html) |
||||
|
- [图表组件在项目中的应用 ReportPlus数据报表](https://www.ucharts.cn/v2/#/layout/info?id=1) |
||||