对话笔记直发:7.16 YoShop服务订单权限、版权移除与WSL云端发布收口。分类:小程序接单。

YoShop服务订单权限、版权移除与WSL云端发布收口

时间

  • 2026-07-16(Asia/Shanghai)

用户目标

  1. 修复新建管理员 guanxing(归属“运营和客服”角色组)在商家后台操作服务类订单时的权限问题:
    • “开始服务”按钮缺失;
    • “开始服务”接口曾提示无权访问 order.event/startService;
    • “服务前退款”接口提示无权访问 order.event/refundBeforeService;
    • 同时补齐“完成服务”能力权限。
  2. 移除商家后台所有页面底部固定版权声明:
    • Copyright © 2024 萤火商城V2.0 YIOVO.COM
  3. 校正开发上线工作流,明确 WSL 本地验收、GitHub 推送和腾讯云生产部署不是同一阶段。
  4. 在 WSL 验收通过后,将代码推送 GitHub,再通过受保护发布工具部署腾讯云生产。
  5. 完成 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.sql
  • deploy/tests/test_service_order_permissions.py
  • deploy/tests/test_service_order_permissions_mysql.py
  • yoshop2.0-store/src/views/order/Detail.vue
  • yoshop2.0/app/common/model/store/Menu.php
  • yoshop2.0/app/common/model/store/MenuApi.php
  • yoshop2.0/app/store/model/store/Menu.php
  • yoshop2.0/app/store/service/Auth.php
  • yoshop2.0/app/store/service/store/Role.php
  • yoshop2.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.sql

SHA-256:

fa2d67c5c12e3603cf1ac1247780f4273fe987a555052ad8ab325d1162ac4578

本地迁移验证结果:

action_menus=3
service_apis=3
service_bindings=3
ineligible_grants=0
guanxing_service_urls=3
leftover_permtest_tables=0

guanxing 最终获得:

startService → /order.event/startService
completeService → /order.event/completeService
refundBeforeService → /order.event/refundBeforeService

GitHub 提交与推送

已推送到 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。

“



相关: 00-索引-小程序接单索引 7.15 YoShop 风险分级 AI 开发工作流与使用手册