Sfoglia il codice sorgente

admin 前端联调适配

- store.menu/setApis 增加驼峰别名,兼容前端按方法名调用的习惯(/set_apis 保留)
- 新增 tools/migrate_camel_admin_front.py:admin 前端字段批量转驼峰的显式映射脚本
- 联调说明补充「admin 前端联调」章节:代理配置、启动方式、字段口径、验证方式
tanlie 7 ore fa
parent
commit
10af1ce046

+ 57 - 0
tools/migrate_camel_admin_front.py

@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+"""admin 前端(F:\\shop\\yoshop2.0-admin)字段驼峰迁移。
+
+Java 端平台后台接口出参/入参统一驼峰,前端 PHP 时代的 snake_case 字段需要同步。
+这里按显式映射替换,避免通用正则误伤 import 路径(lazy_use 等)。
+.vue 只处理 <template> 与 <script>,跳过 <style>。
+"""
+import re
+from pathlib import Path
+
+ROOT = Path(r"F:\shop\yoshop2.0-admin")
+SRC = ROOT / "src"
+
+# snake_case -> camelCase(全部是接口字段)
+MAP = {
+    "store_id": "storeId",
+    "store_name": "storeName",
+    "create_time": "createTime",
+    "user_name": "userName",
+    "admin_user_id": "adminUserId",
+    "menu_id": "menuId",
+    "api_id": "apiId",
+    "parent_id": "parentId",
+    "is_page": "isPage",
+    "module_key": "moduleKey",
+    "action_mark": "actionMark",
+    "password_confirm": "passwordConfirm",
+    "current_page": "currentPage",
+}
+
+PATTERN = re.compile(r"\b(" + "|".join(sorted(MAP, key=len, reverse=True)) + r")\b")
+
+
+def repl(m):
+    return MAP[m.group(1)]
+
+
+def convert_vue(text):
+    parts = re.split(r"(<style[^>]*>[\s\S]*?</style>)", text)
+    out = []
+    for p in parts:
+        out.append(p if p.startswith("<style") else PATTERN.sub(repl, p))
+    return "".join(out)
+
+
+changed = []
+for f in sorted(list(SRC.rglob("*.vue")) + list(SRC.rglob("*.js"))):
+    text = f.read_text(encoding="utf-8", errors="replace")
+    new = convert_vue(text) if f.suffix == ".vue" else PATTERN.sub(repl, text)
+    if new != text:
+        n = len(PATTERN.findall(text))
+        f.write_text(new, encoding="utf-8", newline="")
+        changed.append((str(f.relative_to(ROOT)), n))
+
+print("改动 %d 个文件" % len(changed))
+for name, n in sorted(changed, key=lambda x: -x[1]):
+    print("  %-56s %d 处" % (name, n))

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/admin/controller/AdminStoreMenuController.java

@@ -18,7 +18,7 @@ import java.util.Map;
 
 /**
  * 商家后台菜单维护,对齐 PHP app/admin/controller/store/Menu(URL: /admin/store.menu/**)。
- * 注意 URL 里的点号与下划线:setApis → /set_apis。
+ * PHP 方法名是 setApis,平台前端按 store.menu/setApis 调用;同时兼容下划线写法 /set_apis。
  */
 @RestController
 @RequestMapping("/admin/store.menu")
@@ -55,7 +55,7 @@ public class AdminStoreMenuController {
     }
 
     /** 设置菜单绑定的 API 权限 */
-    @RequestMapping(value = "/set_apis", method = {RequestMethod.GET, RequestMethod.POST})
+    @RequestMapping(value = {"/setApis", "/set_apis"}, method = {RequestMethod.GET, RequestMethod.POST})
     public R<Void> setApis(@RequestBody(required = false) Map<String, Object> body, HttpServletRequest request) {
         Map<String, Object> params = Params.merge(body, request);
         int menuId = requireMenuId(body, request);

+ 10 - 0
联调说明.md

@@ -103,3 +103,13 @@ NODE_OPTIONS=--openssl-legacy-provider ./node_modules/.bin/vue-cli-service serve
 - 注意:`/admin/store/recovery` 是「移入回收站」、`/admin/store/move` 是「移出回收站」(PHP 原有命名)
 - 一键验证:`python tools/test_admin_api.py`(需服务在 18080,并假定 admin 口令为 `123456`;
   测试时是临时改库内的 bcrypt 哈希跑完再还原,平时请勿依赖该口令)
+
+### admin 前端联调(F:/shop/yoshop2.0-admin)
+
+- 代理:`vue.config.js` devServer `/api → http://127.0.0.1:18080`,pathRewrite `'/api': '/admin'`;
+  `public/config.js` 的 `BASE_API: '/api'`(生产改回实际域名)。
+- 前端字段已全量转驼峰(16 个文件,含 STable 分页 `currentPage`、`userInfo.adminUserId` 等)。
+- `store.menu/setApis` 前端按驼峰调用,Java 端 `/admin/store.menu/setApis` 与 `/set_apis` 两个路径都支持。
+- 顺手修了两个前端原有 bug:回收站与 API 权限列表的列配置挂了不存在的 scopedSlots 导致整列空白,已去掉。
+- 一键验证:起 Java 18080 + 前端 8110,浏览器登录 admin(测试口令 123456,原哈希备份在
+  2026-10-18 工作日志)后逐页点一遍即可。