502 lines
14 KiB
PHP
502 lines
14 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeshop开源商城系统
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | gitee下载:https://gitee.com/likeshop_gitee
|
||
// | github下载:https://github.com/likeshop-github
|
||
// | 访问官网:https://www.likeshop.cn
|
||
// | 访问社区:https://home.likeshop.cn
|
||
// | 访问手册:http://doc.likeshop.cn
|
||
// | 微信公众号:likeshop技术社区
|
||
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
|
||
// | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
|
||
// | 禁止对系统程序代码以任何目的,任何形式的再发布
|
||
// | likeshop团队版权所有并拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeshop.cn.team
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\shop\logic;
|
||
|
||
|
||
use app\common\basics\Logic;
|
||
use app\common\enum\FileEnum;
|
||
use app\common\model\File;
|
||
use app\common\model\FileCate;
|
||
use Exception;
|
||
|
||
class FileLogic extends Logic
|
||
{
|
||
|
||
/**
|
||
* NOTE: 获取文件列表
|
||
* @author: 张无忌
|
||
* @param $get
|
||
* @return array|\think\Paginator
|
||
*/
|
||
public static function getFile($get)
|
||
{
|
||
try {
|
||
$where = [
|
||
['del', '=', 0],
|
||
['type', '=', $get['type'] ?? FileEnum::IMAGE_TYPE],
|
||
['shop_id', '=', $get['shop_id']]
|
||
];
|
||
|
||
if (!empty($get['cid']) and $get['cid'] > 0) {
|
||
$lists = FileCate::where(['del'=>0 ])->select();
|
||
$lists = !empty($lists) ? $lists->toArray() : [];
|
||
$childs = self::getChildCid($lists, $get['cid'], true);
|
||
array_push($childs, $get['cid']);
|
||
$where[] = ['cid', 'in', $childs];
|
||
}
|
||
|
||
$model = new File();
|
||
return $model->field(true)
|
||
->where($where)
|
||
->order('id', 'desc')
|
||
->paginate([
|
||
'page' => $get['page'] ?? 1,
|
||
'list_rows' => $get['limit'] ?? 20,
|
||
'var_page' => 'page'
|
||
])->toArray();
|
||
|
||
} catch (Exception $e) {
|
||
return [];
|
||
}
|
||
}
|
||
|
||
/**
|
||
* NOTE: 获取后代分类
|
||
* @author: 张无忌
|
||
* @param $cid
|
||
* @param array $ids
|
||
*/
|
||
public static function getChildCid($lists, $cid, $clear)
|
||
{
|
||
static $temp = [];
|
||
if($clear) {
|
||
$temp = [];
|
||
}
|
||
foreach($lists as $item) {
|
||
if($item['pid'] == $cid) {
|
||
$temp[] = $item['id'];
|
||
self::getChildCid($lists, $item['id'], false);
|
||
}
|
||
}
|
||
return $temp;
|
||
}
|
||
|
||
/**
|
||
* NOTE: 移动文件
|
||
* @param $post
|
||
* @return bool
|
||
* @author: 张无忌
|
||
*/
|
||
public static function move($post)
|
||
{
|
||
try {
|
||
$model = new File();
|
||
// $file = $model->field(true)->findOrEmpty($post['file_ids'][0])->toArray();
|
||
// if ($file['cid'] == $post['cid'] and $post['cid'] != 0) {
|
||
// static::$error = '文件已在当前目录,无需移动';
|
||
// return false;
|
||
// }
|
||
|
||
$model->whereIn('id', $post['file_ids'])
|
||
->update(['cid' => $post['cid']]);
|
||
|
||
return true;
|
||
} catch (Exception $e) {
|
||
static::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* NOTE: 删除文件
|
||
* @param $post
|
||
* @return bool
|
||
* @author: 张无忌
|
||
*/
|
||
public static function del($post)
|
||
{
|
||
try {
|
||
$model = new File();
|
||
$model->whereIn('id', $post['file_ids'])
|
||
->update(['del' => 1]);
|
||
|
||
return true;
|
||
} catch (Exception $e) {
|
||
static::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/** ======================== 华丽的分割线, 下面是文件分类相关 ========================**/
|
||
|
||
/**
|
||
* NOTE: 获取分类列表
|
||
* @param $type (类型: 10=图片, 20=视频, 30=文件)
|
||
* @return array
|
||
* @author: 张无忌
|
||
*/
|
||
public static function getCate($get)
|
||
{
|
||
try {
|
||
$lists = FileCate::where([
|
||
['del', '=', 0],
|
||
['type', '=', $get['type']],
|
||
['shop_id', '=', $get['shop_id']],
|
||
])->order('id', 'asc')->order('sort', 'desc')->select();
|
||
$tree = self::cateListToTree($lists, 0);
|
||
|
||
$all = [
|
||
'id' => 0,
|
||
'field' => 'all',
|
||
'title' => '全部',
|
||
'children' => [],
|
||
];
|
||
|
||
array_unshift($tree, $all);
|
||
return $tree;
|
||
} catch (Exception $e) {
|
||
return [];
|
||
}
|
||
}
|
||
|
||
/**
|
||
* NOTE: 分类列表转树形结构
|
||
* @author: 张无忌
|
||
* @param $lists
|
||
* @param int $pid
|
||
* @return array
|
||
*/
|
||
public static function cateListToTree($lists, $pid = 0)
|
||
{
|
||
$tree = [];
|
||
foreach ($lists as $k => $v) {
|
||
if ($v['pid'] == $pid) {
|
||
$temp['id'] = $v['id'];
|
||
$temp['field'] = 'id';
|
||
$temp['title'] = $v['name'];
|
||
$temp['children'] = self::cateListToTree($lists, $v['id']);
|
||
$temp['spread'] = true;
|
||
$tree[] = $temp;
|
||
}
|
||
}
|
||
return $tree;
|
||
}
|
||
|
||
/**
|
||
* NOTE: 分类详细
|
||
* @author: 张无忌
|
||
* @param $id
|
||
* @return array
|
||
*/
|
||
public static function getCateById($id)
|
||
{
|
||
$model = new FileCate();
|
||
return $model->field(true)
|
||
->findOrEmpty($id)->toArray();
|
||
}
|
||
|
||
/**
|
||
* NOTE: 新增分类
|
||
* @author: 张无忌
|
||
* @param $post
|
||
* @return bool
|
||
*/
|
||
public static function addCate($post)
|
||
{
|
||
try {
|
||
if($post['pid'] == 0) {
|
||
$level = 1;
|
||
}else{
|
||
$parent = FileCate::find($post['pid']);
|
||
$level = $parent['level'] + 1;
|
||
}
|
||
if($post['sort'] < 0) {
|
||
throw new \think\Exception('排序值不能为负数');
|
||
}
|
||
FileCate::create([
|
||
'name' => $post['name'],
|
||
'pid' => $post['pid'],
|
||
'sort' => $post['sort'],
|
||
'shop_id' => $post['shop_id'],
|
||
'level' => $level,
|
||
'type' => $post['type']
|
||
]);
|
||
|
||
return true;
|
||
} catch (Exception $e) {
|
||
static::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* NOTE: 编辑分类
|
||
* @author: 张无忌
|
||
* @param $post
|
||
* @return bool
|
||
*/
|
||
public static function editCate($post)
|
||
{
|
||
try {
|
||
self::checkEdit($post);
|
||
|
||
FileCate::update([
|
||
'name' => $post['name'],
|
||
'pid' => $post['cid'],
|
||
'sort' => $post['sort'],
|
||
'update_time' => time()
|
||
], ['id'=>$post['id']]);
|
||
|
||
self::updateLevel($post['id']);
|
||
|
||
return true;
|
||
} catch (Exception $e) {
|
||
static::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* NOTE: 删除分类
|
||
* @author: 张无忌
|
||
* @param $id
|
||
* @return bool
|
||
*/
|
||
public static function delCate($id)
|
||
{
|
||
try {
|
||
self::checkDel($id);
|
||
|
||
FileCate::update([
|
||
'del' => 1,
|
||
'update_time' => time()
|
||
], ['id'=>$id]);
|
||
|
||
return true;
|
||
} catch (Exception $e) {
|
||
static::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* NOTE: 下拉框树状结构
|
||
* @param $type
|
||
* @return array
|
||
* @author: 张无忌
|
||
*/
|
||
public static function categoryToSelect($get)
|
||
{
|
||
try {
|
||
$model = new FileCate();
|
||
$lists = $model->field(true)
|
||
->where('del', '=', 0)
|
||
->where('type', '=', $get['type'])
|
||
->where('shop_id', '=', $get['shop_id'])
|
||
->order('id', 'asc')
|
||
->select();
|
||
|
||
$tree = [];
|
||
foreach ($lists as $val) {
|
||
|
||
if ($val['pid'] != 0) {
|
||
continue;
|
||
}
|
||
|
||
$tree[$val['id']] = "|----" . $val['name'];
|
||
foreach ($lists as $val2) {
|
||
if ($val2['pid'] == $val['id']) {
|
||
$tree[$val2['id']] = "|--------" . $val2['name'];
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
return $tree;
|
||
} catch (Exception $e) {
|
||
return [];
|
||
}
|
||
}
|
||
|
||
public static function categoryToSelectThree($get)
|
||
{
|
||
try {
|
||
$model = new FileCate();
|
||
$lists = $model->field(true)
|
||
->where('del', '=', 0)
|
||
->where('type', '=', $get['type'])
|
||
->where('shop_id', '=', $get['shop_id'])
|
||
->order('id', 'asc')
|
||
->select();
|
||
|
||
$tree = [];
|
||
foreach ($lists as $val) {
|
||
|
||
if ($val['pid'] != 0) {
|
||
continue;
|
||
}
|
||
|
||
$tree[$val['id']] = "|----" . $val['name'];
|
||
foreach ($lists as $val2) {
|
||
if ($val2['pid'] == $val['id']) {
|
||
$tree[$val2['id']] = "|--------" . $val2['name'];
|
||
foreach($lists as $val3) {
|
||
if($val3['pid'] == $val2['id']) {
|
||
$tree[$val3['id']] = "|------------" . $val3['name'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
return $tree;
|
||
} catch (Exception $e) {
|
||
return [];
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 编辑验证
|
||
*/
|
||
public static function checkEdit($post)
|
||
{
|
||
if(empty(trim($post['name']))) {
|
||
throw new \think\Exception('分类名称不能为空');
|
||
}
|
||
|
||
if($post['id'] == $post['cid']) {
|
||
throw new \think\Exception('上级不能是自己');
|
||
}
|
||
|
||
if($post['sort'] < 0) {
|
||
throw new \think\Exception('排序值不能为负数');
|
||
}
|
||
|
||
// 获取后代分类
|
||
$lists = FileCate::where(['del'=>0 ])->select();
|
||
$lists = !empty($lists) ? $lists->toArray() : [];
|
||
$childs = self::getChildCid($lists, $post['id'], true);
|
||
if(in_array($post['cid'], $childs)) {
|
||
throw new \think\Exception('上级不能自己的后代分类');
|
||
}
|
||
|
||
//层次结构不能超过三层
|
||
$level = self::calcLevel($post['id']);
|
||
$parent = FileCate::find($post['cid']);
|
||
if($level + $parent['level'] > 3) {
|
||
throw new \think\Exception('分类不允许超过三级');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 计算当前分类下共有多少层分类
|
||
* @param $lists
|
||
* @param $pid
|
||
* @return int
|
||
*/
|
||
public static function calcLevel($id)
|
||
{
|
||
$level = 1;
|
||
$two_ids = FileCate::where(['pid' => $id, 'del' => 0])->column('id');
|
||
if ($two_ids) {
|
||
$level = 2;
|
||
$three_ids = FileCate::where([
|
||
['del', '=', 0],
|
||
['pid', 'in', $two_ids]
|
||
])->column('id');
|
||
if ($three_ids) $level = 3;
|
||
}
|
||
return $level;
|
||
}
|
||
|
||
/**
|
||
* 更新自己及后代分类的level
|
||
*/
|
||
public static function updateLevel($id)
|
||
{
|
||
$me = FileCate::find($id);
|
||
if($me['pid'] == 0) { // 上级为顶级分类
|
||
FileCate::update([
|
||
'id' => $id,
|
||
'level' => 1,
|
||
'update_time' => time()
|
||
]);
|
||
$two_ids = FileCate::where([
|
||
'pid' => $id,
|
||
'del' => 0
|
||
])->column('id');
|
||
if($two_ids) {
|
||
FileCate::where('id', 'in', $two_ids)->update([
|
||
'level' => 2,
|
||
'update_time' => time()
|
||
]);
|
||
$three_ids = FileCate::where([
|
||
['pid', 'in', $two_ids],
|
||
['del', '=', 0]
|
||
])->column('id');
|
||
if($three_ids) {
|
||
FileCate::where('id', 'in', $three_ids)->update([
|
||
'level' => 3,
|
||
'update_time' => time()
|
||
]);
|
||
}
|
||
}
|
||
}else{
|
||
$parent = FileCate::find($me['pid']);
|
||
if($parent['level'] == 1) {
|
||
FileCate::update([
|
||
'id' => $id,
|
||
'level' => 2,
|
||
'update_time' => time()
|
||
]);
|
||
$three_ids = FileCate::where([
|
||
'pid' => $id,
|
||
'del' => 0
|
||
])->column('id');
|
||
if($three_ids) {
|
||
FileCate::where('id', 'in', $three_ids)->update([
|
||
'level' => 3,
|
||
'update_time' => time()
|
||
]);
|
||
}
|
||
}else if($parent['level'] == 2){
|
||
FileCate::update([
|
||
'id' => $id,
|
||
'level' => 3,
|
||
'update_time' => time()
|
||
]);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 删除验证
|
||
*/
|
||
public static function checkDel($id)
|
||
{
|
||
$file = File::where([
|
||
'cid' => $id,
|
||
'del' => 0
|
||
])->findOrEmpty();
|
||
if(!$file->isEmpty()) {
|
||
throw new \think\Exception('有文件正在使用当前分类,不允许删除');
|
||
}
|
||
$son = FileCate::where([
|
||
'del' => 0,
|
||
'pid' => $id
|
||
])->findOrEmpty();
|
||
if(!$son->isEmpty()){
|
||
throw new \think\Exception('分类下还有子分类,不允许删除');
|
||
}
|
||
}
|
||
} |