1. 程式人生 > >利用ZTree連結資料庫實現 [許可權管理]

利用ZTree連結資料庫實現 [許可權管理]

最近想研究許可權管理,看群裡有人發了ZTrees模板,我看了下,覺得筆easyUI操作起來更靈活些,於是就開始研究了。

剛開始從網上找了找了個Demo,當然這個並沒有實現許可權啥的,但實現了前臺呼叫Ajax給後臺傳遞資料,這就有思路了,那個我單獨整理了一片博文,可以在看這篇博文前先看看http://www.cnblogs.com/shuai7boy/p/5645888.html

下面就是新增資料庫互動和許可權管理這塊了。

我是這麼設計的:首先設計許可權就設計到了使用者登陸,所以有一個登陸頁面,然後使用者登陸後根據不同的使用者展示不同的後臺資訊。

然後問題又來了,在我執行專案時,首先開啟的就是後臺介面,這就不對了,所以還得控制它不登入就不能訪問後臺頁面。

這就是大概思路:下面先放張圖片說說細節~

 從上面可以看到一共設計了三張表,一個存放登陸資料,一個存放資訊展示資料,一箇中間表控制權限,將登陸資料和展示資料錶鏈接起來。

當用戶登陸成功後,根據登陸使用者名稱獲取主鍵id,然後根據id獲取具有的許可權,也就是獲取中間表對應的資料,然後取得一個List<int>集合,然後要傳遞引數,根據引數篩選要展示哪些資料。注意傳參時,不能直接傳遞List集合,所以得弄成想辦法弄成字串型別,然後傳遞過去後再弄成陣列型別。

---------以上是設計思路,下面是程式碼分析-----------

這個專案我用的是MVC框架做的,一共寫了三個控制器,分別是BaseController(基類控制)、HomeController(資訊展示控制)、LoginController(登陸控制)。

 BaseController程式碼展示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace zTreeDemo.Controllers
{
    public class BaseController : Controller
    {
        //
        // GET: /Base/

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            
if (filterContext.HttpContext.Session["LoginUser"]==null) { filterContext.HttpContext.Response.Redirect("Login/Index"); } } } }
View Code

LoginController程式碼展示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using www.zTree.BLL;

namespace zTreeDemo.Controllers
{
    public class LoginController : Controller
    {
        //
        // GET: /Login/

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult LoginCheck()
        {
            string strName = Request["loginName"];
            string strPwd = Request["loginPwd"];
            TreeBLL bll = new TreeBLL();
            bool b=bll.LoginCheck(strName, strPwd);
            if (b)
            {
                Session["LoginUser"] = strName;
                //根據登入名查詢主鍵id 然後根據主鍵id獲得對應哪些樹 然後將引數傳遞過去 登陸跳轉
                int id=bll.GetIdByLoginName(strName);
                List<int> listN = bll.GetLogForTable(id);
               // Response.Redirect(Url.Action("GetData","Home"));
                //Console.Write(listN);
                string str = null;
                for (int i = 0; i < listN.Count; i++)
                {
                    str += listN[i].ToString()+",";
                }
                int n=str.LastIndexOf(',');
                str=str.Substring(0,n);
                return Content(str);
            }
        
             return Content("您輸入的使用者名稱或者密碼錯誤!");
           
        }
    }
}
View Code

LoginController-Index.cshtml程式碼展示:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/js/jquery-1.4.4.min.js"></script>
    <script>
        $(function () {          
                $('form').submit(function () {
                    var rec = $(this).serialize();
                    $.get("/Login/LoginCheck", rec, function (_data) {
                        if (_data == "您輸入的使用者名稱或者密碼錯誤!") {
                            alert(_data);
                            return;
                        }
                        document.location.href = "/Home/Index?data=" + _data;
                    })
                    return false;
                })                
        });
    </script>
</head>
<body>
    <form id="frm1">
        <table>
            <tr>
                <td>登入名:</td>
                <td><input type="text" name="loginName" /></td>
            </tr>
            <tr>
                <td>密碼:</td>
                <td><input type="text" name="loginPwd" /></td>                
            </tr>
            <tr>
                <td colspan="2"><input type="submit" id="btnOK" value="開始登陸" /></td>
            </tr>
        </table>
    </form>
</body>
</html>
View Code

HomeController程式碼展示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using www.zTree.BLL;
using www.zTree.Model;

namespace zTreeDemo.Controllers
{
   
    public class HomeController : BaseController
    {
        //
        // GET: /Home/
       
