对话笔记直发:7.16 YoShop服务订单权限、版权移除与WSL云端发布收口。分类:小程序接单。
YoShop服务订单权限、版权移除与WSL云端发布收口
时间
- 2026-07-16(Asia/Shanghai)
用户目标
- 修复新建管理员
guanxing(归属“运营和客服”角色组)在商家后台操作服务类订单时的权限问题:- “开始服务”按钮缺失;
- “开始服务”接口曾提示无权访问
order.event/startService; - “服务前退款”接口提示无权访问
order.event/refundBeforeService; - 同时补齐“完成服务”能力权限。
- 移除商家后台所有页面底部固定版权声明:
Copyright © 2024 萤火商城V2.0 YIOVO.COM
- 校正开发上线工作流,明确 WSL 本地验收、GitHub 推送和腾讯云生产部署不是同一阶段。
- 在 WSL 验收通过后,将代码推送 GitHub,再通过受保护发布工具部署腾讯云生产。
- 完成 Trellis 任务收口,并保存本次对话总结。
背景与上下文
系统原本是实物商城,权限菜单和订单操作围绕“发货、确认收货、订单导出”等实物履约动作建立。系统改造成服务类商品并接入微信虚拟支付后,商家后台改为“开始服务、完成服务、服务前退款”等操作,但权限菜单、API 权限和角色授权没有同步补齐。
因此,旧管理员可能因历史权限数据偶然可操作,而新建管理员即使勾选“订单处理”,也无法调用新服务接口。前端还使用了旧权限作为回退,导致显示逻辑与后端实际授权不一致。
根因与关键决策
服务订单权限根因
- 新接口已经存在,但没有完整挂接到可分配的菜单权限能力。
- 角色权限数据实际保存的是叶子权限,不一定直接保存
/order/tools父菜单。 guanxing所属角色运营人员(10001)持有旧的直接子权限订单导出(10202),而非最初假设的父权限10201。- 因此前一版仅按父权限迁移角色授权的方案不完整,必须同时识别“拥有父菜单”或“拥有父菜单下任一直接子权限”的角色。
权限迁移设计
新增三个前端能力权限:
/order/tools.startService
/order/tools.completeService
/order/tools.refundBeforeService分别绑定后端 API:
/order.event/startService
/order.event/completeService
/order.event/refundBeforeService迁移采用以下约束:
- 通过 URL/语义解析
/order/tools和订单 API 父节点,不硬编码依赖固定 ID; - 父节点缺失或解析结果不唯一时,通过
SIGNAL主动失败,禁止静默写错权限树; - 新菜单/API ID 使用
AUTO_INCREMENT,不使用有并发风险的MAX(id)+1; - 脚本支持重复执行,保证幂等;
- 只给符合历史订单处理权限条件的角色补齐新服务权限;
- 保留旧权限数据用于兼容和回滚,但前端不再以旧实物权限作为服务操作回退。
上线工作流校正
最终确认的标准流程:
修改代码
→ 自动化检查
→ WSL 本地部署
→ 用户手动验收
→ Git commit/push
→ 生产 preflight/dry-run
→ 生产授权
→ 腾讯云正式发布
→ 生产验证“生产部署”明确指腾讯云服务器,不是 WSL。本地源码修改后如果需要用户马上验证,必须先将构建产物同步到 WSL 正在运行的 Web 根目录,并按变更类型清缓存、重启或重载相关服务。
代码与配置改动
权限相关
关键文件包括:
deploy/migrations/0001_service_order_permissions.sqldeploy/tests/test_service_order_permissions.pydeploy/tests/test_service_order_permissions_mysql.pyyoshop2.0-store/src/views/order/Detail.vueyoshop2.0/app/common/model/store/Menu.phpyoshop2.0/app/common/model/store/MenuApi.phpyoshop2.0/app/store/model/store/Menu.phpyoshop2.0/app/store/service/Auth.phpyoshop2.0/app/store/service/store/Role.phpyoshop2.0/数据库修改记录/v2.1.3_service_order_menu_cleanup.sql
Detail.vue 的权限判断改为只使用服务能力标识:
/order/tools.startService
/order/tools.completeService
/order/tools.refundBeforeService移除了旧的实物订单权限回退:
/order/list/all.deliver
/order/list/all.cancel版权移除
关键文件:
- 修改
yoshop2.0-store/src/layouts/BasicLayout.vue - 删除
yoshop2.0-store/src/components/GlobalFooter/index.vue - 新增验证
deploy/tests/test_merchant_console_branding.py
处理内容:
- 移除
GlobalFooter引入、组件注册和 Footer slot; - 删除固定版权组件及其编码后的版权来源;
- 重新构建并检查生产资源中不再包含目标版权声明。
工作流文档
提交 36674cb 用于正式记录 WSL 验收与云端发布流程,明确每一道授权门和发布边界。
自动检查与 WSL 本地验证
已完成:
- 变更 PHP 文件语法检查;
- 商家后台聚焦 lint;
- 商家后台 production build;
- 权限与版权自动化测试;
- MariaDB 权限迁移集成测试;
- WSL runtime contract;
git diff --check;- 本地 HTTP smoke test;
- A 域名静态资源检查。
本地数据库:
127.0.0.1:3306/yoshop2数据库备份:
/tmp/yoshop-local-backups/yoshop2-service-permissions-20260716T174008.sqlSHA-256:
fa2d67c5c12e3603cf1ac1247780f4273fe987a555052ad8ab325d1162ac4578本地迁移验证结果:
action_menus=3
service_apis=3
service_bindings=3
ineligible_grants=0
guanxing_service_urls=3
leftover_permtest_tables=0guanxing 最终获得:
startService → /order.event/startService
completeService → /order.event/completeService
refundBeforeService → /order.event/refundBeforeServiceGitHub 提交与推送
已推送到 origin/main 的主要提交:
36674cb docs: formalize WSL acceptance and cloud release workflow
67795e6 fix: add service order permissions and remove merchant footer发布时确认:
origin/main = 67795e662377732e27579b4bfb2f48f12f99f90d与本次发布无关的虚拟支付工作在发布前临时 stash,发布完成后已恢复,未混入本次提交或生产包。
腾讯云生产部署结果
生产域名:
wx.gxwqb.cn生产 preflight 与 dry-run 均通过。正式发布使用受保护发布命令完成,未采用手动 SSH、git pull 或零散 rsync 替代。
正式 release:
release_id: 20260716101354-67795e662377
commit: 67795e662377732e27579b4bfb2f48f12f99f90d
sha256: be2126ac23d476902d7eef56d22b7eb80bcf205ecfc9c971520b4c6e28bf3e38
package: /opt/yoshop/deploy/out/yoshop-20260716101354-67795e662377.tar.gz
bytes: 17238522
file_count: 6322部署状态:
current: 20260716101354-67795e662377
current_state: active
disk_used: 13%
errors: []
previous: 20260714215523-b777b892d048部署报告:
/opt/yoshop/deploy/reports/20260716T102033Z-deploy.json
/opt/yoshop/deploy/reports/20260716T102049Z-status.json线上 /、/admin/、/store/ 均返回 HTTP 200。商家后台的按需加载 order chunk 中已确认包含三个新服务权限标识,并确认目标版权文案不存在。
执行命令记录
WSL 本地构建和运行时更新
/opt/yoshop/yoshop2.0-store/node_modules/.bin/vue-cli-service build- 重新构建商家后台生产资源;构建成功,仅有已有的 Browserslist、CSS chunk 顺序和资源体积警告。
/opt/yoshop/scripts/repair-local-runtime.sh --clear-cache
sudo systemctl restart php8.3-fpm- 清理 WSL 本地运行时缓存并重启 PHP-FPM;Nginx 配置未变,因此本地验证阶段无需重启 Nginx。
YOSHOP_LOCAL_DB_INTEGRATION=1 \
python3 -m unittest -v deploy.tests.test_service_order_permissions_mysql- 在隔离复制表上运行权限迁移两次,验证幂等、角色范围和清理逻辑;测试通过,临时表无残留。
Git 与生产发布
git push origin main- 将权限、版权和工作流提交推送到 GitHub,
origin/main更新到67795e6。
./deploy.sh preflight --fetch
./deploy.sh release --fetch --dry-run- 校验分支、远端 HEAD、工作区洁净度、禁止跟踪文件和发布包;均通过。
./deploy.sh release --fetch \
--confirm-production DEPLOY-wx.gxwqb.cn- 执行腾讯云正式发布;自动完成上传、校验、数据库备份、迁移、原子切换、PHP-FPM/Timer/Nginx 处理、健康检查和失败自动回滚保护。
./deploy.sh status- 返回
ok: true、current_state: active、errors: [],确认生产 release 已激活。
Trellis 收口
python3 ./.trellis/scripts/task.py archive 07-16-service-order-permissions
python3 ./.trellis/scripts/task.py archive 07-16-remove-merchant-copyright
python3 ./.trellis/scripts/task.py archive 07-16-wsl-cloud-release-workflow
python3 ./.trellis/scripts/task.py archive 07-16-mall-admin-permissions-copyright- 四个本次相关任务均已归档到
.trellis/tasks/archive/2026-07/,每次归档由 Trellis 自动生成一条 archive commit。
“