Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

前面に書かれた

販売者側でセンシティブな単語を検出する過程で、いくつかの問題が見つかりましたので、ここでまとめます。この記事のアイデアは、敏感な単語検出コードを書くことです。最初の 2 つのアイデアはコンポーネントベースの開発アイデアを採用しておらず、最後の 3 つのアイデアはコンポーネントベースのアイデアとミックスインを使用して要件の変更に応じて開発されています。

要件分析 v1

販売者製品モジュールで、製品編集ボタンをクリックして製品のタイトルと価格を変更します。製品タイトルが入力されていない場合、[保存] ボタンはグレー表示され、入力された製品タイトルにセンシティブな単語が含まれている場合、[保存] ボタンはグレー表示され、バックエンドへの戻りを求めるプロンプトが表示されます。

マーチャント側のカスタマイズ モジュールでは、カスタマイズが完了したら、商品編集ページに直接ジャンプして、商品のタイトルや価格を変更できます。製品タイトルが入力されていない場合、[保存] ボタンはグレー表示され、入力された製品タイトルにセンシティブな単語が含まれている場合、[保存] ボタンはグレー表示され、バックエンドへの戻りを求めるプロンプトが表示されます。

アイデア1: インターセプションメソッドを使用して入力ボックスの入力イベントを監視する

私は商品モジュールを担当していたため、カスタマイズしたモジュールの商品タイトルにもセンシティブワード検出を追加する必要があることを知らず、当初はセンシティブワード検出をコンポーネントとして記述していませんでした。したがって、最初のアイデアは、インターセプション メソッドを使用して入力ボックスの入力イベントを監視することです。

アイデア:

1. 入力が空でないか、スペースでいっぱいでない限り、入力ごとに入力ボックスの入力イベントがトリガーされ、敏感な単語検出インターフェースが呼び出されます。頻繁なインターフェース要求はサーバーに大きな負担をかけるため、インターセプション方式を使用してインターフェース要求の頻度を減らすことができます。

2. 要求されたインターフェースにタイマーを追加し、1 秒のカウントダウン時間を追加します。各入力後に要求インターフェースを 1 秒遅延します。したがって、入力ボックスの入力イベントがトリガーされた後、以前のタイマーをクリアすることができます。タイマーの重複とインターフェース要求の繰り返しを防ぎ、最後の入力イベントによってトリガーされた機密単語検出のインターフェース要求のみを保持します。つまり、ユーザーが製品タイトルを連続して入力し、各入力の間隔が 1 秒未満の場合、ユーザーが最後に入力した情報は、インターフェースによって、センシティブ ワード仕様に準拠しているかどうかが確認されます。ユーザーが製品タイトルを間隔を空けて入力し、間隔が 1 秒を超える場合、複数のインターフェース リクエストが開始され、サーバーにかなりの負荷がかかるため、この方法には依然として制限があります。

// センシティブな単語検出のための HTML
<div class="edit-title">製品タイトル</div>
   <el-入力
     v-model="製品名"
     placeholder="商品名を入力してください"
     タイプ="テキスト"
     オートコンプリート="オン"
     クリア可能
     @input="スパムを検査"
   />
<div v-if="showMessage" class="message">{{ errorMessage }}</div>

//保存ボタンのHTML
<el-button type="primary" @click="save" :disabled="productName === '' || showMessage === true">保存</el-button>
 データ() {
    戻る {
      製品名: ''、
      エラーメッセージ: ''、
      表示メッセージ: false、
      タイマー: -1
    }
  },
  メソッド: {
    検査() {
      if(this.productName.trim() !== '') {
        this.$store.dispatch('products/inspectSpams', this.productName).catch((err)=>{
          this.errorMessage = err.response.data.message
          this.showMessage = true
        })
      }
    },
    スパムを検査する(){
      this.showMessage = false
      タイムアウトをクリアします(this.timer)
      this.timer = setTimeout(() => {
        これを検査する()
      }, 1000)
    }
  }   

欠陥: 製品タイトルに敏感な単語を追加した後、手の動きが十分に速ければ、1 秒以内に [保存] ボタンをクリックすると敏感な単語が正常に保存されますが、これは私たちのニーズに反しています。

