作者 赵彬吉

update

@@ -4,9 +4,13 @@ namespace App\Helper; @@ -4,9 +4,13 @@ namespace App\Helper;
4 4
5 5
6 /** 6 /**
7 - * 验证 7 + * 数组类函数
  8 + * Class Arrays
  9 + * @package App\Helper
  10 + * @author zbj
  11 + * @date 2023/4/15
8 */ 12 */
9 -class Arrays 13 +class Arr extends \Illuminate\Support\Arr
10 { 14 {
11 /** 15 /**
12 * 把返回的数据集转换成Tree 16 * 把返回的数据集转换成Tree
@@ -48,7 +52,7 @@ class Arrays @@ -48,7 +52,7 @@ class Arrays
48 52
49 /** 53 /**
50 * 分隔字符串成数组并按照指定的函数过滤数组 54 * 分隔字符串成数组并按照指定的函数过滤数组
51 - * @param $string 55 + * @param string $string
52 * @param string $filters 56 * @param string $filters
53 * @param string $delimiter 57 * @param string $delimiter
54 * @return array|false|string[] 58 * @return array|false|string[]
@@ -75,4 +79,50 @@ class Arrays @@ -75,4 +79,50 @@ class Arrays
75 79
76 return $data; 80 return $data;
77 } 81 }
  82 +
  83 +
  84 + /**
  85 + * 只保留指定的key 最多支持二维数组
  86 + * @param array $rows 需要过滤的数组
  87 + * @param array $keepKeys 需要保留的键名
  88 + * @return array|array[]|mixed
  89 + * @author zbj
  90 + * @date 2023/4/15
  91 + */
  92 + public static function twoKeepKeys(array $rows, array $keepKeys)
  93 + {
  94 +
  95 + if (!$rows || !$keepKeys) {
  96 + return $rows;
  97 + }
  98 +
  99 + //第一维有字符串键名 就过滤第一维
  100 + $signle = false;
  101 + $keys = array_keys($rows);
  102 + foreach ($keys as $k) {
  103 + if (!is_numeric($k)) {
  104 + $signle = true;
  105 + $rows = [$rows];
  106 + break;
  107 + }
  108 + }
  109 +
  110 + //将数组将非法的键去掉
  111 + $rows = array_map(function ($item) use ($keepKeys) {
  112 + if (!is_array($item)) {
  113 + return $item;
  114 + }
  115 +
  116 + $illegalKeys = array_diff(array_keys($item), $keepKeys);//获取非法键名
  117 + if ($illegalKeys) {
  118 + foreach ($illegalKeys as $key) {
  119 + unset($item[$key]);
  120 + }
  121 + }
  122 +
  123 + return $item;
  124 + }, $rows);
  125 +
  126 + return $signle ? $rows[0] : $rows;
  127 + }
78 } 128 }
  1 +<?php
  2 +
  3 +/**
  4 + * 生成路由标识
  5 + * @param $string
  6 + * @return string
  7 + * @author zbj
  8 + * @date 2023/4/15
  9 + */
  10 +function generateRoute($string){
  11 + return trim(strtolower(preg_replace( '/[\W]+/', '-', trim($string))), '-');
  12 +}
@@ -60,6 +60,7 @@ class BaseController extends Controller @@ -60,6 +60,7 @@ class BaseController extends Controller
60 'data' => $data, 60 'data' => $data,
61 'msg' => $code->description, 61 'msg' => $code->description,
62 ]; 62 ];
  63 + $this->header['token'] = $this->token;
