mirror of
https://gitee.com/zoujingli/ThinkAdmin.git
synced 2025-04-06 03:58:04 +08:00
修改商品分类
This commit is contained in:
parent
a85c63c7f9
commit
a76f0e779d
@ -5,6 +5,7 @@ namespace app\data\controller\shop;
|
||||
use app\data\model\ShopGoodsCate;
|
||||
use think\admin\Controller;
|
||||
use think\admin\extend\DataExtend;
|
||||
use think\admin\helper\QueryHelper;
|
||||
|
||||
/**
|
||||
* 商品分类管理
|
||||
@ -13,6 +14,12 @@ use think\admin\extend\DataExtend;
|
||||
*/
|
||||
class Cate extends Controller
|
||||
{
|
||||
/**
|
||||
* 最大级别
|
||||
* @var integer
|
||||
*/
|
||||
protected $maxLevel = 5;
|
||||
|
||||
/**
|
||||
* 商品分类管理
|
||||
* @auth true
|
||||
@ -23,9 +30,12 @@ class Cate extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->title = "商品分类管理";
|
||||
$query = ShopGoodsCate::mQuery()->like('name')->dateBetween('create_at');
|
||||
$query->equal('status')->where(['deleted' => 0])->order('sort desc,id desc')->page(false);
|
||||
ShopGoodsCate::mQuery()->layTable(function () {
|
||||
$this->title = "商品分类管理";
|
||||
}, function (QueryHelper $query) {
|
||||
$query->where(['deleted' => 0]);
|
||||
$query->like('name')->equal('status')->dateBetween('create_at');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -66,12 +76,9 @@ class Cate extends Controller
|
||||
{
|
||||
if ($this->request->isGet()) {
|
||||
$data['pid'] = intval($data['pid'] ?? input('pid', '0'));
|
||||
$cates = ShopGoodsCate::mk()->where(['deleted' => 0])->order('sort desc,id desc')->select()->toArray();
|
||||
$this->cates = DataExtend::arr2table(array_merge($cates, [['id' => '0', 'pid' => '-1', 'name' => '顶部分类']]));
|
||||
if (isset($data['id'])) foreach ($this->cates as $cate) if ($cate['id'] === $data['id']) $data = $cate;
|
||||
foreach ($this->cates as $key => $cate) if ((isset($data['spt']) && $data['spt'] <= $cate['spt'])) {
|
||||
unset($this->cates[$key]);
|
||||
}
|
||||
$this->cates = ShopGoodsCate::getParentData($this->maxLevel, $data, [
|
||||
'id' => '0', 'pid' => '-1', 'name' => '顶部分类',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace app\data\model;
|
||||
|
||||
use think\admin\extend\DataExtend;
|
||||
use think\admin\Model;
|
||||
|
||||
/**
|
||||
@ -11,5 +12,54 @@ use think\admin\Model;
|
||||
*/
|
||||
class ShopGoodsCate extends Model
|
||||
{
|
||||
/**
|
||||
* 获取上级可用选项
|
||||
* @param int $max 最大级别
|
||||
* @param array $data 表单数据
|
||||
* @param array $parent 上级分类
|
||||
* @return array
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public static function getParentData(int $max, array &$data, array $parent = []): array
|
||||
{
|
||||
$items = static::mk()->order('sort desc,id asc')->select()->toArray();
|
||||
$cates = DataExtend::arr2table(empty($parent) ? $items : array_merge([$parent], $items));
|
||||
if (isset($data['id'])) foreach ($cates as $cate) if ($cate['id'] === $data['id']) $data = $cate;
|
||||
foreach ($cates as $key => $cate) {
|
||||
$isSelf = isset($data['spt']) && isset($data['spc']) && $data['spt'] <= $cate['spt'] && $data['spc'] > 0;
|
||||
if ($cate['spt'] >= $max || $isSelf) unset($cates[$key]);
|
||||
}
|
||||
return $cates;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取列表数据
|
||||
* @param bool $simple 仅子级别
|
||||
* @return array
|
||||
*/
|
||||
public static function getLevelData(bool $simple = false): array
|
||||
{
|
||||
$query = static::mk()->where(['status' => 1])->order('sort desc,id asc');
|
||||
$cates = array_column(DataExtend::arr2table($query->column('id,pid,name', 'id')), null, 'id');
|
||||
foreach ($cates as $cate) isset($cates[$cate['pid']]) && $cates[$cate['id']]['parent'] =& $cates[$cate['pid']];
|
||||
foreach ($cates as $key => $cate) {
|
||||
$id = $cate['id'];
|
||||
$cates[$id]['ids'][] = $cate['id'];
|
||||
$cates[$id]['names'][] = $cate['name'];
|
||||
while (isset($cate['parent']) && ($cate = $cate['parent'])) {
|
||||
$cates[$id]['ids'][] = $cate['id'];
|
||||
$cates[$id]['names'][] = $cate['name'];
|
||||
}
|
||||
$cates[$id]['ids'] = array_reverse($cates[$id]['ids']);
|
||||
$cates[$id]['names'] = array_reverse($cates[$id]['names']);
|
||||
if (isset($pky) && $simple && in_array($cates[$pky]['name'], $cates[$id]['names'])) {
|
||||
unset($cates[$pky]);
|
||||
}
|
||||
$pky = $key;
|
||||
}
|
||||
foreach ($cates as &$cate) unset($cate['parent']);
|
||||
return array_values($cates);
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
<form action="{:sysuri()}" autocomplete="off" class="layui-form layui-card" data-auto="true" method="post">
|
||||
<form action="{:sysuri()}" data-table-id="FormTable" class="layui-form layui-card" data-auto="true" method="post">
|
||||
<div class="layui-card-body padding-left-40">
|
||||
<label class="layui-form-item relative block">
|
||||
<span class="color-green font-w7 label-required-prev">绑定上级分类</span>
|
||||
<span class="color-desc margin-left-5">Category Parent</span>
|
||||
<select class='layui-select' lay-search name='pid'>
|
||||
|
||||
<div class="layui-form-item label-required-prev">
|
||||
<span class="help-label"><b>绑定上级分类</b>Category Parent</span>
|
||||
<select class='layui-select' name='pid' lay-search>
|
||||
{foreach $cates as $cate}
|
||||
{eq name='cate.id' value='$vo.pid|default=0'}
|
||||
<option selected value='{$cate.id}'>{$cate.spl|raw}{$cate.name}</option>
|
||||
@ -12,32 +12,36 @@
|
||||
{/eq}{/foreach}
|
||||
</select>
|
||||
<span class="help-block"><b>必选,</b>请选择上级分类或顶级分类(目前最多支持{$cateLevel|default=0}级分类)</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<label class="layui-form-item relative block">
|
||||
<span class="color-green font-w7">商品分类名称</span>
|
||||
<span class="color-desc margin-left-5">Category Name</span>
|
||||
<span class="help-label"><b>产品分类名称</b>Category Name</span>
|
||||
<input class="layui-input" name="name" placeholder="请输入分类名称" required value='{$vo.name|default=""}'>
|
||||
<span class="help-block"><b>必填,</b>请填写商品分类名称,建议字符不要太长,一般4-6个汉字(如:系统管理)</span>
|
||||
<span class="help-block"><b>必填,</b>请填写产品分类名称,建议字符不要太长,一般 4-6 个汉字</span>
|
||||
</label>
|
||||
|
||||
<div class="layui-form-item relative block">
|
||||
<span class="color-green font-w7">商品分类图标</span>
|
||||
<span class="color-desc margin-left-5">Category Icon</span>
|
||||
<span class="help-label"><b>产品分类图标</b>Category Cover</span>
|
||||
<label class="relative block">
|
||||
<input class="layui-input" name="cover" placeholder="请上传商品分类图标 " value='{$vo.cover|default=""}'>
|
||||
<input class="layui-input think-bg-gray" readonly name="cover" placeholder="请上传产品分类图标" value='{$vo.cover|default=""}'>
|
||||
<a class="input-right-icon layui-icon layui-icon-upload" data-field="cover" data-file data-type="png,jpg,gif"></a>
|
||||
</label>
|
||||
<span class="help-block"><b>可选,</b>请上传商品分类图标,需要是 http 可访问的图片资源链接</span>
|
||||
<span class="help-block"><b>可选,</b>请上传产品分类图标,需要是 http 可访问的图片资源链接</span>
|
||||
</div>
|
||||
|
||||
<label class="layui-form-item relative block">
|
||||
<span class="color-green font-w7">商品分类描述</span>
|
||||
<span class="color-green font-w7">产品分类描述</span>
|
||||
<span class="color-desc margin-left-5">Category Remark</span>
|
||||
<textarea class="layui-textarea" name="remark" placeholder="请输入分类描述">{$vo.remark|default=''}</textarea>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="hr-line-dashed"></div>
|
||||
{notempty name='vo.id'}<input name='id' type='hidden' value='{$vo.id}'>{/notempty}
|
||||
|
||||
<div class="layui-form-item text-center">
|
||||
<button class="layui-btn" type='submit'>保存数据</button>
|
||||
<button class="layui-btn layui-btn-danger" data-close data-confirm="确定要取消编辑吗?" type='button'>取消编辑</button>
|
||||
<button class="layui-btn layui-btn-danger" data-close type='button' data-confirm="确定要取消编辑吗?">取消编辑</button>
|
||||
</div>
|
||||
|
||||
</form>
|
@ -1,4 +1,4 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
{extend name="../../admin/view/table"}
|
||||
|
||||
{block name="button"}
|
||||
<!--{if auth("add")}-->
|
||||
@ -6,68 +6,86 @@
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if auth("remove")}-->
|
||||
<button class='layui-btn layui-btn-sm layui-btn-primary' data-action='{:url("remove")}' data-rule="id#{key}">删除分类</button>
|
||||
<button class='layui-btn layui-btn-sm layui-btn-primary' data-action='{:url("remove")}' data-rule="id#{sps}">删除分类</button>
|
||||
<!--{/if}-->
|
||||
{/block}
|
||||
|
||||
{block name="content"}
|
||||
<div class="think-box-shadow">
|
||||
{notempty name='list'}
|
||||
<table class="layui-table" lay-skin="line">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='list-table-check-td think-checkbox'>
|
||||
<label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
|
||||
</th>
|
||||
<th class='list-table-sort-td'>
|
||||
<button class="layui-btn layui-btn-xs" data-reload type="button">刷 新</button>
|
||||
</th>
|
||||
<th class='text-center'></th>
|
||||
<th colspan="3"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach $list as $key=>$vo}
|
||||
<tr>
|
||||
<td class='list-table-check-td think-checkbox'>
|
||||
<label><input class="list-check-box" type='checkbox' value='{$vo.sps}'></label>
|
||||
</td>
|
||||
<td class='list-table-sort-td'>
|
||||
<label><input class="list-sort-input" data-action-blur="{:sysuri()}" data-loading="false" data-value="id#{$vo.id};action#sort;sort#{value}" value="{$vo.sort}"></label>
|
||||
</td>
|
||||
<td class="nowrap"><span class="color-desc notselect">{$vo.spl|raw}</span>{$vo.name}</td>
|
||||
<td class="color-desc">{$vo.remark|default=''}</td>
|
||||
<td class='text-center nowrap'>{eq name='vo.status' value='0'}<span class="color-red">已禁用</span>{else}<span class="color-green">已激活</span>{/eq}</td>
|
||||
<td class='text-center nowrap notselect'>
|
||||
|
||||
<!--{if auth("add")}-->
|
||||
<a class="layui-btn layui-btn-xs layui-btn-primary" data-modal='{:url("add")}?pid={$vo.id}' data-title="添加子分类">添 加</a>
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if auth("edit")}-->
|
||||
<a class="layui-btn layui-btn-xs" data-dbclick data-modal='{:url("edit")}?id={$vo.id}' data-title="编辑分类">编 辑</a>
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if $vo.status eq 0 and auth("state")}-->
|
||||
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-csrf="{:systoken('state')}" data-value="id#{$vo.sps};status#1">激 活</a>
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if $vo.status eq 1 and auth("state")}-->
|
||||
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-csrf="{:systoken('state')}" data-value="id#{$vo.sps};status#0">禁 用</a>
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if auth("remove")}-->
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" data-action="{:url('remove')}" data-confirm="确定要删除数据吗?" data-csrf="{:systoken('remove')}" data-value="id#{$vo.sps}">删 除</a>
|
||||
<!--{/if}-->
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
{$pagehtml|raw|default=''}
|
||||
{else}
|
||||
<span class="notdata">没有记录哦</span>
|
||||
{/notempty}
|
||||
<div class="think-box-notify">
|
||||
<b>注意:</b>产品分类需要在上传产品前添加,当产品分类关联有产品时不建议进行 <b class="color-blue">移动</b> 或 <b class="color-blue">删除</b> 操作!
|
||||
</div>
|
||||
|
||||
<div class="think-box-shadow">
|
||||
<table id="FormTable" data-url="{:sysuri()}" data-target-search="form.form-search"></table>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
$('#FormTable').layTable({
|
||||
even: true, height: 'full', page: false,
|
||||
sort: {field: 'sort desc,id', type: 'asc'},
|
||||
where: {type: '{$type|default="index"}'},
|
||||
cols: [[
|
||||
{checkbox: true, field: 'sps'},
|
||||
{field: 'sort', title: '排序权重', width: 100, align: 'center', sort: true, templet: '#SortInputTpl'},
|
||||
{
|
||||
field: 'name', title: '分类名称', minWidth: 220, templet: function (d) {
|
||||
return layui.laytpl('<span class="color-desc">{{d.spl}}</span>{{d.name}}').render(d);
|
||||
}
|
||||
},
|
||||
{field: 'status', title: '分类状态', minWidth: 120, align: 'center', templet: '#StatusSwitchTpl'},
|
||||
{field: 'create_at', title: '创建时间', minWidth: 170, align: 'center'},
|
||||
{toolbar: '#toolbar', title: '操作面板', minWidth: 200, align: 'center', fixed: 'right'},
|
||||
]]
|
||||
});
|
||||
|
||||
// 数据状态切换操作
|
||||
layui.form.on('switch(StatusSwitch)', function (object) {
|
||||
object.data = {status: object.elem.checked > 0 ? 1 : 0};
|
||||
object.data.id = object.value.split('|')[object.data.status] || object.value;
|
||||
$.form.load("{:url('state')}", object.data, 'post', function (ret) {
|
||||
if (ret.code < 1) $.msg.error(ret.info, 3, function () {
|
||||
$('#FormTable').trigger('reload');
|
||||
}); else {
|
||||
$('#FormTable').trigger('reload');
|
||||
}
|
||||
return false;
|
||||
}, false);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- 数据状态切换模板 -->
|
||||
<script type="text/html" id="StatusSwitchTpl">
|
||||
<!--{if auth("state")}-->
|
||||
<input type="checkbox" value="{{d.sps}}|{{d.spp}}" lay-text="已激活|已禁用" lay-filter="StatusSwitch" lay-skin="switch" {{d.status>0?'checked':''}}>
|
||||
<!--{else}-->
|
||||
{{d.status ? '<b class="color-green">已激活</b>' : '<b class="color-red">已禁用</b>'}}
|
||||
<!--{/if}-->
|
||||
</script>
|
||||
|
||||
<!-- 列表排序权重模板 -->
|
||||
<script type="text/html" id="SortInputTpl">
|
||||
<input type="number" min="0" data-blur-number="0" data-action-blur="{:sysuri()}" data-value="id#{{d.id}};action#sort;sort#{value}" data-loading="false" value="{{d.sort}}" class="layui-input text-center">
|
||||
</script>
|
||||
|
||||
<!-- 操控面板的模板 -->
|
||||
<script type="text/html" id="toolbar">
|
||||
|
||||
<!--{if auth('add')}-->
|
||||
{{# if(d.spt<'{$maxLevel-1}'){ }}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" data-title="添加产品分类" data-modal='{:url("add")}?pid={{d.id}}'>添 加</a>
|
||||
{{# }else{ }}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-disabled">添 加</a>
|
||||
{{# } }}
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if auth('edit')}-->
|
||||
<a class="layui-btn layui-btn-sm" data-title="编辑产品分类" data-modal='{:url("edit")}?id={{d.id}}'>编 辑</a>
|
||||
<!--{/if}-->
|
||||
|
||||
<!--{if auth('remove')}-->
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除此分类吗?" data-action="{:url('remove')}" data-value="id#{{d.sps}}">删 除</a>
|
||||
<!--{/if}-->
|
||||
</script>
|
||||
{/block}
|
||||
|
Loading…
x
Reference in New Issue
Block a user