| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987 | 
							- <?php
 
- namespace common\modules\user\models;
 
- use abei2017\wx\mini\qrcode\Qrcode;
 
- use backend\models\search\SearchModelTrait;
 
- use common\enums\DataTypeEnum;
 
- use common\enums\StatusEnum;
 
- use common\helpers\GrafikaHelper;
 
- use common\helpers\Regexp;
 
- use common\helpers\wx\Application;
 
- use common\models\Data;
 
- use common\models\DataRank;
 
- use common\models\ShareLevel;
 
- use common\models\Store;
 
- use common\models\UserCar;
 
- use common\models\UserLevel;
 
- use common\models\VipUser;
 
- use common\models\Voice;
 
- use common\modules\attachment\behaviors\UploadBehavior;
 
- use common\modules\attachment\models\Attachment;
 
- use common\modules\rbac\controllers\AssignmentController;
 
- use common\modules\user\Module;
 
- use common\modules\user\traits\ModuleTrait;
 
- use Exception;
 
- use Grafika\Color;
 
- use Grafika\Grafika;
 
- use Yii;
 
- use yii\behaviors\TimestampBehavior;
 
- use yii\db\ActiveRecord;
 
- use yii\helpers\ArrayHelper;
 
- use yii\web\IdentityInterface;
 
- use yii\web\ServerErrorHttpException;
 
- /**
 
-  * User model.
 
-  *
 
-  * @property int $id
 
-  * @property int $pid
 
-  * @property int $jucai_id
 
-  * @property string $username
 
-  * @property string $password_hash
 
-  * @property string $password_reset_token
 
-  * @property string $access_token
 
-  * @property int $expired_at
 
-  * @property string $email
 
-  * @property string $tel
 
-  * @property string $auth_key
 
-  * @property int $created_at
 
-  * @property int $updated_at
 
-  * @property int $confirmed_at
 
-  * @property int $blocked_at
 
-  * @property int $login_at
 
-  * @property int $type
 
-  * @property int $level_id
 
-  * @property int $is_vip
 
-  * @property int $vip_time
 
-  * @property string $password write-only password
 
-  * @property Profile $profile
 
-  * @property UserCar $car
 
-  * @property string $privilege
 
-  * @property string $openid
 
-  * @property string $unionid
 
-  * @property string $nickname
 
-  * @property Module $module
 
-  * @property Store $store
 
-  * @property ShareLevel $shareLevel
 
-  * @property Attachment $qrcode
 
-  * @property array $dataCount
 
-  */
 
- class User extends ActiveRecord implements IdentityInterface
 