63 return response()->json($response,200,$this->header); 64 return response()->json($response,200,$this->header);
64 } 65 }
65 /** 66 /**
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 2
3 namespace App\Http\Controllers\Bside\Product; 3 namespace App\Http\Controllers\Bside\Product;
4 4
  5 +use App\Helper\Arr;
5 use App\Http\Controllers\Bside\BaseController; 6 use App\Http\Controllers\Bside\BaseController;
6 use App\Http\Logic\Bside\Product\CategoryLogic; 7 use App\Http\Logic\Bside\Product\CategoryLogic;
7 use App\Http\Requests\Bside\product\CategoryRequest; 8 use App\Http\Requests\Bside\product\CategoryRequest;
@@ -20,12 +21,12 @@ class CategoryController extends BaseController @@ -20,12 +21,12 @@ class CategoryController extends BaseController
20 public function index(CategoryLogic $logic) 21 public function index(CategoryLogic $logic)
21 { 22 {
22 $map = []; 23 $map = [];
23 - if(!empty($this->param['title'])){  
24 - $map[] = ['title', 'like', "%{$this->param['title']}%"]; 24 + if(!empty($this->param['search'])){
  25 + $map[] = ['title', 'like', "%{$this->param['search']}%"];
25 } 26 }
26 -  
27 - $data = $logic->getList($map);  
28 - return $this->success($data); 27 + $sort = ['id' => 'desc'];
  28 + $data = $logic->getList($map, $sort, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status','created_at'],0);
  29 + return $this->success(Arr::listToTree($data));
29 } 30 }
30 31
31 public function info(Request $request, CategoryLogic $logic){ 32 public function info(Request $request, CategoryLogic $logic){
@@ -35,7 +36,7 @@ class CategoryController extends BaseController @@ -35,7 +36,7 @@ class CategoryController extends BaseController
35 'id.required' => 'ID不能为空' 36 'id.required' => 'ID不能为空'
36 ]); 37 ]);
37 $data = $logic->getInfo($this->param['id']); 38 $data = $logic->getInfo($this->param['id']);
38 - return $this->success($data); 39 + return $this->success(Arr::twoKeepKeys($data, ['id', 'pid', 'title', 'image', 'keywords', 'describe', 'status']));
39 } 40 }
40 41
41 public function save(CategoryRequest $request, CategoryLogic $logic) 42 public function save(CategoryRequest $request, CategoryLogic $logic)
@@ -55,4 +56,6 @@ class CategoryController extends BaseController @@ -55,4 +56,6 @@ class CategoryController extends BaseController
55 $data = $logic->delete($this->param['ids']); 56 $data = $logic->delete($this->param['ids']);
56 return $this->success($data); 57 return $this->success($data);
57 } 58 }
  59 +
  60 + //todo Ai生成 关键词和描述
58 } 61 }
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers\Bside\Product;
  4 +
  5 +use App\Helper\Arr;
  6 +use App\Http\Controllers\Bside\BaseController;
  7 +use App\Http\Logic\Bside\Product\KeywordLogic;
  8 +use App\Http\Requests\Bside\product\KeywordRequest;
  9 +use App\Rules\Ids;
  10 +use Illuminate\Http\Request;
  11 +
  12 +/**
  13 + * Class KeywordController
  14 + * @package App\Http\Controllers\Bside
  15 + * @author zbj
  16 + * @date 2023/4/15
  17 + */
  18 +class KeywordController extends BaseController
  19 +{
  20 +
  21 + public function index(KeywordLogic $logic)
  22 + {
  23 + $map = [];
  24 + if(!empty($this->param['search'])){
  25 + $map[] = ['title', 'like', "%{$this->param['search']}%"];
  26 + }
  27 + $sort = ['id' => 'desc'];
  28 + $data = $logic->getList($map, $sort, ['id', 'title', 'route', 'status', 'created_at']);
  29 + return $this->success($data);
  30 + }
  31 +
  32 + public function info(Request $request, KeywordLogic $logic){
  33 + $request->validate([
  34 + 'id'=>'required'
  35 + ],[
  36 + 'id.required' => 'ID不能为空'
  37 + ]);
  38 + $data = $logic->getInfo($this->param['id']);
  39 + return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'route', 'created_at']));
  40 + }
  41 +
  42 + public function save(KeywordRequest $request, KeywordLogic $logic)
  43 + {
  44 + $this->param['route'] = generateRoute($this->param['title']);
  45 + $data = $logic->save($this->param);
  46 + return $this->success($data);
  47 + }
  48 +
  49 + public function delete(Request $request, KeywordLogic $logic)
  50 + {
  51 + $request->validate([
  52 + 'ids'=>['required', new Ids()]
  53 + ],[
  54 + 'ids.required' => 'ID不能为空'
  55 + ]);
  56 +
  57 + $data = $logic->delete($this->param['ids']);
  58 + return $this->success($data);
  59 + }
  60 +
  61 +}
@@ -4,7 +4,7 @@ namespace App\Http\Logic\Bside; @@ -4,7 +4,7 @@ namespace App\Http\Logic\Bside;
4 4
5 use App\Enums\Common\Code; 5 use App\Enums\Common\Code;
6 use App\Exceptions\BsideGlobalException; 6 use App\Exceptions\BsideGlobalException;
7 -use App\Helper\Arrays; 7 +use App\Helper\Arr;
8 use Illuminate\Support\Facades\Cache; 8 use Illuminate\Support\Facades\Cache;
9 9
10 /** 10 /**
@@ -28,7 +28,7 @@ class BaseLogic @@ -28,7 +28,7 @@ class BaseLogic
28 * @param array $data 28 * @param array $data
29 * @return array 29 * @return array
30 */ 30 */
31 - public function success($data = []) 31 + public function success(array $data = [])
32 { 32 {
33 return $data; 33 return $data;
34 } 34 }
@@ -39,7 +39,7 @@ class BaseLogic @@ -39,7 +39,7 @@ class BaseLogic
39 * @param string $message 39 * @param string $message
40 * @throws BsideGlobalException 40 * @throws BsideGlobalException
41 */ 41 */
42 - public function fail($message = "", string $code = Code::SYSTEM_ERROR) 42 + public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
43 { 43 {
44 throw new BsideGlobalException($code, $message); 44 throw new BsideGlobalException($code, $message);
45 } 45 }
@@ -49,12 +49,13 @@ class BaseLogic @@ -49,12 +49,13 @@ class BaseLogic
49 * 列表 49 * 列表
50 * @param array $map 50 * @param array $map
51 * @param array $sort 51 * @param array $sort
  52 + * @param array $columns
52 * @param int $limit 53 * @param int $limit
53 * @return array 54 * @return array
54 * @author zbj 55 * @author zbj
55 * @date 2023/4/13 56 * @date 2023/4/13
56 */ 57 */
57 - public function getList($map = [], $sort = ['id' => 'desc'], $limit = 20) 58 + public function getList(array $map = [], array $sort = ['id' => 'desc'], array $columns = ['*'], int $limit = 20)
58 { 59 {
59 // 闭包查询条件格式化 60 // 闭包查询条件格式化
60 $query = $this->formatQuery($map); 61 $query = $this->formatQuery($map);
@@ -68,9 +69,9 @@ class BaseLogic @@ -68,9 +69,9 @@ class BaseLogic
68 69
69 // 数据分页设置 70 // 数据分页设置
70 if ($limit) { 71 if ($limit) {
71 - $result = $query->paginate($limit); 72 + $result = $query->select($columns)->paginate($limit);
72 }else{ 73 }else{
73 - $result = $query->get(); 74 + $result = $query->select($columns)->get();
74 } 75 }
75 76
76 return $this->success($result ? $result->toArray() : []); 77 return $this->success($result ? $result->toArray() : []);
@@ -140,7 +141,7 @@ class BaseLogic @@ -140,7 +141,7 @@ class BaseLogic
140 * @date 2023/4/13 141 * @date 2023/4/13
141 */ 142 */
142 public function delete($ids){ 143 public function delete($ids){
143 - $ids = array_filter(Arrays::splitFilterToArray($ids), 'intval'); 144 + $ids = array_filter(Arr::splitFilterToArray($ids), 'intval');
144 if(!$ids){ 145 if(!$ids){
145 $this->fail('ID不能为空'); 146 $this->fail('ID不能为空');
146 } 147 }
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 2
3 namespace App\Http\Logic\Bside\Product; 3 namespace App\Http\Logic\Bside\Product;
4 4
5 -use App\Helper\Arrays; 5 +use App\Helper\Arr;
6 use App\Http\Logic\Bside\BaseLogic; 6 use App\Http\Logic\Bside\BaseLogic;
7 use App\Models\Product\Category; 7 use App\Models\Product\Category;
8 8
@@ -35,7 +35,7 @@ class CategoryLogic extends BaseLogic @@ -35,7 +35,7 @@ class CategoryLogic extends BaseLogic
35 } 35 }
36 36
37 public function delete($ids){ 37 public function delete($ids){
38 - $ids= array_filter(Arrays::splitFilterToArray($ids), 'intval'); 38 + $ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
39 foreach ($ids as $id){ 39 foreach ($ids as $id){
40 $info = $this->getInfo($id); 40 $info = $this->getInfo($id);
41 if(!$info){ 41 if(!$info){
  1 +<?php
  2 +
  3 +namespace App\Http\Logic\Bside\Product;
  4 +
  5 +use App\Helper\Arr;
  6 +use App\Http\Logic\Bside\BaseLogic;
  7 +use App\Models\Product\Keyword;
  8 +
  9 +/**
  10 + * Class KeywordLogic
  11 + * @package App\Http\Logic\Bside\Product
  12 + * @author zbj
  13 + * @date 2023/4/15
  14 + */
  15 +class KeywordLogic extends BaseLogic
  16 +{
  17 + public function __construct()
  18 + {
  19 + parent::__construct();
  20 +
  21 + $this->model = new Keyword();
  22 + }
  23 +
  24 + public function delete($ids){
  25 + $ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
  26 + foreach ($ids as $id){
  27 + $info = $this->getInfo($id);
  28 + if(!$info){
  29 + continue;
  30 + }
  31 +
  32 + //todo 是否有关联商品
  33 +
  34 + return parent::delete($ids);
  35 + }
  36 + }
  37 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Requests\Bside\product;
  4 +
  5 +use Illuminate\Foundation\Http\FormRequest;
  6 +
  7 +/**
  8 + * Class KeywordRequest
  9 + * @package App\Http\Requests\Bside\product
  10 + * @author zbj
  11 + * @date 2023/4/15
  12 + */
  13 +class KeywordRequest extends FormRequest
  14 +{
  15 + /**
  16 + * Determine if the user is authorized to make this request.
  17 + *
  18 + * @return bool
  19 + */
  20 + public function authorize()
  21 + {
  22 + return true;
  23 + }
  24 +
  25 + /**
  26 + * Get the validation rules that apply to the request.
  27 + *
  28 + * @return array
  29 + */
  30 + public function rules()
  31 + {
  32 + return [
  33 + 'title'=>'required|max:30',
  34 + 'seo_title'=>'max:200',
  35 + 'seo_keywords'=>'max:200',
  36 + 'seo_description'=>'max:200',
  37 + ];
  38 + }
  39 +
  40 + public function messages()
  41 + {
  42 + return [
  43 + 'title.required' => '请输入关键词',
  44 + 'title.max' => '关键词不能超过30个字符',
  45 + 'seo_title.max' => 'SEO标题不能超过200个字符',
  46 + 'seo_keywords.max' => 'SEO关键词不能超过200个字符',
  47 + 'seo_description.max' => 'SEO描述不能超过200个字符',
  48 + ];
  49 + }
  50 +
  51 +}
@@ -3,9 +3,12 @@ @@ -3,9 +3,12 @@
3 namespace App\Models\Product; 3 namespace App\Models\Product;
4 4
5 use App\Models\Base; 5 use App\Models\Base;
  6 +use Illuminate\Database\Eloquent\SoftDeletes;
6 7
7 class Category extends Base 8 class Category extends Base
8 { 9 {
  10 + use SoftDeletes;
  11 +
9 //设置关联表名 12 //设置关联表名
10 protected $table = 'gl_product_category'; 13 protected $table = 'gl_product_category';
11 14
  1 +<?php
  2 +
  3 +namespace App\Models\Product;
  4 +
  5 +use App\Models\Base;
  6 +use Illuminate\Database\Eloquent\SoftDeletes;
  7 +
  8 +class Keyword extends Base
  9 +{
  10 + use SoftDeletes;
  11 +
  12 + //设置关联表名
  13 + protected $table = 'gl_product_keyword';
  14 +
  15 +}
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 2
3 namespace App\Rules; 3 namespace App\Rules;
4 4
5 -use App\Helper\Arrays; 5 +use App\Helper\Arr;
6 use Illuminate\Contracts\Validation\Rule; 6 use Illuminate\Contracts\Validation\Rule;
7 7
8 class Ids implements Rule 8 class Ids implements Rule
@@ -17,7 +17,7 @@ class Ids implements Rule @@ -17,7 +17,7 @@ class Ids implements Rule
17 */ 17 */
18 public function passes($attribute, $value) 18 public function passes($attribute, $value)
19 { 19 {
20 - $ids = array_filter(Arrays::splitFilterToArray($value), 'intval'); 20 + $ids = array_filter(Arr::splitFilterToArray($value), 'intval');
21 return boolval($ids); 21 return boolval($ids);
22 } 22 }
23 23
@@ -26,7 +26,10 @@ @@ -26,7 +26,10 @@
26 "App\\": "app/", 26 "App\\": "app/",
27 "Database\\Factories\\": "database/factories/", 27 "Database\\Factories\\": "database/factories/",
28 "Database\\Seeders\\": "database/seeders/" 28 "Database\\Seeders\\": "database/seeders/"
29 - } 29 + },
  30 + "files": [
  31 + "app/Helper/helper.php"
  32 + ]
30 }, 33 },
31 "autoload-dev": { 34 "autoload-dev": {
32 "psr-4": { 35 "psr-4": {
@@ -32,11 +32,19 @@ Route::middleware(['bloginauth'])->group(function () { @@ -32,11 +32,19 @@ Route::middleware(['bloginauth'])->group(function () {
32 //无需登录验证的路由组 32 //无需登录验证的路由组
33 Route::group([], function () { 33 Route::group([], function () {
34 Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login'); 34 Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login');
35 - //产品分类 35 +
  36 + //产品
36 Route::prefix('product')->group(function () { 37 Route::prefix('product')->group(function () {
  38 + //产品分类
37 Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category'); 39 Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category');
38 Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info'); 40 Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info');
39 Route::post('category/save', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'save'])->name('product_category_save'); 41 Route::post('category/save', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'save'])->name('product_category_save');
40 - Route::post('category/delete', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'delete'])->name('product_category_delete'); 42 + Route::any('category/delete', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'delete'])->name('product_category_delete');
  43 +
  44 + //产品关键词
  45 + Route::get('keyword', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'index'])->name('product_keyword');
  46 + Route::get('keyword/info', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'info'])->name('product_keyword_info');
  47 + Route::post('keyword/save', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'save'])->name('product_keyword_save');
  48 + Route::any('keyword/delete', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'delete'])->name('product_keyword_delete');
41 }); 49 });
42 }); 50 });