<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                https://blog.csdn.net/niuniuasb/article/details/60959029 1、當你 require ThinkPHP之后,會自動在App目錄下生成 common, Home, Runtime 三個文件夾。 2、輸入網址?http://localhost/blog/app/index.php/home/index/index 出現 ~~~ 無法加載控制器:index 錯誤位置 FILE: D:\xampp\htdocs\blog\ThinkPHP\Library\Think\App.class.php  LINE: 90 ~~~ 原因解析:默認情況下是大小寫敏感,為了方便,我們可以更改設置: ~~~ <?php return array( //url 地址大小寫敏感設置 'URL_CASE_INSENSITIVE' => true, ); ~~~ 3、新建一個控制器,注意命名空間,以及繼承等。 ~~~ <?php namespace Home\Controller; use Think\Controller; class UserController extends Controller{ function login(){ $this -> display(); } } ~~~ 4、當寫好控制器后,我們需要添加相應的視圖文件。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221102613335-1771708786.png) 5、連接數據庫。對于數據庫的連接,我們同樣需要更改設置。這里我們使用的是mySQL,具體如下圖所示。如果使用的端口號是默認的,密碼為空,就不用填寫。注意數據庫的名字和前綴。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221103231570-1812616255.png) 6、在對數據庫進行操作之前,我們得先建一個 Model 類,方面和后續的使用。我們在和Home同目錄下新建一個 Model 文件夾,寫好代碼。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152156210-1402054729.png) 7、然后我們開始調用 Model 來操作數據庫,輸入網址,看到下面的內容就可以知道連接數據庫成功了。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152312366-833420477.png)![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152435241-2070099152.png) 8、接下去,我們把之前寫好的前端和后臺的html等文件都放進來,為了方便后續的操作,我們要對文件進行分類,最終效果如下所示: ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152819241-166954367.png)? ?![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221153107288-2033869153.png)? ?![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152905648-874242955.png)? ?![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221152927679-1695762955.png) 其中public 存放一些樣式,js文件,圖片等。 9、如果我們要訪問這些 html 文件的話,還必須添加相應的控制器等。輸入網址,訪問,我們會發現頁面缺少圖片和樣式。由于 css, js 文件位置的變動,我們必須重新修改這些 url 或者 src 屬性。因為這些文件經常用到,所以我們添加了常量,并在html文件中進行修改。這樣我們就能看到最終的頁面了。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221160201351-1412114311.png) ?![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221160327554-1115358088.png) 10、采用 Smarty 模板。 這時候只需要更改設置就好。 ![](http://images2015.cnblogs.com/blog/916005/201702/916005-20170221162334913-1750513590.png) 11、下面我們開始演示注冊模塊,這里面涉及很多內容。 首先我們編寫一個注冊用的 Model, 主要是用來驗證數據。 ~~~ <?php namespace Model; use Think\Model; class UserModel extends Model{ protected $patchValidate = true; //批量驗證 protected $_validate = array( array('username','require','用戶名必須!'), //默認情況下用正則進行驗證 array('password','require','password必須!'), array('password2','password','兩個必須相等',0,'confirm'), array('user_email','email','郵箱格式錯誤',0), ); } ~~~ yu 與此同時我們還需要在控制器上編寫相應的代碼。太長了,不截圖,還是放代碼實在 ~~~ <?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { function login(){ $this -> display(); } function register(){ // 調用UserModel $user = new \Model\UserModel(); if(!empty($_POST)){ $z = $user -> create(); if(!$z){ var_dump($user -> getError()); } // 把數據添加到數據庫中去 $rst = $user -> add(); // 判斷是否添加成功 if($rst){ echo "success"; }else{ echo "error"; } } $this -> display(); } } ~~~ 12、登陸模塊。用戶登錄的時候,需要對用戶名和密碼進行判斷,為了防止 sql 注入攻擊,我們首先通過用戶名查詢存不存在這條數據,然后再來比對密碼是否匹配。當然實際上保存的密碼應該是加密后的,此處為了方便,沒有對密碼進行加密。此外,除了用戶名密碼,還有驗證碼的,因此還需要對驗證碼進行設置,比如多少位啊,有沒有背景圖片,寬和高的長度啊等。具體見如下代碼。 為此,我們編寫了一個 Model, 內部有一個函數,用來查詢用戶名密碼是否正確。 ~~~ <?php namespace Model; use Think\Model; class ManagerModel extends Model { function checkNamePwd($name, $pwd){ $info = $this -> getByMg_name($name); var_dump($info); if($info != null){ if($info['mg_pwd']!= $pwd){ return flase; }else{ return $info; } }else{ return false; } } } ~~~ 同時存在一個對應的控制器,主要是對驗證碼的設置與檢驗,以及對用戶名和密碼判斷,判斷正確后可能會進行跳轉等等。 ~~~ <?php namespace Admin\Controller; use Think\Controller; class ManagerController extends Controller{ function login(){ //var_dump($_POST); if(!empty($_POST)){ // 首先檢查驗證碼是否正確 $verify = new \Think\Verify(); if(!$verify -> check($_POST['captcha'])){ echo "驗證碼錯誤"; }else{ // 在 Model 里面制作一個專門方法進行驗證 echo "343"; $user = new \Model\ManagerModel(); // 此處調用 Model 中的函數進行檢查 $rst = $user -> checkNamePwd($_POST["mg_username"], $_POST["mg_password"]); if($rst ===flase){ echo "用戶名或密碼錯誤"; }else{ // 保存在 session 中 session('mg_username',$rst['mg_name']); session('mg_id', $rst[mg_id]); // session (null); 清空全部; $this -> redirect('index/index', array('id'=>100, name=>'tom')); } } } $this -> display(); } // 驗證碼設置 function verifyImg(){ $config = array( 'useImgBg' => false, // 使用背景圖片 'fontSize' => 16, // 驗證碼字體大小(px) 'imageH' => 40, // 驗證碼圖片高度 'imageW' => 100, // 驗證碼圖片寬度 'length' => 1, // 驗證碼位數 ); $verify = new \Think\Verify($config); var_dump($verify->entry()); } } ~~~ ?13、緩存設置。使用原理,對于某些常用的數據,我們可以進行緩存,還有對于數據庫中變化不快的數據,也可以進行緩存。第一次先從數據庫中獲取,然后放入緩存中,設置有效期。下次訪問的時候,就不用從數據庫進行查詢了,直接從緩存獲取。 ~~~ function y1(){ var_dump($this -> y2()); } function y2(){ //被其他方法調用,獲得指定信息 $info = S('goods_info'); if($info){ return $info; }else{ // 沒有緩存就從數據庫獲取數據 $dt = "apple5s".time(); S('goods_info',$dt,10); return $dt; } } ~~~ y2 是通用方法,之所以不直接在 y1 里寫,是因為,有時候可能不止只有 y1 需要, 其他函數也會用到,因此,我們就將其放在 y2 里面。 14、附件上傳。 15、基于角色的訪問權限控制 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305183829173-2016497917.png) 對角色進行權限劃分 ?????? 員工直接面對角色、角色直接面對具體操作權限 ?????? 新員工入職只需要確定其角色,他的權限就由角色來確定 ?????? 員工\-------------角色\--------------操作權限 ?????? 現在權限分配非常容易,也非常科學 ?????? 新員工入職公司只需要把其角色劃分好,它的權限有角色確定 sw\_manager 后臺用戶管理員表 sw\_role???? 角色表 sw\_auth???? 具體權限表 1.????? 數據模擬 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305184845876-1210248844.png) ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305184753610-1324220960.png) ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305185116266-1387095711.png) 2.?通過已經模擬好的數據進行相關程序開發 a)? 用戶登錄系統,左邊顯示權限按鈕會根據具體角色顯示 b)??在左邊(Admin/Index/left)顯示對應的權限信息 * 用戶登錄系統顯示權限信息$\_SESSION\[‘mg\_id’\] * 根據session信息獲得角色role\_id信息 * 根據角色id信息獲得權限列表ids信息 * 根據權限ids信息查詢具體權限信息進而顯示 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305185335282-770392056.png) 雖然給用戶及角色分配了權限,也實現對應的權限的顯示 但是用戶可以通過顯示修改url地址達到訪問其他權限的目的 **解決:** ?????? 每次用戶訪問的控制器和方法都需要和對應的角色里邊的ac信息進行比較 ?????? ac信息里邊存在這個控制器和方法就允許訪問,否則禁止訪問 ??**???? 技術角度:** 在每個控制器被實例化執行的同時就判斷當前的控制器和方法是否允許角色訪問 為了程序維護方便,給普通控制器制作父類控制器,在父類控制器的構造方法里邊做控制器和方法的過濾工作。 普通控制器引入新的父類AdminController, 1.??在新父類控制器AdminController里邊實現每次訪問控制器和操作方法過濾 a)??具體限制分三種情況 * 自定義方法不進行權限限制(Index/head? left? right?? Manager/login) * 系統管理員也不進行權限限制 * 當前用戶允許訪問的權限就是角色對應的權限 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305185706141-1799395492.png) ?16.角色維護 Admin/Role/showlist?? 顯示角色信息 把許多復選框的權限表單的信息收集起來保存到角色的數據表中 在設置權限的時候,把已經有的權限給顯示出來(復選框有被選中) 當前角色知道,當前角色對應的權限ids也知道,也可以把ids由字符串變為數組 遍歷權限的時候把id與ids的數組做比較,判斷是否是其中的一個元素,進而設置checked屬性? in\_array() 1.????? 制作表單顯示具體被分配權限信息 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194658470-1972124810.png) 2.????? 收集權限信息在RoleModel模型里邊保存 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194728016-337632919.png) 3.????? 分配權限時候,已經有的權限,復選框需要被選中 ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194745407-449481083.png)? 4.????? 展示分配權限信息的表單對應控制器部分: ![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194800907-428286771.png) 17、權限維護 展示、添加權限 AuthController function showlist() function? add() 1.?展示權限信息,及名字設置縮進關系字樣 ??????![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305195056454-447432592.png) 2.?添加權限 3\. 優化 ?????? ① 添加權限父級只顯示level=0 或level=1 ?????? getInfo傳遞不同參數,獲得的信息也略有差異 ??????![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194929766-2022118732.png) ?????? ② 為角色分配權限,顯示三級權限 ???????![](http://images2015.cnblogs.com/blog/916005/201703/916005-20170305194939891-467976516.png)?????? 18、【管理員列表實現】 Manager/showlist 總結: 1.????? 通過角色分配權限維護 2.????? 維護權限數據,添加權限 a)??????auth\_path b)?????? 幫組我們對數據進行排序顯示 c)?????? 全路徑:父級的全路徑和本身id結合的信息 d)??????auth\_level e)?????? 基本: 3\. 維護管理員數據,角色信息( {html\_options} )
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看