Server : nginx/1.20.1
System : Linux iZ2ze9ojcl78uluczwag69Z 4.18.0-240.22.1.el8_3.x86_64 #1 SMP Thu Apr 8 19:01:30 UTC 2021 x86_64
User : www ( 1000)
PHP Version : 7.3.28
Disable Function : passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/0531yanglao.com/app/admin/service/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/0531yanglao.com/app/admin/service/AdminUserService.php
<?php
/*
 * @Description  : 管理员管理
 * @Author       : https://github.com/skyselang
 * @Date         : 2020-05-05
 * @LastEditTime : 2021-03-20
 */

namespace app\admin\service;

use think\facade\Db;
use think\facade\Config;
use think\facade\Filesystem;
use app\common\cache\AdminUserCache;
use app\admin\service\AdminTokenService;

class AdminUserService
{
    /**
     * 管理员列表
     *
     * @param array   $where   条件
     * @param integer $page    页数
     * @param integer $limit   数量
     * @param array   $order   排序
     * @param string  $field   字段
     * @param boolean $whereOr OR查询
     * 
     * @return array 
     */
    public static function list($where = [], $page = 1, $limit = 10,  $order = [], $field = '', $whereOr = false)
    {
        if (empty($field)) {
            $field = 'admin_user_id,username,nickname,email,sort,is_disable,is_admin,login_num,login_ip,login_time';
        }

        if (empty($order)) {
            $order = ['sort' => 'desc', 'admin_user_id' => 'desc'];
        }

        if ($whereOr) {
            $count = Db::name('admin_user')
                ->whereOr($where)
                ->count('admin_user_id');

            $list = Db::name('admin_user')
                ->field($field)
                ->whereOr($where)
                ->page($page)
                ->limit($limit)
                ->order($order)
                ->select()
                ->toArray();
        } else {
            $where[] = ['is_delete', '=', 0];

            $count = Db::name('admin_user')
                ->where($where)
                ->count('admin_user_id');

            $list = Db::name('admin_user')
                ->field($field)
                ->where($where)
                ->page($page)
                ->limit($limit)
                ->order($order)
                ->select()
                ->toArray();
        }

        $pages = ceil($count / $limit);

        $data['count'] = $count;
        $data['pages'] = $pages;
        $data['page']  = $page;
        $data['limit'] = $limit;
        $data['list']  = $list;

        return $data;
    }

