GloryAdmin هو إطار عمل للخلفية يعتمد على Springboot2.1.9.RELEASE وvue-admin-template؛
يستخدم GloryAdmin إدارة الأذونات القائمة على الأدوار. شجرة الأدوار عبارة عن شجرة بها "مسؤول النظام" كعقدة جذر، وتتكون شجرة الأذونات من عدة أشجار أذونات فرعية. يتمتع "مسؤول النظام" بجميع الأذونات؛ ويمكن لأدوار غير مسؤولي النظام عرض معلومات الدور الحالي والأدوار التابعة مباشرة، ولكن يمكنها فقط إضافة وحذف وتعديل المعلومات الخاصة بالأدوار الثانوية المباشرة (المرؤوسون المباشرون: A هو المسؤول المباشر تابعة لـ B، فيجب أن تكون A هي العقدة الفرعية لـ B).
المجد المشرف
مشروع | تكنولوجيا |
---|---|
مشروع الواجهة الخلفية | Springboot |
مشروع الواجهة الأمامية | عنصر واجهة المستخدم وVue.js |
قاعدة البيانات | ماي إس كيو إل |
مخبأ | ريديس |
يستخدم هذا المشروع قاعدة بيانات MySQL، يمكنك استخدام البرنامج النصي لقاعدة البيانات لإنشاء قاعدتي بيانات multi_module_db multi_module_db_01
ابدأ في الخلفية واستخدم المنفذ 28081
ابدأ الواجهة الأمامية واستخدم المنفذ 9523
افتح المتصفح وقم بزيارة http://localhost:9523 admin a123456
جوهر التجزئة أو التجزئة هو فشل قانون مور. كان حل تخزين البيانات مركزيًا على عقدة بيانات واحدة أمرًا صعبًا لتلبية سيناريوهات البيانات الضخمة للإنترنت من حيث الأداء والتوافر وتكاليف التشغيل والصيانة.
لا يمكن لقاعدة بيانات واحدة أن تدعم الأعمال القائمة، لذلك ظهرت قواعد بيانات فرعية وجداول، ويتم استخدام قواعد بيانات متعددة لتخزين البيانات. الفهم البسيط لقاعدة البيانات الفرعية والجدول الفرعي هو أن محتويات السلة محدودة، مما يؤثر على كفاءة البحث وقدرته. يتم تقسيم محتويات السلة إلى أجزاء N ووضعها في سلال مختلفة. يؤدي هذا إلى كسر قيود السعة وتحسين كفاءة الاستعلام.
ثم دعونا نتحدث عن قواعد البيانات الموزعة، وقواعد البيانات الأكثر شعبية في الصين تشمل Tencent's TDSQL، وAlibaba's OceanBase، وPollarDB، وGaussDB من Huawei، وما إلى ذلك. في الأساس، تم تطويرها بشكل مستقل، مع اتساق قوي وتوافر عالي، وبنية نشر عالمية، وتوسع أفقي غير محدود، وأداء عالي، ومئات المليارات من السجلات، ومعاملات عبر الصفوف والجداول على مئات تيرابايت من البيانات (مثل الوطن الأم) . تخفي قاعدة البيانات الموزعة استراتيجية تقسيم قاعدة البيانات وتقسيم الجدول، وتقوم بتقسيم البيانات بذكاء إلى قواعد بيانات وجداول، وتستخدمها تمامًا مثل تشغيل قاعدة البيانات.
نظرًا لأن عمليات الذاكرة وعمليات القرص ليست بنفس الترتيب من حيث الحجم على الإطلاق، فإن المشاريع الكبيرة تتطلب طبقة عازلة من نوع الذاكرة لقواعد البيانات من نوع القرص لتخزين بيانات القرص في الذاكرة مؤقتًا. يتم استخدام طبقة التخزين المؤقت للبيانات لتخزين بيانات طبقة البيانات بأكملها مؤقتًا لتسريع الوصول إلى الموقع. يستخدم هذا المشروع تقنية AOP وقاعدة بيانات Redis في الذاكرة كطبقة ذاكرة تخزين مؤقت للبيانات. يرجى التحقق من الكود com/spring/common/aop/CacheDaoAspect.java للحصول على التفاصيل.
يستخدم هذا المشروع تقسيم JDBC لمعالجة قاعدة البيانات وجداول قاعدة البيانات. قم بتقسيم البيانات بنفسك وفقًا لسيناريوهات العمل.
عادةً ما تحتوي المشاريع على قاعدة بيانات واحدة فقط، ويتم استخدام الكاهن الخاص بـ Alibaba Cloud بشكل متكرر في الصين كتجمع اتصال لقاعدة البيانات. يستخدم هذا المشروع mysql وdruid وsharding JDBC. مبدأ تقسيم البيانات هو الحفاظ على تجمعات اتصال قاعدة بيانات متعددة في البرنامج، ويتوافق كل تجمع اتصال قاعدة بيانات مع قاعدة بيانات. تستخدم قاعدة البيانات والجداول المجزأة معالجة المعاملات على مرحلتين بناءً على بروتوكول XA . مسار التكوين com.spring.common.config.shardingJDBC
التقسيم العمودي: تسمى طريقة تقسيم الأعمال بالتقسيم الرأسي، والمعروفة أيضًا بالتقسيم الرأسي. توزيع الجداول على قواعد البيانات المختلفة حسب الأعمال، وبالتالي توزيع الضغط على قواعد البيانات المختلفة.
التقسيم الأفقي: لا يهتم بتصنيف منطق الأعمال، بل يقوم بتوزيع البيانات إلى مكتبات أو جداول متعددة وفق قواعد معينة من خلال حقل معين (أو عدة حقول) من جدول معين. القواعد هنا والخوارزمية المعنية تسمى خوارزميات التجزئة .
( المحتوى التالي مأخوذ من وثائق shardingJDBC )
يتوافق مع PreciseShardingAlgorithm، المستخدم للتعامل مع سيناريو تقسيم =
و IN
باستخدام مفتاح واحد كمفتاح تقسيم. يجب استخدامها مع StandardShardingStrategy.
يتوافق مع RangeShardingAlgorithm، الذي يُستخدم للتعامل مع سيناريوهات التقسيم باستخدام BETWEEN AND
و >
و <
و >=
و <=
باستخدام مفتاح واحد كمفتاح التقسيم. يجب استخدامها مع StandardShardingStrategy.
يتوافق مع خوارزمية ComplexKeysShardingAlgorithm، والتي تُستخدم للتعامل مع السيناريوهات التي يتم فيها استخدام مفاتيح متعددة كمفاتيح تقسيم للتجزئة، وهو منطق معقد، ويحتاج مطورو التطبيقات إلى التعامل مع التعقيد بأنفسهم. يجب استخدامها مع ComplexShardingStrategy.
يتوافق مع HintShardingAlgorithm، المستخدم للتعامل مع السيناريوهات التي يتم فيها استخدام Hint
صف التلميح. يجب استخدامها مع HintShardingStrategy.
يقوم المستخدم بتسجيل الدخول للحصول على الرمز المميز وتخزينه محليًا (adminLogin)
يرسل المستخدم رمزًا مميزًا للحصول على معلومات المستخدم ومعلومات الأذونات، ويخزنها في المتجر. نظرًا لأن F5 سيؤدي إلى فقدان المتجر، تتم إضافة اعتراض إلى طلب الواجهة الأمامية. إذا لم تكن هناك معلومات المستخدم ومعلومات الأذونات، فستتم إعادة الحصول على معلومات المستخدم والأذونات (getAdminInfo).
ما يتم إرجاعه هنا هو كافة أذونات المستخدم بدلاً من الدور، حيث يقوم المستخدم بإنشاء مسارات الواجهة الأمامية ديناميكيًا.
asyncRoutes هو إذن تم إنشاؤه ديناميكيًا. إذا كان إذن المستخدم يتوافق مع إذن المسار، فسيتم عرضه.
شائع: عمليات البيانات، والتخزين المؤقت للبيانات، وعمليات المعاملات
يعمل المشرف فقط كوحدة تحكم، ويتم استخدامه للتعامل مع إعادة التوجيه بين طلبات المستخدم والأعمال الخلفية. (لماذا تم تصميمه على هذا النحو؟) لأن بعض أنظمة البرامج الوسيطة تحتاج إلى استخدام إطار عمل RPC لإعادة توجيه الطلب، ولأن بعض الأنظمة السرية تتجاهل استخدام SpringMVC وتختار Vertx لتطوير طبقة الطلب بشكل مستقل.
استخدم ميراث Maven لإدارة تبعيات المشروع. في الوحدات، يتم تقديم التبعيات من خلال إدارة التبعيات ويتم تحديد الإصدارات وترث المشاريع الفرعية الوحدات وليست هناك حاجة لتحديد الإصدارات عند تقديم التبعيات.
معالجة السجل العالمي
تستخدم سجلات عمليات المستخدم أساليب التعليق التوضيحي. إذا كانت هذه الطريقة تحتاج إلى تسجيل سجلات العمليات، فما عليك سوى إضافة التعليق التوضيحي **@OperateLog** أعلى اسم الطريقة.
@ OperateLog
@ ApiOperation ( value = "登出" , notes = "登出" )
@ GetMapping ( Route . Admin . adminLogout )
public ResponseDate adminLogout ( HttpServletRequest httpServletRequest ) {
AdminInfoDTO adminInfoDTO = AdminTool . getAdminUser ( httpServletRequest );
AdminUser adminUser = adminUserMapper . selectByPrimaryKey ( adminInfoDTO . getAdminUk ());
adminUser . setNowToken ( "log-out" );
int result = adminUserService . updateAdminToken ( adminUser );
return ResponseDate . builder ()
. success ( result == 1 )
. build ();
}