कंपनी "करेलियन डेवलपर" 0.3.0 "शुया" अद्यतन प्रस्तुत करती है "GIRVAS" सामग्री प्रबंधन प्रणाली के लिए। यह संस्करण "वोइत्सी" कोड चरण का स्थान लेता है और इसका नाम शुया नदी के नाम पर रखा गया है — जो करेलिया गणराज्य की सबसे बड़ी नदियों में से एक है, जो सुओयार्वी झील से निकलती है और वनगा झील में गिरती है। CMS संस्करणों को करेलियाई जल निकायों के नाम देने की परंपरा उत्पाद की क्षेत्रीय पहचान और घरेलू तकनीकी विकास के परिदृश्य में इसके एकीकरण पर जोर देती है।
यह रिलीज़ सामग्री नेविगेशन टूल, खोज क्षमताओं और खोज इंजन अनुकूलन टूल के विकास पर केंद्रित है, और इसमें सिस्टम कोर में महत्वपूर्ण तकनीकी सुधार भी शामिल हैं।
अंतर्निहित खोज इंजन

संस्करण के प्रमुख नवाचारों में से एक पूर्ण-पाठ खोज इंजन का कार्यान्वयन है जो तृतीय-पक्ष सेवाओं या प्लगइन्स के बिना काम करता है।
खोज प्रविष्टियों के शीर्षक, विवरण, मुख्य सामग्री और कीवर्ड में की जाती है। AND-खोज लॉजिक को स्वचालित क्वेरी विभाजन और विराम चिह्नों को हटाने के साथ लागू किया गया है, जो अस्पष्ट वाक्यांशों के साथ भी प्रासंगिक सामग्री खोजने की अनुमति देता है। परिणाम रैंकिंग कॉन्फ़िगर करने योग्य वेट गुणांक पर आधारित है: शीर्षकों में मिलान दस्तावेज़ बॉडी में मिलानों पर प्राथमिकता लेते हैं।
एडमिन पैनल में, खोज क्षमताओं को भविष्य के अद्यतनों में विस्तारित किया जाएगा: प्रमाणित उपयोगकर्ता प्रविष्टियों, स्थैतिक पृष्ठों और सिस्टम उपयोगकर्ताओं में खोज कर सकेंगे।
तिथि नेविगेशन के साथ प्रविष्टि संग्रह
संस्करण 0.3.0 एक अंतर्निहित प्रविष्टि संग्रह प्रस्तुत करता है — कालानुक्रमिक सामग्री नेविगेशन के लिए एक उपकरण।
कार्यक्षमता स्वचालित रूप से प्रविष्टियों को वर्षों और महीनों के अनुसार समूहित करती है, प्रत्येक समय अंतराल के लिए प्रकाशनों की संख्या प्रदर्शित करती है। नेविगेशन श्रेणी के अनुसार फ़िल्टरिंग का समर्थन करता है: उपयोगकर्ता साइट की सभी प्रविष्टियों के सामान्य संग्रह और व्यक्तिगत श्रेणी के संग्रह दोनों को देख सकता है। ब्रेडक्रंब चयनित अवधि और श्रेणी के आधार पर गतिशील रूप से उत्पन्न होते हैं, जिससे संग्रह स्तरों के बीच सुविधाजनक आवाजाही संभव होती है। संग्रह पृष्ठ खोज इंजनों के लिए अनुकूलित हैं — मेटा टैग स्वचालित रूप से उत्पन्न होते हैं, और संग्रह पृष्ठ URL गतिशील साइटमैप में शामिल हैं।
श्रेणी पदानुक्रम और बेहतर नेविगेशन

अद्यतन पुनरावर्ती ट्री ट्रैवर्सल के साथ चाइल्ड श्रेणियों के लिए समर्थन लागू करता है। श्रेणी पृष्ठ अब सभी नेस्टेड उपश्रेणियों को ध्यान में रखते हुए प्रविष्टियाँ प्रदर्शित करता है, जो सामग्री का अधिक संपूर्ण प्रतिनिधित्व प्रदान करता है।
श्रेणी और प्रविष्टि पृष्ठों पर ब्रेडक्रंब रूट श्रेणी से वर्तमान स्थिति तक पूर्ण पदानुक्रम श्रृंखला प्रदर्शित करते हैं। यह सुधार उपयोगकर्ता नेविगेशन और खोज इंजनों के लिए साइट की आंतरिक लिंकिंग दोनों को बढ़ाता है।
अंतर्निहित SEO सामग्री विश्लेषक

एडमिन पैनल के पृष्ठ और प्रविष्टि संपादक में एक क्लाइंट-साइड SEO विश्लेषक एकीकृत है, जो सर्वर अनुरोधों के बिना काम करता है।
विश्लेषक पाँच क्षेत्रों में जाँच करता है: शीर्षक, मेटा विवरण, कीवर्ड, सामग्री और URL। जाँच किए गए मापदंडों में SEO टैग की लंबाई और सामग्री, शीर्षकों, पहले पैराग्राफ और मुख्य पाठ में कीवर्ड की उपस्थिति, शीर्षक पदानुक्रम की शुद्धता, छवियों में alt पाठ की उपस्थिति, बाहरी लिंक पर rel="nofollow" विशेषता, "नंगे" URL का पता लगाना और उन्हें Markdown प्रारूप में स्वरूपित करने के लिए सिफारिशें शामिल हैं। विश्लेषण परिणाम तुरंत रंग कोडिंग, प्रगति पट्टियों और विशिष्ट सुधार अनुशंसाओं के ब्लॉक के साथ प्रदर्शित होते हैं।

