GloryAdmin เป็นเฟรมเวิร์กพื้นหลังที่ใช้ springboot2.1.9.RELEASE และ vue-admin-template
GloryAdmin ใช้การจัดการสิทธิ์ตามบทบาท แผนผังบทบาทคือแผนผังที่มี "ผู้ดูแลระบบ" เป็นโหนดรูท และแผนผังสิทธิ์ประกอบด้วยแผนผังสิทธิ์ย่อยหลายแผนผัง "ผู้ดูแลระบบ" มีสิทธิ์ทั้งหมด บทบาทของผู้ดูแลระบบที่ไม่ใช่สามารถดูข้อมูลของบทบาทปัจจุบันและบทบาทรองโดยตรง แต่สามารถเพิ่ม ลบ และแก้ไขข้อมูลของบทบาทรองโดยตรงเท่านั้น (ผู้ใต้บังคับบัญชาโดยตรง: A คือโดยตรง ผู้ใต้บังคับบัญชาของ B ดังนั้น A จะต้องเป็นโหนดลูกของ B)
Glory-ผู้ดูแลระบบ
โครงการ | เทคโนโลยี |
---|---|
โครงการแบ็กเอนด์ | สปริงบูท |
โครงการส่วนหน้า | UI องค์ประกอบ & Vue.js |
ฐานข้อมูล | MySQL |
แคช | เรดิส |
โครงการนี้ใช้ฐานข้อมูล mysql คุณสามารถใช้สคริปต์ฐานข้อมูลเพื่อสร้าง 2 ฐานข้อมูล multi_module_db multi_module_db_01
เริ่มต้นในพื้นหลังและใช้พอร์ต 28081
เริ่มต้นส่วนหน้าและใช้พอร์ต 9523
เปิดเบราว์เซอร์และไปที่ http://localhost:9523 admin a123456
สาระสำคัญของการแบ่งกลุ่มข้อมูลหรือการแบ่งกลุ่มข้อมูลคือความล้มเหลวของกฎของมัวร์ การแก้ปัญหาการจัดเก็บข้อมูลแบบรวมศูนย์บนโหนดข้อมูลเดียวเป็นเรื่องยากที่จะตอบสนองสถานการณ์ข้อมูลขนาดใหญ่ของอินเทอร์เน็ต ในแง่ของประสิทธิภาพ ความพร้อมใช้งาน และต้นทุนการดำเนินงานและการบำรุงรักษา
ฐานข้อมูลเดียวไม่สามารถรองรับธุรกิจที่มีอยู่ได้ จึงมีฐานข้อมูลย่อยและตารางเกิดขึ้น และใช้ฐานข้อมูลหลายฐานข้อมูลในการจัดเก็บข้อมูล ความเข้าใจง่ายๆ เกี่ยวกับฐานข้อมูลย่อยและตารางย่อยคือเนื้อหาของตะกร้ามีจำกัด ซึ่งส่งผลต่อประสิทธิภาพและความจุในการค้นหา เนื้อหาของตะกร้าจะถูกแบ่งออกเป็นส่วน N และวางไว้ในตะกร้าที่แตกต่างกัน สิ่งนี้จะทำลายข้อจำกัดด้านความจุและปรับปรุงประสิทธิภาพของคิวรี
ถ้าอย่างนั้นเรามาพูดถึงฐานข้อมูลแบบกระจายกัน ซึ่งฐานข้อมูลที่ได้รับความนิยมมากขึ้นในจีน ได้แก่ TDSQL ของ Tencent, OceanBase ของ Alibaba, PolarDB, GaussDB ของ Huawei เป็นต้น โดยพื้นฐานแล้ว พวกเขาได้ รับการพัฒนาอย่างอิสระ โดยมีความสม่ำเสมอที่แข็งแกร่งและความพร้อมใช้งานสูง สถาปัตยกรรมการปรับใช้ทั่วโลก การกระจายการขยายแนวนอนไม่จำกัด ประสิทธิภาพสูง บันทึกนับแสนล้านรายการ และธุรกรรมแบบข้ามแถวและข้ามตารางบนข้อมูลหลายร้อย TB (เช่น มาตุภูมิ) ฐานข้อมูลแบบกระจายจะซ่อนกลยุทธ์การแบ่งกลุ่มฐานข้อมูลและการแบ่งกลุ่มตาราง แยกข้อมูลออกเป็นฐานข้อมูลและตารางอย่างชาญฉลาด และใช้ข้อมูลดังกล่าวเหมือนกับการใช้งานฐานข้อมูล
เนื่องจากการทำงานของหน่วยความจำและการทำงานของดิสก์ไม่ได้มีขนาดเท่ากันเลย โปรเจ็กต์ขนาดใหญ่จึงจำเป็นต้อง มีชั้นบัฟเฟอร์ประเภทหน่วยความจำ สำหรับ ฐานข้อมูลประเภทดิสก์ เพื่อแคชข้อมูลดิสก์ลงในหน่วยความจำ ชั้นแคชข้อมูลใช้เพื่อแคชข้อมูลของชั้นข้อมูลทั้งหมดเพื่อเพิ่มความเร็วในการเข้าถึงไซต์ โปรเจ็กต์นี้ใช้ เทคโนโลยี 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 จะทำให้ร้านค้าหายไป Interceptor จะถูกเพิ่มไปยังคำขอส่วนหน้า หากไม่มีข้อมูลผู้ใช้และข้อมูลสิทธิ์ ข้อมูลผู้ใช้และการอนุญาตจะได้รับอีกครั้ง (getAdminInfo)
สิ่งที่ส่งคืนที่นี่คือสิทธิ์ทั้งหมดของผู้ใช้แทนที่จะเป็นบทบาท ผู้ใช้สร้างเส้นทางส่วนหน้าแบบไดนามิก
asyncRoutes เป็นการอนุญาตที่สร้างขึ้นแบบไดนามิก หากการอนุญาตของผู้ใช้สอดคล้องกับการอนุญาตของเส้นทาง ก็จะปรากฏขึ้น
ทั่วไป: การดำเนินการข้อมูล การแคชข้อมูล การดำเนินการธุรกรรม
ผู้ดูแลระบบทำหน้าที่เป็นผู้ควบคุมเท่านั้น ซึ่งใช้เพื่อจัดการการส่งต่อระหว่างคำขอของผู้ใช้และธุรกิจแบ็คเอนด์ (เหตุใดจึงออกแบบเช่นนี้) เนื่องจากระบบมิดเดิลแวร์บางระบบจำเป็นต้องใช้เฟรมเวิร์ก RPC สำหรับการส่งต่อคำขอ และเนื่องจากระบบที่เป็นความลับบางระบบรังเกียจที่จะใช้ springMVC และเลือก vertx เพื่อพัฒนาเลเยอร์คำขออย่างอิสระ
ใช้ การสืบทอด Maven เพื่อจัดการการขึ้นต่อกันของโปรเจ็กต์ ในโมดูล การขึ้นต่อกันจะถูกนำมาใช้ผ่าน dependencyManagement และเวอร์ชันจะถูกระบุ โปรเจ็กต์ย่อยจะสืบทอดโมดูล และไม่จำเป็นต้องระบุเวอร์ชันเมื่อแนะนำการขึ้นต่อกัน
การประมวลผลบันทึกทั่วโลก
บันทึกการดำเนินการของผู้ใช้ใช้วิธีการใส่คำอธิบายประกอบ หากวิธีนี้จำเป็นต้องบันทึกบันทึกการดำเนินการ เพียงเพิ่มคำอธิบายประกอบ **@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 ();
}