首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
731 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
404 阅读
4
win10镜像
359 阅读
5
第20200225期-电脑壁纸-P10
350 阅读
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
登录
Search
标签搜索
ThinkPHP
MySQL
Laravel
PHP
API
GIT
Windows10
markdown
Web
跨域
ajax
小程序
壁纸
Linux
jsonp
try
异常
Dcat
UEFI
win10
phpfunny
累计撰写
104
篇文章
累计收到
24
条评论
首页
栏目
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
页面
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
搜索到
30
篇与
的结果
2023-07-08
laravel基础-链式操作返回值
DB Facades$users = DB::table('users')->get(); 返回值:数组结果,其中每一个结果都是 StdClass $user = DB::table('users')->first(); 返回值:单个 StdClass 实例 //例如可以取值$users->id;注意: StdClass对象 => 基础对象Eloquent1, $user = User::first(); 返回值:Eloquent 对象 2, $user = User::find(); 返回值:Eloquent 对象 3, $users = User::get(); 返回值:Eloquent 集合 4, $users = User::all(); 返回值:Eloquent 集合 5, $user = User::create($data); 返回值:Eloquent 对象 6, $user = new User(); $user->name = "admin" $user->save(); 返回值:Eloquent 对象 7, $result = User::insert($data); 返回值:bool 8, $result = $user->delete(); 返回值:bool 9, $count = User::destroy([1, 2]); 返回值:删除记录数 10, $count = User::where('id', '>', 1)->delete(); 返回值:删除记录数 11, $count = User::where('id', '>', 10)->update(['status' => 1]);返回值:更新记录数 12, $count = User::where('id', '>', 10)->increment('age', 1); 返回值:更新记录数注意:Eloquent 模型对象(Model 对象) => 和模型相关的类对象Eloquent 集合 => 可以简单理解为对象数组,里面的每一个元素都是一个Model 对象
2023年07月08日
51 阅读
0 评论
0 点赞
2023-05-22
Dcat菜单列表重写
前提在项目中使用的dcatadmin框架多用户模式,只有一个单后台,用户角色分为:administrator(超管), member(会员), sub_account(会员子账号)每个会员及其子账号 只能看见自己创建的自定义表单在菜单显示(例如A会员和A会员创建的A1子会员,A2子会员 大家登录后看见都是一样的, 但是A会员和B会员看见的自定义表单菜单是不一样的)。仔仔细细看了下文档 只能动态添加菜单,可是不能根据当前登录用户来决定菜单是否显示,此时脑中浮现两种方式,方式一,在创建自定义表单的时候,同时往admin_menu,admin_role,admin_role_users等表中插入菜单关联数据需要操作3-5个关系表(菜单,角色,权限及其关系表),然后每个用户都创建一个单独的与用户对应的角色,在将角色和菜单关联,让dcat来自动显示是否显示。 但是这种做需要同时操作的数据库表多张,关系繁琐弊端较多 妥妥的下下测。方式二,重构菜单列表,在渲染菜单列表的时候使用文档中通过Menu::add接口动态添加菜单 然后我也就不需要在把创建的自定义表单,单独的存入admin_menu中菜单中。仅仅只需要获取当前登录用户然后在原本菜单列表渲染后面动态add一份自定义表单即可。创建任务:在/App/Admin中重写菜单列表渲染下面即是我阅读dcat源码后进行的操作过程:复制数据格式源位置/vendor/dcat/laravel-admin/src/Layout/Menu.php复制到/app/Admin/Layout/Menu.php<?php /** * 菜单列表重写 */ namespace App\Admin\Layout; //namespace Dcat\Admin\Layout; use Dcat\Admin\Admin; use Dcat\Admin\Support\Helper; use Illuminate\Support\Facades\Lang; class Menu { protected static $helperNodes = [ [ 'id' => 1, 'title' => 'Helpers', 'icon' => 'fa fa-keyboard-o', 'uri' => '', 'parent_id' => 0, ], [ 'id' => 2, 'title' => 'Extensions', 'icon' => '', 'uri' => 'auth/extensions', 'parent_id' => 1, ], [ 'id' => 3, 'title' => 'Scaffold', 'icon' => '', 'uri' => 'helpers/scaffold', 'parent_id' => 1, ], [ 'id' => 4, 'title' => 'Icons', 'icon' => '', 'uri' => 'helpers/icons', 'parent_id' => 1, ], ]; protected $view = 'admin::partials.menu'; public function register() { if (! admin_has_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'])) { admin_inject_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () { $menuModel = config('admin.database.menu_model'); return $this->toHtml((new $menuModel())->allNodes()->toArray()); }); } //================================================================================ //在此处追加-添加自定义的菜单 $this->add([ [ 'id' => 400, // 此id只要保证当前的数组中是唯一的即可 'title' => '测试菜单999', 'icon' => 'fa-file-text-o', 'uri' => '', 'parent_id' => 0, 'permission_id' => '7', // 与权限绑定 'roles' => 'user2', // 与角色绑定 ], [ 'id' => 401, // 此id只要保证当前的数组中是唯一的即可 'title' => '测试菜单-item', 'icon' => 'fa-file-text-o', 'uri' => '', 'parent_id' => 400, 'permission_id' => '7', // 与权限绑定 'roles' => 'user2', // 与角色绑定 ] ],20); //=================================================================================== //\Illuminate\Support\Facades\Log::debug('111111111'); if (config('app.debug') && config('admin.helpers.enable', true)) { $this->add(static::$helperNodes, 20); //$this->add(static::$helperNodes, 20); //$this->add(static::$helperNodes, 20); //$this->add(static::$helperNodes, 20); //$this->add(static::$helperNodes, 20); } } /** * 增加菜单节点. * * @param array $nodes * @param int $priority * @return void */ public function add(array $nodes = [], int $priority = 10) { admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_MENU_BOTTOM'], function () use (&$nodes) { return $this->toHtml($nodes); }, true, $priority); } /** * 转化为HTML. * * @param array $nodes * @return string * * @throws \Throwable */ public function toHtml($nodes) { $html = ''; foreach (Helper::buildNestedArray($nodes) as $item) { $html .= $this->render($item); } return $html; } /** * 设置菜单视图. * * @param string $view * @return $this */ public function view(string $view) { $this->view = $view; return $this; } /** * 渲染视图. * * @param array $item * @return string */ public function render($item) { return view($this->view, ['item' => &$item, 'builder' => $this])->render(); } /** * 判断是否选中. * * @param array $item * @param null|string $path * @return bool */ public function isActive($item, ?string $path = null) { if (empty($path)) { $path = request()->path(); } if (empty($item['children'])) { if (empty($item['uri'])) { return false; } return trim($this->getPath($item['uri']), '/') == $path; } foreach ($item['children'] as $v) { if ($path == trim($this->getPath($v['uri']), '/')) { return true; } if (! empty($v['children'])) { if ($this->isActive($v, $path)) { return true; } } } return false; } /** * 判断节点是否可见. * * @param array $item * @return bool */ public function visible($item) { if ( ! $this->checkPermission($item) || ! $this->checkExtension($item) || ! $this->userCanSeeMenu($item) ) { return false; } $show = $item['show'] ?? null; if ($show !== null && ! $show) { return false; } return true; } /** * 判断扩展是否启用. * * @param $item * @return bool */ protected function checkExtension($item) { $extension = $item['extension'] ?? null; if (! $extension) { return true; } if (! $extension = Admin::extension($extension)) { return false; } return $extension->enabled(); } /** * 判断用户. * * @param array|\Dcat\Admin\Models\Menu $item * @return bool */ protected function userCanSeeMenu($item) { $user = Admin::user(); if (! $user || ! method_exists($user, 'canSeeMenu')) { return true; } return $user->canSeeMenu($item); } /** * 判断权限. * * @param $item * @return bool */ protected function checkPermission($item) { $permissionIds = $item['permission_id'] ?? null; $roles = array_column(Helper::array($item['roles'] ?? []), 'slug'); $permissions = array_column(Helper::array($item['permissions'] ?? []), 'slug'); if (! $permissionIds && ! $roles && ! $permissions) { return true; } $user = Admin::user(); if (! $user || $user->visible($roles)) { return true; } foreach (array_merge(Helper::array($permissionIds), $permissions) as $permission) { if ($user->can($permission)) { return true; } } return false; } /** * @param string $text * @return string */ public function translate($text) { $titleTranslation = 'menu.titles.'.trim(str_replace(' ', '_', strtolower($text))); if (Lang::has($titleTranslation)) { return __($titleTranslation); } return $text; } /** * @param string $uri * @return string */ public function getPath($uri) { return $uri ? (url()->isValidUrl($uri) ? $uri : admin_base_path($uri)) : $uri; } /** * @param string $uri * @return string */ public function getUrl($uri) { return $uri ? admin_url($uri) : $uri; } }注册在/app/Providers/AppServiceProvider.php注册上一步的php文件use App\Admin\Layout\Menu; ... public function register() { //注册菜单列表 $this->app->singleton('admin.menu', Menu::class); }复制模板文件原模板所在位置/vendor/dcat/laravel-admin/resoures/views/partials/menu.blade.php复制到/resoures/views/vendor/admin/partials/menu.blade.php@php $depth = $item['depth'] ?? 0; $horizontal = config('admin.layout.horizontal_menu'); $defaultIcon = config('admin.menu.default_icon', 'feather icon-circle'); @endphp @if($builder->visible($item)) @if(empty($item['children'])) <li class="nav-item"> <a data-id="{{ $item['id'] ?? '' }}" @if(mb_strpos($item['uri'], '://') !== false) target="_blank" @endif href="{{ $builder->getUrl($item['uri']) }}" class="nav-link {!! $builder->isActive($item) ? 'active' : '' !!}"> {!! str_repeat(' ', $depth) !!}<i class="fa fa-fw {{ $item['icon'] ?: $defaultIcon }}"></i> <p> {!! $builder->translate($item['title']) !!} </p> </a> </li> @else <li class="{{ $horizontal ? 'dropdown' : 'has-treeview' }} {{ $depth > 0 ? 'dropdown-submenu' : '' }} nav-item {{ $builder->isActive($item) ? 'menu-open' : '' }}"> <a href="#" data-id="{{ $item['id'] ?? '' }}" class="nav-link {{ $builder->isActive($item) ? ($horizontal ? 'active' : '') : '' }} {{ $horizontal ? 'dropdown-toggle' : '' }}"> {!! str_repeat(' ', $depth) !!}<i class="fa fa-fw {{ $item['icon'] ?: $defaultIcon }}"></i> <p> {!! $builder->translate($item['title']) !!} @if(! $horizontal) <i class="right fa fa-angle-left"></i> @endif </p> </a> <ul class="nav {{ $horizontal ? 'dropdown-menu' : 'nav-treeview' }}"> @foreach($item['children'] as $item) @php $item['depth'] = $depth + 1; @endphp @include('admin::partials.menu', ['item' => $item]) @endforeach </ul> </li> @endif @endif注意:复制出来的文件不一定按着我这个路径存放,只需要在代码关联中引用正确自动加载就能够加载出来。就上述三个文件改动即可,然后具体的数据查询根据业务需求去写即可,可以是在/app/Admin/Layout/Menu.php中 56行后面接着写,也可以将数据查询写到Models中,如果在Models中重写需要在/config/admin.php 中 'menu_model' => Dcat\Admin\Models\Menu::class, 改成自定义的模型位置。总结使用这种定义好的后端框架确实是开发迅速,但是局限性很高,如果有些特殊的需求或者效果还是需要自定义。多翻翻源码还有帮助的。此篇重构dcat菜单列表我觉得还是可以在优化一下的。仅仅记录下解决方法,如果您有更好的方式欢迎告知我。
2023年05月22日
54 阅读
0 评论
1 点赞
2022-11-14
查杀kswapd0挖矿木马
记录下挖矿病毒服务器是物理机,所有端口都是暴露开放的。服务器挖矿 导致 负载cpu内存等异常,通过排查确定是 kswapd0 挖矿木马排查过程如下:top -cPID: 19980 和 10630 cpu使用率最多进程PID:10630 ./masscan 为端口扫描工具进程PID:19980 ./kswapd0 为木马挖矿脚本通过PID进程查询文件路径 #ls -la /proc/[PID]/exe ls -la /proc/19980/exe # [root@localhost ~]# ls -la /proc/19980/exe # lrwxrwxrwx 1 root root 0 11月 13 22:42 /proc/19980/exe -> /root/.configrc/a/kswapd0 查看文件编辑时间 stat kswapd0 呵,还是新鲜热乎的呢。猜测是脚本自动修改执行根据kswapd0进程的PID查找相关的网络连接netstat -natupl | grep [PID]怀疑是自动执行,查询下定时任务[root@localhost a]# /var/spool/cron/root -bash: /var/spool/cron/root: 权限不够 [root@localhost a]# crontab -l 1 1 */2 * * /root/.configrc/a/upd>/dev/null 2>&1 @reboot /root/.configrc/a/upd>/dev/null 2>&1 5 8 * * 0 /root/.configrc/b/sync>/dev/null 2>&1 @reboot /root/.configrc/b/sync>/dev/null 2>&1 0 0 */3 * * /tmp/.X206-unix/.rsync/c/aptitude>/dev/null 2>&1定位到/tmp/.X206-unix/.rsync/ 目录删除kill掉病毒文件进程kill -9 [PID]查询相应资料说该病毒 会生成/root/.ssh公钥文件进行连接操作等步骤查看病毒所使用的ssh密钥文件找到删除即可病毒结构经过网上查证,该病毒种类繁多,文件位置基本不一样/root/.configrc/* 病毒所在目录 /root/.ssh/病毒公钥 /tmp/.X25-unix/.rsync/* 病毒运行缓存文件 /tmp/.X25-unix/dota3.tar.gz 病毒压缩包 /root/.configrc/a/kswapd0 病毒主程序 ==========病毒相关计划任务========== 1 1 */2 * * /root/.configrc/a/upd>/dev/null 2>&1 @reboot /root/.configrc/a/upd>/dev/null 2>&1 5 8 * * 0 /root/.configrc/b/sync>/dev/null 2>&1 @reboot /root/.configrc/b/sync>/dev/null 2>&1 0 0 */3 * * /tmp/.X25-unix/.rsync/c/aptitude>/dev/null 2>&1总结一下大致的处置流程:1.直接kill掉kswapd0的进程ID,后续观察服务,然后 清理计划任务: crontab -e2.删除/root/ 目录下的.configrc病毒文件夹3.删除/root/ 目录下的.ssh病毒公钥文件夹4.删除/tmp/.X25-unix/或/dev/shm/.X19273/病毒运行文件。其实在定位到进程文件的时候,就在网上搜了下该病毒对应的处置思路。附上相关链接:https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=148169http://www.hackdig.com/12/hack-243523.htm
2022年11月14日
103 阅读
0 评论
0 点赞
2022-10-05
MySQL简单记录下指令导入数据库
记录一下 使用source指令还原数据操作在web端或者 第三方数据库连接软件 导入.sql文件时 执行时间过长导致执行失败。我所使用的系统和环境为 CentOS 7.9.2009 x86_6 + 宝塔 在phpMyAdmin 网页管理中导入 data.sql.zip 由于执行时间过长 导致页面502BadGateway,(phpMyAdmin还有一个限制,上次压缩包不能超过50Mb)然后我又尝试在客户端软件DBeaver中导入sql文件不出意外导入失败了,由于DBeaver使用JAVA编写的客户端报错提示java运行内存溢出。最后尝试一下使用mysql指令对备份文件进行还原。由于使用的是宝塔LNMP环境 可以直接在shell控制台执行mysql命令附录mysql基本操作指令:-- 查看所有库 show databases; -- 使用库 use 数据库名; --创建库 create database 库名; --修改库的字符编码集,需要重启mysql alter database 数据库名 character set utf8; -- 删除数据库 drop database 数据库名; -- 查看当前在使用哪个库 select database(); -- 查看所有表 show tables; -- 查看表结构 desc 表名; -- 删除表 drop table 表名; -- 快删除所有表,但不删除库(有层级关联需要执行两遍) select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='数据库名';操作步骤:-- 0.将data.sql文件复制到数据服务器上 /home/data.sql -- 1.连接数据库 mysql -uroot -ppassword -- 2.选择数据库 use 数据库名; -- 3.导入数据 source /home/data.sql -- 4.等待导入完成mysql导入导出命令https://blog.csdn.net/weixin_45299340/article/details/121380058
2022年10月05日
101 阅读
0 评论
0 点赞
2022-08-19
[tymon]JWT-AUTO 翻译
[tymon]JWT-AUTO 翻译参考链接:jwt官网 https://jwt-auth.readthedocs.io/en/develop/laravel加载jwt参考 https://learnku.com/laravel/t/27760拉起最新版本:composer require tymon/jwt-auth注意:laravel-5.4版本以下将服务提供者添加到配置文件中的providers数组中config/app.php,如下所示:'providers' => [ ... Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]发布配置php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"此时自动生成一个config/jwt.php文件,允许配置此包的基础知识。生成密钥php artisan jwt:secret此步会更新.env文件JWT_SECRET={}laravel配置jwt更新用户模型需要在原本的User模型上实现getJWTIdentifier()和 getJWTCustomClaims()<?php namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject { use Notifiable; // Rest omitted for brevity /** * Get the identifier that will be stored in the subject claim of the JWT. * * @return mixed */ public function getJWTIdentifier() { return $this->getKey(); } /** * Return a key value array, containing any custom claims to be added to the JWT. * * @return array */ public function getJWTCustomClaims() { return []; } }配置身份验证保护注意此项需要laravel5.2及更高版本是时才有效。在该config/auth.php文件中,您需要进行一些更改来配置 Laravel 以使用jwt防护来支持您的应用程序身份验证。对文件进行下述更改:'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], ... 'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],这里我们告诉api守卫使用jwt驱动程序,我们将api守卫设置为默认值。我们现在可以使用 Laravel 内置的 Auth 系统,而 jwt-auth 在幕后工作!添加一些基本的认证路由routes/api.phpRoute::group([ 'middleware' => 'api', 'prefix' => 'auth' ], function ($router) { Route::post('login', 'AuthController@login'); Route::post('logout', 'AuthController@logout'); Route::post('refresh', 'AuthController@refresh'); Route::post('me', 'AuthController@me'); });创建AuthController命令创建php artisan make:controller AuthController添加以下内容<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class AuthController extends Controller { /** * Create a new AuthController instance. * * @return void */ public function __construct() { $this->middleware('auth:api', ['except' => ['login']]); } /** * Get a JWT via given credentials. * * @return \Illuminate\Http\JsonResponse */ public function login() { $credentials = request(['email', 'password']); if (! $token = auth('api')->attempt($credentials)) { return failed('账号或者密码错误'); //return response()->json(['error' => 'Unauthorized'], 401); } $data = array( 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ); return success($data,'登录成功'); //return $this->respondWithToken($token); } /** * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */ public function me() { return response()->json(auth()->user()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { auth()->logout(); return success([],'已成功注销'); //return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } /** * Get the token array structure. * * @param string $token * * @return \Illuminate\Http\JsonResponse */ protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); } } 注意上面代码中使用了自动封装的助手函数 success() 和 failed()封装方式详见这篇文章测试最后就可以直接访问一下http://{HOST}/auth/login会得到类似参数:{ "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ", "token_type": "bearer", "expires_in": 3600 }验证身份有多种方式通过授权头方式Authorization: Bearer eyJhbGciOiJIUzI1NiI...通过查询字符串参数http://example.dev/me?token=eyJhbGciOiJIUzI1NiI...补充关于测试环境和开发模式切换引发报错Auth guard driver [api] is not defined 尝试使用composer install 或者 composer update补全丢失依赖文件
2022年08月19日
162 阅读
0 评论
0 点赞
2022-08-02
MySQL统计数据库使用容量
直接上代码select table_schema as '表名字', concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as '数据使用/MB', concat(round(sum(INDEX_LENGTH/1024/1024),2),'MB') as '索引使用/MB', concat(round((sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024,2),'MB') as '总数据容量/MB' from information_schema.TABLES group by table_schema; MySQL自带访问数据库元数据的方式:information_schema.tables 获取所有数据库#查看Mysql所有数据库中数据表的名称、数据库注释、创建时间(mysql自带的和自定义的都会查询出来) select table_name, table_comment, create_time, update_time from information_schema.tablestable_schema 是数据库的名称table_name 是具体的表名。table_type 表的类型。#获取某个数据库中的所有表的表名、表类型、引擎等等 select table_name, table_type, engine from information_schema.tables where table_schema = '{数据库名}' order by table_name desc;select database() 获取当前数据库下的所有表#获取 当前数据库下的所有表名、表注释、创建及更新时间。 select table_name, table_comment, create_time, update_time from information schema.tables where table_schema (select database());concat(str1, str2, str3)将多个字符串连接成一个字符串注意其中有一个null,返回值也是null。data_length : 存储数据大小index_length : 索引数据大小
2022年08月02日
55 阅读
0 评论
0 点赞
2022-07-28
JS限制操作
编写网站的时候会有一些特殊的需求,比如说增加亿点点限制,打开控制面板开启调试 强制进入调试模式debugger;禁用访问者进行粘贴复制等一些操作以下是代码: const handler = setInterval(function () { console.clear(); const before = new Date(); debugger; const after = new Date(); const cost = after.getTime() - before.getTime(); if (cost > 100) { } }, 1); //屏蔽右键菜单 document.oncontextmenu = function (event) { if (window.event) { event = window.event; } try { var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) { return false; } return true; } catch (e) { return false; } } //屏蔽粘贴 document.onpaste = function (event) { if (window.event) { event = window.event; } try { var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) { return false; } return true; } catch (e) { return false; } } //屏蔽复制 //屏蔽剪切 document.oncut = function (event) { if (window.event) { event = window.event; } try { var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) { return false; } return true; } catch (e) { return false; } } //禁止f12 function fuckyou() { window.open("https://ruancang.net", "_blank"); //新窗口打开页面 window.close(); //关闭当前窗口(防抽) window.location = "about:blank"; //将当前窗口跳转置空白页 } //禁止Ctrl+U var arr = [123, 17, 18]; document.oncontextmenu = new Function("event.returnValue=false;"), //禁用右键 window.onkeydown = function (e) { var keyCode = e.keyCode || e.which || e.charCode; var ctrlKey = e.ctrlKey || e.metaKey; console.log(keyCode + "--" + keyCode); if (ctrlKey && keyCode == 85) { e.preventDefault(); } if (arr.indexOf(keyCode) > -1) { e.preventDefault(); } } function ck() { console.profile(); console.profileEnd(); //我们判断一下profiles里面有没有东西,如果有,肯定有人按F12了,没错!! if (console.clear) { console.clear() }; if (typeof console.profiles == "object") { return console.profiles.length > 0; } } function hehe() { if ((window.console && (console.firebug || console.table && /firebug/i.test(console.table()))) || ( typeof opera == 'object' && typeof opera.postError == 'function' && console.profile.length > 0)) { fuckyou(); } if (typeof console.profiles == "object" && console.profiles.length > 0) { fuckyou(); } } hehe(); window.onresize = function () { if ((window.outerHeight - window.innerHeight) > 100) //判断当前窗口内页高度和窗口高度,如果差值大于100,那么呵呵 fuckyou(); } document.onkeydown = function (event) { if ((event.keyCode == 112) || //屏蔽 F1 (event.keyCode == 113) || //屏蔽 F2 (event.keyCode == 114) || //屏蔽 F3 (event.keyCode == 115) || //屏蔽 F4 // (event.keyCode == 116) || //屏蔽 F5 (event.keyCode == 117) || //屏蔽 F6 (event.keyCode == 118) || //屏蔽 F7 (event.keyCode == 119) || //屏蔽 F8 (event.keyCode == 120) || //屏蔽 F9 (event.keyCode == 121) || //屏蔽 F10 (event.keyCode == 122) || //屏蔽 F11 (event.keyCode == 123)) //屏蔽 F12 { return false; } } window.onhelp = function () { return false; }
2022年07月28日
138 阅读
0 评论
0 点赞
2022-07-02
[laravel]中间件实现签名鉴权
前言签名是api开发的必不可缺少的一环,实操:一, 创建中间件php文件有两种方法,方法一,是由手动创建 在目录App/Http/Middleware 中创建一个自定义中间件 叫做ApiSgin.php<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use App\Models\Task as TaskModels; class ApiSgin { public function handle(Request $request, Closure $next) { $input = $request->all(); //签名验证具体实现略 //。。。 if ($input['sgin'] != '004e5444e9262496921566aea68784a8') { return failed('签名错误'); //failed自定义封装助手行数 类似 return '{"code":-1,"msg":"error"}'; } //中间件执行代码没有问题想要继续深度执行业务, //使用 $request 调用 $next 回调 return $next($request); } }方法二,使用laravel自带的artisan 工具执行一键创建命令php artisan make:middleware ApiSgin二,设置路由中间件路径可以设置多个地方在App/Http/Kernel.php 中可以填写在protected $middleware = []; //注册全局中间件protected $middlewareGrops=[]; //设置中间件组protected $routeMiddleware = []; //中间件分配给路由/** * The application's route middleware groups. * * @var array<string, array<int, class-string|string>> */ protected $middlewareGroups = [ 'web' => [], 'api' => [], 'sgin' => [ \App\Http\Middleware\ApiSgin::class, ] ]; //或者在路由设置中间映射 /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array<string, class-string|string> */ protected $routeMiddleware = [ //sgin签名验证 'sgin'=> \App\Http\Middleware\ApiSgin::class, ];三,路由中注册中间件在 Routes/api.php//需要验证签名 Route::middleware(['sgin'])->group(function () { //.... }有多种设置方式。在laravel手册中介绍的好多种方式,我觉得路由组使用同一个中间件很方便,当然要根据实际业务来使用不同方式的中间件。
2022年07月02日
131 阅读
0 评论
0 点赞
2022-06-10
[gitea]搭建私有代码库
简介私有代码一直以来是我所需要的, 随着工作时间越长接触到的项目也就越多。对于项目代码的管理还是需要像github,gitee这样成熟产品来进行管理。以下是我使用代码库产品的历程(建议跳过)GitHub是我在大学时期接触到的第一个代码库,通过github学会的基础git操作。受国内墙的影响经常会404,所以用了一段时间就把它当作归档库和寻找开源项目来用了。阿里云代码库(https://code.aliyun.com)是公司工作所需用的,也有使用了一年多的时间。每次登录需要用阿里家产品进行扫码登录很麻烦。后来换了一家公司,所有的项目都需要我来进行管理,我使用的国内码云Gitee。用的也是超级方便,炒鸡好用。在2022-5月份的时候为了避免受美国政策打压,平台关闭所有开放项目,自查版权,导致所有想开放的项目需要申请也很是麻烦。在用giee的时候在b站看到up推荐这个Gitea 感觉很不错于是就自己来搭建使用,作为自己日后产能输出的必要工具。gitea的产品特性:易安装,跨平台,轻量级,开源化,中文。对于自建不是适合所有开发人员,需要有点一丢丢门槛。首选你要有一台云服务器/私有服务器(废话)然后在加上一点会折腾的心♥ 就可以搞啦。本次教程采用简单快速的方式。如果你有更快速的方式欢迎与我分享。准备下载源码 https://gitea.io/zh-cn/Github:https://github.com/go-gitea/giteaGitee镜像:https://gitee.com/mirrors/gitea包有很多注意关键字linux, amd, 64 包文件大约100M服务器的环境:CentOS7.6 , 宝塔(包含web环境),SSH,Git域名(可以省略)流程复制下载的源码是go语言文件 gitea将该文件放置到自定义目录中。我放在了 ~ 的home目录中pwd /home/gitea #创建gitea目录,移动到该目录中 mkdir /home/gitea mv /home/gitea /home/gitea/gitea /home/gitea/gitea #添加权限(当前为root用户) cd /home/gitea chmod +x gitea #修改用户组所属人为git(root身份无法执行) chown -R git:git /home/gitea #测试(可以省略) su git cd /home/gitea ./gitea web #无报错那就是没有问题,有报错可能是root身份或者其他问题。 # http://ip:30000反代(用域名访问)特别注意 如果需要ssl 一直要在设置反代之前建立空网站并配置ssl。在宝塔中测试发现,建立完反代无法设置ssl。如果有宝塔的话设置反代更方便小白化建立常驻进程./gitea web 手动运行,当关闭进程的时候服务也将终止。选用宝塔中 Supervisor管理器插件(需软件商店下载)如果配置完发现进程启动失败 那需要在Supervisor管理器-子配置文件最后面添加以下内容①启动失败environment = HOME="/home/gitea", USER="git"②22端口占用冲突,提权设置setcap cap_net_bind_service=+eip /home/gitea/gitea安装和数据库使用反代的域名进入第一次打开是安装页面数据库可以选用MySQL 或者SQLite如选用mysql 休要在安装提前在数据库中新增库名推荐选用SQLite 安装更快。其他取消首页gitea 一开始进入首页时,直接进入登录页面,强制登录。gitea/conf/app.ini在[server]字段增加:LANDING_PAGE = explore这个字段的默认值是home设置项目中ssh地址默认显示的是localhost例如 git@localhost:qwq/qrcode.gitvim /home/gitea/custom/conf/app.ini #[server] #SSH_DOMAIN = 域名(无需协议头) 图片预览用户界面后台界面
2022年06月10日
93 阅读
0 评论
1 点赞
2022-05-19
跨域解决方案
前后端分离项目100%会碰到跨域问题跨域提示Access to XMLHttpRequest at 'http://manage.sdk.phpfunny.cn/index/portal_site/v1/home' from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.什么是跨域指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对 javascript 施加的安全限制。同源策略:是指协议(protocol)、域名(host)、端口号(port),都必须相同,其中一个不同都会产生跨域。http://www.test.com:8080/ 协议(http)、主域名(test)、子域名(www)、端口号(8080)非同源策略:无法读取非同源网页的cookie、localStorage、IndexedDB无法接触非同源网页的DOM无法向非同源地址发送 AJAX 请求解决跨域方法JSONPCORS 跨域资源共享(Cross-Origin Resource Sharing)反向代理具体解释请看下方实践或者百度网上超多的教程。[前端]nodejs+vue解决跨域采用第三种方案 使用nodejs内置反代来绕过跨域问题详见vue解决跨域文章,还有其他方式等待后期补充。[后端]laravel接口解决跨域利用框架的中间件来允许指定域名请求创建中间件cd Http/Middleware vim EnableCrossRequestMiddleware.php完善中间件内容<?php namespace App\Http\Middleware; use Closure; class EnableCrossRequestMiddleware{ /** * @param $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); $origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : ''; $allow_origin = [ 'http://127.0.0.1:8080',//允许访问 'http://manage.sdk.xxxxx.cn',//允许访问 'http://manage.sdk.xxxxx.com/' ]; if (in_array($origin, $allow_origin)) { $response->header('Access-Control-Allow-Origin', $origin); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN'); $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'true'); } return $response; } }注册中间件在protected $middleware 里写上中间件类名。如果没有Http/Kernel.php则需要创建<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \App\Http\Middleware\EnableCrossRequestMiddleware::class, ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ ]; } 完成,重新请求即可。其他方式解决跨域PHP项目中共享域设置待补充
2022年05月19日
218 阅读
0 评论
0 点赞
2022-05-10
【VUE】解决跨域
前言VUE引用axios组件经行二次封装请求前端本地项目请求远程服务器接口报出跨域错误Access to XMLHttpRequest at 'http://manage.sdk.phpfunny.cn/index/portal_site/v1/home' from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.网上说有可以使用jsonp 或者 nodejs代理 前端解决跨域问题我采用的是nodejs代理 方式。第一步:首先在/config/index.js在dev配置中 proxyTable:{} 添加以下代码proxyTable: { '/api': { target: 'http://manage.sdk.phpfunny.cn', //你要跨域的网址 比如 'http://news.baidu.com', // secure: true, // 如果是https接口,需要配置这个参数 changeOrigin: true, pathRewrite: { '^/api': '' } } },第二步:在二次封装axios中 设置baseURLaxios.defaults.baseURL = '/api';第三步:重启npmnpm run dev参考:vue解决跨域问题
2022年05月10日
160 阅读
0 评论
0 点赞
2022-05-10
PHP常用的封装方法-单文件版
检查文件是否存在,不存在则创建/** * [create_file 创建文件] * @param string $filename [文件名] * @return [type][true|false] */ function createFile(string $filename) { if (file_exists($filename)) { return false; } // 判断文件类型是否为目录, 如果不存在则创建 if (!file_exists(dirname($filename))) { mkdir(dirname($filename), 0777, true); } if(touch($filename)) { return true; } return false; }检查文件夹是否存在,不存在则创建//没有则创建文件目录 function mkdirs($dir, $mode = 0777) { if (is_dir($dir) || @mkdir($dir, $mode)) return TRUE; if (!mkdirs(dirname($dir), $mode)) return FALSE; return @mkdir($dir, $mode); }CURL的get请求/** * curl get网络请求 * @param $url * @return bool|string */ function http_request_get($url) { $curl = curl_init(); //设置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, 1); //设置获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //执行命令 $data = curl_exec($curl); //关闭URL请求 curl_close($curl); return $data; }CURL的post请求/** * curl http post请求接口 */ function http_request($url, $data = array(), $header = array(), $out_header = false) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $out_header ? curl_setopt($curl, CURLOPT_HEADER, 1) : ''; curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); isset($header) ? curl_setopt($curl, CURLOPT_HTTPHEADER, $header) : ''; // curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); // POST数据 curl_setopt($curl, CURLOPT_POST, 1); // 把post的变量加上 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $output = curl_exec($curl); curl_close($curl); return $output; }file_get_contents方式post请求/** * 发送post请求 */ function send_post($url, $post_data) { $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/json; charset=utf-8', 'content' => json_encode($post_data), 'timeout' => 15 * 60 // 超时时间(单位:s) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return $result; }写入日志/** * [logg 写入日志] * @param string $name [日志标题] * @param string/array $data [打印数据] * @return [type][true|false] */ function Logg($name='', $data=''){ $filename = 'public/debug.log'; createFile($filename); $time = date('Y-m-d H:i:s', time()); $data = array( 'title' => $name, 'create_time' => time(), 'data' => $data ); $data = 'TIME: ' . $time .' | '. json_encode($data) . ' | ' . PHP_EOL; file_put_contents($filename, $data, FILE_APPEND); return true; }获取微信access_tokenfunction accessToken() { $url = 'https://api.weixin.qq.com/cgi-bin/token'; $grant_type = 'client_credential'; $appid = APPID; $secret = SOURCEID; $url = $url . "?grant_type={$grant_type}&appid={$appid}&secret={$secret}"; $result = http_request_get($url); $result = substr($result,strpos($result,'{')); $result = json_decode($result,true); if(empty($result['errcode']) || !empty($result['access_token'])) { return $result['access_token']; } else { return false; } }生成随机字符(数字+字母)-6位echo base_convert(mt_rand(100000000,999999999),10,36);
2022年05月10日
97 阅读
0 评论
0 点赞
2022-05-03
【VUE】环境搭建
windows 环境 进行vue环境搭建nvm (nodejs版本管理工具)//1. 安装nvm // https://github.com/coreybutler/nvm-windows/releases //nvm -v //2. 安装最新版nodejs nvm install 16.14.2 nvm use 16.14.2 (注意以管理员身份运行) nvm --version //3. 切换npm镜像源 npm config set registry https://registry.npm.taobao.org安装vue-cli 最新安装方式npm install -g @vue/cli //查看是否安装成功 vue --version 新建vue项目cd file //推荐windeos powershell 以管理员身份运行 vue create test //如果提示无法运行脚本需要修改一下配置 set-ExecutionPolicy RemoteSigned //推荐选择自定义配置 Manually select features //选择组件 Bable,Router (空格选择,回车确定) //接下来会问你 Use history mode for router? -n //配置保存位置 选择 in package.json //是否将本次选择作为下次创建项目使用 选择 -n完成当提示出现cd test npm run server表示已经创建完成啦npm run server就可以访问 localhost:8080 看到vue默认页面啦
2022年05月03日
119 阅读
0 评论
0 点赞
2022-03-18
记录try的使用排查错误
感谢异常捕获在请求发送短信接口时候使用GuzzleHttp\Client接口报错-日志报错信息如下:[2022-03-18 10:35:49] local.ERROR: #0 /www/wwwroot/api/app/Developers/Chuangyun/Chuanglansms.php(126): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined prope...', '/www/wwwroot/ap...', 126, Array) #1 /www/wwwroot/api/app/Utils/Sms/Sender/ChuanglanSenderAbstract.php(23): App\Developers\Chuangyun\Chuanglansms->send('19145109087', '870987') #2 /www/wwwroot/api/app/Utils/Sms/Sms.php(40): App\Utils\Sms\Sender\ChuanglanSenderAbstract->send('870987') #3 /www/wwwroot/api/Modules/SDK/Http/Controllers/V1/SmsController.php(86): App\Utils\Sms\Sms->sendAndSave() #4 [internal function]: Modules\SDK\Http\Controllers\V1\SmsController->bindTel(Object(App\Http\Requests\V1\TelNotExist)) #5 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array) #6 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('bindTel', Array) #7 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Modules\SDK\Http\Controllers\V1\SmsController), 'bindTel') #8 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\Routing\Route->runController() #9 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Route->run() #10 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #11 /www/wwwroot/api/Modules/SDK/Http/Middleware/Retain.php(23): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #12 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Modules\SDK\Http\Middleware\Retain->handle(Object(Illuminate\Http\Request), Object(Closure)) #13 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #14 /www/wwwroot/api/app/Http/Middleware/ResponseLog.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #15 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\ResponseLog->handle(Object(Illuminate\Http\Request), Object(Closure)) #16 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #17 /www/wwwroot/api/app/Http/Middleware/Authorization.php(18): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #18 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\Authorization->handle(Object(Illuminate\Http\Request), Object(Closure)) #19 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #20 /www/wwwroot/api/Modules/SDK/Http/Middleware/CheckDevice.php(36): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #21 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Modules\SDK\Http\Middleware\CheckDevice->handle(Object(Illuminate\Http\Request), Object(Closure)) #22 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #23 /www/wwwroot/api/app/Http/Middleware/RequestPretreatment.php(15): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #24 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\RequestPretreatment->handle(Object(Illuminate\Http\Request), Object(Closure)) #25 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #26 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #27 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure)) #28 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #29 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #30 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure)) #31 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #32 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #33 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #34 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) #35 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route)) #36 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(590): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) #37 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #38 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) #39 /www/wwwroot/api/vendor/barryvdh/laravel-cors/src/HandleCors.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #40 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure)) #41 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #42 /www/wwwroot/api/app/Http/Middleware/Proxies.php(20): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #43 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\Proxies->handle(Object(Illuminate\Http\Request), Object(Closure)) #44 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #45 /www/wwwroot/api/vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #46 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\Proxy\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure)) #47 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #48 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #49 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #50 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #51 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #52 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #53 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #54 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #55 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure)) #56 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #57 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #58 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) #59 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #60 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #61 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #62 /www/wwwroot/api/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #63 /www/wwwroot/api/public/index.php(55): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #64 {main}尤其是第一行的报错没有看明白0 /www/wwwroot/api/app/Developers/Chuangyun/Chuanglansms.php(126): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined prope...', '/www/wwwroot/ap...', 126, Array)打印日志尝试好久也没有找到哪里出现问题,只是知道大概的错误地址 Chuanglansms.php(126行代码处)/** * @param string $phoneNumbers * @param string $templateId * @param string $templateParams * @return bool * @throws \Exception */ public function send(string $phoneNumbers, string $code): bool { $this->phoneNumbers = $phoneNumbers; $this->code = $code; $client = $this->getConnect(); $response = $client->post('/msg/v1/send/json', ['headers' => ['Content_Type' => 'application/json'], 'json' => $this->getParams()]); $res = json_decode($response->getBody()->getContents()); if ($res->RetCode > 0) { Log::error('创蓝云智短信发送失败:' . json_encode($res)); throw new \Exception('系统异常,发送失败'); } return true; }126报错异常的代码就是上述代码段18行 if ($res->RetCode > 0) {这个RetCode我一直以为是请求接口返回参数,没有觉得他错误应该是其他的错误。【这里是思维的坑】然后留意了一下这个(8, 'Undefined prope...', '/www/wwwroot/ap...', 126, Array)有报错信息,但是不完整。想了也半天,忽然想起项目中大量使用了try catch然后尝试了一下果然报错信息完整了/** * @param string $phoneNumbers * @param string $templateId * @param string $templateParams * @return bool * @throws \Exception */ public function send(string $phoneNumbers, string $code): bool { $this->phoneNumbers = $phoneNumbers; $this->code = $code; try{ $client = $this->getConnect(); $response = $client->post('/msg/v1/send/json', ['headers' => ['Content_Type' => 'application/json'], 'json' => $this->getParams()]); $res = json_decode($response->getBody()->getContents()); Log::debug('接口返回报文:'.json_encode($res)); if ($res->RetCode > 0) { Log::error('创蓝云智短信发送失败:' . json_encode($res)); throw new \Exception('系统异常,发送失败'); } } catch (Exception $e) { Log::debug('异常错误:'.$e->getMessage()); throw new \Exception('系统异常,发送失败2'); return false; } return true; }打印日志[2022-03-18 10:58:26] local.DEBUG: 异常错误:Undefined property: stdClass::$RetCode提示未定义属性的错误。果然这个RetCode有问题。补充:在laravel9中使用try格式use Exception; use Illuminate\Support\Facades\Log; try{ } catch(Exception $e){ Log::debug('异常错误:'.$e->getMessage()); throw new \Exception('系统异常'); }
2022年03月18日
182 阅读
0 评论
0 点赞
2021-12-31
关于require_once本地资源路径问题
当我们在使用PHP框架的时候,如果框架不支持命名空间,或者某些特殊的情况,我们需要额外的引入文件使用require_once(或者require、include等等)引用相对路径文件时,会提示路径不正确。
2021年12月31日
198 阅读
0 评论
0 点赞
1
2