        public ActionResult Index()
        {
            if (Request["data"]!=null)
            {
                System.Web.Caching.Cache cache = HttpRuntime.Cache;
                //Session["data"] = Request["data"];
                cache.Insert("data", Request["data"]);
               
            }             
            return View();
        }
        public ActionResult Edit()
        
        {
            var list = GetData();
            return Json(list, JsonRequestBehavior.AllowGet);
        }
       
        public List<Tree> GetData()
        {

            //獲取傳送過來的資料
            System.Web.Caching.Cache cache = HttpRuntime.Cache;
            //將資料分割
            string recStr = cache.Get("data").ToString();
            string[] recN=recStr.Split(',');

            List<Tree> tree = new List<Tree>();
            //從資料庫獲取資料拼接返回前臺
            TreeBLL bll = new TreeBLL();
            //根據登陸使用者判讀是哪個使用者 然後根據使用者決定傳遞哪個id過去
           //迴圈遍歷字串 轉換為int型別 然後開始查詢
            for (int i = 0; i < recN.Length; i++)
            {
                int n = int.Parse(recN[i]);
                List<Tree> rec = bll.GetTreeList(n);
                for (int j = 0; j < rec.Count; j++)
                {
                    tree.Add(new Tree { id = rec[j].id, pId = rec[j].pId, name = rec[j].name, icon = rec[j].icon });
                }

            }

            //tree.Add(new Tree { id = 1, pId = 0, name = "蔬菜", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            //tree.Add(new Tree { id = 2, pId = 0, name = "動物", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            //tree.Add(new Tree { id = 3, pId = 0, name = "人類", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            //tree.Add(new Tree { id = 4, pId = 1, name = "茄子", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            //tree.Add(new Tree { id = 5, pId = 2, name = "熊貓", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            //tree.Add(new Tree { id = 6, pId = 3, name = "胡歌", icon = "../Script/css/zTreeStyle/img/diy/1_open.png" });
            return tree;
        }
        //public class Tree
        //{
        //    public int id { get; set; }
        //    public int pId { get; set; }
        //    public string name { get; set; }
        //    public string icon { get; set; }
        //}
        
    }
}
View Code

HomeController-Index.cshtml程式碼展示:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>zTreeTest</title>
    <link href="~/css/demo.css" rel="stylesheet" />
    <link href="~/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" />
    <script src="~/js/jquery-1.4.4.min.js"></script>
    <script src="~/js/jquery.ztree.core-3.5.min.js"></script>
    <script type="text/javascript">
        var tree;
        $.ajax({
            type: "Get",
            url: "@Url.Action("Edit","Home")",
            //async: false,
            success: function (data) {
                tree = data;
                $.fn.zTree.init($("#treeDemo"), setting, tree);
            }
        });       
        var setting = {
            data: {
                simpleData: {
                    enable: true
                }
            }
        };
    </script>
</head>
<body>
      <a href="/Login/Index">回到登入頁</a>
        <h1>自定義圖示--icon屬性</h1>
        <h6>[檔案路徑:core/custom_icon.html]</h6>
        <div class="content_wrap">
            <div class="zTreeDemoBackground left">
                <ul id="treeDemo" class="ztree"></ul>
            </div>
            <div class="right">
                <ul class="info">
                    <li class="title">
                        <h2>1、setting 配置資訊說明</h2>
                        <ul class="list">
                            <li>自定義圖示不需要對 setting 進行特殊配置</li>
                        </ul>
                    </li>
                    <li class="title">
                        <h2>2、treeNode 節點資料說明</h2>
                        <ul class="list">
                            <li>利用 節點資料的 icon / iconOpen / iconClose 屬性實現自定義圖示</li>
                            <li class="highlight_red">詳細請參見 API 文件中的相關內容</li>
                        </ul>
                    </li>
                    <li class="title">
                        <h2>3、其他說明</h2>
                        <ul class="list">
                            <li class="highlight_red">由於時間關係,例子直接採用 png 圖片,如果需要解決 ie6 下 png 圖片的透明問題,請針對 ie6 製作特殊的 gif 圖片或者利用 css filter 解決</li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
</body>
</html>
View Code

學習心得:當控制器中遇到使用全域性變數時,這時因為每次請求都會重新執行,那麼上次全域性變數賦的值,下次就可能請求不到了,及請求的是空值,那麼這時可以考慮用Cookie(建議用Cookie,因為這樣不會訪問資料庫)或Session實現儲存獲取資料。