Merge branch 'main' of https://git.tsschulz.de/torsten/singlechat
This commit is contained in:
1
client/public/ads.txt
Normal file
1
client/public/ads.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
google.com, pub-1104166651501135, DIRECT, f08c47fec0942fa0
|
||||||
@@ -3,11 +3,9 @@
|
|||||||
<ins
|
<ins
|
||||||
ref="adElement"
|
ref="adElement"
|
||||||
class="adsbygoogle"
|
class="adsbygoogle"
|
||||||
style="display:block"
|
style="display:inline-block;width:320px;height:50px"
|
||||||
:data-ad-client="adClient"
|
:data-ad-client="adClient"
|
||||||
:data-ad-slot="adSlot"
|
:data-ad-slot="adSlot"
|
||||||
data-ad-format="auto"
|
|
||||||
data-full-width-responsive="true"
|
|
||||||
></ins>
|
></ins>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -53,11 +51,16 @@ onMounted(async () => {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.header-ad-banner {
|
.header-ad-banner {
|
||||||
flex: 1;
|
flex: 0 0 auto;
|
||||||
min-width: 280px;
|
width: 320px;
|
||||||
max-width: 728px;
|
min-width: 320px;
|
||||||
|
max-width: 320px;
|
||||||
|
height: 50px;
|
||||||
margin: 0 16px;
|
margin: 0 16px;
|
||||||
padding: 4px 0;
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-ad-banner :deep(ins) {
|
.header-ad-banner :deep(ins) {
|
||||||
@@ -66,9 +69,16 @@ onMounted(async () => {
|
|||||||
|
|
||||||
@media (max-width: 960px) {
|
@media (max-width: 960px) {
|
||||||
.header-ad-banner {
|
.header-ad-banner {
|
||||||
min-width: 220px;
|
width: 300px;
|
||||||
max-width: 468px;
|
min-width: 300px;
|
||||||
margin: 0 10px;
|
max-width: 300px;
|
||||||
|
height: 50px;
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-ad-banner :deep(ins) {
|
||||||
|
width: 300px !important;
|
||||||
|
height: 50px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="imprint-container">
|
<div class="imprint-container">
|
||||||
<a href="/partners">Partner</a>
|
<a href="/partners">Partner</a>
|
||||||
|
<a href="/ratgeber">Ratgeber</a>
|
||||||
<a href="/faq">FAQ</a>
|
<a href="/faq">FAQ</a>
|
||||||
<a href="/regeln">Regeln</a>
|
<a href="/regeln">Regeln</a>
|
||||||
<a href="/sicherheit">Sicherheit</a>
|
<a href="/sicherheit">Sicherheit</a>
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ import FaqView from '../views/FaqView.vue';
|
|||||||
import PrivacyView from '../views/PrivacyView.vue';
|
import PrivacyView from '../views/PrivacyView.vue';
|
||||||
import RulesView from '../views/RulesView.vue';
|
import RulesView from '../views/RulesView.vue';
|
||||||
import SafetyView from '../views/SafetyView.vue';
|
import SafetyView from '../views/SafetyView.vue';
|
||||||
|
import GuideHubView from '../views/GuideHubView.vue';
|
||||||
|
import GuideFirstMessageView from '../views/GuideFirstMessageView.vue';
|
||||||
|
import GuideProfileView from '../views/GuideProfileView.vue';
|
||||||
|
import GuideSafetyView from '../views/GuideSafetyView.vue';
|
||||||
|
import GuideRedFlagsView from '../views/GuideRedFlagsView.vue';
|
||||||
|
|
||||||
const SITE_URL = 'https://www.ypchat.net';
|
const SITE_URL = 'https://www.ypchat.net';
|
||||||
const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`;
|
const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`;
|
||||||
@@ -152,6 +157,15 @@ const privacySchema = {
|
|||||||
inLanguage: 'de-DE'
|
inLanguage: 'de-DE'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const guideHubSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'CollectionPage',
|
||||||
|
name: 'Ratgeber - SingleChat',
|
||||||
|
url: `${SITE_URL}/ratgeber`,
|
||||||
|
description: 'Ratgeber mit Tipps zu erster Nachricht, Profilgestaltung, Datenschutz und sicheren Gespraechen im Single Chat.',
|
||||||
|
inLanguage: 'de-DE'
|
||||||
|
};
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
@@ -265,6 +279,86 @@ const routes = [
|
|||||||
schema: privacySchema
|
schema: privacySchema
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/ratgeber',
|
||||||
|
name: 'ratgeber',
|
||||||
|
component: GuideHubView,
|
||||||
|
meta: {
|
||||||
|
title: 'Ratgeber fuer privaten Single Chat - SingleChat',
|
||||||
|
description: 'Praxisnahe Ratgeberartikel zu Chat-Einstieg, Profiloptimierung, Sicherheit und Red Flags im Online-Chat.',
|
||||||
|
keywords: 'chat ratgeber, single chat tipps, profil tipps, sicher chatten, online chat red flags',
|
||||||
|
ogTitle: 'Ratgeber fuer privaten Single Chat - SingleChat',
|
||||||
|
ogDescription: 'Hilfreiche Leitfaeden fuer bessere Gespraeche und mehr Sicherheit im Chat.',
|
||||||
|
ogType: 'website',
|
||||||
|
image: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: guideHubSchema
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/ratgeber/erste-nachricht',
|
||||||
|
name: 'ratgeber-erste-nachricht',
|
||||||
|
component: GuideFirstMessageView,
|
||||||
|
meta: {
|
||||||
|
title: 'Die erste Nachricht im Chat - Tipps & Beispiele',
|
||||||
|
description: 'So gelingt die erste Nachricht im Single Chat: konkrete Beispiele, typische Fehler und einfache Vorlagen.',
|
||||||
|
keywords: 'erste nachricht chat, anschreiben tipps, chat beispiele, single chat einstieg',
|
||||||
|
ogTitle: 'Die erste Nachricht im Chat - Tipps & Beispiele',
|
||||||
|
ogDescription: 'Konkrete Beispiele fuer einen natuerlichen und respektvollen Chat-Einstieg.',
|
||||||
|
ogType: 'article',
|
||||||
|
image: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/ratgeber/profil-tipps',
|
||||||
|
name: 'ratgeber-profil-tipps',
|
||||||
|
component: GuideProfileView,
|
||||||
|
meta: {
|
||||||
|
title: 'Profil verbessern fuer bessere Chats - SingleChat',
|
||||||
|
description: 'Verbessere dein Chat-Profil mit klaren, ehrlichen Angaben und starte leichter passende Gespraeche.',
|
||||||
|
keywords: 'profil tipps chat, online profil verbessern, single chat profil',
|
||||||
|
ogTitle: 'Profil verbessern fuer bessere Chats - SingleChat',
|
||||||
|
ogDescription: 'Einfache Schritte fuer ein besseres Profil und passendere Unterhaltungen.',
|
||||||
|
ogType: 'article',
|
||||||
|
image: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/ratgeber/sicher-chatten',
|
||||||
|
name: 'ratgeber-sicher-chatten',
|
||||||
|
component: GuideSafetyView,
|
||||||
|
meta: {
|
||||||
|
title: 'Sicher chatten und Daten schuetzen - SingleChat',
|
||||||
|
description: 'Datenschutz-Tipps fuer anonymes Chatten: Welche Informationen du teilen kannst und welche nicht.',
|
||||||
|
keywords: 'sicher chatten, datenschutz chat, anonym chat tipps',
|
||||||
|
ogTitle: 'Sicher chatten und Daten schuetzen - SingleChat',
|
||||||
|
ogDescription: 'Praktische Regeln fuer mehr Sicherheit und Privatsphaere im Online-Chat.',
|
||||||
|
ogType: 'article',
|
||||||
|
image: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/ratgeber/red-flags',
|
||||||
|
name: 'ratgeber-red-flags',
|
||||||
|
component: GuideRedFlagsView,
|
||||||
|
meta: {
|
||||||
|
title: 'Red Flags im Online-Chat erkennen - SingleChat',
|
||||||
|
description: 'Warnzeichen bei Spam und Manipulation im Chat erkennen und richtig reagieren.',
|
||||||
|
keywords: 'red flags chat, online chat sicherheit, betrug chat erkennen',
|
||||||
|
ogTitle: 'Red Flags im Online-Chat erkennen - SingleChat',
|
||||||
|
ogDescription: 'Fruehe Warnsignale im Chat erkennen und sich wirksam schuetzen.',
|
||||||
|
ogType: 'article',
|
||||||
|
image: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/mockup-redesign',
|
path: '/mockup-redesign',
|
||||||
name: 'mockup-redesign',
|
name: 'mockup-redesign',
|
||||||
|
|||||||
@@ -129,6 +129,7 @@
|
|||||||
<h1>Chat</h1>
|
<h1>Chat</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<HeaderAdBanner />
|
||||||
</header>
|
</header>
|
||||||
<div class="horizontal-box horizontal-box-login">
|
<div class="horizontal-box horizontal-box-login">
|
||||||
<div class="content login-content-shell">
|
<div class="content login-content-shell">
|
||||||
@@ -154,6 +155,7 @@ import SearchView from '../components/SearchView.vue';
|
|||||||
import InboxView from '../components/InboxView.vue';
|
import InboxView from '../components/InboxView.vue';
|
||||||
import HistoryView from '../components/HistoryView.vue';
|
import HistoryView from '../components/HistoryView.vue';
|
||||||
import ImprintContainer from '../components/ImprintContainer.vue';
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
|
||||||
const chatStore = useChatStore();
|
const chatStore = useChatStore();
|
||||||
|
|
||||||
|
|||||||
120
client/src/views/GuideFirstMessageView.vue
Normal file
120
client/src/views/GuideFirstMessageView.vue
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chat-container">
|
||||||
|
<header class="header">
|
||||||
|
<router-link to="/" class="app-brand app-brand-link">
|
||||||
|
<span class="app-brand-mark">S</span>
|
||||||
|
<div class="app-brand-copy">
|
||||||
|
<span class="app-brand-eyebrow">SingleChat</span>
|
||||||
|
<h1>Ratgeber</h1>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
<HeaderAdBanner />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="content-page">
|
||||||
|
<h2>Die erste Nachricht im Chat: einfach und wirksam</h2>
|
||||||
|
<p>
|
||||||
|
Der Einstieg entscheidet oft, ob aus einem Match wirklich ein Gespraech wird. Gute erste Nachrichten sind kurz,
|
||||||
|
freundlich und konkret. Vermeide austauschbare Einzeiler und beziehe dich auf ein Detail aus dem Profil.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Viele Nutzer scheitern nicht an fehlender Sympathie, sondern an unklarem Einstieg. Wer den ersten Kontakt als
|
||||||
|
kleine Einladung statt als Test versteht, bekommt haeufiger eine echte Antwort.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Ein guter Aufbau in drei Schritten</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Begruessung mit Namen oder Nickname.</li>
|
||||||
|
<li>Eine konkrete Beobachtung oder Frage, die nicht kopiert wirkt.</li>
|
||||||
|
<li>Ein lockerer Abschluss, der eine Antwort leicht macht.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Wann eine Nachricht zu lang ist</h3>
|
||||||
|
<p>
|
||||||
|
Als Faustregel gilt: 1 bis 3 Saetze reichen am Anfang. Lange Monologe wirken schnell wie Copy-Paste. Besser ist
|
||||||
|
eine kurze Frage mit echtem Bezug und Raum fuer die Antwort.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Beispiele fuer bessere erste Nachrichten</h3>
|
||||||
|
<p>
|
||||||
|
Statt „Hi, wie gehts?“ besser: „Hi Lara, du schreibst, dass du gerne reist - was war dein schoenster Ort in den
|
||||||
|
letzten zwei Jahren?“
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Statt „Na?“ besser: „Hey Ben, dein Musikgeschmack klingt spannend. Eher ruhige Playlists oder energiegeladene
|
||||||
|
Tracks beim Arbeiten?“
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Statt „Bist du echt?“ besser: „Hi, ich bin neu hier und mag klare Gespraeche. Worueber schreibst du gerne zuerst:
|
||||||
|
Alltag, Freizeit oder Musik?“
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Typische Fehler vermeiden</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Zu lange Texte direkt am Anfang.</li>
|
||||||
|
<li>Zu persoenliche Fragen in der ersten Nachricht.</li>
|
||||||
|
<li>Mehrfaches Nachfassen ohne Antwort.</li>
|
||||||
|
<li>Ironie ohne Kontext, die schnell falsch verstanden wird.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Wenn keine Antwort kommt</h3>
|
||||||
|
<p>
|
||||||
|
Nicht jede Nachricht fuehrt zu einem Gespraech. Das ist normal. Warte mit einem zweiten Kontakt mindestens etwas
|
||||||
|
Zeit und formuliere freundlich und kurz. Danach gilt: respektvoll weiterziehen statt Druck aufbauen.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Kurzcheck vor dem Absenden</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Ist die Nachricht konkret statt austauschbar?</li>
|
||||||
|
<li>Ist sie freundlich und ohne Druck formuliert?</li>
|
||||||
|
<li>Enthaelt sie eine Frage, auf die man leicht antworten kann?</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mehr Tipps findest du auch in unserem
|
||||||
|
<router-link to="/ratgeber/profil-tipps">Profil-Ratgeber</router-link> und auf der Seite
|
||||||
|
<router-link to="/ratgeber/sicher-chatten">Sicher chatten</router-link>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="content-meta">
|
||||||
|
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<ImprintContainer />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.content-page {
|
||||||
|
max-width: 980px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px 14px 36px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #344038;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page h2,
|
||||||
|
.content-page h3 {
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page a {
|
||||||
|
color: #245c3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-meta {
|
||||||
|
margin-top: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #637067;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-brand-link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
168
client/src/views/GuideHubView.vue
Normal file
168
client/src/views/GuideHubView.vue
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chat-container">
|
||||||
|
<header class="header">
|
||||||
|
<router-link to="/" class="app-brand app-brand-link">
|
||||||
|
<span class="app-brand-mark">S</span>
|
||||||
|
<div class="app-brand-copy">
|
||||||
|
<span class="app-brand-eyebrow">SingleChat</span>
|
||||||
|
<h1>Ratgeber</h1>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
<HeaderAdBanner />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="content-page">
|
||||||
|
<h2>Ratgeber: Sicher und entspannt chatten</h2>
|
||||||
|
<p>
|
||||||
|
In unserem Ratgeber findest du praxisnahe Tipps rund um privaten Chat, Profilgestaltung und digitale Sicherheit.
|
||||||
|
Alle Inhalte sind speziell fuer SingleChat-Nutzer geschrieben und werden laufend erweitert.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Wenn du neu im Chat bist, starte am besten mit dem Leitfaden zur ersten Unterhaltung und arbeite dich dann zu
|
||||||
|
den Themen Datenschutz, Profilqualitaet und respektvolle Kommunikation vor.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Ziel dieser Artikel ist nicht, moeglichst viele Nachrichten zu erzeugen, sondern bessere Gespraeche mit
|
||||||
|
gegenseitigem Respekt. Deshalb kombinieren wir konkrete Formulierungsbeispiele mit Sicherheitsregeln und klaren
|
||||||
|
Handlungsempfehlungen fuer schwierige Situationen.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<section class="editor-note">
|
||||||
|
<h3>Wie dieser Ratgeber aufgebaut ist</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Praxisnahe Schritt-fuer-Schritt-Anleitungen statt allgemeiner Floskeln.</li>
|
||||||
|
<li>Konkrete Beispiele fuer gute und schlechte Chat-Situationen.</li>
|
||||||
|
<li>Sicherheitsfokus: Datenschutz, Grenzsetzung und Verhalten bei Red Flags.</li>
|
||||||
|
<li>Regelmaessige Aktualisierung bei neuen Funktionen oder Moderationsregeln.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="guide-grid">
|
||||||
|
<article class="guide-card">
|
||||||
|
<h3><router-link to="/ratgeber/erste-nachricht">Die erste Nachricht im Chat</router-link></h3>
|
||||||
|
<p>
|
||||||
|
Konkrete Formulierungen, typische Fehler und ein einfacher Aufbau, mit dem du natuerlich ins Gespraech
|
||||||
|
kommst.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
<article class="guide-card">
|
||||||
|
<h3><router-link to="/ratgeber/profil-tipps">Profil verbessern in 10 Minuten</router-link></h3>
|
||||||
|
<p>
|
||||||
|
So waehlen Nutzer Nickname, Alter und Selbstbeschreibung so, dass sie passende Kontakte statt Zufallstreffer
|
||||||
|
erhalten.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
<article class="guide-card">
|
||||||
|
<h3><router-link to="/ratgeber/sicher-chatten">Sicher chatten und Daten schuetzen</router-link></h3>
|
||||||
|
<p>
|
||||||
|
Datenschutz im Alltag: welche Informationen du teilen kannst und was du besser nie im Chat schreiben solltest.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
<article class="guide-card">
|
||||||
|
<h3><router-link to="/ratgeber/red-flags">Red Flags im Online-Chat erkennen</router-link></h3>
|
||||||
|
<p>
|
||||||
|
Fruehe Warnzeichen bei Spam, Manipulation und Betrugsversuchen inklusive klarer Reaktionsempfehlungen.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="next-steps">
|
||||||
|
<h3>Empfohlene Lesereihenfolge</h3>
|
||||||
|
<ol>
|
||||||
|
<li><router-link to="/ratgeber/erste-nachricht">Die erste Nachricht im Chat</router-link></li>
|
||||||
|
<li><router-link to="/ratgeber/profil-tipps">Profil verbessern in 10 Minuten</router-link></li>
|
||||||
|
<li><router-link to="/ratgeber/sicher-chatten">Sicher chatten und Daten schuetzen</router-link></li>
|
||||||
|
<li><router-link to="/ratgeber/red-flags">Red Flags im Online-Chat erkennen</router-link></li>
|
||||||
|
</ol>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<p class="content-meta">
|
||||||
|
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<ImprintContainer />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.content-page {
|
||||||
|
max-width: 1020px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px 14px 36px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #344038;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page h2 {
|
||||||
|
margin: 0 0 10px;
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-grid {
|
||||||
|
margin-top: 16px;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-note,
|
||||||
|
.next-steps {
|
||||||
|
margin-top: 18px;
|
||||||
|
border: 1px solid #d7dfd9;
|
||||||
|
border-radius: 12px;
|
||||||
|
background: #ffffff;
|
||||||
|
padding: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-note h3,
|
||||||
|
.next-steps h3 {
|
||||||
|
margin: 0 0 8px;
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-card {
|
||||||
|
border: 1px solid #d7dfd9;
|
||||||
|
border-radius: 12px;
|
||||||
|
background: #ffffff;
|
||||||
|
padding: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-card h3 {
|
||||||
|
margin: 0 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-card p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-card a {
|
||||||
|
color: #1f6e43;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-card a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-meta {
|
||||||
|
margin-top: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #637067;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-brand-link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.guide-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
119
client/src/views/GuideProfileView.vue
Normal file
119
client/src/views/GuideProfileView.vue
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chat-container">
|
||||||
|
<header class="header">
|
||||||
|
<router-link to="/" class="app-brand app-brand-link">
|
||||||
|
<span class="app-brand-mark">S</span>
|
||||||
|
<div class="app-brand-copy">
|
||||||
|
<span class="app-brand-eyebrow">SingleChat</span>
|
||||||
|
<h1>Ratgeber</h1>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
<HeaderAdBanner />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="content-page">
|
||||||
|
<h2>Profil verbessern in 10 Minuten</h2>
|
||||||
|
<p>
|
||||||
|
Ein gutes Profil muss nicht lang sein. Entscheidend ist, dass andere Nutzer schnell erkennen, wer du bist und
|
||||||
|
wie man mit dir ins Gespraech kommt. Schon kleine Anpassungen helfen, passendere Unterhaltungen zu starten.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Gute Profile reduzieren Missverstaendnisse: Erwartungen werden klarer, Gespraeche starten einfacher und der
|
||||||
|
Umgangston bleibt meist respektvoller.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>1) Klarer, neutraler Nickname</h3>
|
||||||
|
<p>
|
||||||
|
Vermeide beleidigende Begriffe, reine Zahlencodes oder provozierende Namen. Ein klarer Nickname wirkt
|
||||||
|
vertrauenswuerdig und erleichtert den Einstieg.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>2) Realistische Angaben zu Alter und Interessen</h3>
|
||||||
|
<p>
|
||||||
|
Ehrliche Angaben verbessern die Treffer in der Suche. Wer Alter, Interessen und Gespraechsthemen sauber angibt,
|
||||||
|
bekommt haeufiger Antworten mit echtem Bezug.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>Nenne 2 bis 4 Interessen, die tatsaechlich zu deinem Alltag passen.</li>
|
||||||
|
<li>Vermeide ueberladene Listen ohne Prioritaeten.</li>
|
||||||
|
<li>Bleibe bei Angaben, die du im Chat auch glaubwuerdig erzaehlen kannst.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>3) Einladende erste Formulierung</h3>
|
||||||
|
<p>
|
||||||
|
Eine kurze Profilzeile wie „Mag Musik, Spaziergaenge und gute Gespraeche ueber Alltag und Reisen“ gibt direkt
|
||||||
|
einen Anknuepfungspunkt.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Schreibe lieber konkret als perfekt. Ein Satz mit persoenlicher Note funktioniert besser als allgemeine
|
||||||
|
Standardtexte.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4) Sicherheit immer mitdenken</h3>
|
||||||
|
<p>
|
||||||
|
Keine privaten Kontaktdaten im Profil und keine Hinweise auf Adresse, Arbeitgeber oder eindeutige Tagesroutinen.
|
||||||
|
Details zur Privatsphaere findest du unter
|
||||||
|
<router-link to="/ratgeber/sicher-chatten">Sicher chatten</router-link>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>5) Haeufige Profilfehler</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Leeres Profil oder nur ein Emoji.</li>
|
||||||
|
<li>Widerspruechliche Angaben zwischen Profiltext und Suchfilter.</li>
|
||||||
|
<li>Abwertende Formulierungen gegen andere Nutzergruppen.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Mini-Checkliste in 60 Sekunden</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Ist dein Nickname neutral und gut lesbar?</li>
|
||||||
|
<li>Sind Alter und Interessen aktuell?</li>
|
||||||
|
<li>Gibt es mindestens einen klaren Gespraechsanlass im Profiltext?</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Fuer konkrete Einstiegsbeispiele lohnt sich unser Leitfaden
|
||||||
|
<router-link to="/ratgeber/erste-nachricht">Die erste Nachricht im Chat</router-link>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="content-meta">
|
||||||
|
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<ImprintContainer />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.content-page {
|
||||||
|
max-width: 980px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px 14px 36px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #344038;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page h2,
|
||||||
|
.content-page h3 {
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page a {
|
||||||
|
color: #245c3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-meta {
|
||||||
|
margin-top: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #637067;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-brand-link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
106
client/src/views/GuideRedFlagsView.vue
Normal file
106
client/src/views/GuideRedFlagsView.vue
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chat-container">
|
||||||
|
<header class="header">
|
||||||
|
<router-link to="/" class="app-brand app-brand-link">
|
||||||
|
<span class="app-brand-mark">S</span>
|
||||||
|
<div class="app-brand-copy">
|
||||||
|
<span class="app-brand-eyebrow">SingleChat</span>
|
||||||
|
<h1>Ratgeber</h1>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
<HeaderAdBanner />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="content-page">
|
||||||
|
<h2>Red Flags im Online-Chat erkennen</h2>
|
||||||
|
<p>
|
||||||
|
Nicht jede ungewoehnliche Nachricht ist automatisch ein Problem. Es gibt aber klare Warnsignale, die du ernst
|
||||||
|
nehmen solltest. Je frueher du sie erkennst, desto besser schuetzt du dich.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Red Flags sind besonders aussagekraeftig, wenn mehrere Punkte gleichzeitig auftreten. Achte deshalb weniger auf
|
||||||
|
eine einzelne Formulierung und mehr auf wiederkehrende Muster.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Hauefige Red Flags</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Sehr schnelle emotionale Naehe ohne echten Austausch.</li>
|
||||||
|
<li>Widerspruechliche Angaben zu Alter, Wohnort oder Alltag.</li>
|
||||||
|
<li>Drang, den Chat sofort auf externe Messenger zu verlagern.</li>
|
||||||
|
<li>Anfragen zu Geld, Gutscheinen oder Zahlungsdiensten.</li>
|
||||||
|
<li>Druck durch Schuldgefuehle („Wenn du mich magst, dann ...“).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Risikostufen einschaetzen</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Niedrig: einzelne unklare Aussagen, aber kooperativer Ton.</li>
|
||||||
|
<li>Mittel: wiederholte Ausweichantworten und Druck zu externen Kanaelen.</li>
|
||||||
|
<li>Hoch: Geldforderungen, Drohungen oder klare Manipulationsversuche.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Was du konkret tun kannst</h3>
|
||||||
|
<p>
|
||||||
|
Stelle Rueckfragen zu unklaren Aussagen. Bleiben Antworten ausweichend oder aggressiv, beende das Gespraech.
|
||||||
|
Blockieren ist kein unfreundlicher Akt, sondern ein legitimer Selbstschutz.
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>Bleibe sachlich und vermeide Rechtfertigungsdiskussionen.</li>
|
||||||
|
<li>Teile keine persoenlichen Daten und keinen externen Kontakt.</li>
|
||||||
|
<li>Breche ab, sobald Grenzen nicht respektiert werden.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Bei Unsicherheit</h3>
|
||||||
|
<p>
|
||||||
|
Wenn du unsicher bist, teile keine persoenlichen Daten und warte mit weiterem Vertrauen. Nutze unsere Hinweise zu
|
||||||
|
<router-link to="/ratgeber/sicher-chatten">Sicher chatten</router-link> und melde auffaellige Profile ueber
|
||||||
|
<router-link to="/feedback">Feedback</router-link>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Kurzformel fuer den Alltag</h3>
|
||||||
|
<p>
|
||||||
|
Zweifel + Zeitdruck + Datenwunsch = Abbruch. Diese einfache Regel hilft, spontane Fehlentscheidungen in
|
||||||
|
kritischen Situationen zu vermeiden.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="content-meta">
|
||||||
|
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<ImprintContainer />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.content-page {
|
||||||
|
max-width: 980px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px 14px 36px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #344038;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page h2,
|
||||||
|
.content-page h3 {
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page a {
|
||||||
|
color: #245c3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-meta {
|
||||||
|
margin-top: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #637067;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-brand-link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
106
client/src/views/GuideSafetyView.vue
Normal file
106
client/src/views/GuideSafetyView.vue
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chat-container">
|
||||||
|
<header class="header">
|
||||||
|
<router-link to="/" class="app-brand app-brand-link">
|
||||||
|
<span class="app-brand-mark">S</span>
|
||||||
|
<div class="app-brand-copy">
|
||||||
|
<span class="app-brand-eyebrow">SingleChat</span>
|
||||||
|
<h1>Ratgeber</h1>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
<HeaderAdBanner />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="content-page">
|
||||||
|
<h2>Sicher chatten: Datenschutz im Alltag</h2>
|
||||||
|
<p>
|
||||||
|
Privater Chat funktioniert am besten, wenn du bewusst entscheidest, welche Informationen du teilst. Viele
|
||||||
|
Risiken lassen sich mit wenigen Regeln vermeiden, ohne dass der Chat unpersoenlich wird.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Sicherheit ist kein einmaliger Schritt, sondern ein Verhalten ueber den gesamten Kontakt hinweg. Je klarer deine
|
||||||
|
Grenzen von Beginn an sind, desto entspannter bleibt das Gespraech.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Was du nicht teilen solltest</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Telefonnummer, private E-Mail und Social-Media-Handles beim ersten Kontakt.</li>
|
||||||
|
<li>Adresse, Arbeitgeber, Schule oder feste Tagesroutinen.</li>
|
||||||
|
<li>Dokumente, Ticket-Screenshots oder Fotos mit sichtbaren sensiblen Daten.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Was du stattdessen teilen kannst</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Allgemeine Interessen und Hobbys ohne Ortsbezug.</li>
|
||||||
|
<li>Unkritische Alltagsthemen wie Musik, Serien oder Sport.</li>
|
||||||
|
<li>Persoenliche Meinungen, solange keine sensiblen Daten enthalten sind.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Warnzeichen bei Gespraechen</h3>
|
||||||
|
<p>
|
||||||
|
Sei vorsichtig, wenn dein Gegenueber schnell Druck aufbaut, Geldthemen anspricht oder versucht, dich auf externe
|
||||||
|
Plattformen zu ziehen. Das sind haeufige Muster bei Spam und Betrug.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Schrittfolge bei einem Vorfall</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Keine weiteren Daten senden und den Verlauf ruhig halten.</li>
|
||||||
|
<li>Kontakt sofort blockieren, wenn Druck oder Manipulation entsteht.</li>
|
||||||
|
<li>Auffaellige Nachrichten per Screenshot sichern.</li>
|
||||||
|
<li>Vorfall ueber <router-link to="/feedback">Feedback</router-link> melden.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>So reagierst du richtig</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Gespraech beenden, wenn es sich unwohl anfuehlt.</li>
|
||||||
|
<li>Nutzer blockieren und problematische Inhalte nicht weiterverbreiten.</li>
|
||||||
|
<li>Vorfall kurz dokumentieren und ueber Feedback melden.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Ergaenzend empfehlen wir die Seite <router-link to="/sicherheit">Sicherheit</router-link> und den Artikel
|
||||||
|
<router-link to="/ratgeber/red-flags">Red Flags im Online-Chat</router-link>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="content-meta">
|
||||||
|
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
|
||||||
|
</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<ImprintContainer />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
|
||||||
|
import ImprintContainer from '../components/ImprintContainer.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.content-page {
|
||||||
|
max-width: 980px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px 14px 36px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #344038;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page h2,
|
||||||
|
.content-page h3 {
|
||||||
|
color: #18201b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-page a {
|
||||||
|
color: #245c3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-meta {
|
||||||
|
margin-top: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #637067;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-brand-link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -419,8 +419,18 @@ export function setupBroadcast(io, __dirname) {
|
|||||||
if (sub === 'today') {
|
if (sub === 'today') {
|
||||||
const day = new Date().toISOString().slice(0, 10);
|
const day = new Date().toISOString().slice(0, 10);
|
||||||
const dayRecords = records.filter((r) => r.day === day);
|
const dayRecords = records.filter((r) => r.day === day);
|
||||||
const uniqueUsersToday = Array.from(new Set(dayRecords.map((r) => r.userName)))
|
const latestByUserToday = new Map();
|
||||||
.sort((a, b) => a.localeCompare(b, 'de'));
|
dayRecords
|
||||||
|
.slice()
|
||||||
|
.sort((a, b) => b.date - a.date)
|
||||||
|
.forEach((record) => {
|
||||||
|
if (!latestByUserToday.has(record.userName)) {
|
||||||
|
latestByUserToday.set(record.userName, record);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const uniqueUsersToday = Array.from(latestByUserToday.values())
|
||||||
|
.sort((a, b) => a.userName.localeCompare(b.userName, 'de'))
|
||||||
|
.map((r) => `${r.userName} (${r.age})`);
|
||||||
sendCommandTable(socket, 'Statistik: Heute', ['Metrik', 'Wert'], [
|
sendCommandTable(socket, 'Statistik: Heute', ['Metrik', 'Wert'], [
|
||||||
['Tag', day],
|
['Tag', day],
|
||||||
['Logins', dayRecords.length],
|
['Logins', dayRecords.length],
|
||||||
@@ -473,12 +483,12 @@ export function setupBroadcast(io, __dirname) {
|
|||||||
sendCommandTable(
|
sendCommandTable(
|
||||||
socket,
|
socket,
|
||||||
`Statistik: Namen (gesamt verschieden: ${new Set(records.map((r) => r.userName)).size})`,
|
`Statistik: Namen (gesamt verschieden: ${new Set(records.map((r) => r.userName)).size})`,
|
||||||
['Name', 'Anzahl', 'Letzter Login'],
|
['Name', 'Alter', 'Anzahl', 'Letzter Login'],
|
||||||
topNames.map(([name, count]) => {
|
topNames.map(([name, count]) => {
|
||||||
const latestRecord = records
|
const latestRecord = records
|
||||||
.filter((r) => r.userName === name)
|
.filter((r) => r.userName === name)
|
||||||
.sort((a, b) => b.date - a.date)[0];
|
.sort((a, b) => b.date - a.date)[0];
|
||||||
return [name, count, latestRecord ? latestRecord.timestamp : '-'];
|
return [name, latestRecord ? latestRecord.age : '-', count, latestRecord ? latestRecord.timestamp : '-'];
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -174,7 +174,21 @@ setupBroadcast(io, __dirname);
|
|||||||
// SPA-Fallback muss nach allen anderen Routen stehen
|
// SPA-Fallback muss nach allen anderen Routen stehen
|
||||||
if (IS_PRODUCTION) {
|
if (IS_PRODUCTION) {
|
||||||
const distPath = join(__dirname, '../docroot/dist');
|
const distPath = join(__dirname, '../docroot/dist');
|
||||||
const KNOWN_SPA_ROUTES = new Set(['/', '/partners', '/feedback', '/faq', '/regeln', '/sicherheit', '/datenschutz', '/mockup-redesign']);
|
const KNOWN_SPA_ROUTES = new Set([
|
||||||
|
'/',
|
||||||
|
'/partners',
|
||||||
|
'/feedback',
|
||||||
|
'/faq',
|
||||||
|
'/regeln',
|
||||||
|
'/sicherheit',
|
||||||
|
'/datenschutz',
|
||||||
|
'/ratgeber',
|
||||||
|
'/ratgeber/erste-nachricht',
|
||||||
|
'/ratgeber/profil-tipps',
|
||||||
|
'/ratgeber/sicher-chatten',
|
||||||
|
'/ratgeber/red-flags',
|
||||||
|
'/mockup-redesign'
|
||||||
|
]);
|
||||||
app.use(express.static(distPath));
|
app.use(express.static(distPath));
|
||||||
// Fallback für Vue Router (SPA) - muss am Ende stehen
|
// Fallback für Vue Router (SPA) - muss am Ende stehen
|
||||||
app.get('*', (req, res) => {
|
app.get('*', (req, res) => {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const SEO_LOCALES = [
|
|||||||
const LOCALE_SEO_META = {
|
const LOCALE_SEO_META = {
|
||||||
de: {
|
de: {
|
||||||
title: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
title: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
||||||
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.',
|
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.',
|
||||||
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat'
|
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat'
|
||||||
},
|
},
|
||||||
en: {
|
en: {
|
||||||
@@ -27,14 +27,14 @@ const LOCALE_SEO_META = {
|
|||||||
keywords: 'single chat, free chat, private chat, anonymous chat, online chat, meet singles'
|
keywords: 'single chat, free chat, private chat, anonymous chat, online chat, meet singles'
|
||||||
},
|
},
|
||||||
fr: {
|
fr: {
|
||||||
title: 'SingleChat: Chat célibataire gratuit, privé et anonyme',
|
title: 'SingleChat: Chat célibataire gratuit, privé et anonyme',
|
||||||
description: 'Chat célibataire gratuit pour des conversations privées et anonymes. Rencontrez de nouvelles personnes en toute sécurité.',
|
description: 'Chat célibataire gratuit pour des conversations privées et anonymes. Rencontrez de nouvelles personnes en toute sécurité.',
|
||||||
keywords: 'chat célibataire, chat gratuit, chat privé, chat anonyme, rencontre en ligne'
|
keywords: 'chat célibataire, chat gratuit, chat privé, chat anonyme, rencontre en ligne'
|
||||||
},
|
},
|
||||||
es: {
|
es: {
|
||||||
title: 'SingleChat: Chat gratis, privado y anónimo',
|
title: 'SingleChat: Chat gratis, privado y anónimo',
|
||||||
description: 'Chat gratis para solteros con conversaciones privadas y anónimas. Conoce gente nueva y comparte imágenes de forma segura.',
|
description: 'Chat gratis para solteros con conversaciones privadas y anónimas. Conoce gente nueva y comparte imágenes de forma segura.',
|
||||||
keywords: 'chat gratis, chat privado, chat anónimo, chat para solteros, conocer gente'
|
keywords: 'chat gratis, chat privado, chat anónimo, chat para solteros, conocer gente'
|
||||||
},
|
},
|
||||||
it: {
|
it: {
|
||||||
title: 'SingleChat: Chat single gratis, privata e anonima',
|
title: 'SingleChat: Chat single gratis, privata e anonima',
|
||||||
@@ -42,19 +42,19 @@ const LOCALE_SEO_META = {
|
|||||||
keywords: 'chat single, chat gratis, chat privata, chat anonima, incontri online'
|
keywords: 'chat single, chat gratis, chat privata, chat anonima, incontri online'
|
||||||
},
|
},
|
||||||
ja: {
|
ja: {
|
||||||
title: 'SingleChat: 無料・匿名・プライベートのシングルチャット',
|
title: 'SingleChat: 無料・匿å・プライベートã®ã‚·ãƒ³ã‚°ãƒ«ãƒãƒ£ãƒƒãƒˆ',
|
||||||
description: '無料で使えるシングルチャット。匿名かつプライベートに会話でき、画像共有も安全です。',
|
description: 'ç„¡æ–™ã§ä½¿ãˆã‚‹ã‚·ãƒ³ã‚°ãƒ«ãƒãƒ£ãƒƒãƒˆã€‚匿åã‹ã¤ãƒ—ライベートã«ä¼šè©±ã§ãã€ç”»åƒå…±æœ‰ã‚‚安全ã§ã™ã€‚',
|
||||||
keywords: 'シングルチャット, 無料チャット, 匿名チャット, プライベートチャット, オンラインチャット'
|
keywords: 'シングルãƒãƒ£ãƒƒãƒˆ, ç„¡æ–™ãƒãƒ£ãƒƒãƒˆ, 匿åãƒãƒ£ãƒƒãƒˆ, プライベートãƒãƒ£ãƒƒãƒˆ, オンラインãƒãƒ£ãƒƒãƒˆ'
|
||||||
},
|
},
|
||||||
zh: {
|
zh: {
|
||||||
title: 'SingleChat:免费、私密、匿名的单身聊天',
|
title: 'SingleChat:å…è´¹ã€ç§å¯†ã€åŒ¿åçš„å•身èŠå¤©',
|
||||||
description: '免费单身聊天,支持私密和匿名交流,安全分享图片并结识新朋友。',
|
description: 'å…è´¹å•身èŠå¤©ï¼Œæ”¯æŒç§å¯†å’ŒåŒ¿å交æµï¼Œå®‰å…¨åˆ†äº«å›¾ç‰‡å¹¶ç»“识新朋å‹ã€‚',
|
||||||
keywords: '单身聊天, 免费聊天, 私密聊天, 匿名聊天, 在线聊天'
|
keywords: 'å•身èŠå¤©, å…è´¹èŠå¤©, ç§å¯†èŠå¤©, 匿åèŠå¤©, 在线èŠå¤©'
|
||||||
},
|
},
|
||||||
th: {
|
th: {
|
||||||
title: 'SingleChat: แชตคนโสดฟรี แบบส่วนตัวและไม่ระบุตัวตน',
|
title: 'SingleChat: à¹à¸Šà¸•คนโสดฟรี à¹à¸šà¸šà¸ªà¹ˆà¸§à¸™à¸•ัวà¹à¸¥à¸°à¹„ม่ระบุตัวตน',
|
||||||
description: 'แชตคนโสดฟรี สำหรับการสนทนาแบบส่วนตัวและไม่ระบุตัวตน พบผู้คนใหม่ ๆ และแชร์รูปได้อย่างปลอดภัย',
|
description: 'à¹à¸Šà¸•คนโสดฟรี สำหรับà¸à¸²à¸£à¸ªà¸™à¸—นาà¹à¸šà¸šà¸ªà¹ˆà¸§à¸™à¸•ัวà¹à¸¥à¸°à¹„ม่ระบุตัวตน พบผู้คนใหม่ ๆ à¹à¸¥à¸°à¹à¸Šà¸£à¹Œà¸£à¸¹à¸›à¹„ด้à¸à¸¢à¹ˆà¸²à¸‡à¸›à¸¥à¸à¸”ภัย',
|
||||||
keywords: 'แชตคนโสด, แชตฟรี, แชตส่วนตัว, แชตไม่ระบุตัวตน, แชตออนไลน์'
|
keywords: 'à¹à¸Šà¸•คนโสด, à¹à¸Šà¸•ฟรี, à¹à¸Šà¸•ส่วนตัว, à¹à¸Šà¸•ไม่ระบุตัวตน, à¹à¸Šà¸•à¸à¸à¸™à¹„ลน์'
|
||||||
},
|
},
|
||||||
tl: {
|
tl: {
|
||||||
title: 'SingleChat: Libreng private at anonymous na single chat',
|
title: 'SingleChat: Libreng private at anonymous na single chat',
|
||||||
@@ -66,7 +66,7 @@ const LOCALE_SEO_META = {
|
|||||||
const seoData = {
|
const seoData = {
|
||||||
'/': {
|
'/': {
|
||||||
title: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
title: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
||||||
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.',
|
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.',
|
||||||
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat',
|
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat',
|
||||||
ogTitle: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
ogTitle: 'SingleChat: Kostenloser Single Chat, privat & anonym',
|
||||||
ogDescription: 'Kostenlos chatten, privat bleiben und neue Kontakte kennenlernen - mit sicherem Bildaustausch.',
|
ogDescription: 'Kostenlos chatten, privat bleiben und neue Kontakte kennenlernen - mit sicherem Bildaustausch.',
|
||||||
@@ -79,15 +79,15 @@ const seoData = {
|
|||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
url: `${SITE_URL}/`,
|
url: `${SITE_URL}/`,
|
||||||
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und tausche Bilder sicher aus.',
|
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und tausche Bilder sicher aus.',
|
||||||
inLanguage: 'de-DE'
|
inLanguage: 'de-DE'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'/partners': {
|
'/partners': {
|
||||||
title: 'Partner für Single Chat & Community - SingleChat',
|
title: 'Partner für Single Chat & Community - SingleChat',
|
||||||
description: 'Partnerseiten rund um Single Chat, Community und Online-Kontakte. Entdecke weitere Angebote und hilfreiche Ressourcen.',
|
description: 'Partnerseiten rund um Single Chat, Community und Online-Kontakte. Entdecke weitere Angebote und hilfreiche Ressourcen.',
|
||||||
keywords: 'single chat partner, chat community, kontaktseiten, single-chat links, online dating chat',
|
keywords: 'single chat partner, chat community, kontaktseiten, single-chat links, online dating chat',
|
||||||
ogTitle: 'Partner für Single Chat & Community - SingleChat',
|
ogTitle: 'Partner für Single Chat & Community - SingleChat',
|
||||||
ogDescription: 'Befreundete Seiten und Ressourcen rund um Chat, Kontakte und Community.',
|
ogDescription: 'Befreundete Seiten und Ressourcen rund um Chat, Kontakte und Community.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/partners`,
|
ogUrl: `${SITE_URL}/partners`,
|
||||||
@@ -109,10 +109,10 @@ const seoData = {
|
|||||||
},
|
},
|
||||||
'/feedback': {
|
'/feedback': {
|
||||||
title: 'Feedback zur Chat-Plattform - SingleChat',
|
title: 'Feedback zur Chat-Plattform - SingleChat',
|
||||||
description: 'Öffentliches Feedback zu SingleChat: Meinungen, Vorschläge und Erfahrungsberichte für einen besseren privaten Chat.',
|
description: 'Öffentliches Feedback zu SingleChat: Meinungen, Vorschläge und Erfahrungsberichte für einen besseren privaten Chat.',
|
||||||
keywords: 'chat feedback, single chat erfahrungen, rückmeldung chat, verbesserungsvorschläge',
|
keywords: 'chat feedback, single chat erfahrungen, rückmeldung chat, verbesserungsvorschläge',
|
||||||
ogTitle: 'Feedback zur Chat-Plattform - SingleChat',
|
ogTitle: 'Feedback zur Chat-Plattform - SingleChat',
|
||||||
ogDescription: 'Teile deine Erfahrungen und Verbesserungsvorschläge für SingleChat.',
|
ogDescription: 'Teile deine Erfahrungen und Verbesserungsvorschläge für SingleChat.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/feedback`,
|
ogUrl: `${SITE_URL}/feedback`,
|
||||||
ogImage: DEFAULT_IMAGE,
|
ogImage: DEFAULT_IMAGE,
|
||||||
@@ -122,7 +122,7 @@ const seoData = {
|
|||||||
'@type': 'CollectionPage',
|
'@type': 'CollectionPage',
|
||||||
name: 'Feedback - SingleChat',
|
name: 'Feedback - SingleChat',
|
||||||
url: `${SITE_URL}/feedback`,
|
url: `${SITE_URL}/feedback`,
|
||||||
description: 'Öffentliches Feedback zu SingleChat: Meinungen, Vorschläge und Erfahrungsberichte für einen besseren privaten Chat.',
|
description: 'Öffentliches Feedback zu SingleChat: Meinungen, Vorschläge und Erfahrungsberichte für einen besseren privaten Chat.',
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
@@ -133,10 +133,10 @@ const seoData = {
|
|||||||
},
|
},
|
||||||
'/faq': {
|
'/faq': {
|
||||||
title: 'FAQ: Kostenlos, privat und anonym chatten - SingleChat',
|
title: 'FAQ: Kostenlos, privat und anonym chatten - SingleChat',
|
||||||
description: 'FAQ zum kostenlosen Single Chat: anonym chatten, Privatsphäre schützen, Bilder sicher teilen und Nutzer blockieren.',
|
description: 'FAQ zum kostenlosen Single Chat: anonym chatten, Privatsphäre schützen, Bilder sicher teilen und Nutzer blockieren.',
|
||||||
keywords: 'single chat faq, kostenlos chatten, anonym chatten, privater chat, safe chat',
|
keywords: 'single chat faq, kostenlos chatten, anonym chatten, privater chat, safe chat',
|
||||||
ogTitle: 'FAQ: Kostenlos, privat und anonym chatten - SingleChat',
|
ogTitle: 'FAQ: Kostenlos, privat und anonym chatten - SingleChat',
|
||||||
ogDescription: 'Antworten auf Fragen zu Sicherheit, Privatsphäre und Funktionen im Single Chat.',
|
ogDescription: 'Antworten auf Fragen zu Sicherheit, Privatsphäre und Funktionen im Single Chat.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/faq`,
|
ogUrl: `${SITE_URL}/faq`,
|
||||||
ogImage: DEFAULT_IMAGE,
|
ogImage: DEFAULT_IMAGE,
|
||||||
@@ -146,7 +146,7 @@ const seoData = {
|
|||||||
'@type': 'FAQPage',
|
'@type': 'FAQPage',
|
||||||
name: 'FAQ - SingleChat',
|
name: 'FAQ - SingleChat',
|
||||||
url: `${SITE_URL}/faq`,
|
url: `${SITE_URL}/faq`,
|
||||||
description: 'FAQ zum kostenlosen Single Chat: anonym chatten, Privatsphäre schützen, Bilder sicher teilen und Nutzer blockieren.',
|
description: 'FAQ zum kostenlosen Single Chat: anonym chatten, Privatsphäre schützen, Bilder sicher teilen und Nutzer blockieren.',
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
@@ -156,11 +156,11 @@ const seoData = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
'/regeln': {
|
'/regeln': {
|
||||||
title: 'Chat-Regeln für sicheren Single Chat - SingleChat',
|
title: 'Chat-Regeln für sicheren Single Chat - SingleChat',
|
||||||
description: 'Regeln für respektvollen, privaten und sicheren Single Chat. Hinweise zu Verhalten, Spam und verbotenen Inhalten.',
|
description: 'Regeln für respektvollen, privaten und sicheren Single Chat. Hinweise zu Verhalten, Spam und verbotenen Inhalten.',
|
||||||
keywords: 'chat regeln, single chat regeln, sicher chatten, spam vermeiden, community richtlinien',
|
keywords: 'chat regeln, single chat regeln, sicher chatten, spam vermeiden, community richtlinien',
|
||||||
ogTitle: 'Chat-Regeln für sicheren Single Chat - SingleChat',
|
ogTitle: 'Chat-Regeln für sicheren Single Chat - SingleChat',
|
||||||
ogDescription: 'Unsere Richtlinien für respektvolle und sichere Gespräche im Chat.',
|
ogDescription: 'Unsere Richtlinien für respektvolle und sichere Gespräche im Chat.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/regeln`,
|
ogUrl: `${SITE_URL}/regeln`,
|
||||||
ogImage: DEFAULT_IMAGE,
|
ogImage: DEFAULT_IMAGE,
|
||||||
@@ -170,7 +170,7 @@ const seoData = {
|
|||||||
'@type': 'WebPage',
|
'@type': 'WebPage',
|
||||||
name: 'Regeln - SingleChat',
|
name: 'Regeln - SingleChat',
|
||||||
url: `${SITE_URL}/regeln`,
|
url: `${SITE_URL}/regeln`,
|
||||||
description: 'Regeln für respektvollen, privaten und sicheren Single Chat. Hinweise zu Verhalten, Spam und verbotenen Inhalten.',
|
description: 'Regeln für respektvollen, privaten und sicheren Single Chat. Hinweise zu Verhalten, Spam und verbotenen Inhalten.',
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
@@ -180,11 +180,11 @@ const seoData = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
'/sicherheit': {
|
'/sicherheit': {
|
||||||
title: 'Sicherheit & Privatsphäre im privaten Chat - SingleChat',
|
title: 'Sicherheit & Privatsphäre im privaten Chat - SingleChat',
|
||||||
description: 'Sicherheitsseite für privaten und anonymen Chat: Privatsphäre, Schutz vor Spam, Blockieren und Melden.',
|
description: 'Sicherheitsseite für privaten und anonymen Chat: Privatsphäre, Schutz vor Spam, Blockieren und Melden.',
|
||||||
keywords: 'privatsphäre chat, anonym chat sicherheit, blockieren melden, private chat safety',
|
keywords: 'privatsphäre chat, anonym chat sicherheit, blockieren melden, private chat safety',
|
||||||
ogTitle: 'Sicherheit & Privatsphäre im privaten Chat - SingleChat',
|
ogTitle: 'Sicherheit & Privatsphäre im privaten Chat - SingleChat',
|
||||||
ogDescription: 'So schützt du deine Daten und chattest sicher und anonym.',
|
ogDescription: 'So schützt du deine Daten und chattest sicher und anonym.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/sicherheit`,
|
ogUrl: `${SITE_URL}/sicherheit`,
|
||||||
ogImage: DEFAULT_IMAGE,
|
ogImage: DEFAULT_IMAGE,
|
||||||
@@ -192,9 +192,9 @@ const seoData = {
|
|||||||
schema: {
|
schema: {
|
||||||
'@context': 'https://schema.org',
|
'@context': 'https://schema.org',
|
||||||
'@type': 'WebPage',
|
'@type': 'WebPage',
|
||||||
name: 'Sicherheit & Privatsphäre - SingleChat',
|
name: 'Sicherheit & Privatsphäre - SingleChat',
|
||||||
url: `${SITE_URL}/sicherheit`,
|
url: `${SITE_URL}/sicherheit`,
|
||||||
description: 'Sicherheitsseite für privaten und anonymen Chat: Privatsphäre, Schutz vor Spam, Blockieren und Melden.',
|
description: 'Sicherheitsseite für privaten und anonymen Chat: Privatsphäre, Schutz vor Spam, Blockieren und Melden.',
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
@@ -204,10 +204,10 @@ const seoData = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
'/datenschutz': {
|
'/datenschutz': {
|
||||||
title: 'Datenschutzerklärung für Website und App - SingleChat',
|
title: 'Datenschutzerklärung für Website und App - SingleChat',
|
||||||
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
|
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
|
||||||
keywords: 'datenschutz singlechat, privacy policy chat app, chat datenschutz, android app datenschutz',
|
keywords: 'datenschutz singlechat, privacy policy chat app, chat datenschutz, android app datenschutz',
|
||||||
ogTitle: 'Datenschutzerklärung für Website und App - SingleChat',
|
ogTitle: 'Datenschutzerklärung für Website und App - SingleChat',
|
||||||
ogDescription: 'Informationen zur Datenverarbeitung bei SingleChat und in der Android-App.',
|
ogDescription: 'Informationen zur Datenverarbeitung bei SingleChat und in der Android-App.',
|
||||||
ogType: 'website',
|
ogType: 'website',
|
||||||
ogUrl: `${SITE_URL}/datenschutz`,
|
ogUrl: `${SITE_URL}/datenschutz`,
|
||||||
@@ -218,7 +218,7 @@ const seoData = {
|
|||||||
'@type': 'WebPage',
|
'@type': 'WebPage',
|
||||||
name: 'Datenschutz - SingleChat',
|
name: 'Datenschutz - SingleChat',
|
||||||
url: `${SITE_URL}/datenschutz`,
|
url: `${SITE_URL}/datenschutz`,
|
||||||
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
|
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SingleChat',
|
name: 'SingleChat',
|
||||||
@@ -226,6 +226,73 @@ const seoData = {
|
|||||||
},
|
},
|
||||||
inLanguage: 'de-DE'
|
inLanguage: 'de-DE'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'/ratgeber': {
|
||||||
|
title: 'Ratgeber fuer privaten Single Chat - SingleChat',
|
||||||
|
description: 'Praxisnahe Ratgeberartikel zu Chat-Einstieg, Profiloptimierung, Sicherheit und Red Flags im Online-Chat.',
|
||||||
|
keywords: 'chat ratgeber, single chat tipps, profil tipps, sicher chatten, online chat red flags',
|
||||||
|
ogTitle: 'Ratgeber fuer privaten Single Chat - SingleChat',
|
||||||
|
ogDescription: 'Hilfreiche Leitfaeden fuer bessere Gespraeche und mehr Sicherheit im Chat.',
|
||||||
|
ogType: 'website',
|
||||||
|
ogUrl: `${SITE_URL}/ratgeber`,
|
||||||
|
ogImage: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'CollectionPage',
|
||||||
|
name: 'Ratgeber - SingleChat',
|
||||||
|
url: `${SITE_URL}/ratgeber`,
|
||||||
|
description: 'Ratgeber mit Tipps zu erster Nachricht, Profilgestaltung, Datenschutz und sicheren Gespraechen im Single Chat.',
|
||||||
|
inLanguage: 'de-DE'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'/ratgeber/erste-nachricht': {
|
||||||
|
title: 'Die erste Nachricht im Chat - Tipps & Beispiele',
|
||||||
|
description: 'So gelingt die erste Nachricht im Single Chat: konkrete Beispiele, typische Fehler und einfache Vorlagen.',
|
||||||
|
keywords: 'erste nachricht chat, anschreiben tipps, chat beispiele, single chat einstieg',
|
||||||
|
ogTitle: 'Die erste Nachricht im Chat - Tipps & Beispiele',
|
||||||
|
ogDescription: 'Konkrete Beispiele fuer einen natuerlichen und respektvollen Chat-Einstieg.',
|
||||||
|
ogType: 'article',
|
||||||
|
ogUrl: `${SITE_URL}/ratgeber/erste-nachricht`,
|
||||||
|
ogImage: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
},
|
||||||
|
'/ratgeber/profil-tipps': {
|
||||||
|
title: 'Profil verbessern fuer bessere Chats - SingleChat',
|
||||||
|
description: 'Verbessere dein Chat-Profil mit klaren, ehrlichen Angaben und starte leichter passende Gespraeche.',
|
||||||
|
keywords: 'profil tipps chat, online profil verbessern, single chat profil',
|
||||||
|
ogTitle: 'Profil verbessern fuer bessere Chats - SingleChat',
|
||||||
|
ogDescription: 'Einfache Schritte fuer ein besseres Profil und passendere Unterhaltungen.',
|
||||||
|
ogType: 'article',
|
||||||
|
ogUrl: `${SITE_URL}/ratgeber/profil-tipps`,
|
||||||
|
ogImage: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
},
|
||||||
|
'/ratgeber/sicher-chatten': {
|
||||||
|
title: 'Sicher chatten und Daten schuetzen - SingleChat',
|
||||||
|
description: 'Datenschutz-Tipps fuer anonymes Chatten: Welche Informationen du teilen kannst und welche nicht.',
|
||||||
|
keywords: 'sicher chatten, datenschutz chat, anonym chat tipps',
|
||||||
|
ogTitle: 'Sicher chatten und Daten schuetzen - SingleChat',
|
||||||
|
ogDescription: 'Praktische Regeln fuer mehr Sicherheit und Privatsphaere im Online-Chat.',
|
||||||
|
ogType: 'article',
|
||||||
|
ogUrl: `${SITE_URL}/ratgeber/sicher-chatten`,
|
||||||
|
ogImage: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
|
},
|
||||||
|
'/ratgeber/red-flags': {
|
||||||
|
title: 'Red Flags im Online-Chat erkennen - SingleChat',
|
||||||
|
description: 'Warnzeichen bei Spam und Manipulation im Chat erkennen und richtig reagieren.',
|
||||||
|
keywords: 'red flags chat, online chat sicherheit, betrug chat erkennen',
|
||||||
|
ogTitle: 'Red Flags im Online-Chat erkennen - SingleChat',
|
||||||
|
ogDescription: 'Fruehe Warnsignale im Chat erkennen und sich wirksam schuetzen.',
|
||||||
|
ogType: 'article',
|
||||||
|
ogUrl: `${SITE_URL}/ratgeber/red-flags`,
|
||||||
|
ogImage: DEFAULT_IMAGE,
|
||||||
|
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
|
||||||
|
schema: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -415,7 +482,7 @@ function generateHTML(route, meta, __dirname) {
|
|||||||
|
|
||||||
const feedbackMarkup = feedbackItems.length > 0
|
const feedbackMarkup = feedbackItems.length > 0
|
||||||
? feedbackItems.map((item) => {
|
? feedbackItems.map((item) => {
|
||||||
const metaLine = [item.country, item.age, item.gender].filter(Boolean).join(' · ');
|
const metaLine = [item.country, item.age, item.gender].filter(Boolean).join(' · ');
|
||||||
return `<article style="border:1px solid #d7dfd9;border-radius:12px;padding:14px 16px;margin-bottom:12px;background:#fff;">
|
return `<article style="border:1px solid #d7dfd9;border-radius:12px;padding:14px 16px;margin-bottom:12px;background:#fff;">
|
||||||
<strong style="display:block;color:#18201b;">${escapeHtml(item.name || 'Anonym')}</strong>
|
<strong style="display:block;color:#18201b;">${escapeHtml(item.name || 'Anonym')}</strong>
|
||||||
${metaLine ? `<div style="font-size:12px;color:#637067;margin-top:4px;">${escapeHtml(metaLine)}</div>` : ''}
|
${metaLine ? `<div style="font-size:12px;color:#637067;margin-top:4px;">${escapeHtml(metaLine)}</div>` : ''}
|
||||||
@@ -447,7 +514,7 @@ export function setupSEORoutes(app, __dirname) {
|
|||||||
app.get(route, (req, res) => {
|
app.get(route, (req, res) => {
|
||||||
const html = generateHTML(route, meta, __dirname);
|
const html = generateHTML(route, meta, __dirname);
|
||||||
if (html) {
|
if (html) {
|
||||||
// Zusätzliches kanonisches Signal (neben link rel= im HTML) – hilft Google bei der Zuordnung.
|
// Zusätzliches kanonisches Signal (neben link rel= im HTML) – hilft Google bei der Zuordnung.
|
||||||
res.set('Link', `<${meta.ogUrl}>; rel="canonical"`);
|
res.set('Link', `<${meta.ogUrl}>; rel="canonical"`);
|
||||||
res.send(html);
|
res.send(html);
|
||||||
return;
|
return;
|
||||||
@@ -460,7 +527,7 @@ export function setupSEORoutes(app, __dirname) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.error('FEHLER: Gebaute index.html nicht gefunden:', distIndexPath);
|
console.error('FEHLER: Gebaute index.html nicht gefunden:', distIndexPath);
|
||||||
res.status(500).send('Gebaute index.html nicht gefunden. Bitte führe "npm run build" aus.');
|
res.status(500).send('Gebaute index.html nicht gefunden. Bitte führe "npm run build" aus.');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -473,7 +540,12 @@ Allow: /feedback
|
|||||||
Allow: /faq
|
Allow: /faq
|
||||||
Allow: /regeln
|
Allow: /regeln
|
||||||
Allow: /sicherheit
|
Allow: /sicherheit
|
||||||
Allow: /datenschutz
|
<<Allow: /datenschutz
|
||||||
|
Allow: /ratgeber
|
||||||
|
Allow: /ratgeber/erste-nachricht
|
||||||
|
Allow: /ratgeber/profil-tipps
|
||||||
|
Allow: /ratgeber/sicher-chatten
|
||||||
|
Allow: /ratgeber/red-flags
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
Disallow: /static/logs/
|
Disallow: /static/logs/
|
||||||
Disallow: /mockup-redesign
|
Disallow: /mockup-redesign
|
||||||
@@ -484,6 +556,11 @@ Sitemap: ${SITE_URL}/sitemap.xml
|
|||||||
res.send(robotsTxt);
|
res.send(robotsTxt);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get('/ads.txt', (req, res) => {
|
||||||
|
res.type('text/plain');
|
||||||
|
res.send('google.com, pub-1104166651501135, DIRECT, f08c47fec0942fa0\n');
|
||||||
|
});
|
||||||
|
|
||||||
app.get('/sitemap.xml', (req, res) => {
|
app.get('/sitemap.xml', (req, res) => {
|
||||||
try {
|
try {
|
||||||
const sitemap = buildSitemapXml();
|
const sitemap = buildSitemapXml();
|
||||||
|
|||||||
Reference in New Issue
Block a user