店铺后台
parent
093e8770fe
commit
7969745c4c
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Controllers;
|
||||||
|
|
||||||
|
use Dcat\Admin\Form;
|
||||||
|
use App\Models\Store;
|
||||||
|
use Dcat\Admin\Http\Controllers\AdminController;
|
||||||
|
use Dcat\Admin\Layout\Content;
|
||||||
|
use Dcat\Admin\Models\Administrator;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Routing\Controller;
|
||||||
|
use Dcat\Admin\Traits\HasFormResponse;
|
||||||
|
|
||||||
|
class StoreAdminController extends Controller
|
||||||
|
{
|
||||||
|
use HasFormResponse;
|
||||||
|
public function create($store_id)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
$form = Form::make();
|
||||||
|
$form->tree('admin_user', '选择管理员')
|
||||||
|
->nodes(Administrator::all()->toArray())
|
||||||
|
->value($store->adminUsers()->pluck('id'))
|
||||||
|
->setTitleColumn('name');
|
||||||
|
return (new Content())->title('新增')->body($form);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store($store_id, Request $request)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
if ($request->input('admin_user')) {
|
||||||
|
$admin_ids = explode(',', $request->input('admin_user'));
|
||||||
|
$store->adminUsers()->sync($admin_ids);
|
||||||
|
} else {
|
||||||
|
$store->adminUsers()->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->sendResponse($this->response()->success(trans('admin.save_succeeded')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy($store_id, $id)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
$admin_ids = explode(',', $id);
|
||||||
|
$store->adminUsers()->detach($admin_ids);
|
||||||
|
return $this->sendResponse($this->response()->success(trans('admin.delete_succeeded')));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace App\Admin\Controllers;
|
namespace App\Admin\Controllers;
|
||||||
|
|
||||||
use App\Models\{Store, ProductSku};
|
use App\Models\{Store, StoreProductSku, ProductSku};
|
||||||
use Dcat\Admin\Form;
|
use Dcat\Admin\Form;
|
||||||
use Dcat\Admin\Grid;
|
use Dcat\Admin\Grid;
|
||||||
use Dcat\Admin\Show;
|
use Dcat\Admin\Show;
|
||||||
|
|
@ -11,6 +11,8 @@ use Carbon\Carbon;
|
||||||
use Dcat\Admin\Admin;
|
use Dcat\Admin\Admin;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Dcat\Admin\Models\Administrator;
|
use Dcat\Admin\Models\Administrator;
|
||||||
|
use Dcat\Admin\Layout\Row;
|
||||||
|
use Dcat\Admin\Widgets\{Box, Tab, Card};
|
||||||
|
|
||||||
class StoreController extends AdminController
|
class StoreController extends AdminController
|
||||||
{
|
{
|
||||||
|
|
@ -68,7 +70,8 @@ class StoreController extends AdminController
|
||||||
$ids = DB::table('store_admin_users')->where('admin_user_id', $user->id)->pluck('store_id');
|
$ids = DB::table('store_admin_users')->where('admin_user_id', $user->id)->pluck('store_id');
|
||||||
$query = $query->whereIn('id', $ids);
|
$query = $query->whereIn('id', $ids);
|
||||||
}
|
}
|
||||||
return Show::make($id, $query, function (Show $show) use ($canAdmin) {
|
$row = new Row();
|
||||||
|
$show = Show::make($id, $query, function (Show $show) use ($canAdmin) {
|
||||||
|
|
||||||
$show->field('id');
|
$show->field('id');
|
||||||
$show->field('title');
|
$show->field('title');
|
||||||
|
|
@ -78,49 +81,20 @@ class StoreController extends AdminController
|
||||||
$show->field('remarks');
|
$show->field('remarks');
|
||||||
$show->field('created_at');
|
$show->field('created_at');
|
||||||
|
|
||||||
if ($canAdmin) {
|
|
||||||
$show->relation('admin_users', function ($model) {
|
|
||||||
$grid = new Grid(new Administrator());
|
|
||||||
|
|
||||||
$grid->model()->join('store_admin_users', function ($join) use ($model) {
|
|
||||||
$join->on('store_admin_users.admin_user_id', 'id')->where('store_id', '=', $model->id);
|
|
||||||
});
|
|
||||||
|
|
||||||
$grid->column('id');
|
|
||||||
$grid->column('username');
|
|
||||||
$grid->column('name');
|
|
||||||
|
|
||||||
$grid->quickSearch(['username', 'name']);
|
|
||||||
|
|
||||||
$grid->paginate(10);
|
|
||||||
$grid->disableActions();
|
|
||||||
|
|
||||||
return $grid;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$show->relation('product_skus', function ($model) {
|
|
||||||
$grid = new Grid(new ProductSku());
|
|
||||||
|
|
||||||
$grid->model()->join('store_product_skus', function ($join) use ($model) {
|
|
||||||
$join->on('store_product_skus.product_sku_id', 'id')->where('store_id', '=', $model->id);
|
|
||||||
});
|
|
||||||
|
|
||||||
$grid->quickSearch(['name']);
|
|
||||||
|
|
||||||
$grid->column('name');
|
|
||||||
$grid->column('specs')->label();
|
|
||||||
|
|
||||||
$grid->paginate(10);
|
|
||||||
$grid->disableActions();
|
|
||||||
|
|
||||||
return $grid;
|
|
||||||
});
|
|
||||||
|
|
||||||
$show->panel()->tools(function ($tools) {
|
$show->panel()->tools(function ($tools) {
|
||||||
$tools->disableDelete();
|
$tools->disableDelete();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
$row->column(5, $show);
|
||||||
|
|
||||||
|
$tab = Tab::make()->theme();
|
||||||
|
$tab->add('商品', Card::make($this->gridProduct($id)));
|
||||||
|
if ($canAdmin) {
|
||||||
|
$tab->add('管理员', Card::make($this->gridAdmin($id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
$row->column(7, $tab);
|
||||||
|
return $row;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -143,17 +117,17 @@ class StoreController extends AdminController
|
||||||
$form->switch('status')->default(1);
|
$form->switch('status')->default(1);
|
||||||
$form->number('sort')->min(1)->default(1);
|
$form->number('sort')->min(1)->default(1);
|
||||||
|
|
||||||
if ($canAdmin) {
|
// if ($canAdmin) {
|
||||||
$form->multipleSelectTable('admin_users')
|
// $form->multipleSelectTable('admin_users')
|
||||||
->from(\App\Admin\Renderable\AdministratorTable::make())
|
// ->from(\App\Admin\Renderable\AdministratorTable::make())
|
||||||
->model(Administrator::class, 'id', 'name')
|
// ->model(Administrator::class, 'id', 'name')
|
||||||
->customFormat(function ($v) {
|
// ->customFormat(function ($v) {
|
||||||
if (! $v) {
|
// if (! $v) {
|
||||||
return [];
|
// return [];
|
||||||
}
|
// }
|
||||||
return array_column($v, 'id');
|
// return array_column($v, 'id');
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
$form->multipleSelectTable('product_skus')
|
$form->multipleSelectTable('product_skus')
|
||||||
->from(\App\Admin\Renderable\ProductSkuSimpleTable::make())
|
->from(\App\Admin\Renderable\ProductSkuSimpleTable::make())
|
||||||
|
|
@ -192,4 +166,49 @@ class StoreController extends AdminController
|
||||||
{
|
{
|
||||||
return Admin::user()->isRole('administrator');
|
return Admin::user()->isRole('administrator');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function gridAdmin($id)
|
||||||
|
{
|
||||||
|
$grid = Grid::make(new Administrator());
|
||||||
|
$grid->model()->join('store_admin_users', function ($join) use ($id) {
|
||||||
|
$join->on('store_admin_users.admin_user_id', 'id')->where('store_id', '=', $id);
|
||||||
|
});
|
||||||
|
|
||||||
|
$grid->setResource('store/' . $id . '/admin');
|
||||||
|
|
||||||
|
$grid->column('id');
|
||||||
|
$grid->column('username');
|
||||||
|
$grid->column('name');
|
||||||
|
$grid->paginate(10);
|
||||||
|
|
||||||
|
$grid->showCreateButton();
|
||||||
|
$grid->enableDialogCreate();
|
||||||
|
|
||||||
|
$grid->disableActions();
|
||||||
|
$grid->showRowSelector();
|
||||||
|
|
||||||
|
return $grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function gridProduct($id)
|
||||||
|
{
|
||||||
|
$grid = new Grid(StoreProductSku::with(['productSku']));
|
||||||
|
$grid->model()->where('store_id', $id);
|
||||||
|
|
||||||
|
$grid->setResource('store/'.$id.'/product');
|
||||||
|
|
||||||
|
$grid->column('productSku.id', 'ID');
|
||||||
|
$grid->column('productSku.name', '名称');
|
||||||
|
$grid->column('amount', '库存')->editable();
|
||||||
|
$grid->column('productSku.specs', '规格')->label();
|
||||||
|
$grid->column('status', '状态')->switch();
|
||||||
|
$grid->paginate(10);
|
||||||
|
|
||||||
|
$grid->showCreateButton();
|
||||||
|
$grid->enableDialogCreate();
|
||||||
|
|
||||||
|
$grid->disableActions();
|
||||||
|
$grid->showRowSelector();
|
||||||
|
return $grid;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Store;
|
||||||
|
use Dcat\Admin\Form;
|
||||||
|
use Dcat\Admin\Http\Controllers\AdminController;
|
||||||
|
use Dcat\Admin\Layout\Content;
|
||||||
|
use Dcat\Admin\Models\Administrator;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Routing\Controller;
|
||||||
|
use Dcat\Admin\Traits\HasFormResponse;
|
||||||
|
|
||||||
|
class StoreProductController extends Controller
|
||||||
|
{
|
||||||
|
use HasFormResponse;
|
||||||
|
public function create($store_id)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
$form = Form::make();
|
||||||
|
$form->selectTable('product', '商品')
|
||||||
|
->from(\App\Admin\Renderable\ProductSkuSimpleTable::make())
|
||||||
|
->model(\App\Models\ProductSku::class, 'id', 'name')
|
||||||
|
->required();
|
||||||
|
$form->number('amount', '库存')->min(0);
|
||||||
|
$form->switch('status', '状态')->default(1);
|
||||||
|
return (new Content())->title('新增')->body($form);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store($store_id, Request $request)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
$product_id = $request->input('product');
|
||||||
|
if ($product_id) {
|
||||||
|
$product = $store->productSkus()->find($product_id);
|
||||||
|
if ($product) {
|
||||||
|
$store->productSkus()->updateExistingPivot($product_id, $request->only(['amount', 'status']));
|
||||||
|
} else {
|
||||||
|
$store->productSkus()->attach([
|
||||||
|
$product_id => $request->only(['amount', 'status'])
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->sendResponse($this->response()->success(trans('admin.save_succeeded')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update($store_id, $id, Request $request)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
$product = $store->productSkus()->wherePivot('id', $id)->firstOrFail();
|
||||||
|
$store->productSkus()->updateExistingPivot($product->id, $request->only(['status', 'amount']));
|
||||||
|
return $this->sendResponse($this->response()->success(trans('admin.update_succeeded')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy($store_id, $id)
|
||||||
|
{
|
||||||
|
$store = Store::findOrFail($store_id);
|
||||||
|
dd($id);
|
||||||
|
return $this->sendResponse($this->response()->success(trans('admin.delete_succeeded')));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,7 +14,7 @@ class ProductSkuSimpleTable extends LazyRenderable
|
||||||
return Grid::make($builder, function (Grid $grid) {
|
return Grid::make($builder, function (Grid $grid) {
|
||||||
$grid->disableRowSelector(false);
|
$grid->disableRowSelector(false);
|
||||||
$grid->column('name');
|
$grid->column('name');
|
||||||
$grid->column('specs')->label();
|
$grid->column('specs', '规格')->label();
|
||||||
$grid->quickSearch(['name']);
|
$grid->quickSearch(['name']);
|
||||||
$grid->disableActions();
|
$grid->disableActions();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,8 @@ Route::group([
|
||||||
/** 调试接口 **/
|
/** 调试接口 **/
|
||||||
// $router->get('test', 'HomeController@test');
|
// $router->get('test', 'HomeController@test');
|
||||||
|
|
||||||
|
$router->resource('store/{store_id}/product', 'StoreProductController');
|
||||||
|
$router->resource('store/{store_id}/admin', 'StoreAdminController');
|
||||||
$router->resource('store', 'StoreController');
|
$router->resource('store', 'StoreController');
|
||||||
|
|
||||||
$router->resource('profit', 'OrderProfitController');
|
$router->resource('profit', 'OrderProfitController');
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,14 @@ class ProductSku extends Model
|
||||||
return $this->belongsTo(ProductBuynote::class, 'buynote_id');
|
return $this->belongsTo(ProductBuynote::class, 'buynote_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关联的店铺
|
||||||
|
*/
|
||||||
|
public function stores()
|
||||||
|
{
|
||||||
|
return $this->belongsToMany(Store::class, 'store_product_skus', 'product_sku_id', 'store_id');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 确认此商品是否已上架
|
* 确认此商品是否已上架
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class StoreProductSku extends Pivot
|
||||||
|
{
|
||||||
|
protected $table = 'store_product_skus';
|
||||||
|
|
||||||
|
protected $fillable = ['amount', 'product_sku_id', 'status', 'store_id'];
|
||||||
|
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Store::class, 'store_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function productSku()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(ProductSku::class, 'product_sku_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -24,13 +24,17 @@ class CreateStoresTable extends Migration
|
||||||
});
|
});
|
||||||
|
|
||||||
Schema::create('store_admin_users', function (Blueprint $table) {
|
Schema::create('store_admin_users', function (Blueprint $table) {
|
||||||
$table->unsignedInteger('store_id');
|
$table->id();
|
||||||
$table->unsignedInteger('admin_user_id');
|
$table->unsignedBigInteger('store_id');
|
||||||
|
$table->unsignedBigInteger('admin_user_id');
|
||||||
});
|
});
|
||||||
|
|
||||||
Schema::create('store_product_skus', function (Blueprint $table) {
|
Schema::create('store_product_skus', function (Blueprint $table) {
|
||||||
$table->unsignedInteger('store_id');
|
$table->id();
|
||||||
$table->unsignedInteger('product_sku_id');
|
$table->unsignedBigInteger('store_id');
|
||||||
|
$table->unsignedBigInteger('product_sku_id');
|
||||||
|
$table->unsignedInteger('amount')->comment('库存');
|
||||||
|
$table->tinyInteger('status')->default(1)->comment('状态(1: 可用, 0: 不可用)');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ class AdminMenuSeeder extends Seeder
|
||||||
'icon' => 'fa fa-shopping-bag',
|
'icon' => 'fa fa-shopping-bag',
|
||||||
'uri' => '',
|
'uri' => '',
|
||||||
'children'=>[
|
'children'=>[
|
||||||
[ 'title' => '店铺管理', 'icon' => '', 'uri' => 'store' ],
|
[ 'title' => '门店管理', 'icon' => '', 'uri' => 'store' ],
|
||||||
[
|
[
|
||||||
'title' =>'文章管理',
|
'title' =>'文章管理',
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
|
|
@ -193,6 +193,7 @@ class AdminMenuSeeder extends Seeder
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
'uri' => 'order-refunds',
|
'uri' => 'order-refunds',
|
||||||
],
|
],
|
||||||
|
['title' => '提成管理', 'icon' => '', 'uri' => 'profit']
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|
@ -274,7 +275,6 @@ class AdminMenuSeeder extends Seeder
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
'uri' =>'finance-after-sales?state=5',
|
'uri' =>'finance-after-sales?state=5',
|
||||||
],
|
],
|
||||||
['title' => '提成管理', 'icon' => '', 'uri' => 'profit']
|
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue