6
0
Fork 0
release
panliang 2022-05-20 16:32:16 +08:00
parent 51278dc9c5
commit 875eed679e
16 changed files with 202 additions and 131 deletions

View File

@ -32,20 +32,15 @@ class AgentController extends AdminController
/** 操作 **/
//新增
if (Admin::user()->can('dcat.admin.vips.create')) {
if (Admin::user()->can('dcat.admin.agent.create')) {
$grid->disableCreateButton(false);
$grid->enableDialogCreate();
}
//修改
$grid->showQuickEditButton(Admin::user()->can('dcat.admin.vips.edit'));
$grid->showQuickEditButton(Admin::user()->can('dcat.admin.agent.edit'));
//删除以及自定义操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableDelete(Admin::user()->cannot('dcat.admin.vips.destroy'));
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(false);
$filter->like('name')->width(3);
$actions->disableDelete(Admin::user()->cannot('dcat.admin.agent.destroy'));
});
});
}

View File

@ -31,9 +31,18 @@ class OrderController extends AdminController
protected function grid()
{
$grid = new Grid(Order::with(['user', 'inviter']));
$grid->model()->whereNotNull('inviter_id')->orderBy('created_at', 'desc');
$grid = new Grid(Order::with(['user', 'inviter', 'store']));
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores->pluck('id');
$grid->model()->whereIn('store_id', $stores);
}
$grid->model()->whereNotNull('store_id')->orderBy('created_at', 'desc');
$grid->column('store.title', '门店');
$grid->column('sn')->copyable();
$grid->column('user.phone')->copyable();
$grid->column('inviter.phone')->copyable();
@ -48,10 +57,11 @@ class OrderController extends AdminController
$grid->column('pay_at');
$grid->column('created_at');
$grid->showViewButton();
$grid->showViewButton($user->can('dcat.admin.store.order.show'));
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('store_id', '门店')->select('api/store')->width(3);
$filter->like('sn')->width(3);
$filter->like('user.phone')->width(3);
$filter->like('inviter.phone')->width(3);
@ -143,4 +153,9 @@ class OrderController extends AdminController
return $grid;
}
protected function canAdmin()
{
return Admin::user()->isRole('administrator');
}
}

View File

@ -2,7 +2,7 @@
namespace App\Admin\Controllers\Store;
use Dcat\Admin\{Form, Grid};
use Dcat\Admin\{Form, Grid, Admin};
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Models\Administrator;
use App\Models\{ProductCategory, ProductSku};
@ -14,7 +14,18 @@ class ProductController extends AdminController
public function listByStore()
{
$list = StoreProductSku::with(['productSku'])->where('store_id', request('q'))->get();
$user = Admin::user();
$canAdmin = $this->canAdmin();
$query = StoreProductSku::with(['productSku']);
if ($canAdmin) {
$query->where('store_id', request('q'));
} else {
$stores = $user->stores->pluck('id');
$query->whereIn('store_id', $stores);
}
$list = $query->get();
$data = [];
foreach($list as $item) {
array_push($data, ['id' => $item->productSku->id, 'text' => $item->productSku->name]);
@ -24,34 +35,37 @@ class ProductController extends AdminController
protected function grid()
{
$grid = new Grid(StoreProductSku::with(['store', 'productSku.category']));
$grid = new Grid(StoreProductSku::with(['store', 'productSku']));
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores->pluck('id');
$grid->model()->whereIn('store_id', $stores);
}
$grid->model()->orderBy('id', 'desc');
$grid->column('id', 'ID');
$grid->column('store.title', '店铺');
$grid->column('productSku.category.name', '分类');
$grid->column('productSku.name', '名称');
$grid->column('productSku.specs', '规格')->label();
$grid->column('productSku.cost_price', '成本价')->display(function ($value) {
return bcdiv($value, 100, 2);;
return bcdiv($value, 100, 2);
});
$grid->column('productSku.sell_price', '销售价')->display(function ($value) {
return bcdiv($value, 100, 2);;
});
$grid->column('amount', '库存')->sortable();
$grid->column('productSku.specs', '规格')->label();
$grid->column('status', '状态')->switch();
$grid->paginate(10);
$grid->showCreateButton();
$grid->showCreateButton($user->can('dcat.admin.store.product.create'));
$grid->enableDialogCreate();
$grid->showDeleteButton();
// $grid->showRowSelector();
$grid->showDeleteButton($user->can('dcat.admin.store.product.destroy'));
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('store_id')->select(Store::pluck('title', 'id'))->width(3);
$filter->equal('productSku.category_id', '分类')->select(ProductCategory::withDepth()->having('depth', '=', 2)->pluck('name', 'id'))->width(3);
$filter->equal('store_id')->select('api/store')->width(3);
$filter->like('productSku.name', '名称')->width(3);
});
return $grid;
@ -62,7 +76,7 @@ class ProductController extends AdminController
$form = Form::make(StoreProductSku::with(['productSku']));
$form->select('store_id')->options(Store::pluck('title', 'id'));
$form->select('product_sku_id')->options(ProductSku::class)->ajax('api/product-skus');
$form->switch('status')->default(1);
$form->switch('status', '状态')->default(1);
$form->saving(function (Form $form) {
if ($form->isCreating()) {
$store_id = $form->input('store_id');
@ -74,4 +88,9 @@ class ProductController extends AdminController
});
return $form;
}
protected function canAdmin()
{
return Admin::user()->isRole('administrator');
}
}

