作者 刘锟

Merge remote-tracking branch 'origin/develop' into akun

@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 namespace App\Http\Controllers\Bside; 3 namespace App\Http\Controllers\Bside;
4 4
5 use App\Enums\Common\Code; 5 use App\Enums\Common\Code;
  6 +use App\Exceptions\BsideGlobalException;
6 use App\Helper\Common; 7 use App\Helper\Common;
7 use App\Http\Controllers\Controller; 8 use App\Http\Controllers\Controller;
8 use App\Http\Requests\Scene; 9 use App\Http\Requests\Scene;
@@ -144,6 +145,16 @@ class BaseController extends Controller @@ -144,6 +145,16 @@ class BaseController extends Controller
144 return response()->json($response,200,$this->header); 145 return response()->json($response,200,$this->header);
145 } 146 }
146 147
  148 + /**
  149 + * @notes: 错误抛出
  150 + * @param string $code
  151 + * @param string $message
  152 + * @throws BsideGlobalException
  153 + */
  154 + public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
  155 + {
  156 + throw new BsideGlobalException($code, $message);
  157 + }
147 158
148 /** 159 /**
149 * @name :写入操作日志 160 * @name :写入操作日志
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers\Bside\FileManage;
  4 +
  5 +
  6 +use App\Enums\Common\Code;
  7 +use App\Http\Controllers\Bside\BaseController;
  8 +use App\Models\FileManage\FileManage;
  9 +use App\Models\Project\Project;
  10 +use App\Services\CosService;
  11 +use Illuminate\Http\Request;
  12 +
  13 +/**
  14 + * 文件管理
  15 + * Class FileManageController
  16 + * @package App\Http\Controllers\Bside\FileManage
  17 + * @author zbj
  18 + * @date 2023/10/9
  19 + */
  20 +class FileManageController extends BaseController
  21 +{
  22 + protected $upload_config;
  23 +
  24 + public function __construct(Request $request)
  25 + {
  26 + parent::__construct($request);
  27 + //判断是否开启
  28 + $project = Project::find($this->user['project_id']);
  29 + if(empty($project['is_upload_manage'])){
  30 + $this->fail('文件上传管理功能未开启');
  31 + }
  32 + $this->upload_config = $project['upload_config'];
  33 + }
  34 +
  35 + public function index(FileManage $fileManage){
  36 + $this->map['project_id'] = $this->user['project_id'];
  37 + $this->request['name'] && $this->map['name'] = ['like','%'.$this->request['name'].'%'];
  38 + $lists = $fileManage->lists($this->map, $this->page, $this->row);
  39 + $this->response('success',Code::SUCCESS,$lists);
  40 + }
  41 +
  42 + public function upload(Request $request, FileManage $fileManage){
  43 + $request->validate([
  44 + 'file'=>['required'],
  45 + ],[
  46 + 'file.required'=>'请上传文件',
  47 + ]);
  48 + $file = $request->file('file');
  49 +
  50 + $data = $this->checkFile($file);
  51 +
  52 + $path = '/file_manage/' . $this->user['project_id'] . '/' . date('Ymd');
  53 + $fileName = uniqid().rand(10000,99999).'.'.$file->getClientOriginalExtension();
  54 +
  55 + $cosService = new CosService();
  56 + $cosService->uploadFile($file,$path,$fileName);
  57 +
  58 + $data['project_id'] = $this->user['project_id'];
  59 + $data['path'] = $path.'/'.$fileName;
  60 +
  61 + $rs = $fileManage->add($data);
  62 + if ($rs === false) {
  63 + $this->fail('上传失败');
  64 + }
  65 + $this->response('success');
  66 + }
  67 +
  68 + protected function checkFile($file){
  69 + $count = FileManage::where('project_id', $this->user['project_id'])->count();
  70 + if($count >= $this->upload_config['upload_max_num']){
  71 + $this->fail('超出最大上传文件数量限制:'. $this->upload_config['upload_max_num']);
  72 + }
  73 + $size = $file->getSize();
  74 + if($file->getSize()/1024/1024 > $this->upload_config['upload_max_size']){
  75 + $this->fail('超出最大允许上传文件大小:'. $this->upload_config['upload_max_size'] .'M');
  76 + }
  77 + $extension = $file->getClientOriginalExtension();
  78 + if(!in_array($extension, explode(',', $this->upload_config['allow_file_type']))){
  79 + $this->fail('不允许上传的文件类型');
  80 + }
  81 + $hash = hash_file('md5', $file->getPathname());
  82 + $info = FileManage::where('hash', $hash)->first();
  83 + if($info){
  84 + $this->fail('文件已存在');
  85 + }
  86 +
  87 + return [
  88 + 'size' => $size,
  89 + 'extension' => $extension,
  90 + 'hash' => $hash,
  91 + 'name' => $file->getClientOriginalName(),
  92 + 'mime' => $file->getMimeType(),
  93 + ];
  94 + }
  95 +
  96 + public function delete(Request $request){
  97 + $request->validate([
  98 + 'id'=>'required',
  99 + ],[
  100 + 'id.required' => 'ID不能为空',
  101 + ]);
  102 + $fileManage = FileManage::find($this->param['id']);
  103 + if(!$fileManage){
  104 + $this->response('数据不存在或者已经删除');
  105 + }
  106 + $fileManage->delete();
  107 +
  108 + $this->response('success');
  109 + }
  110 +}
