十九、修改操作
(手册–模型–更新)(CURD create update read delete)
1、更新一条数据
使用示例
先查询再更新和直接更新 (save)方法
$goods=\app\admin\model\Goods::find(146);
$goods->goods_price='123.00';
$goods->goods_number=131;
$res=$goods->allowField(true)->save();
dump($res);die;
2、批量更新数据
以上用法通常比较少用,更多的批量更新,是使用where条件,一次更新多条数据的指定字段值。(多条数据的同一个字段,改成同一个值)
\app\admin\model\Goods::where('id','>',141)->update(['goods_price'=>'10','goods_number'=>100]);
3、静态方法更新(推荐)
示例:直接调用update方法,第三个参数true表示过滤非数据表字段
\app\admin\model\Goods::update(['goods_price'=>'123.00','goods_number'=>321,'id'=>33],[],true);
4、自动识别
5、示例
二十、案例:后台商品修改功能
表单展示Goods控制器edit方法(整合模板)
表单提交Goods控制器update方法
思路:
1、在表单展示控制器方法中,查询原始的数据
2、在表单页面,展示原始数据
3、确认表单完整性,完善name属性和提交地址等信息,主键id隐藏域
4、在表单提交的控制器方法中,接收数据
5、参数检测(表单验证)
6、将数据修改到数据表
7、页面跳转
1、页面展示
1、修改Goods控制器edit方法,查询原始商品数据
2、表单提交
3、ueditor富文本编辑器整合
同create页面
二十一、删除操作
(手册–模型–删除、手册–模型–软删除)
1、删除操作
1、先查询,再调用模型的delete方法删除
$user=User::get(1);
$user->delete();
2、先调用where方法,再调用Query类的delete方法删除
User::where('id',1)->delete();
3、静态调用destroy方法删除(推荐)
User::destroy(1);
User::destroy('1,2,3');
User::destroy([1,2,3]);
User::destroy(['status'=>1]);
delete方法使用示例
a、先查询再删除
b、使用where条件,调用Query类的delete方法删除
c、静态调用destroy方法进行删除
删除效果:将指定数据从数据表直接删除,返回值都是受影响的记录数
2、trait
(手册–架构—Traits引入)
1、初识trait
trait A{
public function getName(){
return 'This is trait';
}
}
trait的定义,和类非常相似,只需要将关键字class换成trait即可。
2、trait的使用
定义trait之后,在一个类中进行使用
class B{
use A;
}
$b=new B();
echo $b->getName();//This is trait
<?php
trait A
{
public function getName()
{
return 'A-getName';
}
public function getAge()
{
return 'A-getAge';
}
}
class C
{
public function getName()
{
return 'C-getName';
}
public function getAge()
{
return 'C-getAge';
}
public function getSex()
{
return 'C-getSex';
}
}
class B extends C
{
//使用trait
use A;
public function getAge()
{
return 'B-getAge';
}
public function getSex()
{
return 'B-getSex';
}
}
$b = new B();
echo $b->getSex();//B-getSex
echo $b->getName();//A-getName
echo $b->getAge();//B-getAge
注:有同名方法,当前类方法会覆盖trait的方法,trait的方法会覆盖继承类的方法。
TP中的trait:
父类控制器Controller中使用了jump这个trait,提供了页面跳转相关方法。
模型的SoftDelete这个trait,需要在自定义模型中,手动使用,提供的是软删除相关功能。
3、软删除
物理(硬)删除:真删除,从数据表直接删除记录。
逻辑(软)删除:假删除(本质是修改操作),只是让数据在页面不显示,数据表中仍然保留。
原理:在数据表添加一个字段控制数据在页面的展示。点击删除操作时,修改对应字段的值。
软删除:(手册–模型–软删除)
二十二、案例完成后台删除操作
1、设置模型的软删除
2、软删除功能实现
3、增删改查操作总结
<?php
namespace app\admin\controller;
use think\Controller;
use think\Request;
class curd extends Controller
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
$list=\app\admin\model\Goods::order('id desc')->select();
return view('index',['list'=>$list]);
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
return view();
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//接收数据
$params=input();
//参数检测
$rule=[
['goods_name|商品名称'=>'require'],
['goods_price|商品价格'=>'require|float|gt:0']
];
$msg=[
'goods_name.require'=>'商品名称不能为空',
'goods_price.float'=>'商品价格格式不正确'
];
//调用控制器的validate方法
$validate=$this->validate($rule,$msg,$params);
if($validate!==true){
$this->error($validate);//验证失败,$validate 就是一个字符串错误信息
}
//添加数据到数据表 第二个参数true表示过滤非数据表字段
\app\admin\model\Goods::create($params,true);
$this->success('添加成功','admin/goods/index');
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//查询数据
$goods=\app\admin\model\Goods::find($id);
return view('read',['goods'=>$goods]);
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id)
{
//查询数据
$goods=\app\admin\model\Goods::find($id);
return view('edit',['goods'=>$goods]);
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//接收数据
$params=input();
//参数检测
$rule=[
['goods_name|商品名称'=>'require'],
['goods_price|商品价格'=>'require|float|gt:0']
];
$msg=[
'goods_name.require'=>'商品名称不能为空',
'goods_price.float'=>'商品价格格式错误'
];
$validate=$this->validate($rule,$msg,$params);
if($validate!==true){
$this->error($validate);
}
//修改数据
\app\admin\model\Goods::update($params,['id'=>$id],true);
//页面跳转
$this->success('修改成功','index');
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//删除数据
\app\admin\model\Goods::destroy($id);
//页面跳转
$this->success('删除成功','index');
}
}
4、id参数检测
二十三、登录登出权限控制
1、封装密码加密函数
注意:后台管理员表tpshop_manager中初始的管理员密码
密码要自己加密一个初始密码,更新到数据表
使用自定义的密码加密函数:
2、模板中使用请求参数
(手册–模板–请求参数)
示例:{$Request.url}获取当前页面的url地址
3、TP中的cookie和session
(手册–杂项–cookie,手册–杂项–session)
TP框架提供了think\Cookie类和think\Session类分别操作cookie和session
也可以使用是助手函数cookie()和session();
session函数使用语法:
//赋值(当前作用域)
session('name','thinkphp');
//赋值think作用域
session('name','thinkphp','think');
//判断(当前作用域)是否赋值
session('?name');
//取值(当前作用域)
session('name');
//取值think作用域
session('name','','think');
//删除(当前作用域)
session('name',null)
//清除session(当前作用域)
session(null);
//清除think作用域
session(null,'think');
session函数基本操作
session('name','thinkphp');//设置
session('name');//读取
session('name',null);//删除单个session
session(null);//删除所有session
session函数点 语法
//数组用法 点语法
session('user',['username'=>'hua','age'=>30]);
//使用点语法 直接操作数组中的一个键值对
session('user.email','hua@qq.com');
dump(session('user'));
//直接取数组中的一个键值对
dump(session('user.email'));
//删除数组中的一个值
session('user.email',null);
dump(session('user.email'));
cookie函数使用语法:
//初始化
cookie(['prefix'=>'think_','expire'=>3600]);
4、完成后台的登录功能
需要创建Manager模型:
命令行方式:php think make:model admin/Manager
思路:
1、表单展示
2、表单中name属性值、提交地址
3、提交的控制器方法中,接收数据
4、查询用户表 验证用户名和密码
5、用户名和密码正确,设置登录标识到session跳转到后台首页
6、用户名或密码错误,报错,返回登录页
路径:Login控制器login方法
1、确认form表单完整性,完善name和提交地址
2、登录控制器
3、登出方法
3、登录检测
注:相同命名空间下的类,相互访问 时,可以不用携带命名空间。
二十四、验证码技术
1、使用验证码的步骤
1、生成验证码图片,展示在页面上
2、点击图片刷新验证码功能
3、提交表单后验证码的校验
2、TP中的验证码显示
(手册–杂项–验证码)
3、验证码的校验
修改Login控制器方法login:表单提交后先进行验证码校验,再查询数据表
4、验证码标识
当项目中有多个功能都需要使用验证码(比如登录页、找回密码页等)
以登录页为例:可修改代码如下:
验证码标识:字符串’login’
1、验证码显示
修改view/login/login.html验证码图片标签src属性给catpcha_src函数传参数’login’
2、控制器校验
总结:
1、修改操作以及后台商品修改功能(save方法、savaAll方法、静态update方法)
2、删除操作(delete方法、destroy方法)与软删除功能、trait
3、cookie和session操作(助手函数)
4、登录模块功能(登录、退出、登录检测)
5、验证码(captcha_src() captcha_img() captcha_check())