112 lines
3.2 KiB
HTML
112 lines
3.2 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html lang="en">
|
|||
|
|
|||
|
<head>
|
|||
|
<meta charset="UTF-8">
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|||
|
<title>Document</title>
|
|||
|
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
|||
|
</head>
|
|||
|
|
|||
|
<body>
|
|||
|
<script>
|
|||
|
const API_URL = 'https://www.shidaotec.com/api/rank/getTop50StockList'
|
|||
|
|
|||
|
const stockCache = {
|
|||
|
hold: [],
|
|||
|
favorites: [],
|
|||
|
china: [],
|
|||
|
hk: [],
|
|||
|
us: []
|
|||
|
}
|
|||
|
|
|||
|
// 从服务器获取股票数据
|
|||
|
async function fetchStocks (stockType) {
|
|||
|
// 检查缓存
|
|||
|
if (stockCache[stockType].length > 0) {
|
|||
|
console.log('使用缓存数据:', stockType)
|
|||
|
return stockCache[stockType] // 使用缓存
|
|||
|
}
|
|||
|
|
|||
|
const stockTypeMapping = {
|
|||
|
hold: { market: 'a', type: 2 },
|
|||
|
favorites: { market: 'us', type: 2 },
|
|||
|
china: { market: 'a', type: 1 },
|
|||
|
hk: { market: 'hk', type: 1 },
|
|||
|
us: { market: 'us', type: 1 }
|
|||
|
}
|
|||
|
|
|||
|
const { market, type } = stockTypeMapping[stockType]
|
|||
|
console.log(`请求的市场: ${market}, 类型: ${type}`)
|
|||
|
|
|||
|
try {
|
|||
|
const response = await axios.get(API_URL, {
|
|||
|
params: {
|
|||
|
market: market,
|
|||
|
stockPoolCode: 'None',
|
|||
|
year: 'today',
|
|||
|
type: type
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
console.log("响应数据: ", response.data)
|
|||
|
|
|||
|
if (response.data.code === 200 && response.data.data) {
|
|||
|
const stockList = response.data.data
|
|||
|
|
|||
|
const stocks = stockList.map(stock => {
|
|||
|
const price = parseFloat(stock.price)
|
|||
|
const change = parseFloat(stock.change)
|
|||
|
return {
|
|||
|
stockName: stock.stockName,
|
|||
|
formattedStockName: formatStockName(stock.stockName),
|
|||
|
stockCode: stock.stockCode,
|
|||
|
price: price,
|
|||
|
change: change,
|
|||
|
isPositiveChange: change > 0 // 新增属性,判断涨跌幅是否大于0
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
stockCache[stockType] = stocks // 缓存结果
|
|||
|
return stocks
|
|||
|
} else {
|
|||
|
throw new Error('Unexpected response format')
|
|||
|
}
|
|||
|
} catch (error) {
|
|||
|
handleAxiosError(error)
|
|||
|
throw new Error('无法获取股票数据')
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:格式化股票名称
|
|||
|
function formatStockName (name) {
|
|||
|
const maxLength = isFirstCharEnglish(name) ? 8 : 4
|
|||
|
return name.length > maxLength
|
|||
|
? name.substring(0, maxLength) + '...'
|
|||
|
: name.padEnd(maxLength + 1, ' ')
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:判断名称的首字母是否为英文字符
|
|||
|
function isFirstCharEnglish (name) {
|
|||
|
return /^[A-Za-z]/.test(name)
|
|||
|
}
|
|||
|
|
|||
|
// 错误处理函数
|
|||
|
function handleAxiosError (error) {
|
|||
|
if (axios.isAxiosError(error)) {
|
|||
|
console.error('获取股票数据失败: ', error.response ? error.response.data : error.message)
|
|||
|
} else if (error instanceof Error) {
|
|||
|
console.error('获取股票数据失败: ', error.message)
|
|||
|
} else {
|
|||
|
console.error('获取股票数据失败: ', '未知错误')
|
|||
|
}
|
|||
|
}
|
|||
|
fetchStocks('hold')
|
|||
|
|
|||
|
// K线图数据
|
|||
|
// [open, close, lowest, highest] (即:[开盘值, 收盘值, 最低值, 最高值])
|
|||
|
|
|||
|
</script>
|
|||
|
</body>
|
|||
|
|
|||
|
</html>
|