アイデア2: 入力ボックスのフォーカス喪失と保存ボタンのクリックイベントを使用する

入力ボックスの入力イベントを使用すると問題が発生するため、入力ボックスのフォーカス喪失イベントと保存ボタンのクリックイベントを使用することは可能でしょうか?答えはイエスです。ただし、このプロセスでは特別な注意が必要な問題が 2 つあります。

注記:

  • 焦点が合っていないイベントを理解する必要があります。 焦点が合っていないのは何ですか?入力ボックスにタイトルを入力した後、入力ボックスの外側の任意の場所をクリックすると、フォーカス喪失イベントがトリガーされます。したがって、[保存] ボタンをクリックするとフォーカスが失われるイベントもトリガーされることを忘れないでください。したがって、クリック イベントで要求を繰り返す必要はなく、入力ボックスのフォーカス外イベントで敏感な単語検出インターフェースを要求するだけで済みます。
  • フォーカス外イベントやクリック イベントをトリガーすることによって発生する非同期の問題を考慮する必要があります。 [保存] ボタンをクリックすると、フォーカス外イベントとクリック イベントの両方がトリガーされます。フォーカス外イベントはクリック イベントよりも優先されます。フォーカス外イベントは、センシティブな単語検出インターフェースを要求するために使用され、クリック イベントは製品情報を変更するために使用されます。インタラクション ロジックでは、まずセンシティブ ワード検出インターフェイスを要求します。インターフェイスによって返されるステータスが成功の場合、エラー プロンプト メッセージを表示する必要はありません。それ以外の場合は、バックエンドによって返されるエラー メッセージを表示し、保存ボタンを無効にする必要があります。検証が成功したら、製品情報インターフェースの変更をリクエストします。したがって、これら 2 つの方法の間には順序があります。また、フォーカス外イベントは、まずセンシティブワードインターフェースをリクエストする必要があり、製品情報の変更リクエストは、センシティブワードインターフェースリクエストが完了した後に行う必要があります。センシティブな単語の検出が遅いため、違法なセンシティブな単語を正常に保存してレンダリングすることはできません。現時点では、センシティブな単語の検出 API をリクエストする必要はありません。 2 つのインターフェースを判別して保証することは不可能であるため、センシティブ ワード インターフェース要求が終了したかどうかを判断するための変数を追加する必要があります。インターフェイスがリクエストを完了していない場合は、クリック イベントでリクエストを再度開始する必要があります。インターフェイスがリクエストを完了している場合は、単に戻って無視します。

アイデア:

  • 入力ボックスにフォーカス喪失イベントを追加します。
  • [保存] ボタンのクリック イベントを追加します。

コード:

<div class="edit-title">製品タイトル</div>
 <el-入力
   v-model="製品名"
   placeholder="商品タイトルを入力してください"
   タイプ="テキスト"
   オートコンプリート="オン"
   クリア可能
   @blur="スパムを検査"
 />
 <div v-if="showMessage" class="message">{{ errorMessage }}</div>
 
 <el-button type="primary" @click="save" :disabled="!productName || showMessage">保存</el-button>
 データ() {
   戻る {
     表示メッセージ: false、
     製品名: ''、
     エラーメッセージ: ''、
     タイマー: -1、
     検証済み: false
   }
 },
 メソッド: {
  // フォーカス外イベント (センシティブな単語検出インターフェースをリクエスト)
   非同期検査スパム() {
     this.hasVerified = false
     this.showMessage = false
     if(this.productName.trim() !== '') {
       これを待機します。$store.dispatch('products/inspectSpams', this.productName).catch((err) => {
         this.errorMessage = err.response.data.message
         this.showMessage = true
       })
     }
     this.hasVerified = true
   },
   //クリックイベント(製品情報インターフェースの変更要求)
   非同期保存(){
     if(!this.hasVerified) {
        this.inspectSpams() を待つ
     }
     const バリアント = this.variants.map((variant) => {
       戻る {
         id: バリアント.id、
         価格: バリアント.価格、
       }
     })
     定数パラメータ = {
       変種、
       名前: this.productName
     }
     params.productId = this.productId
     これを待ちます。$store.dispatch('products/editProduct', params)
       .then(非同期() => {
         this.getProductListData(this.productStatus, 1) を待機します。
         this.$メッセージ({
           タイプ: '成功'、
           メッセージ: '製品の変更に成功しました! '
         })
       })
       .catch((メッセージ) => {
         this.$メッセージ({
           タイプ: 'エラー'、
           メッセージ
         })
       })
     this.showEditProductDialog = false
   }
 }