@@ -6,6 +6,7 @@ use App\Enums\Common\Code; @@ -6,6 +6,7 @@ use App\Enums\Common\Code;
6 use App\Enums\Common\Common; 6 use App\Enums\Common\Common;
7 use App\Models\Manage\LoginLog; 7 use App\Models\Manage\LoginLog;
8 use App\Models\Manage\Manage; 8 use App\Models\Manage\Manage;
  9 +use App\Models\Manage\ManageHr;
9 use App\Models\Manage\MenuSpecial; 10 use App\Models\Manage\MenuSpecial;
10 use App\Models\Service\Service; 11 use App\Models\Service\Service;
11 use App\Models\Sms\SmsLog; 12 use App\Models\Sms\SmsLog;
@@ -68,6 +69,8 @@ class LoginLogic extends BaseLogic @@ -68,6 +69,8 @@ class LoginLogic extends BaseLogic
68 LoginLog::addLog($manage->id,$type); 69 LoginLog::addLog($manage->id,$type);
69 //获取当前用户特殊模块权限 70 //获取当前用户特殊模块权限
70 $manage['special'] = $this->getSpecialMenu($manage['id']); 71 $manage['special'] = $this->getSpecialMenu($manage['id']);
  72 + //岗位
  73 + $manage['entry_position'] = ManageHr::where('manage_id', $manage['id'])->value('entry_position')?:0;
71 return $this->success($manage->makeVisible('token')->toArray()); 74 return $this->success($manage->makeVisible('token')->toArray());
72 } 75 }
73 76
@@ -149,6 +149,17 @@ class ProjectLogic extends BaseLogic @@ -149,6 +149,17 @@ class ProjectLogic extends BaseLogic
149 $param['confirm_file'] = Arr::a2s($param['confirm_file']); 149 $param['confirm_file'] = Arr::a2s($param['confirm_file']);
150 } 150 }
151 unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],$param['online_check'],$param['project_after']); 151 unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],$param['online_check'],$param['project_after']);
  152 +
  153 + //文件上传默认值
  154 + if($param['is_upload_manage']){
  155 + $param['upload_config'] = [
  156 + 'upload_max_num' => $param['upload_config']['upload_max_num'] ?? 100,
  157 + 'allow_file_type' => $param['upload_config']['allow_file_type'] ?? 'doc,docx,xls,xlsx,pdf,txt,csv,png,jpg,jpeg',
  158 + 'upload_max_size' => $param['upload_config']['upload_max_size'] ?? 5,
  159 + ];
  160 + }
  161 +
  162 +
152 $this->model->edit($param,['id'=>$param['id']]); 163 $this->model->edit($param,['id'=>$param['id']]);
153 Common::del_user_cache($this->model->getTable(),$param['id']); 164 Common::del_user_cache($this->model->getTable(),$param['id']);
154 return $this->success(); 165 return $this->success();
@@ -190,6 +190,9 @@ class UserLoginLogic @@ -190,6 +190,9 @@ class UserLoginLogic
190 $info['is_domain'] = empty($project['deploy_optimize']['domain']) ? 0 : 1; 190 $info['is_domain'] = empty($project['deploy_optimize']['domain']) ? 0 : 1;
191 $info['domain'] = (!empty($project['deploy_optimize']['domain']) ? 191 $info['domain'] = (!empty($project['deploy_optimize']['domain']) ?
192 ((new DomainInfo())->getDomain($project['deploy_optimize']['domain'])) : ($project['deploy_build']['test_domain'] ?? '')); 192 ((new DomainInfo())->getDomain($project['deploy_optimize']['domain'])) : ($project['deploy_build']['test_domain'] ?? ''));
  193 + $info['is_customized'] = $project['is_customized'];
  194 + $info['is_upload_manage'] = $project['is_upload_manage'];
  195 + $info['upload_config'] = $project['upload_config'];
193 //保存项目缓存 196 //保存项目缓存
194 Cache::put('user-'.$info['project_id'],$project,$minutes = null); 197 Cache::put('user-'.$info['project_id'],$project,$minutes = null);
195 return $this->success($info); 198 return $this->success($info);
@@ -26,7 +26,7 @@ class Logic @@ -26,7 +26,7 @@ class Logic
26 26
27 protected $side; 27 protected $side;
28 28
29 - protected $is_cache = true; //是否缓存数据 29 + protected $is_cache = false; //是否缓存数据
30 30
31 protected $with = []; //预加载多个关联 31 protected $with = []; //预加载多个关联
32 32
  1 +<?php
  2 +
  3 +namespace App\Models\FileManage;
  4 +
  5 +use App\Models\Base;
  6 +use Illuminate\Database\Eloquent\SoftDeletes;
  7 +
  8 +/**
  9 + * Class FileManage
  10 + * @package App\Models\FileManage
  11 + * @author zbj
  12 + * @date 2023/10/10
  13 + */
  14 +class FileManage extends Base
  15 +{
  16 +
  17 + protected $table = 'gl_file_manage';
  18 + //连接数据库
  19 + protected $connection = 'custom_mysql';
  20 + use SoftDeletes;
  21 +
  22 + public $hidden = ['deleted_at'];
  23 + public $appends = ['url'];
  24 +
  25 + public function getUrlAttribute($value){
  26 + return getImageUrl($this->path);
  27 + }
  28 +}
@@ -268,6 +268,14 @@ class Project extends Base @@ -268,6 +268,14 @@ class Project extends Base
268 return $value; 268 return $value;
269 } 269 }
270 270
  271 + public function getUploadConfigAttribute($value)
  272 + {
  273 + if($value){
  274 + $value = Arr::s2a($value);
  275 + }
  276 + return $value;
  277 + }
  278 +
271 /** 279 /**
272 * 根据域名获取项目信息 280 * 根据域名获取项目信息
273 * @author zbj 281 * @author zbj
@@ -314,6 +314,12 @@ Route::middleware(['bloginauth'])->group(function () { @@ -314,6 +314,12 @@ Route::middleware(['bloginauth'])->group(function () {
314 Route::any('/statusNum', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'statusNumber'])->name('product_statusNum'); 314 Route::any('/statusNum', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'statusNumber'])->name('product_statusNum');
315 Route::any('/del', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'del'])->name('custom_del'); 315 Route::any('/del', [\App\Http\Controllers\Bside\Template\CustomTemplateController::class, 'del'])->name('custom_del');
316 }); 316 });
  317 + // 菜单组
  318 + Route::prefix('nav_group')->group(function () {
  319 + Route::any('/', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'index'])->name('nav_group');
  320 + Route::any('/save', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'save'])->name('nav_group_save');
  321 + Route::any('/delete', [\App\Http\Controllers\Bside\Nav\NavGroupController::class, 'delete'])->name('nav_group_delete');
  322 + });
317 // 导航栏编辑 323 // 导航栏编辑
318 Route::prefix('nav')->group(function () { 324 Route::prefix('nav')->group(function () {
319 Route::get('/', [\App\Http\Controllers\Bside\Nav\NavController::class, 'index'])->name('nav'); 325 Route::get('/', [\App\Http\Controllers\Bside\Nav\NavController::class, 'index'])->name('nav');
@@ -362,6 +368,13 @@ Route::middleware(['bloginauth'])->group(function () { @@ -362,6 +368,13 @@ Route::middleware(['bloginauth'])->group(function () {
362 Route::prefix('import')->group(function () { 368 Route::prefix('import')->group(function () {
363 Route::any('/add_task', [\App\Http\Controllers\Bside\Import\ImportController::class, 'save'])->name('import_add_task'); 369 Route::any('/add_task', [\App\Http\Controllers\Bside\Import\ImportController::class, 'save'])->name('import_add_task');
364 }); 370 });
  371 +
  372 + //文件管理
  373 + Route::prefix('file_manager')->group(function () {
  374 + Route::any('/', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'index'])->name('file_manager');
  375 + Route::any('/upload', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'upload'])->name('file_manager_upload');
  376 + Route::any('/delete', [\App\Http\Controllers\Bside\FileManage\FileManageController::class, 'delete'])->name('file_manager_delete');
  377 + });
365 }); 378 });
366 //无需登录验证的路由组 379 //无需登录验证的路由组
367 Route::group([], function () { 380 Route::group([], function () {