作者 liyuhang

gx

... ... @@ -13,12 +13,12 @@ use Throwable;
*/
class AsideGlobalException extends Exception
{
public function __construct($code = 0, $message = "", Throwable $previous = null)
{
$this->code = $code;
$this->message = $message;
if (empty($this->message)) {
$this->message = Code::fromValue($code)->description;
}
}
// public function __construct($code = 0, $message = "", Throwable $previous = null)
// {
// $this->code = $code;
// $this->message = $message;
// if (empty($this->message)) {
// $this->message = Code::fromValue($code)->description;
// }
// }
}
... ...
... ... @@ -13,12 +13,12 @@ use Throwable;
*/
class BsideGlobalException extends Exception
{
public function __construct($code = 0, $message = "", Throwable $previous = null)
{
$this->code = $code;
$this->message = $message;
if (empty($this->message)) {
$this->message = Code::fromValue($code)->description;
}
}
// public function __construct($code = 0, $message = "", Throwable $previous = null)
// {
// $this->code = $code;
// $this->message = $message;
// if (empty($this->message)) {
// $this->message = Code::fromValue($code)->description;
// }
// }
}
... ...
... ... @@ -2,17 +2,7 @@
namespace App\Exceptions;
use App\Enums\Common\Code;
use App\Enums\Common\Common;
use App\Services\DingService;
use App\Utils\EncryptUtils;
use App\Utils\LogUtils;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Support\Facades\Route;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable;
class Handler extends ExceptionHandler
... ... @@ -20,7 +10,7 @@ class Handler extends ExceptionHandler
/**
* A list of the exception types that are not reported.
*
* @var array<int, class-string<Throwable>>
* @var array
*/
protected $dontReport = [
//
... ... @@ -29,123 +19,37 @@ class Handler extends ExceptionHandler
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array<int, string>
* @var array
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
/**
* Report or log an exception.
*
* @param \Throwable $exception
* @param \Throwable $exception
* @return void
*
* @throws \Throwable
*/
public function report(Throwable $exception)
{
//日志记录
$exceptionMessage = "错误CODE:" . $exception->getCode() .
"-----错误message:" . $exception->getMessage() .
'------错误文件:' . $exception->getFile() .
'-------错误行数:' . $exception->getLine();
//A端错误
if ($exception instanceof AsideGlobalException) {
LogUtils::error("AsideGlobalException", [], $exceptionMessage);
}
//B端错误
elseif($exception instanceof BsideGlobalException) {
LogUtils::error("BsideGlobalException", [], $exceptionMessage);
}
//验证错误(非手动抛出)
elseif ($exception instanceof ValidationException) {
LogUtils::error("参数验证失败", [], $exceptionMessage);
}
//Redis错误(非手动抛出)
elseif ($exception instanceof \RedisException) {
LogUtils::error("Redis服务异常", [], $exceptionMessage);
}
//Mysql错误(非手动抛出)
elseif ($exception instanceof \PDOException) {
LogUtils::error("数据库服务异常", [], $exceptionMessage);
}
//模型未找到错误(非手动抛出)
elseif ($exception instanceof ModelNotFoundException) {
LogUtils::error("模型资源未找到", [], $exceptionMessage);
}
//其他
else {
LogUtils::error("全局系统异常", [], $exceptionMessage);
}
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Throwable
*/
public function render($request, Throwable $exception)
{
$message = $exception->getMessage();
if ($exception instanceof AsideGlobalException) {
$code = $exception->getCode();
}elseif ($exception instanceof BsideGlobalException) {
$code = $exception->getCode();
} elseif ($exception instanceof ValidationException) {
$code = Code::USER_PARAMS_ERROE();
} elseif ($exception instanceof \RedisException) {
$code = Code::SERVER_REDIS_ERROR();
} elseif ($exception instanceof \PDOException) {
$code = Code::SERVER_MYSQL_ERROR();
} elseif ($exception instanceof ModelNotFoundException) {
$code = Code::USER_MODEL_NOTFOUND_ERROE();
} elseif ($exception instanceof NotFoundHttpException || $exception instanceof MethodNotAllowedHttpException) {
return response('404 Not Found', 404);
} else {
$code = Code::SYSTEM_ERROR();
}
//钉钉通知错误信息
if (in_array(config('app.env'), ['test', 'production']) && (in_array(substr($code, 0, 1), ['B', 'C']))) {
$exceptionMessage = "路由:" . Route::current()->uri .
"-----错误CODE:" . $exception->getCode() .
"-----错误message:" . $exception->getMessage() .
'------错误文件:' . $exception->getFile() . '-------错误行数:' .
$exception->getLine();
(new DingService())->handle(['keyword' => "ERROR", 'msg' => config('app.env') . '环境报错:' . $exceptionMessage, 'isAtAll' => false]);
}
//开启debug 错误原样输出
$debub = config('app.debug');
$message = $debub ? $message : ($code->description ?? $message);
$response = [
'code' => $code,
'message' => $message
];
//加密返回
if (config('app.params_encrypt')) {
$k = config('app.params_encrypt_key');
$i = config('app.params_encrypt_iv');
$response = [
'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
}
return response($response);
return parent::render($request, $exception);
}
}
... ...
... ... @@ -134,7 +134,7 @@ class BaseController extends Controller
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
$response = Response::create(json_encode($result),$code,$this->header);
$response = response($result,$result_code,$this->header);;
throw new HttpResponseException($response);
}
/**
... ...
... ... @@ -4,13 +4,12 @@ namespace App\Http\Controllers\Bside;
use App\Enums\Common\Code;
use App\Http\Controllers\Controller;
use App\Utils\EncryptUtils;
use \Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Cache;
class BaseController extends Controller
class BaseController extends Controller
{
protected $param = [];//所有请求参数
protected $token = ''; //token
... ... @@ -43,39 +42,8 @@ class BaseController extends Controller
*/
public function auth_token(){
$info = Cache::get($this->token);
if(isset($info) && !empty($info)){
$this->user = $info;
$this->uid = $info['id'];
}
}
/**
* 成功返回
* @param array $data
* @param string $code
* @param bool $objectData
* @return JsonResponse
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
function success(array $data = [], string $code = Code::SUCCESS, bool $objectData = false): JsonResponse
{
if ($objectData) {
$data = (object)$data;
}
$code = Code::fromValue($code);
$response = [
'code' => $code->value,
'data' => $data,
'msg' => $code->description,
];
//加密-返回数据
if (config('app.params_encrypt')) {
$k = config('app.params_encrypt_key');
$i = config('app.params_encrypt_iv');
$response = [
'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
}
return response()->json($response,200,$this->header);
$this->user = $info;
$this->uid = $info['id'];
}
/**
... ... @@ -124,16 +92,16 @@ class BaseController extends Controller
* @author :liyuhang
* @method
*/
public function response($msg,$code = 200,$data = [],$result_code = null,$type = 'application/json'){
$result_code === null && $result_code = $code;
public function response($msg,$code = null,$data = [],$result_code = 200,$type = 'application/json'){
$code === null && $code = $result_code;
$result = [
'msg' =>$msg,
'code'=>$result_code,
'code'=>$code,
'data'=>$data
];
$this->header['Content-Type'] = $type;
$this->header['token'] = $this->token;
$response = Response::create(json_encode($result),$code,$this->header);
$response = response($result,$result_code,$this->header);;
throw new HttpResponseException($response);
}
/**
... ...
... ... @@ -58,7 +58,7 @@ class ComController extends BaseController
$info = $projectRoleModel->read(['id'=>$this->user['role_id']]);
$projectMenuModel = new ProjectMenuModel();
$info['role_menu'] = trim($info['role_menu'],',');
$lists = $this->where(['status'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$lists = $this->where(['status'=>0,'is_role'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$lists = $lists->toArray();
$menu = array();
foreach ($lists as $k => $v){
... ... @@ -103,4 +103,24 @@ class ComController extends BaseController
}
$this->response('success',Code::SUCCESS,[$info]);
}
/**
* @name :登录用户编辑资料/修改密码
* @return void
* @author :liyuhang
* @method
*/
public function edit_info(){
}
/**
* @name :退出登录
* @return void
* @author :liyuhang
* @method :post
*/
public function logout(){
}
}
... ...
<?php
namespace App\Http\Controllers\Bside;
class ProjectMenuController
{
}
... ... @@ -25,7 +25,6 @@ class ProjectRoleController extends BaseController
$this->allCount = $projectRoleModel->allCount;
$this->result($lists);
}
/**
* @name :添加角色
* @return void
... ...
... ... @@ -20,7 +20,8 @@ class UserController extends BaseController
public function lists(){
//TODO::搜索参数处理
$userModel = new UserModel();
$lists = $userModel->lists($this->map,$this->p,$this->row,$this->order,['id','name','mobile']);
$this->map['project_id'] = $this->user['project_id'];
$lists = $userModel->lists($this->map,$this->p,$this->row,$this->order,['id','name','mobile','created_at']);
if(empty($lists)){
$this->response('请求失败',Code::USER_ERROR,[]);
}
... ... @@ -39,6 +40,7 @@ class UserController extends BaseController
'mobile'=>'required|string|max:11',
'password'=>'required|string|min:5',
'name'=>'required|max:20',
'role_id'=>'required'
];
//验证的提示信息
$message = [
... ... @@ -50,13 +52,15 @@ class UserController extends BaseController
'password.min' => '密码不小于5字符.',
'name.required'=>'名称必须填写',
'name.min' => '名称不小于5字符.',
'role_id.required'=>'角色必须填写',
];
$validate = Validator::make($this->param, $rules, $message);
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_LOGIN_ERROE,$this->param);
}
$userLogic = new UserLogic();
$rs = $userLogic->add($this->param);
$userModel = new UserModel();
$this->param['project_id'] = $this->user['project_id'];
$rs = $userModel->adds($this->param);
if($rs === false){
$this->response('当前添加用户已存在或参数错误,添加失败',Code::USER_REGISTER_ERROE,[]);
}
... ... @@ -92,8 +96,14 @@ class UserController extends BaseController
if($validate->fails()){
return $this->response($validate->errors()->first(),Code::USER_PARAMS_ERROE,$this->param);
}
$userLogic = new UserLogic();
$rs = $userLogic->edits($this->param);
$userModel = new UserModel();
//TODO::查询当前手机号码是否重复
$info = $userModel->where('id','<>',$this->param['id'])
->where(['mobile'=>$this->param['mobile']])->first();
if(!empty($info)){
$this->response('当前编辑的手机号码已存在',Code::USER_PARAMS_ERROE);
}
$rs = $userModel->edits($this->param);
if($rs === false){
$this->response('参数错误或其他服务器原因,编辑失败',Code::USER_ERROR,[]);
}
... ...
... ... @@ -2,9 +2,14 @@
namespace App\Http\Middleware\Bside;
use App\Enums\Common\Code;
use App\Models\ProjectMenu;
use App\Models\ProjectRole as ProjectRoleModel;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Exceptions\HttpResponseException;
class LoginAuthMiddleware
{
/**
... ... @@ -16,6 +21,44 @@ class LoginAuthMiddleware
*/
public function handle(Request $request, Closure $next)
{
$token = $request->header('token');
if(!isset($token) || empty($token)){
$this->response('当前用户未登录',Code::USER_ERROR);
}
$info = Cache::get($request->header('token'));
if(empty($info)){
$this->response('当前用户未登录',Code::USER_ERROR);
}
//操作权限设置
$projectRoleModel = new ProjectRoleModel();
$role_info = $projectRoleModel->read(['id'=>$info['role_id']]);
//获取当前操作的控制器与方法
$action = $request->route()->getAction();
//查询当前用户是否拥有权限操作
$projectMenuModel = new ProjectMenu();
$menu_id = $projectMenuModel->read(['action'=>$action['as']],['id']);
if(strpos($role_info['role_menu'], $menu_id['id']) < 0){
$this->response('当前用户没有权限',Code::USER_ERROR);
}
return $next($request);
}
/**
* @name 统一返回参数
* @return void
* @author :liyuhang
* @method
*/
public function response($msg,$code,$data = [],$result_code = 200,$type = 'application/json'){
$code === null && $code = $result_code;
$result = [
'msg' =>$msg,
'code'=>$code,
'data'=>$data
];
$header['token'] = $type;
$response = response($result,$result_code,$header);
throw new HttpResponseException($response);
}
}
... ...
... ... @@ -9,6 +9,8 @@ class Base extends Model
{
protected $table = '';
public $allCount = 0;
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
//统一设置
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
... ... @@ -74,6 +76,8 @@ class Base extends Model
* @method post
*/
public function add($data){
$data['created_at'] = date('Y-m-d H:i:s');
$data['updated_at'] = date('Y-m-d H:i:s');
return $this->insert($data);
}
... ... @@ -84,9 +88,7 @@ class Base extends Model
* @method post
*/
public function edit($data,$condition){
if(isset($data['id']) && !empty($data['id'])){
unset($data['id']);
}
$data['updated_at'] = date('Y-m-d H:i:s');
return $this->where($condition)->update($data);
}
... ...
... ... @@ -4,6 +4,7 @@ namespace App\Models;
//use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Models\ProjectRole as ProjectRoleModel;
use App\Models\User as UserModel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
//use Illuminate\Foundation\Auth\User as Authenticatable;
... ... @@ -16,7 +17,8 @@ class User extends Base
use HasApiTokens, HasFactory, Notifiable;
protected $table = 'gl_project_user';
//自动维护create_at创建时间 updated_at修改时间
public $timestamps = true;
/**
* The attributes that are mass assignable.
*
... ... @@ -34,7 +36,7 @@ class User extends Base
* @var array<int, string>
*/
protected $hidden = [
'password',
// 'password',
'remember_token',
];
... ... @@ -88,4 +90,44 @@ class User extends Base
}
return $info;
}
//新增用户
public function adds($param){
//验证当前用户是否存在
$info = $this->read(['mobile'=>$param['mobile']]);
if(!empty($info)){
return false;
}
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$rs = $this->add($param);
if($rs === false){
return false;
}
return true;
}
/**
* @param $param
* @name :编辑管理员
* @return bool
* @author :liyuhang
* @method
*/
public function edits($param){
//查看密码是否修改
$info = $this->read(['id'=>$param['id']]);
if($param['password'] == $info['password']){
unset($param['password']);
}
//密码加密
$param['password'] = base64_encode(md5($param['password']));
$rs = $this->edit($param,['id'=>$param['id']]);
if($rs === false){
return false;
}
//清空当前用户登录缓存
Cache::pull($info['token']);
return true;
}
}
... ...
... ... @@ -8,7 +8,6 @@ namespace App\Services;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Traits\RedisTrait;
class BaseService
{
... ...
... ... @@ -7,6 +7,7 @@ use \Illuminate\Support\Facades\Route;
//必须登录验证的路由组
Route::middleware(['bloginauth'])->group(function () {
Route::any('/user/status', [\App\Http\Controllers\Bside\UserController::class, 'status'])->name('user_status');
});
//无需登录验证的路由组
... ... @@ -17,7 +18,7 @@ Route::group([], function () {
//用户相关路由
Route::any('/user/add', [\App\Http\Controllers\Bside\UserController::class, 'add'])->name('user_add');
Route::any('/user/edit', [\App\Http\Controllers\Bside\UserController::class, 'edit'])->name('user_edit');
Route::any('/user/status', [\App\Http\Controllers\Bside\UserController::class, 'status'])->name('user_status');
Route::any('/user/lists', [\App\Http\Controllers\Bside\UserController::class, 'lists'])->name('user_lists');
Route::any('/user/del', [\App\Http\Controllers\Bside\UserController::class, 'del'])->name('user_del');
//用户角色相关路由
... ...