- 优化首页、关于我们、产品服务、社会责任等页面的布局和样式

- 添加视频播放功能,支持在页面中嵌入并播放视频
- 更新新闻动态模块,支持动态加载和展示新闻内容
- 修复部分页面样式问题,提升用户体验
This commit is contained in:
王创世 2025-05-15 18:35:29 +08:00
parent 22c8b0ef0f
commit 2b3ecd7164
53 changed files with 1182 additions and 1043 deletions

58
README-CDN.md Normal file
View File

@ -0,0 +1,58 @@
# 灵睿官网3.0 - CDN图片处理指南
## 静态生成模式下的CDN图片处理
本项目已配置为支持在使用 `nuxt generate` 静态生成模式下自动处理图片CDN路径。以下是相关功能和使用方法的说明。
### 配置说明
1. CDN基础URL已配置为 `https://cdn.web.0rui.cn/`
2. 在 `nuxt.config.ts` 中已添加相关配置
3. 创建了专用的CDN图片处理插件和组件
### 使用方法
#### 方法一使用CdnImage组件推荐
```vue
<template>
<!-- 使用CdnImage组件自动处理CDN路径 -->
<CdnImage src="public/img/logo.png" class="image_1" referrerpolicy="no-referrer" />
</template>
```
#### 方法二:使用全局$cdnImage方法
```vue
<template>
<img :src="$cdnImage('public/img/logo.png')" class="image_1" referrerpolicy="no-referrer" />
</template>
<script setup>
const { $cdnImage } = useNuxtApp()
</script>
```
### 路径处理规则
- 以 `public/` 开头的路径会自动转换为 `https://cdn.web.0rui.cn/img/...`
- 已经是完整URL的路径以http://或https://开头)不会被修改
- 其他路径会直接拼接CDN基础URL
### 开发与生产环境
- 在开发环境中默认使用本地路径不进行CDN转换
- 在生产环境静态生成自动应用CDN路径
- 如需在开发环境中测试CDN路径可以使用 `<CdnImage src="..." :forceCdn="true" />` 强制启用CDN
### 静态生成命令
```bash
# 生成静态网站
npm run generate
# 预览生成的静态网站
npm run preview
```
生成的静态文件将位于 `.output/public` 目录中,可以部署到任何静态文件服务器。

View File

@ -1,10 +1,14 @@
<template>
<n-config-provider :locale="zhCN">
<AppHeader />
<NuxtPage />
<AppFooter/>
</n-config-provider>
</template>
<script lang="ts" setup>
import { NConfigProvider } from 'naive-ui'
import { zhCN, dateZhCN } from 'naive-ui'
import $api from '@/service/webRequest'
import { useStore } from '~/store'
import { useI18n } from 'vue-i18n'

View File

@ -196,44 +196,19 @@
}
.text_9 {
width: 88px;
height: 22px;
overflow-wrap: break-word;
color: rgba(252, 116, 40, 1);
font-size: 22px;
font-family: Microsoft YaHei UI-Bold;
font-weight: 700;
text-align: left;
white-space: nowrap;
line-height: 22px;
padding-right: 40px;
cursor: pointer;
}
.text_10 {
width: 110px;
height: 22px;
overflow-wrap: break-word;
color: rgba(34, 34, 34, 1);
font-size: 22px;
font-family: Microsoft YaHei UI-Regular;
font-weight: NaN;
text-align: left;
white-space: nowrap;
line-height: 22px;
margin-left: 70px;
}
.text_11 {
width: 110px;
height: 22px;
overflow-wrap: break-word;
color: rgba(34, 34, 34, 1);
font-size: 22px;
font-family: Microsoft YaHei UI-Regular;
font-weight: NaN;
text-align: left;
white-space: nowrap;
line-height: 22px;
margin-left: 58px;
padding-right: 40px;
cursor: pointer;
}
.box_3 {
@ -251,7 +226,7 @@
.text_12 {
width: 584px;
height: 166px;
height: auto;
overflow-wrap: break-word;
color: rgba(118, 133, 151, 1);
font-size: 16px;
@ -265,8 +240,8 @@
.text-wrapper_2 {
background-color: rgba(34, 34, 34, 1);
height: 36px;
margin-top: 51px;
width: 108px;
margin-top: 20px;
}
.text_13 {
@ -300,8 +275,8 @@
}
.image_5 {
width: 86px;
height: 86px;
width: 70px;
height: 70px;
position: absolute;
top: 50%;
left: 50%;
@ -332,7 +307,7 @@
font-weight: 700;
text-align: center;
white-space: nowrap;
margin: 30px 0px;
margin:70px 0px 10px 0px;
}
.text_15 {
@ -340,7 +315,6 @@
font-size: 16px;
text-align: center;
white-space: nowrap;
margin-bottom: 30px;
}
.section_2 {
@ -428,7 +402,7 @@
height: 32px;
overflow-wrap: break-word;
color: rgba(252, 116, 40, 1);
font-size: 18px;
font-size: 24px;
font-family: Microsoft YaHei UI-Bold;
font-weight: 700;
text-align: left;
@ -446,7 +420,7 @@
font-weight: NaN;
text-align: left;
line-height: 32px;
margin-top: -1px;
margin-top: 10px;
}
.group_7 {
@ -664,7 +638,7 @@
.box_7 {
width: 100%;
height: 645px;
height: 586px;
background: url(public/img/bg-3.png) 100% no-repeat;
background-size: 100% 100%;
margin-top: 2px;
@ -677,7 +651,7 @@
font-weight: 700;
text-align: center;
white-space: nowrap;
margin: 30px 0px;
margin:70px 0px 10px 0px;
}
.group_14 {
@ -693,9 +667,9 @@
}
.dswper {
width: 80%;
width: 63%;
margin: 0 auto;
margin-top: 84px;
margin-top: 30px;
position: relative;
}
@media screen and (max-width: 1440px) {
@ -1005,14 +979,15 @@
}
.box_11 {
padding: 50px 0px;
background-color: rgba(255, 255, 255, 1);
width: 100%;
justify-content: flex-center;
overflow: hidden;
padding-bottom: 50px;
}
.text-wrapper_10 {
margin-top: 70px;
text-align: center;
}
@ -1024,7 +999,7 @@
}
.text-wrapper_11 {
margin-top: 30px;
margin-top:10px;
text-align: center;
}
@ -1372,7 +1347,7 @@
font-weight: 700;
white-space: nowrap;
line-height: 32px;
margin-top: 50px;
margin-top: 70px;
text-align: center;
}
@ -1381,7 +1356,7 @@
font-size: 16px;
white-space: nowrap;
line-height: 16px;
margin-top: 30px;
margin-top: 10px;
text-align: center;
}
@ -1592,9 +1567,8 @@
.group_29 {
width: 63%;
height: 60px;
margin: 0 auto;
margin-top: 50px;
margin-top: 30px;
}
@media screen and (max-width: 1440px){
.group_29 {
@ -2012,4 +1986,46 @@ button:active {
.align-end {
display: flex;
align-items: flex-end;
}
.three-line-ellipsis {
display: -webkit-box;
/* 使用弹性盒模型 */
-webkit-box-orient: vertical;
/* 内容垂直排列 */
-webkit-line-clamp: 3;
/* 限制显示的行数 */
overflow: hidden;
/* 隐藏超出部分 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
word-break: break-all;
/* 允许单词内换行(可选) */
}
.one-line-ellipsis {
display: -webkit-box;
/* 使用弹性盒模型 */
-webkit-box-orient: vertical;
/* 内容垂直排列 */
-webkit-line-clamp: 1;
/* 限制显示的行数 */
overflow: hidden;
/* 隐藏超出部分 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
word-break: break-all;
/* 允许单词内换行(可选) */
}
.two-line-ellipsis{
display: -webkit-box;
/* 使用弹性盒模型 */
-webkit-box-orient: vertical;
/* 内容垂直排列 */
-webkit-line-clamp: 2;
/* 限制显示的行数 */
overflow: hidden;
/* 隐藏超出部分 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
word-break: break-all;
/* 允许单词内换行(可选) */
}

View File

@ -1,37 +1,37 @@
<template>
<div class="page flex-col">
<div class="group_1 flex-col">
<div class="box_1 flex-row">
<img class="image_1" referrerpolicy="no-referrer" src="public/img/logo.png" />
<div class="flex-row" :class="route.name=='info-id'?'box_1 box_1_info':'box_1'">
<img v-if="route.name!='info-id'" class="image_1" referrerpolicy="no-referrer" src="public/img/logo.png" />
<img v-if="route.name=='info-id'" class="image_1" referrerpolicy="no-referrer" src="public/img/logo1.png" />
<!-- Desktop Navigation -->
<div class="desktop-nav">
<span class="text_1">
<span :class="route.name=='info-id'?'text_black text_1':'text_1'">
<NuxtLink to="/" :class="{ 'active': route.path === '/' }">
企业首页
</NuxtLink>
</span>
<span class="text_2">
<span :class="route.name=='info-id'?'text_black text_2':'text_2'">
<NuxtLink to="/proServices/" :class="{ 'active': route.path === '/proServices/' || route.path === '/proServices_con/' || route.path === '/proServices_con' || route.path === '/proServices' }">
产品&amp;服务
</NuxtLink>
</span>
<span class="text_3">
<span :class="route.name=='info-id'?'text_black text_3':'text_3'">
<NuxtLink to="/aboutUs/" :class="{ 'active': route.path === '/aboutUs/' || route.path === '/aboutUs' }">
灵睿&amp;我们
</NuxtLink>
</span>
<span class="text_4">
<span :class="route.name=='info-id'?'text_black text_4':'text_4'">
<NuxtLink to="/customerReviews/" :class="{ 'active': route.path === '/customerReviews/' || route.path === '/customerReviews' }">
客户&amp;评价
</NuxtLink>
</span>
<span class="text_5">
<span :class="route.name=='info-id'?'text_5_info':'text_5'">
<NuxtLink to="/societyDuty/" :class="{ 'active': route.path === '/societyDuty/' || route.path === '/societyDuty' || route.path === '/societyDutyNew/' || route.path === '/societyDutyNew' }">
社会&amp;责任
</NuxtLink>
</span>
<span class="text_6">
<span :class="route.name=='info-id'?'text_black text_6':'text_6'">
<NuxtLink to="/concatUs/" :class="{ 'active': route.path === '/concatUs/' || route.path === '/concatUs'}">
加入我们
</NuxtLink>
@ -202,4 +202,22 @@ console.log(route)
}
}
.text_black{
color: #000000!important;
}
.text_5_info{
background-color: #FC7428;
height: 70px !important;
width: 120px !important;
line-height: 70px !important;
padding: 0px 20px !important;
margin-left: 30px;
color: #ffffff!important;
text-align: center;
}
.box_1_info {
height: 50px !important;
margin: 0px !important;
padding-top: 20px !important;
}
</style>

View File

View File

@ -5,11 +5,13 @@ export default defineNuxtConfig({
app: {
baseURL:'/web/',
},
nitro: {
routeRules: {
'/**': { trailingSlash: false }
}
},
router: {
// extendRoutes(routes, resolve) {
// routes.push({
@ -19,12 +21,30 @@ export default defineNuxtConfig({
// });
// }
},
// 设置为false以启用客户端渲染适合静态生成
ssr: false,
// 静态生成配置
generate: {
routes: [
'/',
'/aboutUs',
'/proServices',
'/proServices_con',
'/societyDuty',
'/societyDutyNew',
'/concatUs',
'/customerReviews'
]
},
css: [
'swiper/css',
'swiper/css/mousewheel',
'@/assets/css/common.scss'
],
devtools: { enabled: true },
postcss: {
@ -33,8 +53,9 @@ export default defineNuxtConfig({
tailwindcss: {},
},
},
modules: ['@pinia/nuxt', 'nuxt-icons'],
compatibilityDate: '2025-03-12',
vite: {
server: {
proxy: {
@ -45,5 +66,7 @@ export default defineNuxtConfig({
}
}
}
}
},
compatibilityDate: '2025-05-15'
})

View File

@ -6,7 +6,8 @@
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
"postinstall": "nuxt prepare",
"build:static": "node scripts/build-static.js"
},
"devDependencies": {
"@nuxt/devtools": "latest",

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 550px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/abus.png" style="width: 100%;">
@ -26,13 +26,12 @@
</div>
<div class="group_2 flex-col">
<div class="box_2 flex-col">
<div class="group_3 flex-row justify-center align-center" style="background: #ffffff;height: 500px;">
<div class="group_3 flex-row justify-center" style="background: #ffffff;height: 480px;gap: 30px;">
<div class="group_5 flex-col justify-center align-center rightBox">
<div class="flex-col section_1sa"></div>
</div>
<div class="group_4 flex-col leftBox">
<div class="group_4 flex-col leftBox" style="padding-top: 40px;">
<div class="text-group_1 flex-col justify-between" style="width: 100%;">
<span class="text_7" style="width: 432px;position: relative;">
洛阳灵睿网络技术有限公司
@ -43,7 +42,7 @@
</span>
</div>
<span class="text_12" style="height: auto;font-size: 14px;">
<span class="text_12" style="height: auto;font-size: 14px;margin-top: 40px;">
洛阳灵睿网络技术有限公司成立于2006年深耕互联网行业专注智慧信息化与数字内容服务领域19年是集技术研发创意策划全媒体运营于一体的高新技术企业公司以技术赋能场景内容驱动价值为核心使命专注于为大型公立医院教育机构企事业单位品牌营销策略提供一站式智慧化解决方案与品牌数字化升级服务助力客户实现效率提升品牌增值与精准传播
</span>
<span class="textss13">
@ -84,11 +83,11 @@
</div>
</div>
<div class="flex rongyu1s bottomBox">
<div class="flex" style="width: 12%;align-items: center;">
<div class="flex" style="width: 13%;align-items: center;">
<img style="margin-left: 20px;" src="/public/img/about/jiangbei.png" alt="">
<span class="spanst">荣誉标签</span>
</div>
<div class="flex" style="width: 88%;justify-content: space-between;">
<div class="flex" style="width: 87%;justify-content: space-between;">
<span class="spans">中国电子商务协会工业电商委员会河南分会单位</span>
<span class="spans">新华网人民网今日头条新闻联络中心</span>
<span class="spans" style="margin-right:20px;">灵睿与郑州洛阳等地的网信以及网监系统保持长期合作获</span>
@ -126,8 +125,8 @@
<span class="text_15 topBox">Company&nbsp;environment</span>
<div class="dswper" style="margin-top: 0;">
<swiper ref="swiper_exp" :slidesPerView="5" loop :loopedSlides="3" :autoplay="false" centeredSlides
<div class="dswper" style="margin-top: 30px;">
<swiper ref="swiper_exp" :slidesPerView="5" loop :loopedSlides="3" :autoplay="true" centeredSlides
:modules="modules" :watchSlidesProgress="true" @swiper="onSwiperExp" >
<swiper-slide v-for="(item,index) in 21" :key="index" style="padding: 0 10px;">
<img :src="`/img/about/${item}.jpg`" style="width: 100%;">
@ -139,17 +138,17 @@
<div class="dswper_right">
<img src="public/img/opr.png">
</div> -->
<div class="flex-row justify-center align-center absolute w-full bottom-[-20px]" style="gap: 30px;">
<div style="width: 25px;height:5px;background-color: #fc7428;"></div>
<div style="width: 25px;height:5px;background-color: #C1C1C1;"></div>
<div style="width: 25px;height:5px;background-color: #C1C1C1;"></div>
<div class="flex-row justify-center align-center absolute w-full bottom-[-50px]" style="gap: 30px;">
<div v-for="(_, index) in 3" :key="index" style="width: 25px; height: 5px;"
:style="{ backgroundColor: activeSlideIndex === index ? '#fc7428' : '#C1C1C1' }">
</div>
</div>
</div>
</div>
<div class="box_17 flex-col" style="overflow: hidden;">
<span class="text_53">部分伙伴</span>
<span class="text_54">Our&nbsp;Business&nbsp;</span>
<span class="text_54" style="margin-top: 30px;">Our&nbsp;Business&nbsp;</span>
<div class="group_29 grid grid-cols-6 gap-6 mr-auto">
<div class="bottom_imgs topSj"></div>
<!-- <div v-for="item in 18" class="">
@ -203,18 +202,21 @@ const swiperOptionsNews = {
prevEl: '#swipen_next',
},
}
const activeSlideIndex=ref(0);
let vesSwiper: any = null
const onSwiperExp = (swiper: any) => {
vesSwiper = swiper
//
swiper.on('slideChange', () => {
//
activeSlideIndex.value = swiper.realIndex % 3
})
}
const swiper_exp = ref();
//
onMounted(() => {
nextTick(() => {
animate()
})
})
const numberAnimationInstRef = ref()
const numberAnimationInstRefKH = ref()
@ -227,7 +229,7 @@ const animate = () => {
origin: "left",
distance: "1000px",
duration: 1300,
delay: 100,
delay: 0,
opacity: 0,
scale: 0.9,
reset: true,
@ -352,7 +354,7 @@ const animate = () => {
font-family: Microsoft YaHei UI-Regular;
}
.rongyu1s{
width: 1340px;
width: 63%;
height: 68px;
background: #F8F8F8;
border-radius: 0px 0px 0px 0px;

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 550px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/joinus.png" style="width: 100%;">
@ -26,7 +26,7 @@
</div>
<div class="group_2 flex-col">
<div class="box_2 flex-col">
<div class="group_3 flex-row justify-center align-center">
<div class="group_3 flex-row justify-center align-center" style="height: 505px;gap: 72px;">
<div class="group_5 flex-col justify-center align-center rightBox">
<div class="section_1s flex-col"></div>
@ -40,7 +40,7 @@
<span class="text_12">
从一支年轻的创业团队慢慢发展成为业务遍及全国的信息化内容支持型互联网公司我们仍旧保持着始终创业的心态每一天努力向前如果你也愿意加入我们请联系我们的HR期待与你的会面
</span>
<div class="flex" style="margin-top: 0px;">
<div class="flex" style="margin-top: 40px;">
<span class="text_13s">
<img src="public/img/telphone.png" alt="" class="imgs">
联系电话15503791530
@ -58,7 +58,7 @@
<div class="box_17s flex-col" style="overflow: hidden;">
<span class="text_53">热门岗位</span>
<span class="text_54">Company&nbsp;environment</span>
<span class="text_54" style="margin-top: 20px;">Company&nbsp;environment</span>
<div class="hbform">
<div class="flex boxgs">
<div v-for="(item, index) in typeList" @click="openType(item)" :class="typeId == item.id ? 'title active' : 'title'">{{ item.name
@ -126,18 +126,9 @@ const swiperOptionsNews = {
prevEl: '#swipen_next',
},
}
let vesSwiper: any = null
const onSwiperExp = (swiper: any) => {
vesSwiper = swiper
}
const swiper_exp = ref();
//
onMounted(() => {
nextTick(() => {
animate()
})
getType();
})
const openType = (item: any) => {
@ -391,7 +382,7 @@ const animate = () => {
}
.a2s {
margin: 20px 0;
margin: 15px 0;
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 600px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/customer/topnav.png" style="width: 100%;">
@ -25,10 +25,10 @@
</div> -->
</div>
<div class="box_11 flex-col bottom_imgss">
<div class="text-wrapper_10">
<div class="text-wrapper_10" style="margin-top: 70px;">
<span class="text_41">公司荣誉</span>
</div>
<div class="text-wrapper_11">
<div class="text-wrapper_11" style="margin-top: 20px;">
<span class="text_42">Company&nbsp;Honors&nbsp;</span>
</div>
@ -218,8 +218,7 @@ const animate = () => {
.bottom_imgss {
background: url(/public/img/customer/bg-s.png);
width: 1920px;
height: 800px;
height: 837px;
background-size: 100%;
}

View File

@ -1,13 +1,17 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 100vh;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/banner.png" style="width: 100%;">
</swiper-slide>
<swiper-slide>
<img src="public/img/banner.png" style="width: 100%;">
<img src="public/img/banner2.png" style="width: 100%;">
</swiper-slide>
<swiper-slide>
<video class="video_1" autoplay="autoplay" loop="loop" muted="muted" playsinline="playsinline"
src="public/img/1212.mp4"></video>
</swiper-slide>
</swiper>
<div style="position: absolute;bottom: 50px;left: 0;width: 100%;z-index: 100;">
@ -34,22 +38,44 @@
The&nbsp;Way&nbsp;of&nbsp;the&nbsp;Internet
</span>
</div>
<div class="text-wrapper_1 flex-row">
<span class="text_9">公司简介</span>
<span class="text_10">运营方法论</span>
<span class="text_11">互联网营销</span>
<div style="display: flex;justify-content: start;margin-top: 50px;">
<div @click="openType(1)" :class="typeId == 1 ? 'text_9' : 'text_11'">公司简介</div>
<div @click="openType(2)" :class="typeId == 2 ? 'text_9' : 'text_11'">运营方法论</div>
<div @click="openType(3)" :class="typeId == 3 ? 'text_9' : 'text_11'">互联网营销</div>
</div>
<div class="box_3 flex-col">
<div class="box_4 flex-col"></div>
<div class="box_3 flex-col" style="justify-content: start;">
<div v-if="typeId ==1" class="box_4 flex-col"></div>
<div v-if="typeId ==2" class="box_4 flex-col" style="margin-left: 135px;"></div>
<div v-if="typeId ==3" class="box_4 flex-col" style="margin-left: 287px;"></div>
</div>
<div class="text_12" v-if="typeId == 1">
洛阳灵睿网络技术有限公司
<br>
智慧信息化与数字内容服务领航者
<br>
洛阳灵睿网络技术有限公司成立于2006年深耕互联网行业专注智慧信息化与数字内容服务领域19年是集技术研发创意策划全媒体运营于一体的高新技术企业公司以技术赋能场景内容驱动价值为核心使命专注于为大型公立医院教育机构企事业单位品牌营销策略提供一站式智慧化解决方案与品牌数字化升级服务助力客户实现效率提升品牌增值与精准传播
<br>
专注互联网领域发散新媒体创思执着深耕口碑服务扎实落地品牌内容共创新信息化与内容服务业态
</div>
<div class="text_12" v-if="typeId == 2">
在灵睿我们的运营方法论是基于深入的<strong>市场洞察用户需求分析</strong>和科学的<strong>数据驱动</strong>通过系统化的策略为品牌赋能我们从运营的<strong>江湖地位</strong>出发帮助品牌在竞争激烈的市场中确立<strong>独特的定位和竞争力</strong>通过精确的运营基本逻辑确保每一项策略与品牌核心价值相匹配推动<strong>可持续发展</strong>
我们将运营分为三大核心手段<strong>内容运营活动运营和用户运营</strong>内容运营注重通过高质量有共鸣的内容与受众建立深度联系活动运营则通过创意和精准策划提升品牌曝光和用户参与度用户运营关注从触达到转化的全过程通过个性化服务增强用户粘性与忠诚度
灵睿深知运营不仅依赖直觉与经验更依<strong>赖数据支持</strong>我们通过精细化的<strong>数据统计与分析</strong>数据统计与分析实时监测运营效果并做出策略调整确保每个决策都有<strong>数据背书</strong>通过这一整套运营体系我们不仅能为客户提供行之有效的解决方案更能帮助他们在数字化浪潮中领先一步实现<strong>持续增长与价值创造</strong>
</div>
<div class="text_12" v-if="typeId == 3">
在灵睿我们通过深度的<strong>数据分析</strong>和精确的<strong>用户洞察</strong>帮助企业实现<strong>品牌的精准传播和长期增长</strong>我们相信成功的互联网营销不仅仅是提高曝光率更是通过<strong>内容创作活动策划和用户互动</strong>等手段打造与受众的深层次连接从而促进<strong>品牌的认知度和忠诚度</strong>
我们帮助客户制定个性化的互联网营销策略覆盖<strong>社交媒体搜索引擎视频内容</strong>等多个渠道确保每个接触点都能精准传达品牌价值在实际操作中我们依托<strong>技术优势</strong>结合行业<strong>最佳实践</strong>为客户提供<strong>定制化的营销方案</strong>推动<strong>线上线下的无缝连接</strong>
灵睿的互联网营销不仅是单一的推广行为更是一个以用户为中心的全方位战略帮助企业在快速变化的市场中保持<strong>竞争力</strong>实现<strong>持续增长</strong>
</div>
<span class="text_12">
灵睿是一家专业提供互联网技术及应用化服务的科技企业公司成立于2006年总部位于十三朝古都洛阳在郑州洛阳许昌三地设立四家公司是洛阳及河南建立较早实力较强规模较大的互联网骨干技术服务企业公司致力于互联网+工业互联网+医疗互联网+教育互联网+旅游互联网+农业五个方面的发展目前为近三千家企业提供互联网服务并为上百家国有大型企业以及党政部门事业机关单位提供互联网应用化服务
</span>
<div class="text-wrapper_2 flex-col">
<span class="text_13">查看全部</span>
<nuxt-link to="/aboutUs/" class="text_13">
<span>查看全部</span>
</nuxt-link>
</div>
</div>
<div class="group_5 flex-col justify-center align-center rightBox">
<div @click="videoShow = true"
class="group_5 flex-col justify-center align-center rightBox cursor-pointer">
<div class="section_1 flex-col">
<div class="image-wrapper_2 flex-col">
<img class="image_5" referrerpolicy="no-referrer" src="public/img/bf.png" />
@ -66,7 +92,7 @@
<span class="text_15 topBox">
Our&nbsp;BusinessWay
</span>
<div class="flex-row justify-center align-center">
<div class="flex-row justify-center align-center" style="margin-top: 30px;">
<div class="leftBox section_2s flex-col" style="margin-right: 30px;">
<div class="group_6 flex-col">
<div class="box_6 flex-row align-center justify-between">
@ -81,7 +107,7 @@
<div class="image-wrapper_3s flex-col align-center">
<img class="label_1s" referrerpolicy="no-referrer" src="public/img/u1s.png" />
</div>
</div>
</div>
<div class="group_10s flex-col"></div>
@ -111,7 +137,8 @@
<div class="group_10 flex-col"></div>
<div class="group_7 flex-row justify-between">
<div class="image-wrapper_5 flex-col">
<img class="label_3" referrerpolicy="no-referrer" src="public/img/a-yunweishuju1x.png" />
<img class="label_3" referrerpolicy="no-referrer"
src="public/img/a-yunweishuju1x.png" />
</div>
<div class="text-group_3 flex-col justify-between">
<span class="text_18">IT运维服务</span>
@ -123,7 +150,8 @@
<div class="group_10 flex-col"></div>
<div class="group_7 flex-row justify-between">
<div class="image-wrapper_5 flex-col">
<img class="label_3" referrerpolicy="no-referrer" src="public/img/wangluoanquanshebei.png" />
<img class="label_3" referrerpolicy="no-referrer"
src="public/img/wangluoanquanshebei.png" />
</div>
<div class="text-group_3 flex-col justify-between">
<span class="text_18">网络与信息安全</span>
@ -135,7 +163,8 @@
<div class="group_10 flex-col"></div>
<div class="group_7 flex-row justify-between">
<div class="image-wrapper_5 flex-col">
<img class="label_3" referrerpolicy="no-referrer" src="public/img/yekuogongdianfangan.png" />
<img class="label_3" referrerpolicy="no-referrer"
src="public/img/yekuogongdianfangan.png" />
</div>
<div class="text-group_3 flex-col justify-between">
<span class="text_18">智慧化解决方案</span>
@ -150,7 +179,7 @@
<div class="group_6s flex-col">
<div class="box_6 flex-row align-center justify-between">
<div class="text-group_2 flex-col justify-between">
<span class="text_17" >
<span class="text_17">
内容创作与运营
</span>
<span class="text_16" style="color: #FC7428;">
@ -160,7 +189,7 @@
<div class="image-wrapper_3s flex-col align-center">
<img class="label_1s" referrerpolicy="no-referrer" src="public/img/u1.png" />
</div>
</div>
</div>
<div class="group_10s flex-col"></div>
@ -228,42 +257,16 @@
</div>
</div>
</div>
<div class="box_7 flex-col">
<div style="background-color: #ffffff;">
<div class="box_7 flex-col">
<span class="text_24 topBox">行业案例</span>
<span class="text_15 topBox">Industry&nbsp;Cases</span>
<!-- <div class="group_14 flex-row justify-between align-center" style="flex-wrap: wrap;">
<div class="flex-row">
<div class="text_25">
<span>医疗</span>
<div
style="width: 100%;height: 1px;background-color: #fc7428;position: absolute;bottom: -21px;">
</div>
</div>
<div class="text_25">党政</div>
<div class="text_25">建筑</div>
<div class="text_25">物流</div>
<div class="text_25">教育</div>
<div class="text_25">文旅</div>
<div class="text_25">餐饮</div>
</div>
<div class="flex-row justify-center align-center">
<div style="margin-right: 10px;">
<span class="text_32">更多案例</span>
</div>
<div>
<img src="public/img/anli.png" />
</div>
</div>
<div class="group_15" style="flex: 0 0 100%;"></div>
</div> -->
<div class="dswper">
<swiper ref="swiper_exp" :slidesPerView="3" loop :loopedSlides="5" :autoplay="false" centeredSlides
:modules="modules" :watchSlidesProgress="true" @swiper="onSwiperExp" :grid="{fill:'column',rows: 1}" spaceBetween="20">
<swiper-slide v-for="(item,index) in 14" :key="index">
<img :src="`/img/home_al/op${item}.png`" style="width: 100%;">
<swiper ref="swiper_exp" :slidesPerView="2" loop :autoplay="false"
:modules="modules" :watchSlidesProgress="true" @swiper="onSwiperExp">
<swiper-slide v-for="(item, index) in 14" :key="index">
<img :src="`/img/home_al/op${item}.png`" style="width: 585px;height: 300px; margin: 0 auto;">
</swiper-slide>
</swiper>
<!-- <div class="dswper_left">
<img src="public/img/opl.png">
@ -272,173 +275,129 @@
<img src="public/img/opr.png">
</div> -->
<div class="flex-row justify-center align-center absolute w-full bottom-[-50px]" style="gap: 30px;">
<div v-for="(_, index) in 3" :key="index"
style="width: 25px; height: 5px;"
<div v-for="(_, index) in 3" :key="index" style="width: 20px; height: 5px;"
:style="{ backgroundColor: activeSlideIndex === index ? '#fc7428' : '#C1C1C1' }">
</div>
</div>
</div>
</div>
</div>
<div class="box_11 flex-col">
<div class="text-wrapper_10">
<span class="text_41">新闻动态</span>
</div>
<div class="text-wrapper_11">
<span class="text_42">Our&nbsp;Business&nbsp;</span>
<span class="text_42">news information</span>
</div>
<div class="box_12 flex-row justify-center">
<img class="image_7 leftBox" referrerpolicy="no-referrer" src="public/img/news1.png" />
<div class="box_13 flex-col topBox">
<div class="text-group_6 flex-col justify-between">
<span class="text_43">
洛阳市郑州商会在洛阳灵睿网络技术有限...
</span>
<span class="paragraph_1">
为深入学习贯彻党的二十大精神落实省市委决策
<br />
充分发挥民营企业的凝聚力向心力和创造力..
</span>
<div class="box_12 flex-row justify-center" v-if="newsList.length > 0">
<img @click="openUrl(newsList[0].id)" class="image_7 leftBoxTop" referrerpolicy="no-referrer"
:src="newsList[0].image" style="cursor: pointer;;object-fit: cover;" />
<div class="box_13 flex-col topBox" @click="openUrl(newsList[1].id)" style="cursor: pointer;">
<div class="text-group_6">
<div class="one-line-ellipsis" style="font-size: 18px;font-weight: 700;padding-top: 10px;">
{{ newsList[1].title }}
</div>
<div class="two-line-ellipsis"
style="color: #768597;font-size: 14px;font-weight: 400;margin-top: 20px;">
{{ newsList[1].subtitle }}
</div>
</div>
<div class="group_22 flex-row">
<div class="section_6 flex-col"></div>
<span class="text_44">行业动态</span>
<span class="text_45">2025-06-24</span>
<span class="text_44">{{ newsList[1].cate.name }}</span>
<span class="text_45">{{ retTime(newsList[1].release_time_text) }}</span>
</div>
</div>
<img class="image_8 rightBox" referrerpolicy="no-referrer" src="public/img/news2.png" />
<img @click="openUrl(newsList[2].id)" class="image_8 rightBox" referrerpolicy="no-referrer"
:src="newsList[2].image" style="cursor: pointer;;object-fit: cover;" />
</div>
<div class="box_14 flex-row justify-center">
<div class="group_23 flex-col leftBox">
<div class="text-group_7 flex-col justify-between">
<span class="text_46">
洛阳市郑州商会在洛阳灵睿网络技术有限...
</span>
<span class="paragraph_2">
为深入学习贯彻党的二十大精神落实省市委决策
<br />
充分发挥民营企业的凝聚力向心力和创造力..
</span>
<div class="box_14 flex-row justify-center" v-if="newsList.length > 0">
<div class="group_23 flex-col leftBoxTop" @click="openUrl(newsList[0].id)" style="cursor: pointer;">
<div class="text-group_7">
<div class="one-line-ellipsis" style="font-size: 18px;font-weight: 700;padding-top: 10px;">
{{ newsList[0].title }}
</div>
<div class="two-line-ellipsis"
style="color: #768597;font-size: 14px;font-weight: 400;margin-top: 20px;">
{{ newsList[0].subtitle }}
</div>
</div>
<div class="group_24 flex-row">
<div class="group_25 flex-col"></div>
<span class="text_47">行业动态</span>
<span class="text_48">2025-06-24</span>
<span class="text_47">{{ newsList[0].cate.name }}</span>
<span class="text_48">{{ retTime(newsList[0].release_time_text) }}</span>
</div>
</div>
<img class="image_9 bottomBox" referrerpolicy="no-referrer" src="public/img/news3.png" />
<div class="group_26 flex-col rightBox">
<div class="text-group_8 flex-col justify-between">
<span class="text_49">
洛阳市郑州商会在洛阳灵睿网络技术有限...
</span>
<span class="paragraph_3">
为深入学习贯彻党的二十大精神落实省市委决策
<br />
充分发挥民营企业的凝聚力向心力和创造力..
</span>
<img @click="openUrl(newsList[1].id)" class="image_9 bottomBox" referrerpolicy="no-referrer"
:src="newsList[1].image" style="cursor: pointer;;object-fit: cover;" />
<div class="group_26 flex-col rightBox" @click="openUrl(newsList[2].id)" style="cursor: pointer;">
<div class="text-group_8">
<div class="text-group_7" style="margin: 0;">
<div class="one-line-ellipsis" style="font-size: 18px;font-weight: 700;padding-top: 10px;">
{{ newsList[2].title }}
</div>
<div class="two-line-ellipsis"
style="color: #768597;font-size: 14px;font-weight: 400;margin-top: 20px;">
{{ newsList[2].subtitle }}
</div>
</div>
</div>
<div class="box_15 flex-row">
<div class="group_27 flex-col"></div>
<span class="text_50">行业动态</span>
<span class="text_51">2025-06-24</span>
<span class="text_50">{{ newsList[2].cate.name }}</span>
<span class="text_51">{{ retTime(newsList[2].release_time_text) }}</span>
</div>
</div>
</div>
<div class="box_16 flex-row">
<div class="text-wrapper_12 flex-col">
<span class="text_52">查看更多</span>
<nuxt-link to="/societyDutyNew/" class="text_52">
<span>查看更多</span>
</nuxt-link>
</div>
</div>
</div>
<div class="box_17 flex-col" style="overflow: hidden;">
<span class="text_53">合作伙伴</span>
<span class="text_54">Our&nbsp;Business&nbsp;</span>
<!-- <div class="group_28 flex-row justify-center numberTopBox">
<div class="text-group_9 flex-col justify-between">
<span class="text_55">
<n-number-animation :duration="5000" ref="numberAnimationInstRef" :active="false" :from="0" :to="5000"></n-number-animation>+
</span>
<span class="text_56">
19年技术沉淀只为提供更在专业的服务行业解决方案
</span>
</div>
<span class="text_57">服务客户</span>
<div class="section_7 flex-col"></div>
<div class="text-group_10 flex-col justify-between">
<span class="text_58"><n-number-animation :duration="5000" ref="numberAnimationInstRefKH" :active="false" :from="0" :to="19"></n-number-animation>+</span>
<span class="text_59">
19年技术沉淀只为提供更在专业的服务行业解决方案
</span>
</div>
<span class="text_60">技术沉淀</span>
<div class="section_8 flex-col"></div>
<div class="text-group_11 flex-col justify-between">
<span class="text_61"><n-number-animation :duration="5000" ref="numberAnimationInstRefJS" :active="false" :from="0" :to="100"></n-number-animation>+</span>
<span class="text_62">
19年技术沉淀只为提供更在专业的服务行业解决方案
</span>
</div>
<span class="text_63">覆盖行业</span>
<div class="section_9 flex-col"></div>
<div class="text-group_12 flex-col justify-between">
<span class="text_64"><n-number-animation :duration="5000" ref="numberAnimationInstRefHY" :active="false" :from="0" :to="30"></n-number-animation>+</span>
<span class="text_65">
19年技术沉淀只为提供更在专业的服务行业解决方案
</span>
</div>
<span class="text_66">技术团队</span>
</div> -->
<div class="group_29 grid grid-cols-6 gap-6 mr-auto">
<div class="bottom_imgs topSj"></div>
<!-- <div v-for="item in 18" class="">
<img class="image_11 topSj" referrerpolicy="no-referrer" src="public/img/q1.png" />
</div> -->
</div>
</div>
<div class="box_18 flex-col" style="overflow: hidden;">
<span class="text_53" style="color: #fff;">联系我们</span>
<span class="text_54" style="color: #fff;">cooperative&nbsp;partner&nbsp;</span>
<div class="numberTopBox" style="margin:0 auto;">
<form class="contactForm mt-6 w-full" @submit.prevent="submitForm">
<div class="inputform">
<input
v-model="formData.name"
class="contactInput mt-[15px] md:mt-[30px] w-full md:w-[700px]"
type="text"
placeholder="输入您的姓名"
/>
<input
v-model="formData.mobile"
class="contactInput mt-[15px] md:ml-[30px] md:mt-[30px] w-full md:w-[700px]"
type="text"
placeholder="请输入您的联系电话"
/>
<input
v-model="formData.emil"
class="contactInput mt-[15px] md:ml-[30px] md:mt-[30px] w-full md:w-[700px]"
type="text"
placeholder="请输入您的邮箱"
/>
<input v-model="formData.name" class="contactInput mt-[15px] md:mt-[30px] w-full md:w-[700px]"
type="text" placeholder="输入您的姓名" />
<input v-model="formData.mobile"
class="contactInput mt-[15px] md:ml-[30px] md:mt-[30px] w-full md:w-[700px]" type="text"
placeholder="请输入您的联系电话" />
<input v-model="formData.emil"
class="contactInput mt-[15px] md:ml-[30px] md:mt-[30px] w-full md:w-[700px]" type="text"
placeholder="请输入您的邮箱" />
</div>
<div class="relative mt-4 md:mt-8 w-full md:w-[1200px]">
<textarea
v-model="formData.message"
id="myTextarea"
placeholder="为了更好地帮助您,请尽量提供详细的信息"
rows="5"
maxlength="100"
class="w-full md:w-[1200px]"
></textarea>
<button
type="submit"
class="contactBut"
>
{{ '提交' }}
</button>
</div>
</form>
<div class="relative mt-4 md:mt-8 w-full md:w-[1200px]">
<textarea v-model="formData.message" id="myTextarea" placeholder="为了更好地帮助您,请尽量提供详细的信息" rows="5"
maxlength="100" class="w-full md:w-[1200px]"></textarea>
<button type="submit" class="contactBut">
{{ '提交' }}
</button>
</div>
</form>
</div>
</div>
<div v-if="videoShow" class="pop" style="display: block;">
<div class="abs popCont pop_video_cont">
<a @click="videoShow = false" class="abs pop_video_close closePop"></a>
<video x5-playsinline="" playsinline="" webkit-playsinline="" preload=""
x5-video-orientation="portraint" controls="" autoplay src="public/img/222.mp4"
draggable="true"></video>
</div>
</div>
</div>
@ -448,10 +407,10 @@
import { Swiper, SwiperSlide } from 'swiper/vue'
import { nextTick, ref } from 'vue'
import 'swiper/css'
import { Autoplay, Navigation, Pagination, Scrollbar, A11y, EffectCoverflow,EffectFade } from "swiper/modules";
import { Autoplay, Navigation, Pagination, Scrollbar, A11y, EffectCoverflow, EffectFade } from "swiper/modules";
import ScrollReveal from 'scrollreveal';
import { NNumberAnimation } from 'naive-ui'
let modules = [Autoplay, A11y, EffectCoverflow,EffectFade];
let modules = [Autoplay, A11y, EffectCoverflow, EffectFade];
import "swiper/css";
import "swiper/css/navigation";
@ -467,13 +426,22 @@ import { useI18n } from 'vue-i18n'
import { useStore } from '~/store'
const { locale } = useI18n()
const typeId = ref(1);
const openType = (type) => {
console.log(type);
typeId.value = type;
}
const videoShow = ref(false)
let newsSwiper: any = null
const onSwiperNews = (swiper: any) => {
newsSwiper = swiper
}
const swiperOptionsNews = {
autoplay: {
delay: 5000,
delay: 4000,
disableOnInteraction: false,
},
direction: 'horizontal',
@ -481,7 +449,7 @@ const swiperOptionsNews = {
speed: 500,
effect: 'fade',
loop: true,
modules: [EffectFade,Autoplay,Navigation],
modules: [EffectFade, Autoplay, Navigation],
navigation: {
nextEl: '#swipen_prev',
prevEl: '#swipen_next',
@ -501,15 +469,19 @@ const swiper_exp = ref();
const activeSlideIndex = ref(0);
//
const formData = reactive({
name: '',
mobile: '',
emil:'',
message: ''
name: '',
mobile: '',
emil: '',
message: ''
})
//
onMounted(() => {
getIndexNews();
nextTick(() => {
animate()
// ScrollReveal
setTimeout(() => {
animate()
}, 500)
})
})
// const numberAnimationInstRef = ref()
@ -519,6 +491,16 @@ onMounted(() => {
const animate = () => {
const sr = ScrollReveal();
sr.reveal('.leftBoxTop', {
origin: "left",
distance: "1000px",
duration: 1300,
delay: 100,
opacity: 0,
scale: 0.9,
reset: true,
mobile: true,
})
sr.reveal('.leftBox', {
origin: "left",
distance: "1000px",
@ -575,58 +557,72 @@ const animate = () => {
// numberAnimationInstRefHY.value.play()
},
})
sr.reveal('.topSj', {
sr.reveal('.group_29 ', {
origin: "bottom",
distance: "1000px",
duration: 1300,
delay: 5,
distance: "500px",
opacity: 0,
scale: 0.9,
reset: true,
reset: false,
mobile: true,
useDelay: 'always',
interval: 50,
})
}
//
const submitForm = () => {
console.log(formData);
//
if (!formData.name) {
alert('请输入您的姓名')
return
}
if (!formData.mobile) {
alert('请输入您的手机号码')
return
}
if (!formData.message) {
alert('请输入您的留言内容')
return
}
$api.post("/api/home.leave_word/add" , formData)
console.log(formData);
//
if (!formData.name) {
alert('请输入您的姓名')
return
}
if (!formData.mobile) {
alert('请输入您的手机号码')
return
}
if (!formData.message) {
alert('请输入您的留言内容')
return
}
$api.post("/api/home.leave_word/add", formData)
.then((res: any) => {
console.log(res)
if(res.status == 200){
alert('留言成功')
}else{
alert('失败')
}
formData.name = '';
formData.mobile = '';
formData.emil = '';
formData.message = '';
if (res.status == 200) {
alert('留言成功')
} else {
alert('失败')
}
formData.name = '';
formData.mobile = '';
formData.emil = '';
formData.message = '';
})
.catch((err) => {
console.dir(err)
})
//
// formData.name = ''
// formData.mobile = ''
// formData.content = ''
//
// formData.name = ''
// formData.mobile = ''
// formData.content = ''
}
const newsList = ref([])
const getIndexNews = () => {
$api.get("/api/home.news/index?page=1&limit=3")
.then((res: any) => {
console.log(res)
newsList.value = res.data.data.list
})
.catch((err) => {
console.dir(err)
})
}
const retTime = (dateTimeStr) => {
return dateTimeStr.split(' ')[0]; //
}
const openUrl = (id) => {
window.open(`/info/${id}`)
}
</script>
@ -643,74 +639,156 @@ const submitForm = () => {
}
.group_666 .swiper-slide img {
width: 100%;
height: 500px;
height: auto;
transition: 1s linear 2s;
transform: scale(1.1, 1.1);
width: 100%;
height: 500px;
height: auto;
transition: 1s linear 2s;
transform: scale(1.1, 1.1);
}
.group_666 .swiper-slide-active img,
.swiper-slide-duplicate-active img {
transition: 6s linear;
transform: scale(1, 1);
transition: 6s linear;
transform: scale(1, 1);
}
.bottom_imgs{
.bottom_imgs {
background: url(/public/img/qall.png);
width: 1230px;
height: 272px;
background-size: 100%;
background-size: 100%;
}
.content_box{
background: url(/public/img/m1.png);;
width: 561px;height: 521px;
.content_box {
background: url(/public/img/m1.png);
width: 561px;
height: 521px;
z-index: 1;
position: absolute;
right: -12px;
bottom: -13px;
background-size: 100%;
right: -12px;
bottom: -13px;
background-size: 100%;
}
.contactForm{
.contactForm {
width: 100%;
.inputform{
.inputform {
display: flex;
justify-content: center;
align-items: center;
width: 1200px;
}
}
.contactInput{
.contactInput {
width: 380px;
height: 50px;
background: #FFFFFF;
border-radius: 6px 6px 6px 6px;
padding-left: 20px;
height: 50px;
background: #FFFFFF;
border-radius: 6px 6px 6px 6px;
padding-left: 20px;
}
.contactInput::placeholder {color: #768597; }
.contactInput:focus {outline: none;}
#myTextarea{
.contactInput::placeholder {
color: #768597;
}
.contactInput:focus {
outline: none;
}
#myTextarea {
width: 1200px;
height: 167px;
background: #FFFFFF;
border-radius: 6px 6px 6px 6px;
opacity: 0.8;
padding-left: 20px;padding-top: 20px;
padding-left: 20px;
padding-top: 20px;
resize: none;
}
#myTextarea::placeholder {color: #768597; }
#myTextarea:focus {outline: none;}
.char-count {position: absolute;bottom: 5px; /* 根据需要调整距离底部的位置 */right: 10px; /* 根据需要调整距离右侧的位置 */font-size: 12px; /* 根据需要调整字体大小 */color: #A8CBFF;}
@media (max-width: 768px) {
.contactInput {
font-size: 18px;
height: 40px;
}
#myTextarea::placeholder {
color: #768597;
}
.contactBut{width: 108px;
#myTextarea:focus {
outline: none;
}
.char-count {
position: absolute;
bottom: 5px;
/* 根据需要调整距离底部的位置 */
right: 10px;
/* 根据需要调整距离右侧的位置 */
font-size: 12px;
/* 根据需要调整字体大小 */
color: #A8CBFF;
}
@media (max-width: 768px) {
.contactInput {
font-size: 18px;
height: 40px;
}
}
.contactBut {
width: 108px;
border-radius: 4px 4px 4px 4px;
position: absolute;
bottom: 20px;
right: 30px;
height: 36px; background-color: #222222; border: none; font-weight: 400;font-size: 16px;line-height: 28px;color: #FFFFFF;}
position: absolute;
bottom: 20px;
right: 30px;
height: 36px;
background-color: #222222;
border: none;
font-weight: 400;
font-size: 16px;
line-height: 28px;
color: #FFFFFF;
}
.pop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .8);
z-index: 200;
display: none;
}
.popCont {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.pop_video_close {
border-radius: 50%;
position: absolute;
top: 0;
right: -75px;
width: 50px;
height: 50px;
background: url('/public/img/close.png') no-repeat 0 0;
background-size: 100% auto;
border: 6px solid #979797;
}
.pop_video_cont {
width: 600px;
border: 6px solid #979797;
background: #000;
}
.pop_video_cont video {
display: block;
width: 100%;
height: 100%;
}
strong{
}
</style>

72
pages/info/[id].vue Normal file
View File

@ -0,0 +1,72 @@
<template>
<div style="width: 100%;">
<div style="height:71px;background-color: #ffffff;"></div>
<div style="background-color: #F8F8F8;padding: 30px;">
<div style="width: 60%;min-height: 500px;margin: 0 auto;background-color: #ffffff;padding: 30px;">
<div style="font-size: 32px;font-weight: 700;color: #323232;">{{ info.title }}</div>
<div style="font-size: 14px;font-weight: 400;margin-top: 30px;color: #768597;">
<span>发布人{{ info.author }}</span>
<span style="margin-left: 150px;">发布时间{{ info.release_time_text }} </span>
</div>
<div style="width: 98%;margin: 20px auto;height: 1px;background-color: #EEEEEE;"></div>
<div class="info_content" v-html="info.content"></div>
<div style="width: 98%;margin: 20px auto;height: 1px;background-color: #EEEEEE;"></div>
<div style="display: flex;justify-content: space-between;align-items: center;">
<div>
<div @click="openNews(1)" style="cursor: pointer;">上一篇{{info.prev!=null?info.prev.title:'暂无'}}</div>
<div @click="openNews(2)" style="margin-top: 20px;cursor: pointer;">下一篇{{info.next!=null?info.next.title:'暂无'}}</div>
</div>
<div @click="delWeb">
<div
style="color: #999999;;cursor: pointer;;border: 1px solid #999999;width: 108px;height: 40px;line-height: 40px;text-align: center;">
返回列表</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { nextTick, ref } from 'vue'
const route = useRoute()
import $api from '@/service/webRequest'
import { Item } from 'ant-design-vue/es/menu'
const id = ref(route.params.id)
const openNews = (type) => {
if (type == 1 && info.value.prev != null) {
window.open('/info/' + info.value.prev.id, '_self');
}
if (type == 2 && info.value.next != null) {
window.open('/info/' + info.value.next.id, '_self');
}
}
//
onMounted(() => {
getInfo();
})
const info = ref({});
const getInfo = async () => {
const res = await $api.get('/api/home.news/detail?id=' + id.value)
console.log(res);
info.value = res.data.data;
}
const delWeb = () => {
window.close();
}
</script>
<style lang="scss">
@import "@/assets/animate/animate.min.css";
@import "@/assets/index.css";
.info_content img {
width: 80% !important;
margin: 0 auto;
margin-bottom: 10px;
}
.info_content {
line-height: 35px;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;overflow: hidden;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 600px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/service.png" style="width: 100%;">
@ -38,7 +38,7 @@
<div style="background-color: #0256FF;width:40%;height: 8px;margin: 0 auto;"></div>
</div>
</div>
<div class="service-01" style="text-align: center;padding-top: 30px;z-index: 30;">
<div class="service-01" style="text-align: center;padding-top: 70px;z-index: 30;">
<div style="font-size: 34px;font-weight: 700;">AI应用定制化开发</div>
<div style="color: #768597;font-size: 16px;margin-top: 30px;">精准赋能行业创新深度定制AI解决方案驱动企业智能升级</div>
</div>
@ -52,7 +52,7 @@
<div style="font-size: 18px;font-weight: 700;margin-left: 10px;">项目介绍和业务描述</div>
</div>
<div class="reveal-left"
style="margin-top: 30px;font-size: 14px;font-weight: 400;color: #768597;">
style="line-height: 24px;margin-top: 20px;font-size: 14px;font-weight: 400;color: #768597;">
我们紧跟人工智能发展浪潮专注于AI技术的应用与落地无论是将先进的AI模(DeepSeek进行本地化部署以满足特定场景需求还是根据您的独特业务挑战开发定制化的AI应用程序我们都能提供从模型选型数据处理算法优化到应用集成与部署的全栈服务针对金融医疗教育等行业定制预训练微调模型与专用知识库模板提供开箱即用的解决方案
</div>
<div
@ -154,7 +154,7 @@
</div>
<div style="color: #222222;font-size: 18px;font-weight: 700;margin-left: 10px;">项目介绍和业务描述</div>
</div>
<div style="margin-top: 30px;font-size: 14px;font-weight: 400;color: #768597;">
<div style="line-height: 24px;margin-top: 20px;font-size: 14px;font-weight: 400;color: #768597;">
我们专注于提供全方位的定制化软件开发服务满足您多样化的业务需求无论是面向特定群体的活动平台"多样青春项目"功能完善的电子商务系统"商城项目"互动性强的活动应用"健身打卡活动项目"还是便捷高效的组织管理工具"协会小程序项目"我们的团队都能运用主流技术栈和敏捷开发模式为您打造用户体验出色性能稳定可靠的Web应用移动App及小程序驱动业务创新
</div>
<div
@ -181,7 +181,7 @@
<div style="color: #768597;font-size: 16px;margin-top: 15px;">承接客户网站及应用系统的全面安全防护项目</div>
</div>
<div
style="display: flex;flex-direction: row;align-items: center;justify-content: center;width: 100%;gap: 30px;margin-top: 30px;">
style="display: flex;flex-direction: row;align-items: center;justify-content: center;width: 100%;gap: 30px;margin-top: 40px;">
<div class="service-yw" style="position: relative;">
<img src="public/img/service_029.png" style="width:275px;">
<div style="position: absolute;bottom: 0px;left: 0px;width: 100%;height: 100%;padding: 30px;">
@ -217,11 +217,11 @@
</div>
</div>
<div class="service_033" style="padding-top: 60px;z-index: 30;">
<div style="text-align: center;padding-top: 30px;z-index: 30;">
<div style="text-align: center;padding-top: 10px;z-index: 30;">
<div style="font-size: 34px;font-weight: 700;">网络与信息安全</div>
<div style="color: #768597;font-size: 16px;margin-top: 15px;">专业守护数据防御威胁护航企业数字安全</div>
</div>
<div class="service-wl-a" style="display: flex;justify-content: center;gap: 30px;margin-top: 30px;">
<div class="service-wl-a" style="display: flex;justify-content: center;gap: 30px;margin-top: 40px;">
<div class="service-wl">
<div style="position: absolute;">
<img src="public/img/service_034.png" style="width:100%;height: 100%;">
@ -312,7 +312,7 @@
</div>
</div>
<div style="padding-top: 50px;z-index: 30;background-color: #ffffff;height: 715px;">
<div style="text-align: center;padding-top: 30px;z-index: 30;">
<div style="text-align: center;padding-top: 20px;z-index: 30;">
<div style="font-size: 34px;font-weight: 700;">智慧化解决方案</div>
<div style="color: #768597;font-size: 16px;margin-top: 15px;">利用物联网大数据人工智能等前沿技术为不同场景提供一体化的智慧化解决方案
</div>
@ -567,7 +567,7 @@
</div>
</div>
<div class="service_051" style="z-index: 30;">
<div style="width: 80%;">
<div style="width: 100%;">
<div class="service-02">
<div style="font-size: 34px;font-weight: 700;">硬件基础设施建设</div>
<div style="font-size: 16px;margin-top: 30px;">提供从需求分析方案设计设备选型综合布线到安装调试环境监控的全流程服务</div>
@ -1057,9 +1057,7 @@ const swiperOptionsNews = {
//
onMounted(() => {
nextTick(() => {
animate()
})
})
const animate = () => {
const sr = ScrollReveal();
@ -1166,7 +1164,7 @@ const animate = () => {
width: 100%;
height: 100%;
background-size: 100%;
height: 800px;
height: 770px;
}
.service_bottom {
@ -1193,7 +1191,7 @@ const animate = () => {
/* 强制固定 3 列 */
gap: 20px;
max-width: 715px;
margin: 80px 0px 0px 250px;
margin: 40px 0px 0px 367px;
}
.service-item {
@ -1280,12 +1278,12 @@ const animate = () => {
margin: 0 auto;
width: 62%;
position: relative;
margin-top: 30px
margin-top: 40px
}
.service-02 {
text-align: center;
padding-top: 30px;
padding-top: 70px;
z-index: 30;
color: #ffffff;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 600px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/societyduty/shehui.png" style="width: 100%;">
@ -31,7 +31,7 @@
<div class="text-wrapper_11">
<span class="text_42">Company&nbsp;Honors&nbsp;</span>
</div> -->
<div class="group_14 flex-row justify-between align-center" style="flex-wrap: wrap;width: 1200px;">
<div class="group_14 flex-row justify-between align-center" style="flex-wrap: wrap;width: 1200px;padding-top: 30px;">
<div class="flex-row">
<div class="text_25">
<span>
@ -43,7 +43,7 @@
<div class="text_25">
<span style="color: rgb(252, 116, 40);">活动影集部分</span>
<div
style="width: 100%;height: 1px;background-color: #fc7428;position: absolute;bottom: -21px;">
style=" left: 20px;width: 100%;height: 1px;background-color: #fc7428;position: absolute;bottom: -21px;">
</div>
</div>
@ -251,16 +251,16 @@ const animate = () => {
.bottom_imgss{
// background: url(/public/img/customer/bg-s.png);
background: #F8F8F8;
width: 1920px;
height: 1047px;
// background-size: 100%;
}
.boxgs{
width: 1300px;
width: 1200px;
margin: 0 auto;
margin-top: 30px;
padding-top: 20px;
.box_con{
margin:20px;
margin:10px;
background-color: #ffffff;
width: 277px;
height: 276px;

View File

@ -1,7 +1,7 @@
<template>
<div style="width: 100%;">
<!-- Swiper 容器 -->
<div class="group_666" style="position: relative;">
<div class="group_666" style="position: relative;height: 600px;">
<swiper class="swiper-container h-full" @swiper="onSwiperNews" v-bind="swiperOptionsNews">
<swiper-slide>
<img src="public/img/societyduty/shehui.png" style="width: 100%;">
@ -31,7 +31,7 @@
<div class="text-wrapper_11">
<span class="text_42">Company&nbsp;Honors&nbsp;</span>
</div> -->
<div class="group_14 flex-row justify-between align-center" style="flex-wrap: wrap;width: 1200px;">
<div class="group_14 flex-row justify-between align-center" style="flex-wrap: wrap;width: 1200px;padding-top: 30px;">
<div class="flex-row">
<div class="text_25">
<span style="color: rgb(252, 116, 40);">公司动态</span>
@ -40,9 +40,11 @@
</div>
</div>
<div class="text_25">
<span >活动影集部分</span>
<NuxtLink to="/societyDuty/">
<span>活动影集部分</span>
</NuxtLink>
</div>
</div>
<!-- <div class="flex-row justify-center align-center">
<div style="margin-right: 10px;">
@ -54,43 +56,84 @@
</div> -->
<div class="group_15" style="flex: 0 0 100%;"></div>
</div>
<div class="boxgs flex-row flex-wrap">
<div class="boxgs_top">
<div></div>
<div>
<div class="boxgs flex-row flex-wrap">
<div class="boxgs_top" style="display: flex;align-items: center;justify-content: center;">
<div style="position: relative;cursor: pointer;" @click="videoShow = true">
<img src="public/img/societyduty/det.png" style="width: 500px;height: 325px;">
<img src="public/img/societyduty/bf.png"
style="width: 50px;height: 50px;position: absolute;top: 45%;left: 0;right: 0;margin: 0 auto;">
</div>
<div style="width: 53%;padding-left: 30px;">
<div style="font-size: 24px;color: #3D3D3D;font-weight: 700;">青年企业家岳崇霄:招商引智为洛阳注入创新活水</div>
<div style="color: #FC7428;font-size: 14px;font-weight: 900;margin: 20px 0px;">灵睿网络创始人岳崇霄</div>
<div style="font-size: 14px;font-weight: 400;color: #3D3D3D;">
<div>岳崇霄2020年4月荣获2020年全国向上向善好青年扶贫助困好青年 </div>
<div>洛阳灵睿网络技术有限公司 创始人</div>
<div>河南灵睿科技集团有限公司 董事长</div>
<div>
河南省青联委员河南省青年企业家协会理事河南省青少年新媒体协会理事洛阳市青联常委洛阳市青年企业家协会副会长洛阳市党外知识分子联谊会副秘书长洛阳市青年文艺联合会副秘书长洛阳市郑州商会副会长涧西区党外知识分子联谊会副会长洛阳师范学院客座教授
洛阳职业技术学院客座教授</div>
</div>
<div style="margin-top: 20px;">
<div
style="cursor: pointer;;line-height: 36px;text-align: center;width: 109px;height: 36px;background: #222222;color: #ffffff;">
查看详情</div>
</div>
</div>
</div>
<div class="box_con flex-row" v-for="(item,index) in lists" :key="index">
<div class="align-center" style="justify-content: center;">
<img width="277px" height="189px" :src="`/img/societyduty/s${index+1}.png`" alt="">
<div class="box_con flex-row" v-for="(item, index) in newList" :key="index" @click="openNewInfo(item)">
<div class="align-center" style="padding-left: 20px;">
<img :src="item.image" style="height: 180px;width: 250px;object-fit: cover;border-radius: 8px;">
</div>
<div class="flex-col" style="justify-content: center;margin-top: 5px;">
<span class="text_tt">
{{item.title}}
</span>
<span class="text_cc">
{{item.title}}
</span>
<div class="flex-col" style="margin-top: 5px;width: 75%;padding-left: 20px;position: relative;">
<div class="text_tt">
{{ item.title }}
</div>
<div class="text_cc three-line-ellipsis">
{{ item.subtitle }}
</div>
<div
style="display: flex;justify-content: space-between;align-items: center;position: absolute;bottom: 20px;width: 98%;">
<div style="font-size: 14px;">发布日期{{ timeDateMy(item.release_time_text) }}</div>
<div style="font-size: 14px;color: #FC7428;display: flex;align-items: center;">
<div>查看详情</div>
<div style="margin-left: 10px;">
<img src="public/img/societyduty/r.png" alt="">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="flex flex-row justify-center py-5" style="background-color: #F8F8F8;padding-bottom: 40px;">
<n-pagination v-model:page="page" :page-sizes="[10]" :item-count="total" size="large"
@update:page="getPageList">
</n-pagination>
</div>
<div v-if="videoShow" class="pop" style="display: block;">
<div class="abs popCont pop_video_cont">
<a @click="videoShow = false" class="abs pop_video_close closePop"></a>
<video x5-playsinline="" playsinline="" webkit-playsinline="" preload=""
x5-video-orientation="portraint" controls="" autoplay src="public/img/yue.mp4"
draggable="true"></video>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { NPagination } from 'naive-ui'
import { Swiper, SwiperSlide } from 'swiper/vue'
import { nextTick, ref } from 'vue'
import 'swiper/css'
import { Autoplay, Navigation, Pagination, Scrollbar, A11y, EffectCoverflow,EffectFade } from "swiper/modules";
import { Autoplay, Navigation, Pagination, Scrollbar, A11y, EffectCoverflow, EffectFade } from "swiper/modules";
import ScrollReveal from 'scrollreveal';
import { NNumberAnimation } from 'naive-ui'
let modules = [Autoplay, A11y, EffectCoverflow,EffectFade];
let modules = [Autoplay, A11y, EffectCoverflow, EffectFade];
import "swiper/css";
import "swiper/css/navigation";
@ -106,6 +149,8 @@ import { useI18n } from 'vue-i18n'
import { useStore } from '~/store'
const { locale } = useI18n()
const videoShow = ref(false);
let newsSwiper: any = null
const onSwiperNews = (swiper: any) => {
newsSwiper = swiper
@ -120,31 +165,45 @@ const swiperOptionsNews = {
speed: 500,
effect: 'fade',
loop: true,
modules: [EffectFade,Autoplay,Navigation],
modules: [EffectFade, Autoplay, Navigation],
navigation: {
nextEl: '#swipen_prev',
prevEl: '#swipen_next',
},
}
let vesSwiper: any = null
const onSwiperExp = (swiper: any) => {
vesSwiper = swiper
const openNewInfo = (item) => {
window.open(`/info/${item.id}`)
}
const swiper_exp = ref();
const lists = ref([
{title: '21年西工硅巷青创加速营仪式开营'},
{title: '21年西工硅巷青创加速营活动进行中'},
{title: '香港青英会15 周年、第16 届执委会暨第7屆理事会就职仪式'},
{title: '青年企业家助力河南高质量发展暨河南青年创新创业论坛'},
]);
//
onMounted(() => {
nextTick(() => {
animate()
})
animate()
getNewsList();
})
const timeDateMy = (dateStr) => {
const date = new Date(dateStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0
const day = String(date.getDate()).padStart(2, '0');
return `${year}.${month}.${day}`;
}
const page = ref(1);
const total = ref(0);
const getPageList = async () => {
page.value = page.value + 1;
getNewsList();
}
const newList = ref([]);
const getNewsList = async () => {
const res = await $api.post('/api/home.news/index', {
limit: 10,
page: page.value,
})
total.value = res.data.data.count;
newList.value = res.data.data.list;
}
const numberAnimationInstRef = ref()
const numberAnimationInstRefKH = ref()
const numberAnimationInstRefJS = ref()
@ -227,65 +286,92 @@ const animate = () => {
@import "@/assets/animate/animate.min.css";
@import "@/assets/index.css";
::v-deep .n-pagination .n-pagination-item:not(.n-pagination-item--disabled).n-pagination-item--active {
color: #ffffff;
background-color: #FC7428;
border: 1px solid #FC7428;
}
::v-deep .n-pagination .n-pagination-item:not(.n-pagination-item--disabled):hover.n-pagination-item--button {
color: #FC7428;
}
::v-deep .n-pagination .n-pagination-item:not(.n-pagination-item--disabled):hover {
color: #FC7428;
border: 1px solid #FC7428;
}
::v-deep .n-pagination .n-pagination-item {
border: 1px solid #999999;
}
.group_666 .swiper-slide img {
width: 100%;
height: 500px;
height: auto;
transition: 1s linear 2s;
transform: scale(1.1, 1.1);
width: 100%;
height: 500px;
height: auto;
transition: 1s linear 2s;
transform: scale(1.1, 1.1);
}
.group_666 .swiper-slide-active img,
.swiper-slide-duplicate-active img {
transition: 6s linear;
transform: scale(1, 1);
transition: 6s linear;
transform: scale(1, 1);
}
.bottom_imgss{
.bottom_imgss {
// background: url(/public/img/customer/bg-s.png);
background: #F8F8F8;
width: 1920px;
height: 1047px;
// background-size: 100%;
// background-size: 100%;
}
.boxgs{
width: 1200px;
margin: 0 auto;
.boxgs {
width: 1200px;
margin: 0 auto;
margin-top: 30px;
.boxgs_top{
background: url(/img/societyduty/newstop.png) 100% 100% no-repeat;
width: 100%;height: 385px;border: 1px solid #FC7428;border-radius: 24px;
.boxgs_top {
background: url(/img/societyduty/newstop.png) 100% 100% no-repeat;
width: 100%;
height: 385px;
border: 1px solid #FC7428;
border-radius: 24px;
margin-top: 30px;
}
.box_con{
margin:20px;
.box_con {
margin: 20px;
background-color: #ffffff;
width: 100%;
height: 220px;
font-family: Microsoft YaHei UI-Regular;
border-radius:4px;
.text_tt{
display: inline-block;
border-radius: 4px;
.text_tt {
font-size: 22px;
width: 100%;
margin-top: 15px;
color: #3D3D3D ;
font-size: 16px;
font-weight: 500;
text-align: center;
padding: 0 25px 20px 25px;
color: #3D3D3D;
font-weight: 700;
}
.text_cc{
display: inline-block;
.text_cc {
width: 100%;
height: 30px;
overflow-wrap: break-word;
color: #999999 ;
color: #768597;
font-size: 14px;
font-weight: 400;
text-align: center;
line-height: 30px;
margin-top: 20px;
}
&:hover {
cursor: pointer;
box-shadow: 0 0 10px rgba(252, 116, 40, 0.5);
transition: all 0.3s ease;
border-radius: 8px;
//
transform: scale(1.05);
}
}
}
</style>

62
plugins/cdn-image.ts Normal file
View File

@ -0,0 +1,62 @@
// 插件用于处理静态生成模式下的图片CDN路径
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin(() => {
// CDN基础URL
const cdnBaseUrl = 'https://cdn.web.0rui.cn/'
// 创建一个全局方法用于转换图片路径
return {
provide: {
// 转换图片路径为CDN路径
cdnImage: (path: string) => {
// 如果路径已经是完整的URL则直接返回
if (path.startsWith('http://') || path.startsWith('https://')) {
return path
}
// 判断是否为图片资源
const isImage = /\.(jpg|jpeg|png|gif|svg|webp)$/i.test(path)
if (!isImage) {
return path // 非图片资源直接返回原路径
}
// 处理以public开头的路径
if (path.startsWith('public/')) {
return `${cdnBaseUrl}${path.replace('public/', '')}`
}
// 处理以/public开头的路径
if (path.startsWith('/public/')) {
return `${cdnBaseUrl}${path.replace('/public/', '')}`
}
// 处理以img/开头的路径
if (path.startsWith('img/')) {
return `${cdnBaseUrl}${path}`
}
// 处理以/img开头的路径
if (path.startsWith('/img/')) {
return `${cdnBaseUrl}${path.substring(1)}`
}
// 处理以_nuxt开头的路径
if (path.startsWith('/_nuxt/')) {
// 提取_nuxt后面的路径部分
const pathWithoutPrefix = path.replace('/_nuxt/', '')
// 如果路径包含img/,保留该结构
if (pathWithoutPrefix.includes('img/')) {
return `${cdnBaseUrl}${pathWithoutPrefix}`
} else {
// 否则添加img/前缀
return `${cdnBaseUrl}img/${pathWithoutPrefix}`
}
}
// 其他情况直接拼接CDN基础URL和路径
return `${cdnBaseUrl}img/${path}`
}
}
}
})

BIN
public/img/1212.mp4 Normal file

Binary file not shown.

BIN
public/img/222.mp4 Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 3.6 MiB

BIN
public/img/banner2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 KiB

BIN
public/img/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/img/con_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

BIN
public/img/con_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/img/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 327 KiB

BIN
public/img/media/a1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
public/img/media/a2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
public/img/media/a3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
public/img/media/a4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
public/img/media/a5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
public/img/media/b1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

BIN
public/img/media/b2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 KiB

BIN
public/img/media/b3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

BIN
public/img/media/b4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

BIN
public/img/media/buttom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
public/img/media/left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/img/media/v1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
public/img/media/v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
public/img/media/v3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
public/img/media/v4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

BIN
public/img/yue.mp4 Normal file

Binary file not shown.

100
scripts/build-static.js Normal file
View File

@ -0,0 +1,100 @@
// 静态生成构建脚本
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
// CDN基础URL
const CDN_BASE_URL = 'https://cdn.web.0rui.cn/';
// 输出目录
const OUTPUT_DIR = path.resolve(__dirname, '../.output/public');
// 执行静态生成
console.log('开始执行静态生成...');
try {
// 执行nuxt generate命令
execSync('npm run generate', { stdio: 'inherit' });
console.log('静态生成完成!');
// 检查输出目录是否存在
if (!fs.existsSync(OUTPUT_DIR)) {
console.error('错误:输出目录不存在!');
process.exit(1);
}
console.log('开始处理HTML文件中的图片路径...');
// 递归处理目录中的所有HTML文件
processDirectory(OUTPUT_DIR);
console.log('所有HTML文件处理完成');
console.log(`静态网站已生成到: ${OUTPUT_DIR}`);
console.log('可以使用 npm run preview 预览生成的静态网站');
} catch (error) {
console.error('构建过程中发生错误:', error);
process.exit(1);
}
/**
* 递归处理目录中的所有HTML文件
* @param {string} dir 目录路径
*/
function processDirectory(dir) {
const files = fs.readdirSync(dir);
for (const file of files) {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
// 递归处理子目录
processDirectory(filePath);
} else if (file.endsWith('.html')) {
// 处理HTML文件
processHtmlFile(filePath);
}
}
}
/**
* 处理HTML文件中的图片路径
* @param {string} filePath HTML文件路径
*/
function processHtmlFile(filePath) {
console.log(`处理文件: ${path.relative(OUTPUT_DIR, filePath)}`);
let content = fs.readFileSync(filePath, 'utf8');
// 替换HTML中的图片路径
// 匹配 src="public/img/xxx.png" 模式
content = content.replace(/src=\"(public\/img\/[^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1.replace('public/', '')}\"`;
});
// 匹配 src=\"/public/img/xxx.png\" 模式
content = content.replace(/src=\"(\/public\/img\/[^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1.replace('/public/', '')}\"`;
});
// 匹配 src=\"/img/xxx.png\" 模式
content = content.replace(/src=\"(\/img\/[^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1.replace('/img/', '')}\"`;
});
// 匹配 src=\"img/xxx.png\" 模式
content = content.replace(/src=\"(img\/[^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1.replace('img/', '')}\"`;
});
// 移除_nuxt前缀的图片路径
content = content.replace(/src=\"\/_nuxt\/img\/([^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1}\"`;
});
// 匹配 src="/_nuxt/assets/images/xxx.png" 模式
content = content.replace(/src=\"\/_nuxt\/assets\/images\/([^\"]+)\"/g, (match, p1) => {
return `src=\"${CDN_BASE_URL}${p1}\"`;
});
fs.writeFileSync(filePath, content, 'utf8');
}