This commit is contained in:
2025-10-29 15:32:26 +08:00
parent d90614805b
commit b7462657cd
78921 changed files with 2753938 additions and 71 deletions

View File

@@ -0,0 +1,94 @@
<?php
namespace addon\membercancel\api\controller;
use app\api\controller\BaseApi;
use addon\membercancel\model\MemberCancel as MemberCancelModel;
use app\model\member\Config as ConfigModel;
/**
* 会员注销
* Class MemberCancel
* @package app\api\controller
*/
class Membercancel extends BaseApi
{
/**
* 获取注销信息
*/
public function info()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$member_cancel_model = new MemberCancelModel();
$member_cancel_info = $member_cancel_model->getMemberCancelInfo(
[
[ 'member_id', '=', $this->member_id ], [ 'site_id', '=', $this->site_id ]
],
'status,reason,audit_time'
);
return $this->response($member_cancel_info);
}
/**
* 账户信息
*/
public function accountInfo()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$member_cancel_model = new MemberCancelModel();
$member_account_info = $member_cancel_model->getMemberAccountInfo($this->member_id, $this->site_id);
return $this->response($member_account_info);
}
/**
* 申请注销
*/
public function apply()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$member_cancel_model = new MemberCancelModel();
$res = $member_cancel_model->applyMemberCancel([ 'site_id' => $this->site_id, 'member_id' => $this->member_id ]);
return $this->response($res);
}
/**
* 撤销申请
*/
public function cancelApply()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$member_cancel_model = new MemberCancelModel();
$res = $member_cancel_model->cancelApplyMemberCancel($this->member_id, $this->site_id);
return $this->response($res);
}
/**
* 获取注销设置
*/
public function config()
{
$config_model = new ConfigModel();
$config_info = $config_model->getCancelConfig($this->site_id, 'shop');
$value = $config_info[ 'data' ][ 'value' ];
return $this->response($this->success($value));
}
/**
* 获取注销协议
*/
public function agreement()
{
$config_model = new ConfigModel();
$document_info = $config_model->getCancelDocument($this->site_id, 'shop');
return $this->response($document_info);
}
}

View File

@@ -0,0 +1,38 @@
<?php
/**
*/
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' => []
];

View File

@@ -0,0 +1,18 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
//展示活动
'ShowPromotion' => [
'addon\membercancel\event\ShowPromotion',
]
],
'subscribe' => [
],
];

View File

@@ -0,0 +1,21 @@
<?php
/**
*/
return [
'name' => 'membercancel',
'title' => '会员注销',
'description' => '会员注销',
'type' => 'tool', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '5.3.1',
'version_no' => '525231212001',
'content' => '',
];

View File

@@ -0,0 +1,41 @@
<?php
// +----------------------------------------------------------------------
// | 店铺端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'PROMOTION_MEMBERCANCEL',
'title' => '会员注销',
'url' => 'membercancel://shop/membercancel/lists',
'parent' => 'MEMBER_ROOT',
'picture' => '',
'picture_selected' => '',
'is_show' => 0,
'sort' => 6,
/* 'child_list' => [
[
'name' => 'MEMBER_CANCEL',
'title' => '注销列表',
'url' => 'membercancel://shop/membercancel/lists',
'is_show' => 1,
'sort' => 1,
'child_list' => [
]
],
[
'name' => 'LOGIN_CANCEL_CONFIG',
'title' => '注销设置',
'url' => 'membercancel://shop/membercancel/cancelconfig',
'is_show' => 1,
'sort' => 2,
],
[
'name' => 'LOGIN_CANCEL_AGREEMENT',
'title' => '注销协议',
'url' => 'membercancel://shop/membercancel/cancelagreement',
'is_show' => 1,
'sort' => 3,
]
]*/
],
];

View File

@@ -0,0 +1 @@
SET NAMES 'utf8';

View File

@@ -0,0 +1 @@
SET NAMES 'utf8';

View File

