Browse Source

供应商产品增加扩展字段

develop
李可松 4 years ago
parent
commit
185d6cf6cc
  1. 14
      MySQL_change.sql
  2. 13
      app/Admin/Controllers/SupplierController.php
  3. 92
      app/AdminSupplier/Controllers/ProductController.php
  4. 27
      app/AdminSupplier/bootstrap.php
  5. 1
      app/Models/Product.php
  6. 3
      app/Models/Supplier.php
  7. 8
      resources/lang/zh_CN/product.php
  8. 1
      resources/lang/zh_CN/supplier.php

14
MySQL_change.sql

@ -260,4 +260,18 @@ ALTER TABLE `orders`
ALTER TABLE `user_money_logs` ALTER TABLE `user_money_logs`
ADD COLUMN `out_trade_no` CHAR(24) NOT NULL DEFAULT '' COMMENT '发起支付时传给微信的订单号(格式:order_no-status)' AFTER `transaction_id`; ADD COLUMN `out_trade_no` CHAR(24) NOT NULL DEFAULT '' COMMENT '发起支付时传给微信的订单号(格式:order_no-status)' AFTER `transaction_id`;
# 11:40 2021/9/6
ALTER TABLE `products`
CHANGE COLUMN `status` `status` TINYINT(3) NOT NULL DEFAULT '1' COMMENT '-2:下架,-1:审核拒绝,0:未审核,1:上架' AFTER `sale`;
ALTER TABLE `agent_products`
CHANGE COLUMN `status` `status` TINYINT(3) NOT NULL DEFAULT '1' COMMENT '-2:下架,-1:审核拒绝,0:未审核,1:上架' AFTER `guide_id`;
# 10:40 2021/9/7
ALTER TABLE `products`
ADD COLUMN `type` TINYINT NOT NULL DEFAULT 0 COMMENT '0:旅游线路、1:洒店、2:景区、3:餐厅、4:车队、5:单项' AFTER `category_id`,
ADD COLUMN `extends` JSON NULL DEFAULT NULL COMMENT '扩展字段,根据type不同,字段名不同' AFTER `verify_mobile`;
ALTER TABLE `suppliers`
ADD COLUMN `public_type` VARCHAR(255) NOT NULL DEFAULT '[]' COMMENT '允许发布产品的模板' AFTER `rate`;

13
app/Admin/Controllers/SupplierController.php

@ -92,6 +92,15 @@ class SupplierController extends AdminController
$show->field('director'); $show->field('director');
$show->field('contact_phone'); $show->field('contact_phone');
$show->field('rate'); $show->field('rate');
$show->field('public_type')
->as(function ($value) {
if (!is_array($value)) return '';
$public_type = admin_trans('product.options.public_type');
$value = array_map(function ($v) use ($public_type) {
return $public_type[$v] ?? '';
}, $value);
return join(',', $value);
});
$show->field('created_at'); $show->field('created_at');
$show->field('updated_at'); $show->field('updated_at');
}); });
@ -130,6 +139,10 @@ class SupplierController extends AdminController
$form->text('director'); $form->text('director');
$form->mobile('contact_phone'); $form->mobile('contact_phone');
$form->number('rate')->min(0)->max(100)->help('分成百分比,如10%,则输入10'); $form->number('rate')->min(0)->max(100)->help('分成百分比,如10%,则输入10');
$form->checkbox('public_type')
->options(admin_trans('product.options.public_type'))
->default(0)
->help('供应商可发布的产品类型');
})->saving(function (Form $form) { })->saving(function (Form $form) {
//判断账号是否唯一 //判断账号是否唯一
if ($form->isCreating()) { if ($form->isCreating()) {

92
app/AdminSupplier/Controllers/ProductController.php

@ -10,9 +10,12 @@ use App\Models\AgentSetting;
use App\Models\Category; use App\Models\Category;
use Dcat\Admin\Admin; use Dcat\Admin\Admin;
use Dcat\Admin\Form; use Dcat\Admin\Form;
use Dcat\Admin\Form\NestedForm;
use Dcat\Admin\Grid; use Dcat\Admin\Grid;
use Dcat\Admin\Show; use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Widgets\Card;
use Dcat\Admin\Widgets\Table;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@ -27,7 +30,15 @@ class ProductController extends AdminController
protected function grid() protected function grid()
{ {
return Grid::make(new Product(['category:id,name']), function (Grid $grid) { return Grid::make(new Product(['category:id,name']), function (Grid $grid) {
$grid->model()->where('supplier_id', Admin::user()->id);
$type = request()->input('type');
if (isset($type) && isset(admin_trans('product.options.public_type')[$type])) {
$grid->model()->where(['supplier_id' => Admin::user()->id, 'type' => $type]);
$create_url = $grid->resource() . '/create?type=' . $type;
Admin::script('$(function(){ $(".pull-right a").attr("href", "' . $create_url . '"); });');
} else {
$grid->model()->where('supplier_id', Admin::user()->id);
}
$grid->column('id')->sortable(); $grid->column('id')->sortable();
$grid->column('category.name', '产品分类'); $grid->column('category.name', '产品分类');
@ -43,8 +54,9 @@ class ProductController extends AdminController
$grid->column('updated_at'); $grid->column('updated_at');
$grid->filter(function (Grid\Filter $filter) { $grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->panel();
$filter->equal('id')->width(2);
}); });
}); });
} }
@ -72,6 +84,22 @@ class ProductController extends AdminController
$show->field('know')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v)); $show->field('know')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v));
$show->field('content')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v)); $show->field('content')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v));
$show->field('verify_mobile','核销员手机'); $show->field('verify_mobile','核销员手机');
$show->field('extends', '附加信息')
->unescape()
->as(function ($v) {
$html = '';
$arr = [
'project' => '服务项目',
'date' => '时间',
'tags' => '包含项目',
'open_time' => '开放时间',
'package' => '包含套餐',
];
foreach ($v as $k => $item) {
$html .= new Card(Table::make([$arr[$k] ?? '项目'], $item));
}
return $html;
});
$show->field('created_at'); $show->field('created_at');
$show->field('updated_at'); $show->field('updated_at');
}); });
@ -84,13 +112,27 @@ class ProductController extends AdminController
*/ */
protected function form() protected function form()
{ {
Admin::user()->public_type = json_decode(Admin::user()->public_type, true);
return Form::make(new Product(), function (Form $form) { return Form::make(new Product(), function (Form $form) {
//不允许编辑非自己数据 //不允许编辑非自己数据
if ($form->isEditing() && $form->model()->supplier_id != Admin::user()->id) { if ($form->isEditing() && $form->model()->supplier_id != Admin::user()->id) {
return $form->response()->error('数据不存在'); return $form->response()->error('数据不存在');
} }
$type = request()->input('type');
if ($form->isCreating()) {
if ($type == null) {
Admin::exit('请选择要发布的产品类型');
}
if (!Admin::user()->public_type || !in_array($type, Admin::user()->public_type)) {
Admin::exit('对不起,你没有此类产品的发布权限');
}
} else {
$type = $form->model()->type;
}
$form->display('id'); $form->display('id');
$form->hidden('type')->value($type);
$options = Category::selectOptions(fn($query) => $query->where('agent_id', 0)); $options = Category::selectOptions(fn($query) => $query->where('agent_id', 0));
$form->select('category_id')->options(array_slice($options, 1, null, true))->required(); $form->select('category_id')->options(array_slice($options, 1, null, true))->required();
@ -102,6 +144,43 @@ class ProductController extends AdminController
$form->editor('know'); $form->editor('know');
$form->editor('content')->required(); $form->editor('content')->required();
$form->text('verify_mobile','核销员手机'); $form->text('verify_mobile','核销员手机');
//扩展字段
if ($type == 0) { //旅游线路
$form->table('extends.project', '包含项目', function (NestedForm $table) {
$table->text('name', '项目名称');
$table->text('num', '数量');
$table->text('price', '费用');
});
$form->dateRange('extends.date.start', 'extends.date.end', '行程时间');
} else if ($type == 1) { //酒店
$form->table('extends.tags', '酒店设施', function (NestedForm $table) {
$table->text('tag', '包含项目')->placeholder('如:24小时热水、干洗服务等');
});
} else if ($type == 2) { //景区
$form->table('extends.open_time', '开放时间', function (NestedForm $table) {
$table->text('week', '星期')->placeholder('如:周一至周五');
$table->text('section', '时段')->placeholder('如:上午/下午');
$table->text('time', '时间')->placeholder('如:08:00~18:00');
});
$form->table('extends.project', '包含项目', function (NestedForm $table) {
$table->text('name', '项目名称');
$table->text('num', '数量');
$table->text('price', '费用');
});
} else if ($type == 3) { //餐厅
$form->table('extends.open_time', '开放时间', function (NestedForm $table) {
$table->text('week', '星期')->placeholder('如:周一至周五');
$table->text('section', '时段')->placeholder('如:上午/下午');
$table->text('time', '时间')->placeholder('如:08:00~18:00');
});
$form->table('extends.package', '包含套餐', function (NestedForm $table) {
$table->text('name', '名称')->placeholder('如:清蒸鱿鱼');
$table->text('num', '数量')->placeholder('如:1条');
$table->text('price', '价格')->placeholder('如:99元');
});
}
if ($form->isEditing()) { if ($form->isEditing()) {
$form->confirm('提示', '修改标题、价格、产品图片、旅游须知、产品详情需要重新审核,同时<span class="btn-danger">下架所有</span>关联的代理商产品,是否继续?'); $form->confirm('提示', '修改标题、价格、产品图片、旅游须知、产品详情需要重新审核,同时<span class="btn-danger">下架所有</span>关联的代理商产品,是否继续?');
} }
@ -111,6 +190,11 @@ class ProductController extends AdminController
return $form->response()->error('数据不存在'); return $form->response()->error('数据不存在');
} }
$type = $form->isCreating() ? $form->type : $form->model()->type;
if (!Admin::user()->public_type || !in_array($type, Admin::user()->public_type)) {
return $form->response()->error('对不起,你没有此类产品的发布、编辑权限');
}
//不允许编辑的字段,忽略字段不起作用? //不允许编辑的字段,忽略字段不起作用?
$form->ignore(['id', 'supplier_id', 'sale', 'status', 'created_at', 'updated_at', 'deleted_at']); $form->ignore(['id', 'supplier_id', 'sale', 'status', 'created_at', 'updated_at', 'deleted_at']);
@ -122,9 +206,9 @@ class ProductController extends AdminController
} }
//特殊字段处理 //特殊字段处理
$form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值
$form->supplier_id = Admin::user()->id;
if ($form->isCreating()) { if ($form->isCreating()) {
$form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值
$form->supplier_id = Admin::user()->id;
$form->status = ProductStatus::UNAUDITED; $form->status = ProductStatus::UNAUDITED;
} }
})->saved(function (Form $form, $result) { })->saved(function (Form $form, $result) {

27
app/AdminSupplier/bootstrap.php

@ -4,6 +4,7 @@ use Dcat\Admin\Admin;
use Dcat\Admin\Grid; use Dcat\Admin\Grid;
use Dcat\Admin\Form; use Dcat\Admin\Form;
use Dcat\Admin\Grid\Filter; use Dcat\Admin\Grid\Filter;
use Dcat\Admin\Layout\Menu;
use Dcat\Admin\Show; use Dcat\Admin\Show;
/** /**
@ -32,3 +33,29 @@ app('view')->prependNamespace('admin', resource_path('views/admin'));
Filter::resolving(function (Filter $filter) { Filter::resolving(function (Filter $filter) {
$filter->panel(); $filter->panel();
}); });
/*Admin::menu(function (Menu $menu) {
$items[] = [
'id' => '9999', // 此id只要保证当前的数组中是唯一的即可
'title' => '产品管理',
'icon' => 'fa-cubes',
'uri' => admin_url('/product/list'),
'parent_id' => 0,
'permission_id' => 'supplier_role_1', // 与权限绑定
'roles' => 'test-roles', // 与角色绑定
];
$public_type = json_decode(Admin::user()->public_type, true);
$public_type_arr = admin_trans('product.options.public_type');
foreach ($public_type as $k => $v) {
$items[] = [
'id' => $k + 1, // 此id只要保证当前的数组中是唯一的即可
'title' => $public_type_arr[$v] ?? '无名菜单',
'icon' => 'feather icon-circle',
'uri' => admin_url('/product/list?type=' . $v),
'parent_id' => '9999',
];
}
$menu->add($items);
});*/

1
app/Models/Product.php

@ -15,6 +15,7 @@ class Product extends BaseModel
use HasFactory, SoftDeletes; use HasFactory, SoftDeletes;
protected $guarded = ['id']; //不允许编辑的字段 protected $guarded = ['id']; //不允许编辑的字段
protected $casts = ['extends' => 'json'];
// 获取所有产品图片 // 获取所有产品图片
public function getPicturesAttribute($value): array public function getPicturesAttribute($value): array

3
app/Models/Supplier.php

@ -9,6 +9,8 @@ class Supplier extends BaseModel
{ {
use HasFactory, SoftDeletes; use HasFactory, SoftDeletes;
protected $casts = ['public_type' => 'json'];
//密码修改 //密码修改
public function setPasswordAttribute($value) public function setPasswordAttribute($value)
{ {
@ -17,7 +19,6 @@ class Supplier extends BaseModel
} }
} }
public function demand() public function demand()
{ {
return $this->morphOne('App\Models\Demand', 'publisher'); return $this->morphOne('App\Models\Demand', 'publisher');

8
resources/lang/zh_CN/product.php

@ -20,5 +20,13 @@ return [
'supplier' => trans('supplier.fields'), 'supplier' => trans('supplier.fields'),
], ],
'options' => [ 'options' => [
'public_type' => [
0 => '旅游线路',
1 => '洒店',
2 => '景区',
3 => '餐厅',
4 => '车队',
5 => '单项',
],
], ],
]; ];

1
resources/lang/zh_CN/supplier.php

@ -16,6 +16,7 @@ return [
'director' => '负责人', 'director' => '负责人',
'contact_phone' => '联系电话', 'contact_phone' => '联系电话',
'rate' => '分成比例', 'rate' => '分成比例',
'public_type' => '可发布产品类型',
], ],
'options' => [ 'options' => [
], ],

Loading…
Cancel
Save