From 45c701b14919ccdb3f45aee4ad50b16a68329592 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 9 Apr 2026 09:43:38 +0200 Subject: [PATCH] feat(SEO): update meta tags and structured data for improved search visibility - Revised title and description meta tags in index.html for better alignment with the application's focus on table tennis club management. - Updated Open Graph and Twitter meta tags to reflect the new branding and features of the application. - Enhanced structured data implementation in SeoLandingPage.vue to support JSON-LD for better SEO performance. - Adjusted sitemap.xml to reflect updated last modified dates for improved indexing. - Refined content in ClubMemberManagementPage.vue to emphasize member profiles and data management. --- frontend/index.html | 14 +++---- frontend/public/sitemap.xml | 14 +++---- frontend/src/components/SeoLandingPage.vue | 37 +++++++++++++++++ frontend/src/utils/seo.js | 11 +++-- .../src/views/ClubMemberManagementPage.vue | 41 +++++++++++++++---- 5 files changed, 90 insertions(+), 27 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index fb162a11..341a451f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -11,23 +11,23 @@ - Trainingstagebuch – Umfassende Vereinsverwaltung, Trainingsplanung & Turnierorganisation - + Trainingstagebuch – Vereinsverwaltung für Tischtennis, Trainingsplanung & Turniere + - - + + - - + + @@ -53,7 +53,7 @@ "operatingSystem": "Web", "description": "Umfassende Vereinsverwaltung mit Mitgliederverwaltung, Trainingsgruppen, Trainingszeiten, Trainingstagebuch, Turnierorganisation (intern, offen, offiziell), Team-Management, MyTischtennis-Integration, Statistiken und flexiblen Berechtigungssystemen – DSGVO‑konform und einfach zu bedienen.", "featureList": [ - "Mitgliederverwaltung", + "Mitgliederverwaltung & Mitgliederprofile", "Trainingsgruppen & Trainingszeiten", "Trainingstagebuch & Dokumentation", "Turniere (intern, offen, offiziell)", diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml index f0e64486..1573481f 100644 --- a/frontend/public/sitemap.xml +++ b/frontend/public/sitemap.xml @@ -5,43 +5,43 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://tt-tagebuch.de/ - 2026-03-27 + 2026-04-01 weekly 1.0 https://tt-tagebuch.de/impressum - 2026-03-27 + 2026-04-01 yearly 0.3 https://tt-tagebuch.de/vereinssoftware-tischtennis - 2026-03-27 + 2026-04-01 monthly 0.8 https://tt-tagebuch.de/mitgliederverwaltung-verein - 2026-03-27 + 2026-04-01 monthly 0.8 https://tt-tagebuch.de/trainingsplanung-tischtennis - 2026-03-27 + 2026-04-01 monthly 0.8 https://tt-tagebuch.de/turniersoftware-tischtennis - 2026-03-27 + 2026-04-01 monthly 0.8 https://tt-tagebuch.de/datenschutz - 2026-03-27 + 2026-04-01 yearly 0.3 diff --git a/frontend/src/components/SeoLandingPage.vue b/frontend/src/components/SeoLandingPage.vue index b18c9c7e..fb841e8f 100644 --- a/frontend/src/components/SeoLandingPage.vue +++ b/frontend/src/components/SeoLandingPage.vue @@ -88,6 +88,43 @@ export default { type: Array, default: () => [], }, + /** Optional JSON-LD (schema.org), z. B. eine WebPage */ + structuredData: { + type: Object, + default: null, + }, + }, + watch: { + structuredData: { + deep: true, + handler() { + this.removeStructuredDataScript(); + this.injectStructuredDataScript(); + }, + }, + }, + mounted() { + this.injectStructuredDataScript(); + }, + beforeUnmount() { + this.removeStructuredDataScript(); + }, + methods: { + injectStructuredDataScript() { + if (!this.structuredData || typeof this.structuredData !== 'object') return; + const el = document.createElement('script'); + el.setAttribute('type', 'application/ld+json'); + el.setAttribute('data-seo-landing-structured', '1'); + el.textContent = JSON.stringify(this.structuredData); + document.head.appendChild(el); + this._structuredDataEl = el; + }, + removeStructuredDataScript() { + if (this._structuredDataEl?.parentNode) { + this._structuredDataEl.parentNode.removeChild(this._structuredDataEl); + } + this._structuredDataEl = null; + }, }, }; diff --git a/frontend/src/utils/seo.js b/frontend/src/utils/seo.js index 8e0105b7..68fe476a 100644 --- a/frontend/src/utils/seo.js +++ b/frontend/src/utils/seo.js @@ -4,7 +4,8 @@ const DEFAULT_IMAGE = `${SITE_URL}/android-chrome-512x512.png`; const DEFAULT_SEO = { title: 'Trainingstagebuch – Vereinsverwaltung für Tischtennis, Trainingsplanung & Turniere', - description: 'Trainingstagebuch ist die Software für Tischtennisvereine: Mitgliederverwaltung, Trainingsplanung, Trainingstagebuch, Gruppen, Turniere, Team-Management, Statistiken und MyTischtennis-Integration.', + description: + 'Trainingstagebuch: Vereinssoftware für Tischtennisvereine – Mitgliederverwaltung und Mitgliederprofile, Trainingsplanung, Trainingstagebuch, Turniere, Mannschaften, Statistiken, MyTischtennis-Anbindung.', robots: 'index,follow' }; @@ -16,12 +17,14 @@ const ROUTE_SEO = { }, '/vereinssoftware-tischtennis': { title: 'Vereinssoftware für Tischtennisvereine | Trainingstagebuch', - description: 'Webbasierte Vereinssoftware für Tischtennisvereine mit Mitgliederverwaltung, Trainingsplanung, Mannschaftsorganisation, Turnieren und Auswertungen.', + description: + 'Webbasierte Vereinssoftware für Tischtennisvereine: Mitgliederverwaltung, Mitgliederprofile, Trainingsplanung, Mannschaften, Turniere und Auswertungen in einer Anwendung.', robots: 'index,follow' }, '/mitgliederverwaltung-verein': { - title: 'Mitgliederverwaltung für Vereine | Trainingstagebuch', - description: 'Mitgliederverwaltung für Vereine mit Stammdaten, Rollen, Gruppenbezug und organisatorischer Verbindung zu Training und Vereinsabläufen.', + title: 'Mitgliederprofile & Mitgliederverwaltung für Tischtennisvereine | Trainingstagebuch', + description: + 'Mitgliederverwaltung für Vereine: Mitgliederprofile und Stammdaten zentral pflegen – Rollen, Gruppen, Status, Kontaktdaten und Bezug zu Training & Mannschaften im Tischtennis.', robots: 'index,follow' }, '/trainingsplanung-tischtennis': { diff --git a/frontend/src/views/ClubMemberManagementPage.vue b/frontend/src/views/ClubMemberManagementPage.vue index ddf48922..a15113aa 100644 --- a/frontend/src/views/ClubMemberManagementPage.vue +++ b/frontend/src/views/ClubMemberManagementPage.vue @@ -1,18 +1,21 @@