vue_drf implementiert SMS-Bestätigungscode

vue_drf implementiert SMS-Bestätigungscode

1. Nachfrage

1. Nachfrage

Wenn wir eine Website entwickeln, kann die Anmeldeseite in vielen Fällen eine Mobiltelefonnummer verwenden, um einen SMS-Bestätigungscode zu erhalten und sich dann anzumelden. Lassen Sie uns diese Funktion heute nutzen.

Pseudocode:

Rufen Sie die Anmeldeseite auf, klicken Sie auf SMS-Anmeldung, geben Sie die Mobiltelefonnummer ein und klicken Sie auf Bestätigungscode abrufen. Das Backend speichert den Bestätigungscode in Redis. Der Benutzer gibt den auf dem Mobiltelefon empfangenen Bestätigungscode ein, klickt auf Anmelden und die Mobiltelefonnummer und der Bestätigungscode werden zur Überprüfung an das Backend gesendet.

Um Textnachrichten zu senden und Benutzern den Empfang von Textnachrichten zu ermöglichen, verwenden wir die RongCloud-Schnittstelle, um ein Konto zu registrieren.

Einige für die Verwendung erforderliche Parameter:

SDK herunterladen

1. . . . . . .

2. . . . . .

3. . . . . . .

Nach dem Download entpacken Sie es. Legen Sie es in Libs in Apps unseres DRF-Projekts

2. SDK-Parameterkonfiguration

1. Verzeichnisstruktur

2. Konfigurieren Sie die Datei sms.py

# -*- Kodierung:utf-8 -*-

von .CCPRestSDK importiere REST

# Hinweis: Nachdem Sie sich bei der Cloud-Kommunikationswebsite angemeldet haben, können Sie die ACCOUNT-SID des Hauptkontos des Entwicklers in der „Konsolenanwendung“ sehen.
_accountSid = "xxxxxxxxxxxxx"
# 8a216da863f8e6c20164139687e80c1b
# Beschreibung: Das Hauptkonto-Token. Nach der Anmeldung bei der Cloud-Kommunikationswebsite können Sie das AUTH-TOKEN des Hauptkontos des Entwicklers in der Konsolenanwendung sehen
_accountToken = "xxxxxxxxxxxxxxx"
# 6dd01b2b60104b3dbc88b2b74158bac6
# Bitte verwenden Sie die APPID auf der Startseite der Verwaltungskonsole oder die APPID der von Ihnen selbst erstellten Anwendung
_appId = '8aaf0708697b6beb01699f3c645f1766'
# 8a216da863f8e6c20164139688400c21
# Hinweis: Anforderungsadresse. Die Produktionsumgebung ist als app.cloopen.com konfiguriert
_serverIP = "sandboxapp.cloopen.com"

# Beschreibung: Anforderungsport, die Produktionsumgebung ist 8883
_serverPort = "8883"

# Hinweis: Die Versionsnummer der REST-API bleibt unverändert_softVersion = '2013-12-26'

#Der folgende Inhalt muss nicht geändert werden, Klasse CCP (Objekt):
    """Hilfsklasse zum Versenden von SMS-Nachrichten"""

    def __new__(cls, *args, **kwargs):
        # Prüfen Sie, ob ein Klassenattribut _instance vorhanden ist. _instance ist das einzige Objekt der Klasse CCP, also ein Singleton, wenn nicht hasattr(CCP, "_instance"):
            cls._instance = super(CCP, cls).__new__(cls, *args, **kwargs)
            cls._instance.rest = REST(_serverIP, _serverPort, _softVersion)
            cls._instance.rest.setAccount(_accountSid, _accountToken)
            cls._instance.rest.setAppId(_appId)
        returniere cls._instance

    def send_template_sms(selbst, an, Daten, temp_id):
        """Vorlage-SMS senden"""
        # @param zur Handynummer # @param datas Das Inhaltsdatenformat ist ein Array, zum Beispiel: {'12','34'}, wenn kein Ersatz erforderlich ist, füllen Sie bitte '' aus
        # @param temp_id Vorlagen-ID
        Ergebnis = self.rest.sendTemplateSMS(an, Daten, temp_id)
        # Wenn Cloud Communication die SMS erfolgreich sendet, ist der Wert des Felds statuCode im zurückgegebenen Wörterbuchdatenergebnis "000000"
        wenn result.get("statusCode") == "000000":
            # Return 0 bedeutet, dass die SMS-Nachricht erfolgreich gesendet wurde return 0
        anders:
            # Return -1 bedeutet, dass das Senden von return -1 fehlgeschlagen ist