    /**
     * 管理员信息
     *
     * @param integer $admin_user_id 管理员id
     * 
     * @return array
     */
    public static function info($admin_user_id)
    {
        $admin_user = AdminUserCache::get($admin_user_id);

        if (empty($admin_user)) {
            $admin_user = Db::name('admin_user')
                ->where('admin_user_id', $admin_user_id)
                ->find();

            if (empty($admin_user)) {
                exception('管理员不存在:' . $admin_user_id);
            }

            $admin_user['avatar'] = file_url($admin_user['avatar']);

            if (admin_is_system($admin_user_id)) {
                $admin_menu = Db::name('admin_menu')
                    ->field('admin_menu_id,menu_url')
                    ->where('is_delete', 0)
                    ->order('menu_sort','desc')
                    ->select()
                    ->toArray();

                $menu_ids = array_column($admin_menu, 'admin_menu_id');
                $menu_url = array_column($admin_menu, 'menu_url');
                $menu_url = array_filter($menu_url);
            } elseif ($admin_user['is_admin'] == 1) {
                $admin_menu = Db::name('admin_menu')
                    ->field('admin_menu_id,menu_url')
                    ->where('is_delete', 0)
                    ->where('is_disable', 0)
                    ->select()
                    ->toArray();

                $menu_ids = array_column($admin_menu, 'admin_menu_id');
                $menu_url = array_column($admin_menu, 'menu_url');
                $menu_url = array_filter($menu_url);
            } else {
                $menu_ids = Db::name('admin_role')
                    ->field('admin_role_id')
                    ->where('admin_role_id', 'in', $admin_user['admin_role_ids'])
                    ->where('is_delete', 0)
                    ->where('is_disable', 0)
                    ->column('admin_menu_ids');

                $menu_ids[]   = $admin_user['admin_menu_ids'];
                $menu_ids_str = implode(',', $menu_ids);
                $menu_ids_arr = explode(',', $menu_ids_str);
                $menu_ids     = array_unique($menu_ids_arr);
                $menu_ids     = array_filter($menu_ids);

                $where[] = ['admin_menu_id', 'in', $menu_ids];
                $where[] = ['is_delete', '=', 0];
                $where[] = ['is_disable', '=', 0];
                $where[] = ['menu_url', '<>', ''];

                $where_un[] = ['is_delete', '=', 0];
                $where_un[] = ['is_disable', '=', 0];
                $where_un[] = ['menu_url', '<>', ''];
                $where_un[] = ['is_unauth', '=', 1];

                $menu_url = Db::name('admin_menu')
                    ->field('menu_url')
                    ->whereOr([$where, $where_un])
                    ->column('menu_url');
            }

            $admin_role_ids = $admin_user['admin_role_ids'];
            if (empty($admin_role_ids)) {
                $admin_role_ids = [];
            } else {
                $admin_role_ids = explode(',', $admin_user['admin_role_ids']);
                foreach ($admin_role_ids as $k => $v) {
                    $admin_role_ids[$k] = (int) $v;
                }
            }

            $admin_menu_ids = $admin_user['admin_menu_ids'];
            if (empty($admin_menu_ids)) {
                $admin_menu_ids = [];
            } else {
                $admin_menu_ids = explode(',', $admin_user['admin_menu_ids']);
                foreach ($admin_menu_ids as $k => $v) {
                    $admin_menu_ids[$k] = (int) $v;
                }
            }

            if (empty($menu_ids)) {
                $menu_ids = [];
            } else {
                foreach ($menu_ids as $k => $v) {
                    $menu_ids[$k] = (int) $v;
                }
            }

            $api_white_list  = Config::get('admin.api_white_list', []);
            $rule_white_list = Config::get('admin.rule_white_list', []);
            $white_list      = array_merge($api_white_list, $rule_white_list);
            $menu_url        = array_merge($menu_url, $white_list);
            $menu_url        = array_unique($menu_url);

            sort($menu_url);

            $admin_user['admin_token']    = AdminTokenService::create($admin_user);
            $admin_user['admin_role_ids'] = $admin_role_ids;
            $admin_user['admin_menu_ids'] = $admin_menu_ids;
            $admin_user['menu_ids']       = $menu_ids;
            $admin_user['roles']          = $menu_url;
            //$admin_user['menu_tree']      = self::getMenuTree($menu_ids);


            AdminUserCache::set($admin_user_id, $admin_user);
        }

        return $admin_user;
    }

    /**
     * @Description 获取菜单tree
     * @param $menu_ids
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @author Aaron
     * @date 2021/3/24 17:19
     */
    public static function getMenuTree($menu_ids)
    {
        $admin_menu = Db::name('admin_menu')
            ->field('admin_menu_id,menu_pid,menu_url,menu_pid,menu_name,vue_path,vue_component,vue_name,vue_hidden,vue_icon')
            ->where('is_delete', 0)
            ->where('is_disable', 0)
            ->where('level','<', 3)
            ->whereIn('admin_menu_id', $menu_ids)
            ->order(['menu_sort'=>'desc'])
            ->select()
            ->toArray();

        foreach ($admin_menu as $key=>$item) {
            $admin_menu[$key]['path'] = '/' . $item['vue_path'];
            $admin_menu[$key]['name'] = $item['vue_name'];
            $admin_menu[$key]['component'] = $item['vue_component'];
            $admin_menu[$key]['meta'] = [
                'title' => $item['menu_name'],
                'icon' => $item['vue_icon'],
                'roles' =>  [$item['menu_url']],
            ];
        }


        $admin_menu = \phpTools\ArrayTools::list_to_tree($admin_menu,'admin_menu_id','menu_pid', 'children');

        foreach ($admin_menu as $key => $item) {
            /*if($item['vue_hidden']) {
                unset($admin_menu[$key]);
                continue;
            }*/
            if($item['children']) {
                foreach ($item['children'] as $k=>$sub) {
                    if($sub['vue_hidden']) {
                        unset($item['children'][$k]);
                    }
                }
                $admin_menu[$key]['meta']['roles'] = array_merge($item['meta']['roles'] ,array_column($item['children'], 'menu_url'));
            }
        }
        //dump($admin_menu);
        return $admin_menu;
    }

