关于lavarel:小编推荐Laravel9-Vue30前后端分离框架通用后台源码

laravel9 + vue3 + element-ui的后盾极速开发框架,采纳前后端拆散架构,安全性 (JWT 校验、中间件、验证器、路由、异样解决、权限管制) 网址: http://laravel.v9.vue.v3.wzxiaopin.com/admin 账号:admin 明码:admin 舒适提醒:若呈现无奈登陆,能够在首页 点击“装置”选项,即可重置数据,而后登陆即可。目前零碎是定时工作,12小时为一周期,主动重装。 注意事项后端我的项目部署,尽量用域名,不要用php artisan serve,启用后端我的项目,否则会呈现后盾无奈登录问题 装置要求php = ^7.3 | ^8.0laravel = 8.75mysql >= 5.7vue = 3.2.38node = v16.17.1疾速装置 (必须)cd backend #进入后端目录cp .env.dev .env #复制配置创立数据库,laravel-vue-cms 并顺次设置 .env文件中的 DB_HOST DB_PORT DB_DATABASE DB_USERNAME DB_PASSWORD导入数据库文件,resource/数据库.sql配置伪动态 ngnix参考:location / { try_files $uri $uri/ /index.php$is_args$query_string; }拜访后盾,你的域名/admin 账号: admin 明码: admin装置依赖 (非必须)因为家喻户晓的起因,国外的网站连贯速度很慢。因而装置的工夫可能会比拟长,咱们倡议应用国内镜像 (阿里云)。composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/根目录执行composer update 或者 composer install 可选配置(非必须)php artisan migrate #第一步:装置数据表php artisan generate:cms #第二步:增加demo数据php artisan key:generate #第三步:生成APP_KEYphp artisan passport:keys --force #第四步:生成oauth密钥php artisan storage:link #第五步:创立目录软连贯php artisan passport:client –password –provider=admins #第六步:生成OAuth令牌复制生成OAuth令牌参数,到.env文件中的PASSPORT_CLIENT_ID PASSPORT_CLIENT_SECRETchown -R 777 storage #更改权限目录 ...

April 19, 2023 · 1 min · jiezi

关于lavarel:干掉广告和钓鱼这款神器绝了

大家好,我是良许。 前几天,搜狐丢人丢大发了,自家的员工竟然遭逢了钓鱼欺骗。。 据报道,某员工应用邮件时被意外钓鱼导致明码泄露,进而被假冒财务部盗发邮件。共有 24 名员工被骗取 4 万余元。 要晓得,搜狐可是国内最早的四大门户网站之一,同时也是国内最大的邮件服务提供商之一。 像这种类型的大公司,具备深厚的技术底蕴,都难逃钓鱼邮件,对于一般小公司自建邮件系统,更是奄奄一息,不禁让人脊背发凉。。 尽管进步员工的安全意识能够防止很多损失,但人毕竟不是机器,总有忽略的时候。 一不小心,点击了个钓鱼链接,你的账号密码就被透露了;一不小心,下载了个恶意程序,你的电脑就任人摆布了。。 这种事件不足为奇。 百密总有一疏,在增强员工培训的同时,也要给你的零碎加上一层强有力的护盾。 前几天在搜寻材料的时候,无意间发现了一个十分弱小的护盾—— OneDns ,只有改一下办公网进口DNS指向,就能够防备广告钓鱼与木马病毒,还能做简略的上网行为治理。 一、OneDns 防钓鱼性能什么是 OneDns ? 简略来说,OneDns 就新一代企业级平安 DNS ,说得更艰深一点,就是通过它你能够更平安连贯到互联网中。 而且,OneDns 通过DNS与威逼情报相结合,在点击链接或扫码跳转到钓鱼网站时,针对域名进行甄别,一旦发现是网络钓鱼等歹意域名时,就进行解析并返回拦挡页面,提醒拜访有危险。 这样一来,基本上就不必放心网络/邮件钓鱼啦~ 除此之外,OneDns还有能够无效抵御木马攻打。 OneDNS 是网络安全公司微步在线旗下的一款平安产品,微步在线继续收集海量木马病毒样本、黑客 IP 资产等数据,进而把握黑客服务器域名,并云端同步给OneDNS 。所以,OneDNS 能随时拦挡最新的木马病毒。 网络的世界,也不是一片净土,而是一片风起云涌的不平之地。 受疫情与寰球经济低迷影响,网络钓鱼攻打的覆盖范围和频率正显著回升,第四季度用于网络钓鱼的域名简直是第一季度的9倍。 仅靠员工本身,必定是无奈抵制这么多无孔不入的钓鱼/木马攻打。 二、OneDns 有哪些外围性能?OneDns 这款神器非常弱小,除了刚刚提到的防钓鱼和防木马,还有很多让你进攻值加倍的性能! 进步网络接入稳定性和可见性 99.999% 的 DNS 解析可靠性对网络接入状况提供可视化监控报表随时随地剖析 DNS 解析状况和问题排查拦挡有效流量,升高网络带宽老本 可无效辨认广告、跟踪器、非法网站等有效站点可抉择拦挡有效站点,节约带宽老本达 30%实现员工上网行为治理,进步工作效率 无需任何网络改变,即可通过 DNS 无效进行员工上网行为的治理工作工夫无效拦挡多种类别站点,进步工作效率反对自定义拦挡和放行名单,随心管控业余威逼情报赋能,平安威逼全监控 国内最业余的威逼情报数据实时同步企业内恶意软件、勒索病毒、钓鱼攻打、APT攻打全面监测无需任何硬件,分钟级配置和治理 无需任何硬件,只须要批改 DNS 指向即可实现接入配置一个账号可反对多职场、多近程办公终端的接入和对立治理监控面板反对按不同的治理视角进行切换一键下发策略,秒级失效 三、OneDns 靠谱不?OneDNS 曾经运行 9 年了,简直没有呈现过重大故障,这是因为 OneDNS 的服务器是部署在云上的,只有 nslookup 一下就能够看到,岂但在 AWS 上有,在 UCloud 上也有,互为冗余。而且在全国各个区域总共有 80 多个减速站点。解析性能很稳,跟其余支流 DNS 并驾齐驱。 ...

March 16, 2023 · 1 min · jiezi

关于lavarel:我期待被毕业

大家好,我是良许。 最近互联网大厂一系列的骚操作真的让人亮瞎眼,什么员工不叫员工叫同学,裁员不叫裁员叫毕业,裁员信也不叫裁员信叫毕业须知。。 托付,咱们来公司是来赚钱的,不是来承受教育的,更不是来讲情感情怀的。。 这真的是—— 毕业即就业! 不过,说实话,当年还在公司下班的时候,我还真的一度十分强烈心愿能被公司安顿「毕业」。 有人可能会问,有份工作好好的,还是世界 500 强的 title ,而且待业环境也极度顽劣,为何这么焦急毕业呢? 其实起因很简略,就是过后我的副业支出曾经远远超过我的主业支出,并且主业的工作曾经太耽搁我赚钱了。 我是在 2018 年中旬开始边下班边写公众号,到 2019 年年初的时候,公众号的支出就曾经开始超过我的主业支出了。原本打算年底就辞职,谁晓得,一场从天而降的疫情打乱了所有人的打算,包含我。 也因为疫情加上大环境不好,咱们公司开始放出风声要 cy ,正当大家在为这个音讯而焦虑不安时,我却心中暗喜,这特么不是天赐良机吗? 我刚好想到职守业,如果能混上一个毕业名单,那岂不是两全其美? 心中的如意小算盘真的是打得噼啪响~ 于是我等,等啊等,等到隔壁机械组实现 cy 了,咱们这边还毫无动静。我都开始焦急了,我的名额呢?我的 N+1 呢?我的毕业证书呢? 直到有一天,咱们老大喊我过来谈话,我心中一阵狂喜,看来有戏了! 后果……万万没想到,他跟我讲,咱们组马上就要遣散了,下周起我就要被安顿到另外一个组里去。 我特么……心中一万只草尼玛奔流而过…… 我不死心,再拐弯抹脚问他,咱们组会裁员吗? 他温顺一笑,有这个打算,但下面还在钻研名单。而后,又拐弯抹脚地揭示我,我的合同快到期了,未来公司不续期我还是得走人。。 几乎是晴天霹雳啊……等了几个月,等了个寂寞……难道是我平时体现太好,所以没在毕业名单里? 再想想他说得的确也有情理,我的合同还有 3 个月就要到期了,既然都是走,那就走得体面一点吧。于是不久之后,我就提出到职,从此踏上了守业的不归路。。 不过在这里我要跟大家揭示一下,如果合同到期了公司不续签,那么公司还是须要领取 N+1 抵偿的。惋惜我过后不懂啊,要不然我的打算就有可能未遂了,痛心疾首啊~ 不过,话又说回来,那时候我的主业曾经影响到我的副业支出,再呆上来的话,损失的可不止 N+1 ,所以那时候果决来到也是十分理智的抉择。 我在抖音直播的时候,跟大家聊起这个故事,大家也纷纷感觉我的来到是对的。 同时,直播间也有很多小伙伴表白了对这波 cy 的担心,问我怎么看。 其实,我个人感觉,目前的行情才是比拟失常的行情。尽管有些马后炮,但在之前我就曾经正告过我的读者敌人,前两年的疯狂扩张是必定要付出代价的,当初的大 cy 就是代价之一。 为什么说如此大荡涤才是失常行情呢? 前几年互联网的造富景象大家必定历历在目,各种大厂通过上市,发明了多少亿万、千万富翁,百万小富翁更是成千上万。 于是,互联网大厂就给人一种印象,只有进去了,就能发家致富。 刚开始,事实也的确如此。刚毕业的小年老,在 hello world 都写得不是很溜的状况下,就能拿到三四十万的年薪,你说这是失常的景象吗? 三四十万的年薪,可能是很多中小企业底层搬砖工程师一辈子都达不到的高度,而这只是大厂程序员的起步价。 这还不够,大厂为了赚取更多利润,开始疯狂扩张,开出了各种各样的业务线,有些业务真的很让人摸不着头脑(这里就不点名了,省得收到律师函)。 在这种自觉高薪、疯狂扩张的状况下,整个互联网圈子越来越趋于不感性,越来越不失常,泡沫也越来越大。刺破这个泡沫的,只是工夫问题。 而当初,时候已到。 在目前 yq 、zz 、jj 上行的大趋下,互联网公司旧业务增长见顶,新业务迟迟无奈营利,公司为了保住利润,或者为了生存,必定会对员工痛下杀手。 员工产出太低?劝退。新业务不赚钱?全副砍掉。员工曾经足够了?hc 缩减。 ...

