first commit
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Illuminate\Auth\AuthenticationException;
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Laravel\Sanctum\Exceptions\MissingAbilityException;
|
||||
use Modules\Common\Enum\ShowType;
|
||||
use Modules\Common\Trait\RequestJson;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Throwable;
|
||||
|
||||
class ExceptionsHandler extends ExceptionHandler
|
||||
{
|
||||
use RequestJson;
|
||||
|
||||
/**
|
||||
* A list of the exception types that are not reported.
|
||||
* 未报告的异常类型列表
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $dontReport = [];
|
||||
|
||||
/**
|
||||
* Register the exception handling callbacks for the application.
|
||||
*/
|
||||
public function render($request, Throwable $e): JsonResponse|Response
|
||||
{
|
||||
$exceptionHandlers = [
|
||||
HttpResponseException::class => function (HttpResponseException $e) {
|
||||
return response()->json($e->toArray(), $e->getCode());
|
||||
},
|
||||
MissingAbilityException::class => function ($e) {
|
||||
return $this->notification(
|
||||
'No Permission',
|
||||
__('system.error.no_permission'),
|
||||
ShowType::WARN_NOTIFICATION
|
||||
);
|
||||
},
|
||||
AuthenticationException::class => function ($e) {
|
||||
return response()->json([
|
||||
'msg' => __('user.not_login'),
|
||||
'success' => false
|
||||
], 401);
|
||||
},
|
||||
NotFoundHttpException::class => function ($e) {
|
||||
return $this->notification(
|
||||
'Route Not Exist',
|
||||
__('system.error.route_not_exist'),
|
||||
ShowType::WARN_NOTIFICATION
|
||||
);
|
||||
},
|
||||
ValidationException::class => function (ValidationException $e) {
|
||||
return response()->json([
|
||||
'msg' => $e->validator->errors()->first(),
|
||||
'showType' => ShowType::WARN_MESSAGE->value,
|
||||
'success' => false,
|
||||
]);
|
||||
},
|
||||
];
|
||||
|
||||
foreach ($exceptionHandlers as $exceptionType => $handler) {
|
||||
if ($e instanceof $exceptionType) {
|
||||
$response = $handler($e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($response)) {
|
||||
$debug = config('app.debug');
|
||||
$data = [
|
||||
'msg' => $e->getMessage(),
|
||||
'showType' => ShowType::ERROR_MESSAGE->value,
|
||||
'success' => false,
|
||||
];
|
||||
|
||||
if ($debug) {
|
||||
$data += [
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'trace' => $e->getTrace(),
|
||||
'code' => $e->getCode(),
|
||||
];
|
||||
}
|
||||
|
||||
$response = response()->json($data);
|
||||
}
|
||||
|
||||
$response->headers->set('Access-Control-Allow-Origin', '*');
|
||||
$response->headers->set('Access-Control-Allow-Credentials', 'true');
|
||||
$response->headers->set('Access-Control-Max-Age', 1800);
|
||||
$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
||||
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, User-Language');
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Modules\Common\Enum\ShowType;
|
||||
use RuntimeException;
|
||||
|
||||
class HttpResponseException extends RuntimeException
|
||||
{
|
||||
/**
|
||||
* 响应消息
|
||||
*/
|
||||
private string $msg;
|
||||
|
||||
/**
|
||||
* 响应类型
|
||||
*/
|
||||
private ShowType $showType;
|
||||
|
||||
/**
|
||||
* 响应数据
|
||||
*/
|
||||
private array $data;
|
||||
|
||||
/**
|
||||
* 响应状态
|
||||
*/
|
||||
private bool $success;
|
||||
|
||||
public function __construct(array $data, int $code = 200)
|
||||
{
|
||||
$this->msg = $data['msg'] ?? '';
|
||||
$this->success = $data['success'] ?? true;
|
||||
if (empty($data['showType']) && $this->success) {
|
||||
$this->showType = ShowType::SUCCESS_MESSAGE;
|
||||
} elseif (empty($data['showType']) && ! $this->success) {
|
||||
$this->showType = ShowType::ERROR_MESSAGE;
|
||||
} else {
|
||||
$this->showType = ShowType::from($data['showType']);
|
||||
}
|
||||
$this->data = $data['data'] ?? [];
|
||||
parent::__construct($data['msg'] ?? '', $code);
|
||||
}
|
||||
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'data' => $this->data,
|
||||
'success' => $this->success,
|
||||
'msg' => $this->msg,
|
||||
'showType' => $this->showType->value,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class RepositoryException extends RuntimeException
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\UserRegisterRequest;
|
||||
use App\Models\UserModel;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Trait\RequestJson;
|
||||
use Modules\SystemTool\Models\SysCarouselModel;
|
||||
use Modules\SystemTool\Models\SysGridNavModel;
|
||||
|
||||
#[RequestAttribute('/api', authGuard: 'users')]
|
||||
class IndexController
|
||||
{
|
||||
use RequestJson;
|
||||
// 权限验证白名单
|
||||
protected array $noPermission = ['index', 'login', 'register', 'mail'];
|
||||
|
||||
/** 获取首页信息 */
|
||||
#[GetRoute('/index')]
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$web_setting = site_config('web');
|
||||
|
||||
return $this->success(compact('web_setting'));
|
||||
}
|
||||
|
||||
/** 用户登录 */
|
||||
#[PostRoute('/login')]
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'username' => 'required|min:4|alphaDash',
|
||||
'password' => 'required|min:4|alphaDash',
|
||||
]);
|
||||
if (Auth::guard('users')->attempt($credentials, true)) {
|
||||
$data = $request->user('users')
|
||||
->createToken($credentials['username'])
|
||||
->toArray();
|
||||
return $this->success($data, __('user.login_success'));
|
||||
}
|
||||
return $this->error(__('user.login_error'));
|
||||
}
|
||||
|
||||
/** 用户注册 */
|
||||
#[PostRoute('/register')]
|
||||
public function register(UserRegisterRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->validated();
|
||||
$model = new UserModel;
|
||||
$model->username = $data['username'];
|
||||
$model->password = password_hash($data['password'], PASSWORD_DEFAULT);
|
||||
$model->email = $data['email'];
|
||||
if ($model->save()) {
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
return $this->error('创建用户失败');
|
||||
}
|
||||
|
||||
/** 获取首页数据(公开接口):轮播图 + 宫格导航 */
|
||||
#[GetRoute('/home', false)]
|
||||
public function home(): JsonResponse
|
||||
{
|
||||
$site_title = site_config('web.subtitle');
|
||||
$carousel = SysCarouselModel::query()
|
||||
->where('status', 0)
|
||||
->orderBy('sort', 'desc')
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
$gridNav = SysGridNavModel::query()
|
||||
->where('status', 0)
|
||||
->orderBy('sort', 'desc')
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
|
||||
return $this->success(compact('carousel', 'gridNav', 'site_title'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\UserUpdateInfoRequest;
|
||||
use App\Models\UserModel;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Common\Trait\RequestJson;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
|
||||
#[RequestAttribute('/api/user', authGuard: 'users')]
|
||||
class UserController
|
||||
{
|
||||
use RequestJson;
|
||||
protected array $noPermission = ['refreshToken'];
|
||||
|
||||
#[GetRoute]
|
||||
public function getUserInfo(): JsonResponse
|
||||
{
|
||||
$info = auth()->user();
|
||||
return $this->success(compact('info'));
|
||||
}
|
||||
|
||||
#[PostRoute('/logout')]
|
||||
public function logout(): JsonResponse
|
||||
{
|
||||
$user_id = auth('users')->id();
|
||||
$model = new UserModel;
|
||||
if ($model->logout($user_id)) {
|
||||
return $this->success('退出登录成功');
|
||||
} else {
|
||||
return $this->error($model->getErrorMsg());
|
||||
}
|
||||
}
|
||||
|
||||
#[PutRoute]
|
||||
public function setUserInfo(UserUpdateInfoRequest $request): JsonResponse
|
||||
{
|
||||
UserModel::where('user_id', auth('user')->id())->update($request->validated());
|
||||
|
||||
return $this->error('更新成功');
|
||||
}
|
||||
|
||||
#[PostRoute('/setPwd')]
|
||||
public function setPassword(Request $request): JsonResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'oldPassword' => 'required|string|max:20',
|
||||
'newPassword' => 'required|string|min:6|max:20',
|
||||
'rePassword' => 'required|same:newPassword',
|
||||
]);
|
||||
$user_id = auth('user')->id();
|
||||
$user = UserModel::query()->find($user_id);
|
||||
if (! password_verify($data['oldPassword'], $user['password'])) {
|
||||
return $this->error('旧密码不正确!');
|
||||
}
|
||||
$user->password = password_hash($data['newPassword'], PASSWORD_DEFAULT);
|
||||
if ($user->save()) {
|
||||
return $this->success('更新成功');
|
||||
}
|
||||
|
||||
return $this->error('更新失败');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UserRegisterRequest extends FormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'username' => 'required|min:4|alphaDash',
|
||||
'password' => 'required|min:4|alphaDash',
|
||||
'rePassword' => 'required|min:4|same:password',
|
||||
'email' => 'required|email',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UserUpdateInfoRequest extends FormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'username' => 'required|min:4|max:20',
|
||||
'nickname' => 'required|min:4|max:20',
|
||||
'gender' => 'required',
|
||||
'email' => 'required|email',
|
||||
'avatar_id' => 'required|integer',
|
||||
'mobile' => 'required|regex:/^1[34578]\d{9}$/',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
|
||||
/**
|
||||
* APP 用户模型
|
||||
*/
|
||||
class UserModel extends Authenticatable
|
||||
{
|
||||
use HasApiTokens, HasFactory, Notifiable;
|
||||
|
||||
protected $table = 'user';
|
||||
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
protected $hidden = [
|
||||
'password',
|
||||
'remember_token',
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'mobile',
|
||||
'username',
|
||||
'email',
|
||||
'password',
|
||||
'nickname',
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionsHandler;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Modules\AnnoRoute\AnnoRoute;
|
||||
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
|
||||
$this->app->bind(ExceptionsHandler::class, \App\Exceptions\ExceptionsHandler::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*/
|
||||
public function boot(AnnoRoute $annoRoute): void
|
||||
{
|
||||
// 注册路由
|
||||
$annoRoute->register(app_path('Http/Controllers'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user