| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | <?phpnamespace Modules\User\Models;use Catch\Base\CatchModel as Model;use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;use Illuminate\Database\Eloquent\Casts\Attribute;use Laravel\Sanctum\HasApiTokens;use Modules\Channel\Exceptions\ChannelBusinessException;use Modules\Common\Errors\Errors;use Modules\Common\Repository\Options\Modules;use Modules\User\Models\Traits\UserRelations;use Illuminate\Auth\Authenticatable;/** * @property int $id * @property string $username * @property string $email * @property string $avatar * @property string $password * @property int $creator_id * @property int $status * @property string $login_ip * @property int $login_at * @property int $created_at * @property int $updated_at * @property string $remember_token */class User extends Model implements AuthenticatableContract{    use Authenticatable, UserRelations, HasApiTokens;    protected $fillable = [        'id', 'username', 'email', 'avatar', 'password', 'remember_token', 'creator_id',        'status', 'department_id', 'login_ip', 'login_at', 'created_at', 'updated_at', 'deleted_at',        'remark'    ];    /**     * @var array|string[]     */    public array $searchable = [        'username' => 'like',        'email' => 'like',        'status' => '='    ];    /**     * @var string     */    protected $table = 'users';    protected array $fields = ['id', 'username', 'email', 'avatar',  'creator_id', 'status', 'department_id', 'created_at'];    /**     * @var array|string[]     */    protected array $form = ['username', 'email', 'password', 'department_id'];    /**     * @var array|string[]     */    protected array $formRelations = ['roles', 'jobs'];    /**     * password     *     * @return Attribute     */    protected function password(): Attribute    {        return new Attribute(            // get: fn($value) => '',            set: fn ($value) => bcrypt($value),        );    }    /**     * is super admin     *     * @return bool     */    public function isSuperAdmin(): bool    {        return $this->{$this->primaryKey} == config('catch.super_admin');    }    /**     * update     * @param $id     * @param array $data     * @return mixed     */    public function updateBy($id, array $data): mixed    {        if (isset($data['password'])) {            if (empty($data['password'])) {                if (isset($data['password'])) {                    unset($data['password']);                }            } else {                $data['password'] = bcrypt($data['password']);            }        } else{            if (isset($data['password'])){                unset($data['password']);            }        }        return parent::updateBy($id, $data);    }    /**     * 如果$showApp为空那么就不展示所有isApp为true的模块     * 否则展示所有isApp为false以及showApp对应的name的模块     * @param string $showApp     */        public function showPermissions($showApp = '') {        $hiddenAppModuleNames = Modules::getAppModules()->reject(function ($module) use ($showApp) {            return $showApp == $module['name'];        })->pluck('name');        $enablePermissions = $this->getAttribute('permissions')->reject(function ($permission) use ($hiddenAppModuleNames){            return $hiddenAppModuleNames->contains($permission['module']);        })->values()->all();        $this->setAttribute('permissions', $enablePermissions);    }    /**     * 保证邮箱没有被使用     * @param $email     */    public function emailUnique($email) {        $user = $this->where([            'email' => $email,            'deleted_at' => 0,        ])->first();        if($user) {            ChannelBusinessException::throwError(Errors::EMAIL_EXISTS);        }    }}
 |