كيفية إنشاء تطبيق Vue Survey باستخدام مصادقة وقاعدة بيانات Firebase

نشرت: 2022-03-10
ملخص سريع ↬ سيأخذك هذا البرنامج التعليمي إلى دليل خطوة بخطوة لإنشاء تطبيق استبيان وظيفي باستخدام Vue.js و Firebase. من التحقق من صحة بيانات المستخدم من خلال Vuelidate إلى المصادقة وتخزين بيانات المستخدم وحماية المسار وإرسال البيانات إلى خوادم Firebase. جميع الخطوات المستخدمة في البرنامج التعليمي عملية ويمكن إعادة إنتاجها في أي مشروع واقعي ، حتى مع خلفية مخصصة.

في هذا البرنامج التعليمي ، ستنشئ تطبيق استطلاع ، حيث سنتعلم كيفية التحقق من صحة بيانات نموذج المستخدمين ، وتنفيذ المصادقة في Vue ، والقدرة على تلقي بيانات الاستطلاع باستخدام Vue و Firebase (نظام أساسي BaaS).

أثناء قيامنا ببناء هذا التطبيق ، سنتعلم كيفية التعامل مع التحقق من صحة النموذج لأنواع مختلفة من البيانات ، بما في ذلك الوصول إلى الواجهة الخلفية للتحقق مما إذا كان قد تم أخذ بريد إلكتروني بالفعل ، حتى قبل أن يرسل المستخدم النموذج أثناء التسجيل.

أيضًا ، سيتعامل التطبيق مع تسجيل دخول المستخدم باستخدام واجهات برمجة تطبيقات مريحة. ستستخدم Authguard في جهاز توجيه Vue لمنع المستخدمين الذين لم يسجلوا الدخول من الوصول إلى نموذج الاستطلاع ، وإرسال بيانات الاستبيان للمستخدمين الذين قاموا بتسجيل الدخول بنجاح إلى قاعدة بيانات آمنة.

فقط حتى نكون في نفس الصفحة ، دعنا نوضح ما هو Firebase ، وما الذي سيفعله في هذا البرنامج التعليمي. Firebase عبارة عن مجموعة أدوات "لإنشاء تطبيقك وتحسينه وتنميته" ، فهو يمنحك إمكانية الوصول إلى جزء كبير من الخدمات التي يتعين على المطورين في العادة بناءها بأنفسهم ، ولكنهم لا يرغبون حقًا في بنائها ، لأنهم يفضلون التركيز على تجربة التطبيق نفسها. يتضمن ذلك أشياء مثل التحليلات والمصادقة وقواعد البيانات وتخزين الملفات والقائمة تطول.

يختلف هذا عن تطوير التطبيقات التقليدية ، والذي يتضمن عادةً كتابة برامج الواجهة الأمامية والخلفية. يستدعي كود الواجهة الأمامية فقط نقاط نهاية API التي تعرضها الواجهة الخلفية ، ويقوم كود الواجهة الخلفية بالفعل بهذا العمل. ومع ذلك ، مع منتجات Firebase ، يتم تجاوز الواجهة الخلفية التقليدية ، مما يضع العمل في العميل. يسمح هذا تقنيًا لمهندسي الواجهة الأمامية مثلي ببناء تطبيقات مكدسة كاملة كتابة كود الواجهة الأمامية فقط.

المزيد بعد القفز! أكمل القراءة أدناه ↓

خلاصة القول هي أن Firebase سيعمل كخلفية لنا في هذا المشروع من خلال تزويدنا بنقاط نهاية API الضرورية للتعامل مع احتياجات المصادقة وقاعدة البيانات لدينا. في النهاية ، ستنشئ تطبيق مسح وظيفي باستخدام Vue + Firebase. بعد ذلك ، يمكنك المضي قدمًا وإنشاء أي تطبيق ويب من اختيارك باستخدام هذه العمليات نفسها ، حتى مع خلفية مخصصة.

للمتابعة ، تحتاج إلى تثبيت Node و npm / yarn على جهازك. إذا لم تكن قد قمت بذلك بالفعل ، فاتبع هذه الإرشادات السريعة لتثبيت الغزل أو npm على جهازك. تحتاج أيضًا إلى فهم أساسي لبناء جملة جهاز التوجيه Vue و Vuex و Vue لهذا البرنامج التعليمي.

الملفات المبدئية لهذا البرنامج التعليمي موجودة هنا ، والتي تحتوي على الملفات الأساسية لهذا المشروع ، وها هو الريبو للعرض التوضيحي المكتمل. يمكنك استنساخ أو تنزيل المستودعات وتشغيل npm install في جهازك الطرفي.

بعد تثبيت ملف البداية ، سترى صفحة ترحيب بها خيارات التسجيل وتسجيل الدخول. بعد تسجيل الدخول ، يمكنك الوصول إلى الاستبيان.

بنية تطبيقات المسح
يصف هذا كيف سيعمل تطبيق الاستطلاع الخاص بنا. (معاينة كبيرة)

لا تتردد في إنشاء مشروع جديد إذا كنت ترغب في إنشاء هذا المشروع بالكامل بمفردك ، فقط تأكد من تثبيت Vuex و Vue router و Vuelidate و axios في مشروع Vue الخاص بك. لذلك دعنا ننتقل مباشرة إلى:

أولاً ، سنحتاج إلى حساب Firebase لإعداد هذا المشروع الذي يشبه إلى حد كبير إنشاء حاوية لتطبيقنا ، مما يتيح لنا الوصول إلى قاعدة البيانات ، ووسائل المصادقة المختلفة ، والاستضافة ، وما إلى ذلك. موجود على موقع Firebase.

صفحة Firebase المقصودة
الصفحة المقصودة حيث يمكنك الاشتراك وبدء رحلة Firebase. (معاينة كبيرة)
أنشئ مشاريع Firebase جديدة
إنشاء مشاريع Firebase (معاينة كبيرة)

الآن بعد أن أصبح لدينا مشروعنا ، فإن الشيء التالي هو إعداد كل من نظام المصادقة وقاعدة البيانات (قاعدة بيانات Realtime) على Firebase.

  • انقر فوق خيار "المصادقة" ؛
  • قم بإعداد "طريقة تسجيل الدخول" التي نريدها (في هذه الحالة البريد الإلكتروني / كلمة المرور).
إعداد طريقة تسجيل الدخول
إعداد طريقة مصادقة البريد الإلكتروني / كلمة المرور للمشروع. (معاينة كبيرة)
  • انقر فوق "قاعدة البيانات".
  • اختر "Realtime database" وانسخ هذا الرابط الموجود في الأعلى.

سيكون مفيدًا جدًا كنقطة نهاية API عندما نريد إرسال البيانات إلى قاعدة بيانات Firebase الخاصة بنا.

سنشير إلى واجهة برمجة التطبيقات هذه على أنها واجهة برمجة تطبيقات قاعدة البيانات. لاستخدامها ، سيتعين عليك إضافة اسم قاعدة البيانات التي تختارها عند إرسالها. على سبيل المثال ، للإرسال إلى قاعدة بيانات تسمى المستخدم. يمكنك ببساطة إضافة user.json في النهاية:

 {databaseAPI}/user.json
قاعدة بيانات في الوقت الحقيقي
استخدم واجهة برمجة التطبيقات أعلى قاعدة البيانات نفسها لإرسال البيانات إلى قاعدة البيانات. (معاينة كبيرة)

بعد ذلك ، سننتقل بعد ذلك إلى وثائق API الخاصة بباقي المصادقة من Firebase للحصول على تسجيلنا وتسجيل الدخول إلى نقاط نهاية API. ضمن نقاط النهاية هذه ، ستكون هناك حاجة إلى مفتاح API الخاص بمشروعنا ، والذي يمكن العثور عليه في إعدادات المشروع لدينا.

تصديق

بالعودة إلى الكود الخاص بنا ، سيكون هناك تحقق من صحة بيانات التسجيل قبل إرسالها إلى الخادم ، فقط للتأكد من أن المستخدم يرسل المعلومات المناسبة. سنستخدم Vuelidate وهي مكتبة رائعة تجعل التحقق من الصحة أسهل في Vue. بادئ ذي بدء ، قم بتثبيت Vuelidate في المشروع:

 npm i vuelidate

انتقل إلى src/components/auth/signup.vue وداخل علامة البرنامج النصي استيراد vuelidate وجميع الأحداث الضرورية التي سنحتاجها من المكتبة كما هو موضح أدناه.

ملاحظة : يمكنك التحقق من المستندات للحصول على نظرة عامة كاملة عن المكتبة وجميع الأحداث المتاحة.

 import { required, email, numeric, minValue, minLength, sameAs } from 'vuelidate/lib/validators'

شرح سريع:

وصف
قيمة
required القيمة إلزامية
email يجب أن تكون القيمة بريدًا إلكترونيًا
numeric يجب أن يكون رقما
minValue أقل قيمة عددية يمكن للمستخدم إدخالها.
sameAs يُستخدم للمقارنة بين قيمتين للتأكد من أنهما متماثلان
قم أيضًا باستيراد [`axios`] (https://github.com/axios/axios) لتتمكن من إرسال طلب HTTP إلى الخادم:
 import axios from 'axios'
قبل المضي قدمًا ، سنحتاج إلى إضافة بعض القواعد إلى قاعدة البيانات حتى نتمكن من التحقق من صحة البريد الإلكتروني كما ينبغي ، تمامًا كما هو موضح أدناه:
قواعد Firebase
تساعد قواعد قاعدة البيانات في تحديد أنه يمكنك أو لا يمكنك الوصول إلى قاعدة البيانات في أي وقت. (معاينة كبيرة)
 "read" = "true"
بمعنى أنه يمكن قراءة قاعدة البيانات دون أي عائق من جانب العميل.
 "write" = "auth" !== null
لا يمكنك الكتابة في قاعدة البيانات إلا أنك مستخدم مصدق عليه.
 "Users" = { "onIndex" : ["email"] }
يتيح لنا ذلك الاستعلام عن مستند "المستخدمين" بفهرس "البريد الإلكتروني". بمعنى ، يمكنك تصفية قاعدة البيانات حرفيًا للحصول على بريد إلكتروني فريد. ثم أضف خاصية محسوبة مخصصة باسم "عمليات التحقق" تمامًا مثلما لدينا طرق ، محسوبة ، وما إلى ذلك. ضمن "عمليات التحقق" ، سيكون لدينا طرق للتحقق من صحة البيانات الضرورية بدءًا من "البريد الإلكتروني" حيث يكون مطلوبًا ومن الواضح أنه يجب أن يكون بريدًا إلكترونيًا . أيضًا ، نريد أن نكون قادرين على إخبار المستخدم عندما أخذ شخص آخر بريدًا إلكترونيًا بالفعل ، عن طريق التحقق من قاعدة البيانات بعد أن كتبه المستخدم باستخدام شيء يسمى المصادقات غير المتزامنة ، كل ذلك ضمن مدقق مخصص وكل ذلك مدعوم من قبل [vuelidate. ] (https://vuelidate.js.org/#sub-asynchronous-validation)
 validations : { email: { required, email, unique: val => { if (val === '') return true return axios.get('https://vue-journal.firebaseio.com/users.json?orderBy="email"&equalTo="' + val + '"') .then(res => { return Object.keys(res.data).length === 0 }) } } }
بعد ذلك ، ضمن فريد ، استعلم عن قاعدة البيانات باستخدام محاور واستخدم مفاتيح Object.key الافتراضية لإرجاع الاستجابة فقط إذا كان طولها 0. بالنسبة للعمر ، ستضيف قيمة مطلوبة ورقمية ودقيقة قدرها 18 تم تعيينها لـ `minVal خصائصه.
 age: { required, numeric, minVal: minValue(18) }
خصائص كلمة المرور مطلوبة ، بحد أدنى 6 مخصص لـ "minLen".
 password: { required, minLen: minLength(6) }
يجب أن تكون خصائص "ConfirmPassword" هي نفسها كلمة المرور.
 confirmPassword: { sameAs: sameAs(vm => { return vm.password }) }
لإخبار المستخدم بأن البريد الإلكتروني مأخوذ ، استخدم "v-if" للتحقق مما إذا كان "الفريد" صحيحًا أم خطأ. إذا كان هذا صحيحًا ، فهذا يعني أن طول الكائن الذي تم إرجاعه هو 0 ، ولا يزال من الممكن استخدام البريد الإلكتروني والعكس صحيح. بنفس الطريقة ، يمكنك التحقق مما إذا كان إدخال المستخدم هو بريد إلكتروني فعلي باستخدام "v-if". وبالنسبة إلى جميع divs المحيطة على المدخلات الفردية ، سنضيف فئة غير صالحة تصبح نشطة بمجرد حدوث خطأ في هذا الإدخال. لربط أحداث التحقق من الصحة بكل إدخال في HTML ، نستخدم [`$ touch ()`] (https://vuelidate.js.org/#sub-without-v-model) كما يظهر مع `البريد الإلكتروني أدناه.
 <div class="input" :class="{invalid: $v.email.$error}"> <h6 v-if="!$v.email.email">Please provide a valid email address.</h6> <h6 v-if="!$v.email.unique">This email address has been taken.</h6> <input type="email" placeholder="Email" @blur="$v.email.$touch()" v-model="email"> </div>
سيتم ربط "Age" و "password" و "ConfirmPassword" بإدخال HTML بطريقة مشابهة لـ "البريد الإلكتروني". وسوف نجعل زر "إرسال" غير نشط إذا كان هناك خطأ في أي من المدخلات.
 <button type="submit" :disabled="$v.$invalid">create</button>
إليك [مثال على CodePen] كامل (https://codepen.io/atanda1/pen/Yzyqrjv) لقسم vuelidate هذا.
تنفيذ Vuelidate
يتم استخدام Vuelidate هنا لتحديد نوع البيانات التي يتم إرسالها إلى قاعدة البيانات. (معاينة كبيرة)
## المصادقة هذا التطبيق عبارة عن SPA ولا يتم إعادة تحميله مثل المواقع التقليدية ، لذلك سنستخدم Vuex ، باعتباره "مصدر الحقيقة" الوحيد لدينا للسماح لكل مكون في تطبيقنا بالتعرف على حالة المصادقة العامة. ننتقل إلى ملف المتجر الخاص بنا ، وننشئ كل من طريقة تسجيل الدخول / التسجيل ضمن الإجراءات. الاستجابة ("الرمز المميز" و "معرف المستخدم") التي تم تلقيها عندما نرسل بيانات المستخدمين ، سيتم تخزينها في حالتنا. هذا مهم لأنه سيتم استخدام الرمز المميز لمعرفة ما إذا كنا لا نزال مسجلين الدخول أم لا في أي وقت داخل تطبيقنا. يتم إنشاء "الرمز" و "معرف المستخدم" والمستخدم في الحالة بقيمة أولية خالية. سنصل إلى المستخدم لاحقًا ، لكن في الوقت الحالي ، سنركز على الأولين.
 state: { idToken: null, userId: null, user: null }
ثم يتم إنشاء الطفرات لتغيير الحالة عند الحاجة.
authUser يحفظ الرمز المميز userId
storeUser يخزن معلومات المستخدم
clearAuthData يمحو البيانات مرة أخرى إلى الحالة الأولية
 mutations: { authUser (state, userData) { state.idToken = userData.token state.userId = userData.userId }, storeUser (state, user) { state.user = user }, clearAuthData (state) { state.idToken = null state.userId = null state.user = null } }
للتسجيل / تسجيل الدخول ، سيتعين علينا إنشاء إجراءات فردية لكليهما ، حيث نرسل طلبات المصادقة الخاصة بنا إلى الخادم. بعد ذلك ، يتم الالتزام باستجابتنا (الرمز المميز ومعرف المستخدم) من التسجيل / تسجيل الدخول إلى authUser ، ويتم حفظها في التخزين المحلي.
 signup ({commit, dispatch}, authData) { axios.post('https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=AIzaSyCFr-OMMzDGp4Mmr0t66w2cTGfNazYjptQ', { email: authData.email, password: authData.password, returnSecureToken: true }) .then(res => { console.log(res) commit('authUser', { token: res.data.idToken, userId: res.data.localId }) localStorage.setItem('token', res.data.idToken) localStorage.setItem('userId', res.data.localId) localStorage.setItem('email', res.data.email) dispatch('storeUser', authData) setTimeout(function () { router.push('/dashboard') }, 3000) }) .catch(error => console.log(error)) }
 login ({commit}, authData) { axios.post('https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=AIzaSyCFr-OMMzDGp4Mmr0t66w2cTGfNazYjptQ', { email: authData.email, password: authData.password, returnSecureToken: true }) .then(res => { console.log(res) localStorage.setItem('token', res.data.idToken) localStorage.setItem('userId', res.data.localId) localStorage.setItem('email', res.data.email) commit('authUser', { token: res.data.idToken, userId: res.data.localId }) router.push('/dashboard') }) .catch(error => console.log(error.message)) }
ولكن إليك الجزء الصعب ، ما سنفعله بإجراء التسجيل بشكل خاص هو إرسال البريد الإلكتروني وكلمة المرور فقط للتسجيل في قاعدة بيانات المصادقة. بالمعنى الحقيقي ، ليس لدينا وصول لاستخدام البيانات الموجودة في قاعدة بيانات المصادقة هذه ، ولم نرسل أيًا من بيانات التسجيل الخاصة بنا إلى جانب البريد الإلكتروني / كلمة المرور. لذا ما سنفعله هو إنشاء إجراء آخر لإرسال بيانات التسجيل الكاملة إلى قاعدة بيانات أخرى. في مستند قاعدة البيانات المنفصل هذا ، سيكون لدينا وصول كامل إلى جميع المعلومات التي نختار حفظها هناك. سنطلق على هذا الإجراء الجديد اسم "storeUser" ثم ننتقل إلى إجراء التسجيل الخاص بنا ونرسل الكائن بالكامل الذي يحتوي على بيانات التسجيل الخاصة بنا إلى قاعدة بيانات لدينا الآن إمكانية الوصول إليها من خلال "storeUser". ** ملاحظة: ** قد لا ترغب في إرسال كلمة مرور المستخدم الخاصة بك مع "storeUser" إلى قاعدة البيانات لأسباب أمنية.
 storeUser ({ state}, userData) { if (!state.idToken) { return } axios.post('https://vue-journal.firebaseio.com/users.json' + '?auth=' + state.idToken, userData) .then(res => console.log(res)) .catch(error => console.log(error)) } }
يضيف "storeUser" استعلامًا باستخدام الرمز المميز الذي حصلنا عليه مؤخرًا وواجهة برمجة التطبيقات لقاعدة البيانات أثناء النشر إلى قاعدة البيانات. هذا لأننا لا نستطيع الكتابة إلى قاعدة البيانات الخاصة بنا ، باستثناء أننا مصدقون على إثباتنا (الرمز المميز). هذه هي القاعدة التي قدمناها لـ Firebase في البداية ، هل تتذكر؟
 “write” = “auth” !== null
الشفرة الكاملة لإجراءات التسجيل / تسجيل الدخول موجودة [هنا] (https://codepen.io/atanda1/pen/mdePKqj). ثم أرسل كلا من التسجيل وتسجيل الدخول من مكوناتهما ضمن طريقة "onSubmit" إلى الإجراءات ذات الصلة في المتجر.
 methods : { onSubmit () { const signupData = { email : this.email, name : this.name, age : this.age, password : this.password, confirmPassword : this.co nfirmPassword } this.$store.dispatch('signup', signupData) } } }
** ملاحظة: ** تحتوي "بيانات التسجيل" على بيانات النموذج.
 methods : { onSubmit = { const formData = { email : this.email, password : this.password } this.$store.dispatch('login', {email: formData.email, password: formData.password}) } }
## AuthGuard هناك حاجة لـ AuthGuard لمنع المستخدمين الذين لم يسجلوا الدخول من الوصول إلى لوحة التحكم حيث سيرسلون الاستطلاع. انتقل إلى ملف الطريق واستورد متجرنا.
 import store from './store'
داخل المسار ، انتقل إلى مسار لوحة المعلومات وأضف ما يلي:
 const routes = [ { path: '/', component: WelcomePage }, { path: '/signup', component: SignupPage }, { path: '/signin', component: SigninPage }, { path: '/dashboard', component: DashboardPage, beforeEnter (to, from, next) { if (store.state.idToken) { next() } else { next('/signin') } } } ]
كل ما يفعله هذا هو التحقق مما إذا كان هناك رمز مميز في الحالة ، وإذا كانت الإجابة بنعم ، فإننا نمنح الوصول إلى لوحة القيادة والعكس صحيح. ## تسجيل الخروج لإنشاء خيار تسجيل الخروج الخاص بنا ، سنستخدم "clearAuth" الذي أنشأناه سابقًا ضمن "الطفرات" والذي يعيّن فقط "الرمز المميز" و "معرف المستخدم" على "فارغ". نقوم الآن بإنشاء "إجراء" "تسجيل خروج" جديد ، والذي يلتزم بـ "clearAuth" ، وحذف التخزين المحلي وإضافة "router.replace ('/')` لإعادة توجيه المستخدم بالكامل.
 actions: { logout ({commit}) { commit('clearAuth') localStorage.removeItem('token') localStorage.removeItem('userId') router.replace('/') } }
في مكون الرأس ، لدينا طريقة "onLogout" التي ترسل إجراء تسجيل الخروج الخاص بنا في المتجر.
 methods: { onLogout() { this.$store.dispatch('logout') } }
ثم نضيف "@ click" إلى الزر الذي يطلق طريقة "onLogout" كما نرى [هنا] (https://codepen.io/atanda1/pen/jObqKNd).
 <ul @click="onLogout">Log Out</ul>
## UI_State الآن بعد أن قدمنا ​​وصولاً مشروطًا إلى لوحة القيادة ، فإن الخطوة التالية هي إزالتها من شريط التنقل ، بحيث لا يتمكن سوى المستخدمين المصادق عليهم من عرضها. للقيام بذلك ، سنضيف طريقة جديدة ضمن "getters" تسمى "ifAuthenticated" والتي تتحقق مما إذا كان الرمز المميز داخل حالتنا فارغًا. عندما يكون هناك رمز مميز ، فإنه يُظهر أن المستخدم قد تمت مصادقته ونريده أن يرى خيار لوحة معلومات الاستطلاع على شريط التنقل.
 getters: { isAuthenticated (state) { return state.idToken !== null } }
بعد ذلك ، يمكنك الرجوع إلى مكون الرأس وإنشاء طريقة "auth" تحت المحسوبة ، والتي ترسل إلى "isAuthenticated" داخل "getters" التي أنشأناها للتو في المتجر. ما يفعله هذا هو أن "المصادقة" ستعيد خطأ إذا لم يكن هناك رمز ، مما يعني أن "المصادقة" ستكون أيضًا خالية والعكس صحيح.
 computed: { auth () { return this.$store.getters.ifAuthenticated } }
بعد ذلك ، نضيف "v-if" إلى HTML الخاص بنا للتحقق مما إذا كانت "auth" فارغة أم لا ، وتحديد ما إذا كان هذا الخيار سيظهر على شريط التنقل.
 <li v-if='auth'> <router-link to="/dashboard">Dashboard</router-link> </li> <li v-if='!auth'> <router-link to="/signup">Register</router-link> </li> <li v-if='!auth'> <router-link to="/signin">Log In</router-link> </li>
- ستجد الكود الكامل لقسم حالة واجهة المستخدم [هنا] (https://codepen.io/atanda1/pen/QWjNxyo).
حالة واجهة المستخدم
هناك تغيير في العنوان بناءً على حالة مصادقة المستخدم. (معاينة كبيرة)

تسجيل تلقائى

عندما نعيد تحميل تطبيقنا ، نفقد البيانات ونقوم بتسجيل الخروج ، واضطررنا إلى البدء من جديد. هذا بسبب تخزين الرمز المميز والمعرف الخاص بنا في Vuex ، وهو جافا سكريبت ، وهذا يعني أنه يتم إعادة تحميل تطبيقنا باستخدام المتصفح عند التحديث.

وأخيرًا ، ما سنفعله هو استرداد الرمز المميز داخل التخزين المحلي لدينا. من خلال القيام بذلك ، يمكننا الحصول على رمز المستخدم على المتصفح بغض النظر عن وقت تحديث النافذة ، ولدينا طريقة لتسجيل الدخول التلقائي لمستخدمنا بقدر ما لا يزال الرمز المميز صالحًا.

تم إنشاء طريقة actions جديدة تسمى AutoLogin ، حيث سنحصل على الرمز المميز userId من التخزين المحلي ، ونلتزم authUser بطريقة authUser في الطفرات.

 actions : { AutoLogin ({commit}) { const token = localStorage.getItem('token') if (!token) { return } const userId = localStorage.getItem('userId') const token = localStorage.getItem('token') commit('authUser', { idToken: token, userId: userId }) } }

ننتقل بعد ذلك إلى App.vue الخاص بنا ونكتب طريقة created ، والتي سترسل autoLogin من متجرنا في كل مرة يتم فيها تحميل التطبيق.

 created () { this.$store.dispatch('AutoLogin') }

Fetch_User_Data

نريد الترحيب بالمستخدم على لوحة التحكم من خلال عرض اسم المستخدم. وهكذا ، يتم إنشاء إجراء آخر يسمى fetchUser والذي يتحقق أولاً من وجود رمز مميز كالمعتاد. بعد ذلك ، يستمر في الحصول على البريد الإلكتروني من التخزين المحلي والاستعلام عن قاعدة البيانات كما تم سابقًا مع التحقق من صحة البريد الإلكتروني.

يؤدي هذا إلى إرجاع كائن يحتوي على بيانات المستخدم المرسلة في البداية أثناء التسجيل. نقوم بعد ذلك بتحويل هذا الكائن إلى مصفوفة storeUser الذي تم إنشاؤه في البداية بواسطة طفرة المستخدم.

 fetchUser ({ commit, state}) { if (!state.idToken) { return } const email = localStorage.getItem('email') axios.get('https://vue-journal.firebaseio.com/users.json?orderBy="email"&equalTo="' + email + '"') .then(res => { console.log(res) // const users = [] console.log(res.data) const data = res.data const users = [] for (let key in data) { const user = data[key] user.id = key users.push(user) console.log(users) } commit('storeUser', users[0]) }) .catch(error => console.log(error)) }

بعد ذلك نقوم بإنشاء برنامج getter آخر يسمى user والذي يعيد state.user الذي تم الالتزام به بالفعل من خلال storeUser .

 getters: { user (state) { return state.user }, isAuthenticated (state) { return state.idToken !== null } }

بالعودة إلى لوحة القيادة ، نقوم بإنشاء طريقة محسوبة جديدة تسمى name تُرجع state.user.name فقط في حالة وجود المستخدم.

 computed: { name () { return !this.$store.getters.user ? false : this.$store.getters.user.name } }, created () { this.$store.dispatch('fetchUser') } }

وسنضيف أيضًا الخاصية المحسوبة created لإرسال إجراء fetchUser بمجرد تحميل الصفحة. ثم نستخدم v-if في HTML الخاص بنا لعرض الاسم إذا كان الاسم موجودًا.

 <p v-if="name">Welcome, {{ name }} </p>

Send_Survey

لإرسال الاستطلاع ، سننشئ إجراء postData الذي يرسل البيانات إلى قاعدة البيانات باستخدام واجهة برمجة تطبيقات قاعدة البيانات ، مع الرمز المميز لإظهار الخادم الذي قام المستخدم بتسجيل الدخول.

 postData ({state}, surveyData) { if (!state.idToken) { return } axios.post('https://vue-journal.firebaseio.com/survey.json' + '?auth=' + state.idToken , surveyData) .then(res => { console.log(res) }) .catch(error => console.log(error)) }

نعود إلى مكون لوحة القيادة ونرسل البيانات إلى إجراء postData بنا في المتجر.

 methods : { onSubmit () { const postData = { price: this.price, long: this.long, comment: this.comment } console.log(postData) this.$store.dispatch('postData', postData) } }

يوجد لدينا ، لدينا الكثير من الميزات المفيدة التي تم تنفيذها في تطبيقنا التجريبي أثناء الاتصال بخادم Firebase. نأمل أن تستخدم هذه الميزات القوية في مشروعك التالي لأنها بالغة الأهمية لبناء تطبيقات الويب الحديثة اليوم.

إذا كانت لديك أي أسئلة ، فيمكنك تركها في قسم التعليقات وسيسعدني الإجابة على كل سؤال منها!

  • العرض التوضيحي للدرس التعليمي موجود هنا.
تطبيق Vue Survey
تطبيق الاستبيان المكتمل (معاينة كبيرة)

تشمل الموارد الأخرى التي قد تكون مفيدة ما يلي:

  • لفهم المزيد حول Firebase والخدمات الأخرى التي يقدمها ، راجع مقالة Chris Esplin ، "ما هو Firebase؟"
  • Vuelidate هي مكتبة رائعة حقًا يجب عليك البحث فيها حقًا. يجب عليك قراءة وثائقه للحصول على رؤية كاملة. https: //vuelidate.js.org/.
  • يمكنك أيضًا استكشاف المحاور من تلقاء نفسها ، خاصة إذا كنت ترغب في استخدامها في مشاريع أكبر.