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('分类下还有子分类,不允许删除');
 | ||
|         }
 | ||
|     }
 | ||
| } |