Просмотр исходного кода

修改订单列表待支付去掉已取消的订单

qmj 3 дней назад
Родитель
Сommit
8508487f0c

+ 12 - 0
.claude/homunculus/observations.jsonl

@@ -4256,3 +4256,15 @@ c3\u72b2\u656d\u935a\udc8e,1\u9422\u5ba0\udcaf\u8702\u8151,2\u95ab\udc80\u5a06\u
 {"timestamp":"2026-07-31T10:40:36Z","event":"parse_error","raw":"{\"session_id\":\"1973f3d4-62e7-44fc-93cd-176e4b6af856\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\1973f3d4-62e7-44fc-93cd-176e4b6af856.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"d05a2721-49d1-421c-b77a-c689c3616c31\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"max\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"cd \\\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\"\\nexport JAVA_HOME=\\\"/c/Users/qmj/.jdks/graalvm-jdk-21.0.7\\\"\\nmvn -pl ruoyi-admin compile -am -o -q 2>&1 | tail -5\\necho \\\"=== run self-test ===\\\"\\n\\\"$JAVA_HOME/bin/java\\\" -cp ruoyi-admin/target/classes com.ruoyi.app.utils.ezPayCrypto.EzPayEncryptUtil\",\"timeout\":420000,\"description\":\"Compile and run EzPayEncryptUtil self-test\"},\"tool_response\":{\"stdout\":\"=== run self-test ===\\n[PASS] CheckCode\\r\\n[PASS] CheckCode(BDV/Result)\\r\\n[PASS] encrypt/decrypt round-trip\\r\\n[PASS] PKCS7 \u951f\u65a4\u62f7\u951f\u4ecb\u8865\u951f\u65a4\u62f7\u951f\u65a4\u62f7\\r\\n[PASS] BDV PostData_ \u951f\u65a4\u62f7\u951f\u65a4\u62f7\\r\\n[PASS] BDV Ch"}
 {"timestamp":"2026-07-31T10:47:27Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Skill\",\"tool_input\":{\"skill\":\"superpowers:systematic-debugging\"},\"tool_use_id\":\"call_b31a1723e5514d6ca9f17ec5\"}\n"}
 {"timestamp":"2026-07-31T10:47:30Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Skill\",\"tool_input\":{\"skill\":\"superpowers:systematic-debugging\"},\"tool_response\":{\"success\":true,\"commandName\":\"superpowers:systematic-debugging\"},\"tool_use_id\":\"call_b31a1723e5514d6ca9f17ec5\",\"duration_ms\":627}\n"}
