Maison interface Web js tutoriel Utilisation d'Elememt-UI pour créer le backend de gestion dans Vue (tutoriel détaillé)

Utilisation d'Elememt-UI pour créer le backend de gestion dans Vue (tutoriel détaillé)

Jun 04, 2018 am 11:33 AM
后台 管理

Cet article partage avec vous en détail le processus de création d'un backend de gestion avec Vue Elememt-UI et des exemples de code associés, veuillez vous y référer et apprendre ensemble.

Installation

J'utilise vue-cli pour initialiser le projet La commande est la suivante :

npm i -g vue-cli
mkdir my-project && cd my-project
vue init webpack
Copier après la connexion

Modifier le. Fichier package.json :

...
"dependencies": {
 "vue": "^2.5.2",
 "vue-router": "^3.0.1",
 "element-ui": "^2.0.7", // element-ui
 "axios": "^0.17.1" // http 请求库
}
...
Copier après la connexion

Exécutez ensuite npm install pour installer les dépendances. Si la vitesse d'installation est un peu lente, vous pouvez essayer cnpm et découvrir par vous-même l'installation et l'utilisation spécifiques.

Une brève introduction à la structure des répertoires du projet :

├─build // 构建配置
├─config // 配置文件
├─src // vue 开发源文件目录
├────assets // css/js 文件
├────components // vue 组件
├────router  // 路由
├────App.vue  // 启动组件
├────main.js // 入口文件
├─static // 静态文件目录
├─test // 测试目录
Copier après la connexion

Après cela, exécutez npm run dev dans le répertoire racine du projet, ouvrez le navigateur et entrez http://localhost : 8080 pour le voir.

Cible

  • Page de connexion, connexion, fonction de déconnexion

  • Page d'accueil, liste de rendu de l'interface d'appel

Routage

Le routage utilise vue-router Pour une utilisation spécifique, veuillez vous référer à la documentation officielle

<🎜. >Nous sommes là Deux itinéraires sont requis :


src/router/index.js

import Vue from &#39;vue&#39;
import Router from &#39;vue-router&#39;
import Index from &#39;@/components/Index&#39;
import Login from &#39;@/components/Login&#39;

Vue.use(Router)

const routers = new Router({
 routes: [
  {
   path: &#39;/index&#39;,
   name: &#39;index&#39;,
   component: Index
  },
  {
   path: &#39;/login&#39;,
   name: &#39;login&#39;,
   component: Login
  }
 ]
})

routers.beforeEach((to, from, next) =&gt; {
 if (to.name !== &#39;login&#39; &amp;&amp; !localStorage.getItem(&#39;token&#39;)) {
  next({path: &#39;login&#39;})
 } else {
  next()
 }
})

export default routers
Copier après la connexion

Page de connexion

src/components /Login.vue

&lt;template&gt;
 &lt;p class=&quot;login&quot;&gt;
  &lt;el-form name=&quot;aa&quot; :inline=&quot;true&quot; label-position=&quot;right&quot; label-width=&quot;80px&quot;&gt;
    &lt;el-form-item label=&quot;用户名&quot;&gt;
     &lt;el-input v-model=&quot;user.name&quot;&gt;&lt;/el-input&gt;
    &lt;/el-form-item&gt;
    &lt;el-form-item label=&quot;密码&quot;&gt;
     &lt;el-input type=&quot;password&quot; v-model=&quot;user.password&quot;&gt;&lt;/el-input&gt;
    &lt;/el-form-item&gt;
    &lt;el-form-item label=&quot; &quot;&gt;
     &lt;el-button type=&quot;primary&quot; @click=&quot;login()&quot;&gt;登录&lt;/el-button&gt;
    &lt;/el-form-item&gt;
  &lt;/el-form&gt;
 &lt;/p&gt;
&lt;/template&gt;

&lt;script&gt;
import $http from &#39;@/api/&#39;
import config from &#39;@/config&#39;

export default {
 data () {
  return {
   user: {
    name: &#39;&#39;,
    password: &#39;&#39;
   }
  }
 },
 mounted: function () {
  var token = localStorage.getItem(&#39;token&#39;)
  if (token) {
   this.$router.push(&#39;/index&#39;)
  }
 },
 methods: {
  login: function () {
   var data = {
    grant_type: &#39;password&#39;,
    client_id: config.oauth_client_id,
    client_secret: config.oauth_secret,
    username: this.user.name,
    password: this.user.password
   }
   var _this = this
   $http.login(data).then(function (res) {
    if (res.status === 200) {
     $http.setToken(res.data.access_token)
     _this.$message({
      showClose: false,
      message: &#39;登录成功&#39;,
      type: &#39;success&#39;
     })
     _this.$router.push(&#39;/index&#39;)
    } else {
     _this.$message({
      showClose: false,
      message: &#39;登录失败&#39;,
      type: &#39;error&#39;
     })
    }
   })
  }
 }
}
&lt;/script&gt;

&lt;style&gt;
.login{
  width: 300px;
  margin: 100px auto;
  background-color: #ffffff;
  padding: 30px 30px 5px;
  border-radius: 5px;
}
&lt;/style&gt;
Copier après la connexion

Accueil

src/components/Index.vue

&lt;template&gt;
 &lt;p class=&quot;main&quot;&gt;
  &lt;el-table
   stripe
   v-loading=&quot;loading&quot;
   element-loading-background=&quot;#dddddd&quot;
   :data=&quot;tableData&quot;
   style=&quot;width: 100%&quot;&gt;
   &lt;el-table-column
    prop=&quot;id&quot;
    label=&quot;ID&quot;&gt;
   &lt;/el-table-column&gt;
   &lt;el-table-column
    prop=&quot;name&quot;
    label=&quot;名称&quot;&gt;
   &lt;/el-table-column&gt;
  &lt;/el-table&gt;
  &lt;el-pagination
   background
   layout=&quot;prev, pager, next&quot;
   :total=&quot;total&quot;
   class=&quot;page&quot;
   @current-change=&quot;pageList&quot;&gt;
  &lt;/el-pagination&gt;
 &lt;/p&gt;
&lt;/template&gt;

&lt;script&gt;
import $http from &#39;@/api/&#39;

export default {
 data () {
  return {
   tableData: [],
   total: 0,
   loading: false
  }
 },
 mounted: function () {
  this.getList()
 },
 methods: {
  pageList: function (page) {
   this.search.page = page
   this.getList()
  },
  getList: function () {
   var _this = this
   _this.loading = true
   $http.index().then(function (res) {
    if (res.status === 200) {
     _this.tableData = res.data.data.lists
     _this.total = res.data.data.total
    }
    _this.loading = false
   })
  }
 }
}
&lt;/script&gt;
Copier après la connexion

Application

src/App.vue

&lt;template&gt;
 &lt;p id=&quot;app&quot;&gt;
  &lt;el-row v-if=&quot;token&quot;&gt;
   &lt;menus class=&quot;left-menu&quot;&gt;
    &lt;h3 class=&quot;logo&quot;&gt;&lt;a href=&quot;/&quot; rel=&quot;external nofollow&quot; &gt;Admin&lt;/a&gt;&lt;/h3&gt;
   &lt;/menus&gt;
   &lt;el-col :span=&quot;21&quot; :gutter=&quot;0&quot; :offset=&quot;3&quot;&gt;
    &lt;el-breadcrumb separator-class=&quot;el-icon-arrow-right&quot; class=&quot;breadcrumb&quot;&gt;
     &lt;el-breadcrumb-item :to=&quot;{ path: &#39;/&#39; }&quot;&gt;首页&lt;/el-breadcrumb-item&gt;
     &lt;el-breadcrumb-item class=&quot;active&quot;&gt;列表&lt;/el-breadcrumb-item&gt;
    &lt;/el-breadcrumb&gt;
    &lt;el-dropdown @command=&quot;operate&quot; class=&quot;header&quot;&gt;
     &lt;img src=&quot;/static/image/head.jpg&quot; /&gt;
     &lt;el-dropdown-menu slot=&quot;dropdown&quot; :click=&quot;true&quot;&gt;
      &lt;el-dropdown-item command=&quot;/user/profile&quot;&gt;基本资料&lt;/el-dropdown-item&gt;
      &lt;el-dropdown-item command=&quot;/logout&quot;&gt;安全退出&lt;/el-dropdown-item&gt;
     &lt;/el-dropdown-menu&gt;
    &lt;/el-dropdown&gt;
    &lt;router-view/&gt;
   &lt;/el-col&gt;
   &lt;el-col :span=&quot;21&quot; :gutter=&quot;0&quot; :offset=&quot;3&quot; class=&quot;footer&quot;&gt;Copyright © 2017 Flyerboy All Rights Reserved&lt;/el-col&gt; 
  &lt;/el-row&gt;

  &lt;router-view v-if=&quot;!token&quot; /&gt;
 &lt;/p&gt;
&lt;/template&gt;

&lt;script&gt;
import Menus from &#39;@/components/Menu&#39;
export default {
 name: &#39;App&#39;,
 data () {
  return {
   token: false
  }
 },
 mounted: function () {
  this.token = localStorage.getItem(&#39;token&#39;) ? true : false
 },
 watch: {
  &#39;$route.path&#39;: function ($newVal, $oldVal) {
   this.token = localStorage.getItem(&#39;token&#39;) ? true : false
  }
 },
 methods: {
   operate: function (command) {
   if (command === &#39;/logout&#39;) {
    localStorage.removeItem(&#39;token&#39;)
    this.$router.push(&#39;login&#39;)
   } else {
    this.$router.push(command)
   }
  }
 },
 components: {
  Menus
 }
}
&lt;/script&gt;

&lt;style&gt;
body{
 margin: 0;
 padding: 0;
 background-color: #eeeeee;
}
.header{
 position: absolute;
 top: 5px;
 right: 20px;
}
.header img{
 width: 38px;
 height: 38px;
 border-radius: 20px;
 border: 1px solid #aaaaaa;
}
#app {
 font-family: &#39;Avenir&#39;, Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
}
.main{
 padding: 20px;
 min-height: 600px;
 margin-bottom: 20px;
}
.main table{
 background: #ffffff;
}
.left-menu{
 background-color: #33374B;
}
.logo{
 padding: 20px 0 15px 20px;
 font-size: 24px;
 border-bottom: 2px solid #3a8ee6;
}
.logo a{
 color: #ffffff;
 text-decoration: none;
}

.left-menu .el-menu{
 border-right: 0;
}
.breadcrumb{
 line-height: 40px;
 padding: 5px 20px;
 background: #ffffff;
}
.breadcrumb span{
 color: #069;
 font-weight: normal;
}
.breadcrumb .active{
 color: #aaaaaa;
}
.page{
 margin: 20px 0 0;
 margin-left: -10px;
}
.page .el-pager li.number{
 background-color: #ffffff;
}
.el-submenu .el-menu-item{
 padding-left: 60px !important;
}
.footer{
 position: fixed;
 bottom: 0;
 right: 0;
 font-size: 12px;
 color: #888888;
 padding: 15px 20px;
 text-align: center;
 background-color: #ffffff;
 margin-top: 40px;
}
&lt;/style&gt;
Copier après la connexion

Appel API

src/api/ index.js

import axios from &#39;axios&#39;
axios.defaults.baseURL = &#39;http://localhost:8000/&#39;
axios.defaults.headers.post[&#39;Content-Type&#39;] = &#39;application/x-www-form-urlencoded&#39;
axios.defaults.headers.common[&#39;Authorization&#39;] = &#39;Bearer &#39; + localStorage.getItem(&#39;token&#39;)


export default {
 setToken: function (token) {
  localStorage.setItem(&#39;token&#39;, token)
  axios.defaults.headers.common[&#39;Authorization&#39;] = &#39;Bearer &#39; + token
 },
 login: function (param) {
  return axios.post(&#39;oauth/token&#39;, param)
 },
 index: function (params) {
  return axios.get(&#39;api/user/list&#39;, {
   params: params
  })
 }
}
Copier après la connexion

config

src/config.js Configurez ici le client_id et le secret requis pour vous connecter à oauth

export default {
 oauth_client_id: 2,
 oauth_secret: &#39;&#39;
}
Copier après la connexion

main.js

src/main.js

import Vue from &#39;vue&#39;
import App from &#39;./App&#39;
import router from &#39;./router&#39;
import ElementUI from &#39;element-ui&#39;
import &#39;element-ui/lib/theme-chalk/index.css&#39;

Vue.use(ElementUI)

Vue.config.productionTip = false

new Vue({
 el: &#39;#app&#39;,
 router,
 components: { App },
 template: &#39;&lt;App/&gt;&#39;
})
Copier après la connexion
interface API


utilise principalement deux interfaces, l'une est api /oauth/token est l'interface de connexion pour obtenir le jeton, et une API/user/list pour obtenir la liste.


La première interface utilise laravel oauth, et la deuxième interface est directement une simple interface de liste d'utilisateurs de requête. Les détails seront décrits dans le prochain article.

J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles connexes :

Comment convertir des horodatages en formats d'heure personnalisés à l'aide de vue

Utilisation de vue et element -UI Comment pour implémenter la pagination du contenu des tables

Explication détaillée du code source de FastClick (tutoriel détaillé)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Musée de deux points: Guide de localisation de Bungle Wasteland
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Musée de deux points: Guide de localisation de Bungle Wasteland
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La solution au problème de connexion en arrière-plan Discuz révélée La solution au problème de connexion en arrière-plan Discuz révélée Mar 03, 2024 am 08:57 AM

La solution au problème de connexion en arrière-plan Discuz révélée

Comment implémenter la fonction de gestion des performances des étudiants en Java ? Comment implémenter la fonction de gestion des performances des étudiants en Java ? Nov 04, 2023 pm 12:00 PM

Comment implémenter la fonction de gestion des performances des étudiants en Java ?

Comment utiliser Redis pour implémenter la gestion distribuée des transactions Comment utiliser Redis pour implémenter la gestion distribuée des transactions Nov 07, 2023 pm 12:07 PM

Comment utiliser Redis pour implémenter la gestion distribuée des transactions

Gestion des packages d'extension Laravel : intégrez facilement du code et des fonctions tiers Gestion des packages d'extension Laravel : intégrez facilement du code et des fonctions tiers Aug 25, 2023 pm 04:07 PM

Gestion des packages d'extension Laravel : intégrez facilement du code et des fonctions tiers

Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions Mar 05, 2024 pm 09:27 PM

Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions

Comment configurer et gérer le serveur réseau sur le système d'exploitation Kirin ? Comment configurer et gérer le serveur réseau sur le système d'exploitation Kirin ? Aug 04, 2023 pm 09:25 PM

Comment configurer et gérer le serveur réseau sur le système d'exploitation Kirin ?

Que faire si la gestion du menu contextuel ne peut pas être ouverte sous Windows 10 Que faire si la gestion du menu contextuel ne peut pas être ouverte sous Windows 10 Jan 04, 2024 pm 07:07 PM

Que faire si la gestion du menu contextuel ne peut pas être ouverte sous Windows 10

Développement du système de gestion backend ThinkPHP6 : réalisation des fonctions backend Développement du système de gestion backend ThinkPHP6 : réalisation des fonctions backend Aug 27, 2023 am 11:55 AM

Développement du système de gestion backend ThinkPHP6 : réalisation des fonctions backend

See all articles