Compare commits

..

1 Commits

Author SHA1 Message Date
xiaomai
dbd1abdc1c feat(content): add draft support for content collections
This commit introduces a draft system for the 'events' and 'news' collections. A `draft` boolean field has been added to the content schema, and frontend queries are now updated to only fetch and
display content where `draft` is `false`. This allows content to be created and saved without being publicly visible, improving the publishing workflow.
2025-11-15 17:58:00 +08:00
50 changed files with 135 additions and 393 deletions

View File

@@ -5,30 +5,7 @@
@theme { @theme {
--color-primary: #fb9e3a; --color-primary: #fb9e3a;
--color-primary-50: #fff8f0;
--color-primary-100: #feecd8;
--color-primary-200: #fdd4ab;
--color-primary-300: #fbb674;
--color-primary-400: #fb9e3a;
--color-primary-500: #f9840a;
--color-primary-600: #dd6b06;
--color-primary-700: #b74f07;
--color-primary-800: #943e0d;
--color-primary-900: #7a340e;
--color-primary-950: #461902;
--color-secondary: #fcef91; --color-secondary: #fcef91;
--color-secondary-50: #fffeea;
--color-secondary-100: #fffbc5;
--color-secondary-200: #fcef91;
--color-secondary-300: #f9df53;
--color-secondary-400: #f6ca24;
--color-secondary-500: #e6b010;
--color-secondary-600: #c6880a;
--color-secondary-700: #9e610c;
--color-secondary-800: #834d12;
--color-secondary-900: #6f3f15;
--color-secondary-950: #412008;
} }
.dark { .dark {

View File

@@ -1,23 +1,23 @@
<template> <template>
<!-- 活动模块 --> <!-- 活动模块 -->
<UPageSection title="校友活动" class="bg-gray-100 dark:bg-slate-800"> <UPageSection title="校友活动" class="bg-gray-100">
<UPageGrid> <UPageGrid>
<div <div
v-for="event in events" v-for="event in events"
:key="event.id" :key="event.id"
class="bg-white dark:bg-slate-700 shadow rounded-xl" class="bg-white shadow rounded-xl"
> >
<img <img
:src="event.cover" :src="event.cover"
:alt="event.title" :alt="event.title"
class="w-full aspect-video object-cover rounded-t-xl" class="w-full aspect-[16/9] object-cover rounded-t-xl"
/> />
<div class="p-6"> <div class="p-6">
<h4 class="font-semibold text-lg mb-2">{{ event.title }}</h4> <h4 class="font-semibold text-lg mb-2">{{ event.title }}</h4>
<p class="text-sm text-gray-600 dark:text-gray-400 mb-1"> <p class="text-sm text-gray-600 mb-1">
日期{{ useChineseDateFormat(event.date) }} 日期{{ useChineseDateFormat(event.date) }}
</p> </p>
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">地点{{ event.location }}</p> <p class="text-sm text-gray-600 mb-4">地点{{ event.location }}</p>
<UButton <UButton
label="阅读详情" label="阅读详情"
:to="event.path" :to="event.path"

View File

@@ -10,10 +10,10 @@
<img <img
:src="person.photo" :src="person.photo"
:alt="person.name" :alt="person.name"
class="w-40 rounded-full border-primary-400 border-4" class="w-40 rounded-full border-primary border-4"
/> />
<h4 class="text-lg font-bold">{{ person.name }}</h4> <h4 class="text-lg font-bold">{{ person.name }}</h4>
<p class="text-sm text-gray-500 dark:text-gray-400">{{ person.title }}</p> <p class="text-sm text-gray-500">{{ person.title }}</p>
</div> </div>
</div> </div>
</UPageSection> </UPageSection>

View File

@@ -164,7 +164,7 @@ const errorColor = computed(() => {
<button <button
@click="goHome" @click="goHome"
class="px-5 py-2.5 rounded-md text-white font-medium transition-colors flex items-center gap-2" class="px-5 py-2.5 rounded-md text-white font-medium transition-colors flex items-center gap-2"
style="background-color: var(--color-primary-400)" style="background-color: var(--color-primary)"
> >
<span>返回首页</span> <span>返回首页</span>
</button> </button>

View File

@@ -12,7 +12,7 @@
<div class="flex gap-4 items-center"> <div class="flex gap-4 items-center">
<img class="inline h-12 w-auto" src="/Logo.svg" alt="YPHS Alumni" /> <img class="inline h-12 w-auto" src="/Logo.svg" alt="YPHS Alumni" />
<h1 <h1
class="text-xl font-bold text-gray-900 hover:text-primary-400 hidden md:inline" class="text-xl font-bold text-gray-900 hover:text-primary hidden md:inline"
> >
永平中学校友会 永平中学校友会
</h1> </h1>

View File

@@ -131,7 +131,7 @@
:class="[ :class="[
'px-4', 'px-4',
'py-2', 'py-2',
idx < 2 ? 'font-bold text-primary-400' : '', idx < 2 ? 'font-bold text-primary' : '',
]" ]"
> >
{{ donor.amount }} {{ donor.amount }}
@@ -167,7 +167,7 @@
{{ money.format(serviceDonor.amount) }} {{ money.format(serviceDonor.amount) }}
</td> </td>
</tr> </tr>
<tr class="bg-amber-50 font-semibold text-primary-400"> <tr class="bg-amber-50 font-semibold text-primary">
<td class="px-4 py-2">总额</td> <td class="px-4 py-2">总额</td>
<td class="px-4 py-2">专业服务及装修项目</td> <td class="px-4 py-2">专业服务及装修项目</td>
<td class="px-4 py-2">{{ money.format(33170) }}</td> <td class="px-4 py-2">{{ money.format(33170) }}</td>

View File

@@ -49,7 +49,7 @@ useSeoMeta({
ogTitle: "永平中学校友会组织架构", ogTitle: "永平中学校友会组织架构",
ogDescription: ogDescription:
"了解永平中学校友会的领导团队、职能与专项部门,见证校友情谊与组织力量。", "了解永平中学校友会的领导团队、职能与专项部门,见证校友情谊与组织力量。",
ogImage: "https://img.yphsalumni.org/i/2025/11/28/qq4k4z.png", ogImage: "/org-structure/ogImage.png",
ogType: "website", ogType: "website",
}); });
@@ -64,7 +64,7 @@ const orgStructure = ref([
name: "李煜斌", name: "李煜斌",
position: "主席", position: "主席",
category: "领导团队", category: "领导团队",
photo: "https://img.yphsalumni.org/i/2025/11/28/qm2sjz.png", photo: "/org-structure/李煜斌.png",
description: description:
"全面领导与战略决策,统筹理事会整体工作,确保组织愿景与使命的实现。", "全面领导与战略决策,统筹理事会整体工作,确保组织愿景与使命的实现。",
}, },
@@ -72,154 +72,154 @@ const orgStructure = ref([
name: "郑惠忠", name: "郑惠忠",
position: "副主席", position: "副主席",
category: "领导团队", category: "领导团队",
photo: "https://img.yphsalumni.org/i/2025/11/28/qm3nod.png", photo: "/org-structure/郑惠忠.png",
description: "协助主席制定战略方向,分管外部关系与合作伙伴发展。", description: "协助主席制定战略方向,分管外部关系与合作伙伴发展。",
}, },
{ {
name: "陈月丽", name: "陈月丽",
position: "副主席", position: "副主席",
category: "领导团队", category: "领导团队",
photo: "https://img.yphsalumni.org/i/2025/11/28/qm41qp.png", photo: "/org-structure/陈月丽.png",
description: "协助主席处理内部事务,分管人力资源与组织文化建设。", description: "协助主席处理内部事务,分管人力资源与组织文化建设。",
}, },
{ {
name: "余东照", name: "余东照",
position: "副主席", position: "副主席",
category: "领导团队", category: "领导团队",
photo: "https://img.yphsalumni.org/i/2025/11/28/qm4izj.png", photo: "/org-structure/余东照.png",
description: "协助主席推动重点项目,分管创新业务与发展规划。", description: "协助主席推动重点项目,分管创新业务与发展规划。",
}, },
{ {
name: "蓝宜宏", name: "蓝宜宏",
position: "秘书", position: "秘书",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qmrsai.png", photo: "/org-structure/蓝宜宏.png",
description: "文件管理、会议组织、行政协调与日常事务处理。", description: "文件管理、会议组织、行政协调与日常事务处理。",
}, },
{ {
name: "陈冠宇", name: "陈冠宇",
position: "副秘书", position: "副秘书",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qms4el.png", photo: "/org-structure/陈冠宇.png",
description: "协助秘书处理文档、会议安排与行政支持工作。", description: "协助秘书处理文档、会议安排与行政支持工作。",
}, },
{ {
name: "余粝栎", name: "余粝栎",
position: "财政", position: "财政",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qmsnhy.png", photo: "/org-structure/余粝栎.png",
description: "全面财务管理、预算控制、资金运作与财务报告。", description: "全面财务管理、预算控制、资金运作与财务报告。",
}, },
{ {
name: "曾国书", name: "曾国书",
position: "副财政", position: "副财政",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qmslmm.jpg", photo: "/org-structure/曾国书.jpg",
description: "协助财政处理账务、报销与日常财务管理工作。", description: "协助财政处理账务、报销与日常财务管理工作。",
}, },
{ {
name: "颜志宝", name: "颜志宝",
position: "总务", position: "总务",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qnfyb0.png", photo: "/org-structure/颜志宝.png",
description: "物资采购、资产管理、场地协调与后勤保障服务。", description: "物资采购、资产管理、场地协调与后勤保障服务。",
}, },
{ {
name: "温敬富", name: "温敬富",
position: "副总务", position: "副总务",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qnglal.png", photo: "/org-structure/温敬富.png",
description: "协助总务处理物资管理、设备维护与后勤支持。", description: "协助总务处理物资管理、设备维护与后勤支持。",
}, },
{ {
name: "胡少菲", name: "胡少菲",
position: "康乐", position: "康乐",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qnre6r.png", photo: "/org-structure/胡少菲.png",
description: "文化活动策划、康乐项目组织与会员联谊活动。", description: "文化活动策划、康乐项目组织与会员联谊活动。",
}, },
{ {
name: "林剑宝", name: "林剑宝",
position: "副康乐", position: "副康乐",
category: "职能部门", category: "职能部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qns52y.png", photo: "/org-structure/林剑宝.png",
description: "协助文康组织文体活动、兴趣小组与社交聚会。", description: "协助文康组织文体活动、兴趣小组与社交聚会。",
}, },
{ {
name: "余美枫", name: "余美枫",
position: "福利主任", position: "福利主任",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qodchd.png", photo: "/org-structure/余美枫.png",
description: "会员福利规划、实施与评估,提升会员满意度。", description: "会员福利规划、实施与评估,提升会员满意度。",
}, },
{ {
name: "郑惠国", name: "郑惠国",
position: "副福利主任", position: "副福利主任",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qoe3ua.png", photo: "/org-structure/郑惠国.png",
description: "协助会员福利规划、实施与评估,提升会员满意度。", description: "协助会员福利规划、实施与评估,提升会员满意度。",
}, },
{ {
name: "程靖原", name: "程靖原",
position: "会员籍暨咨询管理", position: "会员籍暨咨询管理",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qof326.png", photo: "/org-structure/程靖原.png",
description: "会员信息管理、咨询服务提供与会员关系维护。", description: "会员信息管理、咨询服务提供与会员关系维护。",
}, },
{ {
name: "许福源", name: "许福源",
position: "副会员籍暨咨询管理", position: "副会员籍暨咨询管理",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qog4aa.png", photo: "/org-structure/许福源.png",
description: "协助会员管理、咨询响应与信息系统维护。", description: "协助会员管理、咨询响应与信息系统维护。",
}, },
{ {
name: "麦祖奕", name: "麦祖奕",
position: "副会员籍暨咨询管理", position: "副会员籍暨咨询管理",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qoo8lx.png", photo: "/org-structure/麦祖奕.png",
description: "协助会员管理、咨询响应与信息系统开发。", description: "协助会员管理、咨询响应与信息系统开发。",
}, },
{ {
name: "许浩铭", name: "许浩铭",
position: "奖励金主任", position: "奖励金主任",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qoos64.png", photo: "/org-structure/许浩铭.png",
description: "奖励金制度设计、评审组织与发放管理。", description: "奖励金制度设计、评审组织与发放管理。",
}, },
{ {
name: "黄楚茵", name: "黄楚茵",
position: "副奖励金主任", position: "副奖励金主任",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qoxrim.png", photo: "/org-structure/黄楚茵.png",
description: "协助奖励金评审、资料审核与发放流程管理。", description: "协助奖励金评审、资料审核与发放流程管理。",
}, },
{ {
name: "陈廷添", name: "陈廷添",
position: "理事", position: "理事",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qoyjo8.png", photo: "/org-structure/陈廷添.png",
description: "参与理事会决策、专项工作推进与建议提出。", description: "参与理事会决策、专项工作推进与建议提出。",
}, },
{ {
name: "邱康勤", name: "邱康勤",
position: "理事", position: "理事",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qp8tni.png", photo: "/org-structure/邱康勤.png",
description: "参与理事会决策、专项工作推进与建议提出。", description: "参与理事会决策、专项工作推进与建议提出。",
}, },
{ {
name: "张键国", name: "张键国",
position: "稽查", position: "稽查",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qp99ia.png", photo: "/org-structure/张键国.png",
description: "内部审计、合规监督与风险控制管理。", description: "内部审计、合规监督与风险控制管理。",
}, },
{ {
name: "许皓杰", name: "许皓杰",
position: "稽查", position: "稽查",
category: "专项部门", category: "专项部门",
photo: "https://img.yphsalumni.org/i/2025/11/28/qp9l0z.png", photo: "/org-structure/许皓杰.png",
description: "内部审计、合规监督与风险控制管理。", description: "内部审计、合规监督与风险控制管理。",
}, },
]); ]);

