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、當寫好控制器后,我們需要添加相應的視圖文件。

5、連接數據庫。對于數據庫的連接,我們同樣需要更改設置。這里我們使用的是mySQL,具體如下圖所示。如果使用的端口號是默認的,密碼為空,就不用填寫。注意數據庫的名字和前綴。

6、在對數據庫進行操作之前,我們得先建一個 Model 類,方面和后續的使用。我們在和Home同目錄下新建一個 Model 文件夾,寫好代碼。

7、然后我們開始調用 Model 來操作數據庫,輸入網址,看到下面的內容就可以知道連接數據庫成功了。

8、接下去,我們把之前寫好的前端和后臺的html等文件都放進來,為了方便后續的操作,我們要對文件進行分類,最終效果如下所示:
? ?? ?? ?
其中public 存放一些樣式,js文件,圖片等。
9、如果我們要訪問這些 html 文件的話,還必須添加相應的控制器等。輸入網址,訪問,我們會發現頁面缺少圖片和樣式。由于 css, js 文件位置的變動,我們必須重新修改這些 url 或者 src 屬性。因為這些文件經常用到,所以我們添加了常量,并在html文件中進行修改。這樣我們就能看到最終的頁面了。

?
10、采用 Smarty 模板。 這時候只需要更改設置就好。

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、基于角色的訪問權限控制

對角色進行權限劃分
?????? 員工直接面對角色、角色直接面對具體操作權限
?????? 新員工入職只需要確定其角色,他的權限就由角色來確定
?????? 員工\-------------角色\--------------操作權限
?????? 現在權限分配非常容易,也非常科學
?????? 新員工入職公司只需要把其角色劃分好,它的權限有角色確定
sw\_manager 后臺用戶管理員表
sw\_role???? 角色表
sw\_auth???? 具體權限表
1.????? 數據模擬



2.?通過已經模擬好的數據進行相關程序開發
a)? 用戶登錄系統,左邊顯示權限按鈕會根據具體角色顯示
b)??在左邊(Admin/Index/left)顯示對應的權限信息
* 用戶登錄系統顯示權限信息$\_SESSION\[‘mg\_id’\]
* 根據session信息獲得角色role\_id信息
* 根據角色id信息獲得權限列表ids信息
* 根據權限ids信息查詢具體權限信息進而顯示

雖然給用戶及角色分配了權限,也實現對應的權限的顯示
但是用戶可以通過顯示修改url地址達到訪問其他權限的目的
**解決:**
?????? 每次用戶訪問的控制器和方法都需要和對應的角色里邊的ac信息進行比較
?????? ac信息里邊存在這個控制器和方法就允許訪問,否則禁止訪問
??**???? 技術角度:**
在每個控制器被實例化執行的同時就判斷當前的控制器和方法是否允許角色訪問
為了程序維護方便,給普通控制器制作父類控制器,在父類控制器的構造方法里邊做控制器和方法的過濾工作。
普通控制器引入新的父類AdminController,
1.??在新父類控制器AdminController里邊實現每次訪問控制器和操作方法過濾
a)??具體限制分三種情況
* 自定義方法不進行權限限制(Index/head? left? right?? Manager/login)
* 系統管理員也不進行權限限制
* 當前用戶允許訪問的權限就是角色對應的權限

?16.角色維護
Admin/Role/showlist?? 顯示角色信息
把許多復選框的權限表單的信息收集起來保存到角色的數據表中
在設置權限的時候,把已經有的權限給顯示出來(復選框有被選中)
當前角色知道,當前角色對應的權限ids也知道,也可以把ids由字符串變為數組
遍歷權限的時候把id與ids的數組做比較,判斷是否是其中的一個元素,進而設置checked屬性? in\_array()
1.????? 制作表單顯示具體被分配權限信息

2.????? 收集權限信息在RoleModel模型里邊保存

3.????? 分配權限時候,已經有的權限,復選框需要被選中
?
4.????? 展示分配權限信息的表單對應控制器部分:

