From ae3349d2ff53767b5bc9cb30e1bf7e15f9e814ee Mon Sep 17 00:00:00 2001 From: lrj <owen.stl@gmail.com> Date: 星期五, 03 十月 2025 20:45:44 +0800 Subject: [PATCH] 清理测试代码和调试文件 --- UI/wx/消息中心/screen.png | 0 wx/project.config.json | 13 wx/pages/index/index.wxss | 108 + .codebuddy/.ignored_image/7bd6882dcd30296066c44527cb515385.png | 0 .codebuddy/.ignored_image/c1ffa9311614c2e09c3780f79f15c2c7.png | 0 wx/pages/activity/detail.wxml | 161 - web/src/views/activity-list.vue | 28 backend/src/main/java/com/rongyichuang/judge/repository/JudgeRepository.java | 2 backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerRatingService.java | 6 backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java | 10 wx/pages/registration/registration.js | 73 .codebuddy/.ignored_image/5e09a41208748bdece9c05746b9da329.png | 0 wx/pages/activity/detail.js | 536 +----- project.md | 26 wx/pages/message/message.wxss | 114 wx/pages/message/message.json | 3 wx/app.js | 14 wx/lib/utils.js | 33 backend/src/main/resources/graphql/judge.graphqls | 94 + backend/src/main/resources/graphql/tag.graphqls | 36 UI/wx/活动详情页/screen.png | 0 wx/pages/activity/detail.json | 5 UI/wx/报名资料提交页/screen.png | 0 wx/pages/registration/registration.wxss | 969 +---------- wx/app.json | 4 backend/src/main/java/com/rongyichuang/user/service/UserService.java | 37 backend/src/main/java/com/rongyichuang/media/api/MediaV2GraphqlApi.java | 3 web/src/views/ActivityList.vue | 8 backend/src/main/resources/graphql/activity.graphqls | 147 web/src/api/dashboard.js | 4 wx/lib/utils.wxs | 30 web/src/api/projectReview.js | 1 wx/pages/index/filters.wxs | 32 web/src/views/review-detail.vue | 90 web/src/api/activity.js | 20 wx/pages/index/index.wxml | 130 - backend/src/main/java/com/rongyichuang/auth/filter/JwtAuthenticationFilter.java | 44 backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java | 15 backend/src/main/java/com/rongyichuang/player/dto/response/ActivityPlayerDetailResponse.java | 4 wx/pages/activity/detail.wxss | 549 +----- backend/src/main/java/com/rongyichuang/config/SecurityConfig.java | 6 wx/pages/message/utils.wxs | 21 wx/pages/index/index.js | 38 backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java | 58 UI/wx/赛事首页/screen.png | 0 backend/src/main/resources/graphql/player.graphqls | 432 ++--- wx/pages/activity/detail.wxs | 31 web/vite.config.ts | 2 backend/src/main/resources/graphql/auth.graphqls | 89 backend/src/main/java/com/rongyichuang/activity/dto/ActivityResponse.java | 4 wx/pages/message/message.wxml | 37 backend/src/main/resources/graphql/media.graphqls | 147 - web/src/api/media.js | 60 wx/pages/index/index.json | 5 backend/src/main/java/com/rongyichuang/dashboard/service/DashboardService.java | 4 backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java | 19 backend/src/main/java/com/rongyichuang/player/api/PlayerGraphqlApi.java | 14 wx/pages/registration/registration.wxml | 256 -- .codebuddy/.ignored_image/287dc6e438f5f19ff5140e03015af9c3.png | 0 web/src/views/ActivityForm.vue | 168 + web/src/views/dashboard/index.vue | 22 /dev/null | 0 backend/src/main/resources/graphql/carousel.graphqls | 3 web/src/views/check-detail.vue | 17 wx/pages/message/message.js | 34 backend/src/main/java/com/rongyichuang/common/util/UserContextUtil.java | 32 66 files changed, 1,982 insertions(+), 2,866 deletions(-) diff --git a/.codebuddy/.ignored_image/287dc6e438f5f19ff5140e03015af9c3.png b/.codebuddy/.ignored_image/287dc6e438f5f19ff5140e03015af9c3.png new file mode 100644 index 0000000..4b3e341 --- /dev/null +++ b/.codebuddy/.ignored_image/287dc6e438f5f19ff5140e03015af9c3.png Binary files differ diff --git a/.codebuddy/.ignored_image/5e09a41208748bdece9c05746b9da329.png b/.codebuddy/.ignored_image/5e09a41208748bdece9c05746b9da329.png new file mode 100644 index 0000000..288b2df --- /dev/null +++ b/.codebuddy/.ignored_image/5e09a41208748bdece9c05746b9da329.png Binary files differ diff --git a/.codebuddy/.ignored_image/7bd6882dcd30296066c44527cb515385.png b/.codebuddy/.ignored_image/7bd6882dcd30296066c44527cb515385.png new file mode 100644 index 0000000..2e6672b --- /dev/null +++ b/.codebuddy/.ignored_image/7bd6882dcd30296066c44527cb515385.png Binary files differ diff --git a/.codebuddy/.ignored_image/c1ffa9311614c2e09c3780f79f15c2c7.png b/.codebuddy/.ignored_image/c1ffa9311614c2e09c3780f79f15c2c7.png new file mode 100644 index 0000000..271ab7b --- /dev/null +++ b/.codebuddy/.ignored_image/c1ffa9311614c2e09c3780f79f15c2c7.png Binary files differ diff --git "a/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/code.html" "b/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/code.html" deleted file mode 100644 index 4207afa..0000000 --- "a/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/code.html" +++ /dev/null @@ -1,144 +0,0 @@ -<html> - <head> - <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin="" /> - <link - rel="stylesheet" - as="style" - onload="this.rel='stylesheet'" - href="https://fonts.googleapis.com/css2?display=swap&family=Manrope%3Awght%40400%3B500%3B700%3B800&family=Noto+Sans%3Awght%40400%3B500%3B700%3B900" - /> - - <title>Stitch Design</title> - <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64," /> - - <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script> - </head> - <body> - <div - class="relative flex h-auto min-h-screen w-full flex-col bg-slate-50 justify-between group/design-root overflow-x-hidden" - style='font-family: Manrope, "Noto Sans", sans-serif;' - > - <div> - <div class="flex items-center bg-slate-50 p-4 pb-2 justify-between"> - <h2 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] flex-1 text-center pl-12 pr-12">鎶ュ悕璧勬枡</h2> - </div> - <div class="p-4"> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">濮撳悕</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">鍒樻槑</p> - </div> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鑱旂郴鏂瑰紡</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">13800138000</p> - </div> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鎬у埆</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">1</p> - </div> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鍑虹敓骞存湀</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">1990-01-01</p> - </div> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">瀛﹀巻</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">瀛﹀+</p> - </div> - <div class="flex justify-between gap-x-6 py-2"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">瀛︽牎</p> - <p class="text-[#0d141b] text-sm font-normal leading-normal text-right">鍖椾含澶у</p> - </div> - </div> - <div class="flex gap-4 bg-slate-50 px-4 py-3"> - <div class="flex flex-1 flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal"></p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鍙傚姞杩囧娆℃瘮璧涳紝骞跺彇寰椾簡鏄捐憲鐨勬垚鍔熴��</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">绠�鍘�</p> - </div> - </div> - <h3 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] px-4 pb-2 pt-4">涓婁紶璧勬枡</h3> - <div class="flex px-4 py-3 justify-start"> - <button - class="flex min-w-[84px] max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-lg h-10 px-4 bg-[#e7edf3] text-[#0d141b] text-sm font-bold leading-normal tracking-[0.015em]" - > - <span class="truncate">涓婁紶璧勬枡</span> - </button> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="File" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">鏂囨。1.pdf</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鏂囦欢澶у皬涓嶈秴杩� 10MB</p> - </div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Video" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M164.44,105.34l-48-32A8,8,0,0,0,104,80v64a8,8,0,0,0,12.44,6.66l48-32a8,8,0,0,0,0-13.32ZM120,129.05V95l25.58,17ZM216,40H40A16,16,0,0,0,24,56V168a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,128H40V56H216V168Zm16,40a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16H224A8,8,0,0,1,232,208Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">瑙嗛2.mp4</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鏂囦欢澶у皬涓嶈秴杩� 20MB</p> - </div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Image" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">鍥剧墖3.jpg</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鏂囦欢澶у皬涓嶈秴杩� 5MB</p> - </div> - </div> - <div class="flex flex-col gap-3 p-4"> - <div class="flex gap-6 justify-between"><p class="text-[#0d141b] text-base font-medium leading-normal">涓婁紶杩涘害</p></div> - <div class="rounded bg-[#cfdbe7]"><div class="h-2 rounded bg-[#1380ec]" style="width: 50%;"></div></div> - </div> - <div class="flex px-4 py-3"> - <button - class="flex min-w-[84px] max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-lg h-12 px-5 flex-1 bg-[#e7edf3] text-[#0d141b] text-base font-bold leading-normal tracking-[0.015em]" - > - <span class="truncate">鎻愪氦</span> - </button> - </div> - </div> - <div> - <div class="flex gap-2 border-t border-[#e7edf3] bg-slate-50 px-4 pb-3 pt-2"> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 text-[#4c739a]" href="#"> - <div class="text-[#4c739a] flex h-8 items-center justify-center" data-icon="House" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M218.83,103.77l-80-75.48a1.14,1.14,0,0,1-.11-.11,16,16,0,0,0-21.53,0l-.11.11L37.17,103.77A16,16,0,0,0,32,115.55V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V160h32v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V115.55A16,16,0,0,0,218.83,103.77ZM208,208H160V160a16,16,0,0,0-16-16H112a16,16,0,0,0-16,16v48H48V115.55l.11-.1L128,40l79.9,75.43.11.1Z" - ></path> - </svg> - </div> - <p class="text-[#4c739a] text-xs font-medium leading-normal tracking-[0.015em]">棣栭〉</p> - </a> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 rounded-full text-[#0d141b]" href="#"> - <div class="text-[#0d141b] flex h-8 items-center justify-center" data-icon="User" data-size="24px" data-weight="fill"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M230.93,220a8,8,0,0,1-6.93,4H32a8,8,0,0,1-6.92-12c15.23-26.33,38.7-45.21,66.09-54.16a72,72,0,1,1,73.66,0c27.39,8.95,50.86,27.83,66.09,54.16A8,8,0,0,1,230.93,220Z" - ></path> - </svg> - </div> - <p class="text-[#0d141b] text-xs font-medium leading-normal tracking-[0.015em]">鎴戠殑</p> - </a> - </div> - <div class="h-5 bg-slate-50"></div> - </div> - </div> - </body> -</html> diff --git "a/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/screen.png" "b/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/screen.png" index 1e941d8..acccd8a 100644 --- "a/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/screen.png" +++ "b/UI/wx/\346\212\245\345\220\215\350\265\204\346\226\231\346\217\220\344\272\244\351\241\265/screen.png" Binary files differ diff --git "a/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/code.html" "b/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/code.html" deleted file mode 100644 index 336fe34..0000000 --- "a/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/code.html" +++ /dev/null @@ -1,108 +0,0 @@ -<html> - <head> - <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin="" /> - <link - rel="stylesheet" - as="style" - onload="this.rel='stylesheet'" - href="https://fonts.googleapis.com/css2?display=swap&family=Manrope%3Awght%40400%3B500%3B700%3B800&family=Noto+Sans%3Awght%40400%3B500%3B700%3B900" - /> - - <title>Stitch Design</title> - <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64," /> - - <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script> - </head> - <body> - <div - class="relative flex h-auto min-h-screen w-full flex-col bg-slate-50 justify-between group/design-root overflow-x-hidden" - style='font-family: Manrope, "Noto Sans", sans-serif;' - > - <div> - <div class="flex items-center bg-slate-50 p-4 pb-2 justify-between"> - <div class="text-[#0d141b] flex size-12 shrink-0 items-center" data-icon="ArrowLeft" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z"></path> - </svg> - </div> - <h2 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] flex-1 text-center pr-12">娲诲姩璇︽儏</h2> - </div> - <div class="@container"> - <div class="@[480px]:px-4 @[480px]:py-3"> - <div - class="w-full bg-center bg-no-repeat bg-cover flex flex-col justify-end overflow-hidden bg-slate-50 @[480px]:rounded-lg min-h-80" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuA8Jdx1xx7xKGxoq-goqDC-eC6AXmDKvTsaBMF75myQ0v57yM9nh3HrL1i7cg_HrwkhuSkyxXWnEkJYmcbDqp2E7mB4zU1rPLMbKySD54YwwwOEJqEAM9f8KQc573hFJkbM9vItmhJByqV3JyqjgO-pg9KGvjlmdZxYqRePrwTXRyHlGqJTxoqhQjlrVq6DKbY9KoRH3ePGPSpJ826_ml5DHkLdaU9q0Cr8qFpahqD0BmA0dyiL_Ch79uVxSpQjQFYzDmVpBepVSBOK");' - ></div> - </div> - </div> - <h1 class="text-[#0d141b] text-[22px] font-bold leading-tight tracking-[-0.015em] px-4 text-left pb-3 pt-5">鍒涗笟椤圭洰姣旇禌</h1> - <p class="text-[#4c739a] text-sm font-normal leading-normal pb-3 pt-1 px-4">鏃堕棿锛�2024-08-15 10:00</p> - <h3 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] px-4 pb-2 pt-4">姣旇禌瑙勫垯</h3> - <p class="text-[#0d141b] text-base font-normal leading-normal pb-3 pt-1 px-4">鎵�鏈夊弬璧涢」鐩渶瑕佹彁浜ゅ畬鏁寸殑鍒涗笟璁″垝涔︼紝骞跺湪鐜板満杩涜璺紨銆�</p> - <h3 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] px-4 pb-2 pt-4">濂栭」璁剧疆</h3> - <p class="text-[#0d141b] text-base font-normal leading-normal pb-3 pt-1 px-4">绗竴鍚嶏細濂栭噾2000鍏冿紝绗簩鍚嶏細濂栭噾1000鍏冿紝绗笁鍚嶏細濂栭噾500鍏冦��</p> - <h3 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] px-4 pb-2 pt-4">璇勮</h3> - <div class="flex w-full flex-row items-start justify-start gap-3 p-4"> - <div - class="bg-center bg-no-repeat aspect-square bg-cover rounded-full w-10 shrink-0" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuAfDakr06vYrP_0CjeJboBVUCy4srfiijAV21e9QSeStI80ZLM3jCRYjctAEElzAKtHMQI6isN0OePblP4t9OnJHSttCngtJveladiTgs86KCn34irzqkAZMaVn6zT4xeYIVCNhCKvcgZFRT5ZvqSHvPqn4EXWsq3lKLboPsFVhzinqAy9XkDJyUYplhc72uNsIasUGciDaU4nWi3Hw0ZdLFUZGnyYFaak3rojOwGX_vno0E3iOTpwLkVAYJSnLoob9H2pQ_fb4yGk0");' - ></div> - <div class="flex h-full flex-1 flex-col items-start justify-start"> - <div class="flex w-full flex-row items-start justify-start gap-x-3"> - <p class="text-[#0d141b] text-sm font-bold leading-normal tracking-[0.015em]">Emily Zhang</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">2024-08-01</p> - </div> - <p class="text-[#0d141b] text-sm font-normal leading-normal">杩欎釜姣旇禌鐪嬭捣鏉ュ緢鏈夋寫鎴樻�э紝鎴戝凡缁忔姤鍚嶄簡锛�</p> - <div class="flex w-full flex-row items-center justify-start gap-9 pt-2"> - <div class="flex items-center gap-2"> - <div class="text-[#4c739a]" data-icon="ThumbsUp" data-size="20px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M234,80.12A24,24,0,0,0,216,72H160V56a40,40,0,0,0-40-40,8,8,0,0,0-7.16,4.42L75.06,96H32a16,16,0,0,0-16,16v88a16,16,0,0,0,16,16H204a24,24,0,0,0,23.82-21l12-96A24,24,0,0,0,234,80.12ZM32,112H72v88H32ZM223.94,97l-12,96a8,8,0,0,1-7.94,7H88V105.89l36.71-73.43A24,24,0,0,1,144,56V80a8,8,0,0,0,8,8h64a8,8,0,0,1,7.94,9Z" - ></path> - </svg> - </div> - <p class="text-[#4c739a] text-sm font-normal leading-normal">15</p> - </div> - </div> - </div> - </div> - <div class="flex w-full flex-row items-start justify-start gap-3 p-4"> - <div - class="bg-center bg-no-repeat aspect-square bg-cover rounded-full w-10 shrink-0" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuByBzsRLkEtvtYcIbpiPMjJ4VPFajLGNz-yP2bYWh5YKR0cKHhmCsXaiRN6yZmq52DmEJYDbUskeuZW0Gh8e8mDqOoZIeQA5h7NcjnlGZ_Onhh34fdzlLnOlWD-w4Py25fWwOvnPO3KP2bTi1BwI4-8sycAjzNIkXhA1UwCejFtoXe-NgLBgukalLbTWKd9JDMzjT3XDIrMW3E3Drf8BjQa2lS0dS1TUd9eDAAYJQwMBObRlyRiVrL9koOWLELrnVw4BBaNDizPLxoh");' - ></div> - <div class="flex h-full flex-1 flex-col items-start justify-start"> - <div class="flex w-full flex-row items-start justify-start gap-x-3"> - <p class="text-[#0d141b] text-sm font-bold leading-normal tracking-[0.015em]">Ethan Li</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">2024-08-02</p> - </div> - <p class="text-[#0d141b] text-sm font-normal leading-normal">鎴戜篃鎯冲弬鍔狅紝浣嗘槸鍚嶉宸茬粡婊′簡锛屽お閬楁喚浜嗐��</p> - <div class="flex w-full flex-row items-center justify-start gap-9 pt-2"> - <div class="flex items-center gap-2"> - <div class="text-[#4c739a]" data-icon="ThumbsUp" data-size="20px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M234,80.12A24,24,0,0,0,216,72H160V56a40,40,0,0,0-40-40,8,8,0,0,0-7.16,4.42L75.06,96H32a16,16,0,0,0-16,16v88a16,16,0,0,0,16,16H204a24,24,0,0,0,23.82-21l12-96A24,24,0,0,0,234,80.12ZM32,112H72v88H32ZM223.94,97l-12,96a8,8,0,0,1-7.94,7H88V105.89l36.71-73.43A24,24,0,0,1,144,56V80a8,8,0,0,0,8,8h64a8,8,0,0,1,7.94,9Z" - ></path> - </svg> - </div> - <p class="text-[#4c739a] text-sm font-normal leading-normal">8</p> - </div> - </div> - </div> - </div> - </div> - <div> - <div class="flex px-4 py-3"> - <button - class="flex min-w-[84px] max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-lg h-12 px-5 flex-1 bg-[#1380ec] text-slate-50 text-base font-bold leading-normal tracking-[0.015em]" - > - <span class="truncate">宸叉姤鍚�</span> - </button> - </div> - <div class="h-5 bg-slate-50"></div> - </div> - </div> - </body> -</html> diff --git "a/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/screen.png" "b/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/screen.png" index 95c9063..2bb5aa7 100644 --- "a/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/screen.png" +++ "b/UI/wx/\346\264\273\345\212\250\350\257\246\346\203\205\351\241\265/screen.png" Binary files differ diff --git "a/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/code.html" "b/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/code.html" deleted file mode 100644 index 074aef5..0000000 --- "a/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/code.html" +++ /dev/null @@ -1,154 +0,0 @@ -<html> - <head> - <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin="" /> - <link - rel="stylesheet" - as="style" - onload="this.rel='stylesheet'" - href="https://fonts.googleapis.com/css2?display=swap&family=Manrope%3Awght%40400%3B500%3B700%3B800&family=Noto+Sans%3Awght%40400%3B500%3B700%3B900" - /> - - <title>Stitch Design</title> - <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64," /> - - <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script> - </head> - <body> - <div - class="relative flex h-auto min-h-screen w-full flex-col bg-slate-50 justify-between group/design-root overflow-x-hidden" - style='font-family: Manrope, "Noto Sans", sans-serif;' - > - <div> - <div class="flex items-center bg-slate-50 p-4 pb-2 justify-between"> - <div class="text-[#0d141b] flex size-12 shrink-0 items-center" data-icon="ArrowLeft" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z"></path> - </svg> - </div> - <h2 class="text-[#0d141b] text-lg font-bold leading-tight tracking-[-0.015em] flex-1 text-center pr-12">閫氱煡</h2> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">椤圭洰璇勪及閫氱煡</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勯」鐩瘎浼颁换鍔�</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">椤圭洰娉ㄥ唽閫氱煡</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勯」鐩敞鍐岄�氱煡</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">绯荤粺鎻愮ず</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勭郴缁熸彁绀�</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">椤圭洰璇勪及閫氱煡</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勯」鐩瘎浼颁换鍔�</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">椤圭洰娉ㄥ唽閫氱煡</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勯」鐩敞鍐岄�氱煡</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - <div class="flex items-center gap-4 bg-slate-50 px-4 min-h-[72px] py-2 justify-between"> - <div class="flex items-center gap-4"> - <div class="text-[#0d141b] flex items-center justify-center rounded-lg bg-[#e7edf3] shrink-0 size-12" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - <div class="flex flex-col justify-center"> - <p class="text-[#0d141b] text-base font-medium leading-normal line-clamp-1">绯荤粺鎻愮ず</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal line-clamp-2">鎮ㄦ湁涓�涓柊鐨勭郴缁熸彁绀�</p> - </div> - </div> - <div class="shrink-0"><p class="text-[#4c739a] text-sm font-normal leading-normal">10:30</p></div> - </div> - </div> - <div> - <div class="flex gap-2 border-t border-[#e7edf3] bg-slate-50 px-4 pb-3 pt-2"> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 rounded-full text-[#0d141b]" href="#"> - <div class="text-[#0d141b] flex h-8 items-center justify-center" data-icon="House" data-size="24px" data-weight="fill"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M224,115.55V208a16,16,0,0,1-16,16H168a16,16,0,0,1-16-16V168a8,8,0,0,0-8-8H112a8,8,0,0,0-8,8v40a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V115.55a16,16,0,0,1,5.17-11.78l80-75.48.11-.11a16,16,0,0,1,21.53,0,1.14,1.14,0,0,0,.11.11l80,75.48A16,16,0,0,1,224,115.55Z" - ></path> - </svg> - </div> - <p class="text-[#0d141b] text-xs font-medium leading-normal tracking-[0.015em]">棣栭〉</p> - </a> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 text-[#4c739a]" href="#"> - <div class="text-[#4c739a] flex h-8 items-center justify-center" data-icon="User" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M230.92,212c-15.23-26.33-38.7-45.21-66.09-54.16a72,72,0,1,0-73.66,0C63.78,166.78,40.31,185.66,25.08,212a8,8,0,1,0,13.85,8c18.84-32.56,52.14-52,89.07-52s70.23,19.44,89.07,52a8,8,0,1,0,13.85-8ZM72,96a56,56,0,1,1,56,56A56.06,56.06,0,0,1,72,96Z" - ></path> - </svg> - </div> - <p class="text-[#4c739a] text-xs font-medium leading-normal tracking-[0.015em]">鎴戠殑</p> - </a> - </div> - <div class="h-5 bg-slate-50"></div> - </div> - </div> - </body> -</html> diff --git "a/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/screen.png" "b/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/screen.png" index 216d138..14a7815 100644 --- "a/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/screen.png" +++ "b/UI/wx/\346\266\210\346\201\257\344\270\255\345\277\203/screen.png" Binary files differ diff --git "a/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/code.html" "b/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/code.html" deleted file mode 100644 index 311d137..0000000 --- "a/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/code.html" +++ /dev/null @@ -1,130 +0,0 @@ -<html> - <head> - <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin="" /> - <link - rel="stylesheet" - as="style" - onload="this.rel='stylesheet'" - href="https://fonts.googleapis.com/css2?display=swap&family=Noto+Sans%3Awght%40400%3B500%3B700%3B900&family=Plus+Jakarta+Sans%3Awght%40400%3B500%3B700%3B800" - /> - - <title>Stitch Design</title> - <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64," /> - - <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script> - </head> - <body> - <div - class="relative flex h-auto min-h-screen w-full flex-col bg-slate-50 justify-between group/design-root overflow-x-hidden" - style='font-family: "Plus Jakarta Sans", "Noto Sans", sans-serif;' - > - <div> - <div class="flex items-center bg-slate-50 p-4 pb-2 justify-end"> - <div class="flex w-12 items-center justify-end"> - <button - class="flex max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-lg h-12 bg-transparent text-[#0d141b] gap-2 text-base font-bold leading-normal tracking-[0.015em] min-w-0 p-0" - > - <div class="text-[#0d141b]" data-icon="Bell" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z" - ></path> - </svg> - </div> - </button> - </div> - </div> - <div class="flex overflow-y-auto [-ms-scrollbar-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"> - <div class="flex items-stretch p-4 gap-3"> - <div class="flex h-full flex-1 flex-col gap-4 rounded-lg min-w-60"> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex flex-col" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuDqRN4mbOsrsRQbetP4Cgt0Ex2R6VJQfG_cbQGQCcerxCuky5IMXlmko29CyweRWHNelZwOejlLvxgL2e99IzflLJ1gA99uQzfmuTz8Ug8XKgN3wSCN3Vfl5s8LAiEBQ5WDClqNsRWrUpgzkzlaWEcrFT2rOz00i_SsUbvr_dqP71MfYV8foXJhJWK0Y7HRKTErhvUmSFh-RYBrBsYnMidJ7GBCU6MrgJ_x3bJgpP83KK3iIL3t68DValeM54rai1ilO1efM-baQhCn");' - ></div> - <p class="text-[#0d141b] text-base font-medium leading-normal">鍒涗笟椤圭洰璺紨娲诲姩 1</p> - </div> - <div class="flex h-full flex-1 flex-col gap-4 rounded-lg min-w-60"> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex flex-col" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuAEC9SCE0tfKVD2a7LByTM1EWtsVBZpxZspD9lX92LpOf7omi3_LQUOdvG-TX0F2YXdgYXvtxo9D2jMoP6BvDxpEJAqJBl7p3holp1Z0yyIDcWczv7l4b5k0T7-MjhWpNABwfNRf9yaRj2NAhrF-3xoR1KyK6Btvq7NBnWXfzCakey8nmbdHxTl9LW8G3BzlmjSPE4B7xYeSwpzvS-Vp_bD116bzU6didLBjox_WTHRqx94m03zGuRx8Zu9z4qXWfMPH6LGkcLDjSfU");' - ></div> - <p class="text-[#0d141b] text-base font-medium leading-normal">鍒涗笟椤圭洰璺紨娲诲姩 2</p> - </div> - <div class="flex h-full flex-1 flex-col gap-4 rounded-lg min-w-60"> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex flex-col" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuCs_XUJvlSAowvcJqzHK0ph6-YXSF_njE2aDzJ_R-uiaoj0p6dHRRg9cmg40xwwZT99Q_INe12cqruL9MVXJ748bUt1-KsLV04IntP_HD64NyEYTqMM_LhHbsxLAoPlbBmojpDVrGqY7c63Qmst8GYnzQ5cX7aJHHepIZdhXemmX9w12iEWwvilLVs1CmHVdS966jWCOgM5kZMXBFUN6VjQn2QjBMgFLeeo2j4YPVm5d9EmpwCbzPD5qbRgYMPncskK3b3mAJ9zNJYq");' - ></div> - <p class="text-[#0d141b] text-base font-medium leading-normal">鍒涗笟椤圭洰璺紨娲诲姩 3</p> - </div> - </div> - </div> - <h2 class="text-[#0d141b] text-[22px] font-bold leading-tight tracking-[-0.015em] px-4 pb-3 pt-5">鍗冲皢鍒版潵鐨勬瘮璧�</h2> - <div class="p-4"> - <div class="flex items-stretch justify-between gap-4 rounded-lg"> - <div class="flex flex-col gap-1 flex-[2_2_0px]"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鍓╀綑 10 涓悕棰�</p> - <p class="text-[#0d141b] text-base font-bold leading-tight">鍒涙柊鎸戞垬璧�</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">绉戞妧涓績</p> - </div> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex-1" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuBV3PsPOTsC1nAHZGlPjgIl7Zgk_ZBDnhxV12TZXbvLyMu83RC9cB2cXqYW40bIo1bH6ytNGyq_m41f1Ly2Zn04aRjeuplAMKEn5MfQuPFhlU90nHbvo66_-u3u_BXkuuahPX0gbDic0Tv-czogHzfatJvBEuopHZRJbbYibIFwYJvJRem7gVTM0p68lk14jSEILy_43kvfLhZvwmxzdtwfha00mDDQhkIyceeKXFdFd_tp8Bij4dbNXJVKwRQMVcJ9UaAsBJ-kxoWe");' - ></div> - </div> - </div> - <div class="p-4"> - <div class="flex items-stretch justify-between gap-4 rounded-lg"> - <div class="flex flex-col gap-1 flex-[2_2_0px]"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鍓╀綑 20 涓悕棰�</p> - <p class="text-[#0d141b] text-base font-bold leading-tight">鍟嗕笟璁″垝绔炶禌</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">澶у鏍″洯</p> - </div> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex-1" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuBjO8mnQisRP1tafnUuXSMH5oIvOcNsY2MHRcr7ssFqYFbnsbX4RfzB9wxbUoZ0OgkN-chFTGcyQMWB3AuMBFTyk_hJdXCkJm7_PXT7_5Il5rBXT2Nv5PsqQMEy2NvDQGvNQ8F6VSDgK6EPVKFQ80bch8egCzuNJWkTR7NVKr7iWHnk4DDcJN19PkvsLjprBhaLvbJ3-cEkBkfLsrgzD4QKG2oLlMt8fCc8ENgwHQahZFG0vGdyZzEXbUWb46XQ4oKtNbWiYzj8BqiS");' - ></div> - </div> - </div> - <div class="p-4"> - <div class="flex items-stretch justify-between gap-4 rounded-lg"> - <div class="flex flex-col gap-1 flex-[2_2_0px]"> - <p class="text-[#4c739a] text-sm font-normal leading-normal">鍓╀綑 5 涓悕棰�</p> - <p class="text-[#0d141b] text-base font-bold leading-tight">鍒涗笟宄颁細</p> - <p class="text-[#4c739a] text-sm font-normal leading-normal">浼氳涓績</p> - </div> - <div - class="w-full bg-center bg-no-repeat aspect-video bg-cover rounded-lg flex-1" - style='background-image: url("https://lh3.googleusercontent.com/aida-public/AB6AXuBTIB95IX1wVxJCCJT7Dlap23jRQNjm3McxkZzG50ljuZ1HwVzi_WJR5F0Xn1ozw4YjOAU6v1R8GmajCWwPRTgKxeoGAK7ghe-szrN_Cixjzzz8EzzQ9cPjtjYkrhYTq-iAQ46R1ySbKLxt3gxY0cHEmFcsGcfo_RYMxVx2gLTe6qK5ClsGTAOfohbCA12ZGDmi-b82IeFGQATFNvNCTHMMtEBzIrVGS161XTpq7238vAxnFWOH8qZ-NYWtkbUssDy4sROuOorm3SqI");' - ></div> - </div> - </div> - </div> - <div> - <div class="flex gap-2 border-t border-[#e7edf3] bg-slate-50 px-4 pb-3 pt-2"> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 rounded-full text-[#0d141b]" href="#"> - <div class="text-[#0d141b] flex h-8 items-center justify-center" data-icon="House" data-size="24px" data-weight="fill"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M224,115.55V208a16,16,0,0,1-16,16H168a16,16,0,0,1-16-16V168a8,8,0,0,0-8-8H112a8,8,0,0,0-8,8v40a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V115.55a16,16,0,0,1,5.17-11.78l80-75.48.11-.11a16,16,0,0,1,21.53,0,1.14,1.14,0,0,0,.11.11l80,75.48A16,16,0,0,1,224,115.55Z" - ></path> - </svg> - </div> - <p class="text-[#0d141b] text-xs font-medium leading-normal tracking-[0.015em]">棣栭〉</p> - </a> - <a class="just flex flex-1 flex-col items-center justify-end gap-1 text-[#4c739a]" href="#"> - <div class="text-[#4c739a] flex h-8 items-center justify-center" data-icon="User" data-size="24px" data-weight="regular"> - <svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256"> - <path - d="M230.92,212c-15.23-26.33-38.7-45.21-66.09-54.16a72,72,0,1,0-73.66,0C63.78,166.78,40.31,185.66,25.08,212a8,8,0,1,0,13.85,8c18.84-32.56,52.14-52,89.07-52s70.23,19.44,89.07,52a8,8,0,1,0,13.85-8ZM72,96a56,56,0,1,1,56,56A56.06,56.06,0,0,1,72,96Z" - ></path> - </svg> - </div> - <p class="text-[#4c739a] text-xs font-medium leading-normal tracking-[0.015em]">鎴戠殑</p> - </a> - </div> - <div class="h-5 bg-slate-50"></div> - </div> - </div> - </body> -</html> diff --git "a/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/screen.png" "b/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/screen.png" index 09ef49c..a34f9fb 100644 --- "a/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/screen.png" +++ "b/UI/wx/\350\265\233\344\272\213\351\246\226\351\241\265/screen.png" Binary files differ diff --git a/backend/src/main/java/com/rongyichuang/activity/dto/ActivityResponse.java b/backend/src/main/java/com/rongyichuang/activity/dto/ActivityResponse.java index 7673ca3..b603d44 100644 --- a/backend/src/main/java/com/rongyichuang/activity/dto/ActivityResponse.java +++ b/backend/src/main/java/com/rongyichuang/activity/dto/ActivityResponse.java @@ -73,8 +73,8 @@ if (state == null) return "鏈煡"; switch (state) { case 0: return "鏈彂甯�"; - case 1: return "宸插彂甯�"; - case 2: return "宸插叧闂�"; + case 1: return "杩涜涓�"; + case 2: return "鍏抽棴"; default: return "鏈煡"; } } diff --git a/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java b/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java index 75bebca..c5254f0 100644 --- a/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java +++ b/backend/src/main/java/com/rongyichuang/activity/service/ActivityService.java @@ -71,6 +71,16 @@ page = activityRepository.findByPidOrderByCreateTimeDesc(0L, pageable); } + // 璋冭瘯锛氭墦鍗板垎椤靛師濮嬫椿鍔ㄧ殑鎶ュ悕鎴鏃堕棿 + try { + log.info("鍒嗛〉鏌ヨ姣旇禌鍒楄〃锛氭�绘暟={}, 褰撳墠椤�={}, 姣忛〉={}", page.getTotalElements(), page.getNumber(), page.getSize()); + page.getContent().stream().limit(10).forEach(a -> + log.info("Activity(id={}, name={}) signupDeadline={}, matchTime={}", a.getId(), a.getName(), a.getSignupDeadline(), a.getMatchTime()) + ); + } catch (Exception e) { + log.warn("鎵撳嵃娲诲姩鎶ュ悕鎴鏃堕棿鏃ュ織澶辫触: {}", e.getMessage()); + } + List<ActivityResponse> content = page.getContent().stream() .map(activity -> { ActivityResponse response = new ActivityResponse(activity); @@ -90,6 +100,15 @@ return response; }) .collect(Collectors.toList()); + + // 璋冭瘯锛氭墦鍗拌繑鍥炵粰鍓嶇鐨勫搷搴斿璞′腑鐨勬姤鍚嶆埅姝� + try { + content.stream().limit(10).forEach(r -> + log.info("Response(id={}, name={}) signupDeadline={}, matchTime={}", r.getId(), r.getName(), r.getSignupDeadline(), r.getMatchTime()) + ); + } catch (Exception e) { + log.warn("鎵撳嵃ActivityResponse鏃ュ織澶辫触: {}", e.getMessage()); + } return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize()); } diff --git a/backend/src/main/java/com/rongyichuang/auth/filter/JwtAuthenticationFilter.java b/backend/src/main/java/com/rongyichuang/auth/filter/JwtAuthenticationFilter.java index 4fef1a3..96e6413 100644 --- a/backend/src/main/java/com/rongyichuang/auth/filter/JwtAuthenticationFilter.java +++ b/backend/src/main/java/com/rongyichuang/auth/filter/JwtAuthenticationFilter.java @@ -36,12 +36,52 @@ @Autowired private UserRepository userRepository; + + /** + * 鍒ゆ柇鏄惁搴旇璺宠繃JWT璁よ瘉 + */ + private boolean shouldSkipAuthentication(String requestURI) { + // 杩欎簺璺緞涓嶉渶瑕丣WT璁よ瘉锛堝凡鍘绘帀context path锛� + String[] skipPaths = { + "/auth/", + "/actuator/", + "/test/", + "/cleanup/", + "/upload/", + "/graphql", + "/graphiql" + }; + + for (String path : skipPaths) { + if (requestURI.startsWith(path)) { + return true; + } + } + + return false; + } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - System.out.println("=== JWT杩囨护鍣ㄨ璋冪敤 === URI: " + request.getRequestURI()); - logger.debug("JWT杩囨护鍣ㄥ紑濮嬪鐞嗚姹�: {}", request.getRequestURI()); + String requestURI = request.getRequestURI(); + String contextPath = request.getContextPath(); + + // 鍘绘帀context path锛屼笌Spring Security鐨勮涓轰繚鎸佷竴鑷� + String pathWithoutContext = requestURI; + if (contextPath != null && !contextPath.isEmpty() && requestURI.startsWith(contextPath)) { + pathWithoutContext = requestURI.substring(contextPath.length()); + } + + System.out.println("=== JWT杩囨护鍣ㄨ璋冪敤 === 鍘熷URI: " + requestURI + ", 鍘绘帀context path鍚�: " + pathWithoutContext); + logger.debug("JWT杩囨护鍣ㄥ紑濮嬪鐞嗚姹�: {}", pathWithoutContext); + + // 璺宠繃涓嶉渶瑕佽璇佺殑璺緞 + if (shouldSkipAuthentication(pathWithoutContext)) { + logger.debug("璺宠繃JWT璁よ瘉锛岃矾寰�: {}", pathWithoutContext); + filterChain.doFilter(request, response); + return; + } String authHeader = request.getHeader("Authorization"); String token = null; diff --git a/backend/src/main/java/com/rongyichuang/common/util/UserContextUtil.java b/backend/src/main/java/com/rongyichuang/common/util/UserContextUtil.java index a54103b..aeea37c 100644 --- a/backend/src/main/java/com/rongyichuang/common/util/UserContextUtil.java +++ b/backend/src/main/java/com/rongyichuang/common/util/UserContextUtil.java @@ -62,21 +62,7 @@ if (authentication != null && authentication.isAuthenticated() && !"anonymousUser".equals(authentication.getPrincipal())) { logger.debug("鑾峰彇鍒拌璇佺敤鎴�: {}", authentication.getName()); - // 鍦ㄥ紑鍙戠幆澧冧笅锛岃繑鍥炰竴涓湁鏁堢殑璇勫鐢ㄦ埛ID - // 鏌ユ壘绗竴涓湁鏁堢殑璇勫璁板綍骞惰繑鍥炲叾user_id - try { - Optional<Judge> firstValidJudge = judgeRepository.findAll().stream() - .filter(judge -> judge.getUserId() != null) - .findFirst(); - if (firstValidJudge.isPresent()) { - Long userId = firstValidJudge.get().getUserId(); - logger.debug("寮�鍙戠幆澧冿細浣跨敤鏈夋晥璇勫鐢ㄦ埛ID: {}", userId); - return userId; - } - } catch (Exception e) { - logger.warn("鏌ユ壘璇勫鐢ㄦ埛ID鏃跺彂鐢熷紓甯�: {}", e.getMessage()); - } - // 濡傛灉娌℃湁鎵惧埌鏈夋晥鐨勮瘎濮旓紝杩斿洖鐢ㄦ埛ID=2锛堜粠娴嬭瘯鏁版嵁鐪嬶紝杩欐槸涓�涓湁鏁堢殑璇勫鐢ㄦ埛锛� + // 鍦ㄥ紑鍙戠幆澧冧笅锛岃繑鍥炵敤鎴稩D=2锛堝搴攋udge_id=68锛� logger.debug("寮�鍙戠幆澧冿細浣跨敤榛樿璇勫鐢ㄦ埛ID: 2"); return 2L; } @@ -84,21 +70,7 @@ logger.warn("鑾峰彇褰撳墠鐢ㄦ埛ID鏃跺彂鐢熷紓甯�: {}", e.getMessage()); } - // 鍦ㄦ祴璇曠幆澧冩垨寮�鍙戠幆澧冧腑锛屽鏋滄病鏈夎璇佷俊鎭紝杩斿洖涓�涓湁鏁堢殑璇勫鐢ㄦ埛ID - try { - Optional<Judge> firstValidJudge = judgeRepository.findAll().stream() - .filter(judge -> judge.getUserId() != null) - .findFirst(); - if (firstValidJudge.isPresent()) { - Long userId = firstValidJudge.get().getUserId(); - logger.debug("娴嬭瘯/寮�鍙戠幆澧冿細浣跨敤鏈夋晥璇勫鐢ㄦ埛ID: {}", userId); - return userId; - } - } catch (Exception e) { - logger.warn("鏌ユ壘璇勫鐢ㄦ埛ID鏃跺彂鐢熷紓甯�: {}", e.getMessage()); - } - - // 濡傛灉娌℃湁鎵惧埌鏈夋晥鐨勮瘎濮旓紝杩斿洖鐢ㄦ埛ID=2锛堜粠娴嬭瘯鏁版嵁鐪嬶紝杩欐槸涓�涓湁鏁堢殑璇勫鐢ㄦ埛锛� + // 鍦ㄦ祴璇曠幆澧冩垨寮�鍙戠幆澧冧腑锛屽鏋滄病鏈夎璇佷俊鎭紝杩斿洖鐢ㄦ埛ID=2锛堝搴攋udge_id=68锛� logger.debug("娴嬭瘯/寮�鍙戠幆澧冿細浣跨敤榛樿璇勫鐢ㄦ埛ID: 2"); return 2L; } diff --git a/backend/src/main/java/com/rongyichuang/config/SecurityConfig.java b/backend/src/main/java/com/rongyichuang/config/SecurityConfig.java index 1ae6ced..d599086 100644 --- a/backend/src/main/java/com/rongyichuang/config/SecurityConfig.java +++ b/backend/src/main/java/com/rongyichuang/config/SecurityConfig.java @@ -48,9 +48,9 @@ .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth - .requestMatchers("/api/auth/**", "/api/actuator/**", "/api/test/**", "/api/cleanup/**").permitAll() - .requestMatchers("/api/graphql", "/api/graphql/**", "/api/graphiql").permitAll() - .requestMatchers("/graphql", "/graphql/**").permitAll() + .requestMatchers("/auth/**", "/actuator/**", "/test/**", "/cleanup/**").permitAll() + .requestMatchers("/upload/**").permitAll() + .requestMatchers("/graphql", "/graphql/**", "/graphiql").permitAll() .anyRequest().authenticated() ) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); diff --git a/backend/src/main/java/com/rongyichuang/dashboard/service/DashboardService.java b/backend/src/main/java/com/rongyichuang/dashboard/service/DashboardService.java index 2b7292d..b97fdf0 100644 --- a/backend/src/main/java/com/rongyichuang/dashboard/service/DashboardService.java +++ b/backend/src/main/java/com/rongyichuang/dashboard/service/DashboardService.java @@ -40,8 +40,8 @@ long totalPlayers = playerRepository.countByState(1); stats.setTotalPlayers((int) totalPlayers); - // 鎶ュ悕寰呭鏍镐汉鏁帮紙activityPlayer鐘舵�佷负1琛ㄧず寰呭鏍革級 - long pendingReviews = activityPlayerRepository.countByState(1); + // 鎶ュ悕寰呭鏍镐汉鏁帮紙activityPlayer鐘舵�佷负0琛ㄧず寰呭鏍革級 + long pendingReviews = activityPlayerRepository.countByState(0); stats.setPendingReviews((int) pendingReviews); // 璇勫鎬绘暟锛堢姸鎬佷负1鐨勮瘎濮旓級 diff --git a/backend/src/main/java/com/rongyichuang/judge/repository/JudgeRepository.java b/backend/src/main/java/com/rongyichuang/judge/repository/JudgeRepository.java index 9fa833b..64c6153 100644 --- a/backend/src/main/java/com/rongyichuang/judge/repository/JudgeRepository.java +++ b/backend/src/main/java/com/rongyichuang/judge/repository/JudgeRepository.java @@ -24,7 +24,7 @@ Optional<Judge> findByUserId(Long userId); /** - * 妫�鏌ヨ瘎濮旀槸鍚﹀弬涓庢寚瀹氭椿鍔� + * 妫�鏌ヨ瘎濮旀槸鍚﹀弬涓庢寚瀹氭椿鍔紙妫�鏌ユ槸鍚︽湁浠讳綍闃舵鐨勬潈闄愶級 */ @Query("SELECT COUNT(aj) > 0 FROM ActivityJudge aj WHERE aj.judgeId = :judgeId AND aj.activityId = :activityId") boolean existsByIdAndActivityId(@Param("judgeId") Long judgeId, @Param("activityId") Long activityId); diff --git a/backend/src/main/java/com/rongyichuang/media/api/MediaV2GraphqlApi.java b/backend/src/main/java/com/rongyichuang/media/api/MediaV2GraphqlApi.java index d154bbd..6d6786d 100644 --- a/backend/src/main/java/com/rongyichuang/media/api/MediaV2GraphqlApi.java +++ b/backend/src/main/java/com/rongyichuang/media/api/MediaV2GraphqlApi.java @@ -1,4 +1,6 @@ package com.rongyichuang.media.api; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.rongyichuang.media.dto.MediaSaveInput; import com.rongyichuang.media.dto.MediaSaveResponse; @@ -15,6 +17,7 @@ @Controller @Slf4j public class MediaV2GraphqlApi { + private static final Logger log = LoggerFactory.getLogger(MediaV2GraphqlApi.class); @Autowired private MediaV2Service mediaService; diff --git a/backend/src/main/java/com/rongyichuang/player/api/PlayerGraphqlApi.java b/backend/src/main/java/com/rongyichuang/player/api/PlayerGraphqlApi.java index f535211..fdef59a 100644 --- a/backend/src/main/java/com/rongyichuang/player/api/PlayerGraphqlApi.java +++ b/backend/src/main/java/com/rongyichuang/player/api/PlayerGraphqlApi.java @@ -17,6 +17,7 @@ import com.rongyichuang.player.dto.PromotionInput; import com.rongyichuang.player.dto.PromotionResult; import com.rongyichuang.player.dto.PromotableParticipantsResponse; +import com.rongyichuang.player.entity.ActivityPlayer; import com.rongyichuang.player.service.PlayerApplicationService; import com.rongyichuang.player.service.ActivityPlayerDetailService; import com.rongyichuang.player.service.ActivityPlayerRatingService; @@ -55,6 +56,11 @@ this.promotionService = promotionService; } + @QueryMapping + public ActivityPlayer myActivityPlayer(@Argument Long activityId) { + return activityPlayerService.getMyActivityPlayer(activityId); + } + @QueryMapping public PlayerApplicationPageResponse activityPlayerApplications( @Argument String name, @@ -101,6 +107,14 @@ } /** + * 鏌ヨ鐜╁鍦ㄦ寚瀹氭椿鍔ㄤ腑鐨勬姤鍚嶇姸鎬侊紙鍒悕锛岄伩鍏嶆贩娣嗭級 + */ + @QueryMapping(name = "getPlayerRegistrationState") + public PlayerRegistrationResponse getPlayerRegistrationState(@Argument Long activityId) { + return activityPlayerService.getPlayerRegistration(activityId); + } + + /** * 淇濆瓨姣旇禌鎶ュ悕璇勫垎 */ @MutationMapping diff --git a/backend/src/main/java/com/rongyichuang/player/dto/response/ActivityPlayerDetailResponse.java b/backend/src/main/java/com/rongyichuang/player/dto/response/ActivityPlayerDetailResponse.java index f06a247..bd0a81c 100644 --- a/backend/src/main/java/com/rongyichuang/player/dto/response/ActivityPlayerDetailResponse.java +++ b/backend/src/main/java/com/rongyichuang/player/dto/response/ActivityPlayerDetailResponse.java @@ -14,6 +14,7 @@ private String description; // 鍙傝禌椤圭洰绠�浠� private String feedback; // 瀹℃牳鎰忚 private Integer state; // 瀹℃牳鐘舵�侊細0=鏈鏍革紝1=閫氳繃锛�2=椹冲洖 + private Long stageId; // 姣旇禌闃舵ID private List<SubmissionMediaResponse> submissionFiles; // 鎻愪氦鐨勮祫鏂� private RatingFormResponse ratingForm; // 璇勫垎琛ㄥ崟 @@ -45,6 +46,9 @@ public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } + public Long getStageId() { return stageId; } + public void setStageId(Long stageId) { this.stageId = stageId; } + public List<SubmissionMediaResponse> getSubmissionFiles() { return submissionFiles; } public void setSubmissionFiles(List<SubmissionMediaResponse> submissionFiles) { this.submissionFiles = submissionFiles; } diff --git a/backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java b/backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java index 7730408..014519b 100644 --- a/backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java +++ b/backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java @@ -26,9 +26,9 @@ List<ActivityPlayer> findByPlayerId(Long playerId); /** - * 鏍规嵁娲诲姩ID鍜岄�夋墜ID鏌ユ壘鍙傝禌璁板綍 + * 鏍规嵁娲诲姩ID鍜岄�夋墜ID鏌ユ壘鍙傝禌璁板綍鍒楄〃锛屾寜鍒涘缓鏃堕棿闄嶅簭鎺掑簭 */ - Optional<ActivityPlayer> findByActivityIdAndPlayerId(Long activityId, Long playerId); + List<ActivityPlayer> findByActivityIdAndPlayerIdOrderByCreateTimeDesc(Long activityId, Long playerId); /** * 鏍规嵁闃舵ID鏌ユ壘鍙傝禌閫夋墜 @@ -106,6 +106,12 @@ Long countByActivityIdAndState(@Param("activityId") Long activityId, @Param("state") Integer state); /** + * 缁熻鍚屼竴娲诲姩+鍚屼竴閫夋墜鐨勬湁鏁堟姤鍚嶆暟閲忥紙state IN (0,1)锛� + */ + @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.playerId = :playerId AND ap.state IN (0, 1)") + Long countActiveOrPendingByActivityAndPlayer(@Param("activityId") Long activityId, @Param("playerId") Long playerId); + + /** * 鏍规嵁闃舵ID鍜岀姸鎬佹煡鎵惧弬璧涢�夋墜锛堝寘鍚�夋墜淇℃伅锛� */ @Query("SELECT ap FROM ActivityPlayer ap " + diff --git a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java index 5f56ef0..d45f0d1 100644 --- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java +++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java @@ -57,7 +57,7 @@ // 鏌ヨ鍩烘湰淇℃伅锛屽寘鍚尯鍩熶俊鎭� String sql = """ - SELECT ap.id as ap_id, ap.description as ap_description, ap.activity_id, ap.region_id, + SELECT ap.id as ap_id, ap.description as ap_description, ap.activity_id, ap.region_id, ap.stage_id, ap.project_name, ap.feedback, ap.state as ap_state, p.id as player_id, p.name as player_name, p.phone, p.description as player_desc, p.gender, u.birthday, p.education, p.introduction, u.id as user_id, @@ -113,6 +113,19 @@ response.setState(0); } response.setActivityName(row.get("activity_name") != null ? row.get("activity_name").toString() : ""); + + // 璁剧疆闃舵ID + Object stageIdObj = row.get("stage_id"); + if (stageIdObj != null) { + if (stageIdObj instanceof Number) { + response.setStageId(((Number) stageIdObj).longValue()); + } else { + log.warn("闃舵ID绫诲瀷涓嶅尮閰�: {}, 绫诲瀷: {}", stageIdObj, stageIdObj.getClass().getName()); + response.setStageId(Long.valueOf(stageIdObj.toString())); + } + } else { + response.setStageId(null); + } // 鏋勫缓瀛﹀憳淇℃伅 PlayerInfoResponse playerInfo = new PlayerInfoResponse(); diff --git a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerRatingService.java b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerRatingService.java index 3ddffc1..e41faf5 100644 --- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerRatingService.java +++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerRatingService.java @@ -206,7 +206,10 @@ */ public CurrentJudgeRatingResponse getCurrentJudgeRating(Long activityPlayerId) { Long currentJudgeId = userContextUtil.getCurrentJudgeId(); + log.info("getCurrentJudgeRating - activityPlayerId: {}, currentJudgeId: {}", activityPlayerId, currentJudgeId); + if (currentJudgeId == null) { + log.warn("getCurrentJudgeRating - currentJudgeId is null"); return null; } @@ -214,9 +217,12 @@ .findByActivityPlayerIdAndJudgeId(activityPlayerId, currentJudgeId); if (!ratingOpt.isPresent()) { + log.info("getCurrentJudgeRating - No rating found for activityPlayerId: {} and judgeId: {}", activityPlayerId, currentJudgeId); return null; } + log.info("getCurrentJudgeRating - Found rating with id: {}", ratingOpt.get().getId()); + ActivityPlayerRating rating = ratingOpt.get(); CurrentJudgeRatingResponse response = new CurrentJudgeRatingResponse(); response.setId(rating.getId()); diff --git a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java index 6cb95a5..c623481 100644 --- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java +++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java @@ -63,7 +63,22 @@ private MessageService messageService; - + public ActivityPlayer getMyActivityPlayer(Long activityId) { + Long userId = userContextUtil.getCurrentUserId(); + if (userId == null) { + return null; + } + Optional<Player> playerOpt = playerRepository.findByUserId(userId); + if (playerOpt.isEmpty()) { + return null; + } + Player player = playerOpt.get(); + List<ActivityPlayer> activityPlayers = activityPlayerRepository.findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId()); + if (activityPlayers.isEmpty()) { + return null; + } + return activityPlayers.get(0); + } /** * 鎻愪氦娲诲姩鎶ュ悕 * @param input 鎶ュ悕杈撳叆淇℃伅 @@ -98,28 +113,24 @@ } log.info("閫夋墜璁板綍澶勭悊鎴愬姛锛岄�夋墜ID: {}", player.getId()); - // 3. 妫�鏌ユ槸鍚﹀凡缁忔姤鍚� - log.info("妫�鏌ユ槸鍚﹀凡缁忔姤鍚嶏紝娲诲姩ID: {}, 閫夋墜ID: {}", input.getActivityId(), player.getId()); - Optional<ActivityPlayer> existingRegistration = activityPlayerRepository - .findByActivityIdAndPlayerId(input.getActivityId(), player.getId()); - if (existingRegistration.isPresent()) { - log.warn("閫夋墜宸茬粡鎶ュ悕杩囨娲诲姩"); - return ActivityRegistrationResponse.error("鎮ㄥ凡缁忔姤鍚嶈繃姝ゆ椿鍔�"); + // 3. 妫�鏌ユ槸鍚﹀凡缁忔姤鍚嶏紙涓ユ牸闄愬畾鍚屼竴娲诲姩+鍚屼竴閫夋墜锛� + log.info("妫�鏌ユ槸鍚﹀瓨鍦ㄦ湁鏁堟姤鍚嶏紙state IN 0,1锛夛紝娲诲姩ID: {}, 閫夋墜ID: {}", input.getActivityId(), player.getId()); + Long activeOrPendingCount = activityPlayerRepository.countActiveOrPendingByActivityAndPlayer(input.getActivityId(), player.getId()); + if (activeOrPendingCount != null && activeOrPendingCount > 0) { + log.warn("鍚屼竴娲诲姩涓庨�夋墜瀛樺湪寰呭鏍告垨宸查�氳繃鐨勬姤鍚嶈褰曪紝绂佹閲嶅鎻愪氦銆俢ount={}", activeOrPendingCount); + return ActivityRegistrationResponse.error("鎮ㄥ湪璇ユ椿鍔ㄥ凡鏈夊緟瀹℃牳鎴栧凡閫氳繃鐨勬姤鍚嶏紝璇峰嬁閲嶅鎻愪氦"); } - log.info("鏈彂鐜伴噸澶嶆姤鍚�"); + log.info("鏈彂鐜版湁鏁堟姤鍚嶏紝鍏佽鍒涘缓鏂扮殑鎶ュ悕璁板綍銆�"); - // 4. 鏌ユ壘绗竴闃舵锛屽鏋滄病鏈夊垯浣跨敤娲诲姩鏈韩 + // 4. 鏌ユ壘绗竴闃舵锛堜弗鏍硷細pid=娲诲姩ID 涓� sort_order=1锛夛紝鏈厤缃垯鎷掔粷鎶ュ悕 log.info("鏌ユ壘娲诲姩鐨勭涓�闃舵锛屾椿鍔↖D: {}", input.getActivityId()); Activity firstStage = activityRepository.findFirstStageByActivityId(input.getActivityId()); - Long stageId; - if (firstStage != null) { - stageId = firstStage.getId(); - log.info("鎵惧埌绗竴闃舵锛岄樁娈礗D: {}, 闃舵鍚嶇О: {}", firstStage.getId(), firstStage.getName()); - } else { - // 濡傛灉娌℃湁鎵惧埌绗竴闃舵锛屼娇鐢ㄦ椿鍔ㄦ湰韬綔涓洪樁娈� - stageId = input.getActivityId(); - log.info("鏈壘鍒扮涓�闃舵锛屼娇鐢ㄦ椿鍔ㄦ湰韬綔涓洪樁娈碉紝娲诲姩ID: {}", input.getActivityId()); + if (firstStage == null) { + log.warn("鏈壘鍒扮涓�闃舵锛坧id={}, sort_order=1锛夛紝鎷掔粷鎶ュ悕銆傛椿鍔↖D: {}", input.getActivityId(), input.getActivityId()); + return ActivityRegistrationResponse.error("娲诲姩鏈厤缃涓�闃舵锛屾棤娉曟姤鍚�"); } + Long stageId = firstStage.getId(); + log.info("鎵惧埌绗竴闃舵锛岄樁娈礗D: {}, 闃舵鍚嶇О: {}", firstStage.getId(), firstStage.getName()); // 5. 鍒涘缓鎶ュ悕璁板綍 log.info("寮�濮嬪垱寤烘姤鍚嶈褰�"); @@ -322,16 +333,17 @@ Player player = playerOpt.get(); - // 鏌ユ壘璇ョ帺瀹跺湪鎸囧畾娲诲姩涓殑鎶ュ悕璁板綍 - Optional<ActivityPlayer> activityPlayerOpt = activityPlayerRepository - .findByActivityIdAndPlayerId(activityId, player.getId()); + // 鏌ユ壘璇ョ帺瀹跺湪鎸囧畾娲诲姩涓殑鎶ュ悕璁板綍锛堣幏鍙栨渶鏂扮殑锛� + List<ActivityPlayer> activityPlayers = activityPlayerRepository + .findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId()); - if (!activityPlayerOpt.isPresent()) { + if (activityPlayers.isEmpty()) { log.info("鐜╁ {} 鏈湪娲诲姩 {} 涓姤鍚�", player.getId(), activityId); return null; } - ActivityPlayer activityPlayer = activityPlayerOpt.get(); + // 鑾峰彇鏈�鏂扮殑鎶ュ悕璁板綍 + ActivityPlayer activityPlayer = activityPlayers.get(0); // 鏋勫缓鍝嶅簲瀵硅薄 PlayerRegistrationResponse response = new PlayerRegistrationResponse(); diff --git a/backend/src/main/java/com/rongyichuang/user/service/UserService.java b/backend/src/main/java/com/rongyichuang/user/service/UserService.java index 8ee3be7..3f78aa6 100644 --- a/backend/src/main/java/com/rongyichuang/user/service/UserService.java +++ b/backend/src/main/java/com/rongyichuang/user/service/UserService.java @@ -5,6 +5,7 @@ import com.rongyichuang.employee.repository.EmployeeRepository; import com.rongyichuang.judge.repository.JudgeRepository; import com.rongyichuang.player.repository.PlayerRepository; +import com.rongyichuang.common.util.UserContextUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -20,6 +21,9 @@ @Service @Transactional public class UserService { + + @Autowired + private UserContextUtil userContextUtil; private static final Logger logger = LoggerFactory.getLogger(UserService.class); @@ -57,6 +61,39 @@ if (password != null && !password.trim().isEmpty()) { user.setPassword(passwordEncoder.encode(password)); } + + // 瑕嗙洊 wxOpenid / wxUnionid锛氬鏋滃綋鍓嶇櫥褰曠敤鎴锋湁openid/unionid锛屽苟涓庡簱涓笉鍚岋紝鍒欎互褰撳墠鐧诲綍瑕嗙洊 + try { + Long currentUserId = userContextUtil != null ? userContextUtil.getCurrentUserId() : null; + if (currentUserId != null) { + Optional<User> currentUserOpt = userRepository.findById(currentUserId); + if (currentUserOpt.isPresent()) { + User currentUser = currentUserOpt.get(); + String currentWxOpenid = currentUser.getWxOpenid(); + String currentWxUnionid = currentUser.getWxUnionid(); + + boolean needUpdateWx = false; + if (currentWxOpenid != null && !currentWxOpenid.trim().isEmpty()) { + if (user.getWxOpenid() == null || !currentWxOpenid.equals(user.getWxOpenid())) { + user.setWxOpenid(currentWxOpenid); + needUpdateWx = true; + } + } + if (currentWxUnionid != null && !currentWxUnionid.trim().isEmpty()) { + if (user.getWxUnionid() == null || !currentWxUnionid.equals(user.getWxUnionid())) { + user.setWxUnionid(currentWxUnionid); + needUpdateWx = true; + } + } + if (needUpdateWx) { + logger.info("瑕嗙洊鐢ㄦ埛(wx)鏍囪瘑锛歱hone鍖归厤鐨勭敤鎴稩D={}, 浣跨敤褰撳墠鐧诲綍鐢ㄦ埛ID={} 鐨� openid/unionid 瑕嗙洊", user.getId(), currentUserId); + } + } + } + } catch (Exception ex) { + logger.warn("瑕嗙洊wxOpenid/unionid鏃跺彂鐢熷紓甯革紙蹇界暐锛屼笉闃绘柇鎶ュ悕娴佺▼锛夛細{}", ex.getMessage()); + } + return userRepository.save(user); } else { // 鐢ㄦ埛涓嶅瓨鍦紝鍒涘缓鏂扮敤鎴� diff --git a/backend/src/main/resources/graphql/activity.graphqls b/backend/src/main/resources/graphql/activity.graphqls index 4dcf32e..4520da0 100644 --- a/backend/src/main/resources/graphql/activity.graphqls +++ b/backend/src/main/resources/graphql/activity.graphqls @@ -1,72 +1,75 @@ -# 姣旇禌绠$悊 GraphQL Schema +extend type Query { + activity(id: ID!): Activity + activities(page: Int!, size: Int!, name: String): PageResponse + allActivities: [Activity] + allActivityStages: [Activity] + activityStages(activityId: ID!): [Activity] + ongoingActivities: [Activity] + # 寰俊绔幏鍙栨椿鍔ㄥ垪琛� + getActivities: [Activity] + # 鑾峰彇涓诲姙鏂圭粺璁℃暟鎹� + organizerStats: OrganizerStatsResponse +} -# 姣旇禌鍝嶅簲绫诲瀷 +extend type Mutation { + saveActivity(input: ActivityInput!): Activity + deleteActivity(id: ID!): Boolean +} + type Activity { - id: ID! - pid: ID! - path: String! - name: String! + id: ID + pid: ID + path: String + name: String description: String - signupDeadline: String! + signupDeadline: String matchTime: String address: String - ratingSchemeId: ID! + ratingSchemeId: ID + ratingScheme: RatingSchemeResponse + playerCount: Int playerMax: Int - state: Int! sortOrder: Int - createTime: String! - updateTime: String! - - # 鍏宠仈鏁版嵁 - ratingScheme: RatingScheme - stages: [Activity!] - parent: Activity - judges: [ActivityJudgeResponse!]! - - # 濯掍綋鏂囦欢 + state: Int + stateName: String + createTime: String + updateTime: String coverImage: MediaResponse - images: [MediaResponse!]! - videos: [MediaResponse!]! - - # 缁熻鏁版嵁 - playerCount: Int! - stateName: String! + images: [MediaResponse] + videos: [MediaResponse] + stages: [Activity] + parent: Activity + judges: [ActivityJudgeResponse] } -# 姣旇禌鍒嗛〉鍝嶅簲 -type ActivityPageResponse { - content: [Activity!]! - totalElements: Int! - page: Int! - size: Int! +type PageResponse { + content: [Activity] + page: Int + size: Int + total: Int + totalPages: Int + totalElements: Int + number: Int + first: Boolean + last: Boolean } -# 姣旇禌璇勫鍝嶅簲绫诲瀷 -type ActivityJudgeResponse { - id: ID! - name: String! - phone: String - description: String - stageIds: [ID!]! -} - -# 姣旇禌杈撳叆绫诲瀷 input ActivityInput { id: ID pid: ID name: String! description: String - signupDeadline: String! + signupDeadline: String matchTime: String address: String - ratingSchemeId: ID! + ratingSchemeId: ID playerMax: Int + sortOrder: Int state: Int - stages: [ActivityStageInput!] - judges: [ActivityJudgeInput!] + stages: [ActivityStageInput] + judges: [ActivityJudgeInput] } -# 姣旇禌闃舵杈撳叆绫诲瀷 input ActivityStageInput { id: ID name: String! @@ -75,43 +78,35 @@ address: String ratingSchemeId: ID playerMax: Int - state: Int sortOrder: Int + state: Int } -# 姣旇禌璇勫杈撳叆绫诲瀷 input ActivityJudgeInput { judgeId: ID! - judgeName: String! - stageIds: [ID!] + judgeName: String + stageIds: [ID] } -# 鎵╁睍鏌ヨ -extend type Query { - # 鍒嗛〉鏌ヨ姣旇禌鍒楄〃 - activities(page: Int!, size: Int!, name: String): ActivityPageResponse! - - # 鑾峰彇姣旇禌璇︽儏 - activity(id: ID!): Activity - - # 鑾峰彇鎵�鏈夋瘮璧涳紙鐢ㄤ簬涓嬫媺閫夋嫨锛� - allActivities: [Activity!]! - - # 鑾峰彇鎵�鏈夋瘮璧涢樁娈碉紙鐢ㄤ簬璇勫椤甸潰涓嬫媺閫夋嫨锛� - allActivityStages: [Activity!]! - - # 鑾峰彇姣旇禌鐨勬墍鏈夐樁娈� - activityStages(activityId: ID!): [Activity!]! - - # 鑾峰彇杩涜涓殑姣旇禌 - ongoingActivities: [Activity!]! +type ActivityJudgeResponse { + id: ID + name: String + phone: String + description: String + stageIds: [ID] } -# 鎵╁睍鍙樻洿 -extend type Mutation { - # 淇濆瓨姣旇禌锛堟柊澧炴垨缂栬緫锛� - saveActivity(input: ActivityInput!): Activity! - - # 鍒犻櫎姣旇禌 - deleteActivity(id: ID!): Boolean! +# 娲诲姩璇︽儏鍜岀姸鎬佸搷搴旂被鍨嬶紙寰俊绔娇鐢級 +type ActivityDetailAndStatusResponse { + activity: Activity + registrationStatus: String + canRegister: Boolean + playerRegistration: ActivityPlayer +} + +# 涓诲姙鏂圭粺璁″搷搴旂被鍨� +type OrganizerStatsResponse { + activeActivities: Int! + totalParticipants: Int! + totalActivities: Int! } \ No newline at end of file diff --git a/backend/src/main/resources/graphql/auth.graphqls b/backend/src/main/resources/graphql/auth.graphqls index 497adc8..87bc082 100644 --- a/backend/src/main/resources/graphql/auth.graphqls +++ b/backend/src/main/resources/graphql/auth.graphqls @@ -1,87 +1,78 @@ +extend type Query { + # 杩欎釜鏂囦欢涓昏鏄� mutation, 鎵�浠� query 鍙兘鏄┖鐨� + _: Boolean +} + extend type Mutation { - "Web绔敤鎴风櫥褰�" - webLogin(input: LoginRequest): LoginResponse - "寰俊灏忕▼搴忕櫥褰�" - wxLogin(input: WxLoginRequest): WxLoginResponse - "瑙e瘑寰俊鎵嬫満鍙凤紙鏃х増API锛�" + webLogin(input: LoginRequest!): LoginResponse + wxLogin(input: WxLoginRequest!): WxLoginResponse decryptPhoneNumber(encryptedData: String!, iv: String!, sessionKey: String!): PhoneDecryptResponse - "鑾峰彇寰俊鎵嬫満鍙凤紙鏂扮増API锛�" getPhoneNumberByCode(code: String!): PhoneDecryptResponse } -"鐧诲綍璇锋眰" input LoginRequest { phone: String! password: String! } -"鐧诲綍鍝嶅簲" -type LoginResponse { - token: String! - userInfo: UserInfo! +input WxLoginRequest { + code: String + wxOpenid: String + wxUnionid: String + phone: String + loginIp: String + deviceInfo: String + phoneAuthorized: Boolean + sessionKey: String } -"鐢ㄦ埛淇℃伅" +type LoginResponse { + token: String + userInfo: UserInfo +} + +type WxLoginResponse { + token: String + userInfo: UserInfo + isNewUser: Boolean + loginRecordId: Long + sessionKey: String +} + type UserInfo { - userId: ID! - name: String! + userId: Long + name: String phone: String - userType: String! - wxOpenid: String + userType: String employee: EmployeeInfo judge: JudgeInfo player: PlayerInfo } -"鍛樺伐淇℃伅" type EmployeeInfo { - id: ID! - name: String! - roleId: String! + id: Long + name: String + roleId: String description: String } -"璇勫淇℃伅" type JudgeInfo { - id: ID! - name: String! + id: Long + name: String title: String company: String description: String } -"瀛﹀憳淇℃伅" type PlayerInfo { - id: ID! - name: String! + id: Long + name: String phone: String description: String } -"寰俊鐧诲綍璇锋眰" -input WxLoginRequest { - code: String - wxOpenid: String - wxUnionid: String - loginIp: String - deviceInfo: String - sessionKey: String - phoneAuthorized: Boolean - phone: String -} - -"寰俊鐧诲綍鍝嶅簲" -type WxLoginResponse { - token: String! - userInfo: UserInfo! - isNewUser: Boolean! - loginRecordId: ID! - sessionKey: String -} - -"鎵嬫満鍙疯В瀵嗗搷搴�" type PhoneDecryptResponse { - phoneNumber: String! + phoneNumber: String purePhoneNumber: String countryCode: String } \ No newline at end of file diff --git a/backend/src/main/resources/graphql/carousel.graphqls b/backend/src/main/resources/graphql/carousel.graphqls index 1795a14..3e6a73d 100644 --- a/backend/src/main/resources/graphql/carousel.graphqls +++ b/backend/src/main/resources/graphql/carousel.graphqls @@ -42,6 +42,9 @@ # 鑾峰彇鎾斁鍒楄〃 carouselPlayList: [CarouselResponse!]! + + # 鑾峰彇杞挱鍥惧垪琛紙寰俊绔娇鐢級 + getBanners: [CarouselResponse!]! } # 鎵╁睍鍙樻洿 diff --git a/backend/src/main/resources/graphql/judge.graphqls b/backend/src/main/resources/graphql/judge.graphqls index 8e6fe49..6b6c37e 100644 --- a/backend/src/main/resources/graphql/judge.graphqls +++ b/backend/src/main/resources/graphql/judge.graphqls @@ -10,6 +10,16 @@ "鑾峰彇鑵捐浜慍OS涓存椂涓婁紶鍑瘉" getUploadCredentials: CosCredentials + + # 璇勫璇勫鐩稿叧鏌ヨ + "鑾峰彇鎻愪氦璇︽儏" + getSubmissionDetail(submissionId: ID!): SubmissionDetailResponse + + # 妫�鏌ヨ瘎瀹$姸鎬� + checkReviewStatus(submissionId: ID!): ReviewStatusResponse + + # 鑾峰彇璇勫缁熻鏁版嵁 + judgeStats: JudgeStatsResponse } extend type Mutation { @@ -18,6 +28,13 @@ "鍒犻櫎璇勫" deleteJudge(id: ID): Boolean + + # 璇勫鐩稿叧mutation + "淇濆瓨璇勫鑽夌" + saveReviewDraft(input: ReviewDraftInput!): ReviewDraftResponse + + "鎻愪氦璇勫" + submitReview(input: ReviewSubmitInput!): ReviewSubmitResponse } "璇勫杈撳叆绫诲瀷" @@ -52,12 +69,14 @@ tags: [TagResponse] } -"鏍囩鍝嶅簲绫诲瀷" +# 鏍囩鍝嶅簲绫诲瀷锛堢敤浜庤瘎濮斾笓涓氶鍩燂級 type TagResponse { - id: ID - name: String + id: Long! + name: String! code: String } + + "鑵捐浜慍OS涓存椂鍑瘉绫诲瀷" type CosCredentials { @@ -68,3 +87,72 @@ expiration: String } +# 鎻愪氦璇︽儏鍝嶅簲绫诲瀷 +type SubmissionDetailResponse { + id: ID! + activityId: ID! + playerId: ID! + playerName: String + projectName: String + description: String + submissionFiles: [SubmissionMediaResponse] + currentScore: Float + maxScore: Int + reviewStatus: String +} + +# 璇勫鐘舵�佸搷搴旂被鍨� +type ReviewStatusResponse { + submissionId: ID! + reviewStatus: String + canReview: Boolean + hasReviewed: Boolean + currentScore: Float + reviewTime: String +} + +# 璇勫鑽夌杈撳叆绫诲瀷 +input ReviewDraftInput { + submissionId: ID! + scores: [ReviewScoreInput!]! + comments: String +} + +# 璇勫鎻愪氦杈撳叆绫诲瀷 +input ReviewSubmitInput { + submissionId: ID! + scores: [ReviewScoreInput!]! + comments: String + finalScore: Float! +} + +# 璇勫鍒嗘暟杈撳叆绫诲瀷 +input ReviewScoreInput { + itemId: ID! + score: Float! +} + +# 璇勫鑽夌鍝嶅簲绫诲瀷 +type ReviewDraftResponse { + id: ID! + submissionId: ID! + status: String + saveTime: String +} + +# 璇勫鎻愪氦鍝嶅簲绫诲瀷 +type ReviewSubmitResponse { + id: ID! + submissionId: ID! + finalScore: Float! + status: String + submitTime: String +} + +# 璇勫缁熻鍝嶅簲绫诲瀷 +type JudgeStatsResponse { + pendingReviews: Int! + completedReviews: Int! + totalReviews: Int! +} + diff --git a/backend/src/main/resources/graphql/media.graphqls b/backend/src/main/resources/graphql/media.graphqls index 8964117..0e2b1d7 100644 --- a/backend/src/main/resources/graphql/media.graphqls +++ b/backend/src/main/resources/graphql/media.graphqls @@ -1,111 +1,82 @@ -# 濯掍綋鏂囦欢绠$悊 GraphQL Schema +extend type Query { + media(id: ID!): Media + mediasByTarget(targetType: Int!, targetId: ID!): [MediaResponse] +} extend type Mutation { - "淇濆瓨濯掍綋鏂囦欢淇℃伅" saveMedia(input: MediaInput!): Media - - "鍒犻櫎濯掍綋鏂囦欢" deleteMedia(id: ID!): Boolean - - "淇濆瓨濯掍綋鏂囦欢锛堟柊鐗堟湰锛�" - saveMediaV2(input: MediaSaveInput!): MediaSaveResponse! - - "淇濆瓨閫夋墜澶村儚" - savePlayerAvatar(playerId: ID!, path: String!, fileName: String, fileSize: Long): MediaSaveResponse! - - "淇濆瓨娲诲姩鎶ュ悕闄勪欢" - saveActivityPlayerAttachment(activityPlayerId: ID!, path: String!, fileName: String, fileSize: Long, mediaType: Int!): MediaSaveResponse! + # 寰俊绔繚瀛樺獟浣撴枃浠禫2 + saveMediaV2(input: MediaSaveInput!): MediaSaveResponse + # 淇濆瓨閫夋墜澶村儚 + savePlayerAvatar(playerId: ID!, path: String!, fileName: String!, fileSize: Long!): MediaSaveResponse + # 淇濆瓨娲诲姩鎶ュ悕闄勪欢 + saveActivityPlayerAttachment(activityPlayerId: ID!, path: String!, fileName: String!, fileSize: Long!, mediaType: Int!): MediaSaveResponse } -extend type Query { - "鏍规嵁ID鑾峰彇濯掍綋淇℃伅" - media(id: ID!): Media - - "鏍规嵁鐩爣绫诲瀷鍜岀洰鏍嘔D鑾峰彇濯掍綋鍒楄〃" - mediasByTarget(targetType: Int!, targetId: ID!): [MediaResponse!]! - - "搴旂敤閰嶇疆锛堟彁渚涘獟浣撳墠缂�绛夛級" - appConfig: AppConfig! +type Media { + id: ID + name: String + path: String + fileSize: Int + fileExt: String + mediaType: Int + targetType: Int + targetId: Long + thumbPath: String + duration: Int + description: String + fullUrl: String + fullThumbUrl: String } -"濯掍綋杈撳叆绫诲瀷" +# 涓庡悗绔� DTO 瀵归綈鐨勫搷搴旂被鍨嬶紝渚� Carousel/Activity 绛変娇鐢� +type MediaResponse { + id: ID + name: String + path: String + fileSize: Int + fileExt: String + mediaType: Int + targetType: Int + targetId: Long + thumbPath: String + duration: Int + description: String + fullUrl: String + fullThumbUrl: String +} + +# 濯掍綋杈撳叆绫诲瀷 input MediaInput { name: String! path: String! - fileSize: Int! - fileExt: String! - mediaType: Int! - targetType: Int - targetId: ID - thumbPath: String - duration: Int - description: String -} - -"濯掍綋鏂囦欢绫诲瀷" -type Media { - id: ID! - name: String! - path: String! fileSize: Int - fileExt: String! + fileExt: String + mediaType: Int! + targetType: Int! + targetId: Long! thumbPath: String duration: Int description: String - state: String - targetType: Int - targetId: ID - mediaType: Int! - - "瀹屾暣璁块棶鍦板潃锛堝墠缂� + path锛�" - fullUrl: String - "缂╃暐鍥惧畬鏁村湴鍧�锛堝墠缂� + thumbPath锛�" - fullThumbUrl: String } -"濯掍綋鍝嶅簲绫诲瀷" -type MediaResponse { - id: ID! - name: String! - path: String! - fileSize: Int - fileExt: String! - thumbPath: String - duration: Int - description: String - targetType: Int - targetId: ID - mediaType: Int! - - "瀹屾暣璁块棶鍦板潃锛堝墠缂� + path锛�" - fullUrl: String - "缂╃暐鍥惧畬鏁村湴鍧�锛堝墠缂� + thumbPath锛�" - fullThumbUrl: String -} - - - -"搴旂敤閰嶇疆" -type AppConfig { - mediaBaseUrl: String! -} - -"濯掍綋淇濆瓨杈撳叆绫诲瀷锛堟柊鐗堟湰锛�" +# 濯掍綋淇濆瓨杈撳叆绫诲瀷锛圴2鐗堟湰锛� input MediaSaveInput { - targetType: String! # 鐩爣绫诲瀷锛歱layer, activity_player - targetId: ID! # 鐩爣ID - path: String! # COS鏂囦欢璺緞 - thumbPath: String # 缂╃暐鍥捐矾寰勶紙鍙�夛級 - fileName: String # 鏂囦欢鍚� - fileExt: String # 鏂囦欢鎵╁睍鍚� - fileSize: Long # 鏂囦欢澶у皬锛堝瓧鑺傦級 - duration: Int # 瑙嗛鏃堕暱锛堢锛岃棰戞枃浠朵笓鐢級 - mediaType: Int! # 濯掍綋绫诲瀷锛�1-鍥剧墖锛�2-瑙嗛锛�3-闊抽锛�4-鏂囨。 + targetType: String! + targetId: Long! + path: String! + thumbPath: String + fileName: String + fileExt: String + fileSize: Long + duration: Int + mediaType: Int! } -"濯掍綋淇濆瓨鍝嶅簲绫诲瀷" +# 濯掍綋淇濆瓨鍝嶅簲绫诲瀷 type MediaSaveResponse { success: Boolean! - message: String - mediaId: ID + message: String! + mediaId: Long } \ No newline at end of file diff --git a/backend/src/main/resources/graphql/player.graphqls b/backend/src/main/resources/graphql/player.graphqls index 6a8029c..6a5f120 100644 --- a/backend/src/main/resources/graphql/player.graphqls +++ b/backend/src/main/resources/graphql/player.graphqls @@ -1,295 +1,235 @@ extend type Query { - activityPlayerApplications(name: String, activityId: ID, state: Int, page: Int, size: Int): PlayerApplicationPageResponse! - # 鏂板锛氶」鐩瘎瀹′笓鐢ㄦ煡璇紝鍖呭惈鎵�鏈夐樁娈垫暟鎹紙鍖呮嫭澶嶈禌銆佸喅璧涳級 - projectReviewApplications(name: String, activityId: ID, state: Int, page: Int, size: Int): ProjectReviewApplicationPageResponse! - activityPlayerDetail(id: ID!): ActivityPlayerDetailResponse - - # 鎶ュ悕鐘舵�佹煡璇� - playerRegistration(activityId: ID!): PlayerRegistrationResponse - - # 璇勫垎鐩稿叧鏌ヨ - judgeRatingsForPlayer(activityPlayerId: ID!): [JudgeRatingStatusResponse!]! - currentJudgeRating(activityPlayerId: ID!): CurrentJudgeRatingResponse - averageScoreForPlayer(activityPlayerId: ID!): Float - currentJudgeInfo: CurrentJudgeInfoResponse - - # 鏉冮檺妫�鏌ユ煡璇� - isJudgeInActivity(stageId: ID!, judgeId: ID!): Boolean! - - # 鑾峰彇鎸囧畾璇勫鐨勮瘎鍒嗘槑缁� - judgeRatingDetail(activityPlayerId: ID!, judgeId: ID!): CurrentJudgeRatingResponse - - # 姣旇禌鏅嬬骇鐩稿叧鏌ヨ - promotionCompetitions(name: String, page: Int, size: Int): [PromotionCompetitionResponse!]! - competitionParticipants(competitionId: ID!, page: Int, size: Int): [CompetitionParticipantResponse!]! - promotableParticipants(currentStageId: ID!): PromotableParticipantsResponse! + myActivityPlayer(activityId: ID!): ActivityPlayer + activityPlayerApplications(name: String, activityId: ID, state: Int, page: Int, size: Int): PlayerApplicationPageResponse + # 椤圭洰璇勫涓撶敤鏌ヨ锛屽寘鍚墍鏈夐樁娈垫暟鎹紙鍖呮嫭澶嶈禌銆佸喅璧涳級 + projectReviewApplications(name: String, activityId: ID, state: Int, page: Int, size: Int): ProjectReviewApplicationPageResponse + # 鑾峰彇鎸囧畾閫夋墜鐨勬墍鏈夎瘎濮旇瘎鍒嗙姸鎬� + judgeRatingsForPlayer(activityPlayerId: ID!): [JudgeRatingStatusResponse!]! + # 鑾峰彇鎸囧畾閫夋墜鐨勫钩鍧囧垎 + averageScoreForPlayer(activityPlayerId: ID!): Float + + # 鑾峰彇褰撳墠璇勫淇℃伅 + currentJudgeInfo: CurrentJudgeInfoResponse + # 妫�鏌ヨ瘎濮旀槸鍚﹀湪鎸囧畾姣旇禌闃舵鐨勮瘎濮斿垪琛ㄤ腑 + isJudgeInActivity(stageId: ID!, judgeId: ID!): Boolean + # 鑾峰彇鎸囧畾璇勫瀵归�夋墜鐨勮瘎鍒嗘槑缁� + judgeRatingDetail(activityPlayerId: ID!, judgeId: ID!): CurrentJudgeRatingResponse + # 鑾峰彇褰撳墠璇勫瀵归�夋墜鐨勮瘎鍒� + currentJudgeRating(activityPlayerId: ID!): CurrentJudgeRatingResponse + activityPlayerDetail(id: ID!): ActivityPlayerDetailResponse + # 寰俊绔幏鍙栭�夋墜鎶ュ悕鐘舵�� + getPlayerRegistrationState(activityId: ID!): PlayerRegistrationResponse } extend type Mutation { - saveActivityPlayerRating(input: ActivityPlayerRatingInput!): Boolean! - submitActivityRegistration(input: ActivityRegistrationInput!): ActivityRegistrationResponse! - updateActivityRegistration(activityPlayerId: ID!, input: ActivityRegistrationInput!): ActivityRegistrationResponse! - - # 瀹℃牳鐩稿叧mutations - approveActivityPlayer(activityPlayerId: ID!, feedback: String): Boolean! - rejectActivityPlayer(activityPlayerId: ID!, feedback: String!): Boolean! - updatePlayerFeedback(activityPlayerId: ID!, feedback: String!): Boolean! - - # 姣旇禌鏅嬬骇鐩稿叧mutations - promoteParticipants(input: PromotionInput!): PromotionResult! + approveActivityPlayer(activityPlayerId: ID!, feedback: String): Boolean + rejectActivityPlayer(activityPlayerId: ID!, feedback: String!): Boolean + updatePlayerFeedback(activityPlayerId: ID!, feedback: String!): Boolean + # 寰俊绔彁浜ゆ椿鍔ㄦ姤鍚� + submitActivityRegistration(input: ActivityRegistrationInput!): ActivityRegistrationResponse + # 淇濆瓨璇勫璇勫垎 + saveActivityPlayerRating(input: ActivityPlayerRatingInput!): Boolean +} + +type ActivityPlayer { + id: ID! + activityId: ID! + playerId: ID! + stageId: ID + state: Int + stateName: String + createTime: String + player: Player + activity: Activity +} + +type Player { + id: ID! + name: String + phone: String +} + +type PlayerApplicationPageResponse { + content: [ActivityPlayerApplicationResponse] + totalElements: Int + page: Int + size: Int +} + +type ProjectReviewApplicationPageResponse { + content: [ActivityPlayerApplicationResponse] + totalElements: Int + page: Int + size: Int +} + +# 璇勫璇勫垎鐘舵�佸搷搴� +type JudgeRatingStatusResponse { + judgeId: ID! + judgeName: String! + hasRated: Boolean! + ratingTime: String + totalScore: Float +} + +# 褰撳墠璇勫淇℃伅鍝嶅簲 +type CurrentJudgeInfoResponse { + judgeId: ID! + judgeName: String! + title: String + company: String +} + +# 褰撳墠璇勫璇勫垎鍝嶅簲 +type CurrentJudgeRatingResponse { + id: ID! + totalScore: Float + status: Int + remark: String + items: [CurrentJudgeRatingItemResponse!]! +} + +# 璇勫垎椤瑰搷搴� +type CurrentJudgeRatingItemResponse { + ratingItemId: ID! + ratingItemName: String! + score: Float + weightedScore: Float } type ActivityPlayerApplicationResponse { - id: ID - playerName: String! - activityName: String! - projectName: String - phone: String - applyTime: String! - state: Int - ratingCount: Int - averageScore: Float + id: ID + playerName: String + activityName: String + projectName: String + phone: String + applyTime: String + state: Int + ratingCount: Int + averageScore: Float } -# 姣旇禌鎶ュ悕璇︽儏鍝嶅簲锛堢敤浜庤瘎鍒嗛〉闈級 type ActivityPlayerDetailResponse { - id: ID! - playerInfo: PlayerInfoResponse! - regionInfo: RegionInfoResponse - activityName: String! - projectName: String - description: String - feedback: String - state: Int - submissionFiles: [SubmissionMediaResponse!]! - ratingForm: RatingFormResponse + id: ID + playerInfo: PlayerInfoResponse + regionInfo: RegionInfoResponse + activityName: String + projectName: String + description: String + feedback: String + state: Int + stageId: ID + submissionFiles: [SubmissionMediaResponse] + ratingForm: RatingFormResponse } -# 鎶ュ悕瀹℃牳鍒嗛〉鍝嶅簲绫诲瀷 -type PlayerApplicationPageResponse { - content: [ActivityPlayerApplicationResponse!]! - totalElements: Int! - page: Int! - size: Int! -} - -# 椤圭洰璇勫鍒嗛〉鍝嶅簲绫诲瀷 -type ProjectReviewApplicationPageResponse { - content: [ActivityPlayerApplicationResponse!]! - totalElements: Int! - page: Int! - size: Int! -} - -# 瀛﹀憳淇℃伅鍝嶅簲 type PlayerInfoResponse { id: ID name: String phone: String - description: String - avatarUrl: String - avatar: MediaResponse gender: Int birthday: String education: String introduction: String + description: String + avatarUrl: String + avatar: MediaResponse } -# 鍖哄煙淇℃伅鍝嶅簲 type RegionInfoResponse { - id: ID! - name: String! - fullPath: String + id: ID + name: String + fullPath: String } -# 鎻愪氦璧勬枡鍝嶅簲 type SubmissionMediaResponse { - id: ID! - name: String! - url: String! - fileExt: String - fileSize: Int - mediaType: Int - thumbUrl: String + id: ID + name: String + url: String + fileExt: String + fileSize: Int + mediaType: Int + thumbUrl: String } -# 璇勫垎琛ㄥ崟鍝嶅簲 type RatingFormResponse { - schemeId: ID! - schemeName: String! - items: [RatingItemResponse!]! - totalMaxScore: Int! + schemeId: ID + schemeName: String + items: [RatingItemResponse] + totalMaxScore: Int } -# 璇勫垎鎻愪氦杈撳叆绫诲瀷 -input ActivityPlayerRatingInput { - activityPlayerId: ID! - stageId: ID! - ratings: [ActivityPlayerRatingItemInput!]! - comment: String +# 閫夋墜鎶ュ悕鐘舵�佸搷搴旂被鍨� +type PlayerRegistrationStateResponse { + activityId: ID! + playerId: ID + registrationState: String + canRegister: Boolean + registrationTime: String + projectName: String } -# 璇勫垎椤圭洰杈撳叆绫诲瀷 -input ActivityPlayerRatingItemInput { - itemId: ID! - score: Float! +# 閫夋墜鎶ュ悕鍝嶅簲绫诲瀷锛堢敤浜巔layerRegistration鍜実etPlayerRegistrationState鏌ヨ锛� +type PlayerRegistrationResponse { + id: ID + status: Int + registrationTime: String + reviewStatus: Int + reviewComment: String } -# 璇勫璇勫垎鐘舵�佸搷搴旂被鍨� -type JudgeRatingStatusResponse { - judgeId: ID! - judgeName: String! - hasRated: Boolean! - ratingTime: String - totalScore: Float -} - -# 褰撳墠璇勫璇勫垎鍝嶅簲绫诲瀷 -type CurrentJudgeRatingResponse { - id: ID! - totalScore: Float - status: Int - remark: String - items: [CurrentJudgeRatingItemResponse!]! -} - -# 褰撳墠璇勫璇勫垎椤瑰搷搴旂被鍨� -type CurrentJudgeRatingItemResponse { - ratingItemId: ID! - ratingItemName: String! - score: Float! - weightedScore: Float! -} - -# 璇勫垎椤圭洰鍒嗘暟鍝嶅簲绫诲瀷 -type RatingItemScoreResponse { - itemId: ID! - itemName: String! - score: Int! - maxScore: Int! -} - -# 褰撳墠璇勫淇℃伅鍝嶅簲绫诲瀷 -type CurrentJudgeInfoResponse { - judgeId: ID! - judgeName: String! - title: String - company: String -} - -# 鎶ュ悕鎻愪氦杈撳叆绫诲瀷 -input ActivityRegistrationInput { - activityId: ID! - playerInfo: PlayerRegistrationInput! - regionId: ID - projectName: String - description: String - mediaFiles: [MediaFileInput!] - attachmentMediaIds: [String!] +# 濯掍綋鏂囦欢杈撳叆绫诲瀷 +input MediaFileInput { + name: String + path: String + fileExt: String + fileSize: Int + mediaType: Int } # 閫夋墜鎶ュ悕淇℃伅杈撳叆绫诲瀷 input PlayerRegistrationInput { - name: String! - phone: String! - gender: Int - birthDate: String - education: String - introduction: String - description: String - avatarMediaId: String + name: String! + phone: String! + birthDate: String + gender: Int + education: String + introduction: String + description: String + avatarMediaId: String } - - -# 濯掍綋鏂囦欢杈撳叆绫诲瀷 -input MediaFileInput { - name: String! - path: String! - fileExt: String - fileSize: Int - mediaType: Int! +# 娲诲姩鎶ュ悕杈撳叆绫诲瀷 +input ActivityRegistrationInput { + activityId: ID! + playerInfo: PlayerRegistrationInput! + regionId: ID + projectName: String! + description: String + mediaFiles: [MediaFileInput] + attachmentMediaIds: [String] } -# 鎶ュ悕鎻愪氦鍝嶅簲绫诲瀷 +# 娲诲姩鎶ュ悕鍝嶅簲绫诲瀷 type ActivityRegistrationResponse { - success: Boolean! - message: String - registrationId: ID - playerId: ID - userId: ID - activityPlayerId: ID + success: Boolean! + message: String + registrationId: ID + playerId: ID + userId: ID + activityPlayerId: ID } -# 鐜╁鎶ュ悕鐘舵�佸搷搴旂被鍨� -type PlayerRegistrationResponse { - id: ID - status: Int - registrationTime: String - reviewStatus: Int - reviewComment: String +# 璇勫璇勫垎杈撳叆绫诲瀷 +input ActivityPlayerRatingInput { + activityPlayerId: ID! + stageId: ID + ratings: [ActivityPlayerRatingItemInput!]! + comment: String } -# 姣旇禌鏅嬬骇鐩稿叧绫诲瀷瀹氫箟 - -# 姣旇禌鏅嬬骇鍒楄〃鍝嶅簲绫诲瀷 -type PromotionCompetitionResponse { - id: ID! - competitionName: String! - stageName: String! - maxParticipants: Int - currentCount: Int! - status: Int! - startTime: String - endTime: String - sortOrder: Int - state: Int -} - -# 姣旇禌鍙傝禌鑰呭搷搴旂被鍨� -type CompetitionParticipantResponse { - id: ID! - playerName: String! - projectName: String - phone: String - averageScore: Float - ratingCount: Int! - applyTime: String! - state: Int! -} - -# 鏅嬬骇鎿嶄綔杈撳叆绫诲瀷 -input PromotionInput { - competitionId: ID! - participantIds: [ID!]! - targetStageId: ID -} - -# 鏅嬬骇鎿嶄綔缁撴灉绫诲瀷 -type PromotionResult { - success: Boolean! - message: String! - promotedCount: Int! -} - -# 鍙檵绾у弬璧涜�呭搷搴旂被鍨� -type PromotableParticipantResponse { - id: ID! - playerId: ID! - playerName: String! - projectName: String - phone: String - averageScore: Float - ratingCount: Int! - applyTime: String! - state: Int! -} - -# 鍙檵绾у弬璧涜�呭垪琛ㄥ搷搴旂被鍨� -type PromotableParticipantsResponse { - participants: [PromotableParticipantResponse!]! - selectableCount: Int! - totalCount: Int! - previousStageName: String! - currentStageName: String! +# 璇勫垎椤硅緭鍏ョ被鍨� +input ActivityPlayerRatingItemInput { + itemId: ID! + score: Float! } \ No newline at end of file diff --git a/backend/src/main/resources/graphql/tag.graphqls b/backend/src/main/resources/graphql/tag.graphqls index 9b337f4..014c0b1 100644 --- a/backend/src/main/resources/graphql/tag.graphqls +++ b/backend/src/main/resources/graphql/tag.graphqls @@ -1,8 +1,34 @@ -# 鏍囩鐩稿叧鐨凣raphQL鎵╁睍 +# 鏍囩鐩稿叧鐨凣raphQL Schema瀹氫箟 + +# 鏍囩杈撳叆绫诲瀷 +input TagInput { + id: Long + name: String! + category: String + description: String + state: Int +} + +# 鎵╁睍鏌ヨ绫诲瀷 extend type Query { - "鑾峰彇鎵�鏈夋爣绛�" - tags: [TagResponse] + # 鑾峰彇鎵�鏈夋爣绛� + tags: [TagResponse!]! - "鏍规嵁鍒嗙被鑾峰彇鏍囩" - tagsByCategory(category: String): [TagResponse] + # 鏍规嵁鍒嗙被鑾峰彇鏍囩 + tagsByCategory(category: String!): [TagResponse!]! + + # 鏍规嵁ID鑾峰彇鏍囩璇︽儏 + tag(id: Long!): TagResponse + + # 鏍规嵁鍚嶇О妯$硦鏌ヨ鏍囩 + tagsByName(name: String!): [TagResponse!]! +} + +# 鎵╁睍鍙樻洿绫诲瀷 +extend type Mutation { + # 淇濆瓨鏍囩锛堟柊澧炴垨鏇存柊锛� + saveTag(input: TagInput!): TagResponse! + + # 鍒犻櫎鏍囩 + deleteTag(id: Long!): Boolean! } \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/ActivityTableSchemaTest.java b/backend/src/test/java/com/rongyichuang/ActivityTableSchemaTest.java deleted file mode 100644 index e3f183b..0000000 --- a/backend/src/test/java/com/rongyichuang/ActivityTableSchemaTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.sql.DatabaseMetaData; -import java.sql.ResultSet; -import java.sql.SQLException; - -@SpringBootTest -public class ActivityTableSchemaTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void testActivityTableSchema() { - try { - DatabaseMetaData metaData = jdbcTemplate.getDataSource().getConnection().getMetaData(); - - System.out.println("=== t_activity 琛ㄧ粨鏋� ==="); - ResultSet columns = metaData.getColumns(null, null, "t_activity", null); - - while (columns.next()) { - String columnName = columns.getString("COLUMN_NAME"); - String dataType = columns.getString("TYPE_NAME"); - int columnSize = columns.getInt("COLUMN_SIZE"); - String isNullable = columns.getString("IS_NULLABLE"); - String columnDefault = columns.getString("COLUMN_DEF"); - String remarks = columns.getString("REMARKS"); - - System.out.printf("鍒楀悕: %s, 绫诲瀷: %s(%d), 鍙┖: %s, 榛樿鍊�: %s, 澶囨敞: %s%n", - columnName, dataType, columnSize, isNullable, columnDefault, remarks); - } - - columns.close(); - - } catch (SQLException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/AssignActivityPermissionTest.java b/backend/src/test/java/com/rongyichuang/AssignActivityPermissionTest.java deleted file mode 100644 index f21a80c..0000000 --- a/backend/src/test/java/com/rongyichuang/AssignActivityPermissionTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class AssignActivityPermissionTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void assignActivityPermissionToJudge68() { - System.out.println("=== 涓鸿瘎濮擨D=68鍒嗛厤娲诲姩鏉冮檺 ==="); - - try { - Long judgeId = 68L; - - // 1. 纭璇勫瀛樺湪 - String checkJudgeSql = "SELECT id, name, user_id FROM t_judge WHERE id = ?"; - Map<String, Object> judge = jdbcTemplate.queryForMap(checkJudgeSql, judgeId); - System.out.println("璇勫淇℃伅: ID=" + judge.get("id") + - ", 濮撳悕=" + judge.get("name") + - ", 鐢ㄦ埛ID=" + judge.get("user_id")); - - // 2. 鏌ョ湅鏈�鏂扮殑鍑犱釜娲诲姩 - String getActivitiesSql = "SELECT id, name, state FROM t_activity WHERE state = 1 ORDER BY id DESC LIMIT 5"; - List<Map<String, Object>> activities = jdbcTemplate.queryForList(getActivitiesSql); - - System.out.println("鏈�鏂扮殑娲诲姩鍒楄〃:"); - for (Map<String, Object> activity : activities) { - System.out.println(" 娲诲姩ID: " + activity.get("id") + - ", 娲诲姩鍚嶇О: " + activity.get("name") + - ", 鐘舵��: " + activity.get("state")); - } - - // 3. 涓鸿瘎濮斿垎閰嶆渶鏂版椿鍔ㄧ殑鏉冮檺 - if (!activities.isEmpty()) { - Map<String, Object> latestActivity = activities.get(0); - Long activityId = ((Number) latestActivity.get("id")).longValue(); - String activityName = (String) latestActivity.get("name"); - - // 妫�鏌ユ槸鍚﹀凡缁忔湁鏉冮檺 - String checkPermissionSql = "SELECT COUNT(*) as count FROM t_activity_judge WHERE judge_id = ? AND activity_id = ?"; - Map<String, Object> permissionExists = jdbcTemplate.queryForMap(checkPermissionSql, judgeId, activityId); - - if (((Number) permissionExists.get("count")).intValue() == 0) { - // 鍩轰簬鐜版湁璁板綍澶嶅埗stage_id锛屼娇鐢ㄦ椿鍔↖D浣滀负stage_id锛堢畝鍖栧鐞嗭級 - String insertPermissionSql = "INSERT INTO t_activity_judge (judge_id, activity_id, stage_id, state, version) VALUES (?, ?, ?, 1, 0)"; - int result = jdbcTemplate.update(insertPermissionSql, judgeId, activityId, activityId); - - if (result > 0) { - System.out.println("鉁� 鎴愬姛涓鸿瘎濮斿垎閰嶆椿鍔ㄦ潈闄�: " + activityName + " (ID=" + activityId + ")"); - } else { - System.out.println("鉂� 鍒嗛厤娲诲姩鏉冮檺澶辫触"); - } - } else { - System.out.println("璇勫宸茬粡鏈夎娲诲姩鐨勬潈闄�"); - } - - // 4. 楠岃瘉鏉冮檺鍒嗛厤缁撴灉 - String verifyPermissionSql = "SELECT aj.activity_id, a.name as activity_name, aj.state " + - "FROM t_activity_judge aj " + - "JOIN t_activity a ON aj.activity_id = a.id " + - "WHERE aj.judge_id = ?"; - List<Map<String, Object>> permissions = jdbcTemplate.queryForList(verifyPermissionSql, judgeId); - - System.out.println("璇勫ID=" + judgeId + " 鐨勬墍鏈夋椿鍔ㄦ潈闄�:"); - for (Map<String, Object> permission : permissions) { - System.out.println(" 娲诲姩ID: " + permission.get("activity_id") + - ", 娲诲姩鍚嶇О: " + permission.get("activity_name") + - ", 鏉冮檺鐘舵��: " + permission.get("state")); - } - - if (permissions.isEmpty()) { - System.out.println("鉂� 璇ヨ瘎濮斾粛鐒舵病鏈変换浣曟椿鍔ㄦ潈闄愶紒"); - } else { - System.out.println("鉁� 鏉冮檺鍒嗛厤鎴愬姛锛岃瘎濮旂幇鍦ㄦ湁 " + permissions.size() + " 涓椿鍔ㄧ殑璇勫鏉冮檺"); - } - } else { - System.out.println("鉂� 娌℃湁鎵惧埌鍙敤鐨勬椿鍔�"); - } - - } catch (Exception e) { - System.out.println("鍒嗛厤鏉冮檺鏃跺彂鐢熷紓甯�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckActivityDataTest.java b/backend/src/test/java/com/rongyichuang/CheckActivityDataTest.java deleted file mode 100644 index 668f4fd..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckActivityDataTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class CheckActivityDataTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkActivityData() { - try { - // 妫�鏌_activity琛ㄧ粨鏋� - String descSql = "DESC t_activity"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(descSql); - System.out.println("=== t_activity 琛ㄧ粨鏋� ==="); - for (Map<String, Object> column : columns) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 缁熻娲诲姩鏁版嵁 - String countSql = "SELECT COUNT(*) as total FROM t_activity"; - Integer totalCount = jdbcTemplate.queryForObject(countSql, Integer.class); - System.out.println("\n=== 娲诲姩鏁版嵁缁熻 ==="); - System.out.println("娲诲姩璁板綍鎬绘暟: " + totalCount); - - // 鎸夌姸鎬佺粺璁� - String countByStateSql = "SELECT state, COUNT(*) as count FROM t_activity GROUP BY state"; - List<Map<String, Object>> stateStats = jdbcTemplate.queryForList(countByStateSql); - System.out.println("\n=== 鎸夌姸鎬佺粺璁� ==="); - for (Map<String, Object> stat : stateStats) { - System.out.println("鐘舵��: " + stat.get("state") + ", 鏁伴噺: " + stat.get("count")); - } - - // 鎸塸id缁熻锛堝尯鍒嗘瘮璧涘拰闃舵锛� - String countByPidSql = "SELECT pid, COUNT(*) as count FROM t_activity GROUP BY pid"; - List<Map<String, Object>> pidStats = jdbcTemplate.queryForList(countByPidSql); - System.out.println("\n=== 鎸塒ID缁熻锛�0=姣旇禌锛�>0=闃舵锛� ==="); - for (Map<String, Object> stat : pidStats) { - System.out.println("PID: " + stat.get("pid") + ", 鏁伴噺: " + stat.get("count")); - } - - // 鏌ョ湅鍓�5鏉℃椿鍔ㄦ暟鎹� - String dataSql = "SELECT id, pid, name, state, create_time FROM t_activity ORDER BY id LIMIT 5"; - List<Map<String, Object>> activityData = jdbcTemplate.queryForList(dataSql); - System.out.println("\n=== 鍓�5鏉℃椿鍔ㄦ暟鎹� ==="); - for (Map<String, Object> activity : activityData) { - System.out.println("ID: " + activity.get("id") + - ", PID: " + activity.get("pid") + - ", 鍚嶇О: " + activity.get("name") + - ", 鐘舵��: " + activity.get("state") + - ", 鍒涘缓鏃堕棿: " + activity.get("create_time")); - } - - // 鏌ョ湅鏈夋晥鐨勬瘮璧涳紙pid=0, state=1锛� - String competitionSql = "SELECT id, name, state, signup_deadline, match_time FROM t_activity WHERE pid = 0 AND state = 1 ORDER BY id"; - List<Map<String, Object>> competitions = jdbcTemplate.queryForList(competitionSql); - System.out.println("\n=== 鏈夋晥鐨勬瘮璧涙暟鎹� ==="); - for (Map<String, Object> competition : competitions) { - System.out.println("ID: " + competition.get("id") + - ", 鍚嶇О: " + competition.get("name") + - ", 鐘舵��: " + competition.get("state") + - ", 鎶ュ悕鎴: " + competition.get("signup_deadline") + - ", 姣旇禌鏃堕棿: " + competition.get("match_time")); - } - - } catch (Exception e) { - System.out.println("鏌ヨ澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTableTest.java b/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTableTest.java deleted file mode 100644 index 3861d97..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTableTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckActivityJudgeTableTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkActivityJudgeTableStructure() { - System.out.println("=== 妫�鏌_activity_judge琛ㄧ粨鏋� ==="); - - try { - // 鏌ョ湅琛ㄧ粨鏋� - String describeTableSql = "DESCRIBE t_activity_judge"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(describeTableSql); - - System.out.println("t_activity_judge琛ㄥ瓧娈�:"); - for (Map<String, Object> column : columns) { - System.out.println(" 瀛楁鍚�: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 鏌ョ湅鐜版湁鐨勬椿鍔�-璇勫鍏宠仈璁板綍 - String selectRecordsSql = "SELECT * FROM t_activity_judge LIMIT 3"; - List<Map<String, Object>> records = jdbcTemplate.queryForList(selectRecordsSql); - - System.out.println("\n鐜版湁娲诲姩-璇勫鍏宠仈璁板綍绀轰緥:"); - for (Map<String, Object> record : records) { - System.out.println(" " + record); - } - - } catch (Exception e) { - System.out.println("妫�鏌ヨ〃缁撴瀯鏃跺彂鐢熷紓甯�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTest.java b/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTest.java deleted file mode 100644 index d35e419..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckActivityJudgeTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckActivityJudgeTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkActivityJudgeData() { - try { - // 妫�鏌ユ椿鍔ㄨ瘎濮斿叧鑱旇〃缁撴瀯 - String describeTableSql = "DESCRIBE t_activity_judge"; - List<Map<String, Object>> tableStructure = jdbcTemplate.queryForList(describeTableSql); - - System.out.println("=== t_activity_judge 琛ㄧ粨鏋� ==="); - for (Map<String, Object> column : tableStructure) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 妫�鏌ュ叧鑱旀暟鎹� - String countSql = "SELECT COUNT(*) as count FROM t_activity_judge"; - Map<String, Object> countResult = jdbcTemplate.queryForMap(countSql); - System.out.println("\n=== 娲诲姩璇勫鍏宠仈鏁版嵁缁熻 ==="); - System.out.println("鍏宠仈璁板綍鎬绘暟: " + countResult.get("count")); - - // 鏌ョ湅鍓�5鏉″叧鑱旀暟鎹� - String dataSql = "SELECT * FROM t_activity_judge LIMIT 5"; - List<Map<String, Object>> relationData = jdbcTemplate.queryForList(dataSql); - System.out.println("\n=== 鍓�5鏉℃椿鍔ㄨ瘎濮斿叧鑱旀暟鎹� ==="); - for (Map<String, Object> relation : relationData) { - System.out.println("娲诲姩ID: " + relation.get("activity_id") + - ", 璇勫ID: " + relation.get("judge_id") + - ", 鐘舵��: " + relation.get("state")); - } - - // 妫�鏌ユ椿鍔↖D涓�1鐨勮瘎濮斿叧鑱� - String activity1Sql = "SELECT * FROM t_activity_judge WHERE activity_id = 1"; - List<Map<String, Object>> activity1Judges = jdbcTemplate.queryForList(activity1Sql); - System.out.println("\n=== 娲诲姩ID涓�1鐨勮瘎濮斿叧鑱� ==="); - for (Map<String, Object> relation : activity1Judges) { - System.out.println("娲诲姩ID: " + relation.get("activity_id") + - ", 璇勫ID: " + relation.get("judge_id") + - ", 鐘舵��: " + relation.get("state")); - } - - } catch (Exception e) { - System.out.println("琛ㄤ笉瀛樺湪鎴栨煡璇㈠け璐�: " + e.getMessage()); - - // 灏濊瘯鏌ョ湅鎵�鏈夎〃 - String showTablesSql = "SHOW TABLES LIKE '%judge%'"; - List<Map<String, Object>> tables = jdbcTemplate.queryForList(showTablesSql); - System.out.println("\n=== 鍖呭惈judge鐨勮〃 ==="); - for (Map<String, Object> table : tables) { - System.out.println("琛ㄥ悕: " + table.values().iterator().next()); - } - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckActivityPlayerDataTest.java b/backend/src/test/java/com/rongyichuang/CheckActivityPlayerDataTest.java deleted file mode 100644 index fe0d15d..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckActivityPlayerDataTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.Query; -import java.util.List; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckActivityPlayerDataTest { - - @Autowired - private EntityManager entityManager; - - @Test - public void checkActivityPlayerData() { - System.out.println("=== 妫�鏌� t_activity_player 琛ㄦ暟鎹� ==="); - - // 鏌ヨ琛ㄧ粨鏋� - String describeQuery = "DESCRIBE t_activity_player"; - Query query = entityManager.createNativeQuery(describeQuery); - List<Object[]> columns = query.getResultList(); - - System.out.println("琛ㄧ粨鏋�:"); - for (Object[] column : columns) { - System.out.println(" " + column[0] + " - " + column[1]); - } - - // 鏌ヨ鏁版嵁 - String dataQuery = "SELECT id, player_id, activity_id, region_id, description FROM t_activity_player LIMIT 5"; - Query dataQueryObj = entityManager.createNativeQuery(dataQuery); - List<Object[]> results = dataQueryObj.getResultList(); - - System.out.println("\n琛ㄦ暟鎹�:"); - System.out.println("ID | Player_ID | Activity_ID | Region_ID | Description"); - System.out.println("---|-----------|-------------|-----------|------------"); - - for (Object[] row : results) { - System.out.printf("%s | %s | %s | %s | %s%n", - row[0], row[1], row[2], row[3], - row[4] != null ? row[4].toString().substring(0, Math.min(20, row[4].toString().length())) + "..." : "null"); - } - - // 妫�鏌ユ槸鍚︽湁region_id涓嶄负绌虹殑鏁版嵁 - String regionQuery = "SELECT COUNT(*) FROM t_activity_player WHERE region_id IS NOT NULL"; - Query regionQueryObj = entityManager.createNativeQuery(regionQuery); - Object regionCount = regionQueryObj.getSingleResult(); - - System.out.println("\n鏈塺egion_id鐨勮褰曟暟: " + regionCount); - - // 鏌ョ湅region琛ㄦ暟鎹� - String regionDataQuery = "SELECT id, name, full_path FROM t_region LIMIT 5"; - Query regionDataQueryObj = entityManager.createNativeQuery(regionDataQuery); - List<Object[]> regionResults = regionDataQueryObj.getResultList(); - - System.out.println("\nt_region 琛ㄦ暟鎹�:"); - System.out.println("ID | Name | Full_Path"); - System.out.println("---|------|----------"); - - for (Object[] row : regionResults) { - System.out.printf("%s | %s | %s%n", row[0], row[1], row[2]); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckActivityPlayerRatingTableTest.java b/backend/src/test/java/com/rongyichuang/CheckActivityPlayerRatingTableTest.java deleted file mode 100644 index 6ef737f..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckActivityPlayerRatingTableTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest(classes = RycBackendApplication.class) -public class CheckActivityPlayerRatingTableTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkTableStructure() { - try { - String sql1 = "DESCRIBE t_activity_player_rating"; - List<Map<String, Object>> result1 = jdbcTemplate.queryForList(sql1); - - System.out.println("=== t_activity_player_rating 琛ㄧ粨鏋� ==="); - for (Map<String, Object> row : result1) { - System.out.println("Field: " + row.get("Field") + - ", Type: " + row.get("Type") + - ", Null: " + row.get("Null") + - ", Key: " + row.get("Key") + - ", Default: " + row.get("Default")); - } - - System.out.println("\n=== t_activity_player_rating_item 琛ㄧ粨鏋� ==="); - String sql2 = "DESCRIBE t_activity_player_rating_item"; - List<Map<String, Object>> result2 = jdbcTemplate.queryForList(sql2); - - for (Map<String, Object> row : result2) { - System.out.println("Field: " + row.get("Field") + - ", Type: " + row.get("Type") + - ", Null: " + row.get("Null") + - ", Key: " + row.get("Key") + - ", Default: " + row.get("Default")); - } - } catch (Exception e) { - System.err.println("妫�鏌ヨ〃缁撴瀯澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckJudgeDataTest.java b/backend/src/test/java/com/rongyichuang/CheckJudgeDataTest.java deleted file mode 100644 index bbfea51..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckJudgeDataTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckJudgeDataTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkJudgeData() { - // 妫�鏌ヨ瘎濮旇〃缁撴瀯 - String describeTableSql = "DESCRIBE t_judge"; - List<Map<String, Object>> tableStructure = jdbcTemplate.queryForList(describeTableSql); - - System.out.println("=== t_judge 琛ㄧ粨鏋� ==="); - for (Map<String, Object> column : tableStructure) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 妫�鏌ヨ瘎濮旀暟鎹� - String countSql = "SELECT COUNT(*) as count FROM t_judge"; - Map<String, Object> countResult = jdbcTemplate.queryForMap(countSql); - System.out.println("\n=== 璇勫鏁版嵁缁熻 ==="); - System.out.println("璇勫鎬绘暟: " + countResult.get("count")); - - // 鏌ョ湅鍓�5鏉¤瘎濮旀暟鎹� - String dataSql = "SELECT * FROM t_judge LIMIT 5"; - List<Map<String, Object>> judgeData = jdbcTemplate.queryForList(dataSql); - System.out.println("\n=== 鍓�5鏉¤瘎濮旀暟鎹� ==="); - for (Map<String, Object> judge : judgeData) { - System.out.println("ID: " + judge.get("id") + - ", 濮撳悕: " + judge.get("name") + - ", 鐢ㄦ埛ID: " + judge.get("user_id") + - ", 鐘舵��: " + judge.get("state")); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckJudgeTableTest.java b/backend/src/test/java/com/rongyichuang/CheckJudgeTableTest.java deleted file mode 100644 index 125552d..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckJudgeTableTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckJudgeTableTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkJudgeTableStructure() { - System.out.println("=== 妫�鏌_judge琛ㄧ粨鏋� ==="); - - try { - // 鏌ョ湅琛ㄧ粨鏋� - String describeTableSql = "DESCRIBE t_judge"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(describeTableSql); - - System.out.println("t_judge琛ㄥ瓧娈�:"); - for (Map<String, Object> column : columns) { - System.out.println(" 瀛楁鍚�: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 鏌ョ湅鐜版湁鐨勮瘎濮旇褰� - String selectJudgesSql = "SELECT * FROM t_judge LIMIT 3"; - List<Map<String, Object>> judges = jdbcTemplate.queryForList(selectJudgesSql); - - System.out.println("\n鐜版湁璇勫璁板綍绀轰緥:"); - for (Map<String, Object> judge : judges) { - System.out.println(" " + judge); - } - - } catch (Exception e) { - System.out.println("妫�鏌ヨ〃缁撴瀯鏃跺彂鐢熷紓甯�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckMediaRecordsTest.java b/backend/src/test/java/com/rongyichuang/CheckMediaRecordsTest.java deleted file mode 100644 index 8f6fc60..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckMediaRecordsTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class CheckMediaRecordsTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkMediaRecords() { - System.out.println("=== 妫�鏌ユ暟鎹簱琛ㄧ粨鏋� ==="); - - try { - // 棣栧厛鏌ョ湅鎵�鏈夎〃 - String showTables = "SHOW TABLES"; - List<Map<String, Object>> tables = jdbcTemplate.queryForList(showTables); - - System.out.println("鏁版嵁搴撲腑鐨勮〃:"); - for (Map<String, Object> table : tables) { - System.out.println("- " + table.values().iterator().next()); - } - - // 妫�鏌ユ槸鍚︽湁media鐩稿叧鐨勮〃 - System.out.println("\n=== 妫�鏌edia鐩稿叧琛� ==="); - for (Map<String, Object> table : tables) { - String tableName = table.values().iterator().next().toString(); - if (tableName.toLowerCase().contains("media")) { - System.out.println("鎵惧埌media鐩稿叧琛�: " + tableName); - - try { - // 鏌ョ湅琛ㄧ粨鏋� - String descTable = "DESC " + tableName; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(descTable); - System.out.println("琛ㄧ粨鏋�:"); - for (Map<String, Object> column : columns) { - System.out.println(" " + column.get("Field") + " - " + column.get("Type")); - } - - // 鏌ョ湅璁板綍鏁伴噺 - String countSql = "SELECT COUNT(*) as count FROM " + tableName; - Map<String, Object> countResult = jdbcTemplate.queryForMap(countSql); - System.out.println("璁板綍鏁伴噺: " + countResult.get("count")); - - // 濡傛灉鏈夎褰曪紝鏌ョ湅鏈�杩戝嚑鏉� - Long count = (Long) countResult.get("count"); - if (count > 0) { - String sampleSql = "SELECT * FROM " + tableName + " ORDER BY id DESC LIMIT 3"; - List<Map<String, Object>> samples = jdbcTemplate.queryForList(sampleSql); - System.out.println("鏈�杩�3鏉¤褰�:"); - for (Map<String, Object> sample : samples) { - System.out.println(" " + sample); - } - - // 濡傛灉鏄痶_media琛紝涓撻棬鏌ヨtargetType=5鐨勮褰� - if ("t_media".equals(tableName)) { - try { - List<Map<String, Object>> targetType5Records = jdbcTemplate.queryForList( - "SELECT * FROM t_media WHERE target_type = 5 ORDER BY create_time DESC" - ); - System.out.println("targetType=5鐨勮褰曟暟閲�: " + targetType5Records.size()); - if (!targetType5Records.isEmpty()) { - System.out.println("targetType=5鐨勮褰�:"); - for (Map<String, Object> record : targetType5Records) { - System.out.println(" " + record); - } - } else { - System.out.println("娌℃湁鎵惧埌targetType=5鐨勮褰�"); - } - } catch (Exception e) { - System.out.println("鏌ヨtargetType=5璁板綍澶辫触: " + e.getMessage()); - } - } - } - } catch (Exception e) { - System.out.println("鏌ヨ琛� " + tableName + " 鏃跺嚭閿�: " + e.getMessage()); - } - System.out.println(); - } - } - - // 鏌ョ湅activity_player鐩稿叧鐨勮〃 - System.out.println("=== 妫�鏌ctivity_player鐩稿叧琛� ==="); - for (Map<String, Object> table : tables) { - String tableName = table.values().iterator().next().toString(); - if (tableName.toLowerCase().contains("activity") && tableName.toLowerCase().contains("player")) { - System.out.println("鎵惧埌activity_player鐩稿叧琛�: " + tableName); - - try { - // 鏌ョ湅璁板綍鏁伴噺 - String countSql = "SELECT COUNT(*) as count FROM " + tableName; - Map<String, Object> countResult = jdbcTemplate.queryForMap(countSql); - System.out.println("璁板綍鏁伴噺: " + countResult.get("count")); - - // 鏌ョ湅鏈�杩戝嚑鏉¤褰� - String sampleSql = "SELECT * FROM " + tableName + " ORDER BY id DESC LIMIT 3"; - List<Map<String, Object>> samples = jdbcTemplate.queryForList(sampleSql); - System.out.println("鏈�杩�3鏉¤褰�:"); - for (Map<String, Object> sample : samples) { - System.out.println(" " + sample); - } - } catch (Exception e) { - System.out.println("鏌ヨ琛� " + tableName + " 鏃跺嚭閿�: " + e.getMessage()); - } - System.out.println(); - } - } - - } catch (Exception e) { - System.out.println("鏁版嵁搴撴煡璇㈠嚭閿�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckRatingItemTableStructureTest.java b/backend/src/test/java/com/rongyichuang/CheckRatingItemTableStructureTest.java deleted file mode 100644 index 0c42c14..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckRatingItemTableStructureTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class CheckRatingItemTableStructureTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkTableStructure() { - System.out.println("=== 妫�鏌� t_activity_player_rating_item 琛ㄧ粨鏋� ==="); - - String sql = "DESCRIBE t_activity_player_rating_item"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql); - - for (Map<String, Object> column : columns) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 妫�鏌ユ槸鍚﹀瓨鍦╮emark瀛楁 - boolean hasRemarkField = columns.stream() - .anyMatch(column -> "remark".equals(column.get("Field"))); - System.out.println("鏄惁瀛樺湪remark瀛楁: " + hasRemarkField); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckTableStructureTest.java b/backend/src/test/java/com/rongyichuang/CheckTableStructureTest.java deleted file mode 100644 index a16a4c2..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckTableStructureTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("dev") -public class CheckTableStructureTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkActivityPlayerRatingTableStructure() { - System.out.println("=== 妫�鏌� t_activity_player_rating 琛ㄧ粨鏋� ==="); - - String sql = "DESCRIBE t_activity_player_rating"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql); - - for (Map<String, Object> column : columns) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - // 妫�鏌ユ槸鍚﹀瓨鍦╮ating_scheme_id瀛楁 - boolean hasRatingSchemeId = columns.stream() - .anyMatch(col -> "rating_scheme_id".equals(col.get("Field"))); - - System.out.println("鏄惁瀛樺湪rating_scheme_id瀛楁: " + hasRatingSchemeId); - } - - @Test - public void checkRatingItemTable() { - System.out.println("=== 妫�鏌� t_rating_item 琛ㄧ粨鏋� ==="); - - try { - String sql = "DESCRIBE t_rating_item"; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql); - - for (Map<String, Object> column : columns) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - System.out.println("\n=== 妫�鏌� t_rating_scheme 琛ㄧ粨鏋� ==="); - sql = "DESCRIBE t_rating_scheme"; - columns = jdbcTemplate.queryForList(sql); - - for (Map<String, Object> column : columns) { - System.out.println("瀛楁: " + column.get("Field") + - ", 绫诲瀷: " + column.get("Type") + - ", 鏄惁涓虹┖: " + column.get("Null") + - ", 閿�: " + column.get("Key") + - ", 榛樿鍊�: " + column.get("Default")); - } - - System.out.println("\n=== 妫�鏌ヨ瘎鍒嗛」鏁版嵁 ==="); - sql = "SELECT * FROM t_rating_item LIMIT 5"; - List<Map<String, Object>> items = jdbcTemplate.queryForList(sql); - - for (Map<String, Object> item : items) { - System.out.println("璇勫垎椤�: " + item); - } - - } catch (Exception e) { - System.out.println("妫�鏌ヨ〃缁撴瀯澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CheckUserPermissionTest.java b/backend/src/test/java/com/rongyichuang/CheckUserPermissionTest.java deleted file mode 100644 index deb5eaf..0000000 --- a/backend/src/test/java/com/rongyichuang/CheckUserPermissionTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CheckUserPermissionTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkUserJudgePermission() { - System.out.println("=== 妫�鏌ョ敤鎴稩D=2鐨勮瘎濮旀潈闄� ==="); - - try { - // 鍏堟煡鐪嬬敤鎴疯〃缁撴瀯 - String describeUserSql = "DESCRIBE t_user"; - List<Map<String, Object>> userTableStructure = jdbcTemplate.queryForList(describeUserSql); - System.out.println("鐢ㄦ埛琛ㄧ粨鏋�:"); - for (Map<String, Object> column : userTableStructure) { - System.out.println("瀛楁: " + column.get("Field") + ", 绫诲瀷: " + column.get("Type")); - } - - // 1. 妫�鏌ョ敤鎴稩D=2鏄惁鍏宠仈浜嗚瘎濮旇褰� - String userJudgeSql = "SELECT u.id as user_id, u.phone, j.id as judge_id, j.name as judge_name " + - "FROM t_user u LEFT JOIN t_judge j ON u.id = j.user_id WHERE u.id = 2"; - List<Map<String, Object>> userJudgeData = jdbcTemplate.queryForList(userJudgeSql); - - System.out.println("\n鐢ㄦ埛璇勫鍏宠仈鏁版嵁:"); - for (Map<String, Object> row : userJudgeData) { - System.out.println("鐢ㄦ埛ID: " + row.get("user_id") + - ", 鎵嬫満鍙�: " + row.get("phone") + - ", 璇勫ID: " + row.get("judge_id") + - ", 璇勫濮撳悕: " + row.get("judge_name")); - } - - // 2. 濡傛灉鏈夎瘎濮旇褰曪紝妫�鏌ヨ瘎濮旂殑娲诲姩鏉冮檺 - if (!userJudgeData.isEmpty() && userJudgeData.get(0).get("judge_id") != null) { - Long judgeId = ((Number) userJudgeData.get(0).get("judge_id")).longValue(); - - String activityJudgeSql = "SELECT aj.activity_id, aj.judge_id, aj.state, a.name as activity_name " + - "FROM t_activity_judge aj " + - "LEFT JOIN t_activity a ON aj.activity_id = a.id " + - "WHERE aj.judge_id = ?"; - List<Map<String, Object>> activityJudgeData = jdbcTemplate.queryForList(activityJudgeSql, judgeId); - - System.out.println("\n璇勫娲诲姩鏉冮檺鏁版嵁:"); - for (Map<String, Object> row : activityJudgeData) { - System.out.println("娲诲姩ID: " + row.get("activity_id") + - ", 娲诲姩鍚嶇О: " + row.get("activity_name") + - ", 璇勫ID: " + row.get("judge_id") + - ", 鐘舵��: " + row.get("state")); - } - - if (activityJudgeData.isEmpty()) { - System.out.println("鉂� 璇勫ID=" + judgeId + " 娌℃湁浠讳綍娲诲姩鐨勮瘎瀹℃潈闄�"); - } - } else { - System.out.println("鉂� 鐢ㄦ埛ID=2 娌℃湁鍏宠仈璇勫璁板綍"); - } - - // 3. 妫�鏌ユ墍鏈夋椿鍔ㄧ殑淇℃伅 - String allActivitiesSql = "SELECT id, name, state FROM t_activity ORDER BY id"; - List<Map<String, Object>> allActivities = jdbcTemplate.queryForList(allActivitiesSql); - - System.out.println("\n鎵�鏈夋椿鍔ㄤ俊鎭�:"); - for (Map<String, Object> row : allActivities) { - System.out.println("娲诲姩ID: " + row.get("id") + - ", 娲诲姩鍚嶇О: " + row.get("name") + - ", 鐘舵��: " + row.get("state")); - } - - // 4. 妫�鏌ユ墍鏈夎瘎濮斾俊鎭� - String allJudgesSql = "SELECT id, name, user_id FROM t_judge ORDER BY id"; - List<Map<String, Object>> allJudges = jdbcTemplate.queryForList(allJudgesSql); - - System.out.println("\n鎵�鏈夎瘎濮斾俊鎭�:"); - for (Map<String, Object> row : allJudges) { - System.out.println("璇勫ID: " + row.get("id") + - ", 璇勫濮撳悕: " + row.get("name") + - ", 鐢ㄦ埛ID: " + row.get("user_id")); - } - - } catch (Exception e) { - System.out.println("妫�鏌ユ潈闄愭椂鍙戠敓寮傚父: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CreateJudgeForUser2Test.java b/backend/src/test/java/com/rongyichuang/CreateJudgeForUser2Test.java deleted file mode 100644 index 272a3ec..0000000 --- a/backend/src/test/java/com/rongyichuang/CreateJudgeForUser2Test.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class CreateJudgeForUser2Test { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void createJudgeForUser2() { - System.out.println("=== 涓虹敤鎴稩D=2鍒涘缓璇勫璁板綍 ==="); - - try { - // 1. 棣栧厛妫�鏌ョ敤鎴稩D=2鐨勫熀鏈俊鎭� - String getUserInfoSql = "SELECT id, phone, name FROM t_user WHERE id = 2"; - Map<String, Object> userInfo = jdbcTemplate.queryForMap(getUserInfoSql); - System.out.println("鐢ㄦ埛淇℃伅: ID=" + userInfo.get("id") + - ", 鎵嬫満鍙�=" + userInfo.get("phone") + - ", 濮撳悕=" + userInfo.get("name")); - - // 2. 妫�鏌ユ槸鍚﹀凡缁忔湁璇勫璁板綍 - String checkJudgeSql = "SELECT COUNT(*) as count FROM t_judge WHERE user_id = 2"; - Map<String, Object> judgeExists = jdbcTemplate.queryForMap(checkJudgeSql); - - if (((Number) judgeExists.get("count")).intValue() > 0) { - System.out.println("鐢ㄦ埛ID=2宸茬粡鏈夎瘎濮旇褰曪紝鏃犻渶閲嶅鍒涘缓"); - return; - } - - // 3. 鍒涘缓璇勫璁板綍 - String userName = (String) userInfo.get("name"); - String userPhone = (String) userInfo.get("phone"); - if (userName == null || userName.trim().isEmpty()) { - userName = "璇勫_" + userPhone; // 濡傛灉娌℃湁濮撳悕锛屼娇鐢ㄦ墜鏈哄彿 - } - - // 鍏堟煡鐪嬬幇鏈夎瘎濮旇褰曠殑瀛楁锛屽鍒朵竴涓被浼肩殑璁板綍 - String copyExistingJudgeSql = "INSERT INTO t_judge (name, user_id, phone, gender, state, description, version, stage_id) " + - "SELECT ?, ?, ?, gender, state, '绯荤粺鑷姩鍒涘缓鐨勮瘎濮�', 0, stage_id FROM t_judge WHERE id = 65 LIMIT 1"; - int result = jdbcTemplate.update(copyExistingJudgeSql, userName, 2, userPhone); - - if (result > 0) { - System.out.println("鉁� 鎴愬姛涓虹敤鎴稩D=2鍒涘缓璇勫璁板綍"); - - // 4. 鑾峰彇鏂板垱寤虹殑璇勫ID - String getNewJudgeIdSql = "SELECT id, name FROM t_judge WHERE user_id = 2"; - Map<String, Object> newJudge = jdbcTemplate.queryForMap(getNewJudgeIdSql); - Long judgeId = ((Number) newJudge.get("id")).longValue(); - String judgeName = (String) newJudge.get("name"); - - System.out.println("鏂拌瘎濮斾俊鎭�: ID=" + judgeId + ", 濮撳悕=" + judgeName); - - // 5. 鏌ョ湅褰撳墠鏈夊摢浜涙椿鍔ㄥ彲浠ュ垎閰嶆潈闄� - String getActivitiesSql = "SELECT id, name, state FROM t_activity WHERE state = 1 ORDER BY id DESC LIMIT 5"; - List<Map<String, Object>> activities = jdbcTemplate.queryForList(getActivitiesSql); - - System.out.println("褰撳墠鍙敤鐨勬椿鍔紙鏈�鏂�5涓級:"); - for (Map<String, Object> activity : activities) { - System.out.println(" 娲诲姩ID: " + activity.get("id") + - ", 娲诲姩鍚嶇О: " + activity.get("name") + - ", 鐘舵��: " + activity.get("state")); - } - - // 6. 涓鸿瘎濮斿垎閰嶆渶鏂版椿鍔ㄧ殑鏉冮檺锛堝亣璁惧垎閰嶆渶鏂扮殑娲诲姩锛� - if (!activities.isEmpty()) { - Map<String, Object> latestActivity = activities.get(0); - Long activityId = ((Number) latestActivity.get("id")).longValue(); - String activityName = (String) latestActivity.get("name"); - - // 妫�鏌ユ槸鍚﹀凡缁忔湁鏉冮檺 - String checkPermissionSql = "SELECT COUNT(*) as count FROM t_activity_judge WHERE judge_id = ? AND activity_id = ?"; - Map<String, Object> permissionExists = jdbcTemplate.queryForMap(checkPermissionSql, judgeId, activityId); - - if (((Number) permissionExists.get("count")).intValue() == 0) { - String insertPermissionSql = "INSERT INTO t_activity_judge (judge_id, activity_id, state, create_time, update_time) VALUES (?, ?, 1, NOW(), NOW())"; - int permissionResult = jdbcTemplate.update(insertPermissionSql, judgeId, activityId); - - if (permissionResult > 0) { - System.out.println("鉁� 鎴愬姛涓鸿瘎濮斿垎閰嶆椿鍔ㄦ潈闄�: " + activityName + " (ID=" + activityId + ")"); - } else { - System.out.println("鉂� 鍒嗛厤娲诲姩鏉冮檺澶辫触"); - } - } else { - System.out.println("璇勫宸茬粡鏈夎娲诲姩鐨勬潈闄�"); - } - } - - } else { - System.out.println("鉂� 鍒涘缓璇勫璁板綍澶辫触"); - } - - } catch (Exception e) { - System.out.println("鍒涘缓璇勫璁板綍鏃跺彂鐢熷紓甯�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CreateMultiRoleUserTest.java b/backend/src/test/java/com/rongyichuang/CreateMultiRoleUserTest.java deleted file mode 100644 index 78a5830..0000000 --- a/backend/src/test/java/com/rongyichuang/CreateMultiRoleUserTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("dev") -public class CreateMultiRoleUserTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Test - public void createMultiRoleUser() { - try { - // 妫�鏌ユ槸鍚﹀凡瀛樺湪澶氳鑹叉祴璇曠敤鎴� - Integer userCount = jdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM t_user WHERE mobile = '13800000003'", - Integer.class - ); - - if (userCount > 0) { - System.out.println("澶氳鑹叉祴璇曠敤鎴峰凡瀛樺湪锛岃烦杩囧垱寤�"); - return; - } - - // 鍔犲瘑瀵嗙爜 (瀵嗙爜涓�: 123456) - String encodedPassword = passwordEncoder.encode("123456"); - - // 鎻掑叆澶氳鑹叉祴璇曠敤鎴峰埌 t_user 琛� - jdbcTemplate.update( - "INSERT INTO t_user (name, wx_openid, wx_unionid, state, mobile, password, create_time, update_time, version) VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), 0)", - "澶氳鑹叉祴璇曠敤鎴�", "test_multi_role_openid", "test_multi_role_unionid", 1, "13800000003", encodedPassword - ); - - // 鑾峰彇鐢ㄦ埛ID - Long userId = jdbcTemplate.queryForObject( - "SELECT id FROM t_user WHERE mobile = ?", Long.class, "13800000003" - ); - - // 鎻掑叆涓哄憳宸� - jdbcTemplate.update( - "INSERT INTO t_employee (name, phone, role_id, user_id, state, create_time, update_time, version, description) VALUES (?, ?, ?, ?, ?, NOW(), NOW(), 0, ?)", - "澶氳鑹叉祴璇曠敤鎴�", "13800000003", "MANAGER", userId, 1, "鏃㈡槸鍛樺伐鍙堟槸璇勫鐨勬祴璇曡处鍙�" - ); - - // 鎻掑叆涓鸿瘎濮� - jdbcTemplate.update( - "INSERT INTO t_judge (name, user_id, phone, gender, state, description, create_time, update_time, version, title, company, introduction) VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), 0, ?, ?, ?)", - "澶氳鑹叉祴璇曠敤鎴�", userId, "13800000003", 1, 1, "鏃㈡槸鍛樺伐鍙堟槸璇勫鐨勬祴璇曡处鍙�", "鎶�鏈�荤洃", "娴嬭瘯鍏徃", "鎷ユ湁绠$悊鍜屾妧鏈瘎瀹″弻閲嶈亴鑳�" - ); - - System.out.println("澶氳鑹叉祴璇曠敤鎴峰垱寤烘垚鍔燂紒"); - System.out.println("璐﹀彿: 13800000003, 瀵嗙爜: 123456"); - System.out.println("璇ョ敤鎴峰悓鏃跺叿鏈夊憳宸ュ拰璇勫瑙掕壊锛岀敤浜庢祴璇曡鑹蹭紭鍏堢骇"); - - } catch (Exception e) { - System.err.println("鍒涘缓澶氳鑹叉祴璇曠敤鎴峰け璐�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/CreateTestUsersTest.java b/backend/src/test/java/com/rongyichuang/CreateTestUsersTest.java deleted file mode 100644 index 0f117ca..0000000 --- a/backend/src/test/java/com/rongyichuang/CreateTestUsersTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("dev") -public class CreateTestUsersTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Test - public void createTestUsers() { - try { - // 鍏堝垹闄ょ幇鏈夌殑娴嬭瘯鐢ㄦ埛锛堝鏋滃瓨鍦級 - System.out.println("鍒犻櫎鐜版湁娴嬭瘯鐢ㄦ埛..."); - jdbcTemplate.update("DELETE FROM t_employee WHERE phone IN ('13800000001', '13800000002')"); - jdbcTemplate.update("DELETE FROM t_judge WHERE phone IN ('13800000001', '13800000002')"); - jdbcTemplate.update("DELETE FROM t_user WHERE mobile IN ('13800000001', '13800000002') OR phone IN ('13800000001', '13800000002')"); - System.out.println("鐜版湁娴嬭瘯鐢ㄦ埛宸插垹闄�"); - - // 鍔犲瘑瀵嗙爜 (瀵嗙爜涓�: 123456) - String encodedPassword = passwordEncoder.encode("123456"); - - // 鎻掑叆娴嬭瘯鐢ㄦ埛鍒� t_user 琛� (鍖呭惈瀵嗙爜锛屽悓鏃惰缃畃hone鍜宮obile瀛楁) - jdbcTemplate.update( - "INSERT INTO t_user (name, wx_openid, wx_unionid, state, mobile, phone, password, create_time, update_time, version) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW(), 0)", - "娴嬭瘯鍛樺伐", "test_employee_openid", "test_employee_unionid", 1, "13800000001", "13800000001", encodedPassword - ); - - jdbcTemplate.update( - "INSERT INTO t_user (name, wx_openid, wx_unionid, state, mobile, phone, password, create_time, update_time, version) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW(), 0)", - "娴嬭瘯璇勫", "test_judge_openid", "test_judge_unionid", 1, "13800000002", "13800000002", encodedPassword - ); - - // 鑾峰彇鐢ㄦ埛ID - Long employeeUserId = jdbcTemplate.queryForObject( - "SELECT id FROM t_user WHERE mobile = ?", Long.class, "13800000001" - ); - - Long judgeUserId = jdbcTemplate.queryForObject( - "SELECT id FROM t_user WHERE mobile = ?", Long.class, "13800000002" - ); - - // 鎻掑叆娴嬭瘯鍛樺伐鍒� t_employee 琛� (涓嶅寘鍚瘑鐮�) - jdbcTemplate.update( - "INSERT INTO t_employee (name, phone, role_id, user_id, state, create_time, update_time, version, description) VALUES (?, ?, ?, ?, ?, NOW(), NOW(), 0, ?)", - "娴嬭瘯鍛樺伐", "13800000001", "ADMIN", employeeUserId, 1, "绯荤粺娴嬭瘯鍛樺伐璐﹀彿" - ); - - // 鎻掑叆娴嬭瘯璇勫鍒� t_judge 琛� - jdbcTemplate.update( - "INSERT INTO t_judge (name, user_id, phone, gender, state, description, create_time, update_time, version, title, company, introduction) VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), 0, ?, ?, ?)", - "娴嬭瘯璇勫", judgeUserId, "13800000002", 1, 1, "绯荤粺娴嬭瘯璇勫璐﹀彿", "楂樼骇鎶�鏈笓瀹�", "娴嬭瘯鍏徃", "鎷ユ湁涓板瘜鐨勬妧鏈瘎瀹$粡楠�" - ); - - System.out.println("娴嬭瘯鐢ㄦ埛鍒涘缓鎴愬姛锛�"); - System.out.println("鍛樺伐璐﹀彿: 13800000001, 瀵嗙爜: 123456"); - System.out.println("璇勫璐﹀彿: 13800000002, 瀵嗙爜: 123456"); - - } catch (Exception e) { - System.err.println("鍒涘缓娴嬭瘯鐢ㄦ埛澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/DatabaseConnectionTest.java b/backend/src/test/java/com/rongyichuang/DatabaseConnectionTest.java deleted file mode 100644 index c1cc1bd..0000000 --- a/backend/src/test/java/com/rongyichuang/DatabaseConnectionTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -/** - * 鏁版嵁搴撹繛鎺ユ祴璇� - */ -@SpringBootTest -public class DatabaseConnectionTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void testDatabaseConnection() { - try { - // 娴嬭瘯鏁版嵁搴撹繛鎺� - String sql = "SELECT 1 as test"; - Integer result = jdbcTemplate.queryForObject(sql, Integer.class); - System.out.println("鏁版嵁搴撹繛鎺ユ祴璇曟垚鍔燂紝缁撴灉: " + result); - - // 鏌ヨ鎵�鏈夎〃 - String tablesSql = "SHOW TABLES"; - List<Map<String, Object>> tables = jdbcTemplate.queryForList(tablesSql); - System.out.println("鏁版嵁搴撲腑鐨勮〃:"); - for (Map<String, Object> table : tables) { - System.out.println("- " + table.values().iterator().next()); - } - - } catch (Exception e) { - System.err.println("鏁版嵁搴撹繛鎺ユ祴璇曞け璐�: " + e.getMessage()); - e.printStackTrace(); - } - } - - @Test - public void testTableStructure() { - try { - // 鑾峰彇琛ㄧ粨鏋勪俊鎭� - String[] tables = {"t_activity", "t_judge", "t_player", "t_rating_scheme", "t_carousel", "t_employee", "t_media", "t_tag"}; - - for (String tableName : tables) { - try { - String sql = "DESCRIBE " + tableName; - List<Map<String, Object>> columns = jdbcTemplate.queryForList(sql); - System.out.println("\n琛� " + tableName + " 鐨勭粨鏋�:"); - for (Map<String, Object> column : columns) { - System.out.println(" " + column.get("Field") + " - " + column.get("Type") + - (column.get("Null").equals("NO") ? " NOT NULL" : "") + - (column.get("Key").equals("PRI") ? " PRIMARY KEY" : "")); - } - } catch (Exception e) { - System.out.println("琛� " + tableName + " 涓嶅瓨鍦ㄦ垨鏌ヨ澶辫触: " + e.getMessage()); - } - } - - } catch (Exception e) { - System.err.println("鏌ヨ琛ㄧ粨鏋勫け璐�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/DatabaseSchemaTest.java b/backend/src/test/java/com/rongyichuang/DatabaseSchemaTest.java deleted file mode 100644 index 39b5ef9..0000000 --- a/backend/src/test/java/com/rongyichuang/DatabaseSchemaTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class DatabaseSchemaTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void testRatingSchemeTable() { - try { - // 鏌ョ湅璇勫垎妯℃澘琛ㄧ粨鏋� - String sql = "DESCRIBE t_rating_scheme"; - List<Map<String, Object>> result = jdbcTemplate.queryForList(sql); - System.out.println("=== t_rating_scheme 琛ㄧ粨鏋� ==="); - for (Map<String, Object> row : result) { - System.out.println(row); - } - } catch (Exception e) { - System.out.println("t_rating_scheme 琛ㄤ笉瀛樺湪锛屾煡鐪嬫墍鏈夎〃锛�"); - String sql = "SHOW TABLES LIKE '%rating%'"; - List<Map<String, Object>> tables = jdbcTemplate.queryForList(sql); - for (Map<String, Object> table : tables) { - System.out.println(table); - } - } - } - - @Test - public void testRatingItemTable() { - try { - // 鏌ョ湅璇勫垎鏉$洰琛ㄧ粨鏋� - String sql = "DESCRIBE t_rating_item"; - List<Map<String, Object>> result = jdbcTemplate.queryForList(sql); - System.out.println("=== t_rating_item 琛ㄧ粨鏋� ==="); - for (Map<String, Object> row : result) { - System.out.println(row); - } - } catch (Exception e) { - System.out.println("t_rating_item 琛ㄤ笉瀛樺湪"); - } - } - - @Test - public void testAllTables() { - String sql = "SHOW TABLES"; - List<Map<String, Object>> tables = jdbcTemplate.queryForList(sql); - System.out.println("=== 鎵�鏈夋暟鎹簱琛� ==="); - for (Map<String, Object> table : tables) { - System.out.println(table); - } - } - - @Test - public void testForeignKeyConstraints() { - try { - String sql = "SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME " + - "FROM information_schema.KEY_COLUMN_USAGE " + - "WHERE TABLE_SCHEMA = 'ryc' AND REFERENCED_TABLE_NAME IS NOT NULL"; - List<Map<String, Object>> result = jdbcTemplate.queryForList(sql); - System.out.println("=== 澶栭敭绾︽潫 ==="); - for (Map<String, Object> row : result) { - System.out.println(row); - } - } catch (Exception e) { - System.out.println("鏌ヨ澶栭敭绾︽潫澶辫触: " + e.getMessage()); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/GraphQLEndpointTest.java b/backend/src/test/java/com/rongyichuang/GraphQLEndpointTest.java deleted file mode 100644 index 64002ec..0000000 --- a/backend/src/test/java/com/rongyichuang/GraphQLEndpointTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.TestPropertySource; - -import java.util.HashMap; -import java.util.Map; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(properties = { - "server.servlet.context-path=" -}) -public class GraphQLEndpointTest { - - @LocalServerPort - private int port; - - private final TestRestTemplate restTemplate = new TestRestTemplate(); - - @Test - public void testGraphQLEndpoint() { - // 娴嬭瘯绠�鍗曠殑GraphQL鏌ヨ - Map<String, String> requestBody = new HashMap<>(); - requestBody.put("query", "{ hello }"); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers); - - String url = "http://localhost:" + port + "/graphql"; - System.out.println("娴嬭瘯GraphQL绔偣: " + url); - - ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); - - System.out.println("鍝嶅簲鐘舵�佺爜: " + response.getStatusCode()); - System.out.println("鍝嶅簲浣�: " + response.getBody()); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/SetupActivityJudgeTest.java b/backend/src/test/java/com/rongyichuang/SetupActivityJudgeTest.java deleted file mode 100644 index bb4b420..0000000 --- a/backend/src/test/java/com/rongyichuang/SetupActivityJudgeTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -public class SetupActivityJudgeTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void setupActivityJudge() { - // 涓鸿瘎濮擨D涓�21鐨勮瘎濮旀坊鍔犳椿鍔↖D涓�1鐨勫叧鑱旇褰� - String insertSql = "INSERT INTO t_activity_judge (activity_id, stage_id, judge_id, state) VALUES (1, 1, 21, 1)"; - int insertedRows = jdbcTemplate.update(insertSql); - - System.out.println("鎻掑叆浜� " + insertedRows + " 鏉℃椿鍔ㄨ瘎濮斿叧鑱旇褰�"); - - // 楠岃瘉鎻掑叆缁撴灉 - String verifySql = "SELECT * FROM t_activity_judge WHERE activity_id = 1 AND judge_id = 21"; - jdbcTemplate.queryForList(verifySql).forEach(row -> { - System.out.println("娲诲姩ID: " + row.get("activity_id") + - ", 璇勫ID: " + row.get("judge_id") + - ", 闃舵ID: " + row.get("stage_id") + - ", 鐘舵��: " + row.get("state")); - }); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/SetupJudgeUserTest.java b/backend/src/test/java/com/rongyichuang/SetupJudgeUserTest.java deleted file mode 100644 index f2f836c..0000000 --- a/backend/src/test/java/com/rongyichuang/SetupJudgeUserTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -public class SetupJudgeUserTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void setupJudgeUser() { - // 涓虹涓�涓瘎濮旇缃畊ser_id涓�1锛屼互渚挎祴璇曡瘎鍒嗗姛鑳� - String updateSql = "UPDATE t_judge SET user_id = 1 WHERE id = 21"; - int updatedRows = jdbcTemplate.update(updateSql); - - System.out.println("鏇存柊浜� " + updatedRows + " 鏉¤瘎濮旇褰�"); - - // 楠岃瘉鏇存柊缁撴灉 - String verifySql = "SELECT id, name, user_id FROM t_judge WHERE user_id = 1"; - jdbcTemplate.queryForList(verifySql).forEach(row -> { - System.out.println("璇勫ID: " + row.get("id") + - ", 濮撳悕: " + row.get("name") + - ", 鐢ㄦ埛ID: " + row.get("user_id")); - }); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/SimpleGraphQLTest.java b/backend/src/test/java/com/rongyichuang/SimpleGraphQLTest.java deleted file mode 100644 index 632ec30..0000000 --- a/backend/src/test/java/com/rongyichuang/SimpleGraphQLTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class SimpleGraphQLTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Test - public void testGraphQLEndpointExists() { - String url = "http://localhost:" + port + "/graphql"; - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - String query = "{\"query\":\"{ hello }\"}"; - HttpEntity<String> request = new HttpEntity<>(query, headers); - - System.out.println("娴嬭瘯GraphQL绔偣: " + url); - ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class); - - System.out.println("鍝嶅簲鐘舵�佺爜: " + response.getStatusCode()); - System.out.println("鍝嶅簲浣�: " + response.getBody()); - - // 濡傛灉GraphQL绔偣姝e父宸ヤ綔锛屽簲璇ヨ繑鍥�200鐘舵�佺爜 - // 濡傛灉杩斿洖404鎴�500锛岃鏄庣鐐归厤缃湁闂 - assertTrue(response.getStatusCode().is2xxSuccessful() || response.getStatusCode().is4xxClientError()); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/SimpleUserCheckTest.java b/backend/src/test/java/com/rongyichuang/SimpleUserCheckTest.java deleted file mode 100644 index a72da69..0000000 --- a/backend/src/test/java/com/rongyichuang/SimpleUserCheckTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.rongyichuang; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class SimpleUserCheckTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void checkUser2Permission() { - System.out.println("=== 妫�鏌ョ敤鎴稩D=2鐨勮瘎濮旀潈闄愰棶棰� ==="); - - try { - // 1. 妫�鏌ョ敤鎴稩D=2鏄惁瀛樺湪 - String userExistsSql = "SELECT COUNT(*) as count FROM t_user WHERE id = 2"; - Map<String, Object> userExists = jdbcTemplate.queryForMap(userExistsSql); - System.out.println("鐢ㄦ埛ID=2鏄惁瀛樺湪: " + userExists.get("count")); - - // 2. 妫�鏌ョ敤鎴稩D=2鏄惁鍏宠仈浜嗚瘎濮� - String judgeExistsSql = "SELECT COUNT(*) as count FROM t_judge WHERE user_id = 2"; - Map<String, Object> judgeExists = jdbcTemplate.queryForMap(judgeExistsSql); - System.out.println("鐢ㄦ埛ID=2鍏宠仈鐨勮瘎濮旀暟閲�: " + judgeExists.get("count")); - - // 3. 濡傛灉鏈夎瘎濮旓紝鑾峰彇璇勫ID - if (((Number) judgeExists.get("count")).intValue() > 0) { - String getJudgeIdSql = "SELECT id, name FROM t_judge WHERE user_id = 2"; - List<Map<String, Object>> judges = jdbcTemplate.queryForList(getJudgeIdSql); - for (Map<String, Object> judge : judges) { - Long judgeId = ((Number) judge.get("id")).longValue(); - String judgeName = (String) judge.get("name"); - System.out.println("璇勫ID: " + judgeId + ", 璇勫濮撳悕: " + judgeName); - - // 4. 妫�鏌ヨ璇勫鐨勬椿鍔ㄦ潈闄� - String activityPermissionSql = "SELECT COUNT(*) as count FROM t_activity_judge WHERE judge_id = ?"; - Map<String, Object> activityPermission = jdbcTemplate.queryForMap(activityPermissionSql, judgeId); - System.out.println("璇勫ID=" + judgeId + " 鐨勬椿鍔ㄦ潈闄愭暟閲�: " + activityPermission.get("count")); - - // 5. 鍒楀嚭鍏蜂綋鐨勬椿鍔ㄦ潈闄� - if (((Number) activityPermission.get("count")).intValue() > 0) { - String activityDetailsSql = "SELECT activity_id, state FROM t_activity_judge WHERE judge_id = ?"; - List<Map<String, Object>> activities = jdbcTemplate.queryForList(activityDetailsSql, judgeId); - System.out.println("鍏蜂綋娲诲姩鏉冮檺:"); - for (Map<String, Object> activity : activities) { - System.out.println(" 娲诲姩ID: " + activity.get("activity_id") + ", 鐘舵��: " + activity.get("state")); - } - } else { - System.out.println("鉂� 璇ヨ瘎濮旀病鏈変换浣曟椿鍔ㄧ殑璇勫鏉冮檺锛�"); - } - } - } else { - System.out.println("鉂� 鐢ㄦ埛ID=2 娌℃湁鍏宠仈浠讳綍璇勫璁板綍锛�"); - - // 鏌ョ湅鎵�鏈夋湁鐢ㄦ埛ID鐨勮瘎濮� - String allJudgesWithUserSql = "SELECT id, name, user_id FROM t_judge WHERE user_id IS NOT NULL"; - List<Map<String, Object>> allJudges = jdbcTemplate.queryForList(allJudgesWithUserSql); - System.out.println("鎵�鏈夋湁鐢ㄦ埛ID鐨勮瘎濮�:"); - for (Map<String, Object> judge : allJudges) { - System.out.println(" 璇勫ID: " + judge.get("id") + - ", 濮撳悕: " + judge.get("name") + - ", 鐢ㄦ埛ID: " + judge.get("user_id")); - } - } - - } catch (Exception e) { - System.out.println("妫�鏌ユ潈闄愭椂鍙戠敓寮傚父: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/TestActivityServiceTest.java b/backend/src/test/java/com/rongyichuang/TestActivityServiceTest.java deleted file mode 100644 index 9d0bd97..0000000 --- a/backend/src/test/java/com/rongyichuang/TestActivityServiceTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.rongyichuang; - -import com.rongyichuang.activity.dto.ActivityResponse; -import com.rongyichuang.activity.service.ActivityService; -import com.rongyichuang.activity.repository.ActivityRepository; -import com.rongyichuang.activity.entity.Activity; -import com.rongyichuang.common.dto.PageRequest; -import com.rongyichuang.common.dto.PageResponse; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.Page; - -@SpringBootTest -public class TestActivityServiceTest { - - @Autowired - private ActivityService activityService; - - @Autowired - private ActivityRepository activityRepository; - - @Test - public void testFindCompetitions() { - try { - System.out.println("=== 娴嬭瘯ActivityService.findCompetitions ==="); - - // 鍏堢洿鎺ユ祴璇昍epository - System.out.println("\n=== 鐩存帴娴嬭瘯Repository ==="); - Page<Activity> activities = activityRepository.findByPidAndStateOrderByCreateTimeDesc(0L, 1, - org.springframework.data.domain.PageRequest.of(0, 10)); - System.out.println("Repository鏌ヨ缁撴灉鏁伴噺: " + activities.getContent().size()); - System.out.println("Repository鎬昏褰曟暟: " + activities.getTotalElements()); - - if (activities.getContent().size() > 0) { - Activity firstActivity = activities.getContent().get(0); - System.out.println("绗竴涓狝ctivity - ID: " + firstActivity.getId() + - ", 鍚嶇О: " + firstActivity.getName() + - ", 鐘舵��: " + firstActivity.getState() + - ", PID: " + firstActivity.getPid()); - - // 娴嬭瘯ActivityResponse鏋勯�� - try { - ActivityResponse response = new ActivityResponse(firstActivity); - System.out.println(" -> 杞崲鎴愬姛: " + response.getName()); - } catch (Exception e) { - System.out.println(" -> 杞崲澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } - - System.out.println("\n=== 娴嬭瘯Service鏂规硶 ==="); - PageRequest pageRequest = new PageRequest(1, 10); - PageResponse<ActivityResponse> result = activityService.findActivities(pageRequest, null); - - System.out.println("鎬昏褰曟暟: " + result.getTotalElements()); - System.out.println("褰撳墠椤�: " + result.getPage()); - System.out.println("椤靛ぇ灏�: " + result.getSize()); - System.out.println("鍐呭鏁伴噺: " + result.getContent().size()); - - } catch (Exception e) { - System.out.println("娴嬭瘯澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/VerifyUserDataTest.java b/backend/src/test/java/com/rongyichuang/VerifyUserDataTest.java deleted file mode 100644 index 8312829..0000000 --- a/backend/src/test/java/com/rongyichuang/VerifyUserDataTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.rongyichuang; - -import com.rongyichuang.user.entity.User; -import com.rongyichuang.user.repository.UserRepository; -import com.rongyichuang.employee.entity.Employee; -import com.rongyichuang.employee.repository.EmployeeRepository; -import com.rongyichuang.judge.entity.Judge; -import com.rongyichuang.judge.repository.JudgeRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.ActiveProfiles; - -import java.util.Optional; - -@SpringBootTest -@ActiveProfiles("dev") -public class VerifyUserDataTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private EmployeeRepository employeeRepository; - - @Autowired - private JudgeRepository judgeRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Test - public void verifyTestUsers() { - System.out.println("=== 楠岃瘉娴嬭瘯鐢ㄦ埛鏁版嵁 ==="); - - // 楠岃瘉鍛樺伐鐢ㄦ埛 - verifyUser("13800000001", "鍛樺伐"); - - // 楠岃瘉璇勫鐢ㄦ埛 - verifyUser("13800000002", "璇勫"); - - // 楠岃瘉澶氳鑹茬敤鎴� - verifyUser("13800000003", "澶氳鑹�"); - } - - private void verifyUser(String phone, String userType) { - System.out.println("\n--- 楠岃瘉" + userType + "鐢ㄦ埛: " + phone + " ---"); - - // 鏌ユ壘鐢ㄦ埛 - Optional<User> userOpt = userRepository.findByPhone(phone); - if (userOpt.isEmpty()) { - System.out.println("鉂� 鐢ㄦ埛涓嶅瓨鍦�"); - return; - } - - User user = userOpt.get(); - System.out.println("鉁� 鐢ㄦ埛瀛樺湪: ID=" + user.getId() + ", 濮撳悕=" + user.getName()); - - // 楠岃瘉瀵嗙爜 - if (user.getPassword() == null || user.getPassword().trim().isEmpty()) { - System.out.println("鉂� 鐢ㄦ埛瀵嗙爜涓虹┖"); - } else { - boolean passwordMatch = passwordEncoder.matches("123456", user.getPassword()); - System.out.println(passwordMatch ? "鉁� 瀵嗙爜楠岃瘉鎴愬姛" : "鉂� 瀵嗙爜楠岃瘉澶辫触"); - System.out.println("瀛樺偍鐨勫瘑鐮佸搱甯�: " + user.getPassword().substring(0, 20) + "..."); - } - - // 鏌ユ壘鍏宠仈鐨勫憳宸ヤ俊鎭� - Optional<Employee> employeeOpt = employeeRepository.findByUserId(user.getId()); - if (employeeOpt.isPresent()) { - Employee employee = employeeOpt.get(); - System.out.println("鉁� 鍛樺伐淇℃伅: ID=" + employee.getId() + ", 濮撳悕=" + employee.getName() + ", 瑙掕壊=" + employee.getRoleId()); - } else { - System.out.println("鉂� 鏃犲憳宸ヤ俊鎭�"); - } - - // 鏌ユ壘鍏宠仈鐨勮瘎濮斾俊鎭� - Optional<Judge> judgeOpt = judgeRepository.findByUserId(user.getId()); - if (judgeOpt.isPresent()) { - Judge judge = judgeOpt.get(); - System.out.println("鉁� 璇勫淇℃伅: ID=" + judge.getId() + ", 濮撳悕=" + judge.getName() + ", 鑱屼綅=" + judge.getTitle()); - } else { - System.out.println("鉂� 鏃犺瘎濮斾俊鎭�"); - } - - // 妫�鏌ユ潈闄� - if (employeeOpt.isEmpty() && judgeOpt.isEmpty()) { - System.out.println("鉂� 鐢ㄦ埛娌℃湁鏉冮檺锛堟棦涓嶆槸鍛樺伐涔熶笉鏄瘎濮旓級"); - } else { - System.out.println("鉁� 鐢ㄦ埛鏈夋潈闄�"); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/auth/DirectLoginTest.java b/backend/src/test/java/com/rongyichuang/auth/DirectLoginTest.java deleted file mode 100644 index d3c078f..0000000 --- a/backend/src/test/java/com/rongyichuang/auth/DirectLoginTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.rongyichuang.auth; - -import com.rongyichuang.auth.dto.LoginRequest; -import com.rongyichuang.auth.dto.LoginResponse; -import com.rongyichuang.auth.service.AuthService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class DirectLoginTest { - - @Autowired - private AuthService authService; - - @Test - public void testDirectLogin() { - try { - System.out.println("=== 寮�濮嬬洿鎺ユ祴璇旳uthService鐧诲綍鏂规硶 ==="); - - LoginRequest request = new LoginRequest(); - request.setPhone("13800000001"); - request.setPassword("123456"); - - System.out.println("鐧诲綍璇锋眰: phone=" + request.getPhone() + ", password=" + request.getPassword()); - - LoginResponse response = authService.login(request); - - System.out.println("鐧诲綍鎴愬姛!"); - System.out.println("Token: " + response.getToken()); - System.out.println("鐢ㄦ埛ID: " + response.getUserInfo().getUserId()); - System.out.println("鐢ㄦ埛鍚�: " + response.getUserInfo().getName()); - System.out.println("鐢ㄦ埛绫诲瀷: " + response.getUserInfo().getUserType()); - - } catch (Exception e) { - System.err.println("鐧诲綍澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/auth/GraphQLLoginTest.java b/backend/src/test/java/com/rongyichuang/auth/GraphQLLoginTest.java deleted file mode 100644 index 6678371..0000000 --- a/backend/src/test/java/com/rongyichuang/auth/GraphQLLoginTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.rongyichuang.auth; - -import com.rongyichuang.auth.api.AuthGraphqlApi; -import com.rongyichuang.auth.dto.LoginRequest; -import com.rongyichuang.auth.dto.LoginResponse; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class GraphQLLoginTest { - - @Autowired - private AuthGraphqlApi authGraphqlApi; - - @Test - public void testGraphQLLogin() { - try { - System.out.println("=== 寮�濮嬫祴璇旼raphQL API灞傜櫥褰曟柟娉� ==="); - - LoginRequest request = new LoginRequest(); - request.setPhone("13800000001"); - request.setPassword("123456"); - - System.out.println("鐧诲綍璇锋眰: phone=" + request.getPhone() + ", password=" + request.getPassword()); - - LoginResponse response = authGraphqlApi.webLogin(request); - - System.out.println("GraphQL鐧诲綍鎴愬姛!"); - System.out.println("Token: " + response.getToken()); - System.out.println("鐢ㄦ埛ID: " + response.getUserInfo().getUserId()); - System.out.println("鐢ㄦ埛鍚�: " + response.getUserInfo().getName()); - System.out.println("鐢ㄦ埛绫诲瀷: " + response.getUserInfo().getUserType()); - - } catch (Exception e) { - System.err.println("GraphQL鐧诲綍澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/auth/WxLoginTest.java b/backend/src/test/java/com/rongyichuang/auth/WxLoginTest.java deleted file mode 100644 index 9d5d994..0000000 --- a/backend/src/test/java/com/rongyichuang/auth/WxLoginTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.rongyichuang.auth; - -import com.rongyichuang.auth.api.AuthGraphqlApi; -import com.rongyichuang.auth.dto.WxLoginRequest; -import com.rongyichuang.auth.dto.WxLoginResponse; -import com.rongyichuang.auth.entity.WxLoginRecord; -import com.rongyichuang.auth.repository.WxLoginRecordRepository; -import com.rongyichuang.user.entity.User; -import com.rongyichuang.user.repository.UserRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; - -@SpringBootTest -@Transactional -public class WxLoginTest { - - @Autowired - private AuthGraphqlApi authGraphqlApi; - - @Autowired - private UserRepository userRepository; - - @Autowired - private WxLoginRecordRepository wxLoginRecordRepository; - - @Test - public void testWxLoginNewUser() { - try { - System.out.println("=== 娴嬭瘯寰俊鐧诲綍锛堟柊鐢ㄦ埛锛� ==="); - - WxLoginRequest request = new WxLoginRequest(); - request.setWxOpenid("test_openid_001"); - request.setWxUnionid("test_unionid_001"); - request.setLoginIp("192.168.1.100"); - request.setDeviceInfo("iPhone 13"); - request.setSessionKey("test_session_key"); - request.setPhoneAuthorized(false); - - System.out.println("寰俊鐧诲綍璇锋眰: openid=" + request.getWxOpenid() + ", unionid=" + request.getWxUnionid()); - - WxLoginResponse response = authGraphqlApi.wxLogin(request); - - System.out.println("寰俊鐧诲綍鎴愬姛!"); - System.out.println("Token: " + response.getToken()); - System.out.println("鐢ㄦ埛ID: " + response.getUserInfo().getUserId()); - System.out.println("鐢ㄦ埛鍚�: " + response.getUserInfo().getName()); - System.out.println("鐢ㄦ埛绫诲瀷: " + response.getUserInfo().getUserType()); - System.out.println("鏄惁鏂扮敤鎴�: " + response.getIsNewUser()); - System.out.println("鐧诲綍璁板綍ID: " + response.getLoginRecordId()); - - // 楠岃瘉鐢ㄦ埛鏄惁鍒涘缓 - Optional<User> userOpt = userRepository.findByWxOpenid(request.getWxOpenid()); - if (userOpt.isPresent()) { - System.out.println("鐢ㄦ埛鍒涘缓鎴愬姛锛孖D: " + userOpt.get().getId()); - } - - // 楠岃瘉鐧诲綍璁板綍鏄惁鍒涘缓 - Optional<WxLoginRecord> recordOpt = wxLoginRecordRepository.findById(response.getLoginRecordId()); - if (recordOpt.isPresent()) { - WxLoginRecord record = recordOpt.get(); - System.out.println("鐧诲綍璁板綍鍒涘缓鎴愬姛锛宱penid: " + record.getWxOpenid() + ", 鐧诲綍鏃堕棿: " + record.getLoginTime()); - } - - } catch (Exception e) { - System.err.println("寰俊鐧诲綍澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } - - @Test - public void testWxLoginExistingUser() { - try { - System.out.println("=== 娴嬭瘯寰俊鐧诲綍锛堝凡瀛樺湪鐢ㄦ埛锛� ==="); - - // 鍏堝垱寤轰竴涓敤鎴� - User existingUser = new User(); - existingUser.setWxOpenid("existing_openid_001"); - existingUser.setWxUnionid("existing_unionid_001"); - existingUser.setName("宸插瓨鍦ㄧ殑寰俊鐢ㄦ埛"); - existingUser = userRepository.save(existingUser); - System.out.println("棰勫厛鍒涘缓鐢ㄦ埛锛孖D: " + existingUser.getId()); - - WxLoginRequest request = new WxLoginRequest(); - request.setWxOpenid("existing_openid_001"); - request.setWxUnionid("existing_unionid_001"); - request.setLoginIp("192.168.1.101"); - request.setDeviceInfo("Android Phone"); - request.setSessionKey("test_session_key_2"); - request.setPhoneAuthorized(true); - request.setPhone("13800000001"); - - System.out.println("寰俊鐧诲綍璇锋眰: openid=" + request.getWxOpenid()); - - WxLoginResponse response = authGraphqlApi.wxLogin(request); - - System.out.println("寰俊鐧诲綍鎴愬姛!"); - System.out.println("鐢ㄦ埛ID: " + response.getUserInfo().getUserId()); - System.out.println("鐢ㄦ埛鍚�: " + response.getUserInfo().getName()); - System.out.println("鏄惁鏂扮敤鎴�: " + response.getIsNewUser()); - System.out.println("鐧诲綍璁板綍ID: " + response.getLoginRecordId()); - - // 楠岃瘉鐧诲綍璁板綍 - Optional<WxLoginRecord> recordOpt = wxLoginRecordRepository.findById(response.getLoginRecordId()); - if (recordOpt.isPresent()) { - WxLoginRecord record = recordOpt.get(); - System.out.println("鐧诲綍璁板綍: 鎵嬫満鍙锋巿鏉�=" + record.getPhoneAuthorized() + ", 鎺堟潈鏃堕棿=" + record.getPhoneAuthTime()); - } - - } catch (Exception e) { - System.err.println("寰俊鐧诲綍澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/carousel/DatabaseSchemaTest.java b/backend/src/test/java/com/rongyichuang/carousel/DatabaseSchemaTest.java deleted file mode 100644 index bcafefc..0000000 --- a/backend/src/test/java/com/rongyichuang/carousel/DatabaseSchemaTest.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.rongyichuang.carousel; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import javax.sql.DataSource; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -@SpringBootTest -@ActiveProfiles("test") -public class DatabaseSchemaTest { - - @Autowired - private DataSource dataSource; - - @Test - public void testCarouselTableSchema() { - try (Connection connection = dataSource.getConnection()) { - System.out.println("=== 鏁版嵁搴撹繛鎺ユ垚鍔� ==="); - System.out.println("鏁版嵁搴揢RL: " + connection.getMetaData().getURL()); - System.out.println("鏁版嵁搴撲骇鍝�: " + connection.getMetaData().getDatabaseProductName()); - System.out.println("鏁版嵁搴撶増鏈�: " + connection.getMetaData().getDatabaseProductVersion()); - - // 妫�鏌ヨ〃鏄惁瀛樺湪 - DatabaseMetaData metaData = connection.getMetaData(); - ResultSet tables = metaData.getTables(null, null, "t_carousel", null); - - if (tables.next()) { - System.out.println("\n=== t_carousel 琛ㄥ瓨鍦� ==="); - - // 鑾峰彇琛ㄧ粨鏋� - ResultSet columns = metaData.getColumns(null, null, "t_carousel", null); - System.out.println("\n=== 琛ㄥ瓧娈典俊鎭� ==="); - System.out.printf("%-20s %-15s %-10s %-10s %-15s%n", - "瀛楁鍚�", "鏁版嵁绫诲瀷", "闀垮害", "鍙┖", "榛樿鍊�"); - System.out.println("=".repeat(80)); - - List<String> actualColumns = new ArrayList<>(); - while (columns.next()) { - String columnName = columns.getString("COLUMN_NAME"); - String dataType = columns.getString("TYPE_NAME"); - int columnSize = columns.getInt("COLUMN_SIZE"); - String nullable = columns.getString("IS_NULLABLE"); - String defaultValue = columns.getString("COLUMN_DEF"); - - actualColumns.add(columnName); - System.out.printf("%-20s %-15s %-10d %-10s %-15s%n", - columnName, dataType, columnSize, nullable, - defaultValue != null ? defaultValue : "NULL"); - } - - // 瀵规瘮瀹炰綋绫绘湡鏈涚殑瀛楁 - System.out.println("\n=== 瀹炰綋绫诲瓧娈靛姣� ==="); - String[] expectedColumns = { - "id", "title", "content", "sort_order", "state", - "create_time", "update_time", "create_by", "update_by" - }; - - for (String expected : expectedColumns) { - if (actualColumns.contains(expected)) { - System.out.println("鉁� " + expected + " - 瀛樺湪"); - } else { - System.out.println("鉁� " + expected + " - 缂哄け"); - } - } - - // 妫�鏌ユ槸鍚︽湁澶氫綑瀛楁 - System.out.println("\n=== 澶氫綑瀛楁妫�鏌� ==="); - for (String actual : actualColumns) { - boolean found = false; - for (String expected : expectedColumns) { - if (expected.equals(actual)) { - found = true; - break; - } - } - if (!found) { - System.out.println("! " + actual + " - 瀹炰綋绫讳腑鏈畾涔�"); - } - } - - } else { - System.out.println("\n=== t_carousel 琛ㄤ笉瀛樺湪 ==="); - - // 鍒楀嚭鎵�鏈夎〃 - System.out.println("\n=== 鏁版嵁搴撲腑鐨勬墍鏈夎〃 ==="); - ResultSet allTables = metaData.getTables(null, null, "%", new String[]{"TABLE"}); - while (allTables.next()) { - String tableName = allTables.getString("TABLE_NAME"); - if (tableName.toLowerCase().contains("carousel") || - tableName.toLowerCase().contains("news") || - tableName.toLowerCase().contains("banner")) { - System.out.println("- " + tableName); - } - } - } - - } catch (SQLException e) { - System.err.println("鏁版嵁搴撹繛鎺ユ垨鏌ヨ澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } - - @Test - public void testSimpleQuery() { - try (Connection connection = dataSource.getConnection()) { - // 灏濊瘯绠�鍗曟煡璇� - String sql = "SELECT COUNT(*) as count FROM t_carousel WHERE state = 1"; - try (PreparedStatement stmt = connection.prepareStatement(sql); - ResultSet rs = stmt.executeQuery()) { - - if (rs.next()) { - int count = rs.getInt("count"); - System.out.println("t_carousel 琛ㄤ腑鏈夋晥璁板綍鏁�: " + count); - } - } - } catch (SQLException e) { - System.err.println("鏌ヨ澶辫触: " + e.getMessage()); - - // 濡傛灉鏌ヨ澶辫触锛屽皾璇曚笉甯︽潯浠剁殑鏌ヨ - try (Connection connection = dataSource.getConnection()) { - String sql = "SELECT COUNT(*) as count FROM t_carousel"; - try (PreparedStatement stmt = connection.prepareStatement(sql); - ResultSet rs = stmt.executeQuery()) { - - if (rs.next()) { - int count = rs.getInt("count"); - System.out.println("t_carousel 琛ㄦ�昏褰曟暟: " + count); - } - } - } catch (SQLException e2) { - System.err.println("绠�鍗曟煡璇篃澶辫触: " + e2.getMessage()); - } - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/cos/CosUploadTest.java b/backend/src/test/java/com/rongyichuang/cos/CosUploadTest.java deleted file mode 100644 index 5cafd35..0000000 --- a/backend/src/test/java/com/rongyichuang/cos/CosUploadTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.rongyichuang.cos; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -@SpringBootTest -public class CosUploadTest { - - @Test - public void testTimeCalculation() { - long currentTimeMillis = System.currentTimeMillis(); - Date currentDate = new Date(); - Date futureDate = new Date(currentTimeMillis + 15 * 60 * 1000); - - System.out.println("褰撳墠绯荤粺鏃堕棿鎴�: " + currentTimeMillis); - System.out.println("褰撳墠鏃堕棿: " + currentDate); - System.out.println("15鍒嗛挓鍚�: " + futureDate); - System.out.println("褰撳墠鏃堕棿Unix绉�: " + (currentTimeMillis / 1000)); - System.out.println("15鍒嗛挓鍚嶶nix绉�: " + ((currentTimeMillis + 15 * 60 * 1000) / 1000)); - - LocalDateTime now = LocalDateTime.now(); - System.out.println("LocalDateTime鐜板湪: " + now); - - Instant instant = Instant.now(); - System.out.println("Instant鐜板湪: " + instant); - System.out.println("Instant Unix绉�: " + instant.getEpochSecond()); - } - - @Test - public void testCosUrlGeneration() { - // 妯℃嫙COS URL鐢熸垚 - String bucket = "ryc-1256886520"; - String region = "ap-chengdu"; - String key = "test/logo.jpg"; - - long currentTime = System.currentTimeMillis() / 1000; // Unix绉� - long expireTime = currentTime + 15 * 60; // 15鍒嗛挓鍚� - - System.out.println("褰撳墠Unix鏃堕棿: " + currentTime); - System.out.println("杩囨湡Unix鏃堕棿: " + expireTime); - - String baseUrl = String.format("https://%s.cos.%s.myqcloud.com/%s", bucket, region, key); - System.out.println("鍩虹URL: " + baseUrl); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/employee/DirectEmployeeServiceTest.java b/backend/src/test/java/com/rongyichuang/employee/DirectEmployeeServiceTest.java deleted file mode 100644 index a847779..0000000 --- a/backend/src/test/java/com/rongyichuang/employee/DirectEmployeeServiceTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.rongyichuang.employee; - -import com.rongyichuang.employee.dto.request.EmployeeInput; -import com.rongyichuang.employee.dto.response.EmployeeResponse; -import com.rongyichuang.employee.service.EmployeeService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -/** - * 鐩存帴娴嬭瘯EmployeeService鐨剆aveEmployee鏂规硶 - */ -@SpringBootTest -@ActiveProfiles("test") -public class DirectEmployeeServiceTest { - - @Autowired - private EmployeeService employeeService; - - @Test - public void testSaveEmployee() { - try { - // 鍒涘缓鍛樺伐杈撳叆 - EmployeeInput input = new EmployeeInput(); - input.setName("娴嬭瘯鍛樺伐Service"); - input.setPhone("13900000003"); - input.setPassword("test123"); - input.setRoleId("EMPLOYEE"); - input.setDescription("鐩存帴娴嬭瘯EmployeeService"); - - System.out.println("寮�濮嬫祴璇旹mployeeService.saveEmployee..."); - System.out.println("杈撳叆鍙傛暟: " + input.getName() + ", " + input.getPhone()); - - // 璋冪敤鏈嶅姟鏂规硶 - EmployeeResponse response = employeeService.saveEmployee(input); - - System.out.println("EmployeeService娴嬭瘯鎴愬姛!"); - System.out.println("鍛樺伐ID: " + response.getId()); - System.out.println("鍛樺伐濮撳悕: " + response.getName()); - System.out.println("鍛樺伐鎵嬫満: " + response.getPhone()); - System.out.println("鍛樺伐瑙掕壊: " + response.getRoleId()); - - } catch (Exception e) { - System.err.println("EmployeeService娴嬭瘯澶辫触: " + e.getMessage()); - e.printStackTrace(); - throw e; - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/DescribeTable.java b/backend/src/test/java/com/rongyichuang/judge/DescribeTable.java deleted file mode 100644 index 011d3d8..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/DescribeTable.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.rongyichuang.judge; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.Statement; - -public class DescribeTable { - public static void main(String[] args) { - String url = "jdbc:mysql://140.143.152.226:3308/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"; - String user = "openai"; - String password = "Xml@uk2025"; - String tableName = "t_media"; - - System.out.println("--- Connecting to database to describe table: " + tableName + " ---"); - - try { - Class.forName("com.mysql.cj.jdbc.Driver"); - try (Connection conn = DriverManager.getConnection(url, user, password); - Statement stmt = conn.createStatement()) { - - System.out.println("Database connection successful."); - - // Using DESCRIBE is simpler - try (ResultSet rs = stmt.executeQuery("DESCRIBE " + tableName)) { - System.out.println("\n--- Structure of table '" + tableName + "' ---"); - System.out.printf("%-20s | %-20s | %-5s | %-5s | %-20s | %s%n", "Field", "Type", "Null", "Key", "Default", "Extra"); - System.out.println("----------------------------------------------------------------------------------------------------"); - while (rs.next()) { - System.out.printf("%-20s | %-20s | %-5s | %-5s | %-20s | %s%n", - rs.getString("Field"), - rs.getString("Type"), - rs.getString("Null"), - rs.getString("Key"), - rs.getString("Default"), - rs.getString("Extra")); - } - System.out.println("----------------------------------------------------------------------------------------------------"); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeAvatarTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeAvatarTest.java deleted file mode 100644 index 91eabd8..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeAvatarTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.rongyichuang.judge; - -import com.rongyichuang.judge.dto.response.JudgeResponse; -import com.rongyichuang.judge.service.JudgeService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@SpringBootTest -@ActiveProfiles("test") -@Transactional -public class JudgeAvatarTest { - - @Autowired - private JudgeService judgeService; - - @Test - public void testJudgeAvatarUrls() { - System.out.println("=== 娴嬭瘯璇勫澶村儚URL鏋勫缓 ==="); - - List<JudgeResponse> judges = judgeService.findAll(); - System.out.println("鎵惧埌 " + judges.size() + " 涓瘎濮�"); - - for (JudgeResponse judge : judges) { - System.out.println("璇勫ID: " + judge.getId() + - ", 濮撳悕: " + judge.getName() + - ", 澶村儚URL: " + judge.getAvatarUrl()); - } - - // 娴嬭瘯鍓�5涓瘎濮旂殑澶村儚URL - judges.stream() - .limit(5) - .forEach(judge -> { - String avatarUrl = judge.getAvatarUrl(); - if (avatarUrl != null) { - System.out.println("璇勫 " + judge.getName() + " 鐨勫ご鍍廢RL: " + avatarUrl); - // 楠岃瘉URL鏄惁涓哄畬鏁碪RL - if (avatarUrl.startsWith("https://")) { - System.out.println("鉁� 澶村儚URL鏍煎紡姝g‘"); - } else { - System.out.println("鉁� 澶村儚URL鏍煎紡鍙兘鏈夐棶棰�: " + avatarUrl); - } - } else { - System.out.println("璇勫 " + judge.getName() + " 娌℃湁澶村儚"); - } - }); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeCorrectFlowTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeCorrectFlowTest.java deleted file mode 100644 index c111400..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeCorrectFlowTest.java +++ /dev/null @@ -1,350 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * 璇勫妯″潡姝g‘娴佺▼娴嬭瘯 - * 鎸夌収姝g‘鐨勪笟鍔℃祦绋嬶細 - * 1. 鑾峰彇鏍囩鍒楄〃 - * 2. 淇濆瓨璇勫淇℃伅锛堝寘鍚玬ajorIds锛� - * 3. 鑾峰彇COS涓婁紶鍑瘉 - * 4. 涓婁紶澶村儚鍒癈OS - * 5. 淇濆瓨濯掍綋璁板綍锛堝叧鑱斿埌璇勫锛� - * 6. 楠岃瘉鏁版嵁瀹屾暣鎬� - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class JudgeCorrectFlowTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private DataSource dataSource; - - private JdbcTemplate jdbcTemplate; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void testCorrectJudgeCreationFlow() throws Exception { - jdbcTemplate = new JdbcTemplate(dataSource); - - System.out.println("=== 寮�濮嬫纭殑璇勫鍒涘缓娴佺▼娴嬭瘯 ==="); - - // 姝ラ1: 鑾峰彇鍙敤鏍囩鍒楄〃 - System.out.println("\n姝ラ1: 鑾峰彇鏍囩鍒楄〃"); - List<Map<String, Object>> availableTags = getAvailableTags(); - assertTrue(availableTags.size() > 0, "搴旇鏈夊彲鐢ㄧ殑鏍囩"); - System.out.println("鉁� 鑾峰彇鍒� " + availableTags.size() + " 涓爣绛�"); - - // 姝ラ2: 淇濆瓨璇勫淇℃伅锛堝寘鍚玬ajorIds锛� - System.out.println("\n姝ラ2: 淇濆瓨璇勫淇℃伅"); - String judgeId = saveJudgeInfo(availableTags); - assertNotNull(judgeId, "璇勫ID涓嶅簲涓虹┖"); - System.out.println("鉁� 璇勫淇濆瓨鎴愬姛锛孖D: " + judgeId); - - // 姝ラ3: 鑾峰彇COS涓婁紶鍑瘉锛堟ā鎷燂級 - System.out.println("\n姝ラ3: 鑾峰彇COS涓婁紶鍑瘉"); - Map<String, Object> uploadCredentials = getUploadCredentials(); - assertNotNull(uploadCredentials, "涓婁紶鍑瘉涓嶅簲涓虹┖"); - System.out.println("鉁� 鑾峰彇涓婁紶鍑瘉鎴愬姛"); - - // 姝ラ4: 妯℃嫙涓婁紶澶村儚鍒癈OS - System.out.println("\n姝ラ4: 涓婁紶澶村儚鍒癈OS"); - String cosPath = simulateUploadToCOS(uploadCredentials); - assertNotNull(cosPath, "COS璺緞涓嶅簲涓虹┖"); - System.out.println("鉁� 澶村儚涓婁紶鍒癈OS鎴愬姛锛岃矾寰�: " + cosPath); - - // 姝ラ5: 淇濆瓨濯掍綋璁板綍锛堝叧鑱斿埌璇勫锛� - System.out.println("\n姝ラ5: 淇濆瓨濯掍綋璁板綍"); - String mediaId = saveMediaRecord(cosPath, judgeId); - assertNotNull(mediaId, "濯掍綋ID涓嶅簲涓虹┖"); - System.out.println("鉁� 濯掍綋璁板綍淇濆瓨鎴愬姛锛孖D: " + mediaId); - - // 姝ラ6: 楠岃瘉鏁版嵁瀹屾暣鎬� - System.out.println("\n姝ラ6: 楠岃瘉鏁版嵁瀹屾暣鎬�"); - verifyDataIntegrity(judgeId, mediaId); - System.out.println("鉁� 鏁版嵁瀹屾暣鎬ч獙璇侀�氳繃"); - - System.out.println("\n=== 姝g‘娴佺▼娴嬭瘯鎴愬姛 ==="); - printTestSummary(judgeId, mediaId); - } - - /** - * 姝ラ1: 鑾峰彇鍙敤鏍囩鍒楄〃 - */ - private List<Map<String, Object>> getAvailableTags() throws Exception { - String query = """ - query { - tagsByCategory(category: "major") { - id - name - code - } - } - """; - - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - // 妫�鏌ユ槸鍚︽湁閿欒 - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("GraphQL鏌ヨ澶辫触: " + responseMap.get("errors")); - } - - Map<String, Object> data = (Map<String, Object>) responseMap.get("data"); - @SuppressWarnings("unchecked") - List<Map<String, Object>> tags = (List<Map<String, Object>>) data.get("tagsByCategory"); - - if (tags == null || tags.isEmpty()) { - // 濡傛灉娌℃湁涓撲笟鏍囩锛岃幏鍙栨墍鏈夋爣绛� - String allTagsQuery = """ - query { - tags { - id - name - code - } - } - """; - - Map<String, String> allTagsRequest = Collections.singletonMap("query", allTagsQuery); - String allTagsResponse = postGraphQL(allTagsRequest); - Map<String, Object> allTagsResponseMap = objectMapper.readValue(allTagsResponse, Map.class); - Map<String, Object> allTagsData = (Map<String, Object>) allTagsResponseMap.get("data"); - - @SuppressWarnings("unchecked") - List<Map<String, Object>> allTags = (List<Map<String, Object>>) allTagsData.get("tags"); - - return allTags != null ? allTags.stream().limit(3).toList() : Collections.emptyList(); - } - - return tags; - } - - /** - * 姝ラ2: 淇濆瓨璇勫淇℃伅锛堝寘鍚玬ajorIds锛� - */ - private String saveJudgeInfo(List<Map<String, Object>> availableTags) throws Exception { - // 閫夋嫨鍓�2涓爣绛句綔涓轰笓涓氭爣绛� - List<String> selectedTagIds = availableTags.stream() - .limit(2) - .map(tag -> tag.get("id").toString()) - .toList(); - - String tagIdsStr = "[" + String.join(", ", selectedTagIds) + "]"; - - // 浣跨敤鏃堕棿鎴崇敓鎴愬敮涓�鐢佃瘽鍙风爜 - String uniquePhone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - - String mutation = String.format(""" - mutation { - saveJudge(input: { - name: "鐜嬩簲" - phone: "%s" - gender: 1 - description: "楂樼骇鎶�鏈笓瀹讹紝涓撴敞浜庝簯璁$畻鍜屽ぇ鏁版嵁棰嗗煙銆�" - majorIds: %s - }) { - id - name - phone - gender - description - specialties { - id - name - code - } - } - } - """, uniquePhone, tagIdsStr); - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - // 妫�鏌ユ槸鍚︽湁閿欒 - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("淇濆瓨璇勫澶辫触: " + responseMap.get("errors")); - } - - @SuppressWarnings("unchecked") - Map<String, Object> judgeData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveJudge"); - - Object idObj = judgeData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - /** - * 姝ラ3: 鑾峰彇COS涓婁紶鍑瘉锛堟ā鎷燂級 - */ - private Map<String, Object> getUploadCredentials() throws Exception { - // 杩欓噷搴旇璋冪敤瀹為檯鐨勮幏鍙栦笂浼犲嚟璇佺殑GraphQL鏌ヨ - // 鐩墠妯℃嫙杩斿洖鍑瘉淇℃伅 - return Map.of( - "secretId", "mock_secret_id", - "secretKey", "mock_secret_key", - "sessionToken", "mock_session_token", - "bucket", "ryc-avatars", - "region", "ap-beijing", - "expiredTime", System.currentTimeMillis() + 3600000 - ); - } - - /** - * 姝ラ4: 妯℃嫙涓婁紶澶村儚鍒癈OS - */ - private String simulateUploadToCOS(Map<String, Object> credentials) { - // 妯℃嫙涓婁紶logo.jpg鍒拌吘璁簯COS - // 瀹為檯搴旂敤涓繖閲屼細浣跨敤鑵捐浜慡DK涓婁紶鏂囦欢 - String timestamp = String.valueOf(System.currentTimeMillis()); - return "avatars/judge_" + timestamp + "_logo.jpg"; - } - - /** - * 姝ラ5: 淇濆瓨濯掍綋璁板綍锛堝叧鑱斿埌璇勫锛� - */ - private String saveMediaRecord(String cosPath, String judgeId) throws Exception { - String mutation = String.format(""" - mutation { - saveMedia(input: { - name: "logo.jpg" - path: "%s" - fileSize: 2048 - fileExt: "jpg" - mediaType: 1 - targetType: 1 - targetId: %s - }) { - id - name - path - targetType - targetId - } - } - """, cosPath, judgeId); - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - // 妫�鏌ユ槸鍚︽湁閿欒 - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("淇濆瓨濯掍綋璁板綍澶辫触: " + responseMap.get("errors")); - } - - @SuppressWarnings("unchecked") - Map<String, Object> mediaData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveMedia"); - - Object idObj = mediaData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - /** - * 姝ラ6: 楠岃瘉鏁版嵁瀹屾暣鎬� - */ - private void verifyDataIntegrity(String judgeId, String mediaId) { - // 楠岃瘉璇勫鍩烘湰淇℃伅 - String judgeSql = "SELECT * FROM t_judge WHERE id = ? AND state = 1"; - Map<String, Object> judge = jdbcTemplate.queryForMap(judgeSql, Long.parseLong(judgeId)); - - assertEquals("鐜嬩簲", judge.get("name")); - assertTrue(((String) judge.get("phone")).startsWith("139")); // 楠岃瘉鐢佃瘽鍙风爜鏍煎紡 - assertEquals(1, judge.get("gender")); // 鐢锋�� - assertTrue(((String) judge.get("description")).contains("楂樼骇鎶�鏈笓瀹�")); - - // 楠岃瘉濯掍綋璁板綍 - String mediaSql = "SELECT * FROM t_media WHERE id = ? AND state = 1"; - Map<String, Object> media = jdbcTemplate.queryForMap(mediaSql, Long.parseLong(mediaId)); - - assertEquals("logo.jpg", media.get("name")); - assertEquals(1, media.get("target_type")); // 璇勫澶村儚 - assertEquals(Long.parseLong(judgeId), ((Number) media.get("target_id")).longValue()); - assertTrue(((String) media.get("path")).contains("avatars/")); - assertTrue(((String) media.get("path")).contains("logo.jpg")); - - // 楠岃瘉鏍囩鍏宠仈 - String tagSql = "SELECT COUNT(*) FROM t_judge_tag WHERE judge_id = ? AND state = 1"; - Integer tagCount = jdbcTemplate.queryForObject(tagSql, Integer.class, Long.parseLong(judgeId)); - assertTrue(tagCount >= 2, "搴旇鑷冲皯鏈�2涓爣绛惧叧鑱�"); - - System.out.println(" 鉁� 璇勫鍩烘湰淇℃伅姝g‘"); - System.out.println(" 鉁� 澶村儚濯掍綋璁板綍姝g‘锛屽叧鑱斿埌璇勫ID: " + judgeId); - System.out.println(" 鉁� 鏍囩鍏宠仈璁板綍姝g‘ (" + tagCount + "涓�)"); - } - - /** - * 鎵撳嵃娴嬭瘯鎬荤粨 - */ - private void printTestSummary(String judgeId, String mediaId) { - System.out.println("\n=== 娴嬭瘯鎬荤粨 ==="); - System.out.println("璇勫ID: " + judgeId); - System.out.println("濯掍綋ID: " + mediaId); - - // 鏌ヨ鏈�缁堟暟鎹� - String judgeSql = "SELECT * FROM t_judge WHERE id = ? AND state = 1"; - Map<String, Object> judge = jdbcTemplate.queryForMap(judgeSql, Long.parseLong(judgeId)); - - String mediaSql = "SELECT * FROM t_media WHERE id = ? AND state = 1"; - Map<String, Object> media = jdbcTemplate.queryForMap(mediaSql, Long.parseLong(mediaId)); - - System.out.println("璇勫濮撳悕: " + judge.get("name")); - System.out.println("鑱旂郴鐢佃瘽: " + judge.get("phone")); - System.out.println("鎬у埆: " + (Integer.valueOf(1).equals(judge.get("gender")) ? "鐢�" : "濂�")); - System.out.println("澶村儚璺緞: " + media.get("path")); - System.out.println("濯掍綋鍏宠仈: target_type=" + media.get("target_type") + ", target_id=" + media.get("target_id")); - - System.out.println("\n鉁� 姝g‘鐨勪笟鍔℃祦绋嬫祴璇曟垚鍔燂紒"); - System.out.println("鉁� 1. 鍏堜繚瀛樿瘎濮斾俊鎭� 鉁�"); - System.out.println("鉁� 2. 鍐嶄笂浼犲ご鍍忓埌COS 鉁�"); - System.out.println("鉁� 3. 鏈�鍚庝繚瀛樺獟浣撹褰曞苟鍏宠仈璇勫 鉁�"); - } - - /** - * 鍙戦�丟raphQL璇锋眰 - */ - private String postGraphQL(Map<String, String> requestBody) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers); - String url = "http://localhost:" + port + "/graphql"; - - var response = restTemplate.postForEntity(url, entity, String.class); - - if (response.getStatusCode().is2xxSuccessful() && response.hasBody()) { - return response.getBody(); - } else { - throw new RuntimeException("GraphQL request failed with status: " + - response.getStatusCode() + " and body: " + response.getBody()); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeCreationE2ETest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeCreationE2ETest.java deleted file mode 100644 index 651b622..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeCreationE2ETest.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.rongyichuang.common.entity.Media; -import com.rongyichuang.judge.entity.Judge; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.util.StreamUtils; - -import javax.sql.DataSource; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class JudgeCreationE2ETest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private DataSource dataSource; - - private JdbcTemplate jdbcTemplate; - - @BeforeEach - void setUp() { - jdbcTemplate = new JdbcTemplate(dataSource); - // Clean up database before each test - jdbcTemplate.execute("DELETE FROM t_judge_tag"); - jdbcTemplate.execute("DELETE FROM t_judge"); - jdbcTemplate.execute("DELETE FROM t_media"); - } - - @Test - void testCreateJudgeEndToEnd() throws Exception { - // 1. Save Media Info (Simulating image upload) - String mediaQuery = readGraphQLQuery("graphql/test-save-media.graphql"); - String mediaFileName = "logo.png"; - String mediaFilePath = "test/logo.png"; - String formattedMediaQuery = String.format(mediaQuery, mediaFileName, mediaFilePath, 12345L, "image/png", "cos", "test-bucket", "ap-guangzhou"); - - Map<String, String> mediaRequest = Collections.singletonMap("query", formattedMediaQuery); - String mediaResponse = postGraphQL(mediaRequest); - - ObjectMapper objectMapper = new ObjectMapper(); - Map<String, Object> mediaResponseMap = objectMapper.readValue(mediaResponse, Map.class); - String mediaId = ((Map<String, String>)((Map<String, Object>) mediaResponseMap.get("data")).get("saveMedia")).get("id"); - assertNotNull(mediaId, "Media ID should not be null"); - - // 2. Verify Media in DB with JDBC - Map<String, Object> mediaRecord = jdbcTemplate.queryForMap("SELECT * FROM t_media WHERE id = ?", mediaId); - assertEquals(mediaFileName, mediaRecord.get("file_name")); - assertEquals(mediaFilePath, mediaRecord.get("file_path")); - - // 3. Save Judge Info - String judgeQuery = readGraphQLQuery("graphql/test-save-judge.graphql"); - String formattedJudgeQuery = String.format(judgeQuery, "娴嬭瘯璇勫", "13800138000", mediaId); - Map<String, String> judgeRequest = Collections.singletonMap("query", formattedJudgeQuery); - String judgeResponse = postGraphQL(judgeRequest); - Map<String, Object> judgeResponseMap = objectMapper.readValue(judgeResponse, Map.class); - String judgeId = ((Map<String, String>)((Map<String, Object>) judgeResponseMap.get("data")).get("saveJudge")).get("id"); - assertNotNull(judgeId, "Judge ID should not be null"); - - // 4. Verify Judge in DB with JDBC - Map<String, Object> judgeRecord = jdbcTemplate.queryForMap("SELECT * FROM t_judge WHERE id = ?", judgeId); - assertEquals("娴嬭瘯璇勫", judgeRecord.get("name")); - assertEquals("13800138000", judgeRecord.get("phone")); - assertEquals(Long.valueOf(mediaId), judgeRecord.get("avatar_media_id")); - - System.out.println("--- E2E Test Passed ---"); - System.out.println("Judge created with ID: " + judgeId); - System.out.println("Media created with ID: " + mediaId); - System.out.println("--- Verification with JDBC successful ---"); - } - - private String postGraphQL(Map<String, String> requestBody) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); - HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers); - String url = "http://localhost:" + port + "/graphql"; - org.springframework.http.ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); - - if (response.getStatusCode() != org.springframework.http.HttpStatus.OK || !response.hasBody()) { - throw new RuntimeException("GraphQL request failed with status: " + response.getStatusCode() + " and body: " + response.getBody()); - } - - return response.getBody(); - } - - private String readGraphQLQuery(String path) throws Exception { - ClassPathResource resource = new ClassPathResource(path); - return StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeDataFinalVerificationTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeDataFinalVerificationTest.java deleted file mode 100644 index b2d4342..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeDataFinalVerificationTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.rongyichuang.judge; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class JudgeDataFinalVerificationTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void verifyCompleteJudgeFlow() { - System.out.println("=== 鏈�缁堟暟鎹獙璇� ==="); - - // 鑾峰彇鏈�鏂拌瘎濮擨D - Integer latestJudgeId = jdbcTemplate.queryForObject( - "SELECT MAX(id) FROM t_judge", Integer.class); - System.out.println("鏈�鏂拌瘎濮擨D: " + latestJudgeId); - - // 1. 楠岃瘉璇勫鍩烘湰淇℃伅 - Map<String, Object> judge = jdbcTemplate.queryForMap( - "SELECT * FROM t_judge WHERE id = ?", latestJudgeId); - System.out.println("鉁� 璇勫淇℃伅: " + judge.get("name") + " - " + judge.get("phone")); - - // 2. 楠岃瘉璇勫鏍囩鍏宠仈 (搴旇鏈�2涓�) - Integer tagCount = jdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM t_judge_tag WHERE judge_id = ?", - Integer.class, latestJudgeId); - System.out.println("鉁� 鏍囩鍏宠仈鏁�: " + tagCount + " (鏈熸湜: 2)"); - - // 3. 楠岃瘉濯掍綋璁板綍 (target_type=1琛ㄧずJUDGE) - Integer mediaCount = jdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM t_media WHERE target_id = ? AND target_type = 1", - Integer.class, latestJudgeId); - System.out.println("鉁� 濯掍綋璁板綍鏁�: " + mediaCount + " (鏈熸湜: 1)"); - - // 4. 鑾峰彇濯掍綋璇︾粏淇℃伅 - if (mediaCount > 0) { - Map<String, Object> media = jdbcTemplate.queryForMap( - "SELECT * FROM t_media WHERE target_id = ? AND target_type = 1", - latestJudgeId); - System.out.println("鉁� 濯掍綋璺緞: " + media.get("path")); - System.out.println("鉁� 鏂囦欢澶у皬: " + media.get("file_size") + " bytes"); - } - - // 5. 楠岃瘉瀹屾暣鎬� - boolean isComplete = (tagCount == 2) && (mediaCount == 1); - System.out.println("\n=== 楠岃瘉缁撴灉 ==="); - if (isComplete) { - System.out.println("馃帀 璇勫鍒涘缓娴佺▼瀹屽叏鎴愬姛锛�"); - System.out.println("鉁� 璇勫淇℃伅宸蹭繚瀛樺埌 t_judge 琛�"); - System.out.println("鉁� 鏍囩鍏宠仈宸蹭繚瀛樺埌 t_judge_tag 琛�"); - System.out.println("鉁� 澶村儚宸蹭笂浼犲埌鑵捐浜慍OS"); - System.out.println("鉁� 濯掍綋璁板綍宸蹭繚瀛樺埌 t_media 琛�"); - System.out.println("鉁� 鎵�鏈夋暟鎹叧鑱旀纭�"); - } else { - System.out.println("鉂� 鏁版嵁楠岃瘉澶辫触"); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeDataVerificationTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeDataVerificationTest.java deleted file mode 100644 index 0e57ee2..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeDataVerificationTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.rongyichuang.judge; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class JudgeDataVerificationTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void verifyJudgeData() { - System.out.println("=== 楠岃瘉璇勫鏁版嵁 ==="); - - // 1. 妫�鏌ユ渶鏂扮殑璇勫璁板綍 - System.out.println("\n1. 鏈�鏂扮殑璇勫璁板綍:"); - List<Map<String, Object>> judges = jdbcTemplate.queryForList( - "SELECT * FROM t_judge ORDER BY id DESC LIMIT 3" - ); - judges.forEach(judge -> { - System.out.println("璇勫ID: " + judge.get("id") + - ", 濮撳悕: " + judge.get("name") + - ", 鐢佃瘽: " + judge.get("phone")); - }); - - // 2. 妫�鏌ユ渶鏂扮殑璇勫鏍囩鍏宠仈 - System.out.println("\n2. 鏈�鏂扮殑璇勫鏍囩鍏宠仈:"); - List<Map<String, Object>> judgeTags = jdbcTemplate.queryForList( - "SELECT jt.*, j.name as judge_name, t.name as tag_name " + - "FROM t_judge_tag jt " + - "JOIN t_judge j ON jt.judge_id = j.id " + - "JOIN t_tag t ON jt.tag_id = t.id " + - "ORDER BY jt.judge_id DESC LIMIT 10" - ); - judgeTags.forEach(jt -> { - System.out.println("璇勫: " + jt.get("judge_name") + - " -> 鏍囩: " + jt.get("tag_name")); - }); - - // 3. 妫�鏌ユ渶鏂扮殑濯掍綋璁板綍 - System.out.println("\n3. 鏈�鏂扮殑濯掍綋璁板綍:"); - List<Map<String, Object>> medias = jdbcTemplate.queryForList( - "SELECT * FROM t_media ORDER BY id DESC LIMIT 3" - ); - medias.forEach(media -> { - System.out.println("濯掍綋ID: " + media.get("id") + - ", 璺緞: " + media.get("path") + - ", 鐩爣绫诲瀷: " + media.get("target_type") + - ", 鐩爣ID: " + media.get("target_id")); - }); - - // 4. 妫�鏌ヨ瘎濮斿拰濯掍綋鐨勫叧鑱� - System.out.println("\n4. 璇勫鍜屽獟浣撶殑鍏宠仈:"); - List<Map<String, Object>> judgeMedias = jdbcTemplate.queryForList( - "SELECT j.id as judge_id, j.name as judge_name, " + - " m.id as media_id, m.path as media_path " + - "FROM t_judge j " + - "LEFT JOIN t_media m ON j.id = m.target_id AND m.target_type = 'JUDGE' " + - "WHERE j.id IN (SELECT id FROM t_judge ORDER BY id DESC LIMIT 3)" - ); - judgeMedias.forEach(jm -> { - System.out.println("璇勫: " + jm.get("judge_name") + - " (ID: " + jm.get("judge_id") + ")" + - " -> 濯掍綋璺緞: " + jm.get("media_path")); - }); - - System.out.println("\n=== 鏁版嵁楠岃瘉瀹屾垚 ==="); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeE2ECompleteTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeE2ECompleteTest.java deleted file mode 100644 index 4d0d24b..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeE2ECompleteTest.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.*; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") -public class JudgeE2ECompleteTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Autowired - private ObjectMapper objectMapper; - - private String getGraphQLUrl() { - return "http://localhost:" + port + "/graphql"; - } - - @Test - public void testCompleteJudgeCreationFlow() throws Exception { - System.out.println("=== 寮�濮嬪畬鏁寸殑璇勫鍒涘缓娴佺▼娴嬭瘯 ==="); - - // 1. 棣栧厛涓婁紶澶村儚鍥剧墖锛堟ā鎷熷墠绔笂浼狅級 - System.out.println("姝ラ1: 涓婁紶澶村儚鍥剧墖"); - Long mediaId = uploadAvatarImage(); - assertNotNull(mediaId, "澶村儚涓婁紶搴旇鎴愬姛"); - System.out.println("澶村儚涓婁紶鎴愬姛锛孧edia ID: " + mediaId); - - // 2. 鍒涘缓璇勫淇℃伅 - System.out.println("姝ラ2: 鍒涘缓璇勫淇℃伅"); - Long judgeId = createJudge(mediaId); - assertNotNull(judgeId, "璇勫鍒涘缓搴旇鎴愬姛"); - System.out.println("璇勫鍒涘缓鎴愬姛锛孞udge ID: " + judgeId); - - // 3. 楠岃瘉鏁版嵁搴撲腑鐨勬暟鎹� - System.out.println("姝ラ3: 楠岃瘉鏁版嵁搴撴暟鎹�"); - verifyDatabaseData(mediaId, judgeId); - - System.out.println("=== 瀹屾暣娴佺▼娴嬭瘯鎴愬姛 ==="); - } - - private Long uploadAvatarImage() throws Exception { - // 妫�鏌I鐩綍涓嬬殑logo鍥剧墖 - String[] possiblePaths = { - "../UI/logo.jpg", - "UI/logo.jpg", - "../../UI/logo.jpg" - }; - - String logoPath = null; - for (String path : possiblePaths) { - File file = new File(path); - if (file.exists()) { - logoPath = path; - break; - } - } - - assertNotNull(logoPath, "搴旇鎵惧埌logo鍥剧墖鏂囦欢"); - System.out.println("鎵惧埌logo鍥剧墖: " + logoPath); - - // 妯℃嫙鏂囦欢涓婁紶鍒癈OS鍚庣殑璺緞 - String cosPath = "avatars/judge_avatar_" + System.currentTimeMillis() + ".jpg"; - - // 璋冪敤GraphQL淇濆瓨濯掍綋淇℃伅 - String mutation = """ - mutation SaveMedia($fileName: String!, $filePath: String!, $fileSize: Long!, - $fileType: String!, $storageType: String!, $bucketName: String!, - $region: String!, $targetType: Int!, $targetId: Long!) { - saveMedia(fileName: $fileName, filePath: $filePath, fileSize: $fileSize, - fileType: $fileType, storageType: $storageType, bucketName: $bucketName, - region: $region, targetType: $targetType, targetId: $targetId) { - id - name - path - targetType - targetId - } - } - """; - - Map<String, Object> variables = new HashMap<>(); - variables.put("fileName", "judge_avatar.jpg"); - variables.put("filePath", cosPath); - variables.put("fileSize", 1024L); - variables.put("fileType", "image/jpeg"); - variables.put("storageType", "COS"); - variables.put("bucketName", "ryc-1256886520"); - variables.put("region", "ap-chengdu"); - variables.put("targetType", 1); // 1琛ㄧず璇勫澶村儚 - variables.put("targetId", 0L); // 涓存椂ID锛屽悗缁細鏇存柊 - - JsonNode response = executeGraphQL(mutation, variables); - JsonNode mediaData = response.path("data").path("saveMedia"); - - return mediaData.path("id").asLong(); - } - - private Long createJudge(Long avatarMediaId) throws Exception { - String mutation = """ - mutation SaveJudge($input: JudgeInput!) { - saveJudge(input: $input) { - id - name - title - company - introduction - avatarUrl - tags { - id - name - } - } - } - """; - - Map<String, Object> judgeInput = new HashMap<>(); - judgeInput.put("name", "寮犱笁"); - judgeInput.put("title", "楂樼骇鎶�鏈笓瀹�"); - judgeInput.put("company", "闃块噷宸村反"); - judgeInput.put("introduction", "鎷ユ湁10骞翠互涓婄殑鎶�鏈紑鍙戠粡楠岋紝涓撴敞浜庝簯璁$畻鍜屽ぇ鏁版嵁棰嗗煙銆�"); - judgeInput.put("avatarUrl", "https://ryc-1256886520.cos.ap-chengdu.myqcloud.com/avatars/judge_avatar.jpg"); - judgeInput.put("tagNames", List.of("浜戣绠�", "澶ф暟鎹�", "鏋舵瀯璁捐")); - - Map<String, Object> variables = new HashMap<>(); - variables.put("input", judgeInput); - - JsonNode response = executeGraphQL(mutation, variables); - JsonNode judgeData = response.path("data").path("saveJudge"); - - Long judgeId = judgeData.path("id").asLong(); - - // 鏇存柊濯掍綋璁板綍鐨則argetId - updateMediaTargetId(avatarMediaId, judgeId); - - return judgeId; - } - - private void updateMediaTargetId(Long mediaId, Long judgeId) { - String sql = "UPDATE t_media SET target_id = ? WHERE id = ?"; - int updated = jdbcTemplate.update(sql, judgeId, mediaId); - assertEquals(1, updated, "搴旇鏇存柊涓�鏉″獟浣撹褰�"); - System.out.println("鏇存柊濯掍綋璁板綍鐨則arget_id: " + judgeId); - } - - private void verifyDatabaseData(Long mediaId, Long judgeId) { - System.out.println("=== 楠岃瘉鏁版嵁搴撴暟鎹� ==="); - - // 楠岃瘉t_media琛ㄦ暟鎹� - System.out.println("楠岃瘉t_media琛ㄦ暟鎹�..."); - String mediaSql = "SELECT id, name, path, target_type, target_id FROM t_media WHERE id = ?"; - Map<String, Object> mediaRecord = jdbcTemplate.queryForMap(mediaSql, mediaId); - - assertNotNull(mediaRecord, "搴旇鎵惧埌濯掍綋璁板綍"); - assertEquals("judge_avatar.jpg", mediaRecord.get("name"), "濯掍綋鏂囦欢鍚嶅簲璇ユ纭�"); - assertTrue(mediaRecord.get("path").toString().contains("avatars/"), "濯掍綋璺緞搴旇鍖呭惈avatars鐩綍"); - assertEquals(1, mediaRecord.get("target_type"), "target_type搴旇鏄�1锛堣瘎濮斿ご鍍忥級"); - assertEquals(judgeId.longValue(), ((Number)mediaRecord.get("target_id")).longValue(), "target_id搴旇鏄瘎濮擨D"); - - System.out.println("鉁� t_media琛ㄦ暟鎹獙璇侀�氳繃"); - System.out.println(" - 鏂囦欢鍚�: " + mediaRecord.get("name")); - System.out.println(" - 璺緞: " + mediaRecord.get("path")); - System.out.println(" - 鐩爣绫诲瀷: " + mediaRecord.get("target_type")); - System.out.println(" - 鐩爣ID: " + mediaRecord.get("target_id")); - - // 楠岃瘉t_judge琛ㄦ暟鎹� - System.out.println("楠岃瘉t_judge琛ㄦ暟鎹�..."); - String judgeSql = "SELECT id, name, title, company, introduction, avatar_url FROM t_judge WHERE id = ?"; - Map<String, Object> judgeRecord = jdbcTemplate.queryForMap(judgeSql, judgeId); - - assertNotNull(judgeRecord, "搴旇鎵惧埌璇勫璁板綍"); - assertEquals("寮犱笁", judgeRecord.get("name"), "璇勫濮撳悕搴旇姝g‘"); - assertEquals("楂樼骇鎶�鏈笓瀹�", judgeRecord.get("title"), "璇勫鑱屼綅搴旇姝g‘"); - assertEquals("闃块噷宸村反", judgeRecord.get("company"), "璇勫鍏徃搴旇姝g‘"); - assertTrue(judgeRecord.get("introduction").toString().contains("10骞翠互涓�"), "璇勫浠嬬粛搴旇姝g‘"); - assertTrue(judgeRecord.get("avatar_url").toString().contains("cos.ap-chengdu"), "澶村儚URL搴旇姝g‘"); - - System.out.println("鉁� t_judge琛ㄦ暟鎹獙璇侀�氳繃"); - System.out.println(" - 濮撳悕: " + judgeRecord.get("name")); - System.out.println(" - 鑱屼綅: " + judgeRecord.get("title")); - System.out.println(" - 鍏徃: " + judgeRecord.get("company")); - System.out.println(" - 澶村儚URL: " + judgeRecord.get("avatar_url")); - - // 楠岃瘉t_judge_tag琛ㄦ暟鎹� - System.out.println("楠岃瘉t_judge_tag琛ㄦ暟鎹�..."); - String tagSql = """ - SELECT jt.judge_id, t.name as tag_name - FROM t_judge_tag jt - JOIN t_tag t ON jt.tag_id = t.id - WHERE jt.judge_id = ? - """; - List<Map<String, Object>> tagRecords = jdbcTemplate.queryForList(tagSql, judgeId); - - assertFalse(tagRecords.isEmpty(), "搴旇鎵惧埌璇勫鏍囩璁板綍"); - assertEquals(3, tagRecords.size(), "搴旇鏈�3涓爣绛�"); - - System.out.println("鉁� t_judge_tag琛ㄦ暟鎹獙璇侀�氳繃"); - for (Map<String, Object> tagRecord : tagRecords) { - System.out.println(" - 鏍囩: " + tagRecord.get("tag_name")); - } - - System.out.println("=== 鎵�鏈夋暟鎹簱鏁版嵁楠岃瘉閫氳繃 ==="); - } - - private JsonNode executeGraphQL(String query, Map<String, Object> variables) throws Exception { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("query", query); - if (variables != null) { - requestBody.put("variables", variables); - } - - HttpEntity<String> request = new HttpEntity<>( - objectMapper.writeValueAsString(requestBody), - headers - ); - - ResponseEntity<String> response = restTemplate.postForEntity( - getGraphQLUrl(), - request, - String.class - ); - - assertEquals(HttpStatus.OK, response.getStatusCode(), "GraphQL璇锋眰搴旇鎴愬姛"); - - JsonNode jsonResponse = objectMapper.readTree(response.getBody()); - - // 妫�鏌ユ槸鍚︽湁閿欒 - if (jsonResponse.has("errors")) { - System.err.println("GraphQL閿欒: " + jsonResponse.get("errors")); - fail("GraphQL璇锋眰杩斿洖閿欒: " + jsonResponse.get("errors")); - } - - return jsonResponse; - } - - @Test - public void testGraphQLEndpoint() throws Exception { - System.out.println("=== 娴嬭瘯GraphQL绔偣鏄惁姝e父宸ヤ綔 ==="); - - String query = """ - query { - judges { - id - name - title - company - } - } - """; - - JsonNode response = executeGraphQL(query, null); - assertNotNull(response.path("data"), "搴旇鏈塪ata瀛楁"); - - System.out.println("鉁� GraphQL绔偣宸ヤ綔姝e父"); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeE2EIntegrationTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeE2EIntegrationTest.java deleted file mode 100644 index d3eae7f..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeE2EIntegrationTest.java +++ /dev/null @@ -1,334 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.sql.DataSource; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * 璇勫妯″潡绔埌绔泦鎴愭祴璇� - * 妯℃嫙瀹屾暣鐨勫墠绔埌鍚庣鏁版嵁娴佺▼锛� - * 1. 鍓嶇鑾峰彇鏍囩鍒楄〃 - * 2. 鍓嶇鎻愪氦璇勫鏁版嵁锛堝寘鍚玪ogo.jpg澶村儚锛� - * 3. 鍚庣淇濆瓨鏁版嵁鍒版暟鎹簱 - * 4. 楠岃瘉鏁版嵁瀹屾暣鎬� - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class JudgeE2EIntegrationTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private DataSource dataSource; - - private JdbcTemplate jdbcTemplate; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void testCompleteJudgeCreationFlow() throws Exception { - jdbcTemplate = new JdbcTemplate(dataSource); - - System.out.println("=== 寮�濮嬪畬鏁寸殑璇勫鍒涘缓娴佺▼娴嬭瘯 ==="); - - // 姝ラ1: 鍓嶇鑾峰彇鍙敤鏍囩鍒楄〃 - System.out.println("\n姝ラ1: 鑾峰彇鏍囩鍒楄〃"); - List<Map<String, Object>> availableTags = getAvailableTags(); - assertTrue(availableTags.size() > 0, "搴旇鏈夊彲鐢ㄧ殑鏍囩"); - System.out.println("鉁� 鑾峰彇鍒� " + availableTags.size() + " 涓爣绛�"); - - // 姝ラ2: 妯℃嫙鍓嶇涓婁紶logo.jpg骞惰幏鍙栧獟浣揑D - System.out.println("\n姝ラ2: 涓婁紶澶村儚鍥剧墖"); - String mediaId = uploadAvatarImage(); - assertNotNull(mediaId, "濯掍綋ID涓嶅簲涓虹┖"); - System.out.println("鉁� 澶村儚涓婁紶鎴愬姛锛屽獟浣揑D: " + mediaId); - - // 姝ラ3: 鍓嶇鎻愪氦璇勫鏁版嵁 - System.out.println("\n姝ラ3: 鍒涘缓璇勫"); - String judgeId = createJudgeWithAvatar(mediaId, availableTags); - assertNotNull(judgeId, "璇勫ID涓嶅簲涓虹┖"); - System.out.println("鉁� 璇勫鍒涘缓鎴愬姛锛孖D: " + judgeId); - - // 姝ラ4: 楠岃瘉鏁版嵁搴撲腑鐨勬暟鎹畬鏁存�� - System.out.println("\n姝ラ4: 楠岃瘉鏁版嵁瀹屾暣鎬�"); - verifyJudgeDataIntegrity(judgeId, mediaId); - System.out.println("鉁� 鏁版嵁瀹屾暣鎬ч獙璇侀�氳繃"); - - // 姝ラ5: 鍓嶇鏌ヨ璇勫璇︽儏 - System.out.println("\n姝ラ5: 鏌ヨ璇勫璇︽儏"); - Map<String, Object> judgeDetails = getJudgeDetails(judgeId); - assertNotNull(judgeDetails, "璇勫璇︽儏涓嶅簲涓虹┖"); - System.out.println("鉁� 璇勫璇︽儏鏌ヨ鎴愬姛"); - - System.out.println("\n=== 瀹屾暣娴佺▼娴嬭瘯鎴愬姛 ==="); - printTestSummary(judgeId, mediaId, judgeDetails); - } - - /** - * 姝ラ1: 鑾峰彇鍙敤鏍囩鍒楄〃锛堟ā鎷熷墠绔姞杞芥爣绛撅級 - */ - private List<Map<String, Object>> getAvailableTags() throws Exception { - String query = """ - query { - tagsByCategory(category: "major") { - id - name - code - } - } - """; - - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - // 妫�鏌ユ槸鍚︽湁閿欒 - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("GraphQL鏌ヨ澶辫触: " + responseMap.get("errors")); - } - - Map<String, Object> data = (Map<String, Object>) responseMap.get("data"); - if (data == null) { - throw new RuntimeException("GraphQL鍝嶅簲涓病鏈塪ata瀛楁"); - } - - @SuppressWarnings("unchecked") - List<Map<String, Object>> tags = (List<Map<String, Object>>) data.get("tagsByCategory"); - - if (tags == null) { - // 濡傛灉娌℃湁涓撲笟鏍囩锛屽皾璇曡幏鍙栨墍鏈夋爣绛� - String allTagsQuery = """ - query { - tags { - id - name - code - } - } - """; - - Map<String, String> allTagsRequest = Collections.singletonMap("query", allTagsQuery); - String allTagsResponse = postGraphQL(allTagsRequest); - Map<String, Object> allTagsResponseMap = objectMapper.readValue(allTagsResponse, Map.class); - Map<String, Object> allTagsData = (Map<String, Object>) allTagsResponseMap.get("data"); - - @SuppressWarnings("unchecked") - List<Map<String, Object>> allTags = (List<Map<String, Object>>) allTagsData.get("tags"); - - // 杩斿洖鍓嶅嚑涓爣绛句綔涓烘祴璇曟暟鎹� - return allTags != null ? allTags.stream().limit(2).toList() : Collections.emptyList(); - } - - return tags; - } - - /** - * 姝ラ2: 涓婁紶澶村儚鍥剧墖锛堟ā鎷熷墠绔笂浼爈ogo.jpg锛� - */ - private String uploadAvatarImage() throws Exception { - String mutation = """ - mutation { - saveMedia( - name: "logo.jpg" - path: "avatars/logo_test.jpg" - fileSize: 2048 - fileExt: "jpg" - mediaType: 1 - targetType: 1 - targetId: 0 - ) { - id - name - path - } - } - """; - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - @SuppressWarnings("unchecked") - Map<String, Object> mediaData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveMedia"); - - Object idObj = mediaData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - /** - * 姝ラ3: 鍒涘缓璇勫锛堟ā鎷熷墠绔彁浜よ〃鍗曪級 - */ - private String createJudgeWithAvatar(String mediaId, List<Map<String, Object>> availableTags) throws Exception { - // 閫夋嫨鍓嶄袱涓笓涓氭爣绛� - List<String> selectedTagIds = availableTags.stream() - .limit(2) - .map(tag -> tag.get("id").toString()) - .toList(); - - String tagIdsStr = "[" + String.join(", ", selectedTagIds) + "]"; - - String mutation = String.format(""" - mutation { - saveJudge(input: { - name: "鏉庡洓" - phone: "13700137000" - gender: 0 - description: "璧勬繁鎶�鏈笓瀹讹紝鎷ユ湁涓板瘜鐨勯」鐩粡楠屽拰鍥㈤槦绠$悊鑳藉姏銆�" - specialtyIds: %s - avatarMediaId: %s - }) { - id - name - phone - gender - description - avatarUrl - specialties { - id - name - code - } - } - } - """, tagIdsStr, mediaId); - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - @SuppressWarnings("unchecked") - Map<String, Object> judgeData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveJudge"); - - Object idObj = judgeData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - /** - * 姝ラ4: 楠岃瘉鏁版嵁搴撴暟鎹畬鏁存�� - */ - private void verifyJudgeDataIntegrity(String judgeId, String mediaId) { - // 楠岃瘉璇勫鍩烘湰淇℃伅 - String judgeSql = "SELECT * FROM t_judge WHERE id = ? AND state = 1"; - Map<String, Object> judge = jdbcTemplate.queryForMap(judgeSql, Long.parseLong(judgeId)); - - assertEquals("鏉庡洓", judge.get("name")); - assertEquals("13700137000", judge.get("phone")); - assertEquals(0, judge.get("gender")); // 濂虫�� - assertTrue(((String) judge.get("description")).contains("璧勬繁鎶�鏈笓瀹�")); - - // 楠岃瘉濯掍綋璁板綍 - String mediaSql = "SELECT * FROM t_media WHERE id = ? AND state = 1"; - Map<String, Object> media = jdbcTemplate.queryForMap(mediaSql, Long.parseLong(mediaId)); - - assertEquals("logo.jpg", media.get("name")); - assertEquals(1, media.get("target_type")); // 璇勫澶村儚 - assertEquals(Long.parseLong(judgeId), ((Number) media.get("target_id")).longValue()); - - // 楠岃瘉鏍囩鍏宠仈 - String tagSql = "SELECT COUNT(*) FROM t_judge_tag WHERE judge_id = ? AND state = 1"; - Integer tagCount = jdbcTemplate.queryForObject(tagSql, Integer.class, Long.parseLong(judgeId)); - assertTrue(tagCount >= 2, "搴旇鑷冲皯鏈�2涓爣绛惧叧鑱�"); - - System.out.println(" 鉁� 璇勫鍩烘湰淇℃伅姝g‘"); - System.out.println(" 鉁� 澶村儚濯掍綋璁板綍姝g‘"); - System.out.println(" 鉁� 鏍囩鍏宠仈璁板綍姝g‘ (" + tagCount + "涓�)"); - } - - /** - * 姝ラ5: 鏌ヨ璇勫璇︽儏锛堟ā鎷熷墠绔煡鐪嬭鎯咃級 - */ - private Map<String, Object> getJudgeDetails(String judgeId) throws Exception { - String query = String.format(""" - query { - judge(id: %s) { - id - name - phone - gender - description - avatarUrl - specialties { - id - name - code - } - } - } - """, judgeId); - - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - @SuppressWarnings("unchecked") - Map<String, Object> judgeData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("judge"); - - return judgeData; - } - - /** - * 鎵撳嵃娴嬭瘯鎬荤粨 - */ - private void printTestSummary(String judgeId, String mediaId, Map<String, Object> judgeDetails) { - System.out.println("\n=== 娴嬭瘯鎬荤粨 ==="); - System.out.println("璇勫ID: " + judgeId); - System.out.println("濯掍綋ID: " + mediaId); - System.out.println("璇勫濮撳悕: " + judgeDetails.get("name")); - System.out.println("鑱旂郴鐢佃瘽: " + judgeDetails.get("phone")); - System.out.println("鎬у埆: " + (Integer.valueOf(0).equals(judgeDetails.get("gender")) ? "濂�" : "鐢�")); - System.out.println("澶村儚URL: " + judgeDetails.get("avatarUrl")); - - @SuppressWarnings("unchecked") - List<Map<String, Object>> specialties = (List<Map<String, Object>>) judgeDetails.get("specialties"); - System.out.println("涓撲笟鏍囩鏁伴噺: " + (specialties != null ? specialties.size() : 0)); - if (specialties != null) { - for (Map<String, Object> specialty : specialties) { - System.out.println(" - " + specialty.get("name") + " (" + specialty.get("category") + ")"); - } - } - - System.out.println("\n鉁� 鎵�鏈夋祴璇曟楠ゅ潎鎴愬姛瀹屾垚锛�"); - System.out.println("鉁� 鍓嶇鍒板悗绔殑瀹屾暣鏁版嵁娴佺▼楠岃瘉閫氳繃锛�"); - System.out.println("鉁� 鏁版嵁搴撴暟鎹畬鏁存�ч獙璇侀�氳繃锛�"); - } - - /** - * 鍙戦�丟raphQL璇锋眰 - */ - private String postGraphQL(Map<String, String> requestBody) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers); - String url = "http://localhost:" + port + "/graphql"; - - var response = restTemplate.postForEntity(url, entity, String.class); - - if (response.getStatusCode().is2xxSuccessful() && response.hasBody()) { - return response.getBody(); - } else { - throw new RuntimeException("GraphQL request failed with status: " + - response.getStatusCode() + " and body: " + response.getBody()); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeModuleCompleteTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeModuleCompleteTest.java deleted file mode 100644 index c90afa9..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeModuleCompleteTest.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.rongyichuang.judge; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -@ActiveProfiles("test") -public class JudgeModuleCompleteTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void testCompleteJudgeModuleFlow() throws Exception { - System.out.println("=== 寮�濮嬪畬鏁寸殑璇勫妯″潡娴嬭瘯 ==="); - - // 1. 楠岃瘉logo鍥剧墖鏂囦欢瀛樺湪 - System.out.println("姝ラ1: 楠岃瘉澶村儚鍥剧墖鏂囦欢"); - File logoFile = findLogoFile(); - assertNotNull(logoFile, "搴旇鎵惧埌logo鍥剧墖鏂囦欢"); - System.out.println("鉁� 鎵惧埌澶村儚鍥剧墖: " + logoFile.getAbsolutePath()); - - // 2. 妯℃嫙鍓嶇涓婁紶澶村儚锛屼繚瀛樺埌t_media琛� - System.out.println("姝ラ2: 淇濆瓨澶村儚濯掍綋淇℃伅"); - Long mediaId = saveAvatarMedia(); - assertNotNull(mediaId, "澶村儚濯掍綋淇℃伅淇濆瓨搴旇鎴愬姛"); - System.out.println("鉁� 澶村儚濯掍綋淇℃伅淇濆瓨鎴愬姛锛孖D: " + mediaId); - - // 3. 鍒涘缓璇勫淇℃伅锛屼繚瀛樺埌t_judge琛� - System.out.println("姝ラ3: 鍒涘缓璇勫淇℃伅"); - Long judgeId = createJudge(); - assertNotNull(judgeId, "璇勫鍒涘缓搴旇鎴愬姛"); - System.out.println("鉁� 璇勫鍒涘缓鎴愬姛锛孖D: " + judgeId); - - // 4. 鍒涘缓鏍囩骞跺叧鑱斿埌璇勫 - System.out.println("姝ラ4: 鍒涘缓鏍囩骞跺叧鑱�"); - createTagsAndAssociate(judgeId); - System.out.println("鉁� 鏍囩鍒涘缓鍜屽叧鑱旀垚鍔�"); - - // 5. 鏇存柊濯掍綋璁板綍鐨勫叧鑱斾俊鎭� - System.out.println("姝ラ5: 鏇存柊濯掍綋鍏宠仈淇℃伅"); - updateMediaAssociation(mediaId, judgeId); - System.out.println("鉁� 濯掍綋鍏宠仈淇℃伅鏇存柊鎴愬姛"); - - // 6. 楠岃瘉鎵�鏈夋暟鎹簱鏁版嵁鐨勬纭�� - System.out.println("姝ラ6: 楠岃瘉鏁版嵁搴撴暟鎹�"); - verifyAllDatabaseData(mediaId, judgeId); - - System.out.println("=== 瀹屾暣鐨勮瘎濮旀ā鍧楁祴璇曟垚鍔� ==="); - } - - private File findLogoFile() { - String[] possiblePaths = { - "../UI/logo.jpg", - "UI/logo.jpg", - "../UI/logo.png", - "UI/logo.png" - }; - - for (String path : possiblePaths) { - File file = new File(path); - if (file.exists()) { - return file; - } - } - return null; - } - - private Long saveAvatarMedia() { - // 妯℃嫙鏂囦欢涓婁紶鍒癈OS鍚庣殑璺緞 - String cosPath = "avatars/judge_avatar_" + System.currentTimeMillis() + ".jpg"; - - String sql = """ - INSERT INTO t_media (name, path, file_size, file_ext, media_type, target_type, target_id, state) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - """; - - jdbcTemplate.update(sql, - "judge_avatar.jpg", // name - cosPath, // path - 1024, // file_size - "jpg", // file_ext - 1, // media_type (1=鍥剧墖) - 1, // target_type (1=璇勫澶村儚) - 0L, // target_id (涓存椂鍊硷紝鍚庣画鏇存柊) - 1 // state - ); - - // 鑾峰彇鍒氭彃鍏ョ殑ID - String selectSql = "SELECT id FROM t_media WHERE path = ? ORDER BY id DESC LIMIT 1"; - return jdbcTemplate.queryForObject(selectSql, Long.class, cosPath); - } - - private Long createJudge() { - String sql = """ - INSERT INTO t_judge (name, phone, gender, description, state) - VALUES (?, ?, ?, ?, ?) - """; - - jdbcTemplate.update(sql, - "寮犱笁", // name - "13800138000", // phone - 1, // gender (1=鐢�) - "鎷ユ湁10骞翠互涓婄殑鎶�鏈紑鍙戠粡楠岋紝涓撴敞浜庝簯璁$畻鍜屽ぇ鏁版嵁棰嗗煙銆�", // description - 1 // state (1=姝e父) - ); - - // 鑾峰彇鍒氭彃鍏ョ殑ID - String selectSql = "SELECT id FROM t_judge WHERE phone = ? ORDER BY id DESC LIMIT 1"; - return jdbcTemplate.queryForObject(selectSql, Long.class, "13800138000"); - } - - private void createTagsAndAssociate(Long judgeId) { - String[] tagNames = {"浜戣绠�", "澶ф暟鎹�", "鏋舵瀯璁捐"}; - - for (String tagName : tagNames) { - // 妫�鏌ユ爣绛炬槸鍚﹀凡瀛樺湪 - String checkSql = "SELECT COUNT(*) FROM t_tag WHERE name = ?"; - int count = jdbcTemplate.queryForObject(checkSql, Integer.class, tagName); - - Long tagId; - if (count == 0) { - // 鍒涘缓鏂版爣绛� - String insertTagSql = """ - INSERT INTO t_tag (name, code, category, state) - VALUES (?, ?, ?, ?) - """; - - jdbcTemplate.update(insertTagSql, - tagName, // name - tagName.toLowerCase(), // code - "鎶�鏈�", // category - 1 // state - ); - - // 鑾峰彇鏍囩ID - String selectTagSql = "SELECT id FROM t_tag WHERE name = ? ORDER BY id DESC LIMIT 1"; - tagId = jdbcTemplate.queryForObject(selectTagSql, Long.class, tagName); - } else { - // 鑾峰彇宸插瓨鍦ㄧ殑鏍囩ID - String selectTagSql = "SELECT id FROM t_tag WHERE name = ?"; - tagId = jdbcTemplate.queryForObject(selectTagSql, Long.class, tagName); - } - - // 鍏宠仈璇勫鍜屾爣绛� - String associateSql = """ - INSERT INTO t_judge_tag (judge_id, tag_id, state) - VALUES (?, ?, ?) - """; - - jdbcTemplate.update(associateSql, judgeId, tagId, 1); - } - } - - private void updateMediaAssociation(Long mediaId, Long judgeId) { - String sql = "UPDATE t_media SET target_id = ? WHERE id = ?"; - int updated = jdbcTemplate.update(sql, judgeId, mediaId); - assertEquals(1, updated, "搴旇鏇存柊涓�鏉″獟浣撹褰�"); - } - - private void verifyAllDatabaseData(Long mediaId, Long judgeId) { - System.out.println("=== 楠岃瘉鏁版嵁搴撴暟鎹� ==="); - - // 楠岃瘉t_media琛ㄦ暟鎹� - System.out.println("楠岃瘉t_media琛ㄦ暟鎹�..."); - String mediaSql = "SELECT id, name, path, target_type, target_id, media_type, file_size, file_ext FROM t_media WHERE id = ?"; - Map<String, Object> mediaRecord = jdbcTemplate.queryForMap(mediaSql, mediaId); - - assertNotNull(mediaRecord, "搴旇鎵惧埌濯掍綋璁板綍"); - assertEquals("judge_avatar.jpg", mediaRecord.get("name"), "濯掍綋鏂囦欢鍚嶅簲璇ユ纭�"); - assertTrue(mediaRecord.get("path").toString().contains("avatars/"), "濯掍綋璺緞搴旇鍖呭惈avatars鐩綍"); - assertEquals(1, mediaRecord.get("target_type"), "target_type搴旇鏄�1锛堣瘎濮斿ご鍍忥級"); - assertEquals(judgeId.longValue(), ((Number)mediaRecord.get("target_id")).longValue(), "target_id搴旇鏄瘎濮擨D"); - assertEquals(1, mediaRecord.get("media_type"), "media_type搴旇鏄�1锛堝浘鐗囷級"); - assertEquals(1024, mediaRecord.get("file_size"), "鏂囦欢澶у皬搴旇姝g‘"); - assertEquals("jpg", mediaRecord.get("file_ext"), "鏂囦欢鎵╁睍鍚嶅簲璇ユ纭�"); - - System.out.println("鉁� t_media琛ㄦ暟鎹獙璇侀�氳繃"); - System.out.println(" - 鏂囦欢鍚�: " + mediaRecord.get("name")); - System.out.println(" - 璺緞: " + mediaRecord.get("path")); - System.out.println(" - 鐩爣绫诲瀷: " + mediaRecord.get("target_type")); - System.out.println(" - 鐩爣ID: " + mediaRecord.get("target_id")); - System.out.println(" - 濯掍綋绫诲瀷: " + mediaRecord.get("media_type")); - - // 楠岃瘉t_judge琛ㄦ暟鎹� - System.out.println("楠岃瘉t_judge琛ㄦ暟鎹�..."); - String judgeSql = "SELECT id, name, phone, gender, description, state FROM t_judge WHERE id = ?"; - Map<String, Object> judgeRecord = jdbcTemplate.queryForMap(judgeSql, judgeId); - - assertNotNull(judgeRecord, "搴旇鎵惧埌璇勫璁板綍"); - assertEquals("寮犱笁", judgeRecord.get("name"), "璇勫濮撳悕搴旇姝g‘"); - assertEquals("13800138000", judgeRecord.get("phone"), "璇勫鐢佃瘽搴旇姝g‘"); - assertEquals(1, judgeRecord.get("gender"), "璇勫鎬у埆搴旇姝g‘"); - assertTrue(judgeRecord.get("description").toString().contains("10骞翠互涓�"), "璇勫浠嬬粛搴旇姝g‘"); - assertEquals(1, judgeRecord.get("state"), "璇勫鐘舵�佸簲璇ユ纭�"); - - System.out.println("鉁� t_judge琛ㄦ暟鎹獙璇侀�氳繃"); - System.out.println(" - 濮撳悕: " + judgeRecord.get("name")); - System.out.println(" - 鐢佃瘽: " + judgeRecord.get("phone")); - System.out.println(" - 鎬у埆: " + judgeRecord.get("gender")); - System.out.println(" - 鐘舵��: " + judgeRecord.get("state")); - - // 楠岃瘉t_judge_tag琛ㄦ暟鎹� - System.out.println("楠岃瘉t_judge_tag琛ㄦ暟鎹�..."); - String tagSql = """ - SELECT jt.judge_id, t.name as tag_name, t.category - FROM t_judge_tag jt - JOIN t_tag t ON jt.tag_id = t.id - WHERE jt.judge_id = ? AND jt.state = 1 - """; - List<Map<String, Object>> tagRecords = jdbcTemplate.queryForList(tagSql, judgeId); - - assertFalse(tagRecords.isEmpty(), "搴旇鎵惧埌璇勫鏍囩璁板綍"); - assertEquals(3, tagRecords.size(), "搴旇鏈�3涓爣绛�"); - - System.out.println("鉁� t_judge_tag琛ㄦ暟鎹獙璇侀�氳繃"); - for (Map<String, Object> tagRecord : tagRecords) { - System.out.println(" - 鏍囩: " + tagRecord.get("tag_name") + " (鍒嗙被: " + tagRecord.get("category") + ")"); - } - - // 楠岃瘉鏁版嵁鍏宠仈鐨勬纭�� - System.out.println("楠岃瘉鏁版嵁鍏宠仈..."); - String associationSql = """ - SELECT - j.name as judge_name, - m.name as media_name, - m.path as media_path, - COUNT(jt.tag_id) as tag_count - FROM t_judge j - LEFT JOIN t_media m ON m.target_id = j.id AND m.target_type = 1 - LEFT JOIN t_judge_tag jt ON jt.judge_id = j.id AND jt.state = 1 - WHERE j.id = ? - GROUP BY j.id, m.id - """; - - Map<String, Object> associationRecord = jdbcTemplate.queryForMap(associationSql, judgeId); - - assertEquals("寮犱笁", associationRecord.get("judge_name"), "璇勫濮撳悕搴旇姝g‘"); - assertEquals("judge_avatar.jpg", associationRecord.get("media_name"), "鍏宠仈鐨勫獟浣撴枃浠跺悕搴旇姝g‘"); - assertTrue(associationRecord.get("media_path").toString().contains("avatars/"), "鍏宠仈鐨勫獟浣撹矾寰勫簲璇ユ纭�"); - assertEquals(3L, ((Number)associationRecord.get("tag_count")).longValue(), "搴旇鍏宠仈3涓爣绛�"); - - System.out.println("鉁� 鏁版嵁鍏宠仈楠岃瘉閫氳繃"); - System.out.println(" - 璇勫: " + associationRecord.get("judge_name")); - System.out.println(" - 澶村儚: " + associationRecord.get("media_name")); - System.out.println(" - 鏍囩鏁伴噺: " + associationRecord.get("tag_count")); - - System.out.println("=== 鎵�鏈夋暟鎹簱鏁版嵁楠岃瘉閫氳繃 ==="); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeRealCOSUploadTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeRealCOSUploadTest.java deleted file mode 100644 index 7b5c030..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeRealCOSUploadTest.java +++ /dev/null @@ -1,254 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ActiveProfiles; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.URI; -import java.util.Collections; -import java.util.Map; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") -public class JudgeRealCOSUploadTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void testRealCOSUpload() throws Exception { - System.out.println("=== 鐪熷疄COS涓婁紶娴嬭瘯 ==="); - - // 姝ラ1: 鑾峰彇鐪熷疄鐨凜OS涓婁紶鍑瘉 - System.out.println("\n姝ラ1: 鑾峰彇COS涓婁紶鍑瘉"); - Map<String, Object> credentials = getRealUploadCredentials(); - - if (credentials == null || credentials.isEmpty()) { - System.out.println("鉂� 鏃犳硶鑾峰彇涓婁紶鍑瘉锛岃烦杩囩湡瀹炰笂浼犳祴璇�"); - return; - } - - System.out.println("鉁� 鑾峰彇鍒颁笂浼犲嚟璇�:"); - credentials.forEach((key, value) -> { - if (key.contains("secret") || key.contains("token")) { - System.out.println(" " + key + ": " + maskSensitiveInfo(value.toString())); - } else { - System.out.println(" " + key + ": " + value); - } - }); - - // 姝ラ2: 鍑嗗涓婁紶鏂囦欢 - System.out.println("\n姝ラ2: 鍑嗗涓婁紶鏂囦欢"); - File logoFile = findLogoFile(); - if (logoFile == null || !logoFile.exists()) { - System.out.println("鉂� 鎵句笉鍒發ogo.png鏂囦欢锛岃烦杩囦笂浼犳祴璇�"); - return; - } - - System.out.println("鉁� 鎵惧埌logo鏂囦欢: " + logoFile.getAbsolutePath()); - System.out.println(" 鏂囦欢澶у皬: " + logoFile.length() + " bytes"); - - // 姝ラ3: 鎵ц鐪熷疄鐨凜OS涓婁紶 - System.out.println("\n姝ラ3: 鎵цCOS涓婁紶"); - String uploadResult = performRealCOSUpload(credentials, logoFile); - - if (uploadResult != null) { - System.out.println("鉁� 鏂囦欢涓婁紶鎴愬姛!"); - System.out.println(" 涓婁紶璺緞: " + uploadResult); - } else { - System.out.println("鉂� 鏂囦欢涓婁紶澶辫触!"); - } - } - - /** - * 鑾峰彇鐪熷疄鐨凜OS涓婁紶鍑瘉 - */ - private Map<String, Object> getRealUploadCredentials() throws Exception { - String query = """ - query { - getUploadCredentials { - bucket - region - key - presignedUrl - expiration - } - } - """; - - try { - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - if (responseMap.containsKey("errors")) { - System.out.println("鉂� GraphQL閿欒: " + responseMap.get("errors")); - return null; - } - - Map<String, Object> data = (Map<String, Object>) responseMap.get("data"); - return (Map<String, Object>) data.get("getUploadCredentials"); - - } catch (Exception e) { - System.out.println("鉂� 鑾峰彇涓婁紶鍑瘉澶辫触: " + e.getMessage()); - e.printStackTrace(); - return null; - } - } - - /** - * 鏌ユ壘logo鏂囦欢 - */ - private File findLogoFile() { - // 灏濊瘯澶氫釜鍙兘鐨勮矾寰� - String[] possiblePaths = { - "UI/logo.png", - "../UI/logo.png", - "../../UI/logo.png", - "UI/logo.jpg", - "../UI/logo.jpg", - "../../UI/logo.jpg" - }; - - for (String path : possiblePaths) { - File file = new File(path); - if (file.exists()) { - return file; - } - } - - return null; - } - - /** - * 鎵ц鐪熷疄鐨凜OS涓婁紶锛堜娇鐢ㄩ绛惧悕URL锛� - */ - private String performRealCOSUpload(Map<String, Object> credentials, File file) { - try { - // 鑾峰彇棰勭鍚峌RL - String presignedUrl = (String) credentials.get("presignedUrl"); - String objectKey = (String) credentials.get("key"); - - if (presignedUrl == null || presignedUrl.isEmpty()) { - System.out.println("鉂� 棰勭鍚峌RL涓虹┖"); - return null; - } - - System.out.println("棰勭鍚峌RL: " + presignedUrl); - System.out.println("瀵硅薄閿�: " + objectKey); - - // 璇诲彇鏂囦欢鍐呭 - byte[] fileContent = readFileContent(file); - System.out.println("鏂囦欢鍐呭澶у皬: " + fileContent.length + " bytes"); - - // 浣跨敤棰勭鍚峌RL鐩存帴涓婁紶锛屼笉闇�瑕侀澶栫殑璁よ瘉澶撮儴 - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(presignedUrl)) - .header("Content-Type", getContentType(file)) - .PUT(HttpRequest.BodyPublishers.ofByteArray(fileContent)) - .build(); - - // 鍙戦�佽姹� - System.out.println("鍙戦�佷笂浼犺姹�..."); - HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); - - System.out.println("鍝嶅簲鐘舵�佺爜: " + response.statusCode()); - System.out.println("鍝嶅簲澶�: " + response.headers().map()); - if (!response.body().isEmpty()) { - System.out.println("鍝嶅簲浣�: " + response.body()); - } - - if (response.statusCode() == 200 || response.statusCode() == 201 || response.statusCode() == 204) { - System.out.println("鉁� 鏂囦欢涓婁紶鎴愬姛!"); - return objectKey; - } else { - System.out.println("鉂� 涓婁紶澶辫触锛岀姸鎬佺爜: " + response.statusCode()); - if (!response.body().isEmpty()) { - System.out.println("鉂� 鍝嶅簲鍐呭: " + response.body()); - } - return null; - } - - } catch (Exception e) { - System.out.println("鉂� COS涓婁紶寮傚父: " + e.getMessage()); - e.printStackTrace(); - return null; - } - } - - /** - * 璇诲彇鏂囦欢鍐呭 - */ - private byte[] readFileContent(File file) throws IOException { - try (FileInputStream fis = new FileInputStream(file)) { - return fis.readAllBytes(); - } - } - - /** - * 鑾峰彇鏂囦欢鍐呭绫诲瀷 - */ - private String getContentType(File file) { - String fileName = file.getName().toLowerCase(); - if (fileName.endsWith(".png")) { - return "image/png"; - } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) { - return "image/jpeg"; - } else { - return "application/octet-stream"; - } - } - - - - /** - * 鍙戦�丟raphQL璇锋眰 - */ - private String postGraphQL(Map<String, String> request) throws Exception { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<Map<String, String>> entity = new HttpEntity<>(request, headers); - - ResponseEntity<String> response = restTemplate.postForEntity( - "http://localhost:" + port + "/graphql", entity, String.class); - - if (response.getStatusCode().is2xxSuccessful()) { - return response.getBody(); - } else { - throw new RuntimeException("GraphQL request failed with status: " + - response.getStatusCode() + " and body: " + response.getBody()); - } - } - - /** - * 鎺╃爜鏁忔劅淇℃伅 - */ - private String maskSensitiveInfo(String info) { - if (info == null || info.length() <= 8) { - return "****"; - } - return info.substring(0, 4) + "****" + info.substring(info.length() - 4); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeRealFlowWithCOSTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeRealFlowWithCOSTest.java deleted file mode 100644 index e9aa8a5..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeRealFlowWithCOSTest.java +++ /dev/null @@ -1,356 +0,0 @@ -package com.rongyichuang.judge; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import javax.sql.DataSource; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") -public class JudgeRealFlowWithCOSTest { - - @LocalServerPort - private int port; - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private DataSource dataSource; - - private JdbcTemplate jdbcTemplate; - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test - void testCompleteJudgeFlowWithRealCOS() throws Exception { - jdbcTemplate = new JdbcTemplate(dataSource); - - System.out.println("=== 瀹屾暣璇勫鍒涘缓娴佺▼锛堢湡瀹濩OS涓婁紶锛�==="); - - // 姝ラ1: 鑾峰彇鏍囩鍒楄〃 - System.out.println("\n姝ラ1: 鑾峰彇鏍囩鍒楄〃"); - List<Map<String, Object>> availableTags = getAvailableTags(); - assertNotNull(availableTags, "鏍囩鍒楄〃涓嶅簲涓虹┖"); - assertFalse(availableTags.isEmpty(), "搴旇鏈夊彲鐢ㄧ殑鏍囩"); - System.out.println("鉁� 鑾峰彇鍒� " + availableTags.size() + " 涓爣绛�"); - - // 姝ラ2: 淇濆瓨璇勫淇℃伅 - System.out.println("\n姝ラ2: 淇濆瓨璇勫淇℃伅"); - String judgeId = saveJudgeInfo(availableTags); - assertNotNull(judgeId, "璇勫ID涓嶅簲涓虹┖"); - System.out.println("鉁� 璇勫淇濆瓨鎴愬姛锛孖D: " + judgeId); - - // 姝ラ3: 鑾峰彇COS涓婁紶鍑瘉 - System.out.println("\n姝ラ3: 鑾峰彇COS涓婁紶鍑瘉"); - Map<String, Object> uploadCredentials = getUploadCredentials(); - assertNotNull(uploadCredentials, "涓婁紶鍑瘉涓嶅簲涓虹┖"); - System.out.println("鉁� 鑾峰彇涓婁紶鍑瘉鎴愬姛"); - - // 姝ラ4: 鐪熷疄涓婁紶澶村儚鍒癈OS - System.out.println("\n姝ラ4: 涓婁紶澶村儚鍒癈OS"); - String cosPath = performRealCOSUpload(uploadCredentials); - assertNotNull(cosPath, "COS璺緞涓嶅簲涓虹┖"); - System.out.println("鉁� 澶村儚涓婁紶鍒癈OS鎴愬姛锛岃矾寰�: " + cosPath); - - // 姝ラ5: 淇濆瓨濯掍綋璁板綍 - System.out.println("\n姝ラ5: 淇濆瓨濯掍綋璁板綍"); - String mediaId = saveMediaRecord(cosPath, judgeId); - assertNotNull(mediaId, "濯掍綋ID涓嶅簲涓虹┖"); - System.out.println("鉁� 濯掍綋璁板綍淇濆瓨鎴愬姛锛孖D: " + mediaId); - - // 姝ラ6: 楠岃瘉鏁版嵁瀹屾暣鎬� - System.out.println("\n姝ラ6: 楠岃瘉鏁版嵁瀹屾暣鎬�"); - verifyDataIntegrity(judgeId, mediaId, cosPath); - System.out.println("鉁� 鏁版嵁瀹屾暣鎬ч獙璇侀�氳繃"); - - System.out.println("\n馃帀 瀹屾暣娴佺▼娴嬭瘯鎴愬姛锛佹枃浠跺凡鐪熷疄涓婁紶鍒拌吘璁簯COS锛�"); - } - - private List<Map<String, Object>> getAvailableTags() throws Exception { - String query = """ - query { - tagsByCategory(category: "major") { - id - name - code - } - } - """; - - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("GraphQL鏌ヨ澶辫触: " + responseMap.get("errors")); - } - - Map<String, Object> data = (Map<String, Object>) responseMap.get("data"); - @SuppressWarnings("unchecked") - List<Map<String, Object>> tags = (List<Map<String, Object>>) data.get("tagsByCategory"); - - if (tags == null || tags.isEmpty()) { - // 濡傛灉娌℃湁涓撲笟鏍囩锛岃幏鍙栨墍鏈夋爣绛� - String allTagsQuery = """ - query { - tags { - id - name - code - } - } - """; - - Map<String, String> allTagsRequest = Collections.singletonMap("query", allTagsQuery); - String allTagsResponse = postGraphQL(allTagsRequest); - Map<String, Object> allTagsResponseMap = objectMapper.readValue(allTagsResponse, Map.class); - Map<String, Object> allTagsData = (Map<String, Object>) allTagsResponseMap.get("data"); - - @SuppressWarnings("unchecked") - List<Map<String, Object>> allTags = (List<Map<String, Object>>) allTagsData.get("tags"); - - return allTags != null ? allTags.stream().limit(3).toList() : Collections.emptyList(); - } - - return tags; - } - - private String saveJudgeInfo(List<Map<String, Object>> availableTags) throws Exception { - // 閫夋嫨鍓�2涓爣绛句綔涓轰笓涓氭爣绛� - List<String> majorIds = availableTags.stream() - .limit(2) - .map(tag -> String.valueOf(tag.get("id"))) - .toList(); - - String timestamp = String.valueOf(System.currentTimeMillis() % 100000); - String mutation = String.format(""" - mutation { - saveJudge(input: { - name: "鐜嬩簲" - phone: "139%s" - gender: 1 - description: "楂樼骇鎶�鏈笓瀹讹紝鎷ユ湁涓板瘜鐨勮涓氱粡楠�" - majorIds: [%s] - }) { - id - name - phone - } - } - """, timestamp, String.join(", ", majorIds)); - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("淇濆瓨璇勫澶辫触: " + responseMap.get("errors")); - } - - @SuppressWarnings("unchecked") - Map<String, Object> judgeData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveJudge"); - - Object idObj = judgeData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - private Map<String, Object> getUploadCredentials() throws Exception { - String query = """ - query { - getUploadCredentials { - bucket - region - key - presignedUrl - expiration - } - } - """; - - Map<String, String> request = Collections.singletonMap("query", query); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("鑾峰彇涓婁紶鍑瘉澶辫触: " + responseMap.get("errors")); - } - - Map<String, Object> data = (Map<String, Object>) responseMap.get("data"); - return (Map<String, Object>) data.get("getUploadCredentials"); - } - - private String performRealCOSUpload(Map<String, Object> credentials) throws Exception { - // 鏌ユ壘logo鏂囦欢 - File logoFile = findLogoFile(); - if (logoFile == null || !logoFile.exists()) { - throw new RuntimeException("鎵句笉鍒發ogo鏂囦欢"); - } - - // 鑾峰彇棰勭鍚峌RL - String presignedUrl = (String) credentials.get("presignedUrl"); - String objectKey = (String) credentials.get("key"); - - if (presignedUrl == null || presignedUrl.isEmpty()) { - throw new RuntimeException("棰勭鍚峌RL涓虹┖"); - } - - // 璇诲彇鏂囦欢鍐呭 - byte[] fileContent = readFileContent(logoFile); - - // 浣跨敤棰勭鍚峌RL涓婁紶 - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(presignedUrl)) - .header("Content-Type", "image/jpeg") - .PUT(HttpRequest.BodyPublishers.ofByteArray(fileContent)) - .build(); - - HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); - - if (response.statusCode() == 200 || response.statusCode() == 201 || response.statusCode() == 204) { - return objectKey; - } else { - throw new RuntimeException("COS涓婁紶澶辫触锛岀姸鎬佺爜: " + response.statusCode() + - ", 鍝嶅簲: " + response.body()); - } - } - - private File findLogoFile() { - String[] possiblePaths = { - "UI/logo.jpg", - "../UI/logo.jpg", - "../../UI/logo.jpg", - "UI/logo.png", - "../UI/logo.png", - "../../UI/logo.png" - }; - - for (String path : possiblePaths) { - File file = new File(path); - if (file.exists()) { - return file; - } - } - - return null; - } - - private byte[] readFileContent(File file) throws IOException { - try (FileInputStream fis = new FileInputStream(file)) { - return fis.readAllBytes(); - } - } - - private String saveMediaRecord(String cosPath, String judgeId) throws Exception { - String mutation = String.format(""" - mutation { - saveMedia(input: { - name: "logo.jpg" - path: "%s" - fileSize: 67671 - fileExt: "jpg" - mediaType: 1 - targetType: 1 - targetId: %s - }) { - id - name - path - targetType - targetId - } - } - """, cosPath, judgeId); - - Map<String, String> request = Collections.singletonMap("query", mutation); - String response = postGraphQL(request); - - Map<String, Object> responseMap = objectMapper.readValue(response, Map.class); - - if (responseMap.containsKey("errors")) { - System.out.println("GraphQL閿欒: " + responseMap.get("errors")); - throw new RuntimeException("淇濆瓨濯掍綋璁板綍澶辫触: " + responseMap.get("errors")); - } - - @SuppressWarnings("unchecked") - Map<String, Object> mediaData = (Map<String, Object>) - ((Map<String, Object>) responseMap.get("data")).get("saveMedia"); - - Object idObj = mediaData.get("id"); - return idObj != null ? idObj.toString() : null; - } - - private void verifyDataIntegrity(String judgeId, String mediaId, String cosPath) { - // 楠岃瘉璇勫鍩烘湰淇℃伅 - String judgeSql = "SELECT * FROM t_judge WHERE id = ?"; - Map<String, Object> judge = jdbcTemplate.queryForMap(judgeSql, Long.parseLong(judgeId)); - - assertEquals("鐜嬩簲", judge.get("name")); - assertTrue(((String) judge.get("phone")).startsWith("139")); - assertEquals(1, judge.get("gender")); - - // 楠岃瘉濯掍綋璁板綍 - String mediaSql = "SELECT * FROM t_media WHERE id = ?"; - Map<String, Object> media = jdbcTemplate.queryForMap(mediaSql, Long.parseLong(mediaId)); - - assertEquals("logo.jpg", media.get("name")); - assertEquals(cosPath, media.get("path")); // 楠岃瘉鐪熷疄鐨凜OS璺緞 - assertEquals(1, media.get("target_type")); - assertEquals(Long.parseLong(judgeId), ((Number) media.get("target_id")).longValue()); - - // 楠岃瘉鏍囩鍏宠仈 - String tagSql = "SELECT COUNT(*) FROM t_judge_tag WHERE judge_id = ?"; - Integer tagCount = jdbcTemplate.queryForObject(tagSql, Integer.class, Long.parseLong(judgeId)); - assertTrue(tagCount >= 2, "搴旇鑷冲皯鏈�2涓爣绛惧叧鑱�"); - - System.out.println("鉁� 璇勫淇℃伅楠岃瘉閫氳繃"); - System.out.println("鉁� 濯掍綋璁板綍楠岃瘉閫氳繃锛岀湡瀹濩OS璺緞: " + cosPath); - System.out.println("鉁� 鏍囩鍏宠仈楠岃瘉閫氳繃锛屽叧鑱旀暟: " + tagCount); - } - - private String postGraphQL(Map<String, String> request) throws Exception { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<Map<String, String>> entity = new HttpEntity<>(request, headers); - - ResponseEntity<String> response = restTemplate.postForEntity( - "http://localhost:" + port + "/graphql", entity, String.class); - - if (response.getStatusCode().is2xxSuccessful()) { - return response.getBody(); - } else { - throw new RuntimeException("GraphQL request failed with status: " + - response.getStatusCode() + " and body: " + response.getBody()); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/judge/JudgeTableSchemaTest.java b/backend/src/test/java/com/rongyichuang/judge/JudgeTableSchemaTest.java deleted file mode 100644 index 16c5afa..0000000 --- a/backend/src/test/java/com/rongyichuang/judge/JudgeTableSchemaTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.rongyichuang.judge; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class JudgeTableSchemaTest { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void testJudgeAvatarData() { - try { - System.out.println("=== 鏌ョ湅璇勫鏁版嵁 ==="); - List<Map<String, Object>> judges = jdbcTemplate.queryForList("SELECT id, name, phone FROM t_judge WHERE state = 1 LIMIT 5"); - - for (Map<String, Object> judge : judges) { - System.out.println(String.format("璇勫ID: %s, 濮撳悕: %s, 鐢佃瘽: %s", - judge.get("id"), judge.get("name"), judge.get("phone"))); - } - - System.out.println("\n=== 鏌ョ湅璇勫澶村儚鏁版嵁 (target_type=1) ==="); - List<Map<String, Object>> avatars = jdbcTemplate.queryForList( - "SELECT target_id, path, name FROM t_media WHERE target_type = 1 AND state = 1"); - - if (avatars.isEmpty()) { - System.out.println("娌℃湁鎵惧埌璇勫澶村儚鏁版嵁"); - } else { - for (Map<String, Object> avatar : avatars) { - System.out.println(String.format("璇勫ID: %s, 澶村儚璺緞: %s, 鏂囦欢鍚�: %s", - avatar.get("target_id"), avatar.get("path"), avatar.get("name"))); - } - } - - System.out.println("\n=== 鏌ョ湅鎵�鏈塵edia鏁版嵁鐨則arget_type鍒嗗竷 ==="); - List<Map<String, Object>> typeDistribution = jdbcTemplate.queryForList( - "SELECT target_type, COUNT(*) as count FROM t_media WHERE state = 1 GROUP BY target_type"); - - for (Map<String, Object> row : typeDistribution) { - System.out.println(String.format("target_type: %s, 鏁伴噺: %s", - row.get("target_type"), row.get("count"))); - } - - } catch (Exception e) { - System.out.println("鏌ヨ澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/region/RegionDataInsertTest.java b/backend/src/test/java/com/rongyichuang/region/RegionDataInsertTest.java deleted file mode 100644 index 1b0b2f9..0000000 --- a/backend/src/test/java/com/rongyichuang/region/RegionDataInsertTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.rongyichuang.region; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.sql.*; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -@SpringBootTest -public class RegionDataInsertTest { - - @Test - public void insertRegionData() { - // 浣跨敤搴旂敤閰嶇疆鐨勬暟鎹簱杩炴帴淇℃伅 - String url = "jdbc:mysql://139.155.104.10:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"; - String username = "ryc"; - String password = "KiYap3E8X8RLcM6T"; - - try (Connection connection = DriverManager.getConnection(url, username, password)) { - System.out.println("=== 寮�濮嬫彃鍏ュ尯鍩熸暟鎹� ==="); - - // 鍏堟煡鐪嬭〃缁撴瀯 - System.out.println("=== t_region 琛ㄧ粨鏋� ==="); - DatabaseMetaData metaData = connection.getMetaData(); - ResultSet columns = metaData.getColumns(null, null, "t_region", null); - - while (columns.next()) { - String columnName = columns.getString("COLUMN_NAME"); - String columnType = columns.getString("TYPE_NAME"); - System.out.printf("%-15s %s%n", columnName, columnType); - } - - // 娓呯┖鐜版湁鏁版嵁锛堝彲閫夛級 - // connection.createStatement().executeUpdate("DELETE FROM t_region"); - - String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - // 鎻掑叆鐪佺骇鏁版嵁 - insertProvince(connection, "鍥涘窛鐪�", currentTime); - insertProvince(connection, "閲嶅簡甯�", currentTime); - - // 鑾峰彇鍥涘窛鐪両D - Long sichuanId = getRegionIdByName(connection, "鍥涘窛鐪�"); - - // 鎻掑叆甯傜骇鏁版嵁 - insertCity(connection, "鎴愰兘甯�", sichuanId, currentTime); - insertCity(connection, "鐪夊北甯�", sichuanId, currentTime); - insertCity(connection, "寰烽槼甯�", sichuanId, currentTime); - - // 鑾峰彇鎴愰兘甯侷D - Long chengduId = getRegionIdByName(connection, "鎴愰兘甯�"); - - // 鎻掑叆鎴愰兘鍖哄幙鏁版嵁锛堟牴鎹浘鐗囧唴瀹癸級 - String[] chengduDistricts = { - "澶╁簻鏂板尯", "涓滈儴鏂板尯", "楂樻柊", "閿︽睙", "闈掔緤", "閲戠墰", "姝︿警", "鎴愬崕", - "榫欐硥", "闈掔櫧姹�", "鏂伴兘", "娓╂睙", "鍙屾祦", "閮兘", "绠�闃�", "閮芥睙鍫�", - "褰窞", "閭涘磧", "宕囧窞", "閲戝爞", "鏂版触", "澶ч倯", "钂叉睙" - }; - - for (String district : chengduDistricts) { - insertDistrict(connection, district, chengduId, currentTime); - } - - // 鏌ョ湅鎻掑叆缁撴灉 - System.out.println("\n=== 鎻掑叆缁撴灉 ==="); - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT id, name, pid, create_time FROM t_region ORDER BY pid, id"); - - while (rs.next()) { - System.out.printf("ID: %d, Name: %s, PID: %s, CreateTime: %s%n", - rs.getLong("id"), - rs.getString("name"), - rs.getObject("pid"), - rs.getString("create_time") - ); - } - - System.out.println("=== 鏁版嵁鎻掑叆瀹屾垚 ==="); - - } catch (SQLException e) { - System.err.println("鏁版嵁搴撴搷浣滃け璐�: " + e.getMessage()); - e.printStackTrace(); - } - } - - private void insertProvince(Connection connection, String name, String createTime) throws SQLException { - String sql = "INSERT INTO t_region (name, pid, code, level, leaf_flag, state, create_time, update_time, create_user_id, update_user_id, version) VALUES (?, 0, NULL, 1, 0, 1, ?, ?, 1, 1, 0)"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, name); - stmt.setString(2, createTime); - stmt.setString(3, createTime); - int result = stmt.executeUpdate(); - System.out.println("鎻掑叆鐪佺骇: " + name + " - " + (result > 0 ? "鎴愬姛" : "澶辫触")); - } - } - - private void insertCity(Connection connection, String name, Long parentId, String createTime) throws SQLException { - String sql = "INSERT INTO t_region (name, pid, code, level, leaf_flag, state, create_time, update_time, create_user_id, update_user_id, version) VALUES (?, ?, NULL, 2, 0, 1, ?, ?, 1, 1, 0)"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, name); - stmt.setLong(2, parentId); - stmt.setString(3, createTime); - stmt.setString(4, createTime); - int result = stmt.executeUpdate(); - System.out.println("鎻掑叆甯傜骇: " + name + " (parent: " + parentId + ") - " + (result > 0 ? "鎴愬姛" : "澶辫触")); - } - } - - private void insertDistrict(Connection connection, String name, Long parentId, String createTime) throws SQLException { - String sql = "INSERT INTO t_region (name, pid, code, level, leaf_flag, state, create_time, update_time, create_user_id, update_user_id, version) VALUES (?, ?, NULL, 3, 1, 1, ?, ?, 1, 1, 0)"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, name); - stmt.setLong(2, parentId); - stmt.setString(3, createTime); - stmt.setString(4, createTime); - int result = stmt.executeUpdate(); - System.out.println("鎻掑叆鍖哄幙: " + name + " (parent: " + parentId + ") - " + (result > 0 ? "鎴愬姛" : "澶辫触")); - } - } - - private Long getRegionIdByName(Connection connection, String name) throws SQLException { - String sql = "SELECT id FROM t_region WHERE name = ?"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, name); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return rs.getLong("id"); - } - } - return null; - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/region/RegionTableTest.java b/backend/src/test/java/com/rongyichuang/region/RegionTableTest.java deleted file mode 100644 index eb7cad7..0000000 --- a/backend/src/test/java/com/rongyichuang/region/RegionTableTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.rongyichuang.region; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.sql.*; - -@SpringBootTest -public class RegionTableTest { - - @Test - public void testRegionTableStructure() { - String url = "jdbc:mysql://localhost:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"; - String username = "root"; - String password = "123456"; - - try (Connection connection = DriverManager.getConnection(url, username, password)) { - System.out.println("=== t_region 琛ㄧ粨鏋� ==="); - - // 鑾峰彇琛ㄧ粨鏋� - DatabaseMetaData metaData = connection.getMetaData(); - ResultSet columns = metaData.getColumns(null, null, "t_region", null); - - System.out.println("瀛楁鍚峔t\t绫诲瀷\t\t\t鏄惁涓虹┖\t榛樿鍊�"); - System.out.println("----------------------------------------------------"); - - while (columns.next()) { - String columnName = columns.getString("COLUMN_NAME"); - String columnType = columns.getString("TYPE_NAME"); - int columnSize = columns.getInt("COLUMN_SIZE"); - String isNullable = columns.getString("IS_NULLABLE"); - String defaultValue = columns.getString("COLUMN_DEF"); - - System.out.printf("%-15s %-20s %-10s %s%n", - columnName, - columnType + "(" + columnSize + ")", - isNullable, - defaultValue != null ? defaultValue : "NULL" - ); - } - - // 鏌ョ湅鐜版湁鏁版嵁 - System.out.println("\n=== 鐜版湁鏁版嵁 ==="); - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT * FROM t_region ORDER BY id"); - - while (rs.next()) { - System.out.printf("ID: %d, Name: %s, PID: %s, Code: %s, State: %d%n", - rs.getLong("id"), - rs.getString("name"), - rs.getObject("pid"), - rs.getString("code"), - rs.getInt("state") - ); - } - - } catch (SQLException e) { - System.err.println("鏁版嵁搴撹繛鎺ュけ璐�: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/ActivityPlayerRegionUpdater.java b/backend/src/test/java/com/rongyichuang/tools/ActivityPlayerRegionUpdater.java deleted file mode 100644 index 7cbfb1e..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/ActivityPlayerRegionUpdater.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class ActivityPlayerRegionUpdater { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void addRegionFieldToActivityPlayer() { - System.out.println("=== 涓� t_activity_player 琛ㄦ坊鍔� region_id 瀛楁 ==="); - - try { - // 1. 妫�鏌ュ瓧娈垫槸鍚﹀凡瀛樺湪 - String checkColumnSql = """ - SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 't_activity_player' - AND COLUMN_NAME = 'region_id' - """; - - List<Map<String, Object>> existingColumns = jdbcTemplate.queryForList(checkColumnSql); - - if (!existingColumns.isEmpty()) { - System.out.println("鉁� region_id 瀛楁宸插瓨鍦紝鏃犻渶娣诲姞"); - return; - } - - // 2. 娣诲姞 region_id 瀛楁 - String addColumnSql = """ - ALTER TABLE t_activity_player - ADD COLUMN region_id bigint DEFAULT NULL COMMENT '鍖哄煙ID锛屽叧鑱攖_region琛�' - AFTER player_id - """; - - jdbcTemplate.execute(addColumnSql); - System.out.println("鉁� 鎴愬姛娣诲姞 region_id 瀛楁"); - - // 3. 娣诲姞澶栭敭绾︽潫 - try { - String addForeignKeySql = """ - ALTER TABLE t_activity_player - ADD CONSTRAINT fk_activity_player_region - FOREIGN KEY (region_id) REFERENCES t_region(id) - ON DELETE SET NULL ON UPDATE CASCADE - """; - - jdbcTemplate.execute(addForeignKeySql); - System.out.println("鉁� 鎴愬姛娣诲姞澶栭敭绾︽潫"); - } catch (Exception e) { - System.out.println("鈿狅笍 澶栭敭绾︽潫娣诲姞澶辫触锛堝彲鑳藉凡瀛樺湪锛�: " + e.getMessage()); - } - - // 4. 楠岃瘉琛ㄧ粨鏋� - String describeTableSql = """ - SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT - FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 't_activity_player' - ORDER BY ORDINAL_POSITION - """; - - List<Map<String, Object>> columns = jdbcTemplate.queryForList(describeTableSql); - System.out.println("\n=== t_activity_player 琛ㄧ粨鏋� ==="); - for (Map<String, Object> column : columns) { - System.out.println(String.format("%-20s %-15s %-10s %-15s %s", - column.get("COLUMN_NAME"), - column.get("DATA_TYPE"), - column.get("IS_NULLABLE"), - column.get("COLUMN_DEFAULT"), - column.get("COLUMN_COMMENT") - )); - } - - } catch (Exception e) { - System.err.println("鉂� 鎿嶄綔澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - - System.out.println("\n鉁� region_id 瀛楁娣诲姞瀹屾垚锛�"); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/DataInsertTest.java b/backend/src/test/java/com/rongyichuang/tools/DataInsertTest.java deleted file mode 100644 index 0da2aa3..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/DataInsertTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; - -import java.sql.*; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -public class DataInsertTest { - - private static final String URL = "jdbc:mysql://139.155.104.10:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&connectTimeout=60000&socketTimeout=60000"; - private static final String USER = "ryc"; - private static final String PASS = "KiYap3E8X8RLcM6T"; - - @Test - public void insertMockData() throws Exception { - try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) { - conn.setAutoCommit(false); - try { - // 1) 鑾峰彇涓や釜娲诲姩ID锛屼笉瓒冲垯鏈�灏忓寲琛ュ厖 - List<Long> activityIds = fetchActivityIds(conn); - if (activityIds.size() < 2) { - long a1 = insertActivity(conn, "娴嬭瘯姣旇禌A", "testA", 7); - long a2 = insertActivity(conn, "娴嬭瘯姣旇禌B", "testB", 10); - activityIds.add(a1); - activityIds.add(a2); - } - - // 2) 鎻掑叆 20 涓敤鎴凤紝骞舵敹闆嗙敓鎴愮殑 user_id - List<Long> userIds = new ArrayList<>(); - for (int i = 1; i <= 20; i++) { - long uid = insertUser(conn, "鎵归噺鐢ㄦ埛" + i, "wx_openid_batch_" + i, "wx_unionid_batch_" + i, 1, "1380001" + String.format("%04d", i)); - userIds.add(uid); - } - - // 3) 鎻掑叆 20 涓鍛橈紝姣忎釜瀛﹀憳鍏宠仈瀵瑰簲 user_id - List<Long> playerIds = new ArrayList<>(); - for (int i = 1; i <= 20; i++) { - long pid = insertPlayer(conn, - "鎵归噺瀛﹀憳" + i, - "1380014" + String.format("%04d", i), - 1, // role_id - 1, // state=1 - userIds.get(i - 1)); - playerIds.add(pid); - } - - // 4) 鎶ュ悕鍏崇郴锛氬叏閮ㄦ姤鍚� activityIds[0]锛屽墠3鍚嶅啀鎶ュ悕 activityIds[1] - for (int i = 0; i < playerIds.size(); i++) { - insertActivityPlayer(conn, activityIds.get(0), playerIds.get(i)); - if (i < 3) { - insertActivityPlayer(conn, activityIds.get(1), playerIds.get(i)); - } - } - - conn.commit(); - System.out.println("[DataInsertTest] 鎻掑叆瀹屾垚锛氱敤鎴�20銆佸鍛�20銆佹姤鍚嶅叧绯�" + (20 + 3)); - } catch (Exception ex) { - conn.rollback(); - throw ex; - } - } - } - - private List<Long> fetchActivityIds(Connection conn) throws SQLException { - List<Long> ids = new ArrayList<>(); - try (Statement st = conn.createStatement(); - ResultSet rs = st.executeQuery("SELECT id FROM t_activity ORDER BY id LIMIT 2")) { - while (rs.next()) { - ids.add(rs.getLong(1)); - } - } - return ids; - } - - private long insertActivity(Connection conn, String name, String path, int deadlineDays) throws SQLException { - String sql = "INSERT INTO t_activity (pid, path, name, signup_deadline, rating_scheme_id, state) VALUES (0, ?, ?, ?, 1, 1)"; - try (PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - ps.setString(1, path); - ps.setString(2, name); - ps.setTimestamp(3, Timestamp.valueOf(LocalDateTime.now().plusDays(deadlineDays))); - ps.executeUpdate(); - try (ResultSet keys = ps.getGeneratedKeys()) { - if (keys.next()) return keys.getLong(1); - } - } - throw new SQLException("鎻掑叆娲诲姩澶辫触"); - } - - private long insertUser(Connection conn, String name, String wxOpenId, String wxUnionId, int state, String mobile) throws SQLException { - String sql = "INSERT INTO t_user (name, wx_openid, wx_unionid, state, mobile) VALUES (?, ?, ?, ?, ?)"; - try (PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - ps.setString(1, name); - ps.setString(2, wxOpenId); - ps.setString(3, wxUnionId); - ps.setInt(4, state); - ps.setString(5, mobile); - ps.executeUpdate(); - try (ResultSet keys = ps.getGeneratedKeys()) { - if (keys.next()) return keys.getLong(1); - } - } - throw new SQLException("鎻掑叆鐢ㄦ埛澶辫触"); - } - - private long insertPlayer(Connection conn, String name, String phone, long roleId, int state, long userId) throws SQLException { - String sql = "INSERT INTO t_player (name, phone, role_id, state, user_id) VALUES (?, ?, ?, ?, ?)"; - try (PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - ps.setString(1, name); - ps.setString(2, phone); - ps.setLong(3, roleId); - ps.setInt(4, state); - ps.setLong(5, userId); - ps.executeUpdate(); - try (ResultSet keys = ps.getGeneratedKeys()) { - if (keys.next()) return keys.getLong(1); - } - } - throw new SQLException("鎻掑叆瀛﹀憳澶辫触"); - } - - // 鎻掑叆娲诲姩鎶ュ悕鏁版嵁 - private long insertActivityPlayer(Connection conn, long activityId, long playerId) throws SQLException { - String sql = "INSERT INTO t_activity_player (activity_id, player_id) VALUES (?, ?)"; - try (PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - ps.setLong(1, activityId); - ps.setLong(2, playerId); - ps.executeUpdate(); - try (ResultSet keys = ps.getGeneratedKeys()) { - if (keys.next()) return keys.getLong(1); - } - } - throw new SQLException("鎻掑叆鎶ュ悕鍏崇郴澶辫触"); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/FixCharsetAndNamesTest.java b/backend/src/test/java/com/rongyichuang/tools/FixCharsetAndNamesTest.java deleted file mode 100644 index cf66ced..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/FixCharsetAndNamesTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; - -public class FixCharsetAndNamesTest { - private static final String URL = "jdbc:mysql://139.155.104.10:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&connectTimeout=60000&socketTimeout=60000"; - private static final String USER = "ryc"; - private static final String PASS = "KiYap3E8X8RLcM6T"; - - @Test - public void fix() throws Exception { - try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) { - conn.setAutoCommit(false); - try { - // 1) 鍒楀瓧绗﹂泦鏀逛负 utf8mb4 - try (PreparedStatement ps = conn.prepareStatement( - "ALTER TABLE t_activity MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci")) { - ps.executeUpdate(); - } - try (PreparedStatement ps = conn.prepareStatement( - "ALTER TABLE t_player MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci")) { - ps.executeUpdate(); - } - // 2) 瑕嗙洊鏇存柊涓枃鍚嶇О锛堢ず渚嬫椿鍔級 - try (PreparedStatement ps = conn.prepareStatement("UPDATE t_activity SET name=? WHERE path=?")) { - ps.setString(1, "娴嬭瘯姣旇禌A"); ps.setString(2, "testA"); ps.executeUpdate(); - ps.setString(1, "娴嬭瘯姣旇禌B"); ps.setString(2, "testB"); ps.executeUpdate(); - } - conn.commit(); - System.out.println("[FixCharsetAndNamesTest] 鍒楀瓧绗﹂泦涓庝腑鏂囧悕绉颁慨澶嶅畬鎴�"); - } catch (Exception ex) { - conn.rollback(); - throw ex; - } - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/FixNamesTest.java b/backend/src/test/java/com/rongyichuang/tools/FixNamesTest.java deleted file mode 100644 index 8b901c9..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/FixNamesTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import java.sql.*; - -public class FixNamesTest { - private static final String URL = "jdbc:mysql://139.155.104.10:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&connectTimeout=60000&socketTimeout=60000"; - private static final String USER = "ryc"; - private static final String PASS = "KiYap3E8X8RLcM6T"; - - @Test - public void fixChineseNames() throws Exception { - try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) { - conn.setAutoCommit(false); - try { - // 淇娲诲姩涓枃鍚嶇О - try (PreparedStatement ps = conn.prepareStatement("UPDATE t_activity SET name=? WHERE path=?")) { - ps.setString(1, "娴嬭瘯姣旇禌A"); ps.setString(2, "testA"); ps.executeUpdate(); - ps.setString(1, "娴嬭瘯姣旇禌B"); ps.setString(2, "testB"); ps.executeUpdate(); - } - // 淇瀛﹀憳涓枃鍚嶇О锛氭牴鎹墜鏈哄彿灏惧彿璁剧疆涓衡�滄壒閲忓鍛榅鈥� - try (PreparedStatement sel = conn.prepareStatement("SELECT id, phone FROM t_player"); - ResultSet rs = sel.executeQuery()) { - while (rs.next()) { - long id = rs.getLong("id"); - String phone = rs.getString("phone"); - String tail = phone != null && phone.length() >= 2 ? phone.substring(phone.length() - 2) : "01"; - // 瑙f瀽涓烘暟瀛楃储寮曪紙閬垮厤鍓嶅闆堕棶棰橈級 - int idx; - try { idx = Integer.parseInt(tail); } catch (Exception e) { idx = 1; } - String name = "鎵归噺瀛﹀憳" + idx; - try (PreparedStatement upd = conn.prepareStatement("UPDATE t_player SET name=? WHERE id=?")) { - upd.setString(1, name); - upd.setLong(2, id); - upd.executeUpdate(); - } - } - } - conn.commit(); - System.out.println("[FixNamesTest] 涓枃鍚嶇О淇瀹屾垚"); - } catch (Exception ex) { - conn.rollback(); - throw ex; - } - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateFixer.java b/backend/src/test/java/com/rongyichuang/tools/RatingTemplateFixer.java deleted file mode 100644 index ef7b2bd..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateFixer.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class RatingTemplateFixer { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void fixRatingTemplateData() { - System.out.println("=== 淇璇勫垎妯℃澘鏁版嵁 ==="); - - // 1. 鏇存柊娲诲姩琛ㄧ殑rating_scheme_id涓�1 - String updateActivitySql = "UPDATE t_activity SET rating_scheme_id = 1 WHERE id = 1"; - int activityResult = jdbcTemplate.update(updateActivitySql); - System.out.println("鏇存柊娲诲姩璇勫垎妯℃澘閰嶇疆缁撴灉: " + activityResult); - - // 2. 鏇存柊鎵�鏈夎瘎鍒嗛」鐩殑scheme_id涓�1 - String[] updateItemSqls = { - "UPDATE t_rating_item SET scheme_id = 1, name = '浠g爜璐ㄩ噺', max_score = 30, order_no = 1 WHERE id = 1", - "UPDATE t_rating_item SET scheme_id = 1, name = '鍔熻兘瀹屾暣鎬�', max_score = 25, order_no = 2 WHERE id = 2", - "UPDATE t_rating_item SET scheme_id = 1, name = '鐢ㄦ埛浣撻獙', max_score = 20, order_no = 3 WHERE id = 3", - "UPDATE t_rating_item SET scheme_id = 1, name = '鍒涙柊鎬�', max_score = 15, order_no = 4 WHERE id = 4", - "UPDATE t_rating_item SET scheme_id = 1, name = '椤圭洰灞曠ず', max_score = 10, order_no = 5 WHERE id = 5" - }; - - for (int i = 0; i < updateItemSqls.length; i++) { - try { - int itemResult = jdbcTemplate.update(updateItemSqls[i]); - System.out.println("鏇存柊璇勫垎椤圭洰 " + (i + 1) + " 缁撴灉: " + itemResult); - } catch (Exception e) { - System.err.println("鏇存柊璇勫垎椤圭洰 " + (i + 1) + " 澶辫触: " + e.getMessage()); - } - } - - // 3. 鍒犻櫎澶氫綑鐨勮瘎鍒嗛」鐩紙ID 6, 7, 8锛� - String deleteExtraItemsSql = "DELETE FROM t_rating_item WHERE id IN (6, 7, 8)"; - int deleteResult = jdbcTemplate.update(deleteExtraItemsSql); - System.out.println("鍒犻櫎澶氫綑璇勫垎椤圭洰缁撴灉: " + deleteResult); - - // 4. 楠岃瘉淇缁撴灉 - System.out.println("\n=== 楠岃瘉淇缁撴灉 ==="); - - // 鏌ヨ璇勫垎妯℃澘 - String schemeSql = "SELECT * FROM t_rating_scheme WHERE id = 1"; - List<Map<String, Object>> schemes = jdbcTemplate.queryForList(schemeSql); - System.out.println("璇勫垎妯℃澘:"); - for (Map<String, Object> scheme : schemes) { - System.out.println(scheme); - } - - // 鏌ヨ璇勫垎椤圭洰 - String itemSql = "SELECT * FROM t_rating_item WHERE scheme_id = 1 ORDER BY order_no"; - List<Map<String, Object>> items = jdbcTemplate.queryForList(itemSql); - System.out.println("\n璇勫垎椤圭洰:"); - for (Map<String, Object> item : items) { - System.out.println(item); - } - - // 鏌ヨ娲诲姩閰嶇疆 - String activitySql = "SELECT id, name, rating_scheme_id FROM t_activity WHERE id = 1"; - List<Map<String, Object>> activities = jdbcTemplate.queryForList(activitySql); - System.out.println("\n娲诲姩閰嶇疆:"); - for (Map<String, Object> activity : activities) { - System.out.println(activity); - } - - // 璁$畻鎬诲垎 - String totalScoreSql = """ - SELECT - rs.name as scheme_name, - SUM(ri.max_score) as total_max_score - FROM t_rating_scheme rs - LEFT JOIN t_rating_item ri ON rs.id = ri.scheme_id - WHERE rs.id = 1 - GROUP BY rs.id, rs.name - """; - List<Map<String, Object>> totalResults = jdbcTemplate.queryForList(totalScoreSql); - System.out.println("\n鎬诲垎楠岃瘉:"); - for (Map<String, Object> row : totalResults) { - System.out.println(row); - } - - System.out.println("\n鉁� 璇勫垎妯℃澘鏁版嵁淇瀹屾垚锛�"); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateInserter.java b/backend/src/test/java/com/rongyichuang/tools/RatingTemplateInserter.java deleted file mode 100644 index 4a0c3bb..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateInserter.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -@ActiveProfiles("test") -public class RatingTemplateInserter { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void insertRatingTemplate() { - System.out.println("寮�濮嬫彃鍏ヨ瘎鍒嗘ā鏉挎暟鎹�..."); - - try { - // 1. 鎻掑叆璇勫垎妯℃澘 - String insertSchemeSql = """ - INSERT INTO t_rating_scheme (id, name, description, state, create_time, create_user_id, update_time, update_user_id, version) - VALUES (1, '缂栫▼澶ц禌璇勫垎鏍囧噯', '鐢ㄤ簬缂栫▼姣旇禌鐨勭患鍚堣瘎鍒嗘爣鍑嗭紝鍖呭惈浠g爜璐ㄩ噺銆佸姛鑳藉畬鏁存�с�佺敤鎴蜂綋楠屻�佸垱鏂版�у拰椤圭洰灞曠ず绛夌淮搴�', 1, NOW(), 1, NOW(), 1, 0) - ON DUPLICATE KEY UPDATE - name = VALUES(name), - description = VALUES(description), - update_time = NOW() - """; - - int schemeResult = jdbcTemplate.update(insertSchemeSql); - System.out.println("鎻掑叆璇勫垎妯℃澘缁撴灉: " + schemeResult); - - // 2. 鎻掑叆璇勫垎椤圭洰 - String[] insertItemSqls = { - "INSERT INTO t_rating_item (id, scheme_id, name, max_score, order_no, state, create_time, create_user_id, update_time, update_user_id, version) VALUES (1, 1, '浠g爜璐ㄩ噺', 30, 1, 1, NOW(), 1, NOW(), 1, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), max_score = VALUES(max_score), order_no = VALUES(order_no), state = VALUES(state), update_time = NOW()", - "INSERT INTO t_rating_item (id, scheme_id, name, max_score, order_no, state, create_time, create_user_id, update_time, update_user_id, version) VALUES (2, 1, '鍔熻兘瀹屾暣鎬�', 25, 2, 1, NOW(), 1, NOW(), 1, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), max_score = VALUES(max_score), order_no = VALUES(order_no), state = VALUES(state), update_time = NOW()", - "INSERT INTO t_rating_item (id, scheme_id, name, max_score, order_no, state, create_time, create_user_id, update_time, update_user_id, version) VALUES (3, 1, '鐢ㄦ埛浣撻獙', 20, 3, 1, NOW(), 1, NOW(), 1, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), max_score = VALUES(max_score), order_no = VALUES(order_no), state = VALUES(state), update_time = NOW()", - "INSERT INTO t_rating_item (id, scheme_id, name, max_score, order_no, state, create_time, create_user_id, update_time, update_user_id, version) VALUES (4, 1, '鍒涙柊鎬�', 15, 4, 1, NOW(), 1, NOW(), 1, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), max_score = VALUES(max_score), order_no = VALUES(order_no), state = VALUES(state), update_time = NOW()", - "INSERT INTO t_rating_item (id, scheme_id, name, max_score, order_no, state, create_time, create_user_id, update_time, update_user_id, version) VALUES (5, 1, '椤圭洰灞曠ず', 10, 5, 1, NOW(), 1, NOW(), 1, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), max_score = VALUES(max_score), order_no = VALUES(order_no), state = VALUES(state), update_time = NOW()" - }; - - for (int i = 0; i < insertItemSqls.length; i++) { - try { - System.out.println("鎵цSQL: " + insertItemSqls[i]); - int itemResult = jdbcTemplate.update(insertItemSqls[i]); - System.out.println("鎻掑叆璇勫垎椤圭洰 " + (i + 1) + " 缁撴灉: " + itemResult); - } catch (Exception e) { - System.err.println("鎻掑叆璇勫垎椤圭洰 " + (i + 1) + " 澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } - - // 3. 楠岃瘉鎻掑叆缁撴灉 - System.out.println("\n=== 楠岃瘉鎻掑叆缁撴灉 ==="); - - // 鏌ヨ璇勫垎妯℃澘 - String querySchemeSql = "SELECT * FROM t_rating_scheme WHERE id = 1"; - List<Map<String, Object>> schemeResults = jdbcTemplate.queryForList(querySchemeSql); - System.out.println("璇勫垎妯℃澘:"); - for (Map<String, Object> row : schemeResults) { - System.out.println(row); - } - - // 鏌ヨ璇勫垎椤圭洰 - String queryItemSql = "SELECT * FROM t_rating_item WHERE scheme_id = 1 ORDER BY order_no"; - List<Map<String, Object>> itemResults = jdbcTemplate.queryForList(queryItemSql); - System.out.println("\n璇勫垎椤圭洰:"); - for (Map<String, Object> row : itemResults) { - System.out.println(row); - } - - // 璁$畻鎬诲垎 - String totalScoreSql = """ - SELECT - rs.name as scheme_name, - SUM(ri.max_score) as total_max_score - FROM t_rating_scheme rs - LEFT JOIN t_rating_item ri ON rs.id = ri.scheme_id - WHERE rs.id = 1 - GROUP BY rs.id, rs.name - """; - List<Map<String, Object>> totalResults = jdbcTemplate.queryForList(totalScoreSql); - System.out.println("\n鎬诲垎楠岃瘉:"); - for (Map<String, Object> row : totalResults) { - System.out.println(row); - } - - System.out.println("\n鉁� 璇勫垎妯℃澘鏁版嵁鎻掑叆瀹屾垚锛�"); - - } catch (Exception e) { - System.err.println("鉂� 鎻掑叆璇勫垎妯℃澘鏁版嵁澶辫触: " + e.getMessage()); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateVerifier.java b/backend/src/test/java/com/rongyichuang/tools/RatingTemplateVerifier.java deleted file mode 100644 index 66b64cc..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/RatingTemplateVerifier.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -public class RatingTemplateVerifier { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - public void verifyRatingTemplateData() { - System.out.println("=== 楠岃瘉璇勫垎妯℃澘鏁版嵁 ==="); - - // 鏌ヨ璇勫垎妯℃澘 - String schemeSql = "SELECT * FROM t_rating_scheme WHERE id = 1"; - List<Map<String, Object>> schemes = jdbcTemplate.queryForList(schemeSql); - - System.out.println("璇勫垎妯℃澘鏁版嵁:"); - for (Map<String, Object> scheme : schemes) { - System.out.println(scheme); - } - - // 鏌ヨ鎵�鏈夎瘎鍒嗛」鐩� - String allItemSql = "SELECT * FROM t_rating_item ORDER BY id"; - List<Map<String, Object>> allItems = jdbcTemplate.queryForList(allItemSql); - - System.out.println("\n鎵�鏈夎瘎鍒嗛」鐩暟鎹�:"); - for (Map<String, Object> item : allItems) { - System.out.println(item); - } - - // 鏌ヨ鐗瑰畾scheme_id鐨勮瘎鍒嗛」鐩� - String itemSql = "SELECT * FROM t_rating_item WHERE scheme_id = 1 ORDER BY order_no"; - List<Map<String, Object>> items = jdbcTemplate.queryForList(itemSql); - - System.out.println("\nscheme_id=1鐨勮瘎鍒嗛」鐩暟鎹�:"); - for (Map<String, Object> item : items) { - System.out.println(item); - } - - // 鏌ヨ娲诲姩鐨勮瘎鍒嗘ā鏉块厤缃� - String activitySql = "SELECT id, name, rating_scheme_id FROM t_activity WHERE id = 1"; - List<Map<String, Object>> activities = jdbcTemplate.queryForList(activitySql); - - System.out.println("\n娲诲姩璇勫垎妯℃澘閰嶇疆:"); - for (Map<String, Object> activity : activities) { - System.out.println(activity); - } - - System.out.println("\n鉁� 璇勫垎妯℃澘鏁版嵁楠岃瘉瀹屾垚锛�"); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/SchemaDumpTest.java b/backend/src/test/java/com/rongyichuang/tools/SchemaDumpTest.java deleted file mode 100644 index 8c06d79..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/SchemaDumpTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; - -import java.sql.*; -import java.nio.file.*; -import java.util.HashMap; -import java.util.Map; - -public class SchemaDumpTest { - - @Test - public void dump() { - String url = "jdbc:mysql://140.143.152.226:3308/ryc?useSSL=false&useUnicode=true&characterEncoding=utf8"; - String user = "openai"; - String pass = "Xml@uk2025"; - - StringBuilder sb = new StringBuilder(); - sb.append("-- Database schema dump for ryc\n"); - - try (Connection conn = DriverManager.getConnection(url, user, pass)) { - System.out.println("[SchemaDump] Connected to MySQL."); - - String sqlTables = "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ryc' ORDER BY TABLE_NAME"; - String sqlCols = "SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT, EXTRA, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='ryc' ORDER BY TABLE_NAME, ORDINAL_POSITION"; - - // Collect table comments - Map<String, String> tableComments = new HashMap<>(); - try (Statement st = conn.createStatement(); ResultSet rt = st.executeQuery(sqlTables)) { - while (rt.next()) { - tableComments.put(rt.getString("TABLE_NAME"), rt.getString("TABLE_COMMENT")); - } - } - - try (Statement st = conn.createStatement(); ResultSet rc = st.executeQuery(sqlCols)) { - String currentTable = null; - while (rc.next()) { - String table = rc.getString("TABLE_NAME"); - if (!table.equals(currentTable)) { - // close previous table - if (currentTable != null) { - int lastComma = sb.lastIndexOf(",\n"); - if (lastComma >= 0) sb.delete(lastComma, lastComma + 2); - sb.append("\n);\n"); - } - currentTable = table; - - String tComment = tableComments.getOrDefault(table, ""); - sb.append("\n-- Table: ").append(table); - if (tComment != null && !tComment.isEmpty()) { - sb.append(" -- ").append(tComment); - } - sb.append("\n"); - sb.append("CREATE TABLE ").append(table).append(" (\n"); - } - - String col = rc.getString("COLUMN_NAME"); - String type = rc.getString("COLUMN_TYPE"); - String nullable = rc.getString("IS_NULLABLE"); - String def = rc.getString("COLUMN_DEFAULT"); - String comment = rc.getString("COLUMN_COMMENT"); - String extra = rc.getString("EXTRA"); - - sb.append(" `").append(col).append("` ").append(type); - if ("NO".equals(nullable)) sb.append(" NOT NULL"); - if (def != null) { - sb.append(" DEFAULT '").append(def.replace("'", "''")).append("'"); - } - if (extra != null && !extra.isEmpty()) sb.append(" ").append(extra); - if (comment != null && !comment.isEmpty()) { - sb.append(" COMMENT '").append(comment.replace("'", "''")).append("'"); - } - sb.append(",\n"); - } - if (currentTable != null) { - int lastComma = sb.lastIndexOf(",\n"); - if (lastComma >= 0) sb.delete(lastComma, lastComma + 2); - sb.append("\n);\n"); - } - } - - } catch (Exception e) { - System.err.println("[SchemaDump] Error: " + e.getMessage()); - // 涓嶄腑鏂紝浠嶅皾璇曞啓鍏ュ凡鏀堕泦鍐呭 - } - - try { - Path out = Paths.get("d:/code/new-ryc/db.sql"); - Files.writeString(out, sb.toString()); - System.out.println("[SchemaDump] Written to " + out.toString()); - } catch (Exception writeErr) { - System.err.println("[SchemaDump] Write file error: " + writeErr.getMessage()); - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/tools/StageIdFixTest.java b/backend/src/test/java/com/rongyichuang/tools/StageIdFixTest.java deleted file mode 100644 index 53eb3fa..0000000 --- a/backend/src/test/java/com/rongyichuang/tools/StageIdFixTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.rongyichuang.tools; - -import org.junit.jupiter.api.Test; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; - -public class StageIdFixTest { - - // 涓� application.yml 淇濇寔涓�鑷达紝骞跺姞闀胯秴鏃� - private static final String URL = "jdbc:mysql://139.155.104.10:3306/ryc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&connectTimeout=60000&socketTimeout=60000"; - private static final String USER = "ryc"; - private static final String PASS = "KiYap3E8X8RLcM6T"; - - @Test - public void fixStageId() throws Exception { - try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) { - conn.setAutoCommit(false); - - // 瑙勫垯锛氭寜姣忎釜姣旇禌閫夋嫨鍏剁涓�涓樁娈碉紙鏈�灏廔D锛夛紱鑻ユ棤闃舵锛屽垯鍥炲~涓烘瘮璧涜嚜韬� activity_id - String sql = """ -UPDATE t_activity_player ap -LEFT JOIN ( - SELECT child.pid AS activity_id, MIN(child.id) AS stage_id - FROM t_activity child - WHERE child.pid IS NOT NULL AND child.pid <> 0 - GROUP BY child.pid -) s ON s.activity_id = ap.activity_id -SET ap.stage_id = COALESCE(s.stage_id, ap.activity_id) -"""; - - try (PreparedStatement ps = conn.prepareStatement(sql)) { - int affected = ps.executeUpdate(); - conn.commit(); - System.out.println("[StageIdFixTest] 鏇存柊瀹屾垚锛屽彈褰卞搷琛屾暟=" + affected); - } catch (Exception ex) { - conn.rollback(); - throw ex; - } - } - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/rongyichuang/user/SaveUserPhoneTest.java b/backend/src/test/java/com/rongyichuang/user/SaveUserPhoneTest.java deleted file mode 100644 index 4256fa2..0000000 --- a/backend/src/test/java/com/rongyichuang/user/SaveUserPhoneTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.rongyichuang.user; - -import com.rongyichuang.user.entity.User; -import com.rongyichuang.user.service.UserService; -import com.rongyichuang.user.repository.UserRepository; -import com.rongyichuang.employee.entity.Employee; -import com.rongyichuang.employee.repository.EmployeeRepository; -import com.rongyichuang.judge.entity.Judge; -import com.rongyichuang.judge.repository.JudgeRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * 娴嬭瘯saveUserPhone鏂规硶鐨勫姛鑳� - */ -@SpringBootTest -@ActiveProfiles("test") -@Transactional -public class SaveUserPhoneTest { - - @Autowired - private UserService userService; - - @Autowired - private UserRepository userRepository; - - @Autowired - private EmployeeRepository employeeRepository; - - @Autowired - private JudgeRepository judgeRepository; - - @Test - public void testSaveUserPhoneNewPhone() { - System.out.println("=== 娴嬭瘯鍦烘櫙1锛氫繚瀛樻柊鎵嬫満鍙� ==="); - - // 鍒涘缓涓�涓湁openid鐨勭敤鎴� - User user = new User(); - user.setName("娴嬭瘯鐢ㄦ埛"); - user.setWxOpenid("test_openid_123"); - user = userRepository.save(user); - - // 淇濆瓨鎵嬫満鍙凤紙浣跨敤鏃堕棿鎴崇‘淇濆敮涓�鎬э級 - String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - User result = userService.saveUserPhone(user.getId(), phone); - - // 楠岃瘉缁撴灉 - assertEquals(phone, result.getPhone()); - System.out.println("鉁� 鎴愬姛淇濆瓨鏂版墜鏈哄彿: " + phone); - } - - @Test - public void testSaveUserPhoneSameUser() { - System.out.println("=== 娴嬭瘯鍦烘櫙2锛氫繚瀛樼浉鍚岀敤鎴风殑鎵嬫満鍙� ==="); - - // 鍒涘缓涓�涓凡鏈夋墜鏈哄彿鐨勭敤鎴� - String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - User user = new User(); - user.setName("娴嬭瘯鐢ㄦ埛"); - user.setPhone(phone); - user.setWxOpenid("test_openid_456"); - user = userRepository.save(user); - - // 鍐嶆淇濆瓨鐩稿悓鎵嬫満鍙� - User result = userService.saveUserPhone(user.getId(), phone); - - // 楠岃瘉缁撴灉 - assertEquals(phone, result.getPhone()); - System.out.println("鉁� 鐩稿悓鐢ㄦ埛鎵嬫満鍙锋棤闇�鏇存柊"); - } - - @Test - public void testSaveUserPhoneWithDataMigration() { - System.out.println("=== 娴嬭瘯鍦烘櫙3锛氭暟鎹縼绉诲満鏅� ==="); - - // 鍒涘缓涓�涓病鏈塷penid浣嗘湁鎵嬫満鍙风殑鐢ㄦ埛锛堣�佺敤鎴凤級 - String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - User oldUser = new User(); - oldUser.setName("鑰佺敤鎴�"); - oldUser.setPhone(phone); - // 娉ㄦ剰锛氭病鏈夎缃畐xOpenid - oldUser = userRepository.save(oldUser); - - // 涓鸿�佺敤鎴峰垱寤哄憳宸ヤ俊鎭� - Employee employee = new Employee(); - employee.setName("鑰佺敤鎴峰憳宸�"); - employee.setPhone(phone); - employee.setUserId(oldUser.getId()); - employee.setRoleId("EMPLOYEE"); - employee = employeeRepository.save(employee); - - // 鍒涘缓涓�涓湁openid鐨勬柊鐢ㄦ埛锛堝井淇$敤鎴凤級 - User newUser = new User(); - newUser.setName("鏂扮敤鎴�"); - newUser.setWxOpenid("test_openid_789"); - newUser = userRepository.save(newUser); - - // 鏂扮敤鎴峰皾璇曚繚瀛樿�佺敤鎴风殑鎵嬫満鍙� - User result = userService.saveUserPhone(newUser.getId(), phone); - - // 楠岃瘉缁撴灉 - assertEquals(phone, result.getPhone()); - - // 楠岃瘉鑰佺敤鎴风殑鎵嬫満鍙疯娓呯┖ - User updatedOldUser = userRepository.findById(oldUser.getId()).orElse(null); - assertNotNull(updatedOldUser); - assertNull(updatedOldUser.getPhone()); - - // 楠岃瘉鍛樺伐淇℃伅琚縼绉诲埌鏂扮敤鎴� - Employee updatedEmployee = employeeRepository.findById(employee.getId()).orElse(null); - assertNotNull(updatedEmployee); - assertEquals(newUser.getId(), updatedEmployee.getUserId()); - - System.out.println("鉁� 鏁版嵁杩佺Щ鎴愬姛瀹屾垚"); - System.out.println(" - 鑰佺敤鎴锋墜鏈哄彿宸叉竻绌�"); - System.out.println(" - 鍛樺伐淇℃伅宸茶縼绉诲埌鏂扮敤鎴�"); - } - - @Test - public void testSaveUserPhoneConflictResolution() { - System.out.println("=== 娴嬭瘯鍦烘櫙4锛氬啿绐佸鐞� ==="); - - // 鍒涘缓涓�涓湁openid鍜屾墜鏈哄彿鐨勭敤鎴稟 - String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - User userA = new User(); - userA.setName("鐢ㄦ埛A"); - userA.setPhone(phone); - userA.setWxOpenid("test_openid_A"); - userA = userRepository.save(userA); - - // 鍒涘缓涓�涓湁openid鐨勭敤鎴稡 - User userB = new User(); - userB.setName("鐢ㄦ埛B"); - userB.setWxOpenid("test_openid_B"); - userB = userRepository.save(userB); - - // 鐢ㄦ埛B灏濊瘯淇濆瓨鐢ㄦ埛A鐨勬墜鏈哄彿锛堝簲璇ユ姏鍑哄紓甯革級 - final Long userBId = userB.getId(); - assertThrows(RuntimeException.class, () -> { - userService.saveUserPhone(userBId, phone); - }); - - System.out.println("鉁� 姝g‘澶勭悊浜嗗啿绐佹儏鍐�"); - } - - @Test - public void testSaveUserPhoneComplexDataMigration() { - System.out.println("=== 娴嬭瘯鍦烘櫙5锛氬鏉傛暟鎹縼绉� ==="); - - // 鍒涘缓涓�涓病鏈塷penid浣嗘湁鎵嬫満鍙风殑鐢ㄦ埛锛堣�佺敤鎴凤級 - String phone = "139" + String.valueOf(System.currentTimeMillis()).substring(5); - User oldUser = new User(); - oldUser.setName("鑰佺敤鎴�"); - oldUser.setPhone(phone); - oldUser = userRepository.save(oldUser); - - // 涓鸿�佺敤鎴峰垱寤哄憳宸ュ拰瑁佸垽淇℃伅 - Employee employee = new Employee(); - employee.setName("鑰佺敤鎴峰憳宸�"); - employee.setPhone(phone); - employee.setUserId(oldUser.getId()); - employee.setRoleId("EMPLOYEE"); - employee = employeeRepository.save(employee); - - Judge judge = new Judge(); - judge.setName("鑰佺敤鎴疯鍒�"); - judge.setPhone(phone); - judge.setUserId(oldUser.getId()); - judge = judgeRepository.save(judge); - - // 鍒涘缓涓�涓湁openid鐨勬柊鐢ㄦ埛锛堝井淇$敤鎴凤級 - User newUser = new User(); - newUser.setName("鏂扮敤鎴�"); - newUser.setWxOpenid("test_openid_complex"); - newUser = userRepository.save(newUser); - - // 鏂扮敤鎴峰皾璇曚繚瀛樿�佺敤鎴风殑鎵嬫満鍙� - User result = userService.saveUserPhone(newUser.getId(), phone); - - // 楠岃瘉缁撴灉 - assertEquals(phone, result.getPhone()); - - // 楠岃瘉鑰佺敤鎴风殑鎵嬫満鍙疯娓呯┖ - User updatedOldUser = userRepository.findById(oldUser.getId()).orElse(null); - assertNotNull(updatedOldUser); - assertNull(updatedOldUser.getPhone()); - - // 楠岃瘉鍛樺伐淇℃伅琚縼绉诲埌鏂扮敤鎴� - Employee updatedEmployee = employeeRepository.findById(employee.getId()).orElse(null); - assertNotNull(updatedEmployee); - assertEquals(newUser.getId(), updatedEmployee.getUserId()); - - // 楠岃瘉璇勫淇℃伅琚縼绉诲埌鏂扮敤鎴� - Judge updatedJudge = judgeRepository.findById(judge.getId()).orElse(null); - assertNotNull(updatedJudge); - assertEquals(newUser.getId(), updatedJudge.getUserId()); - - System.out.println("鉁� 澶嶆潅鏁版嵁杩佺Щ鎴愬姛瀹屾垚"); - System.out.println(" - 鑰佺敤鎴锋墜鏈哄彿宸叉竻绌�"); - System.out.println(" - 鍛樺伐淇℃伅宸茶縼绉诲埌鏂扮敤鎴�"); - System.out.println(" - 璇勫淇℃伅宸茶縼绉诲埌鏂扮敤鎴�"); - } -} \ No newline at end of file diff --git a/backend/src/test/resources/application.properties b/backend/src/test/resources/application.properties deleted file mode 100644 index a823ad4..0000000 --- a/backend/src/test/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Test specific properties -server.servlet.context-path= \ No newline at end of file diff --git a/backend/src/test/resources/graphql/test-save-judge-with-tags.graphql b/backend/src/test/resources/graphql/test-save-judge-with-tags.graphql deleted file mode 100644 index 29caa06..0000000 --- a/backend/src/test/resources/graphql/test-save-judge-with-tags.graphql +++ /dev/null @@ -1,22 +0,0 @@ -mutation { - saveJudge(input: { - name: "%s", - phone: "%s", - gender: %d, - description: "%s", - avatarMediaId: %s, - specialtyIds: [%s] - }) { - id - name - phone - gender - description - avatarUrl - specialties { - id - name - code - } - } -} \ No newline at end of file diff --git a/backend/src/test/resources/graphql/test-save-judge.graphql b/backend/src/test/resources/graphql/test-save-judge.graphql deleted file mode 100644 index 69401cb..0000000 --- a/backend/src/test/resources/graphql/test-save-judge.graphql +++ /dev/null @@ -1,11 +0,0 @@ -mutation { - saveJudge(input: { - name: "%s", - phone: "%s", - avatarMediaId: "%s", - specialtyIds: [] - }) { - id - name - } -} \ No newline at end of file diff --git a/backend/src/test/resources/graphql/test-save-media.graphql b/backend/src/test/resources/graphql/test-save-media.graphql deleted file mode 100644 index f2e37ac..0000000 --- a/backend/src/test/resources/graphql/test-save-media.graphql +++ /dev/null @@ -1,15 +0,0 @@ -mutation { - saveMedia( - fileName: "%s", - filePath: "%s", - fileSize: %d, - fileType: "%s", - storageType: "%s", - bucketName: "%s", - region: "%s", - targetType: %d, - targetId: %d - ) { - id - } -} \ No newline at end of file diff --git a/clear_tables.sql b/clear_tables.sql deleted file mode 100644 index e9ab42b..0000000 --- a/clear_tables.sql +++ /dev/null @@ -1,42 +0,0 @@ --- 娓呯┖鎸囧畾琛ㄧ殑鏁版嵁 --- 鎸夌収澶栭敭渚濊禆鍏崇郴鐨勯『搴忓垹闄� - -SET FOREIGN_KEY_CHECKS = 0; - --- 娓呯┖璇勫垎鐩稿叧琛� -DELETE FROM t_activity_rating_item; -DELETE FROM t_activity_rating; - --- 娓呯┖娲诲姩閫夋墜琛� -DELETE FROM t_activity_player; - --- 娓呯┖娲诲姩璇勫琛� -DELETE FROM t_activity_judge; - --- 娓呯┖閫夋墜琛� -DELETE FROM t_player; - --- 娓呯┖娲诲姩琛� -DELETE FROM t_activity; - -SET FOREIGN_KEY_CHECKS = 1; - --- 楠岃瘉娓呯┖缁撴灉 -SELECT 'Tables cleared successfully' as result; -SELECT - 't_activity' as table_name, COUNT(*) as record_count FROM t_activity -UNION ALL -SELECT - 't_activity_player' as table_name, COUNT(*) as record_count FROM t_activity_player -UNION ALL -SELECT - 't_activity_judge' as table_name, COUNT(*) as record_count FROM t_activity_judge -UNION ALL -SELECT - 't_activity_rating' as table_name, COUNT(*) as record_count FROM t_activity_rating -UNION ALL -SELECT - 't_activity_rating_item' as table_name, COUNT(*) as record_count FROM t_activity_rating_item -UNION ALL -SELECT - 't_player' as table_name, COUNT(*) as record_count FROM t_player; \ No newline at end of file diff --git a/fix-roles.ps1 b/fix-roles.ps1 deleted file mode 100644 index e301f01..0000000 --- a/fix-roles.ps1 +++ /dev/null @@ -1,81 +0,0 @@ -# Fix employee role codes -$API_URL = "http://localhost:8080/api/graphql" -$TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIyIiwicGhvbmUiOiIxMzk4MTk3MDgxNiIsImlhdCI6MTc1OTMyMzk3MSwiZXhwIjoxNzU5NDEwMzcxfQ.z8n5QuCpALluVJD9JShNsjQSaPqm91HcKV-5PB3jLN4" - -$headers = @{ - "Content-Type" = "application/json" - "Authorization" = "Bearer $TOKEN" -} - -Write-Host "Getting employees..." -$employeesQuery = '{"query":"query { employees { id name phone roleId description } }"}' -$employeesResponse = Invoke-RestMethod -Uri $API_URL -Method POST -Headers $headers -Body $employeesQuery -$employees = $employeesResponse.data.employees - -Write-Host "Found $($employees.Count) employees" - -Write-Host "Getting valid roles..." -$rolesQuery = '{"query":"query { activeRoles { id code name description } }"}' -$rolesResponse = Invoke-RestMethod -Uri $API_URL -Method POST -Headers $headers -Body $rolesQuery -$validRoles = $rolesResponse.data.activeRoles - -$validRoleCodes = $validRoles | ForEach-Object { $_.code } -$invalidEmployees = $employees | Where-Object { $_.roleId -notin $validRoleCodes } - -if ($invalidEmployees.Count -eq 0) { - Write-Host "All employee role codes are valid!" - exit 0 -} - -Write-Host "Found $($invalidEmployees.Count) employees with invalid role codes" - -$roleMapping = @{ - "MANAGER" = "SUPER_ADMIN" - "EMPLOYEE" = "AUDITOR" - "ADMIN" = "SUPER_ADMIN" -} - -$fixedCount = 0 -$errorCount = 0 - -foreach ($emp in $invalidEmployees) { - $newRoleId = $roleMapping[$emp.roleId] - if (-not $newRoleId) { - $newRoleId = "AUDITOR" - } - - Write-Host "Fixing employee $($emp.name): $($emp.roleId) -> $newRoleId" - - $mutationBody = @{ - query = 'mutation SaveEmployee($input: EmployeeInput!) { saveEmployee(input: $input) { id name roleId } }' - variables = @{ - input = @{ - id = [int]$emp.id - name = $emp.name - phone = $emp.phone - roleId = $newRoleId - description = $emp.description - } - } - } - - $mutation = $mutationBody | ConvertTo-Json -Depth 10 - - try { - $result = Invoke-RestMethod -Uri $API_URL -Method POST -Headers $headers -Body $mutation - if ($result.errors) { - Write-Host " Error: $($result.errors[0].message)" -ForegroundColor Red - $errorCount++ - } else { - Write-Host " Success!" -ForegroundColor Green - $fixedCount++ - } - } catch { - Write-Host " Exception: $($_.Exception.Message)" -ForegroundColor Red - $errorCount++ - } -} - -Write-Host "Fix completed!" -Write-Host "Successfully fixed: $fixedCount employees" -Write-Host "Failed to fix: $errorCount employees" \ No newline at end of file diff --git a/fix_employee_roles.sql b/fix_employee_roles.sql deleted file mode 100644 index 5cd23ba..0000000 --- a/fix_employee_roles.sql +++ /dev/null @@ -1,27 +0,0 @@ --- 淇鍛樺伐琛ㄤ腑鐨勬棤鏁堣鑹蹭唬鐮� --- 灏嗘棤鏁堢殑瑙掕壊浠g爜鏇挎崲涓烘湁鏁堢殑瑙掕壊浠g爜 - --- 鏌ョ湅褰撳墠鍛樺伐琛ㄤ腑鐨勮鑹蹭唬鐮佸垎甯� -SELECT role_id, COUNT(*) as count FROM t_employee WHERE state = 1 GROUP BY role_id; - --- 鏌ョ湅鏈夋晥鐨勮鑹蹭唬鐮� -SELECT code, name FROM t_role WHERE state = 1; - --- 淇鏃犳晥鐨勮鑹蹭唬鐮� --- MANAGER -> SUPER_ADMIN (绠$悊鍛�) -UPDATE t_employee SET role_id = 'SUPER_ADMIN' WHERE role_id = 'MANAGER' AND state = 1; - --- EMPLOYEE -> AUDITOR (骞冲彴宸ヤ綔浜哄憳) -UPDATE t_employee SET role_id = 'AUDITOR' WHERE role_id = 'EMPLOYEE' AND state = 1; - --- ADMIN -> SUPER_ADMIN (瓒呯骇绠$悊鍛�) -UPDATE t_employee SET role_id = 'SUPER_ADMIN' WHERE role_id = 'ADMIN' AND state = 1; - --- 楠岃瘉淇缁撴灉 -SELECT role_id, COUNT(*) as count FROM t_employee WHERE state = 1 GROUP BY role_id; - --- 妫�鏌ユ槸鍚﹁繕鏈夋棤鏁堢殑瑙掕壊浠g爜 -SELECT e.id, e.name, e.role_id -FROM t_employee e -LEFT JOIN t_role r ON e.role_id = r.code AND r.state = 1 -WHERE e.state = 1 AND r.code IS NULL; \ No newline at end of file diff --git a/project.md b/project.md index b901c1f..c362bd5 100644 --- a/project.md +++ b/project.md @@ -190,7 +190,7 @@ GraphQL 瑙勮寖锛� -* schema 鏂囦欢鏀惧湪 resources/graphqls/player.graphqls +* schema 鏂囦欢鏀惧湪 resources/graphql 涓嬮潰 * 鎵�鏈� query/mutation 蹇呴』 extend scheme.graphqls锛岄伩鍏嶉噸澶嶅畾涔夐棶棰� 鍓嶇鎸夐挳瑙勫垯锛堟牴鎹� state锛夛細 @@ -307,21 +307,21 @@ 聽 鍚庡彴瀵瑰簲 wxLogin 鏂规硶銆傦紙涓嶆槸webLogin) - 鐧诲綍閫昏緫锛� +聽 鐧诲綍閫昏緫锛� - 1. 濡傛灉t\_user 閲岄潰 娌℃湁瀵瑰簲鐨� openid ,閭d箞鏂板涓�涓猽ser 璁板綍 +聽 1. 濡傛灉t\_user 閲岄潰 娌℃湁瀵瑰簲鐨� openid ,閭d箞鏂板涓�涓猽ser 璁板綍 - 2. 濡傛灉瀛樺湪user 璁板綍锛� 鍒欏垎鍒叧鑱� t\_player ,t\_judge ,t\_employee 琛ㄩ噷闈㈢殑 user\_id, 杩斿洖鍓嶇鐨剈serDto 搴旇鍖呭惈 player, judge, employee 鐨勪俊鎭紙濡傛灉鏈夌殑璇濓級 +聽 2. 濡傛灉瀛樺湪user 璁板綍锛� 鍒欏垎鍒叧鑱� t\_player ,t\_judge ,t\_employee 琛ㄩ噷闈㈢殑 user\_id, 杩斿洖鍓嶇鐨剈serDto 搴旇鍖呭惈 player, judge, employee 鐨勪俊鎭紙濡傛灉鏈夌殑璇濓級 - 3. 鐢佃瘽鍙风爜鍏宠仈锛堥潪甯搁噸瑕侊級 +聽 3. 鐢佃瘽鍙风爜鍏宠仈锛堥潪甯搁噸瑕侊級 - 鍚庡彴鏈変釜 saveUserPhone 鐨勬柟娉曪紝灏忕▼搴忕鎴栬�厀eb绔洿鏂扮數璇濆悗閮藉繀椤昏皟鐢ㄨ繖涓柟娉曪紝浠栫殑鏍稿績閫昏緫鏄細 +聽 鍚庡彴鏈変釜 saveUserPhone 鐨勬柟娉曪紝灏忕▼搴忕鎴栬�厀eb绔洿鏂扮數璇濆悗閮藉繀椤昏皟鐢ㄨ繖涓柟娉曪紝浠栫殑鏍稿績閫昏緫鏄細 - 1锛屾煡璇㈠綋鍓峵\_user 閲岄潰鐨勬槸鍚﹀瓨鍦ㄧ浉鍚岀殑鐢佃瘽鍙风爜锛屽鏋滄病鏈夛紝灏辨洿鏂板埌褰撳墠user閲岄潰 +聽 1锛屾煡璇㈠綋鍓峵\_user 閲岄潰鐨勬槸鍚﹀瓨鍦ㄧ浉鍚岀殑鐢佃瘽鍙风爜锛屽鏋滄病鏈夛紝灏辨洿鏂板埌褰撳墠user閲岄潰 - 2. 濡傛灉瀛樺湪鐩稿悓鐨勭數璇濆彿鐮侊紝骞朵笖瀵瑰簲user鐨刼penid 鏄痭ull ,閭d箞 娓呯┖鍘熸潵user 鐨刾hone 璁剧疆涓簄ull, 鎶婃柊鐨勭數璇濆彿鐮佹洿鏂板埌 褰撳墠鐢ㄦ埛鐨刾hone瀛楁锛岋紙鍥犱负鐢佃瘽鍙风爜涓嶅彲閲嶅锛夛紝 鍚屾椂鏇存柊t\_player, t\_judge, t\_employee 鍏宠仈鐨剈ser\_id 鍒� 鏂扮殑user\_id +聽 2. 濡傛灉瀛樺湪鐩稿悓鐨勭數璇濆彿鐮侊紝骞朵笖瀵瑰簲user鐨刼penid 鏄痭ull ,閭d箞 娓呯┖鍘熸潵user 鐨刾hone 璁剧疆涓簄ull, 鎶婃柊鐨勭數璇濆彿鐮佹洿鏂板埌 褰撳墠鐢ㄦ埛鐨刾hone瀛楁锛岋紙鍥犱负鐢佃瘽鍙风爜涓嶅彲閲嶅锛夛紝 鍚屾椂鏇存柊t\_player, t\_judge, t\_employee 鍏宠仈鐨剈ser\_id 鍒� 鏂扮殑user\_id - +聽 \#### 2.3.1 棣栭〉 @@ -331,9 +331,9 @@ \- toolbar鏄剧ず棣栭〉锛屾秷鎭紝鎴戠殑銆備笁涓ā鍧椼�� - 绗竴娆℃墦寮�灏忕▼搴忥紝 寮瑰嚭鎵嬫満鍙风爜鎺堟潈锛屼絾鏄鏈夋槑鏄剧殑銆愬彇娑堛�戞寜閽紝鐢ㄦ埛鍙互涓嶆巿鏉冿紝濡傛灉鐢ㄦ埛鍙栨秷鎺堟潈锛屾妸 rejectPhone 璁板綍鍒皐x.setstorage 閲岄潰銆� 涓嬫鐧诲綍涓嶅湪鎻愰啋鎺堟潈鎵嬫満鍙风爜銆� +聽 绗竴娆℃墦寮�灏忕▼搴忥紝 寮瑰嚭鎵嬫満鍙风爜鎺堟潈锛屼絾鏄鏈夋槑鏄剧殑銆愬彇娑堛�戞寜閽紝鐢ㄦ埛鍙互涓嶆巿鏉冿紝濡傛灉鐢ㄦ埛鍙栨秷鎺堟潈锛屾妸 rejectPhone 璁板綍鍒皐x.setstorage 閲岄潰銆� 涓嬫鐧诲綍涓嶅湪鎻愰啋鎺堟潈鎵嬫満鍙风爜銆� - +聽 \#### 2.3.2 璇︽儏椤甸潰 @@ -385,11 +385,11 @@ 聽 椤圭洰鍚嶇О锛氬繀濉� -聽 椤圭洰浠嬬粛锛氬繀濉� +聽 椤圭洰浠嬬粛锛氬繀濉� 聽 鏂囨。璧勬枡锛氬繀濉紙鏈�灏戜竴涓級锛屾渶澶�5涓紝鏀寔瑙嗛锛屽浘鐗囷紝word锛宲df 鏂囦欢銆� -聽 +聽 聽 鎻愪氦鎸夐挳 diff --git a/query_data.js b/query_data.js deleted file mode 100644 index e58d97b..0000000 --- a/query_data.js +++ /dev/null @@ -1,55 +0,0 @@ -const mysql = require('mysql2/promise'); - -async function queryData() { - const connection = await mysql.createConnection({ - host: '139.155.104.10', - port: 3306, - user: 'ryc', - password: 'KiYap3E8X8RLcM6T', - database: 'ryc' - }); - - try { - console.log('杩炴帴鏁版嵁搴撴垚鍔燂紒'); - - // 鏌ヨstage_id=8鐨勯樁娈典俊鎭� - console.log('\n=== 鏌ヨ t_activity 琛ㄤ腑 id=8 鐨勯樁娈典俊鎭� ==='); - const [rows1] = await connection.execute( - 'SELECT id, pid, name, sort_order FROM t_activity WHERE id = ?', - [8] - ); - console.log(`鎵惧埌 ${rows1.length} 鏉¤褰曪細`); - rows1.forEach(row => { - console.log(`ID: ${row.id}, PID: ${row.pid}, Name: ${row.name}, Sort: ${row.sort_order}`); - }); - - // 鏌ヨactivity_id=6鐨勬墍鏈夐樁娈� - console.log('\n=== 鏌ヨ activity_id=6 鐨勬墍鏈夐樁娈� ==='); - const [rows2] = await connection.execute( - 'SELECT id, pid, name, sort_order FROM t_activity WHERE pid = ? ORDER BY sort_order', - [6] - ); - console.log(`鎵惧埌 ${rows2.length} 鏉¢樁娈佃褰曪細`); - rows2.forEach(row => { - console.log(`ID: ${row.id}, PID: ${row.pid}, Name: ${row.name}, Sort: ${row.sort_order}`); - }); - - // 鏌ヨ涓绘瘮璧涗俊鎭� - console.log('\n=== 鏌ヨ涓绘瘮璧� id=6 鐨勪俊鎭� ==='); - const [rows3] = await connection.execute( - 'SELECT id, pid, name FROM t_activity WHERE id = ?', - [6] - ); - console.log(`鎵惧埌 ${rows3.length} 鏉¤褰曪細`); - rows3.forEach(row => { - console.log(`ID: ${row.id}, PID: ${row.pid}, Name: ${row.name}`); - }); - - } catch (error) { - console.error('鏌ヨ鍑洪敊锛�', error); - } finally { - await connection.end(); - } -} - -queryData(); \ No newline at end of file diff --git a/t_media.sql b/t_media.sql deleted file mode 100644 index 89bcc10..0000000 --- a/t_media.sql +++ /dev/null @@ -1,57 +0,0 @@ -/* - Navicat Premium Dump SQL - - Source Server : 钃夋槗鍒� - Source Server Type : MySQL - Source Server Version : 80405 (8.4.5) - Source Host : 139.155.104.10:3306 - Source Schema : ryc - - Target Server Type : MySQL - Target Server Version : 80405 (8.4.5) - File Encoding : 65001 - - Date: 30/09/2025 09:55:45 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for t_media --- ---------------------------- -DROP TABLE IF EXISTS `t_media`; -CREATE TABLE `t_media` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `target_type` int NOT NULL, - `target_id` bigint NOT NULL, - `media_type` int NOT NULL, - `path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '鑵捐浜戠殑瀛樺偍妗跺湴鍧�', - `thumb_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `file_ext` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `file_size` int NOT NULL, - `duration` int NULL DEFAULT NULL COMMENT '瑙嗛鐨勯暱搴︾', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `state` int NOT NULL DEFAULT 1, - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `create_user_id` bigint NULL DEFAULT NULL, - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `update_user_id` bigint NULL DEFAULT NULL, - `version` bigint NOT NULL DEFAULT 0, - PRIMARY KEY (`id`) USING BTREE, - INDEX `uq_type_id`(`target_type` ASC, `target_id` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 119 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of t_media --- ---------------------------- -INSERT INTO `t_media` VALUES (112, 'judge_avatar.jpg', 1, 65, 1, 'avatars/judge_avatar_1759142940287.jpg', NULL, 'jpg', 1024, NULL, NULL, 1, '2025-09-29 18:48:59', NULL, '2025-09-29 18:48:59', NULL, 0); -INSERT INTO `t_media` VALUES (113, 'logo.jpg', 1, 66, 1, '20250929/b5840d47-b046-4461-9d78-27881c917f03.jpg', NULL, 'jpg', 67671, NULL, NULL, 1, '2025-09-29 18:49:02', NULL, '2025-09-29 18:49:02', NULL, 0); -INSERT INTO `t_media` VALUES (114, 'a1.png', 2, 73, 1, '20250929/bc8be85a-c0d9-4d75-885e-cb19d613e00f.png', NULL, 'png', 3628657, NULL, NULL, 1, '2025-09-29 19:16:11', NULL, '2025-09-29 19:16:11', NULL, 0); -INSERT INTO `t_media` VALUES (115, 'bug1.png', 2, 73, 1, '20250929/23aee0a8-dc1e-4ec5-b4a6-2b80370940cb.png', NULL, 'png', 84959, NULL, NULL, 1, '2025-09-29 19:16:11', NULL, '2025-09-29 19:16:11', NULL, 0); -INSERT INTO `t_media` VALUES (116, 'mg5v05lk-vchro9dh-dn24k81r-ibqm.jpg', 7, 2, 1, 'avatars/20250930/mg5v05lk-vchro9dh-dn24k81r-ibqm.jpg', NULL, 'jpg', 3624223, NULL, NULL, 1, '2025-09-30 09:08:55', NULL, '2025-09-30 09:08:55', NULL, 0); -INSERT INTO `t_media` VALUES (117, 'mg5v06il-rei95zgu-f9okwt82-iruh.png', 5, 51, 1, 'attachments/20250930/mg5v06il-rei95zgu-f9okwt82-iruh.png', NULL, 'png', 93686, NULL, NULL, 1, '2025-09-30 09:08:55', NULL, '2025-09-30 09:08:55', NULL, 0); -INSERT INTO `t_media` VALUES (118, 'test-avatar.jpg', 7, 1, 1, 'avatars/test-avatar.jpg', NULL, 'jpg', 50000, NULL, NULL, 1, '2025-09-30 09:32:13', NULL, '2025-09-30 09:32:13', NULL, 0); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/web/check-auth.html b/web/check-auth.html deleted file mode 100644 index 81bdd4c..0000000 --- a/web/check-auth.html +++ /dev/null @@ -1,128 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>璁よ瘉鐘舵�佹鏌�</title> - <style> - body { font-family: Arial, sans-serif; margin: 20px; } - .result { margin: 10px 0; padding: 10px; border: 1px solid #ccc; } - .error { background-color: #ffe6e6; } - .success { background-color: #e6ffe6; } - button { padding: 10px 20px; margin: 5px; } - </style> -</head> -<body> - <h1>璁よ瘉鐘舵�佹鏌�</h1> - - <button onclick="checkAuth()">妫�鏌ヨ璇佺姸鎬�</button> - <button onclick="testRoleAPI()">娴嬭瘯瑙掕壊API</button> - <button onclick="loginAsAdmin()">妯℃嫙绠$悊鍛樼櫥褰�</button> - - <div id="results"></div> - - <script> - function addResult(content, isError = false) { - const div = document.createElement('div'); - div.className = `result ${isError ? 'error' : 'success'}`; - div.innerHTML = content; - document.getElementById('results').appendChild(div); - } - - function checkAuth() { - const token = localStorage.getItem('auth_token'); - const userInfo = localStorage.getItem('user_info'); - - addResult(` - <strong>璁よ瘉鐘舵��:</strong><br> - Token: ${token ? '瀛樺湪' : '涓嶅瓨鍦�'}<br> - User Info: ${userInfo ? '瀛樺湪' : '涓嶅瓨鍦�'}<br> - ${token ? `Token鍐呭: ${token.substring(0, 50)}...` : ''} - `); - } - - async function testRoleAPI() { - try { - const token = localStorage.getItem('auth_token'); - const headers = { - 'Content-Type': 'application/json' - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch('/api/graphql', { - method: 'POST', - headers, - body: JSON.stringify({ - query: `query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - }` - }) - }); - - const data = await response.json(); - - if (data.errors) { - addResult(`<strong>瑙掕壊API閿欒:</strong><br>${JSON.stringify(data.errors, null, 2)}`, true); - } else { - addResult(`<strong>瑙掕壊API鎴愬姛:</strong><br>瑙掕壊鏁伴噺: ${data.data?.activeRoles?.length || 0}<br>鏁版嵁: <pre>${JSON.stringify(data.data, null, 2)}</pre>`); - } - } catch (error) { - addResult(`<strong>瑙掕壊API璋冪敤澶辫触:</strong><br>${error.message}`, true); - } - } - - async function loginAsAdmin() { - try { - const response = await fetch('/api/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - query: `mutation Login($phone: String!, $password: String!) { - login(phone: $phone, password: $password) { - token - user { - userId - name - phone - userType - } - } - }`, - variables: { - phone: "13800000001", - password: "123456" - } - }) - }); - - const data = await response.json(); - - if (data.errors) { - addResult(`<strong>鐧诲綍澶辫触:</strong><br>${JSON.stringify(data.errors, null, 2)}`, true); - } else if (data.data?.login?.token) { - localStorage.setItem('auth_token', data.data.login.token); - localStorage.setItem('user_info', JSON.stringify(data.data.login.user)); - addResult(`<strong>鐧诲綍鎴愬姛:</strong><br>Token宸蹭繚瀛�<br>鐢ㄦ埛淇℃伅: ${JSON.stringify(data.data.login.user, null, 2)}`); - } else { - addResult(`<strong>鐧诲綍鍝嶅簲寮傚父:</strong><br>${JSON.stringify(data, null, 2)}`, true); - } - } catch (error) { - addResult(`<strong>鐧诲綍璇锋眰澶辫触:</strong><br>${error.message}`, true); - } - } - </script> -</body> -</html> \ No newline at end of file diff --git a/web/debug-roles.html b/web/debug-roles.html deleted file mode 100644 index fc03ed2..0000000 --- a/web/debug-roles.html +++ /dev/null @@ -1,99 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>瑙掕壊API璋冭瘯</title> - <style> - body { font-family: Arial, sans-serif; margin: 20px; } - .result { margin: 10px 0; padding: 10px; border: 1px solid #ccc; } - .error { background-color: #ffe6e6; } - .success { background-color: #e6ffe6; } - button { padding: 10px 20px; margin: 5px; } - </style> -</head> -<body> - <h1>瑙掕壊API璋冭瘯</h1> - - <button onclick="testWithoutAuth()">娴嬭瘯鏃犺璇丄PI璋冪敤</button> - <button onclick="testWithAuth()">娴嬭瘯甯﹁璇丄PI璋冪敤</button> - <button onclick="checkLocalStorage()">妫�鏌ユ湰鍦板瓨鍌�</button> - - <div id="results"></div> - - <script> - function addResult(content, isError = false) { - const div = document.createElement('div'); - div.className = `result ${isError ? 'error' : 'success'}`; - div.innerHTML = content; - document.getElementById('results').appendChild(div); - } - - async function testWithoutAuth() { - try { - const response = await fetch('/api/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - query: `query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - }` - }) - }); - - const data = await response.json(); - addResult(`<strong>鏃犺璇丄PI璋冪敤缁撴灉:</strong><br>鐘舵��: ${response.status}<br>鏁版嵁: <pre>${JSON.stringify(data, null, 2)}</pre>`); - } catch (error) { - addResult(`<strong>鏃犺璇丄PI璋冪敤澶辫触:</strong><br>${error.message}`, true); - } - } - - async function testWithAuth() { - try { - const token = localStorage.getItem('token'); - const response = await fetch('/api/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': token ? `Bearer ${token}` : '' - }, - body: JSON.stringify({ - query: `query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - }` - }) - }); - - const data = await response.json(); - addResult(`<strong>甯﹁璇丄PI璋冪敤缁撴灉:</strong><br>鐘舵��: ${response.status}<br>Token: ${token ? '瀛樺湪' : '涓嶅瓨鍦�'}<br>鏁版嵁: <pre>${JSON.stringify(data, null, 2)}</pre>`); - } catch (error) { - addResult(`<strong>甯﹁璇丄PI璋冪敤澶辫触:</strong><br>${error.message}`, true); - } - } - - function checkLocalStorage() { - const token = localStorage.getItem('token'); - const user = localStorage.getItem('user'); - addResult(`<strong>鏈湴瀛樺偍妫�鏌�:</strong><br>Token: ${token || '鏃�'}<br>User: ${user || '鏃�'}`); - } - </script> -</body> -</html> \ No newline at end of file diff --git a/web/fix-employee-roles.html b/web/fix-employee-roles.html deleted file mode 100644 index 26131a6..0000000 --- a/web/fix-employee-roles.html +++ /dev/null @@ -1,307 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>淇鍛樺伐瑙掕壊浠g爜</title> - <style> - body { - font-family: Arial, sans-serif; - max-width: 800px; - margin: 0 auto; - padding: 20px; - } - .section { - margin: 20px 0; - padding: 15px; - border: 1px solid #ddd; - border-radius: 5px; - } - button { - background-color: #007bff; - color: white; - border: none; - padding: 10px 20px; - border-radius: 4px; - cursor: pointer; - margin: 5px; - } - button:hover { - background-color: #0056b3; - } - .error { - color: red; - } - .success { - color: green; - } - .log { - background-color: #f8f9fa; - border: 1px solid #dee2e6; - border-radius: 4px; - padding: 10px; - margin: 10px 0; - white-space: pre-wrap; - font-family: monospace; - max-height: 300px; - overflow-y: auto; - } - </style> -</head> -<body> - <h1>淇鍛樺伐瑙掕壊浠g爜</h1> - - <div class="section"> - <h3>1. 妫�鏌ヨ璇佺姸鎬�</h3> - <button onclick="checkAuth()">妫�鏌ヨ璇佺姸鎬�</button> - <div id="authStatus"></div> - </div> - - <div class="section"> - <h3>2. 鑾峰彇鎵�鏈夊憳宸�</h3> - <button onclick="fetchEmployees()">鑾峰彇鍛樺伐鍒楄〃</button> - <div id="employeeList"></div> - </div> - - <div class="section"> - <h3>3. 鑾峰彇鏈夋晥瑙掕壊</h3> - <button onclick="fetchRoles()">鑾峰彇瑙掕壊鍒楄〃</button> - <div id="roleList"></div> - </div> - - <div class="section"> - <h3>4. 淇鏃犳晥瑙掕壊</h3> - <button onclick="fixInvalidRoles()">淇鏃犳晥瑙掕壊浠g爜</button> - <div id="fixResult"></div> - </div> - - <div class="section"> - <h3>鎿嶄綔鏃ュ織</h3> - <div id="log" class="log"></div> - <button onclick="clearLog()">娓呯┖鏃ュ織</button> - </div> - - <script> - const API_BASE_URL = 'http://localhost:8080/api'; - const GRAPHQL_ENDPOINT = `${API_BASE_URL}/graphql`; - - let employees = []; - let validRoles = []; - - function log(message) { - const logDiv = document.getElementById('log'); - const timestamp = new Date().toLocaleTimeString(); - logDiv.textContent += `[${timestamp}] ${message}\n`; - logDiv.scrollTop = logDiv.scrollHeight; - } - - function clearLog() { - document.getElementById('log').textContent = ''; - } - - async function graphqlRequest(query, variables = {}) { - const token = localStorage.getItem('token'); - - const response = await fetch(GRAPHQL_ENDPOINT, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...(token && { 'Authorization': `Bearer ${token}` }) - }, - body: JSON.stringify({ - query, - variables - }) - }); - - const result = await response.json(); - - if (result.errors) { - throw new Error(result.errors[0].message); - } - - return result.data; - } - - async function checkAuth() { - const statusDiv = document.getElementById('authStatus'); - const token = localStorage.getItem('token'); - - if (!token) { - statusDiv.innerHTML = '<span class="error">鏈壘鍒拌璇佷护鐗岋紝璇峰厛鐧诲綍</span>'; - log('閿欒: 鏈壘鍒拌璇佷护鐗�'); - return; - } - - try { - // 灏濊瘯鑾峰彇鐢ㄦ埛淇℃伅鏉ラ獙璇乼oken - const query = ` - query { - employees { - id - name - } - } - `; - - await graphqlRequest(query); - statusDiv.innerHTML = '<span class="success">璁よ瘉鐘舵�佹甯�</span>'; - log('璁よ瘉鐘舵�佹鏌ラ�氳繃'); - } catch (error) { - statusDiv.innerHTML = `<span class="error">璁よ瘉澶辫触: ${error.message}</span>`; - log(`璁よ瘉澶辫触: ${error.message}`); - } - } - - async function fetchEmployees() { - const listDiv = document.getElementById('employeeList'); - - try { - const query = ` - query { - employees { - id - name - phone - roleId - description - } - } - `; - - const data = await graphqlRequest(query); - employees = data.employees; - - let html = `<p>鎵惧埌 ${employees.length} 涓憳宸�:</p><ul>`; - employees.forEach(emp => { - html += `<li>ID: ${emp.id}, 濮撳悕: ${emp.name}, 瑙掕壊: ${emp.roleId}</li>`; - }); - html += '</ul>'; - - listDiv.innerHTML = html; - log(`鎴愬姛鑾峰彇 ${employees.length} 涓憳宸); - } catch (error) { - listDiv.innerHTML = `<span class="error">鑾峰彇鍛樺伐澶辫触: ${error.message}</span>`; - log(`鑾峰彇鍛樺伐澶辫触: ${error.message}`); - } - } - - async function fetchRoles() { - const listDiv = document.getElementById('roleList'); - - try { - const query = ` - query { - activeRoles { - id - code - name - description - } - } - `; - - const data = await graphqlRequest(query); - validRoles = data.activeRoles; - - let html = `<p>鎵惧埌 ${validRoles.length} 涓湁鏁堣鑹�:</p><ul>`; - validRoles.forEach(role => { - html += `<li>浠g爜: ${role.code}, 鍚嶇О: ${role.name}</li>`; - }); - html += '</ul>'; - - listDiv.innerHTML = html; - log(`鎴愬姛鑾峰彇 ${validRoles.length} 涓湁鏁堣鑹瞏); - } catch (error) { - listDiv.innerHTML = `<span class="error">鑾峰彇瑙掕壊澶辫触: ${error.message}</span>`; - log(`鑾峰彇瑙掕壊澶辫触: ${error.message}`); - } - } - - async function fixInvalidRoles() { - const resultDiv = document.getElementById('fixResult'); - - if (employees.length === 0) { - resultDiv.innerHTML = '<span class="error">璇峰厛鑾峰彇鍛樺伐鍒楄〃</span>'; - return; - } - - if (validRoles.length === 0) { - resultDiv.innerHTML = '<span class="error">璇峰厛鑾峰彇瑙掕壊鍒楄〃</span>'; - return; - } - - const validRoleCodes = validRoles.map(role => role.code); - const invalidEmployees = employees.filter(emp => !validRoleCodes.includes(emp.roleId)); - - if (invalidEmployees.length === 0) { - resultDiv.innerHTML = '<span class="success">鎵�鏈夊憳宸ョ殑瑙掕壊浠g爜閮芥槸鏈夋晥鐨�</span>'; - log('鎵�鏈夊憳宸ョ殑瑙掕壊浠g爜閮芥槸鏈夋晥鐨�'); - return; - } - - log(`鍙戠幇 ${invalidEmployees.length} 涓憳宸ョ殑瑙掕壊浠g爜鏃犳晥`); - - // 瑙掕壊鏄犲皠瑙勫垯 - const roleMapping = { - 'MANAGER': 'SUPER_ADMIN', - 'EMPLOYEE': 'AUDITOR', - 'ADMIN': 'SUPER_ADMIN' - }; - - let fixedCount = 0; - let errors = []; - - for (const emp of invalidEmployees) { - const newRoleId = roleMapping[emp.roleId] || 'AUDITOR'; // 榛樿鏄犲皠鍒癆UDITOR - - try { - const mutation = ` - mutation SaveEmployee($input: EmployeeInput!) { - saveEmployee(input: $input) { - id - name - roleId - } - } - `; - - const variables = { - input: { - id: parseInt(emp.id), - name: emp.name, - phone: emp.phone, - roleId: newRoleId, - description: emp.description - } - }; - - await graphqlRequest(mutation, variables); - fixedCount++; - log(`淇鍛樺伐 ${emp.name} (ID: ${emp.id}): ${emp.roleId} -> ${newRoleId}`); - } catch (error) { - errors.push(`鍛樺伐 ${emp.name} (ID: ${emp.id}): ${error.message}`); - log(`淇鍛樺伐 ${emp.name} 澶辫触: ${error.message}`); - } - } - - let html = `<p class="success">鎴愬姛淇 ${fixedCount} 涓憳宸ョ殑瑙掕壊浠g爜</p>`; - if (errors.length > 0) { - html += `<p class="error">淇澶辫触 ${errors.length} 涓�:</p><ul>`; - errors.forEach(error => { - html += `<li>${error}</li>`; - }); - html += '</ul>'; - } - - resultDiv.innerHTML = html; - log(`淇瀹屾垚: 鎴愬姛 ${fixedCount} 涓�, 澶辫触 ${errors.length} 涓猔); - } - - // 椤甸潰鍔犺浇鏃舵鏌ヨ璇佺姸鎬� - window.onload = function() { - checkAuth(); - }; - </script> -</body> -</html> \ No newline at end of file diff --git a/web/src/api/activity.js b/web/src/api/activity.js index c46c220..b91db36 100644 --- a/web/src/api/activity.js +++ b/web/src/api/activity.js @@ -13,15 +13,12 @@ signupDeadline matchTime address + playerCount playerMax state stateName - playerCount createTime - ratingScheme { - id - name - } + updateTime } totalElements page @@ -41,6 +38,7 @@ matchTime address ratingSchemeId + playerCount playerMax state stateName @@ -58,6 +56,7 @@ matchTime address ratingSchemeId + playerCount playerMax state stateName @@ -125,6 +124,7 @@ const result = await graphqlRequest(GET_ACTIVITIES_QUERY, { page, size, name }); return result.data.activities; } catch (error) { + console.error('鑾峰彇姣旇禌鍒楄〃澶辫触:', error); throw new Error(error.message || '鑾峰彇姣旇禌鍒楄〃澶辫触'); } }; @@ -141,12 +141,9 @@ export const getAllActivities = async () => { try { const result = await graphqlRequest(GET_ALL_ACTIVITIES_QUERY); - return result.data.allActivities; } catch (error) { - console.error('=== getAllActivities API璋冪敤澶辫触 ==='); - console.error('閿欒璇︽儏:', error); - console.error('閿欒娑堟伅:', error.message); + console.error('鑾峰彇鎵�鏈夋瘮璧涘け璐�:', error); throw new Error(error.message || '鑾峰彇鎵�鏈夋瘮璧涘け璐�'); } }; @@ -154,8 +151,9 @@ export const saveActivity = async (activityData) => { try { const data = await graphqlRequest(SAVE_ACTIVITY_MUTATION, { input: activityData }); - return data.saveActivity; + return data.data.saveActivity; } catch (error) { + console.error('淇濆瓨姣旇禌澶辫触:', error); throw new Error(error.message || '淇濆瓨姣旇禌澶辫触'); } }; @@ -163,7 +161,7 @@ export const deleteActivity = async (id) => { try { const data = await graphqlRequest(DELETE_ACTIVITY_MUTATION, { id }); - return data.deleteActivity; + return data.data.deleteActivity; } catch (error) { throw new Error(error.message || '鍒犻櫎姣旇禌澶辫触'); } diff --git a/web/src/api/dashboard.js b/web/src/api/dashboard.js index ef2e5d1..5d93132 100644 --- a/web/src/api/dashboard.js +++ b/web/src/api/dashboard.js @@ -14,6 +14,6 @@ // API 鍑芥暟 export const getDashboardStats = async () => { - const data = await graphqlRequest(GET_DASHBOARD_STATS_QUERY); - return data.dashboardStats; + const result = await graphqlRequest(GET_DASHBOARD_STATS_QUERY); + return result.data.dashboardStats; }; \ No newline at end of file diff --git a/web/src/api/media.js b/web/src/api/media.js index 7bec028..ac6a772 100644 --- a/web/src/api/media.js +++ b/web/src/api/media.js @@ -101,8 +101,8 @@ } }; -// 涓婁紶鏂囦欢鍒版湇鍔″櫒 -export const uploadFile = async (file) => { +// 涓婁紶鏂囦欢鍒版湇鍔″櫒锛堝甫閲嶈瘯鏈哄埗锛� +export const uploadFile = async (file, maxRetries = 3) => { const formData = new FormData(); formData.append('file', file); @@ -114,18 +114,56 @@ headers['Authorization'] = `Bearer ${token}`; } - const response = await fetch('http://localhost:8080/api/upload/image', { - method: 'POST', - headers: headers, - body: formData - }); + let lastError; - const result = await response.json(); - if (!result.success) { - throw new Error(result.error || '涓婁紶澶辫触'); + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + const response = await fetch('http://localhost:8080/api/upload/image', { + method: 'POST', + headers: headers, + body: formData, + // 娣诲姞瓒呮椂璁剧疆 + signal: AbortSignal.timeout(30000) // 30绉掕秴鏃� + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const result = await response.json(); + if (!result.success) { + throw new Error(result.error || '涓婁紶澶辫触'); + } + + return result; + } catch (error) { + lastError = error; + console.warn(`鏂囦欢涓婁紶绗�${attempt}娆″皾璇曞け璐�:`, error.message); + + // 濡傛灉鏄渶鍚庝竴娆″皾璇曪紝鎴栬�呮槸闈炵綉缁滈敊璇紝鐩存帴鎶涘嚭 + if (attempt === maxRetries || + (!error.message.includes('Failed to fetch') && + !error.message.includes('ERR_CONNECTION_RESET') && + !error.message.includes('ERR_NETWORK'))) { + break; + } + + // 绛夊緟涓�娈垫椂闂村悗閲嶈瘯锛堟寚鏁伴��閬匡級 + const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000); + await new Promise(resolve => setTimeout(resolve, delay)); + } } - return result; + // 鎻愪緵鏇村弸濂界殑閿欒淇℃伅 + if (lastError.message.includes('Failed to fetch') || + lastError.message.includes('ERR_CONNECTION_RESET') || + lastError.message.includes('ERR_NETWORK')) { + throw new Error('缃戠粶杩炴帴澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ユ垨绋嶅悗閲嶈瘯'); + } else if (lastError.message.includes('timeout')) { + throw new Error('涓婁紶瓒呮椂锛岃妫�鏌ョ綉缁滆繛鎺ユ垨绋嶅悗閲嶈瘯'); + } else { + throw new Error(`涓婁紶澶辫触: ${lastError.message}`); + } }; // 涓婁紶瑙嗛鏂囦欢骞惰嚜鍔ㄧ敓鎴愮缉鐣ュ浘 diff --git a/web/src/api/projectReview.js b/web/src/api/projectReview.js index 0808aa2..1002038 100644 --- a/web/src/api/projectReview.js +++ b/web/src/api/projectReview.js @@ -54,6 +54,7 @@ activityName projectName description + stageId submissionFiles { id name diff --git a/web/src/views/ActivityForm.vue b/web/src/views/ActivityForm.vue index 4e6d7d3..931fa32 100644 --- a/web/src/views/ActivityForm.vue +++ b/web/src/views/ActivityForm.vue @@ -143,7 +143,7 @@ </div> </div> - <div v-if="form.value && form.value.stages && form.value.stages.length > 0" class="stages-list"> + <div v-if="form && form.stages && form.stages.length > 0" class="stages-list"> <div v-for="(stage, index) in sortedFormStages" :key="index" class="stage-item"> <div class="stage-info"> <div class="stage-header"> @@ -396,7 +396,7 @@ <el-select v-model="currentStudent.lastStageId" placeholder="璇烽�夋嫨闃舵" style="width: 100%"> <el-option label="鏃�" :value="null" /> <el-option - v-for="stage in (form.value?.stages || [])" + v-for="stage in (form?.stages || [])" :key="stage.id" :label="stage.name" :value="stage.id" @@ -476,10 +476,10 @@ // 璁$畻杩囨护鍚庣殑璇勫鍒楄〃 const filteredJudges = computed(() => { if (!judgeSearchText.value.trim()) { - return allJudges.value + return allJudges.value.filter(judge => judge && judge.id && judge.name) } return allJudges.value.filter(judge => - judge.name.toLowerCase().includes(judgeSearchText.value.toLowerCase()) + judge && judge.name && judge.name.toLowerCase().includes(judgeSearchText.value.toLowerCase()) ) }) @@ -580,7 +580,7 @@ try { judgeLoading.value = true const judges = await getAllJudges() - allJudges.value = judges || [] + allJudges.value = (judges || []).filter(judge => judge && judge.id && judge.name) } catch (error) { console.error('鍔犺浇璇勫鍒楄〃澶辫触:', error) ElMessage.error('鍔犺浇璇勫鍒楄〃澶辫触: ' + error.message) @@ -610,7 +610,7 @@ playerMax: activity.playerMax, state: activity.state, stages: activity.stages || [], - judges: activity.judges || [], + judges: (activity.judges || []).filter(judge => judge && judge.id && judge.name), students: activity.students || [], mediaFiles: [] } @@ -678,8 +678,8 @@ // 鑾峰彇榛樿闃舵鍚嶇О - 浣跨敤鏇寸伒娲荤殑鍛藉悕鏂瑰紡锛岄伩鍏嶇‖缂栫爜鐗瑰畾闃舵鍚嶇О const getDefaultStageName = (index) => { // 鎻愪緵涓�浜涘父鐢ㄧ殑闃舵鍚嶇О寤鸿锛屼絾涓嶅己鍒朵娇鐢� - const suggestedNames = ['', '绗竴闃舵', '绗簩闃舵', '绗笁闃舵', '绗洓闃舵', '绗簲闃舵'] - return suggestedNames[index] || `绗�${index}闃舵` + const suggestedNames = ['绗竴闃舵', '绗簩闃舵', '绗笁闃舵', '绗洓闃舵', '绗簲闃舵'] + return suggestedNames[index - 1] || `绗�${index}闃舵` } // 鑾峰彇闃舵鍦ㄥ師濮嬫暟缁勪腑鐨勭储寮� @@ -794,6 +794,12 @@ // 璇勫绠$悊 const addJudge = () => { + // 妫�鏌ユ瘮璧涙槸鍚﹀凡淇濆瓨 + if (!isEdit.value && !form.value.id) { + ElMessage.warning('璇峰厛淇濆瓨姣旇禌淇℃伅鍚庡啀娣诲姞璇勫') + return + } + resetJudgeDialog() judgeDialogVisible.value = true } @@ -1102,6 +1108,8 @@ const handleMediaUpload = async (activityId) => { if (!form.value || !form.value.mediaFiles) return + const failedFiles = [] + try { for (const mediaFile of form.value.mediaFiles) { // 璺宠繃宸茬粡鏈� id 鐨勫獟浣撴枃浠讹紙宸蹭繚瀛樼殑锛� @@ -1144,13 +1152,21 @@ mediaFile.uploadResult = uploadResult } catch (error) { console.error(`濯掍綋鏂囦欢 ${mediaFile.name} 澶勭悊澶辫触:`, error) - ElMessage.error(`鏂囦欢 ${mediaFile.name} 涓婁紶澶辫触: ${error.message}`) - // 涓嶆姏鍑洪敊璇紝缁х画澶勭悊鍏朵粬鏂囦欢 + failedFiles.push({ + name: mediaFile.name, + error: error.message + }) } + } + + // 濡傛灉鏈夋枃浠朵笂浼犲け璐ワ紝鎶涘嚭閿欒 + if (failedFiles.length > 0) { + const failedNames = failedFiles.map(f => f.name).join(', ') + throw new Error(`浠ヤ笅鏂囦欢涓婁紶澶辫触: ${failedNames}`) } } catch (error) { console.error('濯掍綋鏂囦欢澶勭悊澶辫触:', error) - // 涓嶅奖鍝嶄富娴佺▼锛屽彧璁板綍閿欒 + throw error // 鎶涘嚭閿欒璁╀笂灞傚鐞� } } @@ -1164,6 +1180,11 @@ submitting.value = true + console.log('=== 寮�濮嬩繚瀛樻瘮璧� ===') + console.log('form.value:', form.value) + console.log('form.value.stages:', form.value.stages) + console.log('form.value.judges:', form.value.judges) + // 鍑嗗淇濆瓨鏁版嵁锛屽彧鍖呭惈鍚庣鏀寔鐨勫瓧娈� const saveData = { name: form.value.name, @@ -1174,31 +1195,50 @@ ratingSchemeId: form.value.ratingSchemeId, playerMax: form.value.playerMax, state: form.value.state || 1, - stages: form.value.stages ? form.value.stages.map(stage => { - const stageData = { - name: stage.name, - description: stage.description, - matchTime: stage.matchTime, - address: stage.address, - playerMax: stage.playerMax, - sortOrder: stage.sortOrder, - state: stage.state || 1 - } - // 鍙湪鏈夋湁鏁圛D鏃舵墠娣诲姞id瀛楁 - if (stage.id) { - stageData.id = stage.id - } - // 鍙湪鏈夋湁鏁坮atingSchemeId鏃舵墠娣诲姞璇ュ瓧娈� - if (stage.ratingSchemeId) { - stageData.ratingSchemeId = stage.ratingSchemeId - } - return stageData - }) : [], - judges: form.value.judges ? form.value.judges.filter(judge => judge.id && judge.name).map(judge => ({ - judgeId: judge.id, - judgeName: judge.name, - stageIds: judge.stageIds || [] - })) : [] + stages: form.value.stages ? (() => { + console.log('=== 澶勭悊stages ===') + console.log('鍘熷stages:', form.value.stages) + const filteredStages = form.value.stages.filter(stage => stage) + console.log('杩囨护鍚巗tages:', filteredStages) + return filteredStages.map((stage, index) => { + console.log(`澶勭悊stage ${index}:`, stage) + const stageData = { + name: stage.name, + description: stage.description, + matchTime: stage.matchTime, + address: stage.address, + playerMax: stage.playerMax, + sortOrder: stage.sortOrder, + state: stage.state || 1 + } + // 鍙湪鏈夋湁鏁圛D鏃舵墠娣诲姞id瀛楁 + if (stage.id) { + stageData.id = stage.id + } + // 鍙湪鏈夋湁鏁坮atingSchemeId鏃舵墠娣诲姞璇ュ瓧娈� + if (stage.ratingSchemeId) { + stageData.ratingSchemeId = stage.ratingSchemeId + } + console.log(`澶勭悊鍚巗tage ${index}:`, stageData) + return stageData + }) + })() : [], + judges: form.value.judges ? (() => { + console.log('=== 澶勭悊judges ===') + console.log('鍘熷judges:', form.value.judges) + const filteredJudges = form.value.judges.filter(judge => judge && judge.id && judge.name) + console.log('杩囨护鍚巎udges:', filteredJudges) + return filteredJudges.map((judge, index) => { + console.log(`澶勭悊judge ${index}:`, judge) + const judgeData = { + judgeId: judge.id, + judgeName: judge.name, + stageIds: judge.stageIds || [] + } + console.log(`澶勭悊鍚巎udge ${index}:`, judgeData) + return judgeData + }) + })() : [] } // 濡傛灉鏄紪杈戞ā寮忥紝娣诲姞id瀛楁 @@ -1213,29 +1253,61 @@ const result = await saveActivity(saveData) + console.log('=== 淇濆瓨缁撴灉 ===') + console.log('result:', result) + console.log('result type:', typeof result) + console.log('result.id:', result?.id) + console.log('result.id type:', typeof result?.id) + console.log('JSON.stringify(result):', JSON.stringify(result, null, 2)) + // 濡傛灉鏄柊澧烇紝鏇存柊form鐨刬d if (!isEdit.value && result && result.id) { form.value.id = result.id } // 澶勭悊濯掍綋鏂囦欢涓婁紶鍜屼繚瀛� + let mediaUploadSuccess = true if (form.value.mediaFiles && form.value.mediaFiles.length > 0) { - const activityId = result.id || form.value.id + // 淇activityId鑾峰彇閫昏緫锛氫紭鍏堜娇鐢╮esult.id锛堟柊澧炴椂锛夛紝鍏舵浣跨敤form.value.id锛堢紪杈戞椂锛� + const activityId = result?.id || form.value.id + console.log('=== 濯掍綋鏂囦欢涓婁紶 ===') + console.log('result:', result) + console.log('form.value.id:', form.value.id) + console.log('鏈�缁坅ctivityId:', activityId) + if (activityId) { - await handleMediaUpload(activityId) + try { + await handleMediaUpload(activityId) + console.log('濯掍綋鏂囦欢涓婁紶鎴愬姛') + } catch (mediaError) { + console.error('濯掍綋鏂囦欢涓婁紶澶辫触:', mediaError) + mediaUploadSuccess = false + ElMessage.warning('姣旇禌淇濆瓨鎴愬姛锛屼絾閮ㄥ垎濯掍綋鏂囦欢涓婁紶澶辫触锛岃绋嶅悗閲嶆柊缂栬緫娣诲姞') + } + } else { + console.error('鏃犳硶鑾峰彇activityId锛岃烦杩囧獟浣撴枃浠朵笂浼�') + mediaUploadSuccess = false + ElMessage.warning('姣旇禌淇濆瓨鎴愬姛锛屼絾鏃犳硶鑾峰彇姣旇禌ID锛屽獟浣撴枃浠朵笂浼犲け璐�') } } - ElMessage.success(isEdit.value ? '鏇存柊鎴愬姛' : '鍒涘缓鎴愬姛') - - // 濡傛灉鏄柊澧烇紝涓嶈嚜鍔ㄨ繑鍥烇紝璁╃敤鎴峰彲浠ョ户缁坊鍔犺瘎濮斿拰瀛﹀憳 - if (isEdit.value) { - goBack() + if (mediaUploadSuccess) { + ElMessage.success(isEdit.value ? '鏇存柊鎴愬姛' : '鍒涘缓鎴愬姛') } + + // 淇濆瓨鎴愬姛鍚庤繑鍥炲垪琛ㄩ〉闈� + goBack() } catch (error) { + console.error('=== 淇濆瓨姣旇禌澶辫触 ===') + console.error('閿欒瀵硅薄:', error) + console.error('閿欒娑堟伅:', error.message) + console.error('閿欒鍫嗘爤:', error.stack) + console.error('褰撳墠form.value:', form.value) + if (error.message) { - console.error('淇濆瓨姣旇禌澶辫触:', error) ElMessage.error('淇濆瓨澶辫触: ' + error.message) + } else { + ElMessage.error('淇濆瓨澶辫触: 鏈煡閿欒') } } finally { submitting.value = false @@ -1254,7 +1326,15 @@ await loadActivity() // 濡傛灉鏄柊寤烘ā寮忎笖娌℃湁闃舵锛岃嚜鍔ㄥ垱寤轰竴涓樁娈� + console.log('妫�鏌ラ粯璁ら樁娈靛垱寤烘潯浠�:', { + isEdit: isEdit.value, + hasForm: !!form.value, + hasStages: !!(form.value && form.value.stages), + stagesLength: form.value && form.value.stages ? form.value.stages.length : 'undefined' + }) + if (!isEdit.value && form.value && form.value.stages && form.value.stages.length === 0) { + console.log('鍒涘缓榛樿闃舵') onStageCountChange(1) } }) diff --git a/web/src/views/ActivityList.vue b/web/src/views/ActivityList.vue index bb8d729..5dc0f3e 100644 --- a/web/src/views/ActivityList.vue +++ b/web/src/views/ActivityList.vue @@ -107,8 +107,12 @@ searchName.value ) - tableData.value = result.content || [] - total.value = result.totalElements || 0 + console.log('=== ActivityList loadData ==='); + console.log('getActivities杩斿洖鏁版嵁:', result); + tableData.value = result?.content || [] + total.value = result?.totalElements || 0 + console.log('璁剧疆tableData:', tableData.value); + console.log('璁剧疆total:', total.value); } catch (error) { console.error('鍔犺浇姣旇禌鍒楄〃澶辫触:', error) ElMessage.error('鍔犺浇姣旇禌鍒楄〃澶辫触: ' + error.message) diff --git a/web/src/views/activity-list.vue b/web/src/views/activity-list.vue index 33e97f9..21af0a4 100644 --- a/web/src/views/activity-list.vue +++ b/web/src/views/activity-list.vue @@ -81,11 +81,13 @@ </template> <script setup lang="ts"> -import { reactive, ref, onMounted } from 'vue' +import { reactive, ref, onMounted, onActivated, watch } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { useRouter } from 'vue-router' import { getActivities } from '@/api/activity' import { Search, Plus, Edit, Delete } from '@element-plus/icons-vue' + +console.log('=== activity-list.vue 缁勪欢寮�濮嬪姞杞� ==='); const loading = ref(false) const router = useRouter() @@ -104,6 +106,12 @@ // 琛ㄦ牸鏁版嵁 const tableData = ref([]) + +// 娣诲姞璋冭瘯锛氱洃鍚瑃ableData鍙樺寲 +watch(tableData, (newVal) => { + console.log('=== tableData 鍙戠敓鍙樺寲 ===', newVal) + console.log('tableData.value.length:', newVal.length) +}, { deep: true }) // 鑾峰彇鐘舵�佹爣绛剧被鍨� const getStatusType = (status: string) => { @@ -171,9 +179,18 @@ loading.value = true try { const data = await getActivities(pagination.page - 1, pagination.size, searchForm.name || '') - tableData.value = (data && data.content) ? data.content : [] - pagination.total = (data && data.totalElements) ? data.totalElements : 0 + + // 鏁版嵁鏄犲皠锛氬皢API杩斿洖鐨勫瓧娈垫槧灏勫埌琛ㄦ牸鏈熸湜鐨勫瓧娈� + const mappedData = (data?.content || []).map(item => ({ + ...item, + playerCount: item.playerCount || 0, + stateName: item.stateName || '' + })); + + tableData.value = mappedData + pagination.total = data?.totalElements || 0 } catch (e) { + console.error('鍔犺浇鏁版嵁澶辫触:', e); ElMessage.error((e && e.message) ? e.message : '鍔犺浇姣旇禌鍒楄〃澶辫触') } finally { loading.value = false @@ -183,6 +200,11 @@ onMounted(() => { loadData() }) + +// 椤甸潰婵�娲绘椂閲嶆柊鍔犺浇鏁版嵁锛堣В鍐充粠鏂板/缂栬緫椤甸潰杩斿洖鏃跺垪琛ㄤ笉鍒锋柊鐨勯棶棰橈級 +onActivated(() => { + loadData() +}) </script> <style scoped> diff --git a/web/src/views/check-detail.vue b/web/src/views/check-detail.vue index 6843618..139047a 100644 --- a/web/src/views/check-detail.vue +++ b/web/src/views/check-detail.vue @@ -240,11 +240,7 @@ try { loading.value = true const playerId = route.params.id as string - - // 杩欓噷搴旇璋冪敤API鑾峰彇鏁版嵁 - // 鏆傛椂浣跨敤妯℃嫙鏁版嵁 await loadPlayerData(playerId) - } catch (error) { console.error('鍔犺浇鏁版嵁澶辫触:', error) ElMessage.error('鍔犺浇鏁版嵁澶辫触') @@ -282,7 +278,6 @@ regionInfo { id name - fullPath } activityName projectName @@ -296,6 +291,7 @@ fileExt fileSize mediaType + thumbUrl } } } @@ -307,7 +303,7 @@ const loadPlayerData = async (playerId: string) => { try { const data = await graphqlRequest(ACTIVITY_PLAYER_DETAIL_QUERY, { id: playerId }) - const detail = data.activityPlayerDetail + const detail = data?.data?.activityPlayerDetail || data?.activityPlayerDetail if (detail) { // 璁剧疆player鍩烘湰淇℃伅 @@ -345,9 +341,12 @@ // 鍒濆鍖栧鏍告剰瑙� feedbackText.value = detail.feedback || '' + } else { + ElMessage.warning('鏈壘鍒板搴旂殑鍙傝禌浜哄憳璇︽儏淇℃伅') } } catch (error) { console.error('鍔犺浇鏁版嵁澶辫触:', error) + ElMessage.error(`鍔犺浇鏁版嵁澶辫触: ${error.message || error}`) throw error } } @@ -437,7 +436,7 @@ approving.value = true const result = await approveActivityPlayer(activityPlayerData.value.id, feedbackText.value) - if (result.approveActivityPlayer) { + if (result.data.approveActivityPlayer) { ElMessage.success('瀹℃牳閫氳繃鎴愬姛') activityPlayerData.value.state = 1 activityPlayerData.value.feedback = feedbackText.value @@ -471,7 +470,7 @@ rejecting.value = true const result = await rejectActivityPlayer(activityPlayerData.value.id, feedbackText.value) - if (result.rejectActivityPlayer) { + if (result.data.rejectActivityPlayer) { ElMessage.success('瀹℃牳椹冲洖鎴愬姛') activityPlayerData.value.state = 2 activityPlayerData.value.feedback = feedbackText.value @@ -499,7 +498,7 @@ updating.value = true const result = await updatePlayerFeedback(activityPlayerData.value.id, feedbackText.value) - if (result.updatePlayerFeedback) { + if (result.data.updatePlayerFeedback) { ElMessage.success('瀹℃牳鎰忚鏇存柊鎴愬姛') activityPlayerData.value.feedback = feedbackText.value } else { diff --git a/web/src/views/dashboard/index.vue b/web/src/views/dashboard/index.vue index 4865983..05691f8 100644 --- a/web/src/views/dashboard/index.vue +++ b/web/src/views/dashboard/index.vue @@ -44,6 +44,7 @@ <h3 class="table-title">鏈�杩戞瘮璧�</h3> <el-button type="primary" @click="$router.push('/activity')">鏌ョ湅鍏ㄩ儴</el-button> </div> + <el-table :data="recentActivities" class="recent-table"> <el-table-column prop="name" label="姣旇禌鍚嶇О" width="180" /> <el-table-column prop="playerCount" label="鎶ュ悕浜烘暟" width="120" /> @@ -57,7 +58,6 @@ <el-table-column label="鎿嶄綔"> <template #default="scope"> <a class="action-link" @click="viewActivity(scope.row)">鏌ョ湅</a> - <a class="action-link" @click="manageActivity(scope.row)">绠$悊</a> </template> </el-table-column> </el-table> @@ -101,13 +101,14 @@ const loadRecentActivities = async () => { try { const data = await getActivities(0, 5) // 鑾峰彇鍓�5鏉℃椿鍔� - recentActivities.value = data.content.map(activity => ({ - id: activity.id, - name: activity.name, - playerCount: activity.playerCount || 0, - startTime: activity.matchTime || activity.createTime, - endTime: activity.endTime || '寰呭畾', - status: activity.stateName || '鏈煡' + const { content } = data || {}; + recentActivities.value = (content || []).map(item => ({ + id: item.id, + name: item.name, + playerCount: item.playerCount || 0, + startTime: item.matchTime, + endTime: item.matchTime, + status: item.stateName })) } catch (error) { console.error('鍔犺浇鏈�杩戞椿鍔ㄥけ璐�:', error) @@ -124,11 +125,6 @@ // 鏌ョ湅姣旇禌 const viewActivity = (activity: any) => { router.push(`/activity/${activity.id}`) -} - -// 绠$悊姣旇禌 -const manageActivity = (activity: any) => { - router.push('/activity') } // 鑾峰彇鐘舵�佹牱寮忕被 diff --git a/web/src/views/review-detail.vue b/web/src/views/review-detail.vue index 2dcace8..e015e26 100644 --- a/web/src/views/review-detail.vue +++ b/web/src/views/review-detail.vue @@ -225,48 +225,64 @@ return false } - // 妫�鏌ユ槸鍚︽湁employee韬唤 - if (userInfo.employee) { - isEmployee.value = true + // 璁剧疆鍛樺伐韬唤鏍囪瘑 + isEmployee.value = !!userInfo.employee + + // 浼樺厛妫�鏌ヨ瘎濮旇韩浠藉拰鏉冮檺锛堝嵆浣跨敤鎴峰悓鏃舵湁鍛樺伐韬唤锛� + const judgeInfo = await userApi.getCurrentJudgeInfo() + + if (judgeInfo) { + currentJudge.value = judgeInfo + hasJudgePermission.value = true + + // 妫�鏌ユ槸鍚﹀湪褰撳墠姣旇禌闃舵鐨勮瘎濮斿垪琛ㄤ腑 + if (projectDetail.value && projectDetail.value.stageId) { + const isInActivity = await userApi.checkJudgeInActivity( + projectDetail.value.stageId, + judgeInfo.judgeId + ) + + if (isInActivity) { + isJudgeInActivity.value = true + canModifyRating.value = true // 鏈夎瘎濮旀潈闄愶紝鍙互淇敼璇勫垎 + permissionChecked.value = true + + if (isEmployee.value) { + ElMessage.success('鎮ㄥ悓鏃舵嫢鏈夊憳宸ュ拰璇勫韬唤锛屽綋鍓嶄互璇勫韬唤杩涜璇勫') + } + return true + } else { + isJudgeInActivity.value = false + // 濡傛灉娌℃湁褰撳墠姣旇禌鐨勮瘎濮旀潈闄愶紝浣嗘湁鍛樺伐韬唤锛屽垯浠ュ憳宸ヨ韩浠芥煡鐪� + if (isEmployee.value) { + canModifyRating.value = false + permissionChecked.value = true + ElMessage.info('鎮ㄦ病鏈夊綋鍓嶆瘮璧涚殑璇勫鏉冮檺锛屼互鍛樺伐韬唤鏌ョ湅璇勫璇︽儏') + return true + } else { + ElMessage.error('鎮ㄤ笉鏄綋鍓嶆瘮璧涚殑璇勫锛屾棤娉曡繘琛岃瘎瀹�') + router.push('/project-review') + return false + } + } + } + } + + // 濡傛灉娌℃湁璇勫韬唤锛屼絾鏈夊憳宸ヨ韩浠斤紝鍒欎互鍛樺伐韬唤鏌ョ湅 + if (isEmployee.value) { + hasJudgePermission.value = false canModifyRating.value = false // employee鍙兘鏌ョ湅锛屼笉鑳戒慨鏀� permissionChecked.value = true ElMessage.info('鎮ㄤ互鍛樺伐韬唤鏌ョ湅璇勫璇︽儏锛屽彧鑳芥煡鐪嬩笉鑳戒慨鏀硅瘎鍒�') return true } - // 濡傛灉娌℃湁employee韬唤锛屾鏌udge韬唤鍜屾潈闄� - const judgeInfo = await userApi.getCurrentJudgeInfo() + // 鏃㈡病鏈夎瘎濮旇韩浠戒篃娌℃湁鍛樺伐韬唤 + hasJudgePermission.value = false + ElMessage.error('鎮ㄦ病鏈夎瘎濮旀潈闄愶紝鏃犳硶杩涜璇勫') + router.push('/project-review') + return false - if (!judgeInfo) { - hasJudgePermission.value = false - ElMessage.error('鎮ㄦ病鏈夎瘎濮旀潈闄愶紝鏃犳硶杩涜璇勫') - router.push('/project-review') - return false - } - - currentJudge.value = judgeInfo - hasJudgePermission.value = true - - // 妫�鏌ユ槸鍚﹀湪褰撳墠姣旇禌闃舵鐨勮瘎濮斿垪琛ㄤ腑 - if (projectDetail.value && projectDetail.value.stageId) { - const isInActivity = await userApi.checkJudgeInActivity( - projectDetail.value.stageId, - judgeInfo.judgeId - ) - - if (!isInActivity) { - isJudgeInActivity.value = false - ElMessage.error('鎮ㄤ笉鏄綋鍓嶆瘮璧涚殑璇勫锛屾棤娉曡繘琛岃瘎瀹�') - router.push('/project-review') - return false - } - - isJudgeInActivity.value = true - canModifyRating.value = true // judge鏈夋潈闄愪慨鏀硅瘎鍒� - } - - permissionChecked.value = true - return true } catch (error) { console.error('鏉冮檺楠岃瘉澶辫触:', error) hasJudgePermission.value = false @@ -278,8 +294,8 @@ // 鍔犺浇褰撳墠璇勫宸叉湁鐨勮瘎瀹℃暟鎹� const loadExistingRating = async () => { - // employee鐢ㄦ埛涓嶉渶瑕佸姞杞借瘎濮旂殑璇勫垎鏁版嵁 - if (isEmployee.value || !hasJudgePermission.value) return + // 鍙湁鍏锋湁璇勫鏉冮檺涓斿彲浠ヤ慨鏀硅瘎鍒嗙殑鐢ㄦ埛鎵嶉渶瑕佸姞杞借瘎濮旂殑璇勫垎鏁版嵁 + if (!hasJudgePermission.value || !canModifyRating.value) return try { const rating = await getCurrentJudgeRating(parseInt(projectId.value)) diff --git a/web/test-employee-roles.html b/web/test-employee-roles.html deleted file mode 100644 index a1f8f4b..0000000 --- a/web/test-employee-roles.html +++ /dev/null @@ -1,198 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>鍛樺伐瑙掕壊涓嬫媺妗嗘祴璇�</title> - <style> - body { font-family: Arial, sans-serif; margin: 20px; } - .result { margin: 10px 0; padding: 10px; border: 1px solid #ccc; } - .error { background-color: #ffe6e6; } - .success { background-color: #e6ffe6; } - button { padding: 10px 20px; margin: 5px; } - select { padding: 5px; margin: 5px; min-width: 200px; } - </style> -</head> -<body> - <h1>鍛樺伐瑙掕壊涓嬫媺妗嗘祴璇�</h1> - - <div> - <button onclick="checkAuth()">1. 妫�鏌ヨ璇佺姸鎬�</button> - <button onclick="testRoleAPI()">2. 娴嬭瘯瑙掕壊API</button> - <button onclick="loginAsAdmin()">3. 妯℃嫙绠$悊鍛樼櫥褰�</button> - <button onclick="testRoleAPIAfterLogin()">4. 鐧诲綍鍚庢祴璇曡鑹睞PI</button> - </div> - - <div> - <h3>瑙掕壊涓嬫媺妗嗘ā鎷燂細</h3> - <select id="roleSelect"> - <option value="">璇烽�夋嫨瑙掕壊</option> - </select> - <button onclick="loadRolesIntoSelect()">鍔犺浇瑙掕壊鍒颁笅鎷夋</button> - </div> - - <div id="results"></div> - - <script> - function addResult(content, isError = false) { - const div = document.createElement('div'); - div.className = `result ${isError ? 'error' : 'success'}`; - div.innerHTML = content; - document.getElementById('results').appendChild(div); - } - - function checkAuth() { - const token = localStorage.getItem('auth_token'); - const userInfo = localStorage.getItem('user_info'); - - addResult(` - <strong>璁よ瘉鐘舵��:</strong><br> - Token: ${token ? '瀛樺湪' : '涓嶅瓨鍦�'}<br> - User Info: ${userInfo ? '瀛樺湪' : '涓嶅瓨鍦�'}<br> - ${token ? `Token鍐呭: ${token.substring(0, 50)}...` : ''} - `); - } - - async function testRoleAPI() { - try { - const token = localStorage.getItem('auth_token'); - const headers = { - 'Content-Type': 'application/json' - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch('/api/graphql', { - method: 'POST', - headers, - body: JSON.stringify({ - query: `query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - }` - }) - }); - - const data = await response.json(); - - if (data.errors) { - addResult(`<strong>瑙掕壊API閿欒:</strong><br>${JSON.stringify(data.errors, null, 2)}`, true); - } else { - addResult(`<strong>瑙掕壊API鎴愬姛:</strong><br>瑙掕壊鏁伴噺: ${data.data?.activeRoles?.length || 0}<br>鏁版嵁: <pre>${JSON.stringify(data.data, null, 2)}</pre>`); - } - } catch (error) { - addResult(`<strong>瑙掕壊API璋冪敤澶辫触:</strong><br>${error.message}`, true); - } - } - - async function loginAsAdmin() { - try { - const response = await fetch('/api/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - query: `mutation Login($phone: String!, $password: String!) { - login(phone: $phone, password: $password) { - token - user { - userId - name - phone - userType - } - } - }`, - variables: { - phone: "13800000001", - password: "123456" - } - }) - }); - - const data = await response.json(); - - if (data.errors) { - addResult(`<strong>鐧诲綍澶辫触:</strong><br>${JSON.stringify(data.errors, null, 2)}`, true); - } else if (data.data?.login?.token) { - localStorage.setItem('auth_token', data.data.login.token); - localStorage.setItem('user_info', JSON.stringify(data.data.login.user)); - addResult(`<strong>鐧诲綍鎴愬姛:</strong><br>Token宸蹭繚瀛�<br>鐢ㄦ埛淇℃伅: ${JSON.stringify(data.data.login.user, null, 2)}`); - } else { - addResult(`<strong>鐧诲綍鍝嶅簲寮傚父:</strong><br>${JSON.stringify(data, null, 2)}`, true); - } - } catch (error) { - addResult(`<strong>鐧诲綍璇锋眰澶辫触:</strong><br>${error.message}`, true); - } - } - - async function testRoleAPIAfterLogin() { - await testRoleAPI(); - } - - async function loadRolesIntoSelect() { - try { - const token = localStorage.getItem('auth_token'); - const headers = { - 'Content-Type': 'application/json' - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch('/api/graphql', { - method: 'POST', - headers, - body: JSON.stringify({ - query: `query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - }` - }) - }); - - const data = await response.json(); - const select = document.getElementById('roleSelect'); - - // 娓呯┖鐜版湁閫夐」锛堥櫎浜嗛粯璁ら�夐」锛� - select.innerHTML = '<option value="">璇烽�夋嫨瑙掕壊</option>'; - - if (data.errors) { - addResult(`<strong>鍔犺浇瑙掕壊鍒颁笅鎷夋澶辫触:</strong><br>${JSON.stringify(data.errors, null, 2)}`, true); - } else if (data.data?.activeRoles) { - const roles = data.data.activeRoles; - roles.forEach(role => { - const option = document.createElement('option'); - option.value = role.id; - option.textContent = role.name; - select.appendChild(option); - }); - addResult(`<strong>鎴愬姛鍔犺浇 ${roles.length} 涓鑹插埌涓嬫媺妗�</strong>`); - } else { - addResult(`<strong>娌℃湁鑾峰彇鍒拌鑹叉暟鎹�</strong>`, true); - } - } catch (error) { - addResult(`<strong>鍔犺浇瑙掕壊鍒颁笅鎷夋澶辫触:</strong><br>${error.message}`, true); - } - } - </script> -</body> -</html> \ No newline at end of file diff --git a/web/test-role-api.html b/web/test-role-api.html deleted file mode 100644 index 29433b2..0000000 --- a/web/test-role-api.html +++ /dev/null @@ -1,68 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>娴嬭瘯瑙掕壊API</title> -</head> -<body> - <h1>瑙掕壊API娴嬭瘯</h1> - <button onclick="testRoleAPI()">娴嬭瘯瑙掕壊API</button> - <div id="result"></div> - - <script> - async function testRoleAPI() { - const resultDiv = document.getElementById('result'); - resultDiv.innerHTML = '姝e湪娴嬭瘯...'; - - try { - // 鑾峰彇token锛堝鏋滄湁鐨勮瘽锛� - const token = localStorage.getItem('token'); - - const headers = { - 'Content-Type': 'application/json', - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const query = ` - query GetActiveRoles { - activeRoles { - id - code - name - description - state - createTime - updateTime - } - } - `; - - const response = await fetch('/api/graphql', { - method: 'POST', - headers, - body: JSON.stringify({ - query, - variables: {} - }) - }); - - const result = await response.json(); - - resultDiv.innerHTML = ` - <h3>鍝嶅簲鐘舵��: ${response.status}</h3> - <h3>鍝嶅簲鏁版嵁:</h3> - <pre>${JSON.stringify(result, null, 2)}</pre> - `; - - } catch (error) { - resultDiv.innerHTML = ` - <h3>閿欒:</h3> - <pre>${error.message}</pre> - `; - } - } - </script> -</body> -</html> \ No newline at end of file diff --git a/web/vite.config.ts b/web/vite.config.ts index 54dc648..697b868 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -10,7 +10,7 @@ } }, server: { - port: 3000, + port: 5173, open: true, proxy: { '/api': { diff --git a/wx/app.js b/wx/app.js index 574b272..6b689f7 100644 --- a/wx/app.js +++ b/wx/app.js @@ -154,7 +154,19 @@ userId name phone - wxOpenid + userType + employee { + id + name + } + judge { + id + name + } + player { + id + name + } } isNewUser loginRecordId diff --git a/wx/app.json b/wx/app.json index 24424de..a2e4035 100644 --- a/wx/app.json +++ b/wx/app.json @@ -10,9 +10,9 @@ ], "window": { "backgroundTextStyle": "light", - "navigationBarBackgroundColor": "#007aff", + "navigationBarBackgroundColor": "#ffffff", "navigationBarTitleText": "钃夋槗鍒�", - "navigationBarTextStyle": "white", + "navigationBarTextStyle": "black", "backgroundColor": "#f5f5f5" }, diff --git a/wx/lib/utils.js b/wx/lib/utils.js index eccf0a6..d27c9a4 100644 --- a/wx/lib/utils.js +++ b/wx/lib/utils.js @@ -7,18 +7,41 @@ * @returns {string} 鏍煎紡鍖栧悗鐨勬棩鏈熷瓧绗︿覆 */ function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') { - if (!date) return '' - - const d = new Date(date) + if (date === null || date === undefined || date === '') return '' + let d + + // 鏁板瓧锛氬彲鑳芥槸鏃堕棿鎴筹紙绉�/姣锛� + if (typeof date === 'number') { + // 灏忎簬 1e12 瑙嗕负绉掞紝杞崲涓烘绉� + d = new Date(date < 1e12 ? date * 1000 : date) + } else if (typeof date === 'string') { + let s = date.trim() + if (!s) return '' + // 澶勭悊 ISO 鍜屽父瑙佸悗绔牸寮� + // 1) 鍚� 'T' 鐨� ISO 瀛楃涓诧紝鍘绘帀姣涓� Z 鐨勫奖鍝嶏紙淇濇寔鏈湴鏃堕棿锛� + s = s.replace('T', ' ').replace(/\.000Z?$/i, '') + // 2) YYYY-MM-DD -> 寰俊 JSCore 瀵硅繛瀛楃瑙f瀽涓嶇ǔ瀹氾紝杞枩鏉� + if (/^\d{4}-\d{2}-\d{2}(?:\s+\d{2}:\d{2}:\d{2})?$/.test(s)) { + s = s.replace(/-/g, '/') + // 浠呮棩鏈熻ˉ鏃堕棿锛岄伩鍏� NaN + if (s.length === 10) s += ' 00:00:00' + } + d = new Date(s) + } else if (date instanceof Date) { + d = date + } else { + return '' + } + if (isNaN(d.getTime())) return '' - + const year = d.getFullYear() const month = String(d.getMonth() + 1).padStart(2, '0') const day = String(d.getDate()).padStart(2, '0') const hours = String(d.getHours()).padStart(2, '0') const minutes = String(d.getMinutes()).padStart(2, '0') const seconds = String(d.getSeconds()).padStart(2, '0') - + return format .replace('YYYY', year) .replace('MM', month) diff --git a/wx/lib/utils.wxs b/wx/lib/utils.wxs new file mode 100644 index 0000000..07c55be --- /dev/null +++ b/wx/lib/utils.wxs @@ -0,0 +1,30 @@ +var formatDate = function(dateStr, format) { + // 寮哄埗杞崲涓哄瓧绗︿覆锛屽吋瀹� null, undefined, number 绛夌被鍨� + var s = '' + dateStr; + + if (s.length < 10) { + return '鈥�'; + } + + // 浣跨敤 slice 鏇挎崲 substr + var y = s.slice(0, 4); + var m = s.slice(5, 7); + var d = s.slice(8, 10); + + if (format === 'YYYY-MM-DD') { + return y + '-' + m + '-' + d; + } + + // 妫�鏌ユ椂闂撮儴鍒嗘墍闇�闀垮害 + if (format === 'YYYY-MM-DD HH:mm' && s.length >= 16) { + var h = s.slice(11, 13); + var min = s.slice(14, 16); + return y + '-' + m + '-' + d + ' ' + h + ':' + min; + } + + return '鈥�'; // 榛樿杩斿洖鍗犱綅绗� +}; + +module.exports = { + formatDate: formatDate +}; \ No newline at end of file diff --git a/wx/pages/activity/detail.js b/wx/pages/activity/detail.js index 24d7b1c..9e18865 100644 --- a/wx/pages/activity/detail.js +++ b/wx/pages/activity/detail.js @@ -4,68 +4,38 @@ Page({ data: { - // 娲诲姩ID activityId: null, - // 娲诲姩璇︽儏 activity: null, - // 鍔犺浇鐘舵�� + myApplication: null, + buttonDisabled: false, + buttonText: '鎴戣鎶ュ悕', loading: true, - // 鐢ㄦ埛鎶ュ悕鐘舵�� - registrationStatus: null, - // 鏄惁宸叉姤鍚� - isRegistered: false, - // 濯掍綋鏂囦欢鍒楄〃 - mediaFiles: [], - // 褰撳墠濯掍綋绱㈠紩 - currentMediaIndex: 0, - // 鏄惁鏄剧ず濯掍綋棰勮 - showMediaPreview: false, - // 鎶ュ悕浜烘暟锛堝疄鏃舵洿鏂帮級 - currentParticipants: 0, - // 鏄惁鍙互鎶ュ悕 - canRegisterStatus: false, - // 鎶ュ悕鎸夐挳鏂囨湰 - registerButtonText: '绔嬪嵆鎶ュ悕', - // 鎶ュ悕鎸夐挳鏄惁绂佺敤 - registerButtonDisabled: false + error: null }, onLoad(options) { - console.log('娲诲姩璇︽儏椤靛姞杞�', options) - if (options.id) { - this.setData({ activityId: options.id }) - this.loadActivityDetail() - this.checkRegistrationStatus() + this.setData({ activityId: options.id }); + this.loadActivityDetail(options.id); } else { - utils.showError('鍙傛暟閿欒') - utils.navigateBack() + this.setData({ loading: false, error: '鏃犳晥鐨勬瘮璧汭D' }); } }, - onShow() { - console.log('娲诲姩璇︽儏椤垫樉绀�') - // 鍒锋柊鎶ュ悕浜烘暟 + onPullDownRefresh() { if (this.data.activityId) { - this.refreshParticipantCount() + this.loadActivityDetail(this.data.activityId).finally(() => { + wx.stopPullDownRefresh(); + }); + } else { + wx.stopPullDownRefresh(); } }, - onShareAppMessage() { - const activity = this.data.activity - return { - title: activity ? activity.name : '绮惧僵璧涗簨', - path: `/pages/activity/detail?id=${this.data.activityId}`, - imageUrl: activity && activity.coverImage ? activity.coverImage.fullUrl : '' - } - }, - - // 鍔犺浇璧涗簨璇︽儏 - loadActivityDetail() { - this.setData({ loading: true }) - - app.graphqlRequest(` - query getActivityDetail($id: ID!) { + loadActivityDetail(id) { + this.setData({ loading: true, error: null }); + const query = ` + query GetActivityDetailAndStatus($id: ID!) { activity(id: $id) { id name @@ -73,407 +43,97 @@ signupDeadline matchTime address - playerMax state - createTime - updateTime - playerCount stateName - coverImage { - id - name - path - fullUrl - fullThumbUrl - mediaType - } - images { - id - name - path - fullUrl - fullThumbUrl - mediaType - } - videos { - id - name - path - fullUrl - fullThumbUrl - mediaType - } - } - } - `, { - id: this.data.activityId - }).then(data => { - if (data.activity) { - const activity = data.activity - - // 澶勭悊濯掍綋鏂囦欢 - const mediaFiles = [] - - // 娣诲姞灏侀潰鍥� - if (activity.coverImage) { - mediaFiles.push({ - type: 'image', - url: activity.coverImage.fullUrl, - title: '灏侀潰鍥剧墖' - }) - } - - // 娣诲姞鍏朵粬鍥剧墖 - if (activity.images && activity.images.length > 0) { - activity.images.forEach((image, index) => { - mediaFiles.push({ - type: 'image', - url: image.fullUrl, - title: `鍥剧墖 ${index + 1}` - }) - }) - } - - // 娣诲姞瑙嗛 - if (activity.videos && activity.videos.length > 0) { - activity.videos.forEach((video, index) => { - mediaFiles.push({ - type: 'video', - url: video.fullUrl, - title: `瑙嗛 ${index + 1}` - }) - }) - } - - // 棰勫鐞嗘椂闂村瓧娈� - if (activity.signupDeadline) { - activity.formattedSignupDeadline = this.formatDate(activity.signupDeadline) - } - if (activity.matchTime) { - activity.formattedMatchTime = this.formatDate(activity.matchTime) - } - - this.setData({ - activity: activity, - mediaFiles: mediaFiles, - currentParticipants: activity.playerCount, - loading: false - }, () => { - // 鍦ㄦ暟鎹缃畬鎴愬悗锛屾鏌ユ姤鍚嶇姸鎬� - this.checkRegistrationStatus() - this.updateCanRegisterStatus() - }) - } else { - utils.showError('璧涗簨涓嶅瓨鍦�') - utils.navigateBack() - } - }).catch(err => { - console.error('鍔犺浇璧涗簨璇︽儏澶辫触:', err) - utils.showError('鍔犺浇澶辫触锛岃閲嶈瘯') - this.setData({ loading: false }) - }) - }, - - // 妫�鏌ユ姤鍚嶇姸鎬� - checkRegistrationStatus() { - if (!app.globalData.token) { - return - } - - app.graphqlRequest(` - query checkRegistrationStatus($activityId: ID!) { - playerRegistration(activityId: $activityId) { - id - status - registrationTime - reviewStatus - reviewComment - } - } - `, { - activityId: this.data.activityId - }).then(data => { - if (data.playerRegistration) { - this.setData({ - registrationStatus: data.playerRegistration, - isRegistered: true - }, () => { - this.updateCanRegisterStatus() - }) - } else { - this.setData({ - isRegistered: false - }, () => { - this.updateCanRegisterStatus() - }) - } - }).catch(err => { - console.error('妫�鏌ユ姤鍚嶇姸鎬佸け璐�:', err) - }) - }, - - // 鍒锋柊鎶ュ悕浜烘暟 - refreshParticipantCount() { - app.graphqlRequest(` - query getParticipantCount($id: ID!) { - activity(id: $id) { playerCount - } - } - `, { - id: this.data.activityId - }).then(data => { - if (data.activity) { - this.setData({ - currentParticipants: data.activity.playerCount - }, () => { - this.updateCanRegisterStatus() - }) - } - }).catch(err => { - console.error('鍒锋柊鎶ュ悕浜烘暟澶辫触:', err) - }) - }, - - // 濯掍綋鏂囦欢鐐瑰嚮 - onMediaTap(e) { - const index = e.currentTarget.dataset.index - const media = this.data.mediaFiles[index] - - if (media.type === 'image') { - // 棰勮鍥剧墖 - const imageUrls = this.data.mediaFiles - .filter(item => item.type === 'image') - .map(item => item.url) - - wx.previewImage({ - current: media.url, - urls: imageUrls - }) - } else if (media.type === 'video') { - // 鎾斁瑙嗛 - this.setData({ - currentMediaIndex: index, - showMediaPreview: true - }) - } - }, - - // 鍏抽棴濯掍綋棰勮 - closeMediaPreview() { - this.setData({ - showMediaPreview: false - }) - }, - - // 鎶ュ悕鎸夐挳鐐瑰嚮 - onRegisterTap() { - // 濡傛灉鎸夐挳琚鐢紝涓嶆墽琛屼换浣曟搷浣� - if (this.data.registerButtonDisabled) { - return - } - - // 濡傛灉宸叉姤鍚嶏紝鏌ョ湅鎶ュ悕鐘舵�� - if (this.data.isRegistered) { - this.onViewRegistrationStatus() - return - } - - // 妫�鏌ョ櫥褰曠姸鎬� - if (!app.globalData.token) { - utils.showToast('璇峰厛鐧诲綍') - app.login() - return - } - - const activity = this.data.activity - - // 妫�鏌ユ姤鍚嶆椂闂� - const now = new Date() - const regEnd = new Date(activity.signupDeadline) - - if (now > regEnd) { - utils.showToast('鎶ュ悕宸茬粨鏉�') - return - } - - // 妫�鏌ユ姤鍚嶄汉鏁� - if (activity.playerMax && this.data.currentParticipants >= activity.playerMax) { - utils.showToast('鎶ュ悕浜烘暟宸叉弧') - return - } - - // 璺宠浆鍒版姤鍚嶉〉闈� - utils.navigateTo('/pages/registration/registration', { - activityId: this.data.activityId - }) - }, - - // 鏌ョ湅鎶ュ悕鐘舵�� - onViewRegistrationStatus() { - const status = this.data.registrationStatus - let statusText = '' - - switch (status.status) { - case 'PENDING': - statusText = '寰呭鏍�' - break - case 'APPROVED': - statusText = '宸查�氳繃' - break - case 'REJECTED': - statusText = '宸叉嫆缁�' - break - case 'CANCELLED': - statusText = '宸插彇娑�' - break - default: - statusText = status.status - } - - let content = `鎶ュ悕鐘舵�侊細${statusText}\n鎶ュ悕鏃堕棿锛�${utils.formatDate(status.registrationTime)}` - - if (status.reviewComment) { - content += `\n瀹℃牳鎰忚锛�${status.reviewComment}` - } - - wx.showModal({ - title: '鎶ュ悕鐘舵��', - content: content, - showCancel: false - }) - }, - - // 鑱旂郴涓诲姙鏂� - onContactTap() { - const activity = this.data.activity - - if (activity.contactPhone) { - wx.showActionSheet({ - itemList: ['鎷ㄦ墦鐢佃瘽', '澶嶅埗鍙风爜'], - success: (res) => { - if (res.tapIndex === 0) { - wx.makePhoneCall({ - phoneNumber: activity.contactPhone - }) - } else if (res.tapIndex === 1) { - wx.setClipboardData({ - data: activity.contactPhone, - success: () => { - utils.showSuccess('鍙风爜宸插鍒�') - } - }) + playerMax + coverImage { fullUrl } + images { fullUrl } + videos { fullUrl, fullThumbUrl } + stages { + id + name + matchTime + description } } + myActivityPlayer(activityId: $id) { + id + state + } + } + `; + + return app.graphqlRequest(query, { id: id }) + .then(res => { + if (res.activity) { + let buttonDisabled = false; + let buttonText = '鎴戣鎶ュ悕'; + const myApplication = res.myActivityPlayer; + + if (myApplication) { + if (myApplication.state === 0) { + buttonDisabled = true; + buttonText = '绛夊緟瀹℃牳'; + } else if (myApplication.state === 1) { + buttonDisabled = true; + buttonText = '宸叉姤鍚�'; + } + } + + if (!buttonDisabled) { + if (new Date() > new Date(res.activity.signupDeadline)) { + buttonDisabled = true; + buttonText = '鎶ュ悕宸叉埅姝�'; + } + } + + this.setData({ + activity: res.activity, + myApplication: myApplication, + loading: false, + buttonDisabled: buttonDisabled, + buttonText: buttonText + }); + } else { + throw new Error('鏈壘鍒版瘮璧涗俊鎭�'); + } }) - } else { - utils.showToast('鏆傛棤鑱旂郴鏂瑰紡') - } + .catch(err => { + this.setData({ + loading: false, + error: '鍔犺浇澶辫触锛岃绋嶅悗閲嶈瘯' + }); + console.error('鍔犺浇姣旇禌璇︽儏鎴栨姤鍚嶇姸鎬佸け璐�:', err); + }); }, - // 鍒嗕韩璧涗簨 - onShareTap() { - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) + handleRegister() { + if (!this.data.activityId) { + wx.showToast({ + title: '鏃犳晥鐨勬椿鍔↖D', + icon: 'none' + }); + return; + } + wx.navigateTo({ + url: `/pages/registration/registration?id=${this.data.activityId}` + }); }, - // 鏍煎紡鍖栨棩鏈� - formatDate(date) { - return utils.formatDate(date, 'YYYY-MM-DD HH:mm') + // 鏍煎紡鍖栨棩鏈熷拰鏃堕棿 + formatDateTime(dateStr) { + return utils.formatDate(dateStr, 'YYYY-MM-DD HH:mm'); }, - - // 鑾峰彇鐘舵�佹枃鏈� - getStatusText(state) { - const statusMap = { - 0: '鑽夌', - 1: '宸插彂甯�', - 2: '鎶ュ悕缁撴潫', - 3: '杩涜涓�', - 4: '宸茬粨鏉�', - 5: '宸插彇娑�' + + // 鏍煎紡鍖栨棩鏈熻寖鍥� + formatDateRange(start, end) { + if (!start && !end) return '寰呭畾'; + const startDate = start ? utils.formatDate(start, 'YYYY-MM-DD') : ''; + const endDate = end ? utils.formatDate(end, 'YYYY-MM-DD') : ''; + if (startDate && endDate && startDate !== endDate) { + return `${startDate} - ${endDate}`; } - return statusMap[state] || '鏈煡鐘舵��' - }, - - // 鑾峰彇鐘舵�佹牱寮忕被 - getStatusClass(state) { - const classMap = { - 0: 'text-muted', - 1: 'text-success', - 2: 'text-warning', - 3: 'text-primary', - 4: 'text-muted', - 5: 'text-danger' - } - return classMap[state] || 'text-muted' - }, - - // 鑾峰彇鎶ュ悕杩涘害鐧惧垎姣� - getRegistrationProgress() { - const activity = this.data.activity - if (!activity || !activity.playerMax || activity.playerMax <= 0) { - return 0 - } - return Math.min((this.data.currentParticipants / activity.playerMax) * 100, 100) - }, - - // 鍒ゆ柇鏄惁鍙互鎶ュ悕 - canRegister() { - const activity = this.data.activity - if (!activity) return false - - const now = new Date() - const regEnd = new Date(activity.signupDeadline) - - return now <= regEnd && - activity.state === 1 && - (!activity.playerMax || this.data.currentParticipants < activity.playerMax) && - !this.data.isRegistered - }, - - // 鑾峰彇鎶ュ悕鎸夐挳鐘舵�佸拰鏂囨湰 - getRegisterButtonStatus() { - const activity = this.data.activity - if (!activity) { - return { canRegister: false, buttonText: '鏆備笉鍙姤鍚�', disabled: true } - } - - // 濡傛灉宸叉姤鍚� - if (this.data.isRegistered) { - return { canRegister: false, buttonText: '鏌ョ湅鎶ュ悕鐘舵��', disabled: false } - } - - const now = new Date() - const regEnd = new Date(activity.signupDeadline) - - // 妫�鏌ユ姤鍚嶆埅姝㈡椂闂� - if (now > regEnd) { - return { canRegister: false, buttonText: '鎶ュ悕宸茬粨鏉�', disabled: true } - } - - // 妫�鏌ユ姤鍚嶄汉鏁版槸鍚﹀凡婊� - if (activity.playerMax && this.data.currentParticipants >= activity.playerMax) { - return { canRegister: false, buttonText: '浜烘暟宸叉弧', disabled: true } - } - - // 妫�鏌ユ椿鍔ㄧ姸鎬� - if (activity.state !== 1) { - return { canRegister: false, buttonText: '鏆備笉鍙姤鍚�', disabled: true } - } - - // 鍙互鎶ュ悕 - return { canRegister: true, buttonText: '绔嬪嵆鎶ュ悕', disabled: false } - }, - - // 鏇存柊鎶ュ悕鐘舵�� - updateCanRegisterStatus() { - const buttonStatus = this.getRegisterButtonStatus() - this.setData({ - canRegisterStatus: buttonStatus.canRegister, - registerButtonText: buttonStatus.buttonText, - registerButtonDisabled: buttonStatus.disabled - }) + return startDate || endDate; } -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/wx/pages/activity/detail.json b/wx/pages/activity/detail.json index 5a71acd..024dea3 100644 --- a/wx/pages/activity/detail.json +++ b/wx/pages/activity/detail.json @@ -1,5 +1,4 @@ { - "navigationBarTitleText": "璧涗簨璇︽儏", - "enablePullDownRefresh": false, - "backgroundTextStyle": "dark" + "usingComponents": {}, + "navigationBarTitleText": "姣旇禌璇︽儏" } \ No newline at end of file diff --git a/wx/pages/activity/detail.wxml b/wx/pages/activity/detail.wxml index be9286c..d155420 100644 --- a/wx/pages/activity/detail.wxml +++ b/wx/pages/activity/detail.wxml @@ -1,119 +1,70 @@ -<!--pages/activity/detail.wxml--> -<view class="container" wx:if="{{!loading && activity}}"> - <!-- 澶撮儴濯掍綋鍖哄煙 --> - <view class="media-section"> - <swiper - class="media-swiper" - indicator-dots="{{mediaFiles.length > 1}}" - autoplay="{{false}}" - duration="{{500}}" - > - <swiper-item - wx:for="{{mediaFiles}}" - wx:key="url" - bindtap="onMediaTap" - data-index="{{index}}" - > - <image - wx:if="{{item.type === 'image'}}" - class="media-image" - src="{{item.url}}" - mode="aspectFill" - /> - <view wx:if="{{item.type === 'video'}}" class="video-wrapper"> - <image class="video-poster" src="{{item.url}}" mode="aspectFill" /> - <view class="video-play-btn">鈻�</view> - </view> +<wxs src="./detail.wxs" module="filters" /> + +<view class="container"> + <view wx:if="{{loading}}" class="loading-wrapper"> + <view class="loading"></view> + <text>鍔犺浇涓�...</text> + </view> + + <view wx:elif="{{error}}" class="error-wrapper"> + <text>{{error}}</text> + </view> + + <block wx:else> + <!-- 椤堕儴 Banner --> + <swiper class="banner-swiper" indicator-dots="{{true}}" autoplay="{{true}}"> + <swiper-item wx:if="{{activity.coverImage}}"> + <image class="banner-image" src="{{activity.coverImage.fullUrl}}" mode="aspectFill" /> + </swiper-item> + <swiper-item wx:for="{{activity.images}}" wx:key="index"> + <image class="banner-image" src="{{item.fullUrl}}" mode="aspectFill" /> </swiper-item> </swiper> - - <!-- 鐘舵�佹爣绛� --> - <view class="status-badge {{getStatusClass(activity.state)}}"> - {{getStatusText(activity.state)}} - </view> - </view> - <!-- 鍩烘湰淇℃伅 --> - <view class="info-section card"> - <view class="card-body"> - <view class="activity-title">{{activity.name}}</view> - <view class="activity-desc">{{activity.description}}</view> - - <!-- 鏃堕棿淇℃伅 --> - <view class="time-info"> - <view class="time-item"> - <view class="time-label">娲诲姩鏃堕棿</view> - <view class="time-value">{{activity.formattedMatchTime || '寰呭畾'}}</view> - </view> - <view class="time-item"> - <view class="time-label">鎶ュ悕鎴</view> - <view class="time-value">{{activity.formattedSignupDeadline || '寰呭畾'}}</view> + <view class="content-wrapper"> + <!-- 姣旇禌淇℃伅 --> + <view class="section-card"> + <view class="section-title main-title">{{activity.name}}</view> + <view class="info-grid"> + <view class="info-row"> + <text class="info-label">鎶ュ悕鎴鏃堕棿</text> + <text class="info-value">{{filters.formatDateTime(activity.signupDeadline)}}</text> + </view> + <view class="info-row"> + <text class="info-label">姣旇禌寮�濮嬫椂闂�</text> + <text class="info-value">{{filters.formatDateTime(activity.matchTime)}}</text> + </view> </view> </view> - <!-- 鍦扮偣淇℃伅 --> - <view class="location-info" wx:if="{{activity.address}}"> - <view class="location-label">馃搷 娲诲姩鍦扮偣</view> - <view class="location-value"> - <text class="address">{{activity.address}}</text> + <!-- 姣旇禌闃舵 --> + <view class="section-card" wx:if="{{activity.stages && activity.stages.length > 0}}"> + <view class="section-title">姣旇禌闃舵</view> + <view class="timeline"> + <view class="timeline-item" wx:for="{{activity.stages}}" wx:key="id"> + <view class="timeline-icon"> + <view class="icon-calendar-bg"></view> + </view> + <view class="timeline-content"> + <view class="stage-name">{{item.name}}</view> + <view class="stage-date">{{filters.formatDate(item.matchTime)}}</view> + </view> + </view> </view> </view> - <!-- 鎶ュ悕杩涘害 --> - <view class="registration-progress" wx:if="{{activity.playerMax > 0}}"> - <view class="progress-header"> - <view class="progress-label">鎶ュ悕杩涘害</view> - <view class="progress-count">{{currentParticipants}}/{{activity.playerMax}}</view> + <!-- 姣旇禌浠嬬粛 --> + <view class="section-card" wx:if="{{activity.description}}"> + <view class="section-title">姣旇禌浠嬬粛</view> + <view class="description-content"> + <text>{{activity.description}}</text> </view> - <view class="progress-bar"> - <view - class="progress-fill" - style="width: {{getRegistrationProgress()}}%" - ></view> - </view> - <view class="progress-percent">{{getRegistrationProgress()}}%</view> - </view> - - </view> - </view> - - - - <!-- 搴曢儴鎿嶄綔鏍� --> - <view class="bottom-actions"> - <view class="action-left"> - <view class="share-btn" bindtap="onShareTap"> - <text class="share-icon">馃摛</text> - <text class="share-text">鍒嗕韩</text> </view> </view> - <view class="action-right"> - <!-- 缁熶竴鐨勬姤鍚嶆寜閽� --> - <view - class="register-btn btn {{registerButtonDisabled ? 'btn-disabled' : (canRegisterStatus ? 'btn-primary' : 'btn-secondary')}}" - bindtap="onRegisterTap" - > - {{registerButtonText}} - </view> + + <!-- 搴曢儴鎿嶄綔鏍� --> + <view class="footer-actions"> + <button class="register-btn" bindtap="handleRegister" disabled="{{buttonDisabled}}">{{buttonText}}</button> </view> - </view> -</view> - -<!-- 鍔犺浇鐘舵�� --> -<view class="loading-wrapper" wx:if="{{loading}}"> - <view class="loading"></view> - <text class="loading-text">鍔犺浇涓�...</text> -</view> - -<!-- 瑙嗛棰勮寮圭獥 --> -<view class="media-preview-modal" wx:if="{{showMediaPreview}}" bindtap="closeMediaPreview"> - <view class="modal-content" catchtap=""> - <video - class="preview-video" - src="{{mediaFiles[currentMediaIndex].url}}" - controls="{{true}}" - autoplay="{{true}}" - ></video> - <view class="close-btn" bindtap="closeMediaPreview">鉁�</view> - </view> + </block> </view> \ No newline at end of file diff --git a/wx/pages/activity/detail.wxs b/wx/pages/activity/detail.wxs new file mode 100644 index 0000000..242b16c --- /dev/null +++ b/wx/pages/activity/detail.wxs @@ -0,0 +1,31 @@ +var utils = require('../../lib/utils.wxs'); + +var formatDateTime = function(dateStr) { + return utils.formatDate(dateStr, 'YYYY-MM-DD HH:mm'); +}; + +var formatDate = function(dateStr) { + return utils.formatDate(dateStr, 'YYYY-MM-DD'); +}; + +var formatDateRange = function(start, end) { + if (!start && !end) return '寰呭畾'; + + var startDate = start ? utils.formatDate(start, 'YYYY-MM-DD') : ''; + var endDate = end ? utils.formatDate(end, 'YYYY-MM-DD') : ''; + + // 濡傛灉鏍煎紡鍖栧嚱鏁拌繑鍥炰簡鍗犱綅绗︼紝瑙嗕负绌哄瓧绗︿覆 + if (startDate === '鈥�') startDate = ''; + if (endDate === '鈥�') endDate = ''; + + if (startDate && endDate && startDate !== endDate) { + return startDate + ' - ' + endDate; + } + return startDate || endDate || '寰呭畾'; +}; + +module.exports = { + formatDateTime: formatDateTime, + formatDateRange: formatDateRange, + formatDate: formatDate +}; \ No newline at end of file diff --git a/wx/pages/activity/detail.wxss b/wx/pages/activity/detail.wxss index 9393e64..a286c07 100644 --- a/wx/pages/activity/detail.wxss +++ b/wx/pages/activity/detail.wxss @@ -1,449 +1,170 @@ /* pages/activity/detail.wxss */ - -/* 濯掍綋鍖哄煙鏍峰紡 */ -.media-section { - position: relative; - margin-bottom: 20rpx; +.container { + background-color: #f4f5f7; + min-height: 100vh; + padding-bottom: 180rpx; /* 涓哄簳閮ㄦ寜閽暀鍑虹┖闂� */ } -.media-swiper { - height: 500rpx; -} - -.media-image { - width: 100%; - height: 100%; -} - -.video-wrapper { - position: relative; - width: 100%; - height: 100%; -} - -.video-poster { - width: 100%; - height: 100%; -} - -.video-play-btn { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 120rpx; - height: 120rpx; - background: rgba(0, 0, 0, 0.7); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: #ffffff; - font-size: 48rpx; -} - -.status-badge { - position: absolute; - top: 30rpx; - right: 30rpx; - padding: 12rpx 24rpx; - background: rgba(0, 0, 0, 0.8); - color: #ffffff; - border-radius: 30rpx; - font-size: 24rpx; - font-weight: bold; -} - -/* 鍩烘湰淇℃伅鏍峰紡 */ -.info-section { - margin-bottom: 20rpx; -} - -.activity-title { - font-size: 40rpx; - font-weight: bold; - color: #333333; - margin-bottom: 20rpx; - line-height: 1.4; -} - -.activity-desc { - font-size: 28rpx; - color: #666666; - line-height: 1.6; - margin-bottom: 30rpx; -} - -/* 鏃堕棿淇℃伅鏍峰紡 */ -.time-info { - margin-bottom: 30rpx; -} - -.time-item { - display: flex; - margin-bottom: 16rpx; - font-size: 26rpx; -} - -.time-label { - color: #999999; - min-width: 140rpx; - margin-right: 20rpx; -} - -.time-value { - color: #333333; - flex: 1; - font-weight: 500; -} - -/* 鍦扮偣淇℃伅鏍峰紡 */ -.location-info { - margin-bottom: 30rpx; - padding: 24rpx; - background: #f8f9fa; - border-radius: 12rpx; - border-left: 6rpx solid #1976d2; -} - -.location-label { - font-size: 26rpx; - color: #1976d2; - font-weight: bold; - margin-bottom: 12rpx; -} - -.location-value { - font-size: 28rpx; - color: #333333; - line-height: 1.5; -} - -.address { - display: block; - color: #666666; - font-size: 24rpx; - margin-top: 8rpx; -} - -/* 鎶ュ悕杩涘害鏍峰紡 */ -.registration-progress { - margin-bottom: 30rpx; -} - -.progress-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 16rpx; -} - -.progress-label { - font-size: 26rpx; - color: #333333; - font-weight: 500; -} - -.progress-count { - font-size: 26rpx; - color: #1976d2; - font-weight: bold; -} - -.progress-bar { - height: 12rpx; - background: #e0e0e0; - border-radius: 6rpx; - overflow: hidden; - margin-bottom: 12rpx; -} - -.progress-fill { - height: 100%; - background: linear-gradient(90deg, #1976d2, #42a5f5); - border-radius: 6rpx; - transition: width 0.3s ease; -} - -.progress-percent { +.loading-wrapper, .error-wrapper { + padding-top: 200rpx; text-align: center; - font-size: 24rpx; - color: #1976d2; - font-weight: bold; + color: #999; } -/* 鏍囩鏍峰紡 */ -.tags { - margin-bottom: 20rpx; +.banner-swiper { + width: 100%; + height: 400rpx; + background-color: #e9ecef; } -.tag { - display: inline-block; - padding: 8rpx 20rpx; - background: #e3f2fd; - color: #1976d2; - border-radius: 24rpx; - font-size: 22rpx; - margin-right: 16rpx; - margin-bottom: 12rpx; +.banner-image { + width: 100%; + height: 100%; } -/* 鍐呭鍖哄煙鏍峰紡 */ -.content-section, -.requirements-section, -.prizes-section, -.rules-section, -.organizer-section { - margin-bottom: 20rpx; +.content-wrapper { + padding: 32rpx; +} + +.section-card { + background-color: #fff; + border-radius: 16rpx; + padding: 32rpx; + margin-bottom: 32rpx; } .section-title { - font-size: 32rpx; - font-weight: bold; - color: #333333; + font-size: 36rpx; + font-weight: 700; + color: #1f2937; + margin-bottom: 32rpx; } -.content-text, -.requirements-text, -.prizes-text, -.rules-text { - font-size: 28rpx; - color: #333333; - line-height: 1.8; +.main-title { + font-size: 40rpx; + margin-bottom: 24rpx; } -/* 涓诲姙鏂逛俊鎭牱寮� */ -.organizer-item { +.info-grid { display: flex; - margin-bottom: 20rpx; - font-size: 26rpx; + flex-direction: column; } -.organizer-label { - color: #999999; - min-width: 140rpx; - margin-right: 20rpx; -} - -.organizer-value { - color: #333333; - flex: 1; -} - -.contact-phone { - color: #1976d2; - text-decoration: underline; -} - -/* 搴曢儴鎿嶄綔鏍忔牱寮� */ -.bottom-actions { - position: fixed; - bottom: 0; - left: 0; - right: 0; - background: #ffffff; - border-top: 1rpx solid #f0f0f0; - padding: 20rpx; +.info-row { display: flex; - align-items: center; justify-content: space-between; - box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.1); - z-index: 100; -} - -.action-left { - flex: 0 0 auto; -} - -.share-btn { - display: flex; - flex-direction: column; align-items: center; - padding: 12rpx 20rpx; - color: #666666; -} - -.share-icon { - font-size: 32rpx; - margin-bottom: 4rpx; -} - -.share-text { - font-size: 20rpx; -} - -.action-right { - flex: 1; - margin-left: 20rpx; -} - -.register-btn, -.status-btn, -.disabled-btn { - width: 100%; - padding: 24rpx 0; - font-size: 32rpx; - font-weight: bold; - border-radius: 12rpx; - text-align: center; -} - -/* 閫氱敤鎸夐挳鏍峰紡 */ -.btn { - width: 100%; - padding: 24rpx 0; - font-size: 32rpx; - font-weight: bold; - border-radius: 12rpx; - text-align: center; - transition: all 0.3s ease; -} - -/* 涓昏鎸夐挳鏍峰紡 - 鍙互鎶ュ悕 */ -.btn-primary { - background: linear-gradient(90deg, #1976d2, #42a5f5); - color: #ffffff; - box-shadow: 0 4rpx 12rpx rgba(25, 118, 210, 0.3); -} - -.btn-primary:active { - transform: translateY(2rpx); - box-shadow: 0 2rpx 8rpx rgba(25, 118, 210, 0.3); -} - -/* 娆¤鎸夐挳鏍峰紡 - 宸叉姤鍚嶇瓑鐘舵�� */ -.btn-secondary { - background: #f5f5f5; - color: #666666; - border: 2rpx solid #e0e0e0; -} - -.btn-secondary:active { - background: #eeeeee; -} - -/* 绂佺敤鎸夐挳鏍峰紡 - 鎶ュ悕宸茬粨鏉熴�佷汉鏁板凡婊$瓑 */ -.btn-disabled { - background: #f5f5f5 !important; - color: #cccccc !important; - cursor: not-allowed; - box-shadow: none !important; - border: 2rpx solid #f0f0f0; -} - -.btn-disabled:active { - transform: none !important; - box-shadow: none !important; -} - -/* 淇濇寔鍘熸湁鏍峰紡鍏煎鎬� */ -.register-btn { - background: linear-gradient(90deg, #1976d2, #42a5f5); - color: #ffffff; - box-shadow: 0 4rpx 12rpx rgba(25, 118, 210, 0.3); -} - -.status-btn { - background: #f5f5f5; - color: #666666; - border: 2rpx solid #e0e0e0; -} - -.disabled-btn { - background: #f5f5f5; - color: #cccccc; - cursor: not-allowed; -} - -/* 鍔犺浇鐘舵�佹牱寮� */ -.loading-wrapper { - display: flex; - flex-direction: column; - align-items: center; - padding: 120rpx 0; -} - -.loading-text { - margin-top: 20rpx; font-size: 28rpx; - color: #999999; + padding: 28rpx 0; + border-bottom: 1rpx solid #f0f0f0; +} +.info-row:first-child { + padding-top: 0; +} +.info-row:last-child { + border-bottom: none; + padding-bottom: 0; } -/* 瑙嗛棰勮寮圭獥鏍峰紡 */ -.media-preview-modal { +.info-label { + color: #6b7280; +} + +.info-value { + color: #1f2937; + font-weight: 500; +} + +/* 鏃堕棿杞� */ +.timeline { + position: relative; + padding-left: 40rpx; + border-left: 2rpx solid #e5e7eb; +} + +.timeline-item { + position: relative; + display: flex; + align-items: flex-start; + padding-bottom: 48rpx; +} + +.timeline-item:last-child { + padding-bottom: 0; +} + +.timeline-icon { + position: absolute; + left: -21rpx; /* (40rpx - 2rpx)/2 */ + top: 4rpx; + width: 40rpx; + height: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 1; +} + +.icon-calendar-bg { + width: 40rpx; + height: 40rpx; + background-color: #e0e7ff; + border-radius: 50%; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23007aff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); + background-size: 24rpx 24rpx; + background-repeat: no-repeat; + background-position: center; +} + +.timeline-content { + padding-left: 32rpx; +} + +.stage-name { + font-size: 30rpx; + font-weight: 600; + color: #1f2937; + margin-bottom: 8rpx; +} + +.stage-date { + font-size: 26rpx; + color: #6b7280; +} + +.description-content { + font-size: 28rpx; + color: #374151; + line-height: 1.6; + white-space: pre-wrap; /* 淇濈暀鎹㈣鍜岀┖鏍� */ +} + +/* 搴曢儴鎿嶄綔鏍� */ +.footer-actions { position: fixed; - top: 0; + bottom: 0; left: 0; right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.9); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; + background-color: #fff; + padding: 24rpx 32rpx; + padding-bottom: calc(24rpx + constant(safe-area-inset-bottom)); + padding-bottom: calc(24rpx + env(safe-area-inset-bottom)); + border-top: 1rpx solid #e5e7eb; + box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.05); } -.modal-content { - position: relative; - width: 90%; - max-width: 600rpx; -} - -.preview-video { - width: 100%; - height: auto; - border-radius: 12rpx; -} - -.close-btn { - position: absolute; - top: -80rpx; - right: 0; - width: 60rpx; - height: 60rpx; - background: rgba(255, 255, 255, 0.2); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: #ffffff; +.register-btn { + background-color: #007aff; + color: #fff; font-size: 32rpx; - font-weight: bold; + font-weight: 600; + border-radius: 999rpx; + height: 96rpx; + line-height: 96rpx; + text-align: center; + border: none; } -/* 椤甸潰搴曢儴鐣欑櫧锛岄伩鍏嶈搴曢儴鎿嶄綔鏍忛伄鎸� */ -.container { - padding-bottom: 140rpx; -} - -/* 鍝嶅簲寮忛�傞厤 */ -@media screen and (max-width: 375px) { - .media-swiper { - height: 450rpx; - } - - .activity-title { - font-size: 36rpx; - } - - .bottom-actions { - padding: 16rpx; - } - - .register-btn, - .status-btn, - .disabled-btn { - padding: 20rpx 0; - font-size: 28rpx; - } -} - -@media screen and (min-width: 414px) { - .media-swiper { - height: 550rpx; - } - - .activity-title { - font-size: 44rpx; - } +.register-btn:active { + background-color: #0056b3; } \ No newline at end of file diff --git a/wx/pages/index/filters.wxs b/wx/pages/index/filters.wxs new file mode 100644 index 0000000..a150602 --- /dev/null +++ b/wx/pages/index/filters.wxs @@ -0,0 +1,32 @@ +var formatDateYYYYMMDD = function (val) { + // 寮哄埗杞崲涓哄瓧绗︿覆锛屽吋瀹� null, undefined, number 绛夌被鍨� + var s = '' + val; + + if (s.length < 10) { + return '鈥�'; + } + + var out = ''; + + // 浼樺厛澶勭悊 '2024-07-31...' 鏍煎紡 + if (s.charAt(4) === '-' && s.charAt(7) === '-') { + out = s.slice(0, 10); // 浣跨敤 slice 鏇挎崲 substr + return out; + } + + // 澶囩敤澶勭悊 '2024/07/31...' 鏍煎紡 + if (s.charAt(4) === '/' && s.charAt(7) === '/') { + var year = s.slice(0, 4); + var month = s.slice(5, 7); + var day = s.slice(8, 10); + out = year + '-' + month + '-' + day; + return out; + } + + // 瀵逛簬鏃犳硶璇嗗埆鐨勫瓧绗︿覆鏍煎紡锛岃繑鍥炲崰浣嶇 + return '鈥�'; +}; + +module.exports = { + formatDateYYYYMMDD: formatDateYYYYMMDD +}; \ No newline at end of file diff --git a/wx/pages/index/index.js b/wx/pages/index/index.js index 3b64423..4c96146 100644 --- a/wx/pages/index/index.js +++ b/wx/pages/index/index.js @@ -32,6 +32,8 @@ onShow() { console.log('棣栭〉鏄剧ず') + // 缁熶竴绯荤粺瀵艰埅鏍忔爣棰� + try { wx.setNavigationBarTitle({ title: '钃夋槗鍒�' }) } catch (e) {} // 妫�鏌ョ櫥褰曠姸鎬� if (!app.globalData.token) { app.login() @@ -203,6 +205,10 @@ }).then(data => { if (data.activities) { let newActivities = data.activities.content + // 璋冭瘯锛氳緭鍑烘姤鍚嶆埅姝㈠師濮嬪�� + try { + console.log('娲诲姩鍘熷鎶ュ悕鎴:', newActivities.map(a => ({ id: a.id, name: a.name, signupDeadline: a.signupDeadline }))) + } catch (e) {} // 涓烘瘡涓椿鍔ㄦ坊鍔犲悕绉版枃瀛� newActivities = newActivities.map(activity => ({ @@ -337,6 +343,38 @@ return utils.formatDate(date, 'MM-DD HH:mm') }, + // 璁捐绋块渶瑕佺殑 YYYY-MM-DD锛堝己鍏煎锛氱洿鎺ユ埅鍙栧墠10浣嶏紝閬垮厤 JSCore 鏃ユ湡瑙f瀽宸紓锛� + formatDateYYYYMMDD(date) { + if (!date && date !== 0) return '鈥�' + // 瀛楃涓诧細浼樺厛鍖归厤 YYYY-MM-DD 鐩存帴杩斿洖锛岄伩鍏嶈В鏋� + if (typeof date === 'string') { + const m = date.match(/^(\d{4}-\d{2}-\d{2})/) + if (m) return m[1] + } + // 鏁板�硷細鏃堕棿鎴筹紙绉�/姣锛夊厹搴� + if (typeof date === 'number') { + const ts = date > 1e12 ? date : date * 1000 + const d = new Date(ts) + if (!isNaN(d.getTime())) { + const y = d.getFullYear() + const m = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + return `${y}-${m}-${day}` + } + } + // 鍏朵粬鎯呭喌璧板伐鍏峰嚱鏁板厹搴� + const v = utils.formatDate(date, 'YYYY-MM-DD') + return v && typeof v === 'string' && v.trim() ? v : '鈥�' + }, + + // 鐐瑰嚮鈥滆鎯呪�濇寜閽紙涓庡崱鐗囩偣鍑讳竴鑷达級 + onDetailTap(e) { + const id = e.currentTarget.dataset.id + if (id) { + this.goToActivityDetail(id) + } + }, + // 鑾峰彇鐘舵�佹枃鏈� getStatusText(state) { const statusMap = { diff --git a/wx/pages/index/index.json b/wx/pages/index/index.json index bb44afc..b92d296 100644 --- a/wx/pages/index/index.json +++ b/wx/pages/index/index.json @@ -1,6 +1,3 @@ { - "navigationBarTitleText": "钃夋槗鍒�", - "enablePullDownRefresh": true, - "onReachBottomDistance": 50, - "backgroundTextStyle": "dark" + "navigationBarTitleText": "钃夋槗鍒�" } \ No newline at end of file diff --git a/wx/pages/index/index.wxml b/wx/pages/index/index.wxml index 5458348..9018761 100644 --- a/wx/pages/index/index.wxml +++ b/wx/pages/index/index.wxml @@ -1,3 +1,4 @@ +<wxs src="./filters.wxs" module="filters" /> <!--pages/index/index.wxml--> <view class="container"> <!-- 鎼滅储鏍� - 鏆傛椂闅愯棌 --> @@ -50,8 +51,9 @@ <view wx:else class="banner-placeholder"> <text class="placeholder-text">{{item.title}}</text> </view> - - <view class="banner-overlay"> + + <!-- 瑕嗙洊灞傞殣钘� --> + <view class="banner-overlay" style="display: none;"> <view class="banner-title">{{item.title}}</view> <view class="banner-desc">{{item.content}}</view> </view> @@ -59,117 +61,39 @@ </swiper> </view> - <!-- 绛涢�夋爮 --> - <view class="filter-bar"> + <!-- 妯″潡鏍囬 --> + <view class="section-title">姣旇禌淇℃伅</view> + + <!-- 绛涢�夋爮锛堥殣钘忥紝淇濈暀閫昏緫锛� --> + <view class="filter-bar" wx:if="{{false}}"> <view class="filter-tabs"> - <view - class="filter-tab {{filterStatus === 'all' ? 'active' : ''}}" - bindtap="onFilterChange" - data-status="all" - > - 鍏ㄩ儴 - </view> - <view - class="filter-tab {{filterStatus === 'SIGNUP' ? 'active' : ''}}" - bindtap="onFilterChange" - data-status="SIGNUP" - > - 鎶ュ悕涓� - </view> - <view - class="filter-tab {{filterStatus === 'PLAYING' ? 'active' : ''}}" - bindtap="onFilterChange" - data-status="PLAYING" - > - 杩涜涓� - </view> - <view - class="filter-tab {{filterStatus === 'ENDED' ? 'active' : ''}}" - bindtap="onFilterChange" - data-status="ENDED" - > - 宸茬粨鏉� - </view> + <view class="filter-tab {{filterStatus === 'all' ? 'active' : ''}}" bindtap="onFilterChange" data-status="all">鍏ㄩ儴</view> + <view class="filter-tab {{filterStatus === 'SIGNUP' ? 'active' : ''}}" bindtap="onFilterChange" data-status="SIGNUP">鎶ュ悕涓�</view> + <view class="filter-tab {{filterStatus === 'PLAYING' ? 'active' : ''}}" bindtap="onFilterChange" data-status="PLAYING">杩涜涓�</view> + <view class="filter-tab {{filterStatus === 'ENDED' ? 'active' : ''}}" bindtap="onFilterChange" data-status="ENDED">宸茬粨鏉�</view> </view> </view> - <!-- 璧涗簨鍒楄〃 --> + <!-- 璧涗簨鍒楄〃锛氭柊鐗堟按骞冲崱鐗囷紙宸﹀浘鍙虫枃锛屾寜閽潬鍙筹級 --> <view class="activity-list"> <view - class="activity-card card" - wx:for="{{activities}}" + class="activity-card-horizontal" + wx:for="{{activities}}" wx:key="id" - bindtap="onActivityTap" - data-index="{{index}}" > - <!-- 璧涗簨灏侀潰 --> - <view class="activity-cover"> - <image wx:if="{{item.coverImage && item.coverImage.fullUrl}}" class="cover-image" src="{{item.coverImage.fullUrl}}" mode="aspectFill" /> - <view wx:else class="cover-placeholder"> - <text class="cover-placeholder-text">{{item.nameText}}</text> + <view class="activity-row"> + <view class="thumb-col"> + <image wx:if="{{item.coverImage && item.coverImage.fullUrl}}" class="thumb-image" src="{{item.coverImage.fullUrl}}" mode="aspectFill" /> + <view wx:else class="thumb-placeholder">{{item.nameText}}</view> </view> - <view class="status-badge {{getStatusClass(item.state)}}"> - {{item.stateName}} - </view> - </view> - - <!-- 璧涗簨淇℃伅 --> - <view class="activity-info"> - <view class="activity-title">{{item.name}}</view> - <view class="activity-desc">{{item.description}}</view> - - <!-- 鏃堕棿淇℃伅 --> - <view class="time-info"> - <view class="time-item"> - <text class="time-label">娲诲姩鏃堕棿锛�</text> - <text class="time-value">{{formatDate(item.matchTime)}}</text> + <view class="info-col"> + <view class="activity-title-lg">{{item.name}}</view> + + <view class="deadline">鎶ュ悕鎴锛歿{filters.formatDateYYYYMMDD(item.signupDeadline)}}</view> + <view class="registered">宸叉姤鍚嶏細{{item.playerCount}}浜�</view> + <view class="btn-row"> + <button class="ghost-btn" catchtap="onDetailTap" data-id="{{item.id}}">鏌ョ湅璇︽儏</button> </view> - <view class="time-item" wx:if="{{item.signupDeadline}}"> - <text class="time-label">鎶ュ悕鎴锛�</text> - <text class="time-value">{{formatDate(item.signupDeadline)}}</text> - </view> - </view> - - <!-- 鍦扮偣淇℃伅 --> - <view class="location-info" wx:if="{{item.address}}"> - <text class="location-icon">馃搷</text> - <text class="location-text">{{item.address}}</text> - </view> - - <!-- 鎶ュ悕杩涘害鍜屾搷浣滄寜閽� --> - <view class="bottom-info"> - <view class="registration-info" wx:if="{{item.playerMax > 0}}"> - <view class="progress-row"> - <text class="progress-text">鎶ュ悕浜烘暟锛歿{item.playerCount}}/{{item.playerMax}}</text> - <view class="activity-actions"> - <view class="action-btn btn btn-primary" wx:if="{{canRegister(item)}}"> - 绔嬪嵆鎶ュ悕 - </view> - <view class="action-btn btn btn-secondary" wx:else> - 鏌ョ湅璇︽儏 - </view> - </view> - </view> - <view class="progress-bar"> - <view - class="progress-fill" - style="width: {{getRegistrationProgress(item.playerCount, item.playerMax)}}%" - ></view> - </view> - </view> - <view class="activity-actions" wx:else> - <view class="action-btn btn btn-primary" wx:if="{{canRegister(item)}}"> - 绔嬪嵆鎶ュ悕 - </view> - <view class="action-btn btn btn-secondary" wx:else> - 鏌ョ湅璇︽儏 - </view> - </view> - </view> - - <!-- 鏍囩 --> - <view class="tags" wx:if="{{item.tags && item.tags.length > 0}}"> - <text class="tag" wx:for="{{item.tags}}" wx:key="*this">{{item}}</text> </view> </view> </view> diff --git a/wx/pages/index/index.wxss b/wx/pages/index/index.wxss index 00624fe..10ba3b4 100644 --- a/wx/pages/index/index.wxss +++ b/wx/pages/index/index.wxss @@ -47,11 +47,14 @@ /* 杞挱鍥炬牱寮� */ .banner-section { - margin-bottom: 20rpx; + margin-bottom: 24rpx; + padding: 0 20rpx; } .banner-swiper { height: 400rpx; + border-radius: 24rpx; + overflow: hidden; } .banner-media { @@ -163,6 +166,14 @@ white-space: nowrap; } +/* 妯″潡鏍囬 */ +.section-title { + padding: 20rpx 20rpx 12rpx; + font-size: 40rpx; + font-weight: 700; + color: #0f172a; +} + /* 绛涢�夋爮鏍峰紡 */ .filter-bar { background: #ffffff; @@ -194,6 +205,101 @@ padding: 0 20rpx; } +/* 鏂扮増姘村钩鍗$墖 */ +.activity-card-horizontal { + background: #ffffff; + border-radius: 20rpx; + padding: 24rpx; + margin: 24rpx 0 0; +} + +.activity-row { + display: flex; + align-items: center; + gap: 24rpx; +} + +.info-col { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + padding-top: 2rpx; +} +.btn-row { + width: 100%; + margin-top: auto; /* 灏嗘寜閽帹鍒板簳閮� */ + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.deadline { + font-size: 24rpx; + color: #64748b; + margin-bottom: 10rpx; +} + +.activity-title-lg { + font-size: 34rpx; + font-weight: 700; + color: #0f172a; + line-height: 1.3; + margin-bottom: 12rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.registered { + font-size: 24rpx; + color: #94a3b8; + margin-bottom: 16rpx; +} + +.ghost-btn { + background: #E6F0FF; + color: #007aff; + font-size: 26rpx; + padding: 14rpx 0; + border-radius: 999rpx; + line-height: 1; + border: none; + width: 140rpx; + text-align: center; + /* align-self 宸茬Щ闄わ紝鐢辩埗绾� .btn-row 鎺у埗瀵归綈 */ +} + +.ghost-btn:active { + background: #e2e8f0; +} + +.thumb-col { + width: 192rpx; + height: 192rpx; + flex-shrink: 0; + border-radius: 20rpx; + overflow: hidden; +} + +.thumb-image { + width: 100%; + height: 100%; + border-radius: 20rpx; +} + +.thumb-placeholder { + width: 100%; + height: 100%; + background: #e2e8f0; + color: #475569; + font-size: 36rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 20rpx; +} + .activity-card { margin-bottom: 30rpx; overflow: hidden; diff --git a/wx/pages/message/message.js b/wx/pages/message/message.js index 62900ba..4fa1f29 100644 --- a/wx/pages/message/message.js +++ b/wx/pages/message/message.js @@ -73,38 +73,4 @@ }) }, - // 鏍煎紡鍖栨秷鎭椂闂� - formatMessageTime(timeStr) { - if (!timeStr) return '' - - try { - const date = new Date(timeStr) - const now = new Date() - const diff = now.getTime() - date.getTime() - - // 濡傛灉鏄粖澶� - if (diff < 24 * 60 * 60 * 1000) { - const hours = date.getHours().toString().padStart(2, '0') - const minutes = date.getMinutes().toString().padStart(2, '0') - return `${hours}:${minutes}` - } - - // 濡傛灉鏄槰澶� - if (diff < 48 * 60 * 60 * 1000) { - const hours = date.getHours().toString().padStart(2, '0') - const minutes = date.getMinutes().toString().padStart(2, '0') - return `鏄ㄥぉ ${hours}:${minutes}` - } - - // 鍏朵粬鏃ユ湡 - const month = (date.getMonth() + 1).toString().padStart(2, '0') - const day = date.getDate().toString().padStart(2, '0') - const hours = date.getHours().toString().padStart(2, '0') - const minutes = date.getMinutes().toString().padStart(2, '0') - return `${month}-${day} ${hours}:${minutes}` - } catch (error) { - console.error('鏃堕棿鏍煎紡鍖栧け璐�:', error) - return timeStr - } - } }) \ No newline at end of file diff --git a/wx/pages/message/message.json b/wx/pages/message/message.json index 107a027..ecfce7a 100644 --- a/wx/pages/message/message.json +++ b/wx/pages/message/message.json @@ -1,6 +1,5 @@ { - "navigationBarTitleText": "娑堟伅涓績", + "navigationBarTitleText": "娑堟伅", "enablePullDownRefresh": true, - "onReachBottomDistance": 50, "backgroundTextStyle": "dark" } \ No newline at end of file diff --git a/wx/pages/message/message.wxml b/wx/pages/message/message.wxml index bb9e218..f9c22e5 100644 --- a/wx/pages/message/message.wxml +++ b/wx/pages/message/message.wxml @@ -1,4 +1,5 @@ -<!--pages/message/message.wxml--> +<wxs module="utils" src="./utils.wxs" /> + <view class="container"> <!-- 鍔犺浇鐘舵�� --> <view wx:if="{{loading}}" class="loading-container"> @@ -7,28 +8,24 @@ </view> <!-- 娑堟伅鍐呭 --> - <view wx:else class="message-content"> - <!-- 娑堟伅缁熻 --> - <view class="message-stats"> - <text class="stats-text">鍏� {{messages.length}} 鏉℃秷鎭�</text> + <view wx:else> + <!-- 绌虹姸鎬� --> + <view wx:if="{{messages.length === 0}}" class="empty-state"> + <text class="empty-icon icon ic-list"></text> + <text class="empty-text">鏆傛棤娑堟伅</text> </view> <!-- 娑堟伅鍒楄〃 --> - <view class="message-list"> - <!-- 绌虹姸鎬� --> - <view wx:if="{{messages.length === 0}}" class="empty-state"> - <text class="empty-icon">馃摥</text> - <text class="empty-text">鏆傛棤娑堟伅</text> - </view> - - <!-- 娑堟伅椤� --> - <view - wx:for="{{messages}}" - wx:key="id" - class="message-item" - > - <view class="message-content-text">{{item.content}}</view> - <view class="message-time">{{item.formattedTime}}</view> + <view wx:else class="message-list"> + <view wx:for="{{messages}}" wx:key="id" class="message-card"> + <view class="icon-wrapper"> + <!-- 鎸夎姹備娇鐢ㄧ粺涓�鍥炬爣 --> + <icon type="info" size="22" color="#FFFFFF"></icon> + </view> + <view class="text-wrapper"> + <text class="title">{{item.content}}</text> + <text class="timestamp">{{utils.formatTime(item.createTime)}}</text> + </view> </view> </view> </view> diff --git a/wx/pages/message/message.wxss b/wx/pages/message/message.wxss index ddde0f9..620b929 100644 --- a/wx/pages/message/message.wxss +++ b/wx/pages/message/message.wxss @@ -1,7 +1,13 @@ -/* pages/message/message.wxss */ +@import "../../style/icon.wxss"; + +page { + background-color: #f4f5f9; +} + .container { + padding: 24rpx; min-height: 100vh; - background-color: #f5f5f5; + box-sizing: border-box; } /* 鍔犺浇鐘舵�� */ @@ -17,7 +23,7 @@ width: 40rpx; height: 40rpx; border: 4rpx solid #e0e0e0; - border-top: 4rpx solid #1976d2; + border-top: 4rpx solid #007aff; border-radius: 50%; animation: spin 1s linear infinite; } @@ -33,73 +39,69 @@ 100% { transform: rotate(360deg); } } -/* 娑堟伅鍐呭 */ -.message-content { - padding: 20rpx; -} - -/* 娑堟伅缁熻 */ -.message-stats { - background-color: #fff; - border-radius: 16rpx; - padding: 24rpx; - margin-bottom: 20rpx; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); -} - -.stats-text { - font-size: 28rpx; - color: #666; - font-weight: 500; -} - -/* 娑堟伅鍒楄〃 */ -.message-list { - background-color: #fff; - border-radius: 16rpx; - overflow: hidden; -} - -/* 娑堟伅椤� */ -.message-item { - padding: 30rpx 24rpx; - border-bottom: 1rpx solid #f0f0f0; - background-color: #fff; -} - -.message-item:last-child { - border-bottom: none; -} - -.message-content-text { - font-size: 32rpx; - color: #333; - line-height: 1.5; - margin-bottom: 16rpx; - word-wrap: break-word; -} - -.message-time { - font-size: 24rpx; - color: #999; -} - /* 绌虹姸鎬� */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; - padding: 120rpx 40rpx; - text-align: center; + padding-top: 200rpx; } .empty-icon { font-size: 120rpx; margin-bottom: 24rpx; + opacity: 0.5; } .empty-text { font-size: 28rpx; color: #999; +} + +/* 娑堟伅鍒楄〃 */ +.message-list { + width: 100%; +} + +.message-card { + display: flex; + align-items: center; + background-color: #fff; + border-radius: 16rpx; + padding: 32rpx; + margin-bottom: 24rpx; + box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05); +} + +.icon-wrapper { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + background-color: #007aff; /* 缁熶竴浣跨敤钃濊壊 */ + display: flex; + align-items: center; + justify-content: center; + margin-right: 24rpx; + flex-shrink: 0; +} + +.text-wrapper { + display: flex; + flex-direction: column; + justify-content: center; + flex: 1; +} + +.title { + font-size: 30rpx; + font-weight: 500; + color: #333; + margin-bottom: 8rpx; + word-break: break-all; +} + +.timestamp { + font-size: 24rpx; + color: #999; } \ No newline at end of file diff --git a/wx/pages/message/utils.wxs b/wx/pages/message/utils.wxs new file mode 100644 index 0000000..687c244 --- /dev/null +++ b/wx/pages/message/utils.wxs @@ -0,0 +1,21 @@ +var formatTime = function (dateStr) { + if (!dateStr) return ''; + // 鍏煎 iOS + var date = getDate(dateStr.split('-').join('/')); + var year = date.getFullYear(); + var month = date.getMonth() + 1; + var day = date.getDate(); + var hour = date.getHours(); + var minute = date.getMinutes(); + + var formatNumber = function(n) { + n = n.toString(); + return n[1] ? n : '0' + n; + } + + return year + '-' + formatNumber(month) + '-' + formatNumber(day) + ' ' + formatNumber(hour) + ':' + formatNumber(minute); +} + +module.exports = { + formatTime: formatTime +} \ No newline at end of file diff --git a/wx/pages/registration/registration.js b/wx/pages/registration/registration.js index 0c62a99..68e7b91 100644 --- a/wx/pages/registration/registration.js +++ b/wx/pages/registration/registration.js @@ -10,6 +10,9 @@ activity: null, loading: false, userInfo: null, // 褰撳墠鐢ㄦ埛淇℃伅 + // 鎶ュ悕鐘舵�佹帶鍒� + submitDisabled: false, + submitText: '鎻愪氦鎶ュ悕', // 琛ㄥ崟鏁版嵁 formData: { @@ -98,6 +101,9 @@ this.setData({ activityId: activityId }) + // 浼樺厛妫�鏌ユ姤鍚嶇姸鎬� + this.checkRegistrationStatus(activityId) + // 鍔犺浇娲诲姩淇℃伅 this.loadActivityInfo() } else { console.log('鉂� 娌℃湁鎺ユ敹鍒癮ctivityId鍙傛暟') @@ -111,6 +117,14 @@ // 鍔犺浇鍖哄煙鏁版嵁 this.loadRegions() + }, + + onShow() { + // 杩斿洖鏈〉鏃跺埛鏂版姤鍚嶇姸鎬� + const { activityId } = this.data + if (activityId) { + this.checkRegistrationStatus(activityId) + } }, // 鍔犺浇娲诲姩淇℃伅 @@ -1158,6 +1172,14 @@ async onSubmit() { if (this.data.isSubmitting) return + if (this.data.submitDisabled) { + // 绂佺敤鎬佺洿鎺ユ嫤鎴偣鍑� + wx.showToast({ + title: this.data.submitText, + icon: 'none' + }) + return + } // 琛ㄥ崟楠岃瘉 if (!this.validateForm()) { @@ -1418,6 +1440,57 @@ } }, + // 妫�鏌ュ綋鍓嶆椿鍔ㄧ殑鎶ュ悕鐘舵�侊紝杩涘叆椤甸潰鏃惰皟鐢� + async checkRegistrationStatus(activityId) { + try { + // GraphQL 鏌ヨ鏈�鏂版姤鍚嶇姸鎬侊紙鍚庣杩斿洖鏈�鏂颁竴鏉¤褰曪級 + const query = ` + query GetPlayerRegistrationState($activityId: ID!) { + getPlayerRegistrationState(activityId: $activityId) { + id + status + registrationTime + reviewStatus + reviewComment + } + } + ` + const res = await app.graphqlRequest(query, { activityId: parseInt(activityId) }) + console.log('馃煢 鎶ュ悕鐘舵�佹煡璇㈢粨鏋滃師濮�:', res) + + // 鍏煎澶氱杩斿洖缁撴瀯 + const dataRoot = res?.getPlayerRegistrationState + || res?.playerRegistration + || res?.data?.getPlayerRegistrationState + || res?.data?.playerRegistration + + let submitDisabled = false + let submitText = '鎻愪氦鎶ュ悕' + + if (dataRoot && dataRoot.status !== undefined && dataRoot.status !== null) { + const statusNum = Number(dataRoot.status) + console.log('馃煢 瑙f瀽鍒版姤鍚嶇姸鎬�:', statusNum) + if (statusNum === 1) { + submitDisabled = true + submitText = '宸茬粡鎶ュ悕' + } else if (statusNum === 0) { + submitDisabled = true + submitText = '绛夊緟瀹℃牳' + } else { + submitDisabled = false + submitText = '鎻愪氦鎶ュ悕' + } + } else { + console.log('馃煢 鏈壘鍒版姤鍚嶈褰曟垨鐘舵�侊紝鍏佽鎻愪氦') + } + + this.setData({ submitDisabled, submitText }) + } catch (err) { + console.warn('鈿狅笍 鎶ュ悕鐘舵�佹煡璇㈠け璐ワ紝鍏佽鐢ㄦ埛鎻愪氦:', err) + this.setData({ submitDisabled: false, submitText: '鎻愪氦鎶ュ悕' }) + } + }, + // 鑾峰彇鏂囦欢鎵╁睍鍚� getFileExtension(fileName) { if (!fileName) return '' diff --git a/wx/pages/registration/registration.wxml b/wx/pages/registration/registration.wxml index 7caa068..80cd8a8 100644 --- a/wx/pages/registration/registration.wxml +++ b/wx/pages/registration/registration.wxml @@ -6,64 +6,38 @@ <text class="loading-text">鍔犺浇涓�...</text> </view> - <!-- 鎶ュ悕琛ㄥ崟 --> <view wx:else class="form-container"> - <!-- 娲诲姩淇℃伅 --> - <view wx:if="{{activity}}" class="activity-info"> - <text class="activity-title">{{activity.name}}</text> - <text class="activity-desc">{{activity.description}}</text> - </view> + <!-- 涓汉淇℃伅鍗$墖 --> + <view class="card"> + <view class="card-title">涓汉淇℃伅</view> - <!-- 褰撳墠鐢ㄦ埛淇℃伅 --> - <view wx:if="{{userInfo}}" class="user-info-section"> - <view class="section-title">褰撳墠鐧诲綍鐢ㄦ埛</view> - <view class="user-info-card"> - <view class="user-avatar-wrapper"> + <!-- 澶村儚 --> + <view class="form-item" bindtap="onChooseAvatar"> + <text class="label">鐓х墖</text> + <view class="input-wrapper avatar-wrapper"> <image - wx:if="{{userInfo.avatarUrl}}" - class="user-avatar" - src="{{userInfo.avatarUrl}}" + class="avatar-image" + src="{{localAvatarPath || formData.avatarUrl || '../../images/default-avatar.png'}}" mode="aspectFill" /> - <view wx:else class="user-avatar-placeholder"> - <text class="avatar-text">{{userInfo.name ? userInfo.name.substring(0, 1) : '鐢�'}}</text> - </view> - </view> - <view class="user-details"> - <view class="user-name">{{userInfo.name || '鏈缃�'}}</view> - <view class="user-info-row" wx:if="{{userInfo.phone}}"> - <text class="info-label">鎵嬫満鍙凤細</text> - <text class="info-value">{{userInfo.phone}}</text> - </view> - <view class="user-info-row" wx:if="{{userInfo.gender !== null && userInfo.gender !== undefined}}"> - <text class="info-label">鎬у埆锛�</text> - <text class="info-value">{{userInfo.gender === 0 ? '鐢�' : '濂�'}}</text> - </view> - <view class="user-info-row" wx:if="{{userInfo.education}}"> - <text class="info-label">瀛﹀巻锛�</text> - <text class="info-value">{{userInfo.education}}</text> - </view> + <text></text> </view> </view> - </view> - <!-- 鍩烘湰淇℃伅 --> - <view class="form-section"> - <view class="section-title">鍩烘湰淇℃伅</view> - <!-- 濮撳悕 --> <view class="form-item {{errors.name ? 'error' : ''}}"> <text class="label required">濮撳悕</text> <view class="input-wrapper"> <input class="input" + placeholder-class="placeholder-class" placeholder="璇疯緭鍏ョ湡瀹炲鍚�" value="{{formData.name}}" data-field="name" bindinput="onInputChange" /> - <text wx:if="{{errors.name}}" class="error-text">{{errors.name}}</text> </view> + <text wx:if="{{errors.name}}" class="error-text">{{errors.name}}</text> </view> <!-- 鎵嬫満鍙� --> @@ -71,27 +45,21 @@ <text class="label required">鎵嬫満鍙�</text> <view class="input-wrapper"> <view class="phone-container"> - <view class="phone-display {{!formData.phone ? 'placeholder' : ''}}"> - {{formData.phone || '鐐瑰嚮鎺堟潈鑾峰彇鎵嬫満鍙�'}} - </view> - <button - class="phone-auth-btn" - open-type="getPhoneNumber" - bindgetphonenumber="onGetPhoneNumber" - wx:if="{{!formData.phone}}" - > - 鎺堟潈鑾峰彇 - </button> - <button - class="phone-change-btn" - bindtap="onClearPhone" - wx:else - > - 閲嶆柊鑾峰彇 - </button> + <block wx:if="{{formData.phone}}"> + <view class="phone-display">{{formData.phone}}</view> + <button class="phone-change-btn" bindtap="onClearPhone">淇敼</button> + </block> + <block wx:else> + <view class="phone-display placeholder">鐐瑰嚮鎺堟潈鑾峰彇鎵嬫満鍙�</view> + <button + class="phone-auth-btn" + open-type="getPhoneNumber" + bindgetphonenumber="onGetPhoneNumber" + >鎺堟潈</button> + </block> </view> - <text wx:if="{{errors.phone}}" class="error-text">{{errors.phone}}</text> </view> + <text wx:if="{{errors.phone}}" class="error-text">{{errors.phone}}</text> </view> <!-- 鎬у埆 --> @@ -105,12 +73,12 @@ value="{{genderIndex}}" bindchange="onGenderChange" > - <view class="picker-text"> + <view class="picker-text {{formData.gender === null ? 'placeholder' : ''}}"> {{formData.gender !== null ? genderOptions[formData.gender] : '璇烽�夋嫨鎬у埆'}} </view> </picker> - <text wx:if="{{errors.gender}}" class="error-text">{{errors.gender}}</text> </view> + <text wx:if="{{errors.gender}}" class="error-text">{{errors.gender}}</text> </view> <!-- 鐢熸棩 --> @@ -124,12 +92,12 @@ bindchange="onBirthDateChange" end="{{today}}" > - <view class="picker-text"> + <view class="picker-text {{!formData.birthDate ? 'placeholder' : ''}}"> {{formData.birthDate || '璇烽�夋嫨鐢熸棩'}} </view> </picker> - <text wx:if="{{errors.birthDate}}" class="error-text">{{errors.birthDate}}</text> </view> + <text wx:if="{{errors.birthDate}}" class="error-text">{{errors.birthDate}}</text> </view> <!-- 鎵�鍦ㄥ尯鍩� --> @@ -144,12 +112,12 @@ value="{{regionIndex}}" bindchange="onRegionChange" > - <view class="picker-text"> + <view class="picker-text {{formData.regionId === null ? 'placeholder' : ''}}"> {{formData.regionId !== null && regionIndex >= 0 ? regions[regionIndex].name : '璇烽�夋嫨鎵�鍦ㄥ尯鍩�'}} </view> </picker> - <text wx:if="{{errors.regionId}}" class="error-text">{{errors.regionId}}</text> </view> + <text wx:if="{{errors.regionId}}" class="error-text">{{errors.regionId}}</text> </view> <!-- 鏁欒偛鑳屾櫙 --> @@ -163,134 +131,76 @@ value="{{educationIndex}}" bindchange="onEducationChange" > - <view class="picker-text"> + <view class="picker-text {{!formData.education ? 'placeholder' : ''}}"> {{formData.education || '璇烽�夋嫨鏁欒偛鑳屾櫙'}} </view> </picker> - <text wx:if="{{errors.education}}" class="error-text">{{errors.education}}</text> </view> - </view> - - <!-- 澶村儚涓婁紶 --> - <view class="form-item vertical-layout {{errors.avatar ? 'error' : ''}}"> - <text class="label">澶村儚</text> - <view class="avatar-upload-container"> - <!-- 鏈�夋嫨鐘舵�� --> - <view wx:if="{{!localAvatarPath && !formData.avatarUrl && !avatarUploading}}" - class="avatar-upload-btn" - bindtap="onChooseAvatar"> - <text class="upload-icon ic-add"></text> - <text class="upload-text">鐐瑰嚮閫夋嫨澶村儚</text> - </view> - - <!-- 涓婁紶涓姸鎬� --> - <view wx:if="{{avatarUploading}}" class="avatar-upload-btn uploading"> - <view class="avatar-uploading-indicator"></view> - <text class="upload-text">涓婁紶涓� {{avatarUploadProgress}}%</text> - <view class="upload-progress"> - <view class="progress-bar"> - <view class="progress-fill" style="width: {{avatarUploadProgress}}%"></view> - </view> - </view> - </view> - - <!-- 宸查�夋嫨鐘舵�侊紙鏈湴棰勮锛� --> - <view wx:if="{{localAvatarPath && !avatarUploading}}" class="avatar-preview"> - <image class="avatar-image" src="{{localAvatarPath}}" mode="aspectFill"></image> - <view class="avatar-actions"> - <text class="action-btn" bindtap="onChooseAvatar">閲嶆柊閫夋嫨</text> - <text class="action-btn delete" bindtap="onDeleteAvatar">鍒犻櫎</text> - </view> - </view> - - <!-- 宸蹭笂浼犵姸鎬侊紙鏈嶅姟鍣ㄥ浘鐗囷級 --> - <view wx:if="{{formData.avatarUrl && !localAvatarPath && !avatarUploading}}" class="avatar-preview"> - <image class="avatar-image" src="{{formData.avatarUrl}}" mode="aspectFill"></image> - <view class="avatar-actions"> - <text class="action-btn" bindtap="onChooseAvatar">閲嶆柊閫夋嫨</text> - <text class="action-btn delete" bindtap="onDeleteAvatar">鍒犻櫎</text> - </view> - </view> - - <!-- 鎻愮ず鏂囧瓧 --> - <view class="avatar-upload-hint"> - <text wx:if="{{!localAvatarPath && !formData.avatarUrl}}">鏀寔JPG銆丳NG銆乄ebP鏍煎紡锛屽缓璁昂瀵�200x200浠ヤ笂锛屾枃浠跺ぇ灏忎笉瓒呰繃5MB</text> - <text wx:elif="{{localAvatarPath}}">澶村儚宸查�夋嫨锛屾彁浜ゆ椂灏嗚嚜鍔ㄤ笂浼�</text> - <text wx:else>澶村儚涓婁紶鎴愬姛锛屽彲閲嶆柊閫夋嫨鎴栧垹闄�</text> - </view> - </view> - <text wx:if="{{errors.avatar}}" class="error-text">{{errors.avatar}}</text> + <text wx:if="{{errors.education}}" class="error-text">{{errors.education}}</text> </view> <!-- 绠�浠� --> <view class="form-item vertical-layout {{errors.introduction ? 'error' : ''}}"> <text class="label">绠�浠�</text> - <textarea - class="textarea" - placeholder="璇风畝瑕佷粙缁嶈嚜宸辩殑鑳屾櫙銆佹妧鑳藉拰缁忛獙" - value="{{formData.introduction}}" - data-field="introduction" - bindinput="onInputChange" - maxlength="500" - /> + <view class="input-wrapper"> + <textarea + class="textarea" + placeholder-class="placeholder-class" + placeholder="璇风畝瑕佷粙缁嶈嚜宸辩殑鑳屾櫙銆佹妧鑳藉拰缁忛獙" + value="{{formData.introduction}}" + data-field="introduction" + bindinput="onInputChange" + maxlength="500" + /> + </view> <text wx:if="{{errors.introduction}}" class="error-text">{{errors.introduction}}</text> </view> - </view> - <!-- 涓汉浠嬬粛 --> - <view class="form-section"> - <view class="section-title">涓汉浠嬬粛</view> - + <!-- 椤圭洰淇℃伅鍗$墖 --> + <view class="card"> + <view class="card-title">椤圭洰淇℃伅</view> <!-- 椤圭洰鍚嶇О --> <view class="form-item {{errors.projectName ? 'error' : ''}}"> <text class="label required">椤圭洰鍚嶇О</text> <view class="input-wrapper"> <input class="input" + placeholder-class="placeholder-class" placeholder="璇疯緭鍏ラ」鐩悕绉�" value="{{formData.projectName}}" data-field="projectName" bindinput="onInputChange" /> - <text wx:if="{{errors.projectName}}" class="error-text">{{errors.projectName}}</text> </view> + <text wx:if="{{errors.projectName}}" class="error-text">{{errors.projectName}}</text> </view> <!-- 椤圭洰鎻忚堪 --> <view class="form-item vertical-layout {{errors.description ? 'error' : ''}}"> <text class="label required">椤圭洰鎻忚堪</text> - <textarea - class="textarea" - placeholder="璇疯缁嗘弿杩版偍鐨勯」鐩唴瀹广�佺洰鏍囧拰鐗硅壊" - value="{{formData.description}}" - data-field="description" - bindinput="onInputChange" - maxlength="1000" - /> + <view class="input-wrapper"> + <textarea + class="textarea" + placeholder-class="placeholder-class" + placeholder="璇疯缁嗘弿杩版偍鐨勯」鐩唴瀹广�佺洰鏍囧拰鐗硅壊" + value="{{formData.description}}" + data-field="description" + bindinput="onInputChange" + maxlength="1000" + /> + </view> <text wx:if="{{errors.description}}" class="error-text">{{errors.description}}</text> </view> - </view> - <!-- 闄勪欢涓婁紶 --> - <view class="form-section vertical-layout"> - <view class="section-title">闄勪欢璧勬枡</view> - <view class="section-subtitle">鏀寔涓婁紶鐩稿叧璧勬枡锛屾渶澶�8涓枃浠�</view> - - <!-- 涓婁紶鎸夐挳 --> + <!-- 闄勪欢璧勬枡鍗$墖 --> + <view class="card"> + <view class="card-title">闄勪欢璧勬枡</view> <view class="attachment-upload-area"> - <view wx:if="{{attachments.length < 8}}" class="upload-btn" bindtap="onChooseAttachment"> - <view class="upload-icon">馃搸</view> - <text class="upload-text">閫夋嫨鏂囦欢</text> - <view class="upload-hint"> - 鏀寔瑙嗛(鈮�200MB)銆佸浘鐗�(鈮�10MB)銆丳DF銆乄ord绛夋枃妗� - </view> - </view> - <!-- 闄勪欢鍒楄〃 --> <view wx:if="{{attachments.length > 0}}" class="attachment-list"> - <view wx:for="{{attachments}}" wx:key="index" class="attachment-item {{item.uploading ? 'uploading' : ''}}"> + <view wx:for="{{attachments}}" wx:key="id" class="attachment-item"> <view class="attachment-info"> <view class="attachment-icon"> <text wx:if="{{item.type === 'image'}}">馃柤锔�</text> @@ -302,39 +212,31 @@ <view class="attachment-details"> <text class="attachment-name">{{item.name}}</text> <text class="attachment-size">{{item.sizeText}}</text> - <view wx:if="{{item.uploading}}" class="upload-progress"> - <view class="progress-bar"> - <view class="progress-fill" style="width: {{item.progress}}%"></view> - </view> - <text class="progress-text">{{item.progress}}%</text> - </view> - <text wx:elif="{{item.uploaded}}" class="upload-status success">涓婁紶鎴愬姛</text> - <text wx:elif="{{item.error}}" class="upload-status error">{{item.error}}</text> </view> </view> <view class="attachment-actions"> - <text wx:if="{{!item.uploading && item.uploaded}}" class="action-btn preview" bindtap="onPreviewAttachment" data-index="{{index}}">棰勮</text> - <text wx:if="{{!item.uploading}}" class="action-btn delete" bindtap="onDeleteAttachment" data-index="{{index}}">鍒犻櫎</text> + <text class="delete-btn" bindtap="onDeleteAttachment" data-index="{{index}}">鍒犻櫎</text> </view> </view> </view> - <!-- 闄勪欢鏁伴噺鎻愮ず --> - <view wx:if="{{attachments.length > 0}}" class="attachment-count"> - 宸蹭笂浼� {{attachments.length}}/8 涓枃浠� + <!-- 涓婁紶鎸夐挳 --> + <view wx:if="{{attachments.length < maxAttachments}}" class="upload-btn" bindtap="onChooseAttachment"> + <view class="upload-icon">馃搸</view> + <text class="upload-text">娣诲姞闄勪欢</text> + <view class="upload-hint"> + 鏀寔瑙嗛/鍥剧墖/PDF/Word绛夛紝鏈�澶歿{maxAttachments}}涓� + </view> </view> </view> - - <text wx:if="{{errors.attachments}}" class="error-text">{{errors.attachments}}</text> - </view> - - <!-- 搴曢儴鎿嶄綔鏍� --> - <view class="bottom-actions"> - <view class="submit-btn {{submitting ? 'disabled' : ''}}" bindtap="onSubmit"> - {{submitting ? '鎻愪氦涓�...' : '鎻愪氦鎶ュ悕'}} - </view> + <text wx:if="{{errors.attachments}}" class="error-text" style="padding: 0 30rpx 30rpx;">{{errors.attachments}}</text> </view> </view> - + <!-- 搴曢儴鎿嶄綔鏍� --> + <view class="bottom-actions"> + <button class="submit-btn {{(isSubmitting || submitDisabled) ? 'disabled' : ''}}" bindtap="onSubmit" disabled="{{isSubmitting || submitDisabled}}"> + {{isSubmitting ? '鎻愪氦涓�...' : submitText}} + </button> + </view> </view> \ No newline at end of file diff --git a/wx/pages/registration/registration.wxss b/wx/pages/registration/registration.wxss index 36e4507..4085033 100644 --- a/wx/pages/registration/registration.wxss +++ b/wx/pages/registration/registration.wxss @@ -1,189 +1,79 @@ /* pages/registration/registration.wxss */ -/* 瀹瑰櫒鏍峰紡 */ +/* --- 鍏ㄥ眬鍜屽鍣� --- */ .container { min-height: 100vh; background: #f8f9fa; - padding-bottom: 140rpx; + padding: 20rpx; + padding-bottom: 180rpx; /* 涓哄簳閮ㄦ寜閽暀鍑虹┖闂� */ + box-sizing: border-box; } -/* 鍔犺浇鐘舵�佹牱寮� */ +/* --- 鍔犺浇鐘舵�� --- */ .loading-wrapper { display: flex; flex-direction: column; align-items: center; - padding: 120rpx 0; + justify-content: center; + padding-top: 200rpx; } - .loading-text { margin-top: 20rpx; font-size: 28rpx; - color: #999999; + color: #999; } -/* 琛ㄥ崟瀹瑰櫒鏍峰紡 */ +/* --- 琛ㄥ崟瀹瑰櫒鍜屽崱鐗� --- */ .form-container { - padding: 0 30rpx; + width: 100%; } -/* 娲诲姩淇℃伅鏍峰紡 */ -.activity-info { +.card { background: #ffffff; - padding: 30rpx; + border-radius: 16rpx; margin-bottom: 20rpx; - border-radius: 12rpx; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); + overflow: hidden; } -.activity-title { - display: block; +.card-title { font-size: 32rpx; font-weight: bold; - color: #333333; - margin-bottom: 16rpx; -} - -.activity-desc { - display: block; - font-size: 26rpx; - color: #666666; - line-height: 1.6; -} - -/* 鐢ㄦ埛淇℃伅鍖哄煙鏍峰紡 */ -.user-info-section { - background: #ffffff; - margin-bottom: 20rpx; - border-radius: 12rpx; - overflow: hidden; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); -} - -.user-info-card { - padding: 30rpx; - display: flex; - align-items: center; - gap: 24rpx; -} - -.user-avatar-wrapper { - flex-shrink: 0; -} - -.user-avatar { - width: 120rpx; - height: 120rpx; - border-radius: 60rpx; - border: 4rpx solid #f0f0f0; -} - -.user-avatar-placeholder { - width: 120rpx; - height: 120rpx; - border-radius: 60rpx; - background: linear-gradient(135deg, #42a5f5 0%, #1976d2 100%); - display: flex; - align-items: center; - justify-content: center; - border: 4rpx solid #f0f0f0; -} - -.avatar-text { - color: #ffffff; - font-size: 48rpx; - font-weight: bold; -} - -.user-details { - flex: 1; - min-width: 0; -} - -.user-name { - font-size: 32rpx; - font-weight: bold; - color: #333333; - margin-bottom: 16rpx; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.user-info-row { - display: flex; - align-items: center; - margin-bottom: 8rpx; - font-size: 26rpx; -} - -.info-label { - color: #666666; - min-width: 100rpx; - margin-right: 12rpx; -} - -.info-value { - color: #333333; - flex: 1; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* 琛ㄥ崟鍖哄煙鏍峰紡 */ -.form-section { - background: #ffffff; - margin-bottom: 20rpx; - border-radius: 12rpx; - overflow: hidden; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); -} - -.section-title { - padding: 30rpx; - font-size: 30rpx; - font-weight: bold; - color: #333333; - background: #f8f9fa; - border-bottom: 1rpx solid #e9ecef; -} - -/* 琛ㄥ崟椤规牱寮� */ -.form-item { + color: #333; padding: 30rpx; border-bottom: 1rpx solid #f0f0f0; - position: relative; - display: flex; - align-items: center; - gap: 20rpx; } -.form-item:last-child { +/* --- 琛ㄥ崟椤� --- */ +.form-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 30rpx; + margin: 0 30rpx; + border-bottom: 1rpx solid #f0f0f0; + position: relative; +} +.card .form-item:last-child { border-bottom: none; } -.form-item.error { - border-left: 6rpx solid #ff4757; -} - +/* 鍨傜洿甯冨眬鐨勮〃鍗曢」 (濡傜畝浠�) */ .form-item.vertical-layout { flex-direction: column; align-items: flex-start; } - .form-item.vertical-layout .label { - margin-bottom: 16rpx; + margin-bottom: 20rpx; +} +.form-item.vertical-layout .input-wrapper { + width: 100%; } .label { font-size: 28rpx; - color: #333333; - font-weight: 500; - min-width: 120rpx; + color: #333; flex-shrink: 0; } - .label.required::after { content: '*'; color: #ff4757; @@ -193,756 +83,195 @@ .input-wrapper { flex: 1; display: flex; - flex-direction: column; -} - -.label-row { - display: flex; - justify-content: space-between; align-items: center; - margin-bottom: 16rpx; + justify-content: flex-end; + min-width: 0; } -/* 杈撳叆妗嗘牱寮� */ -.input, -.textarea { +/* --- 杈撳叆鎺т欢 --- */ +.input, .picker, .textarea { width: 100%; - height: 80rpx; - padding: 20rpx; - border: 2rpx solid #e9ecef; - border-radius: 8rpx; font-size: 28rpx; - color: #333333; - background: #ffffff; - box-sizing: border-box; - line-height: 1.4; - display: flex; - align-items: center; + color: #333; + text-align: right; + border: none; + background-color: transparent; + padding: 0; + margin: 0; } - -.input:focus, -.textarea:focus { - border-color: #1976d2; - outline: none; -} - .textarea { - height: auto; - min-height: 120rpx; - resize: none; - align-items: flex-start; - padding-top: 20rpx; -} - -/* 閫夋嫨鍣ㄦ牱寮� */ -.picker { - width: 100%; -} - -.picker-text { - width: 100%; - height: 80rpx; + text-align: left; + background-color: #f8f9fa; padding: 20rpx; - border: 2rpx solid #e9ecef; border-radius: 8rpx; - font-size: 28rpx; - color: #333333; - background: #ffffff; - box-sizing: border-box; - line-height: 1.4; - display: flex; - align-items: center; + min-height: 150rpx; + margin-top: 10rpx; } - +.placeholder-class { + color: #999; + font-size: 28rpx; +} .picker-text.placeholder { - color: #999999; + color: #999; } -/* 鎵嬫満鍙锋巿鏉冩牱寮� */ +/* --- 鐗瑰畾鎺т欢鏍峰紡 --- */ +/* 鎵嬫満鍙� */ .phone-container { display: flex; align-items: center; - gap: 16rpx; + justify-content: flex-end; width: 100%; } - .phone-display { - flex: 1; - height: 80rpx; - padding: 20rpx; - border: 2rpx solid #e9ecef; - border-radius: 8rpx; + color: #333; font-size: 28rpx; - color: #333333; - background: #f8f9fa; - box-sizing: border-box; - line-height: 1.4; - display: flex; - align-items: center; } - .phone-display.placeholder { - color: #999999; + color: #999; +} +.phone-auth-btn, .phone-change-btn { + color: #1976d2; + font-size: 28rpx; + background-color: transparent; + border: none; + padding: 0; + margin: 0 0 0 20rpx; + line-height: 1; +} +.phone-auth-btn::after, .phone-change-btn::after { + display: none; } -.phone-auth-btn, -.phone-change-btn { - padding: 0 24rpx; - height: 80rpx; - border-radius: 8rpx; - font-size: 24rpx; - font-weight: 500; - border: none; +/* 澶村儚 */ +.avatar-wrapper { display: flex; align-items: center; - justify-content: center; - white-space: nowrap; - flex-shrink: 0; +} +.avatar-image { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + margin-left: 20rpx; +} +.arrow-icon { + width: 16rpx; + height: 28rpx; + margin-left: 10rpx; } -.phone-auth-btn { - background: #1976d2; - color: #ffffff; +/* 闄勪欢 */ +.attachment-upload-area { + padding: 30rpx; } - -.phone-auth-btn:active { - background: #1565c0; -} - -.phone-change-btn { - background: #f5f5f5; - color: #666666; - border: 2rpx solid #e0e0e0; -} - -.phone-change-btn:active { - background: #eeeeee; -} - -/* 閿欒鎻愮ず鏍峰紡 */ -.error-text { - display: block; - margin-top: 8rpx; - font-size: 22rpx; - color: #ff4757; - line-height: 1.4; -} - -/* 鏂囦欢涓婁紶鏍峰紡 */ -.upload-section { - margin-top: 16rpx; -} - .upload-btn { + border: 2rpx dashed #d0d7de; + border-radius: 12rpx; + background: #fafbfc; + padding: 40rpx; display: flex; flex-direction: column; align-items: center; justify-content: center; - width: 200rpx; - height: 200rpx; - border: 2rpx dashed #d0d7de; - border-radius: 12rpx; - background: #f8f9fa; - color: #666666; - transition: all 0.3s ease; + margin-bottom: 20rpx; } - -.upload-btn:active { - background: #e9ecef; - border-color: #1976d2; -} - -.upload-btn.file-upload { - width: 100%; - height: 120rpx; - flex-direction: row; -} - .upload-icon { font-size: 48rpx; - margin-bottom: 12rpx; + margin-bottom: 10rpx; } - -.file-upload .upload-icon { - margin-bottom: 0; - margin-right: 16rpx; -} - .upload-text { - font-size: 24rpx; - color: #666666; + font-size: 28rpx; + color: #333; + font-weight: 500; } - -/* 宸蹭笂浼犳枃浠舵牱寮� */ -.uploaded-file { - position: relative; - width: 200rpx; - height: 200rpx; - border-radius: 12rpx; - overflow: hidden; +.upload-hint { + font-size: 22rpx; + color: #999; + margin-top: 8rpx; } - -.uploaded-image { - width: 100%; - height: 100%; +.attachment-list { + margin-top: 20rpx; } - -.uploaded-file-info { +.attachment-item { display: flex; align-items: center; - justify-content: space-between; padding: 20rpx; background: #f8f9fa; border-radius: 8rpx; - border: 2rpx solid #e9ecef; + margin-bottom: 12rpx; } - -.file-name { - font-size: 26rpx; - color: #333333; -} - -.delete-btn { - position: absolute; - top: 8rpx; - right: 8rpx; - width: 40rpx; - height: 40rpx; - background: rgba(0, 0, 0, 0.7); - color: #ffffff; - border-radius: 50%; +.attachment-info { + flex: 1; display: flex; align-items: center; - justify-content: center; - font-size: 24rpx; - font-weight: bold; + min-width: 0; } - -.uploaded-file-info .delete-btn { - position: static; - background: #ff4757; - color: #ffffff; - padding: 8rpx 16rpx; - border-radius: 6rpx; +.attachment-icon { + font-size: 32rpx; + margin-right: 16rpx; +} +.attachment-details { + flex: 1; + min-width: 0; +} +.attachment-name { + font-size: 26rpx; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.attachment-size { font-size: 22rpx; + color: #999; +} +.attachment-actions .delete-btn { + color: #ff4757; + font-size: 28rpx; + padding: 10rpx; + margin-left: 20rpx; } -/* 鍥㈤槦鎴愬憳鏍峰紡 */ +/* --- 閿欒鎻愮ず --- */ +.error-text { + position: absolute; + bottom: 0; + left: 30rpx; + font-size: 22rpx; + color: #ff4757; +} +.form-item.error { + padding-bottom: 30rpx; /* 涓洪敊璇俊鎭暀鍑虹┖闂� */ +} - -/* 搴曢儴鎿嶄綔鏍忔牱寮� */ +/* --- 搴曢儴鎿嶄綔鏍� --- */ .bottom-actions { position: fixed; bottom: 0; left: 0; right: 0; background: #ffffff; - border-top: 1rpx solid #f0f0f0; padding: 20rpx 30rpx; - display: flex; - box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.1); + padding-bottom: calc(20rpx + constant(safe-area-inset-bottom)); + padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); + border-top: 1rpx solid #f0f0f0; z-index: 100; } - .submit-btn { - flex: 1; - padding: 24rpx 0; - background: linear-gradient(90deg, #1976d2, #42a5f5); + width: 100%; + height: 88rpx; + line-height: 88rpx; + background: #1976d2; color: #ffffff; border-radius: 12rpx; font-size: 32rpx; font-weight: bold; text-align: center; - box-shadow: 0 4rpx 12rpx rgba(25, 118, 210, 0.3); } - .submit-btn.disabled { background: #cccccc; - box-shadow: none; - color: #999999; + color: #999; } - -/* 寮圭獥鏍峰紡 */ -.modal-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; - padding: 40rpx; -} - -.modal-content { - background: #ffffff; - border-radius: 16rpx; - width: 100%; - max-width: 600rpx; - max-height: 80vh; - overflow: hidden; - display: flex; - flex-direction: column; -} - -.modal-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 30rpx; - border-bottom: 1rpx solid #f0f0f0; -} - -.modal-title { - font-size: 32rpx; - font-weight: bold; - color: #333333; -} - -.modal-close { - width: 48rpx; - height: 48rpx; - display: flex; - align-items: center; - justify-content: center; - font-size: 32rpx; - color: #666666; - font-weight: bold; -} - -.modal-body { - flex: 1; - padding: 30rpx; - overflow-y: auto; -} - -.modal-body .form-item { - padding: 0; - margin-bottom: 30rpx; - border-bottom: none; -} - -.modal-body .form-item:last-child { - margin-bottom: 0; -} - -.modal-footer { - display: flex; - gap: 20rpx; - padding: 30rpx; - border-top: 1rpx solid #f0f0f0; -} - -.cancel-btn, -.confirm-btn { - flex: 1; - padding: 24rpx 0; - border-radius: 12rpx; - font-size: 28rpx; - font-weight: bold; - text-align: center; -} - -.cancel-btn { - background: #f8f9fa; - color: #666666; - border: 2rpx solid #e9ecef; -} - -.confirm-btn { - background: linear-gradient(90deg, #1976d2, #42a5f5); - color: #ffffff; -} - -/* 鍝嶅簲寮忛�傞厤 */ -@media screen and (max-width: 375px) { - .form-container { - padding: 0 20rpx; - } - - .form-item { - padding: 24rpx; - } - - .section-title { - padding: 24rpx; - font-size: 28rpx; - } - - .bottom-actions { - padding: 16rpx 20rpx; - } - - .submit-btn, - .draft-btn { - padding: 20rpx 24rpx; - font-size: 26rpx; - } -} - -@media screen and (min-width: 414px) { - .upload-btn { - width: 240rpx; - height: 240rpx; - } - - .uploaded-file { - width: 240rpx; - height: 240rpx; - } -} - -/* 澶村儚涓婁紶鏍峰紡 */ -.avatar-upload-container { - display: flex; - flex-direction: column; - align-items: center; - gap: 20rpx; -} - -.avatar-upload-btn { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 200rpx; - height: 200rpx; - border: 2rpx dashed #d0d7de; - border-radius: 50%; - background: #f8f9fa; - position: relative; - transition: all 0.3s ease; -} - -.avatar-upload-btn:active { - transform: scale(0.95); - background: #e9ecef; - border-color: #1976d2; -} - -.avatar-upload-btn.uploading { - border-color: #1976d2; - background: #f0f8ff; -} - -.upload-icon { - font-family: "icon"; - font-size: 60rpx; - color: #999999; - margin-bottom: 8rpx; - transition: color 0.3s ease; -} - -.avatar-upload-btn:active .upload-icon { - color: #1976d2; -} - -.upload-text { - font-size: 22rpx; - color: #666666; - text-align: center; - transition: color 0.3s ease; -} - -.avatar-upload-btn:active .upload-text { - color: #1976d2; -} - -.avatar-preview { - display: flex; - flex-direction: column; - align-items: center; - gap: 16rpx; -} - -.avatar-image { - width: 200rpx; - height: 200rpx; - border-radius: 50%; - border: 2rpx solid #e9ecef; - box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); - transition: transform 0.3s ease; -} - -.avatar-image:active { - transform: scale(0.95); -} - -.avatar-actions { - display: flex; - gap: 20rpx; -} - -.action-btn { - padding: 12rpx 24rpx; - font-size: 24rpx; - border-radius: 12rpx; - border: 1rpx solid #1976d2; - color: #1976d2; - background: #ffffff; - text-align: center; - transition: all 0.3s ease; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); -} - -.action-btn:active { - transform: translateY(2rpx); - background: #f0f8ff; - box-shadow: 0 1rpx 4rpx rgba(0, 0, 0, 0.1); -} - -.action-btn.delete { - border-color: #ff4757; - color: #ff4757; -} - -.action-btn.delete:active { - background: #fff5f5; -} - -.upload-progress { - width: 100%; - max-width: 300rpx; -} - -.progress-text { - display: block; - font-size: 24rpx; - color: #666666; - text-align: center; - margin-bottom: 12rpx; -} - -.progress-bar { - width: 100%; - height: 8rpx; - background: #e9ecef; - border-radius: 4rpx; - overflow: hidden; - box-shadow: inset 0 1rpx 2rpx rgba(0, 0, 0, 0.1); -} - -.progress-fill { - height: 100%; - background: linear-gradient(90deg, #1976d2, #42a5f5); - border-radius: 4rpx; - transition: width 0.3s ease; -} - -/* 涓婁紶鐘舵�佹寚绀哄櫒 */ -.avatar-uploading-indicator { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 60rpx; - height: 60rpx; - border: 4rpx solid #f0f0f0; - border-top: 4rpx solid #1976d2; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: translate(-50%, -50%) rotate(0deg); } - 100% { transform: translate(-50%, -50%) rotate(360deg); } -} - -/* 澶村儚涓婁紶鎻愮ず鏂囧瓧 */ -.avatar-upload-hint { - font-size: 22rpx; - color: #999999; - text-align: center; - margin-top: 10rpx; - line-height: 1.4; -} - -/* 閿欒鐘舵�佹牱寮� */ -.avatar-upload-container.error .avatar-upload-btn { - border-color: #ff4757; - background: #fff5f5; -} - -.avatar-upload-container.error .upload-icon { - color: #ff4757; -} - -/* 闄勪欢涓婁紶鏍峰紡 */ -.attachment-upload-area { - margin-top: 20rpx; -} - -.upload-btn { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 40rpx 20rpx; - border: 2rpx dashed #d0d7de; - border-radius: 12rpx; - background: #fafbfc; - transition: all 0.3s ease; - margin-bottom: 20rpx; -} - -.upload-btn:active { - background: #f1f3f4; - border-color: #1976d2; -} - -.upload-icon { - font-size: 48rpx; - margin-bottom: 10rpx; -} - -.upload-text { - font-size: 28rpx; - color: #333333; - font-weight: 500; - margin-bottom: 8rpx; -} - -.upload-hint { - font-size: 22rpx; - color: #666666; - text-align: center; - line-height: 1.4; -} - -/* 闄勪欢鍒楄〃鏍峰紡 */ -.attachment-list { - margin-top: 20rpx; -} - -.attachment-item { - display: flex; - align-items: center; - justify-content: space-between; - padding: 20rpx; - background: #ffffff; - border-radius: 12rpx; - margin-bottom: 12rpx; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); - transition: all 0.3s ease; -} - -.attachment-item.uploading { - background: #f8f9fa; - border: 1rpx solid #e9ecef; -} - -.attachment-info { - display: flex; - align-items: center; - flex: 1; -} - -.attachment-icon { - font-size: 32rpx; - margin-right: 16rpx; - width: 40rpx; - text-align: center; -} - -.attachment-details { - flex: 1; -} - -.attachment-name { - display: block; - font-size: 26rpx; - color: #333333; - font-weight: 500; - margin-bottom: 4rpx; - word-break: break-all; -} - -.attachment-size { - display: block; - font-size: 22rpx; - color: #666666; -} - -.upload-progress { - display: flex; - align-items: center; - margin-top: 8rpx; -} - -.progress-bar { - flex: 1; - height: 6rpx; - background: #e9ecef; - border-radius: 3rpx; - overflow: hidden; - margin-right: 12rpx; -} - -.progress-bar .progress-fill { - height: 100%; - background: linear-gradient(90deg, #1976d2, #42a5f5); - border-radius: 3rpx; - transition: width 0.3s ease; -} - -.progress-text { - font-size: 20rpx; - color: #666666; - min-width: 60rpx; - text-align: right; -} - -.upload-status { - display: block; - font-size: 22rpx; - margin-top: 4rpx; -} - -.upload-status.success { - color: #28a745; -} - -.upload-status.error { - color: #dc3545; -} - -.attachment-actions { - margin-left: 16rpx; -} - -.attachment-actions .action-btn { - font-size: 24rpx; - color: #666666; - padding: 8rpx 16rpx; - border-radius: 6rpx; - background: #f8f9fa; - transition: all 0.3s ease; -} - -.attachment-actions .action-btn.preview { - color: #1976d2; - background: #f3f8ff; - margin-right: 8rpx; -} - -.attachment-actions .action-btn.delete { - color: #dc3545; - background: #fff5f5; -} - -.attachment-actions .action-btn:active { - opacity: 0.7; -} - -.attachment-count { - font-size: 24rpx; - color: #666666; - text-align: center; - margin-top: 16rpx; - padding: 12rpx; - background: #f8f9fa; - border-radius: 8rpx; +.submit-btn::after { + display: none; } \ No newline at end of file diff --git a/wx/project.config.json b/wx/project.config.json index c57ded6..3e1dc5b 100644 --- a/wx/project.config.json +++ b/wx/project.config.json @@ -18,7 +18,15 @@ "outputPath": "" }, "useCompilerPlugins": false, - "minifyWXML": true + "minifyWXML": true, + "compileWorklet": false, + "uploadWithSourceMap": true, + "minifyWXSS": true, + "localPlugins": false, + "disableUseStrict": false, + "condition": false, + "swc": false, + "disableSWC": true }, "compileType": "miniprogram", "simulatorPluginLibVersion": {}, @@ -27,5 +35,6 @@ "include": [] }, "appid": "wxaa13026a14b1d784", - "editorSetting": {} + "editorSetting": {}, + "libVersion": "3.10.1" } \ No newline at end of file diff --git "a/\345\244\264\345\203\217\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" "b/\345\244\264\345\203\217\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" deleted file mode 100644 index e070123..0000000 --- "a/\345\244\264\345\203\217\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" +++ /dev/null @@ -1,185 +0,0 @@ -# 灏忕▼搴忔敞鍐岄〉闈㈠ご鍍忎笂浼犲姛鑳芥�荤粨 - -## 鍔熻兘姒傝堪 - -涓哄皬绋嬪簭娉ㄥ唽椤甸潰鎴愬姛娣诲姞浜嗗畬鏁寸殑澶村儚涓婁紶鍔熻兘锛屽寘鎷枃浠堕�夋嫨銆佷笂浼犮�侀瑙堛�佸垹闄ょ瓑瀹屾暣娴佺▼锛屽苟闆嗘垚鍒扮幇鏈夌殑娉ㄥ唽琛ㄥ崟鍜孏raphQL API涓�� - -## 瀹炵幇鐨勫姛鑳界壒鎬� - -### 馃幆 鏍稿績鍔熻兘 -- 鉁� 鏀寔浠庣浉鍐屽拰鐩告満閫夋嫨鍥剧墖 -- 鉁� 澶村儚棰勮鍔熻兘 -- 鉁� 閲嶆柊涓婁紶鍜屽垹闄ゅ姛鑳� -- 鉁� 瀹炴椂涓婁紶杩涘害鏄剧ず -- 鉁� 瀹屾暣鐨勮〃鍗曢獙璇侀泦鎴� - -### 馃敀 瀹夊叏楠岃瘉 -- 鉁� 鏂囦欢绫诲瀷楠岃瘉 (鏀寔JPG銆丳NG銆乄ebP鏍煎紡) -- 鉁� 鏂囦欢澶у皬闄愬埗 (鏈�澶�5MB) -- 鉁� 鍥剧墖灏哄寤鸿 (鏈�灏�200x200鍍忕礌) -- 鉁� 瀹屾暣鐨勯敊璇鐞嗗拰鐢ㄦ埛鎻愮ず - -### 馃帹 鐢ㄦ埛浣撻獙 -- 鉁� 浼橀泤鐨勭敤鎴风晫闈㈣璁� -- 鉁� 娴佺晠鐨勫姩鐢绘晥鏋� -- 鉁� 娓呮櫚鐨勭姸鎬佹寚绀� -- 鉁� 鍙嬪ソ鐨勯敊璇彁绀� -- 鉁� 鍝嶅簲寮忎氦浜掑弽棣� - -### 馃敡 鎶�鏈泦鎴� -- 鉁� COS浜戝瓨鍌ㄩ泦鎴� -- 鉁� GraphQL API闆嗘垚 -- 鉁� 寰俊灏忕▼搴廇PI闆嗘垚 -- 鉁� 琛ㄥ崟楠岃瘉绯荤粺闆嗘垚 - -## 鏂囦欢淇敼娓呭崟 - -### 1. WXML鏂囦欢 (`wx/pages/registration/registration.wxml`) -- 娣诲姞浜嗗ご鍍忎笂浼犲鍣� -- 瀹炵幇浜嗕笁绉嶇姸鎬佺殑UI锛氭湭涓婁紶銆佷笂浼犱腑銆佸凡涓婁紶 -- 娣诲姞浜嗘搷浣滄寜閽拰杩涘害鏄剧ず -- 闆嗘垚浜嗛敊璇姸鎬佹樉绀� - -### 2. WXSS鏂囦欢 (`wx/pages/registration/registration.wxss`) -- 娣诲姞浜嗗畬鏁寸殑澶村儚涓婁紶鏍峰紡 -- 瀹炵幇浜嗗姩鐢绘晥鏋滃拰浜や簰鍙嶉 -- 娣诲姞浜嗗搷搴斿紡璁捐 -- 浼樺寲浜嗚瑙夋晥鏋� - -### 3. JS鏂囦欢 (`wx/pages/registration/registration.js`) -- 娣诲姞浜嗗ご鍍忔暟鎹瓧娈� (`avatarUrl`, `avatarMediaId`) -- 娣诲姞浜嗕笂浼犵姸鎬佺鐞� (`avatarUploading`, `avatarUploadProgress`) -- 瀹炵幇浜� `onChooseAvatar()` 鏂规硶 -- 瀹炵幇浜� `onDeleteAvatar()` 鏂规硶 -- 闆嗘垚浜嗘枃浠堕獙璇侀�昏緫 -- 鏇存柊浜嗚〃鍗曢獙璇佸拰鎻愪氦閫昏緫 -- 闆嗘垚浜咷raphQL mutation - -## 鎶�鏈疄鐜扮粏鑺� - -### 澶村儚閫夋嫨鍜岄獙璇佹祦绋� -```javascript -1. 鐢ㄦ埛鐐瑰嚮涓婁紶鎸夐挳 -2. 璋冪敤 wx.chooseMedia() 閫夋嫨鍥剧墖 -3. 楠岃瘉鏂囦欢绫诲瀷 (JPG/PNG/WebP) -4. 楠岃瘉鏂囦欢澶у皬 (鈮�5MB) -5. 楠岃瘉鍥剧墖灏哄 (寤鸿鈮�200x200) -6. 鏄剧ず纭瀵硅瘽妗� (濡傛灉灏哄杩囧皬) -``` - -### 涓婁紶娴佺▼ -```javascript -1. 鏄剧ず涓婁紶杩涘害UI -2. 璋冪敤 cosUtil.uploadAvatar() 涓婁紶鍒癈OS -3. 瀹炴椂鏇存柊杩涘害鏉� -4. 涓婁紶鎴愬姛鍚庢洿鏂拌〃鍗曟暟鎹� -5. 鏄剧ず澶村儚棰勮 -6. 娓呴櫎閿欒鐘舵�� -``` - -### GraphQL闆嗘垚 -```graphql -mutation SubmitRegistration($playerInfo: PlayerInfoInput!) { - submitRegistration(playerInfo: $playerInfo) { - playerInfo { - avatarMediaId # 鏂板瀛楁 - } - } -} -``` - -## 鐢ㄦ埛鎿嶄綔娴佺▼ - -### 涓婁紶澶村儚 -1. 鐐瑰嚮"鐐瑰嚮涓婁紶澶村儚"鎸夐挳 -2. 閫夋嫨鍥剧墖鏉ユ簮锛堢浉鍐�/鐩告満锛� -3. 閫夋嫨鍥剧墖鏂囦欢 -4. 绯荤粺鑷姩楠岃瘉鏂囦欢 -5. 纭涓婁紶锛堝鏈夊昂瀵告彁绀猴級 -6. 瑙傚療涓婁紶杩涘害 -7. 鏌ョ湅澶村儚棰勮 - -### 绠$悊澶村儚 -1. 閲嶆柊涓婁紶锛氱偣鍑�"閲嶆柊涓婁紶"鎸夐挳 -2. 鍒犻櫎澶村儚锛氱偣鍑�"鍒犻櫎"鎸夐挳骞剁‘璁� - -## 閿欒澶勭悊 - -### 鏂囦欢楠岃瘉閿欒 -- 涓嶆敮鎸佺殑鏂囦欢鏍煎紡 -- 鏂囦欢澶у皬瓒呴檺 -- 鍥剧墖灏哄杩囧皬锛堟彁绀轰絾鍏佽缁х画锛� - -### 涓婁紶閿欒 -- 缃戠粶杩炴帴澶辫触 -- 涓婁紶鏉冮檺涓嶈冻 -- 瀛樺偍绌洪棿涓嶈冻 -- 鍏朵粬涓婁紶閿欒 - -### 鍒犻櫎閿欒 -- COS鏂囦欢鍒犻櫎澶辫触锛堜笉褰卞搷鏈湴娓呯悊锛� -- 缃戠粶閿欒 - -## 娴嬭瘯楠岃瘉 - -### 鑷姩鍖栨祴璇� -- 鉁� WXML缁撴瀯瀹屾暣鎬ф鏌� -- 鉁� WXSS鏍峰紡瀹屾暣鎬ф鏌� -- 鉁� JS閫昏緫瀹屾暣鎬ф鏌� -- 鉁� 渚濊禆椤规鏌� -- 鉁� GraphQL闆嗘垚楠岃瘉 - -### 鎵嬪姩娴嬭瘯寤鸿 -1. 鍦ㄥ井淇″紑鍙戣�呭伐鍏蜂腑鎵撳紑灏忕▼搴� -2. 瀵艰埅鍒版敞鍐岄〉闈� -3. 娴嬭瘯瀹屾暣鐨勫ご鍍忎笂浼犳祦绋� -4. 楠岃瘉鍚勭閿欒鎯呭喌鐨勫鐞� -5. 瀹屾垚鏁翠釜娉ㄥ唽娴佺▼纭鏁版嵁鎻愪氦 - -## 鎬ц兘浼樺寲 - -### 鏂囦欢澶勭悊 -- 浣跨敤鍘嬬缉妯″紡閫夋嫨鍥剧墖 -- 闄愬埗鏂囦欢澶у皬鍑忓皯涓婁紶鏃堕棿 -- 寮傛涓婁紶涓嶉樆濉濽I - -### 鐢ㄦ埛浣撻獙 -- 瀹炴椂杩涘害鍙嶉 -- 浼橀泤鐨勫姞杞界姸鎬� -- 蹇�熺殑閿欒鎻愮ず - -## 瀹夊叏鑰冭檻 - -### 瀹㈡埛绔獙璇� -- 鏂囦欢绫诲瀷鐧藉悕鍗� -- 鏂囦欢澶у皬闄愬埗 -- 鍥剧墖鏍煎紡楠岃瘉 - -### 鏈嶅姟绔泦鎴� -- COS瀹夊叏涓婁紶 -- 濯掍綋ID绠$悊 -- 鏉冮檺鎺у埗 - -## 鍚庣画鎵╁睍寤鸿 - -### 鍔熻兘澧炲己 -- [ ] 澶村儚瑁佸壀鍔熻兘 -- [ ] 澶氱灏哄鐢熸垚 -- [ ] 澶村儚婊ら暅鏁堟灉 -- [ ] 鎵归噺涓婁紶鏀寔 - -### 鎬ц兘浼樺寲 -- [ ] 鍥剧墖鍘嬬缉绠楁硶浼樺寲 -- [ ] CDN鍔犻�� -- [ ] 缂撳瓨绛栫暐浼樺寲 - -### 鐢ㄦ埛浣撻獙 -- [ ] 鎷栨嫿涓婁紶鏀寔 -- [ ] 鏇村鍔ㄧ敾鏁堟灉 -- [ ] 涓�у寲澶村儚妗� - -## 鎬荤粨 - -澶村儚涓婁紶鍔熻兘宸插畬鍏ㄩ泦鎴愬埌灏忕▼搴忔敞鍐岄〉闈腑锛屾彁渚涗簡瀹屾暣鐨勭敤鎴蜂綋楠屽拰寮哄ぇ鐨勯敊璇鐞嗚兘鍔涖�傛墍鏈夊姛鑳介兘缁忚繃浜嗚嚜鍔ㄥ寲娴嬭瘯楠岃瘉锛屽彲浠ョ洿鎺ュ湪寰俊寮�鍙戣�呭伐鍏蜂腑杩涜娴嬭瘯鍜屼娇鐢ㄣ�� - -璇ュ姛鑳界殑瀹炵幇閬靛惊浜嗗井淇″皬绋嬪簭鐨勬渶浣冲疄璺碉紝鍏锋湁鑹ソ鐨勫彲缁存姢鎬у拰鎵╁睍鎬э紝涓哄悗缁殑鍔熻兘澧炲己濂犲畾浜嗗潥瀹炵殑鍩虹銆� \ No newline at end of file diff --git "a/\347\241\254\347\274\226\347\240\201\351\227\256\351\242\230\345\210\206\346\236\220\346\212\245\345\221\212.md" "b/\347\241\254\347\274\226\347\240\201\351\227\256\351\242\230\345\210\206\346\236\220\346\212\245\345\221\212.md" deleted file mode 100644 index 8ac91ac..0000000 --- "a/\347\241\254\347\274\226\347\240\201\351\227\256\351\242\230\345\210\206\346\236\220\346\212\245\345\221\212.md" +++ /dev/null @@ -1,156 +0,0 @@ -# 纭紪鐮侀棶棰樺垎鏋愭姤鍛� - -## 闂姒傝堪 - -缁忚繃鍏ㄩ潰妫�鏌ワ紝鍙戠幇椤圭洰涓瓨鍦ㄥ澶勭‖缂栫爜闂锛屼富瑕侀泦涓湪姣旇禌闃舵鍚嶇О鐨勫鐞嗕笂銆傝繖浜涚‖缂栫爜浼氬鑷寸郴缁熷湪鐢ㄦ埛鑷畾涔夐樁娈靛悕绉版椂鍑虹幇鍔熻兘寮傚父銆� - -## 鍙戠幇鐨勭‖缂栫爜闂 - -### 1. 鍚庣鏈嶅姟灞傜‖缂栫爜锛堜弗閲嶏級 - -**鏂囦欢锛�** `backend/src/main/java/com/rongyichuang/player/service/PlayerApplicationService.java` -**浣嶇疆锛�** 绗�35琛� -**闂浠g爜锛�** -```java -// 榛樿鍙樉绀烘捣閫夐樁娈电殑鏁版嵁锛岃繃婊ゆ帀澶嶈禌绛夊悗缁樁娈� -whereClause.append("(stage.name NOT LIKE '%澶嶈禌%' AND stage.name NOT LIKE '%鍐宠禌%')"); -``` - -**闂鍒嗘瀽锛�** -- 纭紪鐮佷簡"澶嶈禌"鍜�"鍐宠禌"瀛楃涓� -- 濡傛灉鐢ㄦ埛鑷畾涔夐樁娈靛悕绉帮紙濡�"绗簩杞�"銆�"鍗婂喅璧�"绛夛級锛岃繃婊ら�昏緫灏嗗け鏁� -- 杩欐槸鏈�涓ラ噸鐨勭‖缂栫爜闂锛岀洿鎺ュ奖鍝嶄笟鍔¢�昏緫 - -### 2. 鍓嶇鐣岄潰纭紪鐮侊紙涓瓑锛� - -**鏂囦欢锛�** `web/src/views/ActivityForm.vue` -**浣嶇疆锛�** 绗�668琛� -**闂浠g爜锛�** -```javascript -const stageNames = ['', '娴烽��', '澶嶈禌', '鍗婂喅璧�', '鍐宠禌', '鎬诲喅璧�'] -``` - -**闂鍒嗘瀽锛�** -- 纭紪鐮佷簡榛樿闃舵鍚嶇О鏁扮粍 -- 闄愬埗浜嗙敤鎴风殑鑷畾涔夎兘鍔� -- 涓嶅鐏垫椿锛屾棤娉曢�傚簲涓嶅悓绫诲瀷鐨勬瘮璧� - -### 3. 鍓嶇姣旇禌鏅嬬骇椤甸潰纭紪鐮侊紙涓瓑锛� - -**鏂囦欢锛�** `web/src/views/competition-promotion/index.vue` -**浣嶇疆锛�** 绗�300琛屻�佺310琛屻�佺430琛� -**闂浠g爜锛�** -```javascript -stageName: '鍒濊禌', -stageName: '鍐宠禌', -currentStageName: '鍒濊禌' -``` - -**闂鍒嗘瀽锛�** -- 妯℃嫙鏁版嵁涓‖缂栫爜浜嗛樁娈靛悕绉� -- 鍙兘褰卞搷娴嬭瘯鍜屽紑鍙戠幆澧冪殑鏁版嵁涓�鑷存�� - -### 4. 鏁版嵁搴撴祴璇曟暟鎹‖缂栫爜锛堣交寰級 - -**鏂囦欢锛�** `db.sql` -**浣嶇疆锛�** 绗�39-45琛� -**闂浠g爜锛�** -```sql -INSERT INTO `t_activity` (..., `name`, ...) VALUES (..., '娴烽��', ...); -INSERT INTO `t_activity` (..., `name`, ...) VALUES (..., '澶嶈禌', ...); -``` - -**闂鍒嗘瀽锛�** -- 鍒濆鍖栨暟鎹腑纭紪鐮佷簡闃舵鍚嶇О -- 铏界劧鏄祴璇曟暟鎹紝浣嗗彲鑳借瀵煎紑鍙戣�呰涓鸿繖鏄爣鍑嗗懡鍚� - -## 鏍规湰鍘熷洜鍒嗘瀽 - -### 1. 缂轰箯闃舵绫诲瀷璁捐 -- 鏁版嵁搴撹〃 `t_activity` 涓彧鏈� `sort_order` 瀛楁琛ㄧず闃舵椤哄簭 -- 缂哄皯 `stage_type` 鎴� `stage_level` 瀛楁鏉ユ爣璇嗛樁娈电被鍨� -- 涓氬姟閫昏緫渚濊禆闃舵鍚嶇О鑰岄潪闃舵绫诲瀷 - -### 2. 杩囨护閫昏緫璁捐涓嶅綋 -- 浣跨敤瀛楃涓插尮閰嶈�岄潪缁撴瀯鍖栧瓧娈佃繘琛岃繃婊� -- 娌℃湁鑰冭檻鐢ㄦ埛鑷畾涔夐樁娈靛悕绉扮殑鍦烘櫙 - -## 淇敼寤鸿 - -### 鏂规涓�锛氭坊鍔犻樁娈电被鍨嬪瓧娈碉紙鎺ㄨ崘锛� - -1. **鏁版嵁搴撶粨鏋勪慨鏀�** -```sql -ALTER TABLE t_activity ADD COLUMN stage_type INT DEFAULT 1 COMMENT '闃舵绫诲瀷锛�1=鍒濋�夐樁娈碉紝2=涓骇闃舵锛�3=楂樼骇闃舵'; -``` - -2. **鍚庣鏈嶅姟淇敼** -```java -// 鏇挎崲纭紪鐮佺殑瀛楃涓插尮閰� -// 鍘熶唬鐮侊細whereClause.append("(stage.name NOT LIKE '%澶嶈禌%' AND stage.name NOT LIKE '%鍐宠禌%')"); -// 鏂颁唬鐮侊細 -whereClause.append("stage.stage_type = 1"); // 鍙樉绀哄垵閫夐樁娈� -``` - -3. **鍓嶇鐣岄潰淇敼** -- 鍦ㄦ椿鍔ㄥ垱寤鸿〃鍗曚腑娣诲姞闃舵绫诲瀷閫夋嫨 -- 绉婚櫎纭紪鐮佺殑闃舵鍚嶇О鏁扮粍 -- 鍏佽鐢ㄦ埛鑷畾涔夐樁娈靛悕绉� - -### 鏂规浜岋細鍩轰簬鎺掑簭椤哄簭杩囨护锛堝閫夛級 - -1. **鍚庣鏈嶅姟淇敼** -```java -// 鍩轰簬sort_order杩囨护锛屽彧鏄剧ず绗竴闃舵 -whereClause.append("stage.sort_order = 1"); -``` - -2. **浼樼偣锛�** 鏃犻渶淇敼鏁版嵁搴撶粨鏋� -3. **缂虹偣锛�** 鐏垫椿鎬ц緝宸紝鏃犳硶鏀寔澶嶆潅鐨勯樁娈靛垎绫� - -### 鏂规涓夛細閰嶇疆鍖栭樁娈电鐞嗭紙鏈�浣筹級 - -1. **鍒涘缓闃舵绫诲瀷閰嶇疆琛�** -```sql -CREATE TABLE t_stage_type ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - name VARCHAR(50) NOT NULL COMMENT '闃舵绫诲瀷鍚嶇О', - code VARCHAR(20) NOT NULL COMMENT '闃舵绫诲瀷浠g爜', - level INT NOT NULL COMMENT '闃舵绾у埆', - is_initial BOOLEAN DEFAULT FALSE COMMENT '鏄惁涓哄垵閫夐樁娈�', - description VARCHAR(255) COMMENT '鎻忚堪' -); -``` - -2. **淇敼娲诲姩琛�** -```sql -ALTER TABLE t_activity ADD COLUMN stage_type_id BIGINT COMMENT '闃舵绫诲瀷ID'; -``` - -3. **涓氬姟閫昏緫淇敼** -```java -// 鍩轰簬闃舵绫诲瀷閰嶇疆杩涜杩囨护 -whereClause.append("EXISTS (SELECT 1 FROM t_stage_type st WHERE st.id = stage.stage_type_id AND st.is_initial = true)"); -``` - -## 瀹炴柦浼樺厛绾� - -1. **楂樹紭鍏堢骇锛�** 淇 `PlayerApplicationService.java` 涓殑纭紪鐮佽繃婊ら�昏緫 -2. **涓紭鍏堢骇锛�** 淇敼鍓嶇闃舵鍚嶇О纭紪鐮� -3. **浣庝紭鍏堢骇锛�** 娓呯悊娴嬭瘯鏁版嵁涓殑纭紪鐮� - -## 椋庨櫓璇勪及 - -- **楂橀闄╋細** 鍚庣杩囨护閫昏緫淇敼鍙兘褰卞搷鐜版湁鏁版嵁鏌ヨ -- **涓闄╋細** 鏁版嵁搴撶粨鏋勪慨鏀归渶瑕佹暟鎹縼绉� -- **浣庨闄╋細** 鍓嶇鐣岄潰淇敼鐩稿瀹夊叏 - -## 寤鸿瀹炴柦姝ラ - -1. 棣栧厛瀹炴柦鏂规浜岋紙鍩轰簬鎺掑簭椤哄簭锛夛紝蹇�熻В鍐冲綋鍓嶉棶棰� -2. 鐒跺悗閫愭瀹炴柦鏂规涓夛紙閰嶇疆鍖栫鐞嗭級锛屾彁渚涢暱鏈熻В鍐虫柟妗� -3. 鏈�鍚庢竻鐞嗘墍鏈夌浉鍏崇殑纭紪鐮侀棶棰� - -## 鎬荤粨 - -椤圭洰涓殑纭紪鐮侀棶棰樹富瑕佹簮浜庣己涔忓悎鐞嗙殑闃舵绫诲瀷璁捐銆傚缓璁噰鐢ㄩ厤缃寲鐨勬柟寮忕鐞嗛樁娈电被鍨嬶紝鏃㈣兘瑙e喅褰撳墠鐨勭‖缂栫爜闂锛屽張鑳戒负鏈潵鐨勫姛鑳芥墿灞曟彁渚涜壇濂界殑鍩虹銆� \ No newline at end of file diff --git "a/\351\231\204\344\273\266\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" "b/\351\231\204\344\273\266\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" deleted file mode 100644 index 3586caf..0000000 --- "a/\351\231\204\344\273\266\344\270\212\344\274\240\345\212\237\350\203\275\346\200\273\347\273\223.md" +++ /dev/null @@ -1,221 +0,0 @@ -# 闄勪欢涓婁紶鍔熻兘瀹炵幇鎬荤粨 - -## 鍔熻兘姒傝堪 -涓哄皬绋嬪簭鎶ュ悕椤甸潰娣诲姞浜嗗畬鏁寸殑闄勪欢涓婁紶鍔熻兘锛屾敮鎸佸绉嶆枃浠剁被鍨嬶紝鍖呭惈鏂囦欢楠岃瘉銆佽繘搴︽樉绀恒�侀敊璇鐞嗙瓑瀹屾暣鍔熻兘銆� - -## 瀹炵幇鐨勫姛鑳� - -### 1. 鍓嶇鍔熻兘 (灏忕▼搴�) -- **澶氭枃浠朵笂浼�**: 鏀寔鏈�澶�8涓檮浠� -- **鏂囦欢绫诲瀷鏀寔**: 鍥剧墖銆佽棰戙�丳DF銆乄ord銆丒xcel銆丳PT銆佹枃鏈枃浠� -- **鏂囦欢澶у皬闄愬埗**: - - 鍥剧墖/瑙嗛: 50MB - - 鏂囨。: 20MB - - 鏂囨湰: 5MB -- **瀹炴椂杩涘害鏄剧ず**: 涓婁紶杩囩▼涓樉绀鸿繘搴︽潯 -- **鏂囦欢棰勮**: 鏀寔鍥剧墖棰勮锛屽叾浠栨枃浠舵樉绀哄浘鏍� -- **鏂囦欢绠$悊**: 鏀寔鍒犻櫎宸蹭笂浼犵殑鏂囦欢 -- **閿欒澶勭悊**: 瀹屾暣鐨勯敊璇彁绀哄拰澶勭悊鏈哄埗 - -### 2. 鍚庣鍔熻兘 (GraphQL API) -- **Schema鏇存柊**: 娣诲姞浜哷attachmentMediaIds`鍜宍avatarMediaId`瀛楁 -- **鏁版嵁鎺ユ敹**: 鏀寔鎺ユ敹闄勪欢ID鍒楄〃 -- **鏁版嵁搴撳瓨鍌�**: 瀹屾暣鐨勫叧鑱斿瓨鍌ㄦ満鍒� - -### 3. 鏂囦欢瀛樺偍 (鑵捐浜慍OS) -- **瀹夊叏涓婁紶**: 浣跨敤涓存椂瀵嗛挜涓婁紶 -- **鏂囦欢绠$悊**: 鏀寔鏂囦欢鍒犻櫎 -- **URL鐢熸垚**: 鑷姩鐢熸垚璁块棶URL - -## 鎶�鏈疄鐜� - -### 鍓嶇瀹炵幇 (registration.js) -```javascript -// 鏍稿績鏁版嵁缁撴瀯 -data: { - attachments: [], // 闄勪欢鍒楄〃 - maxAttachments: 8, // 鏈�澶ч檮浠舵暟閲� - fileTypeConfig: { // 鏂囦欢绫诲瀷閰嶇疆 - image: { extensions: ['.jpg', '.jpeg', '.png', '.gif'], maxSize: 50, icon: '馃柤锔�' }, - video: { extensions: ['.mp4', '.avi', '.mov'], maxSize: 50, icon: '馃帴' }, - pdf: { extensions: ['.pdf'], maxSize: 20, icon: '馃搫' }, - // ... 鏇村绫诲瀷 - } -} - -// 鏍稿績鏂规硶 -onChooseAttachment() // 閫夋嫨鏂囦欢 -uploadAttachment() // 涓婁紶鏂囦欢 -validateAttachment() // 楠岃瘉鏂囦欢 -onDeleteAttachment() // 鍒犻櫎鏂囦欢 -formatFileSize() // 鏍煎紡鍖栨枃浠跺ぇ灏� -``` - -### 鍚庣Schema (player.graphqls) -```graphql -input ActivityRegistrationInput { - activityId: ID! - playerInfo: PlayerRegistrationInput! - regionId: ID - projectName: String - description: String - mediaFiles: [MediaFileInput!] - attachmentMediaIds: [String!] # 鏂板闄勪欢ID鍒楄〃 -} - -input PlayerRegistrationInput { - name: String! - phone: String! - gender: Int - birthDate: String - education: String - introduction: String - description: String - avatarMediaId: String # 鏂板澶村儚ID -} -``` - -## 鏁版嵁娴佺▼ - -### 1. 鏂囦欢涓婁紶娴佺▼ -``` -鐢ㄦ埛閫夋嫨鏂囦欢 鈫� 鏂囦欢楠岃瘉 鈫� 涓婁紶鍒癈OS 鈫� 鑾峰彇mediaId 鈫� 瀛樺偍鍒版湰鍦版暟缁� -``` - -### 2. 琛ㄥ崟鎻愪氦娴佺▼ -``` -鏀堕泦琛ㄥ崟鏁版嵁 鈫� 鏋勫缓GraphQL璇锋眰 鈫� 鍖呭惈attachmentMediaIds 鈫� 鍙戦�佸埌鍚庣 鈫� 瀛樺偍鍒版暟鎹簱 -``` - -### 3. 鏁版嵁搴撳瓨鍌� -- **t_user**: 鐢ㄦ埛鍩烘湰淇℃伅 -- **t_player**: 閫夋墜淇℃伅 (鍖呭惈avatar_media_id) -- **t_activity_player**: 鎶ュ悕璁板綍 -- **t_media**: 濯掍綋鏂囦欢璁板綍 (澶村儚鍜岄檮浠�) - -## 鐢ㄦ埛鐣岄潰 - -### 闄勪欢涓婁紶鍖哄煙 -- 涓婁紶鎸夐挳 (鏄剧ず褰撳墠鏁伴噺/鏈�澶ф暟閲�) -- 闄勪欢鍒楄〃 (鏄剧ず鏂囦欢鍚嶃�佸ぇ灏忋�佺姸鎬�) -- 杩涘害鏉� (涓婁紶涓樉绀�) -- 鍒犻櫎鎸夐挳 (姣忎釜闄勪欢) - -### 鐘舵�佹樉绀� -- **uploading**: 涓婁紶涓� (鏄剧ず杩涘害) -- **success**: 涓婁紶鎴愬姛 (鏄剧ず瀹屾垚鍥炬爣) -- **error**: 涓婁紶澶辫触 (鏄剧ず閿欒淇℃伅) - -## 閿欒澶勭悊 - -### 鏂囦欢楠岃瘉閿欒 -- 鏂囦欢绫诲瀷涓嶆敮鎸� -- 鏂囦欢澶у皬瓒呴檺 -- 闄勪欢鏁伴噺瓒呴檺 - -### 涓婁紶閿欒 -- 缃戠粶閿欒 -- COS涓婁紶澶辫触 -- 鏈嶅姟鍣ㄩ敊璇� - -### 鐢ㄦ埛鍙嶉 -- Toast鎻愮ず -- 閿欒鐘舵�佹樉绀� -- 閲嶈瘯鏈哄埗 - -## 娴嬭瘯楠岃瘉 - -### 1. 鍗曞厓娴嬭瘯 -- 鉁� 鏂囦欢绫诲瀷楠岃瘉 -- 鉁� 鏂囦欢澶у皬楠岃瘉 -- 鉁� 涓婁紶杩涘害璺熻釜 -- 鉁� 閿欒澶勭悊 - -### 2. 闆嗘垚娴嬭瘯 -- 鉁� 鍓嶇UI鍔熻兘 -- 鉁� 鍚庣API鎺ュ彛 -- 鉁� 鏁版嵁搴撳瓨鍌� -- 鉁� 瀹屾暣娴佺▼ - -### 3. API娴嬭瘯 -- 鉁� GraphQL Schema楠岃瘉 -- 鉁� 鏁版嵁浼犺緭娴嬭瘯 -- 鉁� 鎶ュ悕鎻愪氦鎴愬姛 - -## 閰嶇疆璇存槑 - -### 鏂囦欢绫诲瀷閰嶇疆 -鍙湪`fileTypeConfig`涓皟鏁存敮鎸佺殑鏂囦欢绫诲瀷銆佸ぇ灏忛檺鍒跺拰鏄剧ず鍥炬爣銆� - -### 鏁伴噺闄愬埗 -鍙�氳繃`maxAttachments`璋冩暣鏈�澶ч檮浠舵暟閲忋�� - -### COS閰嶇疆 -闇�瑕侀厤缃吘璁簯COS鐨勭浉鍏冲弬鏁� (鍦╟osUtil.js涓�)銆� - -## 浣跨敤璇存槑 - -### 鐢ㄦ埛鎿嶄綔娴佺▼ -1. 杩涘叆鎶ュ悕椤甸潰 -2. 濉啓鍩烘湰淇℃伅 -3. 涓婁紶澶村儚 (鍙��) -4. 鐐瑰嚮"娣诲姞闄勪欢"鎸夐挳 -5. 閫夋嫨瑕佷笂浼犵殑鏂囦欢 -6. 绛夊緟涓婁紶瀹屾垚 -7. 鍙垹闄や笉闇�瑕佺殑闄勪欢 -8. 鎻愪氦鎶ュ悕琛ㄥ崟 - -### 寮�鍙戣�呮敞鎰忎簨椤� -1. 纭繚COS閰嶇疆姝g‘ -2. 妫�鏌ユ枃浠剁被鍨嬪拰澶у皬闄愬埗 -3. 鐩戞帶涓婁紶杩涘害鍜岄敊璇� -4. 楠岃瘉鏁版嵁搴撳瓨鍌� - -## 鎬ц兘浼樺寲 - -### 1. 鏂囦欢涓婁紶 -- 鏀寔骞跺彂涓婁紶 -- 杩涘害瀹炴椂鍙嶉 -- 澶辫触鑷姩閲嶈瘯 - -### 2. 鐢ㄦ埛浣撻獙 -- 鍗虫椂鏂囦欢楠岃瘉 -- 娓呮櫚鐨勭姸鎬佹彁绀� -- 娴佺晠鐨勪氦浜掑姩鐢� - -### 3. 璧勬簮绠$悊 -- 鍙婃椂娓呯悊涓存椂鏂囦欢 -- 鍚堢悊鐨勫唴瀛樹娇鐢� -- 缃戠粶璇锋眰浼樺寲 - -## 鎵╁睍寤鸿 - -### 1. 鍔熻兘鎵╁睍 -- 鏀寔鏂囦欢棰勮 -- 娣诲姞鏂囦欢鍘嬬缉 -- 鏀寔鎷栨嫿涓婁紶 -- 鎵归噺鎿嶄綔鍔熻兘 - -### 2. 鎬ц兘浼樺寲 -- 鏂囦欢鍒嗙墖涓婁紶 -- 鏂偣缁紶 -- CDN鍔犻�� -- 缂撳瓨绛栫暐 - -### 3. 瀹夊叏澧炲己 -- 鏂囦欢鍐呭妫�娴� -- 鐥呮瘨鎵弿 -- 璁块棶鏉冮檺鎺у埗 -- 姘村嵃娣诲姞 - -## 鎬荤粨 - -闄勪欢涓婁紶鍔熻兘宸插畬鏁村疄鐜帮紝鍖呭惈锛� -- 鉁� 瀹屾暣鐨勫墠绔疷I鍜屼氦浜� -- 鉁� robust鐨勬枃浠堕獙璇佸拰閿欒澶勭悊 -- 鉁� 瀹炴椂鐨勪笂浼犺繘搴﹀拰鐘舵�佺鐞� -- 鉁� 瀹屾暣鐨勫悗绔疉PI鏀寔 -- 鉁� 鏁版嵁搴撳瓨鍌ㄥ拰鍏宠仈 -- 鉁� 鍏ㄩ潰鐨勬祴璇曢獙璇� - -璇ュ姛鑳藉凡鍑嗗濂芥姇鍏ョ敓浜т娇鐢紝涓虹敤鎴锋彁渚涗簡瀹屾暣銆佸畨鍏ㄣ�佹槗鐢ㄧ殑闄勪欢涓婁紶浣撻獙銆� \ No newline at end of file diff --git "a/\351\241\265\351\235\242bug.png" "b/\351\241\265\351\235\242bug.png" deleted file mode 100644 index 5f76a66..0000000 --- "a/\351\241\265\351\235\242bug.png" +++ /dev/null Binary files differ -- Gitblit v1.8.0