View File

@ -3,7 +3,7 @@
namespace App\Admin\Controllers\Store;
use App\Models\Store\{Store, StockLog, ProductSku};
use Dcat\Admin\{Form, Grid, Admin};
use Dcat\Admin\{Form, Grid, Admin, Show};
use Dcat\Admin\Http\Controllers\AdminController;
class StockController extends AdminController
@ -13,6 +13,13 @@ class StockController extends AdminController
{
$grid = new Grid(StockLog::with(['store', 'productSku', 'tag']));
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores->pluck('id');
$grid->model()->whereIn('store_id', $stores);
}
$grid->model()->orderBy('created_at', 'desc');
$grid->column('store.title', '门店');
@ -34,10 +41,11 @@ class StockController extends AdminController
$grid->column('remarks', '备注');
$grid->column('created_at', '操作时间');
$grid->disableActions();
$grid->showCreateButton();
$grid->showCreateButton($user->can('dcat.admin.store.stock.create'));
$grid->enableDialogCreate();
$grid->showViewButton($user->can('dcat.admin.store.stock.show'));
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('store_id')->select(Store::pluck('title', 'id'))->width(3);
@ -50,7 +58,7 @@ class StockController extends AdminController
{
$form = Form::make(new StockLog());
$form->select('tag_id')->options(StockLog::tags()->pluck('name', 'id'))->required();
$form->select('store_id')->options(Store::pluck('title', 'id'))->required()->load('product_sku_id', 'store/product-by-store');
$form->select('store_id')->options(Store::pluck('title', 'id'))->required()->load('product_sku_id', 'api/product-by-store');
$form->select('product_sku_id')->required();
$form->number('amount')->help('正数为增加, 负数为减少')->default(0)->required();
$form->text('remarks');
@ -89,4 +97,41 @@ class StockController extends AdminController
});
return $form;
}
protected function detail($id)
{
$show = Show::make($id, StockLog::with(['store', 'productSku', 'tag']));
$show->field('store.title', '门店');
$show->field('product_sku.name', '商品');
$show->field('product_sku.specs', '商品规格')->label();
$show->field('tag.name', '类目');
$show->field('amount')->as(function ($value) {
return '<span class="text-'.($value > 0 ? 'success' : 'danger') .'">'.$value.'</span>';
})->escape(false);
$show->field('balance');
$show->field('operator', '操作人')->as(function () {
$v = $this->operator;
if ($v instanceof \App\Models\Admin\Administrator) {
return $v->name . '<span class="label bg-primary">管理员</span>';
} else if ($v instanceof \App\Models\User) {
return $v->phone . '<span class="label bg-info">员工</span>';
}
return '未知身份';
})->escape(false);
$show->field('remarks', '备注');
$show->field('created_at', '操作时间');
$show->panel()->tools(function ($tools) {
$tools->disableEdit();
$tools->disableDelete();
});
return $show;
}
protected function canAdmin()
{
return Admin::user()->isRole('administrator');
}
}

View File

@ -3,12 +3,9 @@
namespace App\Admin\Controllers\Store;
use App\Models\Store\{Store, ProductSku, Administrator as StoreAdministrator, StockLog};
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\{Form, Grid, Show, Admin};
use Dcat\Admin\Http\Controllers\AdminController;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Illuminate\Support\Facades\DB;
use App\Models\Admin\Administrator;
use Dcat\Admin\Layout\Row;
@ -22,38 +19,57 @@ class StoreController extends AdminController
return $content->title('总览');
}
protected function grid()
public function list()
{
$query = Store::query();
$q = request('q');
$query = Store::where('title', 'like', '%'.$q.'%');
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$ids = DB::table('store_admin_users')->where('administrator_id', $user->id)->pluck('store_id');
$query = $query->whereIn('id', $ids);
$stores = $user->stores;
$query->whereIn('id', $stores->pluck('id'));
}
return Grid::make($query, function (Grid $grid) use ($canAdmin) {
$grid->model()->sort();
return $query->select(['id', 'title as text'])->get();
}
$grid->column('id');
$grid->column('title');
$grid->column('image')->image('', 100, 100);
$grid->column('status')->switch();
$grid->column('sort')->editable();
$grid->column('created_at');
$grid->disableCreateButton(!$canAdmin);
$grid->enableDialogCreate();
$grid->showViewButton();
$grid->showQuickEditButton();
$grid->showDeleteButton($canAdmin);
protected function grid()
{
$grid = Grid::make(new Store());
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->like('title')->width(3);
});
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores;
$grid->model()->whereIn('id', $stores->pluck('id'));
}
$grid->model()->sort();
$grid->column('id');
$grid->column('title');
$grid->column('image')->image('', 100, 100);
$grid->column('status')->switch();
$grid->column('sort')->editable();
$grid->column('created_at');
$grid->disableCreateButton(!$canAdmin);
$grid->enableDialogCreate();
$grid->showViewButton($user->can('dcat.admin.store.list.show'));
$grid->showQuickEditButton($user->can('dcat.admin.store.list.edit'));
$grid->showDeleteButton($canAdmin);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->like('title')->width(3);
});
return $grid;
}
/**
@ -65,6 +81,10 @@ class StoreController extends AdminController
*/
protected function detail($id)
{
if (!$this->canAdmin()) {
$user = Admin::user();
$user->stores()->findOrFail($id);
}
$show = Show::make($id, new Store(), function (Show $show) {
$show->field('id');
@ -76,18 +96,6 @@ class StoreController extends AdminController
$show->field('created_at');
});
return $show;
// $row = new Row();
// $row->column(5, $show);
// $tab = Tab::make()->withCard();
// $tab->add('商品', Card::make($this->gridProduct($id)));
// $tab->add('库存', Card::make($this->gridStock($id)));
// if ($canAdmin) {
// $tab->add('管理员', Card::make($this->gridAdmin($id)));
// }
// $row->column(7, $tab);
// return $row;
}
/**

View File

@ -49,14 +49,16 @@ class UserVipController extends AdminController
*/
protected function detail($id)
{
return Show::make($id, UserVip::with(['user', 'vip', 'pay']), function (Show $show) {
return Show::make($id, UserVip::with(['user', 'pay']), function (Show $show) {
$show->field('id');
$show->field('user.phone', '用户');
$show->field('vip.name', '会员卡');
$show->field('name', '会员卡');
$show->field('times')->as(function ($v) {
return data_get($v, 'text');
});
$show->field('success_time');
$show->field('expired');
$show->field('gift', '赠品')->view('admin.vip.gift');
$show->field('pay.pay_sn', '订单号');
$show->field('pay.pay_way', '支付方式')->as(function ($value) {

View File

@ -32,17 +32,12 @@ class VipController extends AdminController
$grid->disableViewButton(false);
//新增
$grid->showCreateButton(Admin::user()->can('dcat.admin.vips.create'));
$grid->showCreateButton(Admin::user()->can('dcat.admin.vip.create'));
//修改
$grid->showEditButton(Admin::user()->can('dcat.admin.vips.edit'));
$grid->showEditButton(Admin::user()->can('dcat.admin.vip.edit'));
//删除以及自定义操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableDelete(Admin::user()->cannot('dcat.admin.vips.destroy'));
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(false);
$filter->like('name')->width(3);
$actions->disableDelete(Admin::user()->cannot('dcat.admin.vip.destroy'));
});
});
}
@ -92,7 +87,7 @@ class VipController extends AdminController
$form->switch('status')->default(1);
$form->textarea('description');
$form->embeds('gift', function ($form) {
$form->multipleSelect('coupon')->options(Coupon::pluck('name', 'id'));
$form->multipleSelect('coupon')->options(Coupon::class)->ajax('api/coupons');
});
});
}