March 8, 2023 · 1 min · jiezi

关于lavarel:惊初中生也来卷了……

大家好,我是良许。 前两天在抖音直播的时候,忽然来了一位不请自来…… 他自称是初中生,一开始我还有点不太置信,直到跟他连麦,听到他还略带一些稚嫩的声音,我才晓得,他没有骗我…… 他说他想学编程,问我第一门编程语言应该学 C 语言还是 Python 。 我都有点惊呆了,初中生,此时曾经三月底了,这个时候不是应该备战中考吗(如果初三的话)? 他自信地跟我讲,中考 750 分的试卷,他能考 650 分以上。 这个分数,真的是能够称得上学霸级的问题,但毕竟隔着屏幕,也没法确认真实性。 所以,在叮咛他初中生还是以学业为主的同时,对于他的问题我还是给了一些我本人的认识。 如果是成年人,我必定是倡议大家肯定要把 C 语言当作入门语言。 为什么呢?其实很简略,C 语言是很多编程语言的鼻祖,把 C 语言弄明确了,再去学习其它编程语言,就会十分快,毕竟语言都是相通的。 另外,C 语言是一门十分贴近底层的语言,学好 C 语言,你会对操作系统、数据结构、算法,乃至编译原理等等基础知识,都会有更加粗浅的了解。 别小看计算机基础知识,这些不起眼的货色,才是程序员内功的真正体现。 特地是指针,它是 C 语言的灵魂,同时也是很多程序员的恶梦。 指针用得好的话,就能够像魔法师手里的魔杖一样,得心应手操纵内存;如果不相熟指针的操作,分分钟给你 OOM ! 而 Python 是比 C 语言更高级的语言,屏蔽掉大部分底层接口,让你更加专一于利用的开发。 所以 Python 学习起来绝对要简略很多,也更加容易了解,比拟靠近人类语言。但这也导致了学习 Python 会让你脱离基础知识,对于程序员内功的修炼不敌对。 所以,程序员的第一门语言,强烈建议学习 C 语言,不论你前面有没有用到它。 但如果是小孩的话,那我更倡议学习 Python 。 起因也很简略,Python 简略易学,正反馈比拟快,容易保持学上来。有一些城市甚至都在小学阶段就开设了 Python 课程。 而 C 语言更底层,学习起来更难,没有肯定常识积攒的话,学习起来会十分吃力,不仅打击自信心,还可能很快就放弃。 不过话又说回来,小初高阶段,还是把要重心放在学业上,编程顶多作为一个课外喜好,否则顾此失彼就得失相当了。 当然,当初也不少神童级别的人物,从小就开始学习编程,比方最强大脑选手 Vita 君(没错,我是最强大脑资深粉丝),从 4 岁开始学习编程,现在曾经有 4 年编程教训,就问你怕不怕? 但这种人毕竟是景象级人物,而咱们普通人还是老老实实认清本人的定位,上课好好听讲,作业好好实现,学有余力再去做其它事件。 同时家长也不要硬逼孩子学这学那,过早让孩子学习不是这个年龄阶段的常识,只会揠苗助长,百害而无一利! (想想我的童年还是挺幸福的,画画、做手工、做收音机、捉泥鳅、打鸟蛋、玩弹珠……80 后农村孩子该有的我都有,哈哈) ...

March 6, 2023 · 1 min · jiezi

关于lavarel:微信又变天

大家好,我是良许。 不晓得大家有没发现,过来两周,微信又双叒改版了! 这个改版,喜爱看公众号的小伙伴可能会不习惯,作为公众号的作者更为好受,用一个变天来形容都不为过。 微信又搞啥幺蛾子呢? 如果你还不晓得改啥版了,你能够关上订阅号页面,你会发现,除了你打星标及常常浏览的公众号外,其余的公众号全副以小图展现。 而微信重点搀扶的视频号,则判若两人大图高清显示。 毫无疑问,这次的改版,再次再让我本来飘渺的浏览量,再次断崖式上涨。 能够说,微信的每一次改版,对很多号主(包含我)都会产生及其深远的影响。最常见的,就是浏览量的爆跌。 当我还在 11W 粉丝的时候,我的均匀浏览量在 1W 左右,而当初我的粉丝量 22W ,但浏览量只有区区的四五千! 没错,粉丝翻倍了,浏览量却毫不留情腰斩了! 不仅仅是我,我身边的其余号主,也基本上都是相似的状况,大家一片哀嚎,却又无能为力。 再加上这两年技术公众号行情变差,泛滥号主停更的停更,卖号的卖号,已经英姿飒爽光鲜亮丽的号主,很多都兴冲冲回到了职场。 再一次印证了那句话,微信的每一次小小的改变,都会对成千上万乃至上亿的用户产生深远的影响。 然而,微信又不得不改版,这是历史的趋势,也是微信的无奈。 想想看,微信当年为什么做公众号? 其实,对于微信而言,它做公众号简直不赚钱(特地是晚期),但它为何又要花人力物力财力去开发公众号平台呢? 其中的起因很简略,就是为了反抗当年如日中天的今日头条。 彼时的今日头条,景色有限,领有微小的流量,于是微信开始焦虑了,如果用户的工夫都被今日头条抢走了,那期待微信的就是死亡。 别以为当年的微信曾经有大几亿的用户就是耸立不倒,一个产品的沦亡兴许就在一瞬间。 于是,微信推出了公众号,就是为了争夺用户的工夫。 能够说,当年的公众号是十分胜利的,有很多造富神话,而我也幸运地靠公众号赚到了人生的首个百万。 但随着时代的倒退,当初曾经进入到了短视频与直播的时代,微信不得不又做出扭转。 所以,视频号又横空出世。 视频号通过三年的迭代,大家应该能够感觉到,它的性能还是比拟高级,然而,能够说,视频号确实是微信的将来。 所以,张小龙一次又一次在公开课上不遗余力强调视频号。 之前,微信其实也在短视频上做过尝试,也就是所谓的微视,但惋惜没做起来,成为弃子。 而当初,微信必须孤注一掷把视频号做起来。如果做不起来视频号,能够说,腾讯兴许就会掉队,有可能隐没在历史的长河…… 别说我这是在危言耸听,已经的那么多巨无霸,比方诺基亚、柯达、雅虎,就是因为没有跟上历史的脚步,逐步淡出人们的视线,甚至破产倒闭! 所以,微信给了视频号极大的权重,甚至都有人戏称,间接在微信里给视频号一个 tab 得了(又不是不可能)。 为了自救,不惜挥刀自宫,冤屈了公众号,这须要很大的勇气,同时也体现的腾讯的气魄。 每一次改革都是苦楚的,对腾讯是如此,对咱们这些号主而言更是如此。 然而,这也未必是一件好事,毕竟每一块硬币都有两面。 对于咱们这些内容创作者,也不能猛攻某个平台,也须要依据历史趋势做出相应的调整。 当初腾讯如此鼎力搀扶视频号,如果咱们从图文转化到短视频,那将会吃到历史的红利。 早在 2019 年我就曾经察觉到了这个趋势了,于是过后我就进军了抖音和 B 站,B 站算是搞起来了,但因为没有找到办法,抖音一起不温不火。 直到去年初,在通过一直摸索之后,我终于把抖音做起来了,目前也曾经有 7W 的粉丝量了。 说实话,因为公众号浏览量的降落,我的支出也受到了极大的影响。但好在我及时调整方向,转战抖音,并且也赚到了钱,我的支出才勉强维持均衡。 但我不会就此放弃公众号,我还会持续在公众号更新,毕竟我对它倾泻了太多的心血了。 这个世界,惟一不变的就是变,拥抱变动吧,任劳任怨没用的。 最初,恳请大家帮我加个星标,这样我的推送你就能第一工夫收到啦~

March 3, 2023 · 1 min · jiezi

关于lavarel:最为常用的Laravel操作3模板

Blade 模板引擎模板继承定义布局: <!-- 寄存在 resources/views/layouts/app.blade.php --><html> <head> <title>App Name - @yield('title')</title> </head> <body> @section('sidebar') This is the master sidebar. @show <div class="container"> @yield('content') </div> </body></html>继承布局: <!-- 寄存在 resources/views/child.blade.php -->@extends('layouts.app')@section('title', 'Page Title')@section('sidebar') @parent <p>This is appended to the master sidebar.</p>@endsection@section('content') <p>This is my body content.</p>@endsection数据显示注:Blade 的 {{}} 语句曾经通过 PHP 的 htmlentities 函数解决以防止 XSS 攻打。Hello, {{ $name }}.The current UNIX timestamp is {{ time() }}.输入存在的数据, 两种形式都能够: {{ isset($name) ? $name : 'Default' }}{{ $name or 'Default' }}显示原生数据: ...

January 31, 2023 · 2 min · jiezi

关于lavarel:最为常用的Laravel操作2路由

根本路由// 接管一个 URI 和一个闭包Route::get('hello', function () { return 'Hello, Laravel';});// 反对的路由办法Route::get($uri, $callback);Route::post($uri, $callback);Route::put($uri, $callback);Route::patch($uri, $callback);Route::delete($uri, $callback);Route::options($uri, $callback);// 反对多个路由办法Route::match(['get', 'post'], '/', function () { //});// 注册所有路由办法Route::any('foo', function () { //});路由参数应用花括号包裹路由参数不能蕴含 - 字符, 需要的话能够应用 _ 代替// 捕捉用户 IDRoute::get('user/{id}', function ($id) { return 'User '.$id;});// 捕捉多个参数Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { //});// 可选参数Route::get('user/{name?}', function ($name = null) { return $name;});Route::get('user/{name?}', function ($name = 'John') { return $name;});// 正则束缚Route::get('user/{name}', function ($name) { //})->where('name', '[A-Za-z]+');Route::get('user/{id}', function ($id) { //})->where('id', '[0-9]+');Route::get('user/{id}/{name}', function ($id, $name) { //})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);命名路由// 为路由闭包指定名称Route::get('user/profile', function () { //})->name('profile');// 为控制器操作指定名称Route::get('user/profile', 'UserController@showProfile')->name('profile');// 应用命名路由生成 URL: 不带参数$url = route('profile');return redirect()->route('profile');// 应用命名路由生成 URL: 附带参数Route::get('user/{id}/profile', function ($id) { //})->name('profile');$url = route('profile', ['id' => 1]);路由群组中间件Route::group(['middleware' => 'auth'], function () { Route::get('/', function () { // 应用 Auth 中间件 }); Route::get('user/profile', function () { // 应用 Auth 中间件 });});命名空间Route::group(['namespace' => 'Admin'], function(){ // 控制器在 "App\Http\Controllers\Admin" 命名空间下});子域名路由Route::group(['domain' => '{account}.myapp.com'], function () { Route::get('user/{id}', function ($account, $id) { // });});路由前缀Route::group(['prefix' => 'admin'], function () { Route::get('users', function () { // 匹配 "/admin/users" URL });});表单办法伪造<form action="/foo/bar" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{ csrf_token() }}"></form>或应用辅助函数 method_field : ...

January 30, 2023 · 2 min · jiezi

关于lavarel:最为常用的Laravel操作1Eloquent模型

疾速入门更换表名protected $table = 'my_flights';更换主键名称protected $primaryKey = 'id';留神: Eloquent 默认主键字段是自增的整型数据, 这意味着主键将会被主动转化为 int 类型, 如果你想要应用非自增或非数字类型主键, 必须在对应模型中设置 $incrementing 属性为 false , 如果主键不是整型, 还要设置 $keyType 属性值为 string. 敞开工夫戳记录public $timestamps = false;获取模型数据// Eloquent 的 all 办法返回模型表的所有后果$flights = App\Flight::all();foreach ($flights as $flight) { echo $flight->name;}// 增加约束条件$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();获取单个模型// 通过主键获取模型$flight = App\Flight::find(1);// 获取匹配查问条件的第一个模型$flight = App\Flight::where('active', 1)->first();// 通过传递主键数组来调用 find 办法, 这将会返回匹配记录汇合$flights = App\Flight::find([1, 2, 3]);获取聚合后果$count = App\Flight::where('active', 1)->count();$max = App\Flight::where('active', 1)->max('price');插入记录$flight = new Flight;$flight->name = $request->name;$flight->save();更新模型$flight = App\Flight::find(1);$flight->name = 'New Flight Name';$flight->save();批量更新App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);删除模型// 删除$flight = App\Flight::find(1);$flight->delete();// 通过主键删除模型App\Flight::destroy(1);App\Flight::destroy([1, 2, 3]);App\Flight::destroy(1, 2, 3);// 通过查问删除模型$deletedRows = App\Flight::where('active', 0)->delete();软删除// Eloquent 模型use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model{ use SoftDeletes; /** * 应该被调整为日期的属性 * * @var array */ protected $dates = ['deleted_at'];}// 数据表构造增加 deleted_at 列Schema::table('flights', function ($table) { $table->softDeletes();});// 判断给定模型实例是否被软删除, 能够应用 trashed 办法if ($flight->trashed()) { // ...}// 查问被软删除的模型$flights = App\Flight::withTrashed() ->where('account_id', 1) ->get();$flight->history()->withTrashed()->get();// 只获取软删除模型$flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get();// 复原软删除模型$flight->restore();// 应用 restore 办法来疾速复原多个模型, 不会触发任何模型事件App\Flight::withTrashed() ->where('airline_id', 1) ->restore();$flight->history()->restore();本地作用域/** * 只蕴含沉闷用户的查问作用域 * * @return \Illuminate\Database\Eloquent\Builder */public function scopePopular($query){ return $query->where('votes', '>', 100);}/** * 只蕴含激活用户的查问作用域 * * @return \Illuminate\Database\Eloquent\Builder */public function scopeActive($query){ return $query->where('active', 1);}// 应用本地作用域$users = App\User::popular()->active()->orderBy('created_at')->get();动静作用域/** * 让查问只蕴含给定类型的用户 * * @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database\Eloquent\Builder */public function scopeOfType($query, $type){ return $query->where('type', $type);}// 应用动静作用域$users = App\User::ofType('admin')->get();模型关联一对一关联// 领有class User extends Model{ /** * 获取关联到用户的手机 */ public function phone() { // Phone : 关联的模型 // Phone : user_id 外键 // User : id 主键 return $this->hasOne('App\Phone', 'user_id', 'id'); }}// 所属class Phone extends Model{ /** * 获取领有该手机的用户 */ public function user() { // User : 所属的模型 // Phone : user_id 外键 // User : id 父模型主键 return $this->belongsTo('App\User', 'user_id', 'id'); }}// 空模型class Article extends Model{ /** * 获取文章作者 */ public function user() { return $this->belongsTo('App\User')->withDefault(function ($user) { $user->name = 'Guest Author'; }); }}一对多关联// 领有class Post extends Model{ /** * 获取博客文章的评论 */ public function comments() { // Comment : 关联的模型 // Comment : post_id 外键 // Post : id 主键 return $this->hasMany('App\Comment', 'post_id', 'id'); }}// 所属class Comment extends Model{ /** * 获取评论对应的博客文章 */ public function post() { // Post : 关联的模型 // Comment : post_id 外键 // Post : id 父模型主键 return $this->belongsTo('App\Post', 'post_id', 'id'); }}多对多关联// 关联class User extends Model{ /** * 用户角色 */ public function roles() { // Role : 关联的模型 // user_roles : 两头表名称 // user_id : 对应到模型主键 // role_id : 对应到关联主键 return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id'); }}// 获取两头表字段, 通过 pivot 属性$user = App\User::find(1);foreach ($user->roles as $role) { echo $role->pivot->created_at;}// 当 pivot 表蕴含额定的属性时, 必须定义关联时先指定return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');// 主动蕴含created_at 和 updated_atreturn $this->belongsToMany('App\Role')->withTimestamps();// 更换 pivot 为 subscription, 晋升可读性return $this->belongsToMany('App\Podcast') ->as('subscription') ->withTimestamps();$users = User::with('podcasts')->get();foreach ($users->flatMap->podcasts as $podcast) { echo $podcast->subscription->created_at;}渴求式加载// select * from books$books = App\Book::all();// select * from authors where id in (1, 2, 3, 4, 5, ...)$books = App\Book::with('author')->get();foreach ($books as $book) { echo $book->author->name;}// 渴求式加载多个关联关系$books = App\Book::with('author', 'publisher')->get();// 嵌套的渴求式加载$books = App\Book::with('author.contacts')->get();// 渴求式加载指定字段// 注: 应用这个个性时, id 字段是必须列出的$users = App\Book::with('author:id,name')->get(); // 带条件束缚的渴求式加载$users = App\User::with(['posts' => function ($query) { $query->where('title', 'like', '%first%');}])->get();插入 / 更新关联模型// 插入关联模型$comment = new App\Comment(['message' => 'A new comment.']);$post = App\Post::find(1);// 调用 comments 办法获取关联关系实例, save 将增加 post_id 到 Comment 模型中$post->comments()->save($comment);// 保留多个关联模型$post = App\Post::find(1);$post->comments()->saveMany([ new App\Comment(['message' => 'A new comment.']), new App\Comment(['message' => 'Another comment.']),]);// 应用 create 创立, 与 save 不同的是, 它j接管一个关联数组, create 办法遵循模型属性的批量赋值操作$post = App\Post::find(1);$comment = $post->comments()->create([ 'message' => 'A new comment.',]);// 保留多个关联模型$post = App\Post::find(1);$post->comments()->createMany([ [ 'message' => 'A new comment.', ], [ 'message' => 'Another new comment.', ],]);// 更新隶属关联关系 (belongsTo)$account = App\Account::find(10);// associate 办法会在子模型设置外键$user->account()->associate($account);$user->save();// 移除关联 (belongsTo) // dissociate 办法会设置关联关系的外键为 null$user->account()->dissociate();$user->save();附加 / 拆散多对多关联模型$user = App\User::find(1);// 在连贯模型的两头表中插入记录$user->roles()->attach($roleId);// 插入数据和附加的数组到两头表$user->roles()->attach($roleId, ['expires' => $expires]);// 从两头表中移除相应的记录: 指定用户移除某个角色$user->roles()->detach($roleId);// 从两头表中移除相应的记录: 指定用户移除所有角色$user->roles()->detach();// attach 和 detach 还接管数组模式的 ID 作为输出$user = App\User::find(1);$user->roles()->detach([1, 2, 3]);$user->roles()->attach([ 1 => ['expires' => $expires], 2 => ['expires' => $expires]]);在两头表上保留额定数据解决多对多关联时, save 办法接管两头表数组作为第二个参数: ...

