亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 29
粉絲 1
評(píng)論 0
訪問量 43581
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
基于ThinkPHP6.0的一個(gè)通用后臺(tái)管理系統(tǒng)
祥子弟弟
原創(chuàng)
3422人瀏覽過

RBAC(角色訪問控制)設(shè)計(jì)模型的后臺(tái)管理系統(tǒng)

RBAC 是一套成熟的權(quán)限模型,元素包括:用戶、角色、權(quán)限。在 RBAC 模型中,權(quán)限與角色相關(guān)聯(lián),用戶通過成為對(duì)應(yīng)角色的成員,從而得到這些角色的權(quán)限。即用戶關(guān)聯(lián)角色,角色關(guān)聯(lián)權(quán)限,可實(shí)現(xiàn)系統(tǒng)權(quán)限的靈活配置。在本篇文章介紹到的后臺(tái)管理系統(tǒng)中,角色-用戶是一對(duì)多的關(guān)系。

在本項(xiàng)目中前端框架使用的是 adminLTE,可以在本項(xiàng)目目錄文件的 public 文件夾下找到。
數(shù)據(jù)庫是 MySQL,一共有 6 張數(shù)據(jù)表(本來是 4 張的,后邊加了個(gè)文章管理,多了個(gè)文章和文章分類表)

項(xiàng)目模塊

1. 登錄/退出模塊

主要實(shí)現(xiàn)了登錄和退出功能還有非法訪問的功能。
由于是一個(gè)后臺(tái)管理系統(tǒng),所以沒有涉及注冊(cè)模塊。作為一個(gè)登陸頁面,而且是一個(gè)后臺(tái)管理的登錄頁面,那么就不必那么的花哨,盡量的簡潔美觀就行,你可以給它起一個(gè)好聽的名字,“xxx 后臺(tái)管理”之類的。

接下來就是它需要實(shí)現(xiàn)的功能了,登錄頁面的邏輯是很簡單的:

前端要做的就是給用戶一個(gè)登錄登錄框,其中有用戶名和密碼以及驗(yàn)證碼(注意:這里只是我想要的是讓用戶是用戶名密碼登錄,你可以去設(shè)計(jì)其他的,可以是郵箱呀之類的等等),在前端的驗(yàn)證碼這塊兒使用的是 ThinkPHP 的一個(gè)擴(kuò)展框架,topthink/think-captcha ,你可以直接在你的項(xiàng)目目錄下使用 composer 命令直接去將它加載進(jìn)來。在密碼和用戶名還有驗(yàn)證碼驗(yàn)證這塊兒是用的jquery-validation,后邊涉及到的表單驗(yàn)證都是使用的它,對(duì)于驗(yàn)證消息,我使用了 layui 的彈出層組件layer,后邊的所有的提示消息,警告消息都是使用的layer。
驗(yàn)證碼這塊兒是需要注意的,如果你想要去重新定義或者說是設(shè)置你的驗(yàn)證碼,你可以在 config 目錄下的 captcha.php 中去添加一個(gè)額外的驗(yàn)證碼信息,然后在 Login 控制器下重新定義一個(gè)公共方法,讓它去完成重新生成驗(yàn)證碼的功能。如果你像我一樣重新定義了驗(yàn)證碼的話,那么你就會(huì)發(fā)現(xiàn)重新刷新頁面后,你的驗(yàn)證碼點(diǎn)擊之后是無法進(jìn)行刷新的,驚不驚喜,意不意外。這時(shí)候,你先不要著急,可以先不去用自定義的驗(yàn)證碼,回到原來的驗(yàn)證碼,看看點(diǎn)擊之后頁面之中會(huì)有什么樣的變化,你會(huì)發(fā)現(xiàn)它的查詢字符串是會(huì)變化的,它后邊多了個(gè) id,這時(shí)候是不是就醒悟了呢,你可以給這張驗(yàn)證碼圖片添加一個(gè)點(diǎn)擊事件,點(diǎn)擊之后重新的設(shè)置它的 src 屬性的值就行。這樣驗(yàn)證碼的問題就解決了。

后端要做的就是將用戶輸入的信息獲取到,然后再數(shù)據(jù)庫中查找信息,找到之后去判斷用戶名和密碼是否匹配,如果不匹配,就需要返回一個(gè)錯(cuò)誤信息了,這個(gè)錯(cuò)誤信息最好是一個(gè)模糊信息,最好就是”用戶名或密碼不正確” 而不是指出哪一個(gè)不正確。如果匹配的結(jié)果是成功的,那么你就需要將當(dāng)前的到的用戶名和數(shù)據(jù)表中查詢到的用戶 id 放到 Session 中了,tp6 中默認(rèn)是關(guān)著的,你需要在全局中間件定義文件 middleware.php 中將它開啟,開啟之后你就可以使用 Session 了,因?yàn)樵诜欠ㄔL問功能中會(huì)用到當(dāng)前登錄的用戶信息。