wenn __name__ == '__main__':
    ccp = CCP()
    # Hinweis: Die SMS-Vorlagennummer für den Test ist 1
    ccp.send_template_sms('15914397060', ['1234', 5], 1)

3. Code-Implementierung

1. Backend-Code

views.py, dies ist die Verarbeitung zum Abrufen von Bestätigungscodeanforderungen, d. h. das Backend generiert einen Zufallscode, sendet ihn an den Mobiltelefonbenutzer, speichert den Zufallscode dann in Redis und gibt dann einen Bestätigungscode zurück, der ein Erfolgssignal an das Frontend sendet

von .models importiere Benutzer
vom Rest_Framework-Importstatus
von lufei_drf.libs.yuntongxun.sms importiere CCP
von django_redis importiere get_redis_connection
Klasse SMSCodeAPIView(APIView):
    def get(selbst, Anfrage):
        # 1. Holen Sie sich die Telefonnummer über die Abfragezeichenfolge phone = request.query_params.get("phone")
        ty = request.query_params.get('Typ')
        # 2. Verifizieren Sie die Handynummer mit dem Verifizierungscode, bevor Sie die SMS senden, wenn ty=='register':
            versuchen:
                Benutzer.Objekte.get(Telefon=Telefon)
                return Response({"message": "Die aktuelle Telefonnummer wurde registriert"}, status=status.HTTP_400_BAD_REQUEST)
            außer:
                passieren
        redis = get_redis_connection("SMS-Code")
        wenn redis.get("times_%s" % Telefon):
            return Response({"message": "Die aktuelle Telefonnummer hat innerhalb einer Minute eine Textnachricht gesendet"}, status=status.HTTP_400_BAD_REQUEST)

        # 3. Verwenden Sie die Mobiltelefonnummer, um einen SMS-Bestätigungscode zu senden. # Generieren Sie einen SMS-Bestätigungscode sms_code = "%04d" % random.randint(0, 9999)
        ccp = CCP()
        Ergebnis = ccp.send_template_sms(Telefon,[SMS-Code,"5 Minuten"],1)

        wenn Ergebnis == 0:
            #SMS erfolgreich senden, SMS-Bestätigungscode in der Redis-Datenbank speichern#Pipeline-Operation öffnen pl = redis.pipeline()
            pl.multi() # Als nächstes werden mehrere Befehle in der Pipeline ausgeführt # setex(Variablenname, Gültigkeitsdauer [Sekunden], Wert)
            SMS_EXPIRE_TIME = 5 * 60 # Die Gültigkeitsdauer des SMS-Bestätigungscodes SMS_TIMES = 60 # Das Intervall zwischen dem Senden von SMS # Fügen Sie den ursprünglichen, sofort ausgeführten Befehl in die Pipeline ein pl.setex("sms_%s" % phone, SMS_EXPIRE_TIME, sms_code)
            pl.setex("times_%s" % Telefon, SMS_TIMES, 1)

            # Vereinheitlichen Sie die Ausführung von Befehlen in der Pipeline pl.execute()

        # 4. Antwortdaten an den Client return Response({"message":result},status=status.HTTP_200_OK)

urls.py

von django.urls Importpfad
# Von jwt intern implementierte Anmeldeansicht von rest_framework_jwt.views importiere acquire_jwt_token
aus .views importiere SMSCodeAPIView,

urlpatterns=[
    Pfad(r"login/", JWT-Token abrufen),
    Pfad('sms/', SMSCodeAPIView.as_view()),
]

utils.py, hiermit werden die Mobiltelefonnummer und der Bestätigungscode überprüft, nachdem der Benutzer den Mobiltelefon-Bestätigungscode übermittelt hat. Nachdem alle Beurteilungen richtig sind, wird ein Objekt zurückgegeben, einschließlich Token, Benutzerinformationen usw.

von django.contrib.auth.backends importiere ModelBackend
von django_redis importiere get_redis_connection


