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/UserService.php
<?php
/*
 * @Description  : 用户管理
 * @Author       : https://github.com/skyselang
 * @Date         : 2020-11-23
 * @LastEditTime : 2021-03-20
 */

namespace app\admin\service;

use think\facade\Db;
use think\facade\Filesystem;
use app\common\cache\UserCache;
use app\common\utils\Datetime;
use app\admin\service\TokenService;

class UserService
{
    /**
     * 用户列表
     *
     * @param array   $where   条件
     * @param integer $page    页数
     * @param integer $limit   数量
     * @param array   $order   排序
     * @param string  $field   字段
     * 
     * @return array 
     */
    public static function list($where = [], $page = 1, $limit = 10, $order = [], $field = '')
    {
        if (empty($field)) {
            $field = 'user_id,username,nickname,phone,email,sort,remark,create_time,login_time,is_disable';
        }

        $where[] = ['is_delete', '=', 0];

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

        $count = Db::name('user')
            ->where($where)
            ->count('user_id');

        $list = Db::name('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 $user_id 用户id
     * 
     * @return array
     */
    public static function info($user_id)
    {
        $user = UserCache::get($user_id);

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

            if (empty($user)) {
                exception('用户不存在:' . $user_id);
            }

            $user['avatar']     = file_url($user['avatar']);
            $user['user_token'] = TokenService::create($user);

            UserCache::set($user_id, $user);
        }

        return $user;
    }

    /**
     * 用户添加
     *
     * @param array $param 用户信息
     * 
     * @return array
     */
    public static function add($param = [], $method = 'get')
    {
        if ($method == 'get') {
            $data['region_tree'] = RegionService::info('tree');

            return $data;
        } else {
            $param['password']    = md5($param['password']);
            $param['create_time'] = datetime();

            $user_id = Db::name('user')
                ->insertGetId($param);

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

            $param['user_id'] = $user_id;

            unset($param['password']);

            return $param;
        }
    }

    /**
     * 用户修改
     *
     * @param array $param 用户信息
     * 
     * @return array
     */
    public static function edit($param, $method = 'get')
    {
        $user_id = $param['user_id'];

        if ($method == 'get') {
            $data['user_info']   = self::info($user_id);
            $data['region_tree'] = RegionService::info('tree');

            unset($data['user_info']['password'], $data['user_info']['user_token']);

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

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

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

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

            $param['user_id'] = $user_id;

            UserCache::upd($user_id);

            return $param;
        }
    }

    /**
     * 用户修改头像
     *
     * @param array $param 头像信息
     * 
     * @return array
     */
    public static function avatar($param)
    {
        $user_id = $param['user_id'];
        $avatar  = $param['avatar'];

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

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

        $res = Db::name('user')
            ->where('user_id', $user_id)
            ->update($update);

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

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

        UserCache::upd($user_id);

        return $update;
    }

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

        $res = Db::name('user')
            ->where('user_id', $user_id)
            ->update($update);

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

        $update['user_id'] = $user_id;

        UserCache::upd($user_id);

        return $update;
    }

    /**
     * 用户密码重置
     *
     * @param array $param 密码信息
     * 
     * @return array
     */
    public static function password($param)
    {
        $user_id = $param['user_id'];

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

        $res = Db::name('user')
            ->where('user_id', $user_id)
            ->update($update);

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

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

        UserCache::upd($user_id);

        return $update;
    }

    /**
     * 用户修改密码
     *
     * @param array $param 密码信息
     * 
     * @return array
     */
    public static function pwdedit($param)
    {
        $user_id = $param['user_id'];

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

        $res = Db::name('user')
            ->where('user_id', $user_id)
            ->update($update);

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

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

        UserCache::upd($user_id);

        return $update;
    }

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

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

        $res = Db::name('user')
            ->where('user_id', $user_id)
            ->update($update);

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

        $update['user_id'] = $user_id;

        UserCache::upd($user_id);

        return $update;
    }

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

        return $user;
    }

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

        return $user;
    }

    /**
     * 用户数量统计
     *
     * @param string $date 日期
     * @param string $type 类型:new新增,act活跃
     *
     * @return integer
     */
    public static function staNumber($date = 'total', $type = 'new')
    {
        $key  = $date . ':' . $type;
        $data = UserCache::get($key);

        if (empty($data)) {
            $where[] = ['is_delete', '=', 0];

            if ($date == 'total') {
                $where[] = ['user_id', '>', 0];
            } else {
                if ($date == 'yesterday') {
                    $yesterday = Datetime::yesterday();
                    list($sta_time, $end_time) = Datetime::datetime($yesterday);
                } elseif ($date == 'thisweek') {
                    list($start, $end) = Datetime::thisWeek();
                    $sta_time = Datetime::datetime($start);
                    $sta_time = $sta_time[0];
                    $end_time = Datetime::datetime($end);
                    $end_time = $end_time[1];
                } elseif ($date == 'lastweek') {
                    list($start, $end) = Datetime::lastWeek();
                    $sta_time = Datetime::datetime($start);
                    $sta_time = $sta_time[0];
                    $end_time = Datetime::datetime($end);
                    $end_time = $end_time[1];
                } elseif ($date == 'thismonth') {
                    list($start, $end) = Datetime::thisMonth();
                    $sta_time = Datetime::datetime($start);
                    $sta_time = $sta_time[0];
                    $end_time = Datetime::datetime($end);
                    $end_time = $end_time[1];
                } elseif ($date == 'lastmonth') {
                    list($start, $end) = Datetime::lastMonth();
                    $sta_time = Datetime::datetime($start);
                    $sta_time = $sta_time[0];
                    $end_time = Datetime::datetime($end);
                    $end_time = $end_time[1];
                } else {
                    $today = Datetime::today();
                    list($sta_time, $end_time) = Datetime::datetime($today);
                }

                if ($type == 'act') {
                    $where[] = ['login_time', '>=', $sta_time];
                    $where[] = ['login_time', '<=', $end_time];
                } else {
                    $where[] = ['create_time', '>=', $sta_time];
                    $where[] = ['create_time', '<=', $end_time];
                }
            }

            $data = Db::name('user')
                ->field('user_id')
                ->where($where)
                ->count('user_id');

            UserCache::set($key, $data);
        }

        return $data;
    }

    /**
     * 用户日期统计
     *
     * @param array  $date 日期范围
     * @param string $type 类型:new新增,act活跃
     * 
     * @return array
     */
    public static function staDate($date = [], $type = 'new')
    {
        if (empty($date)) {
            $date[0] = Datetime::daysAgo(30);
            $date[1] = Datetime::today();
        }

        $sta_date = $date[0];
        $end_date = $date[1];

        $key  = 'date:' . $sta_date . '-' . $end_date . ':' . $type;
        $data = UserCache::get($key);

        if (empty($data)) {
            $sta_time = Datetime::dateStartTime($sta_date);
            $end_time = Datetime::dateEndTime($end_date);

            if ($type == 'act') {
                $field = "count(login_time) as num, date_format(login_time,'%Y-%m-%d') as date";
                $where[] = ['login_time', '>=', $sta_time];
                $where[] = ['login_time', '<=', $end_time];
                $group = "date_format(login_time,'%Y-%m-%d')";
            } else {
                $field = "count(create_time) as num, date_format(create_time,'%Y-%m-%d') as date";
                $where[] = ['create_time', '>=', $sta_time];
                $where[] = ['create_time', '<=', $end_time];
                $group = "date_format(create_time,'%Y-%m-%d')";
            }

            $x_data = Datetime::betweenDates($sta_date, $end_date);
            $y_data = [];

            $user = Db::name('user')
                ->field($field)
                ->where($where)
                ->group($group)
                ->select();

            foreach ($x_data as $k => $v) {
                $y_data[$k] = 0;
                foreach ($user as $ku => $vu) {
                    if ($v == $vu['date']) {
                        $y_data[$k] = $vu['num'];
                    }
                }
            }

            $data['x_data'] = $x_data;
            $data['y_data'] = $y_data;
            $data['date']   = $date;

            UserCache::set($key, $data);
        }

        return $data;
    }
}