January 29, 2023 · 5 min · jiezi

关于lavarel:Laravel中HasOne和BelongsTo的区别

hasOne 和 belongsTo 是 Laravel中用于定义一对一关系的关系办法。 hasOne 示意以后模型有一个关联模型。这意味着,如果你有一个用户模型和一个材料模型,并且每个用户只有一个材料,则你能够在用户模型中应用 hasOne 办法来定义这种关系。 belongsTo 示意以后模型属于一个关联模型。这意味着,如果你有一个材料模型和一个用户模型,并且每个材料属于一个用户,则你能够在材料模型中应用 belongsTo 办法来定义这种关系。 这两种办法的应用形式相似,然而它们的意义相同。你须要依据理论状况确定应用哪种办法。 例如,如果你想在用户模型中定义一对一关系,能够应用如下代码: class User extends Model{ public function profile() { return $this->hasOne(Profile::class); }}如果你想在材料模型中定义一对一关系,能够应用如下代码: class Profile extends Model{ public function user() { return $this->belongsTo(User::class); }}在这两种状况下,你都能够应用 Eloquent 关系来查问关联数据。 hasOne 和 belongsTo 都是 Laravel Eloquent ORM 中用于定义一对一关系的关系办法,它们都是基于 Eloquent 关系的形象。 底层实现上,hasOne 和 belongsTo 并没有太大的区别。它们都是通过定义关联模型的外键和以后模型的主键来建设关系的。 从底层实现上来看,hasOne 和 belongsTo 是类似的。它们的区别次要体现在它们所示意的关系的方向上。hasOne 示意以后模型有一个关联模型,而 belongsTo 示意以后模型属于一个关联模型。

December 20, 2022 · 1 min · jiezi

关于lavarel:使用pipeline设计模式实现用户积分任务需求

背景背景就是产品经理提了一个需要,实现工作赠送积分(不能应用),签收后积分理论到账,如果遇到退款须要回收积分,工作是大略是这样的: 每天首次退出购物车赠送 10 积分每天首单能够赠送 100 积分购物累积金额达到 99 元赠送 100 积分购物次数满 10 次赠送 100 积分每日签到送 10 积分还有很多奇奇怪怪的工作...实现过程剖析当退出购物车时赠送积分,工作完结,当购买商品时就有可能会同时命中多个条件同时赠送积分,命中的所有条件都赠送后,工作完结。 剖析完需要,接下来就想如何实现,最简略的办法也就是 if else 实现: // 领取胜利触发赠送积分if ("当天首单") { // Reward shopping points }if ("累积99元") { // Reward shopping points }if ("买满10次") { // Reward shopping points }// ...提需要的时候产品曾经想到二期的积分工作需要了,所以随着工作的增多,可维护性肯定会升高,所以立马否决了用if else 实现的想法 紧接着想到了之前做领取时用到的「简略工厂」+ 「策略模式」教训,应该是有符合要求的设计模式能解决这类问题。因为整体流程是一条直线的流程,顺次执行,就想到责任链模式。通过查问相干材料,责任链模式的变种「管道模式」仿佛更适宜利用至此。 管道模式管道模式也称为流水线模式,英文:Pipeline。看到 Pipeline 这个单词十分相熟,仿佛在那里见过,思来想去,是在 Laravel 外面见过,之前剖析 Laravel 依赖注入和管制反转 时见到过。 Laravel 通过 Pipeline 实现 Middleware: https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Http/Kernel.php#L131 use Illuminate\Routing\Pipeline;protected function sendRequestThroughRouter($request){ $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter());}持续往上追 Pipeline 的实现,发现 Laravel 是实现了一个 Pipleline 契约接口,实现了两个管道别离是专用的Pipleline和一个 Routing 相干的 Pipleline,其中Routing Pipleline是继承了专用的 Pipleline 重写了局部办法。 ...

August 2, 2022 · 2 min · jiezi

关于lavarel:基于javassmmysql实现的房屋公寓出租网平台租赁平台

 博主介绍:✌退职Java研发工程师、专一于程序设计、源码分享、技术交换、专一于Java技术畛域和毕业设计✌项目名称基于java+ssm+mysql实现的屋宇|公寓出租网平台|租赁平台 视频成果https://www.bilibili.com/vide... 基于java_ssm_mysql实现的屋宇_公寓出租网平台 零碎阐明前端应用技术:JSP,HTML5,CSS3、JavaScript等 后盾应用技术:Spring、SpringMvc、Mybatis(SSM)等 数据库:Mysql数据库 我的项目性能介绍: 本零碎为基于jsp+ssm+mysql的房租出租网,性能如下: 前台网页:查看并搜寻所有的屋宇状况,登录、注册、预约房租、用户能够在集体核心查看我的订单、我的材料、需改明码。 后盾治理:零碎设置、用户治理、系统日志、屋宇治理、用户治理、租赁治理。 零碎性能残缺,应用目前支流框架ssm,适宜作为毕业设计、课程设计、数据库大作业。 环境须要1.运行环境:最好是java jdk 1.8,咱们在这个平台上运行的。其余版本实践上也能够。2.IDE环境:IDEA,Eclipse,Myeclipse都能够。举荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven我的项目:否; 技术栈 后端:Spring+SpringMVC+Mybatis前端:JSP+CSS+JavaScript+jQuery应用阐明 应用Navicat或者其它工具,在mysql中创立对应名称的数据库,并导入我的项目的sql文件;应用IDEA/Eclipse/MyEclipse导入我的项目,Eclipse/MyEclipse导入时,若为maven我的项目请抉择maven;若为maven我的项目,导入胜利后请执行maven clean;maven install命令,而后运行;将我的项目中springmvc-servlet.xml配置文件中的数据库配置改为本人的配置;运行我的项目,在浏览器中输出http://localhost:8080/ 登录运行截图  用户管理控制层:package com.houserss.controller; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody; import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo; /** Created by admin */@Controller@RequestMapping("/user/")public class UserController { @Autowiredprivate IUserService iUserService;/** * 用户登录 * @param username * @param password * @param session * @return */@RequestMapping(value = "login.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> login(User user,String uvcode, HttpSession session){ String code = (String)session.getAttribute("validationCode"); if(StringUtils.isNotBlank(code)) { if(!code.equalsIgnoreCase(uvcode)) { return ServerResponse.createByErrorMessage("验证码不正确"); } } ServerResponse<User> response = iUserService.login(user.getUsername(),user.getPassword()); if(response.isSuccess()){ session.setAttribute(Const.CURRENT_USER,response.getData()); } return response;}}管理员管理控制层: ...

July 12, 2022 · 4 min · jiezi

关于lavarel:ModStart快速CRUD

疾速CRUD在一些根底的场合,Grid、Form、Detail 具备高度的类似,能够合并应用一个疾速的 CRUD 工具。 根本应用先来个例子,数据库中有 news 表 CREATE TABLE `news` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `cover` varchar(200) COLLATE utf8_unicode_ci NOT NULL, `summary` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `content` text, `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;上面的代码能够生成表 news 的数据表格 <?phpnamespace App\Admin\Controller;use Illuminate\Routing\Controller;use ModStart\Admin\Concern\HasAdminQuickCRUD;use ModStart\Admin\Layout\AdminCRUDBuilder;class NewsController extends Controller{ use HasAdminQuickCRUD; protected function crud(AdminCRUDBuilder $builder) { $builder ->init('news') ->field(function ($builder) { $builder->id('id','ID'); $builder->text('title', '名称'); $builder->image('cover', '封面'); $builder->textarea('summary', '摘要'); $builder->richHtml('content', '内容'); $builder->display('created_at', '创立工夫'); $builder->display('updated_at', '更新工夫'); }) ->title('新闻治理'); }}字段反对显示 display$builder->display('field','名称');单行文本 text$builder->text('field', '名称');多选 checkbox$builder->checkbox('field', '名称');标签 tags$builder->tags('field', '名称');代码 code$builder->code('field', '名称');树状组件 tree$builder->tree('field', '名称');类型 type$builder->type('field', '类型');明码 password$builder->password('field', '类型');单张图片 image$builder->image('field', '类型');多张图片 images$builder->type('field', '类型');多张图片(长期门路) imagesTemp$builder->type('field', '类型');链接 link$builder->link('field', '类型');开关 switch$builder->switch('field', '类型');多行文本 textarea$builder->textarea('field', '类型');色彩 color$builder->color('field', '类型');日期 date$builder->date('field', '类型');日期工夫 datetime$builder->datetime('field', '类型');工夫 time$builder->time('field', '类型');单选 radio$builder->radio('field', '类型');下拉 select$builder->select('field', '类型');富文本 richHtml$builder->richHtml('field', '类型');Markdown markdown$builder->markdown('field', '类型');键值对列表 keyValueList$builder->keyValueList('field', '类型');多值 values$builder->values('field', '类型');HTML html$builder->html('field', '类型');数字 number$builder->number('field', '类型');百分比 percent$builder->percent('field', '类型');小数 decimal$builder->decimal('field', '类型');货币 currency$builder->currency('field', '类型');ID id$builder->id('field', '类型');验证码 captcha$builder->captcha('field', '类型');临时文件 fileTemp$builder->fileTemp('field', '类型');文件 file$builder->file('field', '类型');视频 video$builder->video('field', '类型');音频 audio$builder->audio('field', '类型');中国地区 areaChina$builder->areaChina('field', '类型');暗藏域 hidden$builder->hidden('field', '类型');图标 icon$builder->icon('field', '类型');更多内置组件请参照 ModStart\Support\Manager\FieldManager 中的定义 ...

July 8, 2022 · 1 min · jiezi

关于lavarel:ModStartCMS-模块化建站系统-v380

ModStartCMS V3.8.0 模块搜寻反对,本地视频反对零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 零碎演示 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V3.8.0版本更新2022年04月24日ModStartCMS公布v3.8.0版本,减少了以下13个个性: [新性能] 新增余额领取性能[新性能] 模块卸载版本检测生效问题[新性能] 移除 elasticsearch 依赖(应用模块反对)[新性能] 默认敞开性能监控日志[新性能] 系统升级文件写入权限查看校验[新性能] data-ajax-request默认为POST形式[新性能] 渲染辅助函数[新性能] Grid 新增 Has 过滤器[新性能] 多模块搜寻提供者切换[新性能] UEditor反对本地视频插入[新性能] 系统升级文件写入权限查看校验[新性能] 头部菜单在特定比例下浮动异样[Bug修复] 模块卸载版本检测生效问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 功能模块 零碎演示与文档零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download码云仓库:https://gitee.com/modstartGithub仓库:https://github.com/modstart开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

April 24, 2022 · 1 min · jiezi

关于lavarel:ModStart迁移环境后出现访问500错误

呈现相似如下谬误 Failed opening required 'xxx/module/Vendor/Web/routes.php' **Stack trace:#0 {main}零碎在运行时为了进步性能会缓存局部文件门路,在新环境如果门路不统一会导致缓存文件加载失败。只须要革除缓存即可,步骤如下: Tips:删除目录中的所有文件,留神不要删除目录自身,实现后重试 删除 bootstrap/cache/ 中的所有文件删除 storage/framework/cache/ 中的所有文件

February 16, 2022 · 1 min · jiezi

关于lavarel:ModStart忘记后台用户或密码怎么办

为了平安起见,零碎不反对后盾用户明码的找回。如果遗记后盾治理明码,只须要应用业余数据库工具批改后盾用户表 admin_user 即可。 批改对应的用户 password 和 passwordSalt 字段。 password: 3c20ecadec461ce77179008a44850334passwordSalt: KUBg1mMi5I对应的登录明码为:123456 SQL参考 UPDATE admin_user SET password='3c20ecadec461ce77179008a44850334',passwordSalt='KUBg1mMi5I'WHERE username = '用户名';

February 16, 2022 · 1 min · jiezi

关于lavarel:Linux运维-创建和启用Swap交换区

如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不减少物理内存的状况下,启用swap替换区作为虚拟内存是一个不错的抉择,如果硬盘应用的是 SSD,失常读写速度都在 300MB/s 以上,启用 swap 后性能进步了不少,特地是在解决耗费大内存的脚本方面。创立替换区准则: 创立的swap替换区大小应该大于理论物理内存的容量大小,然而不要过大,免得造成硬盘空间节约。如果内存IO申请频繁,而繁多swap替换区IO队列等待时间过长的话,能够多创立几个swap替换区。原则上优先在IO速度最快的设施上创立。 (1)创立swap替换区硬盘存储用的空白文件。通常创立物理内存2~2.5倍大小的文件作为替换区。 创立一个1个G的SWAP替换区空白文件dd if=/dev/zero of=/swap bs=1M count=1024复制代码(2)应用mkswap格式化文件为swap文件系统 -f 应用文件作为swap替换区mkswap -f /swap 设定为举荐的 0600 权限chmod 0600 /swap复制代码(3)启用方才创立的Swap文件swapon /swap复制代码(4)如果有必要能够设置开机主动启用swap文件替换区,批改/etc/fstab,减少一行 启动即启用swap/swap swap swap defaults 0 0复制代码(5)如果不须要启用swap或须要调整swap大小,能够应用swapoff命令敞开swap。 敞开swapswapoff /swap复制代码敞开swap后删除对应的swap文件即可删除swap替换区,如须要调整swap替换区大小,从第一部开始从新创立即可。

February 14, 2022 · 1 min · jiezi

关于lavarel:ModStartCMS模块化万能建站系统v320-兼容环境检测-自动审核驱动

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 ModStartCMS公布v3.2.0版本,新性能和Bug修复累计22项,兼容环境检测 主动审核驱动。 2022年02月11日ModStartCMS公布v3.2.0版本,减少了以下22个个性: ·[新性能] Type 字段减少 CanCascadeFields ·[新性能] 富文本代码丑化库 prettyCode.js ·[新性能] 代码格式化格调配置文件 ·[新性能] 模块装置兼容环境检测(目前 laravel5 和 laravel9 ) ·[新性能] 平台操作系统检测工具包 ·[新性能] 图片审核和文字审核驱动 ·[新性能] Job 中新增动态文件门路补全办法 ·[新性能] Grid 筛选默认值(文本、下拉、单选) ·[新性能] 可降级模块筛选,显示零碎可降级的模块 ·[新性能] 本地模块筛选Tab,只显示本地模块 ·[新性能] 用户VIP为空时,默认初始化VIP等级 ·[新性能] 用户VIP减少图标 ·[新性能] 用户首页显示VIP数据信息 ·[新性能] Banner批量删除性能 ·[新性能] 二级导航性能 ·[新性能] 导航批量删除性能 ·[新性能] 导航地位Tab切换 ·[系统优化] 列表操作文字款式优化 ·[系统优化] 内容审核后盾详情新增待审核列表 ·[系统优化] 事件触发兼容不同 Laravel 版本 ·[系统优化] 后盾主动降级Token存储优化 ·[系统优化] 移除局部依赖,零碎部署更轻便 前台演示: http://cms.demo.tecmz.com/ 后盾演示: http://cms.demo.tecmz.com/admin ...

February 11, 2022 · 1 min · jiezi

关于lavarel:laravel数组json及空数组的判断

1、对于数组中蕴含json,援用其中json数据时: [{ username:"a", password:"b"}] 则通过定位到数组中的具体位置之后,通过->办法应用 $userinfo[0]->password 2、判断数组是否为空的办法为,调用数组外部函数: $userinfo->isEmpty()

February 9, 2022 · 1 min · jiezi

关于lavarel:laravel的csrf鉴权取消

1、在这文件中: 正文掉即可:

February 9, 2022 · 1 min · jiezi

关于lavarel:Laravel-9-已经发布快来看看吧

Laravel 9 曾经公布,最新 Release 有许多个性,比方最低要求 PHP v8.0、控制器路由组、全新的谬误页面、Scout 数据库引擎、全新的邮件组件集成、Flysystem 3.x、数据库存取晋升等。 开始这些新个性之前,须要阐明下从 Laravel 9 开始,每12个月的打算安顿(之前是每6个月): Laravel 应用很多社区包集成在框架中,包含 Symfony 相干组件。因为 Symfony 6.0 公布延期了,才导致了 Laravel 9.0 直到 2022 年才公布。因为延期公布,咱们必须要等到 2022 年 9 月就能够将根底的Symfony组件降级到Symfony 6.0。此外,因为咱们的年度公布总是在 Symfony 公布两个月后进行,这为咱们将来的公布提供了更好的参考。 从 反对政策 文档,以下是行将公布的暂定日期的预期: 版本 PHP (*) 公布 Bug修复 平安修复6 (LTS) 7.2 - 8.0 September 3rd, 2019 January 25th, 2022 September 6th, 20227 7.2 - 8.0 March 3rd, 2020 October 6th, 2020 March 3rd, 20218 7.3 - 8.1 September 8th, 2020 July 26th, 2022 January 24th, 20239 (LTS) 8.0 - 8.1 February 8th, 2022 February 8th, 2024 February 8th, 202510 8.0 - 8.1 February 7th, 2023 August 7th, 2024 February 7th, 2025Laravel 9 是下一个长期反对版本(LTS),将在2024年2月之前承受谬误修复,并在2025年2月之前承受平安修复。以下是咱们在之前的帖子介绍的一些 Laravel 9 的新个性: ...

February 9, 2022 · 1 min · jiezi

关于lavarel:一招解决迁移到ModStart后链接不兼容问题

如果您之前应用的是其余 CMS 零碎,想要降级到新的 ModStart 零碎后,心愿放弃原有已收录的链接不变,应用「CMS链接加强」模块能够一招搞定。 第一步下载安装「CMS链接加强」模块 第二步在CMS链接加强设置中,设置原有的内容页面规定。 这一步的目标是进步匹配效率,默认的路由不会皮牌到内容页,须要配置全门路路由规定。 第三步在栏目设置中设置「加强全门路」、「加强全门路分页」,在内容页设置「加强全门路」,即可放弃原有的零碎链接不变。 ](/img/bVcXJcL) 快去下载体验吧~ https://modstart.com/m/CmsUrlMix

February 5, 2022 · 1 min · jiezi

关于lavarel:ModStartCMS模块化万能建站系统v310-API接口支持小程序上线

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 ModStartCMS公布v3.1.0版本,新性能和Bug修复累计8项,API接口反对,小程序上线。 2022年01月26日ModStartCMS公布v3.1.0版本,减少了以下8个个性: ·[新性能] API接口全面反对,接口文档补全 ·[新性能] 模块市场新增本地模块筛选、可降级筛选 ·[系统优化] 一般表单提交Loading优化 ·[系统优化] Web版调用解决逻辑优化 ·[系统优化] 模块不存在时卸载失败优化 ·[Bug修复] 修复已知若干问题 ·[Bug修复] SEO信息批改不失效问题 ·[Bug修复] 修复曾经若干问题 零碎演示: https://cms.demo.tecmz.com/ 下载试用: https://modstart.com/download

January 26, 2022 · 1 min · jiezi

关于lavarel:ModStart模块问答上线助力开发者和使用者更好的交流

锵锵锵~ ModStart曾经悄悄上线问答功能模块,为开发者提供和模块使用者提供更好的交流平台。让咱们一起来看如何应用吧~ 在模块页面的问答,点击提出问题,填写问题题目和发问补充,设置分类,即可实现问答的提交。 回答者在回复您的问题后,您能够抉择驳回该用户的答案,同时该用户将会取得响应的积分。 快来体验吧~ https://modstart.com/m/Demo/ask

January 22, 2022 · 1 min · jiezi

关于lavarel:ModStart安装模块后系统报错打不开

装置模块后零碎报错打不开第1步,删除装置的模块 module/Xxx 目录,尝试刷新页面关上,如果打不开请执行第2步第2步,革除缓存(删除 bootstrap/cache/ 和 storage/framework/cache 目录中的所有文件,留神不要删除目录自身),实现后重试

January 16, 2022 · 1 min · jiezi

关于lavarel:基于Laravel模块化极速开发框架-免费开源ModStart

零碎简介ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能一览会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理自应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博)第三方领取反对(微信、支付宝),微信反对PC端扫码领取第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)技术栈LaraveljQueryVueElement UILayUI 零碎个性简洁优雅、灵便可扩大后盾RBAC权限治理Ajax页面无刷新组件按需加载动态资源内置丰盛的表格罕用性能内置文件上传,无需繁琐的开发模块市场,只需在治理页面点击鼠标即可实现模块的装置、更新和卸载等操作 零碎演示源码地址 / Gitee源码地址 / GitHub前台演示地址http://cms.demo.tecmz.com/ 用户明码自行注册 后盾演示地址http://cms.demo.tecmz.com/admin账号:demo 明码:123456 (演示账号为只读权限) 模块市场丰盛的模块市场,后盾一键装置模块利用 开发文档https://modstart.com/doc 零碎文档不断完善中 零碎装置环境要求PHP >= 5.6MySQL >= 5.0PHP Extension:FileinfoApache/Nginx 装置阐明宝塔一键装置教程:https://modstart.com/doc/install/baota.htmlPHPStudy一键装置教程:https://modstart.com/doc/install/phpstudy.htmlWampServer装置教程:https://modstart.com/doc/install/wampserver.htmlDocker一键装置教程:https://modstart.com/doc/install/docker.html原生环境装置教程:https://modstart.com/doc/install/start.html降级指南参照 https://modstart.com/doc/install/upgrade.html 常见问题咱们列举了常见问题,请查看官网规范指南 https://modstart.com/doc/install/qa.html 如有其余问题举荐应用官网探讨交换群或在线探讨 https://modstart.com/forum 开发速看以下以一个简略的新闻增删改查页面为例,疾速理解 ModStart 开发的大抵流程。 数据表迁徙文件class CreateNews extends Migration{ public function up() { Schema::create('news', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); $table->string('title', 200)->nullable()->comment(''); $table->string('cover', 200)->nullable()->comment(''); $table->string('summary', 200)->nullable()->comment(''); $table->text('content')->nullable()->comment(''); }); } public function down() { // }}控制器代码class NewsController extends Controller{ use HasAdminQuickCRUD; protected function crud(AdminCRUDBuilder $builder) { $builder ->init('news') ->field(function ($builder) { $builder->id('id','ID'); $builder->text('title', '名称'); $builder->image('cover', '封面'); $builder->textarea('summary', '摘要'); $builder->richHtml('content', '内容'); $builder->display('created_at', '创立工夫'); $builder->display('updated_at', '更新工夫'); }) ->gridFilter(function (GridFilter $filter) { $filter->eq('id', 'ID'); $filter->like('title', '题目'); }) ->title('新闻治理'); }}减少路由和导航在 routes.php 减少路由信息 ...

January 12, 2022 · 1 min · jiezi

关于lavarel:ModStart模块需求墙上线啦现在即可提交需求给模块开发者

为不便模块开发者和模块使用者交换,模块需要墙已全面上线,当初即可提交需要给模块开发者。 在模块右侧进入模块需要墙,能够间接提交模块需要给开发者。 填写模块需要信息 在模块需要墙能够查看收集中、开发中、已上线的需要。 在模块开发者核心,模块开发者能够治理模块需要

January 10, 2022 · 1 min · jiezi

关于lavarel:ModStartCMS万能建站系统主题开发教程

主题开发教程ModStart中的所有第三方统称为模块,模板主题也是一个模块,以 CmsTheme 结尾,如 CmsThemeBlue、CmsThemeGreen 等。 创立主题模块应用 模块开发助手 能够疾速的帮您创立模板主题模块。 通过 系统管理 → 模块开发助手 → 新建CMS主题模块 能够实现主题模块的疾速创立。 如果您须要手动创立模板主题模块,请参照 CMS开发演示模板 。 主题模块构造CmsThemeMyTest├── Admin│ ├── Controller│ │ └── ConfigController.php → 后盾配置文件│ └── routes.php├── Asset → 主题资源文件│ ├── css│ │ └── theme.css│ └── js│ └── theme.js├── Core│ └── ModuleServiceProvider.php → 模块外围注册器├── Docs → 模块文档│ ├── doc│ │ └── Manual.md│ ├── module│ │ ├── content.md│ │ ├── demo.md│ │ ├── mobilePreview.md│ │ └── preview.md│ └── release│ └── 1.0.0.md├── Provider│ └── ThemeSiteTemplateProvider.php → 主题注册器├── View → 模块视图主目录│ └── pc → 自适应默认为PC│ ├── cms│ │ ├── list → 列表视图│ │ │ ├── cases.blade.php│ │ │ ├── default.blade.php│ │ │ ├── job.blade.php│ │ │ ├── news.blade.php│ │ │ └── product.blade.php│ │ ├── detail → 详情视图│ │ │ ├── cases.blade.php│ │ │ ├── default.blade.php│ │ │ ├── job.blade.php│ │ │ ├── news.blade.php│ │ │ └── product.blade.php│ │ ├── form → 表单视图│ │ │ └── default.blade.php│ │ ├── page → 单页视图│ │ │ └── default.blade.php│ │ ├── index.blade.php│ ├── footer.blade.php│ ├── frame.blade.php → 模板框架视图│ └── header.blade.php├── config.json → 模块配置文件└── demo_data.php → 演示数据初始化视图文件优先级主题的视图文件( .blade.php 结尾)可能呈现在多个地位,零碎在渲染视图的时候会依照以下优先级查找直到匹配胜利: ...

December 20, 2021 · 4 min · jiezi

关于lavarel:Laravel框架之请求Request篇

How局部1. 接管申请1.1 Request 根本应用要通过 依赖注入 获取以后 HTTP 申请实例,你应该在控制器上引入 Illuminate\Http\Request 类。传入的申请实例将会由 服务容器 主动注入。<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{ public function store(Request $request) { $name = $request->input('name'); // }}1.2 Request 的罕用办法路由局部 // GET 形式申请,输入后果对应 Part oneRoute::get('test/request', 'App\Http\Controllers\TestController@testGet');// POST 形式申请,输入后果对应 Part TwoRoute::post('test/request', 'App\Http\Controllers\TestController@testPost');控制器局部 <?phpuse Illuminate\Http\Request;class TestController extends Controller{ // Part One: 针对 url(GET | http://127.0.0.1:8000/test/request?name=bert) public function testGet(Request $request) { // 获取申请门路(路由中的 uri 局部) $request->path(); //打印输出:"test/request" // 获取申请的 url(不带 get 申请参数) $request->url(); //打印输出:"http://127.0.0.1:8000/test/request" // 获取残缺的 url(带 get 申请参数) $request->fullUrl(); //打印输出:"http://127.0.0.1:8000/test/request?name=bert" // 获取 request 申请形式 $request->method(); //打印输出:"GET" // 或申请端口 $request->getPort(); //打印输出:8000 } // Part Two: 针对 url(Post | http://127.0.0.1:8000/test/request?company=Tencent&name=bert&finger=king) /** * form-data参数: * name=kinra * option[]=A * option[]=B * option[]=C * key=null */ public function testPost(Request $request) { // 获取申请门路 dump($request->path()); //打印输出:"test/request" // 获取申请的 url(不带参数) dump($request->url()); //打印输出:"http://127.0.0.1:8000/test/request" // 获取残缺的 url(带参数) dump($request->fullUrl()); //打印输出:"http://127.0.0.1:8000/test/request?company=anflk&finger=king&name=bert" // 获取申请办法 dump($request->method()); //打印输出:"POST" // 获取申请接口 dump($request->getPort()); //打印输出:8000 // 获取申请要求返回的格局 dump($request->format()); //打印输出:"html" // 获取申请参数。 dump($request->query()); //打印输出:["company" => "Tencent", "name" => "bert", "finger" => "king"] dump($request->input()); //打印输出:["name" => "kinra", "option" => [0 => "A", 1 => "B", 2 => "C"], "key" => null, "company" => "Tencent", "finger" => "king"] dump($request->all()); //打印输出:["name" => "kinra", "option" => [0 => "A", 1 => "B", 2 => "C"], "key" => null, "company" => "Tencent", "finger" => "king"] // 获取某一申请参数的值 dump($request->input('company')); //打印输出:"Tencent" dump($request->company); //打印输出:"Tencent" dump($request->input('name')); //打印输出:"kinra" dump($request->query('name')); //打印输出:"bert" // 获取申请参数是数组,其中的某个值 dump($request->input('option.0')); //打印输出:"A" // 判断输出值是否存在 // Ⅰ. has 来判断以后申请中是否含有指定的值 dump($request->has('name')); //打印输出:true dump($request->has('namd')); //打印输出:false // Ⅱ. 当给定一个数组时,has 将会判断指定的值是否全副存在 dump($request->has(['name', 'company'])); //打印输出:true dump($request->has(['name', 'email'])); //打印输出:false // Ⅲ. hasAny 办法将会在指定的值有一个存在的状况下返回 true dump($request->hasAny(['name', 'email'])); //打印输出:true dump($request->hasAny(['pwd', 'email'])); //打印输出:false // Ⅳ. 如果你想要判断一个值在申请中是否存在,并且不为空,能够应用 filled 办法 dump($request->filled('name')); //打印输出:true dump($request->filled('key')); //打印输出:false }}留神: ...

July 7, 2021 · 2 min · jiezi

关于lavarel:Laravel框架之控制器基础

what 局部1. 控制器的概念1.1 为什么要应用控制器?让咱们思考一个问题:当咱们将全副的申请解决逻辑都通过闭包函数来解决,而不是通过控制器类来组织相干的申请解决逻辑,这将导致什么的影响? 这将导致以下几个问题: 首先,将全副的申请解决逻辑都交给路由的闭包函数解决,意味着所有的逻辑代码都写在路由文件中。这将造成路由文件体积很大。其次,所有的逻辑代码写在一个文件里,会造成代码构造凌乱,无奈正当高效地治理代码。再次,所有的逻辑代码糅杂在一起,各性能之间会导致强耦合关系。不合乎“高内聚,低耦合”的开发准则。应用控制器的几个长处: 路由的定义更加简洁。管制行为的路由能够被缓存,而闭包的路由不会被缓存,路由缓存将会大幅升高利用路由的注册工夫。控制器将相干的申请解决逻辑封装成一个控制器类内的不同办法,更加合乎“高内聚,低耦合的”开发准则(解耦),程序的代码构造更加清晰,代码治理起来也更加容易。1.2 控制器的定义形象定义:控制器是MVC中的C层,是"承前启后"的一个管制转发层。收集来自http的申请参数,并将这些参数传递给Model层。但在理论开发中,咱们通常在Controller层和Model层两头形象出Service层,专门用来进行业务逻辑解决。 代码定义如下: <?phpnamespace App\Http\Controllers;use App\Services\UsersService as Service;use Illuminate\Http\Request;class UsersController extends Controller{ protected $request; protected $service; public function __construct(Request $request, Service $service) { $this->request = $request; $this->service = $service; } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // return 'hello world'; return $this->service->index(); }}值得指出的是:控制器不是必须继承根底类 Controller。然而如果控制器没有继承根底类,将无奈应用一些便捷的性能,比方middleware(),validate()和dispatch()等办法。 2. 控制器的分类提醒:当注册单个行为控制器的路由时不须要指名办法。 分类名称路由中的用法蕴含的办法artisan命令根底控制器Route::get('photos', 'PhotoController@index');自定义php artisan make:controller PhotoController单行为控制器Route::get('photos', PhotoController::class);1个。__invoke()php artisan make:controller PhotoController --invokable资源控制器Route::resource('photos', PhotoController::class);或Route::resources(['photos' => PhotoController::class]);7个。index()、create()、store()、show()、edit()、update()、destroy()php artisan make:controller PhotoController --resourceApi资源控制器Route::apiResource('photos', PhotoController::class);或Route::apiResources(['photos', PhotoController::class]);5个。index()、store()、show()、update()、destroy()php artisan make:controller PhotoController --api补充资源控制器: ...

July 7, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证令牌作用域详解

配置后端利用在后端利用 blog 中通过 Passport::tokensCan 定义 API 认证的令牌作用域。关上 AuthServiceProvider 服务提供者类,在 boot 办法中调用该办法,设置三个令牌作用域: // 令牌作用域Passport::tokensCan([ 'basic-user-info' => '获取用户名、邮箱信息', 'all-user-info' => '获取用户所有信息', 'get-post-info' => '获取文章详细信息',]);关上 app/Http/Kernel.php,在 $routeMiddleware 属性中引入两个中间件: 'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,scopes 用于查看传入令牌作用域是否蕴含所有指定中间件参数,scope 用于查看传入令牌作用域是否蕴含任意指定中间件参数。 在 routes/api.php 中新增一个获取文章详情信息的路由,并批改路由定义如下: Route::middleware('auth:api')->group(function () { Route::get('/user', function (Request $request) { $user = $request->user(); if ($user->tokenCan('all-user-info')) { // 如果用户令牌有获取所有信息权限,返回所有用户字段 return $user; } // 否则返回用户名和邮箱等根本信息 return ['name' => $user->name, 'email' => $user->email]; })->middleware('scope:basic-user-info,all-user-info'); Route::get('/post/{id}', function (Request $request, $id) { return \App\Post::find($id); })->middleware('scopes:get-post-info');});第一个路由利用了 scope 中间件,要求传入令牌作用域蕴含 basic-user-info 或 all-user-info 任意一个即可,并且在路由闭包中依据用户具体字段获取权限进一步进行了细分; ...

May 28, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证隐式授权令牌

隐式受权令牌和通过受权码获取令牌有点相似,但不须要获取受权码就能够将令牌返回给客户端,通常实用于同一个公司自有零碎之间的认证,尤其是客户端利用不能平安存储令牌信息的时候。 后端系统设置首先在后端系统 AuthServiceProvider 的 boot 办法中调用 enableImplicitGrant 办法: public function boot(){ // 启用隐式受权令牌 Passport::enableImplicitGrant();}在开放平台 blog 中注册对应的测试利用 testapp,在 blog 我的项目根目录下运行以下命令来注册 testapp: php artisan passport:client --personal> > testapp> http://app.test/auth/implicit/callback# 显示后果CLIENT_ID=13CLIENT_SECRET=GDTgIeNVsQ5tPFbok55deciO5My2TSRtv2FYFFHM前端利用设置在 routes/web.php 外面注册对应的隐式认证路由: Route::get('/auth/implicit', 'Auth\LoginController@implicit');Route::get('/auth/implicit/callback', 'Auth\LoginController@implicitCallback');在控制器 LoginController 中编写 implicit 和 implicitCallback 办法: public function implicit(){ $query = http_build_query([ 'client_id' => 13, 'redirect_uri' => 'http://app.test/auth/callback', 'response_type' => 'token', 'scope' => '', ]); return redirect('http://blog.test/oauth/authorize?'.$query);}public function implicitCallback(Request $request){ dd($request->get('access_token'));}在 auth/implicit 路由中发送认证申请到后端系统的 oauth/authorize 路由,如果认证胜利会将令牌信息通过传入的 redirect_uri 链接回跳的时候返回。 ...

May 28, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证沙箱测试篇私人访问令牌

私人访问令牌这种受权形式比拟非凡,不须要受权码,也不须要用户输出登录凭证,而是用户给本人颁发拜访令牌。这种受权形式在用户测试、体验平台提供的认证 API 接口时十分不便,比方微信开放平台和支付宝开发平台都有沙箱测试模式,在这种测试模式下获取受权令牌的形式其实就是通过私人访问令牌来实现的。 在后端系统注册测试利用在开放平台 blog 中注册对应的测试利用 testapp,在 blog 我的项目根目录下运行以下命令来注册 testapp: php artisan passport:client --personal> testapp# 显示后果CLIENT_ID=14CLIENT_SECRET=HImtGXC1CdG2LvhUpdp3y81IjuyrP0rLUPP8gisg获取拜访令牌批改模型类: use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;use Laravel\Passport\HasApiTokens;class User extends Authenticatable{ use HasApiTokens, Notifiable; ...在 routes/web.php 中定义一个新的路由,用于测试获取拜访令牌: Route::get('auth/personal', 'Auth\LoginController@personal');在控制器 LoginController 编写对应的办法 personal: public function personal(){ $user = User::where('name', '测试用户')->first(); $token = $user->createToken('Users')->accessToken; dd($token);}拜访 http://blog.test/auth/personal 就能够获取到该用户的拜访令牌了。生成的令牌记录能够在 oauth_access_tokens 数据表中找到,私人访问令牌默认是长期有效的。 拿到这个令牌之后咱们就能够通过它拜访认证接口了。 拜访认证接口以 Postman 为例,把下面获取到的令牌拷贝到 Bearer Token 头外面,拜访 blog.test/api/user 接口,就能够获取到以后认证用户的信息了。

May 26, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证开放平台篇客户端凭证令牌

客户端凭证令牌的受权形式不须要走典型的登录或受权重定向流程,实用于后端与后端利用之间的接口认证,相似做微信、支付宝开放平台开发,须要先申请本人的利用,申请通过后,这些开放平台会给开发者调配对应的 APP ID 和 APP SECRET。而后开发者通过这个 APP ID 和 APP SECRET 去开放平台获取 Token(令牌),最初拿着这个令牌去拜访认证资源即可。客户端凭证令牌也是这个思路。 以测试项目 testapp 作为客户端利用,把后端我的项目 blog 作为相似微信、支付宝的开放平台。 在开放平台注册客户端利用在开放平台 blog 中注册对应的客户端利用 testapp,在 blog 我的项目根目录下运行以下命令来注册 testapp: php artisan passport:client> > testapp> http://app.test/auth/callback# 显示后果CLIENT_ID=11CLIENT_SECRET=XKmtGXC1CdG2LvhUpdp3y81IjuyrP0rLUPPq8reg在客户端利用中定义路由和控制器在客户端利用中定义获取令牌的路由,在 routes/web.php 新增上面行代码: Route::get('/auth/client', 'Auth\LoginController@client');而后在 LoginController 控制器中编写对应的 client 办法: public function client(){ $http = new Client(); $response = $http->post('http://blog.test/oauth/token', [ 'form_params' => [ 'grant_type' => 'client_credentials', 'client_id' => 11, // your client id 'client_secret' => 'XKmtGXC1CdG2LvhUpdp3y81IjuyrP0rLUPPq8reg', // your client secret 'scope' => '*' ], ]); return response($response->getBody());}测试客户端利用拜访开放平台认证接口在浏览器中拜访 http://app.test/auth/client,就能够获取到拜访令牌了。 ...

May 26, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证第三方应用篇授权码获取令牌

把待接入的第三方利用看作前端零碎,把本人的平台看作后端系统。 在后端系统注册第三方利用在后端利用 blog 中注册对应的第三方利用 testapp,在 blog 我的项目根目录下运行以下命令来注册 testapp: php artisan passport:client> > testapp> http://app.test/auth/callback# 显示后果CLIENT_ID=9CLIENT_SECRET=Xde5hsAbpEU8MMjwELFh6RNOzxX2LsrxgFTZvXkP编写第三方利用路由和控制器第一步是到后端系统申请受权,如果用户在后端系统没有登录须要先登录,登录之后让用户确认受权,受权之后通过 callback 配置的跳转地址回跳到前端利用,并且在 URL 中带上受权码,而后用户再通过这个受权码获取拜访令牌,拿到拜访令牌之后就能够申请后端系统认证 API 接口了。 所以,须要在前端利用的 routes/web.php 中新增两个路由: 一个用于申请受权获取受权码一个用于从后端利用跳转回来,通过受权码在回跳的路由中发动后端申请获取令牌Route::get('/auth', 'Auth\LoginController@oauth');Route::get('/auth/callback', 'Auth\LoginController@callback');public function oauth(){ $query = http_build_query([ 'client_id' => 9, 'redirect_uri' => 'http://app.test/auth/callback', 'response_type' => 'code', 'scope' => '', ]); return redirect('http://blog.test/oauth/authorize?' . $query);}public function callback(Request $request){ $code = $request->get('code'); if (!$code) { dd('受权失败'); } $http = new Client(); $response = $http->post('http://blog.test/oauth/token', [ 'form_params' => [ 'grant_type' => 'authorization_code', 'client_id' => 9, // your client id 'client_secret' => "Xde5hsAbpEU8MMjwELFh6RNOzxX2LsrxgFTZvXkP", // your client secret 'redirect_uri' => 'http://app.test/auth/callback', 'code' => $code, ], ]); return response($response->getBody());}测试通过受权码获取令牌在浏览器中拜访 http://app.test/auth,在第三方利用中通过后端系统进行受权认证,如果在后端利用 blog.test 上还没有登录,会先跳转到登录页面,登录之后则跳转到确认受权页面。 ...

May 23, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证移动端应用篇密码授权令牌

创立一个挪动端测试利用composer create-project --prefer-dist laravel/laravel testapp要让挪动端利用和后端利用之间进行受权认证,须要在后端利用 blog 中注册对应的挪动端利用 testapp,在 blog 我的项目根目录下运行以下命令来注册 testapp: php artisan passport:client --passwordtestapp# 显示后果CLIENT_ID=7CLIENT_SECRET=2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco在 testapp 利用中,将借助 Laravel 自带的认证脚手架疾速实现认证路由和视图,以实现登录表单和申请提交: php artisan make:auth在 Auth/LoginController 控制器中重写 login 办法,将默认到数据库查问用户登录凭证的逻辑改为将申请发送到后端利用获取受权令牌: // 在控制器顶部引入如下命名空间use GuzzleHttp\Client;use Illuminate\Http\Request;// 重写 AuthenticatesUsers 中的 login 办法public function login(Request $request){ $request->validate([ 'email' => 'required|string', 'password' => 'required|string', ]); $http = new Client(); // 发送相干字段到后端利用获取受权令牌 $response = $http->post('http://blog.test/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => 7, 'client_secret' => "2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco", 'username' => $request->input('email'), 'password' => $request->input('password'), 'scope' => '*' ], ]); return response($response->getBody());}拜访挪动端利用登录页面 http://app.test/login,输出在后端利用 blog 中注册过的用户信息,点击登录,会将用户登录凭证和利用配置传递到后端利用的 oauth/token 路由,通过后端利用中 Passport 底层的明码受权类进行校验,校验胜利后就会返回令牌信息给挪动端利用。 ...

May 23, 2021 · 1 min · jiezi

关于lavarel:Laravel-通过-Passport-实现-API-请求认证基于-Cookie-的同域名应用篇

同域名利用能够应用框架自带的登录页面(基于Session)实现登录,登录胜利后应用laravel_token(基于Cookie)实现 API 申请认证。 装置 & 初始化composer require laravel/passportphp artisan migrate# 执行 passport 的装置过程php artisan passport:install在 storage 目录下生成 oauth-private.key 和 oauth-public.key,别离为 OAuth 服务的私钥和公钥,用于平安令牌的加密解密。在 oauth_clients 数据表中初始化两条记录,相当于注册两个客户端利用,一个用于明码受权令牌认证,一个用于私人访问令牌认证。批改模型类use Laravel\Passport\HasApiTokens;class User extends Authenticatable{ # 该 Trait 中蕴含了受权令牌与客户端的相干办法 use HasApiTokens, Notifiable; ...}注册 API 认证相干路由use Laravel\Passport\Passport;public function boot(){ // API 认证路由注册 Passport::routes();}默认提供的路由控制器位于 \Laravel\Passport\Http\Controllers 命名空间下,并且路由前缀为 /oauth。 批改配置文件批改配置文件 config/auth.php,将 API 认证驱动由 token 批改为 passport: 'guards' => [ ... 'api' => [ 'driver' => 'passport', 'provider' => 'users', ],],单页面利用 API 认证如果 API 认证只用于客户端 JavaScript 与后端接口的交互,比方同域名利用,没必要走简单的跳转受权流程,能够在 App\Http\Kernel 的 $middlewareGroups 中新增一个 CreateFreshApiToken 中间件来实现: ...

May 23, 2021 · 1 min · jiezi

关于lavarel:Laravel-的配置文件加载源码分析

Laravel 的配置缓存被保留在 bootstrap/cache/config.php 文件中。这个文件就是把 config 文件夹的所有文件合并成了一个大的配置文件。config.php 间接返回一个数组,数组的键名对应 config 文件夹下的文件名,数组的值对应 config 文件夹下文件返回的配置信息。 源码剖析应用到配置缓存文件的类: class Application extends Container implements ApplicationContract, HttpKernelInterface{ // 获取配置缓存文件的门路 public function getCachedConfigPath() { return $this->normalizeCachePath('APP_CONFIG_CACHE', 'cache/config.php'); } // 利用配置是否曾经缓存(即配置缓存文件是否存在) public function configurationIsCached() { return file_exists($this->getCachedConfigPath()); }调用到 getCachedConfigPath() 的类: class LoadConfiguration{ // 利用启动 public function bootstrap(Application $app) { $items = []; // 如果配置文件已缓存,则间接加载;否则遍历每个配置文件而后全副加载。 if (file_exists($cached = $app->getCachedConfigPath())) { $items = require $cached; $loadedFromCache = true; } // 遍历配置目录中的所有配置文件,并逐个加载到仓库中 // 使配置选项对于开发者来说在利用的各个局部中均可用 $app->instance('config', $config = new Repository($items)); if (! isset($loadedFromCache)) { $this->loadConfigurationFiles($app, $config); } // 依据加载的配置值设置应用程序的环境。 $app->detectEnvironment(function () use ($config) { return $config->get('app.env', 'production'); }); date_default_timezone_set($config->get('app.timezone', 'UTC')); mb_internal_encoding('UTF-8'); }}调用到 configurationIsCached() 的类: ...

May 17, 2021 · 1 min · jiezi