    /**
     * 管理员添加
     *
     * @param array $param 管理员信息
     * 
     * @return array
     */
    public static function add($param)
    {
        $param['password']    = md5($param['password']);
        $param['create_time'] = datetime();

        $admin_user_id = Db::name('admin_user')
            ->insertGetId($param);

        if (empty($admin_user_id)) {
            exception();
        }

        $param['admin_user_id'] = $admin_user_id;

        unset($param['password']);

        return $param;
    }

    /**
     * 管理员修改
     *
     * @param array $param 管理员信息
     * 
     * @return array
     */
    public static function edit($param, $method = 'get')
    {
        $admin_user_id = $param['admin_user_id'];

        if ($method == 'get') {
            $admin_user = self::info($admin_user_id);

            unset($admin_user['admin_token'], $admin_user['password'], $admin_user['menu_ids'], $admin_user['roles']);

            $data['admin_user'] = $admin_user;

            return $data;
        } else {
            unset($param['admin_user_id']);

            $param['update_time'] = datetime();

            $res = Db::name('admin_user')
                ->where('admin_user_id', $admin_user_id)
                ->update($param);

            if (empty($res)) {
                exception();
            }

            $param['admin_user_id'] = $admin_user_id;

            AdminUserCache::upd($admin_user_id);

            return $param;
        }
    }

    /**
     * 管理员删除
     *
     * @param integer $admin_user_id 管理员id
     * 
     * @return array
     */
    public static function dele($admin_user_id)
    {
        $update['is_delete']   = 1;
        $update['delete_time'] = datetime();

        $res = Db::name('admin_user')
            ->where('admin_user_id', $admin_user_id)
            ->update($update);

        if (empty($res)) {
            exception();
        }

        $update['admin_user_id'] = $admin_user_id;

        AdminUserCache::upd($admin_user_id);

        return $update;
    }

    /**
     * 管理员修改头像
     *
     * @param array $param 头像信息
     * 
     * @return array
     */
    public static function avatar($param)
    {
        $admin_user_id = $param['admin_user_id'];
        $avatar        = $param['avatar'];

        $avatar_name = Filesystem::disk('public')
            ->putFile('admin_user', $avatar, function () use ($admin_user_id) {
                return $admin_user_id . '/' . $admin_user_id . '_avatar';
            });

        $update['avatar']      = 'storage/' . $avatar_name . '?t=' . date('YmdHis');
        $update['update_time'] = datetime();

        $res = Db::name('admin_user')
            ->where('admin_user_id', $admin_user_id)
            ->update($update);

        if (empty($res)) {
            exception();
        }

        AdminUserCache::upd($admin_user_id);
        $admin_user = AdminUserService::info($admin_user_id);

        $data['admin_user_id'] = $admin_user['admin_user_id'];
        $data['avatar']        = $admin_user['avatar'];
        $data['update_time']   = $admin_user['update_time'];

        return $data;
    }

    /**
     * 管理员密码重置
     *
     * @param array $param 管理员信息
     * 
     * @return array
     */
    public static function pwd($param)
    {
        $admin_user_id = $param['admin_user_id'];

        $update['password']    = md5($param['password']);
        $update['update_time'] = datetime();

        $res = Db::name('admin_user')
            ->where('admin_user_id', $admin_user_id)
            ->update($update);

        if (empty($res)) {
            exception();
        }

        $update['admin_user_id'] = $admin_user_id;
        $update['password']      = $res;

        AdminUserCache::upd($admin_user_id);

        return $update;
    }

    /**
     * 管理员权限分配
     *
     * @param array  $param  管理员信息
     * @param string $method 请求方式
     * 
     * @return array
     */
    public static function rule($param, $method = 'get')
    {
        if ($method == 'get') {
            $admin_user_id = $param['admin_user_id'];

            $admin_role = AdminRoleService::list([], 1, 999)['list'];
            $admin_menu = AdminMenuService::list('list')['list'];
            $admin_user = AdminUserService::info($admin_user_id);

            $menu_ids       = $admin_user['menu_ids'];
            $admin_menu_ids = $admin_user['admin_menu_ids'];
            $role_menu_ids  = AdminRoleService::getMenuId($admin_user['admin_role_ids']);

            foreach ($admin_menu as $k => $v) {
                $admin_menu[$k]['is_check'] = 0;
                $admin_menu[$k]['is_role']  = 0;
                $admin_menu[$k]['is_menu']  = 0;
                foreach ($menu_ids as $vmis) {
                    if ($v['admin_menu_id'] == $vmis) {
                        $admin_menu[$k]['is_check'] = 1;
                    }
                }
                foreach ($admin_menu_ids as $vami) {
                    if ($v['admin_menu_id'] == $vami) {
                        $admin_menu[$k]['is_menu'] = 1;
                    }
                }
                foreach ($role_menu_ids as $vrmi) {
                    if ($v['admin_menu_id'] == $vrmi) {
                        $admin_menu[$k]['is_role'] = 1;
                    }
                }
            }

            $admin_menu = AdminMenuService::toTree($admin_menu, 0);

            $data['admin_user_id']  = $admin_user_id;
            $data['admin_menu_ids'] = $admin_menu_ids;
            $data['admin_role_ids'] = $admin_user['admin_role_ids'];
            $data['username']       = $admin_user['username'];
            $data['nickname']       = $admin_user['nickname'];
            $data['menu_ids']       = $menu_ids;
            $data['admin_role']     = $admin_role;
            $data['admin_menu']     = $admin_menu;

            return $data;
        } else {
            $admin_user_id  = $param['admin_user_id'];
            $admin_role_ids = $param['admin_role_ids'];
            $admin_menu_ids = $param['admin_menu_ids'];

            sort($admin_role_ids);
            sort($admin_menu_ids);

            if (count($admin_role_ids) > 0) {
                if (empty($admin_role_ids[0])) {
                    unset($admin_role_ids[0]);
                }
            }

            if (count($admin_menu_ids) > 0) {
                if (empty($admin_menu_ids[0])) {
                    unset($admin_menu_ids[0]);
                }
            }

            $update['admin_role_ids'] = implode(',', $admin_role_ids);
            $update['admin_menu_ids'] = implode(',', $admin_menu_ids);
            $update['update_time']    = datetime();

            $res = Db::name('admin_user')
                ->where('admin_user_id', $admin_user_id)
                ->update($update);

            if (empty($res)) {
                exception();
            }

            $update['admin_user_id'] = $admin_user_id;

            AdminUserCache::upd($admin_user_id);

            return $update;
        }
    }

    /**
     * 管理员是否禁用
     *
     * @param array $param 管理员信息
     * 
     * @return array
     */
    public static function disable($param)
    {
        $admin_user_id = $param['admin_user_id'];

        $update['is_disable']  = $param['is_disable'];
        $update['update_time'] = datetime();

        $res = Db::name('admin_user')
            ->where('admin_user_id', $admin_user_id)
            ->update($update);

        if (empty($res)) {
            exception();
        }

        $update['admin_user_id'] = $admin_user_id;

        AdminUserCache::upd($admin_user_id);

        return $update;
    }

    /**
     * 管理员是否超管
     *
     * @param array $param 管理员信息
     * 
     * @return array
     */
    public static function admin($param)
    {
        $admin_user_id = $param['admin_user_id'];

        $update['is_admin']    = $param['is_admin'];
        $update['update_time'] = datetime();

        $res = Db::name('admin_user')
            ->where('admin_user_id', $admin_user_id)
            ->update($update);

        if (empty($res)) {
            exception();
        }

        $update['admin_user_id'] = $admin_user_id;

        AdminUserCache::upd($admin_user_id);

        return $update;
    }

    /**
     * 管理员模糊查询
     *
     * @param string $keyword 关键词
     * @param string $field   字段
     *
     * @return array
     */
    public static function likeQuery($keyword, $field = 'username|nickname')
    {
        $admin_user = Db::name('admin_user')
            ->where('is_delete', '=', 0)
            ->where($field, 'like', '%' . $keyword . '%')
            ->select()
            ->toArray();

        return $admin_user;
    }

    /**
     * 管理员精确查询
     *
     * @param string $keyword 关键词
     * @param string $field   字段
     *
     * @return array
     */
    public static function etQuery($keyword, $field = 'username|nickname')
    {
        $admin_user = Db::name('admin_user')
            ->where('is_delete', '=', 0)
            ->where($field, '=', $keyword)
            ->select()
            ->toArray();

        return $admin_user;
    }
}