正在显示
14 个修改的文件
包含
268 行增加
和
23 行删除
| @@ -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 | } |
app/Helper/helper.php
0 → 100644
| @@ -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 |
app/Models/Product/Keyword.php
0 → 100644
| @@ -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 | }); |
-
请 注册 或 登录 后发表评论