我們還需要一個(gè)中間控制器,這個(gè)中間控制器繼承自 BaseController,這個(gè)中間控制器的作用就是非法訪問(沒有登陸成功的不允許訪問,直接訪問非登錄頁面強(qiáng)制跳轉(zhuǎn)到登陸頁面)登錄之后的權(quán)限認(rèn)證(如果當(dāng)前用戶不具有這個(gè)功能的權(quán)限,會(huì)直接給個(gè)彈窗,然后返回到上一個(gè)頁面),在登錄之后才能訪問的頁面都要繼承自這個(gè)中間控制器,這樣就做到了非法訪問的功能。

2.主頁面模塊

主頁面的前端頁面我用的是 adminLTE 中的 index.html 來修改的,它需要做到的效果就是能夠根據(jù)不同的用戶登錄,然后自動(dòng)去渲染菜單欄,還有用戶的退出登錄和清除緩存的功能。

自動(dòng)渲染無限級(jí)菜單:這個(gè)就需要去數(shù)據(jù)庫中獲取對(duì)應(yīng)角色的權(quán)限了,然后再根據(jù)角色對(duì)用戶進(jìn)行權(quán)限綁定,然后還需要一個(gè)無限級(jí)菜單的劃分,這樣對(duì)于數(shù)據(jù)的處理就可以傳到前端進(jìn)行渲染了。最難的部分應(yīng)該就是無限級(jí)菜單的劃分了,這個(gè)就得根據(jù)數(shù)據(jù)表中的數(shù)據(jù)是怎樣的來設(shè)計(jì)處理函數(shù)了,我的菜單數(shù)據(jù)表中的有一個(gè) pid 字段,它代表著當(dāng)前菜單的上級(jí)菜單的 id 值,就可以對(duì)當(dāng)前用戶所具有的權(quán)限來進(jìn)行查詢,獲取到他的權(quán)限字段的數(shù)據(jù),然后再對(duì)這些權(quán)限根據(jù)菜單表中的 pid 字段進(jìn)行處理,就可以得到一個(gè)想要的數(shù)據(jù)了。

  1. // 無限級(jí)分類--循環(huán)一級(jí)導(dǎo)航和子導(dǎo)航,將結(jié)果組合成一個(gè)多維數(shù)組
  2. public static function ruleLayer($rule, $pid=0): array
  3. {
  4. // 聲明一個(gè)空數(shù)組,用來存放生成的多維數(shù)組
  5. $rules = array();
  6. foreach ($rule as $vl){
  7. // 判斷當(dāng)前的菜單是否是主菜單
  8. if ($vl['pid'] == $pid){
  9. // 如果是主菜單,就給它添加一個(gè)child字段,然后將所有pid===它的id的所有菜單賦給這個(gè)child字段
  10. $vl['child'] = static::ruleLayer($rule, $vl['id']);
  11. $rules[] = $vl;
  12. }
  13. }
  14. return $rules;
  15. }

前端渲染就可以使用 tp6 自己封裝的 volist,然后進(jìn)行二級(jí)菜單的渲染。

退出登錄:這是一個(gè)很簡單的邏輯實(shí)現(xiàn),點(diǎn)擊退出登錄后,在后端將 session 中的數(shù)據(jù)清空,然后再將頁面重新定向到登陸頁面就可以了,可以使用 redirect()函數(shù)進(jìn)行操作。

清除緩存:清除緩存,在 tp6 中就是清除掉 runtime 目錄下的當(dāng)前應(yīng)用所產(chǎn)生的日志文件,還有一些緩存數(shù)據(jù),這個(gè)操作就有些麻煩了,因?yàn)?rmdir()函數(shù)它只能刪除一個(gè)空的文件夾,也就是說,想要?jiǎng)h除一個(gè)文件夾,你得將這個(gè)文件夾下的所有內(nèi)容全部的刪掉,首先要獲取到當(dāng)前的應(yīng)用的運(yùn)行目錄,可以直接使用 tp6 封裝的助手函數(shù)來獲取,app()->getRuntimePath();,然后再對(duì)當(dāng)前文件夾下的內(nèi)容進(jìn)行刪除,具體函數(shù)實(shí)現(xiàn)如下.

  1. function delete_dir_file($dir)
  2. {
  3. // 聲明一個(gè)初始狀態(tài),默認(rèn)情況下緩存未被刪除
  4. $res = false;
  5. // 檢驗(yàn)一個(gè)目錄是否真實(shí)
  6. if (is_dir($dir)){
  7. // 成功打開目錄流,返回值是一個(gè)resource類型數(shù)據(jù),如果不成功,返回false
  8. if ($handle = opendir($dir)){
  9. while (($file = readdir($handle)) != false){
  10. // echo "filename: " . $file . "<br>";
  11. /*
  12. * filename: . 代表當(dāng)前訪問目錄存在同級(jí)目錄
  13. * filename: .. 代表存在上級(jí)目錄
  14. * filename: log 子目錄
  15. * filename: session 子目錄
  16. * filename: temp 子目錄
  17. */
  18. if ($file !== '.' && $file !== '..'){
  19. // 判斷是否是一個(gè)目錄
  20. if (is_dir($dir . '\\' . $file)){
  21. // 拼接目錄
  22. // 目錄只有為空的情況下才能刪除
  23. delete_dir_file($dir . '\\' . $file);
  24. }else{
  25. // 不是目錄的情況,直接刪除
  26. // unlink只能刪除一個(gè)文件
  27. unlink($dir . '\\' . $file);
  28. }
  29. }
  30. }
  31. }
  32. // 關(guān)閉目錄句柄
  33. closedir($handle);
  34. // 目錄為空時(shí)刪除目錄
  35. if ($dir !== "E:\\Visual Studio Code\\harbor\\tp\\runtime\\admin\\session\\"){
  36. if (rmdir($dir)){
  37. $res = true;
  38. }
  39. }
  40. }
  41. return $res;
  42. }

在主頁面還可以將當(dāng)前登錄的用戶信息也渲染出來,獲取到當(dāng)前 session 中的值,然后渲染到頁面中.

3.用戶管理模塊

用戶管理模塊的數(shù)據(jù)顯示這里我使用了 DataTables 表格插件,它是一款 jquery 表格插件,可以在DataTables 中文網(wǎng)查看它的使用教程。
用戶管理模塊主要是實(shí)現(xiàn)了用戶的新增,編輯,刪除功能,對(duì)于角色是超級(jí)管理員的用戶,設(shè)置了不允許修改自己的權(quán)限還有不允許創(chuàng)建一個(gè)新的超級(jí)管理員。

對(duì)于用戶管理模塊首頁的數(shù)據(jù)渲染,由于只涉及到了一張表,所以只需要注意 DataTables 插件要求返回的數(shù)據(jù)就行了,然后從數(shù)據(jù)庫中取出查到的數(shù)據(jù),返回給前端頁面來進(jìn)行渲染,如果在 DataTables 中設(shè)置了分頁和排序要求,那么在設(shè)計(jì)數(shù)據(jù)庫查詢語句的時(shí)候就必須要添加上。

用戶新增:用戶新增涉及到兩張數(shù)據(jù)表,一張是用戶表,一張是用戶-角色關(guān)聯(lián)表,首先在前端頁面的顯示時(shí),需要將角色表中的角色信息全部都獲取出來,然后將獲取到的角色信息傳給前端進(jìn)行一個(gè)下拉列表的渲染,然后就是前端進(jìn)行添加一個(gè)新的用戶操作,然后將數(shù)據(jù) post 給后端,后端接收到數(shù)據(jù)之后,需要對(duì)用戶名進(jìn)行查重判斷,如果不重復(fù),先更新用戶表,再更新用戶-角色關(guān)聯(lián)表,用戶-角色關(guān)聯(lián)表是在用戶表更新成功的前提下進(jìn)行更新的。如果重復(fù),直接退出腳本,返回給前端一個(gè)信息,重定位到用戶名那里。

用戶編輯:用戶編輯同樣的涉及到了兩張表,用戶表和用戶-角色關(guān)聯(lián)表,編輯的時(shí)候需要獲取到當(dāng)前編輯的用戶信息,然后渲染到頁面,所以,可以通過 get 方法,將當(dāng)前編輯的用戶的 uid 傳給后端,然后后端在數(shù)據(jù)庫中查找記錄,然后返回給前端進(jìn)行渲染。更新的時(shí)候可新增一樣,需要先對(duì)用戶表進(jìn)行更新,如果更新成功,再去對(duì)用戶-角色關(guān)聯(lián)表進(jìn)行更新。

用戶刪除:也涉及到兩張表,用戶表和用戶-角色關(guān)聯(lián)表,再點(diǎn)擊刪除后,需要給用戶一個(gè)提示信息,讓他確定是否刪除,然后再對(duì)刪除方法進(jìn)行調(diào)用,刪除之后,給用戶一個(gè)刪除成功提示。

