Kontrol izin Vue
Sistem backend untuk manajemen hak pengguna front-end login terpadu yang dikembangkan berdasarkan vue
# 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
Ide dasar
Front-end melakukan kontrol izin, yang tidak lebih dari mengirimkan data ke latar belakang. Front-end membuat penilaian. Saya telah melihat bahwa sebagian besar proyek memiliki konsep peran. Front-end membuat keributan tentang router peran yang perlu dipisahkan diusulkan secara artifisial. Faktanya, front end hanya melihat data dan mengekstrak izin. Peran identitas yang berbeda diberikan ke front end ke dalam array yang berbeda dan kemudian dicocokkan dengan semua rute lokal untuk mengembalikan menu untuk ditampilkan kepada pengguna.
Setelah vue-cli menginisialisasi proyek, proyek tersebut terdiri dari komponen kerangka modular: Login + Home Header Sidebar Home dan konten bisnis dapat ditempatkan di konten Hoem.
VPC cocok untuk login terpadu beberapa proyek. Token valid yang dikembalikan setelah login berhasil pada halaman Login dilakukan pada langkah kedua untuk mendapatkan data pengguna. Mengingat masalah penyegaran, perolehan data pengguna harus ditempatkan di komponen root App.vue. Karena Vue adalah ide aliran satu arah, Login, sebagai subkomponen Aplikasi, perlu $emit ke Aplikasi setelah login berhasil dan menjalankan panggilan balik untuk mendapatkan data pengguna.
Seperti disebutkan di atas, proyek ini menggunakan data tiruan yang mudah ditiru. Peraturan data back-end menggunakan protokol RestFul untuk meniru banyak pengguna dengan identitas berbeda. Login yang berhasil menghasilkan 200, pembatalan token 401. Login yang berhasil mengembalikan token melalui flyio. Ingat ini adalah pertama kalinya. Setelah menambahkannya ke halaman Login, Anda perlu menambahkan token untuk setiap panggilan antarmuka, yang dapat dilakukan di pencegat flyio.
Kembalikan array izin pada halaman Aplikasi melalui fullPath rekursif. Semua operasi perutean lokal mendapatkan rute efektif pengguna dan menyimpannya di Vuex.
Di loop Sidebar for, rute efektif yang disimpan di vuex ditampilkan dan komponen Beranda ditampilkan untuk menampilkan konten spesifik dari rute.
│
├─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 >
Kode tersebut menganut tujuan satu pintu masuk dan satu pintu keluar.
clearData ( ) {
if ( this . $route . path === '/login' ) {
delete request . config . headers [ 'Authorization' ] ;
localStorage . removeItem ( 'token' ) ;
this . $store . dispatch ( 'CLEAR_STORE' ) ;
}
}
Respons intersepsi global Flyio akan melompat kembali ke halaman login selama pengguna yang tidak valid mengakses halaman tersebut dan memanggil kode status kegagalan antarmuka dan mengembalikan 401.
if ( err . response . status === 401 ) {
window . location . href = '/#/login' ;
}
alias: {
'vue$' : 'vue/dist/vue.esm.js' ,
'@' : resolve ( 'src' ) ,
'flyio' : 'flyio/dist/npm/fly'
}
artefak webpack memerlukan.konteks
externals: {
vue : 'Vue' ,
'element-ui' : 'ElementUI' ,
nprogress : 'NProgress' ,
jquery : 'window.$'
}
Untuk detailnya, silakan kunjungi situs web resmi travis CI.
Analisis penggunaan komunikasi komponen Vue
1.Vuex: Mode manajemen status, manajemen penyimpanan terpusat dari status semua komponen aplikasi, dan aturan terkait untuk memastikan bahwa status berubah dengan cara yang dapat diprediksi 2.EventBus: Komunikasi komponen non-induk dan anak menggunakan pusat acara untuk izinkan komponen Reproduksi kasus komunikasi gratis: Apa yang harus saya lakukan ketika, misalnya, saya mengubah nilai atribut variabel di komponen Header dalam proyek ini dan memerlukan komponen SideBar dan Home untuk merespons perubahan tersebut? 3. Analisis: Vuex, seperti namanya, mengelola variabel global. Ini adalah manajemen, bukan hanya baca, yang dapat dibaca, diubah, dan dideteksi. Vue adalah aliran satu arah. Pertama, mari kita perkenalkan dua atribut ECMAScript : atribut data dan atribut pengakses. Yang pertama: [Dapat Dikonfigurasi], [[Dapat Ditulis], [Nilai] Nilai yang dapat dikonfigurasi, dapat dihitung, dan dapat diganti Biasanya literal objek membuat objek var person = { nama: "dave" } Artinya, yang diubah dan dibaca oleh atribut data hanyalah nilai objek, dan properti pengakses terakhir [Configurable]], [[Enumerable]], [[Get]], [[Set], dalam JavaScript kita menggunakan Object .defineProperty untuk menentukan akses Untuk mendapatkan this.person di Vue, atribut perangkat memanggil metode get untuk mengaturnya, yang merupakan metode set. Vue memiliki pohon datanya sendiri. Melalui atribut accessor jam tangan pelacakan ketergantungan diimplementasikan. Selain Vuex EventBus, Vue.prototype.xx dan variabel komponen operasi this.$root dan penyimpanan lokal localStorage tidak memiliki fungsi jam tangan.
4. Ringkasan: Vue.prototype.xx, this.$root hanya dapat dibaca dan diubah. Anda dapat memodifikasi dan membaca pada prototipe Vue tetapi tidak dapat menonton. Nilai dll. juga beroperasi di Penyimpanan lokal. Itu dapat membaca pengaturan. Beberapa orang mengatakan bahwa Anda dapat menggunakan addEventListener untuk memantau penyimpanan, tetapi Anda tidak berharap untuk melakukan ini di lapisan Vue. Token dari proyek ini adalah menggunakan penyimpanan lokal vuex. Kita membutuhkan variabel yang dapat diprediksi dan kemudian mengeksekusi callback. Jika Anda berpikir Jika Anda berada dalam masalah, cukup gunakan komponen saudara EventBus untuk berkomunikasi, dan $emit memicu callback $on listening.
Fokus dari proyek ini bukan pada kebutuhan akan komponen latar belakang yang kaya tetapi pada gagasan kontrol perutean izin. Ini hanya membangun kerangka untuk meringkas pekerjaan Anda. Nantinya, lebih banyak komponen yang dienkapsulasi akan ditambahkan ke proyek untuk membuat "proyek" yang lebih besar dan kuat.