品牌配置
This commit is contained in:
parent
0faeaeb324
commit
43cf795528
66
application/admin/command/CarImport.php
Normal file
66
application/admin/command/CarImport.php
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\admin\command;
|
||||||
|
|
||||||
|
use think\console\Command;
|
||||||
|
use think\console\Input;
|
||||||
|
use think\console\Output;
|
||||||
|
use think\Db;
|
||||||
|
|
||||||
|
class CarImport extends Command
|
||||||
|
{
|
||||||
|
protected function configure()
|
||||||
|
{
|
||||||
|
$this->setName('car:import')
|
||||||
|
->setDescription('导入常见汽车品牌和系列到 brands 与 series 表');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(Input $input, Output $output)
|
||||||
|
{
|
||||||
|
$brands = [
|
||||||
|
'奔驰' => ['C级', 'E级', 'S级', 'GLC', 'GLE', 'GLS'],
|
||||||
|
'宝马' => ['3系', '5系', '7系', 'X1', 'X3', 'X5'],
|
||||||
|
'奥迪' => ['A3', 'A4', 'A6', 'A8', 'Q3', 'Q5', 'Q7'],
|
||||||
|
'大众' => ['朗逸', '速腾', '宝来', '迈腾', '帕萨特', '途观', '途昂'],
|
||||||
|
'丰田' => ['卡罗拉', '凯美瑞', '汉兰达', 'RAV4', '普拉多'],
|
||||||
|
'本田' => ['思域', '雅阁', 'CR-V', 'XR-V', '奥德赛'],
|
||||||
|
'日产' => ['轩逸', '天籁', '奇骏', '逍客'],
|
||||||
|
'特斯拉' => ['Model 3', 'Model Y', 'Model S', 'Model X'],
|
||||||
|
'福特' => ['福克斯', '蒙迪欧', '锐界', '探险者'],
|
||||||
|
'比亚迪' => ['汉', '唐', '宋', '秦', '元PLUS']
|
||||||
|
];
|
||||||
|
|
||||||
|
$now = date('Y-m-d H:i:s');
|
||||||
|
$insertedBrands = 0;
|
||||||
|
$insertedSeries = 0;
|
||||||
|
|
||||||
|
foreach ($brands as $brandName => $seriesList) {
|
||||||
|
// 避免重复插入
|
||||||
|
$exists = Db::name('brands')->where('name', $brandName)->find();
|
||||||
|
if ($exists) {
|
||||||
|
$brandId = $exists['id'];
|
||||||
|
} else {
|
||||||
|
$brandId = Db::name('brands')->insertGetId([
|
||||||
|
'name' => $brandName,
|
||||||
|
'sort_order' => 0,
|
||||||
|
'created_at' => $now
|
||||||
|
]);
|
||||||
|
$insertedBrands++;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($seriesList as $seriesName) {
|
||||||
|
$existsSeries = Db::name('series')->where('brand_id', $brandId)->where('name', $seriesName)->find();
|
||||||
|
if (!$existsSeries) {
|
||||||
|
Db::name('series')->insert([
|
||||||
|
'brand_id' => $brandId,
|
||||||
|
'name' => $seriesName,
|
||||||
|
'created_at' => $now
|
||||||
|
]);
|
||||||
|
$insertedSeries++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$output->writeln("✅ 导入完成:{$insertedBrands} 个品牌,{$insertedSeries} 个系列");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -194,4 +194,20 @@ if (!function_exists('build_heading')) {
|
||||||
}
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
if (!function_exists('dd')) {
|
||||||
|
/**
|
||||||
|
* 检测IP是否允许
|
||||||
|
* @param string $ip IP地址
|
||||||
|
*/
|
||||||
|
function dd(...$vars)
|
||||||
|
{
|
||||||
|
$counter = 1;
|
||||||
|
foreach ($vars as $var) {
|
||||||
|
echo "Variable {$counter}:\n";
|
||||||
|
dump($var);
|
||||||
|
$counter++;
|
||||||
|
}
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,12 @@ class Series extends Backend
|
||||||
parent::_initialize();
|
parent::_initialize();
|
||||||
$this->model = new \app\admin\model\Series;
|
$this->model = new \app\admin\model\Series;
|
||||||
|
|
||||||
|
$data = \app\admin\model\Brands::order('sort_order')->field('id,name')->select();
|
||||||
|
$brands = [];
|
||||||
|
foreach ($data as $datum){
|
||||||
|
$brands [] = $datum->toArray();
|
||||||
|
}
|
||||||
|
$this->view->assign('brands',$brands);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -33,5 +39,27 @@ class Series extends Backend
|
||||||
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
|
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
protected $relationSearch = true;
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
//设置过滤方法
|
||||||
|
$this->request->filter(['strip_tags', 'trim']);
|
||||||
|
if (false === $this->request->isAjax()) {
|
||||||
|
return $this->view->fetch();
|
||||||
|
}
|
||||||
|
//如果发送的来源是 Selectpage,则转发到 Selectpage
|
||||||
|
if ($this->request->request('keyField')) {
|
||||||
|
return $this->selectpage();
|
||||||
|
}
|
||||||
|
[$where, $sort, $order, $offset, $limit] = $this->buildparams();
|
||||||
|
$list = $this->model
|
||||||
|
->where($where)
|
||||||
|
->order($sort, $order)
|
||||||
|
->with('brand')
|
||||||
|
->paginate($limit);
|
||||||
|
$result = ['total' => $list->total(), 'rows' => $list->items()];
|
||||||
|
return json($result);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
application/admin/lang/zh-cn/attributes.php
Normal file
11
application/admin/lang/zh-cn/attributes.php
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'Name' => '属性名称',
|
||||||
|
'Field_key' => '标识',
|
||||||
|
'Options' => '配置',
|
||||||
|
'Input_type' => '类型',
|
||||||
|
'Is_filter' => '是否参与筛选',
|
||||||
|
'Created_at' => '创建时间',
|
||||||
|
'Sort_order' => '排序'
|
||||||
|
];
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'Name' => '名称',
|
||||||
|
'Logo' => 'Logo',
|
||||||
|
'Sort_order' => '排序',
|
||||||
|
'Created_at' => '创建时间',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
return [
|
|
||||||
'Name' => '属性名称,例如 排量',
|
|
||||||
'Field_key' => '唯一标识,例如 displacement',
|
|
||||||
'Options' => 'JSON数组:如 [{label:..., value:...}]',
|
|
||||||
'Is_filter' => '是否参与筛选'
|
|
||||||
];
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'Created_at' => '创建时间'
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,10 @@ class Series extends Model
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
public function brand()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Brands::class,'brand_id')->setEagerlyType(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,17 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-logo" class="form-control" name="row[logo]" type="text">
|
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="c-images" data-rule="required" class="form-control" size="50" name="row[logo]" type="text">
|
||||||
|
<div class="input-group-addon no-border no-padding">
|
||||||
|
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
</div>
|
||||||
|
<span class="msg-box n-right" for="c-images"></span>
|
||||||
|
</div>
|
||||||
|
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -18,12 +28,6 @@
|
||||||
<input id="c-sort_order" class="form-control" name="row[sort_order]" type="number" value="0">
|
<input id="c-sort_order" class="form-control" name="row[sort_order]" type="number" value="0">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-created_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[created_at]" type="text" value="{:date('Y-m-d H:i:s')}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group layer-footer">
|
<div class="form-group layer-footer">
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
|
||||||
|
|
@ -9,21 +9,27 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-logo" class="form-control" name="row[logo]" type="text" value="{$row.logo|htmlentities}">
|
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="c-images" data-rule="required" class="form-control" size="50" name="row[logo]" type="text" value="{$row['logo']}">
|
||||||
|
<div class="input-group-addon no-border no-padding">
|
||||||
|
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
</div>
|
||||||
|
<span class="msg-box n-right" for="c-images"></span>
|
||||||
|
</div>
|
||||||
|
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Sort_order')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Sort_order')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-sort_order" class="form-control" name="row[sort_order]" type="number" value="{$row.sort_order|htmlentities}">
|
<input id="c-sort_order" class="form-control" name="row[sort_order]" type="number" value="{$row.sort_order|htmlentities}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-created_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[created_at]" type="text" value="{$row.created_at}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group layer-footer">
|
<div class="form-group layer-footer">
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,11 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-brand_id" data-rule="required" data-source="brand/index" class="form-control selectpage" name="row[brand_id]" type="text" value="">
|
<select id="c-source" data-live-search="true" title="请选择品牌" name="row[brand_id]" class="form-control selectpicker show-tick">
|
||||||
|
{foreach $brands as $item}
|
||||||
|
<option value="{$item['id']}">{$item['name']}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -12,12 +16,6 @@
|
||||||
<input id="c-name" class="form-control" name="row[name]" type="text">
|
<input id="c-name" class="form-control" name="row[name]" type="text">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-created_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[created_at]" type="text" value="{:date('Y-m-d H:i:s')}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group layer-footer">
|
<div class="form-group layer-footer">
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,11 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-brand_id" data-rule="required" data-source="brand/index" class="form-control selectpage" name="row[brand_id]" type="text" value="{$row.brand_id|htmlentities}">
|
<select id="c-source" data-live-search="true" title="请选择品牌" name="row[brand_id]" class="form-control selectpicker show-tick">
|
||||||
</div>
|
{foreach $brands as $item}
|
||||||
|
<option {if $item['id'] == $row.brand_id} selected {/if} value="{$item['id']}">{$item['name']}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select> </div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
|
||||||
|
|
@ -12,12 +15,6 @@
|
||||||
<input id="c-name" class="form-control" name="row[name]" type="text" value="{$row.name|htmlentities}">
|
<input id="c-name" class="form-control" name="row[name]" type="text" value="{$row.name|htmlentities}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-created_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[created_at]" type="text" value="{$row.created_at}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group layer-footer">
|
<div class="form-group layer-footer">
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,5 @@ return [
|
||||||
'app\admin\command\Min',
|
'app\admin\command\Min',
|
||||||
'app\admin\command\Addon',
|
'app\admin\command\Addon',
|
||||||
'app\admin\command\Api',
|
'app\admin\command\Api',
|
||||||
|
'app\admin\command\CarImport',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
2
public/assets/css/backend.min.css
vendored
2
public/assets/css/backend.min.css
vendored
File diff suppressed because one or more lines are too long
2
public/assets/css/frontend.min.css
vendored
2
public/assets/css/frontend.min.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -27,7 +27,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
||||||
{checkbox: true},
|
{checkbox: true},
|
||||||
{field: 'id', title: __('Id')},
|
{field: 'id', title: __('Id')},
|
||||||
{field: 'name', title: __('Name'), operate: 'LIKE'},
|
{field: 'name', title: __('Name'), operate: 'LIKE'},
|
||||||
{field: 'logo', title: __('Logo'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
|
{field: 'logo', title: __('Logo'), operate: false,
|
||||||
|
events: Table.api.events.image,
|
||||||
|
formatter: Table.api.formatter.images},
|
||||||
{field: 'sort_order', title: __('Sort_order')},
|
{field: 'sort_order', title: __('Sort_order')},
|
||||||
{field: 'created_at', title: __('Created_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
|
{field: 'created_at', title: __('Created_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
|
||||||
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
|
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
||||||
[
|
[
|
||||||
{checkbox: true},
|
{checkbox: true},
|
||||||
{field: 'id', title: __('Id')},
|
{field: 'id', title: __('Id')},
|
||||||
{field: 'brand_id', title: __('Brand_id')},
|
{field: 'brand.name', title: '品牌'},
|
||||||
{field: 'name', title: __('Name'), operate: 'LIKE'},
|
{field: 'name', title: __('Name'), operate: 'LIKE'},
|
||||||
{field: 'created_at', title: __('Created_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
|
{field: 'created_at', title: __('Created_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
|
||||||
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
|
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user