品牌配置

This commit is contained in:
hantao 2025-06-23 20:19:33 +08:00
parent 0faeaeb324
commit 43cf795528
17 changed files with 171 additions and 43 deletions

View 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} 个系列");
}
}

View File

@ -194,4 +194,20 @@ if (!function_exists('build_heading')) {
}
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;
}
}
}

View File

@ -23,6 +23,12 @@ class Series extends Backend
parent::_initialize();
$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中对应的方法复制到当前控制器,然后进行修改
*/
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);
}
}

View File

@ -0,0 +1,11 @@
<?php
return [
'Name' => '属性名称',
'Field_key' => '标识',
'Options' => '配置',
'Input_type' => '类型',
'Is_filter' => '是否参与筛选',
'Created_at' => '创建时间',
'Sort_order' => '排序'
];

View File

@ -1,5 +1,8 @@
<?php
return [
'Name' => '名称',
'Logo' => 'Logo',
'Sort_order' => '排序',
'Created_at' => '创建时间',
];

View File

@ -1,8 +0,0 @@
<?php
return [
'Name' => '属性名称,例如 排量',
'Field_key' => '唯一标识,例如 displacement',
'Options' => 'JSON数组如 [{label:..., value:...}]',
'Is_filter' => '是否参与筛选'
];

View File

@ -1,5 +1,5 @@
<?php
return [
'Created_at' => '创建时间'
];

View File

@ -29,6 +29,10 @@ class Series extends Model
];
public function brand()
{
return $this->belongsTo(Brands::class,'brand_id')->setEagerlyType(0);
}

View File

@ -9,7 +9,17 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
<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 class="form-group">
@ -18,12 +28,6 @@
<input id="c-sort_order" class="form-control" name="row[sort_order]" type="number" value="0">
</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">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">

View File

@ -9,21 +9,27 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
<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 class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Sort_order')}:</label>
<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}">
</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">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">

View File

@ -3,7 +3,11 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
<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 class="form-group">
@ -12,12 +16,6 @@
<input id="c-name" class="form-control" name="row[name]" type="text">
</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">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">

View File

@ -3,8 +3,11 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Brand_id')}:</label>
<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}">
</div>
<select id="c-source" data-live-search="true" title="请选择品牌" name="row[brand_id]" class="form-control selectpicker show-tick">
{foreach $brands as $item}
<option {if $item['id'] == $row.brand_id} selected {/if} value="{$item['id']}">{$item['name']}</option>
{/foreach}
</select> </div>
</div>
<div class="form-group">
<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}">
</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">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">

View File

@ -17,4 +17,5 @@ return [
'app\admin\command\Min',
'app\admin\command\Addon',
'app\admin\command\Api',
'app\admin\command\CarImport',
];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -27,7 +27,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
{checkbox: true},
{field: 'id', title: __('Id')},
{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: '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}

View File

@ -26,7 +26,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'brand_id', title: __('Brand_id')},
{field: 'brand.name', title: '品牌'},
{field: 'name', title: __('Name'), operate: 'LIKE'},
{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}