You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aquaculture/app/Http/Controllers/User/UserController.php

276 lines
7.9 KiB

<?php
namespace App\Http\Controllers\User;
use App\Enums\ScoreRuleIndexEnum;
use App\Exceptions\UploadException;
use App\Http\Controllers\Controller;
use App\Models\Level;
use App\Models\Product;
use App\Models\ScoreRule;
use App\Models\Subscribe;
use App\Models\User;
use App\Services\ScoreLogServe;
use App\Services\UploadServe;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function index()
{
/**
* @var $user User
*/
$user = $this->user();
// 获取优惠券数量
$today = Carbon::today()->toDateString();
$user->coupons_count = $user->coupons()->where('end_date', '>=', $today)->whereNull('used_at')->count();
$user->cars_count = $user->cars()->sum('number');
$user->orders_count = $user->orders()->count();
$user->likeProducts = $user->products()->latest()->take(9)->get();
$user->notifications_count = $user->unreadNotifications()->count();
$user->addresses_count = $user->addresses()->count();
$user->like_products_count = $user->products()->count();
// 查出用户的等级
$level = Level::query()
->where('min_score', '<=', $user->score_all)
->orderBy('min_score', 'desc')
->first();
// 获取所有积分记录
$scoreLogs = $user->scoreLogs()->latest()->limit(5)->get();
return view('user.homes.index', compact('user', 'level', 'scoreLogs'));
}
public function indexScores()
{
/**
* @var $user User
*/
$user = $this->user();
/**
* 显示所有可能的任务
*
* @var $rules Collection
*/
$rules = Cache::rememberForever(ScoreRule::CACHE_KEY, function () {
return ScoreRule::query()
->whereIn('index_code', ScoreRule::OPEN_RULES)
->orderBy('index_code')
->orderBy('score')
->get();
});
// 连续登录, 浏览商品特殊处理
$loginDays = $user->login_days;
// 浏览的数量
$visitedNumber = (new ScoreLogServe)->getUserVisitedNumber(Carbon::today()->toDateString(), $user->id);
// 如果 completed_times === times 那么代表这个任务完成了
$rules->transform(function (ScoreRule $rule) use ($loginDays, $visitedNumber) {
if ($rule->index_code == ScoreRuleIndexEnum::CONTINUE_LOGIN) {
$rule->completed_times = $loginDays > $rule->times ? $rule->times : $loginDays;
} elseif ($rule->index_code == ScoreRuleIndexEnum::VISITED_PRODUCT) {
$rule->completed_times = $visitedNumber > $rule->times ? $rule->times : $visitedNumber;
}
$rule->plan = ($rule->completed_times / $rule->times) * 100;
return $rule;
});
$logs = $user->scoreLogs()->latest()->paginate(10);
return view('user.scores.index', compact('user', 'logs', 'rules'));
}
public function setting()
{
$user = $this->user();
return view('user.users.setting', compact('user'));
}
public function update(Request $request)
{
$user = $this->user();
$this->validate(
$request, [
'avatar' => 'required',
'sex' => 'in:0,1',
], [
'avatar.required' => '头像不能为空',
'sex.in' => '性别格式不对',
]
);
// 除了第三方授权登录的用户导致没有名字之外
// 其他用户是不允许修改用户名和邮箱
$user->sex = $request->input('sex');
$user->avatar = $request->input('avatar');
// 如果当前用户第一次修改用户名
if ($user->is_init_name && $request->filled('name')) {
$name = $request->input('name');
if (User::query()->where('name', $name)->exists()) {
return back()->withErrors('用户名已经存在');
}
$user->name = $name;
$user->is_init_name = false;
}
// 如果当前用户第一次修改邮箱
if ($user->is_init_email && $request->filled('email')) {
$email = $request->input('email');
if (User::query()->where('email', $email)->exists()) {
return back()->withErrors('邮箱已经存在');
}
$user->email = $email;
$user->is_init_email = false;
}
// 初始用户可以修改邮箱
$user->save();
return back()->with('status', '修改成功');
}
public function subscribe(Request $request)
{
$subscribeModel = $this->user()->subscribe()->firstOr(function () {
return new Subscribe();
});
$subscribeModel->email = $request->input('email');
// 如果已经存在了记录
if ($subscribeModel->exists) {
// 如果是已经有数据的, 代表已经订阅过了
$subscribeModel->is_subscribe = ! $subscribeModel->is_subscribe;
} else {
$subscribeModel->is_subscribe = 1;
$subscribeModel->user_id = $this->user()->id;
}
$subscribeModel->save();
if ($subscribeModel->is_subscribe) {
return responseJson(201, '订阅成功');
}
return responseJson(200, '欢迎下次再订阅');
}
/**
* 用户上传头像
*
* @param UploadServe $uploadServe
* @return array
*/
public function uploadAvatar(UploadServe $uploadServe)
{
$disk = 'public';
try {
$link = $uploadServe->setFileInput('file')
->setMaxSize('5M')
->setExtensions(['jpg', 'jpeg', 'png', 'bmp', 'gif'])
->validate()
->store('avatars', compact('disk'));
} catch (UploadException $e) {
return [
'code' => 302,
'msg' => $e->getMessage(),
'data' => []
];
}
return [
'code' => 0,
'msg' => '图片上传成功',
'data' => ['src' => $link, 'link' => \Storage::url($link)]
];
}
public function showPasswordForm()
{
$user = $this->user();
return view('user.users.password', compact('user'));
}
public function updatePassword(Request $request)
{
$this->validate(
$request, [
'password' => 'required|min:6|confirmed',
], [
'old_password.required' => '旧密码不能为空',
'password.required' => '新密码不能为空',
'password.min' => '新密码必须大于6位',
'password.confirmed' => '两次密码不一致',
]
);
$user = $request->user();
// 如果是从未设置过密码就就不用验证旧密码
if (! $user->is_init_password && ! $this->validatePassword($request->input('old_password'))) {
return back()->withErrors(['old_password' => '旧密码不正确']);
}
// 设置过密码之后,再也不是初始密码
$user->is_init_password = false;
$user->password = Hash::make($request->input('password'));
$user->save();
return back()->with('status', '密码修改成功');
}
private function validatePassword($oldPassword)
{
return Hash::check($oldPassword, $this->user()->password);
}
/**
* @return User|null
*/
protected function user()
{
return auth()->user();
}
}