初始上传
125
addon/supermember/api/controller/Membercard.php
Executable file
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
/**
|
||||
* Index.php
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2015-2025 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
* @author : niuteam
|
||||
* @date : 2022.8.8
|
||||
* @version : v5.0.0.1
|
||||
*/
|
||||
|
||||
namespace addon\supermember\api\controller;
|
||||
|
||||
use addon\supermember\model\Config;
|
||||
use app\api\controller\BaseApi;
|
||||
use app\model\goods\Goods;
|
||||
use app\model\member\MemberLevel;
|
||||
use addon\supermember\model\MemberCard as MemberCardModel;
|
||||
|
||||
|
||||
/**
|
||||
* 会员卡
|
||||
* @package app\api\controller
|
||||
*/
|
||||
class Membercard extends BaseApi
|
||||
{
|
||||
/**
|
||||
* 列表信息
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
$member_level_model = new MemberLevel();
|
||||
|
||||
$condition = [
|
||||
[ 'site_id', '=', $this->site_id ],
|
||||
[ 'level_type', '=', 1 ],
|
||||
[ 'status', '=', 1 ]
|
||||
];
|
||||
$field = 'level_id,level_name,remark,consume_discount,is_free_shipping,point_feedback,send_point,send_balance,send_coupon,charge_rule,charge_type,bg_color,level_text_color,level_picture';
|
||||
$member_level_list = $member_level_model->getMemberLevelList($condition, $field, 'is_recommend desc,level_id desc');
|
||||
return $this->response($member_level_list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员卡信息
|
||||
*/
|
||||
public function info()
|
||||
{
|
||||
$level_id = $this->params[ 'level_id' ] ?? 0;
|
||||
|
||||
$member_level_model = new MemberLevel();
|
||||
$condition = [
|
||||
[ 'site_id', '=', $this->site_id ],
|
||||
[ 'level_type', '=', 1 ],
|
||||
[ 'level_id', '=', $level_id ]
|
||||
];
|
||||
$field = 'level_id,level_name,consume_discount,is_free_shipping,point_feedback,send_point,send_balance,send_coupon';
|
||||
$data = $member_level_model->getMemberLevelInfo($condition, $field);
|
||||
|
||||
return $this->response($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询推荐卡
|
||||
* @param int $id
|
||||
* @return false|string
|
||||
*/
|
||||
public function recommendCard($id = 0)
|
||||
{
|
||||
$sku_id = $this->params[ 'sku_id' ] ?? 0;
|
||||
if (!empty($id)) {
|
||||
$sku_id = $id;
|
||||
}
|
||||
|
||||
$card_model = new MemberCardModel();
|
||||
$data = $card_model->getRecommendMemberCard($this->site_id);
|
||||
|
||||
if (!empty($data[ 'data' ]) && !empty($sku_id)) {
|
||||
$goods_model = new Goods();
|
||||
$price_data = $goods_model->getMemberCardGoodsPrice($sku_id, $data[ 'data' ][ 'level_id' ]);
|
||||
$data[ 'data' ][ 'member_price' ] = $price_data[ 'data' ][ 'price' ];
|
||||
}
|
||||
|
||||
return $this->response($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取推荐会员卡
|
||||
* @return false|string
|
||||
*/
|
||||
public function firstCard()
|
||||
{
|
||||
$sku_id = $this->params[ 'sku_id' ] ?? 0;
|
||||
|
||||
$member_level_model = new MemberLevel();
|
||||
$condition = [
|
||||
[ 'site_id', '=', $this->site_id ],
|
||||
[ 'level_type', '=', 1 ],
|
||||
[ 'status', '=', 1 ],
|
||||
[ 'is_recommend', '=', 1 ]
|
||||
];
|
||||
$field = 'level_id,level_name,consume_discount,is_free_shipping,point_feedback,send_point,send_balance,send_coupon';
|
||||
$data = $member_level_model->getMemberLevelInfo($condition, $field);
|
||||
|
||||
if (empty($data[ 'data' ])) {
|
||||
unset($condition[ 3 ]);
|
||||
$data = $member_level_model->getFirstMemberLevel($condition, $field, 'consume_discount asc');
|
||||
}
|
||||
|
||||
return $this->response($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开卡协议
|
||||
*/
|
||||
public function agreement()
|
||||
{
|
||||
$config = new Config();
|
||||
$data = $config->getMemberCardDocument($this->site_id);
|
||||
return $this->response($data);
|
||||
}
|
||||
}
|
||||
48
addon/supermember/api/controller/Ordercreate.php
Executable file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* Index.php
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2015-2025 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
* @author : niuteam
|
||||
* @date : 2022.8.8
|
||||
* @version : v5.0.0.1
|
||||
*/
|
||||
|
||||
namespace addon\supermember\api\controller;
|
||||
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
use app\api\controller\BaseApi;
|
||||
|
||||
|
||||
/**
|
||||
* 会员卡订单
|
||||
* @package app\api\controller
|
||||
*/
|
||||
class Ordercreate extends BaseApi
|
||||
{
|
||||
/**
|
||||
* 订单创建
|
||||
* @return false|string
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$token = $this->checkToken();
|
||||
if ($token[ 'code' ] < 0) return $this->response($token);
|
||||
|
||||
$data = [
|
||||
'level_id' => $this->params[ 'level_id' ],
|
||||
'period_unit' => $this->params[ 'period_unit' ],
|
||||
'member_id' => $this->member_id,
|
||||
'site_id' => $this->site_id
|
||||
];
|
||||
|
||||
$order = new MemberLevelOrder();
|
||||
$res = $order->create($data);
|
||||
|
||||
return $this->response($res);
|
||||
}
|
||||
}
|
||||
38
addon/supermember/config/diy_view.php
Executable file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
return [
|
||||
|
||||
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据,json格式' ]
|
||||
'template' => [],
|
||||
|
||||
// 后台自定义组件——装修
|
||||
'util' => [],
|
||||
|
||||
// 自定义页面路径
|
||||
'link' => [],
|
||||
|
||||
// 自定义图标库
|
||||
'icon_library' => [],
|
||||
|
||||
// uni-app 组件,格式:[ 'name' => '组件名称/文件夹名称', 'path' => '文件路径/目录路径' ],多个逗号隔开,自定义组件名称前缀必须是diy-,也可以引用第三方组件
|
||||
'component' => [],
|
||||
|
||||
// uni-app 页面,多个逗号隔开
|
||||
'pages' => [],
|
||||
|
||||
// 模板信息,格式:'title' => '模板名称', 'name' => '模板标识', 'cover' => '模板封面图', 'preview' => '模板预览图', 'desc' => '模板描述'
|
||||
'info' => [],
|
||||
|
||||
// 主题风格配色,格式可以自由定义扩展,【在uni-app中通过:this.themeStyle... 获取定义的颜色字段,例如:this.themeStyle.main_color】
|
||||
'theme' => [],
|
||||
|
||||
// 自定义页面数据,格式:[ 'title' => '页面名称', 'name' => "页面标识", 'value' => [页面数据,json格式] ]
|
||||
'data' => []
|
||||
];
|
||||
47
addon/supermember/config/event.php
Executable file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
// 事件定义文件
|
||||
return [
|
||||
'bind' => [
|
||||
|
||||
],
|
||||
|
||||
'listen' => [
|
||||
//展示活动
|
||||
'ShowPromotion' => [
|
||||
'addon\supermember\event\ShowPromotion',
|
||||
],
|
||||
// 会员卡订单支付异步回调
|
||||
'MemberLevelOrderPayNotify' => [
|
||||
'addon\supermember\event\MemberLevelOrderPayNotify'
|
||||
],
|
||||
// 订单支付
|
||||
"OrderPay" => [
|
||||
'addon\supermember\event\MemberLevelOrderPayNotify'
|
||||
],
|
||||
// 会员卡订单定时关闭
|
||||
'MemberLevelOrderClose' => [
|
||||
'addon\supermember\event\MemberLevelOrderClose'
|
||||
],
|
||||
// 会员卡自动过期
|
||||
'MemberLevelAutoExpire' => [
|
||||
'addon\supermember\event\MemberLevelAutoExpire'
|
||||
],
|
||||
'CouponGetType' => [
|
||||
'addon\supermember\event\CouponGetType'
|
||||
],
|
||||
'IncomeStatistics' => [
|
||||
'addon\supermember\event\IncomeStatistics'
|
||||
],
|
||||
//统计写入
|
||||
'AddStat' => [
|
||||
'addon\supermember\event\AddStat',
|
||||
],
|
||||
//通过支付信息获取手机端订单详情路径
|
||||
'WapOrderDetailPathByPayInfo' => [
|
||||
'addon\supermember\event\WapOrderDetailPathByPayInfo',
|
||||
],
|
||||
],
|
||||
|
||||
'subscribe' => [
|
||||
],
|
||||
];
|
||||
21
addon/supermember/config/info.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
return [
|
||||
'name' => 'supermember',
|
||||
'title' => '超级会员卡',
|
||||
'description' => '超级会员卡,增加用户粘性',
|
||||
'type' => 'tool', //插件类型 system :系统插件(自动安装), business:业务插件 promotion:扩展营销插件 tool:工具插件
|
||||
'status' => 1,
|
||||
'author' => '',
|
||||
'version' => '5.5.3',
|
||||
'version_no' => '553250709001',
|
||||
'content' => '',
|
||||
];
|
||||
86
addon/supermember/config/menu_shop.php
Executable file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | 平台端菜单设置
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_LIST',
|
||||
'title' => '超级会员卡',
|
||||
'parent' => 'MEMBER_LEVEL_ROOT',
|
||||
'url' => 'supermember://shop/membercard/lists',
|
||||
'is_show' => 1,
|
||||
'sort' => 2,
|
||||
'child_list' => [
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_ADD',
|
||||
'title' => '会员卡添加',
|
||||
'url' => 'supermember://shop/membercard/add',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_EDIT',
|
||||
'title' => '会员卡编辑',
|
||||
'url' => 'supermember://shop/membercard/edit',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_DELETE',
|
||||
'title' => '会员卡删除',
|
||||
'url' => 'supermember://shop/membercard/delete',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_STATUS',
|
||||
'title' => '会员卡状态变更',
|
||||
'url' => 'supermember://shop/membercard/status',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_RECOMMEND',
|
||||
'title' => '会员卡推荐',
|
||||
'url' => 'supermember://shop/membercard/recommend',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_AGREEMENT',
|
||||
'title' => '开卡协议',
|
||||
'url' => 'supermember://shop/membercard/agreement',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
],
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_INDEX',
|
||||
'title' => '会员卡数据',
|
||||
'parent' => 'STAT_SHOP',
|
||||
'url' => 'supermember://shop/membercard/index',
|
||||
'picture' => 'addon/supermember/shop/view/public/img/member_card_new.png',
|
||||
'picture_selected' => 'addon/supermember/shop/view/public/img/member_card_select.png',
|
||||
'is_show' => 1,
|
||||
],
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_ORDER',
|
||||
'title' => '会员卡订单',
|
||||
'parent' => 'ORDER_MANAGE',
|
||||
'url' => 'supermember://shop/membercard/order',
|
||||
'picture' => 'app/shop/view/public/img/icon_new/member_card_order.png',
|
||||
'picture_selected' => 'app/shop/view/public/img/icon_new/member_card_order_selected.png',
|
||||
'is_show' => 1,
|
||||
'sort' => 3,
|
||||
'child_list' => [
|
||||
[
|
||||
'name' => 'SUPER_MEMBER_ORDER_DETAIL',
|
||||
'title' => '订单详情',
|
||||
'url' => 'supermember://shop/membercard/orderdetail',
|
||||
'is_show' => 0,
|
||||
'type' => 'button',
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
1
addon/supermember/data/install.sql
Executable file
@@ -0,0 +1 @@
|
||||
SET NAMES 'utf8';
|
||||
1
addon/supermember/data/uninstall.sql
Executable file
@@ -0,0 +1 @@
|
||||
SET NAMES 'utf8';
|
||||
35
addon/supermember/event/AddStat.php
Executable file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
|
||||
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use addon\supermember\model\MemberLevelStat;
|
||||
|
||||
/**
|
||||
* 礼品卡统计
|
||||
*/
|
||||
class AddStat
|
||||
{
|
||||
|
||||
public function handle($params)
|
||||
{
|
||||
$type = $params['type'];
|
||||
if($type == 'member_level_order'){
|
||||
$member_level_stat_model = new MemberLevelStat();
|
||||
$res = $member_level_stat_model->addMemberLevelStat($params['data']);
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
26
addon/supermember/event/CouponGetType.php
Executable file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
/**
|
||||
* 优惠券来源类型
|
||||
*/
|
||||
class CouponGetType
|
||||
{
|
||||
/**
|
||||
* 执行安装
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
return [ 5 => '会员卡开卡奖励'];
|
||||
}
|
||||
}
|
||||
33
addon/supermember/event/IncomeStatistics.php
Executable file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
|
||||
/**
|
||||
* 资金收入统计
|
||||
*/
|
||||
class IncomeStatistics
|
||||
{
|
||||
public function handle($param)
|
||||
{
|
||||
$money = (new MemberLevelOrder())->getOrderSum([ ['site_id', '=', $param['site_id'] ], ['pay_type', '<>', 'BALANCE'], ['pay_time', 'between', [$param['start_time'], $param['end_time']] ] ], 'order_money')['data'];
|
||||
return [
|
||||
[
|
||||
'title' => '会员开卡',
|
||||
'value' => $money,
|
||||
'desc' => '统计时间内,所有会员开卡支付金额之和',
|
||||
'url' => 'supermember://shop/membercard/order'
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
26
addon/supermember/event/Install.php
Executable file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
/**
|
||||
* 应用安装
|
||||
*/
|
||||
class Install
|
||||
{
|
||||
/**
|
||||
* 执行安装
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
return success();
|
||||
}
|
||||
}
|
||||
29
addon/supermember/event/MemberLevelAutoExpire.php
Executable file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use app\model\member\MemberLevel;
|
||||
|
||||
/**
|
||||
* 会员卡过期
|
||||
*/
|
||||
class MemberLevelAutoExpire
|
||||
{
|
||||
|
||||
public function handle($param)
|
||||
{
|
||||
$order = new MemberLevel();
|
||||
$res = $order->memberLevelExpire($param['relate_id']);
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
30
addon/supermember/event/MemberLevelOrderClose.php
Executable file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
|
||||
|
||||
/**
|
||||
* 关闭会员卡订单
|
||||
*/
|
||||
class MemberLevelOrderClose
|
||||
{
|
||||
|
||||
public function handle($param)
|
||||
{
|
||||
$order = new MemberLevelOrder();
|
||||
$res = $order->closeLevelOrder($param['relate_id']);
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
29
addon/supermember/event/MemberLevelOrderPayNotify.php
Executable file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
|
||||
/**
|
||||
* 会员卡订单回调
|
||||
*/
|
||||
class MemberLevelOrderPayNotify
|
||||
{
|
||||
|
||||
public function handle($data)
|
||||
{
|
||||
$model = new MemberLevelOrder();
|
||||
$res = $model->orderPay($data);
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
47
addon/supermember/event/ShowPromotion.php
Executable file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
/**
|
||||
* 活动展示
|
||||
*/
|
||||
class ShowPromotion
|
||||
{
|
||||
|
||||
/**
|
||||
* 活动展示
|
||||
* @return array
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$data = [
|
||||
'shop' => [
|
||||
[
|
||||
//插件名称
|
||||
'name' => 'supermember',
|
||||
//展示分类(根据平台端设置,admin(平台营销),shop:店铺营销,member:会员营销, tool:应用工具)
|
||||
'show_type' => 'member',
|
||||
//展示主题
|
||||
'title' => '超级会员卡',
|
||||
//展示介绍
|
||||
'description' => '提供更丰富的会员权益',
|
||||
//展示图标
|
||||
'icon' => 'addon/supermember/icon.png',
|
||||
//跳转链接
|
||||
'url' => 'supermember://shop/membercard/lists',
|
||||
]
|
||||
]
|
||||
|
||||
];
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
26
addon/supermember/event/UnInstall.php
Executable file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
/**
|
||||
* 应用卸载
|
||||
*/
|
||||
class UnInstall
|
||||
{
|
||||
/**
|
||||
* 执行卸载
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
return error('', "系统插件不允许删除");
|
||||
}
|
||||
}
|
||||
27
addon/supermember/event/WapOrderDetailPathByPayInfo.php
Executable file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\event;
|
||||
|
||||
use addon\blindbox\model\BlindboxOrder;
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
|
||||
/**
|
||||
* 通过支付信息获取手机端订单详情路径
|
||||
*/
|
||||
class WapOrderDetailPathByPayInfo
|
||||
{
|
||||
public function handle($data)
|
||||
{
|
||||
if($data['event'] == 'MemberLevelOrderPayNotify'){
|
||||
return '/pages_tool/member/card';
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
addon/supermember/icon.png
Executable file
|
After Width: | Height: | Size: 1.4 KiB |
47
addon/supermember/model/Config.php
Executable file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\model;
|
||||
|
||||
use app\model\BaseModel;
|
||||
use app\model\system\Document;
|
||||
|
||||
/**
|
||||
* 会员卡订单
|
||||
*/
|
||||
class Config extends BaseModel
|
||||
{
|
||||
/**
|
||||
* 注册协议
|
||||
* @param unknown $site_id
|
||||
* @param unknown $name
|
||||
* @param unknown $value
|
||||
*/
|
||||
public function setMemberCardDocument($title, $content, $site_id, $app_module = 'shop')
|
||||
{
|
||||
$document = new Document();
|
||||
$res = $document->setDocument($title, $content, [['site_id', '=', $site_id], ['app_module', '=', $app_module], ['document_key', '=', 'MEMBER_CARD_AGREEMENT']]);
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询注册协议
|
||||
* @param unknown $where
|
||||
* @param unknown $field
|
||||
* @param unknown $value
|
||||
*/
|
||||
public function getMemberCardDocument($site_id, $app_module = 'shop')
|
||||
{
|
||||
$document = new Document();
|
||||
$info = $document->getDocument([['site_id', '=', $site_id], ['app_module', '=', $app_module], ['document_key', '=', 'MEMBER_CARD_AGREEMENT']]);
|
||||
return $info;
|
||||
}
|
||||
}
|
||||
36
addon/supermember/model/MemberCard.php
Executable file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\model;
|
||||
|
||||
use app\model\BaseModel;
|
||||
|
||||
/**
|
||||
* 会员卡订单
|
||||
*/
|
||||
class MemberCard extends BaseModel
|
||||
{
|
||||
/**
|
||||
* 获取站点推荐会员卡
|
||||
* @param $site_id
|
||||
*/
|
||||
public function getRecommendMemberCard($site_id)
|
||||
{
|
||||
$condition = [
|
||||
[ 'site_id', '=', $site_id ],
|
||||
[ 'level_type', '=', 1 ],
|
||||
[ 'status', '=', 1 ],
|
||||
[ 'is_recommend', '=', 1 ]
|
||||
];
|
||||
$field = 'level_id,level_name,consume_discount,is_free_shipping,point_feedback,send_point,send_balance,send_coupon,charge_rule';
|
||||
$data = model('member_level')->getInfo($condition, $field);
|
||||
return $this->success($data);
|
||||
}
|
||||
}
|
||||
342
addon/supermember/model/MemberLevelOrder.php
Executable file
@@ -0,0 +1,342 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\model;
|
||||
|
||||
use addon\coupon\model\Coupon;
|
||||
use app\dict\member_account\AccountDict;
|
||||
use app\model\member\Member;
|
||||
use app\model\member\MemberAccount;
|
||||
use app\model\member\MemberLevel;
|
||||
use app\model\system\Cron;
|
||||
use app\model\system\Pay;
|
||||
use app\model\system\Stat;
|
||||
use think\facade\Cache;
|
||||
use app\model\BaseModel;
|
||||
use app\model\order\Config;
|
||||
|
||||
/**
|
||||
* 会员卡订单
|
||||
*/
|
||||
class MemberLevelOrder extends BaseModel
|
||||
{
|
||||
// 订单待支付
|
||||
const ORDER_CREATE = 0;
|
||||
|
||||
// 订单已支付
|
||||
const ORDER_PAY = 1;
|
||||
|
||||
// 订单已关闭
|
||||
const ORDER_CLOSE = -1;
|
||||
|
||||
/**
|
||||
* 基础支付方式(不考虑实际在线支付方式或者货到付款方式)
|
||||
* @var unknown
|
||||
*/
|
||||
public $pay_type = [
|
||||
'ONLINE_PAY' => '在线支付',
|
||||
'offlinepay' => '线下支付',
|
||||
'BALANCE' => '余额支付'
|
||||
];
|
||||
|
||||
/**
|
||||
* 获取支付方式
|
||||
* @return unknown
|
||||
*/
|
||||
public function getPayType()
|
||||
{
|
||||
//获取订单基础的其他支付方式
|
||||
$pay_type = $this->pay_type;
|
||||
//获取当前所有在线支付方式
|
||||
$onlinepay = event('PayType', []);
|
||||
if (!empty($onlinepay)) {
|
||||
foreach ($onlinepay as $k => $v) {
|
||||
$pay_type[ $v[ 'pay_type' ] ] = $v[ 'pay_type_name' ];
|
||||
}
|
||||
}
|
||||
return $pay_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单创建
|
||||
* @param $data
|
||||
*/
|
||||
public function create($data)
|
||||
{
|
||||
//获取用户头像
|
||||
$member_model = new Member();
|
||||
$member_info = $member_model->getMemberInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'headimg,nickname,member_level')[ 'data' ];
|
||||
|
||||
// 获取卡信息
|
||||
$level_info = model('member_level')->getInfo([ [ 'level_id', '=', $data[ 'level_id' ] ], [ 'site_id', '=', $data[ 'site_id' ] ] ]);
|
||||
if (empty($level_info)) return $this->error('', '未获取到会员卡信息');
|
||||
if ($level_info[ 'level_type' ] == 0) return $this->error('', '免费卡无需购买');
|
||||
|
||||
$charge_rule = json_decode($level_info[ 'charge_rule' ], true);
|
||||
if (!isset($charge_rule[ $data[ 'period_unit' ] ]) && empty($charge_rule[ $data[ 'period_unit' ] ])) return $this->error('', '该会员卡未配置该收费规则');
|
||||
|
||||
$order_money = $charge_rule[ $data[ 'period_unit' ] ];
|
||||
|
||||
$pay = new Pay();
|
||||
$out_trade_no = $data['out_trade_no'] ?? $pay->createOutTradeNo($data['member_id']);
|
||||
$order_no = $this->createOrderNo($data[ 'site_id' ], $data[ 'member_id' ]);
|
||||
|
||||
$order_type = $member_info[ 'member_level' ] == $data[ 'level_id' ] ? 2 : 1; // 1购卡 2续费
|
||||
|
||||
model('member_level_order')->startTrans();
|
||||
try {
|
||||
$create_data = [
|
||||
'site_id' => $data[ 'site_id' ],
|
||||
'order_no' => $order_no,
|
||||
'out_trade_no' => $out_trade_no,
|
||||
'level_name' => $level_info[ 'level_name' ],
|
||||
'level_id' => $level_info[ 'level_id' ],
|
||||
'order_type' => $order_type,
|
||||
'charge_type' => $level_info[ 'charge_type' ],
|
||||
'period_unit' => $data[ 'period_unit' ],
|
||||
'buy_num' => 1,
|
||||
'order_money' => $order_money,
|
||||
'buyer_id' => $data[ 'member_id' ],
|
||||
'nickname' => $member_info[ 'nickname' ],
|
||||
'headimg' => $member_info[ 'headimg' ],
|
||||
'create_time' => time()
|
||||
];
|
||||
// 添加订单
|
||||
$order_id = model('member_level_order')->add($create_data);
|
||||
|
||||
if (!isset($data[ 'out_trade_no' ])) {
|
||||
//生成支付单据
|
||||
$pay_body = $order_type == 1 ? '购买会员卡' : '会员卡续费';
|
||||
$pay->addPay($data[ 'site_id' ], $out_trade_no, "", $pay_body, $pay_body, $order_money, '', 'MemberLevelOrderPayNotify', '', $order_id, $data[ 'member_id' ]);
|
||||
}
|
||||
|
||||
//计算订单自动关闭时间
|
||||
$config_model = new Config();
|
||||
$order_config_result = $config_model->getOrderEventTimeConfig($data[ 'site_id' ]);
|
||||
$order_config = $order_config_result[ "data" ];
|
||||
$now_time = time();
|
||||
if (!empty($order_config)) {
|
||||
$execute_time = $now_time + $order_config[ "value" ][ "auto_close" ] * 60;//自动关闭时间
|
||||
} else {
|
||||
$execute_time = $now_time + 3600;//尚未配置 默认一天
|
||||
}
|
||||
$cron_model = new Cron();
|
||||
$cron_model->addCron(1, 0, "订单自动关闭", "MemberLevelOrderClose", $execute_time, $order_id);
|
||||
|
||||
model("member_level_order")->commit();
|
||||
return $this->success([ 'out_trade_no' => $out_trade_no, 'order_id' => $order_id ]);
|
||||
} catch (\Exception $e) {
|
||||
model('member_level_order')->rollback();
|
||||
return $this->error('', $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡订单支付回调
|
||||
* @param $data
|
||||
*/
|
||||
public function orderPay($data)
|
||||
{
|
||||
$order_info = model('member_level_order')->getInfo([ [ 'out_trade_no', '=', $data[ 'out_trade_no' ] ] ]);
|
||||
if (!empty($order_info) && $order_info[ 'order_status' ] == self::ORDER_CREATE) {
|
||||
model('member_level_order')->startTrans();
|
||||
try {
|
||||
$pay_list = $this->getPayType();
|
||||
$order_id = $order_info[ 'order_id' ];
|
||||
$site_id = $order_info[ 'site_id' ];
|
||||
$pay_type_name = '';
|
||||
if (!empty($data[ 'pay_type' ])) {
|
||||
$pay_type_name = $pay_list[ $data[ 'pay_type' ] ];
|
||||
}
|
||||
|
||||
//修改订单状态
|
||||
$order_data = [
|
||||
'pay_type' => $data[ 'pay_type' ],
|
||||
'pay_type_name' => $pay_type_name,
|
||||
'pay_time' => time(),
|
||||
'order_status' => self::ORDER_PAY
|
||||
];
|
||||
$res = model('member_level_order')->update($order_data, [ [ 'out_trade_no', '=', $data[ 'out_trade_no' ] ] ]);
|
||||
|
||||
// 会员卡付费类型是充值
|
||||
$member_account = new MemberAccount();
|
||||
if ($order_info[ 'charge_type' ] == 1) {
|
||||
$member_account->addMemberAccount($order_info[ 'site_id' ], $order_info[ 'buyer_id' ], AccountDict::balance, $order_info[ 'order_money' ], 'memberlevel', '0', '会员开卡充值');
|
||||
}
|
||||
|
||||
// 查询会员信息
|
||||
$member_info = model('member')->getInfo([ [ 'member_id', '=', $order_info[ 'buyer_id' ] ] ]);
|
||||
// 查询会员卡信息
|
||||
$level_info = model('member_level')->getInfo([ [ 'level_id', '=', $order_info[ 'level_id' ] ] ]);
|
||||
|
||||
// 如果是首次开卡发放开卡礼包
|
||||
$count = model('member_level_records')->getCount([ [ 'after_level_id', '=', $level_info[ 'level_id' ] ], [ 'member_id', '=', $order_info[ 'buyer_id' ] ] ]);
|
||||
if ($count == 0) {
|
||||
//赠送红包
|
||||
if ($level_info[ 'send_balance' ] > 0) {
|
||||
$member_account->addMemberAccount($order_info[ 'site_id' ], $order_info[ 'buyer_id' ], AccountDict::balance, $level_info[ 'send_balance' ], 'memberlevel', '会员开卡得红包' . $level_info[ 'send_balance' ], '会员开卡奖励发放');
|
||||
}
|
||||
//赠送积分
|
||||
if ($level_info[ 'send_point' ] > 0) {
|
||||
$member_account->addMemberAccount($order_info[ 'site_id' ], $order_info[ 'buyer_id' ], 'point', $level_info[ 'send_point' ], 'memberlevel', '会员开卡得积分' . $level_info[ 'send_point' ], '会员开卡奖励发放');
|
||||
}
|
||||
//给用户发放优惠券
|
||||
if (!empty($level_info[ 'send_coupon' ])) {
|
||||
$coupon_array = explode(',', $level_info[ 'send_coupon' ]);
|
||||
$coupon_model = new Coupon();
|
||||
$coupon_array = array_map(function($value) {
|
||||
return [ 'coupon_type_id' => $value, 'num' => 1 ];
|
||||
}, $coupon_array);
|
||||
$coupon_model->giveCoupon($coupon_array, $order_info[ 'site_id' ], $order_info[ 'buyer_id' ], Coupon::GET_TYPE_ACTIVITY_GIVE);
|
||||
}
|
||||
}
|
||||
|
||||
if ($member_info[ 'member_level' ] != $level_info[ 'level_id' ]) {
|
||||
if ($order_info[ 'period_unit' ] == 'quarter') {
|
||||
$expire_time = strtotime("+3 month");
|
||||
} else {
|
||||
$expire_time = strtotime("+{$order_info['buy_num']} {$order_info['period_unit']}");
|
||||
}
|
||||
// 添加会员卡变更记录
|
||||
$member_level_model = new MemberLevel();
|
||||
$member_level_model->addMemberLevelChangeRecord($order_info[ 'buyer_id' ], $order_info[ 'site_id' ], $level_info[ 'level_id' ], $expire_time, 'buy', $order_info[ 'buyer_id' ], 'member', $member_info[ 'nickname' ]);
|
||||
} else {
|
||||
$old_expire_time = date('Y-m-d', $member_info[ 'level_expire_time' ]);
|
||||
if ($order_info[ 'period_unit' ] == 'quarter') {
|
||||
$expire_time = strtotime("{$old_expire_time} +3 month");
|
||||
} else {
|
||||
$expire_time = strtotime("{$old_expire_time} +{$order_info['buy_num']} {$order_info['period_unit']}");
|
||||
}
|
||||
// 更新会员卡过期时间
|
||||
model('member')->update([ 'level_expire_time' => $expire_time ], [ [ 'member_id', '=', $order_info[ 'buyer_id' ] ] ]);
|
||||
$cron = new Cron();
|
||||
$cron->deleteCron([ [ 'event', '=', 'MemberLevelAutoExpire' ], [ 'relate_id', '=', $order_info[ 'buyer_id' ] ] ]);
|
||||
$cron->addCron(1, 0, "会员卡自动过期", "MemberLevelAutoExpire", $expire_time, $order_info[ 'buyer_id' ]);
|
||||
}
|
||||
|
||||
event('MemberLevelOrderPay', $order_info);
|
||||
|
||||
$stat_model = new Stat();
|
||||
$stat_model->switchStat([ 'type' => 'member_level_order', 'data' => [ 'order_id' => $order_id, 'site_id' => $site_id ] ]);
|
||||
model('member_level_order')->commit();
|
||||
return $this->success();
|
||||
} catch (\Exception $e) {
|
||||
model('member_level_order')->rollback();
|
||||
return $this->error('', $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成订单编号
|
||||
* @param $site_id
|
||||
* @param int $member_id
|
||||
* @return string
|
||||
*/
|
||||
public function createOrderNo($site_id, $member_id = 0)
|
||||
{
|
||||
$time_str = date('YmdHi');
|
||||
$max_no = Cache::get($site_id . "_" . $member_id . "_" . $time_str);
|
||||
if (empty($max_no)) {
|
||||
$max_no = 1;
|
||||
} else {
|
||||
$max_no = $max_no + 1;
|
||||
}
|
||||
$order_no = $time_str . $member_id . sprintf("%03d", $max_no);
|
||||
Cache::set($site_id . "_" . $member_id . "_" . $time_str, $max_no);
|
||||
return $order_no;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭会员卡订单
|
||||
*/
|
||||
public function closeLevelOrder($order_id)
|
||||
{
|
||||
$res = model('member_level_order')->update([ 'order_status' => self::ORDER_CLOSE ], [ [ 'order_id', '=', $order_id ], [ 'order_status', '=', self::ORDER_CREATE ] ]);
|
||||
return $this->success($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员卡订单列表
|
||||
* @param array $condition
|
||||
* @param string $field
|
||||
* @param string $order
|
||||
* @param int $page
|
||||
* @param int $list_rows
|
||||
* @param string $alias
|
||||
* @param array $join
|
||||
* @return array
|
||||
*/
|
||||
public function getLevelOrderPageList($condition = [], $page = 1, $list_rows = PAGE_LIST_ROWS, $field = '*', $order = 'create_time desc', $alias = 'a', $join = [])
|
||||
{
|
||||
$list = model('member_level_order')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
|
||||
return $this->success($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员卡订单信息
|
||||
* @param array $where
|
||||
* @param bool $field
|
||||
* @param string $alias
|
||||
* @param null $join
|
||||
* @return array
|
||||
*/
|
||||
public function getLevelOrderInfo($where = [], $field = '*', $alias = 'a', $join = null)
|
||||
{
|
||||
$data = model('member_level_order')->getInfo($where, $field, $alias, $join);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 线下支付
|
||||
* @param $out_trade_no
|
||||
* @return array
|
||||
*/
|
||||
public function offlinePay($out_trade_no)
|
||||
{
|
||||
model('member_level_order')->startTrans();
|
||||
try {
|
||||
$pay_model = new Pay();
|
||||
$result = $pay_model->onlinePay($out_trade_no, "offlinepay", '', '');
|
||||
if ($result[ "code" ] < 0) {
|
||||
model('order')->rollback();
|
||||
return $result;
|
||||
}
|
||||
model('order')->commit();
|
||||
return $result;
|
||||
} catch (\Exception $e) {
|
||||
model('member_level_order')->rollback();
|
||||
return $this->error('', $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单总数
|
||||
* @param $condition
|
||||
* @return array
|
||||
*/
|
||||
public function getOrderCount($condition, $field = '*', $alias = 'a', $join = null, $group = null)
|
||||
{
|
||||
$count = model('member_level_order')->getCount($condition, $field, $alias, $join, $group);
|
||||
return $this->success($count);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单总数
|
||||
* @param $condition
|
||||
* @param $filed
|
||||
* @return array
|
||||
*/
|
||||
public function getOrderSum($condition, $filed)
|
||||
{
|
||||
$sum = model('member_level_order')->getSum($condition, $filed);
|
||||
return $this->success($sum);
|
||||
}
|
||||
}
|
||||
53
addon/supermember/model/MemberLevelStat.php
Executable file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\model;
|
||||
|
||||
use app\model\BaseModel;
|
||||
use app\model\system\Stat;
|
||||
|
||||
/**
|
||||
* 会员卡订单统计
|
||||
*/
|
||||
class MemberLevelStat extends BaseModel
|
||||
{
|
||||
|
||||
/**
|
||||
* 写入礼品卡统计数据
|
||||
* @param $params
|
||||
*/
|
||||
public function addMemberLevelStat($params){
|
||||
$order_id = $params['order_id'];
|
||||
|
||||
$site_id = $params['site_id'] ?? 0;
|
||||
$order_condition = array(
|
||||
['order_id', '=', $order_id],
|
||||
['site_id', '=', $site_id]
|
||||
);
|
||||
$order_info = model('member_level_order')->getInfo($order_condition);
|
||||
|
||||
//余额支付不统计
|
||||
if(empty($order_info) || $order_info['pay_type'] == 'BALANCE')
|
||||
return $this->error();
|
||||
|
||||
$order_money = $order_info['order_money'];
|
||||
$stat_data = array(
|
||||
'site_id' => $site_id,
|
||||
'member_level_count' => 1,
|
||||
'member_level_total_money' => $order_money
|
||||
);
|
||||
|
||||
$stat_model = new Stat();
|
||||
|
||||
$result = $stat_model->addShopStat($stat_data);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
357
addon/supermember/shop/controller/Membercard.php
Executable file
@@ -0,0 +1,357 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\supermember\shop\controller;
|
||||
|
||||
use addon\coupon\model\CouponType;
|
||||
use addon\supermember\model\Config;
|
||||
use addon\supermember\model\MemberLevelOrder;
|
||||
use app\model\member\Member;
|
||||
use app\model\member\MemberLevel;
|
||||
use app\shop\controller\BaseShop;
|
||||
use Carbon\Carbon;
|
||||
use think\App;
|
||||
|
||||
/**
|
||||
* 会员卡
|
||||
*/
|
||||
class Membercard extends BaseShop
|
||||
{
|
||||
|
||||
public function __construct(App $app = null)
|
||||
{
|
||||
$this->replace = [
|
||||
'SUPERMEMBER_IMG' => __ROOT__ . '/addon/supermember/shop/view/public/img',
|
||||
'SUPERMEMBER_CSS' => __ROOT__ . '/addon/supermember/shop/view/public/css',
|
||||
'SUPERMEMBER_JS' => __ROOT__ . '/addon/supermember/shop/view/public/js',
|
||||
];
|
||||
parent::__construct($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 概况
|
||||
* @return mixed
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return $this->fetch('membercard/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* 销售数据统计
|
||||
*/
|
||||
public function salesStatistics()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$start_time = input('start_time', '');
|
||||
$end_time = input('end_time', '');
|
||||
|
||||
$order = new MemberLevelOrder();
|
||||
|
||||
$data = [
|
||||
'sale_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ strtotime($start_time), strtotime($end_time) ] ] ])[ 'data' ],
|
||||
'sale_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ strtotime($start_time), strtotime($end_time) ] ] ], 'order_money')[ 'data' ],
|
||||
];
|
||||
|
||||
return success(0, '', $data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡列表
|
||||
* @return mixed
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$page = input('page', 1);
|
||||
$page_size = input('page_size', PAGE_LIST_ROWS);
|
||||
$search_text = input('search_text', '');
|
||||
$charge_type = input('charge_type', '');
|
||||
$status = input('status', '');
|
||||
|
||||
$condition = [
|
||||
[ 'site_id', '=', $this->site_id ],
|
||||
[ 'level_type', '=', 1 ]
|
||||
];
|
||||
if (!empty($search_text)) $condition[] = [ 'level_name', 'like', "%" . $search_text . "%" ];
|
||||
if ($charge_type != '') $condition[] = [ 'charge_type', '=', $charge_type ];
|
||||
if ($status != '') $condition[] = [ 'status', '=', $status ];
|
||||
$order = 'growth asc,level_id desc';
|
||||
$field = '*';
|
||||
|
||||
$member_level_model = new MemberLevel();
|
||||
$list = $member_level_model->getMemberLevelPageList($condition, $page, $page_size, $order, $field);
|
||||
if (!empty($list[ 'data' ][ 'list' ])) {
|
||||
$member_level_array = $member_level_model->getMemberCountGroupByLevel();
|
||||
foreach ($list[ 'data' ][ 'list' ] as $k => $item) {
|
||||
|
||||
$list[ 'data' ][ 'list' ][ $k ][ 'member_num' ] = $member_level_array[ $item[ 'level_id' ] ][ 'count' ] ?? 0;
|
||||
}
|
||||
}
|
||||
return $list;
|
||||
} else {
|
||||
return $this->fetch('membercard/lists');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加会员卡
|
||||
* @return mixed
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$member_level_model = new MemberLevel();
|
||||
if (request()->isJson()) {
|
||||
$data = [
|
||||
'site_id' => $this->site_id,
|
||||
'level_name' => input('level_name', ''),
|
||||
'growth' => input('growth', 0),
|
||||
'remark' => input('remark', ''),
|
||||
'is_free_shipping' => input('is_free_shipping', 0),
|
||||
'consume_discount' => input('consume_discount', 100),
|
||||
'point_feedback' => input('point_feedback', 0),
|
||||
'send_point' => input('send_point', 0),
|
||||
'send_balance' => input('send_balance', 0),
|
||||
'send_coupon' => input('send_coupon', ''),
|
||||
'charge_rule' => input('charge_rule', ''),
|
||||
'charge_type' => input('charge_type', 0),
|
||||
'level_type' => 1,
|
||||
'bg_color' => input('bg_color', '#333333'),
|
||||
'level_text_color' => input('level_text_color', '#ffffff'),
|
||||
'level_picture' => input('level_picture', ''),
|
||||
];
|
||||
$this->addLog("添加会员卡:" . $data[ 'level_name' ]);
|
||||
$res = $member_level_model->addMemberLevel($data);
|
||||
return $res;
|
||||
} else {
|
||||
$this->assign('level_time', $member_level_model->level_time);
|
||||
return $this->fetch('membercard/add');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑会员卡
|
||||
* @return mixed
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
$member_level_model = new MemberLevel();
|
||||
if (request()->isJson()) {
|
||||
$data = [
|
||||
'level_name' => input('level_name', ''),
|
||||
'remark' => input('remark', ''),
|
||||
'is_free_shipping' => input('is_free_shipping', 0),
|
||||
'consume_discount' => input('consume_discount', 100),
|
||||
'point_feedback' => input('point_feedback', 0),
|
||||
'send_point' => input('send_point', 0),
|
||||
'send_balance' => input('send_balance', 0),
|
||||
'send_coupon' => input('send_coupon', ''),
|
||||
'charge_rule' => input('charge_rule', ''),
|
||||
'charge_type' => input('charge_type', 0),
|
||||
'bg_color' => input('bg_color', '#333333'),
|
||||
'level_text_color' => input('level_text_color', '#ffffff'),
|
||||
'level_picture' => input('level_picture', ''),
|
||||
];
|
||||
$level_id = input('level_id', 0);
|
||||
$this->addLog("编辑会员卡:" . $data[ 'level_name' ]);
|
||||
if ($data[ 'charge_type' ]) $data[ 'is_recommend' ] = 0;
|
||||
return $member_level_model->editMemberLevel($data, [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
|
||||
} else {
|
||||
$level_id = input('id', 0);
|
||||
$level_info = $member_level_model->getMemberLevelInfo([ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
|
||||
$this->assign('level_info', $level_info[ 'data' ]);
|
||||
|
||||
if (empty($level_info[ 'data' ]))
|
||||
$this->error('未获取到会员卡数据', href_url('supermember://shop/membercard/lists'));
|
||||
|
||||
$this->assign('level_time', $member_level_model->level_time);
|
||||
return $this->fetch('membercard/edit');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员等级删除
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$level_id = input('level_id', '');
|
||||
$member_level_model = new MemberLevel();
|
||||
$this->addLog("会员卡删除id:" . $level_id);
|
||||
return $member_level_model->deleteMemberLevel($level_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡状态变更
|
||||
*/
|
||||
public function status()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$member_level_model = new MemberLevel();
|
||||
$level_id = input('level_id', '');
|
||||
$status = input('status', 0);
|
||||
$res = $member_level_model->editMemberLevel([ 'status' => $status ], [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 推荐
|
||||
* @return array
|
||||
*/
|
||||
public function recommend()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$member_level_model = new MemberLevel();
|
||||
$level_id = input('level_id', '');
|
||||
$recommend = input('recommend', 1);
|
||||
$member_level_model->editMemberLevel([ 'is_recommend' => 0 ], [ [ 'level_id', '<>', $level_id ], [ 'is_recommend', '=', 1 ], [ 'site_id', '=', $this->site_id ] ]);
|
||||
$member_level_model->editMemberLevel([ 'is_recommend' => $recommend ], [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
|
||||
return success();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡订单
|
||||
* @return mixed
|
||||
*/
|
||||
public function order()
|
||||
{
|
||||
$level_order = new MemberLevelOrder();
|
||||
if (request()->isJson()) {
|
||||
$page = input('page', 1);
|
||||
$page_size = input('page_size', PAGE_LIST_ROWS);
|
||||
$order_no = input('order_no', '');
|
||||
$start_time = input('start_time', '');
|
||||
$end_time = input('end_time', '');
|
||||
$nickname = input('nickname', '');
|
||||
|
||||
$condition = [
|
||||
[ 'site_id', '=', $this->site_id ],
|
||||
[ 'order_status', '=', 1 ]
|
||||
];
|
||||
if ($order_no) {
|
||||
$condition[] = [ 'order_no', 'like', '%' . $order_no . '%' ];
|
||||
}
|
||||
if ($nickname) {
|
||||
$condition[] = [ 'nickname', 'like', '%' . $nickname . '%' ];
|
||||
}
|
||||
if ($start_time && !$end_time) {
|
||||
$condition[] = [ 'pay_time', '>=', date_to_time($start_time) ];
|
||||
} elseif (!$start_time && $end_time) {
|
||||
$condition[] = [ 'pay_time', '<=', date_to_time($end_time) ];
|
||||
} elseif ($start_time && $end_time) {
|
||||
$condition[] = [ 'pay_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
|
||||
}
|
||||
$data = $level_order->getLevelOrderPageList($condition, $page, $page_size);
|
||||
return $data;
|
||||
} else {
|
||||
$buyer_num = $level_order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', 1 ] ], 'order_id', 'a', null, 'buyer_id')[ 'data' ];
|
||||
$this->assign('buyer_num', $buyer_num);
|
||||
|
||||
$order_money = $level_order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', 1 ] ], 'order_money')[ 'data' ];
|
||||
$this->assign('order_money', sprintf("%.2f", $order_money));
|
||||
|
||||
return $this->fetch('membercard/order');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡订单详情
|
||||
* @return mixed
|
||||
*/
|
||||
public function orderDetail()
|
||||
{
|
||||
$order_id = input('order_id', '');
|
||||
$level_order = new MemberLevelOrder();
|
||||
$condition = [
|
||||
[ 'order_id', '=', $order_id ],
|
||||
[ 'site_id', '=', $this->site_id ]
|
||||
];
|
||||
$order = $level_order->getLevelOrderInfo($condition);
|
||||
if (empty($order[ 'data' ]))
|
||||
$this->error('未获取到订单数据', href_url('supermember://shop/membercard/order'));
|
||||
|
||||
$this->assign('order', $order);
|
||||
return $this->fetch('membercard/order_detail');
|
||||
}
|
||||
|
||||
/**
|
||||
* 线下支付
|
||||
* @return array
|
||||
*/
|
||||
public function offlinepay()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$out_trade_no = input('out_trade_no', 0);
|
||||
$level_order = new MemberLevelOrder();
|
||||
$res = $level_order->offlinePay($out_trade_no);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开卡协议
|
||||
* @return mixed
|
||||
*/
|
||||
public function agreement()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
//设置注销协议
|
||||
$title = input('title', '');
|
||||
$content = input('content', '');
|
||||
$config_model = new Config();
|
||||
return $config_model->setMemberCardDocument($title, $content, $this->site_id, 'shop');
|
||||
} else {
|
||||
//获取注销协议
|
||||
$config_model = new Config();
|
||||
$document_info = $config_model->getMemberCardDocument($this->site_id, 'shop');
|
||||
$this->assign('document_info', $document_info);
|
||||
return $this->fetch('membercard/agreement');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员卡统计
|
||||
*/
|
||||
public function stat()
|
||||
{
|
||||
$order = new MemberLevelOrder();
|
||||
$yesterday = Carbon::yesterday();
|
||||
|
||||
$data = [
|
||||
'yesterday_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 00:00:00"), date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 23:59:59") ] ] ])[ 'data' ],
|
||||
'today_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time(date('Y-m-d 00:00:00')), time() ] ] ])[ 'data' ],
|
||||
'total_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ] ])[ 'data' ],
|
||||
'yesterday_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 00:00:00"), date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 23:59:59") ] ] ], 'order_money')[ 'data' ],
|
||||
'today_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time(date('Y-m-d 00:00:00')), time() ] ] ], 'order_money')[ 'data' ],
|
||||
'total_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ] ], 'order_money')[ 'data' ],
|
||||
'has_card_member' => ( new Member() )->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'member_level_type', '=', 1 ], [ 'is_delete', '=', 0 ] ])[ 'data' ], // 持有超级会员卡的人数
|
||||
'no_has_card_member' => ( new Member() )->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'member_level_type', '=', 0 ], [ 'is_delete', '=', 0 ] ])[ 'data' ], // 未持有超级会员卡的人数
|
||||
'card_list' => []
|
||||
];
|
||||
|
||||
$member_level_model = new MemberLevel();
|
||||
$card_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ], [ 'level_type', '=', 1 ] ], 'level_name,level_id');
|
||||
if (!empty($card_list[ 'data' ])) {
|
||||
$member_level_array = $member_level_model->getMemberCountGroupByLevel();
|
||||
foreach ($card_list[ 'data' ] as $k => $item) {
|
||||
|
||||
$card_list[ 'data' ][ $k ][ 'member_num' ] = $member_level_array[ $item[ 'level_id' ] ][ 'count' ] ?? 0;
|
||||
}
|
||||
array_multisort(array_column($card_list[ 'data' ], 'member_num'), SORT_DESC, $card_list[ 'data' ]);
|
||||
$data[ 'card_list' ] = $card_list[ 'data' ];
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
459
addon/supermember/shop/view/membercard/add.html
Executable file
@@ -0,0 +1,459 @@
|
||||
<style>
|
||||
.coupon-box{
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.coupon-box .layui-form{
|
||||
padding: 0!important;
|
||||
}
|
||||
|
||||
.layui-layer-page .layui-layer-content{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
.del-btn {
|
||||
cursor: pointer;
|
||||
}
|
||||
.level-equity .layui-input {
|
||||
display: inline-block;
|
||||
}
|
||||
.gods-box table:first-of-type{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.gods-box table:last-of-type{
|
||||
margin-top: 0;
|
||||
display: block;
|
||||
max-height: 323px;
|
||||
overflow: auto;
|
||||
}
|
||||
.coupon-box .single-filter-box{
|
||||
padding-top: 0;
|
||||
}
|
||||
.align-center{
|
||||
text-align: center!important;
|
||||
}
|
||||
.colorSelector{
|
||||
position: relative;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #d7d7d7;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
padding: 2px;
|
||||
}
|
||||
.colorSelector div{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.flexbox-fix-btn .btn{
|
||||
margin-top: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="layui-form">
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>会员卡名称:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="level_name" type="text" lay-verify="required" class="layui-input len-long" maxlength="40">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员卡说明:</label>
|
||||
<div class="layui-input-block len-long">
|
||||
<textarea name="remark" class="layui-textarea" maxlength="150"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">等级封面背景色:</label>
|
||||
<div class="layui-input-block flex">
|
||||
<input name="bg_color" type="hidden" value="#333333" class="layui-input len-short" id="bg_color_input">
|
||||
<div id="bg_color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">等级文字颜色:</label>
|
||||
<div class="layui-input-block ">
|
||||
<input name="level_text_color" type="hidden" value="#ffffff" class="layui-input len-short" id="level_text_color_input">
|
||||
<div id="level_text_color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">背景图:</label>
|
||||
<div class="layui-input-block img-upload">
|
||||
<div class="upload-img-block">
|
||||
<div class="upload-img-box">
|
||||
<div class="upload-default" id="imgUpload">
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="level_picture" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="word-aux">
|
||||
<p>尺寸:1000*525像素,小于1M,支持jpg、png、jpeg格式,上传背景图后,手机端将不会展示背景颜色,优先展示背景图</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>付费方式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="charge_type" value="0" title="付款" checked>
|
||||
<input type="radio" name="charge_type" value="1" title="充值">
|
||||
</div>
|
||||
<div class="word-aux">充值卡不能设置为推荐会员卡</div>
|
||||
</div>
|
||||
<div class="layui-form-item charge-rule">
|
||||
<label class="layui-form-label"><span class="required">*</span>付费规则:</label>
|
||||
<div class="layui-input-block">
|
||||
<table class="layui-table len-long" lay-skin="nob" id="level-rule">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="50%">
|
||||
<col width="20%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>有效期</th>
|
||||
<th class="align-center">价格</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
<a href="javascript:void(0)" class="text-color" onclick="addRule()" id="add_rule_btn">添加规则</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief level-equity" >
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">权益</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否包邮:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_free_shipping" value="1" lay-skin="switch" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>消费折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="consume_discount" min="0" max="100" lay-verify="fl" autocomplete="off" class="layui-input len-short"> %
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">积分回馈倍率:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="point_feedback" min="0" max="100" lay-verify="jf" autocomplete="off" class="layui-input len-short"> 倍
|
||||
</div>
|
||||
<div class="word-aux">回馈积分 = 消费金额 * 积分回馈倍率</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">开卡礼包</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送积分:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="send_point" type="number" lay-verify="num" min="0" class="layui-input len-short">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送红包:</label>
|
||||
<div class="layui-input-block len-long">
|
||||
<input name="send_balance" type="number" lay-verify="num" min="0" class="layui-input len-short">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送优惠券:</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="coupon_list"></div>
|
||||
<button class="layui-btn" id="select_coupon">选择优惠券</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="word-aux">开卡礼包仅首次购卡发放</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common">
|
||||
<div class="layui-card-body">
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="__STATIC__/ext/colorPicker/js/colorpicker.js"></script>
|
||||
<script type="text/javascript" src="STATIC_JS/coupon_select.js"></script>
|
||||
<script>
|
||||
var coupon_id = [], addCoupon;
|
||||
|
||||
var form,colorpicker;
|
||||
|
||||
var coupon_select = new CouponSelect({
|
||||
tableElem:'#coupon_list',
|
||||
selectElem:'#select_coupon',
|
||||
})
|
||||
|
||||
layui.use(['form', 'laytpl', 'colorpicker'], function() {
|
||||
form = layui.form;
|
||||
colorpicker = layui.colorpicker;
|
||||
var laytpl = layui.laytpl,
|
||||
repeat_flag = false; //防重复标识
|
||||
form.render();
|
||||
|
||||
var logo_upload = new Upload({
|
||||
elem: '#imgUpload'
|
||||
});
|
||||
|
||||
colorpicker.render({
|
||||
elem: '#bg_color', //绑定元素
|
||||
color: "#333333",
|
||||
done: function(color) {
|
||||
$("#bg_color_input").attr("value", color);
|
||||
}
|
||||
});
|
||||
|
||||
colorpicker.render({
|
||||
elem: '#level_text_color', //绑定元素
|
||||
color: "#ffffff",
|
||||
done: function(color) {
|
||||
$("#level_text_color_input").attr("value", color);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 监听保存
|
||||
*/
|
||||
form.on('submit(save)', function(data) {
|
||||
data.field.send_coupon = coupon_select.getSelectedData().selectedIds.toString();
|
||||
if (repeat_flag) return false;
|
||||
|
||||
let level = {};
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('.price').val() != undefined){
|
||||
level[$(e).find('select').val()] = $(e).find('.price').val();
|
||||
}
|
||||
})
|
||||
if(JSON.stringify(level) == '{}'){
|
||||
layer.msg('请设置付费规则');
|
||||
return false;
|
||||
}
|
||||
data.field.charge_rule = JSON.stringify(level);
|
||||
repeat_flag = true;
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/add"),
|
||||
data: data.field,
|
||||
dataType: 'JSON', //服务器返回json格式数据
|
||||
type: 'POST', //http请求类型
|
||||
success: function(res) {
|
||||
repeat_flag = false;
|
||||
if (res.code == 0) {
|
||||
layer.confirm('添加成功', {
|
||||
title:'操作提示',
|
||||
btn: ['返回列表', '继续添加'],
|
||||
closeBtn: 0,
|
||||
yes: function(index, layero){
|
||||
location.hash = ns.hash("supermember://shop/membercard/lists")
|
||||
layer.close(index);
|
||||
},
|
||||
btn2: function(index, layero) {
|
||||
listenerHash(); // 刷新页面
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}else{
|
||||
layer.msg(res.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* 表单验证
|
||||
*/
|
||||
form.verify({
|
||||
num: function(value) {
|
||||
var arrmen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrmen.length == 2) {
|
||||
val = arrmen[1];
|
||||
}
|
||||
|
||||
if (value == "") {
|
||||
return false;
|
||||
}
|
||||
if (value < 0 || val.length > 2) {
|
||||
return '请输入大于等于0的数,保留小数点后两位'
|
||||
}
|
||||
},
|
||||
fl: function(value, item) {
|
||||
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
|
||||
str = str.substring(0, str.length - 1);
|
||||
|
||||
if (isNaN(parseFloat(value))) {
|
||||
return "请设置" + str;
|
||||
}
|
||||
|
||||
if (value <= 0) {
|
||||
return str + "不能小于等于0";
|
||||
}
|
||||
|
||||
if (value > 100) {
|
||||
return str + "不能大于100";
|
||||
}
|
||||
|
||||
var arrMen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrMen.length == 2) {
|
||||
val = arrMen[1];
|
||||
}
|
||||
if (val.length > 2) {
|
||||
return str + "最多可保留两位小数";
|
||||
}
|
||||
},
|
||||
jf: function(value, item) {
|
||||
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
|
||||
str = str.substring(0, str.length - 1);
|
||||
|
||||
if (value < 0) {
|
||||
return str + "不能小于0";
|
||||
}
|
||||
|
||||
if (value > 100) {
|
||||
return str + "不能大于100";
|
||||
}
|
||||
|
||||
var arrMen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrMen.length == 2) {
|
||||
val = arrMen[1];
|
||||
}
|
||||
if (val.length > 2) {
|
||||
return str + "最多可保留两位小数";
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function back(){
|
||||
location.hash = ns.hash("supermember://shop/membercard/lists");
|
||||
}
|
||||
|
||||
//添加付费规则
|
||||
function addRule() {
|
||||
let level_select = {:json_encode($level_time, JSON_UNESCAPED_UNICODE)};
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('select').val() && $(e).find('select').val() != undefined){
|
||||
delete level_select[$(e).find('select').val()];
|
||||
}
|
||||
})
|
||||
|
||||
var select_html = '';
|
||||
for (let i in level_select){
|
||||
select_html += '<option value="'+i+'">'+level_select[i]+'</option>';
|
||||
}
|
||||
|
||||
var html = `
|
||||
<tr>
|
||||
<td>
|
||||
<div class="len-short">
|
||||
<select lay-filter="selectRule">
|
||||
${select_html}
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center">
|
||||
<input type="text" value="0" lay-verify="num" class="layui-input len-short price" placeholder="价格/元">
|
||||
</td>
|
||||
<td>
|
||||
<a href="javascript:void(0)" class="text-color" onclick="deleteRule(this)">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
$('#level-rule tbody').append(html);
|
||||
if($('#level-rule tr').length == 5){
|
||||
$('#add_rule_btn').hide()
|
||||
}
|
||||
form.render();
|
||||
form.on('select(selectRule)', function(data){
|
||||
let num = 0;
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('select').val() == data.value){
|
||||
num++;
|
||||
$('.delete-rule').removeClass('delete-rule');
|
||||
$(e).find('select').addClass('delete-rule');
|
||||
}
|
||||
})
|
||||
if(num > 1) deleteRule($('.delete-rule'));
|
||||
});
|
||||
|
||||
form.verify({
|
||||
num: function (value) {
|
||||
var arrmen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrmen.length == 2) {
|
||||
val = arrmen[1];
|
||||
}
|
||||
|
||||
if (value == "") {
|
||||
return false;
|
||||
}
|
||||
if (value < 0 || val.length > 2) {
|
||||
return '请输入大于等于0的数,保留小数点后两位'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function deleteRule(obj) {
|
||||
$(obj).parents('tr').remove();
|
||||
if($('#level-rule tr').length < 5){
|
||||
$('#add_rule_btn').show()
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
59
addon/supermember/shop/view/membercard/agreement.html
Executable file
@@ -0,0 +1,59 @@
|
||||
<div class="layui-form form-wrap">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">协议:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="请输入协议标题" value="{$document_info.data.title}" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">内容:</label>
|
||||
<div class="layui-input-inline">
|
||||
<script id="editor" type="text/plain" class="special-length" style="height:300px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="" id="agreementContent" value="{$document_info.data.content}" />
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
|
||||
<script>
|
||||
//实例化富文本
|
||||
var ue = UE.getEditor('editor');
|
||||
|
||||
if($("#agreementContent").val()){
|
||||
ue.ready(function() {
|
||||
ue.setContent($("#agreementContent").val());
|
||||
});
|
||||
}
|
||||
|
||||
layui.use('form', function() {
|
||||
var form = layui.form,
|
||||
repeat_flag = false; //防重复标识
|
||||
form.render();
|
||||
|
||||
//表单提交
|
||||
form.on('submit(save)', function(data) {
|
||||
if(repeat_flag) return false;
|
||||
repeat_flag = true;
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/agreement"),
|
||||
data: {
|
||||
'title': data.field.title,
|
||||
'content': ue.getContent(),
|
||||
},
|
||||
dataType: 'JSON', //服务器返回json格式数据
|
||||
type: 'POST', //HTTP请求类型
|
||||
success: function(res) {
|
||||
layer.msg(res.message);
|
||||
repeat_flag = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
500
addon/supermember/shop/view/membercard/edit.html
Executable file
@@ -0,0 +1,500 @@
|
||||
<style>
|
||||
.coupon-box{
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.coupon-box .layui-form{
|
||||
padding: 0!important;
|
||||
}
|
||||
|
||||
.layui-layer-page .layui-layer-content{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
.del-btn {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.level-equity .layui-input {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.gods-box table:first-of-type{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.gods-box table:last-of-type{
|
||||
margin-top: 0;
|
||||
display: block;
|
||||
max-height: 323px;
|
||||
overflow: auto;
|
||||
}
|
||||
.coupon-box .single-filter-box{
|
||||
padding-top: 0;
|
||||
}
|
||||
.colorSelector{
|
||||
position: relative;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #d7d7d7;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
padding: 2px;
|
||||
}
|
||||
.colorSelector div{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.flexbox-fix-btn .btn{
|
||||
margin-top: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="layui-form">
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>会员卡名称:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="level_name" value="{$level_info.level_name}" type="text" lay-verify="required" class="layui-input len-long" maxlength="40">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员卡说明:</label>
|
||||
<div class="layui-input-block len-long">
|
||||
<textarea name="remark" class="layui-textarea" maxlength="150">{$level_info.remark}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>会员卡类型:</label>
|
||||
<div class="layui-input-block">{$level_info.charge_type == 1 ? '充值卡' : '付费卡'}</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">等级封面背景色:</label>
|
||||
<div class="layui-input-block flex">
|
||||
<input name="bg_color" type="hidden" value="{$level_info.bg_color}" class="layui-input len-short" id="bg_color_input">
|
||||
<div id="bg_color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">等级文字颜色:</label>
|
||||
<div class="layui-input-block ">
|
||||
<input name="level_text_color" type="hidden" value="{$level_info.level_text_color}" class="layui-input len-short" id="level_text_color_input">
|
||||
<div id="level_text_color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">背景图:</label>
|
||||
<div class="layui-input-block img-upload">
|
||||
<div class="upload-img-block">
|
||||
<div class="upload-img-box {if condition="!empty($level_info.level_picture)"}hover{/if} ">
|
||||
<div class="upload-default" id="imgUpload">
|
||||
{if condition="!empty($level_info.level_picture)"}
|
||||
<div id="preview_logoUpload" class="preview_img">
|
||||
<img layer-src src="{:img($level_info.level_picture)}" class="img_prev"/>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="level_picture" value="{$level_info.level_picture}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="word-aux">
|
||||
<p>尺寸:1000*525像素,小于1M,支持jpg、png、jpeg格式,上传背景图后,手机端将不会展示背景颜色,优先展示背景图</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>付费方式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="charge_type" value="0" title="付款" {if $level_info['charge_type'] == 0}checked{/if}>
|
||||
<input type="radio" name="charge_type" value="1" title="充值" {if $level_info['charge_type'] == 1}checked{/if}>
|
||||
</div>
|
||||
<div class="word-aux">充值卡不能设置为推荐会员卡</div>
|
||||
</div>
|
||||
<div class="layui-form-item charge-rule">
|
||||
<label class="layui-form-label"><span class="required">*</span>付费规则:</label>
|
||||
<div class="layui-input-block">
|
||||
<table class="layui-table len-long" lay-skin="nob" id="level-rule">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="50%">
|
||||
<col width="20%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>有效期</th>
|
||||
<th class="align-center">价格</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{php}
|
||||
$level = json_decode($level_info['charge_rule'], true);
|
||||
{/php}
|
||||
{if $level}
|
||||
{foreach $level as $k => $v}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="len-short">
|
||||
<select lay-filter="selectRule">
|
||||
{foreach $level_time as $key => $val}
|
||||
{if $key == $k}
|
||||
<option value="{$k}">{$val}</option>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center">
|
||||
<input type="text" value="{$v}" lay-verify="num" class="layui-input len-short price" placeholder="价格/元" style="">
|
||||
</td>
|
||||
<td>
|
||||
<a href="javascript:void(0)" class="text-color" onclick="deleteRule(this)">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
<a href="javascript:void(0)" class="text-color " {if $level && count($level) >= 4}style="display:none"{/if} onclick="addRule()" id="add_rule_btn">添加规则</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief level-equity">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">权益</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否包邮:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_free_shipping" value="1" {if $level_info.is_free_shipping == 1} checked {/if} lay-skin="switch" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>消费折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="consume_discount" value="{$level_info.consume_discount}" lay-verify="fl" min="0" max="100" autocomplete="off" class="layui-input len-short"> %
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">积分回馈倍率:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="point_feedback" value="{$level_info.point_feedback}" lay-verify="jf" min="0" max="100" autocomplete="off" class="layui-input len-short"> 倍
|
||||
</div>
|
||||
<div class="word-aux">回馈积分 = 消费金额 * 积分回馈倍率</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">开卡礼包</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送积分:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="send_point" value="{$level_info.send_point}" type="number" lay-verify="num" min="0" class="layui-input len-short">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送红包:</label>
|
||||
<div class="layui-input-block len-long">
|
||||
<input name="send_balance" value="{$level_info.send_balance}" type="number" lay-verify="num" min="0" class="layui-input len-short">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">赠送优惠券:</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="coupon_list"></div>
|
||||
<button class="layui-btn" id="select_coupon">选择优惠券</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="word-aux">开卡礼包仅首次购卡发放</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="level_id" value="{$level_info.level_id}">
|
||||
|
||||
<div class="layui-card card-common">
|
||||
<div class="layui-card-body">
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="__STATIC__/ext/colorPicker/js/colorpicker.js"></script>
|
||||
<script type="text/javascript" src="STATIC_JS/coupon_select.js"></script>
|
||||
<script>
|
||||
var coupon_id = [], addCoupon;
|
||||
var form,colorpicker,upload;
|
||||
var coupon_select = new CouponSelect({
|
||||
tableElem:'#coupon_list',
|
||||
selectElem:'#select_coupon',
|
||||
selectedIds:'{$level_info.send_coupon}',
|
||||
})
|
||||
|
||||
layui.use(['form', 'laytpl', 'colorpicker', 'upload'], function() {
|
||||
form = layui.form;
|
||||
upload = layui.upload;
|
||||
colorpicker = layui.colorpicker;
|
||||
var laytpl = layui.laytpl,
|
||||
repeat_flag = false; //防重复标识
|
||||
form.render();
|
||||
|
||||
var logo_upload = new Upload({
|
||||
elem: '#imgUpload'
|
||||
});
|
||||
colorpicker.render({
|
||||
elem: '#bg_color', //绑定元素
|
||||
color: "{$level_info.bg_color}",
|
||||
done: function(color) {
|
||||
$("#bg_color_input").attr("value", color);
|
||||
}
|
||||
});
|
||||
|
||||
colorpicker.render({
|
||||
elem: '#level_text_color', //绑定元素
|
||||
color: "{$level_info.level_text_color}",
|
||||
done: function(color) {
|
||||
$("#level_text_color_input").attr("value", color);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 监听保存
|
||||
*/
|
||||
form.on('submit(save)', function(data) {
|
||||
data.field.send_coupon = coupon_select.getSelectedData().selectedIds.toString();
|
||||
if(repeat_flag) return false;
|
||||
|
||||
let level = {};
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('.price').val() != undefined){
|
||||
level[$(e).find('select').val()] = $(e).find('.price').val();
|
||||
}
|
||||
})
|
||||
if(JSON.stringify(level) == '{}'){
|
||||
layer.msg('请设置付费规则');
|
||||
return false;
|
||||
}
|
||||
|
||||
data.field.charge_rule = JSON.stringify(level);
|
||||
repeat_flag = true;
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/edit"),
|
||||
data: data.field,
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
success: function(res) {
|
||||
repeat_flag = false;
|
||||
if (res.code == 0) {
|
||||
layer.confirm('编辑成功', {
|
||||
title:'操作提示',
|
||||
btn: ['返回列表', '继续操作'],
|
||||
yes: function(index, layero){
|
||||
location.hash = ns.hash("supermember://shop/membercard/lists")
|
||||
layer.close(index);
|
||||
},
|
||||
btn2: function(index, layero) {
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}else{
|
||||
layer.msg(res.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* 表单验证
|
||||
*/
|
||||
form.verify({
|
||||
num: function(value) {
|
||||
var arrMen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrMen.length == 2) {
|
||||
val = arrMen[1];
|
||||
}
|
||||
|
||||
if (value == "") {
|
||||
return false;
|
||||
}
|
||||
if (value < 0 || val.length > 2) {
|
||||
return '请输入大于等于0的数,保留小数点后两位'
|
||||
}
|
||||
},
|
||||
fl: function(value, item) {
|
||||
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
|
||||
str = str.substring(0, str.length - 1);
|
||||
|
||||
if (isNaN(parseFloat(value))) {
|
||||
return "请设置" + str;
|
||||
}
|
||||
|
||||
if (value <= 0) {
|
||||
return str + "不能小于等于0";
|
||||
}
|
||||
|
||||
if (value > 100) {
|
||||
return str + "不能大于100";
|
||||
}
|
||||
|
||||
var arrMen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrMen.length == 2) {
|
||||
val = arrMen[1];
|
||||
}
|
||||
if (val.length > 2) {
|
||||
return str + "最多可保留两位小数";
|
||||
}
|
||||
},
|
||||
jf: function(value, item) {
|
||||
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
|
||||
str = str.substring(0, str.length - 1);
|
||||
|
||||
if (value < 0) {
|
||||
return str + "不能小于0";
|
||||
}
|
||||
|
||||
if (value > 100) {
|
||||
return str + "不能大于100";
|
||||
}
|
||||
|
||||
var arrMen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrMen.length == 2) {
|
||||
val = arrMen[1];
|
||||
}
|
||||
if (val.length > 2) {
|
||||
return str + "最多可保留两位小数";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
function back(){
|
||||
location.hash = ns.hash("supermember://shop/membercard/lists");
|
||||
}
|
||||
|
||||
//添加付费规则
|
||||
function addRule() {
|
||||
let level_select = {:json_encode($level_time, JSON_UNESCAPED_UNICODE)};
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('select').val() && $(e).find('select').val() != undefined){
|
||||
delete level_select[$(e).find('select').val()];
|
||||
}
|
||||
})
|
||||
|
||||
var select_html = '';
|
||||
for (let i in level_select){
|
||||
select_html += '<option value="'+i+'">'+level_select[i]+'</option>';
|
||||
}
|
||||
|
||||
var html = `
|
||||
<tr>
|
||||
<td>
|
||||
<div class="len-short">
|
||||
<select lay-filter="selectRule">
|
||||
${select_html}
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center">
|
||||
<input type="text" value="0" lay-verify="num" class="layui-input len-short price" placeholder="价格/元">
|
||||
</td>
|
||||
<td>
|
||||
<a href="javascript:void(0)" class="text-color" onclick="deleteRule(this)">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
$('#level-rule tbody').append(html);
|
||||
if($('#level-rule tr').length == 5){
|
||||
$('#add_rule_btn').hide()
|
||||
}
|
||||
form.render();
|
||||
form.on('select(selectRule)', function(data){
|
||||
let num = 0;
|
||||
$('#level-rule tr').each(function (i, e) {
|
||||
if($(e).find('select').val() == data.value){
|
||||
num++;
|
||||
$('.delete-rule').removeClass('delete-rule');
|
||||
$(e).find('select').addClass('delete-rule');
|
||||
}
|
||||
})
|
||||
if(num > 1) deleteRule($('.delete-rule'));
|
||||
});
|
||||
|
||||
form.verify({
|
||||
num: function (value) {
|
||||
|
||||
var arrmen = value.split(".");
|
||||
var val = 0;
|
||||
if (arrmen.length == 2) {
|
||||
val = arrmen[1];
|
||||
}
|
||||
|
||||
if (value == "") {
|
||||
return false;
|
||||
}
|
||||
if (value < 0 || val.length > 2) {
|
||||
return '请输入大于等于0的数,保留小数点后两位'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function deleteRule(obj) {
|
||||
$(obj).parents('tr').remove();
|
||||
if($('#level-rule tr').length < 5){
|
||||
$('#add_rule_btn').show()
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
302
addon/supermember/shop/view/membercard/index.html
Executable file
@@ -0,0 +1,302 @@
|
||||
<link rel="stylesheet" href="SUPERMEMBER_CSS/supermember.css">
|
||||
<style>
|
||||
.layui-card-body .content{width: 25%;padding-top: 15px}
|
||||
.layui-card-body .bottom-title{color: #909399;font-size: 14px;margin-top: 5px;}
|
||||
.load { display: flex; width: 100%; height: 400px; justify-content: center; align-items: center; }
|
||||
</style>
|
||||
|
||||
<div class="nav panel-content">
|
||||
<div class="nav-screen">
|
||||
<div class="screen-tab">
|
||||
<div class="tab-item bgcolorse activeTab" onclick="datePick(1, this);return false;">今日</div>
|
||||
<div class="tab-item" onclick="datePick(2, this);return false;">昨日</div>
|
||||
<div class="tab-item" onclick="datePick(7, this);return false;">近七天</div>
|
||||
</div>
|
||||
<form class="layui-form layui-show" lay-filter="order_list">
|
||||
<div class="screen-time layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<div class="layui-form-mid">-</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="content">
|
||||
<p class="title">售卡数</p>
|
||||
<p class="money" id="sale_num">0</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="title">售卡金额</p>
|
||||
<p class="money" id="sale_money">0</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="title">累计售卡数</p>
|
||||
<p class="money" id="total_num">0</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="title">累计售卡金额</p>
|
||||
<p class="money" id="total_money">0</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section-left">
|
||||
<div class="membership">
|
||||
<div>会员持卡总数量</div>
|
||||
<div id="has_card_member">0</div>
|
||||
</div>
|
||||
<div class="member-detail">
|
||||
<div class="load">
|
||||
<i style="font-size: 30px;" class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section-right">
|
||||
<div class="membership">
|
||||
<div>普通会员与会员卡用户占比</div>
|
||||
</div>
|
||||
<div class="load mycenter">
|
||||
<i style="font-size: 30px;" class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>
|
||||
</div>
|
||||
<div id="main" style="width:600px;height:600px;margin-top: 100px;margin-left: 100px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="card_list">
|
||||
{{# d.forEach(function(item, index){ }}
|
||||
<div class="member-detail-item vip-list" data-level-id="{{ item.level_id }}">
|
||||
<div class="base-data-name">
|
||||
{{# if (index == 0){ }}
|
||||
<span><img src="SUPERMEMBER_IMG/one.png"></span>
|
||||
{{# } else if(index == 1) { }}
|
||||
<span><img src="SUPERMEMBER_IMG/two.png"></span>
|
||||
{{# } else if(index == 2) { }}
|
||||
<span><img src="SUPERMEMBER_IMG/three.png"></span>
|
||||
{{# } else { }}
|
||||
<span>{{ index+1 }}</span>
|
||||
{{# } }}
|
||||
{{ item.level_name }}
|
||||
</div>
|
||||
<div class="base-data-name">{{ item.member_num }}</div>
|
||||
</div>
|
||||
{{# }) }}
|
||||
</script>
|
||||
<script src="SHOP_JS/echarts.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
var laytpl;
|
||||
var form;
|
||||
//初始化时间
|
||||
var startTime = new Date(new Date().setHours(0, 0, 0, 0));
|
||||
var endTime = new Date();
|
||||
//开始时间转换为时间戳
|
||||
var start_times = $('input[name="start_time"]').val()
|
||||
var start_time = new Date(start_times ? start_times : startTime).getTime()
|
||||
//结束时间转换为时间戳
|
||||
var end_times = $('input[name="end_time"]').val()
|
||||
var end_time = new Date(end_times ? end_times : endTime).getTime()
|
||||
$('.screen-tab .tab-item').click(function() {
|
||||
$(this).addClass("bgcolorse activeTab").siblings().removeClass('bgcolorse activeTab');
|
||||
start_times = $('input[name="start_time"]').val()
|
||||
end_times = $('input[name="end_time"]').val()
|
||||
sendAjax(start_times,end_times)
|
||||
});
|
||||
$('.vip-list').click(function(data){
|
||||
let levelId = $(this).attr('data-level-id')
|
||||
location.hash = ns.hash("shop/member/memberlist",{levelId:levelId});
|
||||
})
|
||||
function sendAjax(starTimes,enTimes){
|
||||
if(starTimes){start_times = starTimes}else{start_times = $('input[name="start_time"]').val()}
|
||||
if(enTimes){end_times = enTimes}else{end_times = $('input[name="end_time"]').val()}
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/salesStatistics"),
|
||||
data: {
|
||||
start_time: start_times,
|
||||
end_time: end_times
|
||||
},
|
||||
dataType: 'JSON', //服务器返回json格式数据
|
||||
type: 'POST', //http请求类型
|
||||
success: function(res) {
|
||||
if (res.code == 0) {
|
||||
$('#sale_num').html(res.data.sale_num);
|
||||
$('#sale_money').html(res.data.sale_money);
|
||||
} else {
|
||||
layer.msg(res.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
layui.use(['form', 'laydate', 'laytpl'], function() {
|
||||
var laydate = layui.laydate;
|
||||
form = layui.form;
|
||||
laytpl = layui.laytpl;
|
||||
form.render();
|
||||
//渲染时间
|
||||
laydate.render({
|
||||
elem: '#start_time',
|
||||
type: 'datetime',
|
||||
value: startTime,
|
||||
done: function(value, date, endDate) {
|
||||
$(".screen-tab .tab-item").removeClass("bgcolorse activeTab");
|
||||
start_times = value
|
||||
let start_time = ns.date_to_time(value);
|
||||
let end_time = ns.date_to_time($('#end_time').val());
|
||||
if(end_time > start_time){
|
||||
sendAjax(start_times,'')
|
||||
}else {
|
||||
$('#end_time').val('');
|
||||
}
|
||||
}
|
||||
});
|
||||
laydate.render({
|
||||
elem: '#end_time',
|
||||
type: 'datetime',
|
||||
value: endTime,
|
||||
done: function(value, date, endDate) {
|
||||
$(".screen-tab .tab-item").removeClass("bgcolorse activeTab");
|
||||
end_times = value
|
||||
|
||||
let start_time = ns.date_to_time($('#start_time').val());
|
||||
let end_time = ns.date_to_time(value);
|
||||
if(end_time > start_time){
|
||||
sendAjax('',end_times)
|
||||
}else {
|
||||
$('#start_time').val('');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
/**
|
||||
* 七天时间
|
||||
*/
|
||||
function datePick(date_num, event_obj) {
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
$(event_obj).addClass('selected');
|
||||
var now_date = new Date();
|
||||
|
||||
Date.prototype.Format = function(fmt, date_num) { //author: meizz
|
||||
this.setDate(this.getDate() - date_num);
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"H+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1
|
||||
.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[
|
||||
k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return fmt;
|
||||
};
|
||||
if (date_num == 2) {
|
||||
var now_time = new Date().Format("yyyy-MM-dd 23:59:59", date_num - 1); //当前日期
|
||||
} else {
|
||||
// var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
|
||||
var now_time = new Date().Format("yyyy-MM-dd HH:mm:ss", 0); //当前日期
|
||||
}
|
||||
|
||||
var before_time = new Date().Format("yyyy-MM-dd 00:00:00", date_num - 1); //前几天日期
|
||||
$("input[name=start_time]").val(before_time, 0);
|
||||
$("input[name=end_time]").val(now_time, date_num - 1);
|
||||
|
||||
}
|
||||
|
||||
var names = [];
|
||||
var nums = [];
|
||||
names.push('普通会员')
|
||||
|
||||
if($('#main').length) {
|
||||
var myChart = echarts.init(document.getElementById('main'));
|
||||
var option = {
|
||||
color: ['#ff7a14', '#47b73d', '#fcc36e', '#448ffd', "#228b22", "#00adac", "#000086", "#a963a1", "#cf675a", "#607e82"],//饼图颜色
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: '{a} <br/>{b}: {c} ({d}%)'
|
||||
},
|
||||
legend: {
|
||||
orient: 'horizontal',
|
||||
left: 'center',
|
||||
bottom: 260,
|
||||
itemGap: 50,
|
||||
data: names
|
||||
},
|
||||
series: [{
|
||||
width: 265,
|
||||
height: 265,
|
||||
top: 0,
|
||||
x: "center",
|
||||
name: '会员比例',
|
||||
type: 'pie',
|
||||
radius: ['50%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: '12',
|
||||
color: '#333'
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
data: nums
|
||||
}]
|
||||
};
|
||||
// myChart.setOption(option);
|
||||
}
|
||||
|
||||
getMemberCardStat()
|
||||
function getMemberCardStat(){
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/stat"),
|
||||
data: {
|
||||
start_time: start_times,
|
||||
end_time: end_times
|
||||
},
|
||||
dataType: 'JSON', //服务器返回json格式数据
|
||||
type: 'POST', //http请求类型
|
||||
success: function(res) {
|
||||
$('.mycenter').css("display", 'none')
|
||||
$("#total_num").html(res.total_num)
|
||||
$("#total_money").html(res.total_money)
|
||||
$("#has_card_member").html(res.has_card_member)
|
||||
|
||||
laytpl($('#card_list').html()).render(res.card_list, function (string) {
|
||||
$('.member-detail').html(string);
|
||||
});
|
||||
|
||||
nums.push({
|
||||
value: res.no_has_card_member,
|
||||
name: '普通会员'
|
||||
});
|
||||
|
||||
for(var i=0;i<res.card_list.length;i++){
|
||||
names.push(res.card_list[i].level_name)
|
||||
nums.push({
|
||||
value: res.card_list[i].member_num,
|
||||
name: res.card_list[i].level_name
|
||||
});
|
||||
}
|
||||
myChart.setOption(option);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
316
addon/supermember/shop/view/membercard/lists.html
Executable file
@@ -0,0 +1,316 @@
|
||||
<style>
|
||||
.recommend-mark{color: #fff;line-height: 1;padding: 3px 6px;border-radius: 3px;font-size: 12px;margin-right: 3px;}
|
||||
.layui-layout-admin .screen{margin-bottom: 15px;}
|
||||
.layui-table-box, .layui-table-header, .layui-table-header .layui-table-cell { overflow: unset; }
|
||||
.prompt-block .prompt-box {cursor: default}
|
||||
.prompt-block .prompt-box a {cursor: pointer}
|
||||
</style>
|
||||
|
||||
<div class="single-filter-box" style="display: block;">
|
||||
<button class="layui-btn" onclick="addLevel()">添加会员卡</button>
|
||||
<p class="layui-btn" onclick="location.hash = ns.hash('supermember://shop/membercard/agreement')">开卡协议</p>
|
||||
</div>
|
||||
|
||||
<!-- 搜索框 -->
|
||||
|
||||
<div class="screen layui-collapse" lay-filter="selection_panel">
|
||||
<div class="layui-colla-item">
|
||||
<form class="layui-colla-content layui-form layui-show">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">会员卡名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="search_text" placeholder="请输入会员卡名称" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table id="level_list" lay-filter="level_list"></table>
|
||||
|
||||
<!-- 操作 -->
|
||||
<script type="text/html" id="operation">
|
||||
<div class="table-btn">
|
||||
{{# if(d.charge_type == 0){ }}
|
||||
{{# if(d.is_recommend == 0){ }}
|
||||
<a class="layui-btn" lay-event="recommend">推荐</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn" lay-event="cancelRecommend">取消推荐</a>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
<a class="layui-btn" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn" lay-event="del">删除</a>
|
||||
{{# if(d.status == 0){ }}
|
||||
<a class="layui-btn" lay-event="sale">发售</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn" lay-event="offsale">下架</a>
|
||||
{{# } }}
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
layui.use(['form'], function() {
|
||||
var table,
|
||||
form = layui.form,
|
||||
repeat_flag = false; //防重复标识
|
||||
|
||||
table = new Table({
|
||||
elem: '#level_list',
|
||||
url: ns.url("supermember://shop/membercard/lists"),
|
||||
page:false,
|
||||
cols: [
|
||||
[{
|
||||
field: 'level_name',
|
||||
title: '会员卡名称',
|
||||
width: '15%',
|
||||
unresize: 'false',
|
||||
templet: function(data){
|
||||
if (data.is_recommend) {
|
||||
return '<span class="recommend-mark bg-color">推荐</span>' + data.level_name
|
||||
} else {
|
||||
return data.level_name;
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '付费类型',
|
||||
unresize: 'false',
|
||||
width: '10%',
|
||||
templet: function (data) {
|
||||
var str = '';
|
||||
if (data.charge_type == 1) {
|
||||
str = '<span style="color: green">充值卡</span>';
|
||||
} else if (data.charge_type == 0) {
|
||||
str = '<span style="color: red">付费卡</span>';
|
||||
}
|
||||
return str;
|
||||
}
|
||||
},{
|
||||
field: 'growth',
|
||||
title: '价格',
|
||||
width: '16%',
|
||||
unresize: 'false',
|
||||
templet: function(data){
|
||||
var charge_rule = JSON.parse(data.charge_rule),
|
||||
price = '<div class="level-equity">';
|
||||
if (charge_rule.week) price += '<div>周卡' + charge_rule.week + '元</div>';
|
||||
if (charge_rule.month) price += '<div>月卡' + charge_rule.month + '元</div>';
|
||||
if (charge_rule.quarter) price += '<div>季卡' + charge_rule.quarter + '元</div>';
|
||||
if (charge_rule.year) price += '<div>年卡' + charge_rule.year + '元</div>';
|
||||
price += '</div>'
|
||||
return price;
|
||||
}
|
||||
},{
|
||||
field: '',
|
||||
title: '权益',
|
||||
width: '18%',
|
||||
unresize: 'false',
|
||||
templet: function (data) {
|
||||
var text = '<div class="level-equity">';
|
||||
if (data.is_free_shipping == 1) text += '<div>购物享商品包邮</div>';
|
||||
if (data.consume_discount != 100) text += '<div>购物享'+ (data.consume_discount / 10) +'折优惠</div>';
|
||||
if (data.point_feedback > 0) text += '<div>购物享'+ data.point_feedback +'倍积分回馈</div>';
|
||||
text += '</div>';
|
||||
return text;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'member_num',
|
||||
title: '持有人数',
|
||||
width: '8%',
|
||||
unresize: 'false',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
width: '10%',
|
||||
unresize: 'false',
|
||||
templet: function (data) {
|
||||
return data.status == 1 ? '发售中' : '已下架';
|
||||
}
|
||||
},{
|
||||
title: '操作',
|
||||
unresize: 'false',
|
||||
toolbar: '#operation',
|
||||
align:'right'
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
/**
|
||||
* 工具栏操作,编辑、删除
|
||||
*/
|
||||
table.tool(function(obj) {
|
||||
var data = obj.data,
|
||||
event = obj.event;
|
||||
|
||||
switch (event) {
|
||||
case 'edit':
|
||||
location.hash = ns.hash("supermember://shop/membercard/edit?id=" + data.level_id);
|
||||
break;
|
||||
case 'del':
|
||||
delMemberLevel(data.level_id);
|
||||
break;
|
||||
case 'sale':
|
||||
saleMemberCard(data.level_id);
|
||||
break;
|
||||
case 'offsale':
|
||||
offsaleMemberCard(data.level_id);
|
||||
break;
|
||||
case 'recommend':
|
||||
recommendMemberCard(data.level_id, 1);
|
||||
break;
|
||||
case 'cancelRecommend':
|
||||
recommendMemberCard(data.level_id, 0);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(search)', function(data) {
|
||||
table.reload( {
|
||||
page: {
|
||||
curr: 1
|
||||
},
|
||||
where: data.field
|
||||
});
|
||||
});
|
||||
|
||||
// 删除方法
|
||||
function delMemberLevel(level_id) {
|
||||
if(repeat_flag) return false;
|
||||
repeat_flag = true;
|
||||
|
||||
layer.confirm('确定要删除该会员卡吗?', function(index) {
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: ns.url("supermember://shop/membercard/delete"),
|
||||
data: {level_id},
|
||||
dataType: 'JSON',
|
||||
success: function(res) {
|
||||
layer.msg(res.message);
|
||||
repeat_flag = false;
|
||||
|
||||
if(res.code == 0){
|
||||
table.reload();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}, function () {
|
||||
layer.close();
|
||||
repeat_flag = false;
|
||||
});
|
||||
}
|
||||
|
||||
//使失效
|
||||
function offsaleMemberCard(level_id) {
|
||||
layer.confirm('此操作不会影响到已购卡用户!确定下架该会员卡吗?', function(index) {
|
||||
if (repeat_flag) return;
|
||||
repeat_flag = true;
|
||||
layer.close(index);
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/status"),
|
||||
data: {
|
||||
level_id: level_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function(res) {
|
||||
layer.msg(res.message);
|
||||
repeat_flag = false;
|
||||
if (res.code == 0) {
|
||||
table.reload();
|
||||
}
|
||||
}
|
||||
});
|
||||
}, function() {
|
||||
layer.close();
|
||||
repeat_flag = false;
|
||||
});
|
||||
}
|
||||
|
||||
function saleMemberCard(level_id) {
|
||||
layer.confirm('确定发售该会员卡吗?', function(index) {
|
||||
if (repeat_flag) return;
|
||||
repeat_flag = true;
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/status"),
|
||||
data: {
|
||||
status: 1,
|
||||
level_id: level_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function(res) {
|
||||
layer.msg(res.message);
|
||||
repeat_flag = false;
|
||||
if (res.code == 0) {
|
||||
table.reload();
|
||||
}
|
||||
}
|
||||
});
|
||||
}, function() {
|
||||
layer.close();
|
||||
repeat_flag = false;
|
||||
});
|
||||
}
|
||||
|
||||
function recommendMemberCard(level_id, recommend) {
|
||||
let message = recommend == 1 ? '设置后前端推荐开卡处将默认展示该卡,是否继续设置?' : '是否取消推荐?';
|
||||
layer.confirm(message, function(index) {
|
||||
if (repeat_flag) return;
|
||||
repeat_flag = true;
|
||||
layer.close(index);
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("supermember://shop/membercard/recommend"),
|
||||
data: {
|
||||
level_id: level_id,
|
||||
recommend: recommend
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function(res) {
|
||||
layer.msg('设置成功');
|
||||
repeat_flag = false;
|
||||
if (res.code == 0) {
|
||||
table.reload();
|
||||
}
|
||||
}
|
||||
});
|
||||
}, function() {
|
||||
layer.close();
|
||||
repeat_flag = false;
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 点击跳转添加会员卡页面
|
||||
*/
|
||||
function addLevel() {
|
||||
location.hash = ns.hash("supermember://shop/membercard/add");
|
||||
}
|
||||
|
||||
function showDemo(){
|
||||
layer.open({
|
||||
title: false,
|
||||
type: 1,
|
||||
area: ['760px', '570px'],
|
||||
content: '<img src="SUPERMEMBER_IMG/demo.png">'
|
||||
})
|
||||
}
|
||||
</script>
|
||||
277
addon/supermember/shop/view/membercard/order.html
Executable file
@@ -0,0 +1,277 @@
|
||||
<link rel="stylesheet" href="SUPERMEMBER_CSS/order_list.css"/>
|
||||
<div class="layui-card card-common card-brief panel-content">
|
||||
<div class="layui-card-header simple">
|
||||
<span class="card-title">购卡概况</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="content">
|
||||
<p class="title">累计购卡人数</p>
|
||||
<p class="money">{$buyer_num}</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="title">累计购卡金额</p>
|
||||
<p class="money">{$order_money}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="screen layui-collapse" lay-filter="selection_panel">
|
||||
<div class="layui-colla-item">
|
||||
<form class="layui-form layui-colla-content layui-form layui-show" lay-filter="order_list" action="javascript:;">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">订单号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="order_no" placeholder="请输入订单号" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">购买人昵称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="nickname" placeholder="请输入购买人昵称" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">支付时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<div class="layui-form-mid">-</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(7, this);return false;">近7天</button>
|
||||
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(30, this);return false;">近30天</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab table-tab " lay-filter="order_tab">
|
||||
<div class="layui-tab-content">
|
||||
<div id="order_list"></div>
|
||||
</div>
|
||||
<div id="order_page"></div>
|
||||
</div>
|
||||
|
||||
<script src="SUPERMEMBER_JS/order_list.js"></script>
|
||||
<script>
|
||||
var form,laypage,element,laydate;
|
||||
var is_refresh = false;
|
||||
layui.use(['laypage','laydate','form', 'element'], function(){
|
||||
form = layui.form;
|
||||
laypage = layui.laypage;
|
||||
element = layui.element;
|
||||
laydate = layui.laydate;
|
||||
form.render();
|
||||
|
||||
// 支付时间
|
||||
laydate.render({
|
||||
elem: '#start_time'
|
||||
,type: 'datetime'
|
||||
,change: function(value, date, endDate){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
}
|
||||
});
|
||||
laydate.render({
|
||||
elem: '#end_time'
|
||||
,type: 'datetime'
|
||||
,change: function(value, date, endDate){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
}
|
||||
});
|
||||
|
||||
//监听Tab切换,以改变地址hash值
|
||||
element.on('tab(order_tab)', function(){
|
||||
$(".all-selected-checkbox input").prop("checked",false);
|
||||
var hash_data = getHashList();
|
||||
hash_data.page = 1;
|
||||
setHashOrderList(hash_data);
|
||||
});
|
||||
|
||||
//监听筛选事件
|
||||
form.on('submit(search)', function(data){
|
||||
is_refresh = true;
|
||||
data.field.page = 1;
|
||||
setHashOrderList(data.field);
|
||||
return false;
|
||||
});
|
||||
getHashData();
|
||||
getOrderList();//筛选
|
||||
});
|
||||
|
||||
function setHashOrderList(data){
|
||||
localStorage.setItem('formSubmit','search'); // 表单搜索标识,防止页面重新加载
|
||||
var hash = ['url=supermember://shop/membercard/order'];
|
||||
for (let key in data) {
|
||||
if (data[key] != '' && data[key] != 'all') {
|
||||
hash.push(`${key}=${data[key]}`)
|
||||
}
|
||||
}
|
||||
location.hash = hash.join('&');
|
||||
getOrderList();
|
||||
}
|
||||
|
||||
var order = new Order();
|
||||
function getOrderList(){
|
||||
var url = ns.url("supermember://shop/membercard/order", getHashArr().join('&'));
|
||||
$.ajax({
|
||||
type : 'get',
|
||||
dataType: 'json',
|
||||
url :url,
|
||||
success : function(res){
|
||||
if(res.code == 0){
|
||||
order.setData(res.data);
|
||||
$("#order_list").html(order.fetch());
|
||||
form.render();
|
||||
|
||||
laypage_util = new Page({
|
||||
elem: 'order_page',
|
||||
count: res.data.count,
|
||||
curr: getHashPage(),
|
||||
limit:getHashData()['page_size'] || 10,
|
||||
callback: function(obj){
|
||||
var hash_data = getHashData();
|
||||
hash_data.page = obj.curr;
|
||||
hash_data.page_size = obj.limit;
|
||||
setHashOrderList(hash_data);
|
||||
}
|
||||
});
|
||||
|
||||
}else{
|
||||
layer.msg(res.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 通过hash获取页数
|
||||
function getHashPage(){
|
||||
var page = 1;
|
||||
var startTime = '';
|
||||
var endTime = '';
|
||||
var hash_arr = getHashArr();
|
||||
$.each(hash_arr,function(index, itemobj){
|
||||
var item_arr = itemobj.split("=");
|
||||
if(item_arr.length == 2){
|
||||
switch(item_arr[0]){
|
||||
case "page":
|
||||
page = item_arr[1];
|
||||
break;
|
||||
case "start_time":
|
||||
startTime = ns.date_to_time(item_arr[1].split("%")[0]);
|
||||
break;
|
||||
case "end_time":
|
||||
endTime = ns.date_to_time(item_arr[1].split("%")[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var _time = (endTime - startTime) / (24 * 60 * 60);
|
||||
if (_time == 6) {
|
||||
$(".date-picker-btn-seven").addClass("selected");
|
||||
$(".date-picker-btn-thirty").removeClass("selected");
|
||||
} else if (_time == 29) {
|
||||
$(".date-picker-btn-thirty").addClass("selected");
|
||||
$(".date-picker-btn-seven").removeClass("selected");
|
||||
} else {
|
||||
$(".date-picker-btn-seven").removeClass("selected");
|
||||
$(".date-picker-btn-thirty").removeClass("selected");
|
||||
}
|
||||
return page;
|
||||
}
|
||||
|
||||
//从hash中获取数据
|
||||
function getHashData(){
|
||||
var hash_arr = getHashArr();
|
||||
var form_json = {
|
||||
"start_time" : "",
|
||||
"end_time" : "",
|
||||
"nickname" : "",
|
||||
"order_no" : "",
|
||||
'page_size':'',
|
||||
"page" : ""
|
||||
};
|
||||
if(hash_arr.length > 0){
|
||||
$.each(hash_arr,function(index, itemobj){
|
||||
var item_arr = itemobj.split("=");
|
||||
if(item_arr.length == 2){
|
||||
$.each(form_json,function(key, form_val){
|
||||
if(item_arr[0] == key){
|
||||
form_json[key] = item_arr[1];
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return form_json;
|
||||
}
|
||||
function getHashList(){
|
||||
var hash_arr = getHashArr();
|
||||
var form_json = {
|
||||
"start_time" : "",
|
||||
"end_time" : "",
|
||||
"nickname" : "",
|
||||
"order_no" : "",
|
||||
'page_size':'',
|
||||
"page" : ""
|
||||
};
|
||||
if(hash_arr.length > 0){
|
||||
$.each(hash_arr,function(index, itemobj){
|
||||
var item_arr = itemobj.split("=");
|
||||
if(item_arr.length == 2){
|
||||
$.each(form_json,function(key, form_val){
|
||||
if(item_arr[0].indexOf(key) != "-1"){
|
||||
form_json[key] = item_arr[1];
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return form_json;
|
||||
}
|
||||
|
||||
/**
|
||||
* 七天时间
|
||||
*/
|
||||
function datePick(date_num,event_obj){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
$(event_obj).addClass('selected');
|
||||
Date.prototype.Format = function (fmt,date_num) { //author: meizz
|
||||
this.setDate(this.getDate()-date_num);
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"H+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return fmt;
|
||||
};
|
||||
var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
|
||||
var before_time = new Date().Format("yyyy-MM-dd 00:00:00",date_num-1);//前几天日期
|
||||
$("input[name=start_time]").val(before_time,0);
|
||||
$("input[name=end_time]").val(now_time,date_num-1);
|
||||
}
|
||||
</script>
|
||||
122
addon/supermember/shop/view/membercard/order_detail.html
Executable file
@@ -0,0 +1,122 @@
|
||||
<style>
|
||||
.layui-colla-content li { line-height: 30px;}
|
||||
</style>
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">订单详情</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">订单号:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.order_no}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">交易号:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.out_trade_no}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">订单类型:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.order_type == 1 ? '开卡' : '续费'}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">订单状态:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">
|
||||
{switch name="$order.data.order_status"}
|
||||
{case value="0"}待支付{/case}
|
||||
{case value="1"}已支付{/case}
|
||||
{case value="-1"}已关闭{/case}
|
||||
{/switch}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">客户头像:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">
|
||||
<img class="member_img" src="{:img($order.data.headimg)}" width="40px" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">客户昵称:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.nickname}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">会员卡名称:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.level_name}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">购买时长:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">
|
||||
{switch name="$order.data.period_unit"}
|
||||
{case value="week"}一周{/case}
|
||||
{case value="month"}一月{/case}
|
||||
{case value="quarter"}一季{/case}
|
||||
{case value="year"}一年{/case}
|
||||
{/switch}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">订单金额:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.order_money}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">下单时间:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{:time_to_date($order.data.create_time)}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $order.data.order_status eq 1}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">支付方式:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{$order.data.pay_type_name}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label mid">支付时间:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<p class="input-text len-mid">{:date('Y-m-d H:i:s', $order.data.pay_time)}</p>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn layui-btn-primary" onclick="backSuperMemberCardIndex()">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function backSuperMemberCardIndex() {
|
||||
location.hash = ns.hash("supermember://shop/membercard/order");
|
||||
}
|
||||
</script>
|
||||
80
addon/supermember/shop/view/public/css/order_list.css
Executable file
@@ -0,0 +1,80 @@
|
||||
.layui-table {margin-top: 15px;}
|
||||
.layui-table thead tr {background-color: #F8F6F9;}
|
||||
.layui-table th {border-width: 0; font-size: 14px!important;}
|
||||
.layui-table td {padding: 8px 15px;}
|
||||
.layui-table .header-row {border-top: 1px solid #e6e6e6;background: #f7f7f7;}
|
||||
.layui-table .header-row:hover{background: #f7f7f7 !important;}
|
||||
.separation-row hr {margin: 0;}
|
||||
|
||||
/* .layui-layout-admin .layui-body{min-width:1100px} */
|
||||
/*.date-picker-btn.selected{background-color:#0d73f9;color:#fff}*/
|
||||
.layui-table td,.layui-table th,.layui-table-fixed-r,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-color:#f1f1f1 !important;}
|
||||
.layui-table thead th{border-bottom:none;padding-left:0;padding-right:0;}
|
||||
.order-list-table .separation-row td{padding:10px 20px;border: 0;}
|
||||
.order-list-table .separation-row:hover{background-color: #fff;}
|
||||
.order-list-table .header-row td{padding: 8px 15px!important;}
|
||||
.order-list-table .header-row td:nth-child(1){border-right: 0;}
|
||||
.order-list-table .header-row td:nth-child(2){text-align:center;border-left: 0;}
|
||||
.order-list-table .header-row span{vertical-align:middle}
|
||||
.order-list-table .header-row td .order-item-header{text-align:left;color:#333;}
|
||||
.order-list-table .header-row td .order-item-header.more{cursor: pointer;overflow: hidden;position: relative;}
|
||||
.order-list-table .header-row td .more-operation{display: none;font-size: 14px;line-height: 20px;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 8px 0 rgba(200,201,204,.5);position: absolute;z-index: 2000;padding: 10px;top: 28px;transform: translateX(10px);left: -12px;width: 200px;}
|
||||
.order-list-table .header-row td .more-operation:before{left: 8px;top: -14px;border: solid transparent;content: "";height: 0;width: 0;position: absolute;pointer-events: none;border-color: transparent;border-bottom-color: #fff;border-width: 8px;}
|
||||
.order-list-table .header-row td .more-operation span{color:#333;}
|
||||
|
||||
.order-list-table .checkbox-all .layui-table-cell{padding:0;text-align:center;}
|
||||
.order-list-table .product-info .layui-table-cell{padding:0 5px}
|
||||
.order-list-table .content-row:hover{background-color:#fff !important;}
|
||||
.order-list-table .content-row .product-info{border-right: 0;}
|
||||
.order-list-table .content-row .product-info .img-block{width:60px;height:60px;float:left;border:1px solid #e2e2e2;display: flex;align-items: center;justify-content: center;}
|
||||
.order-list-table .content-row .product-info .img-block>img{max-width:100%;max-height:100%;}
|
||||
.order-list-table .content-row .product-info .info{margin-left:70px}
|
||||
.order-list-table .content-row .product-info .info p{color:#8e8c8c;font-size:12px}
|
||||
.order-list-table .content-row .order-price{border-left: 0;}
|
||||
.order-list-table .content-row .product-list{border-right-width:1px}
|
||||
.order-list-table .content-row .product-list p{font-size:12px}
|
||||
.order-list-table .content-row .transaction-status{line-height: 24px;}
|
||||
.order-list-table .content-row .buyers{line-height: 24px;}
|
||||
.order-list-table .operation a{font-size: 14px;}
|
||||
.order-list-table .text-tile{color:rgb(164,164,164);}
|
||||
.order-no-data-block ul{width:200px;margin:20px auto; padding-bottom: 20px;}
|
||||
.order-no-data-block ul li{text-align:center;color:#c2c2c2}
|
||||
.order-no-data-block ul li:first-child{height:70px;line-height:70px}
|
||||
.order-no-data-block ul li:first-child i{font-size:35px}
|
||||
.footer-row{border:1px solid #f2f2f2}
|
||||
.screen{margin-top: 0;}
|
||||
|
||||
/*.order-money span {color: red;}*/
|
||||
#order_page {text-align: right;}
|
||||
|
||||
.table-tab .layui-tab-content {padding-top: 0;}
|
||||
.line-hiding{ cursor : default; -webkit-line-clamp: 2 !important;}
|
||||
.address_box{width:87%; display: inline-block}
|
||||
.address_input{width: 1px;height: 0px;overflow: hidden;border: 0px}
|
||||
.screen .layui-colla-title .layui-colla-icon{color:var(--base-color) !important}
|
||||
.screen .layui-colla-title .text-color{position: absolute;right: 45px;font-size: 14px;padding: 5px;}
|
||||
.operation .operation-type{display: block;}
|
||||
.operation .operation-type .layui-btn{display: inline;text-align: left;line-height: 23px;padding: 0px;margin: 0px;padding-left:8px;}
|
||||
.layui-colla-title .put-open{position: absolute;right: 40px;padding: 5px;color: var(--base-color) ;}
|
||||
|
||||
/*订单顶部的一行*/
|
||||
.order-list-top-line{justify-content:flex-end;}
|
||||
.order-list-top-line a{padding-right: 0px !important;}
|
||||
|
||||
.order-list-table .order-goods{align-items: flex-start !important;}
|
||||
.order-list-table .order-goods .info{margin-top: 3px;}
|
||||
.order-list-table .order-goods , .order-list-table .order-goods-item{display: flex;align-items: center;}
|
||||
.order-list-table .order-goods .img-block{margin-right: 10px;width: 60px;height: 60px;flex-shrink: 0;border: 1px solid #e2e2e2;display: flex;align-items: center;justify-content: center;}
|
||||
.order-list-table .order-goods .img-block{width: 105px;height: 63px;}
|
||||
.order-list-table .order-goods .img-block img{max-width: 100%;max-height: 100%;}
|
||||
.order-list-table .order-goods-item{margin-top: 10px;}
|
||||
.content-row .order-price {
|
||||
border-left: 0;
|
||||
}
|
||||
.content-row .card-info {
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
.layui-card-body .content{width: 50%;}
|
||||
.layui-layout-admin .screen{margin-bottom: 15px;}
|
||||
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
|
||||
29
addon/supermember/shop/view/public/css/supermember.css
Executable file
@@ -0,0 +1,29 @@
|
||||
.nav{background: #fff;padding: 20px;}
|
||||
.nav-bottom{display: flex;justify-content: space-between;}
|
||||
.flex-box{width: 24%;height: 85px;margin-right: 20px;display: flex;flex-direction: column;justify-content: space-between;align-items: center;padding: 20px 0;border-radius: 2px;}
|
||||
.flex-box:nth-child(4){margin-right:0px;}
|
||||
.title{font-size: 18px;}
|
||||
.num{font-size: 30px;font-weight: 400;text-align: center;color: #333;}
|
||||
.section{display: flex;justify-content: space-between;}
|
||||
.section-left{width: 830px;height: 600px;background: #fff;margin: 16px 20px 0 0;position: relative;}
|
||||
.member-detail{margin: 0 30px;height: 510px;overflow-y: auto;}
|
||||
.member-detail-item{padding: 010px;line-height: 50px;border-bottom: 1px solid #f8f8f8;display: flex;justify-content: space-between;}
|
||||
.member-detail-item .base-data-name span{display: inline-block;margin-right: 15px;}
|
||||
.section-right{width: 830px;height: 600px;background: #fff;margin-top: 16px;}
|
||||
.membership{font-size: 16px;display: flex;flex-direction: row;justify-content: space-between;align-items: center;}
|
||||
.no-data{font-size: 16px;font-weight: 100;text-align: center;margin-top: 300px;}
|
||||
.bottom{display: flex;justify-content: space-between;border-top:1px rgb(247,247,247)solid ;position: relative;bottom: -180px;}
|
||||
.card-number{font-size: 16px;font-weight: 100;margin:20px 30px 10px 30px;justify-content: space-around;}
|
||||
.membership{font-size: 16px;padding: 15px 20px;border-bottom: 1px solid #f8f8f8;}
|
||||
.membership-percent{font-size: 16px;margin-top: 20px;margin-left: 30px;}
|
||||
.layui-layout-admin .layui-body .body-content{background-color: #f8f8f8 !important;}
|
||||
.nav-screen{display: flex;flex-direction: row;}
|
||||
.screen-tab{display: flex;flex-direction: row;align-items: center;margin-bottom: 20px;}
|
||||
.screen-time{margin-left: 20px;}
|
||||
.screen-tab .tab-item{border: 1px solid #e6e6e6;border-right: 0;width: 60px;height: 30px;line-height: 30px;text-align: center;}
|
||||
.screen-tab .tab-item:last-of-type{border-right: 1px solid #e6e6e6;}
|
||||
.tab-item:hover, .timecursor:hover, .member-detail-item{cursor:pointer}
|
||||
.tab-item{position: relative;}
|
||||
.bgcolorse{background: var(--base-color);color: #fff;}
|
||||
.activeTab:after{content: "";display: block;position: absolute;border: 1px solid var(--base-color);top: 0;left: 0;right: 0;bottom: 0;}
|
||||
.layui-layout-admin .layui-body .body-content{padding: 0px !important;background-color: transparent !important;}
|
||||
BIN
addon/supermember/shop/view/public/img/demo.png
Executable file
|
After Width: | Height: | Size: 250 KiB |
BIN
addon/supermember/shop/view/public/img/member_card.png
Executable file
|
After Width: | Height: | Size: 394 B |
BIN
addon/supermember/shop/view/public/img/member_card_new.png
Executable file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
addon/supermember/shop/view/public/img/member_card_select.png
Executable file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
addon/supermember/shop/view/public/img/one.png
Executable file
|
After Width: | Height: | Size: 839 B |
BIN
addon/supermember/shop/view/public/img/three.png
Executable file
|
After Width: | Height: | Size: 832 B |
BIN
addon/supermember/shop/view/public/img/two.png
Executable file
|
After Width: | Height: | Size: 910 B |
263
addon/supermember/shop/view/public/js/order_list.js
Executable file
@@ -0,0 +1,263 @@
|
||||
/**
|
||||
* 渲染订单列表
|
||||
*/
|
||||
Order = function () {};
|
||||
|
||||
/**
|
||||
* 设置数据集
|
||||
*/
|
||||
Order.prototype.setData = function (data) {
|
||||
Order.prototype.data = data;
|
||||
};
|
||||
|
||||
/**
|
||||
* 列名数据
|
||||
*/
|
||||
Order.prototype.cols = [
|
||||
{
|
||||
type: 'checkbox',
|
||||
fixed: 'left',
|
||||
width: '3%',
|
||||
merge: true,
|
||||
template: function (orderitem, order) {
|
||||
var json = {}
|
||||
json.order_id = order.order_id;
|
||||
json.order_no = order.order_no;
|
||||
var h = '<div class="sub-selected-checkbox" data-json='+ JSON.stringify(json) +' data-id='+ order.order_id +' >';
|
||||
h += '<input type="checkbox" lay-skin="primary" lay-filter="subCheckbox" name="" >';
|
||||
h += '</div>';
|
||||
return h;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '<span>会员卡</span>',
|
||||
width: "25%",
|
||||
className: "card-info",
|
||||
template: function (orderitem, order) {
|
||||
var h = '';
|
||||
h += '<div class="order-goods">';
|
||||
h += '<div class="info">';
|
||||
h += '<div>'+orderitem.level_name+'</div><br>';
|
||||
h += '</div>';
|
||||
h += '</div>';
|
||||
|
||||
return h;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "购买时长",
|
||||
width: "8%",
|
||||
align: "right",
|
||||
className: "order-price",
|
||||
template: function (orderitem, order) {
|
||||
|
||||
var str = '';
|
||||
switch (orderitem.period_unit) {
|
||||
case 'week':
|
||||
str = '一周';
|
||||
break;
|
||||
case 'month':
|
||||
str = '一月';
|
||||
break;
|
||||
case 'quarter':
|
||||
str = '一季';
|
||||
break;
|
||||
case 'year':
|
||||
str = '一年';
|
||||
break;
|
||||
}
|
||||
|
||||
var h = '<div style="padding-right: 15px;">';
|
||||
h += '<div>';
|
||||
h += '<span>'+str+'</span>';
|
||||
h += '</div>';
|
||||
h += '</div>';
|
||||
return h;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "订单类型",
|
||||
width: "10%",
|
||||
align: "center",
|
||||
className: "give_gift",
|
||||
template: function (orderitem, order) {
|
||||
|
||||
var h = '';
|
||||
h += '<div>'+(orderitem.order_type == 1 ? '开卡' : '续费')+'</div>';
|
||||
return h;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "订单金额(元)",
|
||||
width: "8%",
|
||||
align: "right",
|
||||
className: "order-money",
|
||||
merge: true,
|
||||
template: function (orderitem, order) {
|
||||
var h = '<div style="padding-right: 15px;">';
|
||||
h += '<span>' + orderitem.order_money + '</span>';
|
||||
h += '</div>';
|
||||
return h;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "买家",
|
||||
width: "10%",
|
||||
align: "center",
|
||||
className: "member",
|
||||
template: function (orderitem, order) {
|
||||
var h = '<div style="text-align: center;">';
|
||||
h += '<a href="' + ns.href("shop/member/editmember", {member_id: orderitem.buyer_id}) + '" target="_blank" class="multi-line-hiding text-color-sub text-color">' +orderitem.nickname + '</a>';
|
||||
h += '';
|
||||
h += '</div>';
|
||||
return h;
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
title: "支付状态",
|
||||
width: "10%",
|
||||
align: "center",
|
||||
className: "transaction-status",
|
||||
merge: true,
|
||||
template: function (orderitem, order) {
|
||||
var html = '<div>' + (order.order_status == 1 ? '已支付' : order.order_status == 0 ? '待支付' : '已关闭') + '</div>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
title : "支付时间",
|
||||
width : "15%",
|
||||
align : "center",
|
||||
className : "create-time",
|
||||
merge : true,
|
||||
template : function(orderitem,order){
|
||||
return '<div>' + ns.time_to_date(order.pay_time) + '</div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
align: "right",
|
||||
className: "operation",
|
||||
width:"11%",
|
||||
merge: true,
|
||||
template: function (orderitem, order) {
|
||||
var html='';
|
||||
html += '<div>';
|
||||
html += '<a class="layui-btn text-color" href="'+ns.href("supermember://shop/membercard/orderdetail", {order_id: orderitem.order_id}) +'">详情</a>';
|
||||
html += '</div>';
|
||||
return html;
|
||||
|
||||
}
|
||||
}
|
||||
];
|
||||
/**
|
||||
* 渲染表头
|
||||
*/
|
||||
Order.prototype.header = function (hasThead) {
|
||||
var colgroup = '<colgroup>';
|
||||
var thead = '';
|
||||
if (hasThead) thead = '<thead><tr>';
|
||||
|
||||
for (var i = 0; i < this.cols.length; i++) {
|
||||
var align = this.cols[i].align ? "text-align:" + this.cols[i].align : "";
|
||||
|
||||
colgroup += '<col width="' + this.cols[i].width + '">';
|
||||
if (hasThead) {
|
||||
thead += '<th style="' + align + '" class="' + (this.cols[i].className || "") + '">';
|
||||
thead += '<div class="layui-table-cell">';
|
||||
if(this.cols[i].type){
|
||||
thead += '<div class="all-selected-checkbox">';
|
||||
thead += '<input type="checkbox" lay-skin="primary" lay-filter="allCheckbox" name="">';
|
||||
thead += '</div>';
|
||||
}else{
|
||||
thead += this.cols[i].title;
|
||||
}
|
||||
thead += '</div>';
|
||||
thead += '</th>';
|
||||
}
|
||||
}
|
||||
colgroup += '</colgroup>';
|
||||
if (hasThead) thead += '</tr></thead>';
|
||||
return colgroup + thead;
|
||||
};
|
||||
|
||||
/**
|
||||
* 渲染内容
|
||||
*/
|
||||
Order.prototype.tbody = function () {
|
||||
|
||||
var tbody = '<tbody>';
|
||||
for (var i = 0; i < this.data.list.length; i++) {
|
||||
|
||||
var order = this.data.list[i];
|
||||
if (i > 0) {
|
||||
//分割行
|
||||
tbody += '<tr class="separation-row">';
|
||||
tbody += '<td colspan="' + this.cols.length + '"></td>';
|
||||
tbody += '</tr>';
|
||||
}
|
||||
|
||||
//订单项头部
|
||||
tbody += '<tr class="header-row">';
|
||||
tbody += '<td colspan="9">';
|
||||
tbody += '<span class="order-item-header" style="margin-right:10px;">订单号:' + order.order_no + '</span>';
|
||||
tbody += '<span class="order-item-header text-color more" style="margin-right:50px;" onclick="showMore(' + order.order_id + ')">更多';
|
||||
tbody += '<div class="more-operation" data-order-id="' + order.order_id + '">';
|
||||
tbody += '<span>支付流水号:' + order.out_trade_no + '</span>';
|
||||
tbody += '</div></span>';
|
||||
|
||||
tbody += '<span class="order-item-header" style="margin-right:50px;">下单时间:' + ns.time_to_date(order.create_time) + '</span>';
|
||||
tbody += '<span class="order-item-header" style="margin-right:50px;">支付方式:'+ order.pay_type_name +'</span>';
|
||||
|
||||
tbody += '</td>';
|
||||
tbody += '</tr>';
|
||||
|
||||
var orderitemHtml = '';
|
||||
loadImgMagnify();
|
||||
orderitemHtml += '<tr class="content-row">';
|
||||
for (var k = 0; k < this.cols.length; k++) {
|
||||
orderitemHtml += '<td class="' + (this.cols[k].className || "") + '" align="' + (this.cols[k].align || "") + '" style="' + (this.cols[k].style || "") + '" rowspan="' + order.length + '">';
|
||||
orderitemHtml += this.cols[k].template(order, order);
|
||||
orderitemHtml += '</td>';
|
||||
}
|
||||
orderitemHtml += '</tr>';
|
||||
|
||||
tbody += orderitemHtml;
|
||||
|
||||
}
|
||||
|
||||
tbody += '</tbody>';
|
||||
return tbody;
|
||||
};
|
||||
|
||||
/**
|
||||
* 渲染表格
|
||||
*/
|
||||
Order.prototype.fetch = function () {
|
||||
if (this.data.list.length > 0) {
|
||||
return '<table class="layui-table layui-form">' + this.header(true) + '</table><table class="layui-table order-list-table layui-form">' + this.header(false) + this.tbody() + '</table>';
|
||||
} else {
|
||||
return '<table class="layui-table order-list-table layui-form">' + this.header(true) + '</table>' + '<div class="order-no-data-block"><ul><li><i class="layui-icon layui-icon-tabs"></i> </li><li>暂无订单</li></ul></div>';
|
||||
}
|
||||
};
|
||||
|
||||
function showMore(order_id) {
|
||||
$(".more-operation[data-order-id]").hide();
|
||||
$(".more-operation[data-order-id='" + order_id + "']").show();
|
||||
$("body").bind('click',function (e) {
|
||||
if (!$(e.target).closest(".order-item-header.more").length) {
|
||||
$(".more-operation[data-order-id='" + order_id + "']").hide();
|
||||
$("body").unbind('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
$(".layui-colla-title").on("click", function(){
|
||||
if($(".layui-colla-title>i").hasClass("layui-icon-down") === false && $(".layui-colla-title>i").hasClass("layui-icon-up") === false){
|
||||
$(".layui-colla-title .put-open").html("展开");
|
||||
}else if($(".layui-colla-title>i").hasClass("layui-icon-down") === true){
|
||||
$(".layui-colla-title .put-open").html("展开");
|
||||
}else if($(".layui-colla-title>i").hasClass("layui-icon-up") === true){
|
||||
$(".layui-colla-title .put-open").html("收起");
|
||||
}
|
||||
})
|
||||