View File

@@ -7,13 +7,9 @@
<!-- 卡片装饰边框浅色渐变 --> <!-- 卡片装饰边框浅色渐变 -->
<!-- <div class="absolute inset-0 bg-linear-to-r from-blue-100 to-purple-100 rounded-2xl blur-sm"></div> --> <!-- <div class="absolute inset-0 bg-linear-to-r from-blue-100 to-purple-100 rounded-2xl blur-sm"></div> -->
<div <div class="relative rounded-xl border border-gray-200 shadow-xl overflow-hidden">
class="relative rounded-xl border border-gray-200 shadow-xl overflow-hidden"
>
<!-- 顶部装饰条明亮渐变 --> <!-- 顶部装饰条明亮渐变 -->
<div <div class="h-1 bg-linear-to-r from-blue-400 via-purple-400 to-cyan-400"></div>
class="h-1 bg-linear-to-r from-blue-400 via-purple-400 to-cyan-400"
></div>
<div class="p-8 sm:p-10 lg:p-12"> <div class="p-8 sm:p-10 lg:p-12">
<!-- 内容渲染器 --> <!-- 内容渲染器 -->
@@ -21,32 +17,16 @@
<ContentRenderer :value="event ?? {}"> <ContentRenderer :value="event ?? {}">
<template #empty> <template #empty>
<div class="text-center py-16"> <div class="text-center py-16">
<div <div class="inline-flex items-center justify-center w-16 h-16 bg-blue-100 rounded-full mb-4">
class="inline-flex items-center justify-center w-16 h-16 bg-blue-100 rounded-full mb-4" <svg class="w-8 h-8 text-blue-500 animate-spin" fill="none" viewBox="0 0 24 24">
> <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4">
<svg </circle>
class="w-8 h-8 text-blue-500 animate-spin" <path class="opacity-75" fill="currentColor"
fill="none" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">
viewBox="0 0 24 24" </path>
>
<circle
class="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="4"
></circle>
<path
class="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
></path>
</svg> </svg>
</div> </div>
<p class="text-gray-700 text-lg font-medium"> <p class="text-gray-700 text-lg font-medium">内容加载中...</p>
内容加载中...
</p>
<p class="text-gray-400 text-sm mt-2">请稍等片刻</p> <p class="text-gray-400 text-sm mt-2">请稍等片刻</p>
</div> </div>
</template> </template>
@@ -61,43 +41,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const route = useRoute(); const route = useRoute()
const { data: event } = await useAsyncData("event-detail", () => const { data: event } = await useAsyncData('event-detail', () =>
queryCollection("events").path(`/events/${route.params.slug}`).first() queryCollection('events')
); .path(`/events/${route.params.slug}`)
.first()
)
if (event.value) { useHead({
// 1. 确定图片:优先用 ogImage没有就用 cover title: event.value?.title
const shareImage = event.value.ogImage || event.value.cover; })
// 2. 确定标题和描述:优先用 seoTitle没有就用 title
const shareTitle = event.value.seoTitle || event.value.title;
const shareDesc = event.value.seoDescription || event.value.description;
// 3. 注入 SEO
useSeoMeta({
// 基础
title: shareTitle,
description: shareDesc,
// Open Graph (Facebook / WhatsApp)
ogTitle: shareTitle,
ogDescription: shareDesc,
ogImage: shareImage,
ogType: "article",
// Twitter Card
twitterCard: "summary_large_image",
twitterTitle: shareTitle,
twitterDescription: shareDesc,
twitterImage: shareImage,
});
// 如果你用了 nuxt-og-image 模块生成动态图
if (shareImage) {
defineOgImage({ url: shareImage });
}
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@@ -2,8 +2,14 @@
<UPage> <UPage>
<!-- Hero Banner --> <!-- Hero Banner -->
<UPageHero <UPageHero
:class="heroClass" class="bg-cover bg-center"
:style="heroStyle" style="
background-image: url(&quot;/hero-image-2.jpg?v=2&quot;);
background-position-y: -40px;
background-repeat: no-repeat;
background-color: rgba(255, 255, 255, 0.5); /* Semi-transparent black */
background-blend-mode: lighten;
"
title="连接校友 · 传承精神" title="连接校友 · 传承精神"
description="马来西亚柔佛永平中学校友会官方网站" description="马来西亚柔佛永平中学校友会官方网站"
:links="heroCta" :links="heroCta"
@@ -19,7 +25,7 @@
<!-- 捐赠模块 --> <!-- 捐赠模块 -->
<UPageCTA <UPageCTA
class="bg-secondary-200 dark:bg-secondary-900" class="bg-secondary"
title="支持与捐赠(功能暂未开放)" title="支持与捐赠(功能暂未开放)"
description="您的捐赠将用于奖学金、校园建设及校友活动发展。感谢您对母校的支持!" description="您的捐赠将用于奖学金、校园建设及校友活动发展。感谢您对母校的支持!"
:links="donationLinks" :links="donationLinks"
@@ -34,20 +40,6 @@ useSeoMeta({
title: "首页", title: "首页",
}); });
const colorMode = useColorMode()
const heroClass = 'bg-cover bg-center'
const heroStyle = computed(() => ({
backgroundImage: colorMode.value === 'dark'
? 'url("https://img.yphsalumni.org/i/2025/11/28/qzxrpq.png")'
: 'url("https://img.yphsalumni.org/i/2025/11/28/qk9fe8.png")',
backgroundPositionY: '-40px',
backgroundRepeat: 'no-repeat',
backgroundColor: colorMode.value === 'dark'
? 'rgba(0, 0, 0, 0.5)'
: 'rgba(255, 255, 255, 0.5)',
backgroundBlendMode: colorMode.value === 'dark' ? 'darken' : 'lighten'
}))
const heroCta = ref([ const heroCta = ref([
{ {
label: "立即加入我们", label: "立即加入我们",

View File

@@ -113,7 +113,7 @@ const handleSubmit = () => {
</script> </script>
<template> <template>
<UPage class="bg-primary-400"> <UPage class="bg-primary">
<div <div
class="cursor-not-allowed fixed flex items-center justify-center min-h-screen min-w-screen bg-black opacity-50" class="cursor-not-allowed fixed flex items-center justify-center min-h-screen min-w-screen bg-black opacity-50"
> >

View File

@@ -18,43 +18,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const route = useRoute(); const route = useRoute()
const { data: n } = await useAsyncData("new-detail", () => const { data: n } = await useAsyncData('new-detail', () =>
queryCollection("news").path(`/news/${route.params.slug}`).first() queryCollection('news')
); .path(`/news/${route.params.slug}`)
.first()
)
if (n.value) { useHead({
// 1. 确定图片:优先用 ogImage没有就用 cover title: n.value?.title
const shareImage = n.value.ogImage || n.value.cover; })
// 2. 确定标题和描述:优先用 seoTitle没有就用 title
const shareTitle = n.value.seoTitle || n.value.title;
const shareDesc = n.value.seoDescription || n.value.description;
// 3. 注入 SEO
useSeoMeta({
// 基础
title: shareTitle,
description: shareDesc,
// Open Graph (Facebook / WhatsApp)
ogTitle: shareTitle,
ogDescription: shareDesc,
ogImage: shareImage,
ogType: "article",
// Twitter Card
twitterCard: "summary_large_image",
twitterTitle: shareTitle,
twitterDescription: shareDesc,
twitterImage: shareImage,
});
// 如果你用了 nuxt-og-image 模块生成动态图
if (shareImage) {
defineOgImage({ url: shareImage });
}
}
</script> </script>
<style></style> <style></style>

View File

@@ -1,5 +1,4 @@
import { defineContentConfig, defineCollection, z } from "@nuxt/content"; import { defineContentConfig, defineCollection, z } from "@nuxt/content";
import { asSeoCollection } from "@nuxtjs/seo/content";
export default defineContentConfig({ export default defineContentConfig({
collections: { collections: {
@@ -13,12 +12,11 @@ export default defineContentConfig({
date: z.coerce.date(), date: z.coerce.date(),
location: z.string(), location: z.string(),
cover: z.string().url(), cover: z.string().url(),
draft: z.boolean().optional().default(false), draft: z.boolean().optional().default(false)
}), }),
}), }),
// 新闻集合 // 新闻集合
news: defineCollection( news: defineCollection({
asSeoCollection({
type: "page", type: "page",
source: "news/*.md", source: "news/*.md",
schema: z.object({ schema: z.object({
@@ -34,10 +32,9 @@ export default defineContentConfig({
seoTitle: z.string().optional(), seoTitle: z.string().optional(),
seoDescription: z.string().optional(), seoDescription: z.string().optional(),
ogImage: z.string().optional(), ogImage: z.string().optional(),
draft: z.boolean().optional().default(false), draft: z.boolean().optional().default(false)
}),
}), }),
})
),
// 名人堂 // 名人堂
hallOfFames: defineCollection({ hallOfFames: defineCollection({
type: "page", type: "page",

View File

@@ -3,16 +3,16 @@ title: "927 永中 • 钟意你"
subtitle: "永中校友会 39周年庆" subtitle: "永中校友会 39周年庆"
date: "2025-09-27" date: "2025-09-27"
location: "永平中学校园" location: "永平中学校园"
cover: "https://img.yphsalumni.org/i/2025/11/28/qr1l7k.jpg" cover: "/events/20250927-return-to-school/event-photo-1.jpg"
--- ---
# 永中校友会39周年会庆午宴 温馨欢聚350人 # 永中校友会39周年会庆午宴 温馨欢聚350人
![来宾打卡照](https://img.yphsalumni.org/i/2025/11/28/qr1l7k.jpg) ![来宾打卡照](/events/20250927-return-to-school/event-photo-1.jpg)
来宾打卡照(星洲日报记者,邹智敏摄) 来宾打卡照(星洲日报记者,邹智敏摄)
永平中学校友会于 9 月 27 日举办“927 永中·钟意你”39 周年会庆午宴,吸引约 350 位校友与社会贤达齐聚一堂,共度温馨时光,场面热闹盛大。 永平中学校友会于 9 月 27 日举办“927 永中·钟意你”39 周年会庆午宴,吸引约 350 位校友与社会贤达齐聚一堂,共度温馨时光,场面热闹盛大。
![嘉宾合照](https://img.yphsalumni.org/i/2025/11/28/qr1rrx.jpg) ![嘉宾合照](/events/20250927-return-to-school/event-photo-2.jpg)
与会嘉宾向永中校友会献上祝福,左起:许敏捷、王飞兴、林添顺、李煜斌、刘镇东、蓝宜宏、傅庆隆、张嘉群及郑凯聪(星洲日报记者,邹智敏摄) 与会嘉宾向永中校友会献上祝福,左起:许敏捷、王飞兴、林添顺、李煜斌、刘镇东、蓝宜宏、傅庆隆、张嘉群及郑凯聪(星洲日报记者,邹智敏摄)
本次会庆出席嘉宾包括: 本次会庆出席嘉宾包括:

View File

@@ -3,11 +3,11 @@ title: "柔联校友会 20 届理事就职典礼"
subtitle: "中学生写作比赛颁奖" subtitle: "中学生写作比赛颁奖"
date: "2025-10-09" date: "2025-10-09"
location: "富华冷气酒家 2 楼" location: "富华冷气酒家 2 楼"
cover: "https://img.yphsalumni.org/i/2025/11/28/qryfft.jpg" cover: "/events/20251009-roulian-xiaoyouhui-20th/event-photo-1.jpg"
--- ---
# 柔联校友会 20 届理事就职典礼 # 柔联校友会 20 届理事就职典礼
![新届理事合照](https://img.yphsalumni.org/i/2025/11/28/qryfft.jpg) ![新届理事合照](/events/20251009-roulian-xiaoyouhui-20th/event-photo-1.jpg)
柔佛州华校校友联合会日前举办第 20 届理事就职典礼与 2025 年 “林赛花教育基金” 柔佛州中学生现场写作比赛颁奖典礼,由马来西亚华校校友会联合总会会长萧成兴担任监誓人。 柔佛州华校校友联合会日前举办第 20 届理事就职典礼与 2025 年 “林赛花教育基金” 柔佛州中学生现场写作比赛颁奖典礼,由马来西亚华校校友会联合总会会长萧成兴担任监誓人。

View File

@@ -3,7 +3,7 @@ title: "永平中学第 60 届毕业典礼"
subtitle: "暨初中第 67 届毕业典礼" subtitle: "暨初中第 67 届毕业典礼"
date: "2025-11-15" date: "2025-11-15"
location: "永平中学邱廉书礼堂" location: "永平中学邱廉书礼堂"
cover: "https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg" # cover: "/events/20250927-return-to-school/event-photo-1.jpg"
draft: false draft: false
# SEO 主要字段 # SEO 主要字段
@@ -17,39 +17,49 @@ keywords:
- 刘连升老师 - 刘连升老师
- 永中校友会 - 永中校友会
# --- SEO 专用字段 (对应你的 Zod Schema) --- # Open Graph / Facebook
og:
title: "永平中学第 60 届毕业典礼|初中第 67 届毕业典礼"
description: "2025 年永平中学毕业典礼隆重举行,包含师长致辞、奖学金颁发、荣休老师欢送,以及学生精彩演出等精彩环节。"
# image: "/events/20250927-return-to-school/event-photo-1.jpg"
type: "article"
# 对应 schema: seoTitle # Twitter 卡片
# 如果不填,代码里会默认使用 title twitter:
seoTitle: "永平中学第 60 届毕业典礼|初中第 67 届毕业典礼" card: "summary_large_image"
title: "永平中学第 60 届毕业典礼"
description: "永平中学 2025 毕业典礼精彩回顾:致辞、演出、奖学金颁发与荣休教师表扬。"
# image: "/events/20250927-return-to-school/event-photo-1.jpg"
# 对应 schema: seoDescription # 文章结构化数据可选Nuxt SEO module 会自动识别)
# 如果不填,代码里会默认使用 description structuredData:
seoDescription: "2025 年永平中学毕业典礼隆重举行,包含师长致辞、奖学金颁发、荣休老师欢送,以及学生精彩演出等精彩环节。" "@type": "NewsArticle"
headline: "永平中学第 60 届毕业典礼圆满举行"
# 对应 schema: ogImage # image: "/events/20250927-return-to-school/event-photo-1.jpg"
# 只有当你想要分享的图片和封面图不一样时才填,否则代码里会默认用 cover datePublished: "2025-11-15"
ogImage: "https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg" author:
"@type": "Organization"
name: "永平中学校友会"
publisher:
"@type": "Organization"
name: "永平中学"
logo:
"@type": "ImageObject"
url: "/logo.png"
--- ---
# 永平中学高中第 60 届、初中第 67 届毕业典礼圆满举行 # 永平中学高中第 60 届、初中第 67 届毕业典礼圆满举行
![高三毕业生与嘉宾合照](https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg)
2025 年 11 月 15 日,永平中学邱廉书礼堂见证了一个充满祝福与感动的重要时刻:高中第 60 届与初中第 67 届毕业典礼隆重举行。礼堂内座无虚席,毕业生、家长、师长与嘉宾齐聚一堂,共同庆祝学子们学习旅程的重要里程碑。 2025 年 11 月 15 日,永平中学邱廉书礼堂见证了一个充满祝福与感动的重要时刻:高中第 60 届与初中第 67 届毕业典礼隆重举行。礼堂内座无虚席,毕业生、家长、师长与嘉宾齐聚一堂,共同庆祝学子们学习旅程的重要里程碑。
经过六年的努力与成长,高三学生正式迎来人生的新阶段;初三毕业生亦迈向更高层次的挑战。典礼在庄严的国州歌声中启幕,掀开充满意义的一天。 经过六年的努力与成长,高三学生正式迎来人生的新阶段;初三毕业生亦迈向更高层次的挑战。典礼在庄严的国州歌声中启幕,掀开充满意义的一天。
## 董事长马彣清博士致词(由代表宣读) ## 董事长马彣清博士致词(由代表宣读)
![董事会秘书长黄仰力董事代表致辞](https://img.yphsalumni.org/i/2025/11/27/sndspp.jpg)
因公务繁忙未克出席,马彣清董事长由董事会秘书长黄仰力董事代表致辞。他转达董事长的寄语:“成功从来不是侥幸,而是毅力不断累积的成果。” 同时肯定毕业生在求学路上的坚持,并勉励他们继续以积极态度面对未来。 因公务繁忙未克出席,马彣清董事长由董事会秘书长黄仰力董事代表致辞。他转达董事长的寄语:“成功从来不是侥幸,而是毅力不断累积的成果。” 同时肯定毕业生在求学路上的坚持,并勉励他们继续以积极态度面对未来。
## 张嘉群校长三项叮咛:以品格与眼界开创未来 ## 张嘉群校长三项叮咛:以品格与眼界开创未来
![张嘉群校长致辞](https://img.yphsalumni.org/i/2025/11/27/smvqcm.jpg)
张嘉群校长在致辞中寄语毕业生,并提出三项叮咛,期许他们在往后的道路上继续发光发热: 张嘉群校长在致辞中寄语毕业生,并提出三项叮咛,期许他们在往后的道路上继续发光发热:
### 叮咛一:永怀初心 ### 叮咛一:永怀初心
@@ -69,14 +79,10 @@ ogImage: "https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg"
## 柔佛州董联会主席兼校务顾问陈大锦先生致辞 ## 柔佛州董联会主席兼校务顾问陈大锦先生致辞
![董联会主席兼校务顾问陈大锦先生致辞](https://img.yphsalumni.org/i/2025/11/27/smxf8t.jpg)
陈大锦先生分享了他访问上海中医药大学的见闻,特别是该校完善的奖助学金制度。他希望本校辅导处与升学资讯处能协助学生把握机会,踊跃申请明年 9 月开课的相关奖学金,为升学之路开拓更多可能。 陈大锦先生分享了他访问上海中医药大学的见闻,特别是该校完善的奖助学金制度。他希望本校辅导处与升学资讯处能协助学生把握机会,踊跃申请明年 9 月开课的相关奖学金,为升学之路开拓更多可能。
## 欢送刘连升老师光荣荣休 ## 欢送刘连升老师光荣荣休
![刘连升老师光荣荣休](https://img.yphsalumni.org/i/2025/11/27/spazik.jpg)
在典礼上,校方特别举行了“欢送刘连升老师荣休”环节,为这位服务永平中学 35 年、深受师生爱戴的资深教师献上诚挚祝福。 在典礼上,校方特别举行了“欢送刘连升老师荣休”环节,为这位服务永平中学 35 年、深受师生爱戴的资深教师献上诚挚祝福。
刘连升老师在任职期间,以其和蔼可亲的性格与渊博的历史知识,陪伴无数学生走过求学阶段。他不仅课堂上“聊古论今”,从古代帝王先烈谈到世界变迁,更在课余时与学生畅谈时事,从传统文化一路聊到新兴科技与 AI 技术,是学生眼中既严谨又风趣的良师益友。 刘连升老师在任职期间,以其和蔼可亲的性格与渊博的历史知识,陪伴无数学生走过求学阶段。他不仅课堂上“聊古论今”,从古代帝王先烈谈到世界变迁,更在课余时与学生畅谈时事,从传统文化一路聊到新兴科技与 AI 技术,是学生眼中既严谨又风趣的良师益友。
@@ -88,12 +94,10 @@ ogImage: "https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg"
## 颁发董事长设立的奖学金 ## 颁发董事长设立的奖学金
典礼上同步进行董事长设立的各项奖学金颁发仪式,以表扬在学业、操行与综合表现上有卓越成绩的学生。 典礼上同步进行董事长设立的各项奖学金颁发仪式,以表扬在学业、操行与综合表现上有卓越成绩的学生。
(详见[图集](https://drive.google.com/drive/folders/1n3aRxxBwn-k6jzAOogV2ChBHKDA0c0qG) (详见图集
## 特别演出:永中之星冠军林妤桐献唱 ## 特别演出:永中之星冠军林妤桐献唱
![林妤桐学妹献唱](https://img.yphsalumni.org/i/2025/11/27/sr370l.jpg)
在典礼进入高潮之前,校方安排了一场温馨惊喜表演 —— 第一届“永中之星”冠军、来自初三诚的林妤桐学妹献唱两首歌曲《Forever Young》以及《凤凰花开的路口》。她以清亮而富感染力的歌声向高三学长姐献上最真挚的祝福也为典礼增添一份青春与深情的色彩。 在典礼进入高潮之前,校方安排了一场温馨惊喜表演 —— 第一届“永中之星”冠军、来自初三诚的林妤桐学妹献唱两首歌曲《Forever Young》以及《凤凰花开的路口》。她以清亮而富感染力的歌声向高三学长姐献上最真挚的祝福也为典礼增添一份青春与深情的色彩。
## 高三教师团队呈献毕业回忆视频 ## 高三教师团队呈献毕业回忆视频
@@ -104,10 +108,6 @@ ogImage: "https://img.yphsalumni.org/i/2025/11/27/st6hzt.jpg"
## 歌声中道别,在掌声中启航 ## 歌声中道别,在掌声中启航
![高三毕业生合唱](https://img.yphsalumni.org/i/2025/11/27/ss2wuz.jpg)
典礼尾声,高三毕业生深情演唱《再见》,而初三与高三学生共同合唱《毕业歌》,歌声回荡礼堂,为今年的毕业典礼写下温馨句点。现场气氛在歌声中变得格外动人,许多毕业生眼眶泛红,纷纷表示将铭记这一刻。 典礼尾声,高三毕业生深情演唱《再见》,而初三与高三学生共同合唱《毕业歌》,歌声回荡礼堂,为今年的毕业典礼写下温馨句点。现场气氛在歌声中变得格外动人,许多毕业生眼眶泛红,纷纷表示将铭记这一刻。
上午 11 时正,典礼圆满结束。为感谢师生与来宾的参与,马彣清董事长特别准备了供 600 人享用的自助餐,设宴于礼堂楼下。现场气氛融洽温馨。同时,本校友会也成功招收 14 名新会员,为未来的发展注入新的力量。 上午 11 时正,典礼圆满结束。为感谢师生与来宾的参与,马彣清董事长特别准备了供 600 人享用的自助餐,设宴于礼堂楼下。现场气氛融洽温馨。同时,本校友会也成功招收 14 名新会员,为未来的发展注入新的力量。
[2025 年毕业典礼图集](https://drive.google.com/drive/folders/1n3aRxxBwn-k6jzAOogV2ChBHKDA0c0qG)

View File

@@ -4,13 +4,14 @@ date: "2025-10-01"
updated: "2025-10-01" updated: "2025-10-01"
author: "麦祖奕学长" author: "麦祖奕学长"
description: "永中校友会官网正式上线,为校友提供最新资讯、活动报名及互动交流平台。" description: "永中校友会官网正式上线,为校友提供最新资讯、活动报名及互动交流平台。"
cover: "https://img.yphsalumni.org/i/2025/11/28/qqc3ft.png" cover: "/news/20251001-official-web-launch/Screenshot.png"
tags: ["活动", "公告", "产品更新"] tags: ["活动", "公告", "产品更新"]
category: "通知" category: "通知"
highlight: true highlight: true
seoTitle: "永中校友会官网上线 | 最新活动与资讯平台" seoTitle: "永中校友会官网上线 | 最新活动与资讯平台"
seoDescription: "永中校友会官网正式上线,校友可在平台获取最新资讯、报名活动及参与互动。" seoDescription: "永中校友会官网正式上线,校友可在平台获取最新资讯、报名活动及参与互动。"
ogImage: "https://img.yphsalumni.org/i/2025/11/28/qqc3ft.png" ogImage: "/images/og/news-launch.jpg"
slug: "/news/20251001-official-web-launch"
--- ---
永中校友会官网正式上线啦!🎉 永中校友会官网正式上线啦!🎉

View File

@@ -1,40 +0,0 @@
---
title: "永平中学校友会与校友联络处的区别"
date: "2025-11-28"
updated: "2025-11-28"
author: "永平中学校友会"
description: "毕业校友常说“我都加入校友群组了”,实则误入了校友联络处。本文厘清其与永平中学校友会的区别与使命。"
cover: "https://img.yphsalumni.org/i/2025/11/28/sbk8ue.jpeg"
tags: ["永平中学", "校友会", "校友联络处", "区别", "公告"]
category: "公告"
highlight: true
seoTitle: "永平中学校友会与校友联络处的区别 | 官方说明"
seoDescription: "毕业校友常说“我都加入校友群组了”,实则误入了校友联络处。本文厘清其与永平中学校友会的区别与使命。"
ogImage: "https://img.yphsalumni.org/i/2025/11/28/sbk8ue.jpeg"
---
**永平中学校友会致广大校友的一封信**
亲爱的永平中学校友们:
在近期的毕业典礼上,我们欣喜地听到许多新校友分享“我已加入校友群组”的喜悦。这份对母校的深切情谊,令我们深深感动。
我们同时也注意到,部分校友可能产生了一个美丽的误会:大家加入的“校友联络处”群组,是由学校董事会设立的官方联络平台,主要负责校友信息的收集与传达。而我们所熟知的“永平中学校友会”,则是一个由历届毕业生**自发创建、独立运作的校友社区组织**。
自成立以来,永平中学校友会始终秉承以下宗旨,由校友共建、为校友服务:
- **联结校友情谊**:搭建纯粹、活跃的交流平台,让友谊跨越届别。
- **支持母校发展**:凝聚校友力量,回馈我们共同的永平中学。
- **推动教育、文化与社区活动**:举办丰富多彩的活动,丰富校友生活。
- **建立校友与在校生之间的桥梁**:传承经验与关怀,助力学弟学妹成长。
校友联络处与校友会,二者服务校友的初心一致,是相辅相成的伙伴。我们由衷欢迎每一位热心校友加入我们这个充满活力的毕业生社区,共同为母校的发展注入来自校友群体的独特力量!
**加入我们,共同书写校友故事:**
校友会官方平台https://yphsalumni.org/
<!-- 联系我们:[请在此处填入邮箱或具体负责人联系方式] -->
永平中学校友会<br/>
2025年11月28日

View File

@@ -1,54 +0,0 @@
下面给你一个**实用、可直接交给设计师落地的公告封面设计方案**,基于你们「校友会 vs 校友联络处」容易混淆这一情境,重点是**清晰、正式、易识别、避免再次误会**。
---
# 🎨 公告封面设计方案(适用于官网首页 / Banner / WhatsApp 分享图)
## **1. 视觉主题**
**关键词:清晰区隔、正式感、组织可信度**
色调保持学校主色系(如#fb9e3a#fcef91),并加上一条亮色做强调,提升官方感。
---
## **2. 版式构成**
### ### **A. 顶部:醒目的组织身份**
**「永平中学校友会」**
* 使用学校和校友会 logo + 标题文字(右)
* 字体使用较厚重、带权威感的 Serif / Sans Serif
* 加上小字「官方公告」标签
---
### **B. 中间:公告主标题(视觉核心)**
标题建议直接点出“澄清 & 提醒”的意图:
* **《校友会与校友联络处群组区分公告》**
字体加粗,居中,字号大,确保在手机上也能一眼看懂。
---
### **C. 配图 / 图标建议**
#### **徽章背景淡化**
校徽做 20% 透明大背景,体现官方权威。
---
## **3. 尺寸 & 格式(设计师直接可用)**
* Website banner: **1920×1080**
---
## **4. 文案建议(印在封面下方的小字)**
> “近期部分校友误将校友联络处群组误认为校友会官方群组,特此澄清。”
---

View File

@@ -1,56 +0,0 @@
**主题:欢迎加入永平中学校友会!**
亲爱的校友,您好!
感谢您加入 **永平中学校友会Yong Peng High School Alumni Association**
自您成为会员的这一刻起,我们正式迎来了一位新的伙伴,也多了一份共同守护母校与社区的力量。
---
## 🎉 **我们是谁?**
永平中学校友会成立以来,一直致力于:
* **联结校友情谊**
* **支持母校发展**
* **推动教育、文化与社区活动**
* **建立校友与在校生之间的桥梁**
您的加入,让我们更有力量继续前进。
---
## 📌 **作为会员,您可享有:**
* 活动、讲座、聚会的**优先参与权**
* 校友资讯、重要公告的**第一时间通知**
* 参与校友会项目、社区计划的**贡献机会**
* 与来自各领域校友建立联系的**交流平台**
---
## 🗓️ **接下来能做什么?**
为帮助您更快融入校友会生态,我们建议:
1. **保存本会的官方联系方式**WhatsApp / 社媒)
2. **访问我们的官网**
3. **留意即将发布的活动资讯**
4. 若愿意参与志工 / 筹委,请随时回复我们
---
## ❤️ **我们欢迎您与我们同行**
无论您身处何地,校友会的大门永远为您敞开。
让我们一同继续延续永中的精神,传承、回馈、成长。
若您有任何疑问,欢迎随时与我们联系。
谢谢您再次加入我们,
**欢迎回家!**
**永平中学校友会**
Yong Peng High School Alumni Association
https://yphsalumni.org

View File

@@ -5,15 +5,14 @@ export default defineNuxtConfig({
compatibilityDate: "2025-07-15", compatibilityDate: "2025-07-15",
devtools: { enabled: true }, devtools: { enabled: true },
modules: [ modules: [
"@nuxt/ui",
"@nuxtjs/seo", "@nuxtjs/seo",
"@nuxt/ui",
"@nuxt/content", "@nuxt/content",
"@nuxt/image", "@nuxt/image",
"reka-ui/nuxt", "reka-ui/nuxt",
"@nuxtjs/robots", "@nuxtjs/robots",
"@nuxtjs/sitemap", "@nuxtjs/sitemap",
], ],
ssr: true,
css: ["~/assets/css/main.css"], css: ["~/assets/css/main.css"],
vite: { vite: {
plugins: [tailwindcss()], plugins: [tailwindcss()],
@@ -51,7 +50,7 @@ export default defineNuxtConfig({
{ property: "og:url", content: "https://yphsalumni.org" }, // ✅ 换成你网站的真实域名 { property: "og:url", content: "https://yphsalumni.org" }, // ✅ 换成你网站的真实域名
{ {
property: "og:image", property: "og:image",
content: "https://img.yphsalumni.org/i/2025/11/28/qk9fe8.png", content: "https://yphsalumni.org/hero-image-2.jpg?v=2",
}, // ✅ 上传一张封面图 }, // ✅ 上传一张封面图
// Twitter Card // Twitter Card
@@ -63,7 +62,7 @@ export default defineNuxtConfig({
}, },
{ {
name: "twitter:image", name: "twitter:image",
content: "https://img.yphsalumni.org/i/2025/11/28/qk9fe8.png", content: "https://yphsalumni.org/hero-image-2.jpg?v=2",
}, },
], ],
}, },

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
public/hero-image-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
public/hero-image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB