This commit is contained in:
Leo_Ding 2025-12-04 15:06:13 +08:00
commit d81c6c1e3b
4 changed files with 128 additions and 33 deletions

8
src/apis/admin.ts Normal file
View File

@ -0,0 +1,8 @@
// 登陆相关接口
import request from '@/utils/index'
// 账单列表
export const orderList = () => request.get('/v1/order/pay_list')
// 我的订单
export const useList = () => request.get('/v1/order/use_list')

12
src/apis/home.ts Normal file
View File

@ -0,0 +1,12 @@
// 登陆相关接口
import request from '@/utils/index'
// 轮播接口
export const getBannerList = () => request.get('/v1/home/banner_list')
// GPU说明列表
export const getGpuList = () => request.get('/v1/home/gpu_list')
// 获取产品优势
export const getAdvantage = () => request.get('/v1/home/p_advantages_list')
// 获取热门产品信息
export const getHotProduct = () => request.get('/v1/product/host_info')

View File

@ -32,10 +32,9 @@ request.interceptors.request.use(
// 响应拦截器统一处理错误、code 等)
request.interceptors.response.use(
(response) => {
console.log('响应数据:', response);
// 假设后端返回格式为 { code: 200, data: ..., message: '' }
const { code, data, message } = response.data;
console.log('请求成功:', data);
if (code === 1) {
return data;
} else {
@ -45,7 +44,7 @@ request.interceptors.response.use(
},
(error) => {
// 网络错误 or 超时等
console.error('请求异常:', error.response.data);
return Promise.reject(error.response.data);
}
);

View File

@ -1,11 +1,12 @@
<template>
<div>
<div style="height: 550px; overflow: hidden;">
<a-carousel :after-change="onChange" style="height: 100%;">
<div class="banner-slide"></div>
<!-- 如果有多张可以 v-for -->
</a-carousel>
</div>
<div style="height: 550px; overflow: hidden;">
<a-carousel :after-change="onChange" style="height: 100%;">
<div v-for="item in bannerList" :key="item.id" class="banner-slide" >
<img :src="item.image_url" alt="" srcset="" width="100%" height="100%">
</div>
</a-carousel>
</div>
<div class="one">
<div>
<h3>GPU选型</h3>
@ -37,16 +38,17 @@
:style="{ 'border-top': `3px solid ${listColor[index]}` }">
<div class="name"
style="font-size: 24px;font-weight: bold;padding: 20px;border-bottom: 1px solid #c9c9c9;text-align: center;">
{{ value.title
}}</div>
{{ value.gpu_type }}
</div>
<div class="price" style="margin: 30px 0;">
<span style="font-size: 24px;font-weight: bold;color: #5b85fe;">¥{{ value.price }}</span>
<span style="font-size: 24px;font-weight: bold;color: #5b85fe;">¥{{ value.payOnTime }}</span>
<span style="font-size: 12px;">/小时</span>
</div>
<div style="padding-bottom: 40px;line-height: 40px;">
<div>内存{{ value.memory }}</div>
<div>显存{{ value.graphicsMemory }}</div>
<div>GPU{{ value.GPU }}</div>
<!-- 修改这里添加单位 -->
<div>内存{{ value.memory }}GB</div>
<div>显存{{ value.vram }}GB</div>
<div>GPU{{ value.gpu_num }}</div>
</div>
</div>
</div>
@ -64,7 +66,7 @@
<div v-for="item in advantageList">
<img :src="item.img" alt="" srcset="" width="200" height="158">
<div class="title">{{ item.title }}</div>
<div class="subtitle">{{ item.subtitle }}</div>
<div class="subtitle">{{ item.description }}</div>
</div>
</div>
</div>
@ -103,38 +105,112 @@
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { getBannerList, getGpuList, getAdvantage, getHotProduct } from '@/apis/home';
import one from '@/assets/1.png'
import two from '@/assets/2.png'
import three from '@/assets/3.png'
import firth from '@/assets/4.png'
import defaultBanner from '@/assets/banner2.png';
const listColor = ref(['#7ed321', '#21d3c0', '#35a4de'])
const source = ref(
[
{ title: 'NVIDIA A100', price: '3.28', memory: '64GB', graphicsMemory: '40GB', GPU: 1 },
{ title: 'NVIDIA A100', price: '6.56', memory: '128GB', graphicsMemory: '80GB', GPU: 2 },
{ title: 'NVIDIA A100', price: '13.12', memory: '256GB', graphicsMemory: '16GB', GPU: 4 },
]
)
const advantageList = ref(
[
{ img: one, title: '灵活弹性', subtitle: '支持按需、包周期两种计费方式,可以根据使用场景选择。' },
{ img: two, title: '安全保障', subtitle: '提供网络防火墙功能,对公网连接进行严格访问控制' },
{ img: three, title: '方便易用', subtitle: '提供完善的API体系便捷的将云服务器与您的内部监控、运营系统相结合' },
{ img: firth, title: '服务优势', subtitle: '7*24小时服务支持60s之内问题相应机制' },
]
)
const source = ref([])
const advantageList = ref([])
const bannerList = ref<any[]>([
{ id: 0, image_url: defaultBanner }
]);
const onChange = (current: number) => {
console.log(current);
};
//
const fetchBannerList = async () => {
try {
const res: any = await getBannerList();
//
if (res && Array.isArray(res) && res.length > 0) {
const processedList = res.map((item: any, index: number) => {
// itemid
const processedItem = {
id: item.id || index,
image_url: item.image_url || defaultBanner
};
// http
if (processedItem.image_url && processedItem.image_url.startsWith('http://')) {
processedItem.image_url = processedItem.image_url.replace('http://', 'https://');
}
return processedItem;
});
bannerList.value = processedList;
} else {
// API使
bannerList.value = [{ id: 0, image_url: defaultBanner }];
}
} catch (error: any) {
console.error('轮播图请求失败:', error);
// 使
bannerList.value = [{ id: 0, image_url: defaultBanner }];
}
};
// GPU
const getGPUList = async () => {
try {
const res: any = await getGpuList();
source.value = res;
} catch (error: any) {
console.error('GPU列表请求失败:', error);
}
}
//
const getAdvantageList = async () => {
try {
const res: any = await getAdvantage();
const list = res;
// item img
list.forEach((item: any, index: number) => {
if (index === 0) {
item.img = one;
} else if (index === 1) {
item.img = two;
} else if (index === 2) {
item.img = three;
} else {
item.img = firth;
}
});
advantageList.value = list;
} catch (error: any) {
console.error('产品优势请求失败:', error);
}
}
fetchBannerList();
getGPUList();
getAdvantageList();
</script>
<style scoped lang="scss">
.banner-slide {
width: 100%;
height:550px;
background: url('@/assets/banner2.png') no-repeat center / cover;
height: 550px;
// background: url('@/assets/banner2.png') no-repeat center / cover;
}
.one {
display: flex;
justify-content: space-around;