4.規(guī)則管理模塊

規(guī)則管理是對(duì)菜單頁面的顯示,新增一級(jí)菜單,新增子菜單,編輯菜單還有刪除菜單功能的實(shí)現(xiàn)。規(guī)則管理同樣的使用了 DataTables 表格插件,不過對(duì)于上級(jí)菜單和子菜單如果需要進(jìn)行效果展示的話,就需要對(duì)菜單進(jìn)行無限級(jí)菜單處理,經(jīng)過無限級(jí)菜單分類之后,就可以將數(shù)據(jù)傳到前端進(jìn)行渲染了。

  1. // 無限級(jí)菜單分類, 前端規(guī)則列表分類
  2. public static function RuleList($rule, $pid=0, $lev=1): array
  3. {
  4. $arr = array();
  5. foreach ($rule as $r){
  6. if ($r['pid'] == $pid){
  7. $r['lev'] = $lev;
  8. $arr[] = $r;
  9. $arr = array_merge($arr, static::RuleList($rule, $r['id'], $lev+1));
  10. }
  11. }
  12. return $arr;
  13. }

新增菜單:新增菜單這塊兒有兩個(gè)選擇,一個(gè)是新增一個(gè)一級(jí)菜單,一個(gè)是新增一個(gè)子菜單,新增子菜單的時(shí)候是點(diǎn)擊每個(gè)菜單規(guī)則后邊的按鈕,新增一級(jí)子菜單的時(shí)候是點(diǎn)擊最上邊的新增按鈕,兩個(gè)按鈕唯一不同的地方是在新增子菜單的地方,get 時(shí)候的參數(shù)不同,子菜單的 url 的查詢語句中增加了 pid,然后就可以在后端接收的時(shí)候進(jìn)行檢查,如果 get 到 pid 那就是新增一個(gè)子菜單,如果沒有那就是新增一個(gè)一級(jí)菜單。

編輯菜單:編輯菜單需要獲取到當(dāng)前菜單的 id,然后在數(shù)據(jù)庫中查找到當(dāng)前菜單的信息,返回前端進(jìn)行渲染,然后用戶修改當(dāng)前規(guī)則信息,返回?cái)?shù)據(jù)給后端,后端將修改后的信息更新到數(shù)據(jù)庫中去。

刪除菜單:刪除菜單和刪除角色的功能類似,不過是刪除菜單只涉及到一張數(shù)據(jù)表,只需要對(duì)一張數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行刪除就可以了,刪除菜單首先要做的就是查詢當(dāng)前菜單下有沒有子菜單,將 id 當(dāng)作 pid 傳入數(shù)據(jù)表中進(jìn)行查詢,如果存在,就不能進(jìn)行刪除。

5.角色管理模塊

角色管理模塊中最難的就是一個(gè) checkbox 復(fù)選框的處理,角色模塊包括了角色的刪除,新增和編輯,刪除角色和上邊的思路是一樣的,而編輯和添加就不一樣了,編輯和添加需要做到的是,首先在前端頁面中需要將所有的規(guī)則列舉出來,要有層級(jí)感,在編輯的時(shí)候需要對(duì)當(dāng)前角色所擁有的權(quán)限全部都選中。同樣,在后端獲取到所有的菜單信息時(shí),要對(duì)數(shù)據(jù)進(jìn)行無限級(jí)菜單的處理,然后再傳入前端進(jìn)行渲染。

6.數(shù)據(jù)庫模塊

本項(xiàng)目目前一共涉及到 6 張表,其中有 4 張表是現(xiàn)在用到的,另外兩張表是我添加的擴(kuò)展功能所設(shè)計(jì)的數(shù)據(jù)表,現(xiàn)在用到的表有: 1. 用戶表“users”,2. 角色表“auth_role”,3. 規(guī)則表“auth_rule”, 4. 角色-用戶關(guān)聯(lián)表“users_role”.

本項(xiàng)目的所有源碼都可在 Git 上查看。

點(diǎn)擊這里查看源碼

本博文版權(quán)歸博主所有,轉(zhuǎn)載請(qǐng)注明地址!如有侵權(quán)、違法,請(qǐng)聯(lián)系admin@php.cn舉報(bào)處理!
全部評(píng)論 文明上網(wǎng)理性發(fā)言,請(qǐng)遵守新聞評(píng)論服務(wù)協(xié)議
0條評(píng)論
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學(xué)習(xí)!
    全站2000+教程免費(fèi)學(xué)