def jwt_response_payload_handler(Token, Benutzer=Keine, Anfrage=Keine):
    """
    Benutzerdefinierte JWT-Authentifizierung gibt erfolgreich Daten zurück: JWT per Token zurückgegeben
    :user Aktuell angemeldete Benutzerinformationen [Objekt]
    :request Die aktuell vom Client übermittelten Daten"""
    zurückkehren {
        'Token': Zeichen,
        'id': Benutzer-ID,
        'Benutzername': Benutzer.Benutzername,
    }

#Realisieren Sie den multifunktionalen Login-Import
from .models import User#Finden Sie heraus, ob der Benutzername oder die Telefonnummer bereits unser Benutzer ist def get_user_by_account(account):
    """
    Holen Sie sich das Benutzerobjekt basierend auf dem Konto: param account: Konto, das ein Benutzername oder eine Telefonnummer sein kann: return: Benutzerobjekt oder Keine
    """
    versuchen:
        wenn re.match('^1[3-9]\d{9}$', Konto):
            # Das Konto ist eine Mobiltelefonnummer user = User.objects.get(phone=account)
        anders:
            # Das Konto ist der Benutzername user = User.objects.get(username=account)
    außer User.DoesNotExist:
        return Keine
    anders:
        Benutzer zurückgeben
#Überprüfen Sie, ob die vom Benutzer übermittelte SMS-Nachricht mit den Informationen übereinstimmt, die wir in Redis def sms_code_verify (Telefon, SMS-Code) gespeichert haben:
    redis = get_redis_connection("SMS-Code")
    Wert=redis.get('sms_%s'%phone).decode()
    wenn Wert==SMS-Code:
        returniere True
    returniere False

Klasse UsernameMobileAuthBackend(ModelBackend):
    """
    Passen Sie die Authentifizierung per Benutzernamen oder Telefonnummer an"""
    def authentifizieren(selbst, Anfrage, Benutzername=Keine, Passwort=Keines, **kwargs):
        Benutzer = get_user_by_account (Benutzername) #Wenn die Kennwortlänge 4 beträgt, gehe ich davon aus, dass es sich um eine Mobiltelefonnummer und einen SMS-Bestätigungscode für die Anmeldung handelt, wenn Länge (Kennwort) == 4 und Benutzer nicht None ist und sms_code_verify (Benutzername, Kennwort):
            Benutzer zurückgeben
        elif-Benutzer ist nicht None und user.check_password(Passwort):
            Benutzer zurückgeben
        anders:
            return Keine

2. Frontend-Code

Login-Komponente

<Vorlage>
  <div id="Anmelden">
    <div Klasse="Box">
      <p>
        <img src="../../assets/login_title.png" alt="">
      </p>
      <p class="sign">Helfen Sie ehrgeizigen jungen Menschen, durch hartes Lernen einen anständigen Job und ein anständiges Leben zu bekommen! </p>
      <div Klasse="Passwort" v-show="num==1">
        <div Klasse="Titel2 Cursor">
          <span @click="num=1" :class="num==1 ? 'show' :''">Passwort-Login</span>
              <span @click="num=2" :class="num==2 ? 'show' :''">SMS-Anmeldung</span>
        </div>
        <input v-model="Benutzername" type="text" class="ss" placeholder="Benutzername/Mobilnummer">
        <input v-model="Passwort" type="Passwort" class="ss" placeholder="Passwort">
        <div id="captcha" class="ss"></div>
        <div Klasse="t1">
          <div Klasse="links">
            <input type="checkbox" class="cursor" v-model="erinnern">
            <div class="remenber cursor" >Passwort merken</div>
          </div>
          <div class="right cursor">Passwort vergessen</div>
        </div>
        <button class="login_btn" @click="login1">Anmelden</button>
        <div Klasse="registrieren">
          Kein Konto<span><router-link to="/register">Jetzt registrieren</router-link></span>
        </div>
      </div>
      <div Klasse="Nachricht" v-show="num==2">
        <div Klasse="Titel2 Cursor">
          <span @click="num=1" :class="num==1 ? 'show' :''">Passwort-Login</span>
              <span @click="num=2" :class="num==2 ? 'show' :''">SMS-Anmeldung</span>
        </div>
        <input v-model="phone" type="text" class="ss" placeholder="Telefonnummer">
        <div Klasse="SMS">
          <Eingabe v-Modell="sms_code" Typ="text" Klasse="ss">
          <div class="Inhalt" @click="get_sms_code">{{Inhalt}}</div>
        </div>
        <button class="login_btn" @click="sms_login">Anmelden</button>
        <div Klasse="registrieren">
          Kein Konto<span><router-link to="/register">Jetzt registrieren</router-link></span>
        </div>
      </div>
    </div>
  </div>
