一句话定位:DSShop 是德尚网络的平台自营 B2C 多业务电商系统,PHP 8 + ThinkPHP 8 写后端,Vue 3 写后台、uni-app 写用户端,一个仓库里塞了商城、外卖、家政、知识付费、短视频五套业务,外加骑手端与师傅端。它开源得相当彻底(Apache-2.0、无授权校验、100 张表全给),但工程细节比较糙:vendor直接入库且没有composer.lock,README 里的克隆命令还是占位符。
| 项 | 值 |
|---|---|
| 仓库地址 | https://gitee.com/csdeshang/DSShop_open |
| 项目定位 | 平台自营 B2C 多业务电商(商城 / 外卖 / 家政 / 教育 / 短视频) |
| 运营方 | 德尚网络(csdeshang.com),同厂另有 DSMall、DSO2O、DSMall Pro |
| 开源协议 | Apache-2.0(根目录 LICENSE 全文,代码内无附加限制) |
| 后端技术栈 | PHP 8.0+、ThinkPHP 8.0、think-orm 3.0、think-multi-app 1.0 |
| 管理后台 | Vue 3.4.29 + Vite 5.3.1 + Element Plus 2.9.8 + TypeScript 5.4 + Pinia 2.1.7 + Tailwind 3.4.17 |
| 移动端 | uni-app(@dcloudio/uni-app 3.0.0-4070620250821001)+ Vue 3.4.21 + Vite 5.2.8 |
| 数据库 | MySQL / utf8mb4,100 张表(主库 84 + 积分商品 5 + 短视频 10 + 知识付费 1) |
| 代码规模 | php-server 4584 个 PHP 文件(vendor 3559、业务 998),后台 349 个 .vue,移动端 285 个 .vue,仓库 178 MB |
| 版本号 | config/version.php = 3.0.1,与前端 .env 的 VITE_APP_VERSION 一致 |
| 仓库状态 | 77 次提交、1 个分支 master、0 个标签、0 个 Release,最后提交 2026-10-25 |
| 社区热度 | Gitee 6.4K Star / 180 Fork / 94 Watch / 12 Issue / 0 PR(2026-11-10 查询) |
| 文档日期 | 2026-11-10 |
1. 项目是什么
它是一个「一套代码、五个 API 入口、四种业务形态」的自营商城。
后端是一个 ThinkPHP 8 多应用工程,config/app.php 里 default_app = 'api',其余按角色拆入口:
| 应用目录 | 使用者 | 控制器文件数 | 职责 |
|---|---|---|---|
api | 用户端(H5 / 小程序 / APP) | 120 | 登录、商品、购物车、下单、支付、分销、积分、短视频 |
adminapi | 平台运营后台 | 156 | 商品、订单、财务、装修、会员、营销、系统设置 |
techapi | 家政师傅端 | 12 | 接单、服务进度、收益 |
riderapi | 外卖骑手端 | 10 | 抢单、配送轨迹、配送费 |
bloggerapi | 短视频达人端 | 6 | 达人资料、短视频投稿 |
crontab | 定时任务(HTTP 触发) | 5 | 分钟/小时/日/月任务 + 队列消费 |
业务形态不是硬编码的,而是存表驱动:sys_platform 表内置 mall(商城)、food(外卖)、house(家政)、kms(视频教育)四条记录,每行对应 app/platform/<标识>/ 下一个薄壳模块,路由在启动时被动态装载(第 3 节细说)。
三件需要先认清的事:
- 它是自营,不是多商户。全库 84 张表里没有
tbl_store主表,没有入驻申请、保证金、店铺结算,也没有商户后台。能看到的tbl_store_coupon(店铺优惠券)、sys_platform.scene = store只是从同厂 DSMall 系沿用的命名,实际由平台统一发券。想开 B2B2C 多店铺,得换 DSMall,不是改配置能改出来的。 vendor进了仓库,却没有composer.lock。php-server97 MB 里 46 MB 是依赖包,而锁文件缺失意味着composer install会按composer.json的约束重新解析版本——你装出来的依赖和作者提交的可能不是同一批。- README 有不能照抄的地方。克隆命令写的是
https://github.com/your-org/dsshop.git(占位符),技术栈声称用户 PC 端是 Nuxt 的nuxt-consumer,但仓库顶层只有vue-admin、uniapp、php-server、md-images四个目录;移动端说明里的npm run build:app在package.json里也不存在(只有build:h5、build:mp-weixin)。
2. 核心特性
| 能力 | 说明 | 代码中确认 |
|---|---|---|
| 自营 B2C | 平台统一管商品、订单、结算,无商户入驻 | 是,无 tbl_store 主表,订单无 store_id |
| 四套业务形态 | 商城 / 外卖 / 家政 / 视频教育,各自独立路由与结算流程 | 是,sys_platform 4 条业务记录 + app/platform/* |
| 商品体系 | SPU、SKU、规格、规格值、分类、品牌、评价、收藏 | 是,tbl_goods* 14 张表 |
| 营销玩法 | 秒杀、批发价、会员折扣、店铺优惠券、积分抵现 | 是,tbl_goods_flashsale、tbl_goods_wholesale、tbl_goods_userdiscount、tbl_store_coupon |
| 订单 | 6 状态机(关闭/取消/待支付/已付款/已接受/已完成),支持合并支付、发票 | 是,TblOrderEnum + tbl_order_merge、tbl_order_invoice |
| 售后 | 退款申请、退款日志、退款流水 | 是,tbl_order_refund、tbl_order_refund_log、trade_refund_log |
| 支付 | 微信支付 + 支付宝,按「渠道 + 场景」存配置 | 是,yansongda/pay 3.7、trade_payment_config |
| 二级分销 | 自购佣金 + 一级 + 二级,等级按消费额/次数/邀请人数升级 | 是,distributor_level 的 base_self_ratio、parent1_ratio、parent2_ratio |
| 外卖履约 | 骑手抢单、配送轨迹、配送费规则、骑手余额与提现 | 是,rider、rider_track、rider_fee_rule、rider_balance_log |
| 家政履约 | 师傅接单、服务项关联、师傅评价、师傅提现 | 是,technician、technician_goods_rel、technician_track |
| 短视频 | 达人、短视频、点赞收藏评论、视频挂商品 | 是,video_short、video_short_goods_rel、blogger |
| 知识付费 | 课时表 | 部分,kms_lesson 仅 1 张表,KmsLessonEnum 存在 |
| 积分商城 | 积分商品、分类、兑换订单、评价 | 是,points_goods* 5 张表 |
| 会员体系 | 余额、积分、成长值、充值、提现、行为日志 | 是,user_balance_log、user_points_log、user_growth_level |
| 页面装修 | 可编辑页面 + 组件,移动端有 home/pages/diy、editable/preview | 是,editable_page、EditablePageEnum |
| 多供应商集成 | 短信、上传、地图、物流、小票机各自 providers 目录 | 是,见第 9 节 |
「多业务平台」这句要打个折:app/platform/{mall,food,house,kms} 每个只有 13~19 个文件,做的是「商品详情、购物车、下单」这几件事的薄封装,真正的业务逻辑集中在 app/deshang/service(46 个服务类)与 app/common(256 个模型/DAO/枚举)。所以它是「一套内核 + 四套外壳」,而不是四个独立系统。
3. 技术架构
| 层 | 技术 | 版本 / 说明 |
|---|---|---|
| 语言 | PHP | 8.0+(composer.json 与安装向导双重校验) |
| 框架 | ThinkPHP | 8.0,think-multi-app 做应用拆分 |
| ORM | think-orm | 3.0 |
| 鉴权 | firebase/php-jwt | 6.10,HS256,带 token_version 作废机制 |
| 支付 | yansongda/pay | 3.7,微信 + 支付宝 |
| 微信 | w7corp/easywechat | 6.17,公众号 / 小程序 / 开放平台 / APP |
| 短信 | 阿里云 Dysmsapi 3.1.2、腾讯云 | 两套 provider |
| 存储 | 本地 / 阿里云 OSS SDK 2.7 | 无腾讯云 COS 实现 |
| 表格导出 | phpoffice/phpspreadsheet | 2.1 |
| 二维码 | endroid/qr-code | 4.8 |
| 接口文档 | zircote/swagger-php | 5.0,app/swagger 目录 |
| 后台前端 | Vue 3.4.29、Vite 5.3.1、Element Plus 2.9.8、Pinia、Tailwind | vue-admin |
| 移动端 | uni-app、Vue 3.4.21、Vite 5.2.8 | uniapp,分包见第 4 节 |
| 缓存 / 锁 | ThinkPHP Cache(File 默认,Redis 可选) | KvManager 统一封装 cache/lock/counter/rateLimit |
| 队列 | 自研 DB 队列(sys_task_queue) | 无 MQ 依赖,靠 HTTP 端点消费 |
结构上的五个特点:
- 路由在启动时查库。
app/api/route/route.php与app/adminapi/route/route.php末尾都调用PlatformLoader::loadRoute(),它从sys_platform查platform != 'system'的记录,再include对应模块的route.php。也就是说每个请求注册路由阶段就访问一次数据库;数据库不可用时不是 404 而是直接 500。而且它只判断platform字段,没有检查is_enable——后台把某个应用停用,它的路由照样注册。 - 业务模块是薄壳。
platform/mall/app/api/route/route.php里只有 7 条路由(商品详情、购物车 4 条、下单 2 条),控制器把请求转给app/deshang/service下的公共服务。新增一种业务形态 = 新建目录 + 插一条sys_platform记录,这是它「可扩展」的真实含义。 - 队列不依赖 MQ。
QueueProducer把任务写进sys_task_queue,/crontab/queue/consume?batch=100由外部定时器拉起消费,app/deshang/queue/config.php里登记了 9 个 handler(订单销量增减、支付加积分、支付加成长值、登录奖励等)。好处是零中间件,坏处是队列时效完全取决于你有没有配好那条 crontab。 - 认证分两层。
JwtToken只负责签发/校验 JWT,真正的「强制下线」靠TokenCache里按role + user_id存的自增版本号;版本号对不上即拒绝。缓存驱动默认是 File,所以多机部署必须切 Redis,否则 A 机的封禁在 B 机不生效。 - 第三方能力统一走 providers。
app/deshang/third_party/{trade,sms,upload,lbs,express,printer}各有一套Base*抽象 + 具体实现,后台把密钥存config_data(sys_config或trade_payment_config),换供应商只改配置与实现类。
4. 目录结构
| 路径 | 用途 |
|---|---|
php-server/app/api | 用户端接口,按域分目录(tblGoods、tblOrder、trade、user、video…) |
php-server/app/adminapi | 后台接口,与 api 结构对称,多出 stat、system、rider、technician、blogger |
php-server/app/{techapi,riderapi,bloggerapi} | 师傅端 / 骑手端 / 达人端,各只有 order + 自身资料两类控制器 |
php-server/app/common | 模型、DAO、枚举、中间件(256 个文件),enum 下 50 个枚举是业务字典的集中地 |
php-server/app/deshang | 自研内核:base、core、exceptions、kv、queue、service、third_party、utils |
php-server/app/platform/{mall,food,house,kms} | 四种业务形态的薄壳(路由 + 商品/购物车/下单) |
php-server/app/crontab | Date / Hour / Minutes / Month / Queue 五个 HTTP 定时入口 |
php-server/app/swagger | swagger-php 注解定义 |
php-server/config | 14 个配置文件,version.php 是唯一版本号来源 |
php-server/public | 站点根目录:index.php、router.php、nginx.htaccess、install/、attachment/、static/ |
php-server/public/install | 五步安装向导 + db/ 六份 SQL |
php-server/.example.env | 环境变量样例(缺 JWT 密钥,见第 11 节) |
vue-admin | 后台(src/pages-admin/main 与 src/pages-admin/platform/{mall,food,house,kms}) |
uniapp | 移动端,src/ 下 home、rider、technician、video、shared 五个分包 + pages.json |
md-images | README 配图(思维导图等) |
移动端的分包很能说明产品边界:pages.json 里 14 个 root,除了 home、shared、rider、technician、video,还有 home/platform/{mall,food,house,kms}/pages 四套业务页——一套 App 里挂了四种业态的页面。
5. 快速上手
环境要求
PHP 8.0 以上,扩展要齐 pdo、pdo_mysql、curl、openssl、mbstring、gd(安装向导会逐项检查);MySQL 5.7/8.0,字符集 utf8mb4;Nginx 或 Apache 配伪静态;构建前端需要 Node 18 以上(Vite 5 的门槛)。Redis 不是必需项,默认缓存驱动是 File。
第一步:拉代码
git clone --depth 1 https://gitee.com/csdeshang/DSShop_open.git dsshop
cd dsshop/php-server
ls app public config第二步:装依赖并建可写目录
cd php-server
composer install
mkdir -p runtime
mkdir -p public/storage
chmod -R 755 runtime
chmod -R 755 public/storageruntime 不在仓库里,而安装向导的环境检测会直接对 ../../runtime、../attachment、../../config 判可写,目录不存在就是「不可写」红叉(向导里创建目录的代码是注释掉的)。public/storage 是 config/filesystem.php 里 public 盘的位置,本地存图要用。
第三步:配站点与伪静态
站点根目录指向 php-server/public,伪静态用仓库自带的 nginx.htaccess:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}第四步:跑安装向导
浏览器打开 https://你的域名/install/install.php,五步:许可协议 → 环境检测 → 数据库配置 → 管理员账号 → 完成。向导会做四件事:建库并以你填的前缀导入 6 份 SQL(deshang、kms、video、initarea、points-goods、demo-data)、生成 php-server/.env(含 64 位随机 JWT_SECRET_KEY)、创建管理员、写 install.lock。
注意 demo-data.sql 是无条件导入的,会带进示例商品、SKU、分类、品牌、师傅、骑手、用户各一条,上线前记得清。
第五步:构建前端
cd vue-admin
npm install
npm run build产物在 dist,Nginx 指过去即可。移动端同理:
cd uniapp
npm install
npm run build:h5小程序把最后一行换成 npm run build:mp-weixin。构建前务必改 .env.production:仓库里 VITE_APP_BASE_URL 默认是 https://dsshop.csdeshang.com(官方演示站),不改的话你的后台会把请求发给德尚的服务器。
验证
curl -s -o /dev/null -w '%{http_code}\n' https://你的域名/
curl -s -X POST https://你的域名/adminapi/captcha第一条返回 200 说明伪静态与入口通了;第二条返回验证码 JSON 说明数据库与 .env 都读到了。
6. 功能模块清单
100 张表按业务域看比逐张罗列有用:
| 域 | 表数 | 主要表 | 说明 |
|---|---|---|---|
| 商品 | 14 | tbl_goods、tbl_goods_sku、tbl_goods_spec、tbl_goods_category、tbl_goods_brand、tbl_goods_flashsale、tbl_goods_wholesale、tbl_goods_userdiscount | 商品、SKU、规格、秒杀、批发、会员价 |
| 交易 | 9 | tbl_order、tbl_order_goods、tbl_order_address、tbl_order_delivery、tbl_order_merge、tbl_order_finance、tbl_order_invoice | 订单头/明细/地址快照/发货/合并支付/财务/发票 |
| 售后 | 3 | tbl_order_refund、tbl_order_refund_log、trade_refund_log | 退款单、协商日志、退款流水 |
| 支付 | 5 | trade_payment_config、trade_pay_log、trade_transfer_log、trade_refund_log、user_recharge_log | 渠道配置、支付/转账/退款流水 |
| 用户会员 | 12 | user、user_balance_log、user_points_log、user_growth_level、user_growth_log、user_withdrawal_*、user_behavior_log | 余额、积分、成长值、提现、行为埋点 |
| 分销 | 5 | distributor_apply、distributor_level、distributor_goods、distributor_order、distributor_balance_log | 申请、等级佣金比例、选品、分销订单、佣金流水 |
| 外卖 | 4 | rider、rider_track、rider_fee_rule、rider_balance_log | 骑手、轨迹、配送费规则、骑手收益 |
| 家政 | 4 | technician、technician_goods_rel、technician_track、technician_balance_log | 师傅、服务项关联、服务轨迹、收益 |
| 短视频 | 10 | blogger、video_short、video_short_goods_rel、video_like、video_comment、video_view_log | 达人、短视频、视频挂商品、互动 |
| 积分商城 | 5 | points_goods、points_goods_order、points_goods_evaluate | 积分商品与兑换 |
| 内容 / 装修 | 5 | editable_page、sys_article、sys_article_category、sys_agreement、sys_notice_tpl | 页面装修、系统文章、协议、通知模板 |
| 系统 | 10+ | admin、admin_menu、admin_role、sys_config、sys_area、sys_platform、sys_task_queue、sys_task_cron、sys_error_logs、sys_access_logs | 权限、配置、地区、应用、队列、日志 |
| 微信 | 4 | wechat_setting、wechat_subscribe_record、wechat_push_log、sys_notice_sms_log | 公众号/小程序配置、订阅消息、推送 |
| 其他 | 若干 | tbl_cart、tbl_goods_comment、tbl_store_coupon、tbl_store_printer、attachment、kms_lesson | 购物车、评价、优惠券、小票机、附件、课时 |
后台侧:admin_menu 初始化 151 条记录(38 个目录 + 113 个菜单),13 个一级目录是「权限、设置、会员、财务、商城平台、维护、装修、外卖平台、家政平台、教育平台、微信配置、短视频、营销中心」——业务边界在菜单上看得比 README 清楚。
三个判断:
- 交易与售后是完整的:下单、合并支付、发货、退款、财务流水、发票都有表有状态,
tbl_order_finance单独记收支,tbl_order_refund_log记协商过程。 - 两种履约都做了:外卖的骑手抢单 + 轨迹 + 配送费规则,家政的师傅接单 + 服务项 + 轨迹,各自还有独立的余额与提现账户,这部分比多数「只做商城」的开源项目完整得多。
- 营销是基础款:秒杀、批发、会员折扣、优惠券、积分、分销都有,但没有拼团、砍价、直播带货这类玩法表;短视频只是导流位,不是带货闭环(
video_short_goods_rel仅关联商品)。
7. 版本与授权
| 项 | 实际情况 |
|---|---|
| 根目录 LICENSE | Apache-2.0 全文,标准文本 |
| 代码版权头 | 0 处,998 个业务 PHP 文件里搜不到 Copyright / 版权所有 |
| 授权校验 | 无域名绑定、无 License 校验、无加密扩展(全库 grep 无相关实现) |
php-server/LICENSE.txt | ThinkPHP 框架自带的 Apache-2.0 声明,不是项目方协议 |
composer.json | license 写 Apache-2.0,但 name 仍是 topthink/think、authors 仍是 ThinkPHP 作者——骨架元信息没清理 |
| 版本号 | config/version.php = 3.0.1,前端 .env 同一版本号 |
| 标签 / Release | 0 个,仓库页显示「暂无发行版」 |
| 提交 | 77 次,最后一次 2026-10-25(提交信息 docs) |
Apache-2.0 意味着什么:可以商用、可以闭源分发修改版、可以做成 SaaS 卖服务,义务只有三条——保留 LICENSE 与版权声明、修改过的文件加说明、若原作品带 NOTICE 则一并保留(本仓库没有 NOTICE)。它和 AGPL 是两回事,不存在「对外提供服务就得开源」的约束。
需要提醒的是:授权干净不等于项目方背书。仓库没有任何版权头,composer.json 沿用了 ThinkPHP 的元信息,README 也不提开源协议条款——真要做商业交付,建议先和官网确认商标与素材(md-images、public/static 里的图)的使用范围。
8. 商业模式说明
仓库里能核实的只有这些:README 首屏是一大段 SEO 关键词(商城模板、外卖源码、家政系统…),随后是「相关产品」导流到 DSMall Pro、DSMall、DSO2O 三个同厂项目,再给出四个演示账号(后台 / 用户端 / 骑手端 / 师傅端,账号均为 test、密码 123456)、官网、帮助手册和销售电话。
| 环节 | 观察到的事实 |
|---|---|
| 开源版 | Apache-2.0 全功能代码,含营销、分销、发票、骑手、师傅、短视频 |
| 获客 | Gitee 6.4K Star、四个在线演示环境、帮助手册、QQ/电话咨询 |
| 关联产品 | DSMall Pro(ThinkPHP8 + Vue3 平台)、DSMall(B2B2C 多店铺)、DSO2O(外卖),各自独立仓库 |
| 变现方式 | 官网未在仓库中体现,README 只留联系方式,属于「官网/私域谈单」模式 |
| 服务边界 | 无法核实。报价、授权条款、是否提供二开服务,仓库里都没有 |
一个可核实的判断:开源版没有做功能阉割。营销、分销、发票、财务、骑手、师傅这些通常被划进商业版的能力,在开源代码里都有表和实现,这与 mall4cloud 那种「营销留在商业版」的分层思路相反。更像「用完整产品开源聚流量,靠实施、定制、行业版收费」的路子。至于 DSMall Pro 与 DSShop 是否同源、商业版功能差别,README 没写,只能按「官方宣传」看待。
9. 生态与周边
| 项目 / 资源 | 作用 | 地址 |
|---|---|---|
| DSShop_open(本文主角) | 自营 B2C 多业务系统 | gitee.com/csdeshang/DSShop_open |
| DSMall Pro | ThinkPHP8 + Vue3 的新平台系产品 | gitee.com/csdeshang/DSPlatform_open |
| DSMall | ThinkPHP 6 + uni-app 的 B2B2C 多店铺商城 | 官网 csdeshang.com |
| DSO2O | ThinkPHP 6 + uni-app 的外卖系统 | 官网 csdeshang.com |
| 官网 | 产品、案例、联系方式 | www.csdeshang.com |
| 帮助手册 | DSMall Pro 系文档站 | help.dsplatform.csdeshang.com |
| 后台演示 | 账号 test / 123456 | dsshop.admin.csdeshang.com |
| 用户端演示 | 账号 test / 123456 | dsshop.uniapp.csdeshang.com |
| 骑手端演示 | 同上账号 | dsshop.uniapp.csdeshang.com/rider/pages/index/index |
| 师傅端演示 | 同上账号 | dsshop.uniapp.csdeshang.com/technician/pages/index/index |
技术侧的依赖生态也值得一提,因为它的 providers 目录就是一张「国产电商基础设施清单」:
| 能力 | 已实现的供应商 |
|---|---|
| 支付 | 微信支付、支付宝(yansongda/pay 3.7) |
| 短信 | 阿里云、腾讯云 |
| 存储 | 本地、阿里云 OSS(无 COS) |
| 地图 / LBS | 高德、腾讯、百度、天地图 |
| 物流查询 | 快递100、快递鸟 |
| 小票打印 | 飞鹅、佳博、芯烨、易联云 |
| 微信 | 公众号、小程序、开放平台、APP(EasyWeChat 6.17 + 两套模板预设配置) |
10. 选型建议
适合你,如果:
- 你要做的是平台自营生意(品牌商城、连锁自营、本地生活服务商),本来就不需要商户入驻;
- 你想同时试商城 + 外卖 + 家政,用一套后台管起来——这种多业态组合在开源里很少见;
- 团队是 PHP 栈、能读 ThinkPHP 8,接受「薄壳 + 公共服务层」的组织方式;
- 你要 Apache-2.0 的宽松授权,未来可能闭源交付给客户。
不适合你,如果:
- 你要多商户平台:没有店铺表、没有入驻审核、没有商户结算,改造成本远高于换 DSMall;
- 你想要「装完即用」的成熟产品:演示数据要清、
runtime要手建、前端.env要改、定时任务要自己配,README 还有几处照抄会踩坑; - 你在意代码整洁度与工程规范:
vendor入库、无composer.lock、无单元测试、无版权头,README与仓库不一致; - 你需要高并发或分布式部署:默认 File 缓存 + File 锁 + HTTP 触发的 DB 队列,多机场景要逐项换成 Redis 与常驻进程。
和写过的同类怎么比:YoShop、ShopWind、ZKMall 都是「一个后端 + 平台/商户双后台」的多商户路线,DSShop 走的是反方向——单主体自营 + 多业态扩展;和 mall4cloud 比,它不是微服务教材,而是「业务功能密度极高」的单体 ThinkPHP 应用,100 张表里有大量可以直接用的真实业务;和同厂 DSMall 比,两者是同一体系内的两个商业模式选择,不是新旧关系。
11. 风险与坑
- 手动配
.env会漏 JWT 密钥。.example.env只有APP_DEBUG、DB_*、DEFAULT_LANG七项,没有JWT_SECRET_KEY;JwtToken取不到密钥会直接抛异常(异常文案还写错成「请检查 JWT_SECRET 设置」,变量名实际是JWT_SECRET_KEY),登录接口全挂。用官方安装向导没问题——它会random_bytes生成 64 位密钥写进.env。 - 后台权限对 GET 放行。
AdminAuthorizeRole的逻辑是:超管(admin_is_super === 1)直接跳过;当前规则adminapi/<rule>不在admin_menu的 api 列表里且请求方法是 GET,也直接放行。新加的后台 GET 接口只要忘了登记菜单,就等于对任何登录管理员开放。 - 路由注册期查库。
PlatformLoader::loadRoute()在路由阶段查sys_platform,数据库抖动会让所有接口一起 500(不是单接口报错)。它还只过滤platform != 'system',不判断is_enable,后台「停用应用」只影响界面,不影响路由注册。 public/install装在站点根目录下。安装完成后只写了install.lock,目录本身不删;install.php的锁检查对step=5开了白名单,虽然真正执行安装还依赖 session 里的数据库配置,但把安装目录留在线上始终不该做。上线第一件事是删public/install。vendor入库 + 无composer.lock。php-server97 MB 里 46 MB 是依赖;因为没有锁文件,composer install会重新解析^8.0、^3.0这类约束,拉到的版本可能和作者提交的不一致,出现问题很难对齐复现。- 演示数据自动入库。安装向导无条件导入
demo-data.sql,带进示例商品、SKU、分类、品牌、师傅、骑手、用户各一条;不清理会出现在前台。 - 默认缓存是 File,锁也是 File。
config/cache.php默认驱动file,LockService在非 Redis 下用文件锁(不跨机器)。多机部署不切 Redis,余额、库存、分销结算这些依赖锁的场景会出现并发问题。 CACHE_ENABLED=false时锁退化成伪锁。LockService::acquire()在缓存关闭时返回disabled_前缀的假值直接当成加锁成功——开发环境图快可以,线上误关就是全裸奔。- 强制下线依赖缓存。
TokenCache的版本号默认值硬编码为 1,缓存被清空后版本号回落,之前被作废的旧令牌可能重新可用。清缓存是个有副作用的运维动作。 sys_task_cron是死表。表建了、cron_type/params字段都在,但全项目grep不到任何读写它的代码;真正的定时靠外部 crontab 请求/crontab/{minutes,hour,date,month}/index与/crontab/queue/consume。不配这些 URL,订单超时取消、自动确认收货、优惠券过期、分销结算、队列消费全都不跑。config/console.php是空的。没有注册任何命令,所以不能用php think xxx跑任务,只能走 HTTP;这意味着定时任务暴露在公网路径上,建议在 Nginx 层限制来源或加内网校验。- README 与代码有多处不符:克隆地址是
your-org占位符;nuxt-consumer(用户 PC 端)目录不存在;npm run build:app脚本不存在;技术栈写「本地 / 阿里云 OSS / 腾讯云 COS」,代码里只有 Local 与 Aliyun 两个 provider;写「地图:腾讯、高德、百度」,实际还有天地图。照 README 部署会在这几处卡住。 .example.env与安装向导写出的.env不一致:样例是DB_CHARSET = utf8、无DB_PREFIX、无CACHE_ENABLED、无INSTALL_TIME;向导生成的是utf8mb4+ 前缀 + 缓存开关。手工部署时别拿样例当标准。- 前端
.env指向官方演示站。VITE_APP_BASE_URL与VITE_FILE_BASE_URL都是https://dsshop.csdeshang.com,OSS 示例桶还是dsmall2024(DSMall 项目的桶名)。不改就上线,等于把用户请求和图片地址都发给别人。 - 没有测试。998 个业务文件里找不到
tests目录,vue-admin虽有vitest脚本但没有测试用例。升级 ThinkPHP 8 小版本或改公共模型,只能靠手点回归。 - 订单状态是共用枚举。
TblOrderEnum里同一个order_status字段要同时表达商城、外卖、家政三套语义(40 是「已发货」也是「店铺已接单」,50 是「派送中」),字典靠getMallOrderStatusDict/getFoodOrderStatusDict分开维护。加业务形态时要小心别把字典串了。 - 代码规模不小,但文档几乎没有。除 README 和
app/swagger的注解,没有架构说明、没有部署文档、没有二开指南;deshang内核的约定(ds_json_success、BaseApiController、KvManager)只能读代码学。
12. 参考链接
| 名称 | 地址 |
|---|---|
| 代码仓库(本文链接) | https://gitee.com/csdeshang/DSShop_open |
| 官网 | https://www.csdeshang.com |
| 帮助手册 | http://help.dsplatform.csdeshang.com/ |
| 后台演示(test / 123456) | https://dsshop.admin.csdeshang.com |
| 用户端演示(test / 123456) | https://dsshop.uniapp.csdeshang.com |
| 骑手端演示 | https://dsshop.uniapp.csdeshang.com/rider/pages/index/index |
| 师傅端演示 | https://dsshop.uniapp.csdeshang.com/technician/pages/index/index |
| 同厂 DSMall Pro(平台系) | https://gitee.com/csdeshang/DSPlatform_open |
| 同厂 DSMall(B2B2C) | https://www.csdeshang.com |
| ThinkPHP 8 文档 | https://doc.thinkphp.cn/v8_0 |
| EasyWeChat 文档 | https://easywechat.com |
| yansongda/pay 文档 | https://pay.yansongda.cn/docs/v3/ |
| uni-app 文档 | https://uniapp.dcloud.net.cn |
| Element Plus 文档 | https://element-plus.org |