सामग्री ब्लॉक

एडमिन पैनल में एक नया "सामग्री ब्लॉक" अनुभाग जोड़ा गया है, जो टेम्पलेट्स को संपादित किए बिना थीम अनुभागों में एम्बेड किए गए विशेष तत्वों के प्रबंधन के लिए डिज़ाइन किया गया है।
कई ब्लॉक प्रकार समर्थित हैं:
- "व्यक्तिगत" — Markdown स्वरूपण के साथ मनमानी सामग्री;
- "कैबिनेट" — उपयोगकर्ता मिनी-प्रोफ़ाइल जो अप्रमाणित आगंतुकों के लिए स्वचालित रूप से लॉगिन फॉर्म प्रदर्शित करती है;
- "श्रेणी सूची" — सभी प्रविष्टि श्रेणियों की पदानुक्रमित सूची;
- "रिक्त" — तृतीय-पक्ष मॉड्यूल द्वारा एकीकरण के लिए विशेष प्रकार।
प्रत्येक ब्लॉक के लिए, प्रदर्शन नियम URL पर लागू नियमित अभिव्यक्तियों के माध्यम से कॉन्फ़िगर किए जाते हैं। जब अनुरोधित पता पैटर्न से मेल खाता है, तो ब्लॉक थीम के संबंधित अनुभाग में प्रदर्शित होता है।
तकनीकी कोर सुधार
संस्करण 0.3.0 में QueryBuilder घटक — आंतरिक SQL क्वेरी बिल्डर — में महत्वपूर्ण सुधार शामिल हैं:
- JOIN (INNER, LEFT, RIGHT, FULL) के लिए MySQL और PostgreSQL के लिए अनुकूली स्थिति जनरेशन के साथ समर्थन जोड़ा गया;
- CASE एक्सप्रेशन के निर्माण के लिए CaseExpression क्लास लागू की गई, जिसमें JSON खोज के लिए विशेष विधियाँ शामिल हैं;
- व्यापक इंडेक्स समर्थन जोड़ा गया:
BTREE,HASH,GIST,GIN,SPGIST,BRIN,FULLTEXTप्रकारों के साथ-साथUNIQUE,CONCURRENTLY,IF NOT EXISTSऔर WHERE स्थितियों के साथ आंशिक इंडेक्स के निर्माण और विलोपन के लिए।
CMS स्थापना के दौरान, सभी तालिकाओं के लिए ऑप्टिमाइज़िंग इंडेक्स स्वचालित रूप से बनाए जाते हैं, जिसमें JSONB फ़ील्ड (PostgreSQL) के लिए GIN इंडेक्स और प्रकाशित प्रविष्टियों के लिए आंशिक इंडेक्स शामिल हैं। इंडेक्स निर्माण त्रुटियाँ स्थापना प्रक्रिया को बाधित किए बिना लॉग की जाती हैं।
EntryCategory क्लास में आरंभीकृत डेटा की कैशिंग जोड़ी गई है, जो initData() विधि के कई कॉल के दौरान डेटाबेस क्वेरी को दोहराने से रोकती है।
माइग्रेशन
फ़ाइल सिस्टम अद्यतन
हम दृढ़ता से अनुशंसा करते हैं कि अद्यतन आधिकारिक CMS "GIRVAS" रिपॉजिटरी के माध्यम से प्राप्त करें। यदि आप इसे डिफ़ॉल्ट रूप से उपयोग करते हैं, तो production ब्रांच पर स्विच करने के बाद (यदि आपने पहले कोई अन्य ब्रांच उपयोग किया था) अपने प्रोजेक्ट की रूट में कंसोल कमांड git pull चलाएँ।
फ़ाइल सिस्टम को अपडेट करने के बाद, कैश साफ़ करें: rm -R ./cache/* (पथ आपके सिस्टम में आपके वास्तविक स्थान के आधार पर भिन्न हो सकता है)।
डेटाबेस माइग्रेशन
CMS फ़ाइलों को सफलतापूर्वक अपडेट करने के बाद, डेटाबेस माइग्रेशन किया जाना चाहिए। ऐसा करने के लिए, आपको अपने DBMS प्रकार के आधार पर, अपने डेटाबेस पर कई SQL क्वेरी चलानी होंगी (बस कॉपी और पेस्ट करें)।
MySQL के लिए
-- सामग्री ब्लॉक के लिए तालिका बनाना --
CREATE TABLE IF NOT EXISTS content_blocks (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
texts JSON,
metadata JSON,
createdUnixTimestamp INTEGER NOT NULL DEFAULT 0,
updatedUnixTimestamp INTEGER NOT NULL DEFAULT 0
);
-- entries तालिका के लिए इंडेक्स
CREATE INDEX idx_entries_category ON entries (categoryID);
CREATE INDEX idx_entries_author ON entries (authorID);
CREATE INDEX idx_entries_created ON entries (createdUnixTimestamp DESC);
CREATE INDEX idx_entries_updated ON entries (updatedUnixTimestamp);
CREATE UNIQUE INDEX idx_entries_name_unique ON entries (name);
-- entries_categories तालिका के लिए इंडेक्स
CREATE INDEX idx_entries_categories_parent ON entries_categories (parentID);
CREATE UNIQUE INDEX idx_entries_categories_name_unique ON entries_categories (name);
-- entries_comments तालिका के लिए इंडेक्स
CREATE INDEX idx_entries_comments_entry ON entries_comments (entryID);
CREATE INDEX idx_entries_comments_author ON entries_comments (authorID);
CREATE INDEX idx_entries_comments_created ON entries_comments (createdUnixTimestamp DESC);
-- pages_static तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX idx_pages_static_name_unique ON pages_static (name);
CREATE INDEX idx_pages_static_author ON pages_static (authorID);
CREATE INDEX idx_pages_static_created ON pages_static (createdUnixTimestamp DESC);
-- users तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX idx_users_login_unique ON users (login);
CREATE UNIQUE INDEX idx_users_email_unique ON users (email);
-- users_sessions तालिका के लिए इंडेक्स
CREATE INDEX idx_users_sessions_user ON users_sessions (userID);
CREATE INDEX idx_users_sessions_token ON users_sessions (token);
-- forms_data तालिका के लिए इंडेक्स
CREATE INDEX idx_forms_data_form ON forms_data (formID);
CREATE INDEX idx_forms_data_created ON forms_data (createdUnixTimestamp DESC);
-- web_channels तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX idx_web_channels_name_unique ON web_channels (name);
-- metrics तालिका के लिए इंडेक्स
CREATE INDEX idx_metrics_date ON metrics (date);
PostgreSQL के लिए
-- सामग्री ब्लॉक के लिए तालिका बनाना --
CREATE TABLE IF NOT EXISTS content_blocks (
"id" SERIAL NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"texts" JSONB,
"metadata" JSONB,
"createdUnixTimestamp" INTEGER NOT NULL DEFAULT 0,
"updatedUnixTimestamp" INTEGER NOT NULL DEFAULT 0
);
-- entries तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_entries_category ON entries ("categoryID");
CREATE INDEX IF NOT EXISTS idx_entries_author ON entries ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_created ON entries ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_entries_updated ON entries ("updatedUnixTimestamp");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_name_unique ON entries ("name");
CREATE INDEX IF NOT EXISTS idx_entries_texts_gin ON entries USING GIN (texts);
CREATE INDEX IF NOT EXISTS idx_entries_metadata_gin ON entries USING GIN (metadata);
CREATE INDEX IF NOT EXISTS idx_entries_published ON entries ("createdUnixTimestamp" DESC) WHERE (metadata::jsonb->>"isPublished")::boolean = true;
-- entries_categories तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_entries_categories_parent ON entries_categories ("parentID");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_categories_name_unique ON entries_categories ("name");
-- entries_comments तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_entries_comments_entry ON entries_comments ("entryID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_author ON entries_comments ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_created ON entries_comments ("createdUnixTimestamp" DESC);
-- pages_static तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX IF NOT EXISTS idx_pages_static_name_unique ON pages_static ("name");
CREATE INDEX IF NOT EXISTS idx_pages_static_author ON pages_static ("authorID");
CREATE INDEX IF NOT EXISTS idx_pages_static_created ON pages_static ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_pages_static_texts_gin ON pages_static USING GIN (texts);
-- users तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_login_unique ON users ("login");
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_unique ON users ("email");
-- users_sessions तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_users_sessions_user ON users_sessions ("userID");
CREATE INDEX IF NOT EXISTS idx_users_sessions_token ON users_sessions ("token");
-- forms_data तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_forms_data_form ON forms_data ("formID");
CREATE INDEX IF NOT EXISTS idx_forms_data_created ON forms_data ("createdUnixTimestamp" DESC);
-- web_channels तालिका के लिए इंडेक्स
CREATE UNIQUE INDEX IF NOT EXISTS idx_web_channels_name_unique ON web_channels ("name");
-- metrics तालिका के लिए इंडेक्स
CREATE INDEX IF NOT EXISTS idx_metrics_date ON metrics ("date");
निष्कर्ष
CMS "GIRVAS" 0.3.0 "शुया" अद्यतन उपयोगकर्ता नेविगेशन और खोज टूल के विकास को कोर के गहन तकनीकी आधुनिकीकरण के साथ जोड़ता है। हम अनुशंसा करते हैं कि सभी उपयोगकर्ता उन्नत खोज क्षमताओं, सुविधाजनक सामग्री संग्रहण और नए SEO अनुकूलन टूल का मूल्यांकन करने के लिए अद्यतन करें।
टिप्पणियाँ