做独立站的第一笔账往往不是服务器,是商城系统。SaaS 版按月抽成、插件另收费,买断版几千块起步,二次开发还得排队。想把数据握在自己手里、前台随便改,最后大多会走到自建这条路上。
Bagisto 是这条路上比较省心的一个。它用 Laravel 11 打底、Vue 做前台,PHP 8.2 就能跑,MIT 协议,社区星标 2.8 万。装完不是空壳:131 张表、424 条路由(其中 300 条挂在后台)、11 件示例商品、3 个分类、17 张商品图,前台开箱就能点着逛。
v2.3.19 我从零装了两遍。成品包里的依赖已经铺好,composer 那一步可以跳过:Windows 侧解压 2.48 秒,bagisto:install 22.50 秒,artisan serve 首屏 2.78 秒;Linux 侧拿同一份锁文件也跑通,安装 23 秒、首屏 2 秒。两平台 10 个页面全部 200,商品详情页的响应字节完全一致。也有不适合的人:服务器挤不出 400MB 空间的、不想碰命令行的、只想卖卡密的,最后一段单独说。
它是什么,和别的商城程序差在哪
- 技术栈:Laravel 11.48.0 + Vue,PHP 要求 ^8.2,数据库 MySQL 8
- 规模:131 张表、424 条路由(222 条 GET,300 条在后台)、示例数据 11 件商品 / 3 个分类 / 17 张商品图
- 前台资源已预编译:主题的 build 清单 24 项、产物 26 个文件,不用再跑 npm 构建
- 后台是独立入口
/admin,商品、分类、订单、客户、配置各成一块 - 许可:MIT,商用、改代码、闭源分发都不受限
它和发卡类程序不是一类东西。那种店没有分类树、没有购物车、没有物流,一条线走到底;Bagisto 是真商城:分类、商品变体、购物车、结账、会员账户、后台订单流全都在。和「WordPress 套 WooCommerce」也不一样,那套靠插件堆功能,它是一体的。
我的测试环境
- Windows 11,PHP 8.2.20(NTS,VC++ 2019 x64),MySQL 8.0.29,composer 2.1.6
- Linux:WSL2 里的 Ubuntu 26.04,PHP 8.5.4,MySQL 8.0.29,同一份 composer.lock
- 服务:
php artisan serve,Windows 侧端口 9200,6 个 worker 进程 - 截图:桌面 1400 宽、deviceScaleFactor 1、fullPage,6 张;手机 390 宽、deviceScaleFactor 2,3 张
- 成品包:143.41MB,vendor 已包含在内
原先计划在真实服务器上验证 Linux 侧,赶上机器根分区写满、面板终端无响应,改用 WSL2 完成。这一项算环境差异,记录在此。
安装:Windows 本地跑起来
第一步先把 8 个 PHP 扩展确认一遍,缺一个后面会失败在安装脚本里:
calendar curl intl mbstring openssl pdo pdo_mysql tokenizer然后建库:
CREATE DATABASE bagisto DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;解压源码(实测 4006 个条目、2894 个文件、164.51MB,2.48 秒),进目录:
composer install
cp .env.example .env
php artisan key:generatecomposer install 是全程最慢的一步,干净网络下 342.24 秒,装出 15543 个文件。成品包里这一步已经做完了,直接进下一步。
改 .env 里的数据库连接,然后把 APP_ENV 改成 local——这一行不是可选项,下面的坑里会说为什么:
APP_ENV=local
APP_DEBUG=true
DB_DATABASE=bagisto
DB_USERNAME=root
DB_PASSWORD=你的密码库建好、键生成完,直接跑安装:
php artisan bagisto:install脚本会建表、灌示例数据、生成管理员。实测 22.50 秒,落 131 张表,管理员 1 个,示例数据 11 件商品、3 个分类(建管理员 0.07 秒,灌数据 0.42 秒)。
最后把存储软链接接上,否则商品图片全是破图:
php artisan storage:link启动:
php artisan serve --port=9200首次请求 2.78 秒,之后首页 63 毫秒,页面 229,108 字节。
安装:Linux 侧
Linux 侧的操作和 Windows 一模一样,PHP 从 8.2 换到 8.5 时只有 composer 那一步会卡住:
phpspreadsheet requires php <8.5
sabberworm/php-css-parser requires php <=8.4锁文件里写着平台约束,PHP 8.5 直装会被拒;加 --ignore-platform-reqs 能绕过,但依赖下载长时间卡住。更稳的做法是复用 Windows 侧同一份 vendor 树,再重新生成自动加载文件:
composer dump-autoload实测 9 秒,12786 个文件、317MB。接着 php artisan bagisto:install 23 秒、示例数据 11 / 3 / 131、首屏 2 秒,10 个页面同样全 200。
两平台对比的结论要说得准一些:
- 完全一致:路由数 222、后台路由 300、manifest 24 项、build 26 个文件、表 131 张、商品 11 件、分类 3 个、Laravel 11.48.0、MySQL 8.0.29
- 逐字节一致:分类页 262,077 字节、商品详情页 333,019 字节、购物车 151,936 字节、会员登录 46,586 字节、后台登录 31,827 字节
- 有差异:首页 229,068 与 228,824(差 244 字节,页面里有时间和随机串),搜索页与两个 CMS 页面各差 40 字节(CSRF token 长度)
装完之后先做这四件事
- 登录
/admin,先把管理员口令改掉。安装脚本建的是默认账号,不改等于门开着 - 把
.env的APP_ENV改回production、APP_DEBUG改false。开发模式会把堆栈和路径直接打在页面上 - 建第一个分类和第一件商品,顺手传一张图。传完去前台看图片能不能显示,这一步能同时验证存储软链接和目录权限
- 把示例数据清掉或下架。库存里那 11 件商品是为了让你看清页面结构,不是拿来卖的
实测数据
- 成品包:143.41MB,解压 18406 个条目,12.84 秒
- Windows 全新安装:解压 2.48 秒 / composer install 342.24 秒(15543 个文件)/ bagisto:install 22.50 秒
- 示例数据:11 件商品、3 个分类、17 张商品图、131 张表、1 个管理员
- 应用体积:安装后 382.8MB、18907 个文件
- 路由:424 条,其中 GET 222 条,后台 300 条
- 首屏:2.78 秒(首次)、63 毫秒(之后),首页 229,108 字节
- 10 个 URL 全 200:首页、分类页、商品详情页、购物车、会员登录、会员注册、后台登录、搜索、联系我们、CMS 页面
- 最慢的一页是商品详情页 463 毫秒,搜索页 276 毫秒,其余都在 250 毫秒以内
- Linux 侧:安装 23 秒、首屏 2 秒、10 个页面全 200、0 个非 200
- 前端构建:manifest 24 项、产物 26 个文件,无需 npm
- 截图 9 张(桌面 6 / 手机 3),抓取过程 0 个 4xx、0 条 JS 报错
界面长什么样
前台首页,Banner 加新品区,下方是按分类切的商品块:

