Content-Management-System basierend auf dem Laravel-Framework

PHPz
Freigeben: 2023-03-07 09:54:01
Original
5684 Leute haben es durchsucht

Entwicklung einer Fundbüro-Plattform auf dem Campus

——Aufbau eines minimalen Content-Management-Systems auf Basis der Laravel-BoxArchitektur



Zusammenfassung

Angesichts der aktuellen Grundsituation mit hoher Bevölkerungsdichte auf Universitätsgeländen, häufigen Massenaktivitäten und leichtem Verlust von Gegenständen wie Studium und Leben von Lehrern und Studenten analysieren wir die geringe Arbeitseffizienz , niedrige Wiederherstellungsrate und schlechte Vertraulichkeit im herkömmlichen Fundverfahren. Aufgrund der Probleme und Mängel wie der dezentralen Verwaltung wurde eine Plattform zur Verwaltung verlorener und gefundener Informationen im WEB-Modus vorgeschlagen. Diese Plattform behebt hauptsächlich die Mängel von Informationssilos im traditionellen Prozess der Verwaltung verlorener und gefundener Gegenstände, verbessert die Effizienz von verlorenen und gefundenen Arbeiten, verringert die direkten wirtschaftlichen Verluste von Lehrern und Schülern und erleichtert Lehrern und Schülern die Freigabe verlorener Eigentumsinformationen und das Sammeln verlorener Gegenstände des täglichen Lebens. Dieses System verwendet LAMP (Ubuntu+Apache+MySQL+php) als Entwicklungsumgebung. Das Back-End-PHP-Framework verwendet das derzeit beliebte Laravel-Framework und folgt vollständig dem MVC Das Entwurfsmuster. Als Front-End-Framework für die Ansicht wurde das inländische Open-Source-Responsive-HTML5-Entwicklungsframework AmazeUI ausgewählt, das sich gut an das Seitenlayout des mobilen Endgeräts anpassen lässt.

Schlüsselwörter: Campus; Informationsveröffentlichung; AmazeUI; Inhalt


1. Forschungshintergrund und Bedeutung des Themas

2. System-Machbarkeitsanalyse

1. Geschäftsprozessanalyse

2. Benutzererfahrungsanalyse

3. System

Moduldesign

1. Funktionsmodul

4 . Technische Umsetzung der Kernfunktionen2. Technisches Framework

4.MVC-Designmuster

5. Kerncode-Implementierung

5. Zusammenfassung

Einführung

1. Hintergrund und Bedeutung der Forschung

College-Studenten tragen mehr Dinge, haben viele Aktivitäten und reisen oft an verschiedene Orte, daher ist es an unserer Schule leicht, Gegenstände zu verlieren Es fehlt ein wirksames System, das Schülern beim Auffinden verlorener Gegenstände hilft. Angesichts der Tatsache, dass College-Studenten im Allgemeinen das Internet nutzen und die Netzwerkabdeckung auf dem Campus hoch ist, wird ein Fundbüro-System über das Internet implementiert, um eine bequeme und effiziente Möglichkeit zur Optimierung des Fundbüro-Geschäfts zu bieten und die Fundbüro-Verwaltung klar und transparent zu gestalten , einfach zu bedienen und einfach zu verwalten. Über dieses System kann der Eigentümer des verlorenen Eigentums die neueste Fundmeldung veröffentlichen, um alle zu benachrichtigen, und der Eigentümer kann den Eigentümer des verlorenen Eigentums über diese Plattform finden und kontaktieren. Und solange Sie ein registrierter Benutzer der Website sind, können Sie Managementartikel veröffentlichen und Nachrichten hinterlassen. Dies vermeidet nicht nur Vermögensverluste, sondern stärkt auch die Kommunikation zwischen Menschen. Daher wird die Entwicklung dieser Fundraising-Plattform das Leben von Lehrern und Studenten auf dem Campus erheblich erleichtern. Sie müssen sich nicht mehr um triviale Dinge wie das Auffinden verlorener Gegenstände kümmern und können die Technologie wirklich ihrem Leben dienen lassen.

2. System-Machbarkeitsanalyse

Technische Machbarkeit

Verwenden Sie stabiles Ubuntu

Linux
Als Server Umgebung übernimmt Apache die Kommunikation zwischen dem Client und dem Server. Die

MySQL-Datenbank

speichert Benutzerinformationen und veröffentlichte Artikel und Nachrichten. PHP wird als Back-End-Sprache verwendet, um eine dynamische Seitenverarbeitung zu implementieren, gekoppelt mit einfachen und einfachen Funktionen Elegante Reaktionsfähigkeit. Das Front-End-Entwicklungsframework kann ein Managementsystem entwickeln, das den Anforderungen entspricht.

Wirtschaftliche Machbarkeit

Die Entwicklung und der spätere Betrieb und die Wartung der Website-Plattform erfordern nur sehr wenig Personal und materielle Ressourcen und können in eingesetzt werden Schulen Auf dem Server wird es einheitlich durch die Mitarbeiter des Netzwerk-Service-Centers verwaltet.
  • Soziale Machbarkeit

    Auf dem Campus sehen wir oft diese Szene: Ein Klassenkamerad sucht immer wieder nach der Tür des Warmwasserraums und fragt sich dann: Warum fehlt sie wieder? , während er widerwillig erneut danach sucht. Oder vielleicht ist es wie in dieser Szene: „Benachrichtigung über gefundene Gegenstände – Wohnheimnummer, verlorene Gegenstände und schließlich verfluche diejenigen, die Gegenstände abholen und sie nicht zurückgeben.“ Die bestehende Arbeit im Fundbüro ist umständlich und ineffizient, also ist es so Es ist sehr wichtig, ein Fundbüro-Managementsystem zu entwickeln.


Systemanforderungsanalyse

1. Geschäftsprozess

Geschäftsprozessanalyse kann Entwicklern helfen, den Geschäftsprozess zu verstehen, ihn zu entdecken und systematisch zu verarbeiten Untersuchung von Fehlern und Versäumnissen in der Arbeit. Die Geschäftsprozessanalyse erfolgt mithilfe von Geschäftsprozessdiagrammen, die einige vorgeschriebene Symbole und Verbindungen verwenden, um einen bestimmten Geschäftsprozess darzustellen.

