作者 赵彬吉

update

<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\AttrLogic;
use App\Http\Requests\Bside\product\AttrRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class AttrController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/15
*/
class AttrController extends BaseController
{
public function index(AttrLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'remark', 'value_num']);
return $this->success($data);
}
public function info(Request $request, AttrLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'remark', 'values']));
}
public function save(AttrRequest $request, AttrLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, AttrLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
... ... @@ -87,6 +87,17 @@ class BaseLogic
*/
public function getInfo($id)
{
$info = $this->getCacheInfo($id);
return $this->success($info->toArray());
}
/**
* @param $id
* @return mixed
* @author zbj
* @date 2023/4/15
*/
public function getCacheInfo($id){
if($this->is_cache){
$info = Cache::get($this->getInfoCacheKey($id));
if (!$info) {
... ... @@ -98,7 +109,7 @@ class BaseLogic
}else{
$info = $this->model->find($id);
}
return $this->success($info->toArray());
return $info;
}
/**
... ... @@ -110,23 +121,25 @@ class BaseLogic
* @date 2023/4/13
*/
public function save($param){
if(empty($param['id'])){
$param['created_at'] = $param['updated_at'] = date('Y-m-d H:i:s');
$res = $this->model->insert($param);
}else{
$info = $this->getInfo($param['id']);
if(!$info){
if(!empty($param['id'])){
$this->model = $this->getCacheInfo($param['id']);
if(!$this->model){
$this->fail('数据不存在或者已经删除');
}
$param['updated_at'] = date('Y-m-d H:i:s');
$res = $this->model->where('id', $param['id'])->update($param);
}
foreach ($param as $name => $value){
$this->model[$name] = $value;
}
$res = $this->model->save();
if($res){
//清缓存
if($this->is_cache && !empty($param['id'])){
Cache::forget($this->getInfoCacheKey($param['id']));
}
return $this->success();
return $this->success(['id' => $this->model->id]); //返回保存的数据id
}else{
$this->fail('保存失败');
}
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Attr;
use App\Models\Product\AttrValue;
use Illuminate\Support\Facades\DB;
/**
* Class AttrLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/15
*/
class AttrLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Attr();
}
public function getInfo($id){
$info = parent::getCacheInfo($id);
$info->values;
return $this->success($info->toArray());
}
public function save($param){
$param['values'] = array_unique($param['values']);
DB::beginTransaction();
try {
//删除之前的参数值
if(!empty($param['id'])){
AttrValue::where('attr_id', $param['id'])->delete();
}
//保存参数名称
$data = $param;
unset($data['values']);
$data['value_num'] = count($param['values']);
$res = parent::save($data);
$attr_id = $res['id'];
//保存参数值
$values = [];
foreach ($param['values'] as $value){
$values[] = [
'attr_id' => $attr_id,
'value' => $value
];
}
AttrValue::insert($values);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('保存失败');
}
return $this->success();
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
}
return parent::delete($ids);
}
}
... ...
... ... @@ -47,7 +47,7 @@ class CategoryLogic extends BaseLogic
}
//todo 是否有对应商品
return parent::delete($ids);
}
return parent::delete($ids);
}
}
... ...
... ... @@ -31,7 +31,7 @@ class KeywordLogic extends BaseLogic
//todo 是否有关联商品
return parent::delete($ids);
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class AttrRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/15
*/
class AttrRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|max:30',
'remark' => 'max:200',
'values' => 'required|array'
];
}
public function messages()
{
return [
'title.required' => '请输入参数名称',
'title.max' => '参数名称不能超过30个字符',
'remark.max' => '备注不能超过200个字符',
'values.required' => '请添加参数值',
'values.array' => '参数值格式异常',
];
}
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Attr extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_attr';
public function values()
{
return $this->hasMany(AttrValue::class, 'attr_id', 'id')->orderBy('id');
}
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
class AttrValue extends Base
{
//设置关联表名
protected $table = 'gl_product_attr_value';
}
... ...
... ... @@ -46,5 +46,11 @@ Route::group([], function () {
Route::get('keyword/info', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'info'])->name('product_keyword_info');
Route::post('keyword/save', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'save'])->name('product_keyword_save');
Route::any('keyword/delete', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'delete'])->name('product_keyword_delete');
//产品参数
Route::get('attr', [\App\Http\Controllers\Bside\Product\AttrController::class, 'index'])->name('product_attr');
Route::get('attr/info', [\App\Http\Controllers\Bside\Product\AttrController::class, 'info'])->name('product_attr_info');
Route::post('attr/save', [\App\Http\Controllers\Bside\Product\AttrController::class, 'save'])->name('product_attr_save');
Route::any('attr/delete', [\App\Http\Controllers\Bside\Product\AttrController::class, 'delete'])->name('product_attr_delete');
});
});
... ...