في الآونة الأخيرة ، أعمل على مشروع من نوع موقع الويب يتطلب التحكم في وحدة الوصول إلى المستخدم (أذونات) ، لذلك تم تصميم وتنفيذ مجموعة بسيطة من وظائف التحكم في الإذن.
1. تصميم قاعدة البيانات
المستخدم: المستخدمون
الوحدات النمطية: الوحدات النمطية
رمز SQL:
/*نوع الخادم الهدف: MySqlTarget Server الإصدار: 50628file الترميز: 65001date: 2016-08-26 10: 35: 28*/set forefore_key_checks = 0 ؛----------------------------------------------------- Null Auto_increment ، `module` varchar (30) التعليق الافتراضي الفارغ" ، "pid` int (10) التعليق الفارغ الافتراضي '上一级 id' ،` level` int (4) comment null null "级别 级别 '، key kead (` id`)) Engine = innodb default charset = utf8 ؛ -------------------------------------------------- ------------------------------------- بنية الجدول لـ "المستخدمين "-- ------------------------------------ Table إذا كان موجودًا" المستخدمين "؛ قم بإنشاء جدول" المستخدمين "(` user_code` varchar (10) ليس تعليقًا لا شيء 用户代码 '، `user_name` varchar (40) التعليق الافتراضي الفارغ "QQ" ، "MSN` varchar (50) التعليق الفارغ الافتراضي" MSN "،" Demo` Varchar (100) Default Null Comment "备注" ، `Auth_Code` Text Text" 权限码 "، key primary (` user_code`)) Engine = innodb default charset = utf8 ؛ ----------------------------------------- --------- ----- ----- ----- ----- ------------- ----- ------------- ------------- --------- --------------------------------
1. تنفيذ الواجهة الخلفية <BR /> يتم استخدام إطار SSM+Freemarker في المشروع لتغليف الأذونات في بنية بيانات شجرة الإذن ، ثم تحويلها إلى تنسيق JSON.
1) تعتمد طبقة العرض شجرة Ztree (Setuserauthontree.html)
<! doctype html> <html> <head> <#تضمين "common/res.html"/> <script src = "$ {base.ctx} /js/layer-v2.1/laypage/laypage.js"> </script> <link> href = "$ {base.ctx} /js/layer-v2.1/laypage/skin/laypage.css" rel = "stylesheet" type = "text/css"/> <script src = "$ {base.ctx} /js/layer-v2.1/layer.js href = "$ {base.ctx}/component/ztree/css/ztreestyle/ztreestyle.css" rel = "STYLESHEED" type = "text/css"/> <script type = "text/javascript" src = "$ {base.ctx}/component/ztree/js/jquery.ztree.core-3.5 type = "text/css">. Blue-Madison {Border: 1px Solid #7CA7CC ؛ الحدود: 0 ؛}. Caption {background-color: #578EBE ؛ border-bottom: 0 ؛ الحشو: 0 10px ؛ القاع الهامش: 0 ؛ اللون: #fff ؛} </style> </head> <body> <div style = "overflow-y: auto ؛ العرض: 400px ؛ الارتفاع: 550pX ؛ onClick = "editModle ()"> OK </button> <button type = "button" id = "cancel"> inting </button> </div> </viv> </viv> <script> $ ("document"). جاهز () البيانات: {id ": $ {userid}"} ، "json" ، النجاح: // تحميل شجرة var ZtreeObj ؛ // للاستخدام المتعمق ، يرجى الرجوع إلى وثائق API (شرح مفصل لتكوين إعداد) إعداد var = {view: {// dblclickexpand: false ، lost: true ، // هل يتم عرض العلاقة بين العقد} ، check: "n": "ps"} ، // autochecktrigger: true} ، callback: {oncheck: ztreeoncheck ،}} ؛ // مربع الاختيار النقر على وظيفة رد الفعل ZTREEONCHECK (الحدث ، TREENID ، treeNode) { /* var ztree = $ .fn.ztree.getztreeobj ("treedemo") ؛ var changeNodes = ztree.getChangeCheckedNodes () ؛ لـ (var i = 0 ؛ i <changeNodes.length ؛ i ++) {var treeNode = changeNodes [i] ؛ } */} ؛ دالة editmodle () {var rootId = null ؛ var midid = null ؛ var minid = null ؛ var treeobj = $ .fn.ztree.getztreeObj ("treedemo") ؛ VAR NOGES = TREEOBJ.GETCHECKEDNODES () ؛ لـ (var i = 0 ؛ i <noves.length ؛ i ++) {if (noldes [i] .Level == 0) {rootId = rootId+"،"+noldes [i] .id ؛ } if (العقد [i] .level == 1) {midid = midid+"،"+العقد [i] .id ؛ } if (العقد [i] .LEVEL == 2) {minid = minid+"،"+العقد [i] .id ؛ }} if (rootId! = null) {rootId = rootId.SubString (5 ، rootId.length) ؛ } if (midid! = null) {midid = midid.substring (5 ، midid.length) ؛ } if (minid! = null) {minid = minid.subString (5 ، minid.length) ؛ } $ .ajax ({type: "post" ، url: "$ {base.ctx}/setup/updateUserRightmaskbyajax" ، datatype: "json" ، data: {"rootId": "midid: midid ،" minid ":" userid: "$ إذا كان (= "1") {layer.msg ("تمكين بنجاح!") ؛ } // أغلق $ ("#إلغاء"). انقر فوق (function () {top.dialog.get ("set-dialog"). close (). remove () ؛}) ؛ </script> </body> </html> تأثير العرض كما يلي:
2) تستخدم طبقة التحكم في وحدة التحكم springmvc
في طبقة التحكم ، قم بتحويل البيانات إلى تنسيق JSON وأرسلها إلى طبقة العرض.
/** * fun الحصول على أذونات مستخدم فرع * Author pi feng * date 2016/8/25 * param session * param id * param substoreid * @return */requestmapp substoreid = stringUtils.isempty (substoreid)؟ string.valueof (session.getAttribute ("substoreid")): substoreid ؛ // ugns ما إذا كان هو فندق أو قائمة نزل <map <string ، Object >> fesionslist = this.setupService.gethotelversions (substoreid) ؛ إصدارات الكائن = versionsList.get (0) .get ("الإصدارات") ؛ الخريطة <string ، Object> HotelMap = new HashMap <string ، Object> () ؛ if ((NULL! = fesionslist) && (elevionslist.size ()! = 0)) {// list غير فارغ إذا ("complete" .equals (إصدارات)) {// hotel // query requistr tree hotelmap = this.rightmaskskservice.getUrightmasskontree (application ، id ، "complete") ؛ } آخر إذا ("Simple" .equals (إصدارات)) {// inn // Query Inn Semission Tree HotelMap = this.rightmaskservice.getuserRightmaskontree (substoreid ، id ، "simple") ؛ }} map <string ، Object> resultMap = new HashMap <string ، Object> () ؛ resultmap.put ("البيانات" ، HotelMap) ؛ return jsonobject.tojsonstring (resultMap ، serializerfeature.writemapnullvalue) ؛ } 3) تغلف طبقة الخدمة الأذونات في بنية بيانات الأشجار التي تلبي تنسيق Ztree
/** * @ userrightmask = this.irightmaskdao.getuserRightmaskbysubandid (substoreid ، id) ؛ قائمة <map <string ، object >> listone = new ArrayList <map <string ، Object >> () ؛ قائمة <map <string ، object >> listtwo = new ArrayList <map <string ، object >> () ؛ // list <map <string ، object >>> tistTheRe = new ArrayList <map <string ، object >> () ؛ قائمة <map <string ، object >>> resultlist = new ArrayList <map <string ، object >> () ؛ if (elevions.equals ("complete")) {// hotel listone = this.irightmaskdao.getRightmaskonhotelone () ؛ listtwo = this.irightmaskdao.getRightMaskonHoteltwo () ؛ // listthree = this.irightmaskdao.getRightMaskonHotelthree () ؛ PackagingTotwotree (قائمة النتائج ، Listone ، ListTwo ، UserRightmask) ؛ } آخر إذا (الإصدارات. listtwo = this.irightmaskdao.getRightmaskontaverntwo () ؛ // listTheRe = this.irightmaskdao.getRightMasSkontavernthree () ؛ PackagingTotwotree (قائمة النتائج ، Listone ، ListTwo ، UserRightmask) ؛ } Map <String ، Object> map = new HashMap <string ، Object> () ؛ map.put ("البيانات" ، قائمة النتائج) ؛ خريطة العودة }/** * function تغليف شجرة المستوى الأول * Author pi feng * date 2016/8/26 * param resultlist * param listone * @param authcod 0 ؛ ROOTMAP.PUT ("id" ، listone.get (i) .get ("id")) ؛ rootmap.put ("name" ، listone.get (i) .get ("module")) ؛ if (validaterightmask (listone ، authcode ، i)! = -1) {rootmap.put ("checked" ، true) ؛ } آخر {rootmap.put ("محدد" ، خطأ) ؛ } resultlist.add (rootMap) ؛ }}/** * function تغليف شجرة ثانوية * Author pi feng * date 2016/8/26 * param resultlist * param listone * @param listtwo * @param authcod listtwo ، خريطة <string ، object >> authCode) {for (int i = 0 ؛ i <listone.size () ؛ i ++) {list <map <string ، object >> midlist = new ArrayList <map ، object >> () ؛ لـ (int j = 0 ؛ j <listtwo.size () ؛ j ++) {if (listtwo.get (j) .get ("pid"). خريطة <string ، object> midmap = new hashmap <string ، Object> () ؛ midmap.put ("id" ، listtwo.get (j) .get ("id")) ؛ midmap.put ("name" ، listtwo.get (j) .get ("module")) ؛ midmap.put ("الأطفال" ، minlist) ؛ if (validateRightmask (listtwo ، authcode ، j)! = -1) {midmap.put ("checked" ، true) ؛ } آخر {midmap.put ("فحص" ، خطأ) ؛ } midlist.add (midmap) ؛ }} خريطة <string ، object> rootMap = new HashMap <string ، Object> () ؛ ROOTMAP.PUT ("id" ، listone.get (i) .get ("id")) ؛ rootmap.put ("name" ، listone.get (i) .get ("module")) ؛ ROOTMAP.PUT ("الأطفال" ، Midlist) ؛ if (validaterightmask (listone ، authcode ، i)! = -1) {rootmap.put ("checked" ، true) ؛ } آخر {rootmap.put ("محدد" ، خطأ) ؛ } resultlist.add (rootMap) ؛ }}/** * @Function تغليف شجرة من المستوى الثالث * Author pi feng * date 2016/8/26 * @param resultlist * @param listone * param listtwo * @param listtwo * @param authcod قائمة <map <string ، object >> listtwo ، قائمة <map <string ، object >> tistthree ، map <string ، object> authcode) {for (int i = 0 ؛ i <listone.size () ؛ i ++) {list <map ، object >> midlist = new arraylist <map ، object >> () ؛ لـ (int j = 0 ؛ j <listtwo.size () ؛ j ++) {if (listtwo.get (j) .get ("pid"). لـ (int k = 0 ؛ k <istrTheRe.size () ؛ k ++) {map <string ، object> minmap = new hashmap <string ، object> () ؛ if (listthree.get (k) .get ("pid"). minmap.put ("name" ، listTheRe.get (k) .get ("module")) ؛ if (validateRightmask (TistTheRe ، AuthCode ، K)! = -1) {minmap.put ("checked" ، true) ؛ } آخر {minmap.put ("فحص" ، خطأ) ؛ } minlist.add (minmap) ؛ }} خريطة <string ، object> midmap = new HashMap <string ، Object> () ؛ midmap.put ("id" ، listtwo.get (j) .get ("id")) ؛ midmap.put ("name" ، listtwo.get (j) .get ("module")) ؛ midmap.put ("الأطفال" ، minlist) ؛ if (validateRightmask (listtwo ، authcode ، j)! = -1) {midmap.put ("checked" ، true) ؛ } آخر {midmap.put ("فحص" ، خطأ) ؛ } midlist.add (midmap) ؛ }} خريطة <string ، object> rootMap = new HashMap <string ، Object> () ؛ ROOTMAP.PUT ("id" ، listone.get (i) .get ("id")) ؛ rootmap.put ("name" ، listone.get (i) .get ("module")) ؛ ROOTMAP.PUT ("الأطفال" ، Midlist) ؛ if (validaterightmask (listone ، authcode ، i)! = -1) {rootmap.put ("checked" ، true) ؛ } آخر {rootmap.put ("محدد" ، خطأ) ؛ } resultlist.add (rootMap) ؛ } ستر AuthCode.get ("Auth_code")! = NULL؟ AuthCode.get ("Auth_code"). ToString (): "" ؛ if (! stringUtils.isempty (rightmask)) {rightmask = rightmask.replace ("؛" ، "،") ؛ String [] Array = rightmask.split ("،") ؛ لـ (int j = 0 ؛ j <arry.length ؛ j ++) {string arrayRightmask = arry [j] ؛ String listrightmask = list.get (i) .get ("id"). toString () ؛ if (arryRightmask.equals (listrightmask)) {return 1 ؛ }}} آخر {return -1 ؛ } العودة -1 ؛ } 4) الاستعلام عن قاعدة البيانات للحصول على أذونات المستخدم
أ. أخرج مستويات مختلفة من الأذونات من جدول الوحدات النمطية وفقًا لمستوى الإذن في طبقة البيانات.
حدد المعرف ، الوحدة النمطية ، PID ، المستوى من الوحدات النمطية حيث المستوى = "0" حدد معرف ، وحدة النمط ، PID ، المستوى من الوحدات النمطية حيث المستوى = "1" حدد معرف ، الوحدة النمطية ، PID ، المستوى من الوحدات النمطية حيث المستوى = "2"
ب. أخرج جميع أذونات المستخدم (رمز الإذن) في جدول المستخدمين
حدد Auth_Code من المستخدمين حيث user_code = 'pifeng'
ج. عند توفير الأذونات ، يتم فصل رموز الإذن بين المستويات المختلفة بواسطة Semicolon البريطاني "؛" ، ويتم فصل رموز الإذن بين نفس المستوى بواسطة الفاصلة البريطانية "،". على سبيل المثال: 1،2،3،4،5،6،7،8،9،10،11،12 ؛ 13،14،15،16،17،18،19،20،21،22،23،24،25،26،36،37،27،28،29،30،31،32،33،34،35،38،39،39،41،42،43،44 ، 45،46،47،48،49،50،51،52،53،54،56،57،58،59،60،61،62،63،64،133،65،66،67،68،69،70،71،73،74،74،1 26،127،128،129،130،131،76،77،78،79،80،81،83،84،85،86،87،88،99،124،94،95،135،136،136،140،141،89،90،91،94،94،95،95،95،95،95،95،9 6،97،98،137،138،139،100،101،102،103،106،107،132،108،109،110،111،112،113،114،11،116،125،117،11،11،120،121،122
5) استخدم علامة Freemarker للتحكم في ما إذا كانت وحدة وظيفة الصفحة معروضة وفقًا لرمز إذن المستخدم
أ. تكوين المآسي في ملف XML
<bean id = "freemarkerconfig"> <!-مسار تحميل القالب-> <اسم property = "templateloaderpath"> <value>/web-inf/ftl/</value> </property> <property name = "freemarkervariables"> <map> name = "freeMarkerSettings"> <bors> <prop key = "tag_syntax"> auto_detect </prop> <prop key = "template_update_delay"> 0 </prop> <propaw = "default_encoding"> utf-8 </prop> key = "locale"> zh_cn </prop> <prop key = "date_format"> yyyy-mm-dd </prop> <prop key = "time_format"> hh: mm: ss </prop> <prop key = "number_format"> 0. <!-معالجة القيمة الخالية-> <prop key = "classic_compatible"> true </prop> <!-استيراد قالب FTL تلقائيًا واستخدم "base" aspace as the namepace-> <prop key = "auto_import"> inc/spring.ftl كقاعدة </props> </propert id = "freeMarkerViewResolver"> <property name = "fAsal" value = ". value = "text/html ؛ charset = utf-8"> </property> <!-استثناء ثابت: لا يمكن فضح سمات الجلسة "substoreid" بسبب نموذج موجود-> <property name = "يسمح بالقيام" value "=" true "/> <property name =" exposerequestatributes "value =" true " name = "exposesprospringMacroHelpers" value = "true"/> <!-هذه القيمة المتغيرة هي pagecontext.request ، طريقة استخدام الصفحة: request.contextpath-> <property name = "requestConductTruction" value = "request"/> <property name = قم بربط فئة الأدوات التي حددناها مسبقًا-> <bean/> </frense> </map> </property> </ban>
ب. اكتب فئة لروث فئة TemplateMethodModel وتنفيذ طريقة مخصصة لـ FreeMarker للتحكم في ما إذا كانت وحدة الصفحة تعرض تسجيل الدخول وتخزين رمز إذن المستخدم في الجلسة ، ثم الحصول على إذن من الجلسة. هنا مثال:
الطبقة العامة menufunction تنفذ templatemethodmodel {Override الكائن العام exec (قائمة Arg0) يلقي templatemodelexception {int level = integer.valueof (arg0.get (0) .ToString ()) ؛ // وحدة المستوى int modelID = integer.valueof (arg0.get (1) .ToString ()) ؛ // module id int count = 0 ؛ // جلسة السجل ما إذا كان رمز الإذن لهذا الوحدة النمطية httpservletrequest طلب = ((servletRequestatTributes) requestContextholder.getRequestatTributes ()). getRequest () ؛ جلسة httpsession = request.getSession () ؛ Object o = session.getAttribute ("info") ؛ إذا (O == NULL) عودة خطأ ؛ معلومات معلومات = (معلومات) o ؛ String AuthCode = info.getuser (). getauthcode () ؛ // رمز الإذن if (authcode.contains ("؛ سلسلة [] m = الأقنعة [المستوى] .split ("،") ؛ لـ (int i = 0 ؛ i <m.length ؛ i ++) {if (modelId == integer.parseint (m [i])) {++ count ؛ } آخر {count+= 0 ؛ }}}} if (count == 0) {return false ؛ } آخر {return true ؛ }}} ج. استخدم علامة freemarker على الصفحة ، والتحكم في عرض الوحدة النمطية مخفية
معلمتان في menucall ، الأول هو مستوى الوحدة والثاني هو معرف الوحدة النمطية
على سبيل المثال:
<#if menucall (1،122)> <li style = "line-height: 250 ٪"> <a href = "#" id = "booknew"> <i> </i> الحجز </a> </li> </bef if>
ما سبق هو التنفيذ العام للتحكم في وحدة الوصول إلى المستخدم (أذونات).
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.