Compare commits
7 Commits
f2533767d2
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 66adf7f545 | |||
| f87b977c87 | |||
| 601c4abe53 | |||
| b71ee98129 | |||
| 7611d4f079 | |||
| 76fb3ddcb7 | |||
| aa26731731 |
@ -47,3 +47,9 @@
|
||||
currentPage.value = 1; // 重置页码
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-tabs {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -48,7 +48,7 @@
|
||||
<ul class="footer-links">
|
||||
<li>
|
||||
<a
|
||||
href="http://cal.3w.jinshen.cn"
|
||||
href="http://cal.jinshen.cn"
|
||||
target="_blank"
|
||||
rel="noopener noreferer"
|
||||
>
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
class="hide-on-mobile"
|
||||
type="info"
|
||||
:underline="false"
|
||||
href="http://cal.3w.jinshen.cn"
|
||||
href="http://cal.jinshen.cn"
|
||||
target="_blank"
|
||||
>
|
||||
<el-icon class="mdi mdi-calculator action-icon" />
|
||||
@ -131,9 +131,7 @@
|
||||
mode="vertical"
|
||||
@select="mobileMenuVisible = false"
|
||||
>
|
||||
<el-menu-item
|
||||
@click="openExternalLink('http://cal.3w.jinshen.cn')"
|
||||
>
|
||||
<el-menu-item @click="openExternalLink('http://cal.jinshen.cn')">
|
||||
{{ $t('navigation.calculator') }}
|
||||
</el-menu-item>
|
||||
</el-menu>
|
||||
|
||||
@ -109,5 +109,9 @@
|
||||
margin-left: 0;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -4,11 +4,17 @@
|
||||
<h1 class="page-title">{{ $t('navigation.downloads') }}</h1>
|
||||
<app-breadcrumb class="breadcrumb" :items="breadcrumbItems" />
|
||||
</div>
|
||||
<div v-if="!pending" class="page-content">
|
||||
<file-card :file-id="id" :file="file" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<el-skeleton :rows="6" animated />
|
||||
<div class="page-content">
|
||||
<el-skeleton
|
||||
:loading="pending"
|
||||
:rows="6"
|
||||
animated
|
||||
:throttle="{ leading: 500, trailing: 500 }"
|
||||
>
|
||||
<template #default>
|
||||
<file-card :file-id="id" :file="file" />
|
||||
</template>
|
||||
</el-skeleton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -66,4 +72,10 @@
|
||||
.breadcrumb {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
<template>
|
||||
<div>redirecting...</div>
|
||||
<div class="page-container">
|
||||
<h1>{{ $t('redirecting') }}</h1>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@ -10,3 +12,17 @@
|
||||
window.location.href = platform;
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.page-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 80vh;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,31 +1,21 @@
|
||||
<template>
|
||||
<div class="page-container">
|
||||
<div v-if="!pending">
|
||||
<div v-if="product">
|
||||
<!-- 面包屑导航 -->
|
||||
<app-breadcrumb class="breadcrumb" :items="breadcrumbItems" />
|
||||
<!-- 产品详情内容 -->
|
||||
<product-header :product="product" />
|
||||
<!-- 产品详细描述 -->
|
||||
<product-detail :product="product" />
|
||||
</div>
|
||||
<!-- 未找到产品 -->
|
||||
<div v-else class="not-found">
|
||||
<not-found-result
|
||||
:title="$t('product-not-found')"
|
||||
:sub-title="$t('product-not-found-desc')"
|
||||
:back-text="$t('back-to-products')"
|
||||
:on-back="() => $router.push($localePath('/products'))"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="product">
|
||||
<!-- 面包屑导航 -->
|
||||
<app-breadcrumb class="breadcrumb" :items="breadcrumbItems" />
|
||||
<!-- 产品详情内容 -->
|
||||
<product-header :product="product" />
|
||||
<!-- 产品详细描述 -->
|
||||
<product-detail :product="product" />
|
||||
</div>
|
||||
<div v-else class="loading">
|
||||
<el-skeleton style="--el-skeleton-circle-size: 400px">
|
||||
<template #template>
|
||||
<el-skeleton-item variant="circle" />
|
||||
</template>
|
||||
</el-skeleton>
|
||||
<el-skeleton :rows="5" animated />
|
||||
<!-- 未找到产品 -->
|
||||
<div v-else class="not-found">
|
||||
<not-found-result
|
||||
:title="$t('product-not-found')"
|
||||
:sub-title="$t('product-not-found-desc')"
|
||||
:back-text="$t('back-to-products')"
|
||||
:on-back="() => $router.push($localePath('/products'))"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -37,7 +27,7 @@
|
||||
// 获取路由参数
|
||||
const id = route.params.slug as string;
|
||||
|
||||
const { data: product, pending, error } = await useProduct(id);
|
||||
const { data: product, error } = await useProduct(id);
|
||||
|
||||
const breadcrumbItems = computed(() => [
|
||||
{ label: $t('navigation.home'), to: localePath('/') },
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
.skeleton-card {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-collapse-item__header) {
|
||||
|
||||
@ -1,18 +1,33 @@
|
||||
<template>
|
||||
<div class="search-page">
|
||||
<search-header v-model="keyword" />
|
||||
<div v-if="loading" class="search-state">
|
||||
<el-skeleton :rows="4" animated />
|
||||
</div>
|
||||
<search-tabs v-else-if="hasResults" :search-items="searchItems" />
|
||||
<div v-else class="search-state">
|
||||
<el-empty
|
||||
:description="
|
||||
route.query.query
|
||||
? $t('search.no-results', { query: route.query?.query })
|
||||
: $t('search.no-query')
|
||||
"
|
||||
/>
|
||||
<div class="search-state">
|
||||
<el-skeleton
|
||||
:loading="loading"
|
||||
animated
|
||||
:throttle="{ leading: 500, trailing: 500 }"
|
||||
>
|
||||
<template #template>
|
||||
<el-skeleton-item
|
||||
v-for="i in 10"
|
||||
:key="i"
|
||||
variant="rect"
|
||||
class="skeleton-item"
|
||||
/>
|
||||
</template>
|
||||
<template #default>
|
||||
<search-tabs v-if="hasResults" :search-items="searchItems" />
|
||||
<div v-else>
|
||||
<el-empty
|
||||
:description="
|
||||
route.query.query
|
||||
? $t('search.no-results', { query: route.query?.query })
|
||||
: $t('search.no-query')
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</el-skeleton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -96,7 +111,11 @@
|
||||
.search-state {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 3rem 0;
|
||||
}
|
||||
|
||||
.skeleton-item {
|
||||
height: 80px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
|
||||
@ -1,23 +1,18 @@
|
||||
<template>
|
||||
<div class="page-container">
|
||||
<div v-if="!pending">
|
||||
<div v-if="solution">
|
||||
<div class="page-header">
|
||||
<app-breadcrumb class="breadcrumb" :items="breadcrumbItems" />
|
||||
</div>
|
||||
<solution-detail :solution="solution" />
|
||||
</div>
|
||||
<div v-else class="not-found">
|
||||
<not-found-result
|
||||
:title="$t('solution-not-found')"
|
||||
:sub-title="$t('solution-not-found-desc')"
|
||||
:back-text="$t('back-to-solutions')"
|
||||
:on-back="() => $router.push($localePath('/solutions'))"
|
||||
/>
|
||||
<div v-if="solution">
|
||||
<div class="page-header">
|
||||
<app-breadcrumb class="breadcrumb" :items="breadcrumbItems" />
|
||||
</div>
|
||||
<solution-detail :solution="solution" />
|
||||
</div>
|
||||
<div v-else class="loading">
|
||||
<el-skeleton :rows="5" animated />
|
||||
<div v-else class="not-found">
|
||||
<not-found-result
|
||||
:title="$t('solution-not-found')"
|
||||
:sub-title="$t('solution-not-found-desc')"
|
||||
:back-text="$t('back-to-solutions')"
|
||||
:on-back="() => $router.push($localePath('/solutions'))"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -29,7 +24,7 @@
|
||||
// 获取路由参数
|
||||
const id = route.params.slug as string;
|
||||
|
||||
const { data: solution, pending, error } = await useSolution(id);
|
||||
const { data: solution, error } = await useSolution(id);
|
||||
|
||||
const breadcrumbItems = computed(() => [
|
||||
{ label: $t('navigation.home'), to: localePath('/') },
|
||||
|
||||
@ -172,5 +172,9 @@
|
||||
.skeleton-card {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -87,4 +87,10 @@
|
||||
:deep(.markdown-body ul) {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -226,6 +226,12 @@
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-pagination) {
|
||||
.btn-prev,
|
||||
.btn-next {
|
||||
|
||||
@ -223,6 +223,12 @@
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-pagination) {
|
||||
.btn-prev,
|
||||
.btn-next {
|
||||
|
||||
@ -137,5 +137,9 @@
|
||||
grid-template-columns: 1fr;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -127,5 +127,6 @@
|
||||
"specs": "Specifications",
|
||||
"faq": "FAQ",
|
||||
"documents": "Documents"
|
||||
}
|
||||
},
|
||||
"redirecting": "Redirecting..."
|
||||
}
|
||||
|
||||
@ -126,5 +126,6 @@
|
||||
"specs": "Especificaciones",
|
||||
"faq": "FAQ",
|
||||
"documents": "Documentos"
|
||||
}
|
||||
},
|
||||
"redirecting": "Redirigiendo..."
|
||||
}
|
||||
|
||||
@ -126,5 +126,6 @@
|
||||
"specs": "Технические спецификации",
|
||||
"faq": "Часто задаваемые вопросы",
|
||||
"documents": "Связанные документы"
|
||||
}
|
||||
},
|
||||
"redirecting": "Перенаправление..."
|
||||
}
|
||||
|
||||
@ -126,5 +126,6 @@
|
||||
"specs": "技术规格",
|
||||
"faq": "常见问题",
|
||||
"documents": "相关文档"
|
||||
}
|
||||
},
|
||||
"redirecting": "正在跳转..."
|
||||
}
|
||||
|
||||
@ -20,7 +20,17 @@ export default defineNuxtConfig({
|
||||
htmlAttrs: {
|
||||
lang: 'zh',
|
||||
},
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/jinshen-logo.ico' }],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/jinshen-logo.ico' },
|
||||
{
|
||||
rel: 'apple-touch-icon',
|
||||
href: '/jinshen-logo.png',
|
||||
},
|
||||
{
|
||||
rel: 'manifest',
|
||||
href: '/manifest.json',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
BIN
public/logo196x196.png
Normal file
BIN
public/logo196x196.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
public/logo512x512.png
Normal file
BIN
public/logo512x512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
20
public/manifest.json
Normal file
20
public/manifest.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "金申机械制造有限公司",
|
||||
"short_name": "金申机械",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/logo196x196.png",
|
||||
"sizes": "196x196",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/logo512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#0f172a"
|
||||
}
|
||||
Reference in New Issue
Block a user