mirror of
https://github.com/ArvinLovegood/go-stock.git
synced 2025-07-19 00:00:09 +08:00
feat(frontend):添加名站优选功能并实现嵌入外部URL的通用组件
- 在 Market 组件中添加名站优选选项卡- 新增 EmbeddedUrl 组件用于嵌入外部网页 - 创建 Stockhotmap 组件,整合多个财经网站的热图和排行榜
This commit is contained in:
parent
cfe1abb07f
commit
edd1bf94f9
133
frontend/src/components/EmbeddedUrl.vue
Normal file
133
frontend/src/components/EmbeddedUrl.vue
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<div class="embed-container">
|
||||||
|
<h3 v-if="title">{{ title }}</h3>
|
||||||
|
<div class="iframe-wrapper">
|
||||||
|
<iframe
|
||||||
|
:src="url"
|
||||||
|
:title="iframeTitle"
|
||||||
|
frameborder="0"
|
||||||
|
scrolling="auto"
|
||||||
|
class="embedded-iframe"
|
||||||
|
@load="onLoad"
|
||||||
|
@error="onError"
|
||||||
|
:style="iframeStyle"
|
||||||
|
></iframe>
|
||||||
|
</div>
|
||||||
|
<div v-if="loading" class="loading-indicator">
|
||||||
|
<div class="spinner"></div>
|
||||||
|
<p>加载中...</p>
|
||||||
|
</div>
|
||||||
|
<p v-if="error" class="error-message">{{ error }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, watch } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
url: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
iframeTitle: {
|
||||||
|
type: String,
|
||||||
|
default: '外部内容'
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '100%'
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: '100%'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const loading = ref(true)
|
||||||
|
const error = ref(null)
|
||||||
|
|
||||||
|
const onLoad = () => {
|
||||||
|
loading.value = false
|
||||||
|
error.value = null
|
||||||
|
}
|
||||||
|
|
||||||
|
const onError = (event) => {
|
||||||
|
loading.value = false
|
||||||
|
error.value = `加载失败: ${event.message || '无法加载该 URL'}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监听 URL 变化,重新加载
|
||||||
|
watch(() => props.url, () => {
|
||||||
|
loading.value = true
|
||||||
|
error.value = null
|
||||||
|
})
|
||||||
|
|
||||||
|
// 设置 iframe 样式
|
||||||
|
const iframeStyle = {
|
||||||
|
width: props.width,
|
||||||
|
height: props.height
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.embed-container {
|
||||||
|
margin: 1rem 0;
|
||||||
|
border: 0 solid #e5e7eb;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe-wrapper {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.embedded-iframe {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 400px;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-indicator {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: rgba(255, 255, 255, 0.8);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
border: 3px solid #f3f4f6;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-top-color: #3b82f6;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-message {
|
||||||
|
color: #ef4444;
|
||||||
|
padding: 1rem;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #fee2e2;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
@ -32,6 +32,7 @@ import HotTopics from "./HotTopics.vue";
|
|||||||
import InvestCalendarTimeLine from "./InvestCalendarTimeLine.vue";
|
import InvestCalendarTimeLine from "./InvestCalendarTimeLine.vue";
|
||||||
import ClsCalendarTimeLine from "./ClsCalendarTimeLine.vue";
|
import ClsCalendarTimeLine from "./ClsCalendarTimeLine.vue";
|
||||||
import SelectStock from "./SelectStock.vue";
|
import SelectStock from "./SelectStock.vue";
|
||||||
|
import Stockhotmap from "./stockhotmap.vue";
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png');
|
const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png');
|
||||||
@ -599,6 +600,9 @@ function ReFlesh(source) {
|
|||||||
<n-tab-pane name="指标选股" tab="指标选股">
|
<n-tab-pane name="指标选股" tab="指标选股">
|
||||||
<select-stock />
|
<select-stock />
|
||||||
</n-tab-pane>
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="名站优选" tab="名站优选">
|
||||||
|
<Stockhotmap />
|
||||||
|
</n-tab-pane>
|
||||||
</n-tabs>
|
</n-tabs>
|
||||||
</n-card>
|
</n-card>
|
||||||
<n-modal transform-origin="center" v-model:show="summaryModal" preset="card" style="width: 800px;"
|
<n-modal transform-origin="center" v-model:show="summaryModal" preset="card" style="width: 800px;"
|
||||||
|
32
frontend/src/components/stockhotmap.vue
Normal file
32
frontend/src/components/stockhotmap.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
import EmbeddedUrl from "./EmbeddedUrl.vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<n-tabs type="line" animated>
|
||||||
|
<n-tab-pane name="百度股市通" tab="百度股市通">
|
||||||
|
<embedded-url url="https://gushitong.baidu.com" :height="'calc(100vh - 252px)'"/>
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="东财大盘星图" tab="东财大盘星图">
|
||||||
|
<embedded-url url="https://quote.eastmoney.com/stockhotmap/" :height="'calc(100vh - 252px)'"/>
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="TopHub" tab="TopHub(今日热榜)">
|
||||||
|
<embedded-url url="https://tophub.today/c/finance" :height="'calc(100vh - 252px)'"/>
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="摸鱼" tab="摸鱼">
|
||||||
|
<embedded-url url="https://996.ninja/" :height="'calc(100vh - 252px)'"/>
|
||||||
|
</n-tab-pane>
|
||||||
|
|
||||||
|
|
||||||
|
<n-tab-pane name="欢迎推荐更多有趣的财经网页" tab="欢迎推荐更多有趣的财经网页">
|
||||||
|
</n-tab-pane>
|
||||||
|
<!-- <n-tab-pane name="自在量化" tab="自在量化">-->
|
||||||
|
<!-- <embedded-url url="https://quant.zizizaizai.com/home"/>-->
|
||||||
|
<!-- </n-tab-pane>-->
|
||||||
|
</n-tabs>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
Loading…
x
Reference in New Issue
Block a user