项目相关接口、图片视频上传

This commit is contained in:
2025-05-06 16:18:22 +08:00
parent cbd0b19b91
commit cd304275b8
14 changed files with 416 additions and 21 deletions

View File

@@ -141,16 +141,18 @@ class BaseController
$result = [];
foreach ($checkFields as $fieldName) {
$checkValue = $data[$fieldName] ?? '';
if (is_array($checkValue)) {
$checkValue = json_encode($checkValue);
}
if (mb_strlen(strval($checkValue)) <= 0 && !in_array($fieldName, $this->notRequest)) {
$requiredFields[] = $fieldName;
if (is_array($checkValue) && !empty($checkValue)) {
$result[$fieldName] = $checkValue;
} else {
if (!empty($checkValue) || $checkValue === 0) {
$result[$fieldName] = $checkValue;
if (mb_strlen(strval($checkValue)) <= 0 && !in_array($fieldName, $this->notRequest)) {
$requiredFields[] = $fieldName;
} else {
if (!empty($checkValue) || $checkValue === 0) {
$result[$fieldName] = $checkValue;
}
}
}
}
if ($throw && $requiredFields) {

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\BaseApp\BaseController;
use App\Service\CategoryService;
use App\Service\LabelService;
use App\Service\ProjectService;
use App\Service\RoleService;
class CategoryController extends BaseController
{
//
public function __construct()
{
parent::__construct();
$this->service = CategoryService::getInstance();
$this->insertField = ['name', 'pid', 'value'];
$this->updateField = ['id', 'name', 'pid', 'value'];
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers;
use App\BaseApp\BaseController;
use App\Service\LabelService;
use App\Service\ProjectService;
use App\Service\RoleService;
class LabelController extends BaseController
{
//
public function __construct()
{
parent::__construct();
$this->service = LabelService::getInstance();
$this->insertField = ['name', 'pid', 'value'];
$this->updateField = ['id', 'name', 'pid', 'value'];
}
}

View File

@@ -13,7 +13,8 @@ class ProjectController extends BaseController
{
parent::__construct();
$this->service = ProjectService::getInstance();
$this->insertField = [ 'user_id', 'title', 'cover', 'description', 'video_url', 'author_id', 'price', 'preferential_price', 'front', 'service', 'deploy', 'status'];
$this->updateField = [ 'id', 'user_id', 'title', 'cover', 'description', 'video_url', 'author_id', 'price', 'preferential_price', 'front', 'service', 'deploy', 'status'];
$this->insertField = [ 'title', 'cover', 'description', 'category_id', 'video_url', 'price', 'front', 'service', 'deploy', 'status'];
$this->updateField = [ 'id', 'title', 'cover', 'description', 'category_id', 'video_url', 'price', 'front', 'service', 'deploy', 'status'];
$this->notRequest = ['features', 'screenshots', 'tags'];
}
}

View File

@@ -14,7 +14,7 @@ class RoleController extends BaseController
{
parent::__construct();
$this->service = RoleService::getInstance();
$this->insertField = [ 'user_id', 'title', 'cover', 'description', 'video_url', 'author_id', 'price', 'preferential_price', 'front', 'service', 'deploy', 'status'];
$this->updateField = [ 'id', 'user_id', 'title', 'cover', 'description', 'video_url', 'author_id', 'price', 'preferential_price', 'front', 'service', 'deploy', 'status'];
$this->insertField = ['name', 'pid', 'value'];
$this->updateField = ['id', 'name', 'pid', 'value'];
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers;
use App\BaseApp\BaseController;
use App\Service\common\UploadService;
use App\Service\ProjectService;
use App\Service\RoleService;
use Illuminate\Http\JsonResponse;
class UploadController extends BaseController
{
//
public function __construct()
{
parent::__construct();
$this->service = UploadService::getInstance();
}
/**
* 图片上传
* @Method POST
* @return JsonResponse
*/
public function image()
{
$file = request()->file('file');
return jok(
$this->service->uploadImage($file),
'上传成功'
);
}
/**
* 视频上传
* @Method POST
* @return JsonResponse
*/
public function video()
{
$file = request()->file('file');
return jok(
$this->service->uploadVideo($file),
'上传成功'
);
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace App\Service;
use App\BaseApp\BaseService;
use App\Models\CategoryModel;
use App\Models\LabelModel;
use App\Models\ProjectModel;
use App\Models\RoleModel;
use App\Models\UserModel;
use Exception;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class CategoryService extends BaseService
{
public function __construct()
{
parent::__construct();
$this->selectField = ['id', 'name', 'created_at', 'updated_at', 'deleted_at'];
$this->model = CategoryModel::class;
}
/**
* 获取项目列表
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function list(): array
{
return $this->getPageList();
}
public function detail($id)
{
return $this->getDetail($id);
}
/**
* 项目下拉列表
* @return mixed
*/
public function option()
{
$this->optionField = ['id', 'name'];
return $this->getOption();
}
/**
* 创建项目
* @param $params
* @return mixed
* @throws Exception
*/
public function create($params): mixed
{
return $this->insert($params);
}
/**
* 编辑项目
* @param $id
* @param $params
* @return mixed
* @throws Exception
*/
public function update($id, $params): mixed
{
return $this->save($id, $params);
}
/**
* 删除项目
* @param $ids
* @return mixed|true
* @throws Exception
*/
public function delete($ids): mixed
{
return $this->del($ids);
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace App\Service;
use App\BaseApp\BaseService;
use App\Models\LabelModel;
use App\Models\ProjectModel;
use App\Models\RoleModel;
use App\Models\UserModel;
use Exception;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class LabelService extends BaseService
{
public function __construct()
{
parent::__construct();
$this->selectField = ['id', 'name', 'created_at', 'updated_at', 'deleted_at'];
$this->model = LabelModel::class;
}
/**
* 获取项目列表
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function list(): array
{
return $this->getPageList();
}
public function detail($id)
{
return $this->getDetail($id);
}
/**
* 项目下拉列表
* @return mixed
*/
public function option()
{
$this->optionField = ['id', 'name'];
return $this->getOption();
}
/**
* 创建项目
* @param $params
* @return mixed
* @throws Exception
*/
public function create($params): mixed
{
return $this->insert($params);
}
/**
* 编辑项目
* @param $id
* @param $params
* @return mixed
* @throws Exception
*/
public function update($id, $params): mixed
{
return $this->save($id, $params);
}
/**
* 删除项目
* @param $ids
* @return mixed|true
* @throws Exception
*/
public function delete($ids): mixed
{
return $this->del($ids);
}
}

View File

@@ -3,9 +3,13 @@
namespace App\Service;
use App\BaseApp\BaseService;
use App\Models\FeatureModel;
use App\Models\ProjectLabelRelationModel;
use App\Models\ProjectModel;
use App\Models\ScreenshotModel;
use App\Models\UserModel;
use Exception;
use Illuminate\Support\Facades\DB;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
@@ -66,7 +70,66 @@ class ProjectService extends BaseService
$params['author_id'] = $params['author_id']?? $this->userId;
// TODO 项目
$screenshots = $params['screenshots'];
return $this->insert($params);
$labels = $params['tags'];
$features = $params['features'];
unset($params['screenshots'], $params['tags'], $params['features']);
DB::beginTransaction();
try {
$insertProjectModel = $this->insert($params);
$labelInsertData = [];
foreach ($labels as $label) {
$labelInsertData[] = [
'project_id' => $insertProjectModel,
'label_id' => $label,
'created_at' => get_time()
];
}
$insertLabelModel = ProjectLabelRelationModel::insert($labelInsertData);
if (!$insertLabelModel) {
$this->utils->errorThrow('标签添加失败');
}
$featureInsertData = [];
foreach ($features as $feature) {
$featureInsertData[] = [
'project_id' => $insertProjectModel,
'name' => $feature,
'created_at' => get_time()
];
}
$insertFeatureModel = FeatureModel::insert($featureInsertData);
if (!$insertFeatureModel) {
$this->utils->errorThrow('项目功能添加失败');
}
$screenInsertData = [];
foreach ($screenshots as $screenshot) {
$screenInsertData[] = [
'project_id' => $insertProjectModel,
'url' => $screenshot,
'created_at' => get_time()
];
}
$insertScreenModel = ScreenshotModel::insert($screenInsertData);
if (!$insertScreenModel) {
$this->utils->errorThrow('项目截图添加失败');
}
DB::commit();
} catch (Exception $e) {
DB::rollBack();
ds([
'message' => $e->getMessage(),
'line' => $e->getLine(),
'file' => $e->getFile(),
'code' => $e->getCode(),
]);
$this->utils->errorThrow($e->getMessage());
}
return $insertProjectModel;
}
/**

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Service\common;
use App\BaseApp\BaseService;
use App\Models\ProjectModel;
use App\Models\RoleModel;
use App\Models\UserModel;
use App\Service\common\upload\QiniuStorageService;
use Exception;
use Illuminate\Support\Str;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class UploadService extends BaseService
{
public function __construct()
{
parent::__construct();
$this->model = RoleModel::class;
}
public function uploadImage($file)
{
// 获取文件后缀
$ext = $file->getClientOriginalExtension();
$key = 'spa/image/'. date('Ymd') . '/' . 'cc_upload_'. Str::random(). uniqid() . '.' . $ext;
return [
'key' => $key,
'url' => 'https://img2.baidu.com/it/u=1629222614,1358629025&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500&a='. rand(1111111, 9999999)
];
return QiniuStorageService::getInstance()->uploadImage($file, $key);
}
public function uploadVideo($file)
{
// 获取文件后缀
$ext = $file->getClientOriginalExtension();
$key = 'spa/video/'. date('Ymd') . '/' . 'cc_upload_'. Str::random(). uniqid() . '.' . $ext;
return [
'key' => $key,
'url' => 'http://d-jy.nailaoyun.cn/storage/video//20250410/ca1bbbb3af5853c7fc4ef23b8a918922.mp4?a='. rand(1111111, 9999999)
];
return QiniuStorageService::getInstance()->uploadVideo($file, $key);
}
}

View File

@@ -2,13 +2,18 @@
namespace App\Service\common\upload;
use App\BaseApp\BaseService;
use Exception;
use Qiniu\Auth;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
class QiniuStorageService
class QiniuStorageService extends BaseService
{
/**
* @var mixed 单例实例,确保该类只有一个全局实例
*/
protected static mixed $_instance;
private $accessKey;
private $secretKey;
private $bucket;
@@ -16,10 +21,26 @@ class QiniuStorageService
public function __construct()
{
parent::__construct();
$this->accessKey = config('cc.oss.qiniu.access_key');
$this->secretKey = config('cc.oss.qiniu.secret_key');
$this->bucket = config('cc.oss.qiniu.bucket');
$this->domain = config('cc.oss.qiniu.');
$this->domain = config('cc.oss.qiniu.domain');
}
/**
* 获取实例
* @return null|static
*/
public static function getInstance(): null|static
{
$name = get_called_class();
if (!isset(self::$_instance[$name])) {
self::$_instance[$name] = new static();
}
return self::$_instance[$name];
}
/**