Der spezifische Geschäftsprozess dieses Systems ist in der folgenden Abbildung dargestellt:

Content-Management-System basierend auf dem Laravel-Framework

Geschäftsprozess.PNG

2. User-Experience-Analyse

User Experience ist ein sehr wichtiger Aspekt im heutigen Produktentwicklungsprozess. Wenn wir ein Produkt entwickeln oder eine Dienstleistung anbieten, richtet sie sich letztendlich an die Mehrheit der Benutzer, die keinen Wert auf die Technik legen oder sich nicht darum kümmern Daher müssen bei der Benutzeroberfläche Benutzerfreundlichkeit, Intuitivität und einfache Bedienung berücksichtigt werden. Dieses Fundbürosystem funktioniert nach den folgenden Grundsätzen:

  • Praktikabilität: Das System geht auf die Bedürfnisse der Benutzer ein, ist benutzerfreundlich und berücksichtigt alle Details der tatsächlichen Vorgänge vollständig, um normale Benutzer zu erreichen Sie können beim Öffnen der Seite auf den ersten Blick ein klares Verständnis des Betriebsablaufs erlangen. Es stellt wirklich eine Plattform dar, die Lehrern und Schülern dient und den Benutzern Komfort für die Freigabe von Online-Fundfundabfragen bietet.

  • Hohe
  • Sicherheit

    : Bei der Gestaltung werden verschiedene Sicherheitsmaßnahmen in der Netzwerksoftware und -hardware umfassend berücksichtigt, um die Sicherheit der Benutzerdaten und -informationen zu gewährleisten. Wenn beispielsweise das in der Datenbank gespeicherte Konto und Passwort des Benutzers mit PHP-Hash verschlüsselt sind, werden Sie selbst dann, wenn die Datenbank durchgesickert ist, eine Reihe verstümmelter Zeichen sehen.

  • Wartbarkeit: Das Design der Website erfordert eine einfache Wartung mit klaren Dateiverzeichnissen und Codestrukturen.
  • Skalierbarkeit: Die Website ist so konzipiert, dass sie zukünftige Erweiterungen und Systemerweiterungen erleichtert. Das System erfordert einfache Upgrades und das einfache Hinzufügen von Funktionsmodulen.
Systemmoduldesign

1. Funktionsmodul

Dieses Verwaltungssystem kann hauptsächlich

Benutzerregistrierung

realisieren (Administrator) Funktionen für Anmeldung, Homepage-Anzeige, verlorene und gefundene Artikelveröffentlichung, Message Board, Hintergrundverwaltung und Tag-Verwaltung:

    Benutzerregistrierung: Diese Funktion hauptsächlich realisiert die Registrierung und Verwaltung von Benutzerinformationen
  • Benutzeranmeldung (Administrator): Diese Funktion realisiert hauptsächlich die Funktion der Benutzeranmeldung (Administrator)
  • Homepage-Modul: Dieses Modul wird hauptsächlich verwendet, um verlorene und gefundene Artikel anzuzeigen, Funktionen hinzuzufügen, Details anzuzeigen und Zugang zu jedem Modul zu erhalten
  • Message-Board-Modul: hauptsächlich zur Implementierung von Benutzernachrichten (Administratoren). Funktion für Benutzer-Feedback
  • Backend-Verwaltung: Benutzerinformationsverwaltung, Verwaltung verlorener und gefundener Artikel, Message-Board-Nachrichtenverwaltung, Administrator-Informationsverwaltung, Tag-Verwaltung
  • Die Hauptfunktionsstruktur Dieses System ist in der folgenden Abbildung dargestellt:

Content-Management-System basierend auf dem Laravel-Framework
Funktionsstrukturdiagramm.PNG

2 , Benutzeroberfläche

  • Registrierungsseite

    : Diese Schnittstelle sammelt hauptsächlich registrierte Benutzerinformationen und speichert sie dann in der Systemdatenbank

  • Anmeldeseite: Diese Seite überprüft die Anmeldung anhand der Informationen und des Typs des angemeldeten Benutzers
  • Startseite: Auf dieser Seite werden die vom Benutzer geposteten Fundsachen sowie die Tags von angezeigt die Artikel
  • Messageboard-Seite: Auf dieser Seite werden historische Nachrichten und Abschnitte zum Hinzufügen von Nachrichten angezeigt
  • Benutzerinformationsseite: Auf dieser Seite werden Informationen zu angezeigt Derzeit angemeldete Benutzer und veröffentlichte Artikel Verwaltung
  • Verwaltungsseite: Diese Seite ist eine visuelle Bedienseite für Administratoren zur Verwaltung verschiedener Abschnitte dieser Website

Technische Implementierung der Kernfunktionen

1. Entwicklungsumgebung

Die lokale Entwicklungsumgebung der Website verwendet Lamp (d. h. Linux+Apache+MySQL+). PHP). Lamp ist eine Reihe von Open-Source-Software, die häufig zum Erstellen dynamischer Websites oder Server verwendet wird. Da sie jedoch häufig zusammen verwendet werden, weisen sie eine immer höhere Kompatibilität auf und bilden zusammen eine leistungsstarke Webanwendungsplattform. Alle Entwicklungstools von Lamp sind Open-Source-Software. Aufgrund der geringen Kosten und der zahlreichen Lernmaterialien ist es absehbar, dass Lamp in Zukunft zum Mainstream der Webentwicklung werden wird meine bevorzugte Entwicklungsumgebung.

2. Technisches Framework

