作者 赵彬吉

update

... ... @@ -4,9 +4,13 @@ namespace App\Helper;
/**
* 验证
* 数组类函数
* Class Arrays
* @package App\Helper
* @author zbj
* @date 2023/4/15
*/
class Arrays
class Arr extends \Illuminate\Support\Arr
{
/**
* 把返回的数据集转换成Tree
... ... @@ -48,7 +52,7 @@ class Arrays
/**
* 分隔字符串成数组并按照指定的函数过滤数组
* @param $string
* @param string $string
* @param string $filters
* @param string $delimiter
* @return array|false|string[]
... ... @@ -75,4 +79,50 @@ class Arrays
return $data;
}
/**
* 只保留指定的key 最多支持二维数组
* @param array $rows 需要过滤的数组
* @param array $keepKeys 需要保留的键名
* @return array|array[]|mixed
* @author zbj
* @date 2023/4/15
*/
public static function twoKeepKeys(array $rows, array $keepKeys)
{
if (!$rows || !$keepKeys) {
return $rows;
}
//第一维有字符串键名 就过滤第一维
$signle = false;
$keys = array_keys($rows);
foreach ($keys as $k) {
if (!is_numeric($k)) {
$signle = true;
$rows = [$rows];
break;
}
}
//将数组将非法的键去掉
$rows = array_map(function ($item) use ($keepKeys) {
if (!is_array($item)) {
return $item;
}
$illegalKeys = array_diff(array_keys($item), $keepKeys);//获取非法键名
if ($illegalKeys) {
foreach ($illegalKeys as $key) {
unset($item[$key]);
}
}
return $item;
}, $rows);
return $signle ? $rows[0] : $rows;
}
}
... ...
<?php
/**
* 生成路由标识
* @param $string
* @return string
* @author zbj
* @date 2023/4/15
*/
function generateRoute($string){
return trim(strtolower(preg_replace( '/[\W]+/', '-', trim($string))), '-');
}
... ...
... ... @@ -60,6 +60,7 @@ class BaseController extends Controller
'data' => $data,
'msg' => $code->description,
];
$this->header['token'] = $this->token;
return response()->json($response,200,$this->header);
}
/**
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\CategoryLogic;
use App\Http\Requests\Bside\product\CategoryRequest;
... ... @@ -20,12 +21,12 @@ class CategoryController extends BaseController
public function index(CategoryLogic $logic)
{
$map = [];
if(!empty($this->param['title'])){
$map[] = ['title', 'like', "%{$this->param['title']}%"];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$data = $logic->getList($map);
return $this->success($data);
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status','created_at'],0);
return $this->success(Arr::listToTree($data));
}
public function info(Request $request, CategoryLogic $logic){
... ... @@ -35,7 +36,7 @@ class CategoryController extends BaseController
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status']));
}
public function save(CategoryRequest $request, CategoryLogic $logic)
... ... @@ -55,4 +56,6 @@ class CategoryController extends BaseController
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
//todo Ai生成 关键词和描述
}
... ...
<?php
namespace App\Http\Controllers\Bside\Product;
use App\Helper\Arr;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\KeywordLogic;
use App\Http\Requests\Bside\product\KeywordRequest;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class KeywordController
* @package App\Http\Controllers\Bside
* @author zbj
* @date 2023/4/15
*/
class KeywordController extends BaseController
{
public function index(KeywordLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'route', 'status', 'created_at']);
return $this->success($data);
}
public function info(Request $request, KeywordLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'route', 'created_at']));
}
public function save(KeywordRequest $request, KeywordLogic $logic)
{
$this->param['route'] = generateRoute($this->param['title']);
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, KeywordLogic $logic)
{
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
... ... @@ -4,7 +4,7 @@ namespace App\Http\Logic\Bside;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Helper\Arrays;
use App\Helper\Arr;
use Illuminate\Support\Facades\Cache;
/**
... ... @@ -28,7 +28,7 @@ class BaseLogic
* @param array $data
* @return array
*/
public function success($data = [])
public function success(array $data = [])
{
return $data;
}
... ... @@ -39,7 +39,7 @@ class BaseLogic
* @param string $message
* @throws BsideGlobalException
*/
public function fail($message = "", string $code = Code::SYSTEM_ERROR)
public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
{
throw new BsideGlobalException($code, $message);
}
... ... @@ -49,12 +49,13 @@ class BaseLogic
* 列表
* @param array $map
* @param array $sort
* @param array $columns
* @param int $limit
* @return array
* @author zbj
* @date 2023/4/13
*/
public function getList($map = [], $sort = ['id' => 'desc'], $limit = 20)
public function getList(array $map = [], array $sort = ['id' => 'desc'], array $columns = ['*'], int $limit = 20)
{
// 闭包查询条件格式化
$query = $this->formatQuery($map);
... ... @@ -68,9 +69,9 @@ class BaseLogic
// 数据分页设置
if ($limit) {
$result = $query->paginate($limit);
$result = $query->select($columns)->paginate($limit);
}else{
$result = $query->get();
$result = $query->select($columns)->get();
}
return $this->success($result ? $result->toArray() : []);
... ... @@ -140,7 +141,7 @@ class BaseLogic
* @date 2023/4/13
*/
public function delete($ids){
$ids = array_filter(Arrays::splitFilterToArray($ids), 'intval');
$ids = array_filter(Arr::splitFilterToArray($ids), 'intval');
if(!$ids){
$this->fail('ID不能为空');
}
... ...
... ... @@ -2,7 +2,7 @@
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arrays;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Category;
... ... @@ -35,7 +35,7 @@ class CategoryLogic extends BaseLogic
}
public function delete($ids){
$ids= array_filter(Arrays::splitFilterToArray($ids), 'intval');
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getInfo($id);
if(!$info){
... ...
<?php
namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Keyword;
/**
* Class KeywordLogic
* @package App\Http\Logic\Bside\Product
* @author zbj
* @date 2023/4/15
*/
class KeywordLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Keyword();
}
public function delete($ids){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getInfo($id);
if(!$info){
continue;
}
//todo 是否有关联商品
return parent::delete($ids);
}
}
}
... ...
<?php
namespace App\Http\Requests\Bside\product;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class KeywordRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/15
*/
class KeywordRequest 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',
'seo_title'=>'max:200',
'seo_keywords'=>'max:200',
'seo_description'=>'max:200',
];
}
public function messages()
{
return [
'title.required' => '请输入关键词',
'title.max' => '关键词不能超过30个字符',
'seo_title.max' => 'SEO标题不能超过200个字符',
'seo_keywords.max' => 'SEO关键词不能超过200个字符',
'seo_description.max' => 'SEO描述不能超过200个字符',
];
}
}
... ...
... ... @@ -3,9 +3,12 @@
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Category extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_category';
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
class Keyword extends Base
{
use SoftDeletes;
//设置关联表名
protected $table = 'gl_product_keyword';
}
... ...
... ... @@ -2,7 +2,7 @@
namespace App\Rules;
use App\Helper\Arrays;
use App\Helper\Arr;
use Illuminate\Contracts\Validation\Rule;
class Ids implements Rule
... ... @@ -17,7 +17,7 @@ class Ids implements Rule
*/
public function passes($attribute, $value)
{
$ids = array_filter(Arrays::splitFilterToArray($value), 'intval');
$ids = array_filter(Arr::splitFilterToArray($value), 'intval');
return boolval($ids);
}
... ...
... ... @@ -26,7 +26,10 @@
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"files": [
"app/Helper/helper.php"
]
},
"autoload-dev": {
"psr-4": {
... ...
... ... @@ -32,11 +32,19 @@ Route::middleware(['bloginauth'])->group(function () {
//无需登录验证的路由组
Route::group([], function () {
Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login');
//产品分类
//产品
Route::prefix('product')->group(function () {
//产品分类
Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category');
Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info');
Route::post('category/save', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'save'])->name('product_category_save');
Route::post('category/delete', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'delete'])->name('product_category_delete');
Route::any('category/delete', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'delete'])->name('product_category_delete');
//产品关键词
Route::get('keyword', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'index'])->name('product_keyword');
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');
});
});
... ...