Недавно я работаю над проектом типа веб-сайта, который требует управления модулем доступа пользователя (разрешения), поэтому разработан и реализован простой набор функций управления разрешением.
1. Дизайн базы данных
Пользователь: Пользователи
Модули: модули
Код SQL:
/*Целевой сервер Тип: MySQLTARGE SERVER Версия: 50628FILE Кодирование: 65001Date: 2016-08-26 10: 35: 28*/set foreign_key_checks = 0;------------------------------------------- Структура таблицы для `modules`-- -------------------- DOLL TATE Auto_increment, `module` varchar (30) Null Comment по умолчанию '模块',` pid` int (10) по умолчанию Null Comment '上一级 Id', `in int (4) NULL Comment по умолчанию '级别', первичный ключ (` id`)) Engine = innodb default charset = utf8; ------------------------------ Структура таблицы для `users`-- ---------------------------- Таблица Drop If существует` users`; Создание таблицы `users` (` user_code` varchar (10), а не NULL Comment '用户代码', `user_name` varchar (40) Dalault Null Complict '用户名',‘ user_password 'varchar (100) ceflic null null. По умолчанию NULL Comment 'QQ', `msn` varchar (50) NULL Comment Comment 'MSN',` demo` varchar (100) По умолчанию NULL Comment '备注', `auth_code` Текстовый комментарий '权限码', первичный ключ (` user_code`)) innodb charset = utf8;
1. Внедорожная реализация <br /> Среда SSM+Freemarker используется в проекте для инкапсуляции разрешений в структуру данных дерева разрешений, а затем преобразует его в формат JSON.
1) Слой дисплея принимает Ztree Tree (setuserauthontree.html)
<! Doctype html> <html> <head> <#include "common/res.html"/> <script src = "$ {base.ctx} /js/layer-v2.1/laypage/laypage.js"> </script> <ссылка 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/layer.js"> </trays> </tryer> </trecuc> Style-> <link href = "$ {base.ctx} /component/ztree/css/ztreestyle/ztreestyle.css" rel = "stylesheet" type = "text/css"/> <script type = "text/javascript" src = "$ {base.ctx} /component/ztree/js/jquery.ztree.core-3.5.js"> </script> <script type = "text/javascript" src = "$ {base.ctx} /component/ztree/js/jquery.ztree.exceck-5. type = "text/css">. Blue-Madison {Border: 1px Solid #7ca7cc; Border-Top: 0;}. Подпись {фоновое цвета: #578EBE; пограничный подъем: 0; Заполнение: 0 10px; маржинальный бат: 0; Color: #fff;} </style> </head> <body> <div style = "overflow-y: auto; width: 400px; height: 550px;"> <div id = "ztree"> <ul id = "triedemo"> </ul> </div> </div> <div> <div align = "align =" align = "margin-top: 5p> <div> <div> <div align =" align = "margin-to". onclick = "editmodle ()"> ok </button> <button type = "button" id = "cancel"> close </button> </div> </div> </div> <script> $ ("document"). ready (function () {$. Data: {"ID": "$ {userId}"}, DataType: "json", успех: функция (результат) {ztreeobj = $. // загрузить дерево var ztreeobj; // Для углубленного использования, пожалуйста, см. В документации API (подробное объяснение конфигурации настройки) var setting = {view: {// dblclickexpand: false, showline: true, // Отображается ли соединение между узлами}, check: {enable: true, // nocheckinhinterit: false, chkstyle: ", chkboxpe:" hkbobobobobe "N": "ps"}, // autochecktrigger: true}, обратный вызов: {oncheck: ztreeOncheck,}}; // флажок нажал функцию события обратного вызова ZtreeOncheck (Event, TreeID, TREENODE) { /* var Ztree = $ .fn.ztree.getztreeobj ("triedemo"); var infoseNodes = ztree.getChangeCheckedNodes (); for (var i = 0; i <mediceNodes.length; i ++) {var treeNode = mediceNodes [i]; } */}; function editmodle () {var rootid = null; var midid = null; var minid = null; var treeObj = $ .fn.ztree.getztreeobj ("triedemo"); var nodes = treeObj.getCheckedNodes (); for (var i = 0; i <nodes.length; i ++) {if (nodes [i] .level == 0) {rootid = rootd+","+узлы [i] .id; } if (узлы [i] .level == 1) {midid = midid+","+узлы [i] .id; } if (узлы [i] .level == 2) {minid = minid+","+узлы [i] .id; }} if (rootd! = 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": rootid, "midid": midid, "minid": minid "," userid ":" $},}, успешно: rescove)}, успешно: if (result == "1") {layer.msg ("Успешное!"); } // ЗАКРЫТЬ $ ("#Cancel"). Click (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 suporeid * @return */@requestmapping ("getuserrightmaskbyid") @responsebody public getUserrightmaskid (httpsession sesvic sOporeId = stringUtils.isempty (suporeid)? string.valueof (session.getAttribute ("suporeId")): суббореид; // Судить, является ли это отель или лист гостиницы <map <string, object >> versionlist = this.setupservice.gethotelversions (soororeid); Object Versions = Versionslist.get (0) .get ("Versions"); Map <String, Object> HotelMap = new HashMap <String, Object> (); if ((null! = Versionslist) && (versionslist.size ()! = 0)) {// список не пуст if ("overse" .equals (versions)) {// hotel // Query Hotel Tree Tree Hotelmap = this.rightmasservice.getUserrightmaskontree (подразделение, id, "overse"); } else if ("simple" .equals (versions)) {// inn // Query Inn Tree Tree Tree Hotelmap = this.rightmasservice.getUserrightmaskontree (подраздел, id, "simple"); }} Map <string, object> resultMap = new HashMap <String, Object> (); resultMap.put («DataS», HotelMap); return jsonObject.tojSonstring (ResultMap, serializerFeature.WriteMapNullValue); } 3) Служба обслуживания инкапсулирует разрешения в структуру данных дерева, которая удовлетворяет формату Ztree
/** * @fun получить разрешения пользователя пользователя * @author pi feng * @date 2016/8/25 * @param soorareid * @param id * @param versions * @return map <строка, объект> */@override public map <string, объект> getUserrightmaskontree (строка подбалеида, строка, идентификатор, строка) {map, объект> объект> объект> объект> объект> объект> объект> объект> объект obj userrightmask = this.irightmaskdao.getuserrightmaskbysubandid (suporeid, id); Список <map <string, object >> listone = new ArrayList <map <string, object >> (); Список <map <string, object >> listtwo = new ArrayList <map <string, object >> (); // список <map <string, object >>> listThree = new ArrayList <map <string, object >> (); Список <map <string, object >>> resultList = new ArrayList <map <string, object >> (); if (version.equals ("overse")) {// отель listone = this.irightmaskdao.getrightmaskonhonhotelone (); listtwo = this.irightmaskdao.getrightmaskonhoteltwo (); // listThree = this.irightmaskdao.getrightmaskonhotelthree (); PackagingTotWotree (ResultList, Listone, Listtwo, UserRightMask); } else if (version.equals ("simple")) {// inn listone = this.irightmaskdao.getrightmaskontavernone (); listtwo = this.irightmaskdao.getrightmaskontaverntwo (); // listThree = this.irightmaskdao.getrightmaskontavernthree (); PackagingTotWotree (ResultList, Listone, Listtwo, UserRightMask); } Map <string, object> map = new hashmap <string, object> (); map.put ("data", resultlist); карта возврата; }/** * @function Encapsulate дерево первого уровня * @author pi feng * @date 2016/8/26 * @param resultlist * @param listone * @param authcode * @return void */private void packagingtoontree (list <string, object >> list <string >> listenetree (string >> othode >> othode) ыт. <listone.size (); rootmap.put ("id", listone.get (i) .get ("id")); rootmap.put ("name", listone.get (i) .get ("module")); if (validaterightmask (listone, authcode, i)! = -1) {rootmap.put ("cherced", true); } else {rootmap.put ("cherced", false); } resultList.Add (rootMap); }}/** * @function Инкапсулирует вторичное дерево * @author pi feng * @date 2016/8/26 * @param resultlist * @param listone * @param listtwo * @param authcode * @return void */private void packagingtotwotr listtwo, map <string, object >> authcode) {for (int i = 0; i <listone.size (); i ++) {list <map <string, object >> midlist = new ArrayList <map <string, object >> (); for (int j = 0; j <listtwo.size (); j ++) {if (listtwo.get (j) .get ("pid"). toString () .equals (listone.get (i) .get ("id"). toString ())) {listOne.get (i). Map <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 («Дети», миномер); if (validaterightmask (listtwo, authcode, j)! = -1) {midmap.put ("cherced", true); } else {midmap.put ("cherced", false); } midlist.add (midmap); }} Map <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 ("cherced", true); } else {rootmap.put ("cherced", false); } resultList.Add (rootMap); }}/** * @function инкапсулирует дерево третьего уровня * @author pi feng * @date 2016/8/26 * @param resultlist * @param listone * @param listtwo * @param listtwo * @param authcode * @return void */private void packagingtoThreetR Список <map <string, object >> listtwo, list <map <string, object >> listThree, map <string, object> authcode) {for (int i = 0; i <listone.size (); i ++) {list <string, object >> midlist = new arraylist <map <string, object >> (); for (int j = 0; j <listtwo.size (); j ++) {if (listtwo.get (j) .get ("pid"). toString () .Equals (listone.get (i) .get ("id"). toString ())) {listone <string, объект >> minlist = new arrillist <string >> (); объект); for (int k = 0; k <listThree.size (); k ++) {map <string, object> minmap = new hashmap <string, object> (); if (listThree.get (k) .get ("pid"). toString () .equals (listtwo.get (j) .get ("id"). toString ())) {minmap.put ("id", listThree.get (k) .get ("id")); minmap.put ("name", listthree.get (k) .get ("module")); if (validaterightmask (listThree, authcode, k)! = -1) {minmap.put ("cherced", true); } else {minmap.put ("cherced", false); } minaList.add (minmap); }} Map <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 («Дети», миномер); if (validaterightmask (listtwo, authcode, j)! = -1) {midmap.put ("cherced", true); } else {midmap.put ("cherced", false); } midlist.add (midmap); }} Map <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 ("cherced", true); } else {rootmap.put ("cherced", false); } resultList.Add (rootMap); }}/** * @function подтвердите, существует ли код разрешения в Authcode в списке * @author pi feng * @date 2016/8/26 * @param list * @param authcode * @param i * @return int */private valdaterightmas (list <string, object >> list, map <string, объект> authcode, int i) {string. authcode.get ("auth_code")! = null? authcode.get ("auth_code"). toString (): ""; if (! stringutils.isempty (rightmask)) {rightmask = rightmask.replace (";", ","); String [] array = rightmask.split (","); for (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; }}} else {return -1; } return -1; } 4) Запросите базу данных, чтобы получить разрешения пользователя
а Выберите разные уровни разрешений из таблицы модулей в соответствии с уровнем разрешения на уровне данных.
Выберите ID, Module, PID, уровень из модулей, где level = '0' выберите ID, Module, PID, уровень из модулей, где level = '1' Select ID, Module, PID, уровень из модулей, где level = '2'
беременный Уберите все разрешения пользователя (код разрешения) в таблице пользователей
Выберите Auth_code из пользователей, где user_code = 'pifeng'
в При сохранении разрешений коды разрешений между различными уровнями разделяются британским полуколоном ";", а коды разрешений между одним и тем же уровнем разделены британскими запятыми ". Например: 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,40,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,72,73,74,15,1 26,127,128,129,130,131,76,77,78,79,80,81,82,83,84,85,86,87,88,99,124,134,135,136,140,141,89,90,91,92,93,94,95,9 6,97,98,137,138,139,100 101 102 103 106 107,132 108 109,110,111112,113,114,115,116,125,117,118,119,120,121222
5) Используйте тег Freemarker, чтобы управлять тем, отображается ли модуль функции страницы в соответствии с кодом разрешения пользователя
а Конфигурация Freemarker в XML -файле
<Bean id = "freemarkerconfig"> <!-Путь загрузки шаблона-> <name = "templateLoaderPath"> <Dague>/web-inf/ftl/</value> </properation> <свойство name = "freemarkervariables"> <Map> </value = "xml_escape" value-ref = "fmxmlescape"/> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> properation </> name = "freemarkersettings"> <props> <prop key = "tag_syntax"> auto_detect </prop> <prop key = "template_update_delay"> 0 </prop> <prop key = "default_encoding"> utf-8 </prop> <prop key = " 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> <prop = "dateTime_format"> 0. <!-Обработка нулевых значений-> <prop key = "classic_compatible"> true </prop> <!-автоматически импортируйте шаблон FTL и используйте «базовый» псевдоним в качестве пространства имен-> <prop key = "auto_import"> inc/spring.ftl в качестве базы </prop> </propps> </propetion> </bean> <bean id = "fmxmles> </propetion> </bean> <bean id = id = "freemarkerviewresolver"> <name = "suffix" value = ". html"/> <name = "cache" value = "false"/> <name = "viewClass" value = "org.springframework.web.servlet.view.freemarker.freemarkerview"/> <property name = "contentype.freemarker.freemarkerview"/> <property name = "contenttyp" vewepe.freemarker.freemarkerview "/> name =" contentyp. value = "text/html; charset = utf-8"> </property> <!-Фиксированное исключение: невозможно подвергнуть атрибут сеанса «суббореид» из-за существующей модели-> <name = "allowersoverride" value = "true"/> <property name = "exposeRequestattributes" value = "true"/> <property name = "exprosessessionAttributes" value = "value"/> <propessyTyrips = "value"/> "/> <properation =". name = "explosepringmacrohelpers" value = "true"/> <!-Это значение переменной-pagecontext.request, метод использования страницы: request.contextpath-> <name = "requestContextAttribute" value = "request"/> <Property name = "AttributesMap"> <Pap> <!-Define name name name метода FreeMarker-> <> <> <! в классе инструментов, который мы определили ранее-> <bean/> </inpit> </map> </property> </bean>
беременный Напишите класс, чтобы наследовать класс Templatemethodmodel и реализовать пользовательский метод Freemarker для управления, отображает ли модуль страницы вход в систему и сохраните код разрешения пользователя в сеансе, а затем получите разрешение из сеанса. Вот пример:
Менюфункция открытого класса реализует Templatemethodmodel {@Override Public Object Exec (список arg0) Throws TemplateModeLexception {int level = integer.valueof (arg0.get (0) .toString ()); // уровень модуля int modelid = integer.valueof (arg0.get (1) .toString ()); // идентификатор модуля int count = 0; // сеанс записи, независимо от того, код разрешения для этого модуля httpservletrequest request = (((servletrequestattributes) requestextextholder.getRequestattributes ()). GetRequest (); Httpsession session = request.getsession (); Object O = session.getAttribute ("info"); if (o == null) вернуть false; Информация = (информация) o; String authcode = info.getUser (). GetAuthcode (); // код разрешения if (authcode.contains (";")) {string [] masks = authcode.split (";"; "); String [] m = маски [level] .split (","); for (int i = 0; i <m.length; i ++) {if (modelid == integer.parseint (m [i])) {++ count; } else {count+= 0; }}}} if (count == 0) {return false; } else {return true; }}} в Используйте тег Freemarker на странице, и управляйте отображением модуля скрыто
Два параметра в Menucall, первым является уровень модуля, а второй - идентификатор модуля
Например:
<#if menucall (1,122)> <li style = "line-hight: 250%"> <a href = "#" id = "booknew"> <i> </i> бронирование </a> </li> </#if>
Выше приведено общая реализация управления модулем доступа пользователя (разрешения).
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.