@@ -0,0 +1,27 @@
<?php
/**
*/
namespace addon\membercancel\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@@ -0,0 +1,27 @@
<?php
/**
*/
namespace addon\membercancel\event;
/**
* 活动类型
*/
class PromotionType
{
/**
* 活动类型
* @return array
*/
public function handle()
{
return [ "name" => "会员注销", "type" => "membercancel" ];
}
}

View File

@@ -0,0 +1,46 @@
<?php
/**
*/
namespace addon\membercancel\event;
/**
* 活动展示
*/
class ShowPromotion
{
/**
* 活动展示
* @return array
*/
public function handle()
{
$data = [
'shop' => [
[
//插件名称
'name' => 'membercancel',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'tool',
//展示主题
'title' => '会员注销',
//展示介绍
'description' => '客户在线申请注销账号',
//展示图标
'icon' => 'addon/membercancel/icon.png',
//跳转链接
'url' => 'membercancel://shop/membercancel/lists',
]
]
];
return $data;
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\membercancel\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return success();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,503 @@
<?php
/**
*/
namespace addon\membercancel\model;
use addon\fenxiao\model\Fenxiao;
use addon\fenxiao\model\FenxiaoOrder;
use app\dict\order_refund\OrderRefundDict;
use app\model\BaseModel;
use app\model\member\Config as ConfigModel;
use app\model\message\Message;
use app\model\message\Sms;
use app\model\order\OrderCommon;
use app\model\order\OrderRefund;
use app\model\shop\ShopAcceptMessage;
use addon\wechat\model\Message as WechatMessage;
use think\facade\Cache;
/**
* 会员注销
*/
class MemberCancel extends BaseModel
{
/**
* 申请注销
* @param $param
* @return array
*/
public function applyMemberCancel($param)
{
//获取注销配置
$config_model = new ConfigModel();
$config_info = $config_model->getCancelConfig($param[ 'site_id' ], 'shop');
$value = $config_info[ 'data' ][ 'value' ];
$value[ 'is_enable' ] = 1;//默认打开注销
$value[ 'is_audit' ] = 0;//默认打开注销
if ($value[ 'is_enable' ] == 0) {
return $this->error('', '未开放注1销');
}
//获取用户信息
$member_info = model('member')->getInfo(
[
[ 'site_id', '=', $param[ 'site_id' ] ],
[ 'member_id', '=', $param[ 'member_id' ] ],
[ 'is_delete', '=', 0 ]
]
);
if (empty($member_info)) {
return $this->error('', '会员不存在');
}
if ($member_info[ 'balance_withdraw_apply' ] > 0) {
return $this->error('', '有余额正在提现中,请提现成功后在申请注销');
}
$member_json = json_encode($member_info);
//判断是否申请过
$member_cancel_info = model('member_cancel')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'member_id', '=', $param[ 'member_id' ] ] ]);
if (!empty($member_cancel_info)) {
if ($member_cancel_info[ 'status' ] != -1) {
return $this->error('', '请勿重复申请注销');
}
}
//判断是否有未完成的订单
$order_condition = [
[ 'site_id', '=', $param[ 'site_id' ] ],
[ 'member_id', '=', $param[ 'member_id' ] ],
[ 'order_status', 'in', [ 1, 3, 4 ] ]
];
$order_count = model('order')->getCount($order_condition);
if ($order_count > 0) {
return $this->error('', '还有订单未完成,请等订单完成后在申请注销');
}
//分销
$fenxiao_json = '';
if (addon_is_exit('fenxiao', $param[ 'site_id' ]) == 1) {
//获取分销商信息
$fenxiao_info = model('fenxiao')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'member_id', '=', $param[ 'member_id' ] ] ]);
if (!empty($fenxiao_info)) {
if ($fenxiao_info[ 'account_withdraw_apply' ] > 0) {
return $this->error('', '有分销佣金正在提现中,请提现成功后在申请注销');
}
//判断是否存在未结算的分销订单
$fenxiao_condition = [
[ 'site_id', '=', $param[ 'site_id' ] ],
[ 'one_fenxiao_id|two_fenxiao_id|three_fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ],
[ 'is_settlement', '=', 0 ]
];
$fenxiao_order_count = model('fenxiao_order')->getCount($fenxiao_condition);
if ($fenxiao_order_count > 0) {
return $this->error('', '还有分销订单未结算,请等订单结算后在申请注销');
}
$fenxiao_json = json_encode($fenxiao_info);
}
}
model('member_cancel')->startTrans();
try {
if (!empty($member_cancel_info)) {
$id = $member_cancel_info[ 'id' ];
$data = [
'status' => 0,
'audit_uid' => '',
'audit_username' => '',
'reason' => '',
'audit_time' => ''
];
model('member_cancel')->update($data, [ [ 'id', '=', $id ] ]);
} else {
$data = [
'member_id' => $member_info[ 'member_id' ],
'site_id' => $param[ 'site_id' ],
'username' => $member_info[ 'username' ],
'mobile' => $member_info[ 'mobile' ],
'nickname' => $member_info[ 'nickname' ],
'create_time' => time(),
'member_json' => $member_json,
'fenxiao_json' => $fenxiao_json
];
$id = model('member_cancel')->add($data);
}
//审核开关关闭
if ($value[ 'is_audit' ] == 0) {
//todo 调用审核成功接口
$param[ 'id' ] = $id;
$param[ 'audit_uid' ] = '';
$param[ 'audit_username' ] = '';
$res = $this->memberCancelAuditPass($param);
if ($res[ 'code' ] < 0) {
model('member_cancel')->rollback();
return $res;
}
}
model('member_cancel')->commit();
//会员申请注销消息
$message_model = new Message();
$message_model->sendMessage([ 'keywords' => "USER_CANCEL_APPLY", 'member_id' => $member_info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
$res[ 'is_audit' ] = $value[ 'is_audit' ];
return $this->success($res);
} catch (\Exception $e) {
model('member_cancel')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 撤销申请注销
* @param $member_id
* @param $site_id
* @return array
*/
public function cancelApplyMemberCancel($member_id, $site_id)
{
$member_cancel_info = model('member_cancel')->getInfo(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ]
]
);
if (empty($member_cancel_info)) {
return $this->error('', '数据不合法');
}
if ($member_cancel_info[ 'status' ] == 1) {
return $this->error('', '数据不合法');
}
$res = model('member_cancel')->delete([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ] ]);
return $this->success($res);
}
/**
* 审核通过
* @param $param
* @return array
*/
public function memberCancelAuditPass($param)
{
$info = model('member_cancel')->getInfo([ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'member_id,status');
if (empty($info)) {
return $this->error('', '请核实数据后重试');
}
if ($info[ 'status' ] != 0) {
return $this->error('', '该数据已审核,请勿重复审核');
}
model('member_cancel')->startTrans();
try {
//修改注销状态
$data = [
'status' => 1,
'audit_uid' => $param[ 'audit_uid' ],
'audit_username' => $param[ 'audit_username' ],
'audit_time' => time()
];
model('member_cancel')->update($data, [ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
//删除会员信息
model('member')->update([ 'is_delete' => 1, 'status' => 0 ], [ [ 'member_id', '=', $info[ 'member_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
Cache::set('member_blacklist_' . $param[ 'site_id' ], null);
event('MemberCancel', [ 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
model('member_cancel')->commit();
//会员注销成功消息
$message_model = new Message();
$message_model->sendMessage([ 'keywords' => "USER_CANCEL_SUCCESS", 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
return $this->success();
} catch (\Exception $e) {
model('member_cancel')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 审核拒绝
* @param $param
* @return array
*/
public function memberCancelAuditRefuse($param)
{
$info = model('member_cancel')->getInfo([ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'status,member_id');
if (empty($info)) {
return $this->error('', '请核实数据后重试');
}
if ($info[ 'status' ] != 0) {
return $this->error('', '该数据已审核,请勿重复审核');
}
$data = [
'status' => -1,
'audit_uid' => $param[ 'audit_uid' ],
'audit_username' => $param[ 'audit_username' ],
'reason' => $param[ 'reason' ],
'audit_time' => time()
];
$res = model('member_cancel')->update($data, [ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
//会员注销失败消息
$message_model = new Message();
$message_model->sendMessage([ 'keywords' => "USER_CANCEL_FAIL", 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
return $this->success($res);
}
/**
* 获取会员注销信息
* @param array $condition
* @param string $field
* @return array
*/
public function getMemberCancelInfo($condition = [], $field = '*')
{
$info = model('member_cancel')->getInfo($condition, $field);
return $this->success($info);
}
/**
* 获取会员注销分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getMemberCancelPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'id desc', $field = '*')
{
$list = model('member_cancel')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
/**
* 获取用户账户信息
* @param $member_id
* @param $site_id
* @return array
*/
public function getMemberAccountInfo($member_id, $site_id)
{
$data = [];
//会员信息
$member_info = model('member')->getInfo(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'is_delete', '=', 0 ]
],
'is_fenxiao,point,balance,balance_money,balance_withdraw_apply'
);
$data[ 'member_info' ] = $member_info;
//优惠券数量
$data[ 'member_coupon_count' ] = model('promotion_coupon')->getCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'state', '=', 1 ]
]
);
//订单待发货
$data[ 'order_pay_count' ] = model('order')->getCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'order_status', '=', OrderCommon::ORDER_PAY ]
]
);
//订单待收货
$data[ 'order_delivery_count' ] = model('order')->getCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'order_status', '=', OrderCommon::ORDER_DELIVERY ]
]
);
//订单待完成
$data[ 'order_take_delivery_count' ] = model('order')->getCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'order_status', '=', OrderCommon::ORDER_TAKE_DELIVERY ]
]
);
//退款订单
$data[ 'order_refund_count' ] = model('order')->getCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'refund_status', 'not in', [ OrderRefundDict::REFUND_NOT_APPLY, OrderRefundDict::REFUND_COMPLETE ] ]
]
);
//判断用户是否是分销商
if ($member_info[ 'is_fenxiao' ] == 1 && addon_is_exit('fenxiao', $site_id)) {
//分销商信息
$fenxiao_model = new Fenxiao();
$fenxiao_info = $fenxiao_model->getFenxiaoInfo(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ]
],
'account,account_withdraw,account_withdraw_apply,total_commission'
);
$data[ 'fenxiao_info' ] = $fenxiao_info[ 'data' ];
//分销待结算订单
$fenxiao_order_model = new FenxiaoOrder();
$fenxiao_order_count = $fenxiao_order_model->getFenxiaoOrderCount(
[
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ],
[ 'is_settlement', '=', 0 ]
]
);
$data[ 'fenxiao_order_count' ] = $fenxiao_order_count[ 'data' ];
}
return $this->success($data);
}
/****************************************** 会员注销通知 start **********************************************/
/**
* 会员注销成功
* @param $data
* @return array
*/
public function memberCancelSuccess($data)
{
$member_cancel = model('member_cancel')->getInfo(
[
[ 'member_id', '=', $data[ 'member_id' ] ],
[ 'site_id', '=', $data[ 'site_id' ] ]
]
);
if (empty($member_cancel)) {
return $this->success();
}
$member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
//发送短信
$sms_model = new Sms();
$name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
$var_parse = array (
"username" => $name,
);
$data[ "sms_account" ] = $member_info[ "mobile" ] ?? '';//手机号
$data[ "var_parse" ] = $var_parse;
$sms_result = $sms_model->sendMessage($data);
return $this->success();
}
/**
* 会员注销失败
* @param $data
* @return array
*/
public function memberCancelFail($data)
{
$member_cancel = model('member_cancel')->getInfo(
[
[ 'member_id', '=', $data[ 'member_id' ] ],
[ 'site_id', '=', $data[ 'site_id' ] ]
]
);
if (empty($member_cancel)) {
return $this->success();
}
$member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
//发送短信
$sms_model = new Sms();
$name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
$var_parse = array (
"username" => $name,
);
$data[ "sms_account" ] = $member_info[ "mobile" ] ?? '';//手机号
$data[ "var_parse" ] = $var_parse;
$sms_result = $sms_model->sendMessage($data);
return $this->success();
}
/**
* 会员注销申请通知(店铺)
* @param $data
* @return array
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function memberCancelApply($data)
{
$member_cancel = model('member_cancel')->getInfo(
[
[ 'member_id', '=', $data[ 'member_id' ] ],
[ 'site_id', '=', $data[ 'site_id' ] ]
]
);
if (empty($member_cancel)) {
return $this->success();
}
$member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
$name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
//发送短信
$sms_model = new Sms();
$var_parse = array (
"username" => $name,
);
// $site_id = $data['site_id'];
// $shop_info = model("shop")->getInfo([["site_id", "=", $site_id]], "mobile,email");
// $message_data["sms_account"] = $shop_info["mobile"];//手机号
$data[ "var_parse" ] = $var_parse;
$shop_accept_message_model = new ShopAcceptMessage();
$result = $shop_accept_message_model->getShopAcceptMessageList();
$list = $result[ 'data' ];
if (!empty($list)) {
foreach ($list as $v) {
$message_data = $data;
$message_data[ "sms_account" ] = $v[ "mobile" ];//手机号
$sms_model->sendMessage($message_data);
if ($v[ 'wx_openid' ] != '') {
$wechat_model = new WechatMessage();
$data[ "openid" ] = $v[ 'wx_openid' ];
$data[ "template_data" ] = [
'thing2' => replaceSpecialChar($name), // 申请人
'time4' => time_to_date(time()) // 注销时间
];
$data[ "page" ] = "";
$wechat_model->sendMessage($data);
}
}
}
}
/****************************************** 会员注销通知 end ************************************************/
}

View File

@@ -0,0 +1,166 @@
<?php
/**
*/
namespace addon\membercancel\shop\controller;
use app\model\member\Config as ConfigModel;
use addon\membercancel\model\MemberCancel as MemberCancelModel;
use app\shop\controller\BaseShop;
/**
* 会员注销管理 控制器
*/
class Membercancel extends BaseShop
{
/**
* 注销列表
*/
public function lists()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [ [ 'site_id', '=', $this->site_id ] ];
$search_text = input('search_text', '');
$search_type = input('search_type', '');
if (!empty($search_text)) {
$condition[] = [
$search_type, 'like', '%' . $search_text . '%'
];
}
//状态
$status = input('status', '');
if ($status !== '') {
$condition[] = [ 'status', '=', $status ];
}
//注销时间
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && $end_time) {
$condition[] = [ 'create_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'create_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && !$end_time) {
$condition[] = [ 'create_time', '>=', date_to_time($start_time) ];
}
$member_cancel_model = new MemberCancelModel();
$list = $member_cancel_model->getMemberCancelPageList($condition, $page, $page_size);
return $list;
} else {
//筛选条件
$search_type = [
'username' => '会员账号',
'mobile' => '手机号',
'nickname' => '昵称'
];
$this->assign('search_type', $search_type);
return $this->fetch('membercancel/lists');
}
}
/**
* 审核通过
*/
public function auditPass()
{
if (request()->isJson()) {
$id = input('id', '');
$data = [
'id' => $id,
'site_id' => $this->site_id,
'audit_uid' => $this->user_info[ 'uid' ],
'audit_username' => $this->user_info[ 'username' ]
];
$member_cancel_model = new MemberCancelModel();
$res = $member_cancel_model->memberCancelAuditPass($data);
return $res;
}
}
/**
* 审核失败
*/
public function auditRefuse()
{
if (request()->isJson()) {
$id = input('id', '');
$reason = input('reason', '');
$data = [
'id' => $id,
'site_id' => $this->site_id,
'audit_uid' => $this->user_info[ 'uid' ],
'audit_username' => $this->user_info[ 'username' ],
'reason' => $reason
];
$member_cancel_model = new MemberCancelModel();
$res = $member_cancel_model->memberCancelAuditRefuse($data);
return $res;
}
}
/**
* 注销协议
*/
public function cancelAgreement()
{
if (request()->isJson()) {
//设置注销协议
$title = input('title', '');
$content = input('content', '');
$config_model = new ConfigModel();
return $config_model->setCancelDocument($title, $content, $this->site_id, 'shop');
} else {
//获取注销协议
$config_model = new ConfigModel();
$document_info = $config_model->getCancelDocument($this->site_id, 'shop');
$this->assign('document_info', $document_info);
return $this->fetch('membercancel/cancel_agreement');
}
}
/**
* 注销设置
*/
public function cancelConfig()
{
$config_model = new ConfigModel();
if (request()->isJson()) {
//设置注册设置
$data = array (
'is_enable' => input('is_enable', 0),
'is_audit' => input('is_audit', 1),
);
return $config_model->setCancelConfig($data, $this->site_id, 'shop');
} else {
//获取注册设置
$config_info = $config_model->getCancelConfig($this->site_id, 'shop');
$value = $config_info[ 'data' ][ 'value' ];
$this->assign('value', $value);
return $this->fetch('membercancel/cancel_config');
}
}
}

View File

@@ -0,0 +1,69 @@
<style>
.layui-layout-admin.admin-style-2 .layui-body .layui-tab + .body-content {
padding-top: 60px!important;
}
</style>
<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"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js"></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("membercancel://shop/membercancel/cancelAgreement"),
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>

View File

@@ -0,0 +1,69 @@
<style>
.layui-form-item .layui-form-checkbox[lay-skin=primary] {
margin-top: 0;
}
.layui-layout-admin.admin-style-2 .layui-body .layui-tab + .body-content {
padding-top: 60px!important;
}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label ">是否允许注销:</label>
<div class="layui-input-block" id="isReg">
<input type="checkbox" name="is_enable" value="1" lay-filter="is_enable" lay-skin="switch" {if condition="$value.is_enable == 1"} checked {/if} >
</div>
<div class="word-aux">设置为关闭,则无法注销会员账号</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label ">注销审核:</label>
<div class="layui-input-block" >
<input type="checkbox" name="is_audit" value="1" lay-filter="is_enable" lay-skin="switch" {if condition="$value.is_audit== 1"} checked {/if} >
</div>
<div class="word-aux">设置为关闭,会员将直接注销成功。</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script>
layui.use('form', function() {
var form = layui.form,
repeat_flag = false; //防重复
form.render();
form.on('submit(save)', function(data) {
field = data.field;
if (field.is_enable == undefined) {
field.is_enable = 0;
}
if (field.is_audit == undefined) {
field.is_audit = 0;
}
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("membercancel://shop/membercancel/cancelConfig"),
data: field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
});
</script>

View File

@@ -0,0 +1,330 @@
<style>
.screen {margin-top: 15px;}
.layui-layout-admin.admin-style-2 .screen {margin-top: 0;}
.layui-layout-admin.admin-style-2 .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin.admin-style-2 .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
<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">
<select name="search_type">
{foreach $search_type as $k=>$v}
<option value="{$k}">{$v}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">申请时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" id="start_time" autocomplete="off" placeholder="开始时间" >
<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" id="end_time" autocomplete="off" placeholder="结束时间" >
<i class=" iconrili iconfont calendar"></i>
</div>
</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="member_tab">
<ul class="layui-tab-title">
<li class="layui-this" data-status="">全部</li>
<li data-status="0">待审核</li>
<li data-status="1">注销成功</li>
<li data-status="-1">审核拒绝</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="member_list" lay-filter="member_list"></table>
</div>
</div>
<!--时间-->
<script type="text/html" id="times">
<div class="layui-elip" title="申请时间:{{ns.time_to_date(d.create_time)}}">
申请时间{{ns.time_to_date(d.create_time)}}</div>
<div class="layui-elip" title="到账时间:{{ns.time_to_date(d.payment_time)}}">
审核时间{{ns.time_to_date(d.audit_time)}}</div>
</script>
<!-- 状态 -->
<script type="text/html" id="status">
{{# if(d.status == 1){ }}
<span style="color: red;">待审核</span>
{{# }else if(d.status == 2){ }}
<span style="color: green;">审核通过</span>
{{# }else if(d.status == -1){ }}
<span style="color: gray;">审核拒绝</span>
{{# } }}
</script>
<!-- 工具栏操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">查看</a>
{{# if(d.status != 1){ }}
<a class="layui-btn" lay-event="memberInfo">会员信息</a>
{{# } }}
{{# if(d.status == 0){ }}
<a class="layui-btn" lay-event="pass">审核通过</a>
<a class="layui-btn" lay-event="refuse">审核拒绝</a>
{{# } }}
</div>
</script>
<script>
layui.use(['form', 'laydate', 'element', 'laytpl'], function() {
var table,repeat_flag=false,
form = layui.form,
element = layui.element,
laytpl = layui.laytpl,
laydate = layui.laydate;
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
//监听Tab切换
element.on('tab(member_tab)', function(data) {
table.reload({
page: {
curr: 1
},
where: {
'status': this.getAttribute('data-status')
}
});
});
table = new Table({
elem: '#member_list',
url: ns.url("membercancel://shop/membercancel/lists"),
cols: [
[{
field: 'username',
title: '会员账号',
unresize: 'false'
}, {
field: 'nickname',
title: '昵称',
unresize: 'false'
}, {
field: 'mobile',
title: '电话',
unresize: 'false'
}, {
title: '状态',
unresize: 'false',
templet: function(data) {
var str = '';
if(data.status == 0){
str = '审核中';
}else if(data.status == 1){
str = '注销成功';
}else{
str = '审核拒绝';
}
return str;
}
}, {
field: 'create_time',
title: '申请时间',
unresize: 'false',
templet: function(data){
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data,
event = obj.event;
switch (event) {
case 'detail': //查看
var detailHtml = $("#cancelDetail").html();
laytpl(detailHtml).render(data, function (html) {
layer.open({
type: 1,
title: '会员注销详情',
area: ['700px'],
content: html
});
})
break;
case 'memberInfo': //会员信息
location.hash = ns.hash('shop/member/editmember?member_id='+data.member_id);
break;
case 'pass': //通过
layer.confirm('确定要通过吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("membercancel://shop/membercancel/auditPass"),
data: {id:data.id},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
});
break;
case 'refuse': //拒绝
layer.prompt({
formType: 2,
value: '',
title: '请输入拒绝理由',
area: ['300px', '100px'] ,//自定义文本域宽高
yes: function(index, layero){
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
$.ajax({
url: ns.url("membercancel://shop/membercancel/auditrefuse"),
data: {
"id":data.id,
"reason":value
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
layer.close(index);
} else {
layer.msg('请输入拒绝原因!', {icon: 5, anim: 6});
}
}
});
break;
}
});
});
</script>
<script type="text/html" id="cancelDetail">
<table class="layui-table">
<colgroup>
<col width="80">
<col width="200">
</colgroup>
<tbody>
<tr>
<td>会员账号</td>
<td>{{d.username}}</td>
</tr>
<tr>
<td>昵称</td>
<td>{{d.nickname}}</td>
</tr>
<tr>
<td>联系电话</td>
<td>{{d.mobile}}</td>
</tr>
{{# if(d.bank_type != 0){ }}
<tr>
<td>审核人账号</td>
<td>{{d.audit_username}}</td>
</tr>
<tr>
<td>审核时间</td>
<td>{{ ns.time_to_date(d.audit_time) }}</td>
</tr>
{{# } }}
{{# if(d.status == -1){ }}
<tr>
<td>拒绝原因</td>
<td>{{ d.reason }}</td>
</tr>
{{# } }}
<tr>
<td>状态</td>
<td>
{{# if(d.status == 0){ }}
待审核
{{#} else if(d.status == 1){ }}
审核通过
{{#} else { }}
审核拒绝
{{#} }}
</td>
</tr>
<tr>
<td>申请时间</td>
<td>{{ ns.time_to_date(d.create_time) }}</td>
</tr>
</tbody>
</table>
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB