VorwortPasswortstärke-Dateiprüfer; Bei der Registrierung eines Kontos müssen wir die aktuelle Passwortstärke des Benutzers auswerten. Für diesen Vorgang müssen wir einen Detektor erstellen. Am besten schreiben Sie ihn flexibel, damit das Produkt die Regeln bequem ändern kann. Schauen wir uns zunächst die Wirkung an. Unten sehen Sie den Status entsprechend dem Screenshot. verwenden1 Parameterübergabe
2 Verwendung
3 Überprüfung Prüfen Sie, ob das Zeichen Implementierungsbeispiel Konfigurieren wir antd so, dass ein Prompter an das Kennworteingabefeld gebunden wird. 1 und 2 müssen nicht geändert werden, aber in der Praxis müssen wir den Wert der Eingabe überwachen und dann den Wert festlegen. So können wir eine Funktion definieren, die die Änderung des Wertes überwacht const [Eingabewert, gesetzter Eingabewert] = useState(''); const passwordChange = (Wert: Zeichenfolge) => { setInputValue(Wert); }; const onPasswordInput = (e: beliebig) => { Passwortänderung(e?.Ziel?.Wert || ''); }; Dann binden Sie es einfach. Nach dem Binden können wir es normal anzeigen. Wenn jedoch ungültige Zeichen eingegeben werden, müssen wir sie durch einen Interceptor abfangen. <Formular.Element ... Regeln={[ { erforderlich: wahr, Meldung: „Passwort nicht leer“, }, ({ getFieldValue }) => ({ validator(_, Wert) { Passwortänderung(Wert); wenn (PasswordForce.invaildWord) { returniere Promise.reject( neuer Fehler('Das Passwort enthält ungültige Zeichen.'), ); } gibt Promise.resolve() zurück; }, }), ]} ... Okay, da wir jetzt mit der Verwendung des Slices fertig sind, implementieren wir es. KomponentenschreibenKomponenten schreiben importieren { getRuleMatchResult, IpasswordForce, IpasswordRule, isMatchForceResultConfig, matchResultConfig, PasswortBreakKey, } von '@/utils/passwordStrengthChecker'; importiere React, { CSSProperties } von „react“; importiere { useEffect } von 'react'; importiere { useState } von „react“; Importiere Stile aus „Stilkomponenten“; Schnittstelleneigenschaften { Eingabewert: Zeichenfolge; Farbe?: Zeichenfolge; Stil?: CSS-Eigenschaften; Klassenname?: Zeichenfolge; benutzerdefinierteRegel?: IpasswordRule[]; } Aufzählung ForceMap { high = "Hoch", Mitte = 'Mitte', low = "Niedrig", } const boolNumSum = (Liste: boolean[]) => Liste.reduzieren<Zahl>( (vorherigerWert, aktuellerWert) => aktuellerWert ? vorherigerWert + 1 : vorherigerWert, 0, ); const passwordForce: (props: props) => { Ansicht: React.FC; aufgerufenes Wort: Boolesch; erzwingen: IpasswordForce; } = ({ Eingabewert, Stil = {}, Klassenname, benutzerdefinierte Regel = [] }) => { const [force, setforce] = useState<IpasswordForce>(false); const [invaildWord, setIsInvaildWord] = useState(false); const Eingabewertlänge = Eingabewert?.Länge || 0; const setData = () => { setze Kraft (falsch); const isFirstWordUp = Eingabewert[0] === Eingabewert[0].toLocaleUpperCase(); const ruleRsult = getRuleMatchResult(customRule, inputValue, undefiniert, ''); const matchNum = boolNumSum(ruleRsult.list.map((e) => e[passwordBreakKey])); const matchResultConfig: matchResultConfig[] = [ { min: 0, max: 32, matchNum: 1, Wert: "niedrig" }, { min: 7, max: 32, matchNum: 2, Wert: 'Mitte' }, { min: 7, max: 32, matchNum: 3, Wert: 'Mitte' }, { min: 15, max: 32, matchNum: 3, Wert: ‚hoch‘, Bedarf: isFirstWordUp }, ]; setIsInvaildWord(ruleRsult.invaildWord); matchResultConfig.forEach((config) => { isMatchForceResultConfig(Konfiguration, Übereinstimmungsnummer, Eingabewertlänge) && setforce(Konfigurationswert); }); }; useEffect(() => { Eingabewert? setData() : setforce(false); }, [Eingabewert]); zurückkehren { Ansicht: () => Gewalt ? ( <PasswordForceWrap {...{ Stil, Klassenname }}> {ForceMap[Kraft]} </PasswordForceWrap> ) : ( <></> ), ungültiges Wort, Gewalt, }; }; Standard-PasswortForce exportieren; const PasswordForceWrap = styled.span` Farbe: ${({ color }) => Farbe ?? '#000'}; `; Datenstrukturanalyse
ProzessanalyseDabei handelt es sich eigentlich um zwei Prozesse
Äh. Das ist alles, was es zum Geschäftscode gibt. Dann sind die Abhängigkeiten die Codes, die grundsätzlich nicht geändert werden. Basierend auf den unten stehenden zugrunde liegenden Dateien können wir sehr komplexe Validatoren im Geschäftscode konfigurieren und diesen Teil des Codes in anderen Dateien implementieren. Analyse des zugrunde liegenden CodesLass uns chatten. Das Folgende ist reiner TS-Code, der jedes Framework ausführen kann. passwordStrengthChecker.ts importiere { Zahlenliste, Spezialliste, Wortliste } aus './Konstanten'; Typzuordnung = <U, T>(Option: { Array: U[]; Bereich: Zahl; Übereinstimmungsliste: T[]; tokenMap: (updateItem: T, token: U, index: Nummer) => T; Unterbrechungsschlüssel?: Zeichenfolge; ArrayMap?: (Element: U, Index: Zahl) => ungültig; }) => T[]; /** * Array und Set abgleichen */ exportiere const setArrayMatch: map = ({ Anordnung, Reichweite, Übereinstimmungsliste, Schlüssel abbrechen, TokenMap, ArrayMap, }) => { const tokenLen = Array.Länge; für (let tokenIndex = tokenLen - 1; tokenIndex >= 0; tokenIndex--) { const arrayToken = array[tokenIndex]; arrayMap && arrayMap(arrayToken, tokenIndex); für (let findIndex = Bereich - 1; findIndex >= 0; findIndex--) { Übereinstimmungsliste = Übereinstimmungsliste.map((Element) => tokenMap(Element, Array-Token, Index finden), ); } wenn (breakKey && !matchList.map((e) => (e wie jeder)[breakKey]).includes(false)) brechen; } gibt Übereinstimmungsliste zurück; }; exportiere const passwordBreakKey = "isMatch"; Exporttyp IpasswordRule = { Liste: Zeichenfolge[]; isMatch: boolesch; Name: Zeichenfolge; }; exportiere const defaultPasswordRuleList = [ { Name: 'Spezial', Liste: Spezialliste }, { Name: 'num', Liste: Zahlenliste }, { Name: 'Wort', Liste: Wortliste }, ]; Typ PickValue<T, K erweitert Schlüssel von T> = T[K]; exportiere const getRuleMatchResult: ( benutzerdefinierte Regel: IpasswordRule[], Eingabewert: Zeichenfolge, Standardregel deaktivieren?: Boolesch, breakKey?: Zeichenfolge, ) => { Liste: IpasswordRule[]; Karte: Karte<PickValue<IpasswordRule, 'name'>, boolean>; matchCount: Zahl; aufgerufenes Wort: Boolesch; } = (benutzerdefinierte Regel, Eingabewert, Standardregel deaktivieren = true, Schlüsselwert unterbrechen) => { let Regelliste = [ ...(disableDefaultRule ? defaultPasswordRuleList : []), ...benutzerdefinierteRegel, ].map((item) => ({ ...item, [passwordBreakKey]: false })); const range = Math.max(...ruleList.map((ruleItem) => ruleItem.list.length)); lass matchCount = 0; Regelliste = setArrayMatch<Zeichenfolge, IpasswordRule>({ Array: Eingabewert.split(''), Reichweite, Übereinstimmungsliste: Regelliste, // keine vollständige Übereinstimmung mit breakKey breakKey: breakKey === void 0 ? passwordBreakKey : breakKey, tokenMap: (Regelelement, Eingabetoken, Suchindex) => { const match = Regelelement?.list[Suchindex] === Eingabetoken; wenn (Übereinstimmung) { Übereinstimmungsanzahl++; return { ...ruleItem, isMatch: true }; } Regelelement zurückgeben; }, }); zurückkehren { Liste: Regelliste, Karte: neue Karte (Regelliste.Karte ((e) => [e.Name, e[PasswortBreakKey]])), Übereinstimmungsanzahl, // Um diesen Wert zu erhalten, muss breakkey auf einen Null-String gesetzt werden. Wenn Sie vorzeitig beenden, wird der Zustand vorzeitig beendet. // Um diesen Wert zu erhalten, muss breakkey auf einen Null-String gesetzt werden ungültiges Wort: matchCount !== Eingabewert.Länge, }; }; exportiere const isMatchForceResultConfig = ( Konfiguration: matchResultConfig, matchNum: Zahl, inputValueLen: Zahl, ) => { zurückkehren ( Übereinstimmungsnummer === Konfiguration.Übereinstimmungsnummer && Eingabewertlänge >= config.min && Eingabewertlänge <= config.max && (config.need !== undefiniert ? config.need : true) ); }; Exporttyp matchResultConfig = { min: Zahl; max: Zahl; Übereinstimmungsnummer: Nummer; Wert: IpasswordForce; brauchen?: Boolesch; zurück?: IpasswordForce; }; Exporttyp IpasswordForce = false | „hoch“ | „mittel“ | „niedrig“; Der Vorgang besteht darin, Regeln zusammenzuführen. Eine davon ist die Standardregel und die andere die benutzerdefinierte Regel. Wenn Sie die Regel anpassen, wird die Standardregel überschrieben. Die Traversierungsfunktion ist eine separate Funktion höherer Ordnung, mit der die interne Logik angepasst werden kann. Zu diesem Zeitpunkt stimmen wir mit der entsprechenden Regel überein, aktivieren die Eigenschaften der entsprechenden Regel und sammeln die übereinstimmenden Zeichen. Wenn alle Übereinstimmungen erreicht sind, sollte die Durchquerung beendet werden. Es gibt jedoch eine Situation, in der die Durchquerung nicht beendet werden kann, und zwar dann, wenn ermittelt werden muss, ob ungültige Zeichen vorhanden sind. Schließlich wirft diese Funktion die verarbeiteten Daten an die übergeordnete Komponente weiter. Dies ist der Prozess. Beim Datenwerfen können einige Szenarien eine spezielle Verarbeitung der Daten entsprechend den Regeln erfordern, aber wenn es sich um eine Array-Struktur handelt, ist dies sehr unpraktisch. Daher sollten die geworfenen Daten in Listen- und Kartentypen unterteilt werden. Wenn die Anwendung auf höherer Ebene die entsprechenden Regeln abrufen möchte, kann sie map.get (Regelname) ausführen. Konstanten.ts export const specialList = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "-", "/", ",", ".", "?", "<", ">", ";", ":", "[", "]", "{", "}", "|", "\\"]; export const numberList = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']; export const wordList = ["q", "a", "z", "w", "s", "x", "e", "d", "c", "r", "f", "v", "t", "g", "b", "y", "h", "n", "u", "j", "m", "i", "k", "o", "l", "p", "Q", "A", "Z", "W", "S", "X", "E", "D", "C", "R", "F", "V", "T", "G", "B", "Y", "H", "N", "U", "J", "M", "I", "K", "O", "L", "P"]; andereViele Leute fragen sich vielleicht, ob ein Code-Detektor so kompliziert sein muss. Wäre es nicht besser, einfach reguläre Ausdrücke zu verwenden? Aus praktischer Sicht sind reguläre Ausdrücke eigentlich praktischer, aber manchmal möchten wir uns nicht an die Regeln halten oder den Nervenkitzel des manuellen Codierens oder wir möchten aus langweiligem Code mehr Spielbarkeit herausholen usw. Also schreiben wir einen Code, der ziemlich kompliziert aussieht, aber die darunterliegende Schicht kapselt, dann flexibel bleibt und die Geschäftsschicht so einfach wie möglich hält. Tatsächlich ist es nicht unmöglich, es auszuprobieren, aber es wird bei der Überprüfung auch kritisiert. Bitte seien Sie beim Kopieren vorsichtig. Wenn Sie wenig Zeit haben oder nicht über gute Codierkenntnisse verfügen, wird die Verwendung dieses Codes nicht empfohlen. Ich übernehme keine Verantwortung für etwaige Probleme. ZusammenfassenDies ist das Ende dieses Artikels über die Implementierung eines Passwortstärkedetektors in React. Weitere relevante Inhalte zum Passwortstärkedetektor von React finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! |
<<: Installationsschritte von Docker-CE auf dem Raspberry Pi 4b Ubuntu19-Server
>>: Zusammenfassung der in MySQL häufig verwendeten Typkonvertierungsfunktionen (empfohlen)
eins, G:\MySQL\MySQL Server 5.7\bin> mysqld --...
Installieren Sie MySQL 8.0 docker run -p 63306:33...
Wenn wir eine Seite erstellen, insbesondere eine ...
Wissenspunkte in der Vorschau anzeigen. Animation...
Wenn unter Linux eine Datei erstellt wird, ist de...
Inhaltsverzeichnis 1. Array-Dekonstruktion 2. Obj...
Sie müssen CSS gleichzeitig auf Div oder Span anwe...
Bei der Arbeit an einem Projekt bin ich kürzlich ...
Inhaltsverzeichnis 1. Ein einfachstes serverseiti...
In diesem Artikel wird der spezifische Code von U...
Offizielle MySQL-Website: https://www.mysql.com/d...
Inhaltsverzeichnis 1. Der Unterschied zwischen Fu...
Im vorherigen Artikel haben wir das ausführliche ...
DCL (Data Control Language): Datenkontrollsprache...
Vorwort Die Zeichenfolgentypen der MySQL-Datenban...