- {
 
-     use ModuleTrait;
 
-     use SearchModelTrait;
 
-     public $password;
 
-     const TYPE_WEB = 0;//后台用户
 
-     const TYPE_PERSON = 1;//个人用户
 
-     const TYPE_COMPANY = 2;//企业用户
 
-     /**
 
-      * {@inheritdoc}
 
-      */
 
-     public static function tableName()
 
-     {
 
-         return '{{%user}}';
 
-     }
 
-     /**
 
-      * {@inheritdoc}
 
-      */
 
-     public function behaviors()
 
-     {
 
-         return [
 
-             TimestampBehavior::className(),
 
-             [
 
-                 'class' => UploadBehavior::className(),
 
-                 'attribute' => 'qrcode',
 
-                 'entity' => __CLASS__
 
-             ],
 
-         ];
 
-     }
 
-     public function scenarios()
 
-     {
 
-         $scenarios = parent::scenarios();
 
-         return array_merge($scenarios, [
 
-             'register' => ['username', 'openid', 'password', 'email', 'tel', 'pid'],
 
-             'connect' => ['username', 'email'],
 
-             'create' => ['jucai_id', 'email', 'tel'],
 
-             'update' => ['username', 'password', 'email', 'tel', 'nickname', 'level_id', 'pid'],
 
-             'settings' => ['username', 'password', 'email', 'tel'],
 
-             'resetPassword' => ['password']
 
-         ]);
 
-     }
 
-     /**
 
-      * {@inheritdoc}
 
-      */
 
-     public function rules()
 
-     {
 
-         return [
 
-             ['username', 'string', 'on' => 'search'],
 
-             ['username', 'required', 'on' => 'create'],
 
-             ['password', 'required', 'on' => ['register']],
 
-             [['tel'], 'match', 'pattern' => Regexp::$mobile],
 
-             [['email'], 'match', 'pattern' => Regexp::$email],
 
-             [['privilege'], 'string', 'max' => 255],
 
-             [['qrcode', 'dataCount'], 'safe'],
 
-         ];
 
-     }
 
-     public function attributeLabels()
 
-     {
 
-         return [
 
-             'pid' => '上级用户',
 
-             'jucai_id' => '聚才网ID',
 
-             'username' => '用户名',//openid共用字段
 
-             'openid' => '微信ID',
 
-             'nickname' => '昵称',
 
-             'password' => '密码',
 
-             'email' => ' 绑定邮箱',
 
-             'tel' => '绑定手机',
 
-             'avatar' => '头像',
 
-             'created_at' => '注册时间',
 
-             'login_at' => '最后登录时间',
 
-             'type' => '用户类型',
 
-             'privilege' => '特权',//微信用户属性
 
-             'unionid' => '联合ID',//微信用户属性
 
-             'level_id' => '分销等级',//微信用户属性
 
-             'qrcode' => '分销码',         //小程序码
 
-             'is_vip' => '是否vip',        //是否vip
 
-             'vip_time' => 'vip有效期',        //是否vip
 
-             'dataCount' => '数据统计',
 
-         ];
 
-     }
 
-     /**
 
-      * 根据id查询用户
 
-      * {@inheritdoc}
 
-      */
 
-     public static function findIdentity($id)
 
-     {
 
-         return static::findOne(['id' => $id, 'blocked_at' => null]);
 
-     }
 
-     /**
 
-      * 根据访问令牌查询用户
 
-      * api访问专用
 
-      * {@inheritdoc}
 
-      */
 
-     public static function findIdentityByAccessToken($token, $type = null)
 
-     {
 
-         return static::find()->where(['access_token' => $token])->andWhere(['>', 'expired_at', time()])->one();
 
-     }
 
-     /**
 
-      * 根据用户名查询用户
 
-      *
 
-      * @param string $username
 
-      *
 
-      * @return mixed
 
-      */
 
-     public static function findByUsername($username)
 
-     {
 
-         return static::find()->where(['username' => $username])
 
-             ->andWhere(['blocked_at' => null])
 
-             ->one();
 
-     }
 
-     /**
 
-      * 根据用openid查询用户
 
-      *
 
-      * @param string $openId
 
-      *
 
-      * @return mixed
 
-      */
 
-     public static function findByOpenid($openId)
 
-     {
 
-         return static::find()->where(['openid' => $openId])
 
-             ->andWhere(['blocked_at' => null])
 
-             ->one();
 
-     }
 
-     /**
 
-      * 根据绑定邮箱查询用户
 
-      * @param $email
 
-      * @return array|ActiveRecord|null
 
-      * @author nodelog
 
-      */
 
-     public static function findByEmail($email)
 
-     {
 
-         return static::find()->where(['email' => $email])
 
-             ->andWhere(['blocked_at' => null])
 
-             ->one();
 
-     }
 
-     /**
 
-      * 根据绑定手机号查询用户
 
-      * @param $tel
 
-      * @return array|ActiveRecord|null
 
-      * @author nodelog
 
-      */
 
-     public static function findByTel($tel)
 
-     {
 
-         return static::find()->where(['email' => $tel])
 
-             ->andWhere(['blocked_at' => null])
 
-             ->one();
 
-     }
 
-     /**
 
-      * 根据用户名、邮箱、手机号查询用户
 
-      * @param $login
 
-      * @return array|ActiveRecord|null
 
-      * @author nodelog
 
-      */
 
-     public static function findByUsernameOrEmailTel($login)
 
-     {
 
-         return static::find()->where(['or', ['username' => $login], ['email' => $login], ['tel' => $login]])
 
-             ->andWhere(['blocked_at' => null])
 
-             ->one();
 
-     }
 
-     /**
 
-      * 根据重置密码令牌查询用户
 
-      * Finds user by password reset token.
 
-      *
 
-      * @param string $token password reset token
 
-      *
 
-      * @return static|null
 
-      */
 
-     public static function findByPasswordResetToken($token)
 
-     {
 
-         if (!static::isPasswordResetTokenValid($token)) {
 
-             return;
 
-         }
 
-         return static::findOne([
 
-             'password_reset_token' => $token,
 
-             'blocked_at' => null
 
-         ]);
 
-     }
 
-     /**
 
-      * Finds out if password reset token is valid.
 
-      *
 
-      * @param string $token password reset token
 
-      *
 
-      * @return bool
 
-      */
 
-     public static function isPasswordResetTokenValid($token)
 
-     {
 
-         if (empty($token)) {
 
-             return false;
 
-         }
 
-         $timestamp = (int)substr($token, strrpos($token, '_') + 1);
 
-         $expire = Yii::$app->params['user.passwordResetTokenExpire'];
 
-         return $timestamp + $expire >= time();
 
-     }
 
-     /**
 
-      * 获取当前用户id,认证身份identity使用
 
-      * {@inheritdoc}
 
-      */
 
-     public function getId()
 
-     {
 
-         return $this->getPrimaryKey();
 
-     }
 
-     /**
 
-      * 获取当前身份验证密钥
 
-      * {@inheritdoc}
 
-      */
 
-     public function getAuthKey()
 
-     {
 
-         return $this->auth_key;
 
-     }
 
-     /**
 
-      * 验证身份验证密钥
 
-      * {@inheritdoc}
 
-      */
 
-     public function validateAuthKey($authKey)
 
-     {
 
-         return $this->getAuthKey() === $authKey;
 
-     }
 
-     /**
 
-      * 验证密码
 
-      * @param string $password password to validate
 
-      *
 
-      * @return bool if password provided is valid for current user
 
-      */
 
-     public function validatePassword($password)
 
-     {
 
-         return Yii::$app->security->validatePassword($password, $this->password_hash);
 
-     }
 
-     /**
 
-      * 从密码生成密码哈希并将其赋值给当前用户。
 
-      * @param $password
 
-      * @throws \yii\base\Exception
 
-      * @author nodelog
 
-      */
 
-     public function setPassword($password)
 
-     {
 
-         $this->password_hash = Yii::$app->security->generatePasswordHash($password);
 
-     }
 
-     /**
 
-      * 验证二维码哈希值
 
-      * @param $qrcodeHash
 
-      * @return bool
 
-      * @author nodelog
 
-      */
 
-     public function validateQrcodeHash($qrcodeHash)
 
-     {
 
-         return $qrcodeHash == md5(self::generateQrcodeLoginUrl($this->access_token));
 
-     }
 
-     /**
 
-      * 生成“记住我”身份验证密钥。
 
-      */
 
-     public function generateAuthKey()
 
-     {
 
-         $this->auth_key = Yii::$app->security->generateRandomString();
 
-     }
 
-     /**
 
-      * 生成新的密码重置令牌。
 
-      */
 
-     public function generatePasswordResetToken()
 
-     {
 
-         $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
 
-     }
 
-     /**
 
-      * 删除密码重置令牌。
 
-      */
 
-     public function removePasswordResetToken()
 
-     {
 
-         $this->password_reset_token = null;
 
-     }
 
-     /**
 
-      * 生成访问令牌和过期时间
 
-      * @param null $access_token
 
-      * @throws \yii\base\Exception
 
-      * @author nodelog
 
-      */
 
-     public function generateAccessToken($access_token = null)
 
-     {
 
-         if (!$access_token) {
 
- //            $access_token = Yii::$app->security->generateRandomString();
 
-         }
 
-         $this->access_token = $access_token;
 
-         $this->expired_at = time() + 60 * 60 * 2;//2小时
 
-     }
 
-     /**
 
-      * 删除访问令牌和过期时间
 
-      * @author nodelog
 
-      */
 
-     public function removeAccessToken()
 
-     {
 
-         $this->access_token = null;
 
-         $this->expired_at = null;
 
-     }
 
-     /**
 
-      * 创建用户
 
-      * @param int $type
 
-      * @return bool
 
-      * @author nodelog
 
-      */
 
-     public function create()
 
-     {
 
-         if ($this->getIsNewRecord() == false) {
 
-             throw new \RuntimeException('Calling "' . __CLASS__ . '::' . __METHOD__ . '" on existing user');
 
-         }
 
-         $this->confirmed_at = time();
 
-         $this->password = $this->password == null ? $this->getModule()->defaultPassword : $this->password;
 
-         $this->generateAuthKey();
 
-         if (!$this->save()) {
 
-             return false;
 
-         }
 
-         return true;
 
-     }
 
-     /**
 
-      * 创建微信用户 并授权公司管理员角色
 
-      * @throws \Exception
 
-      * @author nodelog
 
-      */
 
-     public function createWechat()
 
-     {
 
-         $this->type = self::TYPE_PERSON;
 
-         if ($this->create()) {
 
- //            try {
 
- //                $auth = \Yii::$app->authManager;
 
- //                //todo 具体授权
 
- //                $authorRole = $auth->getRole('superAdmin');
 
- //                $auth->assign($authorRole, $this->id);
 
- //            } catch (Exception $e) {
 
- //                $this->addError('username', $e->getMessage());
 
- //                return false;
 
- //            }
 
-             //创建个人数据设置
 
-             return true;
 
-         }
 
-         return false;
 
-     }
 
-     /**
 
-      * 保存之前生成密码哈希
 
-      * @param bool $insert
 
-      * @return bool
 
-      * @throws \yii\base\Exception
 
-      * @author nodelog
 
-      */
 
-     public function beforeSave($insert)
 
-     {
 
-         if (!empty($this->password)) {
 
-             $this->password_hash = Yii::$app->security->generatePasswordHash($this->password);
 
-         }
 
-         return parent::beforeSave($insert);
 
-     }
 
-     /**
 
-      * 禁用用户
 
-      * @return bool
 
-      * @throws \yii\base\Exception
 
-      * @author nodelog
 
-      */
 
-     public function block()
 
-     {
 
-         return (bool)$this->updateAttributes([
 
-             'blocked_at' => time(),
 
-             'auth_key' => \Yii::$app->security->generateRandomString(),
 
-         ]);
 
-     }
 
-     /**
 
-      * 解除禁用
 
-      * UnBlocks the user by setting 'blocked_at' field to null.
 
-      */
 
-     public function unblock()
 
-     {
 
-         return (bool)$this->updateAttributes(['blocked_at' => null]);
 
-     }
 
-     /**
 
-      * 发送绑定邮箱确认邮件
 
-      * @param $email
 
-      * @return array
 
-      * @throws \yii\base\InvalidConfigException
 
-      * @author nodelog
 
-      */
 
-     public function sendConfirm($email)
 
-     {
 
-         $exist = User::find()->where(['<>', 'id', Yii::$app->user->id])->andWhere(['email' => $email])->exists();
 
-         $user = Yii::$app->user->identity;
 
-         if (!$exist && !$user->isConfirmed) {
 
-             /** @var Token $token */
 
-             $token = \Yii::createObject([
 
-                 'class' => Token::className(),
 
-                 'user_id' => $user->id,
 
-                 'type' => Token::TYPE_CONFIRMATION,
 
-             ]);
 
-             $token->save(false);
 
-             $mailer = Yii::$app->mailer;
 
-             $mailer->viewPath = '@common/modules/user/mail';
 
-             try {
 
-                 $mailer->compose(['html' => 'confirmation'], ['user' => $user, 'token' => $token])
 
-                     ->setTo($email)
 
-                     ->setSubject(Yii::t('user', 'Confirm account on {0}', Yii::$app->config->get('name')))
 
-                     ->send();
 
-                 return [true, null];
 
-             } catch (\Exception $e) {
 
-                 return [false, '发送失败,请确认邮箱是否存在!'];
 
-             }
 
-         } else {
 
-             return [false, '邮箱已存在'];
 
-         }
 
-     }
 
-     /**
 
-      * 用户邮箱验证
 
-      * @param $code
 
-      * @return array
 
-      * @throws \yii\db\StaleObjectException
 
-      * @author nodelog
 
-      */
 
-     public function attemptConfirmation($code)
 
-     {
 
-         if ($this->getIsConfirmed()) {
 
-             return [false, '该用户已验证邮箱'];
 
-         }
 
-         $token = Token::find()->where(['user_id' => $this->id, 'code' => $code, 'type' => Token::TYPE_CONFIRMATION])->one();
 
-         if ($token !== null && !$token->isExpired) {
 
-             $token->delete();
 
-             if (($success = $this->confirm())) {
 
-                 $message = \Yii::t('user', 'Thank you, registration is now complete.');
 
-             } else {
 
-                 $message = \Yii::t('user', 'Something went wrong and your account has not been confirmed.');
 
-             }
 
-         } else {
 
-             $success = false;
 
-             $message = \Yii::t('user', 'The confirmation link is invalid or expired. Please try requesting a new one.');
 
-         }
 
-         return [$success, $message];
 
-     }
 
-     /**
 
-      * Confirms the user by setting 'confirmed_at' field to current time.
 
-      */
 
-     public function confirm()
 
-     {
 
-         $result = (bool)$this->updateAttributes(['confirmed_at' => time()]);
 
-         return $result;
 
-     }
 
-     /**
 
-      * 获取用户头像
 
-      * @param int $width
 
-      * @param int $height
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     public function getAvatar($width = 96, $height = 0)
 
-     {
 
-         if (empty($height)) {
 
-             $height = $width;
 
-         }
 
-         if ($this->profile->avatar) {
 
-             return Yii::$app->storage->thumbnail($this->profile->avatar, $width, $height);
 
-         }
 
-         return $this->getDefaultAvatar($width, $height);
 
-     }
 
-     /**
 
-      * 获取用户信息
 
-      * @return \yii\db\ActiveQuery
 
-      * @author nodelog
 
-      */
 
-     public function getProfile()
 
-     {
 
-         return $this->hasOne(Profile::className(), ['user_id' => 'id']);
 
-     }
 
-     /**
 
-      * 认证车辆
 
-      * @return \yii\db\ActiveQuery
 
-      * @author nodelog
 
-      */
 
-     public function getCar()
 
-     {
 
-         return $this->hasOne(UserCar::className(), ['user_id' => 'id']);
 
-     }
 
-     /**
 
-      * 获取用户签名
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     public function getSignature()
 
-     {
 
-         return $this->profile->signature;
 
-     }
 
-     /**
 
-      * 获取默认头像
 
-      * @param $width
 
-      * @param $height
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     public static function getDefaultAvatar($width, $height)
 
-     {
 
-         list ($basePath, $baseUrl) = \Yii::$app->getAssetManager()->publish("@common/static");
 
-         $name = "avatars/avatar_" . $width . "x" . $height . ".png";
 
-         if (file_exists($basePath . DIRECTORY_SEPARATOR . $name)) {
 
-             return $baseUrl . "/" . $name;
 
-         }
 
-         return $baseUrl . "/" . "avatar_200x200.png";
 
-     }
 
-     /**
 
-      * 保存头像
 
-      * @param $avatar
 
-      * @author nodelog
 
-      */
 
-     public function saveAvatar($avatar)
 
-     {
 
-         $this->profile->updateAttributes(['avatar' => $avatar]);
 
-     }
 
-     /**
 
-      * 初始化插入数据库后置事件
 
-      * @author nodelog
 
-      */
 
-     public function init()
 
-     {
 
-         $this->on(self::EVENT_AFTER_INSERT, [$this, 'afterInsertInternal']);
 
-     }
 
-     /**
 
-      * 设置用户信息的外键关联
 
-      * @param $event
 
-      * @author nodelog
 
-      */
 
-     public function afterInsertInternal($event)
 
-     {
 
-         $profile = new Profile();
 
- //        $profile->voice_id = Voice::getDefaultId();
 
-         $this->link('profile', $profile);
 
-         //创建个人配置
 
-     }
 
-     /**
 
-      * 是否管理员用户
 
-      * @return bool
 
-      */
 
-     public function getIsAdmin()
 
-     {
 
-         return
 
-             (\Yii::$app->getAuthManager() && $this->module->adminPermission ?
 
-                 Yii::$app->getAuthManager()->checkAccess($this->getId(), $this->module->adminPermission) : false)
 
-             || in_array($this->username, $this->module->admins);
 
-     }
 
-     /**
 
-      * 是否确认
 
-      * @return bool Whether the user is confirmed or not.
 
-      */
 
-     public function getIsConfirmed()
 
-     {
 
-         return $this->confirmed_at != null;
 
-     }
 
-     /**
 
-      * 是否禁用
 
-      * @return bool Whether the user is blocked or not.
 
-      */
 
-     public function getIsBlocked()
 
-     {
 
-         return $this->blocked_at != null;
 
-     }
 
-     /**
 
-      * 获取等级
 
-      * @return string
 
-      */
 
-     public function getLevel()
 
-     {
 
-         return UserLevel::getLevel($this->profile->money);
 
-     }
 
-     /**
 
-      * 生成二维码登录url
 
-      * @param $access_token
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     public static function generateQrcodeLoginUrl($access_token)
 
-     {
 
-         return Yii::$app->request->hostInfo . '/api/v1/weixin/code?access_token=' . $access_token;
 
-     }
 
-     public static $typeList = [
 
-         self::TYPE_COMPANY => '企业用户',
 
-         self::TYPE_PERSON => '个人用户',
 
-         self::TYPE_WEB => '后台用户'
 
-     ];
 
-     public static $typeIconList = [
 
-         self::TYPE_PERSON => '<i class="fa fa-fw fa-wechat"></i>',
 
-         self::TYPE_WEB => '<i class="fa fa-fw fa-desktop"></i>'
 
-     ];
 
-     /**
 
-      * 格式化昵称
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     private function formatNickname()
 
-     {
 
- //        $name = $this->profile->nickname ?: $this->username;
 
- //        if ($htmlFormat) {
 
- //            return Html::tag('span', $name . ' ' . self::$typeIconList[$this->type], ['title' => self::$typeList[$this->type]]);
 
- //        }
 
-         return $this->nickname ? $this->nickname : $this->username;
 
-     }
 
-     /**
 
-      * 获得用户所有角色描述
 
-      * @return string
 
-      * @author nodelog
 
-      */
 
-     public function getAllRoleDesc()
 
-     {
 
-         $roles = Yii::$app->authManager->getRolesByUser($this->id);
 
-         return implode(' | ', ArrayHelper::getColumn($roles, 'description'));
 
-     }
 
-     /**
 
-      * 查询 左连接 去除公共部分,如教练查询未绑定教练微信用户,销售查询未绑定销售微信用户,FOR 后台添加教练和销售 筛选选择列表数据
 
-      * @param $model                    模型类名
 
-      * @param $inIdArray                过滤的id数组
 
-      * @return array|User[]
 
-      */
 
-     public static function getAllSelectFromModel($model, $inIdArray = null)
 
-     {
 
-         if (empty($inIdArray)) {
 
-             $list = User::find()->joinWith($model::relationName())->where([self::tableName() . '.blocked_at' => null, $model::tableName() . '.user_id' => null])->all();
 
-         } else {
 
-             $list = User::find()->joinWith($model::relationName())->where([self::tableName() . '.blocked_at' => null])->andWhere(['or', [$model::tableName() . '.user_id' => null], [$model::tableName() . '.user_id' => $inIdArray]])->all();
 
-         }
 
-         return $list;
 
-     }
 
-     /**
 
-      * 获取可选管理员用户列表
 
-      * @author nodelog
 
-      */
 
-     public static function lists()
 
-     {
 
-         if (Yii::$app->user->identity->getIsAdmin()) {
 
-             //已经使用的用户ids
 
- //            $usedUserIds = Company::find()->select('user_id')->distinct()->asArray()->indexBy('user_id')->column();
 
- //            //去掉当前包含的当前公司id
 
- //            if (!empty($this->user_id) && isset($usedUserIds[$this->user_id])) {
 
- //                unset($usedUserIds[$this->user_id]);
 
- //            }
 
- //            return User::find()->where(['not in', 'id', $usedUserIds])->asArray()->indexBy('id')->all();
 
-             $lists = User::find()->indexBy('id')->all();
 
-             $lists = ArrayHelper::map($lists, 'id', 'nickname');
 
-             return $lists;
 
-         } else {
 
-             return [
 
-                 Yii::$app->user->id => Yii::$app->user->identity->nickname
 
-             ];
 
-         }
 
-     }
 
-     /**
 
-      * 获取用户的供应商
 
-      * @return \yii\db\ActiveQuery
 
-      * @author nodelog
 
-      */
 
-     public function getStore()
 
-     {
 
-         return $this->hasOne(Store::className(), ['user_id' => 'id']);
 
-     }
 
-     /**
 
-      * 查询后对数据处理
 
-      * @author nodelog
 
-      */
 
-     public function afterFind()
 
-     {
 
-         parent::afterFind();
 
- //        $this->nickname = $this->formatNickname();
 
-         //更新vip状态
 
- //        $this->isVip();
 
-     }
 
-     /**
 
-      * 获取分销等级
 
-      * @return \yii\db\ActiveQuery
 
-      * @author nodelog
 
-      */
 
-     public function getShareLevel()
 
-     {
 
-         return $this->hasOne(ShareLevel::className(), ['id' => 'level_id']);
 
-     }
 
-     /**
 
-      * 分销海报
 
-      *
 
-      * @param bool $force
 
-      * @return bool|mixed|string
 
-      * @throws ServerErrorHttpException
 
-      * @author nodelog
 
-      */
 
-     public function generateQrcode($force = false)
 
-     {
 
-         //海报存在直接返回
 
-         if ($this->qrcode && !$force) {
 
-             return $this->qrcode->url;
 
-         }
 
-         //小程序码中  scene 放入用户id
 
-         $scene = 'pid:' . \Yii::$app->user->id;
 
-         $hash = md5($scene);
 
-         $qrcodeFile = \Yii::getAlias('@storagePath/upload/qrcode/' . $hash . '.png');//path
 
-         $qrcodeUrl = \Yii::getAlias('@storageUrl/upload/qrcode/' . $hash . '.png');//path
 
-         try {
 
-             ini_set('memory_limit', '256M');
 
-             $editor = Grafika::createEditor(GrafikaHelper::getSupportEditorLib());
 
-             //背景图
 
-             $editor->open($userPoster, Yii::$app->storage->getPath(\Yii::$app->config->get('share_poster_bg')));
 
-             //生成推广码
 
-             /* @var Qrcode $qrcode */
 
-             $qrcode = (new Application())->driver("mini.qrcode");
 
-             //小程序码 buffer,宽度220
 
-             $qrcodeStream = $qrcode->unLimit($scene, 'pages/index/index', $extra = []);//buffer
 
-             $tempFile = \Yii::getAlias('@storagePath/upload/thumb/' . $hash . '.png');
 
-             if (!file_exists(dirname($tempFile))) {
 
-                 @mkdir(dirname($tempFile), 0755, true);
 
-             }
 
-             file_put_contents($tempFile, $qrcodeStream);
 
- //            Yii::$app->storage->put($tempFile, $qrcodeStream);
 
-             $editor->open($wxappQrcode, $tempFile);
 
-             //测试二维码
 
- //            $editor->open($wxappQrcode, Yii::$app->storage->getPath('https://es.jiangzi.xin/storage/upload/20220408/OGGUn-K8HxojZfSesNv0OuVuAhRLYPzSJX0zEiyE.png'));
 
-             $avatarPath = Yii::$app->storage->getPath($this->getAvatar(540));
 
-             if (strpos($avatarPath, 'http') !== false) {
 
-                 $avatarPath = Yii::$app->storage->thumbnail(\Yii::$app->config->get('share_image'), 540, 540);
 
-                 $editor->open($avatar, Yii::$app->storage->getPath($avatarPath));
 
-             } else {
 
-                 $editor->open($avatar, $avatarPath);
 
-             }
 
- //            $editor->resizeFill($goodsCover, 750, 750);
 
-             $editor->resizeExactWidth($avatar, 540);
 
-             //附加头像
 
-             $editor->blend($userPoster, $avatar, 'normal', 1.0, 'top-left', 105, 4900);
 
-             //写入文字
 
-             $fontFile = Yii::getAlias('@root/web/assets/fonts/st-heiti-light.ttc');
 
-             //加用户昵称
 
-             $editor->text($userPoster, mb_substr($this->nickname, 0, 12), 100, 750, 5000, new Color('#ffffff'), $fontFile, 0);
 
-             $editor->text($userPoster, Yii::$app->config->get('share_poster_text'), 70, 750, 5250, new Color('#ffffff'), $fontFile, 0);
 
-             //调整小程序码图片
 
-             $editor->resizeExactWidth($wxappQrcode, 660);
 
-             //附加小程序码图片
 
-             $editor->blend($userPoster, $wxappQrcode, 'normal', 1.0, 'top-right', -105, 4800);
 
-             //保存图片
 
-             $editor->save($userPoster, $qrcodeFile, 85);
 
-             //删除临时图片
 
-             unlink($tempFile);
 
-             //上传分销码
 
-             list($attachment, $error) = Attachment::uploadFromFile('qrcode', $qrcodeFile);
 
-             if ($error == null) {
 
-                 $this->qrcode = [
 
-                     'id' => $attachment->id,
 
-                     'name' => $attachment->name,
 
-                     'hash' => $attachment->hash,
 
-                     'url' => $attachment->url,
 
-                     'path' => $attachment->path,
 
-                     'extension' => $attachment->extension,
 
-                     'type' => $attachment->type,
 
-                     'size' => $attachment->size
 
-                 ];
 
-                 if ($this->save(false)) {
 
-                     return ArrayHelper::getValue($this, 'qrcode.url', '');
 
-                 }
 
-             }
 
-         } catch (Exception $e) {
 
-             throw new ServerErrorHttpException($e->getMessage());
 
-         }
 
-         return $qrcodeUrl;
 
-     }
 
-     /**
 
-      * 用户是否vip,并且未过期
 
-      * @author nodelog
 
-      */
 
-     public function isVip()
 
-     {
 
-         //vip自动过期
 
-         if ($this->is_vip) {
 
-             $vip = VipUser::find()->where(['user_id' => $this->id])->orderBy(['end_time' => SORT_DESC])->one();
 
-             if (!empty($vip) && $vip->isExpire()) {
 
-                 $this->is_vip = StatusEnum::STATUS_OFF;
 
-                 $this->save(false);
 
-             }
 
-         }
 
-         return $this->is_vip;
 
-     }
 
-     /**
 
-      * 获取当前vip
 
-      * @author nodelog
 
-      */
 
-     public function getCurrentVip()
 
-     {
 
-         $now = time();
 
-         return VipUser::find()->where(['user_id' => $this->id])->andWhere(['and', ['<=', 'start_time', $now], ['>', 'end_time', $now]])->one();
 
-     }
 
- //
 
- //    public function fields() {
 
- //        $fields = parent::fields();
 
- //
 
- //        $fields[] = 'dataCount';
 
- //        return $fields;
 
- //    }
 
-     /**
 
-      * 数据统计
 
-      * @author nodelog
 
-      */
 
-     public function getDataCount()
 
-     {
 
-         $data = [
 
-             [
 
-                 'text' => '日课',
 
-                 'count' => 0
 
-             ],
 
-             [
 
-                 'text' => '总课',
 
-                 'count' => 0
 
-             ],
 
-             [
 
-                 'text' => '辅助课',
 
-                 'count' => 0
 
-             ],
 
-         ];
 
-         //每日功课
 
- //        $data[0]['count'] = Data::find()->active()->andWhere(['user_id' => $this->id])->today()->count();
 
-         //累积功课
 
- //        $data[1]['count'] = Data::find()->active()->andWhere(['user_id' => $this->id])->count();
 
-         //辅助功课
 
- //        $userIds = VipUser::find()->active()->andWhere(['pay_user_id' => $this->id])->andWhere(['!=', 'user_id', $this->id])->select(['user_id'])->distinct()->column();
 
- //        $data[2]['count'] = Data::find()->active()->andWhere(['in', 'user_id', $userIds])->count();
 
-         //直接获取辅助榜数据
 
- //        $helpCount = DataRank::find()->active()->andWhere(['user_id' => $this->id, 'level' => DataTypeEnum::TYPE_HELP])->total()->select(['count'])->scalar();
 
- //        $data[2]['count'] = $helpCount ? $helpCount : 0;
 
-         return $data;
 
-     }
 
- }
 
 
  |