'datetime', 'login_time' => 'datetime', 'status' => 'integer', 'sex' => 'integer', 'avatar_id' => 'integer', 'dept_id' => 'integer' ]; protected $appends = ['role_id', 'dept_name', 'avatar_url']; protected $with = ['dept', 'avatar']; protected $hidden = [ 'dept', 'avatar', 'password', 'remember_token', 'deleted_at', ]; /** * 定义与部门的归属关系 */ public function dept(): BelongsTo { return $this->belongsTo(SysDeptModel::class, 'dept_id', 'id'); } /** 部门名称 */ public function getDeptNameAttribute(): string { return $this->dept->name ?? ''; } /** * 定义与角色的关联 */ public function roles(): BelongsToMany { return $this->belongsToMany(SysRoleModel::class, 'sys_user_role', 'user_id', 'role_id'); } /** * 获取用户角色列表 */ public function getRoleIdAttribute() { return $this->roles() ->pluck('id')->toArray(); } /** * 定义与登录日志的关联 */ public function loginRecords(): HasMany { return $this->hasMany(SysLoginRecordModel::class, 'user_id', 'id'); } /** * 关联用户头像 * @return HasOne */ public function avatar(): HasOne { return $this->hasOne(SysFileModel::class, 'id', 'avatar_id'); } /** * 获取用户角色列表 */ public function getAvatarUrlAttribute() { if($this->avatar) { return $this->avatar->preview_url; } return null; } /** * 获取用户所有权限 * @return array */ public function access(): array { if($this->id == 1) { return SysRuleModel::query() ->where('status', 1) ->pluck('key') ->toArray(); } $roles = SysUserModel::with(['roles.rules' => function ($query) { $query->where('status', 1); }])->find($this->id)->roles->toArray(); return collect($roles) ->map(fn ($item) => $item['rules'] ) ->collapse() ->map(fn ($item) => $item['key'] ) ->unique() ->toArray(); } }