vue-element-admin開発ログ

vue-element-admin

統合ソリューションを強くお勧めします。

公式サイトでは基本的なテンプレートの使用を推奨していますが、必要に応じて統合ソリューションから機能を追加してください。統合スキームの一部の機能が使用できないため、冗長なコードが形成されます。

ただし、基本テンプレートの使用は非常に基本的で、タブナビゲーションなどの機能は多くありません。基本テンプレートにはパンくずナビゲーションしかありません。現時点では、タブの機能を追加したい場合は、私のような人がソースコードに精通していない。何をコピーすればよいかわからない。

したがって、統合スキーム、冗長性は冗長であり、コードの削除はコードのコピーよりも常に簡単です。

 

前作はすべて巨人の肩の上に立っていましたが、ビジネスニーズに応じて、業界の大物によってフレームワークが改造され、基本的にはビジネスコードだけを気にして直接使用されていました。したがって、このフレームワークは使用されていませんが、開発は難しくありません。

さて、最初から新しいプロジェクトがこのフレームワークを再び使用します。実際には、フレームワークのソースコードをgithubからダウンロードして開発を開始しているため、多くの詳細を要約して記録する必要があります。

 

テキスト

ログイン:確認コードコードなど、ユーザー名とパスワードに加えてログインに必要なパラメーター

src / store / modules / user.js

login({commit}、userInfo){

        const {ユーザー名、パスワード、コード、コードID} = userInfo

        新しいPromise((resolve、reject)=> {を返す

            login({ユーザー名:username.trim()、パスワード:パスワード、コード:code.trim()、codeId:codeId})。then(response => {

                const {data} =応答

                commit( 'SET_TOKEN'、data.token)

                setToken(data.token)

                    // commit( 'SET_TOKEN'、data.token)

                    // setToken(data.token)

                resolve()

            })。catch(error => {

                拒否(エラー)

            })

        })

    }、

 

トークンを変更する

src / utils / request.js

if(store.getters.token){

        //各リクエストにトークンを運ばせます

        // ['X-Token']はカスタムヘッダーキーです

        //実際の状況に応じて変更してください

        //config.headersekenen'X-Token '] = getToken()

        config.headers ['auth-token'] = 'userToken:' + getToken()//各リクエストにカスタムトークンを伝送させます。実際の状況に応じて変更してください

 }

 

タイムアウトの変更をリクエストする

src / utils / request.js

タイムアウト:10000

 

ルーティングの変更:ログインページでパスワードを忘れた場合など、ルーティングにリダイレクトが必要ない場合。

src / permit.js

const whiteList = ['/ login'、 '/ auth-redirect'、 '/ forgetPwd'] //リダイレクトホワイトリストなし

 

権限ルーティング:権限関連ページの権限を参照してください

src / router / index.js

export const asyncRoutes = [{}];

 

ルートはナビゲーションメニューで非表示になっています:非表示:true

src / router / index.js

