mirror of
https://github.com/crmeb/CRMEB.git
synced 2025-12-14 20:42:49 +00:00
修复产品管理分类报错,和产品列表样式美化
This commit is contained in:
parent
9c5b89eb68
commit
dbc47863ef
@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\store;
|
||||
|
||||
use app\admin\controller\AuthController;
|
||||
|
||||
@ -7,7 +7,6 @@
|
||||
|
||||
namespace app\admin\model\store;
|
||||
|
||||
|
||||
use traits\ModelTrait;
|
||||
use basic\ModelBasic;
|
||||
use service\UtilService;
|
||||
@ -20,16 +19,39 @@ class StoreCategory extends ModelBasic
|
||||
{
|
||||
use ModelTrait;
|
||||
|
||||
/*
|
||||
* 异步获取分类列表
|
||||
* @param $where
|
||||
* @return array
|
||||
*/
|
||||
public static function CategoryList($where){
|
||||
$data=($data=self::systemPage($where,true)->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() :[];
|
||||
foreach ($data as &$item){
|
||||
if($item['pid']){
|
||||
$item['pid_name'] = self::where('id',$item['pid'])->value('cate_name');
|
||||
}else{
|
||||
$item['pid_name'] = '顶级';
|
||||
}
|
||||
}
|
||||
$count=self::systemPage($where,true)->count();
|
||||
return compact('count','data');
|
||||
}
|
||||
/**
|
||||
* @param $where
|
||||
* @return array
|
||||
*/
|
||||
public static function systemPage($where){
|
||||
public static function systemPage($where,$isAjax=false){
|
||||
$model = new self;
|
||||
if($where['pid'] != '') $model = $model->where('pid',$where['pid']);
|
||||
else if($where['pid']=='' && $where['cate_name']=='') $model = $model->where('pid',0);
|
||||
if($where['is_show'] != '') $model = $model->where('is_show',$where['is_show']);
|
||||
if($where['cate_name'] != '') $model = $model->where('cate_name','LIKE',"%$where[cate_name]%");
|
||||
if($isAjax===true){
|
||||
if(isset($where['order']) && $where['order']!=''){
|
||||
$model=$model->order(self::setOrder($where['order']));
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
return self::page($model,function ($item){
|
||||
if($item['pid']){
|
||||
$item['pid_name'] = self::where('id',$item['pid'])->value('cate_name');
|
||||
|
||||
@ -1,133 +1,172 @@
|
||||
{extend name="public/container"}
|
||||
{block name="content"}
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="ibox">
|
||||
<div class="ibox-title">
|
||||
<a type="button" class="btn btn-w-m btn-primary" href="{:Url('index')}">分类首页</a>
|
||||
<button type="button" class="btn btn-w-m btn-primary" onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}')">添加分类</button>
|
||||
<div class="ibox-tools">
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-row layui-col-space15" id="app">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">搜索条件</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form layui-form-pane" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">所有分类</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="is_show">
|
||||
<option value="">是否显示</option>
|
||||
<option value="1">显示</option>
|
||||
<option value="0">不显示</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">所有分类</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="pid">
|
||||
<option value="">所有菜单</option>
|
||||
{volist name="cate" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.html}{$vo.cate_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">产品名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cate_name" class="layui-input" placeholder="请输入分类名称">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<div class="layui-input-inline">
|
||||
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit="search" lay-filter="search">
|
||||
<i class="layui-icon layui-icon-search"></i>搜索</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<div class="row">
|
||||
<div class="m-b m-l">
|
||||
<form action="" class="form-inline">
|
||||
<select name="is_show" aria-controls="editable" class="form-control input-sm">
|
||||
<option value="">是否显示</option>
|
||||
<option value="1" {eq name="where.is_show" value="1"}selected="selected"{/eq}>显示</option>
|
||||
<option value="0" {eq name="where.is_show" value="0"}selected="selected"{/eq}>不显示</option>
|
||||
</select>
|
||||
<select name="pid" aria-controls="editable" class="form-control input-sm">
|
||||
<option value="">所有菜单</option>
|
||||
{volist name="cate" id="vo"}
|
||||
<option value="{$vo.id}" {eq name="where.pid" value="$vo.id"}selected="selected"{/eq}>{$vo.html}{$vo.cate_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
<div class="input-group">
|
||||
<input type="text" name="cate_name" value="{$where.cate_name}" placeholder="请输入分类名称" class="input-sm form-control"> <span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-search" ></i> 搜索</button> </span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!--产品列表-->
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">分类列表</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="alert alert-info" role="alert">
|
||||
注:点击父级名称可查看子集分类,点击分页首页可返回顶级分类;分类名称和排序可进行快速编辑;
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
</div>
|
||||
|
||||
<div class="layui-btn-container">
|
||||
<a class="layui-btn layui-btn-sm" href="{:Url('index')}">分类首页</a>
|
||||
<button type="button" class="layui-btn layui-btn-sm" onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}')">添加分类</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="List" lay-filter="List"></table>
|
||||
<script type="text/html" id="pic">
|
||||
<img style="cursor: pointer" lay-event='open_image' src="{{d.pic}}">
|
||||
</script>
|
||||
<script type="text/html" id="is_show">
|
||||
<input type='checkbox' name='id' lay-skin='switch' value="{{d.id}}" lay-filter='is_show' lay-text='显|隐' {{ d.is_show == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="pid">
|
||||
<a href="{:Url('index')}?pid={{d.id}}">查看</a>
|
||||
</script>
|
||||
<script type="text/html" id="act">
|
||||
<button class="layui-btn layui-btn-xs" onclick="$eb.createModalFrame('编辑','{:Url('edit')}?id={{d.id}}')">
|
||||
<i class="fa fa-paste"></i> 编辑
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-xs" lay-event='delstor'>
|
||||
<i class="fa fa-warning"></i> 删除
|
||||
</button>
|
||||
</script>
|
||||
</div>
|
||||
<div class="table-responsive" style="overflow:visible">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
|
||||
<th class="text-center" style="width: 40px;">编号</th>
|
||||
<th class="text-center">父级</th>
|
||||
<th class="text-center">分类名称</th>
|
||||
<th class="text-center">分类图标</th>
|
||||
<th class="text-center">排序</th>
|
||||
<th class="text-center">是否显示</th>
|
||||
<th class="text-center" width="5%">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="">
|
||||
{volist name="list" id="vo"}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
{$vo.id}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
{$vo.pid_name}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<a href="{:Url('index',array('pid'=>$vo['id']))}"> {$vo.cate_name}</a>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<img src="{$vo.pic}" alt="{$vo.cate_name}" class="open_image" data-image="{$vo.pic}" style="width: 50px;height: 50px;cursor: pointer;">
|
||||
</td>
|
||||
<td class="text-center">
|
||||
{$vo.sort}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<i class="fa {eq name='vo.is_show' value='1'}fa-check text-navy{else/}fa-close text-danger{/eq}"></i>
|
||||
</td>
|
||||
|
||||
<td class="text-center">
|
||||
<div class="input-group-btn js-group-btn" style="min-width: 106px;">
|
||||
<div class="btn-group">
|
||||
<button data-toggle="dropdown" class="btn btn-warning btn-xs dropdown-toggle"
|
||||
aria-expanded="false">操作
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a href="javascript:void(0);"onclick="$eb.createModalFrame('编辑','{:Url('edit',array('id'=>$vo['id']))}')">
|
||||
<i class="fa fa-paste"></i> 编辑
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" class="delstor" data-url="{:Url('delete',array('id'=>$vo['id']))}">
|
||||
<i class="fa fa-warning"></i> 删除
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{include file="public/inner_page"}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{__ADMIN_PATH}js/layuiList.js"></script>
|
||||
{/block}
|
||||
{block name="script"}
|
||||
<script>
|
||||
$('.js-group-btn').on('click',function(){
|
||||
$('.js-group-btn').css({zIndex:1});
|
||||
$(this).css({zIndex:2});
|
||||
setTimeout(function () {
|
||||
$('.alert-info').hide();
|
||||
},3000);
|
||||
//实例化form
|
||||
layList.form.render();
|
||||
//加载列表
|
||||
layList.tableList('List',"{:Url('category_list',['pid'=>$pid])}",function (){
|
||||
return [
|
||||
{field: 'id', title: 'ID', sort: true,event:'id',width:'6%'},
|
||||
{field: 'pid_name', title: '父级'},
|
||||
{field: 'cate_name', title: '分类名称',edit:'cate_name'},
|
||||
{field: 'pid', title: '查看子分类',templet:'#pid'},
|
||||
{field: 'pic', title: '分类图标',templet:'#pic'},
|
||||
{field: 'sort', title: '排序',sort: true,event:'sort',edit:'sort',width:'8%'},
|
||||
{field: 'is_show', title: '状态',templet:'#is_show',width:'6%'},
|
||||
{field: 'right', title: '操作',align:'center',toolbar:'#act',width:'14%'},
|
||||
];
|
||||
});
|
||||
$('.delstor').on('click',function(){
|
||||
window.t = $(this);
|
||||
var _this = $(this),url =_this.data('url');
|
||||
$eb.$swal('delete',function(){
|
||||
$eb.axios.get(url).then(function(res){
|
||||
console.log(res);
|
||||
if(res.status == 200 && res.data.code == 200) {
|
||||
$eb.$swal('success',res.data.msg);
|
||||
_this.parents('tr').remove();
|
||||
}else
|
||||
return Promise.reject(res.data.msg || '删除失败')
|
||||
}).catch(function(err){
|
||||
$eb.$swal('error',err);
|
||||
//自定义方法
|
||||
var action= {
|
||||
set_category: function (field, id, value) {
|
||||
layList.baseGet(layList.Url({
|
||||
c: 'store.store_category',
|
||||
a: 'set_category',
|
||||
q: {field: field, id: id, value: value}
|
||||
}), function (res) {
|
||||
layList.msg(res.msg);
|
||||
});
|
||||
})
|
||||
},
|
||||
}
|
||||
//查询
|
||||
layList.search('search',function(where){
|
||||
layList.reload(where);
|
||||
});
|
||||
$(".open_image").on('click',function (e) {
|
||||
var image = $(this).data('image');
|
||||
$eb.openImage(image);
|
||||
layList.switch('is_show',function (odj,value) {
|
||||
if(odj.elem.checked==true){
|
||||
layList.baseGet(layList.Url({c:'store.store_category',a:'set_show',p:{is_show:1,id:value}}),function (res) {
|
||||
layList.msg(res.msg);
|
||||
});
|
||||
}else{
|
||||
layList.baseGet(layList.Url({c:'store.store_category',a:'set_show',p:{is_show:0,id:value}}),function (res) {
|
||||
layList.msg(res.msg);
|
||||
});
|
||||
}
|
||||
});
|
||||
//快速编辑
|
||||
layList.edit(function (obj) {
|
||||
var id=obj.data.id,value=obj.value;
|
||||
switch (obj.field) {
|
||||
case 'cate_name':
|
||||
action.set_category('cate_name',id,value);
|
||||
break;
|
||||
case 'sort':
|
||||
action.set_category('sort',id,value);
|
||||
break;
|
||||
}
|
||||
});
|
||||
//监听并执行排序
|
||||
layList.sort(['id','sort'],true);
|
||||
//点击事件绑定
|
||||
layList.tool(function (event,data,obj) {
|
||||
switch (event) {
|
||||
case 'delstor':
|
||||
var url=layList.U({c:'store.store_category',a:'delete',q:{id:data.id}});
|
||||
$eb.$swal('delete',function(){
|
||||
$eb.axios.get(url).then(function(res){
|
||||
if(res.status == 200 && res.data.code == 200) {
|
||||
$eb.$swal('success',res.data.msg);
|
||||
obj.del();
|
||||
}else
|
||||
return Promise.reject(res.data.msg || '删除失败')
|
||||
}).catch(function(err){
|
||||
$eb.$swal('error',err);
|
||||
});
|
||||
})
|
||||
break;
|
||||
case 'open_image':
|
||||
$eb.openImage(data.pic);
|
||||
break;
|
||||
}
|
||||
})
|
||||
</script>
|
||||
{/block}
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div class="layui-btn-container">
|
||||
{switch name='type'}
|
||||
{case value="1"}
|
||||
<button class="layui-btn layui-btn-sm" onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}',{h:760,w:1100})">添加产品</button>
|
||||
<button class="layui-btn layui-btn-sm" onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}',{h:700,w:1100})">添加产品</button>
|
||||
{/case}
|
||||
{case value="2"}
|
||||
<button class="layui-btn layui-btn-sm" data-type="show">批量上架</button>
|
||||
@ -175,15 +175,15 @@
|
||||
case 2:
|
||||
join=[
|
||||
{type:'checkbox'},
|
||||
{field: 'id', title: 'ID', sort: true,event:'id',width:'5%'},
|
||||
{field: 'image', title: '产品图片',templet:'#image'},
|
||||
{field: 'id', title: 'ID', sort: true,event:'id',width:'6%'},
|
||||
{field: 'image', title: '产品图片',templet:'#image',width:'10%'},
|
||||
{field: 'store_name', title: '产品名称',templet:'#store_name'},
|
||||
{field: 'price', title: '产品价格',edit:'price'},
|
||||
{field: 'ficti', title: '虚拟销量',edit:'ficti'},
|
||||
{field: 'stock', title: '库存',edit:'stock'},
|
||||
{field: 'sort', title: '排序',edit:'sort'},
|
||||
{field: 'sales', title: '销量',sort: true,event:'sales'},
|
||||
{field: 'status', title: '状态',templet:"#checkboxstatus"},
|
||||
{field: 'price', title: '价格',edit:'price',width:'8%'},
|
||||
{field: 'ficti', title: '虚拟销量',edit:'ficti',width:'8%'},
|
||||
{field: 'stock', title: '库存',edit:'stock',width:'6%'},
|
||||
{field: 'sort', title: '排序',edit:'sort',width:'6%'},
|
||||
{field: 'sales', title: '销量',sort: true,event:'sales',width:'6%'},
|
||||
{field: 'status', title: '状态',templet:"#checkboxstatus",width:'8%'},
|
||||
{field: 'right', title: '操作',align:'center',toolbar:'#act',width:'14%'},
|
||||
];
|
||||
break;
|
||||
|
||||
@ -27,25 +27,24 @@ class WechatService
|
||||
{
|
||||
private static $instance = null;
|
||||
|
||||
/**获取微信配置参数
|
||||
* @return array
|
||||
*/
|
||||
public static function options()
|
||||
{
|
||||
$wechat = SystemConfigService::more(['wechat_appid','wechat_appsecret','wechat_token']);
|
||||
$wechat = SystemConfigService::more(['wechat_appid','wechat_appsecret','wechat_token','wechat_encodingaeskey','wechat_encode']);
|
||||
$payment = SystemConfigService::more(['pay_weixin_mchid','pay_weixin_client_cert','pay_weixin_client_key','pay_weixin_key','pay_weixin_open']);
|
||||
$config = [
|
||||
'app_id'=>isset($wechat['wechat_appid']) ? trim($wechat['wechat_appid']):'',
|
||||
'secret'=>isset($wechat['wechat_appsecret']) ? trim($wechat['wechat_appsecret']):'',
|
||||
'token'=>isset($wechat['wechat_token']) ? trim($wechat['wechat_token']):'',
|
||||
'app_id'=>isset($wechat['wechat_appid']) ? $wechat['wechat_appid']:'',
|
||||
'secret'=>isset($wechat['wechat_appsecret']) ? $wechat['wechat_appsecret']:'',
|
||||
'token'=>isset($wechat['wechat_token']) ? $wechat['wechat_token']:'',
|
||||
'guzzle' => [
|
||||
'timeout' => 10.0, // 超时时间(秒)
|
||||
],
|
||||
];
|
||||
if((int)$wechat['wechat_encode']>0 && isset($wechat['wechat_encodingaeskey']) && !empty($wechat['wechat_encodingaeskey']))
|
||||
$config['aes_key'] = $wechat['wechat_encodingaeskey'];
|
||||
if(isset($payment['pay_weixin_open']) && $payment['pay_weixin_open'] == 1){
|
||||
$config['payment'] = [
|
||||
'merchant_id'=>trim($payment['pay_weixin_mchid']),
|
||||
'key'=>trim($payment['pay_weixin_key']),
|
||||
'merchant_id'=>$payment['pay_weixin_mchid'],
|
||||
'key'=>$payment['pay_weixin_key'],
|
||||
'cert_path'=>realpath('.'.$payment['pay_weixin_client_cert']),
|
||||
'key_path'=>realpath('.'.$payment['pay_weixin_client_key']),
|
||||
'notify_url'=>SystemConfigService::get('site_url').Url::build('wap/Wechat/notify')
|
||||
@ -62,9 +61,6 @@ class WechatService
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信接口
|
||||
*/
|
||||
public static function serve()
|
||||
{
|
||||
$wechat = self::application(true);
|
||||
@ -133,6 +129,7 @@ class WechatService
|
||||
$response = HookService::resultListen('wechat_message_other',$message,null,true,$behavior);
|
||||
break;
|
||||
}
|
||||
|
||||
return $response;
|
||||
});
|
||||
}
|
||||
@ -370,11 +367,6 @@ class WechatService
|
||||
return self::paymentService()->refund($orderNo,$refundNo,$totalFee,$refundFee,$opUserId,$type,$refundAccount,$refundReason);
|
||||
}
|
||||
|
||||
/**订单退款
|
||||
* @param $orderNo
|
||||
* @param array $opt
|
||||
* @return bool
|
||||
*/
|
||||
public static function payOrderRefund($orderNo, array $opt)
|
||||
{
|
||||
if(!isset($opt['pay_price'])) exception('缺少pay_price');
|
||||
@ -420,10 +412,6 @@ class WechatService
|
||||
return self::application()->js;
|
||||
}
|
||||
|
||||
/** jsSdk
|
||||
* @param string $url
|
||||
* @return array|string
|
||||
*/
|
||||
public static function jsSdk($url = '')
|
||||
{
|
||||
$apiList = ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone', 'startRecord', 'stopRecord', 'onVoiceRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'onVoicePlayEnd', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'translateVoice', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem', 'closeWindow', 'scanQRCode', 'chooseWXPay', 'openProductSpecificView', 'addCard', 'chooseCard', 'openCard'];
|
||||
|
||||
@ -66,7 +66,7 @@ Page({
|
||||
})
|
||||
setTimeout(function () {
|
||||
wx.navigateTo({ //跳转至指定页面并关闭其他打开的所有页面(这个最好用在返回至首页的的时候)
|
||||
url: '/pages/orders-con/orders-con?order_id=' + data.result.orderId
|
||||
url: '/pages/orders-con/orders-con?order_id=' + data.result.order_id
|
||||
})
|
||||
}, 1200)
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user