17、權限維護
展示、添加權限
AuthController
function showlist()
function? add()
1.?展示權限信息,及名字設置縮進關系字樣
??????
2.?添加權限
3\. 優化
?????? ① 添加權限父級只顯示level=0 或level=1
?????? getInfo傳遞不同參數,獲得的信息也略有差異
??????
?????? ② 為角色分配權限,顯示三級權限
?????????????
18、【管理員列表實現】
Manager/showlist
總結:
1.????? 通過角色分配權限維護
2.????? 維護權限數據,添加權限
a)??????auth\_path
b)?????? 幫組我們對數據進行排序顯示
c)?????? 全路徑:父級的全路徑和本身id結合的信息
d)??????auth\_level
e)?????? 基本:
3\. 維護管理員數據,角色信息( {html\_options} )
- 空白目錄1
- RBAC
- RBAC權限模型[完整]
- 你知道權限管理的RBAC模型嗎?
- rbac 一個用戶對應多個賬號_如何設計一個強大的權限系統
- Postman 快速使用(設置環境變量)
- postman的使用方法詳解!最全面的教程
- Postman常用的幾個功能
- ThinkPHP項目總結
- thinkphp5 遞歸查詢所有子代,查詢上級,并且獲取層級
- PHP原生項目之留言板
- 智慧校園
- PHP如何實現訂單的延時處理詳解
- VUE
- const {data:res} = await login(this.loginForm)
- Vue中的async和await的使用
- PHP實現消息推送(定時輪詢)
- tp5 計算兩個日期之間相差的天數
- 使用jquery的ajax方法獲取下拉列表值
- jQuery實現select下拉框選中數據觸發事件
- SetFocus 方法
- 快來了解下TP6中的超級函數app()!
- PHP socket 服務器框架 workerman
- 程序員如何才能成為獨立開發者?
- PHP 錯誤處理
- php面向對象類中的$this,static,final,const,self及雙冒號 :: 這幾個關鍵字使用方法。
- 小白教你玩轉php的閉包
- 關于TP6項目搭建的坑(多應用模式)
- ThinkPHP6.0 與5.0的差別及坑點
- axios在vue項目中的使用實例詳解
- php中的類、對象、方法是指什么
- 聊一聊PHP的依賴注入(DI) 和 控制反轉(IoC)
- 深入理解控制反轉(IoC)和依賴注入(DI)
- Private,Public,Protected
- ThinkPHP5(目錄,路徑,模式設置,命名空間)
- 在 ThinkPHP6 中使用 Workerman
- 介紹thinkphp lock鎖的使用和例子
- php中_initialize()函數與 __construct()函數的區別說明
- api接口數據-驗證-整理
- api接口數據-驗證-整理【續】
- TP6容易踩得坑【原創】
- TP6的日志怎么能記錄詳細的日志?
- 是否需要模型分層
- PHP面試題 全網最硬核面試題來了 2021年學習面試跳槽必備(一)
- MySQL單表數據量過千萬,采坑優化記錄,完美解決方案
- MySql表分區(根據時間timestamp)
- MySQL大表優化方案
- 閑言碎語
- 數據庫外鍵的使用
- 深入理解thinkphp、laravel等框架中容器概念
- vue做前端,thinkphp6做后臺,項目部署
- 簡單MVC架構的PHP留言本
- TP5里面extend和vendor的區別
- 在mysql數據庫中制作千萬級測試表
- MySQL千萬級的大表要怎么優化
- ThinkPHP關聯模型操作實例分析
- lcobucci/jwt —— 一個輕松生成jwt token的插件
- RESTful API 設計指南
- MySQL如何為表字段添加索引
- ThinkPHP6.0快速開發手冊(案例版)
- tp5 靜態方法和普通方法的區別
- 數據字典功能
- mysql中的數據庫ID主鍵的設置問題
- 基于角色的權限控制(django內置auth體系)
- RBAC系統經典五張表
- 什么是接口文檔,如何寫接口,有什么規范?
- thinkphp5.0自定義驗證器