{{

        パス: '/ forgetPwd'、

        名前: 'ForgetPwd'、

        コンポーネント:()=>

            インポート( '@ / views / user / forgetPwd')、

        非表示:true

    }、

 

設定:デフォルトでメニューの上にロゴ表示を開くように設定します

src / store / modules / settings.js

src / settings.js

/ **

   * @type {boolean} true | false

   * @ descriptiontagsViewが必要かどうか

   * /

  tagsView:true、

 

表示されているプロパティには$でアクセスする必要があります。または、Vueインスタンスでは_はプロキシされません。

src / permit.js中修改Message.error(error)是Message.error(error.message)

 

キャッチ(エラー){

            //トークンを削除し、ログインページに移動して再ログインします

            store.dispatch( 'user / resetToken')を待つ

            Message.error(error.message)

            next( `/ login?redirect = $ {to.path}`)

            NProgress.done()

}

権限制御に関して、フレームワークはページレベルおよびボタンレベルの権限制御をサポートします。

ルーティングの権限制御はページレベルで行われます。

src / router / index.js

{{

    パス: '/ permit'、

    コンポーネント:レイアウト、

    リダイレクト: '/ permit / page'、

    alwaysShow:true、//常にルートメニューを表示します

    名前: '許可'、

    メタ:{

      タイトル: '許可'、

      アイコン: 'ロック'、

      ロール:['admin'、 'editor'] //ルートナビゲーションでロールを設定できます

    }、

    子供達: [

      {{

        パス: 'ページ'、

        コンポーネント:()=> import( '@ / views / permit / page')、

        名前: 'PagePermission'、

        メタ:{

          タイトル: 'ページ許可'、

          ロール:['admin'] //または、サブナビゲーションでのみロールを設定できます

        }

      }、

      {{

        パス: 'ディレクティブ'、

        コンポーネント:()=> import( '@ / views / permit / directive')、

        名前: 'DirectivePermission'、

        メタ:{

          タイトル: '指令許可'

          //役割を設定しない場合、意味:このページには権限は必要ありません

        }

      }、

      {{

        パス: '役割'、

        コンポーネント:()=> import( '@ / views / permit / role')、

        名前: 'RolePermission'、

        メタ:{

          タイトル: '役割の許可'、

          役割:['admin']

        }

      }

    ]

  }、

 

ページの権限制御はボタンレベルです。

キーメソッド

v-if = "checkPermission(['admin'、 'editor'])"

v-permission = "['admin'、 'editor']"

 

フロントエンドとバックエンドのパラメーターの相互作用:応答コードと応答メッセージについて

バックエンドは、ヘッダー内のステータスコードとx-api-messageを応答コードとエラーメッセージとして取得するように要求します。

メッセージをデコードします(base64)

decodeURIComponent(window.atob( 'dG9rZW4lRTQlQjglOEQlRTglODMlQkQlRTQlQjglQkElRTclQTklQkElRUYlQkMlODE ='))

インターセプターをリクエストする

src / utils / request.js

以下の問題は、ステータスコードが403または404の場合、res.statusを使用して取得できないことです。エラー処理関数で取得するには、error.response.statusを使用する必要があります。

//応答インターセプター

service.interceptors.response.use(

    / **

     *ヘッダーやステータスなどのhttp情報を取得したい場合

     *応答を返してください=>応答

     * /

 

    / **

     *カスタムコードでリクエストステータスを確認する

     *これはほんの一例です

     ※HTTPステータスコードでステータスを判断することもできます

     * /

    応答=> {

        // const res = response.data

        const res = response

        //カスタムコードが200でない場合、エラーと判断されます。

        //応答ステータスステータスコード情報を取得します

        if(res.status!= 200){

            メッセージ({

                メッセージ:res.msg || 'リクエストに失敗しました'、

                タイプ: 'エラー'、

                期間:5 * 1000

            })

 

            if(res.status == 401){

                //再ログインします

                MessageBox.confirm( 'ログインに失敗しました。もう一度ログインしてください!'、 'OK'、{

                    ConfirmButtonText: '再度ログイン'、

                    cancelButtonText: 'キャンセル'、

                    タイプ: '警告'

                })。then(()=> {

                    store.dispatch( 'user / resetToken')。then(()=> {

                        location.reload()

                    })

                })

            }

            Promise.reject(new Error(res.msg || 'Request failed'))を返します

        } そうしないと {

            解像度を返す

        }

    }、

    エラー=> {

        メッセージ({

            メッセージ:error.message、

            タイプ: 'エラー'、

            期間:5 * 1000

        })

        Promise.reject(error)を返します

    }

学習の拡大:http//www.axios-js.com/zh-cn/docs/#%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86

エラー処理

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // The request was made but no response was received
      // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
      // http.ClientRequest in node.js
      console.log(error.request);
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

要約:通常のパラメーターの相互作用を使用して、それらの蛾は何をしますか。後で他の人に相談しましたが、上記の記述にはまだ機能上の問題があります。他のプロトコルを送信に使用する場合、一部のプロトコルにはヘッダーメッセージがありません。さらに、バックエンドの戻り値は全体として暗号化されており、メッセージとステータスコードは、他の戻り値と一緒に記述する方が便利です。

{

 "code": "200",

 "msg": "成功",

 "data": [{...},{...}]

}

 

设置的路由,跳出框架显示。

その理由は、コンポーネント:レイアウトが設定されていないためです。

src / router / index.js

{{

        パス: '/ user'、

        コンポーネント:レイアウト、

        子供達: [{

            パス: '中央'、

            名前:「センター」、

            コンポーネント:()=>

                インポート( '@ / views / user / center / index')、

                非表示:true、

            メタ:{タイトル: 'パーソナルセンター'}

        }]

}

 

elementUIフォームリセット未定義のプロパティ「フォーム」を読み取れません」

除外 

フォームにはrefが必要であり、formNameの名前は一貫している必要があります。

el-formおよびform-itemコンポーネントを完成させ、小道具を構成する必要があります。構成せずにこのメソッドを実行すると、入力ボックスの値はリセットされません。

エラーの理由:これはrefであり、refではないことに注意してください。

resetForm(formName){

      this。$ refs [formName] .resetFields();

}

 

ページングコンポーネントの英語表示を中国語に切り替えます

最初はそれが言語の問題であることに気づかず、全文検索でGotoを見つけることができませんでした。

後で私はそれが言語の問題であることを知りました。

src / main.js

デフォルト設定では、英語が使用されます。

デフォルトは中国語であるため、直接コメント。次のVue.use要素にも注釈を付ける必要があることに注意してください。

// 'element-ui / lib / locale / lang / en'からenLangをインポートします//中国語の言語パックを使用している場合は、デフォルトでサポートしてください。追加のインポートは必要ありません。依存関係を削除してください。

 

Vue.use(Element、{

  サイズ:Cookies.get( 'size')|| 'medium'、// element-uiのデフォルトサイズを設定

  // locale:enLang //中国語を使用している場合は、設定する必要はありません。削除してください

})

 

現在のページを閉じる

this。$ store.dispatch( 'tagsView / delView'、this。$ route)

 

書かれていると効果がなく、間違った場所に書かれている可能性があります。たとえば、次の例では、終了メソッドエラーが記事コンポーネント(記事)に書き込まれます。

 

アプリケーション例

記事管理リストページ(インデックス)==(クリックして追加、ジャンプ)== "新しい記事ページ(追加)==(サブコンポーネント)=="記事コンポーネント(記事)==(コンテンツを入力して送信をクリック)==》追加に成功し、親コンポーネントをトリガー(追加)して現在のページを閉じ、リストページイベントに戻ります。

記事管理リストページ(インデックス)==(クリックして編集、ルーティングを介して記事IDを運ぶ、ジャンプ)== "記事編集ページ(編集)==(サブコンポーネント)=="記事コンポーネント(記事)==塗りつぶしコンテンツの後、[送信] ==》 [編集が成功しました]をクリックし、親コンポーネントのイベントをトリガーして(編集)、現在のページを閉じてリストページに戻ります。

備考:

1.編集ページ(編集)にとどまり、ブラウザの更新を直接クリックします。更新すると記事IDが失われます。更新すると、他のページは自動的に閉じられ、現在のページのみが保持されます。

2.追加と編集、主に追加。リストページに戻った後、リストページはデータを再度取得する必要があります。リストページに、ページ初期化の方法をアクティブ化して記述します。

      アクティベート(){

          this.getTableData()

      }

 

記事の新しいページ

<テンプレート>

  <article-detail:is-edit = "false" @ close = "closeSelectedTag" />

</ template>

<スクリプト>

'./components/ArticleDetail'からArticleDetailをインポートします

デフォルトのエクスポート{

  名前: 'ManageModuleNewsAdd'、

  コンポーネント:{ArticleDetail}、

  メソッド:{

    closeSelectedTag(){

      //現在のページを閉じます

      this。$ store.dispatch( 'tagsView / delView'、this。$ route)

      this。$ router.push({

        名前: 'ManageModuleNews'

      })

    }

  }

}

</ script>

 

記事編集ページ

<テンプレート>

  <article-detail:is-edit = "true" @ close = "closeSelectedTag" />

</ template>

<スクリプト>

'./components/ArticleDetail'からArticleDetailをインポートします

デフォルトのエクスポート{

  名前: 'ManageModuleNewsEdit'、

  コンポーネント:{ArticleDetail}、

  メソッド:{

    closeSelectedTag(){

      //現在のページを閉じます

      this。$ store.dispatch( 'tagsView / delView'、this。$ route)

      this。$ router.push({

        名前: 'ManageModuleNews'

      })

    }

  }

}

</ script>

 

記事コンポーネント

作成した() {

    if(this.isEdit){//编辑isEdit = true

      const id = this。$ route.params.id

      if(!id){

        //更新するとIDが失われます。更新すると、他のページは自動的に閉じられ、現在のページのみが保持されます。

        this。$ message({

          メッセージ: '情報IDが失われました。このページを閉じて、再入力してください。'、

          タイプ: '警告'

        })

      } そうしないと {

        // IDに基づいて記事の詳細を照会します

        this.fetchData(id)

      }

    } そうしないと {

      // 追加

      this.newsForm = this.defaultNews

      this.fileObj.fileUrl = ''

    }

  }、

 メソッド:{

   handleSubmit(){

      if(this.isEdit){

        this.updateNews(this.newsForm)

      } そうしないと {

        this.addNews(this.newsForm)

      }

    }、

 

    async addNews(row){

      const res = await addNews(row)

      if(res.code === 200){

        this。$ message({

          メッセージ: '正常に追加されました!'、

          タイプ: '成功'

        })

        //親コンポーネントをトリガーし、現在のページを閉じて、リストページにジャンプします

        this。$ emit( 'close')

      }

    }、

 

    非同期updateNews(row){

      const res = await updateNews(row)

      if(res.code === 200){

        this。$ message({

          メッセージ: '正常に保存してください!'、

          タイプ: '成功'

        })

        //親コンポーネントをトリガーし、現在のページを閉じて、リストページにジャンプします

        this。$ emit( 'close')

      }

    }、

}

 

 

======

つづく

おすすめ

転載: blog.csdn.net/Irene1991/article/details/110957592