当前位置: 首页 > news >正文

创建laravel 12项目

首先是下载herd,官网是:https://herd.laravel.com/windows,就是laravel官网发布的软件,pro一年费用99美元,功能如下:

之前使用过learnku推荐的homestead,后来使用wmapserver,后来发现安装php8.4有点麻烦,使用herd反而是最简单的,而且,herd免费版本还提供ssl,这个体验比较好,自己安装openssl,浏览器还是会有红色提醒,体验不好。

 打开 open sites,一个新的窗口,就可以创建新项目了,点两下就建好了一个最新版本的laravel项目了,目前最新的是laravel 12.10.2

建好laravel12项目,使用vscode打开,先设置好时区,.env中: 

APP_LOCALE=zh_CN
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=zh_tw

生成模拟数据,选择tw,这样fakerphp/faker生成段落,会是繁体中文的内容,还有一个在config/app.php里,设置时区:

    'timezone' => 'PRC',

这样时间跟本地电脑的时间就是一样的,不然就是比本地电脑的时间早8个小时。

我准备使用的是layui作为前端显示UI框架,需要把相关的layui下载下来,放到resources文件夹里:

在css/app.css里面引入css样式, 

@import "../res/layui/css/layui.css";
@import "../res/adminui/dist/css/admin.css";.ws-footer {padding: 10px;line-height: 30px;text-align: center;color: #777;
}

在js/aap.js里面引入css样式,这样在模板页就只需要引入js就可以了。

import '../css/app.css';

layui需要在具体页面里执行js代码,加载layui的相关资源,所以在js/app.js里引入layui.js,似乎不起作用,我的作法是在具体页面直接引入public里面的相关layui资源,放在resources文件夹里,是为了vite压缩,所以在部署的时候,需要执行npm run build,这一步可以把resources里面的res资源拷贝到public/build文件夹里,需要做到这样的拷贝,需要安装一个npm开发依赖包,vite-plugin-static-copy:

npm i vite-plugin-static-copy -D

因为只有开发的时候才会用到拷贝资源到public/build文件夹。除了安装这个依赖包,还需要在vite.config.js配置文件里配置一下:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import { viteStaticCopy } from 'vite-plugin-static-copy';export default defineConfig({plugins: [laravel({input: ['resources/css/app.css', 'resources/js/app.js'],refresh: true,}),viteStaticCopy({targets: [{src: 'resources/res/*',dest: 'res',},],})],
});

需要在本地或者服务器执行一次npm run build,这样才会拷贝res到public/build文件夹,最后就是在模板也引入js了:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{$title ?? 'All'}} - Star</title>@vite('resources/js/app.js')<script src="/build/res/layui/layui.js"></script>
</head>
<body><x-app.nav /><div class="layui-container">{{ $slot }}</div><x-app.footer />
</body>
</html>

我设定的首页在views目录下的app/app.blade.php,模板及页头页脚放在views/components/app/文件夹下,通用模块放在components/common文件夹下。准备把各种链接、按钮都模块化,比如链接的通用模块:

common/a.blade.php<a href="{{ $url }}" target="{{ $blank ?? '' ? '_blank':'' }}" style="color: {{ $color ?? '' }};font-weight:{{$bold ?? '' ? 'bold':''}};">{{ $title ?? '' }}</a>common/nav-dd-a.blade.php<dd><a href="{{ route($route) }}"><i class="layui-icon layui-icon-{{ $icon ?? '' }}" style="margin-right: 10px;"></i> {{ $title }}</a>
</dd>common/nav-li-a.blade.php<li class="layui-nav-item {{ $showxs ?? "layui-hide-xs" }} {{ request()->is($name) ? "layui-this" : "" }}"><a href="{{ route($route) }}">{{ $title }}<span class="{{ $showdot ?? '' ? 'layui-badge-dot' : 'layui-hide' }}"></span></a>
</li>

这样尽可能的把所有的链接都模块化,在更上一层的模块里,比如页头导航栏,或者页脚的footer里,就减少了重复出来的样式等代码了,只要有重复的地方,就尽可能的模块化,减少重复。

nav.blade.php<div class="layui-nav"><div class="layui-container"><ul class="layui-nav layui-nav-left"><x-common.nav-li-a :title="'首页'" :route="'home'" :name="'/'" :showxs="true" /><x-common.nav-li-a :title="'说说'" :route="'shuo'" :name="'shuo'" :showxs="true" /><x-common.nav-li-a :title="'时间线'" :route="'timeline'" :name="'timeline'" :showdot=" 'Auth::user()'" /></ul><ul class="layui-nav layui-layout-right">@if(Auth::check())<x-common.nav-li-a :title="'用户列表'" :route="'user.index'" :name="'user*'" :showdot="true" /><li class="layui-nav-item" lay-unselect><a href="javascript:;"><img src="{{ Auth::user()->gravatar() }}" class="layui-nav-img"></a><dl class="layui-nav-child"><x-common.nav-dd-a :title="'个人中心'" :icon="'username'" :route="'user.show'" /><hr /><x-common.nav-dd-a :title="'设置'" :icon="'set'" :route="'user.edit'" /><hr /><x-common.nav-dd-a :title="'退出'" :icon="'logout'" :route="'user.logout'" /></dl></li>@else<x-common.nav-li-a :title="'注册'" :route="'reg'" :name="'reg'" :showxs="true" /><x-common.nav-li-a :title="'登录'" :route="'login'" :name="'login'" :showxs="true" />@endif</ul></div>
</div>footer.blade.php<div class="ws-footer layui-container"><p>Copyright © 2025<x-common.a :url="'/'" :title="'行天下'" /></p><p id="LAY-footer-info"><x-common.a  :url="'https://layui.dev/docs/2/'" :blank="true" :title="'layui'" /><x-common.a :url="'https://dev.layuion.com/'" :blank="true" :title="'静态主题'"/></p><p>鸣谢:<x-common.a :url="'https://layui.dev/docs/2/'" :blank="true" :color="'#23A7E8'" :title="'又拍云'" :bold="true" /><x-common.a :url="'https://gitee.com/'" :blank="true" :color="'#C71D23'" :title="'Gitee'" :bold="true" /><x-common.a :url="'https://www.iconfont.cn'" :blank="true" :color="'#9B16FF'" :title="'iconfont'" :bold="true" /></p>
</div>

 界面大概就是下面这样:

相关文章:

  • [GXYCTF2019]Ping Ping Ping
  • 驯龙日记:用Pandas驾驭数据的野性
  • 在AWS Glue中实现缓慢变化维度(SCD)的三种类型
  • 深圳市富力达:SAP一体化管理助力精密制造升级 | 工博科技SAP客户案例
  • 织梦dedecms网站如何修改上一篇下一篇的标题字数
  • 【Flutter】Flutter + Unity 插件结构与通信接口封装
  • 光场的相位与偏振
  • 详解 Unreal Engine(虚幻引擎)
  • 开源网络入侵检测与防御系统:Snort
  • Spark SQL开发实战:从IDEA环境搭建到UDF/UDAF自定义函数实现
  • Maven下载aspose依赖失败的解决方法
  • BeeWorks Meet更适合企业内部使用的原因
  • Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
  • streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发
  • 前端浏览器窗口交互完全指南:从基础操作到高级控制
  • 论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断
  • [计算机科学#3]:布尔逻辑 (计算机数学基础)
  • 【中级软件设计师】编译和解释程序的翻译阶段、符号表 (附软考真题)
  • Lua 第10部分 模式匹配
  • 【嵌入式八股22】排序算法与哈希算法
  • 王星昊再胜连笑,夺得中国围棋天元赛冠军
  • 十四届全国人大常委会第十五次会议继续审议民营经济促进法草案
  • 五万吨级半潜船在沪完成装备装载
  • 《奇袭白虎团》原型人物之一赵顺合辞世,享年95岁
  • 人社部:对个人加大就业补贴支持,对企业加大扩岗支持
  • 视觉周刊|2025上海车展的科技范