提交 f3f14413 编写于 作者: D devil

品牌分类优化

上级 29aff1ac
......@@ -12,6 +12,7 @@ namespace app\admin\controller;
use think\facade\Hook;
use app\service\BrandService;
use app\service\BrandCategoryService;
/**
* 品牌管理
......@@ -138,7 +139,7 @@ class Brand extends Common
$this->assign('common_is_enable_list', lang('common_is_enable_list'));
// 品牌分类
$brand_category = BrandService::BrandCategoryList(['field'=>'id,name']);
$brand_category = BrandCategoryService::BrandCategoryList(['field'=>'id,name']);
$this->assign('brand_category', $brand_category['data']);
// 品牌编辑页面钩子
......
......@@ -10,7 +10,7 @@
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\service\BrandService;
use app\service\BrandCategoryService;
/**
* 品牌分类管理
......@@ -71,7 +71,7 @@ class BrandCategory extends Common
}
// 开始操作
return BrandService::BrandCategoryNodeSon(input());
return BrandCategoryService::BrandCategoryNodeSon($this->data_request);
}
/**
......@@ -90,7 +90,7 @@ class BrandCategory extends Common
}
// 开始操作
return BrandService::BrandCategorySave(input());
return BrandCategoryService::BrandCategorySave($this->data_request);
}
/**
......@@ -109,9 +109,9 @@ class BrandCategory extends Common
}
// 开始操作
$params = input('post.');
$params = $this->data_post;
$params['admin'] = $this->admin;
return BrandService::BrandCategoryDelete($params);
return BrandCategoryService::BrandCategoryDelete($params);
}
}
?>
\ No newline at end of file
......@@ -10,7 +10,9 @@
// +----------------------------------------------------------------------
namespace app\admin\form;
use think\Db;
use app\service\BrandService;
use app\service\BrandCategoryService;
/**
* 品牌动态表格
......@@ -86,15 +88,16 @@ class Brand
[
'label' => '品牌分类',
'view_type' => 'field',
'view_key' => 'brand_category_name',
'view_key' => 'brand_category_text',
'search_config' => [
'form_type' => 'select',
'form_name' => 'brand_category_id',
'where_type' => 'in',
'data' => $this->BrandCategoryList(),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
'form_type' => 'select',
'form_name' => 'id',
'where_type' => 'in',
'data' => $this->BrandCategoryList(),
'data_key' => 'id',
'data_name' => 'name',
'is_multiple' => 1,
'where_handle_custom' => 'WhereValueBrandCategory',
],
],
[
......@@ -155,8 +158,37 @@ class Brand
*/
public function BrandCategoryList()
{
$ret = BrandService::BrandCategoryList(['field'=>'id,name']);
$ret = BrandCategoryService::BrandCategoryList(['field'=>'id,name']);
return isset($ret['data']) ? $ret['data'] : [];
}
/**
* 品牌分类条件处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-06-03
* @desc description
* @param [array] $value [条件值]
* @param [array] $params [输入参数]
*/
public function WhereValueBrandCategory($value, $params = [])
{
if(!empty($value))
{
// 是否为数组
if(!is_array($value))
{
$value = [$value];
}
// 获取品牌 id
$ids = Db::name('BrandCategoryJoin')->where(['brand_category_id'=>$value])->column('brand_id');
// 避免空条件造成无效的错觉
return empty($ids) ? [0] : $ids;
}
return $value;
}
}
?>
\ No newline at end of file
......@@ -15,10 +15,9 @@
</div>
<div class="am-form-group">
<label>品牌分类</label>
<select name="brand_category_id" class="am-radius chosen-select" data-placeholder="可选择..." data-validation-message="请选择品牌分类" required>
<option value="">可选择...</option>
<select name="brand_category_id" class="am-radius chosen-select" multiple="multiple" minchecked="1" data-placeholder="可选择..." data-validation-message="请选择品牌分类" required>
{{foreach $brand_category as $v}}
<option value="{{$v.id}}" {{if isset($data['brand_category_id']) and $data['brand_category_id'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
<option value="{{$v.id}}" {{if isset($data['brand_category_ids']) and is_array($data['brand_category_ids']) and in_array($v['id'], $data['brand_category_ids'])}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
</select>
</div>
......
......@@ -96,13 +96,7 @@
{{if !empty($brand_list)}}
<option value="0">请选择...</option>
{{foreach $brand_list as $v}}
<optgroup label="{{$v.name}}">
{{if !empty($v['items'])}}
{{foreach $v.items as $vs}}
<option style="padding-left: 30px;" value="{{$vs.id}}" {{if isset($data['brand_id']) and $data['brand_id'] eq $vs['id']}}selected{{/if}}>{{$vs.name}}</option>
{{/foreach}}
{{/if}}
</optgroup>
<option value="{{$v.id}}" {{if isset($data['brand_id']) and $data['brand_id'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
......
......@@ -2,12 +2,7 @@
{{if !empty($module_data['data']) && !empty($module_data['form_name_key'])}}
<select class="am-radius chosen-select" multiple name="{{$module_data.form_name_key}}" data-placeholder="品牌...">
{{foreach $module_data.data as $v}}
<optgroup label="{{$v.name}}">
{{if !empty($v['items'])}}
{{foreach $v.items as $vs}}
<option style="padding-left: 15px;" value="{{$vs.id}}" {{if !empty($module_data['params']) and !empty($module_data['params'][$module_data['form_name_key']]) and is_array($module_data['params'][$module_data['form_name_key']]) and in_array($vs['id'], $module_data['params'][$module_data['form_name_key']])}}selected{{/if}}>{{$vs.name}}</option>
{{/foreach}}
{{/if}}
<option value="{{$v.id}}" {{if !empty($module_data['params']) and !empty($module_data['params'][$module_data['form_name_key']]) and is_array($module_data['params'][$module_data['form_name_key']]) and in_array($v['id'], $module_data['params'][$module_data['form_name_key']])}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
</select>
{{/if}}
\ No newline at end of file
......@@ -445,5 +445,56 @@ class Devtest extends Common
}
echo 'count:'.count($data).', success:'.$success.', fail:'.$fail;
}
/**
* 品牌分类数据处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-08-01
* @desc description
*/
public function BrandCategoryHandle()
{
if(input('pwd') != 'shopxo520')
{
die('非法访问');
}
// 状态
$success = 0;
$fail = 0;
// 获取品牌列表
$data = Db::name('Brand')->select();
if(!empty($data))
{
foreach($data as $v)
{
if(!empty($v['brand_category_id']))
{
if(Db::name('BrandCategoryJoin')->where(['brand_id'=>$v['id']])->count() <= 0)
{
// 删除数据
Db::name('BrandCategoryJoin')->where(['brand_id'=>$v['id']])->delete();
// 添加数据
$temp_data = [
'brand_id' => $v['id'],
'brand_category_id' => $v['brand_category_id'],
'add_time' => time(),
];
if(Db::name('BrandCategoryJoin')->insertGetId($temp_data) > 0)
{
$success++;
} else {
$fail++;
}
}
}
}
}
echo 'success:'.$success.', fail:'.$fail;
}
}
?>
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
use think\Db;
/**
* 品牌分类服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class BrandCategoryService
{
/**
* 品牌分类
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-08-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function BrandCategoryList($params = [])
{
$field = empty($params['field']) ? '*' : $params['field'];
$order_by = empty($params['order_by']) ? 'sort asc' : trim($params['order_by']);
$data = Db::name('BrandCategory')->where(['is_enable'=>1])->field($field)->order($order_by)->select();
return DataReturn('处理成功', 0, $data);
}
/**
* 获取品牌分类节点数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-16T23:54:46+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategoryNodeSon($params = [])
{
// 获取数据
$field = '*';
$data = Db::name('BrandCategory')->field($field)->order('sort asc')->select();
if(!empty($data))
{
foreach($data as &$v)
{
$v['is_son'] = 'no';
$v['ajax_url'] = MyUrl('admin/brandcategory/getnodeson', array('id'=>$v['id']));
$v['delete_url'] = MyUrl('admin/brandcategory/delete');
$v['json'] = json_encode($v);
}
return DataReturn('操作成功', 0, $data);
}
return DataReturn('没有相关数据', -100);
}
/**
* 品牌分类保存
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-17T01:04:03+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategorySave($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'error_msg' => '名称格式 2~16 个字符',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 数据
$data = [
'name' => $params['name'],
'sort' => isset($params['sort']) ? intval($params['sort']) : 0,
'is_enable' => isset($params['is_enable']) ? intval($params['is_enable']) : 0,
];
// 添加
if(empty($params['id']))
{
$data['add_time'] = time();
if(Db::name('BrandCategory')->insertGetId($data) > 0)
{
return DataReturn('添加成功', 0);
}
return DataReturn('添加失败', -100);
} else {
$data['upd_time'] = time();
if(Db::name('BrandCategory')->where(['id'=>intval($params['id'])])->update($data))
{
return DataReturn('编辑成功', 0);
}
return DataReturn('编辑失败', -100);
}
}
/**
* 品牌分类删除
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-17T02:40:29+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategoryDelete($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '删除数据id有误',
],
[
'checked_type' => 'empty',
'key_name' => 'admin',
'error_msg' => '用户信息有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 开始删除
if(Db::name('BrandCategory')->where(['id'=>intval($params['id'])])->delete())
{
return DataReturn('删除成功', 0);
}
return DataReturn('删除失败', -100);
}
}
?>
\ No newline at end of file
......@@ -63,9 +63,11 @@ class BrandService
}
// 分类名称
if(isset($v['brand_category_id']))
if(isset($v['id']))
{
$v['brand_category_name'] = isset($cnames[$v['brand_category_id']]) ? $cnames[$v['brand_category_id']] : '';
$v['brand_category_ids'] = Db::name('BrandCategoryJoin')->where(['brand_id'=>$v['id']])->column('brand_category_id');
$category_name = Db::name('BrandCategory')->where(['id'=>$v['brand_category_ids']])->column('name');
$v['brand_category_text'] = implode(',', $category_name);
}
// logo
......@@ -112,15 +114,7 @@ class BrandService
*/
public static function CategoryBrand($params = [])
{
$data = Db::name('BrandCategory')->where(['is_enable'=>1])->select();
if(!empty($data))
{
foreach($data as &$v)
{
$v['items'] = Db::name('Brand')->field('id,name')->where(['is_enable'=>1, 'brand_category_id'=>$v['id']])->order('sort asc')->select();
}
}
return $data;
return Db::name('Brand')->field('id,name')->where(['is_enable'=>1])->order('sort asc')->select();
}
/**
......@@ -183,25 +177,6 @@ class BrandService
return empty($brand_id) ? null : Db::name('Brand')->where(['id'=>intval($brand_id)])->value('name');
}
/**
* 品牌分类
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-08-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function BrandCategoryList($params = [])
{
$field = empty($params['field']) ? '*' : $params['field'];
$order_by = empty($params['order_by']) ? 'sort asc' : trim($params['order_by']);
$data = Db::name('BrandCategory')->where(['is_enable'=>1])->field($field)->order($order_by)->select();
return DataReturn('处理成功', 0, $data);
}
/**
* 保存
* @author Devil
......@@ -274,7 +249,6 @@ class BrandService
// 数据
$data = [
'name' => $params['name'],
'brand_category_id' => intval($params['brand_category_id']),
'logo' => $attachment['data']['logo'],
'website_url' => empty($params['website_url']) ? '' : $params['website_url'],
'sort' => intval($params['sort']),
......@@ -298,22 +272,70 @@ class BrandService
return $ret;
}
// 启动事务
Db::startTrans();
if(empty($params['id']))
{
$data['add_time'] = time();
if(Db::name('Brand')->insertGetId($data) > 0)
$brand_id = Db::name('Brand')->insertGetId($data);
if($brand_id <= 0)
{
return DataReturn('添加成功', 0);
Db::rollback();
return DataReturn('添加失败', -100);
}
return DataReturn('添加失败', -100);
} else {
$data['upd_time'] = time();
if(Db::name('Brand')->where(['id'=>intval($params['id'])])->update($data))
$brand_id = intval($params['id']);
if(Db::name('Brand')->where(['id'=>$brand_id])->update($data) === false)
{
return DataReturn('编辑成功', 0);
Db::rollback();
return DataReturn('编辑失败', -100);
}
return DataReturn('编辑失败', -100);
}
// 添加分类
$ret = self::BrandCategoryInsert(explode(',', $params['brand_category_id']), $brand_id);
if($ret['code'] != 0)
{
// 回滚事务
Db::rollback();
return $ret;
}
// 提交事务
Db::commit();
return DataReturn('操作成功', 0);
}
/**
* 品牌分类添加
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-08-01
* @desc description
* @param [array] $data [分类数据]
* @param [int] $brand_id [品牌id]
*/
private static function BrandCategoryInsert($data, $brand_id)
{
Db::name('BrandCategoryJoin')->where(['brand_id'=>$brand_id])->delete();
if(!empty($data))
{
foreach($data as $category_id)
{
$temp_category = [
'brand_id' => $brand_id,
'brand_category_id' => $category_id,
'add_time' => time(),
];
if(Db::name('BrandCategoryJoin')->insertGetId($temp_category) <= 0)
{
return DataReturn('品牌分类添加失败', -1);
}
}
}
return DataReturn('添加成功', 0);
}
/**
......@@ -389,124 +411,5 @@ class BrandService
}
return DataReturn('操作失败', -100);
}
/**
* 获取品牌分类节点数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-16T23:54:46+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategoryNodeSon($params = [])
{
// id
$id = isset($params['id']) ? intval($params['id']) : 0;
// 获取数据
$field = '*';
$data = Db::name('BrandCategory')->field($field)->where(['pid'=>$id])->order('sort asc')->select();
if(!empty($data))
{
foreach($data as &$v)
{
$v['is_son'] = (Db::name('BrandCategory')->where(['pid'=>$v['id']])->count() > 0) ? 'ok' : 'no';
$v['ajax_url'] = MyUrl('admin/brandcategory/getnodeson', array('id'=>$v['id']));
$v['delete_url'] = MyUrl('admin/brandcategory/delete');
$v['json'] = json_encode($v);
}
return DataReturn('操作成功', 0, $data);
}
return DataReturn('没有相关数据', -100);
}
/**
* 品牌分类保存
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-17T01:04:03+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategorySave($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'error_msg' => '名称格式 2~16 个字符',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 数据
$data = [
'name' => $params['name'],
'pid' => isset($params['pid']) ? intval($params['pid']) : 0,
'sort' => isset($params['sort']) ? intval($params['sort']) : 0,
'is_enable' => isset($params['is_enable']) ? intval($params['is_enable']) : 0,
];
// 添加
if(empty($params['id']))
{
$data['add_time'] = time();
if(Db::name('BrandCategory')->insertGetId($data) > 0)
{
return DataReturn('添加成功', 0);
}
return DataReturn('添加失败', -100);
} else {
$data['upd_time'] = time();
if(Db::name('BrandCategory')->where(['id'=>intval($params['id'])])->update($data))
{
return DataReturn('编辑成功', 0);
}
return DataReturn('编辑失败', -100);
}
}
/**
* 品牌分类删除
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-12-17T02:40:29+0800
* @param [array] $params [输入参数]
*/
public static function BrandCategoryDelete($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '删除数据id有误',
],
[
'checked_type' => 'empty',
'key_name' => 'admin',
'error_msg' => '用户信息有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 开始删除
if(Db::name('BrandCategory')->where(['id'=>intval($params['id'])])->delete())
{
return DataReturn('删除成功', 0);
}
return DataReturn('删除失败', -100);
}
}
?>
\ No newline at end of file
......@@ -35,6 +35,7 @@ return array (
'plugins_css' =>
array (
0 => 'app\\plugins\\freightfee\\Hook',
1 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_buy_group_goods_handle' =>
array (
......@@ -44,5 +45,49 @@ return array (
array (
0 => 'app\\plugins\\freightfee\\Hook',
),
'plugins_js' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_navigation_header_handle' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_users_center_left_menu_handle' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_header_navigation_top_right_handle' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_view_goods_detail_panel_bottom' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_view_buy_goods_bottom' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_buy_handle' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_view_buy_form_inside' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_buy_order_insert_success' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_order_status_change_history_success_handle' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
'plugins_service_user_register_end' =>
array (
0 => 'app\\plugins\\coupon\\Hook',
),
);
?>
\ No newline at end of file
......@@ -8,6 +8,8 @@
4. 商品管理去除库存的配置,移动到独立库存中管理
5. 新增仓库管理,仓库商品库存管理(多仓库、多库存)
6. 新增 Ipay88 支付方式
7. 订单新增批量合并支付
8. 支付日志、退款日志、用户消息优化
web端
1. 所有条件、数据列表、新增、编辑、删除 新增钩子(公共 form 表单封装)
......@@ -20,6 +22,9 @@ web端
8. 用户积分实时获取
9. 管理员新增状态
10. 后台左侧菜单优化,更简洁方便,小程序管理集合
11. 后台新增商品复制功能
12. 后台小程序配置集中管理
13. 品牌支持关联多个分类
小程序端
1. 支持商品自定义销售类型模式
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
/**
* 列表
* 上传文件
*/
.am-form-file input[type="file"] {
margin-top: 0;
width: 95px;
height: 28px;
margin-top: 10px;
}
\ No newline at end of file
......@@ -95,12 +95,15 @@
}
}
/**
* 安装
* 上传文件
*/
input[name="file"] { width: 105px !important; height: 32px; }
input.file-event { margin-top: 0 !important; }
.am-form-file input[type="file"] {
width: 92px;
height: 28px;
margin-top: 5px;
margin-left: 5px;
}
/**
* 删除modal
......
......@@ -210,7 +210,7 @@ iframe { border: 0; }
/**
* 公共图片上传
*/
.am-form-file input[type="file"] { width: 95px !important; height: 28px; margin-top: 10px !important; overflow:hidden; }
.am-form-file input[type="file"] { overflow:hidden; }
.am-form-file input.original-images-url { display: -webkit-inline-box !important; width: calc(100% - 110px) !important; background: #f5f5f5 !important; float: right; }
.am-form-file i.original-images-url-delete { position: absolute; right: 3px; margin-top: 5px; cursor: pointer; background: #f5f5f5; padding: 0px 10px; }
.am-form-file input.original-images-url-delete { padding-right: 35px !important; }
......
......@@ -935,7 +935,7 @@ button { outline: none !important; }
.common-cropper-popup .preview-sm { width:50px; height:50px; }
.common-cropper-popup .img-preview { margin-left:20px; border: 1px solid #eee; background-color: #f9f9f9; }
.common-cropper-popup .cropper-container, .cropper-input-images-submit { border-radius:2px; }
.common-cropper-popup .am-form-file input[type="file"] { margin-top: 0; }
.common-cropper-popup .am-form-file input[type="file"] { width: 105px; height: 32px; }
.common-cropper-popup .am-form-group { width: auto; }
.common-cropper-popup form.am-form .am-form-group-refreshing { padding: 0 !important; }
@media only screen and (max-width:641px){
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册