首页
关于叶子
Search
1
Laravel“高并发”导致数据“统计”异常一例
5,595 阅读
2
Laravel 9高并发API数据操作的最佳实践
4,235 阅读
3
Win10突然出现不能连接共享打印机一例
4,209 阅读
4
[iOS|Xcode]iOS-App自定义启动页制作(uniapp适用)
2,680 阅读
5
[经验存档] 微星(MSI)B150M-Pro-VD Plus安装系统蓝屏一例
1,679 阅读
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
登录
Search
标签搜索
Laravel
Windows
Laravel-Admin
PHP
uniapp
Vue
前端
chartjs
微信
小程序
App
工具
MySQL
PC
Adobe
AI
HTML
CSS
introduction
selectors
Yesr00
累计撰写
53
篇文章
累计收到
7
条评论
首页
栏目
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
页面
关于叶子
搜索到
9
篇与
的结果
2021-01-07
Laravel-Admin集成chartjs图表
最近接收一个公司内部需求,需要在后台新增一个统计图表。于是通过Laravel-Admin官方插件库里看到了chartJs,于是开始上手。 首先,安装chartJS. composer require laravel-admin-ext/chartjs 然后发布公共资源: php artisan vendor:publish --tag=laravel-admin-chartjs 执行完后得到如下信息即表示安装成功: Copied Directory [/vendor/laravel-admin-ext/chartjs/resources/assets] To [/public/vendor/laravel-admin-ext/chartjs] Publishing complete. 然后在config/admin.php中启用插件: 'extensions' => [ 'chartjs' => [ // Set to `false` if you want to disable this extension 'enable' => true, ] ] 此时要使用我们还需要创建视图文件,在resources/views/admin中创建chartjs.blade.php视图文件,文件内容如下:body部分<canvas id="myChart" style="width:200px;hegiht:200px;"></canvas>JS部分 $(function () { var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', //>bar为柱状图,line为折线图,还有其他的图表方式,可以按照自己需求,从官方文档中获取更多类型 data: { labels: ['数据1','数据2','数据3','数据4','数据5','数据6'], //>x轴标签 datasets: [{ label: "当前在办项目", //>第一个标签 data: ['3','5','2','6','8','9'], //>展示数据 backgroundColor: [ //>柱状图背景色,折线图的话就是填充背景色,如果存在多个数据则用数组,单条数据则不需使用数组。 'rgba(255, 99, 132, 0.2)', 'rgba(26,66,230,0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', ], borderColor: [ //>边框颜色 'rgba(255,99,132,1)', 'rgba(26,66,230,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', ], borderWidth: 1 //>边框宽度 }] }, options: { categoryPercentage: 1.0, legend:false, //>是否显示图标顶部图示 title: { //>图标顶部标题显示,可以用来显示一些统计信息之类的 display: true, text: 'this is title' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ beginAtZero: true, }], yAxes: [{ ticks:{ barPercentage: 1.0, beginAtZero: true }, }] } } }); }); 上面两个部分写在一个blade文件中。然后在控制器中调用view,传入数据。数据自行根据自己需求替换就行了。 然后在控制器中调用: 官方文档中如下实例: class ChartjsController extends Controller { public function index(Content $content) { return $content ->header('Chartjs') ->body(new Box('Bar chart', view('admin.chartjs'))); } } 在row中调用方式也类似, $row->column('width',new Box('title',view('admin.chartjs',compact('数据渲染')));
2021年01月07日
100 阅读
0 评论
0 点赞
2020-12-29
Laravel-Admin下回调异常抛出不生效的临时用法
叶子本地使用如下环境:Laravel:5.5,Laravel-Admin:1.7.14iframe-tabs:1.3.4在更新iframe-tabs之前。使用Laravel-Admin官方文档方法是可以正常抛出的,大致如下:$form->saving(function (Form $form) { // 抛出异常 throw new \Exception('出错啦。。。'); });亦或者使用如下方法:use Illuminate\Support\MessageBag; // 抛出错误信息 $form->saving(function ($form) { $error = new MessageBag([ 'title' => 'title...', 'message' => 'message....', ]); return back()->with(compact('error')); }); // 抛出成功信息 $form->saving(function ($form) { $success = new MessageBag([ 'title' => 'title...', 'message' => 'message....', ]); return back()->with(compact('success')); });使用如上方法的时候,本地调试就遇到return的错误抛出完全不生效。所以,最后只能使用一个临时的方法,来进行异常抛出,并关闭当前新增弹窗: exit("<script>var index = parent.layer.getFrameIndex(window.name);parent.layer.close(index);parent.toastr.error('$err')</script>");
2020年12月29日
72 阅读
0 评论
0 点赞
2020-12-24
Laravel框架下微信模板消息的大坑之路
叶子现在公司的框架用的Laravel,众所周知,用Laravel就是为了优雅的实现需求。但是,以当下架构和需求。实在是优雅不来了。实现需求才是优先。今天要说的是,微信发送公众号模板消息踩到的大坑之路。虽然目前也不确定是否已经排除了Bug。首先我们来看一下环境:框架:Laravel 5.5后台框架:Laravel-Admin 1.7.14PHP版本:7.3Redis版本:6.0.9EasyWechat:~4.0最原始的版本,不走队列的情况下,直接强撸到底,直接在对应位置写如下代码: $open_id = 'xxxxxxxxxxxxxxxxxxx'; $app = app('wechat.official_account'); $app->template_message->send([ 'touser' => $open_id, 'template_id' => WX_TEMPLATE_ID, 'url' => 'https://xxxxx.xxx', 'data' => [ 'first' => 'Title', 'keyword1' => 'ProjectTitle', 'keyword2' => '项目状态', 'keyword3' => '项目状态信息', 'keyword4' => date('Y-m-d H:i:s'), 'remark' => '进度将通过此公众号持续推送,请持续关注!', ], ]); 按照原来的这个方法,出现了一个问题,同样的代码的情况下,每次发送模板消息,腾讯回调的都是发送成功,得到如下Log: HTTP/1.1 200 OK Connection: keep-alive Content-Type: application/json; encoding=utf-8 Date: Mon, 21 Dec 2020 07:28:30 GMT Content-Length: 55 {"errcode":0,"errmsg":"ok","msgid":1659995462566756352}回调是成功了,但是用户经常会出现没有收到推送消息的情况。腾讯方面回复的是:可能是发送的信息里包含了特殊字符或表情之类的,也有可能是用户多端登录导致。但是经过叶子的几次测试,多端登录并不会影响信息的接收,从发送日志里提取没有收到的信息进行手动单独发送,也是可以正常接收信息的。那么客服的几个假设问题就都不存在了。就在没有头绪的时候,只能考虑是不是短时间内发送的次数太多,被腾讯方面给吞了请求。为了减少同一时间内发送次数太多的问题,叶子就想到了走延时队列。于是就开始了如下操作:首先,创建Jobs, php artisan make:job SendWechatMessage 创建后得到如下文件,并进行逻辑编写:<?php namespace App\Jobs; use Exception; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\Log; class SendWechatMessage implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $params; /** * Create a new job instance. * * @return void */ public function __construct($params) { $this->params = $params; } /** * Execute the job. * * @return void */ public function handle() { $data = $this->params; if(!isset($data['url']) || empty($data['url'])){ Log::error('微信队列:缺少URL'); return false; } if(!isset($data['open_id']) || empty($data['open_id'])){ Log::error('微信队列:缺少OPENID'); return false; } if(!isset($data['first']) || empty($data['first'])){ Log::error('微信队列:缺少FIRST'); return false; } if(!isset($data['keyword1']) || empty($data['keyword1'])){ Log::error('微信队列:缺少keyword1'); return false; } if(!isset($data['keyword2']) || empty($data['keyword2'])){ Log::error('微信队列:缺少keyword2'); return false; } if(!isset($data['keyword3']) || empty($data['keyword3'])){ Log::error('微信队列:缺少keyword3'); return false; } if(!isset($data['keyword4']) || empty($data['keyword4'])){ Log::error('微信队列:缺少keyword4'); return false; } $app = app('wechat.official_account'); $res = $app->template_message->send([ 'touser' => $data['open_id'], 'template_id' => WX_TEMPLATE_ID, 'url' => $data['url'], 'data' => [ 'first' => $data['first'], 'keyword1' => $data['keyword1'], 'keyword2' => $data['keyword2'], 'keyword3' => $data['keyword3'], 'keyword4' => $data['keyword4'], 'remark' => '进度将通过此公众号持续推送,请持续关注!', ], ]); if($res['errcode'] == 0){ Log::info('微信队列发送成功!'); }else{ Log::info('微信队列发送失败!'); } } public function failed(Exception $exception) { Log::error('[微信队列执行失败:'.date('Y-m-d H:i:s').']'); } }然后在对应位置调用dispatch进行任务分发并且delay,代码如下:$params = []; $params['open_id'] = $sm_open_id; $params['url'] = 'https://xxx.com/list?status=4'; $params['first'] = '项目进度更新!'; $params['keyword1'] = '项目名称'; $params['keyword2'] = '项目状态'; $params['keyword3'] = '提示信息!'; $params['keyword4'] = '操作时间'; SendWechatMessage::dispatch($params)->onQueue('wechatmessage')->delay(now()->addSeconds(10));delay及延迟时间,使用了carbon,now()->addSeconds(10),这个命令就是在当前时间上延迟10秒执行。当然这个延迟队列可以用在很多场景里。大家根据自己的需求去做调整。做了如上操作后。目前为止暂未有反馈说未收到信息。就坐等测试一波吧。P.S.:本文仅来自博主本人菜鸟记录,欢迎大神指教。
2020年12月24日
22 阅读
0 评论
0 点赞
2020-12-23
Laravel-Admin Radio事件监听
最近由于业务需要,需要通过一个radio选项来关联多个form控件的联动。通过查看Laravel-Admin源码可知,radio框引入了JS的iCheck控件来重写radio组件。通过某度,查到iCheck内置了大量的回调事件,可用来监听change、checked等事件。回调事件iCheck 提供了大量回调事件,都可以用来监听 change 事件 事件名称 使用时机 ifClicked 用户点击了自定义的输入框或与其相关联的 label ifChanged 输入框的 checked 或 disabled 状态改变了 ifChecked 输入框的状态变为 checked ifUnchecked checked 状态被移除 ifDisabled 输入框状态变为 disabled ifEnabled disabled 状态被移除 ifCreated 输入框被应用了 iCheck 样式 ifDestroyed iCheck 样式被移除 使用 on() 方法绑定事件: $('input').on('ifChecked', function(event){ alert(event.type + ' callback'); }); 以及常用方法: $('input').iCheck('check');:将输入框的状态设置为 checked $('input').iCheck('uncheck');:移除 checked 状态 $('input').iCheck('toggle');: $('input').iCheck('disable');:将输入框的状态设置为 disabled $('input').iCheck('enable');:移除 disabled 状态 $('input').iCheck('update');: $('input').iCheck('destroy');:移除 iCheck 样式 运用于Laravel-Admin中,案例如下:(仅供参考,版本1.7.14) protected function form() { $form = new Form(new Users()); Admin::script(" $('input[name=\"case_type\"]').on('ifChecked',function(event){ if(event.target.value == 1){ $('input[name=\"data_source\"][value=\"2\"]').iCheck('enable'); } if(event.target.value == 2){ $('input[name=\"data_source\"][value=\"2\"]').iCheck('disable'); } }); "); $form->radio('case_type','案例类型')->options(['1'=>'普通案例','2'=>'特殊案例'])->default('1'); $form->radio('data_source', __('资料来源'))->options(['1'=>'市场调查','2'=>'交易查档','3'=>'网络查询'])->default('1'); return $form; }
2020年12月23日
19 阅读
0 评论
0 点赞
1
2