Management_system
مقدمة
هذا نظام إدارة الخلفية يعتمد على koa2
استخدم jQuery
كإطار عمل JS للواجهة الأمامية، استخدم bootstrap
كإطار عمل CSS، استخدم pug
/ jade
و handlebars
كقالب صفحة HTML، استخدم PostgreSql
لتخزين بيانات العمل، استخدم mongodb
لتخزين session
استخدام Bookshelf
+ Knex
كمنشئ ORM
Query Builder
استخدم Sentry
كمنصة لجمع الملاحظات حول معلومات الخطأ. استخدم AJAX
لمعالجة طلبات الواجهة الأمامية. استخدم مكتبة CronJob
لإكمال تنفيذ المهام المجدولة.
للحصول على بنية الدليل وتكوين بابل، يرجى الرجوع إلى https://github.com/17koa/koa-demo
يبدو أن الرابط الأصلي قد تم حذفه. هذه هي النسخة التي قمت بتشعبها https://github.com/liuyueyi1995/koa2-demo.
يأتي رمز الواجهة الأمامية للموقع من مشروع سابق لي https://github.com/liuyueyi1995/oa
المهام الأساسية
- تسجيل دخول مسؤول الواجهة الخلفية
- ب إدارة معلومات المستخدم
- إدارة دور المستخدم C
- د- الإدارة التنظيمية
- إدارة المشاريع ه
- F عرض المحتوى الذي تم الحصول عليه عن طريق الاستعلام والبحث من خلال الترحيل الخلفي +
AJAX
- إنشاء مستخدمين مؤقتين وتخصيص وإعادة تدوير الأدوار المؤقتة
- إدارة سجل H
الاكتمال
- تم الانتهاء من هيكل MVC الأساسي؛
- تم إكمال المهمة "أ"، بما في ذلك التسجيل وتسجيل الدخول وقراءة الجلسة وكتابتها؛
- تم إكمال المهمة ب، بما في ذلك الاستعلام عن معلومات المستخدم والبحث الغامض والإضافة والحذف وتعديل المعلومات الأساسية وتعديل كلمة المرور؛
- تم إكمال المهمة C، بما في ذلك الاستعلام متعدد الجداول، والبحث الغامض، ومعالجة القائمة المنسدلة المتتالية، وإضافة المعلومات وحذفها؛
- تم إكمال المهمة د، بما في ذلك الاستعلام عن المعلومات المؤسسية والبحث الغامض والإضافة والحذف والتعديل؛
- تم إكمال المهمة E، بما في ذلك الاستعلام عن معلومات المشروع والبحث الغامض والإضافة والحذف والتعديل؛
- تم إكمال المهمة F من خلال تحديد ما إذا كان مربع البحث يحتوي على محتوى عند تشغيل حدث النقر على زر الترحيل، ويتم تحديد مجموعة النتائج التي يتم إرجاعها بواسطة الخلفية؛
- تم إكمال المهمة G من خلال تقسيم المستخدمين إلى مستخدمين داخليين وخارجيين، باستخدام طرق مختلفة لإنشاء كلمة المرور، وإضافة سمات وقت انتهاء الصلاحية إلى الأدوار، وتقوم الخلفية بانتظام بتنظيف معلومات الدور منتهية الصلاحية؛
- تم إكمال المهمة G، بما في ذلك عرض السجل والبحث الغامض؛
- تم تحسين شكل العرض التقديمي للنموذج، وتم تعديل القائمة المنسدلة، وإضافة عنصر تحكم للتاريخ، وإدخال القيمة المنطقية في شكل راديو؛
- تم ربط وظيفتي تسجيل دخول المستخدم وإدارة البيانات؛
- تم الانتهاء من التمييز بين الأدوار الخارجية والأدوار الداخلية، كما تم الانتهاء من تحديد الموعد النهائي للأدوار؛
المهام
- يجب تحسين الاستعلام عن التواريخ والأرقام والقيم المنطقية (على سبيل المثال: الطابع الزمني، المنطقي)؛
- يجب تحسين عملية التحقق من مدخلات المستخدم (على سبيل المثال: البريد الإلكتروني، الهاتف)؛
- تحسين درجة إعادة استخدام التعليمات البرمجية؛
ركز
تم حذف ملف config.js
الذي يحتوي على معلومات حساسة من الريبو ويجب إضافته عند استخدامه:
var config = {
database: '',
username: '',
password: '',
host: '',
port:
};
module.exports = config;
مشاكل
- يوجد خطأ في القائمة المتتالية في البداية، لا يمكن عرض قائمة
site
دون تغيير type
.- تم الحل.
- ينبغي أن تكون مشكلة مع
onchange
. - من خلال إضافة قيمة فارغة افتراضية إلى القائمة المنسدلة
type
، قم بإجبار المستخدم على تغييرها.
- بعد تعديل قاعدة البيانات، لم تتغير قيمة
updated_at
.- تم الحل.
- ما عليك سوى إضافة
hasTimestamps:true
عند تحديد model
.
- بعد تعديل قاعدة البيانات، سيتم تعطيل ترتيب القائمة.
- تم الحل.
- استخدم
orderBy
لفرز نتائج البحث قبل أن تقوم قاعدة البيانات بإرجاعها.
- في صفحة إدارة الأدوار، عندما تكون قيمة الموقع فارغة، قد تفشل عملية الإضافة أحيانًا.
- تم الحل.
- عندما يتم إرجاع
null
للواجهة الأمامية إلى الواجهة الخلفية، فإنها تصبح سلسلة فارغة، والتي تتعارض مع النوع integer
للمفتاح الخارجي.
- بعد الترحيل، إذا تم تعديل المحتوى اللاحق، فسوف يعود إلى الصفحة الأولى بعد نجاح التعديل.
- لم يتم حلها .
- يجب أن تكون مشكلة
reload
.
- بعد الترحيل، إذا كانت نتائج البحث تحتوي على صفحات متعددة من المحتوى، فإن النقر على الصفحة الثانية سيعود إلى الصفحة الثانية من النتائج الأصلية.
- تم الحل.
- نظرًا لوجود معالجة
AJAX
واحدة فقط للترحيل الآن، إذا كنت تريد عرض نتائج البحث في الترحيل، فستحتاج إلى إضافة حالة أخرى. - إضافة الحكم على أساس الترحيل الأصلي،
- إذا كان هناك محتوى في مربع البحث في هذا الوقت، فسيتم الاستعلام عن قاعدة البيانات بهذا المحتوى وسيتم إرجاع محتوى الصفحة المقابلة؛
- إذا كان مربع البحث فارغًا في هذا الوقت، فسيتم إرجاع محتوى الصفحة المطابق للبيانات الأصلية.
- بعد البحث، يكون عدد الصفحات في مكون الترحيل غير صحيح، على سبيل المثال، تحتوي النتائج الأصلية على 5 صفحات، لكن نتائج البحث تحتوي على صفحتين فقط، ولكن لا تزال أزرار أرقام الصفحات الخمسة معروضة.
- تم الحل.
- احصل على عدد النتائج بعد البحث وأعد رسم زر الترحيل.
- عند البحث عدة مرات، يكون عدد الصفحات في مكون الترحيل غير صحيح، على سبيل المثال، تحتوي نتيجة البحث الأولى على صفحتين، وتحتوي نتيجة البحث الثانية على 3 صفحات، ولكن لا يزال يتم عرض زرين لرقم الصفحة فقط.
- تم الحل.
- احصل على محتوى مربع البحث في الوقت الفعلي وقم بتحديث الصفحة عندما يصبح محتواها فارغًا.
- عند استخدام قالب
handlebars
، يتم تحليل الطابع الزمني بشكل غير صحيح.- تم الحل.
- استخدم
helper
مخصصًا لتحليل الطوابع الزمنية.
- إذا لم تقم بتسجيل الدخول، فإن تعديل عنوان URL سيؤدي إلى تخطي تسجيل الدخول وتشغيل قاعدة البيانات مباشرة.
- تم الحل.
- قبل إرجاع كل طلب
get
، تتم إضافة حكم session
إذا كانت session
فارغة، فسيتم الانتقال إلى صفحة login
.
- يتطلب حذف المستخدمين الداخليين الانضمام، ويدعم حذف pgsql فقط
using
، ولا يدعم رف الكتب using
.- تم الحل.
- استخدم
knex
لإكمال الاستعلام مباشرةً بدلاً من ذلك.
- قيمة حقل التاريخ/الوقت خارج النطاق
- تم الحل.
- على الرغم من أن قاعدة بيانات الاختبار المحلية وقاعدة بيانات Alibaba Cloud كلاهما pgsql9.4، إلا أن آليات المراجعة مختلفة.
- يبدو أن تمييز التاريخ في Alibaba Cloud غير قادر على الظهور في الصباح وبعد الظهر (صباحًا/مساءً)
- ولذلك، تمت إضافة أسلوب
format
إلى فئة Date
لتنسيق التواريخ.
- التبديل بين نتائج البحث وجميع النتائج.
- تم الحل.
- كانت الطريقة الأولى هي استخدام المراقبة في الوقت الفعلي. عندما يكون مربع البحث فارغًا، يتم تحديث الصفحة، لكن هذا غير صالح في بعض المتصفحات وأنظمة التشغيل؛
- لذلك، بدلاً من ذلك، استخدم طريقة الارتباط في البانر لإعطاء رابط من نتائج البحث إلى جميع النتائج.
- يستهلك تنسيق التاريخ الطويل عددًا كبيرًا جدًا من الصفحات.
- تم الحل.
- في الواجهة الخلفية، يمكنك التعامل مع التاريخ من خلال تنسيقه وتبسيطه.
- إذا تم الإبلاغ عن خطأ في عملية قاعدة البيانات الخلفية، فلن تحصل الواجهة الأمامية على تعليقات حول المعلومات ذات الصلة.
- تم الحل.
- قم بإضافة كتلةthen().catch() إلى الواجهة الخلفية لإصدار أحكام الخطأ.
- والخطوة التالية هي تحليل رمز الخطأ المحدد وإبلاغ الواجهة الأمامية بالمعلومات التفصيلية.
- عند إضافة الأدوار، لا يمكن التمييز بين المستخدمين الذين يحملون نفس الاسم.
- تم الحل.
- تمييز المستخدمين الذين يحملون نفس الاسم من خلال الإشارة إلى عنوان بريدهم الإلكتروني بعد اسم المستخدم.