* Date: 2018-4-3
*/
namespace app\admin\controller;
use think\Page;
use think\Db;
use think\Config;
use app\admin\logic\MemberLogic;
class Member extends Base {
public $userConfig = [];
/**
* 构造方法
*/
public function __construct(){
parent::__construct();
$this->language_access(); // 多语言功能操作权限
/*会员中心数据表*/
$this->users_db = Db::name('users'); // 会员信息表
$this->users_list_db = Db::name('users_list'); // 会员资料表
$this->users_level_db = Db::name('users_level'); // 会员等级表
$this->users_config_db = Db::name('users_config'); // 会员配置表
$this->users_money_db = Db::name('users_money'); // 会员充值表
$this->field_type_db = Db::name('field_type'); // 字段属性表
$this->users_parameter_db = Db::name('users_parameter'); // 会员属性表
$this->users_type_manage_db = Db::name('users_type_manage'); // 会员属性表
/*结束*/
/*订单中心数据表*/
$this->shop_address_db = Db::name('shop_address'); // 会员地址表
$this->shop_cart_db = Db::name('shop_cart'); // 会员购物车表
$this->shop_order_db = Db::name('shop_order'); // 会员订单主表
$this->shop_order_log_db = Db::name('shop_order_log'); // 会员订单操作记录表
$this->shop_order_details_db = Db::name('shop_order_details'); // 会员订单副表
/*结束*/
// 是否开启支付功能设置
$this->userConfig = getUsersConfigData('all');
$this->assign('userConfig', $this->userConfig);
// 模型是否开启
$channeltype_row = \think\Cache::get('extra_global_channeltype');
$this->assign('channeltype_row', $channeltype_row);
}
// 会员列表
public function users_index()
{
$list = array();
$param = input('param.');
$condition = array();
// 应用搜索条件
foreach (['keywords','level'] as $key) {
if (isset($param[$key]) && $param[$key] !== '') {
if ($key == 'keywords') {
$condition['a.username|a.nickname|a.mobile|a.email|a.users_id'] = array('LIKE', "%{$param[$key]}%");
} else {
$condition['a.'.$key] = array('eq', $param[$key]);
}
}
}
if (!empty($param['source'])) {
$condition['a.source'] = $param['source'];
}
if (isset($param['is_lock']) && '' !== $param['is_lock']) {
$condition['a.is_lock'] = $param['is_lock'];
}
// 注册时间查询
if (!empty($param['add_time'])) {
$add_time = explode('~', $param['add_time']);
$start = strtotime(rtrim($add_time[0]));
$finish = strtotime(rtrim($add_time[1]).' 23:59:59');
$condition['a.reg_time'] = ['between', "$start, $finish"];
}
$condition['a.is_del'] = 0;
// 自定义排序
$orderby = input('param.orderby/s');
$orderway = input('param.orderway/s');
if (!empty($orderby) && !empty($orderway)) {
$orderby = "a.{$orderby} {$orderway}, a.users_id desc";
} else {
$orderby = "a.users_id desc";
}
$count = $this->users_db->alias('a')->where($condition)->count();
$Page = new Page($count, config('paginate.list_rows'));
$list = $this->users_db->field('a.*,b.level_name')
->alias('a')
->join('__USERS_LEVEL__ b', 'a.level = b.level_id', 'LEFT')
->where($condition)
->order($orderby)
->limit($Page->firstRow.','.$Page->listRows)
->select();
$users_ids = [];
foreach ($list as $key => $val) {
$users_ids[] = $val['users_id'];
}
/*微信登录插件*/
$wxlogin = [];
if (is_dir('./weapp/WxLogin/')) {
$wxlogin = Db::name('weapp_wxlogin')->where(['users_id'=>['IN', $users_ids]])->getAllWithIndex('users_id');
}
$this->assign('wxlogin',$wxlogin);
/*end*/
/*QQ登录插件*/
$qqlogin = [];
if (is_dir('./weapp/QqLogin/')) {
$qqlogin = Db::name('weapp_qqlogin')->where(['users_id'=>['IN', $users_ids]])->getAllWithIndex('users_id');
}
$this->assign('qqlogin',$qqlogin);
/*end*/
/*微博登录插件*/
$wblogin = [];
if (is_dir('./weapp/Wblogin/')) {
$wblogin = Db::name('weapp_wblogin')->where(['users_id'=>['IN', $users_ids]])->getAllWithIndex('users_id');
}
$this->assign('wblogin',$wblogin);
/*end*/
$show = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->assign('list',$list);// 赋值数据集
$this->assign('pager',$Page);// 赋值分页集
$LevelData = model('UsersLevel')->getList('level_id, level_name', [], 'level_id');
$this->assign('level', $LevelData);
/*纠正数据*/
$web_is_authortoken = tpCache('global.web_is_authortoken');
if (is_realdomain() && !empty($web_is_authortoken)) {
getUsersConfigData('shop', ['shop_open'=>0]);
}
//计算会员人数
$levelCountList = [
'all' => [
'level_id' => 0,
'level_name' => '全部会员',
'level_count' => 0,
],
];
$LevelData = model('UsersLevel')->getList('level_id, level_name', [], 'level_id');
$levelCountRow = Db::name('users')->field('count(users_id) as num, level')->order('level asc')->group('level')->getAllWithIndex('level');
foreach ($LevelData as $key => $val) {
$level_num = empty($levelCountRow[$val['level_id']]) ? 0 : $levelCountRow[$val['level_id']]['num'];
$levelCountList[$val['level_id']] = [
'level_id' => $val['level_id'],
'level_name' => $val['level_name'],
'level_count' => $level_num,
];
$levelCountList['all']['level_count'] += $level_num;
}
$this->assign('levelCountList', $levelCountList);
// 手机端后台管理插件特定使用参数
$isMobile = input('param.isMobile/d', 0);
// 如果安装手机端后台管理插件并且在手机端访问时执行
if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) {
$mbPage = input('param.p/d', 1);
$nullShow = intval($Page->totalPages) === intval($mbPage) ? 1 : 0;
$this->assign('nullShow', $nullShow);
if ($mbPage >= 2) {
return $this->display('member/users_list');
} else {
return $this->display('member/users_index');
}
} else {
return $this->fetch();
}
}
// 会员批量新增
public function users_batch_add()
{
if (IS_POST) {
$post = input('post.');
$username = $post['username'];
if (empty($username)) {
$this->error('用户名不能为空!');
}
if (empty($post['password']) || !trim($post['password'])) {
$this->error('登录密码不能为空!');
} else {
/*等保密码复杂度验证 start*/
if (is_dir('./weapp/Equal/')) {
$equalLogic = new \weapp\Equal\logic\EqualLogic;
$eqData = $equalLogic->pwdValidate($post['password']);
if (isset($eqData['code']) && empty($eqData['code'])) {
$this->error($eqData['msg']);
}
}
/*等保密码复杂度验证 end*/
}
if (!empty($this->userConfig['level_member_upgrade']) && 1 == $this->userConfig['level_member_upgrade']) {
if (1 != $post['level'] && !preg_match("/^([0-9]+)$/i", $post['level_maturity_days'])) {
$this->error('请填写会员有效期天数!');
}
}
// 处理数据验证
$error = handleEyouDataValidate('username', '__token_users_batch_add__', $post, '用户名不能为空!');
if (!empty($error)) $this->error($error);
$post['level_maturity_days'] = intval($post['level_maturity_days']);
$password = func_encrypt($post['password'], false, pwd_encry_type('bcrypt'));
$usernameArr = explode("\r\n", $username);
$usernameArr = array_filter($usernameArr);//去除数组空值
$usernameArr = array_unique($usernameArr); //去重
$addData = [];
$usernameList = $this->users_db->where([
'username' => ['IN', $usernameArr],
])->column('username');
foreach ($usernameArr as $key => $val) {
if(trim($val) == '' || empty($val) || in_array($val, $usernameList) || !preg_match("/^[\x{4e00}-\x{9fa5}\w\-\_\@\#]{2,30}$/u", $val))
{
continue;
}
$addData[] = [
'username' => $val,
'nickname' => $val,
'password' => $password,
'level' => $post['level'],
'register_place' => 1,
'level_maturity_days' => $post['level_maturity_days'],
'open_level_time' => getTime(),
'reg_time' => getTime(),
'head_pic' => ROOT_DIR . '/public/static/common/images/dfboy.png',
'lang' => $this->admin_lang,
];
}
if (!empty($addData)) {
$r = model('Member')->saveAll($addData);
if (!empty($r)) {
eyou_statistics_data(4, count($addData)); // 统计新增会员数
adminLog('批量新增会员:'.implode(',', get_arr_column($addData, 'username')));
$this->success('操作成功!', url('Member/users_index'));
} else {
$this->error('操作失败');
}
} else {
$this->success('操作成功!', url('Member/users_index'));
}
}
$user_level = model('UsersLevel')->getList('level_id, level_name');
$this->assign('user_level',$user_level);
/*等保密码复杂度验证 start*/
$pwdJsCode = '';
if (is_dir('./weapp/Equal/')) {
$equalLogic = new \weapp\Equal\logic\EqualLogic;
$pwdJsCode = $equalLogic->pwdJsCode();
}
if ('close' == $pwdJsCode) {
$pwdJsCode = '';
}
$this->assign('pwdJsCode', $pwdJsCode);
/*等保密码复杂度验证 end*/
return $this->fetch();
}
// 会员编辑
public function users_edit()
{
if (IS_POST) {
$post = input('post.');
$post['users_id'] = intval($post['users_id']);
$users_id = $post['users_id'];
// if (!empty($this->userConfig['level_member_upgrade']) && 1 == $this->userConfig['level_member_upgrade']) {
if (1 != $post['level'] && !preg_match("/^([0-9]+)$/i", $post['level_maturity_days_up'])) {
$this->error('请填写会员有效期天数!');
}
/*会员级别到期天数*/
$post['level_maturity_days_up'] = intval($post['level_maturity_days_up']);
$post['level_maturity_days_old'] = intval($post['level_maturity_days_old']);
if (0 >= $post['level_maturity_days_up']) {
$days_new = 0;
}else{
if ($post['level_maturity_days_new'] >= $post['level_maturity_days_up']) {
$days_new = $post['level_maturity_days_new'] - $post['level_maturity_days_up'];
$days_new = $post['level_maturity_days_old'] - $days_new;
}else{
$days_new = $post['level_maturity_days_up'] - $post['level_maturity_days_new'];
$days_new = $post['level_maturity_days_old'] + $days_new;
}
}
$days_new = (99999999 < $days_new) ? 99999999 : $days_new;
$post['level_maturity_days'] = $days_new;
// }
/*end*/
$post['head_pic'] = htmlspecialchars_decode($post['head_pic']);
if (isset($post['users_money'])) {
$users_money = input('post.users_money/f');
$post['users_money'] = (99999999 < $users_money) ? 99999999 : $users_money;
}
if (!empty($post['password']) && trim($post['password'])) {
/*等保密码复杂度验证 start*/
if (is_dir('./weapp/Equal/')) {
$equalLogic = new \weapp\Equal\logic\EqualLogic;
$eqData = $equalLogic->pwdValidate($post['password']);
if (isset($eqData['code']) && empty($eqData['code'])) {
$this->error($eqData['msg']);
}
}
/*等保密码复杂度验证 end*/
if (!empty($this->globalConfig['security_verifyfunc']) && in_array('edit_pwd', $this->globalConfig['security_verifyfunc'])) {
if (true !== security_answer_verify()) {
$this->error("请先密保答案验证");
}
}
$post['password'] = func_encrypt($post['password'], false, pwd_encry_type('bcrypt'));
} else {
unset($post['password']);
}
$ParaData = [];
if (is_array($post['users_'])) {
$ParaData = $post['users_'];
}
unset($post['users_']);
// 处理提交的会员属性中邮箱和手机是否已存在
// isRequired方法传入的参数有2个
// 第一个必须传入提交的会员属性数组
// 第二个users_id,注册时不需要传入,修改时需要传入。
$RequiredData = model('Member')->isRequired($ParaData,$users_id);
if ($RequiredData) {
$this->error($RequiredData);
}
// 处理数据验证
$error = handleEyouDataValidate('users_id', '__token_users_edit__', $post);
if (!empty($error)) $this->error($error);
$users_where = [
'users_id' => $users_id,
];
$userinfo = $this->users_db->where($users_where)->find();
$post['update_time'] = getTime();
/*会员级别到期天数*/
if(isset($post['level_maturity_days']) && !empty($post['level_maturity_days'])){
if (empty($userinfo['open_level_time'])) {
$post['open_level_time'] = getTime();
}
}else if (empty($post['level_maturity_days'])) {
$post['open_level_time'] = '';
$level_id = 1;
$post['level'] = $level_id;
}
/*end*/
unset($post['username']);
$r = $this->users_db->where($users_where)->update($post);
if ($r) {
$row2 = $this->users_parameter_db->field('para_id,name,dtype')->getAllWithIndex('name');
//兼容多选字段选择为空时保存失败
foreach ($row2 as $k => $v) {
if ($v['dtype'] == 'checkbox' && empty($ParaData[$v['name']])){
$ParaData[$v['name']] = '';
}
}
foreach ($ParaData as $key => $value) {
$data = [];
$para_id = intval($row2[$key]['para_id']);
$where = [
'users_id' => $post['users_id'],
'para_id' => $para_id,
];
if ('checkbox' == $row2[$key]['dtype']) {
if (!empty($value)) {
$data['info'] = implode(",", $value);
} else {
$data['info'] = '';
}
} elseif ('imgs' == $row2[$key]['dtype']) {
$value = array_filter($value);
if (!empty($value)) {
$data['info'] = implode(",", $value);
} else {
$data['info'] = '';
}
} else {
$data['info'] = $value;
}
$data['update_time'] = getTime();
// 若信息表中无数据则添加
$row = $this->users_list_db->where($where)->count();
if (empty($row)) {
$data['users_id'] = $post['users_id'];
$data['para_id'] = $para_id;
$data['lang'] = $this->admin_lang;
$data['add_time'] = getTime();
$this->users_list_db->add($data);
} else {
$this->users_list_db->where($where)->update($data);
}
}
// 查询属性表的手机号码和邮箱地址,同步修改会员信息。
$UsersListData = model('Member')->getUsersListData('*',$users_id);
$UsersListData['update_time'] = getTime();
$this->users_db->where($users_where)->update($UsersListData);
/*同步头像到管理员表对应的管理员*/
$syn_admin_id = $this->users_db->where(['users_id'=>$post['users_id']])->getField('admin_id');
if (!empty($syn_admin_id)) {
Db::name('admin')->where(['admin_id'=>$syn_admin_id])->update([
'head_pic' => $post['head_pic'],
'update_time' => getTime(),
]);
}
/*end*/
\think\Cache::clear('users_list');
adminLog('编辑会员'.$users_id.':'.$userinfo['username']);
$this->success('操作成功', url('Member/users_index'));
} else {
$this->error('操作失败');
}
}
$assign_data = [];
$users_id = input('param.id/d');
// 会员信息
$info = $this->users_db->where([
'users_id' => $users_id,
])->find();
// 计算剩余天数
$days = intval($info['open_level_time']) + (intval($info['level_maturity_days']) * 86400);
// 取整
$days = ceil(($days - getTime()) / 86400);
if (0 >= $days) {
$info['level_maturity_days_new'] = '0';
}else{
$info['level_maturity_days_new'] = $days;
}
$assign_data['info'] = $info;
/*微信登录插件*/
if (is_dir('./weapp/WxLogin/')) {
$assign_data['info']['wxlogin'] = Db::name('weapp_wxlogin')->where(['users_id'=>$users_id])->find();
}
/*end*/
/*QQ登录插件*/
if (is_dir('./weapp/QqLogin/')) {
$assign_data['info']['qqlogin'] = Db::name('weapp_qqlogin')->where(['users_id'=>$users_id])->find();
}
/*end*/
/*微博登录插件*/
if (is_dir('./weapp/Wblogin/')) {
$assign_data['info']['wblogin'] = Db::name('weapp_wblogin')->where(['users_id'=>$users_id])->find();
}
/*end*/
// 等级信息
$assign_data['level'] = model('UsersLevel')->getList('level_id, level_name');
// 属性信息
$assign_data['users_para'] = model('Member')->getDataParaList($users_id);
// 积分
$assign_data['scoreCofing'] = getUsersConfigData('score');
// 上一个页面来源
$from = input('param.from/s');
if ('money_index' == $from) {
$backurl = url('Member/money_index');
} else {
$backurl = url('Member/users_index');
}
$assign_data['backurl'] = $backurl;
// 是否弹窗打开
$iframe = input('param.iframe/d',0);
$assign_data['iframe'] = $iframe;
$assign_data['users_lock_model'] = config('global.users_lock_model');
//订单信息
$assign_data['order_count'] = Db::name('shop_order')->where('order_status',3)->where('users_id',$users_id)->field('count(*) as count,sum(order_amount) as sum')->select();
$assign_data['refund_count'] = Db::name('shop_order_service')
->where('users_id',$users_id)
->where('service_type',2)
->where('status',7)
->field('count(*) as count,sum(refund_price) as sum')->select();
$this->assign($assign_data);
/*等保密码复杂度验证 start*/
$pwdJsCode = '';
if (is_dir('./weapp/Equal/')) {
$equalLogic = new \weapp\Equal\logic\EqualLogic;
$pwdJsCode = $equalLogic->pwdJsCode();
}
if ('close' == $pwdJsCode) {
$pwdJsCode = '';
}
$this->assign('pwdJsCode', $pwdJsCode);
/*等保密码复杂度验证 end*/
// 如果安装手机端后台管理插件并且在手机端访问时执行
$isMobile = input('param.isMobile/d', 0);
if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) {
return $this->display('member/users_edit');
} else {
return $this->fetch();
}
}
public function query_level_days()
{
$level_id = input('level_id/d', 0);
if (IS_AJAX_POST && !empty($level_id)) {
$maturity_days = 0;
// 查询会员级别的天数
$where = [
'level_id' => intval($level_id)
];
$limitID = Db::name('users_type_manage')->where($where)->order('limit_id desc')->getField('limit_id');
if (!empty($limitID)) {
$adminMemberLimitArr = config('global.admin_member_limit_arr');
$maturity_days = !empty($adminMemberLimitArr[$limitID]['maturity_days']) ? intval($adminMemberLimitArr[$limitID]['maturity_days']) : 0;
}
$this->success('查询正确', null, $maturity_days);
}
}
// 会员删除
public function users_del()
{
$users_id = input('del_id/a');
$users_id = eyIntval($users_id);
if (IS_AJAX_POST && !empty($users_id)) {
// 删除统一条件
$Where = [
'users_id' => ['IN', $users_id],
];
$result = $this->users_db->field('username,users_id')->where($Where)->select();
$username_list = $users_ids = [];
foreach ($result as $key => $val) {
$username_list[] = $val['username'];
$users_ids[] = $val['users_id'];
}
$return = $this->users_db->where($Where)->delete();
if (false !== $return) {
\think\Cache::clear('users_list');
adminLog('删除会员:'.implode(',', $username_list));
// 如果安装了分销插件则执行
if (is_dir('./weapp/DealerPlugin/')) {
// 开启分销插件则执行
$data = model('Weapp')->getWeappList('DealerPlugin');
if (!empty($data['status']) && 1 == $data['status']) {
// 调用分销逻辑层方法
$dealerCommonLogic = new \weapp\DealerPlugin\logic\DealerCommonLogic;
$dealerCommonLogic->dealerSynchronizeDelete($users_ids);
}
}
model('Member')->afterDel($users_ids);
$this->success('删除成功');
}else{
$this->error('删除失败');
}
}
$this->error('参数有误');
}
// 级别列表
public function level_index()
{
$list = array();
$keywords = input('keywords/s');
$condition = array();
// 应用搜索条件
if (!empty($keywords)) {
$condition['a.level_name'] = array('LIKE', "%{$keywords}%");
}
/**
* 数据查询
*/
$count = $this->users_level_db->alias('a')->where($condition)->count();// 查询满足要求的总记录数
$Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$list = $this->users_level_db->field('a.*')
->alias('a')
->where($condition)
->order('a.level_value asc, a.level_id asc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
$show = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->assign('list',$list);// 赋值数据集
$this->assign('pager',$Page);// 赋值分页集
// 用于判断是否可以删除会员级别,当会员级别下存在会员时,不可删除。
$levelgroup = $this->users_db->field('level')
->group('level')
->getAllWithIndex('level');
$this->assign('levelgroup',$levelgroup);
/*是否安装启用下载次数限制插件*/
$isShowDownCount = 0;
if (is_dir('./weapp/Downloads/')) {
$DownloadsRow = model('Weapp')->getWeappList('Downloads');
if (!empty($DownloadsRow['status']) && 1 == $DownloadsRow['status']) {
$isShowDownCount = 1;
}
}
$this->assign('isShowDownCount', $isShowDownCount);
/*end*/
return $this->fetch();
}
// 级别 - 新增
public function level_add()
{
if (IS_POST) {
$post = input('post.');
// 级别名称不可重复
$PostLevelName = array_unique($post['level_name']);
if (count($PostLevelName) != count($post['level_name'])) {
$this->error('级别名称不可重复!');
}
// 会员等级值不可重复
$PostLevelValue = array_unique($post['level_value']);
if (count($PostLevelValue) != count($post['level_value'])) {
$this->error('会员等级值不可重复!');
}
// 数据拼装
$AddUsersLevelData = $where = [];
foreach ($post['level_name'] as $key => $value) {
$level_id = $post['level_id'][$key];
$level_name = trim($value);
$level_value = intval(trim($post['level_value'][$key]));
if (isset($post['discount'][$key])) {
$discount = trim($post['discount'][$key]);
if ($discount < 0 || $discount == '') {
$discount = 100;
}
} else {
$discount = 100;
}
$down_count = isset($post['down_count'][$key]) ? intval($post['down_count'][$key]) : 100;
if (empty($level_name)) $this->error('级别名称不可为空!');
if (empty($level_value)) $this->error('会员等级值不可为空!');
$AddUsersLevelData[$key] = [
'level_id' => $level_id,
'level_name' => $level_name,
'level_value' => $level_value,
'discount' => $discount,
'down_count' => $down_count,
'update_time' => getTime(),
];
if (empty($level_id)) {
$AddUsersLevelData[$key]['lang'] = $this->admin_lang;
$AddUsersLevelData[$key]['add_time'] = getTime();
unset($AddUsersLevelData[$key]['level_id']);
}
}
$ReturnId = model('UsersLevel')->saveAll($AddUsersLevelData);
if ($ReturnId) {
\think\Cache::clear('users_level');
adminLog('新增会员级别:'.implode(',', $post['level_name']));
$this->success('操作成功', url('Member/level_index'));
} else {
$this->error('操作失败');
}
}
return $this->fetch();
}
// 级别 - 删除
public function level_del()
{
$level_id = input('del_id/a');
$level_id = eyIntval($level_id);
if (IS_AJAX_POST && !empty($level_id)) {
// 查询条件
$where = [
'level_id' => ['IN', $level_id],
];
// 查询会员级别
$result = model('UsersLevel')->getList('level_name,is_system,level_value', $where);
$level_name_list = get_arr_column($result, 'level_name');
// 系统内置级别不可删除
foreach ($result as $val) {
if (1 == intval($val['is_system'])) {
$this->error('系统内置,不可删除!');
}
}
// 有使用的会员不可删除
$info = $this->users_db->where([
'level' => ['IN', $level_id],
])->count();
if (!empty($info)) {
$this->error('选中的级别存在会员,不可删除!');
}
// 删除指定级别
$return = $this->users_level_db->where($where)->delete();
if ($return) {
// 查询指定会员级别
$where1 = [
'level_value' => ['>', $result[0]['level_value']],
];
$result_1 = $this->users_level_db->where($where1)->order('level_value asc')->field('level_id')->find();
if (empty($result_1)) {
$where1 = [
'level_value' => ['<', $result[0]['level_value']],
];
$result_1 = $this->users_level_db->where($where1)->order('level_value asc')->field('level_id')->find();
}
// 拼装更新条件
$UpData = [
'level_id' => $result_1['level_id'],
'update_time' => getTime(),
];
// 更新会员升级表数据
Db::name('users_type_manage')->where($where)->update($UpData);
\think\Cache::clear('users_level');
adminLog('删除会员级别:'.implode(',', $level_name_list));
$this->success('删除成功');
}else{
$this->error('删除失败');
}
}
$this->error('参数有误');
}
// 属性列表
public function attr_index()
{
//属性数据
$info = $this->users_parameter_db->field('a.*,a.title,b.title as dtypetitle')
->alias('a')
->join('__FIELD_TYPE__ b', 'a.dtype = b.name', 'LEFT')
->order('a.is_system desc,a.sort_order asc,a.para_id desc')
->select();
foreach ($info as $key => $value) {
if ('email' == $value['dtype']) {
$info[$key]['dtypetitle'] = '邮箱地址';
} else if ('mobile' == $value['dtype']) {
$info[$key]['dtypetitle'] = '手机号码';
}else if ('datetime' == $value['dtype']) {
$info[$key]['dtypetitle'] = '日期和时间';
}
}
$this->assign('info',$info);
return $this->fetch();
}
// 属性添加
public function attr_add()
{
if (IS_POST) {
$post = input('post.');
$post['title'] = trim($post['title']);
if (empty($post['title'])) {
$this->error('属性标题不能为空!');
}
if (empty($post['dtype'])) {
$this->error('请选择属性类型!');
}
$count = $this->users_parameter_db->where([
'title'=>$post['title']
])->count();
if (!empty($count)) {
$this->error('属性标题已存在!');
}
$post['dfvalue'] = str_replace(',', ',', $post['dfvalue']);
$post['dfvalue'] = trim($post['dfvalue'], ',');
/*判断默认值是否含有重复值*/
if (in_array($post['dtype'], ['radio','checkbox','select'])) {
if (!empty($post['dfvalue'])){
$dfvalue_arr = [];
$dfvalue_arr = explode(',', $post['dfvalue']);
foreach ($dfvalue_arr as &$v) {
$v = trim($v);
}
if (count($dfvalue_arr) != count(array_unique($dfvalue_arr))) {
$this->error('默认值不能含有相同的值!');
}
}
}
/*end*/
$post['add_time'] = getTime();
$post['lang'] = $this->admin_lang;
$post['sort_order'] = '100';
$para_id = $this->users_parameter_db->insertGetId($post);
if (!empty($para_id)) {
$name = 'para_'.$para_id;
$return = $this->users_parameter_db->where('para_id',$para_id)
->update([
'name' => $name,
'update_time' => getTime(),
]);
if ($return !== false) {
\think\Cache::clear('users_parameter');
\think\Cache::clear('users_list');
adminLog('新增会员属性:'.$post['title']);
$this->success('操作成功',url('Member/attr_index'));
}
}
$this->error('操作失败');
}
$field = $this->field_type_db->field('name,title,ifoption')
->where([
'name' => ['IN', ['text','checkbox','multitext','radio','select','img','file','datetime','imgs']]
])
->select();
$this->assign('field',$field);
return $this->fetch();
}
// 属性修改
public function attr_edit()
{
$para_id = input('param.id/d');
if (IS_POST && !empty($para_id)) {
$post = input('post.');
$post['title'] = trim($post['title']);
if (empty($post['title'])) {
$this->error('属性标题不能为空!');
}
if (empty($post['dtype'])) {
$this->error('请选择属性类型!');
}
$count = $this->users_parameter_db->where([
'title' => $post['title'],
'para_id' => ['NEQ', $para_id],
])->count();
if ($count) {
$this->error('属性标题已存在!');
}
$post['dfvalue'] = str_replace(',', ',', $post['dfvalue']);
$post['dfvalue'] = trim($post['dfvalue'], ',');
/*判断默认值是否含有重复值*/
if (in_array($post['dtype'], ['radio','checkbox','select'])) {
if (!empty($post['dfvalue'])){
$dfvalue_arr = [];
$dfvalue_arr = explode(',', $post['dfvalue']);
foreach ($dfvalue_arr as &$v) {
$v = trim($v);
}
if (count($dfvalue_arr) != count(array_unique($dfvalue_arr))) {
$this->error('默认值不能含有相同的值!');
}
}
}
/*end*/
$post['update_time'] = getTime();
$return = $this->users_parameter_db->where([
'para_id' => $para_id,
])->update($post);
if ($return !== false) {
\think\Cache::clear('users_parameter');
\think\Cache::clear('users_list');
adminLog('编辑会员属性:'.$post['title']);
$this->success('操作成功',url('Member/attr_index'));
}else{
$this->error('操作失败');
}
}
$info = $this->users_parameter_db->where([
'para_id' => $para_id,
])->find();
$this->assign('info',$info);
$field = $this->field_type_db->field('name,title,ifoption')
->where([
'name' => ['IN', ['text','checkbox','multitext','radio','select','img','file','datetime','imgs']]
])
->select();
$this->assign('field',$field);
return $this->fetch();
}
// 属性删除
public function attr_del()
{
$para_id = input('del_id/a');
$para_id = eyIntval($para_id);
if (IS_AJAX_POST && !empty($para_id)) {
$result = $this->users_parameter_db->field('title')
->where([
'para_id' => ['IN', $para_id],
])
->select();
$title_list = get_arr_column($result, 'title');
// 删除会员属性表数据
$return = $this->users_parameter_db->where([
'para_id' => ['IN', $para_id],
])->delete();
if ($return !== false) {
// 删除会员属性信息表数据
$this->users_list_db->where([
'para_id' => ['IN', $para_id],
])->delete();
\think\Cache::clear('users_parameter');
\think\Cache::clear('users_list');
adminLog('删除会员属性:'.implode(',', $title_list));
$this->success('删除成功');
}
}
$this->error('删除失败');
}
// 功能设置
public function users_config()
{
if (IS_POST) {
$post = input('post.');
// 邮件验证的检测
if (2 == $post['users']['users_verification']) {
$users_config_email = $this->users_config_email();
if (!empty($users_config_email)) {
$this->error($users_config_email);
}
}
// 第三方登录
if (!empty($post['oauth']['oauth_open']) && 1 == $post['oauth']['oauth_open']) {
empty($post['oauth']['oauth_qq']) && $post['oauth']['oauth_qq'] = 0;
empty($post['oauth']['oauth_weixin']) && $post['oauth']['oauth_weixin'] = 0;
empty($post['oauth']['oauth_weibo']) && $post['oauth']['oauth_weibo'] = 0;
}
/*前台登录超时*/
$users_login_expiretime = $post['users']['users_login_expiretime'];
$login_expiretime_old = $post['users']['login_expiretime_old'];
unset($post['users']['login_expiretime_old']);
if ($login_expiretime_old != $users_login_expiretime) {
$users_login_expiretime = preg_replace('/^(\d{0,})(.*)$/i', '${1}', $users_login_expiretime);
empty($users_login_expiretime) && $users_login_expiretime = config('login_expire');
if ($users_login_expiretime > 2592000) {
$users_login_expiretime = 2592000; // 最多一个月
}
$post['users']['users_login_expiretime'] = $users_login_expiretime;
//后台登录超时时间
$web_login_expiretime = tpCache('global.web_login_expiretime');
//前台和后台谁设置的时间大就用谁的做session过期时间
$max_login_expiretime = $web_login_expiretime;
if ($web_login_expiretime < $users_login_expiretime){
$max_login_expiretime = $users_login_expiretime;
}
}
/*--end*/
// 会员投稿设置
if (!empty($this->userConfig['users_open_release'])) {
unset($post['release_typeids']);
unset($post['users']['is_automatic_review']);
unset($post['users']['is_open_posts_count']);
}
// 会员模板切换/前台会员登录过期时间
tpCache('web', $post['web']);
foreach ($post as $key => $val) {
if ('web' == $key) {
continue;
}
getUsersConfigData($key, $val);
}
// 主题色切换
getUsersConfigData('theme', ['users_theme_style_uptime'=>getTime()]);
$ajaxLogic = new \app\admin\logic\AjaxLogic;
$ajaxLogic->users_update_theme_css();
/*更改session会员设置 - session有效期(前台登录超时)*/
if ($login_expiretime_old != $users_login_expiretime) {
$session_conf = [];
$session_file = APP_PATH.'admin/conf/session_conf.php';
if (file_exists($session_file)) {
require_once($session_file);
$session_conf_tmp = EY_SESSION_CONF;
if (!empty($session_conf_tmp)) {
$session_conf_tmp = json_decode($session_conf_tmp, true);
if (!empty($session_conf_tmp) && is_array($session_conf_tmp)) {
$session_conf = $session_conf_tmp;
}
}
}
$session_conf['expire'] = $max_login_expiretime;
$str_session_conf = 'success('操作成功');
}
// 获取会员配置信息
$this->assign('info',$this->userConfig);
// 获取会员配置信息
$this->assign('web_users_tpl_theme', tpCache('global.web_users_tpl_theme'));
// 左侧菜单
$usersTplVersion = getUsersTplVersion();
$this->assign('usersTplVersion', $usersTplVersion);
/*允许发布文档列表的栏目*/
$current_channel = [1,3,4,5]; // 允许投稿的模型
$arctype = Db::name('arctype')->where([
'current_channel' => ['in',$current_channel],
'is_release' => 1,
'lang' => $this->admin_lang,
])->field('id')->select();
$arctype = get_arr_column($arctype,'id');
$release_select_html = allow_release_arctype($arctype, $current_channel);
if (empty($current_channel)){
$release_select_html = [];
}
$this->assign('release_select_html',$release_select_html);
/*--end*/
/*模板风格列表*/
$web_tpl_theme = config('ey_config.web_tpl_theme');
!empty($web_tpl_theme) && $web_tpl_theme .= '/';
$tpl_theme_list = glob('./template/'.$web_tpl_theme.'pc/users*', GLOB_ONLYDIR);
foreach ($tpl_theme_list as $key => &$val) {
$val = str_replace('\\', '/', $val);
$val = preg_replace('/^(.*)\/([^\/]*)$/i', '${2}', $val);
}
$this->assign('tpl_theme_list', $tpl_theme_list);
/*end*/
return $this->fetch();
}
// 邮件验证的检测
public function ajax_users_config_email()
{
if (IS_AJAX) {
// 邮件验证的检测
$users_config_email = $this->users_config_email();
if (!empty($users_config_email)) $this->error($users_config_email);
$this->success('检验通过');
}
$this->error('参数有误');
}
private function users_config_email(){
// 会员属性信息
$where = array(
'name' => ['LIKE', "email_%"],
'is_system' => 1,
);
// 是否要为必填项
$param = $this->users_parameter_db->where($where)->field('title,is_hidden')->find();
if (empty($param) || 1 == $param['is_hidden']) {
return "请先把会员字段的{$param['title']}设置为显示,且为必填项!";
}
$param = $this->users_parameter_db->where($where)->field('title,is_required')->find();
if (empty($param) || 0 == $param['is_required']) {
return "请先把会员字段的{$param['title']}设置为必填项!";
}
// 是否开启邮箱发送扩展
$openssl_funcs = get_extension_funcs('openssl');
if (!$openssl_funcs) {
return "请联系空间商,开启php的 openssl 扩展!";
}
$send_email_scene = config('send_email_scene');
$scene = $send_email_scene[2]['scene'];
// 自动启用注册邮件模板
Db::name('smtp_tpl')->where([
'send_scene' => $scene,
'lang' => $this->admin_lang,
])->update([
'is_open' => 1,
'update_time' => getTime(),
]);
// 是否填写邮件配置
$globalConfig = tpCache('global');
if (empty($globalConfig['smtp_user']) || empty($globalConfig['smtp_pwd'])) {
return "请先完善(邮件配置),具体步骤【基本信息】->【接口配置】->【邮件配置】";
}
return false;
}
// 手机验证的检测
public function ajax_users_config_mobile()
{
if (IS_AJAX) {
// 邮件验证的检测
$users_config_mobile = $this->users_config_mobile();
if (!empty($users_config_mobile)) $this->error($users_config_mobile);
$this->success('检验通过');
}
$this->error('参数有误');
}
private function users_config_mobile(){
// 会员属性信息
$where = array(
'name' => ['LIKE', "mobile_%"],
'is_system' => 1
);
// 是否要为必填项
$param = $this->users_parameter_db->where($where)->field('title, is_hidden')->find();
if (empty($param) || 1 == $param['is_hidden']) {
return "请先把会员字段的{$param['title']}设置为显示,且为必填项!";
}
$param = $this->users_parameter_db->where($where)->field('title, is_required')->find();
if (empty($param) || 0 == $param['is_required']) {
return "请先把会员字段的{$param['title']}设置为必填项!";
}
// 自动启用注册手机模板
Db::name('sms_template')->where([
'send_scene' => 0,
'lang' => $this->admin_lang,
])->update([
'is_open' => 1,
'update_time' => getTime()
]);
// 是否填写手机短信配置
$globalConfig = tpCache('global');
if ( (1 == $globalConfig['sms_type'] && (empty($globalConfig['sms_appkey']) || empty($globalConfig['sms_secretkey'])))
|| (2 == $globalConfig['sms_type'] && (empty($globalConfig['sms_appid_tx']) || empty($globalConfig['sms_appkey_tx'])))
) {
return "请先完善(短信配置),具体步骤【基本信息】->【接口配置】->【短信配置】";
}
return false;
}
// 充值记录列表
public function money_index()
{
$list = array();
// 查询条件
$condition = [
'a.cause_type' => 1,
];
// 应用搜索条件
$keywords = input('keywords/s');
if (!empty($keywords)) $condition['a.order_number|b.username'] = array('LIKE', "%{$keywords}%");
// 支付方式查询
$pay_method = input('pay_method/s');
if (!empty($pay_method)) $condition['a.pay_method'] = $pay_method;
// 会员级别查询
$level = input('level/s');
if (!empty($level)) $condition['b.level'] = $level;
// 订单状态搜索
$order_status = input('param.status/d');
if ($order_status) $condition['a.status'] = in_array($order_status, [2, 3]) ? ['IN', [2, 3]] : $order_status;
// 时间检索条件
$begin = strtotime(input('param.add_time_begin/s'));
$end = input('param.add_time_end/s');
!empty($end) && $end .= ' 23:59:59';
$end = strtotime($end);
// 时间检索
if ($begin > 0 && $end > 0) {
$condition['a.add_time'] = array('between', "$begin, $end");
} else if ($begin > 0) {
$condition['a.add_time'] = array('egt', $begin);
} else if ($end > 0) {
$condition['a.add_time'] = array('elt', $end);
}
// 分页查询
$count = $this->users_money_db->alias('a')->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')->where($condition)->count();
$Page = new Page($count, config('paginate.list_rows'));
// 数据查询
$list = $this->users_money_db->field('a.*, b.head_pic, b.username, b.nickname, b.level')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where($condition)
->order('a.moneyid desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $key => $value) {
$value['username'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
$value['head_pic'] = get_head_pic($value['head_pic']);
$list[$key] = $value;
}
$show = $Page->show();
$this->assign('page', $show);
$this->assign('list', $list);
$this->assign('pager', $Page);
// 会员等级列表
$usersLevel = model('UsersLevel')->getList('level_id, level_name', [], 'level_id');
$this->assign('usersLevel', $usersLevel);
// 充值状态
$pay_status_arr = config('global.pay_status_arr');
$this->assign('pay_status_arr', $pay_status_arr);
// 是否开启文章付费
$channelRow = Db::name('channeltype')->where('nid', 'in',['article','download'])->getAllWithIndex('nid');
foreach ($channelRow as &$val){
if (!empty($val['data'])) $val['data'] = json_decode($val['data'], true);
}
$this->assign('channelRow', $channelRow);
return $this->fetch();
}
// 充值记录编辑
public function money_edit()
{
$param = input('param.');
$MoneyData = $this->users_money_db->find($param['moneyid']);
$this->assign('MoneyData',$MoneyData);
$UsersData = $this->users_db->find($MoneyData['users_id']);
$this->assign('UsersData',$UsersData);
// 支付宝查询订单
if ('alipay' == $MoneyData['pay_method']) {
$return = $this->check_alipay_order($MoneyData['order_number']);
$this->assign('return',$return);
}
// 微信查询订单
if ('wechat' == $MoneyData['pay_method']) {
$return = $this->check_wechat_order($MoneyData['order_number']);
$this->assign('return',$return);
}
// 人为处理订单
if ('artificial' == $MoneyData['pay_method']) {
$return = '人为处理';
$this->assign('return',$return);
}
// 获取订单状态
$pay_status_arr = Config::get('global.pay_status_arr');
$this->assign('pay_status_arr',$pay_status_arr);
// 支付方式
$pay_method_arr = config('global.pay_method_arr');
$this->assign('pay_method_arr',$pay_method_arr);
return $this->fetch();
}
/**
* 删除充值记录
*/
public function money_del()
{
if (IS_POST) {
$id_arr = input('del_id/a');
$id_arr = eyIntval($id_arr);
if(!empty($id_arr)){
$result = Db::name('users_money')->field('order_number')
->where([
'moneyid' => ['IN', $id_arr],
])->select();
$order_number_list = get_arr_column($result, 'order_number');
$r = Db::name('users_money')->where([
'moneyid' => ['IN', $id_arr],
])
->cache(true, null, "users_money")
->delete();
if($r !== false){
adminLog('删除充值记录:'.implode(',', $order_number_list));
$this->success('删除成功');
}
}
$this->error('删除失败');
}
$this->error('非法访问');
}
// 标记订单逻辑
public function money_mark_order()
{
if (IS_POST) {
$moneyid = input('param.moneyid/d');
// 查询订单信息
$MoneyData = $this->users_money_db->where([
'moneyid' => $moneyid,
])->find();
// 处理订单逻辑
if (in_array($MoneyData['status'], [1,3])) {
$users_id = $MoneyData['users_id'];
$order_number = $MoneyData['order_number'];
$return = '';
if ('alipay' == $MoneyData['pay_method']) { // 支付宝查询订单
$return = $this->check_alipay_order($order_number);
} else if ('wechat' == $MoneyData['pay_method']) { // 微信查询订单
$return = $this->check_wechat_order($order_number);
} else if ('artificial' == $MoneyData['pay_method']) { // 手工充值订单
$return = '手工充值';
}
$result = [
'users_id' => $users_id,
'order_number'=> $order_number,
'status' => '手动标记为已充值订单',
'details' => '充值详情:'.$return,
'pay_method' => 'artificial', //人为处理
'money' => $MoneyData['money'],
'users_money' => $MoneyData['users_money'],
];
// 标记为未付款
if (3 == $MoneyData['status']) {
$result['status'] = '手动标记为未付款订单';
} else if (1 == $MoneyData['status']) {
$result['status'] = '手动标记为已充值订单';
}
// 修改会员充值明细表对应的订单数据,存入返回的数据,订单标记为已付款
$Where = [
'moneyid' => $MoneyData['moneyid'],
'users_id' => $users_id,
];
$UpdateData = [
'pay_details' => serialize($result),
'update_time' => getTime(),
];
// 标记为未付款时则状态更新为1
if (3 == $MoneyData['status']) {
$UpdateData['status'] = 1;
} else if (1 == $MoneyData['status']) {
$UpdateData['status'] = 3;
$UpdateData['pay_method'] = 'admin_pay';
$UpdateData['wechat_pay_type'] = '';
}
$IsMoney = $this->users_money_db->where($Where)->update($UpdateData);
if (!empty($IsMoney)) {
// 同步修改会员的金额
$UsersData = [
'update_time' => getTime(),
];
// 标记为未付款时则减去金额
if (3 == $MoneyData['status']) {
$UsersData = $this->users_db->field('users_money')->find($users_id);
if ($UsersData['users_money'] <= $MoneyData['money']) {
$UsersData['users_money'] = 0;
}else{
$UsersData['users_money'] = Db::raw('users_money-'.$MoneyData['money']);
}
} else if (1 == $MoneyData['status']) {
$UsersData['users_money'] = Db::raw('users_money+'.$MoneyData['money']);
}
$IsUsers = $this->users_db->where('users_id',$users_id)->update($UsersData);
if (!empty($IsUsers)) {
$this->success('操作成功');
}
}
}
$this->error('操作失败');
}
}
// 查询订单付款状态(微信)
private function check_wechat_order($order_number)
{
if (!empty($order_number)) {
// 引入文件
vendor('wechatpay.lib.WxPayApi');
vendor('wechatpay.lib.WxPayConfig');
// 实例化加载订单号
$input = new \WxPayOrderQuery;
$input->SetOut_trade_no($order_number);
// 处理微信配置数据
$pay_wechat_config = !empty($this->userConfig['pay_wechat_config']) ? $this->userConfig['pay_wechat_config'] : '';
$pay_wechat_config = unserialize($pay_wechat_config);
$config_data['app_id'] = $pay_wechat_config['appid'];
$config_data['mch_id'] = $pay_wechat_config['mchid'];
$config_data['key'] = $pay_wechat_config['key'];
// 实例化微信配置
$config = new \WxPayConfig($config_data);
$wxpayapi = new \WxPayApi;
// 返回结果
$result = $wxpayapi->orderQuery($config, $input);
// 判断结果
if ('ORDERNOTEXIST' == $result['err_code'] && 'FAIL' == $result['result_code']) {
return '订单在微信中不存在!';
}else if ('NOTPAY' == $result['trade_state'] && 'SUCCESS' == $result['result_code']) {
return '订单在微信中生成,但并未支付完成!';
}else if ('SUCCESS' == $result['trade_state'] && 'SUCCESS' == $result['result_code']) {
return '订单已使用'.$result['attach'].'完成!';
}
}else{
return false;
}
}
// 查询订单付款状态(支付宝)
private function check_alipay_order($order_number,$admin_pay='',$alipay='')
{
if (!empty($order_number)) {
// 引入文件
vendor('alipay.pagepay.service.AlipayTradeService');
vendor('alipay.pagepay.buildermodel.AlipayTradeQueryContentBuilder');
// 实例化加载订单号
$RequestBuilder = new \AlipayTradeQueryContentBuilder;
$out_trade_no = trim($order_number);
$RequestBuilder->setOutTradeNo($out_trade_no);
// 处理支付宝配置数据
if (empty($alipay)) {
$pay_alipay_config = !empty($this->userConfig['pay_alipay_config']) ? $this->userConfig['pay_alipay_config'] : '';
if (empty($pay_alipay_config)) {
return false;
}
$alipay = unserialize($pay_alipay_config);
}
$config['app_id'] = $alipay['app_id'];
$config['merchant_private_key'] = $alipay['merchant_private_key'];
$config['charset'] = 'UTF-8';
$config['sign_type'] = 'RSA2';
$config['gatewayUrl'] = 'https://openapi.alipay.com/gateway.do';
$config['alipay_public_key'] = $alipay['alipay_public_key'];
// 实例化支付宝配置
$aop = new \AlipayTradeService($config);
// 返回结果
if (!empty($admin_pay)) {
$result = $aop->IsQuery($RequestBuilder,$admin_pay);
}else{
$result = $aop->Query($RequestBuilder);
}
$result = json_decode(json_encode($result),true);
// 判断结果
if ('40004' == $result['code'] && 'Business Failed' == $result['msg']) {
// 用于支付宝支付配置验证
if (!empty($admin_pay)) { return 'ok'; }
// 用于订单查询
return '订单在支付宝中不存在!';
}else if ('10000' == $result['code'] && 'WAIT_BUYER_PAY' == $result['trade_status']) {
return '订单在支付宝中生成,但并未支付完成!';
}else if ('10000' == $result['code'] && 'TRADE_SUCCESS' == $result['trade_status']) {
return '订单已使用支付宝支付完成!';
}
// 用于支付宝支付配置验证
if (!empty($admin_pay) && !empty($result)) {
if ('40001' == $result['code'] && 'Missing Required Arguments' == $result['msg']) {
return '商户私钥错误!';
}
if (!is_array($result)) {
return $result;
}
}
}
}
/**
* 版本检测更新弹窗
*/
public function ajax_check_upgrade_version()
{
$memberLogic = new MemberLogic;
$upgradeMsg = $memberLogic->checkVersion(); // 升级包消息
$this->success('检测成功', null, $upgradeMsg);
}
/**
* 一键升级
*/
public function OneKeyUpgrade(){
header('Content-Type:application/json; charset=utf-8');
function_exists('set_time_limit') && set_time_limit(0);
/*权限控制 by 小虎哥*/
$auth_role_info = session('admin_info.auth_role_info');
if(0 < intval(session('admin_info.role_id')) && ! empty($auth_role_info) && intval($auth_role_info['online_update']) <= 0){
$this->error('您没有操作权限,请联系超级管理员分配权限');
}
/*--end*/
$memberLogic = new MemberLogic;
$data = $memberLogic->OneKeyUpgrade(); //升级包消息
if (1 <= intval($data['code'])) {
$this->success($data['msg'], null, ['code'=>$data['code']]);
} else {
$msg = '模板升级异常,请排查问题!';
if (is_array($data)) {
$msg = $data['msg'];
}
$this->error($msg);
}
}
/**
* 检测目录权限
*/
public function check_authority()
{
$filelist = input('param.filelist/s');
$memberLogic = new MemberLogic;
$data = $memberLogic->checkAuthority($filelist); //检测目录权限
if (is_array($data)) {
if (1 == $data['code']) {
$this->success($data['msg']);
} else {
$this->error($data['msg'], null, $data['data']);
}
} else {
$this->error('检测模板失败', null, ['code'=>1]);
}
}
// 前台会员左侧菜单
public function ajax_menu_index()
{
$list = array();
$condition = array();
$usersTplVersion = getUsersTplVersion();
if ('v2' == $usersTplVersion) {
$condition['a.version'] = array('EQ', $usersTplVersion);
} else {
$condition['a.version'] = array('IN', ['weapp', $usersTplVersion]);
}
/**
* 数据查询
*/
$count = Db::name('users_menu')->alias('a')->where($condition)->count();// 查询满足要求的总记录数
$Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$row = Db::name('users_menu')->field('a.*')
->alias('a')
->where($condition)
->order('a.sort_order asc, a.id asc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
$list = [];
foreach ($row as $key => $val) {
$list[] = $val;
}
$show = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->assign('list',$list);// 赋值数据集
$this->assign('pager',$Page);// 赋值分页集
return $this->fetch();
}
// 前台会员手机端底部菜单
public function ajax_bottom_menu_index()
{
$list = array();
$condition = array();
$condition['a.lang'] = $this->main_lang;
/**
* 数据查询
*/
$count = Db::name('users_bottom_menu')->alias('a')->where($condition)->count();// 查询满足要求的总记录数
$Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$list = Db::name('users_bottom_menu')->field('a.*')
->alias('a')
->where($condition)
->order('a.sort_order asc, a.id asc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
// 手机端会员中心底部菜单配置选项
$mobile_user_bottom_menu_config = Config::get('global.mobile_user_bottom_menu_config');
if ($mobile_user_bottom_menu_config) {
foreach ($mobile_user_bottom_menu_config as $key=>$v) {
switch ($v['mca']) {
case 'user/Level/level_centre':
$is_open = getUsersConfigData('level.level_member_upgrade');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/Pay/pay_account_recharge':
$is_open = getUsersConfigData('level.level_member_upgrade');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/Shop/shop_centre':
$is_open = getUsersConfigData('shop.shop_open');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/Shop/shop_cart_list':
$is_open = getUsersConfigData('shop.shop_open');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/UsersRelease/article_add':
$is_open = getUsersConfigData('users.users_open_release');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/UsersRelease/release_centre':
$is_open = getUsersConfigData('users.users_open_release');
if (!$is_open || $is_open != 1) unset($mobile_user_bottom_menu_config[$key]);
break;
case 'user/Download/index':
$is_open = Db::name("channeltype")->where(['nid'=>'download','status'=>1])->value("id");
if (!$is_open) unset($mobile_user_bottom_menu_config[$key]);
break;
}
}
}
$this->assign('mobile_user_bottom_menu_config',$mobile_user_bottom_menu_config);
$show = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->assign('list',$list);// 赋值数据集
$this->assign('pager',$Page);// 赋值分页集
return $this->fetch();
}
/**
* 登录会员面板
*/
public function syn_users_login($users_id = 0, $mca = '', $vars = [])
{
if (!empty($users_id)) {
$users = Db::name('users')->field('a.*,b.level_name,b.level_value,b.discount as level_discount')
->alias('a')
->join('__USERS_LEVEL__ b', 'a.level = b.level_id', 'LEFT')
->where([
'a.users_id' => $users_id,
'a.is_del' => 0,
])->find();
if (!empty($users)) {
session('users_id',$users_id);
session('users_login_expire', getTime()); // 登录有效期
$url = get_homeurl($mca, $vars);
$this->redirect($url);
} else {
$this->error('该用户不存在!');
}
}
}
// --------------------------视频订单------------------------------ //
// 视频订单列表页
public function media_index()
{
// 定义数组
$condition = [];
// 订单状态搜索
$order_status = input('param.order_status/d', 0);
if (!empty($order_status)) $condition['a.order_status'] = intval($order_status) === 1 ? intval($order_status) : 0;
// 订单号或用户名搜索
$keywords = input('keywords/s', '');
if (!empty($keywords)) $condition['a.order_code|b.username'] = ['LIKE', "%{$keywords}%"];
// 支付方式查询
$pay_name = input('pay_name/s', '');
if (!empty($pay_name)) $condition['a.pay_name'] = $pay_name;
// 时间检索条件
$begin = strtotime(input('param.add_time_begin/s'));
$end = input('param.add_time_end/s');
!empty($end) && $end .= ' 23:59:59';
$end = strtotime($end);
// 时间检索
if ($begin > 0 && $end > 0) {
$condition['a.add_time'] = array('between', "$begin, $end");
} else if ($begin > 0) {
$condition['a.add_time'] = array('egt', $begin);
} else if ($end > 0) {
$condition['a.add_time'] = array('elt', $end);
}
// 分页查询
$count = Db::name('media_order')->alias('a')->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')->where($condition)->count();
$Page = new Page($count, config('paginate.list_rows'));
// 数据查询
$list = Db::name('media_order')->where($condition)
->field('a.*, b.head_pic, b.username, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->order('a.order_id desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $key => $value) {
$value['username'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
$value['head_pic'] = get_head_pic($value['head_pic']);
$list[$key] = $value;
}
$show = $Page->show();
$this->assign('list', $list);
$this->assign('page', $show);
$this->assign('pager', $Page);
// 是否开启文章付费
$channelRow = Db::name('channeltype')->where('nid', 'in',['article','download'])->getAllWithIndex('nid');
foreach ($channelRow as &$val){
if (!empty($val['data'])) $val['data'] = json_decode($val['data'], true);
}
$this->assign('channelRow', $channelRow);
return $this->fetch();
}
// 视频订单详情页
public function media_order_details()
{
$order_id = input('param.order_id/d');
if (!empty($order_id)) {
// 查询订单信息
$OrderData = Db::name('media_order')->field('*, product_id as aid')->find($order_id);
// 查询会员数据
$UsersData = $this->users_db->find($OrderData['users_id']);
// 用于点击视频文档跳转到前台
$array_new = get_archives_data([$OrderData], 'product_id');
// 内页地址
$OrderData['arcurl'] = get_arcurl($array_new[$OrderData['product_id']]);
// 支持子目录
$OrderData['product_litpic'] = get_default_pic($OrderData['product_litpic']);
// 加载数据
$this->assign('OrderData', $OrderData);
$this->assign('UsersData', $UsersData);
return $this->fetch();
} else {
$this->error('非法访问!');
}
}
// 视频订单批量删除
public function media_order_del()
{
$order_id = input('del_id/a');
$order_id = eyIntval($order_id);
if (IS_AJAX_POST && !empty($order_id)) {
// 条件数组
$Where = [
'order_id' => ['IN', $order_id],
];
$result = Db::name('media_order')->field('order_code')->where($Where)->select();
$order_code_list = get_arr_column($result, 'order_code');
// 删除订单列表数据
$return = Db::name('media_order')->where($Where)->delete();
if ($return) {
adminLog('删除订单:'.implode(',', $order_code_list));
$this->success('删除成功');
} else {
$this->error('删除失败');
}
}
$this->error('参数有误');
}
// --------------------------视频订单------------------------------ //
// 文章订单列表页
public function article_index()
{
// 定义数组
$condition = [];
// 订单状态搜索
$order_status = input('param.order_status/d', 0);
if (!empty($order_status)) $condition['a.order_status'] = intval($order_status) === 1 ? intval($order_status) : 0;
// 订单号或用户名搜索
$keywords = input('keywords/s', '');
if (!empty($keywords)) $condition['a.order_code|b.username'] = ['LIKE', "%{$keywords}%"];
// 支付方式查询
$pay_name = input('pay_name/s', '');
if (!empty($pay_name)) $condition['a.pay_name'] = $pay_name;
// 时间检索条件
$begin = strtotime(input('param.add_time_begin/s'));
$end = input('param.add_time_end/s');
!empty($end) && $end .= ' 23:59:59';
$end = strtotime($end);
// 时间检索
if ($begin > 0 && $end > 0) {
$condition['a.add_time'] = array('between', "$begin, $end");
} else if ($begin > 0) {
$condition['a.add_time'] = array('egt', $begin);
} else if ($end > 0) {
$condition['a.add_time'] = array('elt', $end);
}
// 分页查询
$count = Db::name('article_order')->alias('a')->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')->where($condition)->count();
$Page = new Page($count, config('paginate.list_rows'));
// 数据查询
$list = Db::name('article_order')->where($condition)
->field('a.*, b.head_pic, b.username, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->order('a.order_id desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $key => $value) {
$value['username'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
$value['head_pic'] = get_head_pic($value['head_pic']);
$list[$key] = $value;
}
$show = $Page->show();
$this->assign('list', $list);
$this->assign('page', $show);
$this->assign('pager', $Page);
// 是否开启文章付费
$channelRow = Db::name('channeltype')->where('nid', 'in',['article','download'])->getAllWithIndex('nid');
foreach ($channelRow as &$val){
if (!empty($val['data'])) $val['data'] = json_decode($val['data'], true);
}
$this->assign('channelRow', $channelRow);
return $this->fetch();
}
// 文章订单详情页
public function article_order_details()
{
$order_id = input('param.order_id/d');
if (!empty($order_id)) {
$OrderData = Db::name('article_order')->field('*, product_id as aid')->find($order_id);
$UsersData = $this->users_db->find($OrderData['users_id']);
// 用于点击视频文档跳转到前台
$array_new = get_archives_data([$OrderData], 'product_id');
// 内页地址
$OrderData['arcurl'] = get_arcurl($array_new[$OrderData['product_id']]);
// 支持子目录
$OrderData['product_litpic'] = get_default_pic($OrderData['product_litpic']);
$this->assign('OrderData', $OrderData);
$this->assign('UsersData', $UsersData);
return $this->fetch();
} else {
$this->error('非法访问!');
}
}
// 文章订单批量删除
public function article_order_del()
{
$order_id = input('del_id/a');
$order_id = eyIntval($order_id);
if (IS_AJAX_POST && !empty($order_id)) {
$Where = [
'order_id' => ['IN', $order_id],
];
$result = Db::name('article_order')->field('order_code')->where($Where)->select();
$order_code_list = get_arr_column($result, 'order_code');
// 删除订单列表数据
$return = Db::name('article_order')->where($Where)->delete();
if ($return) {
adminLog('删除文章订单:'.implode(',', $order_code_list));
$this->success('删除成功');
} else {
$this->error('删除失败');
}
}
$this->error('参数有误');
}
//积分明细
public function users_score_detail()
{
$condition = [];
$users_id = input('param.users_id/d');
$condition['a.users_id'] = $users_id;
$pagesize = 10;
$count = Db::name('users_score')->alias('a')->where($condition)->count();
$Page = new Page($count, $pagesize);
$list = Db::name('users_score')
->alias('a')
->field('a.*,b.user_name,c.nickname')
->where($condition)
->join('admin b','a.admin_id = b.admin_id','left')
->join('users c','c.users_id = a.users_id','left')
->order('a.id desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
$show = $Page->show();
$this->assign('page',$show);
$this->assign('list',$list);
$this->assign('pager',$Page);
return $this->fetch('member/edit/users_score_detail');
}
//余额明细
public function users_money_detail()
{
$users_id = input('param.users_id/d');
$condition = [
'a.users_id' => $users_id,
'a.status' => ['IN', [2, 3]],
];
$count = Db::name('users_money')->alias('a')->where($condition)->count();
$Page = new Page($count, 10);
$list = Db::name('users_money')
->alias('a')
->field('a.*,b.user_name,c.nickname')
->where($condition)
->join('admin b','a.admin_id = b.admin_id','left')
->join('users c','c.users_id = a.users_id','left')
->order('a.update_time desc, a.moneyid desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $k => $v) {
$v['money'] = floatval($v['money']);
$v['users_money'] = floatval($v['users_money']);
if (isset($v['cause_type']) && 0 == $v['cause_type']) $v['cause'] = unserialize($v['cause']);
$list[$k] = $v;
}
$show = $Page->show();
$this->assign('page', $show);
$this->assign('list', $list);
$this->assign('pager', $Page);
$this->assign('increase_type', [0, 3, 5, 6]);
$this->assign('pay_cause_type_arr', Config::get('global.pay_cause_type_arr'));
return $this->fetch('member/edit/users_money_detail');
}
// 余额充值
public function users_edit_money()
{
$post = input('param.');
$users_id = $post['users_id'] = intval($post['users_id']);
$users = $this->users_db->where('users_id', $users_id)->find();
if (IS_POST) {
if (empty($post['type'])){
$this->error('请选择变化!');
}
if (empty($post['money']) && in_array($post['type'], [1,2])){
$this->error('变动数值不能为空或0');
} else if (!empty($post['money']) && !preg_match('/^([0-9\.]+)$/i', $post['money'])) {
$this->error('变动数值格式不正确!');
}
// 处理数据验证
$error = handleEyouDataValidate('users_id', '__token_users_edit_money__', $post);
if (!empty($error)) $this->error($error);
$times = getTime();
// 添加会员余额记录
$insert = [
'users_id' => $users_id,
'money' => floatval($post['money']),
'users_money' => floatval($users['users_money']) + floatval($post['money']),
];
// 更新会员主表余额
$update = [
'update_time' => $times,
];
// 4-管理员添加 5-管理员减少
$cause_type = 4;
if (1 === intval($post['type'])) {
//增加
$update['users_money'] = Db::raw('users_money+'.floatval($post['money']));
} else if (2 === intval($post['type'])) {
//减少
$cause_type = 5;
$update['users_money'] = Db::raw('users_money-'.floatval($post['money']));
$insert['users_money'] = floatval($users['users_money']) - floatval($post['money']);
} else if (3 === intval($post['type'])) {
$insert['users_money'] = floatval($post['money']);
$update['users_money'] = floatval($post['money']);
// 变化余额 大于 会员余额则执行
if (floatval($post['money']) > floatval($users['users_money'])) {
$cause_type = 4;
$insert['money'] = floatval($post['money']) - floatval($users['users_money']);
}
// 变化余额 小于 会员余额则执行
else {
$cause_type = 5;
$insert['money'] = floatval($users['users_money']) - floatval($post['money']);
}
}
// 更新会员主表余额
$where = [
'users_id' => $users_id,
];
$r = $this->users_db->where($where)->update($update);
if ($r !== false) {
// 添加会员余额记录
$insert['admin_id'] = session('admin_id');
$insert['cause'] = !empty($post['cause']) ? $post['cause'] : '';
$insert['cause_type'] = $cause_type;
$insert['status'] = 3;
$insert['add_time'] = $times;
$insert['update_time'] = $times;
$this->users_money_db->insert($insert);
adminLog('编辑 '.$users['nickname'].' 的会员余额');
$this->success('操作成功');
}
$this->error('操作失败');
}
$this->assign('users', $users);
return $this->fetch('member/edit/users_edit_money');
}
// 积分充值
public function users_edit_score()
{
$post = input('param.');
$post['users_id'] = intval($post['users_id']);
$users_id = $post['users_id'];
$users = Db::name('users')->where('users_id',$users_id)->find();
if (IS_POST){
if (empty($post['type'])){
$this->error('请选择变化!');
}
if (empty($post['money']) && in_array($post['type'], [1,2])){
$this->error('变动数值不能为空或0');
} else if (!empty($post['money']) && !preg_match('/^([0-9\.]+)$/i', $post['money'])) {
$this->error('变动数值格式不正确!');
}
// 处理数据验证
$error = handleEyouDataValidate('users_id', '__token_users_edit_score__', $post);
if (!empty($error)) $this->error($error);
$insert['type'] = 6;
$insert['users_id'] = $users_id;
$insert['current_score'] = $users['scores'];
$insert['lang'] = $this->admin_lang;
$insert['devote'] = $insert['current_devote'] = 0;
$insert['add_time'] = $insert['update_time'] = $update['update_time'] = getTime();
// 增加
if (1 == $post['type']) {
$update['scores'] = Db::raw('scores + '.$post['money']);
$insert['score'] = '+' . $post['money'];
$insert['current_score'] += $post['money'];
}
// 减少
else if (2 == $post['type']) {
$update['scores'] = Db::raw('scores - '.$post['money']);
$insert['score'] = '-' . $post['money'];
$insert['current_score'] -= $post['money'];
}
// 根据变动数据计算是增加还是减少
else if (3 == $post['type']) {
// 增加
if ($post['money'] > $users['scores']) {
$insert['score'] = '+' . ($post['money'] - $users['scores']);
}
// 减少
else {
$insert['score'] = '-' . ($users['scores'] - $post['money']);
}
$update['scores'] = $post['money'];
$insert['current_score'] = $post['money'];
}
// 更新会员积分
$where = [
'users_id' => $users_id,
];
$result = $this->users_db->where($where)->update($update);
if (!empty($result)) {
// 增加会员积分变动记录
if (!empty($post['remark'])) $insert['remark'] = $post['remark'];
$insert['admin_id'] = session('admin_id');
Db::name('users_score')->insert($insert);
\think\Cache::clear('users_list');
adminLog('编辑会员'.$users_id.'积分');
$this->success('操作成功');
}else{
$this->error('操作失败');
}
$this->success('操作成功');
}
$this->assign('users',$users);
return $this->fetch('member/edit/users_edit_score');
}
// 下载订单列表页
public function download_index()
{
// 定义数组
$condition = [];
// 订单状态搜索
$order_status = input('param.order_status/d', 0);
if (!empty($order_status)) $condition['a.order_status'] = intval($order_status) === 1 ? intval($order_status) : 0;
// 订单号或用户名搜索
$keywords = input('keywords/s', '');
if (!empty($keywords)) $condition['a.order_code|b.username'] = ['LIKE', "%{$keywords}%"];
// 支付方式查询
$pay_name = input('pay_name/s', '');
if (!empty($pay_name)) $condition['a.pay_name'] = $pay_name;
// 时间检索条件
$begin = strtotime(input('param.add_time_begin/s'));
$end = input('param.add_time_end/s');
!empty($end) && $end .= ' 23:59:59';
$end = strtotime($end);
// 时间检索
if ($begin > 0 && $end > 0) {
$condition['a.add_time'] = array('between', "$begin, $end");
} else if ($begin > 0) {
$condition['a.add_time'] = array('egt', $begin);
} else if ($end > 0) {
$condition['a.add_time'] = array('elt', $end);
}
// 分页查询
$count = Db::name('download_order')->alias('a')->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')->where($condition)->count();
$Page = new Page($count, config('paginate.list_rows'));
// 数据查询
$list = Db::name('download_order')->where($condition)
->field('a.*, b.head_pic, b.username, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->order('a.order_id desc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $key => $value) {
$value['username'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
$value['head_pic'] = get_head_pic($value['head_pic']);
$list[$key] = $value;
}
$show = $Page->show();
$this->assign('list', $list);
$this->assign('page', $show);
$this->assign('pager', $Page);
// 是否开启文章付费
$channelRow = Db::name('channeltype')->where('nid', 'in',['article','download'])->getAllWithIndex('nid');
foreach ($channelRow as &$val){
if (!empty($val['data'])) $val['data'] = json_decode($val['data'], true);
}
$this->assign('channelRow', $channelRow);
return $this->fetch();
}
// 文章订单详情页
public function download_order_details()
{
$order_id = input('param.order_id/d');
if (!empty($order_id)) {
$OrderData = Db::name('download_order')->field('*, product_id as aid')->find($order_id);
$UsersData = $this->users_db->find($OrderData['users_id']);
// 用于点击视频文档跳转到前台
$array_new = get_archives_data([$OrderData], 'product_id');
// 内页地址
$OrderData['arcurl'] = get_arcurl($array_new[$OrderData['product_id']]);
// 支持子目录
$OrderData['product_litpic'] = get_default_pic($OrderData['product_litpic']);
$this->assign('OrderData', $OrderData);
$this->assign('UsersData', $UsersData);
return $this->fetch('article_order_details');
} else {
$this->error('非法访问!');
}
}
// 文章订单批量删除
public function download_order_del()
{
$order_id = input('del_id/a');
$order_id = eyIntval($order_id);
if (IS_AJAX_POST && !empty($order_id)) {
$Where = [
'order_id' => ['IN', $order_id],
];
$result = Db::name('download_order')->field('order_code')->where($Where)->select();
$order_code_list = get_arr_column($result, 'order_code');
// 删除订单列表数据
$return = Db::name('download_order')->where($Where)->delete();
if ($return) {
adminLog('删除下载订单:'.implode(',', $order_code_list));
$this->success('删除成功');
} else {
$this->error('删除失败');
}
}
$this->error('参数有误');
}
// AJAX导出搜索关键词Excel文档
public function ajax_excel_export()
{
// 设置最大内存
ini_set("memory_limit", "-1");
// 防止php超时
function_exists('set_time_limit') && set_time_limit(0);
if (file_exists('./vendor/PHPExcel.zip') && !is_dir('./vendor/PHPExcel/')) {
$zip = new \ZipArchive();//新建一个ZipArchive的对象
if ($zip->open(ROOT_PATH.'vendor'.DS.'PHPExcel.zip') === true) {
$zip->extractTo(ROOT_PATH.'vendor'.DS.'PHPExcel'.DS);
$zip->close();//关闭处理的zip文件
if (is_dir('./vendor/PHPExcel/')) {
@unlink('./vendor/PHPExcel.zip');
}
}
}
// 执行操作
if (IS_AJAX_POST) {
$condition['is_del'] = 0;
$orderby = "users_id desc";
$list = $this->users_db->field('*')->where($condition)->order($orderby)->select();
if (empty($list)) $this->error('没有导出的数据');
$level = Db::name('users_level')->field('level_id, level_name')->cache(true, EYOUCMS_CACHE_TIME, "users_level")->getAllWithIndex('level_id');
//成交订单数
$order_count = Db::name('shop_order')->where('order_status',3)
->field('count(*) as count,sum(order_amount) as sum,users_id')
->group('users_id')->getAllWithIndex('users_id');
// 处理订单导出数据
$ExcelData = [];
foreach ($list as $key => $value) {
// 拼装追加数据
$PushData = [
// 订单信息
'users_id' => $value['users_id'],
'username' => $value['username'],
'nickname' => $value['nickname'],
'mobile' => $value['mobile'],
'email' => $value['email'],
'level' => $level[$value['level']]['level_name'],
'level_maturity_days' => $value['level_maturity_days'],
'scores' => $value['scores'],
'users_money' => $value['users_money'],
'order_count' => !empty($order_count[$value['users_id']]['count']) ? $order_count[$value['users_id']]['count'] : 0,
'order_money_count' => !empty($order_count[$value['users_id']]['sum']) ? $order_count[$value['users_id']]['sum'] : 0,
'is_lock' => !empty($value['is_lock']) ? '是' : '否',
'reg_time' => date('Y-m-d H:i:s', $value['reg_time']),
'last_login' => !empty($value['last_login']) ? date('Y-m-d H:i:s', $value['last_login']) : '',
];
// 追加数据,用于导出
array_push($ExcelData, $PushData);
}
// 导出字段设置
$ExcelField = ['users_id', 'username', 'nickname', 'mobile', 'email', 'level','level_maturity_days', 'scores', 'users_money', 'order_count', 'order_money_count', 'is_lock', 'reg_time', 'last_login'];
// 导出标题设置
$ExcelTitle = ['会员ID', '用户名', '会员昵称', '手机号', '电子邮箱', '会员等级','会员天数', '积分', '余额', '成交订单数', '成交金额', '黑名单', '注册时间', '最后登录'];
$ResultUrl = $this->PerformExport($ExcelData, $ExcelField, $ExcelTitle);
}
if (!empty($ResultUrl)) {
$this->success('正在下载', $ResultUrl);
} else {
$this->error('导出失败');
}
}
private function PerformExport($ExcelData = [], $ExcelField = [], $ExcelTitle = [])
{
// 引入SDK
vendor("PHPExcel.Classes.PHPExcel");
// Excel表格坐标
$cell_arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
// 执行导出
$objPHPExcel = new \PHPExcel();
$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial')->setSize(12);
// 设置表格标题栏长度
$objActSheet = $objPHPExcel->getActiveSheet();
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(8);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(18);
$objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(18);
// 设置导出表格名称
$FileName = 'users-'.date("YmdHis");
// 循环设置表格标题栏数据
$startRow = 1;
if(!empty($ExcelTitle) || count($ExcelTitle) > 0) {
foreach($ExcelTitle as $k => $v) {
$objActSheet->setCellValue($cell_arr[$k] . $startRow, $v);
}
$startRow = 2;
}
// 循环设置表格字段内容数据
foreach($ExcelData as $v) {
foreach($ExcelField as $key => $value) {
$objActSheet->setCellValue($cell_arr[$key] . $startRow, $v[$value]."\t");
}
$startRow++;
}
$objPHPExcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $FileName . '.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
// 文件目录
$ExcelPath = UPLOAD_PATH . 'excel/';
// 保存前清空删除原先的excel
delFile(UPLOAD_PATH . 'excel/', true);
// 创建文件夹
@mkdir($ExcelPath, 0777, true);
// excel文件路径
$filePath = $ExcelPath . $FileName . '.xlsx';
// 保存excel文件
$objWriter->save($filePath);
// 返回excel文件路径到AJAX下载
return request()->domain() . ROOT_DIR . '/' . $filePath;
}
// 充值套餐列表
public function recharge_pack_list()
{
// 搜索套餐名称
$where = [];
$packNames = input('param.pack_names/s', '');
$this->assign('packNames', $packNames);
if (!empty($packNames)) $where['pack_names'] = ['LIKE', "%{$packNames}%"];
// 查询分页数据
$count = Db::name('users_recharge_pack')->where($where)->count();
$Page = new Page($count, config('paginate.list_rows'));
$list = Db::name('users_recharge_pack')->where($where)->limit($Page->firstRow.','.$Page->listRows)->order('add_time desc, pack_id desc')->select();
// 数据虚拟排序处理
$count = intval($Page->nowPage) > 1 ? intval(++$count) - intval($Page->listRows) : intval(++$count);
foreach ($list as $key => $value) {
// 数据虚拟排序字段
$list[$key]['virtual_id'] = --$count;
}
$show = $Page->show();
$this->assign('list', $list);
$this->assign('page', $show);
$this->assign('pager', $Page);
return $this->fetch();
}
// 充值套餐添加
public function recharge_pack_add()
{
if (IS_AJAX_POST) {
$post = input('post.');
// 添加限制
if (empty($post['pack_names'])) $this->error('请输入套餐名称');
if (empty($post['pack_face_value'])) $this->error('请输入实际入账余额');
if (empty($post['pack_pay_prices'])) $this->error('请输入实际支付价格');
// 添加数据
$times = getTime();
$insert = [
'pack_names' => strval($post['pack_names']),
'pack_face_value' => unifyPriceHandle($post['pack_face_value']),
'pack_pay_prices' => unifyPriceHandle($post['pack_pay_prices']),
'add_time' => $times,
'update_time' => $times,
];
$insertID = Db::name('users_recharge_pack')->insertGetId($insert);
// 返回结束
if (!empty($insertID)) $this->success('添加成功');
$this->error('添加失败');
}
return $this->fetch();
}
// 充值套餐编辑
public function recharge_pack_edit()
{
if (IS_AJAX_POST) {
$post = input('post.');
// 编辑限制
if (empty($post['pack_id'])) $this->error('请选择要编辑套餐');
if (empty($post['pack_names'])) $this->error('请输入套餐名称');
if (empty($post['pack_face_value'])) $this->error('请输入实际入账余额');
if (empty($post['pack_pay_prices'])) $this->error('请输入实际支付价格');
// 编辑数据
$times = getTime();
$update = [
'pack_id' => intval($post['pack_id']),
'pack_names' => strval($post['pack_names']),
'pack_face_value' => unifyPriceHandle($post['pack_face_value']),
'pack_pay_prices' => unifyPriceHandle($post['pack_pay_prices']),
'update_time' => $times,
];
$insertID = Db::name('users_recharge_pack')->update($update);
// 返回结束
if (!empty($insertID)) $this->success('编辑成功');
$this->error('编辑失败');
}
$pack_id = input('param.pack_id/d', 0);
$where = [
'pack_id' => intval($pack_id)
];
$pack = Db::name('users_recharge_pack')->where($where)->find();
$this->assign('pack', $pack);
return $this->fetch();
}
// 充值套餐删除
public function recharge_pack_del()
{
if (IS_AJAX_POST) {
$pack_ids = input('del_id/a');
$pack_ids = eyIntval($pack_ids);
$where = [
'pack_id' => ['IN', $pack_ids]
];
$result = Db::name('users_recharge_pack')->where($where)->delete(true);
if (!empty($result)) $this->success('删除成功');
}
$this->error('删除失败');
}
// 充值套餐领取记录
public function recharge_pack_log()
{
// 搜索套餐名称
$where = [
'a.order_status' => ['IN', [2, 3]]
];
$keywords = input('param.keywords/s', '');
$this->assign('keywords', $keywords);
if (!empty($keywords)) $where['b.username|b.nickname'] = ['LIKE', "%{$keywords}%"];
// 时间检索条件
$begin = strtotime(input('param.add_time_begin/s'));
$end = input('param.add_time_end/s');
!empty($end) && $end .= ' 23:59:59';
$end = strtotime($end);
// 时间检索
if ($begin > 0 && $end > 0) {
$where['a.order_pay_time'] = array('between', "$begin, $end");
} else if ($begin > 0) {
$where['a.order_pay_time'] = array('egt', $begin);
} else if ($end > 0) {
$where['a.order_pay_time'] = array('elt', $end);
}
// 查询分页数据
$count = Db::name('users_recharge_pack_order')->alias('a')->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')->where($where)->count();
$Page = new Page($count, config('paginate.list_rows'));
$field = 'a.*, b.username, b.nickname, b.head_pic';
$list = Db::name('users_recharge_pack_order')->alias('a')
->field($field)
->where($where)
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->limit($Page->firstRow.','.$Page->listRows)
->order('add_time desc, order_id desc')
->select();
// 数据虚拟排序处理
$count = intval($Page->nowPage) > 1 ? intval(++$count) - intval($Page->listRows) : intval(++$count);
foreach ($list as $key => $value) {
// 数据虚拟排序字段
$list[$key]['virtual_id'] = --$count;
$list[$key]['head_pic'] = get_head_pic($value['head_pic']);
$list[$key]['nickname'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
}
// dump($list);exit;
$show = $Page->show();
$this->assign('list', $list);
$this->assign('page', $show);
$this->assign('pager', $Page);
return $this->fetch();
}
//会员注销列表
public function log_off_index()
{
$count = Db::name('users_log_off')->count('id');
$pageObj = new Page($count, 10);
$list = Db::name('users_log_off')
->order('id desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
$pageStr = $pageObj->show();
$this->assign('list', $list);
$this->assign('pageStr', $pageStr);
$this->assign('pageObj', $pageObj);
$cur_key = $pageObj->totalRows - ($pageObj->nowPage - 1) * ($pageObj->listRows);
$this->assign('cur_key', $cur_key);
return $this->fetch('member/log_off/log_off_index');
}
//会员注销配置
public function log_off_set()
{
if (IS_AJAX_POST) {
$post = input('post.');
getUsersConfigData('users', ['users_open_log_off' => $post['data']['users_open_log_off']], 'cn'); // 开启注销
getUsersConfigData('users', ['users_log_off_check' => $post['data']['users_log_off_check']], 'cn'); // 注销审核
$this->success('保存成功');
}
$data = getUsersConfigData('users', '', 'cn');
$this->assign('data', $data);
return $this->fetch('member/log_off/log_off_set');
}
//会员注销列表详情查看
public function log_off_see()
{
$id = input('param.id/d');
if (empty($id)) $this->error('缺少必要参数');
$info = Db::name('users_log_off')
->alias('a')
->field('a.*,b.user_name')
->join('admin b', 'a.admin_id = b.admin_id', 'left')
->where('a.id', $id)
->find();
$this->assign('info', $info);
return $this->fetch('member/log_off/log_off_see');
}
//会员注销审核
public function handle_log_off()
{
$param = input('param.');
$admin_id = session('admin_id');
if (empty($admin_id)) $this->error('操作失败');
$users_id = Db::name('users_log_off')->where('id', $param['id'])->value('users_id');
if (1 == $param['status']) {
$data = getUsersConfigData('users', '', 'cn');
if (empty($data['users_open_log_off'])) $this->error('未开启会员注销');
$users = Db::name('users')->where('users_id', $users_id)->find();
if (empty($users)) $this->error('会员不存在');
$update = [
'status' => 1,
'admin_id' => $admin_id,
'handle_time' => getTime(),
'update_time' => getTime(),
];
$r = Db::name('users_log_off')->where('id', $param['id'])->update($update);
if (false !== $r) {
//直接删除
Db::name('users')->where('users_id', $users_id)->delete();
model('Member')->afterDel([$users_id]);
$this->success('注销成功');
}
} elseif (2 == $param['status']) {
//拒绝注销
$update = [
'status' => 2,
'admin_id' => $admin_id,
'refuse_reason' => $param['refuse_reason'],
'handle_time' => getTime(),
'update_time' => getTime(),
];
$r = Db::name('users_log_off')->where('id', $param['id'])->update($update);
if (false !== $r) {
$this->success('拒绝注销成功');
}
}
$this->error('操作失败');
}
}