Das Back-End-PHP-Framework verwendet das beliebte ausländische Open-Source-Framework – Laravel, das auch als „das prägnanteste und eleganteste PHP-Webentwicklungs-Framework“ bekannt ist Auf dieser Grundlage können Sie schnell und effizient eine Web-APP erstellen. Ziel von Laravel ist es, einen angenehmen Entwicklungsprozess für Entwickler zu schaffen, ohne auf die Funktionalität der Anwendung zu verzichten. Kurz nachdem ich angefangen hatte, PHP-Entwicklung zu lernen, wusste ich sehr wenig über einige PHP-Frameworks , und sein Dateiverzeichnis und seine Codestruktur sind klar. Es basiert auf dem MVC-Entwurfsmuster und ist für Anfänger geeignet. Das Design dieses Kurses kann als mein Erlernen und Üben des Laravel-Frameworks angesehen werden großen Umfang. Es gibt viele PHP-Anwendungsframeworks, wie zum Beispiel das inländische ThinkPHP-Framework, das auch in China weit verbreitet ist. In der Anfangsphase habe ich versucht, thinkPHP für die Entwicklung zu verwenden, aber es ist einfach hat einen gemischten Ruf in Bezug auf die Codespezifikationen und ist nicht für Anfänger geeignet, um gute Programmiergewohnheiten zu entwickeln. Geben Sie es also auf. Das Folgende ist eine kurze Einführung in die Laravel-Framework-Architektur.

Laravel wird als „Full-Stack“-Framework bezeichnet, da es alles von Netzwerkdiensten über Datenbankverwaltung bis hin zur HTML-Generierung bewältigen kann. Die vertikal integrierte Webentwicklungsumgebung bietet Entwicklern ein besseres Erlebnis. Entwickler können Laravel-Projektumgebungen über Befehlszeilentools generieren und verwalten. Laravel verfügt über ein hervorragendes Befehlszeilentool namens Artisan, mit dem Sie Framework-Code und Datenbankschemata generieren können. Artisan kann alles von der Datenbankschemamigration bis zur Ressourcen- und Konfigurationsverwaltung verwalten.

Das Laravel-Projekt wird mit Composer erstellt (Composer ist ein Tool, das in PHP zum Verwalten von Abhängigkeitsbeziehungen (Abhängigkeitsbeziehungen) verwendet wird. Sie können die externen Toolbibliotheken deklarieren, von denen Sie in Ihrem Projekt abhängig sind (Bibliotheken), Composer hilft Ihnen bei der

Installation

dieser abhängigen Bibliotheksdateien). Im Linux-Terminal ausführen: $ Composer Create-Project Laravel/Laravel --Prefer-Dist Web 5.1

erstellt eine Datei mit dem Namen „Der Webprojektordner“. Die angegebene Laravel-Version ist 5.1. Seine

Verzeichnisstruktur

ist wie folgt:

071625168621849.pngContent-Management-System basierend auf dem Laravel-Framework
Im Folgenden finden Sie die grundlegenden Informationen zu jedem Ordner und Dateieinführung:

顶级文件夹 作用
app 包含了站点的controller(控制器),models(模型),views(视图)和assets(资源)。这些事网站运行的主要代码,你将会花费大部分的时间在这些上面。
bootstrap             用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。

这个文件夹是外界唯一可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可以用来存放任何可以公开的静态资源,如css,JavaScript,images等。
vendor 用来存放所有的第三方代码,在一个典型的laravel应用程序,这包括larceny源代码及其相关,并含有额外的预包装功能的插件。

Wie oben erwähnt, ist /app sein Kernbestandteil und die Details des /app-Ordners lauten wie folgt:

Content-Management-System basierend auf dem Laravel-Framework

071625258005786.png

Das Folgende ist eine detaillierte Einführung:

Dateien und Ordner Funktion
/app/config/ Konfigurieren Sie Anwendungslaufzeitregeln, Datenbank, Sitzung und mehr. Enthält eine Reihe von Konfigurationsdateien zum Ändern verschiedener Aspekte des Frameworks. Die meisten in Konfigurationsdateien zurückgegebenen Optionen sind mit PHP-Arrays verknüpft.
/app/config/app.php Verschiedene Einstellungen auf Anwendungsebene, Zeitzone, Gebietsschema (Locale), Debug-Modus und a eindeutiger Verschlüsselungsschlüssel.
/app/config/auth.php Steuert, wie die Authentifizierung in der Anwendung durchgeführt wird, d. h. im Authentifizierungs- Treiberprogramm .
/app/config/cache.php Wenn Ihre Anwendung Caching verwendet, um die Reaktionszeiten zu beschleunigen, tun Sie dies also in Dies konfiguriert die Funktion.
/app/config/compile.php Hier können Sie einige zusätzliche Klassen angeben, um die kompilierten Dateien einzuschließen, die vom Befehl „artisan Optimize“ beansprucht werden. Dies sollten Klassen sein, die grundsätzlich in jeder Anfrage an die Anwendung enthalten sind.
/app/config/database.php Enthält die relevanten Konfigurationsinformationen der Datenbank, d. h. die Standard-Datenbank-Engine und Verbindungsinformationen.
/app/config/mail.php ist die Konfigurationsdatei der E-Mail-Versand-Engine, also des SMTP-Servers.
/app/config/session.php Kontrollieren Sie, wie Laravel Benutzersitzungen verwaltet, d. h. Sitzungstreiber, SitzungslwenneZeit.
/app/config/view.php Sonstige Konfiguration des Vorlagensystems.
/app/controllers Enthält Controller-Klassen, die grundlegende Logik, Datenmodellinteraktion und das Laden der Ansichtsdateien der Anwendung bereitstellen.
/app/database/migrations/ Enthält einige PHP-Klassen, die es Laravel ermöglichen, das Schema der aktuellen Datenbank zu aktualisieren und dabei alle Versionen beizubehalten der Datenbanksynchronisation. Migrationsdateien werden mit Artisan-Tools generiert.
/app/database/seeds/ Enthält PHP-Dateien, die es Artisan-Tools ermöglichen, Datenbanktabellen mit relationalen Daten zu füllen.
/app/lang/ PHP-Datei mit Strings, die der Anwendung die Lokalisierung des Arrays erleichtern. Standardmäßig enthält das Verzeichnis Sprachzeilen für Paginierung und Form Validation für die englische Sprache.
/app/models/ Modelle sind Klassen, die die Informationen (Daten) einer Anwendung und Regeln für den Betrieb der Daten darstellen. In den meisten Fällen entspricht jede Tabelle in der Datenbank einem Modell in der Anwendung. Der Großteil der Anwendungsgeschäftslogik wird im Modell konzentriert sein.
/app/start/ Enthält benutzerdefinierte Einstellungen in Bezug auf Artisan-Tools sowie globale und lokale Kontexte.
/app/storage/ In diesem Verzeichnis werden temporäre Dateien für die verschiedenen Dienste von Laravel gespeichert, z. B. Sitzungs-, Cache- und kompilierte Ansichtsvorlagen. Dieses Verzeichnis muss auf dem Webserver beschreibbar sein. Dieses Verzeichnis wird von Laravel verwaltet und es ist uns egal.
/app/tests/ Dieser Ordner bietet Ihnen einen praktischen Ort für die Durchführung von Unit-Tests. Wenn Sie PHPUnit verwenden, können Sie mit den Artisan-Tools alle Tests auf einmal ausführen.
/app/views/ Dieser Ordner enthält HTML-Vorlagen, die von Controllern oder Routen verwendet werden. Bitte beachten Sie, dass Sie in diesem Ordner nur Vorlagendateien ablegen können. Andere statische Ressourcendateien wie CSS-, Javascript- und Bilddateien sollten im Ordner /public abgelegt werden.
/app/filters.php Diese Datei enthält verschiedene Anwendungs- und Routenfiltermethoden, mit denen Sie die Ergebnisse Ihrer Anwendung ändern können. Laravel verfügt über einige vordefinierte Filter für Zugriffskontrolle und XSS-Schutz.
/app/routes.php Dies ist die Routendatei Ihrer Anwendung, die Routing-Regeln enthält, die Laravel mitteilen, wie eingehende Anfragen mit Routen verbunden werden sollen. Behandelt Schließungen Funktionen, Controller und Aktionen. Die Datei enthält außerdem mehrere Events-Deklarationen, einschließlich derjenigen für Fehlerseiten, die zum Definieren von Ansichtskomponisten verwendet werden können.

