暂时保存

mall
vine_liutk 2024-01-15 13:50:18 +08:00
parent 77a017298a
commit 478dbe1531
8 changed files with 194 additions and 2 deletions

View File

@ -35,7 +35,7 @@ class Components extends BaseRenderer {
* 2位小数输入框
*/
public function decimalControl($name ='decimal', $label = null){
return amisMake()->NumberControl()
return amisMake()->NumberControl()->size('sm')
->name($name)->label($label ?? __('admin.components.decimal'))
->kilobitSeparator(true)
->percision(2)

View File

@ -0,0 +1,111 @@
<?php
namespace App\Admin\Controllers;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\ProductService;
use App\Admin\Components;
use App\Models\Keyword;
class ProductController extends AdminController
{
protected string $serviceName = ProductService::class;
public function list():Page
{
$crud = $this->baseCRUD()->tableLayout('fixed')
->headerToolbar([
$this->createButton(),
...$this->baseHeaderToolBar(),
])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('sku', __('admin.products.sku'))
->placeholder(__('admin.products.sku')),
amis()->TextControl('name', __('admin.products.name'))
->placeholder(__('admin.products.name')),
]),
]))
->columns([
amis()->TableColumn('name', __('admin.products.name'))->width('300px'),
amis()->TableColumn('sku', __('admin.sku'))->sortable(true),
amis()->TableColumn('category.name', __('admin.products.category')),
amis()->TableColumn('cover', __('admin.products.cover'))->type('image')->height('50px')->width('50px')->enlargeAble(true),
amis()->TableColumn('is_sale', __('admin.products.is_sale'))->type('switch'),
amis()->TableColumn('is_recommend', __('admin.products.is_recommend'))->type('switch'),
amis()->Operation()->label(__('admin.actions'))->buttons([
$this->rowEditButton(),
$this->rowDeleteButton(),
])
]);
return $this->baseList($crud);
}
public function form(): Form
{
return $this->baseForm()->panelClassName('px-0')->body([
amis()->Tabs()->tabsMode('line')->tabs([
//基础信息
amis()->Tab()->title(__('admin.products.tab1'))->body([
amis()->Grid()->columns([
amis()->Wrapper()->body([
amis()->TextControl('name', __('admin.products.name'))->required(true),
Components::make()->parentControl(admin_url('api/product_categories/tree-list'), 'category_id', __('admin.products.category')),
amis()->TextControl('spu', __('admin.products.spu'))->description('*未填写则自动生成唯一spu'),
amis()->TextareaControl('sub_title', __('admin.products.sub_title'))->minRows(5),
Components::make()->sortControl('virtual_sales', __('admin.products.virtual_sales')),
Components::make()->sortControl('stocks', __('admin.products.stocks'))->description('*已销售过的商品无法直接编辑库存,需前往商品库存中操作。'),
Components::make()->decimalControl('price', __('admin.products.price')),
amis()->SwitchControl('is_sale', __('admin.products.is_sale'))->value(false),
amis()->SwitchControl('is_show', __('admin.products.is_show'))->value(false),
])->md(4),
amis()->Wrapper()->body([
Components::make()->imageControl('photos', __('admin.products.photos'))->multiple(true)->draggable(true)->required(true),
Components::make()->cropImageControl('cover', __('admin.products.cover'))->description('*若不选择上传,则默认为相册第一张'),
Components::make()->sortControl('sort', __('admin.products.sort')),
amis()->SwitchControl('is_recommend', __('admin.products.is_recommend'))->value(false),
amis()->SwitchControl('is_hot', __('admin.products.is_hot'))->value(false),
amis()->SwitchControl('is_new', __('admin.products.is_new'))->value(false),
])->md(8)
]),
]),
//详情,信息
amis()->Tab()->title(__('admin.products.tab2'))->body([
//详情,基础信息,运费模板,属性标签,
amis()->Grid()->columns([
amis()->Wrapper()->body([
Components::make()->keywordsTagControl('t_ids', __('admin.products.tags'), 'product_tag'),
amis()->SelectControl('shipping_tmp_id', __('admin.products.shipping_tmp_id'))->required(true),
amis()->InputKV()->name('base_info')->label('参数信息')->keyPlaceholder('属性')->valuePlaceholder('值'),
])->md(4),
amis()->Wrapper()->body([
Components::make()->fuEditorControl('description', __('admin.products.description')),
])->md(8),
]),
]),
//多属性商品
amis()->Tab()->title(__('admin.products.tab3'))->body([
])
])
]);
}
public function detail(): Form
{
return $this->baseDetail()->body([]);
}
}

