项目初始化

This commit is contained in:
2026-03-18 15:54:43 +08:00
commit dfcd762e23
601 changed files with 57883 additions and 0 deletions

View File

@@ -0,0 +1,269 @@
<?php
namespace app\api\controller;
use ba\Date;
use ba\Captcha;
use ba\Random;
use app\common\model\User;
use app\common\facade\Token;
use app\common\model\UserScoreLog;
use app\common\model\UserMoneyLog;
use app\common\controller\Frontend;
use support\validation\Validator;
use support\validation\ValidationException;
use Webman\Http\Request;
use support\Response;
class Account extends Frontend
{
protected array $noNeedLogin = ['retrievePassword'];
protected array $noNeedPermission = ['verification', 'changeBind'];
public function overview(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$sevenDays = Date::unixTime('day', -6);
$score = $money = $days = [];
for ($i = 0; $i < 7; $i++) {
$days[$i] = date("Y-m-d", $sevenDays + ($i * 86400));
$tempToday0 = strtotime($days[$i]);
$tempToday24 = strtotime('+1 day', $tempToday0) - 1;
$score[$i] = UserScoreLog::where('user_id', $this->auth->id)
->where('create_time', 'BETWEEN', $tempToday0 . ',' . $tempToday24)
->sum('score');
$userMoneyTemp = UserMoneyLog::where('user_id', $this->auth->id)
->where('create_time', 'BETWEEN', $tempToday0 . ',' . $tempToday24)
->sum('money');
$money[$i] = bcdiv((string) $userMoneyTemp, '100', 2);
}
return $this->success('', [
'days' => $days,
'score' => $score,
'money' => $money,
]);
}
public function profile(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
if ($request->method() === 'POST') {
$model = $this->auth->getUser();
$data = $request->only(['avatar', 'username', 'nickname', 'gender', 'birthday', 'motto']);
$data['id'] = $this->auth->id;
if (!isset($data['birthday'])) {
$data['birthday'] = null;
}
try {
Validator::make($data, [
'username' => 'required|string|regex:/^[a-zA-Z][a-zA-Z0-9_]{2,15}$/',
'nickname' => 'required|string|regex:/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_-]+$/u',
'birthday' => 'nullable|date',
], [
'nickname.regex' => __('nicknameChsDash'),
])->validate();
} catch (ValidationException $e) {
return $this->error($e->getMessage());
}
$existUser = User::where('username', $data['username'])->where('id', '<>', $this->auth->id)->find();
if ($existUser) {
return $this->error(__('Username') . ' ' . __('already exists'));
}
$model->startTrans();
try {
$model->save($data);
$model->commit();
} catch (\Throwable $e) {
$model->rollback();
return $this->error($e->getMessage());
}
return $this->success(__('Data updated successfully~'));
}
return $this->success('', [
'accountVerificationType' => get_account_verification_type()
]);
}
public function verification(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$captcha = new Captcha();
$params = $request->only(['type', 'captcha']);
$key = ($params['type'] == 'email' ? $this->auth->email : $this->auth->mobile) . "user_{$params['type']}_verify";
if ($captcha->check($params['captcha'], $key)) {
$uuid = Random::uuid();
Token::set($uuid, $params['type'] . '-pass', $this->auth->id, 600);
return $this->success('', [
'type' => $params['type'],
'accountVerificationToken' => $uuid,
]);
}
return $this->error(__('Please enter the correct verification code'));
}
public function changeBind(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$captcha = new Captcha();
$params = $request->only(['type', 'captcha', 'email', 'mobile', 'accountVerificationToken', 'password']);
$user = $this->auth->getUser();
if ($user[$params['type']]) {
if (!Token::check($params['accountVerificationToken'], $params['type'] . '-pass', $user->id)) {
return $this->error(__('You need to verify your account before modifying the binding information'));
}
} elseif (!isset($params['password']) || !verify_password($params['password'], $user->password, ['salt' => $user->salt])) {
return $this->error(__('Password error'));
}
if ($captcha->check($params['captcha'], $params[$params['type']] . "user_change_{$params['type']}")) {
try {
if ($params['type'] == 'email') {
Validator::make($params, ['email' => 'required|email'])->validate();
if (User::where('email', $params['email'])->find()) {
return $this->error(__('Email') . ' ' . __('already exists'));
}
} else {
Validator::make($params, ['mobile' => 'required|regex:/^1[3-9]\d{9}$/'])->validate();
if (User::where('mobile', $params['mobile'])->find()) {
return $this->error(__('Mobile') . ' ' . __('already exists'));
}
}
} catch (ValidationException $e) {
return $this->error(__($e->getMessage()));
}
if ($params['type'] == 'email') {
$user->email = $params['email'];
} else {
$user->mobile = $params['mobile'];
}
Token::delete($params['accountVerificationToken']);
$user->save();
return $this->success();
}
return $this->error(__('Please enter the correct verification code'));
}
public function changePassword(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
if ($request->method() === 'POST') {
$model = $this->auth->getUser();
$params = $request->only(['oldPassword', 'newPassword']);
if (!verify_password($params['oldPassword'], $model->password, ['salt' => $model->salt])) {
return $this->error(__('Old password error'));
}
try {
Validator::make(
['password' => $params['newPassword']],
['password' => 'required|string|regex:/^(?!.*[&<>"\'\n\r]).{6,32}$/'],
['password.regex' => __('Please input correct password')]
)->validate();
} catch (ValidationException $e) {
return $this->error($e->getMessage());
}
$model->startTrans();
try {
$model->resetPassword($this->auth->id, $params['newPassword']);
$model->commit();
} catch (\Throwable $e) {
$model->rollback();
return $this->error($e->getMessage());
}
$this->auth->logout();
return $this->success(__('Password has been changed, please login again~'));
}
return $this->error(__('Method not allowed'), [], 0, ['statusCode' => 405]);
}
public function integral(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$limit = $request->get('limit', $request->post('limit', 15));
$res = UserScoreLog::where('user_id', $this->auth->id)
->order('create_time', 'desc')
->paginate($limit);
return $this->success('', [
'list' => $res->items(),
'total' => $res->total(),
]);
}
public function balance(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$limit = $request->get('limit', $request->post('limit', 15));
$res = UserMoneyLog::where('user_id', $this->auth->id)
->order('create_time', 'desc')
->paginate($limit);
return $this->success('', [
'list' => $res->items(),
'total' => $res->total(),
]);
}
public function retrievePassword(Request $request): Response
{
$response = $this->initializeFrontend($request);
if ($response !== null) return $response;
$params = $request->only(['type', 'account', 'captcha', 'password']);
try {
Validator::make($params, [
'type' => 'required|in:email,mobile',
'account' => 'required|string',
'captcha' => 'required|string',
'password' => 'required|string|regex:/^(?!.*[&<>"\'\n\r]).{6,32}$/',
], [
'password.regex' => __('Please input correct password'),
])->validate();
} catch (ValidationException $e) {
return $this->error($e->getMessage());
}
if ($params['type'] == 'email') {
$user = User::where('email', $params['account'])->find();
} else {
$user = User::where('mobile', $params['account'])->find();
}
if (!$user) {
return $this->error(__('Account does not exist~'));
}
$captchaObj = new Captcha();
if (!$captchaObj->check($params['captcha'], $params['account'] . 'user_retrieve_pwd')) {
return $this->error(__('Please enter the correct verification code'));
}
if ($user->resetPassword($user->id, $params['password'])) {
return $this->success(__('Password has been changed~'));
}
return $this->error(__('Failed to modify password, please try again later~'));
}
}