Vue-Berechtigungskontrolle
Ein auf Vue basierendes Backend-System für die einheitliche Anmeldung und Verwaltung von Front-End-Benutzerrechten
# install node+git please
# install dependencies
$ npm install / cnpm install
# serve with hot reload at localhost:8060
$ npm run dev
# build for production with minification
$ npm run build
Grundgedanke
Das Front-End übernimmt die Berechtigungskontrolle, was nichts weiter ist als die Übermittlung von Daten an den Hintergrund. Ich habe gesehen, dass das Konzept der Rollen im Front-End groß ist Die Anzahl der Rollen, die entkoppelt werden müssen, wird künstlich vorgeschlagen. Tatsächlich betrachtet das Frontend nur die Daten und extrahiert die Berechtigungen, die dem Frontend in verschiedene Arrays gegeben und dann mit allen lokalen Routen abgeglichen werden, um ein Menü zurückzugeben dem Benutzer anzuzeigen.
Nachdem vue-cli das Projekt initialisiert hat, besteht es aus modularen Grundgerüstkomponenten: Login + Home-Header, Seitenleiste, Home und Geschäftsinhalte können in Hoem-Inhalten platziert werden.
VPC eignet sich für die einheitliche Anmeldung mehrerer Projekte. Das nach erfolgreicher Anmeldung auf der Anmeldeseite zurückgegebene gültige Token wird im zweiten Schritt ausgeführt, um Benutzerdaten zu erhalten. In Anbetracht des Aktualisierungsproblems müssen Benutzerdaten abgerufen werden in der Stammkomponente App.vue. Da es sich bei Vue um eine unidirektionale Flussidee handelt, muss Login als Unterkomponente der App nach erfolgreicher Anmeldung $emit an die App senden und einen Rückruf ausführen, um Benutzerdaten zu erhalten.
Wie oben erwähnt, verwendet dieses Projekt Easy-Mock-Mock-Daten. Die Back-End-Datenvorschriften verwenden das RestFul-Protokoll, um mehrere Benutzer mit unterschiedlichen Identitäten zu verspotten. Bei erfolgreicher Anmeldung wird ein Token im Header zurückgegeben über Flyio. Denken Sie daran, dass dies das erste Mal ist. Nachdem Sie es zur Anmeldeseite hinzugefügt haben, müssen Sie für jeden Schnittstellenaufruf ein Token hinzufügen, was im Flyio-Interceptor erfolgen kann.
Geben Sie das Berechtigungsarray auf der App-Seite über rekursiven FullPath zurück. Alle lokalen Routing-Vorgänge erhalten die effektive Route des Benutzers und speichern sie in Vuex.
In der Sidebar for-Schleife wird die in vuex gespeicherte effektive Route angezeigt und die Home-Komponente wird angezeigt, um den spezifischen Inhalt der Route anzuzeigen.
│
├─build
│ build.js
│ check-versions.js
│ utils.js
│ vue-loader.conf.js
│ webpack.base.conf.js
│ webpack.dev.conf.js
│ webpack.prod.conf.js
│
├─config
│ dev.env.js
│ index.js
│ prod.env.js
│
├─src
│ │ 404.vue
│ │ App.vue // 根组件
│ │ bus.js // EventBus 适用于兄弟组件 通信
│ │ dave.js // canvas 效果
│ │ globar.js // webpack 全局注册ui组件
│ │ main.js // 项目入口
│ │ tools.js // 插件
│ │
│ ├─api
│ │ axios.js
│ │ common.js // 基本接口
│ │ request.js // flyio 拦截器
│ │ weather.js // 天气接口
│ │
│ ├─assets
│ │ │ logo.png
│ │ │
│ │ └─theme-dave // 自定义主题
│ │
│ ├─components // 主要组件
│ │ ├─common
│ │ │ Header.vue
│ │ │ Home.vue
│ │ │ Login.vue
│ │ │ SideBar.vue
│ │ │
│ │ ├─render // render 渲染组件 适用多条件渲染
│ │ │ btn-render.vue
│ │ │
│ │ ├─ui
│ │ │ baseButton.vue // 基于element-ui btn ui组件 可层叠复用
│ │ │
│ │ └─view
│ │ 403.vue
│ │ 404.vue
│ │ allocation.vue
│ │ render.vue
│ │ watch.vue
│ │
│ ├─router // 本地所有路由
│ │ fullPath.js
│ │ index.js // 基本路由
│ │
│ └─store // 状态管理 全局变量
│ actions.js
│ getters.js
│ index.js
│ mutations.js
│ state.js
│
│ .babelrc
│ .editorconfig
│ .eslintignore
│ .eslintrc.js // 基于airbnb-base 个人配置的代码规则
│ .gitignore
│ .postcssrc.js
│ index.html
│ package-lock.json
│ package.json
│ README.md
< router-view @login =" login " @clearData =" clearData " > </ router-view >
Der Kodex sieht den Zweck vor, einen Eingang und einen Ausgang zu haben.
clearData ( ) {
if ( this . $route . path === '/login' ) {
delete request . config . headers [ 'Authorization' ] ;
localStorage . removeItem ( 'token' ) ;
this . $store . dispatch ( 'CLEAR_STORE' ) ;
}
}
Die globale Abfangantwort von Flyio springt zur Anmeldeseite zurück, solange der ungültige Benutzer auf die Seite zugreift, den Statuscode für den Schnittstellenfehler aufruft und 401 zurückgibt.
if ( err . response . status === 401 ) {
window . location . href = '/#/login' ;
}
alias: {
'vue$' : 'vue/dist/vue.esm.js' ,
'@' : resolve ( 'src' ) ,
'flyio' : 'flyio/dist/npm/fly'
}
Webpack-Artefakt require.context
externals: {
vue : 'Vue' ,
'element-ui' : 'ElementUI' ,
nprogress : 'NProgress' ,
jquery : 'window.$'
}
Weitere Informationen finden Sie auf der offiziellen Website von Travis CI. Hinweis:
Analyse der Kommunikationsnutzung von Vue-Komponenten
1.Vuex: Statusverwaltungsmodus, zentralisierte Speicherverwaltung des Status aller Komponenten der Anwendung und entsprechende Regeln, um sicherzustellen, dass sich der Status auf vorhersehbare Weise ändert. 2.EventBus: Die Kommunikation von nicht übergeordneten und untergeordneten Komponenten erfolgt mithilfe von Ereigniszentren Komponenten zulassen. Freie Kommunikationsfallreproduktion: Was soll ich tun, wenn ich beispielsweise einen variablen Attributwert in der Header-Komponente in diesem Projekt ändere und die SideBar- und Home-Komponenten auf die Änderung reagieren müssen? 3. Analyse: Vuex verwaltet, wie der Name schon sagt, globale Variablen, die lesbar, veränderbar und erkennbar sind. Lassen Sie uns zunächst die beiden Attribute von ECMAScript vorstellen : Datenattribute und Zugriffsattribute. Ersteres: [Konfigurierbar], [[Aufzählbar], [Schreibbar], [Wert] Konfigurierbarer, aufzählbarer, überschreibbarer Wert Normalerweise erstellt ein Objektliteral ein Objekt var person = { name: "dave" } Das heißt, was die Datenattribute ändern und lesen, ist nur der Wert des Objekts und die letzteren Accessor-Eigenschaften [Configurable]], [[Enumerable]], [[Get]], [[Set], in JavaScript verwenden wir Object .defineProperty zum Definieren des Zugriffs Um this.person in Vue zu erhalten, besteht das Geräteattribut darin, die get-Methode aufzurufen, um sie festzulegen, bei der es sich um die set-Methode handelt. Vue verfügt über einen eigenen Datenbaum. Über das Accessor-Attribut wird die Abhängigkeitsverfolgungsüberwachung implementiert. Zusätzlich zu Vuex EventBus verfügen Vue.prototype.xx und this.$root- und lokale Speicher-LocalStorage-Operationsvariablen nicht über die Überwachungsfunktion.
4. Zusammenfassung: Vue.prototype.xx, this.$root kann nur gelesen und geändert werden, aber standardmäßig kann Vue.prototype.xx keine globalen Variablen schreiben. Werte usw. funktionieren auch auf localStorage. Es kann Einstellungen lesen. Einige Leute sagen, dass Sie addEventListener zum Überwachen des Speichers verwenden können, aber Sie erwarten nicht, dass dies in der Vue-Ebene der Fall ist vuex. Wir benötigen die Variablen, um vorhersehbar zu sein, und führen dann den Rückruf aus. Wenn Sie denken, dass Sie in Schwierigkeiten sind, verwenden Sie einfach EventBus-Geschwisterkomponenten, um zu kommunizieren, und $emit löst den $on-Listening-Rückruf aus.
Der Schwerpunkt dieses Projekts liegt nicht auf der Notwendigkeit umfangreicher Hintergrundkomponenten, sondern auf der Idee der Berechtigungsrouting-Steuerung. Es geht lediglich darum, ein Grundgerüst zur Zusammenfassung Ihrer Arbeit zu erstellen „Projekt“ substanzieller und robuster machen.