一句话定位:萤火商城(YoShop)是用 PHP 7.4 + ThinkPHP 6 写的前后端分离商城,一个仓库里塞了四个应用——平台后台/admin、商户后台/store、用户端接口/api、定时任务timer,靠store_id做多商户数据隔离。它「轻量」的宣传与实际体量有落差:仓库带 66 张表、474 个 PHP 文件、vendor 全量入库,共 96 MB。
| 项 | 值 |
|---|---|
| 仓库地址 | https://gitee.com/xany/yoshop2.0 |
| 项目定位 | 前后端分离的多商户电商系统(平台 + 商户 + 买家) |
| 运营主体 | 萤火科技(yiovo.com),文件头 Copyright (c) 2017~2025 |
| 开源协议 | 根目录 Apache-2.0;但 468 个 PHP 文件头写「这不是一个自由软件,不允许再发行」 |
| 后端技术栈 | PHP 7.4+、ThinkPHP 6.1.5、think-orm 2.0.53、Workerman(think-worker 3.0.6) |
| 前端 | Ant Design Vue 管理端、UNI-APP(H5 / 小程序),源码在三个独立仓库 |
| 数据库 | MySQL 5.7+,66 张表,前缀 yoshop_,按 store_id 分商户 |
| 代码规模 | 474 个 PHP 文件(app + cores)、vendor 5003 个文件入库、仓库 96 MB |
| 仓库状态 | 1 个分支 master、10 个标签(最新 v2.1.3)、510 次提交,最后提交 2026-06-19 |
| 社区热度 | Gitee 7.5K Star / 2.6K Fork / 765 Watch / 200 Open Issues / 1 PR(2026-11-10 查询) |
| 文档日期 | 2026-11-10 |
1. 项目是什么
它是「一套 PHP 后端 + 三套前端 + 一个安装向导」的多商户商城。
后端一个 ThinkPHP 6 工程,用 think-multi-app 拆成四个应用,各自有独立入口和权限体系:
| 应用 | 域名路径 | 使用者 | 职责 |
|---|---|---|---|
admin | /admin | 平台运营 | 商户管理、全局设置、页面设计、订单监管 |
store | /store | 入驻商户 | 商品、订单、售后、优惠券、统计、店铺设置 |
api | /api | 买家端(H5/小程序/APP) | 商品浏览、购物车、结算、支付、会员中心 |
timer | 命令行 | 系统 | 自动确认收货、优惠券过期、会员等级计算 |
数据层是单库多商户:yoshop_store 是「商家(商户)记录表」,自增从 10001 开始;商品、订单、地址、优惠券等表都带 store_id,靠它区分数据归属。所以它不是单店商城,而是能开多个商户的平台型系统——这一点和 README 首屏只讲「搭建个性化独立商城」的印象不一样,要看清。
三件需要先认清的事:
- 前端源码不在这个仓库。
public/admin、public/store是构建好的 Vue 产物,public下没有源码;改界面要去yoshop2.0-admin、yoshop2.0-store、yoshop2.0-uniapp三个仓库。 - 它是「源码全开源 + 禁止再发行」的组合。README 允许你自运营商用,但明确禁止把代码再发行或出售;这与根目录的 Apache-2.0 文本直接冲突,后面第 7 节细说。
- 它面向二开,不面向开箱即用。安装有向导,但
.env直接提交在仓库里、默认账号密码公开、定时任务要自己守进程,属于「开发者的脚手架」而非「交付给商家的成品」。
2. 核心特性
| 能力 | 说明 | 是否在代码中确认 |
|---|---|---|
| 多商户 | 平台 + 商户双后台,数据按 store_id 隔离 | 是,yoshop_store 及全表 store_id |
| 商品体系 | 商品、SKU、规格、规格值、分类关联、商品服务、图片 | 是,yoshop_goods* 5 张表 |
| 订单与售后 | 下单、支付、发货、收货、退款/退货、退款地址 | 是,yoshop_order* 8 张表 |
| 运费模板 | 模板 + 区域规则 | 是,yoshop_delivery、yoshop_delivery_rule |
| 优惠券 | 发放、领取、使用、过期 | 是,yoshop_coupon、yoshop_user_coupon |
| 积分 | 积分流水、抵扣 | 是,yoshop_user_points_log |
| 余额与充值 | 余额流水、充值订单、充值套餐 | 是,yoshop_user_balance_log、yoshop_recharge_* |
| 会员等级 | 等级、升级流水、等级权益 | 是,yoshop_user_grade、yoshop_user_grade_log |
| 页面 DIY | 页面装修、组件、链接选择器 | 是,yoshop_page,后台 Page.php |
| 多端 | H5、微信小程序、公众号、APP | UNI-APP 独立仓库,后端接口统一 |
| 支付 | 微信支付 V3(wechatpay/wechatpay 1.4.11)、支付宝 EasySDK 2.2.1 | 是,yoshop_payment* 3 张表 |
| 物流 | 物流公司、轨迹查询、发货单 | 是,yoshop_express;更新日志提到阿里云物流轨迹 |
| 小票打印 | 打印机配置与订单打印 | 是,yoshop_printer |
| 多存储 | 阿里云 OSS、七牛、腾讯云 COS、本地 | 是,composer 三个 SDK 全在 |
| 短信 | overtrue/easy-sms 2.2 | 是 |
| 微信生态 | overtrue/wechat 4.5,小程序设置、公众号关注组件 | 是,yoshop_wxapp_setting |
| RBAC 权限 | 商户角色、菜单、接口权限 | 是,yoshop_store_role*、yoshop_store_menu* |
没有的东西也要说清楚:代码里找不到拼团、秒杀、砍价、直播、供应商、独立分销体系。搜索「拼团」「分销」只有两处注释残留(结算参数里的 isDealer 开关、结算源码里一句「拼团商品单次限购数量」),没有对应的数据表与后台模块。拿它和主打营销玩法的商城比,营销侧是明显短板。
3. 技术架构
| 层 | 技术 | 版本 / 说明 |
|---|---|---|
| 语言 | PHP | composer 要求 7.4.0 以上;README 写 PHP 7.4 |
| 框架 | ThinkPHP | 6.1.5(README 写的是 6.0.5,两处口径不一致) |
| ORM | think-orm | 2.0.53,模型层 + 服务层分离 |
| 多应用 | think-multi-app | 1.0.14,admin / api / store / timer 四个应用 |
| 常驻进程 | think-worker + Workerman | 3.0.6,定时任务靠 php think timer start |
| 队列 | think-queue | 3.0.7(Redis 驱动) |
| 缓存 | yiovo/tp6-cache | 默认 file,.env 里可切 Redis |
| 验证码 | yiovo/tp6-captcha | 1.1.4 |
| 支付 | wechatpay 1.4.11、alipaysdk/easysdk 2.2.1 | 微信 V3 + 支付宝 |
| 微信 | overtrue/wechat 4.5.0 | 小程序、公众号 |
| 存储 | 七牛 7.4.3、阿里 OSS 2.4.3、腾讯 COS 2.5.2 | 三云 + 本地 |
| 表格导出 | phpspreadsheet 1.22.0 | 订单导出 |
| 订单号 | godruoyi/php-snowflake 3.2.1 | v2.1.3 起用雪花算法 |
| 图像处理 | kosinix/grafika | 缩略图、海报 |
结构上的四个特点:
- 多应用而不是多服务:四个应用共享同一份代码、同一个数据库、同一套模型,靠入口文件和路由区分。部署就一个 PHP 站点加一个常驻进程,比微服务简单得多,但也意味着任何一次改表都要四个应用一起回归。
- 分层是「控制器 → 服务 → 模型」:
app/{应用}/controller只做参数校验与响应,业务写在service,数据访问走model。cores/放基类、异常处理、中间件、公共 trait。 - 每个商户一套权限与菜单:
yoshop_store_role、yoshop_store_menu、yoshop_store_api三张表组成 RBAC,接口级鉴权,不是只藏菜单。 - 定时任务跑在 Workerman 里:
app/timer/command/Timer.php注册timer命令,启动后常驻执行自动确认收货、优惠券状态、会员等级等任务。它不是一个 cron 脚本,进程挂了任务就停。
4. 目录结构
| 路径 | 用途 |
|---|---|
app/admin/ | 平台后台应用:控制器、模型、服务 |
app/store/ | 商户后台应用,结构同上,规模更大 |
app/api/ | 买家端接口,28 个控制器(商品、购物车、结算、订单、优惠券、充值等) |
app/timer/ | 定时任务应用,5 个任务控制器 |
app/common/ | 公共模型、服务、枚举、监听器 |
cores/ | 框架层:BaseController、BaseModel、BaseTimer、异常、中间件、trait |
config/ | 18 个配置文件:数据库、缓存、队列、worker、支付、路由 |
route/ | 路由定义 |
public/index.php | 统一入口 |
public/admin/、public/store/ | 两个后台的 Vue 构建产物(无源码) |
public/install/ | 安装向导,含 install.sql(544 KB,66 张表) |
public/uploads/ | 上传目录 |
data/ | 运行数据目录 |
vendor/ | Composer 依赖,5003 个文件已提交入库,49 MB |
数据库修改记录/ | 各版本增量 SQL(v2.1.0 ~ v2.1.2 + 旧版本目录) |
更新日志.txt | 按版本罗列的新增、修复、优化 |
version.json | 当前版本号 2.1.3 |
think | 命令行入口 |
模块按业务分子目录,例如 app/store/controller/goods、order、market、statistics、setting,与后台菜单一一对应,接手时照菜单找代码不会迷路。
5. 快速上手
环境要求
CentOS 7+ / Nginx 1.10+ / PHP 7.4 / MySQL 5.7+。PHP 扩展按 composer.json 至少要 gd、curl、bcmath、json、pdo、openssl、mbstring、zip、redis、fileinfo。注意:即使缓存用 file,ext-redis 也是 composer 声明必需项,缺了按标准流程会直接失败。
第一步:放代码、给权限
cd /www/wwwroot
git clone --depth 1 https://gitee.com/xany/yoshop2.0.git yoshop
cd yoshop
chmod -R 755 runtime public/uploads datavendor/ 已在仓库里,正常不需要 composer install;要升级依赖再跑。
第二步:配站点与伪静态
站点根目录指向 yoshop/public,然后加 ThinkPHP 的伪静态:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}第三步:走安装向导
浏览器打开 http://你的域名/install,按五步填写数据库信息、管理员账号,向导会生成 .env 并写入 install.lock。安装完成后建议把 public/install 目录移走或改名。
数据库编码用的是 utf8 而不是 utf8mb4,商家名、商品名带 emoji 会出问题,建库时自己留意。
第四步:起定时任务
cd /www/wwwroot/yoshop
php think timer start这是常驻进程,用 supervisor 或宝塔的进程守护托管,别用 nohup 了事。它负责自动确认收货、优惠券过期、会员等级重算,停了这些状态就不会自动流转。
第五步:前端
三个仓库分别对应三个前端,都是独立工程:
| 仓库 | 用途 |
|---|---|
yoshop2.0-uniapp | 用户端 H5 / 微信小程序 |
yoshop2.0-store | 商户后台 Vue 源码 |
yoshop2.0-admin | 平台后台 Vue 源码 |
拉下来 npm install 后改接口地址指向你的域名,构建产物覆盖 public/admin、public/store 即可。移动端还要在 public/config.js 与小程序后台里配好合法域名。
验证
curl -I http://127.0.0.1/admin/
php think version后台能打开、命令行能输出 2.1.3,说明代码与环境基本对上。
6. 功能模块清单
66 张表按业务域分组,比逐个罗列更好记:
| 业务域 | 主要表 | 说明 |
|---|---|---|
| 平台与商户 | yoshop_store、yoshop_store_user、yoshop_store_role、yoshop_store_menu、yoshop_store_api、yoshop_admin_user | 商户入驻、子账号、RBAC 权限 |
| 商品 | yoshop_goods、yoshop_goods_sku、yoshop_goods_image、yoshop_goods_spec_rel、yoshop_spec、yoshop_spec_value、yoshop_category | 商品、SKU、规格、分类 |
| 交易 | yoshop_order、yoshop_order_goods、yoshop_order_address、yoshop_order_delivery、yoshop_order_delivery_goods、yoshop_order_export | 订单主从表、发货、导出 |
| 售后 | yoshop_order_refund、yoshop_order_refund_address、yoshop_order_refund_image | 退款退货全流程 |
| 支付 | yoshop_payment、yoshop_payment_template、yoshop_payment_trade | 支付方式、模板、交易流水 |
| 配送 | yoshop_delivery、yoshop_delivery_rule、yoshop_express、yoshop_store_address | 运费模板、物流公司、发货/退货地址 |
| 营销 | yoshop_coupon、yoshop_user_coupon | 优惠券发放与领取 |
| 会员 | yoshop_user、yoshop_user_grade、yoshop_user_points_log、yoshop_user_balance_log | 会员、等级、积分、余额 |
| 充值 | yoshop_recharge_plan、yoshop_recharge_order、yoshop_recharge_order_plan | 充值套餐与充值订单 |
| 内容与装修 | yoshop_page、yoshop_article、yoshop_article_category、yoshop_help | 页面 DIY、文章、帮助 |
| 评价 | yoshop_comment、yoshop_comment_image | 商品评价与晒图 |
| 文件 | yoshop_upload_file、yoshop_upload_group | 上传文件分组管理 |
| 系统 | yoshop_system_process、yoshop_printer、yoshop_wxapp_setting、yoshop_store_setting | 进程锁、小票打印、小程序配置 |
| 地域 | yoshop_region | 省市区数据 |
看表结构能得出两个判断:交易链路是完整的(下单到退款每步都有表),营销链路是残缺的(只有优惠券)。如果你的业务强依赖拼团、秒杀这类玩法,得自己建表开发,而不是「配置一下就有」。
7. 版本与授权
| 项 | 实际情况 |
|---|---|
| 代码版本 | version.json 为 2.1.3,与最新标签一致 |
| 标签 | 10 个:v2.1.3、v2.1.2、v2.1.1、v2.1.0、v2.0.8 … v2.0.3 |
| 提交 | 510 次,最后一次 2026-06-19(提交信息 v2.1.3) |
| 分支 | 仅 master |
| 发布节奏 | 更新日志逐版本记录,v2.1.x 更新较密 |
| 根目录 LICENSE | Apache-2.0 全文,附录版权行为 Copyright 2018 萤火科技 |
| 文件头 | 468 个 PHP 文件写「这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行」 |
| README 版权须知 | 允许自运营商用;须保留版权信息;禁止再发行或出售 |
三处口径互相冲突,这是本项目最需要谨慎的地方:
- Apache-2.0 明确允许再发行、允许闭源分发、允许收费,只要求保留声明与变更说明;
- 代码文件头写「不是自由软件、不允许再发行」;
- README 写「允许自运营商用,禁止再发行或出售」。
三者取交集,能确定的是:自己运营一个商城可以,把代码再分发或当产品卖不行。但严格讲,Apache-2.0 一旦授予就不可撤回,文件头与 README 属于附加限制,法律效力存疑。实际做法建议:自用按 README 的约束走(保留版权头、不转售),要做二次分发或商业交付,先向萤火科技拿书面授权,不要拿根目录那份 Apache 文本当护身符。
另一个细节:README 宣称「PHP7.4 + ThinkPHP6.0.5」,而 composer.json 锁定的是 topthink/framework 6.1.5。6.0 与 6.1 在容器、事件、多应用上有差异,遇到问题按实际装的 6.1 查文档。
8. 商业模式说明
典型的「开源版做口碑、商业版做收入、二开服务做增值」:
| 环节 | 做法 |
|---|---|
| 开源版 | 后端 + 三套前端全部开源,允许自运营商用,禁止再发行 |
| 获客 | Gitee 7.5K Star、官网演示站、文档站、QQ 交流群 |
| 商业收入 | 官网售卖商业授权、定制开发、模板与插件、部署服务 |
| 服务边界 | 官方文档只覆盖安装与小程序配置,深度二开靠付费 |
| 生态绑定 | 三个前端仓库同属一家,版本要跟后端对齐 |
开源版的定位很清楚:它是官网的流量入口和试用版。README 里「看见即所得」「最适合二开的源码」是宣传口径;可核对的客观事实是 474 个 PHP 文件、66 张表、完整的中文注释与严格类型声明——代码整洁度在同类国产 PHP 商城里确实靠前。
但要注意一个结构性事实:营销功能被明显裁剪,而营销恰恰是商家最愿意付费的部分。这不是 bug,是产品分层。
9. 生态与周边
| 项目 / 资源 | 作用 | 地址 |
|---|---|---|
| 后端(本文主角) | PHP 服务端 + 两个后台产物 | gitee.com/xany/yoshop2.0 |
| 用户端 | UNI-APP,H5 / 小程序 | gitee.com/xany/yoshop2.0-uniapp |
| 商户后台源码 | Vue + Ant Design Vue | gitee.com/xany/yoshop2.0-store |
| 平台后台源码 | Vue + Ant Design Vue | gitee.com/xany/yoshop2.0-admin |
| 官网 | 产品、授权、下载 | yiovo.com |
| 文档站 | 安装教程、小程序配置 | yiovo.com/doc |
| 演示站 | 后台演示 admin / yinghuo | shop2.yiovo.com |
| 交流群 | QQ 群 806461900 | — |
生态上要说明白:没有 Docker 镜像、没有 Helm、没有官方 Issue 处理节奏。200 个开放 Issue、1 个 PR,与 7.5K Star 严重不匹配,说明问题主要走 QQ 群消化,公开检索价值有限。文档站是独立站点,代码仓库里只有 README、安装必读、更新日志三份文字。
10. 选型建议
适合你,如果:
- 团队是 PHP 栈,想要 ThinkPHP 6 + Vue 前后端分离、代码能读能改的商城;
- 你要做多商户平台,且接受「单库 +
store_id隔离」这种较轻的隔离方式; - 你能接受营销功能只有优惠券,其余自己开发;
- 你只需要自运营,不需要把系统再分发或做成 SaaS 卖给第三方(否则授权是硬伤)。
不适合你,如果:
- 你要拼团、秒杀、砍价、分销、直播这类现成营销玩法;
- 你要求授权条款清晰无冲突(Apache-2.0 与文件头、README 打架);
- 你没有 PHP 运维能力——定时任务是常驻进程,出问题要会看 Workerman 日志;
- 你想跑在 PHP 8 上:代码按 7.4 写的,未做 8.x 兼容验证。
和同类怎么比:和 ShopWind(Yii2)、CRMEB、NIUSHOP 比,萤火的优势是代码风格统一、注释完整、严格类型模式,接手成本低;劣势是功能面窄(营销弱)、运行时旧(PHP 7.4 已停止安全支持)、社区响应靠群。如果目标是「拿一套结构清晰的地基自己长功能」,它比那些堆满插件的老商城更合适;如果目标是「开箱即有全套营销玩法」,它不合适。
11. 风险与坑
.env直接提交在仓库里:内容是DATABASE = test、USERNAME = root、PASSWORD = 123456。装完必须改,且不要把这个文件提交回自己的仓库。- 配置里有硬编码兜底:
config/database.php在env读不到时回退到yoshop_pro2/root/root。生产环境漏配.env会连上开发库名,排查时容易懵。 - 默认后台口令公开:README 写
admin/yinghuo,安装 SQL 里也 seed 了admin账号。站点上线前必须改,且/admin、/store两个入口都要加访问限制。 - 安装向导只校验 PHP 7.1:
public/install/index.php判断phpversion() < '7.1'才拦,而 composer 要求>=7.4.0。用 7.1 装能过向导,跑起来才报错。 - PHP 7.4 已停止安全支持:7.4 的官方安全维护在 2022 年底结束。长期运行要么自己打补丁,要么评估迁到 8.x 的改造成本。
- 没有数据库迁移工具:升级靠
数据库修改记录/下的 SQL 手工执行,且目录里明确写「此处 sql 文件仅做记录,安装时用不到」。跨多版本升级容易漏步骤。 - vendor 全量入库:5003 个文件、49 MB,好处是免 composer,坏处是依赖版本锁死、无法用常规手段跟进第三方漏洞。
- 多商户隔离依赖应用层:数据隔离靠每张表的
store_id条件,没有数据库级或 schema 级隔离。二开时任何一处漏加store_id条件,就是跨商户越权。 - 定时任务是常驻进程:
php think timer start挂了,自动确认收货、优惠券过期、等级重算全部停摆,且不报错。必须用进程守护并监控。 - 数据库字符集是
utf8:建库脚本用utf8(部分表utf8mb4),混用时 emoji 与四字节字符仍可能出问题,统一成utf8mb4更稳。 - 授权口径冲突:Apache-2.0 与文件头的「不允许再发行」并存。二次分发或商业交付前必须书面确认,别自行解释。
- 前端三个仓库要手动对齐:后端升级后,
public/admin是老产物就不匹配新接口。没有版本校验机制,升级要三个仓库一起看。 - Issue 积压:200 个开放 Issue、1 个 PR。遇到问题先在代码里找答案,别指望社区快速响应。