3. Model-View-Controller (MVC)

Es gibt drei Unterverzeichnisse unter dem Ordner

/app: models/, view/ und controllers/. Dies zeigt, dass Laravel dem MVC-Architekturmuster folgt. Dies erzwingt die Trennung der „Geschäftslogik“, die in die Präsentationslogik einfließt, von der grafischen Benutzeroberfläche (GUI). Was Laravel-Webanwendungen betrifft, besteht die Geschäftslogik normalerweise aus Datenmodellen wie Benutzern und Artikeln. Die GUI ist lediglich eine Webseite im Browser. Das MVC-Entwurfsmuster erfreut sich in der Welt der Webentwicklung großer Beliebtheit.

MVC-Muster umfasst drei Komponenten:

  • Modell

  • Ansicht        

  • Controller (Controller)

    Eine typische Laravel-Anwendung enthält die oben genannten MVC-Komponenten, wie unten gezeigt:
           

    Content-Management-System basierend auf dem Laravel-Framework

    071626088464369.png

Antwortprozess von Laravel

Bei der Interaktion mit Laravel sendet der Browser eine Anfrage, Der Webserver empfängt die Anfrage und leitet sie an die Laravel-Routing-Engine weiter. Das Laravel-Routing empfängt die Anfrage und leitet sie dann basierend auf dem URL-Muster der Route zur entsprechenden Controller-Klassenmethode weiter. Dann übernimmt die Controller-Klasse. In einigen Fällen rendert der Controller sofort eine Ansicht, bei der es sich um eine Vorlage handelt, die in HTML konvertiert und an den Browser zurückgesendet wird. Bei dynamischen Websites interagiert der Controller häufiger mit dem Modell, einem PHP--Objekt , das ein Element in der Anwendung darstellt (z. B. Benutzer, Blog-Beitrag) und für die Kommunikation mit der Datenbank verantwortlich ist. Nach dem Aufruf des Modells rendert der Controller die endgültige Ansicht (HTML, CSS und Bilder) und gibt die vollständige Webseite an den Browser des Benutzers zurück. Laravel vertritt das Konzept, dass Modelle, Ansichten und Controller einigermaßen unabhängig gehalten werden sollten, indem diese Elemente in separaten Codedateien in verschiedenen Verzeichnissen gespeichert werden. Hier kommt die Laravel-Verzeichnisstruktur ins Spiel.

——Laravel-Dokumentation

Datenbankdesign

Verwenden Sie phpmyadmin, um zunächst eine Datenbank mit dem Namen web in MySQL auszuführen Konfigurieren Sie die Datenbankkonfigurationsdatei/config/database.php wie folgt:

'mysql' => [
'driver' =>
'host' = > env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'web'),
'username' => '),
'password' => env('DB_PASSWORD', 'sheng'),
'charset' => 🎜> 'prefix' => '',
'strict' => false,
],

Die Tabellen, die in der MySQL-Datenbank vorhanden sind, sind wie folgt:

Content-Management-System basierend auf dem Laravel-Framework
Selection_015.png

Beschreibung einiger Tabellen:

Artikel: speichert verlorene und gefundene Artikel, die von Benutzern gepostet wurden

article_tag: Tags veröffentlichter Artikel

Migrationen: werden generiert, wenn PHP Daten migriert, haben nichts mit Kernfunktionen zu tun

Tags: Benutzer-Tags

Benutzer: speichert Benutzer Informationen zu Konten

5. Kerncode-Implementierung

Webprogramme enthalten im Allgemeinen viel Code und erklären alles im Detail Der Kerngeschäftslogikteil des Codes wird mit den erforderlichen Erläuterungen ausgewählt. In Bezug auf das Front-End werden das responsive Entwicklungsframework AmazeUI und die JavaScript-Bibliothek

jQuery

verwendet, die dem beliebten Bootstrap ähnelt. Daher gibt es nicht viele Erklärungen zu P, CSS und Front-End andere Stile. Die wichtigsten Erläuterungen umfassen Folgendes:

    Routenverwaltung
  • Benutzerverwaltung

    , wie z Benutzerregistrierung, Änderung von Informationen, Sperrung von Benutzern usw.

  • Artikelverwaltung, z. B. Artikel veröffentlichen, Artikel ändern usw.

  • Tag-Verwaltung, Artikel haben ein oder mehrere Tags

  • Datenbankverwaltung, wie Migration, Ausfüllen von Daten usw.

  • Webformularvalidierung

  • Blade-Vorlagen-Engine

  • Paging-Verarbeitung

  • Sicherheitsverarbeitung

    Laravel verwendet BladeTemplate Engine, daher müssen die Ansichtsdateien vorhanden sein in Form von xxx.blade.php Name, die Verzeichnisstruktur unter dem Ordner web/resources/views/ ist wie in der Abbildung dargestellt:

Content-Management-System basierend auf dem Laravel-Framework

Selection_017.png

WebsiteEintragsdateiDie erste Ansichtsdatei, die geladen wird, ist layouts/defalut.blade.php:



<meta charset="UTF-8" /> <title>Campus Fundbüro-Plattform</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="<a href="http://www.php.cn/css/css-rwd-viewport.html" target="_blank" _href="http://www.php.cn/css /css-rwd-viewport.html">Ansichtsfenster<code><meta charset="UTF-8"/> <title>校园失物招领平台</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="<a href="http://www.php.cn/css/css-rwd-viewport.html" target="_blank" _href="http://www.php.cn/css/css-rwd-viewport.html">viewport</a>" content="<a href="http://www.php.cn/wiki/835.html" target="_blank" _href="http://www.php.cn/wiki/835.html">width</a>=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-<a href="http://www.php.cn/wiki/1518.html" target="_blank" _href="http://www.php.cn/wiki/1518.html">scala</a>ble=no"> <meta name="<a href="http://www.php.cn/wiki/125.html" target="_blank" _href="http://www.php.cn/wiki/125.html">for</a>mat-detection" content="telephone=no"/> <meta name="renderer" content="webkit"/> <meta http-equiv="Cache-Control" content="no-siteapp"/> <link rel="alternate icon" type="image/x-icon" href="{{ asset(&#39;img/favicon.ico&#39;) }}"/> <link rel="stylesheet" href="http://cdn.amazeui.org/amazeui/2.7.1/css/amazeui.min.css"/> <link rel="stylesheet" href="{{asset(&#39;css/custom.css&#39;)}}"> <script src="//cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script>" content="Breite
=Gerätebreite, Anfangsskalierung=1,0, Mindestskalierung=1,0, Maximalskalierung=1,0, Benutzer-
scala
ble=no"> für
mat-detection" content="telephone=no"/>
< body>

  • amazeui-Frontend Framework-Dateien und jQuery-Dateien werden im CDN-Netzwerk gespeichert und müssen nicht lokal geladen werden, was die Struktur des Website-Ordners vereinfacht.

  • asset('img/favicon.ico') generiert http://localhost:8000/img/favicon.ico

  • asset ('css/custom.css') generiert Die IMG- und CSS-Ordner werden im öffentlichen Verzeichnis abgelegt, dem Ressourcenordner des Projekts.

  • @include('layouts.nav') enthält app/views /layouts/nav .blade.php-Datei

    @yield('main') für Vorlage

    geerbt

    Die meisten Ansichtsdateien erben das Vorlagen-Framework von default.blade.php, wie zum Beispiel index.blade.php:

    @extends('layouts.default')

    @section('main')

    <p class="am-g am-g-fixed"><br>    <p class="am-u-md-8"><br>        <!-- 循环输出文章 --><br>        @foreach ($articles as $article)<br>            <article class="blog-main"><br>                <h3 class="am-article-title blog-title"><br>                    <a href="{{ URL::route(&#39;article.show&#39;, $article->id) }}">{{{ $article->title }}}</a><br>                </h3><br>                <h4 class="am-article-meta blog-meta"><br>                    由 <a href="{{ URL::to(&#39;user/&#39; . $article->user->id . '/articles') }}">{{{ $article->user->nickname }}}</a> 发布于 {{ $article->created_at->format('Y/m/d H:i') }}  标签:<br>                    <!-- 输出标签 --><br>                    @foreach ($article->tags as $tag)<br>                        <a  href="{{ URL::to(&#39;tag/&#39; . $tag->id . '/articles') }}">{{ $tag->name }}</a><br>                    @endforeach<br>                </h4><br>                <p class="am-g"><br>                    <p class="am-u-sm-12"><br>                        @if ($article->summary)<br>                            <p>{!! $article->summary !!}</p><br>                        @endif<br>                        <hr class="am-article-pider"/><br>                    </p><br>                </p><br>            </article><br>        @endforeach<br>    </p><br>
    Nach dem Login kopieren
  • @extends('layouts.default') erbt die app/views/layouts/default.blade.php-Datei

  • @yield ( 'main') entspricht @section('main') und wird mit dem Inhalt

    Benutzeranmeldung Formular (in der Datei login.blade.php) wie folgt gefüllt:

      <form action="login" method="post" accept-charset="utf-8" class="am-form"><br>    <!-- 添加 token 值 --><br>    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"><br>    <label  for="email">邮箱:<br>        <input type="email" name="email" value="{{Input::old(&#39;email&#39;)}}" placeholder=""><br>    </label><br>    <br><br>    <label for="password">密码:<br>        <input type="password" name="password" value="" placeholder=""><br>    </label><br>    <br><br>    <label for="remember_me"><br>      <input id="remember_me" name="remember_me" type="checkbox" value="1"><br>      记住我<br>    </label><br>    <br><br>    <p class="am-cf"><br>    <input type="submit" name="submit" value="登录" class="am-btn am-btn-primary am-btn-sm am-fl"><br>    </p><br>  </form><br>
    Nach dem Login kopieren

    Laravel und die meisten PHP-Frameworks verwenden Routing, um URLs zu generieren und http-Anfragen zu verarbeiten. Die Überprüfung der Benutzeranmeldedaten wird auch in der Routing-Datei (web/app/route.php) abgelegt:

    //Anmeldedaten posten
    Route::post('login', function()

    {<br>  //数据验证规则<br>  $rules = array(<br>    'email'       => 'required|email',<br>    'password'    => 'required|min:6',<br>    'remember_me' => 'boolean',<br>  );<br>  $validator = Validator::make(Request::all(), $rules);<br>  //验证通过<br>  if ($validator->passes())<br>  {<br>    if (Auth::attempt([<br>      'email'    => Request::input('email'),<br>      'password' => Request::input('password'),<br>      'block'    => 0], <br>      (boolean) Request::input('remember_me')))<br>    {<br>      return Redirect::to('home');<br>    } <br>    //账号或密码错误<br>    else {<br>      return Redirect::to('login')->withInput()->with('message', array('type' => 'danger', 'content' => 'E-mail or password error'));<br>    }<br>  } <br>  //数据格式错误<br>  else {<br>    return Redirect::to('login')->withInput()->withErrors($validator);<br>  }<br>});<br>
    Nach dem Login kopieren

    //Besuchen Sie die Homepage
    Route::get('home', ['middleware' => 'auth', function()
    {
    zurück zur Ansicht ('home');
    }]);

    Registrierungsoperationsroute:

    Route::post('register', function()
    {
    $rules = [

     'email' => 'required|email|unique:users,email',<br> 'nickname' => 'required|min:4|unique:users,nickname',<br> 'password' => 'required|min:6|confirmed',<br>
    Nach dem Login kopieren

    ];
    $validator = Validator::make(Request::all(), $rules);
    if ($validator->passes())
    {

     $user = new App\User();<br> $user->email = Request::input('email');<br> $user->nickname = Request::input('nickname');<br> $user->password = Hash::make(Request::input('password'));<br> if ($user->save())<br> {<br>   return Redirect::to('login')->with('message', array('type' => 'success', 'content' => 'Register successfully, please login'));<br> } else {<br>   return Redirect::to('register')->withInput()->with('message', array('type' => 'danger', 'content' => 'Register failed'));<br> }<br>
    Nach dem Login kopieren
               

    } sonst {

     return Redirect::to('register')->withInput()->withErrors($validator);<br>
    Nach dem Login kopieren

    }
    });

    Die Funktion „unique:users,email“ der oben genannten Formularvalidierungsregeln kann sicherstellen, dass das E-Mail-Feld in der Benutzertabelle eindeutig ist, wenn beispielsweise eine eingegeben wird bestehende E-Mail, Es erscheint eine Fehlermeldung:

Content-Management-System basierend auf dem Laravel-Framework

Contact_013.png

Wenn die Registrierung erfolgreich ist, wird dies der Fall sein Springen Sie zur Anmeldeseite und geben Sie eine erfolgreiche Eingabeaufforderung ein:

Content-Management-System basierend auf dem Laravel-Framework

Contact_014.png

Der Benutzer veröffentlicht die Fundanzeige ist das Artikelveröffentlichungsmodul in der Datenbank. Es gibt drei Tabellen, die entsprechen: Artikeln, Tags und Artikel_Tag. Jeder Artikel hat ein oder mehrere Tags und jedes Tag hat einen oder mehrere Artikel. Die Kerncodes der Modelldatei/app/Article.php sowie Tag.php und User.php lauten wie folgt:

User.php:

Namespace-App;

IlluminateAuthAuthenticatable verwenden;
IlluminateDatabaseEloquentModel verwenden;
IlluminateAuthPasswordsCan verwendenZurücksetzenPasswort;
IlluminateContractsAuthAuthenticatable als AuthenticatableContract verwenden;
I.lluminateContractsAuthCan verwenden Passwort zurücksetzen als CanResetPasswordContract;

Klasse Benutzer erweitert Modell implementiert AuthenticatableContract, CanResetPasswordContract
{

use Authenticatable, CanResetPassword;<br/>
Nach dem Login kopieren
       
/**<br/> * The database table used by the model.<br/> *<br/> * @var string<br/> */<br/>protected $table = &#39;users&#39;;<br/><br/>/**<br/> * The attributes that are mass assignable.<br/> *<br/> * @var array<br/> */<br/>protected $fillable = [&#39;name&#39;, &#39;email&#39;, &#39;password&#39;];<br/><br/>/**<br/> * The attributes excluded from the model&#39;s JSON form.<br/> *<br/> * @var array<br/> */<br/>protected $hidden = [&#39;password&#39;, &#39;remember_token&#39;];<br/>//模型关联<br/>public function articles()<br/>{<br/>    return $this->hasMany('App\Article');<br>}<br>
 </p>
<p>}</p>
</blockquote>
<p>Ein Benutzer hat mehrere Artikel. </p>
<p>Article.php:</p>
<blockquote>
<p><?php<br/>namespace App;<br/>use IlluminateDatabaseEloquentModel;<br/>use IlluminateDatabaseEloquentSoft<a href="http://www.php.cn/wiki/1298.html" target="_blank" _href="http://www.php.cn/wiki/1298.html">Delete</a>s; /use<a href="http://www.php.cn/php/php-tp-padamlembut.html" target="_blank" _href="http://www.php.cn/php/php-tp-padamlembut.html">soft delete</a> trait</p><p>class Article erweitert Modell<br/>{</p><pre class="brush:php;toolbar:false">use SoftDeletes;<br/>
Nach dem Login kopieren
       
protected $fillable = [&#39;title&#39;, &#39;content&#39;];<br/>
Nach dem Login kopieren
       
public function tags()<br/>{<br/>    return $this->belongsToMany('App\Tag');<br>}<br><br>public function user()<br>{<br>    return $this->belongsTo('App\User');<br>}<br>
 </p>
<p>}</p>
</blockquote>
<p>Ein Artikel hat mehrere Tags und gehört einem Benutzer. </p>
<p>Tag.php:</p>
<blockquote>
<p><?php</p><p>namespace App;</p><p>use IlluminateDatabaseEloquentModel;<br/>use IlluminateDatabaseEloquentSoftDeletes;</p> <p>Klassen-Tag erweitert Modell<br/>{</p><pre class="brush:php;toolbar:false">use SoftDeletes;<br/>
Nach dem Login kopieren
       
protected $fillable = [&#39;name&#39;];<br/>
Nach dem Login kopieren
       
public function articles()<br/>{<br/>    return $this->belongsToMany('App\Article');<br>}<br>
 </p>
<p>}</p>
</blockquote>
<p>Ein Tag enthält mehrere Artikel. </p>
<p>Dieser Artikel <a href="http://www.php.cn/code/6852.html" target="_blank" _href="http://www.php.cn/code/6852.html"> Editor </a> verwendet den Markdown-Editor. Das einfache und elegante Layoutformat von Markdown kann den Artikelstil schöner machen (es kann auch einen gewissen Lernaufwand erfordern) </p>
<p>向数据库中添加文章,要用到MVC中的control了./web/app/http/Controllers/ArticleController.php的核心代码如下:</p>
<blockquote><p><?php</p><pre class="brush:php;toolbar:false">namespace App\Http\Controllers;<br/>
Nach dem Login kopieren
use Illuminate\Http\Request;<br/>
Nach dem Login kopieren
use App\Http\Requests;<br/>use App\Http\Controllers\Controller;<br/>use Markdown;<br/>use Validator;<br/>use App\Article;<br/>use Auth;<br/>use App\Tag;<br/>use Redirect;<br/><br/>class ArticleController extends Controller<br/><br/>******<br/>******<br/><br/>  //保存文章<br/>public function store(Request $request)<br/>{<br/>    $rules = [<br/>    &#39;title&#39;   => 'required|max:100',<br>    'content' => 'required',<br>    'tags'    => ['required', 'regex:/^\w+$|^(\w+,)+\w+$/'],<br>    ];<br>  //数据校验<br>    $validator = Validator::make($request->all(), $rules);<br>    if ($validator->passes()) {<br>        $article = Article::create($request->only('title', 'content'));<br>        $article->user_id = Auth::id();<br>        $resolved_content = Markdown::parse($request->input('content'));<br>        $article->resolved_content = $resolved_content;<br>        $tags = explode(',', $request->input('tags'));<br>          //添加 summary<br>      if (str_contains($resolved_content, '<p>')) {<br>            $start = strpos($resolved_content, '<p>');<br>            $length = strpos($resolved_content, '</p>') - $start - 4;<br>            $article->summary = substr($resolved_content, $start + 3, $length);<br>        } else if (str_contains($resolved_content, '</h&#39;)) {<br/>            $start = strpos($resolved_content, &#39;<h>');<br>            $length = strpos($resolved_content, '</h>') - $start - 4;<br>            $article->summary = substr($resolved_content, $start + 4, $length);<br>        }<br>        $article->save();<br>      //处理标签<br>        foreach ($tags as $tagName) {<br>            $tag = Tag::whereName($tagName)->first();<br>            if (!$tag) {<br>                $tag = Tag::create(array('name' => $tagName));<br>            }<br>            $tag->count++;<br>            $article->tags()->save($tag);<br>        }<br>        return Redirect::route('article.show', $article->id);<br>    } else {<br>        return Redirect::route('article.create')->withInput()->withErrors($validator);<br>    }<br>}<br>//展示文章详情<br>public function show($id)<br>{<br>    return view('articles.show')->with('article', Article::find($id));<br>}<br></p></blockquote>
<p>上面代码实现了保存文章和显示文章的业务逻辑,保存文章时验证 tags 用了 regex <a href="http://www.php.cn/wiki/588.html" target="_blank" _href="http://www.php.cn/wiki/588.html">正则表达式</a>来验证标签是否用逗号分隔。</p>
<p>用户修改已经发布的文章的核心代码如下:</p>
<blockquote></blockquote>
<p>@extends('layouts.default')<br>  <!-- 编辑文章页面 --><br>  @section('main')<br>  <p class="am-g am-g-fixed"><br>    <p class="am-u-sm-12"></p>
<pre class="brush:php;toolbar:false">    <h1>Edit Article</h1><br>    <hr/><br>  @if ($errors->has())<br>  <p class="am-alert am-alert-danger" data-am-alert><br>    <p>{{ $errors->first() }}</p><br>  </p><br>  @endif<br>
Nach dem Login kopieren

<form action="{{ URL::route(&#39;article.update&#39;,$article->id)}}" method="post" accept-charset="utf-8" class="am-form"><br>
Nach dem Login kopieren
    <input type="hidden" name="_token" id="token" value="<?php echo csrf_token(); ?>"><br>    <p class="am-form-group"><br>      <label for="title">Title:</label><br>      <input type="text" name="title" id="title" value="{{ $article->title}}" placeholder=""><br>    </p><br>    <p class="am-form-group"><br>      <label for="content">Content:</label><br>      <textarea name="content" id="content" rows="20" >{{ $article->content }}</textarea><br>      <p class="am-form-help"><br>        <button id="preview" type="button" class="am-btn am-btn-xs am-btn-primary"><br>        <span class="am-icon-eye"></span> Preview<br>        </button><br>      </p><br>    </p><br>    <p class="am-form-group"><br>      <label for="tags">Tags:<br>          <input type="text" name="tags" value="{{ $article->tags }}" placeholder=""><br>      </label><br>      <p class="am-form-help">Separate multiple tags with a comma ","</p><br>    </p><br>    <p><button type="submit" class="am-btn am-btn-success"><br>      <span class="am-icon-pencil"></span> Modify</button><br>    </p><br>
Nach dem Login kopieren
</form><br></p><br>
Nach dem Login kopieren


   

  <p class="am-popup-hd"><br>    <h4 class="am-popup-title"></h4><br>    <span data-am-modal-close<br/>          class="am-close">×</span><br>  </p><br>  <p class="am-popup-bd"><br>  </p><br>
Nach dem Login kopieren
</p><br>
Nach dem Login kopieren


 <script><br>    $(function() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> $('#preview').on('click', function() {&lt;br&gt; $('.am-popup-title').text($('#title').val());&lt;br&gt; $.post('preview', {'content': $('#content').val(),'_token':$('#token').val()}, function(data, status) {&lt;br&gt; $('.am-popup-bd').html(data);&lt;br&gt; });&lt;br&gt; $('#preview-popup').modal();&lt;br&gt; });&lt;br&gt;</pre><div class="contentsignin">Nach dem Login kopieren</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">});&lt;br&gt;</pre><div class="contentsignin">Nach dem Login kopieren</div></div> <p></script>
 @endsection

标签是为了给用户发布的文章分类,便于查找相关信息,其核心代码实现为:

@extends('layouts.default')

@section('main')


 


<table class="am-table am-table-hover am-table-striped ">  <thead>  <tr>    <th>TagName</th>    <th>ArticleCount</th>    <th>CreateDateTime</th>    <th>Managment</th>  </tr>  </thead>  <tbody>    @foreach ($tags as $tag)    <tr>      <td>{{{ $tag->name }}}</td>      <td>{{ $tag->count }}</td>      <td>{{ $tag->created_at->format('Y-m-d H:i') }}</td>      <td>          <a href="{{ URL::to(&#39;tag/&#39;. $tag->id . '/edit') }}" class="am-btn am-btn-xs am-btn-primary"><span class="am-icon-pencil"></span> Edit</a>          <form action="{{ URL::to(&#39;tag/&#39;.$tag->id.'/delete')}}" method="get" accept-charset="utf-8" style="<a href="http://www.php.cn/wiki/927.html" target="_blank" _href="http://www.php.cn/wiki/927.html">display</a>: inline;">             <button type="button" class="am-btn am-btn-xs am-btn-danger" id="delete{{ $tag->id }}">                 <span class="am-icon-remove"></span> Delete             </button>          </form>       </td>    </tr>    @endforeach  </tbody> </table>
 </p><br>


 


</p><br>

Nach dem Login kopieren
       

<script><br>  $(function() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$('[id^=delete]').on('click', function() {<br> $('.am-modal-bd').text('Sure you want to delete it?');<br> $('#my-confirm').modal({<br> relatedTarget: this,<br> onConfirm: function(options) {<br> $(this.relatedTarget).parent().submit();<br> },<br> onCancel: function() {<br> }<br> });&lt;br&gt;});&lt;br&gt;</pre><div class="contentsignin">Nach dem Login kopieren</div></div>    <p>});&lt;br&gt;</script>
@endsection

错误处理

如果用户访问的URL不存在或者服务器存在错误时,我们不希望返回一个默认的错误页面,而想返回一个友好提示的页面,在 Laravel 中可以很轻松地实现,Laravel有很简单的错误和日志处理,当服务器端存在错误时,app\Exceptions\Handler.php 里默认有一个报告所有异常的程序:

/**

* Report or log an exception.<br>*<br>* This is a great spot to send exceptions to Sentry, Bugsnag, etc.<br>*<br>* @param  \Exception  $e<br>* @return void<br>*/<br>
Nach dem Login kopieren
   

public function report(Exception $e)
  {

   return parent::report($e);<br>
Nach dem Login kopieren
   

}

当访问的URL不存在时,服务器会抛出一个 404 错误,laravel 对 HTTP 异常有特别的处理方式:

@extends('layouts.default')

@section('main')

<h1 style="text-align:center;">啊哦,你访问的页面不存在!</h1><br><h2 style="text-align:center;">返回 <a href="/">首页</a></h2><br>
Nach dem Login kopieren
   

@endsection

现在当你访问的 URL 不存在时,laravel 会自动到模板目录去寻找状态码为 404 的错误模板页面 404.blade.php

6、测试及操作说明

主页展示:

Content-Management-System basierend auf dem Laravel-Framework

主页展示.png

整体页面做的比较简洁,因为我侧重在功能实现,故对界面设计方面没有花太多时间。

用户登录:

Content-Management-System basierend auf dem Laravel-Framework

管理员登录.png

这里的登录注册使用了laravel框架的regex正则表达式匹配。

登录之后,会出现文章管理界面:

Content-Management-System basierend auf dem Laravel-Framework

文章管理.png

这里随便添加了一些测试数据。

删除文章:

Content-Management-System basierend auf dem Laravel-Framework

预览文章.png

点击删除文章会调用一段js代码,实现模态弹出框。

发布文章:

Content-Management-System basierend auf dem Laravel-Framework

发布信息.png

这个编辑器使用了markdown语法来编辑文字,可能对于普通用户来说有比较高的门槛,本想用富文本编辑器的,但是由于时间较为紧张,而markdown插件易于使用,故在beta版本中以此来暂时代替。

点击预览:

Content-Management-System basierend auf dem Laravel-Framework

预览文章.png

这里也调用了js解析markdown,生成html。

发布之后:

Content-Management-System basierend auf dem Laravel-Framework

失物招领启事详情.png

这样一个简单的失物招领启事发布管理系统就完成了,测试各功能正常。

总结

通过开发这个校园失物招领平台,其实就完成了一个最小内容管理系统,一个完整的内容管理系统包括这几个核心的模块:

  • 用户管理

  • 文章管理

  • 权限管理        

  • 标签管理

    90%的网站功能开发都可以归纳为CRUD(即增删改查)操作,可能对于一个这样功能简单的管理系统来说,没有必要去使用重型的laravel框架,看起来有点过度设计了,但是我作为一个php初学者来说,也是想通过这个机会来学习一下这个优秀的框架,学习框架的过程也加深了对php语言的理解,对于以后开发更大型的网站能够积累一点相关经验。

    这个系统目前还存在很多问题,比如界面不太符合失物招领的常规设计,有很多当初的设想也没能实现,markdown的编辑器不可能用在面向普通用户的网页中,入口首页和留言板功能由于时间关系没能加上,颇为遗憾。我希望以后能有时间去逐步地完善它,改造为我的个人博客,或者以此为基础,实现我一直以来的一个想法——搭建一个学生门户网站,当然这个工程量就非常大了。

    Wenn ich auf diesen gesamten Lern- und Entwicklungsprozess zurückblicke, habe ich das Gefühl, dass es nicht einfach war. Angefangen beim grundlegendsten Front-End-HTML+CSS+JS über die grundlegende Syntax von PHP bis hin zum Laravel-Framework habe ich viele Informationen konsultiert und über 100 Stunden Online-MoocVideos angeschaut. Dieses Kursdesign abgeschlossen. Vielen Dank an diese Technologie-Blogger für ihren selbstlosen Austausch. Die Erfahrungen und Erkenntnisse der Vorgänger haben zukünftige Generationen vor vielen Umwegen bewahrt. Aus diesem Grund ist es die Open-Source-Bewegung hat die heutige Internetbranche so erfolgreich gemacht. Deshalb denke ich, dass ich im zukünftigen Lernprozess immer daran denken sollte, meine persönlichen Erfahrungen zusammenzufassen und zu teilen, damit meine Umwege zu einer Brücke für andere werden können.

    Ich möchte auch meinen Freunden für ihre Ermutigung und ihr Engagement danken. Es war die Zusammenarbeit eines Teams, die es ermöglichte, diese Arbeit wie geplant abzuschließen.

Das obige ist der detaillierte Inhalt vonContent-Management-System basierend auf dem Laravel-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage