[笔记]Laravel开发笔记

说说最近我干了啥.距离上次发文章已经20天了,这段时间里我跑去海南玩了,回来就写了一周的laravel项目了。这次是第一次写,写的挺菜的,被dalao摁在地面上摩擦了,不过还好经过这次开发,我还是学到了一些东西,在这里Mark一下,方便以后差错。

Laravel Auth组件之坑

这次是第一次用auth组件来开发登录模块。由于应用的美工已经规定好了,我就直接手动认证了。

attempt()方法

文档写的是

attempt(["email"=>$email,"password"=>$password])

,这个组件是只能用email来作为username,不能自定义username。

login()方法

login组件需要传入的参数是用户实例。

啥是用户实例?

用户实例的意思是你一定查到的那一条数据,比如你通过ORM查到了一条password符合的数据,此时这条数据就是一个用户实例。

为啥跳转后Auth::check()返回值为false?

可能的原因如下:

  1. modal继承错误
  2. 中间件组件未加载
  3. 数据库字段错误

modal继承错误:

modal原代码:

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
}

要把代码改成这样子才行!

modal改动后的代码:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;//要改成继承这个Auth组件
class User extends Authenticatable
{
}

中间件组件未加载:

Kernel原代码:

有可能是这个组件被注释了,此时需要的是取消注释。

数据库字段错误:

login方法定位用户靠的是数据库的字段名id

这个字段名必须是id,不能是Id、iD、ID。不然Auth组件将不能够正常工作

logout方法

数据表,必须有remember_token用于存储辨识用户session的凭证。

不然laravel会报错。

Rule34自动爬虫脚本

Rule34-Downloader

php爬虫,用于爬Rule34图站的数据,自动下载特定标签的图片


特性:

– 支持指定标签,多标签搜索
– 支持轮候任务
– 支持微信通知运行状态
– 低占用


安装向导:

1. 安装php环境
2. 把该程序拖至php.exe同目录中
3. 编辑php内的PATHS,该常量用于定义爬下来的数据的缓存路径
4. 保存
5. 打开ready.txt,按照格式填入待下载标签
6. 保存
7. 运行start.bat


标签格式

female:0:42
标签:开始的pid数(0开始的42的倍数):结束的pid数(0开始的42的倍数,需要比开始的pid大)


下载地址

https://gitee.com/7gugu/python-rule34Lib


