作者 赵彬吉

file manage

... ... @@ -3,6 +3,7 @@
namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Common;
use App\Http\Controllers\Controller;
use App\Http\Requests\Scene;
... ... @@ -144,6 +145,16 @@ class BaseController extends Controller
return response()->json($response,200,$this->header);
}
/**
* @notes: 错误抛出
* @param string $code
* @param string $message
* @throws BsideGlobalException
*/
public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
{
throw new BsideGlobalException($code, $message);
}
/**
* @name :写入操作日志
... ...
<?php
namespace App\Http\Controllers\Bside\FileManage;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Models\FileManage\FileManage;
use App\Models\Project\Project;
use App\Services\CosService;
use Illuminate\Http\Request;
/**
* 文件管理
* Class FileManageController
* @package App\Http\Controllers\Bside\FileManage
* @author zbj
* @date 2023/10/9
*/
class FileManageController extends BaseController
{
protected $upload_config;
public function __construct(Request $request)
{
parent::__construct($request);
//判断是否开启
$project = Project::find($this->user['project_id']);
if(empty($project['is_upload_manage'])){
$this->fail('文件上传管理功能未开启');
}
$this->upload_config = $project['upload_config'];
}
public function index(FileManage $fileManage){
$this->map['project_id'] = $this->user['project_id'];
$this->request['name'] && $this->map['name'] = ['like','%'.$this->request['name'].'%'];
$lists = $fileManage->lists($this->map, $this->page, $this->row);
$this->response('success',Code::SUCCESS,$lists);
}
public function upload(Request $request, FileManage $fileManage){
$request->validate([
'file'=>['required'],
],[
'file.required'=>'请上传文件',
]);
$file = $request->file('file');
$data = $this->checkFile($file);
$path = '/file_manage/' . $this->user['project_id'] . '/' . date('Ymd');
$fileName = uniqid().rand(10000,99999).'.'.$file->getClientOriginalExtension();
$cosService = new CosService();
$cosService->uploadFile($file,$path,$fileName);
$data['project_id'] = $this->user['project_id'];
$data['path'] = $path.'/'.$fileName;
$rs = $fileManage->add($data);
if ($rs === false) {
$this->fail('上传失败');
}
$this->response('success');
}
protected function checkFile($file){
$count = FileManage::where('project_id', $this->user['project_id'])->count();
if($count >= $this->upload_config['upload_max_num']){
$this->fail('超出最大上传文件数量限制:'. $this->upload_config['upload_max_num']);
}
$size = $file->getSize();
if($file->getSize()/1024/1024 > $this->upload_config['upload_max_size']){
$this->fail('超出最大允许上传文件大小:'. $this->upload_config['upload_max_size'] .'M');
}
$extension = $file->getClientOriginalExtension();
if(!in_array($extension, explode(',', $this->upload_config['allow_file_type']))){
$this->fail('不允许上传的文件类型');
}
$hash = hash_file('md5', $file->getPathname());
$info = FileManage::where('hash', $hash)->first();
if($info){
$this->fail('文件已存在');
}
return [
'size' => $size,
'extension' => $extension,
'hash' => $hash,
'name' => $file->getClientOriginalName(),
'mime' => $file->getMimeType(),
];
}
public function delete(Request $request){
$request->validate([
'id'=>'required',
],[
'id.required' => 'ID不能为空',
]);
$fileManage = FileManage::find($this->param['id']);
if(!$fileManage){
$this->response('数据不存在或者已经删除');
}
$fileManage->delete();
$this->response('success');
}
}
... ...
... ... @@ -6,6 +6,7 @@ use App\Enums\Common\Code;
use App\Enums\Common\Common;
use App\Models\Manage\LoginLog;
use App\Models\Manage\Manage;
use App\Models\Manage\ManageHr;
use App\Models\Manage\MenuSpecial;
use App\Models\Service\Service;
use App\Models\Sms\SmsLog;
... ... @@ -68,6 +69,8 @@ class LoginLogic extends BaseLogic
LoginLog::addLog($manage->id,$type);
//获取当前用户特殊模块权限
$manage['special'] = $this->getSpecialMenu($manage['id']);
//岗位
$manage['entry_position'] = ManageHr::where('manage_id', $manage['id'])->value('entry_position')?:0;
return $this->success($manage->makeVisible('token')->toArray());
}
... ...
... ... @@ -149,6 +149,17 @@ class ProjectLogic extends BaseLogic
$param['confirm_file'] = Arr::a2s($param['confirm_file']);
}
unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],$param['online_check'],$param['project_after']);
//文件上传默认值
if($param['is_upload_manage']){
$param['upload_config'] = [
'upload_max_num' => $param['upload_config']['upload_max_num'] ?? 100,
'allow_file_type' => $param['upload_config']['allow_file_type'] ?? 'doc,docx,xls,xlsx,pdf,txt,csv,png,jpg,jpeg',
'upload_max_size' => $param['upload_config']['upload_max_size'] ?? 5,
];
}
$this->model->edit($param,['id'=>$param['id']]);
Common::del_user_cache($this->model->getTable(),$param['id']);
return $this->success();
... ...
... ... @@ -190,6 +190,9 @@ class UserLoginLogic
$info['is_domain'] = empty($project['deploy_optimize']['domain']) ? 0 : 1;
$info['domain'] = (!empty($project['deploy_optimize']['domain']) ?
((new DomainInfo())->getDomain($project['deploy_optimize']['domain'])) : ($project['deploy_build']['test_domain'] ?? ''));
$info['is_customized'] = $project['is_customized'];
$info['is_upload_manage'] = $project['is_upload_manage'];
$info['upload_config'] = $project['upload_config'];
//保存项目缓存
Cache::put('user-'.$info['project_id'],$project,$minutes = null);
return $this->success($info);
... ...
... ... @@ -26,7 +26,7 @@ class Logic
protected $side;
protected $is_cache = true; //是否缓存数据
protected $is_cache = false; //是否缓存数据
protected $with = []; //预加载多个关联
... ...
<?php
namespace App\Models\FileManage;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Class FileManage
* @package App\Models\FileManage
* @author zbj
* @date 2023/10/10
*/
class FileManage extends Base
{
protected $table = 'gl_file_manage';
//连接数据库
protected $connection = 'custom_mysql';
use SoftDeletes;
public $hidden = ['deleted_at'];
public $appends = ['url'];
public function getUrlAttribute($value){
return getImageUrl($this->path);
}
}
... ...
... ... @@ -268,6 +268,14 @@ class Project extends Base
return $value;
}
public function getUploadConfigAttribute($value)
{
if($value){
$value = Arr::s2a($value);
}
return $value;
}
/**
* 根据域名获取项目信息
* @author zbj
... ...
... ... @@ -314,6 +314,12 @@ Route::middleware(['bloginauth'])->group(function () {
Route::any('/statusNum', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'statusNumber'])->name('product_statusNum');
Route::any('/del', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'del'])->name('custom_del');
});
// 菜单组
Route::prefix('nav_group')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'index'])->name('nav_group');
Route::any('/save', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'save'])->name('nav_group_save');
Route::any('/delete', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'delete'])->name('nav_group_delete');
});
// 导航栏编辑
Route::prefix('nav')->group(function () {
Route::get('/', [\App\Http\Controllers\Bside\Nav\NavController::class, 'index'])->name('nav');
... ... @@ -362,6 +368,13 @@ Route::middleware(['bloginauth'])->group(function () {
Route::prefix('import')->group(function () {
Route::any('/add_task', [\App\Http\Controllers\Bside\Import\ImportController::class, 'save'])->name('import_add_task');
});
//文件管理
Route::prefix('file_manager')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'index'])->name('file_manager');
Route::any('/upload', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'upload'])->name('file_manager_upload');
Route::any('/delete', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'delete'])->name('file_manager_delete');
});
});
//无需登录验证的路由组
Route::group([], function () {
... ...