| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?php
- /**
- * Author: lf
- * Blog: https://blog.feehi.com
- * Email: job@feehi.com
- * Created at: 2016-04-02 10:30
- */
- namespace common\models;
- use Yii;
- use Exception;
- use common\helpers\Util;
- use yii\base\NotSupportedException;
- use yii\behaviors\TimestampBehavior;
- use yii\web\IdentityInterface;
- use yii\web\UploadedFile;
- /**
- * User model
- *
- * @property integer $id
- * @property string $username
- * @property string $password_hash
- * @property string $password_reset_token
- * @property string $email
- * @property string $auth_key
- * @property string $avatar
- * @property integer $status
- * @property integer $created_at
- * @property integer $updated_at
- * @property string $password write-only password
- */
- class User extends \yii\db\ActiveRecord implements IdentityInterface
- {
- const STATUS_DELETED = 0;
- const STATUS_ACTIVE = 10;
- public $password;
- public $repassword;
- public function behaviors()
- {
- return [
- TimestampBehavior::className()
- ];
- }
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return '{{%user}}';
- }
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['username', 'password', 'repassword'], 'string'],
- [['avatar'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg, jpeg, gif, webp'],
- [['username', 'email'], 'unique'],
- ['email', 'email'],
- [['repassword'], 'compare', 'compareAttribute' => 'password'],
- [['status'], 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
- [['username', 'email', 'password', 'repassword'], 'required', 'on' => ['create']],
- [['username', 'email'], 'required', 'on' => ['update']],
- ];
- }
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'username' => Yii::t('app', 'Username'),
- 'email' => Yii::t('app', 'Email'),
- 'old_password' => Yii::t('app', 'Old Password'),
- 'password' => Yii::t('app', 'Password'),
- 'repassword' => Yii::t('app', 'Repeat Password'),
- 'avatar' => Yii::t('app', 'Avatar'),
- 'status' => Yii::t('app', 'Status'),
- 'created_at' => Yii::t('app', 'Created At'),
- 'updated_at' => Yii::t('app', 'Updated At'),
- ];
- }
- public function beforeValidate()
- {
- if($this->avatar !== "0") {//为0表示需要删除图片,Util::handleModelSingleFileUpload()会有判断删除图片
- $this->avatar = UploadedFile::getInstance($this, "avatar");
- }
- return parent::beforeValidate();
- }
- /**
- * @inheritdoc
- */
- public function beforeSave($insert)
- {
- if (!$insert) {
- if( !empty($this->password) && empty($this->repassword) ){
- $this->addError("repassword", Yii::t('yii', '{attribute} must be equal to "{compareValueOrAttribute}".', [
- 'attribute' => yii::t('app', 'Repeat Password'),
- 'compareValueOrAttribute' => yii::t('app', 'Password')
- ])
- );
- return false;
- }
- $this->setPassword( $this->password );
- }
- Util::handleModelSingleFileUpload($this, 'avatar', $insert, '@frontend/web/uploads/avatar/');
- return parent::beforeSave($insert);
- }
- /**
- * @inheritdoc
- */
- public function beforeDelete()
- {
- if( empty($this->avatar) ) return true;
- try {
- Util::deleteThumbnails(Yii::getAlias('@frontend/web') . $this->avatar, [], true);
- }catch (Exception $exception){
- $this->addError("avatar", $exception->getMessage());
- return false;
- }
- return true;
- }
- public static function getStatuses()
- {
- return [
- self::STATUS_ACTIVE => Yii::t('app', 'Normal'),
- self::STATUS_DELETED => Yii::t('app', 'Disabled'),
- ];
- }
- /**
- * @inheritdoc
- */
- public static function findIdentity($id)
- {
- return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
- }
- /**
- * @inheritdoc
- */
- public static function findIdentityByAccessToken($token, $type = null)
- {
- throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
- }
- /**
- * Finds user by username
- *
- * @param string $username
- * @return static|null
- */
- public static function findByUsername($username)
- {
- return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
- }
- /**
- * 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 null;
- }
- return static::findOne([
- 'password_reset_token' => $token,
- 'status' => self::STATUS_ACTIVE,
- ]);
- }
- /**
- * Finds out if password reset token is valid
- *
- * @param string $token password reset token
- * @return boolean
- */
- 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();
- }
- /**
- * Returns an ID that can uniquely identify a user identity.
- * @return string|int an ID that uniquely identifies a user identity.
- */
- public function getId()
- {
- return $this->id;
- }
- /**
- * Returns a key that can be used to check the validity of a given identity ID.
- *
- * The key should be unique for each individual user, and should be persistent
- * so that it can be used to check the validity of the user identity.
- *
- * The space of such keys should be big enough to defeat potential identity attacks.
- *
- * This is required if [[User::enableAutoLogin]] is enabled. The returned key will be stored on the
- * client side as a cookie and will be used to authenticate user even if PHP session has been expired.
- *
- * Make sure to invalidate earlier issued authKeys when you implement force user logout, password change and
- * other scenarios, that require forceful access revocation for old sessions.
- *
- * @return string a key that is used to check the validity of a given identity ID.
- * @see validateAuthKey()
- */
- public function getAuthKey()
- {
- return $this->auth_key;
- }
- /**
- * Validates the given auth key.
- *
- * This is required if [[User::enableAutoLogin]] is enabled.
- * @param string $authKey the given auth key
- * @return bool whether the given auth key is valid.
- * @see getAuthKey()
- */
- public function validateAuthKey($authKey)
- {
- return $this->getAuthKey() === $authKey;
- }
- /**
- * Validates password
- *
- * @param string $password password to validate
- * @return boolean if password provided is valid for current user
- */
- public function validatePassword($password)
- {
- return Yii::$app->security->validatePassword($password, $this->password_hash);
- }
- /**
- * Generates password hash from password and sets it to the model
- *
- * @param string $password
- * @throws \yii\base\Exception
- */
- public function setPassword($password)
- {
- $this->password_hash = Yii::$app->security->generatePasswordHash($password);
- }
- /**
- * Generates "remember me" authentication key
- */
- public function generateAuthKey()
- {
- $this->auth_key = Yii::$app->security->generateRandomString();
- }
- /**
- * Generates new password reset token
- */
- public function generatePasswordResetToken()
- {
- $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
- }
- /**
- * Removes password reset token
- */
- public function removePasswordResetToken()
- {
- $this->password_reset_token = null;
- }
- }
|