更新项目,修改了多个页面并新增了一些功能
This commit is contained in:
parent
4307c1c594
commit
7c1d504cf0
@ -34,17 +34,17 @@
|
|||||||
<!-- Drawer Menu -->
|
<!-- Drawer Menu -->
|
||||||
<div v-if="isMenuChecked" class="drawer-menu" ref="drawerMenu">
|
<div v-if="isMenuChecked" class="drawer-menu" ref="drawerMenu">
|
||||||
<ul class="navbar-list2">
|
<ul class="navbar-list2">
|
||||||
<nuxt-link to="/home">
|
<nuxt-link :class="{ active: isActive('/home') }" to="/home">
|
||||||
<li>首页</li>
|
<li>首页</li>
|
||||||
</nuxt-link>
|
</nuxt-link>
|
||||||
<nuxt-link to="/calculatePrice">
|
<nuxt-link :class="{ active: isActive('/calculatePrice') }" to="/calculatePrice">
|
||||||
<li>AWS价格计算</li>
|
<li>AWS价格计算</li>
|
||||||
</nuxt-link>
|
</nuxt-link>
|
||||||
<nuxt-link to="/aboutUs">
|
<nuxt-link :class="{ active: isActive('/aboutUs') }" to="/aboutUs">
|
||||||
<li>关于我们</li>
|
<li>关于我们</li>
|
||||||
</nuxt-link>
|
</nuxt-link>
|
||||||
<nuxt-link to="/contactUs">
|
<nuxt-link :class="{ active: isActive('/news') }" to="/news">
|
||||||
<li>联系我们</li>
|
<li>新闻资讯</li>
|
||||||
</nuxt-link>
|
</nuxt-link>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="drawer-menu-icon">
|
<div class="drawer-menu-icon">
|
||||||
@ -55,11 +55,11 @@
|
|||||||
<!-- Desktop Menu -->
|
<!-- Desktop Menu -->
|
||||||
<div v-else class="pc-menu">
|
<div v-else class="pc-menu">
|
||||||
<ul class="navbar-list">
|
<ul class="navbar-list">
|
||||||
<li><nuxt-link to="/home">首页</nuxt-link></li>
|
<li><nuxt-link :class="{ active: isActive('/home') }" to="/home">首页</nuxt-link></li>
|
||||||
<li><nuxt-link to="/calculatePrice">AWS价格计算</nuxt-link></li>
|
<li><nuxt-link :class="{ active: isActive('/calculatePrice') }" to="/calculatePrice">AWS价格计算</nuxt-link></li>
|
||||||
<li><img src="../assets/logo.png" alt="Buddy.com" class="logo" /></li>
|
<li><img src="../assets/logo.png" alt="Buddy.com" class="logo" /></li>
|
||||||
<li><nuxt-link to="/aboutUs">关于我们</nuxt-link></li>
|
<li><nuxt-link :class="{ active: isActive('/aboutUs') }" to="/aboutUs">关于我们</nuxt-link></li>
|
||||||
<li><nuxt-link to="/contactUs">联系我们</nuxt-link></li>
|
<li><nuxt-link :class="{ active: isActive('/news') }" to="/news">新闻资讯</nuxt-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -84,6 +84,9 @@ export default {
|
|||||||
...mapState({
|
...mapState({
|
||||||
isMenuChecked: (state) => state.isMenuChecked, // Get menu state from Vuex
|
isMenuChecked: (state) => state.isMenuChecked, // Get menu state from Vuex
|
||||||
}),
|
}),
|
||||||
|
currentPath() {
|
||||||
|
return this.$route.path;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
// Check if it's mobile
|
// Check if it's mobile
|
||||||
@ -97,6 +100,9 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(["toggleMenu"]), // Map Vuex action to toggle menu
|
...mapActions(["toggleMenu"]), // Map Vuex action to toggle menu
|
||||||
|
isActive(path) {
|
||||||
|
return this.currentPath === path;
|
||||||
|
},
|
||||||
handleResize() {
|
handleResize() {
|
||||||
this.isMobile = window.innerWidth <= 800; // Update mobile state
|
this.isMobile = window.innerWidth <= 800; // Update mobile state
|
||||||
},
|
},
|
||||||
@ -131,11 +137,14 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.navbar-list a {
|
.navbar-list a {
|
||||||
color: #ff6702;
|
color: #333333;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
|
/* 选中时变成橙色 */
|
||||||
|
.navbar-list li a.active {
|
||||||
|
color: #ff6702;
|
||||||
|
}
|
||||||
.navbar-list a:hover {
|
.navbar-list a:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: rgba(237, 97, 5, 0.7);
|
color: rgba(237, 97, 5, 0.7);
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import path from "path"; // ✅ 先引入 path 模块
|
||||||
export default {
|
export default {
|
||||||
// Global page headers: https://go.nuxtjs.dev/config-head
|
// Global page headers: https://go.nuxtjs.dev/config-head
|
||||||
head: {
|
head: {
|
||||||
@ -15,7 +16,9 @@ export default {
|
|||||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
serverMiddleware: [
|
||||||
|
{ path: "/api/news", handler: path.resolve(__dirname, "server/readNews.js") }
|
||||||
|
],
|
||||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||||
css: [
|
css: [
|
||||||
],
|
],
|
||||||
@ -30,11 +33,15 @@ export default {
|
|||||||
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
|
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
|
||||||
buildModules: [
|
buildModules: [
|
||||||
],
|
],
|
||||||
|
content: {
|
||||||
|
// ✅ 配置 Markdown 目录
|
||||||
|
dir: "static/news",
|
||||||
|
},
|
||||||
// Modules: https://go.nuxtjs.dev/config-modules
|
// Modules: https://go.nuxtjs.dev/config-modules
|
||||||
modules: [
|
modules: [
|
||||||
// https://go.nuxtjs.dev/bootstrap
|
// https://go.nuxtjs.dev/bootstrap
|
||||||
'bootstrap-vue/nuxt',
|
'bootstrap-vue/nuxt',
|
||||||
|
'@nuxt/content',
|
||||||
],
|
],
|
||||||
|
|
||||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||||
|
|||||||
1979
package-lock.json
generated
1979
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -9,13 +9,15 @@
|
|||||||
"generate": "nuxt generate"
|
"generate": "nuxt generate"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@nuxt/content": "^1.15.1",
|
||||||
"bootstrap": "^4.6.2",
|
"bootstrap": "^4.6.2",
|
||||||
"bootstrap-vue": "^2.22.0",
|
"bootstrap-vue": "^2.22.0",
|
||||||
"core-js": "^3.25.3",
|
"core-js": "^3.25.3",
|
||||||
|
"date-fns": "^4.1.0",
|
||||||
|
"gray-matter": "^4.0.3",
|
||||||
"nuxt": "^2.15.8",
|
"nuxt": "^2.15.8",
|
||||||
"vue": "^2.7.10",
|
"vue": "^2.7.10",
|
||||||
"vue-server-renderer": "^2.7.10",
|
"vue-server-renderer": "^2.7.10",
|
||||||
"vue-template-compiler": "^2.7.10"
|
"vue-template-compiler": "^2.7.10"
|
||||||
},
|
}
|
||||||
"devDependencies": {}
|
|
||||||
}
|
}
|
||||||
@ -84,6 +84,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<contactUs></contactUs>
|
||||||
<FooterMenu></FooterMenu>
|
<FooterMenu></FooterMenu>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -91,9 +92,9 @@
|
|||||||
<script>
|
<script>
|
||||||
import NavMenu from "../components/NavMenu.vue";
|
import NavMenu from "../components/NavMenu.vue";
|
||||||
import FooterMenu from "../components/FooterMenu.vue";
|
import FooterMenu from "../components/FooterMenu.vue";
|
||||||
|
import contactUs from "./contactUs.vue";
|
||||||
export default {
|
export default {
|
||||||
components: {NavMenu, FooterMenu}
|
components: {NavMenu, FooterMenu,contactUs},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -12,11 +12,11 @@
|
|||||||
<form action="https://formspree.io/f/mrbzdeeg" class="contact-form">
|
<form action="https://formspree.io/f/mrbzdeeg" class="contact-form">
|
||||||
<div class="contact-form-group">
|
<div class="contact-form-group">
|
||||||
<label for="name">昵称 <span> Enter your name </span></label>
|
<label for="name">昵称 <span> Enter your name </span></label>
|
||||||
<input type="text" id="name"/>
|
<input type="text" id="name" />
|
||||||
</div>
|
</div>
|
||||||
<div class="contact-form-group">
|
<div class="contact-form-group">
|
||||||
<label for="email">邮箱 <span> Enter your email </span></label>
|
<label for="email">邮箱 <span> Enter your email </span></label>
|
||||||
<input type="email" id="email"/>
|
<input type="email" id="email" />
|
||||||
</div>
|
</div>
|
||||||
<div class="contact-form-group">
|
<div class="contact-form-group">
|
||||||
<label for="message">留言 <span>Your message </span></label>
|
<label for="message">留言 <span>Your message </span></label>
|
||||||
@ -24,10 +24,31 @@
|
|||||||
</div>
|
</div>
|
||||||
<button type="submit" class="submit-button">发送</button>
|
<button type="submit" class="submit-button">发送</button>
|
||||||
</form>
|
</form>
|
||||||
<p class="response-text">我们将尽快给您回复 We will respond as soon as possible</p>
|
<p class="response-text">
|
||||||
|
我们将尽快给您回复 We will respond as soon as possible
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="footer-social">
|
||||||
|
<a :href="contactLinks.telegram" target="_blank">
|
||||||
|
<img src="../assets/icon/Send.png" alt="telegram" />
|
||||||
|
</a>
|
||||||
|
<a :href="contactLinks.phone" target="_blank">
|
||||||
|
<img src="../assets/icon/Phone.png" alt="phone" />
|
||||||
|
</a>
|
||||||
|
<a :href="contactLinks.wechat" target="_blank">
|
||||||
|
<img src="../assets/icon/Wexin.png" alt="wechat" />
|
||||||
|
</a>
|
||||||
|
<a :href="contactLinks.facebook" target="_blank">
|
||||||
|
<img src="../assets/icon/Facebook.png" alt="facebook" />
|
||||||
|
</a>
|
||||||
|
<a :href="contactLinks.email" target="_blank">
|
||||||
|
<img src="../assets/icon/Email.png" alt="email" />
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<FooterMenu v-if="isContactPage"></FooterMenu>
|
<FooterMenu v-if="isContactPage"></FooterMenu>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -35,25 +56,28 @@
|
|||||||
<script>
|
<script>
|
||||||
import NavMenu from "../components/NavMenu.vue";
|
import NavMenu from "../components/NavMenu.vue";
|
||||||
import FooterMenu from "../components/FooterMenu.vue";
|
import FooterMenu from "../components/FooterMenu.vue";
|
||||||
|
import { contactLinks } from "../static/js/contact_link.js";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
NavMenu,
|
NavMenu,
|
||||||
FooterMenu
|
FooterMenu,
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
// Use computed property to check if the current route is '/contactUs'
|
// Use computed property to check if the current route is '/contactUs'
|
||||||
isContactPage() {
|
isContactPage() {
|
||||||
return this.$route.path === '/contactUs';
|
return this.$route.path === "/contactUs";
|
||||||
}
|
},
|
||||||
}
|
contactLinks() {
|
||||||
|
return contactLinks;
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.contact-view-bg {
|
.contact-view-bg {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100vh;
|
min-height: 100vh;
|
||||||
background: url("../assets/back/ri.jpg") no-repeat;
|
background: url("../assets/back/ri.jpg") no-repeat;
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -61,12 +85,26 @@ export default {
|
|||||||
padding: 0 clamp(2rem, 10vw, 16rem);
|
padding: 0 clamp(2rem, 10vw, 16rem);
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
.footer-social img {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
.footer-social {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-self: end;
|
||||||
|
margin-bottom: 15%;
|
||||||
|
min-height: 58%;
|
||||||
|
}
|
||||||
.contact-form-container {
|
.contact-form-container {
|
||||||
background-color: rgba(255, 255, 255, 0.8); /* 半透明白色背景 */
|
background-color: rgba(255, 255, 255, 0.8); /* 半透明白色背景 */
|
||||||
padding: 40px;
|
padding: 40px;
|
||||||
width: 40%;
|
min-width: 30%;
|
||||||
|
max-width: 40%;
|
||||||
|
width: clamp(30%, 40vw, 40%);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
min-height: 58%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.contact-title {
|
.contact-title {
|
||||||
@ -159,6 +197,8 @@ export default {
|
|||||||
width: 90%;
|
width: 90%;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
height: 68%;
|
height: 68%;
|
||||||
|
min-width: 90%;
|
||||||
|
max-width: 90%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -360,8 +360,7 @@ export default {
|
|||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.homeView_leftBox_padding_top {
|
|
||||||
}
|
|
||||||
|
|
||||||
.textContainer {
|
.textContainer {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -481,7 +480,6 @@ export default {
|
|||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
//align-items: center;
|
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
@ -547,7 +545,6 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.service-process-main-title {
|
.service-process-main-title {
|
||||||
//display: block;
|
|
||||||
font-size: clamp(1.3rem, 2vw, 2rem);
|
font-size: clamp(1.3rem, 2vw, 2rem);
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
@ -743,9 +740,6 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.service-table {
|
.service-table {
|
||||||
//width: 100%;
|
|
||||||
//border-collapse: collapse;
|
|
||||||
//margin-top: 30px;
|
|
||||||
padding: 5% 0;
|
padding: 5% 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -201,12 +201,14 @@ export default {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
width: 40%;
|
width: 40%;
|
||||||
|
gap: 10px;
|
||||||
padding: 0 2%;
|
padding: 0 2%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcomeMessage-content-buttons button {
|
.welcomeMessage-content-buttons button {
|
||||||
background-color: #ff6702;
|
background-color: #ff6702;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
width: 50%;
|
width: 50%;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
|||||||
43
pages/news/_slug.vue
Normal file
43
pages/news/_slug.vue
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<template>
|
||||||
|
<div><NavMenu />
|
||||||
|
<div class="news-container">
|
||||||
|
<h1 class="news-title">{{ article.title }}</h1>
|
||||||
|
<p class="news-date">{{ article.category }}</p>
|
||||||
|
<nuxt-content :document="article" />
|
||||||
|
</div>
|
||||||
|
<FooterMenu />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import NavMenu from "../../components/NavMenu.vue";
|
||||||
|
import FooterMenu from "../../components/FooterMenu.vue";
|
||||||
|
export default {
|
||||||
|
async asyncData({ $content, params }) {
|
||||||
|
try {
|
||||||
|
// 读取 Markdown 文件内容
|
||||||
|
const article = await $content(params.slug).fetch();
|
||||||
|
return { article };
|
||||||
|
} catch (error) {
|
||||||
|
console.error("文章加载失败:",error);
|
||||||
|
return { article: null };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.news-container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 5rem 0;
|
||||||
|
}
|
||||||
|
.news-title {
|
||||||
|
font-size: 28px;
|
||||||
|
color: #ff6702;
|
||||||
|
}
|
||||||
|
.news-date {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
99
pages/news/index.vue
Normal file
99
pages/news/index.vue
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<NavMenu />
|
||||||
|
<div class="news-container">
|
||||||
|
<!-- 新闻标题 -->
|
||||||
|
<h2 class="news-title">新闻资讯</h2>
|
||||||
|
<p class="news-subtitle">New Voices in the Cloud, Intelligence at the Frontier.</p>
|
||||||
|
|
||||||
|
<!-- 新闻列表 -->
|
||||||
|
<ul class="news-list">
|
||||||
|
<li v-for="news in newsList" :key="news.slug" class="news-item">
|
||||||
|
<div class="news-date">{{ news.category }}</div>
|
||||||
|
<nuxt-link class="news-link" :to="'/news/' + news.slug">{{ news.title }}</nuxt-link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<FooterMenu />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import NavMenu from "../../components/NavMenu.vue";
|
||||||
|
import FooterMenu from "../../components/FooterMenu.vue";
|
||||||
|
export default {
|
||||||
|
components: { NavMenu, FooterMenu },
|
||||||
|
async asyncData({ $content }) {
|
||||||
|
try {
|
||||||
|
// 直接读取 `static/news/*.md` 目录下的所有文章
|
||||||
|
const newsList = await $content().sortBy("order", "asc").fetch();
|
||||||
|
return { newsList };
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching news:", error);
|
||||||
|
return { newsList: [] };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* 容器 */
|
||||||
|
.news-container {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 40px 20px;
|
||||||
|
text-align: center;
|
||||||
|
min-height: 50vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 标题 */
|
||||||
|
.news-title {
|
||||||
|
font-size: 28px;
|
||||||
|
color: #ff6702;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 副标题 */
|
||||||
|
.news-subtitle {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #777;
|
||||||
|
margin-bottom: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 新闻列表 */
|
||||||
|
.news-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 新闻项 */
|
||||||
|
.news-item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 12px 0;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 日期样式 */
|
||||||
|
.news-date {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #ff6702;
|
||||||
|
width: 150px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 新闻链接 */
|
||||||
|
.news-link{
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 悬停时变橙色 */
|
||||||
|
.news-link:hover {
|
||||||
|
color: #ff6702;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
52
server/readNews.js
Normal file
52
server/readNews.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import matter from "gray-matter";
|
||||||
|
|
||||||
|
// 兼容 Nuxt 2(serverMiddleware)和 Nuxt 3(defineEventHandler)
|
||||||
|
const handler = (req, res) => {
|
||||||
|
try {
|
||||||
|
const newsDirectory = path.resolve("static/news");
|
||||||
|
|
||||||
|
if (!fs.existsSync(newsDirectory)) {
|
||||||
|
throw new Error("News directory does not exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = fs.readdirSync(newsDirectory);
|
||||||
|
if (files.length === 0) {
|
||||||
|
throw new Error("No news files found");
|
||||||
|
}
|
||||||
|
|
||||||
|
const newsList = files.map((file) => {
|
||||||
|
const filePath = path.join(newsDirectory, file);
|
||||||
|
const fileContent = fs.readFileSync(filePath, "utf-8");
|
||||||
|
const { data } = matter(fileContent);
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: data.title || "Untitled",
|
||||||
|
date: data.date || "Unknown",
|
||||||
|
slug: file.replace(".md", ""),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
res.setHeader("Content-Type", "application/json");
|
||||||
|
res.end(JSON.stringify(newsList));
|
||||||
|
} catch (error) {
|
||||||
|
console.error("API 错误:", error);
|
||||||
|
res.statusCode = 500;
|
||||||
|
res.end(JSON.stringify({ error: "Failed to load news", details: error.message }));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Nuxt 3 使用 `defineEventHandler`
|
||||||
|
export default (typeof defineEventHandler !== "undefined"
|
||||||
|
? defineEventHandler(() => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const fakeRes = {
|
||||||
|
setHeader: () => {},
|
||||||
|
end: (data) => resolve(JSON.parse(data)),
|
||||||
|
statusCode: 200,
|
||||||
|
};
|
||||||
|
handler({}, fakeRes);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
: handler);
|
||||||
36
static/news/cloud-education-challenges.md
Normal file
36
static/news/cloud-education-challenges.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: 云计算赋能教育:在线学习平台的创新与挑战
|
||||||
|
category: Mar 7. 2025
|
||||||
|
order: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
<div style="border-left: 3px solid #ff6702;padding-left: 1rem;margin-bottom:10px">随着数字化转型的加速2,云计算已成为企业创新和发展的核心驱动力。微软作为全球领先的科技巨头,凭借其强大的技术实力和市场经验,持续引领云计算市场的发展。在最新的战略布局中,微软Azure不仅仅着眼于其在云计算领域的领先地位,更着力投资于智能边缘计算,开启了一个全新的技术时代。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">一、云计算的持续创新与扩展</span>**
|
||||||
|
微软Azure在云计算领域不断进行创新和优化。近年来,Azure不断推出新的功能和服务,以满足企业日益增长的需求。比如,Azure Arc的推出使得企业可以将Azure的服务和安全性扩展到本地环境和其他云环境,帮助企业在本地、混合云和多云环境中更好地管理其云资源。
|
||||||
|
|
||||||
|
此外,Azure数据服务方面也进行了大量创新。Azure Synapse Analytics等工具支持大规模的数据分析,能够帮助企业从海量数据中获取即时洞察,并提升数据处理的效率。随着市场对数据分析能力需求的不断增长,微软Azure正持续优化其数据服务,帮助客户更高效地利用数据资源。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">二、智能边缘的崛起与应用场景</span>**
|
||||||
|
智能边缘计算是微软Azure最新布局中的重要一环。借助物联网(IoT)设备的普及和数据量的爆发式增长,企业对实时数据处理和分析的需求日益增加。微软推出边缘计算解决方案使得企业可以在本地进行数据分析,不仅减少云端计算的延时成本,还能提高安全性和可靠性。
|
||||||
|
|
||||||
|
微软Azure的智能边缘解决方案包括Azure IoT Edge和Azure Stack Edge等产品,这些产品能够将云智能扩展到本地环境,支持从工业自动化到智能零售等多个领域。在制造业中,这些解决方案可以支持生产线的智能运行状态,实现精准控制生产。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">三、AI与云计算的深度融合</span>**
|
||||||
|
人工智能(AI)是微软Azure战略中的另一个关键领域。微软通过OpenAI的多个合作,持续改进其AI云计算平台,为企业提供了强大的AI基础设施。Azure的AI服务包括Cognitive Services、Machine Learning和Bot Service等,能够支持从数据识别到自动语言生成的各种AI功能。
|
||||||
|
|
||||||
|
Azure的AI能力不仅限于云端,还通过智能边缘设备实现了边缘AI的智能推理。例如,Azure IoT Edge支持在智能设备上进行预处理AI推理,使得设备能够在本地分析数据并减少传输成本。这种云与边缘的结合不仅保障了系统的稳定性,还降低了带宽成本和安全风险。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">四、助力企业数字化转型</span>**
|
||||||
|
微软Azure的目标不仅关注技术的创新,更着重于帮助企业实现数字化转型。通过提供全面的云计算和智能化解决方案,Azure能够满足企业在不同场景下的需求。例如,未来数据通过Azure Cosmos DB支持可扩展的高并发事务,显著提升了用户体验。
|
||||||
|
|
||||||
|
此外,Azure的无代码开发工具和自动化能力也加速了应用开发和交付。通过其Power Platform与Azure服务结合,企业能够快速构建高性能低代码应用,降低开发成本,强化数据联通。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">五、未来展望</span>**
|
||||||
|
微软Azure的持续发展从云计算领域逐渐扩展,展现了对未来技术趋势的深度洞察。随着AI智能和物联网的发展,智能边缘计算将成为企业数字化转型的重要支柱。微软将继续扩展Azure的功能版图,不仅限于其云计算优势,也将深入企业的数字化转型解决方案。
|
||||||
|
|
||||||
|
未来,微软Azure的战略布局还将围绕云原生、混合云和多云管理,以及AI与边缘计算的紧密结合。通过这些创新,Azure将帮助企业更好地应对数据化转型中的挑战,实现持续的增长。
|
||||||
|
|
||||||
|
总之,微软Azure的最新战略不仅仅专注于其在云计算领域的领先地位,更展现了对未来技术趋势的深度洞察。从云计算到智能边缘,Azure正在构建一个广泛、灵活且创新的数字化平台,助力企业在数字化时代保持领先地位。
|
||||||
|
|
||||||
35
static/news/cloud-finance-trends.md
Normal file
35
static/news/cloud-finance-trends.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: 云计算巨头的财报背后:哪些行业正在加速上云?
|
||||||
|
category: Feb 18. 2025
|
||||||
|
order: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
<div style="border-left: 3px solid #ff6702;padding-left: 1rem;margin-bottom:10px">随着数字化转型的加速2,云计算已成为企业创新和发展的核心驱动力。微软作为全球领先的科技巨头,凭借其强大的技术实力和市场经验,持续引领云计算市场的发展。在最新的战略布局中,微软Azure不仅仅着眼于其在云计算领域的领先地位,更着力投资于智能边缘计算,开启了一个全新的技术时代。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">一、云计算的持续创新与扩展</span>**
|
||||||
|
微软Azure在云计算领域不断进行创新和优化。近年来,Azure不断推出新的功能和服务,以满足企业日益增长的需求。比如,Azure Arc的推出使得企业可以将Azure的服务和安全性扩展到本地环境和其他云环境,帮助企业在本地、混合云和多云环境中更好地管理其云资源。
|
||||||
|
|
||||||
|
此外,Azure数据服务方面也进行了大量创新。Azure Synapse Analytics等工具支持大规模的数据分析,能够帮助企业从海量数据中获取即时洞察,并提升数据处理的效率。随着市场对数据分析能力需求的不断增长,微软Azure正持续优化其数据服务,帮助客户更高效地利用数据资源。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">二、智能边缘的崛起与应用场景</span>**
|
||||||
|
智能边缘计算是微软Azure最新布局中的重要一环。借助物联网(IoT)设备的普及和数据量的爆发式增长,企业对实时数据处理和分析的需求日益增加。微软推出边缘计算解决方案使得企业可以在本地进行数据分析,不仅减少云端计算的延时成本,还能提高安全性和可靠性。
|
||||||
|
|
||||||
|
微软Azure的智能边缘解决方案包括Azure IoT Edge和Azure Stack Edge等产品,这些产品能够将云智能扩展到本地环境,支持从工业自动化到智能零售等多个领域。在制造业中,这些解决方案可以支持生产线的智能运行状态,实现精准控制生产。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">三、AI与云计算的深度融合</span>**
|
||||||
|
人工智能(AI)是微软Azure战略中的另一个关键领域。微软通过OpenAI的多个合作,持续改进其AI云计算平台,为企业提供了强大的AI基础设施。Azure的AI服务包括Cognitive Services、Machine Learning和Bot Service等,能够支持从数据识别到自动语言生成的各种AI功能。
|
||||||
|
|
||||||
|
Azure的AI能力不仅限于云端,还通过智能边缘设备实现了边缘AI的智能推理。例如,Azure IoT Edge支持在智能设备上进行预处理AI推理,使得设备能够在本地分析数据并减少传输成本。这种云与边缘的结合不仅保障了系统的稳定性,还降低了带宽成本和安全风险。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">四、助力企业数字化转型</span>**
|
||||||
|
微软Azure的目标不仅关注技术的创新,更着重于帮助企业实现数字化转型。通过提供全面的云计算和智能化解决方案,Azure能够满足企业在不同场景下的需求。例如,未来数据通过Azure Cosmos DB支持可扩展的高并发事务,显著提升了用户体验。
|
||||||
|
|
||||||
|
此外,Azure的无代码开发工具和自动化能力也加速了应用开发和交付。通过其Power Platform与Azure服务结合,企业能够快速构建高性能低代码应用,降低开发成本,强化数据联通。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">五、未来展望</span>**
|
||||||
|
微软Azure的持续发展从云计算领域逐渐扩展,展现了对未来技术趋势的深度洞察。随着AI智能和物联网的发展,智能边缘计算将成为企业数字化转型的重要支柱。微软将继续扩展Azure的功能版图,不仅限于其云计算优势,也将深入企业的数字化转型解决方案。
|
||||||
|
|
||||||
|
未来,微软Azure的战略布局还将围绕云原生、混合云和多云管理,以及AI与边缘计算的紧密结合。通过这些创新,Azure将帮助企业更好地应对数据化转型中的挑战,实现持续的增长。
|
||||||
|
|
||||||
|
总之,微软Azure的最新战略不仅仅专注于其在云计算领域的领先地位,更展现了对未来技术趋势的深度洞察。从云计算到智能边缘,Azure正在构建一个广泛、灵活且创新的数字化平台,助力企业在数字化时代保持领先地位。
|
||||||
35
static/news/gdpr-cloud-compliance.md
Normal file
35
static/news/gdpr-cloud-compliance.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: 云服务提供商的合规之路:GDPR与全球数据保护法规的影响
|
||||||
|
category: Mar 17. 2025
|
||||||
|
order: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
<div style="border-left: 3px solid #ff6702;padding-left: 1rem;margin-bottom:10px">随着数字化转型的加速2,云计算已成为企业创新和发展的核心驱动力。微软作为全球领先的科技巨头,凭借其强大的技术实力和市场经验,持续引领云计算市场的发展。在最新的战略布局中,微软Azure不仅仅着眼于其在云计算领域的领先地位,更着力投资于智能边缘计算,开启了一个全新的技术时代。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">一、云计算的持续创新与扩展</span>**
|
||||||
|
微软Azure在云计算领域不断进行创新和优化。近年来,Azure不断推出新的功能和服务,以满足企业日益增长的需求。比如,Azure Arc的推出使得企业可以将Azure的服务和安全性扩展到本地环境和其他云环境,帮助企业在本地、混合云和多云环境中更好地管理其云资源。
|
||||||
|
|
||||||
|
此外,Azure数据服务方面也进行了大量创新。Azure Synapse Analytics等工具支持大规模的数据分析,能够帮助企业从海量数据中获取即时洞察,并提升数据处理的效率。随着市场对数据分析能力需求的不断增长,微软Azure正持续优化其数据服务,帮助客户更高效地利用数据资源。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">二、智能边缘的崛起与应用场景</span>**
|
||||||
|
智能边缘计算是微软Azure最新布局中的重要一环。借助物联网(IoT)设备的普及和数据量的爆发式增长,企业对实时数据处理和分析的需求日益增加。微软推出边缘计算解决方案使得企业可以在本地进行数据分析,不仅减少云端计算的延时成本,还能提高安全性和可靠性。
|
||||||
|
|
||||||
|
微软Azure的智能边缘解决方案包括Azure IoT Edge和Azure Stack Edge等产品,这些产品能够将云智能扩展到本地环境,支持从工业自动化到智能零售等多个领域。在制造业中,这些解决方案可以支持生产线的智能运行状态,实现精准控制生产。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">三、AI与云计算的深度融合</span>**
|
||||||
|
人工智能(AI)是微软Azure战略中的另一个关键领域。微软通过OpenAI的多个合作,持续改进其AI云计算平台,为企业提供了强大的AI基础设施。Azure的AI服务包括Cognitive Services、Machine Learning和Bot Service等,能够支持从数据识别到自动语言生成的各种AI功能。
|
||||||
|
|
||||||
|
Azure的AI能力不仅限于云端,还通过智能边缘设备实现了边缘AI的智能推理。例如,Azure IoT Edge支持在智能设备上进行预处理AI推理,使得设备能够在本地分析数据并减少传输成本。这种云与边缘的结合不仅保障了系统的稳定性,还降低了带宽成本和安全风险。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">四、助力企业数字化转型</span>**
|
||||||
|
微软Azure的目标不仅关注技术的创新,更着重于帮助企业实现数字化转型。通过提供全面的云计算和智能化解决方案,Azure能够满足企业在不同场景下的需求。例如,未来数据通过Azure Cosmos DB支持可扩展的高并发事务,显著提升了用户体验。
|
||||||
|
|
||||||
|
此外,Azure的无代码开发工具和自动化能力也加速了应用开发和交付。通过其Power Platform与Azure服务结合,企业能够快速构建高性能低代码应用,降低开发成本,强化数据联通。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">五、未来展望</span>**
|
||||||
|
微软Azure的持续发展从云计算领域逐渐扩展,展现了对未来技术趋势的深度洞察。随着AI智能和物联网的发展,智能边缘计算将成为企业数字化转型的重要支柱。微软将继续扩展Azure的功能版图,不仅限于其云计算优势,也将深入企业的数字化转型解决方案。
|
||||||
|
|
||||||
|
未来,微软Azure的战略布局还将围绕云原生、混合云和多云管理,以及AI与边缘计算的紧密结合。通过这些创新,Azure将帮助企业更好地应对数据化转型中的挑战,实现持续的增长。
|
||||||
|
|
||||||
|
总之,微软Azure的最新战略不仅仅专注于其在云计算领域的领先地位,更展现了对未来技术趋势的深度洞察。从云计算到智能边缘,Azure正在构建一个广泛、灵活且创新的数字化平台,助力企业在数字化时代保持领先地位。
|
||||||
36
static/news/microsoft-azure-strategy.md
Normal file
36
static/news/microsoft-azure-strategy.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: 微软Azure的最新战略:从云计算到智能边缘
|
||||||
|
category: Feb 10. 2025
|
||||||
|
order: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
<div style="border-left: 3px solid #ff6702;padding-left: 1rem;margin-bottom:10px">随着数字化转型的加速2,云计算已成为企业创新和发展的核心驱动力。微软作为全球领先的科技巨头,凭借其强大的技术实力和市场经验,持续引领云计算市场的发展。在最新的战略布局中,微软Azure不仅仅着眼于其在云计算领域的领先地位,更着力投资于智能边缘计算,开启了一个全新的技术时代。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">一、云计算的持续创新与扩展</span>**
|
||||||
|
微软Azure在云计算领域不断进行创新和优化。近年来,Azure不断推出新的功能和服务,以满足企业日益增长的需求。比如,Azure Arc的推出使得企业可以将Azure的服务和安全性扩展到本地环境和其他云环境,帮助企业在本地、混合云和多云环境中更好地管理其云资源。
|
||||||
|
|
||||||
|
此外,Azure数据服务方面也进行了大量创新。Azure Synapse Analytics等工具支持大规模的数据分析,能够帮助企业从海量数据中获取即时洞察,并提升数据处理的效率。随着市场对数据分析能力需求的不断增长,微软Azure正持续优化其数据服务,帮助客户更高效地利用数据资源。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">二、智能边缘的崛起与应用场景</span>**
|
||||||
|
智能边缘计算是微软Azure最新布局中的重要一环。借助物联网(IoT)设备的普及和数据量的爆发式增长,企业对实时数据处理和分析的需求日益增加。微软推出边缘计算解决方案使得企业可以在本地进行数据分析,不仅减少云端计算的延时成本,还能提高安全性和可靠性。
|
||||||
|
|
||||||
|
微软Azure的智能边缘解决方案包括Azure IoT Edge和Azure Stack Edge等产品,这些产品能够将云智能扩展到本地环境,支持从工业自动化到智能零售等多个领域。在制造业中,这些解决方案可以支持生产线的智能运行状态,实现精准控制生产。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">三、AI与云计算的深度融合</span>**
|
||||||
|
人工智能(AI)是微软Azure战略中的另一个关键领域。微软通过OpenAI的多个合作,持续改进其AI云计算平台,为企业提供了强大的AI基础设施。Azure的AI服务包括Cognitive Services、Machine Learning和Bot Service等,能够支持从数据识别到自动语言生成的各种AI功能。
|
||||||
|
|
||||||
|
Azure的AI能力不仅限于云端,还通过智能边缘设备实现了边缘AI的智能推理。例如,Azure IoT Edge支持在智能设备上进行预处理AI推理,使得设备能够在本地分析数据并减少传输成本。这种云与边缘的结合不仅保障了系统的稳定性,还降低了带宽成本和安全风险。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">四、助力企业数字化转型</span>**
|
||||||
|
微软Azure的目标不仅关注技术的创新,更着重于帮助企业实现数字化转型。通过提供全面的云计算和智能化解决方案,Azure能够满足企业在不同场景下的需求。例如,未来数据通过Azure Cosmos DB支持可扩展的高并发事务,显著提升了用户体验。
|
||||||
|
|
||||||
|
此外,Azure的无代码开发工具和自动化能力也加速了应用开发和交付。通过其Power Platform与Azure服务结合,企业能够快速构建高性能低代码应用,降低开发成本,强化数据联通。
|
||||||
|
|
||||||
|
#### **<span style="color:#ff6702;font-weight: 400;">五、未来展望</span>**
|
||||||
|
微软Azure的持续发展从云计算领域逐渐扩展,展现了对未来技术趋势的深度洞察。随着AI智能和物联网的发展,智能边缘计算将成为企业数字化转型的重要支柱。微软将继续扩展Azure的功能版图,不仅限于其云计算优势,也将深入企业的数字化转型解决方案。
|
||||||
|
|
||||||
|
未来,微软Azure的战略布局还将围绕云原生、混合云和多云管理,以及AI与边缘计算的紧密结合。通过这些创新,Azure将帮助企业更好地应对数据化转型中的挑战,实现持续的增长。
|
||||||
|
|
||||||
|
总之,微软Azure的最新战略不仅仅专注于其在云计算领域的领先地位,更展现了对未来技术趋势的深度洞察。从云计算到智能边缘,Azure正在构建一个广泛、灵活且创新的数字化平台,助力企业在数字化时代保持领先地位。
|
||||||
|
|
||||||
13
utils/formatDate.js
Normal file
13
utils/formatDate.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// utils/formatDate.js
|
||||||
|
export function formatDate(dateString) {
|
||||||
|
if (!dateString) return "Unknown";
|
||||||
|
|
||||||
|
const date = new Date(dateString);
|
||||||
|
if (isNaN(date)) return "Unknown"; // 处理无效日期
|
||||||
|
|
||||||
|
return date.toLocaleDateString("en-US", {
|
||||||
|
month: "short",
|
||||||
|
day: "2-digit",
|
||||||
|
year: "numeric",
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user