</Vorlage>

<Skript>
  Standard exportieren {
    Name:'Anmelden',
    Daten:Funktion () {
      zurückkehren {
        Zahl: 1,
        Benutzername:'',
        Passwort:'',
        erinnere dich:'',
        Status:'',
        Inhalt: 'Bestätigungscode abrufen',
        Telefon:'',
        SMS-Code:'',
      }
    },
    Methoden:{
      //Mobiltelefonnummer und SMS-Bestätigungscode anmelden sms_login:function(){
        lass _dies=dies;
        dies.$axios.post('http://127.0.0.1:8000/user/login/',{
            'Benutzername':_dieses.Telefon,
            'Passwort':_dieser.SMS-Code,
          },{responseType:'json'})
          .dann(Funktion (res) {
            Sitzungsstorage.token=res.data.token;
             _this.$router.go(-1);
          }).catch(Funktion (Fehler) {
          console.log(Fehler.Antwort)
        });
      },
      //SMS-Bestätigungscode abrufenget_sms_code:function(){
        sei reg = /1[3-9]{2}\d{8}/;
        wenn( reg.test(dieses.Telefon) ){
          if(this.content == "Bestätigungscode abrufen"){
            dieser.Inhalt=60;
            lass _dies=dies;
            lass tt = setzeIntervall(Funktion () {
              wenn (_dieser.Inhalt>=1){
                _dieser.Inhalt--
              }
              anders {
                _this.content='Bestätigungscode erhalten';
                Löschintervall (tt)
              }
            },1000);
            dies.$axios.get('http://127.0.0.1:8000/user/sms?type=login&phone='+this.phone)
              .dann(Funktion (res) {
                wenn(res.data.message==0){
                  alert('Bestätigungscode erfolgreich gesendet')
                }
              }).catch(Funktion (Fehler) {
                console.log(Fehler.Antwort)
              })
          }
        }anders {
          alert('Die Handynummer ist falsch')
        }
      },
      //Benutzername und Passwort login1:function () {
        wenn (dieser.status==1){
          lass _dies=dies;
          dies.$axios.post('http://127.0.0.1:8000/user/login/',{
            'Benutzername':_dieser.Benutzername,
            'Passwort':_dieses.Passwort,
          },{responseType:'json'})
          .dann(Funktion (res) {
            wenn (res.status==200){
              wenn (_this.member){
                sessionStorage.removeItem('Token');
                localStorage.token=res.data.token;
              }
              anders {
                localStorage.removeItem('Token');
                sessionStorage.token=res.data.token
              }
              _this.$router.go(-1);
            }
            anders {
              alert('Falscher Benutzername oder Passwort')
            }
          })
          .catch(Funktion (Fehler) {
            Warnung(Fehler.Antwort.Daten.keine_Feldfehler[0]);
            Konsole.log(Fehler.Antwort.Daten.keine_Feldfehler);
          });
        }
        anders {
          alert('Fehler beim Bestätigungscode')
        }
      },
      handlerPopup:Funktion (CaptchaObj) {
        lass _dies=dies;
        captchaObj.onSuccess(Funktion () {
           var validieren = captchaObj.getValidate();
           _this.$axios.post("http://127.0.0.1:8000/user/yzm/",{
                    geetest_challenge: validieren.geetest_challenge,
                    geetest_validate: validieren.geetest_validate,
                    geetest_seccode: validieren.geetest_seccode,
                },{
                  Antworttyp: „json“,
            }).dann(Funktion (res) {
              _this.status=res.data.status
           }).catch(Funktion (Fehler) {
             console.log(Fehler)
           })
        });
        captchaObj.appendTo("#captcha");
      }
    },
    erstellt:Funktion () {
      lass _dies=dies;
      dies.$axios.get("http://127.0.0.1:8000/user/yzm")
        .dann(Funktion (res) {
          let Daten = JSON.parse(res.data);
          initGeetest({
                Breite: '350px',
                gt: data.gt,
                Herausforderung: data.challenge,
                Produkt: "Popup",
                offline: !data.success
            }, _this.handlerPopup);
        }).catch(Funktion (Fehler) {
          console.log(Fehler)
      })
    }
    
  }