+{"timestamp":"2026-07-31T10:48:48Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"    private String verifyLine(String code) {\\n        try {\\n            log.debug(\\\"[OAuth][LINE] code={}\\\", code);\\n            // 1. code \u93b9\udca2 access_token\\n            JSONObject token = JSONObject.parseObject(httpPostForm(lineTokenUrl, new String[][]{\\n                    {\\\"grant_type\\\", \\\"authorization_code\\\"},\\n                    {\\\"code\\\", code},\\n                    {\\\"redirect_uri\\\", lineRedirectUri},\\n                    {\\\"client"}
+{"timestamp":"2026-07-31T10:48:55Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"    private String verifyLine(String code) {\\n        try {\\n            log.debug(\\\"[OAuth][LINE] code={}\\\", code);\\n            // 1. code \u93b9\udca2 access_token\\n            JSONObject token = JSONObject.parseObject(httpPostForm(lineTokenUrl, new String[][]{\\n                    {\\\"grant_type\\\", \\\"authorization_code\\\"},\\n                    {\\\"code\\\", code},\\n                    {\\\"redirect_uri\\\", lineRedirectUri},\\n                    {\\\"clien"}
+{"timestamp":"2026-07-31T10:49:01Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"            if (bearer != null && !bearer.isEmpty()) {\\n                get.setHeader(\\\"Authorization\\\", \\\"Bearer \\\" + bearer);\\n            }\\n            try (CloseableHttpResponse resp = client.execute(get)) {\\n                return EntityUtils.toString(resp.getEntity(), \\\"UTF-8\\\");\\n            }\",\"new_string\":\"            if (bearer != null && !bearer.isEmpty()) {\\n                get.setHeader(\\\"Authorization\\\", \\\"Bearer \\\" + bearer);"}
+{"timestamp":"2026-07-31T10:49:08Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"            if (bearer != null && !bearer.isEmpty()) {\\n                get.setHeader(\\\"Authorization\\\", \\\"Bearer \\\" + bearer);\\n            }\\n            try (CloseableHttpResponse resp = client.execute(get)) {\\n                return EntityUtils.toString(resp.getEntity(), \\\"UTF-8\\\");\\n            }\",\"new_string\":\"            if (bearer != null && !bearer.isEmpty()) {\\n                get.setHeader(\\\"Authorization\\\", \\\"Bearer \\\" + bearer)"}
+{"timestamp":"2026-07-31T10:49:12Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"            post.setEntity(new UrlEncodedFormEntity(pairs, \\\"UTF-8\\\"));\\n            try (CloseableHttpResponse resp = client.execute(post)) {\\n                return EntityUtils.toString(resp.getEntity(), \\\"UTF-8\\\");\\n            }\\n        }\\n    }\\n}\",\"new_string\":\"            post.setEntity(new UrlEncodedFormEntity(pairs, \\\"UTF-8\\\"));\\n            try (CloseableHttpResponse resp = client.execute(post)) {\\n                int status = res"}
+{"timestamp":"2026-07-31T10:49:18Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\java\\\\com\\\\ruoyi\\\\app\\\\utils\\\\oauth\\\\OAuthVerifyService.java\",\"old_string\":\"            post.setEntity(new UrlEncodedFormEntity(pairs, \\\"UTF-8\\\"));\\n            try (CloseableHttpResponse resp = client.execute(post)) {\\n                return EntityUtils.toString(resp.getEntity(), \\\"UTF-8\\\");\\n            }\\n        }\\n    }\\n}\",\"new_string\":\"            post.setEntity(new UrlEncodedFormEntity(pairs, \\\"UTF-8\\\"));\\n            try (CloseableHttpResponse resp = client.execute(post)) {\\n                int status = re"}
+{"timestamp":"2026-07-31T10:49:43Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"JAVA_HOME='C:\\\\Users\\\\qmj\\\\.jdks\\\\graalvm-jdk-21.0.7' mvn -f E:/QtwCode/foodie/foodie_server/pom.xml -pl ruoyi-admin compile 2>&1 | tail -15\",\"timeout\":300000,\"description\":\"Compile ruoyi-admin after logging changes\"},\"tool_use_id\":\"call_66f9accb36a54965b7dba666\"}\n"}
+{"timestamp":"2026-07-31T10:49:57Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"JAVA_HOME='C:\\\\Users\\\\qmj\\\\.jdks\\\\graalvm-jdk-21.0.7' mvn -f E:/QtwCode/foodie/foodie_server/pom.xml -pl ruoyi-admin compile 2>&1 | tail -15\",\"timeout\":300000,\"description\":\"Compile ruoyi-admin after logging changes\"},\"tool_response\":{\"stdout\":\"[ERROR]   \u6d63\u5d87\u7586: \u7eeb\udcbb com.ruoyi.app.mendian.ShPromotionCouponController\\r\\n[ERROR] /E:/QtwCode/foodie/foodie_server/ruoyi-admin/src/main/java/com/ruoyi/app/mendian/ShPromotionCouponController.java:[103,70] \u93b5\u53e5\u7b09\u9352\u626e\udcac\ufe40\u5f7f\\r\\n[ERROR]   \u7ed7\ufe40\u5f7f:   \u7eeb\udcbb PromotionCouponBatch\\r\\n[ERROR]   \u6d63\u5d87\u7586: \u7eeb\udcbb com.ruoyi.app.mendian.ShPromotionCouponController\\r\\n[ERROR] "}
+{"timestamp":"2026-07-31T10:50:16Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"JAVA_HOME='C:\\\\Users\\\\qmj\\\\.jdks\\\\graalvm-jdk-21.0.7' mvn -f E:/QtwCode/foodie/foodie_server/pom.xml -pl ruoyi-admin -am compile 2>&1 | tail -20\",\"timeout\":420000,\"description\":\"Compile ruoyi-admin with dependencies (JDK21)\"},\"tool_use_id\":\"call_5670081ee867440088999b40\"}\n"}
+{"timestamp":"2026-07-31T10:50:38Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"8957e17c-0457-4195-9883-958ff2bd912c\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"JAVA_HOME='C:\\\\Users\\\\qmj\\\\.jdks\\\\graalvm-jdk-21.0.7' mvn -f E:/QtwCode/foodie/foodie_server/pom.xml -pl ruoyi-admin -am compile 2>&1 | tail -20\",\"timeout\":420000,\"description\":\"Compile ruoyi-admin with dependencies (JDK21)\"},\"tool_response\":{\"stdout\":\"[INFO] /E:/QtwCode/foodie/foodie_server/ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderController.java: \u93cc\u612a\u7c3a\u6748\u64b3\u53c6\u93c2\u56e6\u6b22\u6d63\u8de8\u6564\u93b4\u682c\udca6\u55d9\u6d0a\u6d5c\u55d7\u51e1\u6769\u56e8\u6902\u9428\udc84 API\u9286\u4fd3r\\n[INFO] /E:/QtwCode/foodie/foodie_server/ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderController.java: \u93c8\u590a\u53e7\u7487\ufe3e\u7c8f\u6dc7\u2103\u4f05, \u7487\u8702\u5a07\u9422\udca8 -Xlint:deprecation \u95b2\u5d86\u67ca\u7f02\u682c\u7627\u9286\u4fd3r\\n[INFO] /E:/QtwCode/foodie/"}
+{"timestamp":"2026-07-31T10:51:37Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"2254dabb-6c40-40eb-bd04-4e940ce1bbbb\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\resources\\\\application.yml\",\"old_string\":\"    # \u93ba\u581f\u6f48\u9365\u70b6\u769f\u9366\u677f\u6f43\u951b\u5825\u300f\u6d93\udc8e LINE Console \u9365\u70b6\u769f\u9427\u85c9\u6095\u9357\udc95 + \u9353\u5d87\udcab\udcaf\u93b7\udcbf code \u93c3\u6735\u7af4\u9477\u8fbe\u7d31LINE \u6d60\u546e\u724e\u6960\u5c7c\u7af4\u9477\u5b58\udc80\u044d\u7d1d\u6d93\u5d85\u7584\u95c4\u546d\u6d16\u748b\u51bf\u7d1a\\n    redirect-uri: https://backend.amazewayhk.com/auth/line/callback\",\"new_string\":\"    # \u93ba\u581f\u6f48\u9365\u70b6\u769f\u9366\u677f\u6f43\u951b\u5825\u300f\u6d93\udc8e LINE Console \u9365\u70b6\u769f\u9427\u85c9\u6095\u9357\udc95 + \u9353\u5d87\udcab\udcaf\u93b7\udcbf code \u93c3\u6735\u7af4\u9477\u8fbe\u7d31LINE \u6d60\u546e\u724e\u6960\u5c7c\u7af4\u9477\u5b58\udc80\u044d\u7d1d\u6d93\u5d85\u7584\u95c4\u546d\u6d16\u748b\u51bf\u7d1a\\n    redirect-uri: https://foodieapi.waimai-paotui.com/auth/line/callback\",\"replace_all\":false},\"tool_use_id\":\"call_e3cf2c39baa7427e8462ca98\"}\n"}
+{"timestamp":"2026-07-31T10:51:44Z","event":"parse_error","raw":"{\"session_id\":\"06c28987-b1c2-4b76-a49d-4b567999a01e\",\"transcript_path\":\"C:\\\\Users\\\\qmj\\\\.claude\\\\projects\\\\E--QtwCode-foodie-foodie-server\\\\06c28987-b1c2-4b76-a49d-4b567999a01e.jsonl\",\"cwd\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\",\"prompt_id\":\"2254dabb-6c40-40eb-bd04-4e940ce1bbbb\",\"permission_mode\":\"bypassPermissions\",\"effort\":{\"level\":\"high\"},\"hook_event_name\":\"PostToolUse\",\"tool_name\":\"Edit\",\"tool_input\":{\"file_path\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\resources\\\\application.yml\",\"old_string\":\"    # \u93ba\u581f\u6f48\u9365\u70b6\u769f\u9366\u677f\u6f43\u951b\u5825\u300f\u6d93\udc8e LINE Console \u9365\u70b6\u769f\u9427\u85c9\u6095\u9357\udc95 + \u9353\u5d87\udcab\udcaf\u93b7\udcbf code \u93c3\u6735\u7af4\u9477\u8fbe\u7d31LINE \u6d60\u546e\u724e\u6960\u5c7c\u7af4\u9477\u5b58\udc80\u044d\u7d1d\u6d93\u5d85\u7584\u95c4\u546d\u6d16\u748b\u51bf\u7d1a\\n    redirect-uri: https://backend.amazewayhk.com/auth/line/callback\",\"new_string\":\"    # \u93ba\u581f\u6f48\u9365\u70b6\u769f\u9366\u677f\u6f43\u951b\u5825\u300f\u6d93\udc8e LINE Console \u9365\u70b6\u769f\u9427\u85c9\u6095\u9357\udc95 + \u9353\u5d87\udcab\udcaf\u93b7\udcbf code \u93c3\u6735\u7af4\u9477\u8fbe\u7d31LINE \u6d60\u546e\u724e\u6960\u5c7c\u7af4\u9477\u5b58\udc80\u044d\u7d1d\u6d93\u5d85\u7584\u95c4\u546d\u6d16\u748b\u51bf\u7d1a\\n    redirect-uri: https://foodieapi.waimai-paotui.com/auth/line/callback\",\"replace_all\":false},\"tool_response\":{\"filePath\":\"E:\\\\QtwCode\\\\foodie\\\\foodie_server\\\\ruoyi-admin\\\\src\\\\main\\\\resources\\\\application.yml\",\"ol"}

+ 29 - 8
ruoyi-admin/src/main/java/com/ruoyi/app/utils/oauth/OAuthVerifyService.java

@@ -197,8 +197,10 @@ public class OAuthVerifyService {
      */
     private String verifyLine(String code) {
         try {
-            log.debug("[OAuth][LINE] code={}", code);
-            // 1. code 换 access_token
+            // code 一次性、短期有效;client_secret 永不记录日志
+            log.info("[OAuth][LINE] 换 token 请求: grant_type=authorization_code, client_id={}, redirect_uri={}, code={}...(len={})",
+                    lineClientId, lineRedirectUri, safePrefix(code), code == null ? 0 : code.length());
+            // 1. code 换 access_token(httpPostForm 内会打印 HTTP 状态码 + LINE 原始响应体,含 error/error_description)
             JSONObject token = JSONObject.parseObject(httpPostForm(lineTokenUrl, new String[][]{
                     {"grant_type", "authorization_code"},
                     {"code", code},
@@ -206,15 +208,15 @@ public class OAuthVerifyService {
                     {"client_id", lineClientId},
                     {"client_secret", lineClientSecret}
             }));
-            log.debug("[OAuth][LINE] token 返回: {}", token);
             if (token == null || token.getString("access_token") == null) {
-                log.warn("[OAuth][LINE] 换 token 失败: {}", token);
+                log.warn("[OAuth][LINE] 换 token 失败(响应无 access_token): {}", token);
                 throw new ServiceException(MessageUtils.message("no.oauth.token.invalid", "LINE"));
             }
             String accessToken = token.getString("access_token");
-            // 2. access_token 换用户信息
+            log.info("[OAuth][LINE] 换 token 成功: access_token={}...(len={}), scope={}",
+                    safePrefix(accessToken), accessToken.length(), token.getString("scope"));
+            // 2. access_token 换用户信息(httpGet 内会打印 HTTP 状态码 + profile 原始响应体)
             JSONObject profile = JSONObject.parseObject(httpGet(lineProfileUrl, accessToken));
-            log.debug("[OAuth][LINE] profile 返回: {}", profile);
             if (profile == null) {
                 log.warn("[OAuth][LINE] profile 返回空");
                 throw new ServiceException(MessageUtils.message("no.oauth.token.invalid", "LINE"));
@@ -247,7 +249,17 @@ public class OAuthVerifyService {
                 get.setHeader("Authorization", "Bearer " + bearer);
             }
             try (CloseableHttpResponse resp = client.execute(get)) {
-                return EntityUtils.toString(resp.getEntity(), "UTF-8");
+                int status = resp.getStatusLine().getStatusCode();
+                String body = EntityUtils.toString(resp.getEntity(), "UTF-8");
+                // google tokeninfo 的 url 含 id_token,只记 host 避免 JWT 刷屏
+                String host;
+                try {
+                    host = new URL(url).getHost();
+                } catch (Exception e) {
+                    host = url;
+                }
+                log.info("[OAuth][HTTP] GET host={} status={} body={}", host, status, body);
+                return body;
             }
         }
     }
@@ -267,8 +279,17 @@ public class OAuthVerifyService {
             }
             post.setEntity(new UrlEncodedFormEntity(pairs, "UTF-8"));
             try (CloseableHttpResponse resp = client.execute(post)) {
-                return EntityUtils.toString(resp.getEntity(), "UTF-8");
+                int status = resp.getStatusLine().getStatusCode();
+                String body = EntityUtils.toString(resp.getEntity(), "UTF-8");
+                // LINE 换 token 失败时 status=400,body 含 error/error_description,是定位根因的关键
+                log.info("[OAuth][HTTP] POST {} status={} body={}", url, status, body);
+                return body;
             }
         }
     }
+
+    /** 取前 8 字符做日志脱敏(code/access_token 不全文打印)。 */
+    private static String safePrefix(String s) {
+        return s == null ? "" : s.substring(0, Math.min(8, s.length()));
+    }
 }

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -63,7 +63,7 @@ oauth:
     # Channel Secret(换 token 用,勿泄露)
     client-secret: "880fb850c17a3399d207100144a1cb67"
     # 授权回调地址(须与 LINE Console 回调白名单 + 前端拿 code 时一致;LINE 仅校验一致性,不实际回调)
-    redirect-uri: https://backend.amazewayhk.com/auth/line/callback
+    redirect-uri: https://foodieapi.waimai-paotui.com/auth/line/callback
     # 用 code 换 access_token 的端点(一般不改)
     token-url: https://api.line.me/oauth2/v2.1/token
     # 用 access_token 换用户信息的端点(一般不改)