'普通用户', self::LEVEL_ZS=>'钻石', self::LEVEL_BJ=>'白金', self::LEVEL_JK=>'金卡', ]; const SCORE_EDITINFO=1; const SCORE_VIEWVIDEO=2; const SCORE_WENDA=3; const SCORE_COMMENTVIDEO=4; const SCORE_SIGN=5; const SCORE_GOODS=6; public static $scoreTypes=[ self::SCORE_EDITINFO=>'完善资料', self::SCORE_VIEWVIDEO=>'看视频', self::SCORE_WENDA=>'答题', self::SCORE_COMMENTVIDEO=>'评论', self::SCORE_SIGN=>'签到', self::SCORE_GOODS=>'兑换商品', ]; /** * 获取个人URL * @param string $value * @param array $data * @return string */ public function getUrlAttr($value, $data) { return fullUrl("/u/" . $data['id']); } public function getLevelTextAttr($value, $data) { return self::$levels[$data['level']]??'-'; } /** * @return string[] */ public static function getLevels(): array { return self::$levels; } /** * 获取会员的组别 */ public function getGroupAttr($value, $data) { return UserGroup::get($data['group_id']); } /** * 变更会员余额 * @param float $money 余额 * @param int $user_id 会员ID * @param string $memo 备注 */ public static function money($money, $user_id, $type,$memo='',$extra=[],$changeMoney=true) { $user = self::lock(true)->find($user_id); if($changeMoney && !$user){ throw_user('用户不存在:'.$user_id); } if ($money != 0) { if($changeMoney){ $before = $user->money; //$after = $user->money + $money; $after = function_exists('bcadd') ? bcadd($user->money, $money, 2) : $user->money + $money; if($after<0){ throw_user("余额不足"); } //更新会员信息 $user->save(['money' => $after]); } } //写入日志 MoneyLog::create(array_merge([ 'user_id' => $user_id, 'type'=>$type, 'money' => $money, 'before' => $before??$user->money??0, 'after' => $after??$user->money??0, 'memo' => $memo, ],$extra)); } /** * 变更会员积分 * @param int $score 积分 * @param int $user_id 会员ID * @param string $memo 备注 */ public static function score($score, $user_id, $memo,$field,$type,$extra=[]) { $user = self::lock(true)->find($user_id); if ($user && $score != 0) { $before = $user->$field; $after = $user->$field + $score; if($after<0){ throw_user('积分不足'); } //更新会员信息 $user->save([$field => $after]); //写入日志 ScoreLog::create(array_merge([ 'field' =>$field, 'user_id' => $user_id, 'type'=>$type, 'score' => $score, 'before' => $before, 'after' => $after, 'memo' => $memo, ],$extra)); } } /** *@return HasMany|UserAddress */ public function address(){ return $this->hasMany(UserAddress::class); } public function userinfo(){ return $this->hasOne(UserInfo::class); } public function payment(){ return $this->hasMany(Payment::class); } public function comments(){ return $this->hasMany(Comment::class); } /** *@return HasMany|Favourite */ public function favourite(){ return $this->hasMany(Favourite::class)->where('fav_type','goods'); } public function feedback(){ return $this->hasMany(Feedback::class); } public function moneylog(){ return $this->hasMany(MoneyLog::class); } public function tax(){ return $this->hasMany(UserTax::class); } /** * @return Orders|HasMany */ public function orders(){ return $this->hasMany(Orders::class); } public function programmes(){ return $this->hasMany(Programme::class); } /** * @return OrderInfo|HasMany */ public function orderInfo(){ return $this->hasMany(OrderInfo::class); } /** *@return ScoreLog|HasMany */ public function scorelog(){ return $this->hasMany(ScoreLog::class); } public function cart(){ return $this->hasMany(GoodsCart::class); } public function coupon(){ return $this->hasMany(UserCoupon::class); } public static function recharge($params,Payment $payment){ self::money($payment['amount'],$payment['uer_id'],MoneyLog::TYPE_CHARGE,'充值'); } public function verification(){ return $this->hasOne(UserVerification::class); } /** 模糊搜索 */ public function scopeDim(Query $query,$keyword){ $keyword="%{$keyword}%"; $query ->whereLike('nickname',$keyword) ->whereOr('mobile','like',$keyword) ->whereOr('username','like',$keyword); } /** scope and expired */ protected static function init() { self::beforeWrite(function (self $user){ $data=$user->getChangedData(); }); self::afterDelete(function (self $user){ }); self::afterInsert(function (self $user){ $user->userinfo()->save([]); }); } public function scopeExpired(Query $query){ $query ->whereBetween('level_close_at',[0,time()]) ->where('level','>',0); } public function scopeType(Query $query,$type){ $query->where('type',$type); } public function scopeUser(Query $query,$level){ $query->where($this->getTable().'.level',$level); } /** attr */ #获取地区 public function appendArea(){ $this->city_name=Area::where('id',$this->county_id?:0)->cache(true)->value('mergename',''); } public function province(){ return $this->belongsTo(Area::class,'province_id')->cache(true); } public function city(){ return $this->belongsTo(Area::class,'city_id')->cache(true); } public function county(){ return $this->belongsTo(Area::class,'county_id')->cache(true); } protected function getAvatarAttr($a){ if(!$a){ return request()->domain().'/assets/img/avatar.png'; } return $a; } }