有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

  • 邮件(gz7gugu@qq.com)
  • 博客(https://www.7gugu.com)

尬吹

其实这玩意儿我去年(2018)二月就写好了,不过那时候处于要备考的节点了,就没太多的精力去管理,现在有空了就来把爬虫修好发上来

2019 To do…

0X00 尬吹


写在2018-12-31的最后10min,对2019年的一些展望和计划。

写完看了看感觉还有点难度,但今年都能跨过那个坎了,考个证书还不行么,加油!

Be myself!!!

OwO

0X01 To do


  1. 考好第一个学期的期末考[√]
  2. 考好第二个学期的期末考[√]
  3. 去一次にほん[√]
  4. 买一个手办[√]
  5. 争取考过计二[√]
  6. 争取整一个四级(迁移到19大二上)
  7. 用laravel写一个项目[√]
  8. 学python[√]
  9. 学redis[√]
  10. 考科一[√]
  11. 少吹逼多干活

2019-1-27第一次更新:完成第1,3,4点,删掉第6点

2019-3-14第二次更新:完成第7点(帮学校写了个下载站)

2019-6-1  第三次更新:完成5,8,9,10点

URP突破1700次安装咯!

0x00 尬吹


真的难以置信,在短短的四个月中URP的安装量又提高了1200次,这真的让人感到一种难以言表的开心。在发布两年以后,仍然具有如此活力,在我看来是很难得的。一方面是Unturned这个游戏进入到了3.0-4.0的过渡状态,导致游戏人数迅速降低,另一方面则是该面板只能用于管理Unturned服务器,这严重的限制了面向的用户群体。但是在这些情况下,URP还是能够脱颖而出,被大家选择来使用,实属荣幸。

而且这次的统计数据是2018年初时开始统计的,如果过算上17年的数据,我预估应该是已经有3000-4000的安装量了。虽然这个面板从技术上面具有许多的问题,如php和html的混淆,函数的复用率低下,耦合性高,无路由的概念,都限制住了面板的继续发展。即使这些在Umarket中已经得到了部分的解决与改善,但我坚信在以后的日子中我仍需继续努力去进行更多的开发,来继续提高自己的代码水平。

0x01 后记


再次感谢大家能够选择URP进行服务器管理维护,谢谢大家的支持,如果可以的话,欢迎大家能给我发点赞助,谢谢了owo

[油猴脚本]TypeSounder-模拟机械键盘声

描述:

一个基于油猴插件的模拟机械键盘的声音,就是按下键后,就会发出机械按键声


安装:

  1. 安装油猴插件,地址https://tampermonkey.net/
  2. 添加插件
  3. 运行插件

脚本代码:

// ==UserScript==
// @name         TypeSounder
// @namespace    https://103.249.111.182/
// @version      1.1
// @description  给按键加入机械键盘的触发声音
// @author       7gugu <gz7gugu@qq.com>
// @match        https://tampermonkey.net/documentation.php?version=4.8.5847&ext=fire&updated=true
// @grant        none
// @include *
// @require https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';
    var id=1;
         console.log("typesound已启动");
document.onkeydown=function(event){
    id++;
    $("body").append("<div id='key_sound_"+id+"'><audio id='player"+id+"' src='https://103.249.111.182/wp-content/uploads/2018/12/music.mp3' preload='auto'>您的浏览器不支持 audio 标签。</audio></div>");
			 var e = event || window.event;
			 var player = $("#player"+id)[0]; /*jquery对象转换成js对象*/
            if(e && e.keyCode){
	if (player.paused){ /*如果已经暂停*/ player.play(); /*播放*/ }
			  }

        };
})();

GreasyFork地址:

https://greasyfork.org/zh-CN/scripts/375939-typesounder

[油猴脚本]Typeshower-动态显示按下的按键

描述:

一个基于油猴插件的按键显示的插件,主要可以用于教学演示

安装:

  1. 安装油猴插件,地址https://tampermonkey.net/
  2. 添加插件
  3. 运行插件

效果展示:

Greasy Fork地址:

https://greasyfork.org/zh-CN/scripts/375905-typeshower

脚本代码:

// ==UserScript==
// @name         TypeShower
// @namespace    https://103.249.111.182/
// @version      1.0
// @description  动态显示输入
// @author       7gugu &amp;lt;gz7gugu@qq.com&amp;gt;
// @match        https://tampermonkey.net/documentation.php?version=4.8.5847&amp;amp;ext=fire&amp;amp;updated=true
// @grant        none
// @include *
// @require https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';
var id=1;
var key_array=new Array(200);
key_array[65]='a';
key_array[66]='b';
key_array[67]='c';
key_array[68]='d';
key_array[69]='e';
key_array[70]='f';
key_array[71]='g';
key_array[72]='h';
key_array[73]='i';
key_array[74]='j';
key_array[75]='k';
key_array[76]='l';
key_array[77]='m';
key_array[78]='n';
key_array[79]='o';
key_array[80]='p';
key_array[81]='q';
key_array[82]='r';
key_array[83]='s';
key_array[84]='t';
key_array[85]='u';
key_array[86]='v';
key_array[87]='w';
key_array[88]='x';
key_array[89]='y';
key_array[90]='z';
key_array[112]='F1';
key_array[113]='F2';
key_array[114]='F3';
key_array[115]='F4';
key_array[116]='F5';
key_array[117]='F6';
key_array[118]='F7';
key_array[119]='F8';
key_array[120]='F9';
key_array[121]='F10';
key_array[122]='F11';
key_array[123]='F12';
key_array[136]='Num_Lock';
key_array[137]='Scorll_Lock';
key_array[8]='BackSpace';
key_array[9]='Tab';
key_array[32]='Space';
key_array[13]='Enter';
key_array[16]='Shift';
key_array[17]='Ctrl';
key_array[18]='Alt';
key_array[20]='Caps';
key_array[27]='Esc';
key_array[37]='←';
key_array[38]='↑';
key_array[39]='→';
key_array[40]='↓';
key_array[45]='Ins';
key_array[46]='Del';
key_array[48]='0';
key_array[49]='1';
key_array[50]='2';
key_array[51]='3';
key_array[52]='4';
key_array[53]='5';
key_array[54]='6';
key_array[55]='7';
key_array[56]='8';
key_array[57]='9';
key_array[192]='`';
key_array[173]='-';
key_array[61]='+';
key_array[219]='[';
key_array[221]=']';
key_array[220]='\\';
key_array[59]=';';
key_array[222]='\'';
key_array[188]=',';
key_array[190]='.';
key_array[191]='/';
var key_shift=0;
var key_ctrl=0;
console.log("Typeshower已启用");
$("body").append("
&amp;lt;img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D'text%2Fcss'%3Etype%7Bpadding%3A%205px%2010px%3Bfont-size%3A%2087.5%25%3Bcolor%3A%20%23fff%3Bbackground-color%3A%20%23212529%3Bborder-radius%3A%205px%3Bfont-family%3ASFMono-Regular%2CMenlo%2CMonaco%2CConsolas%2C'Liberation%20Mono'%2C'Courier%20New'%2Cmonospace%3Bline-height%3A%201.5%3B%7D.key_list%7Bpadding%3A10px%3Bposition%3Afixed%3Bright%3A20px%3Btop%3A20px%3Bwidth%3A60px%3Bheight%3A50px%3Bz-index%3A999%3B%7D%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&amp;amp;lt;style&amp;amp;gt;" title="&amp;amp;lt;style&amp;amp;gt;" /&amp;gt;

");
$("body").append("
&amp;lt;div class='key_list'&amp;gt;&amp;lt;/div&amp;gt;

");
    document.onkeydown=function(event){
            id++;
        console.log("Typeshower 监听中");
			var key_template="";
            var e = event || window.event ;
            if(e &amp;amp;&amp;amp; e.keyCode){
			if(key_shift==1){key_template="Shift+";}
			if(key_ctrl==1){key_template="Ctrl+";}
				key_template=key_template+key_array[e.keyCode];
				$("div.key_list").append("&amp;lt;type id='"+id+"'&amp;gt;"+key_template+"&amp;lt;/type&amp;gt;

");
              if(e.keyCode==16){key_shift=1;}
			if(e.keyCode==17){key_ctrl=1;}
			  }

				$("type[id='"+id+"']").fadeOut(2500);
				$("br").fadeOut(2500);

        }
		document.onkeyup=function(event){
			var e = event || window.event ;
            if(e &amp;amp;&amp;amp; e.keyCode){
			if(e.keyCode==16){key_shift=0;}
			if(e.keyCode==17){key_ctrl=0;}
			}
		}
})();

[笔记]VS2017 char *p=“”不可用的解决办法

起因:

今天在做c语言的功课时,发现旧的教材(基于vc++6.0)使用了如下的代码,对字符串指针进行赋值.

char *p="Hello World";

但是编写到VS2017上时报了下面的一个错误.

直接导致编译失败,经过了baidu的查找后,知晓了具体原因.

解决办法:

应把源代码修改成如下的代码.

//原代码
char *p="Hello world";
//修改后的代码
const char *p="Hello world";

主要原因是因为在新版本中增强了对字符串指针的安全性,通过使用静态声明,来防止越界

[笔记][Laravel]数据库操作

准备

新建App\Http\Controller\StudentController.php

<?php
namespace App\Http\Controller;
use Illuminate\Support\Facades\DB;//使用DB类

class StudentController extends Controller{
//创建名为StudentController的控制器并继承Controller基类
public function query(){
//php
}
}

切换至routes\web.php新建一个路由

Route::any('query','StudentController@query');

创建


连接数据库

配置.env文件

DB_CONNECTION=mysql[数据库的连接模式]
DB_HOST=数据库的IP地址
DB_PORT=数据库端口
DB_DATABASE=数据库库名
DB_USERNAME=数据库用户名
DB_PASSWORD=数据库密码

配置config/database.php

'mysql' => [
'driver' => 'mysql', //数据库的类型
'host' => env('DB_HOST', 'localhost'), //数据库的位置
'port' => env('DB_PORT', '3306'), //端口号
'database' => env('DB_DATABASE', ''), //数据库名
'username' => env('DB_USERNAME', ''), //用户名
'password' => env('DB_PASSWORD', ''), //密码
'charset' => 'utf8', //字符集
'collation' => 'utf8_unicode_ci', //排序方式
'prefix' => '', //前缀
'strict' => true, //Strict模式
'engine' => null, //引擎
],

至此laravel即可连接上数据库了


使用DB facades完成数据库操作

SQL语句中的?是占位符,可以通过第二变量传入数组来传递数值

查询数据

DB::select("select * from student");//可以直接使用select语句
DB::select("select * from student where age = ? and name = ?",[18,'7gugu'])//等同于:select * from student where age = 18 and name = '7gugu'

插入数据

DB::insert("insert into student(name,age,sex) values('hzq','19','0')");//可以直接使用insert语句
DB::insert("insert into student(name,age,sex) values(?,?,?)",['hzq','19','0']);//等同于:insert into student(name,age,sex) values('hzq','19','0'),这样子方便传值

更新数据

DB::update("update student set age = 1 where name =7gugu");//可以直接使用update语句
DB::update("update student set age = ? where name =?",[1,'7gugu'])//等同于:update student set age = 1 where name ='7gugu'

删除数据

DB::delete('delete from student where id=1002');//直接使用delete语句
DB::delete('delete from student where id=?',['1002']);//等同于:delete from student where id=1002

使用查询构造器

数据表指向器

DB::table("数据表名")->操作/筛选器;
DB::table('student')->操作/筛选器;

筛选器

DB::table('student')->where()->操作;
where('id',1001)//即可筛选id是1001的数据
where('id','=',1001)//即可筛选id是1001的数据
where('id = ? and name = ?',[1001,'7gugu'])//即可限定多个条件

排序

/*
* @param string 字段名称
* @param string 排序方式(ASC:正序|DESC:倒序)
*/
DB::table('student')->orderBy('字段名','asc|desc')->操作;

字段值自增

/*
* 数值自增
* @param string 字段名称
* @param int 单次自增数量
*/
DB::table('student')->where('id','1001')->increment('age',1);

字段值自减

/*
* 数值自减
* @param string 字段名称
* @param int 单次自减数量
*/
DB::table('student')->where('id','1001')->decrement('age',1);

插入数据

DB::table('student')->insert(['name'=>'7gugu','age'=>'18']);//插入一条数据
DB::table('student')->insert([
['name'=>'test','age'=>'20'],
['name'=>'guangzhou','age'=>'30']
]);//使用一个数组来承载多条数据,即可插入多条数据

更新数据

DB::table('student')->where('id',1004)->update(['age'=>30]);//使用update函数即可更新指定字段的值
//laravel好像并不可以一次性更新多个字段

删除数据

DB::table('student')->where('id','1002')->delete();

get函数

/*
*用于获取限定条件后的数据,可以无限定条件直接获取
*/
DB::table('student')->get();

first函数

/*
* 用于获取符合限定条件的第一行的数据
* 无需传参
*/
DB::table('student')->first();

pluck函数

/*
* 获取指定名称的字段数据
*/
DB::table('student')->pluck('name','age');

效果如图所示:

聚合函数

//count()统计表的数据总数
DB::table('student')->count();
//max()比较某个字段的最大值
DB::table('student')->max('age');
//min()比较某个字段的最小值
DB::table('student')->min('age');
//avg()计算某个字段的平均值
DB::table('student')->avg('age');
//sum()计算某一个字段的所有数值
DB::table('student')->avg('age');

truncate函数

清空表中数据[危险]

//truncate()清空表中数据[危险]
DB::table('student')->truncate();

chunk函数

用于分块查找数据(用于大量数据查找时使用)

DB::table('users')->chunk(2, function($users)
{
dd($users);//每次运行仅仅查询两条数据,直至查询完毕
});

结果如图所示: