前言
有了我们前面章节学习的管理员、角色、权限板块,这些数据库创建及开发流程,我们接下来学习图片管理板块,应该是信手拿捏了,图片管理板块,主要是对商品图片的一个管理,包括图片分类、图片上传、图片删除等操作,下面我们就来学习一下图片管理板块的开发。
# 一、 创建图片分类表 image_class
具体
图片分类表:image_class设计,点击查看
# 二、 创建图片表 image
具体
图片表:image设计,点击查看
# 三、创建控制器、验证器、模型
# 1. 创建图片分类、图片 控制器
php think make:controller admin/ImageClass
php think make:controller admin/Image
# 2. 创建图片分类、图片 验证器
php think make:validate admin/ImageClass
php think make:validate admin/Image
# 3. 创建图片分类、图片 模型
php think make:model ImageClass
php think make:model Image
# 4. 继承基类控制器、验证器
...
use app\BaseController;
class ImageClass extends BaseController {}
class Image extends BaseController {}
...
use app\validate\BaseValidate;
class ImageClass extends BaseValidate{}
class Image extends BaseValidate{}
...
# 四、图片分类获取列表、新增、修改、修改状态、删除接口
# 1. 图片分类控制器
app/controller/admin/ImageClass.php
...
use app\BaseController;
class ImageClass extends BaseController
{
// 列表
public function index()
{
//拿到参数数组, 如:页码等
// $param = $request ->param();
$param = $this->request->param();
//可选参数,如limit:每页多少条
$limit = intval(getValueByKey('limit',$param,100));
$page = getValueByKey('page',$param,1);
//计算一下一共查了多少条数据
$totalCount = $this->model -> count();
//列表数据
$list = $this->model ->
//分页
page($page,$limit) ->
//排序
// order('id','desc') ->
order([
'order'=>'desc',
'id'=>'desc',
]) ->
//查询
select()
//转成数组
-> toArray();
return apiSuccess([
'totalCount' => $totalCount,
'list' => $list,
'list_tree2' => list_to_tree2($list,'pid'),
'list_tree' => list_to_tree($list,'pid')
]);
}
// 创建方法已写入基类控制器,此处略 --- 只需要设置验证器规则和场景
// public function save(Request $request)
// {
// //
// }
// 更新方法已写入基类,此处略 --- 只需要设置验证器规则和场景
// public function update(Request $request, $id)
// {
// //
// }
// 删除已写入基类控制器,此处略 --- 只需要设置验证器规则和场景
// public function delete($id)
// {
// //
// }
}
# 2. 图片分类验证器
app/validate/admin/ImageClass.php
...
use app\validate\BaseValidate;
class ImageClass extends BaseValidate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'page' => 'require|integer|>:0',
'limit' => 'integer|>:0',
//isExist是我们自定义的一个规则
'id|图片分类id' => 'require|integer|>:0|isExist:ImageClass',
'pid|父级id' => 'require|integer|>=:0|isExist:ImageClass,false',//pid无需挂载这条数据,防止挂载冲突
'status' => 'integer|in:0,1',
'name' => 'require|max:30',
'order' => 'integer|>=:0',
'desc' => 'max:255',
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [];
//定义一个场景(场景名称可自定义,方便我们观察,可用控制器的方法名称)
protected $scene = [
//列表验证场景
'index' => ['page','limit'],
//创建场景
'save' => ['pid','status','name','order','desc'],
// //修改场景
'update' => ['id','pid','status','name','order','desc'],
//修改状态
'updateStatus'=> ['id','status'],
//删除
'delete' => ['id'],
];
}
# 3. 路由
route/admin.php
...
// 必须是登录之后,才能访问(管理员身份)
Route::group('admin',function(){
...
//删除图片分类
Route::post('imageclass/:id/delete','admin.ImageClass/delete');
//修改图片分类状态
Route::post('imageclass/:id/update_status','admin.ImageClass/updateStatus');
//更新图片分类
Route::post('imageclass/:id','admin.ImageClass/update');
//创建图片分类
Route::post('imageclass','admin.ImageClass/save');
//图片分类列表
Route::get('imageclass/:page','admin.ImageClass/index');
//加入中间件代码
})->middleware(\app\middleware\checkShopManagerToken::class);
# 五、上传图片
具体查看,上传图片
# 六、某个图片分类下的图片列表
某个图片分类下的图片列表要求路由可以这样:
http://thinkphp.shop/admin/imageclass/27/image/1?limit=10&keyword=电脑&order=asc
27代表分类id,1代表页码,limit代表每页多少条,keyword代表搜索关键字,order代表排序规则
limit和keyword是可选参数,limit默认为20,keyword默认为 空字符串,order是可选参数,默认为desc
# 1. 路由
route/admin.php
...
//图片分类下的所有图片列表 $代表后面的参数可以没有
Route::get('imageclass/:id/image/:page','admin.ImageClass/images');
//删除图片分类
Route::post('imageclass/:id/delete','admin.ImageClass/delete');
...
# 2. 验证器
app/validate/admin/ImageClass.php
...
use app\validate\BaseValidate;
class ImageClass extends BaseValidate
{
...
//定义一个场景(场景名称可自定义,方便我们观察,可用控制器的方法名称)
protected $scene = [
...
// 图片列表
'images' => ['id','page'],
];
}
# 3. 模型
app/model/ImageClass.php
...
class ImageClass extends Model
{
//获取当前图片分类下的图片
public function images()
{
return $this->hasMany('Image','image_class_id','id');
}
}
# 4. 控制器
app/controller/admin/ImageClass.php
...
//图片列表
public function images(Request $request)
{
//拿到参数数组, 如:页码等
// $param = $request ->param();
$param = $this->request->param();
//可选参数,如limit:每页多少条
$limit = intval(getValueByKey('limit',$param,20));
$page = getValueByKey('page',$param,1);
//拿到图片分类下面的图片,模型关联(当然也可以用where查询语句)
// 拿到图片模型
// $model = $this -> request -> Model -> hasMany('Image','image_class_id','id'); //关联模型名
$model = $this -> request -> Model -> images(); //关联模型名
//计算一下一共查了多少条数据
$totalCount = $model -> count();
//排序
$order = getValueByKey('order',$param,'desc'); //默认降序
//查询条件
$where = [];
// 如果存在查询条件参数keyword
$keyword = getValueByKey('keyword',$param,'');
if($keyword){
$where[] = [
['name','like','%'.$keyword.'%']
];
}
// 图片列表数据
$list = $model ->
//分页
page($page,$limit) ->
// where 条件
where($where) ->
//排序
order('id',$order) ->
//查询
select();
//转成数组
//-> toArray();
return apiSuccess([
'totalCount' => $totalCount,
'list' => $list,
]);
}
# 七、删除单个图片、自定义图片名称
# 1. 路由
route/admin.php
...
// 必须是登录之后,才能访问(管理员身份)
Route::group('admin',function(){
...
//删除某个图片
Route::post('image/:id/delete','admin.Image/delete');
// Route::delete('image/:id','admin.Image/delete');
//重命名图片
Route::post('image/:id','admin.Image/updatename');
//上传图片到阿里云oss
Route::post('image/uploadAliyun','admin.Image/uploadAliyunOSS');
//加入中间件代码
})->middleware(\app\middleware\checkShopManagerToken::class);
# 2. 删除单个图片
由于删除功能已经定义到了基类控制器里面,代码无差异,因此不用重新写删除代码,只需要定义路由和场景即可。
//删除
public function delete($id)
{
$data = $this->request -> Model;
return apiSuccess($data -> delete());
}
# 3. 验证器
app/validate/admin/Image.php
...
use app\validate\BaseValidate;
class Image extends BaseValidate
{
protected $rule = [
//isExist是我们自定义的一个规则
'id|图片id' => 'require|integer|>:0|isExist:Image',
//image_class_id无需挂载这条数据,防止挂载冲突
'image_class_id|图片分类id' => 'require|integer|>:0|isExist:ImageClass,false',
'name|图片名称' => 'max:30',
];
...
//定义一个场景(场景名称可自定义,方便我们观察,可用控制器的方法名称)
protected $scene = [
...
//删除图片
'delete' => ['id'],
//重命名图片
'updatename' => ['id','name'],
];
}
# 4. 控制器
app/controller/admin/Image.php
...
//重命令图片名称
public function updatename(Request $request, $id)
{
//拿到数据(已经自动化验证参数合法性)
$param = $this->request -> only([
// 'id',
'name',
// 'status',
]);
// $param = $this->request -> param();
$res = $this->request -> Model -> save($param);
return apiSuccess($res);
}