ThinkPHP---案例1登录登出和添加部门
配置文件分3类:系统配置文件,分组配置文件,应用配置文件
①系统配置文件ThinkPHP/Conf/convention.php;
②分组 / 模块 /平台配置文件Home/Conf/config.php;
③应用配置文件Common/Conf/config.php;
(1)综合案例:实现OA系统的登录页面展示
首先需要明确当前功能需要哪些条件MVC
先说下VC
①首先是控制器C
控制器:登录登出放到Public里,控制器名PublicController.class.php
创建控制器文件,编写结构代码
<?php
//命名空间的声明
namespace Admin\Controller;
//引入父类控制器
use Think\Controller;
//声明控制器并继承父类
class PublicController extends Controller{}
}
?>
②接下来是展示模板,这里就要设置方法
方法:方法名login,编写方法login,展示模板文件login.html
//登录页面展示
public function login(){
$this->display();
}
③对应的模板文件login.html,V
将模板文件复制到指定位置,具体位置浏览器报错已经提示,这里提示位置./Application/Admin/View/Public/login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<from action='' method='post'>
账号:<input type="text" name="name"><br/>
密码:<input type="password" name="pwd"><br/>
<input type="submit" value="登录">
</from>
</body>
</html>
④将相应的静态资源文件js,css,images复制到指定位置
位置:根目录下,与Application同级,/Public/Admin/css或者js或者images
⑤修改模板文件login.html中静态资源的引入路径
这里因为上面自定义常量__ADMIN__ = __PUBLIC__/Admin,所以这里可以写成
<link rel="stylesheet" type="text/css" href="__ADMIN__/login.css">
等价于
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/login.css">
注意:新版PHP中即使不写方法,有时也可以展示模板。只要存在与方法同名的模板,即可渲染出结果。
原理:有方法时会先访问方法,再用模板;没有方法时,会直接调取与方法名相同的模板;如果模板也不存在时报错
.
(2)后台首页
控制器:indexController.class.php
方法:index home
模板:index.html home.html
①创建控制器文件indexController.class.php
结构代码:
<?php
namespace Admin\Controller;
use Think\Controller;
class IndexController extends Controller{
}
?>
②在控制器里增加方法index,home用来展示模板文件
public function index(){
$this->display();
}
public function home(){
$this->display();
}
③将模板文件index.html和home.html复制到指定位置
④修改静态文件引入路径
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Admin/home.css">
⑤纠正Home页面引入路径,因为home是index页面的iframe内联框架。改写为__CONTROLLER__/home
或者使用U方法指定URL地址{:U(home)}
(3)部门管理
1. 设计二级导航效果
①实现前端二级下拉样式
②修改导航数目和跳转地址
2. 实现部门添加功能
控制器:DeptController.class.php
方法:add
模板文件add.html
①控制器中创建add方法,展示模板
public function add(){
$this->display();
}
②复制模板文件add.html到指定位置View/Dept/add.html
③修改模板文件静态资源路径
④表单中提交按钮和清空按钮a标签编写的无效,修改为input后样式消失。所以通过jquery方法来提交
<script type="text/javascript">
$(function(){
//提交按钮
$('.confirm').on('click',function(){
$('form').submit();
});
//清空按钮
$('.clear').on('click',function(){
$('form')[0].reset();//表单还原,
//因为reset()是JS的语法,而$('form')是jquery对象,不能直接使用js。所以要进行转化,jquery对象转Dom对象两种方法①加下标;②.get(0)
})
})
</script>
⑤展示上级部门信息
在控制器DeptController.class.php里传递变量,然后在模板展示
public function add(){
//展示顶级部门
$model = M('dept');//模型实例化
$data = $model->where('pid = 0')->select();//条件查询
$this->assign('data',$data);//变量分配传递到模板
$this->display();
}
add.html模板遍历展示
<table border="1" cellspacing="0">
<tr>
<td>id</td><td>name</td><td>pid</td><td>sort</td><td>remark</td>
</tr>
<volist name='data' id='vol'>
<tr>
<td>{$vol.id}</td>
<td>{$vol.name}</td>
<td>{$vol.pid}</td>
<td>{$vol.sort}</td>
<td>{$vol.remark}</td>
</tr>
</volist>
</table>
案例:下拉菜单
<select>
<option>上级部门:</option>
<volist name='data' id='vol'>
<option>{$vol.remark}</option>
</volist>
</select>
⑤处理表单信息的提交操作
在控制器deptController.class.php里add方法判断是否是POST提交。若是则提交,否则展示
扩展:
1. 方法判断---------判断请求是否是post,之前用$_POST判断,但在ThinkPHP里系统封装了几个比较实用的常量,可以直接用常量来判断
IS_POST、IS_GET、IS_AJAX、IS_CGI、IS_PUT等
2. 数据接收---------之前用$_POST接收数据,在ThinkPHP里使用I快速方法来接收数据。I方法可以接收任何类型输入post、get、request、put等。且系统默认自带防止SQL
注入的方法(使用PHP内置函数htmlspecialchars,将预定义字符<,>转化为HTML实体字符)。因为$POST没有对数据进行过滤,还得手动过滤。所以推荐使用I方法接收数据,
自带过滤效果,防止SQL注入
3.I 快速方法语法:I('变量类型.变量名',['默认值'],['过滤方法']),过滤方法可以自定义过滤
接收整个数组:I('get');
public function add(){
//判断请求类型,若是post则提交,否则展示
if (IS_POST) {
//处理表单请求
$post = I('post.');
//成功接收后,写入数据
$model = M('dept');//模型实例化
$result = $model->add($post);
//判断返回值
if ($result) {
$this->success('添加成功',U('showList'),3);
}else{
$this->error('添加失败');//默认跳到上一页
}
}else{
$model = M('dept');//模型实例化
$data = $model->where('pid = 0')->select();//条件查询
$this->assign('data',$data);//变量分配传递到模板
$this->display();
}
}
【四】后台登录
(1)分析
控制器:PublicController.class.php
模板:login.html
方法:login captacha(验证码) checkLogin(验证登录)
下面按照步骤一次编写:
(2)验证码
①控制器里创建captacha,用于创建验证码;
//生成验证码
public function captacha(){
ob_clean();//去除Bom(编辑器加的UTF-8标签)
//配置
$cfg = array(
'fontSize' => 20, // 验证码字体大小(px)
'useCurve' => false, // 是否画混淆曲线
'useNoise' => false, // 是否添加杂点
'length' => 4, // 验证码位数
'fontttf' => '', // 验证码字体,不设置随机获取
);
//实例化验证码类
$Verify = new \Think\Verify($cfg);
//输出保存验证码图片
$Verify->entry();
}
②在模板文件login.html输出验证码;
验证码:<img src="__CONTROLLER__/captacha">
③添加点击刷新验证码,给图片绑定点击事件
验证码:<img onclick="this.src='__CONTROLLER__/captacha'" src="__CONTROLLER__/captacha">
这样只在Chrome下生效,测试后在其他浏览器无效。为了兼容其他浏览器需要在地址后面加上随机数,最终代码
验证码:<img onclick="this.src='__CONTROLLER__/captacha/t/'+Math.random()" src="__CONTROLLER__/captacha">
打开浏览器测试生效,测试Network,会发现点击红藕每次都会发送新的请求,请求不一样。所以生效
(3)验证登录前创建用户表
表名:sp_user
①创建表,表结构
//表结构
create table sp_user(
id int(11) not null auto_increment,
username varchar(40) not null,
password char(32) not null,
nickname varchar(40) default null,
truename varchar(40) default null,
dept_id int(11) default null,
sex varchar(10) not null,
birthday date not null,
tel varchar(11) not null,
email varchar(50) not null,
remark varchar(255) default null,
addtime int(11) default null,
role_id int(11) default null,
primary key(id)
)engine=myisam default charset=utf8;
新增模拟数据:
insert into sp_user values('1','admin','123456','admin','管理员','1','男','2017-01-06','10000','56@qq.com','石家庄','12345678','1');
②修改模板元素
1. 添加form表单指定提交位置
<form action="{:U(checkLogin)}" method='post'>
代码块
</form>
2. 对于登录按钮,前端写好的样式为
<a href='index.html' class='btn'>登录</a>
这里改为href='javascript:;',阻止浏览器默认行为,防止点击完就跳页的行为
3. 利用jquery实现表单提交
$(document).ready(function(){
$('.btn').on('click',function(){
$('form').submit();//提交表单
})
})
(4)编写checkLogin方法,验证用户登录
验证顺序,先对验证码进行验证,因为只有验证码不会对服务器发送请求。验证码正确的话再去验证用户名和密码。
具体注意事项在代码里做了介绍
public function checkLogin(){
//接收数据I方法可以过滤数据
$post = I('post.');
//校验验证码,因为校验验证码封装在了类Verify里,所以需要实例化类
$verify = new \Think\Verify();//不用传参,因为传参是在生成验证码时配置验证码用的
//验证操作,成功返回true
$result = $verify->check($post['captcha']);
//判断验证码是否正确
if($result){
//验证码正确的话,开始验证用户名和密码,此时需要连接数据库
//连接数据库前,先实例化模型
$model = M('user');
//删除验证码元素,因为要查询,where里接收一维数组,而数据库没有验证码且此时验证码无效了.去掉后$post长度刚好为2
unset($post['captcha']);
//查询
$data = $model->where($post)->find();
//判断用户存在与否
if ($data) {
//存在的话1.用户信息持久化,保存session;2.跳转后台首页
session('id',$data['id']);
session('username',$data['username']);
session('role_id',$data['role_id']);
//跳转后台首页
$this->success('登录成功',U('Index/index'),3);
}else{
$this->error('用户名或密码错误');
}
}else{
$this->error('验证码错误');
}
}
(5)修改登录成功后的用户名
{$Think.session.username}
模板输出系统变量----模板读取session数据,
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
支持输出 $_SERVER、$_ENV、 $_POST、 $_GET、 $_REQUEST、$_SESSION和 $_COOKIE变量。
【五】退出
(1)控制器编写退出方法
//退出方法
public function logout(){
//清除session
// session_destroy();原生方法
session(null);
//跳转登录页面
$this->success('登出成功',U('login'),3);
}
(2)修改跳转地址,先让其跳到Public/logout,清空session。然后跳到登录页
注意:因为U方法和__PUBLIC、__CONTROLLER__等都是模板常量,只能在模板里使用。所以js文件里无法使用这些常量去跳转路径。除非将js直接写到模板文件里去,例如
<script type="text/javascript">
$(document).ready(function(){
$('.logout').on('click',function(){
var path= "__CONTROLLER__";
alert(path);//这里便会提示出模板常量
})
})
</script>
或者在js里写,/表示从域名后开
域名/入口文件/分组/控制器名/方法名
window.location.href='/index.php/Admin/Public/logout';
接下来的部门管理在后面文章视频学习笔录---ThinkPHP---案例2--部门管理功能
.
ThinkPHP---案例1登录登出和添加部门的更多相关文章
- flask 实现登录 登出 检查登录状态 的两种方法的总结
这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...
- ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...
- SpringBoot登录登出切面开发
阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...
- Struts2学习第六课 实现登录登出功能
关于Struts2请求的扩展名问题: 1).org.apache.struts2包下的default.properties中配置了struts2应用的一些常量 2).struts.action.ext ...
- Django项目: 4.用户登录登出功能
用户登录登出功能 一.功能需求分析 1. 登录退出功能分析 流程图 功能 登录页面 登录功能 退出功能 二.登录页面 1. 接口设计 接口说明 类目 说明 请求方法 GET url定义 /user/l ...
- jquery ajax常用的登录登出
整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...
- 利用Vue.js实现登录/登出以及JWT认证
JSON Web Token 入门教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 后端代码地址:https ...
- Vue 登录/登出以及JWT认证
1. 后端代码概览 server/router/index.js 请求 router.get('/getUserInfo', function (req, res, next) { // 登录请求 r ...
- Android网络开发实例(基于抓包实现的网络模拟登录,登出和强制登出)
学习Android有几个月了,最近喜欢上了网络编程,于是想通过Android写一些一个小程序用于连接外网.在这里非常感谢雪夜圣诞的支持,非常感谢,给我打开新的一扇门. 1.声明,本程序只能用于西南大学 ...
随机推荐
- DirectX11 学习笔记7 - 支持自由移动的摄像机
如今将又一次制定一个camera摄像机.能够自由移动. 比方前进 后退,上游 下潜. 各个方向渲染之类的. 首先设置按键. 这个时候须要在 XWindow.h 里面 bool XWindow::fra ...
- gdb 调试利器
1. gdb 调试利器 GDB是一个由GNU开源组织公布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.对于一名Linux下工作的c++程序猿,gdb是不可缺少的工具: 1 ...
- JAVA 学习 IDEA安装及破解
1.到官网下载安装包 网址:https://www.jetbrains.com/idea/download/#section=windows 选择 “”Ultimate “”这个版本点击“Downl ...
- iOS开发——高级篇——iOS如何彻底避免数组越界
我们先来看看有可能会出现的数组越界Crash的地方: ? 1 2 3 4 5 6 7 - (void)tableView:(UITableView *)tableView didSelectRowAt ...
- 呐喊-Skrik
尼斯,1892年1月22日,我和两个朋友还在散步,太阳已快下山了,天空突然间变得血一样红,我似乎感受到了一种悲伤忧郁的气息,我止住了脚步,轻轻地倚在篱笆边,极度的疲倦已使我快要窒息了.火焰般的云彩像血 ...
- 【POJ 1330】 Nearest Common Ancestors
[题目链接] 点击打开链接 [算法] 倍增法求最近公共祖先 [代码] #include <algorithm> #include <bitset> #include <c ...
- [Pa2013]Iloczyn
https://www.zybuluo.com/ysner/note/1300802 题面 给定正整数\(n\)和\(k\),问能否将\(n\)分解为\(k\)个不同正整数的乘积. \(n\leq10 ...
- git服务器的建立
git简介 首先,与以前广为流行的SVN不同,git是分布式的,其没有服务器端与客户端之分(虽然在项目管理过程中,一般会人为地指定某一台非开发用的机器作为“服务器”,但就git自身功能来说,完全可以没 ...
- Git-flow 一个简单高效的Git工作流
背景 由于Git的分支比SVN更好管理且更易使用,最近团队从SVN迁移到Git,需要重新规划开发流程,最终确定使用Git-flow工作流,这是目前比较流行的一种分支模型,下面是Git-flow的简易流 ...
- P3469 [POI2008]BLO-Blockade(Tarjan 割点)
P3469 [POI2008]BLO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每 ...