前面に書かれた販売者側でセンシティブな単語を検出する過程で、いくつかの問題が見つかりましたので、ここでまとめます。この記事のアイデアは、敏感な単語検出コードを書くことです。最初の 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 つあります。 注記:
アイデア:
コード: <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 つあります。 注記:
アイデア:
// センシティブ単語検出コンポーネント <テンプレート> <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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順
>>: WHMCS V7.4.2 グラフィカル インストール チュートリアル
セレクタのグループ化h2 要素と段落の両方を灰色にしたいとします。これを行う最も簡単な方法は、次のス...
本文は以下から始まります。 123WORDPRESS.COM ダウンロード:純粋な CSS3 で超リ...
目次プロジェクトを初期化するサーバーの作成クライアントを初期化するコンポーネントの記述ファイルアップ...
目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...
Baidu には slot-scope に関する記事が既にたくさんありますが、以前よく学習しておら...
ルートディレクトリとインデックスファイルroot ディレクティブは、ファイルの検索に使用するルート ...
ドライバーモジュールに渡すパラメータ名、タイプ、権限を宣言します。 module_param(変数名...
コードをコピーコードは次のとおりです。 <!--[if !IE]><!-->...
1. HBaseの概要1.1 HBaseとはHBase は、高い信頼性、高いパフォーマンス、列ストレ...
リモートアクセスを有効にする次のコマンドを実行して、root ユーザーのリモート アクセス権を有効に...
以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...
ステップ1. MySQLスロークエリを有効にする方法1: 設定ファイルを変更するWindows: W...
1.1 ディレクトリ構造の構築この操作は、nginx+mysql+tomcat+dbのディレクトリ構...
目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...
以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...