分类页,左侧筛选、右上排序,商品卡片带价格和加购按钮:

商品详情页,大图、规格选择、加购、评价区都在一屏里:

购物车是独立路由 /checkout/cart,没登录也能加:

会员登录页:

后台登录页长得和前台完全不一样,一个独立入口:

进去是仪表盘,左侧一整列菜单,商品、订单、客户、配置分组都在:

商品列表带缩略图、SKU、价格、库存、状态几列,示例商品 11 条:

390 宽度下首页的排版,Banner 和商品卡片会自己折行:

一个真实的坑
APP_ENV=production 时,bagisto:install 会停下来等一句确认,而它等的那句确认在非交互的终端里根本送不进去,脚本直接以 255 退出,全程没有一句报错。我第一遍就是这么失败的。
解决只有一行:APP_ENV=local,再跑一次,22.50 秒走完。
坑的连锁反应更烦人。因为第一遍退出了,表压根没建,紧接着的补数据步骤报错——它默认表已经在了。补跑的时候要按顺序来:先 bagisto:install 成功,再灌示例数据,最后 storage:link。三步顺序错了,中间那步失败不会回滚,只能重新建库重来。
另外 storage:link 第二次跑会报 The [...] link already exists,这是错误提示但它不是新问题,可以忽略;真要重来,先手动删掉 public/storage 再执行。
上线:从本地挪到服务器
- 站点根必须指到
public/目录,不是项目根。指错的话首页会变成一个目录列表,或者直接把.env暴露出来 - 装上之后跑一次
php artisan storage:link,再确认public/storage指向storage/app/public - 目录权限:
storage与bootstrap/cache要可写,所有者给运行 PHP 的用户 artisan serve只适合本地验证,它是单进程的。对外用 nginx + php-fpm,把APP_ENV切回production- 数据库用 MySQL 8,字符集
utf8mb4。表名、排序规则对不上时,最直接的报错就是登录页一片空白
这几类人适合,这几类不适合
适合:
- 要一个功能齐全的自建商城,不想从零写购物车和订单
- 服务器能给 PHP 8.2 和一片 400MB 以上的空间
- 需要多语言、多币种、多店铺这几个能力
- 想改前台样式,前端资源已经编译好,改样式不用重建整条构建链
不适合:
- 只想卖卡密、不需要购物车的。那种场景有更轻的程序,没必要背 131 张表
- 服务器只有 512MB 内存还跑着别的站。装完应用目录 382.8MB,给 MySQL 也要留地方
- 完全不想碰命令行。安装、建表、软链接全是命令,没有图形安装向导能替代
- 期待开箱就是生产态。示例数据、默认账号、开发配置都要自己收拾一遍
常见问题
{collapse-item label="首页能开,商品图片全是破图?"}A:public/storage 这个软链接没建。跑 php artisan storage:link。如果提示链接已存在,说明之前建过但目标不对,删掉重来。{/collapse-item}
{collapse-item label="PHP 8.4 或 8.5 上 composer install 装不动?"}A:锁文件里有平台约束,个别依赖要求低于 8.5。用 PHP 8.2 装,或者复用一份 8.2 环境装好的依赖再 composer dump-autoload。实测 8.2 与 8.5 跑起来的页面字节完全一致。{/collapse-item}
{collapse-item label="装完有多少张表?示例数据能删吗?"}A:131 张表。示例数据是 11 件商品、3 个分类、17 张图,后台可以逐条删,也可以直接清库重装一次只跑建表那步。{/collapse-item}
{collapse-item label="前台打开很慢,第一次要好几秒?"}A:首次请求要预编译视图和路由缓存,实测 2.78 秒,之后就落到 63 毫秒。上线后跑一次 php artisan optimize 把配置和路由缓存下来。{/collapse-item}
{collapse-item label="能商用、能改代码吗?"}A:MIT 协议,商用、改代码、闭源分发都可以,保留协议文件即可。{/collapse-item}
源码获取
建议先转存到自己网盘再下载。手机上打开链接点右下角「保存到网盘」,回头在夸克 App 的「我的网盘」里取。