View File

@ -36,6 +36,8 @@ Route::group([
$router->resource('product_categories', \App\Admin\Controllers\ProductCategoryController::class);
$router->resource('products', \App\Admin\Controllers\ProductController::class);
//修改上传
$router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']);
$router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']);

View File

@ -0,0 +1,16 @@
<?php
namespace App\Models\Filters;
use EloquentFilter\ModelFilter;
class ProductFilter extends ModelFilter
{
/**
* 关键字
*/
public function name($name)
{
return $this->where('name','like', '%'.$name.'%');
}
}

View File

@ -10,4 +10,14 @@ class Product extends Model
{
use HasFactory;
use Filterable;
protected function serializeDate(\DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
protected $fillable = [
'name', 'sub_title', 'cover', 'photos', 'base_info', 'description',
'spu', 'sku', 'parent_id', 'category_id', 't_ids',
];
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Services\Admin;
use App\Models\Product;
use App\Models\Filters\ProductFilter;
use App\Traits\UploadTrait;
use Illuminate\Support\Arr;
/**
* @method Product getModel()
* @method Product|\Illuminate\Database\Query\Builder query()
*/
class ProductService extends BaseService
{
use UploadTrait;
protected string $modelName = Product::class;
protected string $modelFilterName = ProductFilter::class;
}

View File

@ -16,11 +16,13 @@ return new class extends Migration
$table->string('name')->comment('名称');
$table->string('spu')->nullable()->comment('spu');
$table->string('sku')->nullable()->unique()->comment('sku');
$table->unsignedBigInteger('parent_id')->nullable()->comment('父级');
$table->unsignedBigInteger('category_id')->nullable()->comment('分类');
$table->string('t_ids')->nullable()->comment('标签');
$table->text('sub_title')->nullable()->comment('副标题');
$table->string('cover')->nullable()->comment('封面');
$table->text('photo')->nullable()->comment('图片');
$table->text('photos')->nullable()->comment('图片');
$table->text('base_info')->nullable()->comment('基础信息');
$table->text('description')->nullable()->comment('详情');
@ -37,6 +39,7 @@ return new class extends Migration
$table->unsignedTinyInteger('is_new')->default(0)->comment('上新开关');
$table->unsignedDecimal('sale_price', 10, 2)->default(0.00)->comment('售价');
$table->unsignedBigInteger('shipping_tmp_id')->nullable()->comment('运费模板');
$table->unsignedInteger('stocks')->default(0)->comment('库存');
$table->timestamps();

View File

@ -320,5 +320,34 @@ return [
'is_enable' => '启用',
'is_show' => '展示',
'is_recommend' => '推荐'
],
'products' => [
'name' => '名称',
'spu' => 'SPU',
'sku' => 'SKU',
'category' => '分类',
'sub_title'=> '副标题',
'cover' => '封面',
'photos' => '相册',
'base_info' => '基础信息',
'description' => '详情',
'price' => '售价',
'virtual_sales' => '虚拟销量',
'stocks' => '库存',
'tags' => '标签',
'shipping_tmp_id' => '运费模板',
'sort' => '排序',
'is_sale' => '上架',
'is_show' => '展示',
'is_recommend' => '推荐',
'is_hot' => '热销',
'is_new' => '新品',
'tab1' => '基础信息',
'tab2' => '详细信息',
'tab3' => '规格属性',
]
];