</Skript>

<Stilbereich>
#Login{
  Hintergrund: URL ('../../assets/Login.jpg');
  Hintergrundgröße: 100 % 100 %;
  Höhe: 100%;
  Position: fest;
  Breite: 100 %;
}
.Kasten{
  Breite: 500px;
  Höhe: 600px;
  Rand: 0 automatisch;
  Rand oben: 200px;
  Textausrichtung: zentriert;
}
.box img{
  Breite: 190px;
  Höhe: automatisch;
}
.box p{
  Rand: 0;
}
.Zeichen{
  Schriftgröße: 18px;
  Farbe: #fff;
  Buchstabenabstand: .29px;
  Polsterung oben: 10px;
  Polsterung unten: 50px;
}
.passieren{
  Breite: 400px;
  Höhe: 460px;
  Rand: 0 automatisch;
  Hintergrundfarbe: weiß;
  Rahmenradius: 4px;
}
.Nachricht{
  Breite: 400px;
  Höhe: 390px;
  Rand: 0 automatisch;
  Hintergrundfarbe: weiß;
  Rahmenradius: 4px;
}
.title2{
  Breite: 350px;
  Schriftgröße: 20px;
  Farbe: #9b9b9b;
  Polsterung oben: 50px;
  Rahmen unten: 1px durchgezogen #e6e6e6;
  Rand: 0 automatisch;
  Rand unten: 20px;
}
.ss{
  Breite: 350px;
  Höhe: 45px;
  Rahmenradius: 4px;
  Rand: 1px durchgezogen #d9d9d9;
  Texteinzug: 20px;
  Schriftgröße: 14px;
  Rand unten: 20px;
}
.pass .t1{
  Breite: 350px;
  Rand: 0 automatisch;
  Höhe: 20px;
  Zeilenhöhe: 20px;
  Schriftgröße: 12px;
  Textausrichtung: zentriert;
  Position: relativ;
}
.t1 .rechts{
  Position: absolut;
  rechts: 0;
}
.erinnere dich{
  Anzeige: Inline-Block;
  Position: absolut;
  links: 20px;
}
.linke Eingabe{
  Position: absolut;
  links: 0;
  Breite: 14px;
  Höhe: 14px;
}
.login_btn{
  Breite: 350px;
  Höhe: 45px;
  Hintergrund: #ffc210;
  Rahmenradius: 5px;
  Schriftgröße: 16px;
  Farbe: #fff;
  Buchstabenabstand: .26px;
  Rand oben: 30px;
  Gliederung: keine;
  Rand: keiner;
  Cursor: Zeiger;
}
.registrieren{
  Rand oben: 20px;
  Schriftgröße: 14px;
  Farbe: #9b9b9b;
}
.register span{
  Farbe: #ffc210;
  Cursor: Zeiger;
}
.Cursor{
  Cursor: Zeiger;
}
.zeigen{
  Anzeige: Inline-Block;
  Polsterung unten: 5px;
  Rahmen unten: 2px durchgehend orange;
  Farbe: #4a4a4a;
}
A{
  Textdekoration: keine;
  Farbe: #ffc210;
}
#captcha{
  Rand: 0 automatisch;
  Höhe: 44px;
}
.sms{
  Position: relativ;
  Breite: 350px;
  Höhe: 45px;
  Rand: 0 automatisch;
  Zeilenhöhe: 45px;
}
.sms .inhalt{
  Position: absolut;
  oben: 0;
  rechts: 10px;
  Farbe: orange;
  Rahmen links: 1px durchgehend orange;
  Polsterung links: 10px;
  Cursor: Zeiger;

}
</Stil>

Das Frontend erhält den SMS-Bestätigungscode:

//SMS-Bestätigungscode abrufenget_sms_code:function(){
        let reg = /1[3-9]{2}\d{8}/; //Wenn die Telefonnummer eine echte Telefonnummer ist, kann der Bestätigungscode abgerufen werden if( reg.test(this.phone) ){ //Wenn auf der Seite „Bestätigungscode abrufen“ angezeigt wird, kann die Anforderung des Bestätigungscodes ausgelöst werden. Wenn der Countdown beginnt, kann durch Klicken keine Anforderung des Bestätigungscodes ausgelöst werden if(this.content == "Bestätigungscode abrufen"){ //Nachdem die Anforderung des Bestätigungscodes erfolgreich gesendet wurde, startet der Countdown für 60 Sekunden this.content=60;
            lass _dies=dies;
            lass tt = setzeIntervall(Funktion () {
              wenn (_dieser.Inhalt>=1){
                _dieser.Inhalt--
              }
              anders {
                _this.content='Bestätigungscode erhalten';
                Löschintervall (tt)
              }
            },1000);
            dies.$axios.get('http://127.0.0.1:8000/user/sms?type=login&phone='+this.phone)
              .dann(Funktion (res) {
                wenn(res.data.message==0){
                  alert('Bestätigungscode erfolgreich gesendet')
                }
              }).catch(Funktion (Fehler) {
                console.log(Fehler.Antwort)
              })
          }
        }anders {
          alert('Die Handynummer ist falsch')
        }
      },

Zur Anmeldung nutzt das Frontend die Handynummer und den SMS-Bestätigungscode:

//SMS-Bestätigungscode abrufenget_sms_code:function(){
        let reg = /1[3-9]{2}\d{8}/; //Wenn die Telefonnummer eine echte Telefonnummer ist, kann der Bestätigungscode abgerufen werden if( reg.test(this.phone) ){ //Wenn auf der Seite „Bestätigungscode abrufen“ angezeigt wird, kann die Anforderung des Bestätigungscodes ausgelöst werden. Wenn der Countdown beginnt, kann durch Klicken keine Anforderung des Bestätigungscodes ausgelöst werden if(this.content == "Bestätigungscode abrufen"){ //Nachdem die Anforderung des Bestätigungscodes erfolgreich gesendet wurde, startet der Countdown für 60 Sekunden this.content=60;
            lass _dies=dies;
            lass tt = setzeIntervall(Funktion () {
              wenn (_dieser.Inhalt>=1){
                _dieser.Inhalt--
              }
              anders {
                _this.content='Bestätigungscode erhalten';
                Intervall löschen(tt)
              }
            },1000);
            dies.$axios.get('http://127.0.0.1:8000/user/sms?type=login&phone='+this.phone)
              .dann(Funktion (res) {
                wenn(res.data.message==0){
                  alert('Bestätigungscode erfolgreich gesendet')
                }
              }).catch(Funktion (Fehler) {
                console.log(Fehler.Antwort)
              })
          }
        }anders {
          alert('Die Handynummer ist falsch')
        }
      },

Dies ist das Ende dieses Artikels über die Implementierung des SMS-Verifizierungscodes von vue_drf. Weitere relevante Inhalte zum SMS-Verifizierungscode von vue_drf finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Implementierung des Zugriffs auf den gleitenden Überprüfungscode von Vue + DRF + Drittanbietern

<<:  Lösung für das Problem, dass Java keine Verbindung zu MySQL 8.0 herstellen kann

>>:  So stellen Sie Ihre erste Anwendung mit Docker bereit

Artikel empfehlen

Prinzip und Implementierung der parallelen Replikation von MySQL5.7

Jeder, der ein wenig über Datenoperationen und -w...

Detaillierte Erklärung zur Verwendung des Schlüsselworts ESCAPE in MySQL

MySQL-Escape Escape bedeutet die ursprüngliche Se...

So installieren Sie Docker mithilfe von Skripten unter Linux Centos

Was ist die Hauptfunktion von Docker? Derzeit gib...

Vue-CLI3.x stellt Projekte automatisch auf dem Server bereit

Inhaltsverzeichnis Vorwort 1. Installieren Sie sc...

jQuery verwendet das Canvas-Tag, um den Bestätigungscode zu zeichnen

Das <canvas>-Element ist für clientseitige ...

SQL zur Implementierung der Wiederherstellung einer Zeitreihenversetzung

Inhaltsverzeichnis 1. Anforderungsbeschreibung 2....

Die Auswirkungen des Limits auf die Abfrageleistung in MySQL

I. Einleitung Lassen Sie mich zunächst die MySQL-...

Beispielcode zur Implementierung von Follow Ads mit JavaScript

Floating Ads sind eine sehr verbreitete Form der ...

CSS zur Erzielung einer kompatiblen Textausrichtung in verschiedenen Browsern

Beim Front-End-Layout des Formulars müssen wir hä...

Docker-Einstellung für den Windows-Speicherpfadvorgang

Wenn Sie Docker unter Windows 10 installieren und...