* Date: 2018-4-3
*/
namespace app\admin\controller;
use think\Page;
use think\Verify;
use think\Db;
use think\db\Query;
use think\Session;
use app\admin\model\AuthRole;
use app\admin\logic\AjaxLogic;
class Admin extends Base {
public function index()
{
$list = array();
$keywords = input('keywords/s');
$condition = array();
if (!empty($keywords)) {
$condition['a.user_name|a.true_name'] = array('LIKE', "%{$keywords}%");
}
/*权限控制 by 小虎哥*/
$admin_info = session('admin_info');
if (0 < intval($admin_info['role_id'])) {
$condition['a.admin_id|a.parent_id'] = $admin_info['admin_id'];
} else {
if (!empty($admin_info['parent_id'])) {
$condition['a.admin_id|a.parent_id'] = $admin_info['admin_id'];
}
}
/*--end*/
/**
* 数据查询
*/
$count = DB::name('admin')->alias('a')->where($condition)->count();// 查询满足要求的总记录数
$Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
$list = DB::name('admin')->field('a.*, b.name AS role_name')
->alias('a')
->join('__AUTH_ROLE__ b', 'a.role_id = b.id', 'LEFT')
->where($condition)
->order('a.admin_id asc')
->limit($Page->firstRow.','.$Page->listRows)
->select();
foreach ($list as $key => $val) {
if (0 >= intval($val['role_id'])) {
$val['role_name'] = !empty($val['parent_id']) ? '超级管理员' : '创始人';
}
$list[$key] = $val;
}
$show = $Page->show();// 分页显示输出
$this->assign('page',$show);// 赋值分页输出
$this->assign('list',$list);// 赋值数据集
$this->assign('pager',$Page);// 赋值分页集
/*第一次同步CMS用户的栏目ID到权限组里*/
$this->syn_built_auth_role();
/*--end*/
return $this->fetch();
}
/*
* 管理员登陆
*/
public function login()
{
if (session('?admin_id') && session('admin_id') > 0) {
$web_adminbasefile = tpCache('web.web_adminbasefile');
$web_adminbasefile = !empty($web_adminbasefile) ? $web_adminbasefile : '/login.php';
$this->success("您已登录", $web_adminbasefile);
}
// $gb_funcs = get_extension_funcs('gd');
$is_vertify = 1; // 默认开启验证码
$admin_login_captcha = config('captcha.admin_login');
if (!function_exists('imagettftext') || empty($admin_login_captcha['is_on'])) {
$is_vertify = 0; // 函数不存在,不符合开启的条件
}
$this->assign('is_vertify', $is_vertify);
if (IS_POST) {
$post = input('post.');
if (!function_exists('session_start')) {
$this->error('请联系空间商,开启php的session扩展!');
}
if (!testWriteAble(ROOT_PATH.config('session.path').'/')) {
$this->error('请仔细检查以下问题:
1、磁盘空间大小是否100%;
2、站点目录权限是否为755;
3、站点所有目录的权限,禁止用root:root ;
4、如还没解决,请点击:查看教程');
}
if (1 == $is_vertify) {
$verify = new Verify();
if (!$verify->check(input('post.vertify'), "admin_login")) {
$this->error('验证码错误');
}
}
$is_clicap = 0; // 默认关闭文字验证码
if (is_dir('./weapp/Clicap/')) {
$ClicapRow = model('Weapp')->getWeappList('Clicap');
if (!empty($ClicapRow['status']) && 1 == $ClicapRow['status']) {
if (!empty($ClicapRow['data']) && $ClicapRow['data']['captcha']['admin_login']['is_on'] == 1) {
$clicaptcha_info = input('post.clicaptcha-submit-info');
$clicaptcha = new \weapp\Clicap\vendor\Clicaptcha;
if (empty($clicaptcha_info) || !$clicaptcha->check($clicaptcha_info, false)) {
$this->error('文字点击验证错误!');
}
}
}
}
$user_name = input('post.user_name/s');
$password = input('post.password/s');
/*登录错误次数的限制*/
/* $ststem_login_errnum_key = 'system_'.md5('login_errnum_'.$user_name);
$ststem_login_errtime_key = 'system_'.md5('login_errtime_'.$user_name);
$loginErrtotal = config('login_errtotal'); // 限定最大的登录错误次数
$loginErrexpire = config('login_errexpire'); // 限定登录错误锁定有效时间
$loginErrnum = tpCache('system.'.$ststem_login_errnum_key); // 登录错误次数
$loginErrtime = tpCache('system.'.$ststem_login_errtime_key); // 最后一次登录错误时间
if (intval($loginErrnum) >= intval($loginErrtotal)) {
if (getTime() < $loginErrtime + $loginErrexpire) {
$this->error("登录错误次数超限,用户名被锁定15分钟!");
} else {
// 重置登录错误次数
$loginErrnum = 0;
$loginErrtime = 0;
tpCache('system', [$ststem_login_errnum_key => $loginErrnum]);
tpCache('system', [$ststem_login_errtime_key => $loginErrtime]);
}
}*/
/*end*/
$condition['user_name'] = $user_name;
$condition['password'] = $password;
if (!empty($condition['user_name']) && !empty($condition['password'])) {
$condition['password'] = func_encrypt($condition['password']);
$admin_info = M('admin')->where($condition)->find();
if (empty($admin_info)) {
/*记录登录错误次数*/
/*$login_num = intval($loginErrtotal) - intval($loginErrnum);
$ststem_login_errnum = $loginErrnum + 1;
tpCache('system', [$ststem_login_errnum_key=>$ststem_login_errnum]);
tpCache('system', [$ststem_login_errtime_key=>getTime()]);
$this->error("用户名或密码错误,您还可以尝试[{$login_num}]次!");*/
$this->error("用户名或密码错误!");
/*end*/
} else {
if ($admin_info['status'] == 0) {
$this->error('用户名被禁用!');
}
$role_id = !empty($admin_info['role_id']) ? $admin_info['role_id'] : -1;
$auth_role_info = array();
if (!empty($admin_info['parent_id'])) {
$role_name = '超级管理员';
$isFounder = 0;
} else {
$role_name = '创始人';
$isFounder = 1;
}
if (0 < intval($role_id)) {
$auth_role_info = M('auth_role')
->field("a.*, a.name AS role_name")
->alias('a')
->where('a.id','eq', $role_id)
->find();
if (!empty($auth_role_info)) {
$auth_role_info['language'] = unserialize($auth_role_info['language']);
$auth_role_info['cud'] = unserialize($auth_role_info['cud']);
$auth_role_info['permission'] = unserialize($auth_role_info['permission']);
$role_name = $auth_role_info['name'];
}
}
$admin_info['auth_role_info'] = $auth_role_info;
$admin_info['role_name'] = $role_name;
$last_login_time = getTime();
$last_login_ip = clientIP();
$login_cnt = $admin_info['login_cnt'] + 1;
M('admin')->where("admin_id = ".$admin_info['admin_id'])->save(array('last_login'=>$last_login_time, 'last_ip'=>$last_login_ip, 'login_cnt'=>$login_cnt, 'session_id'=>$this->session_id));
$admin_info['last_login'] = $last_login_time;
$admin_info['last_ip'] = $last_login_ip;
// 头像
empty($admin_info['head_pic']) && $admin_info['head_pic'] = get_head_pic($admin_info['head_pic'], true);
$admin_info_new = $admin_info;
/*过滤存储在session文件的敏感信息*/
foreach (['user_name','true_name','password'] as $key => $val) {
unset($admin_info_new[$val]);
}
/*--end*/
session('admin_id',$admin_info['admin_id']);
session('admin_info', $admin_info_new);
session('admin_login_expire', getTime()); // 登录有效期
/*检查密码复杂度*/
$admin_login_pwdlevel = checkPasswordLevel($password);
session('admin_login_pwdlevel', $admin_login_pwdlevel);
/*end*/
// 重置登录错误次数
/*tpCache('system', [$ststem_login_errnum_key=>0]);
tpCache('system', [$ststem_login_errtime_key=>0]);*/
adminLog('后台登录');
$url = session('from_url') ? session('from_url') : $this->request->baseFile();
session('isset_author', null); // 内置勿动
/*同步追加一个后台管理员到会员用户表*/
$this->syn_users_login($admin_info, $isFounder);
/* END */
$this->success('登录成功', $url);
}
} else {
$this->error('请填写用户名/密码');
}
}
$ajaxLogic = new AjaxLogic;
$ajaxLogic->login_handle();
session('admin_info', null);
return $this->fetch();
}
/**
* 验证码获取
*/
public function vertify()
{
/*验证码插件开关*/
$admin_login_captcha = config('captcha.admin_login');
$config = (!empty($admin_login_captcha['is_on']) && !empty($admin_login_captcha['config'])) ? $admin_login_captcha['config'] : config('captcha.default');
/*--end*/
ob_clean(); // 清空缓存,才能显示验证码
$Verify = new Verify($config);
$Verify->entry('admin_login');
exit();
}
/**
* 修改管理员密码
* @return \think\mixed
*/
public function admin_pwd()
{
$admin_id = input('admin_id/d',0);
$oldPwd = input('old_pw/s');
$newPwd = input('new_pw/s');
$new2Pwd = input('new_pw2/s');
if(!$admin_id){
$admin_id = session('admin_id');
}
$info = M('admin')->where("admin_id", $admin_id)->find();
$info['password'] = "";
$this->assign('info',$info);
if(IS_POST){
//修改密码
$enOldPwd = func_encrypt($oldPwd);
$enNewPwd = func_encrypt($newPwd);
$admin = M('admin')->where('admin_id' , $admin_id)->find();
if(!$admin || $admin['password'] != $enOldPwd){
exit(json_encode(array('status'=>-1,'msg'=>'旧密码不正确')));
}else if($newPwd != $new2Pwd){
exit(json_encode(array('status'=>-1,'msg'=>'两次密码不一致')));
}else{
$data = array(
'update_time' => getTime(),
'password' => $enNewPwd,
);
$row = M('admin')->where('admin_id' , $admin_id)->save($data);
if($row){
/*检查密码复杂度*/
$admin_login_pwdlevel = checkPasswordLevel($newPwd);
session('admin_login_pwdlevel', $admin_login_pwdlevel);
/*end*/
adminLog('修改管理员密码');
exit(json_encode(array('status'=>1,'msg'=>'操作成功')));
}else{
exit(json_encode(array('status'=>-1,'msg'=>'操作失败')));
}
}
}
if (IS_AJAX) {
return $this->fetch('admin/admin_pwd_ajax');
} else {
return $this->fetch('admin/admin_pwd');
}
}
/**
* 退出登陆
*/
public function logout()
{
adminLog('安全退出');
session_unset();
// session_destroy();
session::clear();
cookie('admin-treeClicked', null); // 清除并恢复栏目列表的展开方式
$this->success("安全退出", request()->baseFile());
}
/**
* 新增管理员时,检测用户名是否与前台用户名相同
*/
public function ajax_add_user_name()
{
if (IS_AJAX_POST) {
$user_name = input('post.user_name/s');
if (M('admin')->where("user_name", $user_name)->count()) {
$this->error("此用户名已被注册,请更换!");
}
$row = Db::name('users')->field('users_id')->where([
'username' => $user_name,
'lang' => $this->admin_lang,
])->find();
if (!empty($row)) {
$this->error('已有相同会员名,将其转为系统账号?');
} else {
$this->success('会员名不存在,无需提示!');
}
}
}
/**
* 新增管理员
*/
public function admin_add()
{
$this->language_access(); // 多语言功能操作权限
if (IS_POST) {
$data = input('post.');
if (0 < intval(session('admin_info.role_id'))) {
$this->error("超级管理员才能操作!");
}
if (empty($data['password']) || empty($data['password2'])) {
$this->error("密码不能为空!");
}else if ($data['password'] != $data['password2']) {
$this->error("两次密码输入不一致!");
}
$data['user_name'] = trim($data['user_name']);
$data['password'] = func_encrypt($data['password']);
$data['password2'] = func_encrypt($data['password2']);
$data['role_id'] = intval($data['role_id']);
$data['parent_id'] = session('admin_info.admin_id');
$data['add_time'] = getTime();
if (empty($data['pen_name'])) {
$data['pen_name'] = $data['user_name'];
}
if (M('admin')->where("user_name", $data['user_name'])->count()) {
$this->error("此用户名已被注册,请更换",url('Admin/admin_add'));
} else {
$admin_id = M('admin')->insertGetId($data);
if ($admin_id) {
adminLog('新增管理员:'.$data['user_name']);
/*同步追加一个后台管理员到会员用户表*/
try {
$usersInfo = Db::name('users')->field('users_id')->where([
'username' => $data['user_name'],
'lang' => $this->admin_lang,
])->find();
if (!empty($usersInfo)) {
$r = Db::name('users')->where(['users_id'=>$usersInfo['users_id']])->update([
'nickname' => $data['user_name'],
'admin_id' => $admin_id,
'is_activation' => 1,
'is_lock' => 0,
'is_del' => 0,
'update_time' => getTime(),
]);
!empty($r) && $users_id = $usersInfo['users_id'];
} else {
// 获取要添加的用户名
$username = $this->GetUserName($data['user_name']);
$AddData = [
'username' => $username,
'nickname' => $username,
'password' => func_encrypt(getTime()),
'level' => 1,
'lang' => $this->admin_lang,
'reg_time' => getTime(),
'add_time' => getTime(),
'head_pic' => ROOT_DIR . '/public/static/common/images/dfboy.png',
'register_place' => 1,
'admin_id' => $admin_id,
];
$users_id = Db::name('users')->insertGetId($AddData);
}
if (!empty($users_id)) {
Db::name('admin')->where(['admin_id'=>$admin_id])->update([
'syn_users_id' => $users_id,
'update_time' => getTime(),
]);
}
} catch (\Exception $e) {}
/* END */
$this->success("操作成功", url('Admin/index'));
} else {
$this->error("操作失败");
}
}
}
// 权限组
$admin_role_list = model('AuthRole')->getRoleAll();
$this->assign('admin_role_list', $admin_role_list);
// 模块组
$modules = getAllMenu();
$this->assign('modules', $modules);
// 权限集
$auth_rules = get_auth_rule(['is_modules'=>1]);
$auth_rule_list = group_same_key($auth_rules, 'menu_id');
$this->assign('auth_rule_list', $auth_rule_list);
// 栏目
$arctype_data = $arctype_array = array();
$arctype = M('arctype')->select();
if(! empty($arctype)){
foreach ($arctype as $item){
if($item['parent_id'] <= 0){
$arctype_data[] = $item;
}
$arctype_array[$item['parent_id']][] = $item;
}
}
$this->assign('arctypes', $arctype_data);
$this->assign('arctype_array', $arctype_array);
// 插件
$plugins = model('Weapp')->getList(['status'=>1]);
$this->assign('plugins', $plugins);
return $this->fetch();
}
/**
* 编辑管理员
*/
public function admin_edit()
{
if (IS_POST) {
$data = input('post.');
$id = $data['admin_id'];
if ($id == session('admin_info.admin_id')) {
unset($data['role_id']); // 不能修改自己的权限组
} else if (0 < intval(session('admin_info.role_id')) && session('admin_info.admin_id') != $id) {
$this->error('禁止更改别人的信息!');
}
$password = $data['password'];
if (!empty($password) || !empty($data['password2'])) {
if ($password != $data['password2']) {
$this->error("两次密码输入不一致!");
}
}
$user_name = $data['user_name'];
if(empty($password)){
unset($data['password']);
}else{
$data['password'] = func_encrypt($password);
}
unset($data['user_name']);
if (empty($data['pen_name'])) {
$data['pen_name'] = $user_name;
}
/*不允许修改自己的权限组*/
if (isset($data['role_id'])) {
if (0 < intval(session('admin_info.role_id')) && intval($data['role_id']) != session('admin_info.role_id')) {
$data['role_id'] = session('admin_info.role_id');
}
}
/*--end*/
$data['update_time'] = getTime();
$r = M('admin')->where('admin_id', $id)->save($data);
if ($r) {
/*检查密码复杂度*/
if ($id == session('admin_info.admin_id')) {
$admin_login_pwdlevel = checkPasswordLevel($password);
session('admin_login_pwdlevel', $admin_login_pwdlevel);
}
/*end*/
/*过滤存储在session文件的敏感信息*/
if ($id == session('admin_info.admin_id')) {
$admin_info = session('admin_info');
$admin_info = array_merge($admin_info, $data);
foreach (['user_name','true_name','password','password2'] as $key => $val) {
unset($admin_info[$val]);
}
session('admin_info', $admin_info);
}
/*--end*/
adminLog('编辑管理员:'.$user_name);
$this->success("操作成功",url('Admin/index'));
} else {
$this->error("操作失败");
}
}
$id = input('get.id/d', 0);
$info = M('admin')->field('a.*')
->alias('a')
->where("a.admin_id", $id)->find();
$info['password'] = "";
$this->assign('info',$info);
// 当前角色信息
$admin_role_model = model('AuthRole');
$role_info = $admin_role_model->getRole(array('id' => $info['role_id']));
$this->assign('role_info', $role_info);
// 权限组
$admin_role_list = $admin_role_model->getRoleAll();
$this->assign('admin_role_list', $admin_role_list);
// 模块组
$modules = getAllMenu();
$this->assign('modules', $modules);
// 权限集
$auth_rules = get_auth_rule(['is_modules'=>1]);
$auth_rule_list = group_same_key($auth_rules, 'menu_id');
$this->assign('auth_rule_list', $auth_rule_list);
// 栏目
$arctype_data = $arctype_array = array();
$arctype = M('arctype')->select();
if(! empty($arctype)){
foreach ($arctype as $item){
if($item['parent_id'] <= 0){
$arctype_data[] = $item;
}
$arctype_array[$item['parent_id']][] = $item;
}
}
$this->assign('arctypes', $arctype_data);
$this->assign('arctype_array', $arctype_array);
// 插件
$plugins = model('Weapp')->getList(['status'=>1]);
$this->assign('plugins', $plugins);
return $this->fetch();
}
/**
* 删除管理员
*/
public function admin_del()
{
$this->language_access(); // 多语言功能操作权限
if (IS_POST) {
$id_arr = input('del_id/a');
$id_arr = eyIntval($id_arr);
if (in_array(session('admin_id'), $id_arr)) {
$this->error('禁止删除自己');
}
if (!empty($id_arr)) {
if (0 < intval(session('admin_info.role_id')) || !empty($parent_id) ) {
$count = M('admin')->where("admin_id in (".implode(',', $id_arr).") AND role_id = -1")
->count();
if (!empty($count)) {
$this->error('禁止删除超级管理员');
}
}
$result = M('admin')->field('user_name')->where("admin_id",'IN',$id_arr)->select();
$user_names = get_arr_column($result, 'user_name');
$r = M('admin')->where("admin_id",'IN',$id_arr)->delete();
if($r){
adminLog('删除管理员:'.implode(',', $user_names));
/*同步删除管理员关联的前台会员*/
Db::name('users')->where(['admin_id'=>['IN', $id_arr],'lang'=>$this->admin_lang])->delete();
/*end*/
$this->success('删除成功');
}else{
$this->error('删除失败');
}
}else{
$this->error('参数有误');
}
}
$this->error('非法操作');
}
/*
* 第一次同步CMS用户的栏目ID到权限组里
* 默认赋予内置权限所有的内容栏目权限
*/
private function syn_built_auth_role()
{
$authRole = new AuthRole;
$roleRow = $authRole->getRoleAll(['built_in'=>1,'update_time'=>['elt',0]]);
if (!empty($roleRow)) {
$saveData = [];
foreach ($roleRow as $key => $val) {
$permission = $val['permission'];
$arctype = M('arctype')->where('status',1)->column('id');
if (!empty($arctype)) {
$permission['arctype'] = $arctype;
} else {
unset($permission['arctype']);
}
$saveData[] = array(
'id' => $val['id'],
'permission' => $permission,
'update_time' => getTime(),
);
}
$authRole->saveAll($saveData);
}
}
/*
* 设置admin表数据
*/
public function ajax_setfield()
{
if (IS_POST) {
$admin_id = session('admin_id');
$field = input('field'); // 修改哪个字段
$value = input('value', '', null); // 修改字段值
if (!empty($admin_id)) {
$r = M('admin')->where('admin_id',intval($admin_id))->save([
$field=>$value,
'update_time'=>getTime(),
]); // 根据条件保存修改的数据
if ($r) {
/*更新存储在session里的信息*/
$admin_info = session('admin_info');
$admin_info[$field] = $value;
session('admin_info', $admin_info);
/*--end*/
$this->success('操作成功');
}
}
}
$this->error('操作失败');
}
/*
* 检测密码的复杂程度
*/
public function ajax_checkPasswordLevel()
{
$password = input('post.password/s');
if (IS_AJAX_POST && !empty($password)) {
$pwdLevel = checkPasswordLevel($password);
if (3 >= $pwdLevel) {
$this->success("当前密码复杂度为 {$pwdLevel} ,建议复杂度在 4~7 范围内,避免容易被暴力破解!", null, ['pwdLevel'=>$pwdLevel]);
} else {
$this->success("当前密码复杂度为 {$pwdLevel} ,在系统设定 4~7 安全范围内!", null, ['pwdLevel'=>$pwdLevel]);
}
}
$this->error('操作失败');
}
// 确保用户名唯一
private function GetUserName($username = null)
{
$count = Db::name('users')->where('username',$username)->count();
if (!empty($count)) {
$username_new = $username.rand(1000,9999);
$username = $this->GetUserName($username_new);
}
return $username;
}
/**
* 同步追加一个后台管理员到会员用户表,并同步前台登录
*/
private function syn_users_login($admin_info = [], $isFounder = 0)
{
$where_new = [
'admin_id' => $admin_info['admin_id'],
'lang' => $this->admin_lang,
];
$users_id = Db::name('users')->where($where_new)->getField('users_id');
try {
if (empty($users_id) && empty($admin_info['syn_users_id'])) {
$usersInfo = [];
if (1 == $isFounder) {
// 如果是创始人,强制将与会员名相同的改为管理员前台用户名
$usersInfo = Db::name('users')->field('users_id')->where([
'username' => $admin_info['user_name'],
'lang' => $this->admin_lang,
])->find();
}
if (!empty($usersInfo)) {
$r = Db::name('users')->where(['users_id'=>$usersInfo['users_id']])->update([
'nickname' => $admin_info['user_name'],
'admin_id' => $admin_info['admin_id'],
'is_activation' => 1,
'is_lock' => 0,
'is_del' => 0,
'update_time' => getTime(),
'last_login' => getTime(),
]);
!empty($r) && $users_id = $usersInfo['users_id'];
} else {
// 获取要添加的用户名
$username = $this->GetUserName($admin_info['user_name']);
$AddData = [
'username' => $username,
'nickname' => $username,
'password' => func_encrypt(getTime()),
'level' => 1,
'lang' => $this->admin_lang,
'reg_time' => getTime(),
'head_pic' => ROOT_DIR . '/public/static/common/images/dfboy.png',
'add_time' => getTime(),
'last_login' => getTime(),
'register_place' => 1,
'admin_id' => $admin_info['admin_id'],
];
$users_id = Db::name('users')->insertGetId($AddData);
}
if (!empty($users_id)) {
Db::name('admin')->where(['admin_id'=>$admin_info['admin_id']])->update([
'syn_users_id' => $users_id,
'update_time' => getTime(),
]);
$admin_info['syn_users_id'] = $users_id;
session('admin_info', $admin_info);
}
} else if (!empty($users_id) && empty($admin_info['syn_users_id'])) {
Db::name('admin')->where(['admin_id'=>$admin_info['admin_id']])->update([
'syn_users_id' => $users_id,
'update_time' => getTime(),
]);
$admin_info['syn_users_id'] = $users_id;
session('admin_info', $admin_info);
}
} catch (\Exception $e) {}
// 加载前台session
if (!empty($users_id)) {
$users = M('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.lang' => $this->admin_lang,
'a.is_activation' => 1,
])->find();
if (!empty($users)) {
session('users',$users);
session('users_id',$users_id);
Db::name('users')->where(['users_id'=>$users_id])->update([
'update_time' => getTime(),
'last_login' => getTime(),
]);
}
}
}
}