View File

@ -20,7 +20,7 @@ class UserEditAgent extends Form implements LazyRenderable
*/
protected function authorize($user): bool
{
return $user->can('dcat.admin.users.edit_vip');
return $user->can('dcat.admin.users.agent');
}
/**

View File

@ -33,7 +33,7 @@ class Permissions
}
admin_exit(
Content::make()->withError(trans('admin.deny'))
Content::make()->withError(trans('admin.deny') . '----' . $routeName)
);
}

View File

@ -169,23 +169,23 @@ Route::group([
$router->get('api/order-products', 'OrderController@orderProducts')->name('api.order_products');
$router->get('api/users', 'UserController@users')->name('api.users');
$router->get('api/bargain-activities', 'BargainActivityController@activities')->name('api.bargain_activities');
$router->get('api/product-by-store', 'Store\ProductController@listByStore')->name('api.store_product');
$router->get('api/store', 'Store\StoreController@list')->name('api.store');
/** 调试接口 **/
// $router->get('test', 'HomeController@test');
$router->get('store/product-by-store', 'Store\ProductController@listByStore');
$router->get('store/info', 'Store\StoreController@info');
$router->resource('store/list', 'Store\StoreController');
$router->resource('store/product', 'Store\ProductController');
$router->resource('store/stock', 'Store\StockController');
$router->resource('store/order', 'Store\OrderController')->only(['index', 'show']);
$router->resource('store/user', 'Store\UserController');
// $router->resource('store/{store_id}/admin', 'Store\AdministratorController');
$router->get('store/info', 'Store\StoreController@info')->name('store.info');
$router->resource('store/list', 'Store\StoreController')->names('store');
$router->resource('store/product', 'Store\ProductController')->names('store.product');
$router->resource('store/user', 'Store\UserController')->only(['index'])->names('store.user');
$router->resource('store/order', 'Store\OrderController')->only(['index', 'show'])->names('store.order');
$router->resource('store/stock', 'Store\StockController')->only(['index', 'create', 'store', 'show'])->names('store.stock');
$router->resource('profit', 'OrderProfitController');
$router->resource('agent', 'AgentController');
$router->resource('agent', 'AgentController')->names('agent');
$router->resource('user-vip', 'UserVipController')->only(['index', 'show']);
$router->resource('vip', 'VipController');
$router->resource('user-vip', 'UserVipController')->only(['index', 'show'])->names('user_vip');
$router->resource('vip', 'VipController')->names('vip');
});

View File

@ -74,4 +74,9 @@ class Administrator extends DcatAdministrator
}
return $reduced <= ($this->orderReduceRange->max*100);
}
public function stores()
{
return $this->belongsToMany(\App\Models\Store\Store::class, 'store_administrators', 'administrator_id', 'store_id');
}
}

View File

@ -34,6 +34,7 @@ class CreateVipsTable extends Migration
$table->text('gift')->nullable()->comment('赠品');
$table->tinyInteger('status')->default(0)->comment('状态(0: 待支付, 1: 支付成功)');
$table->timestamp('success_time')->nullable()->comment('购买时间');
$table->timestamp('expired')->nullable()->comment('购买后的会员有效期');
$table->timestamps();
});
}

View File

@ -1,32 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddExipiredToUserVips extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_vips', function (Blueprint $table) {
$table->timestamp('expired')->nullable()->comment('购买后的会员有效期');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_vips', function (Blueprint $table) {
$table->dropColumn(['expired']);
});
}
}

View File

@ -62,6 +62,8 @@ class AdminPermissionSeeder extends Seeder
'api.orders'=>['name'=>'订单'],
'api.order_products'=>['name'=>'订单商品'],
'api.users'=>['name'=>'用户'],
'api.store_product' => ['name' => '查询店铺商品'],
'api.store' => ['name' => '查询店铺'],
],
],
'home'=>[
@ -74,7 +76,7 @@ class AdminPermissionSeeder extends Seeder
],
],
'users'=>[
'name'=>'会员管理',
'name'=>'用户管理',
'curd'=>['index', 'show', 'create', 'store', 'destroy'],
'children'=>[
'disable' =>['name'=>'禁用'],
@ -87,6 +89,18 @@ class AdminPermissionSeeder extends Seeder
'agent'=>['name'=>'设置代理'],
],
],
'agent' => [
'name' => '代理等级设置',
'curd' => ['index', 'show', 'create', 'store', 'destroy'],
],
'vip' => [
'name' => '会员卡管理',
'curd' => ['index', 'show', 'create', 'store', 'destroy'],
],
'user_vip' => [
'name' => '会员卡购买记录',
'curd' => ['index', 'show'],
],
'article_categories' =>[
'name'=>'文章分类',
'curd' => ['index', 'create', 'store', 'edit', 'update', 'destroy'],
@ -307,12 +321,15 @@ class AdminPermissionSeeder extends Seeder
],
],
'store' => [
'name' => '店铺管理',
'curd' => ['index', 'create', 'store', 'edit', 'update', 'destroy'],
],
'vip' => [
'name' => '代理等级管理',
'curd' => ['index', 'create', 'store', 'edit', 'update', 'destroy'],
'name' => '门店管理',
'children' => [
'info' => ['name' => '总览'],
'list' => ['name' => '信息管理', 'curd' => true],
'product' => ['name' => '商品管理', 'curd' => true],
'user' => ['name' => '员工业绩', 'curd' => ['index']],
'order' => ['name' => '订单管理', 'curd' => ['index', 'show']],
'stock' => ['name' => '库存管理', 'curd' => ['index', 'create', 'store', 'show']],
],
],
'profit' => [
'name' => '提成管理',
@ -387,7 +404,7 @@ class AdminPermissionSeeder extends Seeder
}
}
if (count($permission['children']) > 0) {
$_key = $permission['curd'] ? ($key ? $key.'.'.$slug : $slug) : $key;
$_key = (isset($permission['curd']) && $permission['curd']) ? ($key ? $key.'.'.$slug : $slug) : $key;
$this->createPermissionData($permission['children'], $_key ?? $slug, $pper->id);
}
}

View File

@ -3,7 +3,7 @@
return [
'labels' => [
'Agent' => '代理等级',
'agents' => '代理等级',
'agent' => '代理等级',
],
'fields' => [
'name' => '等级名称',

View File

@ -9,6 +9,7 @@ return [
'fields' => [
'store_id' => '门店',
'product_sku_id' => '商品',
'status' => '状态',
],
'options' => [
],