アイデア3: ミックスインを使用してセンシティブな単語を検出する方法

センシティブな単語の検出は放棄されたと思っていましたが、カスタム モジュールの製品タイトルにもセンシティブな単語の検出を追加する必要があるという製品メッセージを受け取りました。その後、私は虎のように ctrl+c と ctrl+v を押して、最終的にコードが冗長すぎて整理する必要があることに気付きました。ここで、および以下では、製品モジュールのセンシティブ ワード検出ロジックについてのみ説明します。カスタム モジュールのセンシティブ ワード検出ロジックは、実際には製品モジュールのセンシティブ ワード検出ロジックと似ています。 カスタム モジュールでの製品タイトル編集のスタイルとロジックは製品モジュールとほぼ同じなので、センシティブな単語を検出するためのパブリック メソッドを抽出してみませんか?私は喜んでこれに決め、キーボードでたくさん入力した後、ミックスイン メソッドが形成されました。

エクスポートデフォルト{
データ() {
     戻る {
         検証済み: false、
         表示メッセージ: false、
         エラーメッセージ: ''
     }
 },
 メソッド: {
     非同期inspectSpams(名前) {
         this.hasVerified = false
         this.showMessage = false
         if(name.trim() !== '') {
           これを待機します。$store.dispatch('products/inspectSpams', name).catch((err) => {
             this.errorMessage = err.response.data.message
             this.showMessage = true
           })
         }
         this.hasVerified = true
     }
 }
}
<div class="edit-title">製品タイトル</div>
<el-入力
    v-model="製品名"
    placeholder="商品名を入力してください"
    タイプ="テキスト"
    オートコンプリート="オン"
    クリア可能
    @blur="スパムを検査(productName)"
/>
<div v-if="showMessage" class="message">{{ errorMessage }}</div>

<el-button type="primary" @click="save" :disabled="!productName || showMessage">保存</el-button>
'@/mixins/inspectSpams' からinspectSpamsをインポートします

エクスポートデフォルト{
     データ() {
          戻る {
              製品名: ''
          }
      },
      ミックスイン: [inspectSpams],
      メソッド: {
        //クリックイベント(製品情報インターフェースの変更要求)
        非同期保存(){
          if(!this.hasVerified) {
              this.inspectSpams(this.productName) を待機します
          }
          const バリアント = this.variants.map((variant) => {
            戻る {
              id: バリアント.id、
              価格: バリアント.価格、
            }
          })
          定数パラメータ = {
            変種、
            名前: this.productName
          }
          params.productId = this.productId
          これを待ちます。$store.dispatch('products/editProduct', params)
            .then(非同期() => {
              this.getProductListData(this.productStatus, 1) を待機します。
              this.$メッセージ({
                タイプ: '成功'、
                メッセージ: '製品の変更に成功しました! '
              })
            })
            .catch((メッセージ) => {
              this.$メッセージ({
                タイプ: 'エラー'、
                メッセージ
              })
            })
          this.showEditProductDialog = false
        }
      }
}

アイデア 4: Promise を使用して機密単語検出コンポーネントをカプセル化する (需要指向 v1)

商品モジュールのセンシティブワード検出とカスタムモジュールの HTML 構造がほぼ同じであることを考慮して、センシティブワード検出コンポーネントをカプセル化し、商品タイトルのセンシティブワード検出の HTML コードとビジネスロジックをまとめることにしました。しかし、このプロセスでは、特別な注意が必要な問題が 3 つあります。

注記:

  • async 関数は promise オブジェクトを返します。
  • 渡された props 値を直接変更することはできませんが、中間変数を介して中間変数を props に双方向にバインドすることで、 props 値を間接的に変更できます。
  • 親コンポーネントの props に sync 修飾子を追加し、子コンポーネントの props と中間変数を監視できます。どちらかの値が変化すると、変化した値がもう一方の値に割り当てられ、双方向バインディングの目的が達成されます。

アイデア:

  • センシティブな単語検出コンポーネントを記述します。
  • センシティブな単語検出コンポーネントを導入します。
// センシティブ単語検出コンポーネント <テンプレート>
    <div>
        <el-input v-model="input" placeholder="製品タイトルを入力してください" type="text" clearable @blur="inspectSpams" />
        <div v-if="isShowMessage" class="message">{{ errorMessage }}</div>
    </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
    小道具: {
        タイトル:
            必須: true、
            タイプ: 文字列
        }
    },
    データ() {
        戻る {
            入力: ''、
            メッセージを表示: false、
            エラーメッセージ: ''、
            検証済み: true
        }
    },
    時計:
        タイトル:
            ハンドラ(val) {
                this.input = val
            },
            即時: 真
        },
        入力(値) {
            this.$emit('update:title', val)
        }
    },
    メソッド: {
        非同期検査スパム() {
            this.hasVerified = false
            this.isShowMessage = false
            if (this.input !== '') {
                これを待機します。$store.dispatch('products/inspectSpams', this.input).catch((err) => {
                    this.errorMessage = err.response.data.message
                    this.isShowMessage = true
                })
            }
            this.hasVerified = true
        },
        初期化() {
            this.isShowMessage = false
        },
        非同期検証(){
            (!this.hasVerified)の場合{
                this.inspectSpams() を待つ
            }
            定数空の入力 = this.input.trim()
            空の入力 === '' の場合 {
                this.isShowMessage = true
                this.errorMessage = '商品名を入力してください'
            }
            新しい Promise を返します (resvole、reject) => {
                if (Boolean(!emptyInput || this.isShowMessage)) {
                    拒否する()
                } それ以外 {
                    レスボル()
                }
            })
        }
    }
}
</スクリプト>

<スタイル>
。メッセージ {
    フォントの太さ: 太字;
    色: 赤;
    上マージン: 10px;
}
</スタイル>
// センシティブな単語検出コンポーネントを導入する <script>
'vuex' から { mapState } をインポートします。
'@/components/InspectSpams' から InspectSpams をインポートします。

エクスポートデフォルト{
 名前: 'リスト',
 コンポーネント:
   スパムを検査する
 },
 データ() {
   戻る {
     製品名: ''
   }
 },
 計算: {
   ...mapState({
     バリエーション: (状態) => state.products.detail.variants
   })、
 },
 メソッド: {
   保存() {
     this.$refs.productSpamsRef.verify()
       .then(async()=>{
         const バリアント = this.variants.map((variant) => {
         戻る {
           id: バリアント.id、
           価格: バリアント.価格、
         }
       })
       定数パラメータ = {
         変種、
         名前: this.productName
       }
       params.productId = this.productId
       これを待ちます。$store.dispatch('products/editProduct', params)
         .then(非同期() => {
           this.getProductListData(this.productStatus, 1) を待機します。
           this.$メッセージ({
             タイプ: '成功'、
             メッセージ: '製品の変更に成功しました! '
           })
         })
       this.showEditProductDialog = false
       })
       .catch(()=>{
         this.$メッセージ({
           タイプ: 'エラー'、
           メッセージ: '有効な製品名を入力してください'
         })
       })
   },
   getProductListData(ステータス、ページ) {
     this.$store.dispatch('products/getList', {
       制限: 16,
       状態、
       順序: 'id',
       方向: 'desc',
       ページ
     })
   }
}
</スクリプト>

<テンプレート>
    <div>
      <div class="edit-title">製品タイトル</div>
      <スパムの検査 
         :title.sync="製品名"
         ref="製品スパムRef"
      />
      <el-button type="primary" @click="save">保存</el-button>
    </div>
</テンプレート>

アイデア 5: スロットとミックスインを使用して、センシティブな単語検出コンポーネントをカプセル化する (需要指向 v2)

要件の変更: 実際、要件 v1 と比較すると変更はありません。製品モジュールの製品タイトルのみを入力する必要があります。入力しないと、保存ボタンが無効になります。カスタム モジュールの製品タイトルは空白のままにすることができます。保存後、デフォルトは入力された製品タイトル + ホワイトボード名になります。

アイデア: この場合、エラー プロンプトの HTML をコンポーネントに配置し、スロットを使用して検出する必要のあるフィールドを表し、機密単語の検出ロジックをミックスインに配置してはいかがでしょうか。将来、他の場所で繊細な単語検出が必要になった場合、より柔軟に対応できます。実際、これはコンポーネントの再利用の原則にさらに役立ちます。

// センシティブ単語検出コンポーネント <テンプレート>
 <div>
     <スロット />
     <div v-if="isShowMessage" class="メッセージ">
         {{エラーメッセージ}}
     </div>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 小道具: {
     メッセージを表示: {
         必須: true、
         タイプ: ブール値
     },
     エラーメッセージ: {
         必須: true、
         タイプ: 文字列
     }
 }
}
</スクリプト>

<スタイル>
。メッセージ {
 フォントの太さ: 太字;
 色: 赤;
 上マージン: 10px;
}
</スタイル>
//センシティブな単語検出のためのミックスイン
エクスポートデフォルト{
 データ() {
     戻る {
         メッセージを表示: false、
         エラーメッセージ: ''、
         検証済み: true
     }
 },
 メソッド: {
     非同期inspectSpams(名前) {
         this.hasVerified = false
         this.isShowMessage = false
         if (name.trim() !== '') {
             これを待機します。$store.dispatch('products/inspectSpams', name).catch((err) => {
                 this.errorMessage = err.response.data.message
                 this.isShowMessage = true
             })
         }
         this.hasVerified = true
     }
 }
}
'@/components/InspectSpams' から InspectSpams をインポートします。
'@/mixins/inspectSpams' からinspectSpamsをインポートします

コンポーネント:
 スパムを検査する
},
ミックスイン: [inspectSpams],

非同期保存(){
   if(!this.hasVerified) {
     this.inspectSpams(this.productName) を待機します
   }
   const バリアント = this.variants.map((variant) => {
     戻る {
       id: バリアント.id、
       価格: バリアント.価格、
     }
   })
   定数パラメータ = {
     変種、
     名前: this.productName
   }
   params.productId = this.productId
   これを待ちます。$store.dispatch('products/editProduct', params)
     .then(非同期() => {
       this.getProductListData(this.productStatus, 1) を待機します。
       this.$メッセージ({
         タイプ: '成功'、
         メッセージ: '製品の変更に成功しました! '
       })
     })
     .catch((メッセージ) => {
       this.$メッセージ({
         タイプ: 'エラー'、
         メッセージ
       })
     })
   this.showEditProductDialog = false
 },
 
<div class="edit-title">製品タイトル</div>
<InspectSpams :isShowMessage="isShowMessage" :errorMessage="errorMessage">
 <el-入力
     v-model="製品名"
     placeholder="商品名を入力してください"
     タイプ="テキスト"
     オートコンプリート="オン"
     クリア可能
     @blur="スパムを検査(productName)"
 />
</スパムを検査>

最適化と改善

1. センシティブ単語検出を呼び出すための条件を最適化します。商品タイトルが変更されていない場合は、センシティブワード検出 API をリクエストする必要はありません。正常に検証されたタイトルのみ正常に保存できるため、インターフェースを繰り返し呼び出す必要はありません。ミックスイン要求インターフェースの条件を変更する必要があります。

アイデア: 製品 ID に基づいてモーダル ボックスを開いて製品詳細インターフェイスを要求するプロセスで、対応する製品情報の名前フィールドを新しく追加された originalName 変数に割り当てます。 HTML および JS で inspectSpams ミックスイン メソッドを呼び出すときは、originalName と productName を変数として渡します。

// 変更されたミックスインはエクスポートデフォルト{にミックスされます
    データ() {
        戻る {
            メッセージを表示: false、
            エラーメッセージ: ''、
            検証済み: true
        }
    },
    メソッド: {
        非同期のinspectSpams(originalName, currentName) {
            this.hasVerified = false
            this.isShowMessage = false
            if (originalName !== currentName && currentName.trim() !== '') {
                これを待ちます。$store.dispatch('products/inspectSpams', currentName).catch((err) => {
                    this.errorMessage = err.response.data.message
                    this.isShowMessage = true
                })
            }
            this.hasVerified = true
        }
    }
}

2. ボタンを複数回クリックすると、インターフェースが繰り返し要求されます。最適化するには、手ぶれ補正、ボタンのカウントダウン、axios リクエストのカプセル化、ボタンの読み込みの設定などを使用できます。

最後に

実際のところ、要約はあまり良くなく、記述されたコンポーネントも十分ではなく、アイデアもあまり明確ではありません。ここでは主にアイデア 2 と 4 を要約するために記録しています。結局のところ、私は Vue のドキュメントにあまり精通していません。センシティブな単語の検出コンポーネントには、まだ改善できる点が数多くあります。コメントで指摘してください。

上記は、センシティブな単語を検出するための Vue コンポーネントを作成するためのさまざまなアイデアの詳細な内容です。センシティブな単語を検出するための Vue コンポーネントの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Python でセンシティブな単語フィルタリングを実装する 4 つの方法
  • Python に基づいてセンシティブな単語を取得して出力する
  • Laravel フレームワークは、センシティブな単語フィルタリング機能の例を実装します
  • Python はクラスを使用して冠詞に敏感な単語フィルタリングメソッドの例を実装します
  • Pythonの単語フィルタリングの実装に関する簡単な説明
  • PHP で実装されたセンシティブな単語のフィルタリング方法の例
  • Python 正規表現を使用して敏感な単語をフィルタリングする方法
  • Python は Honor of Kings でセンシティブな単語フィルタリングの例を実装します
  • Pythonはセンシティブな単語フィルタリング方法を実装する
  • jsは、センシティブな単語フィルタリングアルゴリズムと実装ロジックを実装します。
  • Java は、センシティブな言葉や広告の言葉をフィルタリングする DFA アルゴリズムを実装します

<<:  Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順

>>:  WHMCS V7.4.2 グラフィカル インストール チュートリアル

推薦する

CSS セレクタのグループ化の簡単な分析

セレクタのグループ化h2 要素と段落の両方を灰色にしたいとします。これを行う最も簡単な方法は、次のス...

CSSを使用して炎の効果を作成する方法

本文は以下から始まります。 123WORDPRESS.COM ダウンロード:純粋な CSS3 で超リ...

Node.jsはexpress-fileuploadミドルウェアを使用してファイルをアップロードします

目次プロジェクトを初期化するサーバーの作成クライアントを初期化するコンポーネントの記述ファイルアップ...

Vueプロジェクトの最適化とパッケージ化の詳細な説明

目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...

Vue のスロットスコープの詳細な理解(初心者向け)

Baidu には slot-scope に関する記事が既にたくさんありますが、以前よく学習しておら...

Nginx 静的ファイル サービスの構成と最適化の詳細な説明

ルートディレクトリとインデックスファイルroot ディレクティブは、ファイルの検索に使用するルート ...

Linux におけるドライバモジュールのパラメータ転送プロセスの分析

ドライバーモジュールに渡すパラメータ名、タイプ、権限を宣言します。 module_param(変数名...

IE ブラウザの HTML ハック タグの概要

コードをコピーコードは次のとおりです。 <!--[if !IE]><!-->...

Hbase 入門

1. HBaseの概要1.1 HBaseとはHBase は、高い信頼性、高いパフォーマンス、列ストレ...

MySQL 8.0 以降の一般的なコマンドの詳細な説明

リモートアクセスを有効にする次のコマンドを実行して、root ユーザーのリモート アクセス権を有効に...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

MySQLは遅いSQLを開始し、原因を分析します

ステップ1. MySQLスロークエリを有効にする方法1: 設定ファイルを変更するWindows: W...

Ansibleを使用してTomcatをバッチでデプロイする方法

1.1 ディレクトリ構造の構築この操作は、nginx+mysql+tomcat+dbのディレクトリ構...

ReactとAntdのFormコンポーネントを組み合わせてログイン機能を実装する方法を詳しく説明します

目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...

Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決する

以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...