fix(dependencies): Remove peer flags from package-lock.json and update Vite dependencies

- Removed unnecessary "peer" flags from various dependencies in package-lock.json to streamline package management.
- Updated Vite dependencies and their corresponding metadata for improved performance and compatibility.
- Adjusted import paths in CSS files to reflect the correct directory structure.
- Deleted unused CSS files related to the "col" component to clean up the project.
This commit is contained in:
ethanfly 2026-02-07 02:05:34 +08:00
parent d07ebb735a
commit 8f9eb38666
80 changed files with 3010 additions and 740 deletions

1065
admin/node_modules/.package-lock.json generated vendored

File diff suppressed because it is too large Load Diff

View File

@ -292,8 +292,8 @@ import {
wind_power_default, wind_power_default,
zoom_in_default, zoom_in_default,
zoom_out_default zoom_out_default
} from "./chunk-L7WLSQ4R.js"; } from "./chunk-OP4ZUAFM.js";
import "./chunk-ELEEJBJQ.js"; import "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
export { export {
add_location_default as AddLocation, add_location_default as AddLocation,

View File

@ -1,365 +1,314 @@
{ {
"hash": "8a568c02", "hash": "481070f0",
"configHash": "47a28a65", "configHash": "0bd4dba1",
"lockfileHash": "05df1c47", "lockfileHash": "aa252f00",
"browserHash": "dda6d657", "browserHash": "dd67beda",
"optimized": { "optimized": {
"@element-plus/icons-vue": { "@element-plus/icons-vue": {
"src": "../../@element-plus/icons-vue/dist/index.js", "src": "../../@element-plus/icons-vue/dist/index.js",
"file": "@element-plus_icons-vue.js", "file": "@element-plus_icons-vue.js",
"fileHash": "ec7aa758", "fileHash": "5292dd97",
"needsInterop": false
},
"axios": {
"src": "../../axios/index.js",
"file": "axios.js",
"fileHash": "50abb3a0",
"needsInterop": false
},
"dayjs": {
"src": "../../dayjs/dayjs.min.js",
"file": "dayjs.js",
"fileHash": "7122c9bb",
"needsInterop": true
},
"element-plus": {
"src": "../../element-plus/es/index.mjs",
"file": "element-plus.js",
"fileHash": "de0a4e4c",
"needsInterop": false
},
"element-plus/dist/locale/zh-cn.mjs": {
"src": "../../element-plus/dist/locale/zh-cn.mjs",
"file": "element-plus_dist_locale_zh-cn__mjs.js",
"fileHash": "7ff2f81b",
"needsInterop": false
},
"pinia": {
"src": "../../pinia/dist/pinia.mjs",
"file": "pinia.js",
"fileHash": "9025ba71",
"needsInterop": false
},
"qrcode": {
"src": "../../qrcode/lib/browser.js",
"file": "qrcode.js",
"fileHash": "85e1c633",
"needsInterop": true
},
"vue": {
"src": "../../vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "d67acca6",
"needsInterop": false
},
"vue-router": {
"src": "../../vue-router/dist/vue-router.mjs",
"file": "vue-router.js",
"fileHash": "f248d375",
"needsInterop": false
},
"element-plus/es": {
"src": "../../element-plus/es/index.mjs",
"file": "element-plus_es.js",
"fileHash": "48f929fb",
"needsInterop": false
},
"element-plus/es/components/base/style/css": {
"src": "../../element-plus/es/components/base/style/css.mjs",
"file": "element-plus_es_components_base_style_css.js",
"fileHash": "0bfce4cf",
"needsInterop": false
},
"element-plus/es/components/form/style/css": {
"src": "../../element-plus/es/components/form/style/css.mjs",
"file": "element-plus_es_components_form_style_css.js",
"fileHash": "d4788822",
"needsInterop": false
},
"element-plus/es/components/button/style/css": {
"src": "../../element-plus/es/components/button/style/css.mjs",
"file": "element-plus_es_components_button_style_css.js",
"fileHash": "3041eea7",
"needsInterop": false
},
"element-plus/es/components/form-item/style/css": {
"src": "../../element-plus/es/components/form-item/style/css.mjs",
"file": "element-plus_es_components_form-item_style_css.js",
"fileHash": "c56d69b7",
"needsInterop": false
},
"element-plus/es/components/input/style/css": {
"src": "../../element-plus/es/components/input/style/css.mjs",
"file": "element-plus_es_components_input_style_css.js",
"fileHash": "416bddc0",
"needsInterop": false
},
"element-plus/es/components/dialog/style/css": {
"src": "../../element-plus/es/components/dialog/style/css.mjs",
"file": "element-plus_es_components_dialog_style_css.js",
"fileHash": "e061560e",
"needsInterop": false
},
"element-plus/es/components/container/style/css": {
"src": "../../element-plus/es/components/container/style/css.mjs",
"file": "element-plus_es_components_container_style_css.js",
"fileHash": "a3114877",
"needsInterop": false
},
"element-plus/es/components/main/style/css": {
"src": "../../element-plus/es/components/main/style/css.mjs",
"file": "element-plus_es_components_main_style_css.js",
"fileHash": "51b2c8ae",
"needsInterop": false
},
"element-plus/es/components/header/style/css": {
"src": "../../element-plus/es/components/header/style/css.mjs",
"file": "element-plus_es_components_header_style_css.js",
"fileHash": "29396d87",
"needsInterop": false
},
"element-plus/es/components/dropdown/style/css": {
"src": "../../element-plus/es/components/dropdown/style/css.mjs",
"file": "element-plus_es_components_dropdown_style_css.js",
"fileHash": "de9c8b64",
"needsInterop": false
},
"element-plus/es/components/dropdown-menu/style/css": {
"src": "../../element-plus/es/components/dropdown-menu/style/css.mjs",
"file": "element-plus_es_components_dropdown-menu_style_css.js",
"fileHash": "876b962c",
"needsInterop": false
},
"element-plus/es/components/dropdown-item/style/css": {
"src": "../../element-plus/es/components/dropdown-item/style/css.mjs",
"file": "element-plus_es_components_dropdown-item_style_css.js",
"fileHash": "02fc7e6a",
"needsInterop": false
},
"element-plus/es/components/avatar/style/css": {
"src": "../../element-plus/es/components/avatar/style/css.mjs",
"file": "element-plus_es_components_avatar_style_css.js",
"fileHash": "8dd20109",
"needsInterop": false
},
"element-plus/es/components/breadcrumb/style/css": {
"src": "../../element-plus/es/components/breadcrumb/style/css.mjs",
"file": "element-plus_es_components_breadcrumb_style_css.js",
"fileHash": "57e8092c",
"needsInterop": false
},
"element-plus/es/components/breadcrumb-item/style/css": {
"src": "../../element-plus/es/components/breadcrumb-item/style/css.mjs",
"file": "element-plus_es_components_breadcrumb-item_style_css.js",
"fileHash": "481a3941",
"needsInterop": false
},
"element-plus/es/components/aside/style/css": {
"src": "../../element-plus/es/components/aside/style/css.mjs",
"file": "element-plus_es_components_aside_style_css.js",
"fileHash": "59d11e8a",
"needsInterop": false
},
"element-plus/es/components/menu/style/css": {
"src": "../../element-plus/es/components/menu/style/css.mjs",
"file": "element-plus_es_components_menu_style_css.js",
"fileHash": "2698e97e",
"needsInterop": false
},
"element-plus/es/components/menu-item/style/css": {
"src": "../../element-plus/es/components/menu-item/style/css.mjs",
"file": "element-plus_es_components_menu-item_style_css.js",
"fileHash": "52307744",
"needsInterop": false
},
"element-plus/es/components/icon/style/css": {
"src": "../../element-plus/es/components/icon/style/css.mjs",
"file": "element-plus_es_components_icon_style_css.js",
"fileHash": "1ca3c820",
"needsInterop": false
},
"element-plus/es/components/input-number/style/css": {
"src": "../../element-plus/es/components/input-number/style/css.mjs",
"file": "element-plus_es_components_input-number_style_css.js",
"fileHash": "47263c6c",
"needsInterop": false
},
"element-plus/es/components/autocomplete/style/css": {
"src": "../../element-plus/es/components/autocomplete/style/css.mjs",
"file": "element-plus_es_components_autocomplete_style_css.js",
"fileHash": "1f9138ee",
"needsInterop": false
},
"element-plus/es/components/tag/style/css": {
"src": "../../element-plus/es/components/tag/style/css.mjs",
"file": "element-plus_es_components_tag_style_css.js",
"fileHash": "64584bf9",
"needsInterop": false
},
"element-plus/es/components/row/style/css": {
"src": "../../element-plus/es/components/row/style/css.mjs",
"file": "element-plus_es_components_row_style_css.js",
"fileHash": "a66bee2e",
"needsInterop": false
},
"element-plus/es/components/col/style/css": {
"src": "../../element-plus/es/components/col/style/css.mjs",
"file": "element-plus_es_components_col_style_css.js",
"fileHash": "0f603d50",
"needsInterop": false
},
"element-plus/es/components/loading/style/css": {
"src": "../../element-plus/es/components/loading/style/css.mjs",
"file": "element-plus_es_components_loading_style_css.js",
"fileHash": "3e156d5d",
"needsInterop": false
},
"element-plus/es/components/pagination/style/css": {
"src": "../../element-plus/es/components/pagination/style/css.mjs",
"file": "element-plus_es_components_pagination_style_css.js",
"fileHash": "7bbf7c89",
"needsInterop": false
},
"element-plus/es/components/table/style/css": {
"src": "../../element-plus/es/components/table/style/css.mjs",
"file": "element-plus_es_components_table_style_css.js",
"fileHash": "d5e7610e",
"needsInterop": false
},
"element-plus/es/components/table-column/style/css": {
"src": "../../element-plus/es/components/table-column/style/css.mjs",
"file": "element-plus_es_components_table-column_style_css.js",
"fileHash": "bd8ce5e0",
"needsInterop": false
},
"element-plus/es/components/select/style/css": {
"src": "../../element-plus/es/components/select/style/css.mjs",
"file": "element-plus_es_components_select_style_css.js",
"fileHash": "abd102ea",
"needsInterop": false
},
"element-plus/es/components/option/style/css": {
"src": "../../element-plus/es/components/option/style/css.mjs",
"file": "element-plus_es_components_option_style_css.js",
"fileHash": "57ef18f7",
"needsInterop": false
},
"element-plus/es/components/collapse/style/css": {
"src": "../../element-plus/es/components/collapse/style/css.mjs",
"file": "element-plus_es_components_collapse_style_css.js",
"fileHash": "bf75176c",
"needsInterop": false
},
"element-plus/es/components/collapse-item/style/css": {
"src": "../../element-plus/es/components/collapse-item/style/css.mjs",
"file": "element-plus_es_components_collapse-item_style_css.js",
"fileHash": "afc23457",
"needsInterop": false
},
"element-plus/es/components/descriptions/style/css": {
"src": "../../element-plus/es/components/descriptions/style/css.mjs",
"file": "element-plus_es_components_descriptions_style_css.js",
"fileHash": "751f9003",
"needsInterop": false
},
"element-plus/es/components/descriptions-item/style/css": {
"src": "../../element-plus/es/components/descriptions-item/style/css.mjs",
"file": "element-plus_es_components_descriptions-item_style_css.js",
"fileHash": "364abd80",
"needsInterop": false
},
"element-plus/es/components/radio-group/style/css": {
"src": "../../element-plus/es/components/radio-group/style/css.mjs",
"file": "element-plus_es_components_radio-group_style_css.js",
"fileHash": "5d023797",
"needsInterop": false
},
"element-plus/es/components/radio/style/css": {
"src": "../../element-plus/es/components/radio/style/css.mjs",
"file": "element-plus_es_components_radio_style_css.js",
"fileHash": "7013a88b",
"needsInterop": false
},
"element-plus/es/components/switch/style/css": {
"src": "../../element-plus/es/components/switch/style/css.mjs",
"file": "element-plus_es_components_switch_style_css.js",
"fileHash": "9c2d7cdf",
"needsInterop": false "needsInterop": false
}, },
"@wangeditor/editor-for-vue": { "@wangeditor/editor-for-vue": {
"src": "../../@wangeditor/editor-for-vue/dist/index.esm.js", "src": "../../@wangeditor/editor-for-vue/dist/index.esm.js",
"file": "@wangeditor_editor-for-vue.js", "file": "@wangeditor_editor-for-vue.js",
"fileHash": "d16802eb", "fileHash": "d8081aa7",
"needsInterop": false "needsInterop": false
}, },
"element-plus/es/components/upload/style/css": { "axios": {
"src": "../../element-plus/es/components/upload/style/css.mjs", "src": "../../axios/index.js",
"file": "element-plus_es_components_upload_style_css.js", "file": "axios.js",
"fileHash": "7a2dd68a", "fileHash": "ff0088a2",
"needsInterop": false
},
"dayjs": {
"src": "../../dayjs/dayjs.min.js",
"file": "dayjs.js",
"fileHash": "fe73817b",
"needsInterop": true
},
"element-plus": {
"src": "../../element-plus/es/index.mjs",
"file": "element-plus.js",
"fileHash": "c9b9d6e7",
"needsInterop": false
},
"element-plus/dist/locale/zh-cn.mjs": {
"src": "../../element-plus/dist/locale/zh-cn.mjs",
"file": "element-plus_dist_locale_zh-cn__mjs.js",
"fileHash": "9a604096",
"needsInterop": false
},
"pinia": {
"src": "../../pinia/dist/pinia.mjs",
"file": "pinia.js",
"fileHash": "612fb9ff",
"needsInterop": false
},
"qrcode": {
"src": "../../qrcode/lib/browser.js",
"file": "qrcode.js",
"fileHash": "67be2201",
"needsInterop": true
},
"vue": {
"src": "../../vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "62b4d691",
"needsInterop": false
},
"vue-router": {
"src": "../../vue-router/dist/vue-router.mjs",
"file": "vue-router.js",
"fileHash": "37148a15",
"needsInterop": false
},
"element-plus/es": {
"src": "../../element-plus/es/index.mjs",
"file": "element-plus_es.js",
"fileHash": "dc3c171f",
"needsInterop": false
},
"element-plus/es/components/base/style/css": {
"src": "../../element-plus/es/components/base/style/css.mjs",
"file": "element-plus_es_components_base_style_css.js",
"fileHash": "6a2920d4",
"needsInterop": false
},
"element-plus/es/components/dialog/style/css": {
"src": "../../element-plus/es/components/dialog/style/css.mjs",
"file": "element-plus_es_components_dialog_style_css.js",
"fileHash": "b3ffeb08",
"needsInterop": false
},
"element-plus/es/components/button/style/css": {
"src": "../../element-plus/es/components/button/style/css.mjs",
"file": "element-plus_es_components_button_style_css.js",
"fileHash": "7756bfd6",
"needsInterop": false
},
"element-plus/es/components/form/style/css": {
"src": "../../element-plus/es/components/form/style/css.mjs",
"file": "element-plus_es_components_form_style_css.js",
"fileHash": "8b2d30b6",
"needsInterop": false
},
"element-plus/es/components/form-item/style/css": {
"src": "../../element-plus/es/components/form-item/style/css.mjs",
"file": "element-plus_es_components_form-item_style_css.js",
"fileHash": "2ded8e3a",
"needsInterop": false
},
"element-plus/es/components/input/style/css": {
"src": "../../element-plus/es/components/input/style/css.mjs",
"file": "element-plus_es_components_input_style_css.js",
"fileHash": "385c4e72",
"needsInterop": false
},
"element-plus/es/components/container/style/css": {
"src": "../../element-plus/es/components/container/style/css.mjs",
"file": "element-plus_es_components_container_style_css.js",
"fileHash": "d987fdea",
"needsInterop": false
},
"element-plus/es/components/main/style/css": {
"src": "../../element-plus/es/components/main/style/css.mjs",
"file": "element-plus_es_components_main_style_css.js",
"fileHash": "b31ab08e",
"needsInterop": false
},
"element-plus/es/components/header/style/css": {
"src": "../../element-plus/es/components/header/style/css.mjs",
"file": "element-plus_es_components_header_style_css.js",
"fileHash": "0e2e73b6",
"needsInterop": false
},
"element-plus/es/components/dropdown/style/css": {
"src": "../../element-plus/es/components/dropdown/style/css.mjs",
"file": "element-plus_es_components_dropdown_style_css.js",
"fileHash": "3853d306",
"needsInterop": false
},
"element-plus/es/components/dropdown-menu/style/css": {
"src": "../../element-plus/es/components/dropdown-menu/style/css.mjs",
"file": "element-plus_es_components_dropdown-menu_style_css.js",
"fileHash": "86ab11a2",
"needsInterop": false
},
"element-plus/es/components/dropdown-item/style/css": {
"src": "../../element-plus/es/components/dropdown-item/style/css.mjs",
"file": "element-plus_es_components_dropdown-item_style_css.js",
"fileHash": "d1075a48",
"needsInterop": false
},
"element-plus/es/components/avatar/style/css": {
"src": "../../element-plus/es/components/avatar/style/css.mjs",
"file": "element-plus_es_components_avatar_style_css.js",
"fileHash": "49d61668",
"needsInterop": false
},
"element-plus/es/components/breadcrumb/style/css": {
"src": "../../element-plus/es/components/breadcrumb/style/css.mjs",
"file": "element-plus_es_components_breadcrumb_style_css.js",
"fileHash": "1d1f93bb",
"needsInterop": false
},
"element-plus/es/components/breadcrumb-item/style/css": {
"src": "../../element-plus/es/components/breadcrumb-item/style/css.mjs",
"file": "element-plus_es_components_breadcrumb-item_style_css.js",
"fileHash": "33951ee4",
"needsInterop": false
},
"element-plus/es/components/aside/style/css": {
"src": "../../element-plus/es/components/aside/style/css.mjs",
"file": "element-plus_es_components_aside_style_css.js",
"fileHash": "1057ac58",
"needsInterop": false
},
"element-plus/es/components/menu/style/css": {
"src": "../../element-plus/es/components/menu/style/css.mjs",
"file": "element-plus_es_components_menu_style_css.js",
"fileHash": "70e08bb2",
"needsInterop": false
},
"element-plus/es/components/menu-item/style/css": {
"src": "../../element-plus/es/components/menu-item/style/css.mjs",
"file": "element-plus_es_components_menu-item_style_css.js",
"fileHash": "73f00f7a",
"needsInterop": false
},
"element-plus/es/components/icon/style/css": {
"src": "../../element-plus/es/components/icon/style/css.mjs",
"file": "element-plus_es_components_icon_style_css.js",
"fileHash": "6bd46079",
"needsInterop": false
},
"element-plus/es/components/loading/style/css": {
"src": "../../element-plus/es/components/loading/style/css.mjs",
"file": "element-plus_es_components_loading_style_css.js",
"fileHash": "1762c012",
"needsInterop": false
},
"element-plus/es/components/pagination/style/css": {
"src": "../../element-plus/es/components/pagination/style/css.mjs",
"file": "element-plus_es_components_pagination_style_css.js",
"fileHash": "bb5564bc",
"needsInterop": false
},
"element-plus/es/components/table/style/css": {
"src": "../../element-plus/es/components/table/style/css.mjs",
"file": "element-plus_es_components_table_style_css.js",
"fileHash": "0656de56",
"needsInterop": false
},
"element-plus/es/components/tag/style/css": {
"src": "../../element-plus/es/components/tag/style/css.mjs",
"file": "element-plus_es_components_tag_style_css.js",
"fileHash": "e60ef3fa",
"needsInterop": false "needsInterop": false
}, },
"element-plus/es/components/image/style/css": { "element-plus/es/components/image/style/css": {
"src": "../../element-plus/es/components/image/style/css.mjs", "src": "../../element-plus/es/components/image/style/css.mjs",
"file": "element-plus_es_components_image_style_css.js", "file": "element-plus_es_components_image_style_css.js",
"fileHash": "b70cc47f", "fileHash": "a341642a",
"needsInterop": false
},
"element-plus/es/components/table-column/style/css": {
"src": "../../element-plus/es/components/table-column/style/css.mjs",
"file": "element-plus_es_components_table-column_style_css.js",
"fileHash": "3b618674",
"needsInterop": false
},
"element-plus/es/components/select/style/css": {
"src": "../../element-plus/es/components/select/style/css.mjs",
"file": "element-plus_es_components_select_style_css.js",
"fileHash": "6523e91f",
"needsInterop": false
},
"element-plus/es/components/option/style/css": {
"src": "../../element-plus/es/components/option/style/css.mjs",
"file": "element-plus_es_components_option_style_css.js",
"fileHash": "2c8efb6b",
"needsInterop": false
},
"element-plus/es/components/radio-group/style/css": {
"src": "../../element-plus/es/components/radio-group/style/css.mjs",
"file": "element-plus_es_components_radio-group_style_css.js",
"fileHash": "cbcad65d",
"needsInterop": false
},
"element-plus/es/components/radio/style/css": {
"src": "../../element-plus/es/components/radio/style/css.mjs",
"file": "element-plus_es_components_radio_style_css.js",
"fileHash": "adb1644d",
"needsInterop": false
},
"element-plus/es/components/switch/style/css": {
"src": "../../element-plus/es/components/switch/style/css.mjs",
"file": "element-plus_es_components_switch_style_css.js",
"fileHash": "b5032cbe",
"needsInterop": false
},
"element-plus/es/components/input-number/style/css": {
"src": "../../element-plus/es/components/input-number/style/css.mjs",
"file": "element-plus_es_components_input-number_style_css.js",
"fileHash": "8895c611",
"needsInterop": false "needsInterop": false
} }
}, },
"chunks": { "chunks": {
"chunk-UONBUPA2": { "chunk-75C4BP7B": {
"file": "chunk-UONBUPA2.js" "file": "chunk-75C4BP7B.js"
}, },
"chunk-VPJRTVUV": { "chunk-UBLR4G7Q": {
"file": "chunk-VPJRTVUV.js" "file": "chunk-UBLR4G7Q.js"
}, },
"chunk-FU6BXPW4": { "chunk-5KK3TTMN": {
"file": "chunk-FU6BXPW4.js" "file": "chunk-5KK3TTMN.js"
}, },
"chunk-CGXI5ONL": { "chunk-B2YDYSZR": {
"file": "chunk-CGXI5ONL.js" "file": "chunk-B2YDYSZR.js"
}, },
"chunk-3UWZ6IZW": { "chunk-REWOA3VH": {
"file": "chunk-3UWZ6IZW.js" "file": "chunk-REWOA3VH.js"
}, },
"chunk-DVSPEOSC": { "chunk-R5DNQ3QC": {
"file": "chunk-DVSPEOSC.js" "file": "chunk-R5DNQ3QC.js"
}, },
"chunk-PHTWDJV4": { "chunk-TX5YLZ4O": {
"file": "chunk-PHTWDJV4.js" "file": "chunk-TX5YLZ4O.js"
}, },
"chunk-EFJ4VOFN": { "chunk-SMFPDFTD": {
"file": "chunk-EFJ4VOFN.js" "file": "chunk-SMFPDFTD.js"
}, },
"chunk-4AQGC7O6": { "chunk-YFT6OQ5R": {
"file": "chunk-4AQGC7O6.js" "file": "chunk-YFT6OQ5R.js"
}, },
"chunk-VID4RN2V": { "chunk-4PW274X2": {
"file": "chunk-VID4RN2V.js" "file": "chunk-4PW274X2.js"
}, },
"chunk-I2FMO3TN": { "chunk-NKQWFVTF": {
"file": "chunk-I2FMO3TN.js" "file": "chunk-NKQWFVTF.js"
}, },
"chunk-PKGVV2AH": { "chunk-IV6PSERC": {
"file": "chunk-PKGVV2AH.js" "file": "chunk-IV6PSERC.js"
}, },
"chunk-QPJ3ZUOF": { "chunk-AFCJBIYK": {
"file": "chunk-QPJ3ZUOF.js" "file": "chunk-AFCJBIYK.js"
},
"chunk-47WSI2HY": {
"file": "chunk-47WSI2HY.js"
},
"chunk-YAGW2SQC": {
"file": "chunk-YAGW2SQC.js"
},
"chunk-L7WLSQ4R": {
"file": "chunk-L7WLSQ4R.js"
},
"chunk-ELEEJBJQ": {
"file": "chunk-ELEEJBJQ.js"
}, },
"chunk-QZC7O2C6": { "chunk-QZC7O2C6": {
"file": "chunk-QZC7O2C6.js" "file": "chunk-QZC7O2C6.js"
}, },
"chunk-HYZ2CRGS": {
"file": "chunk-HYZ2CRGS.js"
},
"chunk-OP4ZUAFM": {
"file": "chunk-OP4ZUAFM.js"
},
"chunk-H2732BJL": {
"file": "chunk-H2732BJL.js"
},
"chunk-G3PMV62Z": { "chunk-G3PMV62Z": {
"file": "chunk-G3PMV62Z.js" "file": "chunk-G3PMV62Z.js"
} }

File diff suppressed because one or more lines are too long

View File

@ -514,11 +514,11 @@ import {
virtualizedScrollbarProps, virtualizedScrollbarProps,
watermarkProps, watermarkProps,
zIndexContextKey zIndexContextKey
} from "./chunk-47WSI2HY.js"; } from "./chunk-AFCJBIYK.js";
import "./chunk-YAGW2SQC.js";
import "./chunk-L7WLSQ4R.js";
import "./chunk-ELEEJBJQ.js";
import "./chunk-QZC7O2C6.js"; import "./chunk-QZC7O2C6.js";
import "./chunk-HYZ2CRGS.js";
import "./chunk-OP4ZUAFM.js";
import "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
var export_dayjs = import_dayjs.default; var export_dayjs = import_dayjs.default;
export { export {

File diff suppressed because one or more lines are too long

View File

@ -514,11 +514,11 @@ import {
virtualizedScrollbarProps, virtualizedScrollbarProps,
watermarkProps, watermarkProps,
zIndexContextKey zIndexContextKey
} from "./chunk-47WSI2HY.js"; } from "./chunk-AFCJBIYK.js";
import "./chunk-YAGW2SQC.js";
import "./chunk-L7WLSQ4R.js";
import "./chunk-ELEEJBJQ.js";
import "./chunk-QZC7O2C6.js"; import "./chunk-QZC7O2C6.js";
import "./chunk-HYZ2CRGS.js";
import "./chunk-OP4ZUAFM.js";
import "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
var export_dayjs = import_dayjs.default; var export_dayjs = import_dayjs.default;
export { export {

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/aside/style/css.mjs // node_modules/element-plus/es/components/aside/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-aside.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-aside.css";
//# sourceMappingURL=element-plus_es_components_aside_style_css.js.map //# sourceMappingURL=element-plus_es_components_aside_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/aside/style/css.mjs"], "sources": ["../../element-plus/es/components/aside/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-aside.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-aside.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/avatar/style/css.mjs // node_modules/element-plus/es/components/avatar/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-avatar.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-avatar.css";
//# sourceMappingURL=element-plus_es_components_avatar_style_css.js.map //# sourceMappingURL=element-plus_es_components_avatar_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/avatar/style/css.mjs"], "sources": ["../../element-plus/es/components/avatar/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-avatar.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-avatar.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,2 +1,2 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_base_style_css.js.map //# sourceMappingURL=element-plus_es_components_base_style_css.js.map

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/breadcrumb-item/style/css.mjs // node_modules/element-plus/es/components/breadcrumb-item/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-breadcrumb-item.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-breadcrumb-item.css";
//# sourceMappingURL=element-plus_es_components_breadcrumb-item_style_css.js.map //# sourceMappingURL=element-plus_es_components_breadcrumb-item_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/breadcrumb-item/style/css.mjs"], "sources": ["../../element-plus/es/components/breadcrumb-item/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-breadcrumb-item.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-breadcrumb-item.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/breadcrumb/style/css.mjs // node_modules/element-plus/es/components/breadcrumb/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-breadcrumb.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-breadcrumb.css";
//# sourceMappingURL=element-plus_es_components_breadcrumb_style_css.js.map //# sourceMappingURL=element-plus_es_components_breadcrumb_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/breadcrumb/style/css.mjs"], "sources": ["../../element-plus/es/components/breadcrumb/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-breadcrumb.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-breadcrumb.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,3 +1,3 @@
import "./chunk-I2FMO3TN.js"; import "./chunk-SMFPDFTD.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_button_style_css.js.map //# sourceMappingURL=element-plus_es_components_button_style_css.js.map

View File

@ -1,5 +0,0 @@
import "./chunk-QPJ3ZUOF.js";
// node_modules/element-plus/es/components/col/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-col.css";
//# sourceMappingURL=element-plus_es_components_col_style_css.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../element-plus/es/components/col/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-col.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"],
"mappings": ";;;AACA,OAAO;",
"names": []
}

View File

@ -1,9 +1,9 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/container/style/css.mjs // node_modules/element-plus/es/components/container/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-container.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-container.css";
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-aside.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-aside.css";
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-footer.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-footer.css";
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-header.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-header.css";
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-main.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-main.css";
//# sourceMappingURL=element-plus_es_components_container_style_css.js.map //# sourceMappingURL=element-plus_es_components_container_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/container/style/css.mjs"], "sources": ["../../element-plus/es/components/container/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-container.css';\r\nimport 'element-plus/theme-chalk/el-aside.css';\r\nimport 'element-plus/theme-chalk/el-footer.css';\r\nimport 'element-plus/theme-chalk/el-header.css';\r\nimport 'element-plus/theme-chalk/el-main.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-container.css';\nimport 'element-plus/theme-chalk/el-aside.css';\nimport 'element-plus/theme-chalk/el-footer.css';\nimport 'element-plus/theme-chalk/el-header.css';\nimport 'element-plus/theme-chalk/el-main.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;", "mappings": ";;;AACA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
"names": [] "names": []
} }

View File

@ -1,8 +1,8 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/dialog/style/css.mjs // node_modules/element-plus/es/components/dialog/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-dialog.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-dialog.css";
// node_modules/element-plus/es/components/overlay/style/css.mjs // node_modules/element-plus/es/components/overlay/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-overlay.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-overlay.css";
//# sourceMappingURL=element-plus_es_components_dialog_style_css.js.map //# sourceMappingURL=element-plus_es_components_dialog_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/dialog/style/css.mjs", "../../element-plus/es/components/overlay/style/css.mjs"], "sources": ["../../element-plus/es/components/dialog/style/css.mjs", "../../element-plus/es/components/overlay/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-dialog.css';\r\nimport '../../overlay/style/css.mjs';\r\n//# sourceMappingURL=css.mjs.map\r\n", "import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-overlay.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-dialog.css';\nimport '../../overlay/style/css.mjs';\n//# sourceMappingURL=css.mjs.map\n", "import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-overlay.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;;;ACAP,OAAO;", "mappings": ";;;AACA,OAAO;;;ACAP,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/dropdown-item/style/css.mjs // node_modules/element-plus/es/components/dropdown-item/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-dropdown-item.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-dropdown-item.css";
//# sourceMappingURL=element-plus_es_components_dropdown-item_style_css.js.map //# sourceMappingURL=element-plus_es_components_dropdown-item_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/dropdown-item/style/css.mjs"], "sources": ["../../element-plus/es/components/dropdown-item/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-dropdown-item.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-dropdown-item.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/dropdown-menu/style/css.mjs // node_modules/element-plus/es/components/dropdown-menu/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-dropdown-menu.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-dropdown-menu.css";
//# sourceMappingURL=element-plus_es_components_dropdown-menu_style_css.js.map //# sourceMappingURL=element-plus_es_components_dropdown-menu_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/dropdown-menu/style/css.mjs"], "sources": ["../../element-plus/es/components/dropdown-menu/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-dropdown-menu.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-dropdown-menu.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,11 +1,11 @@
import "./chunk-EFJ4VOFN.js"; import "./chunk-REWOA3VH.js";
import "./chunk-4AQGC7O6.js"; import "./chunk-TX5YLZ4O.js";
import "./chunk-I2FMO3TN.js"; import "./chunk-SMFPDFTD.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/button-group/style/css.mjs // node_modules/element-plus/es/components/button-group/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-button-group.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-button-group.css";
// node_modules/element-plus/es/components/dropdown/style/css.mjs // node_modules/element-plus/es/components/dropdown/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-dropdown.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-dropdown.css";
//# sourceMappingURL=element-plus_es_components_dropdown_style_css.js.map //# sourceMappingURL=element-plus_es_components_dropdown_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/button-group/style/css.mjs", "../../element-plus/es/components/dropdown/style/css.mjs"], "sources": ["../../element-plus/es/components/button-group/style/css.mjs", "../../element-plus/es/components/dropdown/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-button-group.css';\r\n//# sourceMappingURL=css.mjs.map\r\n", "import '../../base/style/css.mjs';\r\nimport '../../button/style/css.mjs';\r\nimport '../../button-group/style/css.mjs';\r\nimport '../../popper/style/css.mjs';\r\nimport '../../scrollbar/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-dropdown.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-button-group.css';\n//# sourceMappingURL=css.mjs.map\n", "import '../../base/style/css.mjs';\nimport '../../button/style/css.mjs';\nimport '../../button-group/style/css.mjs';\nimport '../../popper/style/css.mjs';\nimport '../../scrollbar/style/css.mjs';\nimport 'element-plus/theme-chalk/el-dropdown.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;;;AACA,OAAO;;;ACIP,OAAO;", "mappings": ";;;;;;AACA,OAAO;;;ACIP,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/form-item/style/css.mjs // node_modules/element-plus/es/components/form-item/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-form-item.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-form-item.css";
//# sourceMappingURL=element-plus_es_components_form-item_style_css.js.map //# sourceMappingURL=element-plus_es_components_form-item_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/form-item/style/css.mjs"], "sources": ["../../element-plus/es/components/form-item/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-form-item.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-form-item.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/form/style/css.mjs // node_modules/element-plus/es/components/form/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-form.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-form.css";
//# sourceMappingURL=element-plus_es_components_form_style_css.js.map //# sourceMappingURL=element-plus_es_components_form_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/form/style/css.mjs"], "sources": ["../../element-plus/es/components/form/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-form.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-form.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/header/style/css.mjs // node_modules/element-plus/es/components/header/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-header.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-header.css";
//# sourceMappingURL=element-plus_es_components_header_style_css.js.map //# sourceMappingURL=element-plus_es_components_header_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/header/style/css.mjs"], "sources": ["../../element-plus/es/components/header/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-header.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-header.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,2 +1,2 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_icon_style_css.js.map //# sourceMappingURL=element-plus_es_components_icon_style_css.js.map

View File

@ -1,6 +1,6 @@
import "./chunk-PKGVV2AH.js"; import "./chunk-NKQWFVTF.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/input-number/style/css.mjs // node_modules/element-plus/es/components/input-number/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-input-number.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-input-number.css";
//# sourceMappingURL=element-plus_es_components_input-number_style_css.js.map //# sourceMappingURL=element-plus_es_components_input-number_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/input-number/style/css.mjs"], "sources": ["../../element-plus/es/components/input-number/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport '../../input/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-input-number.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport '../../input/style/css.mjs';\nimport 'element-plus/theme-chalk/el-input-number.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;AAEA,OAAO;", "mappings": ";;;;AAEA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,3 +1,3 @@
import "./chunk-PKGVV2AH.js"; import "./chunk-NKQWFVTF.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_input_style_css.js.map //# sourceMappingURL=element-plus_es_components_input_style_css.js.map

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/loading/style/css.mjs // node_modules/element-plus/es/components/loading/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-loading.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-loading.css";
//# sourceMappingURL=element-plus_es_components_loading_style_css.js.map //# sourceMappingURL=element-plus_es_components_loading_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/loading/style/css.mjs"], "sources": ["../../element-plus/es/components/loading/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-loading.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-loading.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/main/style/css.mjs // node_modules/element-plus/es/components/main/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-main.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-main.css";
//# sourceMappingURL=element-plus_es_components_main_style_css.js.map //# sourceMappingURL=element-plus_es_components_main_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/main/style/css.mjs"], "sources": ["../../element-plus/es/components/main/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-main.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-main.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,5 +1,5 @@
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/menu-item/style/css.mjs // node_modules/element-plus/es/components/menu-item/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-menu-item.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-menu-item.css";
//# sourceMappingURL=element-plus_es_components_menu-item_style_css.js.map //# sourceMappingURL=element-plus_es_components_menu-item_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/menu-item/style/css.mjs"], "sources": ["../../element-plus/es/components/menu-item/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-menu-item.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-menu-item.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;AACA,OAAO;", "mappings": ";;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,7 +1,7 @@
import "./chunk-PHTWDJV4.js"; import "./chunk-R5DNQ3QC.js";
import "./chunk-4AQGC7O6.js"; import "./chunk-TX5YLZ4O.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/menu/style/css.mjs // node_modules/element-plus/es/components/menu/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-menu.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-menu.css";
//# sourceMappingURL=element-plus_es_components_menu_style_css.js.map //# sourceMappingURL=element-plus_es_components_menu_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/menu/style/css.mjs"], "sources": ["../../element-plus/es/components/menu/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-menu.css';\r\nimport '../../tooltip/style/css.mjs';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-menu.css';\nimport '../../tooltip/style/css.mjs';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;;AACA,OAAO;", "mappings": ";;;;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,3 +1,3 @@
import "./chunk-CGXI5ONL.js"; import "./chunk-UBLR4G7Q.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_option_style_css.js.map //# sourceMappingURL=element-plus_es_components_option_style_css.js.map

View File

@ -1,11 +1,11 @@
import "./chunk-FU6BXPW4.js"; import "./chunk-75C4BP7B.js";
import "./chunk-CGXI5ONL.js"; import "./chunk-UBLR4G7Q.js";
import "./chunk-DVSPEOSC.js"; import "./chunk-5KK3TTMN.js";
import "./chunk-EFJ4VOFN.js"; import "./chunk-REWOA3VH.js";
import "./chunk-4AQGC7O6.js"; import "./chunk-TX5YLZ4O.js";
import "./chunk-PKGVV2AH.js"; import "./chunk-NKQWFVTF.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/pagination/style/css.mjs // node_modules/element-plus/es/components/pagination/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-pagination.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-pagination.css";
//# sourceMappingURL=element-plus_es_components_pagination_style_css.js.map //# sourceMappingURL=element-plus_es_components_pagination_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/pagination/style/css.mjs"], "sources": ["../../element-plus/es/components/pagination/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-pagination.css';\r\nimport '../../select/style/css.mjs';\r\nimport '../../input/style/css.mjs';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-pagination.css';\nimport '../../select/style/css.mjs';\nimport '../../input/style/css.mjs';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;;;;;;AACA,OAAO;", "mappings": ";;;;;;;;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,6 +1,6 @@
import "./chunk-VPJRTVUV.js"; import "./chunk-4PW274X2.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/radio-group/style/css.mjs // node_modules/element-plus/es/components/radio-group/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-radio-group.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-radio-group.css";
//# sourceMappingURL=element-plus_es_components_radio-group_style_css.js.map //# sourceMappingURL=element-plus_es_components_radio-group_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/radio-group/style/css.mjs"], "sources": ["../../element-plus/es/components/radio-group/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport '../../radio/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-radio-group.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport '../../radio/style/css.mjs';\nimport 'element-plus/theme-chalk/el-radio-group.css';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;AAEA,OAAO;", "mappings": ";;;;AAEA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,3 +1,3 @@
import "./chunk-VPJRTVUV.js"; import "./chunk-4PW274X2.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_radio_style_css.js.map //# sourceMappingURL=element-plus_es_components_radio_style_css.js.map

View File

@ -1,5 +0,0 @@
import "./chunk-QPJ3ZUOF.js";
// node_modules/element-plus/es/components/row/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-row.css";
//# sourceMappingURL=element-plus_es_components_row_style_css.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../element-plus/es/components/row/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-row.css';\r\n//# sourceMappingURL=css.mjs.map\r\n"],
"mappings": ";;;AACA,OAAO;",
"names": []
}

View File

@ -1,7 +1,7 @@
import "./chunk-FU6BXPW4.js"; import "./chunk-75C4BP7B.js";
import "./chunk-CGXI5ONL.js"; import "./chunk-UBLR4G7Q.js";
import "./chunk-DVSPEOSC.js"; import "./chunk-5KK3TTMN.js";
import "./chunk-EFJ4VOFN.js"; import "./chunk-REWOA3VH.js";
import "./chunk-4AQGC7O6.js"; import "./chunk-TX5YLZ4O.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_select_style_css.js.map //# sourceMappingURL=element-plus_es_components_select_style_css.js.map

View File

@ -1,7 +1,7 @@
import "./chunk-3UWZ6IZW.js"; import "./chunk-5KK3TTMN.js";
import "./chunk-DVSPEOSC.js"; import "./chunk-B2YDYSZR.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/table-column/style/css.mjs // node_modules/element-plus/es/components/table-column/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-table-column.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-table-column.css";
//# sourceMappingURL=element-plus_es_components_table-column_style_css.js.map //# sourceMappingURL=element-plus_es_components_table-column_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/table-column/style/css.mjs"], "sources": ["../../element-plus/es/components/table-column/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-table-column.css';\r\nimport '../../checkbox/style/css.mjs';\r\nimport '../../tag/style/css.mjs';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-table-column.css';\nimport '../../checkbox/style/css.mjs';\nimport '../../tag/style/css.mjs';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;;AACA,OAAO;", "mappings": ";;;;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,9 +1,9 @@
import "./chunk-3UWZ6IZW.js"; import "./chunk-B2YDYSZR.js";
import "./chunk-PHTWDJV4.js"; import "./chunk-REWOA3VH.js";
import "./chunk-EFJ4VOFN.js"; import "./chunk-R5DNQ3QC.js";
import "./chunk-4AQGC7O6.js"; import "./chunk-TX5YLZ4O.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
// node_modules/element-plus/es/components/table/style/css.mjs // node_modules/element-plus/es/components/table/style/css.mjs
import "E:/Workspace/yingsa/admin/node_modules/element-plus/theme-chalk/el-table.css"; import "E:/workspace/yingsha/admin/node_modules/element-plus/theme-chalk/el-table.css";
//# sourceMappingURL=element-plus_es_components_table_style_css.js.map //# sourceMappingURL=element-plus_es_components_table_style_css.js.map

View File

@ -1,7 +1,7 @@
{ {
"version": 3, "version": 3,
"sources": ["../../element-plus/es/components/table/style/css.mjs"], "sources": ["../../element-plus/es/components/table/style/css.mjs"],
"sourcesContent": ["import '../../base/style/css.mjs';\r\nimport 'element-plus/theme-chalk/el-table.css';\r\nimport '../../checkbox/style/css.mjs';\r\nimport '../../tooltip/style/css.mjs';\r\nimport '../../scrollbar/style/css.mjs';\r\n//# sourceMappingURL=css.mjs.map\r\n"], "sourcesContent": ["import '../../base/style/css.mjs';\nimport 'element-plus/theme-chalk/el-table.css';\nimport '../../checkbox/style/css.mjs';\nimport '../../tooltip/style/css.mjs';\nimport '../../scrollbar/style/css.mjs';\n//# sourceMappingURL=css.mjs.map\n"],
"mappings": ";;;;;;;AACA,OAAO;", "mappings": ";;;;;;;AACA,OAAO;",
"names": [] "names": []
} }

View File

@ -1,3 +1,3 @@
import "./chunk-DVSPEOSC.js"; import "./chunk-5KK3TTMN.js";
import "./chunk-QPJ3ZUOF.js"; import "./chunk-IV6PSERC.js";
//# sourceMappingURL=element-plus_es_components_tag_style_css.js.map //# sourceMappingURL=element-plus_es_components_tag_style_css.js.map

View File

@ -1,11 +1,11 @@
import { import {
setupDevtoolsPlugin setupDevtoolsPlugin
} from "./chunk-VID4RN2V.js"; } from "./chunk-YFT6OQ5R.js";
import { import {
del, del,
isVue2, isVue2,
set set
} from "./chunk-YAGW2SQC.js"; } from "./chunk-HYZ2CRGS.js";
import { import {
computed, computed,
effectScope, effectScope,
@ -25,7 +25,7 @@ import {
toRefs, toRefs,
unref, unref,
watch watch
} from "./chunk-ELEEJBJQ.js"; } from "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
// node_modules/pinia/dist/pinia.mjs // node_modules/pinia/dist/pinia.mjs

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
import { import {
setupDevtoolsPlugin setupDevtoolsPlugin
} from "./chunk-VID4RN2V.js"; } from "./chunk-YFT6OQ5R.js";
import { import {
computed, computed,
defineComponent, defineComponent,
@ -19,7 +19,7 @@ import {
unref, unref,
watch, watch,
watchEffect watchEffect
} from "./chunk-ELEEJBJQ.js"; } from "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
// node_modules/vue-router/dist/devtools-EWN81iOl.mjs // node_modules/vue-router/dist/devtools-EWN81iOl.mjs

File diff suppressed because one or more lines are too long

View File

@ -170,7 +170,7 @@ import {
withMemo, withMemo,
withModifiers, withModifiers,
withScopeId withScopeId
} from "./chunk-ELEEJBJQ.js"; } from "./chunk-H2732BJL.js";
import "./chunk-G3PMV62Z.js"; import "./chunk-G3PMV62Z.js";
export { export {
BaseTransition, BaseTransition,

View File

@ -1295,7 +1295,6 @@
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/lodash": "*" "@types/lodash": "*"
} }
@ -1321,7 +1320,6 @@
"resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
"integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@transloadit/prettier-bytes": "0.0.7", "@transloadit/prettier-bytes": "0.0.7",
"@uppy/store-default": "^2.1.1", "@uppy/store-default": "^2.1.1",
@ -1353,7 +1351,6 @@
"resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@uppy/companion-client": "^2.2.2", "@uppy/companion-client": "^2.2.2",
"@uppy/utils": "^4.1.2", "@uppy/utils": "^4.1.2",
@ -1524,7 +1521,6 @@
"resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"is-url": "^1.2.4" "is-url": "^1.2.4"
}, },
@ -1557,7 +1553,6 @@
"resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/event-emitter": "^0.3.3", "@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5", "event-emitter": "^0.3.5",
@ -1588,7 +1583,6 @@
"resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@uppy/core": "^2.1.1", "@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3", "@uppy/xhr-upload": "^2.0.3",
@ -1986,7 +1980,6 @@
"resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"ssr-window": "^3.0.0-alpha.1" "ssr-window": "^3.0.0-alpha.1"
} }
@ -2566,8 +2559,7 @@
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/is-number": { "node_modules/is-number": {
"version": "7.0.0", "version": "7.0.0",
@ -2634,15 +2626,13 @@
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash-es": { "node_modules/lodash-es": {
"version": "4.17.22", "version": "4.17.22",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz",
"integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash-unified": { "node_modules/lodash-unified": {
"version": "1.0.3", "version": "1.0.3",
@ -2659,51 +2649,44 @@
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.clonedeep": { "node_modules/lodash.clonedeep": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.debounce": { "node_modules/lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.foreach": { "node_modules/lodash.foreach": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.isequal": { "node_modules/lodash.isequal": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
"deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.throttle": { "node_modules/lodash.throttle": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/lodash.toarray": { "node_modules/lodash.toarray": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==", "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/magic-string": { "node_modules/magic-string": {
"version": "0.30.21", "version": "0.30.21",
@ -2849,7 +2832,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"nanoid": "bin/nanoid.cjs" "nanoid": "bin/nanoid.cjs"
}, },
@ -3183,7 +3165,6 @@
"integrity": "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==", "integrity": "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/estree": "1.0.8" "@types/estree": "1.0.8"
}, },
@ -3253,7 +3234,6 @@
"integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"chokidar": "^4.0.0", "chokidar": "^4.0.0",
"immutable": "^5.0.2", "immutable": "^5.0.2",
@ -3296,7 +3276,6 @@
"resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"immer": "^9.0.6", "immer": "^9.0.6",
"is-plain-object": "^5.0.0", "is-plain-object": "^5.0.0",
@ -3320,7 +3299,6 @@
"resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.3.tgz", "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.3.tgz",
"integrity": "sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==", "integrity": "sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==",
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12.17.0" "node": ">=12.17.0"
} }
@ -3657,7 +3635,6 @@
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.21.3", "esbuild": "^0.21.3",
"postcss": "^8.4.43", "postcss": "^8.4.43",
@ -3717,7 +3694,6 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz",
"integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.5.27", "@vue/compiler-dom": "3.5.27",
"@vue/compiler-sfc": "3.5.27", "@vue/compiler-sfc": "3.5.27",

View File

@ -37,10 +37,10 @@
</div> </div>
</div> </div>
<el-table :data="match.players" size="small"> <el-table :data="sortedPlayers" size="small">
<el-table-column type="index" label="排名" width="60"> <el-table-column label="排名" width="60">
<template #default="{ $index }"> <template #default="{ row }">
<span :class="['rank-badge', getRankClass($index + 1)]">{{ $index + 1 }}</span> <span :class="['rank-badge', getRankClass(row.rank || 0)]">{{ row.rank || '-' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="realName" label="姓名" /> <el-table-column prop="realName" label="姓名" />
@ -176,6 +176,7 @@
<el-form :model="eliminationForm" label-width="100px"> <el-form :model="eliminationForm" label-width="100px">
<el-form-item label="淘汰赛人数"> <el-form-item label="淘汰赛人数">
<el-select v-model="eliminationForm.elimination_size"> <el-select v-model="eliminationForm.elimination_size">
<el-option label="2强决赛" :value="2" />
<el-option label="4强" :value="4" /> <el-option label="4强" :value="4" />
<el-option label="8强" :value="8" /> <el-option label="8强" :value="8" />
<el-option label="16强" :value="16" /> <el-option label="16强" :value="16" />
@ -310,6 +311,33 @@ const playerMap = computed(() => {
const getPlayerName = (id) => playerMap.value[id] || `选手${id}` const getPlayerName = (id) => playerMap.value[id] || `选手${id}`
// rank rank
const sortedPlayers = computed(() => {
if (!match.value.players || match.value.players.length === 0) return []
// rank
if (match.value.status === 2 && match.value.players.some(p => p.rank)) {
return [...match.value.players].sort((a, b) => {
// rank
if (a.rank && b.rank) {
return a.rank - b.rank
}
if (a.rank) return -1
if (b.rank) return 1
// rank
if (b.winCount !== a.winCount) return b.winCount - a.winCount
//
return b.initialPower - a.initialPower
})
}
//
return [...match.value.players].sort((a, b) => {
if (b.winCount !== a.winCount) return b.winCount - a.winCount
return b.initialPower - a.initialPower
})
})
const fetchData = async () => { const fetchData = async () => {
loading.value = true loading.value = true
try { try {

View File

@ -407,29 +407,77 @@ App({
break; break;
case "match_paired": case "match_paired":
// 排位赛匹配通知 // 排位赛匹配通知
wx.showModal({ try {
title: "匹配成功", const payload = data.data || {};
content: `你的对手是: ${data.data.opponent.realName}`, const opponent = payload.opponent || {};
showCancel: false, const matchCode = payload.matchCode;
});
wx.showModal({
title: "匹配成功",
content: `你的对手是: ${opponent.realName || "对手"}`,
showCancel: false,
success: (res) => {
if (res.confirm) {
// 检查当前页面
const pagesMatch = getCurrentPages();
const currentMatchPage = pagesMatch[pagesMatch.length - 1];
if (currentMatchPage && currentMatchPage.route === "pages/match/ranking/index") {
// 如果已在比赛详情页,检查是否是同一场比赛
const targetCode = matchCode;
if (
!targetCode ||
!currentMatchPage.data ||
currentMatchPage.data.matchCode === targetCode
) {
// 刷新详情页的所有接口信息
if (typeof currentMatchPage.fetchMatchDetail === "function") {
currentMatchPage.fetchMatchDetail();
} else if (typeof currentMatchPage.fetchCurrentGame === "function") {
currentMatchPage.fetchCurrentGame();
}
} else {
// 不同比赛,跳转到新的比赛详情页
wx.redirectTo({
url: `/pages/match/ranking/index?code=${targetCode}`
});
}
} else {
// 如果不在比赛详情页,自动跳转到比赛详情页
if (matchCode) {
wx.navigateTo({
url: `/pages/match/ranking/index?code=${matchCode}`
});
}
}
}
}
});
} catch (e) {
console.error("处理 match_paired 消息失败:", e);
}
break; break;
case "ranking_game_updated": case "ranking_game_updated":
// 排位赛比分/匹配更新:刷新当前排位赛详情页 // 排位赛比分/匹配更新:刷新当前排位赛详情页
try { try {
const pages3 = getCurrentPages(); const pages3 = getCurrentPages();
const currentPage3 = pages3[pages3.length - 1]; const currentPage3 = pages3[pages3.length - 1];
if ( if (currentPage3) {
currentPage3 && if (currentPage3.route === "pages/match/ranking/index") {
currentPage3.route === "pages/match/ranking/index" const targetCode = data.data && data.data.matchCode;
) { if (
const targetCode = data.data && data.data.matchCode; !targetCode ||
if ( !currentPage3.data ||
!targetCode || currentPage3.data.matchCode === targetCode
!currentPage3.data || ) {
currentPage3.data.matchCode === targetCode if (typeof currentPage3.fetchMatchDetail === "function") {
) { currentPage3.fetchMatchDetail();
if (typeof currentPage3.fetchMatchDetail === "function") { }
currentPage3.fetchMatchDetail(); }
} else if (currentPage3.route === "pages/match/challenge/index") {
// 比赛首页:比分确认后也刷新“当前比赛”卡片
if (typeof currentPage3.fetchOngoingMatches === "function") {
currentPage3.fetchOngoingMatches();
} }
} }
} }
@ -437,6 +485,40 @@ App({
console.error("处理 ranking_game_updated 消息失败:", e); console.error("处理 ranking_game_updated 消息失败:", e);
} }
break; break;
case "points_order_verified":
// 后台核销积分订单后,通知小程序刷新订单列表/详情
try {
wx.showToast({ title: "积分订单已核销", icon: "success" });
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const payload = data.data || {};
if (
currentPage &&
currentPage.route === "pages/points/order/index"
) {
// 如果页面实现了下拉刷新逻辑,优先复用
if (typeof currentPage.onPullDownRefresh === "function") {
currentPage.onPullDownRefresh();
} else if (typeof currentPage.fetchOrders === "function") {
// 兜底:重置分页并主动刷新
currentPage.setData({ page: 1, hasMore: true });
currentPage.fetchOrders();
}
// 精确刷新当前弹窗和列表中的该笔订单
if (
payload.orderId &&
typeof currentPage.refreshOrderById === "function"
) {
currentPage.refreshOrderById(payload.orderId);
}
}
} catch (e) {
console.error("处理 points_order_verified 消息失败:", e);
}
break;
} }
}, },

View File

@ -15,6 +15,14 @@
"pages/points/order/index", "pages/points/order/index",
"pages/store/index" "pages/store/index"
], ],
"requiredPrivateInfos": [
"getLocation"
],
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
},
"window": { "window": {
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"navigationBarBackgroundColor": "#FF6B35", "navigationBarBackgroundColor": "#FF6B35",

View File

@ -9,7 +9,13 @@ Page({
myPlayer: null, myPlayer: null,
currentGame: null, currentGame: null,
myScoreInput: '', myScoreInput: '',
opponentScoreInput: '' opponentScoreInput: '',
isReferee: false,
editingGame: null,
editScoreForm: {
player1Score: '',
player2Score: ''
}
}, },
onLoad(options) { onLoad(options) {
@ -120,22 +126,128 @@ Page({
async fetchMatchDetail() { async fetchMatchDetail() {
try { try {
const res = await app.request(`/api/match/ranking/${this.data.matchCode}`) // 同时获取比赛详情和当前对局,确保数据完整刷新
this.setData({ match: res.data }) const [detailRes, gameRes] = await Promise.all([
app.request(`/api/match/ranking/${this.data.matchCode}`),
app.request(`/api/match/ranking/${this.data.matchCode}/my-game`).catch(() => ({ data: { currentGame: null } }))
])
// 调试:打印完整的接口返回数据
console.log('[fetchMatchDetail] 接口返回数据:', {
matchCode: detailRes.data.matchCode,
rounds: detailRes.data.rounds,
roundsLength: detailRes.data.rounds?.length || 0,
isReferee: detailRes.data.isReferee,
playersCount: detailRes.data.players?.length || 0
})
// 详细打印对局数据(接口已直接返回选手名称)
if (detailRes.data.rounds && detailRes.data.rounds.length > 0) {
detailRes.data.rounds.forEach((round, roundIndex) => {
console.log(`[fetchMatchDetail] 轮次 ${roundIndex + 1}:`, {
roundName: round.roundName,
roundId: round.id,
gamesCount: round.games?.length || 0,
games: round.games?.map(g => ({
id: g.id,
player1Id: g.player1Id,
player2Id: g.player2Id,
player1Name: g.player1Name,
player2Name: g.player2Name,
player1Score: g.player1Score,
player2Score: g.player2Score
})) || []
})
// 检查每个对局的选手名称
if (round.games && round.games.length > 0) {
round.games.forEach((game, gameIndex) => {
console.log(`[fetchMatchDetail] 对局 ${gameIndex + 1}:`, {
id: game.id,
player1Id: game.player1Id,
player2Id: game.player2Id,
player1Name: game.player1Name,
player2Name: game.player2Name,
hasPlayer1Name: !!game.player1Name,
hasPlayer2Name: !!game.player2Name
})
})
}
})
} else {
console.warn('[fetchMatchDetail] 警告: rounds 为空或不存在', detailRes.data)
}
// 确保数据正确设置,深拷贝避免引用问题
const matchData = JSON.parse(JSON.stringify({
...detailRes.data,
rounds: (detailRes.data.rounds || []).map(round => ({
...round,
games: (round.games || []).map(game => ({
...game,
// 确保选手名称字段存在
player1Name: game.player1Name || `选手${game.player1Id}`,
player2Name: game.player2Name || `选手${game.player2Id}`
}))
}))
}))
console.log('[fetchMatchDetail] 设置到页面的数据:', {
matchCode: matchData.matchCode,
roundsLength: matchData.rounds.length,
firstRoundGames: matchData.rounds[0]?.games?.length || 0,
firstGame: matchData.rounds[0]?.games?.[0] || null,
firstGamePlayerNames: matchData.rounds[0]?.games?.[0] ? {
player1Name: matchData.rounds[0].games[0].player1Name,
player2Name: matchData.rounds[0].games[0].player2Name
} : null
})
this.setData({
match: matchData,
isReferee: detailRes.data.isReferee || false
}, () => {
// setData 完成后的回调
console.log('[fetchMatchDetail] setData 完成,页面数据:', {
matchRoundsLength: this.data.match?.rounds?.length || 0,
firstRoundGamesLength: this.data.match?.rounds?.[0]?.games?.length || 0,
firstGamePlayerNames: this.data.match?.rounds?.[0]?.games?.[0] ? {
player1Name: this.data.match.rounds[0].games[0].player1Name,
player2Name: this.data.match.rounds[0].games[0].player2Name,
player1Id: this.data.match.rounds[0].games[0].player1Id,
player2Id: this.data.match.rounds[0].games[0].player2Id
} : null
})
})
// 如果是裁判,不需要获取当前对局
if (detailRes.data.isReferee) {
console.log('[fetchMatchDetail] 裁判身份,跳过获取当前对局')
return
}
// 找到我的参赛信息 // 找到我的参赛信息
const ladderUser = app.globalData.ladderUser const ladderUser = app.globalData.ladderUser
if (ladderUser) { if (ladderUser) {
// 使用 == 比较,避免类型不一致问题 // 使用 == 比较,避免类型不一致问题
const myPlayer = res.data.players.find(p => p.ladderUserId == ladderUser.id) const myPlayer = detailRes.data.players.find(p => p.ladderUserId == ladderUser.id)
this.setData({ myPlayer }) this.setData({ myPlayer })
// 不再根据本地 myPlayer.status 决定是否拉取当前对局 // 更新当前对局信息
// 后端 /my-game 接口内部会负责: const newGame = gameRes.data.currentGame || null
// - 如果当前有对局:返回对手信息 const prevGameId = this.data.currentGame && this.data.currentGame.id
// - 如果没有对局但我在 waiting尝试自动匹配并返回新对局 const newGameId = newGame && newGame.id
// - 否则返回 currentGame: null const gameChanged = prevGameId !== newGameId
this.fetchCurrentGame()
if (gameChanged) {
this.setData({
currentGame: newGame,
myScoreInput: '',
opponentScoreInput: ''
})
} else {
this.setData({ currentGame: newGame })
}
} }
} catch (e) { } catch (e) {
console.error('获取排位赛详情失败:', e) console.error('获取排位赛详情失败:', e)
@ -164,5 +276,163 @@ Page({
} catch (e) { } catch (e) {
console.error('获取当前对局失败:', e) console.error('获取当前对局失败:', e)
} }
},
// 裁判功能:编辑比分
handleRefereeEditScore(e) {
const game = e.currentTarget.dataset.game
if (!game) return
// 确保 game 对象包含必要的字段,包括选手名称
const gameData = {
id: game.id,
player1Id: game.player1Id,
player2Id: game.player2Id,
player1Name: game.player1Name || `选手${game.player1Id}`,
player2Name: game.player2Name || `选手${game.player2Id}`,
player1Score: game.player1Score,
player2Score: game.player2Score,
confirmStatus: game.confirmStatus
}
this.setData({
editingGame: gameData,
editScoreForm: {
player1Score: game.player1Score !== null && game.player1Score !== undefined ? String(game.player1Score) : '',
player2Score: game.player2Score !== null && game.player2Score !== undefined ? String(game.player2Score) : ''
}
})
},
bindPlayer1ScoreInput(e) {
this.setData({
'editScoreForm.player1Score': e.detail.value
})
},
bindPlayer2ScoreInput(e) {
this.setData({
'editScoreForm.player2Score': e.detail.value
})
},
async handleRefereeSaveScore() {
const { editingGame, editScoreForm } = this.data
if (!editingGame || !editScoreForm.player1Score || !editScoreForm.player2Score) {
wx.showToast({ title: '请输入完整比分', icon: 'none' })
return
}
wx.showLoading({ title: '保存中...' })
try {
await app.request(`/api/match/referee/update-score`, {
match_id: this.data.match.id,
game_id: editingGame.id,
player1_score: parseInt(editScoreForm.player1Score),
player2_score: parseInt(editScoreForm.player2Score)
}, 'POST')
wx.showToast({ title: '保存成功', icon: 'success' })
this.setData({ editingGame: null })
this.fetchMatchDetail()
} catch (e) {
console.error('保存比分失败:', e)
wx.showToast({ title: e.message || '保存失败', icon: 'none' })
} finally {
wx.hideLoading()
}
},
// 裁判功能:确认比分
async handleRefereeConfirmScore(e) {
const game = e.currentTarget.dataset.game
wx.showModal({
title: '确认比分',
content: `确认该对局结果?确认后将计算战力值变动`,
success: async (res) => {
if (res.confirm) {
wx.showLoading({ title: '确认中...' })
try {
// 使用后台API确认比分需要管理员权限但裁判应该可以通过小程序API确认
// 或者使用小程序端的确认接口,但需要检查权限
await app.request(`/api/match/ranking/confirm-score`, {
game_id: game.id,
confirm: true
}, 'POST')
wx.showToast({ title: '确认成功', icon: 'success' })
this.fetchMatchDetail()
} catch (e) {
console.error('确认比分失败:', e)
wx.showToast({ title: e.message || '确认失败', icon: 'none' })
} finally {
wx.hideLoading()
}
}
}
})
},
// 关闭编辑弹窗
handleCloseEditModal() {
this.setData({ editingGame: null })
},
// 阻止事件冒泡(用于弹窗内容区域)
stopPropagation() {
// 空函数,仅用于阻止事件冒泡
},
// 获取选手名称(用于裁判界面)
getPlayerName(ladderUserId) {
if (!ladderUserId) {
return '未知选手'
}
if (!this.data.match || !this.data.match.players || !Array.isArray(this.data.match.players)) {
return `选手${ladderUserId}`
}
// 使用 == 比较,避免类型不一致问题(支持数字和字符串比较)
const player = this.data.match.players.find(p => {
const pId = p.ladderUserId
const targetId = ladderUserId
return String(pId) === String(targetId) || Number(pId) === Number(targetId)
})
if (player && player.realName) {
return player.realName
}
// 如果找不到,返回默认名称
return `选手${ladderUserId}`
},
// 裁判功能:开始淘汰赛
handleRefereeStartElimination() {
wx.showModal({
title: '开始淘汰赛',
content: '确定要开始淘汰赛吗?',
success: async (res) => {
if (res.confirm) {
wx.showActionSheet({
itemList: ['2强决赛', '4强', '8强'],
success: async (actionRes) => {
const sizes = [2, 4, 8]
const size = sizes[actionRes.tapIndex]
wx.showLoading({ title: '开始中...' })
try {
await app.request(`/api/match/referee/start-elimination`, {
match_id: this.data.match.id,
elimination_size: size
}, 'POST')
wx.showToast({ title: '淘汰赛已开始', icon: 'success' })
this.fetchMatchDetail()
} catch (e) {
console.error('开始淘汰赛失败:', e)
wx.showToast({ title: e.message || '开始失败', icon: 'none' })
} finally {
wx.hideLoading()
}
}
})
}
}
})
} }
}) })

View File

@ -84,7 +84,8 @@
<!-- 比分操作区域 --> <!-- 比分操作区域 -->
<view class="game-actions"> <view class="game-actions">
<view class="score-inputs" wx:if="{{match.status === 1 && currentGame.gameStatus === 1}}"> <!-- 状态0已生成但未开始或状态1进行中显示提交比分输入框 -->
<view class="score-inputs" wx:if="{{match.status === 1 && (currentGame.gameStatus === 0 || currentGame.gameStatus === 1) && !currentGame.submitBy}}">
<view class="score-field"> <view class="score-field">
<text class="score-label">我方得分</text> <text class="score-label">我方得分</text>
<input class="score-input" type="number" value="{{myScoreInput}}" bindinput="bindMyScoreInput" placeholder="0" /> <input class="score-input" type="number" value="{{myScoreInput}}" bindinput="bindMyScoreInput" placeholder="0" />
@ -95,7 +96,7 @@
<input class="score-input" type="number" value="{{opponentScoreInput}}" bindinput="bindOpponentScoreInput" placeholder="0" /> <input class="score-input" type="number" value="{{opponentScoreInput}}" bindinput="bindOpponentScoreInput" placeholder="0" />
</view> </view>
</view> </view>
<button class="action-btn submit-btn" wx:if="{{match.status === 1 && currentGame.gameStatus === 1}}" bindtap="handleSubmitScore">提交比分</button> <button class="action-btn submit-btn" wx:if="{{match.status === 1 && (currentGame.gameStatus === 0 || currentGame.gameStatus === 1) && !currentGame.submitBy}}" bindtap="handleSubmitScore">提交比分</button>
<view class="action-status" wx:if="{{match.status !== 1}}"> <view class="action-status" wx:if="{{match.status !== 1}}">
<text>比赛未开始,无法填写比分</text> <text>比赛未开始,无法填写比分</text>
@ -130,11 +131,13 @@
</view> </view>
</view> </view>
<!-- 参赛选手 --> <!-- 参赛选手 / 最终排名 -->
<view class="players-card animate-fadeInUp" style="animation-delay: 0.15s"> <view class="players-card animate-fadeInUp" style="animation-delay: 0.15s">
<view class="card-header"> <view class="card-header">
<image class="card-icon" src="/images/icon-users.svg" mode="aspectFit"></image> <image class="card-icon" src="/images/icon-users.svg" mode="aspectFit"></image>
<text class="card-title">参赛选手</text> <view class="card-title">
{{match.status === 2 ? '最终排名' : '参赛选手'}}
</view>
<text class="player-count">{{match.players.length || 0}}人</text> <text class="player-count">{{match.players.length || 0}}人</text>
</view> </view>

View File

@ -188,7 +188,8 @@
} }
/* 我的状态卡片 */ /* 我的状态卡片 */
.my-status-card { .my-status-card,
.referee-card {
background: #fff; background: #fff;
border-radius: 28rpx; border-radius: 28rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
@ -521,11 +522,13 @@
} }
/* 参赛选手卡片 */ /* 参赛选手卡片 */
.players-card { .players-card,
.games-card {
background: #fff; background: #fff;
border-radius: 28rpx; border-radius: 28rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.06); box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.06);
overflow: hidden; overflow: hidden;
margin-bottom: 20rpx;
} }
.players-list { .players-list {
@ -671,6 +674,264 @@
color: var(--text-muted); color: var(--text-muted);
} }
/* 裁判操作区域 */
.referee-actions {
padding: 24rpx;
}
.referee-actions .action-btn {
width: 100%;
}
.primary-btn {
background: linear-gradient(135deg, #ff9800, #f57c00);
color: #fff;
box-shadow: 0 4rpx 12rpx rgba(255, 152, 0, 0.3);
}
/* 对局记录列表 */
.games-list {
padding: 16rpx;
}
.round-section {
margin-bottom: 24rpx;
}
.round-section:last-child {
margin-bottom: 0;
}
.round-title {
font-size: 28rpx;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 16rpx;
padding-bottom: 12rpx;
border-bottom: 2rpx solid rgba(0, 0, 0, 0.08);
}
.game-item {
display: flex;
flex-direction: column;
gap: 16rpx;
padding: 20rpx;
background: linear-gradient(135deg, #fafafa, #f5f5f5);
border-radius: 16rpx;
margin-bottom: 12rpx;
}
.game-item:last-child {
margin-bottom: 0;
}
.game-players {
display: flex;
align-items: center;
justify-content: center;
gap: 16rpx;
flex-wrap: wrap;
margin-bottom: 8rpx;
}
.player-info {
display: flex;
align-items: center;
min-width: 0;
flex: 1;
justify-content: center;
}
.game-players .player-name {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 200rpx;
}
.vs-text {
font-size: 24rpx;
color: var(--text-muted);
font-weight: 600;
}
.game-score {
text-align: center;
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
}
.score-placeholder {
color: var(--text-muted);
}
.game-status {
text-align: center;
}
.status-confirmed {
display: inline-block;
padding: 6rpx 16rpx;
background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
color: #2e7d32;
border-radius: 8rpx;
font-size: 22rpx;
font-weight: 600;
}
.status-pending {
display: inline-block;
padding: 6rpx 16rpx;
background: linear-gradient(135deg, #fff3e0, #ffe0b2);
color: #e65100;
border-radius: 8rpx;
font-size: 22rpx;
font-weight: 600;
}
.status-disputed {
display: inline-block;
padding: 6rpx 16rpx;
background: linear-gradient(135deg, #ffebee, #ffcdd2);
color: #c62828;
border-radius: 8rpx;
font-size: 22rpx;
font-weight: 600;
}
.game-actions {
display: flex;
gap: 16rpx;
justify-content: center;
margin-top: 8rpx;
}
.game-actions .action-btn {
flex: 1;
height: 72rpx;
border-radius: 12rpx;
font-size: 26rpx;
font-weight: 600;
border: none;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
}
.edit-score-btn {
background: linear-gradient(135deg, #1976d2, #1565c0);
color: #fff;
box-shadow: 0 4rpx 12rpx rgba(25, 118, 210, 0.3);
}
.edit-score-btn:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(25, 118, 210, 0.4);
}
.confirm-score-btn {
background: linear-gradient(135deg, #43a047, #2e7d32);
color: #fff;
box-shadow: 0 4rpx 12rpx rgba(46, 125, 50, 0.3);
}
.confirm-score-btn:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(46, 125, 50, 0.4);
}
.empty-games {
padding: 60rpx 20rpx;
text-align: center;
}
.empty-text {
font-size: 28rpx;
color: var(--text-muted);
}
/* 裁判编辑比分弹窗 */
.referee-edit-modal {
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;
}
.modal-content {
width: 90%;
max-width: 600rpx;
background: #fff;
border-radius: 24rpx;
overflow: hidden;
}
.modal-header {
padding: 32rpx;
border-bottom: 1rpx solid rgba(0, 0, 0, 0.08);
}
.modal-title {
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
}
.modal-body {
padding: 32rpx;
}
.edit-game-info {
text-align: center;
font-size: 28rpx;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 32rpx;
}
.edit-score-inputs {
display: flex;
align-items: center;
justify-content: center;
gap: 24rpx;
}
.modal-footer {
display: flex;
gap: 16rpx;
padding: 24rpx 32rpx;
border-top: 1rpx solid rgba(0, 0, 0, 0.08);
}
.modal-btn {
flex: 1;
border-radius: 12rpx;
font-size: 30rpx;
font-weight: 600;
border: none;
}
.cancel-btn {
background: #f5f5f5;
color: var(--text-primary);
}
.confirm-btn {
background: linear-gradient(135deg, #1976d2, #1565c0);
color: #fff;
}
/* 动画 */ /* 动画 */
@keyframes fadeInUp { @keyframes fadeInUp {
from { from {

View File

@ -124,6 +124,38 @@ Page({
}) })
}, },
// 根据订单 ID 刷新当前列表与弹窗(供 WebSocket 回调调用)
async refreshOrderById(orderId) {
if (!orderId) return
try {
const res = await app.request(`/api/points/orders/${orderId}`)
const detail = res.data
// 更新列表中的状态
const orders = (this.data.orders || []).map(item =>
item.id === orderId
? Object.assign({}, item, { status: detail.status })
: item
)
// 如果弹窗正在展示当前这笔订单,同步更新弹窗里的状态等信息
let currentOrder = this.data.currentOrder
if (currentOrder && currentOrder.id === orderId) {
currentOrder = Object.assign({}, currentOrder, {
status: detail.status
})
}
this.setData({
orders,
currentOrder
})
} catch (e) {
console.error('通过 ID 刷新订单失败:', e)
}
},
goToMall() { goToMall() {
wx.switchTab({ url: '/pages/points/mall/index' }) wx.switchTab({ url: '/pages/points/mall/index' })
} }

View File

@ -40,10 +40,10 @@
data-order="{{item}}" data-order="{{item}}"
> >
<view class="order-header"> <view class="order-header">
<text class="order-no">订单号: {{item.orderNo}}</text> <view class="order-no">订单号: {{item.orderNo}}</view>
<text class="order-status {{item.status === 0 ? 'pending' : item.status === 1 ? 'completed' : 'cancelled'}}"> <view class="order-status {{item.status === 0 ? 'pending' : item.status === 1 ? 'completed' : 'cancelled'}}">
{{item.status === 0 ? '待核销' : item.status === 1 ? '已完成' : '已取消'}} {{item.status === 0 ? '待核销' : item.status === 1 ? '已完成' : '已取消'}}
</text> </view>
</view> </view>
<view class="order-content"> <view class="order-content">
<image class="product-image" src="{{item.productImage || '/images/product-default.svg'}}" mode="aspectFill"></image> <image class="product-image" src="{{item.productImage || '/images/product-default.svg'}}" mode="aspectFill"></image>

View File

@ -2,7 +2,7 @@ const { Match, MatchGame, MatchPlayer, MatchRound, LadderUser, User, Store, sequ
const { MATCH_TYPES, MATCH_STATUS, RANKING_STAGE, CONFIRM_STATUS } = require('../config/constants'); const { MATCH_TYPES, MATCH_STATUS, RANKING_STAGE, CONFIRM_STATUS } = require('../config/constants');
const { generateMatchCode, success, error, getPagination, pageResult } = require('../utils/helper'); const { generateMatchCode, success, error, getPagination, pageResult } = require('../utils/helper');
const PowerCalculator = require('../services/powerCalculator'); const PowerCalculator = require('../services/powerCalculator');
const { broadcastToUsers } = require('../websocket'); const { broadcastToUsers, sendMatchNotification } = require('../websocket');
const { Op } = require('sequelize'); const { Op } = require('sequelize');
class MatchAdminController { class MatchAdminController {
@ -199,6 +199,38 @@ class MatchAdminController {
return res.status(404).json(error('比赛不存在', 404)); return res.status(404).json(error('比赛不存在', 404));
} }
// 对选手进行排序:如果比赛已结束且有 rank按 rank 排序;否则按胜场、总得分、初始战力排序
const sortedPlayers = [...match.players];
if (match.status === MATCH_STATUS.FINISHED && sortedPlayers.some(p => p.rank)) {
// 比赛已结束:按 rank 排序
sortedPlayers.sort((a, b) => {
if (a.rank && b.rank) return a.rank - b.rank;
if (a.rank) return -1;
if (b.rank) return 1;
return 0;
});
} else {
// 比赛进行中:按胜场、总得分、初始战力排序
// 需要计算总得分
const allGames = match.games || [];
const scoreMap = new Map();
allGames.forEach(g => {
if (g.confirm_status === CONFIRM_STATUS.CONFIRMED) {
const key1 = String(g.player1_id);
const key2 = String(g.player2_id);
scoreMap.set(key1, (scoreMap.get(key1) || 0) + (g.player1_score || 0));
scoreMap.set(key2, (scoreMap.get(key2) || 0) + (g.player2_score || 0));
}
});
sortedPlayers.sort((a, b) => {
if (b.win_count !== a.win_count) return b.win_count - a.win_count;
const scoreA = scoreMap.get(String(a.ladder_user_id)) || 0;
const scoreB = scoreMap.get(String(b.ladder_user_id)) || 0;
if (scoreB !== scoreA) return scoreB - scoreA;
return b.initial_power - a.initial_power;
});
}
res.json(success({ res.json(success({
id: match.id, id: match.id,
matchCode: match.match_code, matchCode: match.match_code,
@ -214,7 +246,7 @@ class MatchAdminController {
refereeName: match.referee?.nickname, refereeName: match.referee?.nickname,
startTime: match.start_time, startTime: match.start_time,
endTime: match.end_time, endTime: match.end_time,
players: match.players.map(p => ({ players: sortedPlayers.map(p => ({
id: p.id, id: p.id,
ladderUserId: p.ladder_user_id, ladderUserId: p.ladder_user_id,
realName: p.ladderUser?.real_name, realName: p.ladderUser?.real_name,
@ -380,7 +412,7 @@ class MatchAdminController {
const t = await sequelize.transaction(); const t = await sequelize.transaction();
try { try {
const { id } = req.params; const { id } = req.params;
const { elimination_size } = req.body; // 4, 8, 16 const { elimination_size, selected_player_ids } = req.body; // elimination_size: 2/4/8..., selected_player_ids: 可选自定义选手ID列表ladder_user_id
const match = await Match.findByPk(id, { const match = await Match.findByPk(id, {
include: [{ model: MatchPlayer, as: 'players' }] include: [{ model: MatchPlayer, as: 'players' }]
@ -409,14 +441,64 @@ class MatchAdminController {
return res.status(400).json(error('循环赛尚未结束', 400)); return res.status(400).json(error('循环赛尚未结束', 400));
} }
// 根据胜场排名 // 根据胜场和总得分排名(循环赛阶段只统计循环赛已确认对局)
const confirmedGames = await MatchGame.findAll({
where: {
match_id: id,
confirm_status: CONFIRM_STATUS.CONFIRMED
},
include: [{
model: MatchRound,
as: 'round',
where: { round_type: 'round_robin' }
}]
});
const scoreMap = new Map(); // ladder_user_id -> 总得分(自己得分之和)
const addScore = (playerId, score) => {
const key = String(playerId);
const prev = scoreMap.get(key) || 0;
scoreMap.set(key, prev + (Number(score) || 0));
};
confirmedGames.forEach(g => {
addScore(g.player1_id, g.player1_score);
addScore(g.player2_id, g.player2_score);
});
const rankedPlayers = match.players.sort((a, b) => { const rankedPlayers = match.players.sort((a, b) => {
if (b.win_count !== a.win_count) return b.win_count - a.win_count; if (b.win_count !== a.win_count) return b.win_count - a.win_count;
const scoreA = scoreMap.get(String(a.ladder_user_id)) || 0;
const scoreB = scoreMap.get(String(b.ladder_user_id)) || 0;
if (scoreB !== scoreA) return scoreB - scoreA;
// 再次平局时保持初始战力作为第三排序因子
return b.initial_power - a.initial_power; return b.initial_power - a.initial_power;
}); });
const size = Math.min(elimination_size, rankedPlayers.length); // 支持手动选择淘汰赛选手:
const qualifiedPlayers = rankedPlayers.slice(0, size); // - 如果传入 selected_player_idsladder_user_id 列表),则优先使用该列表
// - 否则按排名取前 elimination_size 名
let size;
let qualifiedPlayers;
if (Array.isArray(selected_player_ids) && selected_player_ids.length >= 2) {
const idSet = new Set(selected_player_ids.map((v) => String(v)));
const picked = match.players.filter((p) =>
idSet.has(String(p.ladder_user_id)),
);
if (picked.length < 2) {
await t.rollback();
return res.status(400).json(error('所选选手数量不足 2 人', 400));
}
size = picked.length;
qualifiedPlayers = picked;
} else {
const safeSize = Math.min(elimination_size || 2, rankedPlayers.length);
if (safeSize < 2) {
await t.rollback();
return res.status(400).json(error('参赛人数不足以开启淘汰赛', 400));
}
size = safeSize;
qualifiedPlayers = rankedPlayers.slice(0, size);
}
// 更新比赛状态 // 更新比赛状态
await match.update({ await match.update({
@ -424,8 +506,12 @@ class MatchAdminController {
elimination_size: size elimination_size: size
}, { transaction: t }); }, { transaction: t });
// 创建淘汰赛首轮1 vs 最后, 2 vs 倒数第二... // 根据人数确定轮次名称
const roundName = size === 4 ? '半决赛' : size === 8 ? '四分之一决赛' : '淘汰赛首轮'; // 2人直接决赛
// 4人半决赛
// 8人四分之一决赛
// 其他:淘汰赛首轮
const roundName = size === 2 ? '决赛' : size === 4 ? '半决赛' : size === 8 ? '四分之一决赛' : '淘汰赛首轮';
const round = await MatchRound.create({ const round = await MatchRound.create({
match_id: match.id, match_id: match.id,
round_number: 100, // 淘汰赛轮次从100开始 round_number: 100, // 淘汰赛轮次从100开始
@ -435,14 +521,20 @@ class MatchAdminController {
}, { transaction: t }); }, { transaction: t });
// 配对1 vs size, 2 vs size-1, ... // 配对1 vs size, 2 vs size-1, ...
const createdGames = [];
for (let i = 0; i < size / 2; i++) { for (let i = 0; i < size / 2; i++) {
await MatchGame.create({ const game = await MatchGame.create({
match_id: match.id, match_id: match.id,
round_id: round.id, round_id: round.id,
player1_id: qualifiedPlayers[i].ladder_user_id, player1_id: qualifiedPlayers[i].ladder_user_id,
player2_id: qualifiedPlayers[size - 1 - i].ladder_user_id, player2_id: qualifiedPlayers[size - 1 - i].ladder_user_id,
status: 0 status: 0
}, { transaction: t }); }, { transaction: t });
createdGames.push({
game,
player1: qualifiedPlayers[i],
player2: qualifiedPlayers[size - 1 - i]
});
} }
// 将晋级淘汰赛的选手状态标记为进行中playing方便前端展示 // 将晋级淘汰赛的选手状态标记为进行中playing方便前端展示
@ -458,6 +550,57 @@ class MatchAdminController {
); );
await t.commit(); await t.commit();
// 发送WebSocket通知给所有匹配的选手
try {
for (const { game, player1, player2 } of createdGames) {
// 获取选手的天梯用户信息包含user_id
const [ladder1, ladder2] = await Promise.all([
LadderUser.findByPk(player1.ladder_user_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }]
}),
LadderUser.findByPk(player2.ladder_user_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }]
})
]);
// 通知选手1
if (ladder1 && ladder1.user_id) {
sendMatchNotification(ladder1.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder2?.id,
realName: ladder2?.real_name,
level: ladder2?.level,
powerScore: ladder2?.power_score,
nickname: ladder2?.user?.nickname,
avatar: ladder2?.user?.avatar
}
});
}
// 通知选手2
if (ladder2 && ladder2.user_id) {
sendMatchNotification(ladder2.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder1?.id,
realName: ladder1?.real_name,
level: ladder1?.level,
powerScore: ladder1?.power_score,
nickname: ladder1?.user?.nickname,
avatar: ladder1?.user?.avatar
}
});
}
}
} catch (notifyErr) {
console.error('发送淘汰赛匹配通知失败:', notifyErr);
// 通知失败不影响主流程,只记录错误
}
res.json(success(null, '淘汰赛已开始')); res.json(success(null, '淘汰赛已开始'));
} catch (err) { } catch (err) {
await t.rollback(); await t.rollback();
@ -466,56 +609,18 @@ class MatchAdminController {
} }
} }
// 结束比赛 // 结束比赛(手动触发,一般由后台按钮调用)
async endMatch(req, res) { endMatch = async (req, res) => {
const t = await sequelize.transaction(); const t = await sequelize.transaction();
try { try {
const { id } = req.params; const { id } = req.params;
const match = await Match.findByPk(id, { const finished = await this._autoFinishRankingMatch(id, t, true);
include: [{ model: MatchPlayer, as: 'players' }] if (!finished) {
});
if (!match) {
await t.rollback(); await t.rollback();
return res.status(404).json(error('比赛不存在', 404)); return res.status(404).json(error('比赛不存在或尚未结束所有对局', 404));
} }
// 计算最终排名和战力值
const players = match.players.sort((a, b) => {
if (b.win_count !== a.win_count) return b.win_count - a.win_count;
return b.initial_power - a.initial_power;
});
for (let i = 0; i < players.length; i++) {
const player = players[i];
const ladderUser = await LadderUser.findByPk(player.ladder_user_id);
await player.update({
rank: i + 1,
final_power: ladderUser.power_score,
player_status: 'finished'
}, { transaction: t });
// 处理升降级(排位赛规则)
if (match.type === MATCH_TYPES.RANKING) {
const promotion = PowerCalculator.determinePromotion(i + 1, players.length);
if (promotion === 'promote' && ladderUser.level < 5) {
// 冠军:段位 +1
await ladderUser.update({ level: ladderUser.level + 1 }, { transaction: t });
} else if (promotion === 'demote' && (ladderUser.level === 4 || ladderUser.level === 5)) {
// 末位:只有 4、5 段才降一级
await ladderUser.update({ level: ladderUser.level - 1 }, { transaction: t });
} // 其他情况不变
}
}
await match.update({
status: MATCH_STATUS.FINISHED,
stage: RANKING_STAGE.FINISHED,
end_time: new Date()
}, { transaction: t });
await t.commit(); await t.commit();
res.json(success(null, '比赛已结束')); res.json(success(null, '比赛已结束'));
} catch (err) { } catch (err) {
@ -662,9 +767,12 @@ class MatchAdminController {
await this._autoMatchPlayers(game.match.id, t); await this._autoMatchPlayers(game.match.id, t);
} else if (game.match.stage === RANKING_STAGE.ELIMINATION) { } else if (game.match.stage === RANKING_STAGE.ELIMINATION) {
// 淘汰赛:检查是否需要自动生成下一轮(例如 4 强打完自动生成决赛) // 淘汰赛:先检查是否需要自动生成下一轮(半决赛 -> 决赛)
await this._maybeStartNextEliminationRound(game.match.id, t); await this._maybeStartNextEliminationRound(game.match.id, t);
} }
// 排位赛:若所有对局均已确认,自动结算比赛并生成最终排名
await this._autoFinishRankingMatch(game.match.id, t);
} }
await t.commit(); await t.commit();
@ -791,16 +899,67 @@ class MatchAdminController {
// 获取等待中的选手 // 获取等待中的选手
const waitingPlayers = match.players.filter(p => p.player_status === 'waiting'); const waitingPlayers = match.players.filter(p => p.player_status === 'waiting');
if (waitingPlayers.length < 2) return; console.log(`[自动匹配] 比赛 ${matchId}: 等待中的选手数量=${waitingPlayers.length}`, waitingPlayers.map(p => ({ id: p.ladder_user_id, status: p.player_status })));
if (waitingPlayers.length < 2) {
console.log(`[自动匹配] 等待中的选手不足2人无法匹配`);
return;
}
// 获取未完成的对局 // 获取未完成的对局(排除已确认的对局)
const pendingGames = await MatchGame.findAll({ // 注意status=0 表示待比赛status=1 表示比赛中status=2 表示已结束
// 只有 status=0 且未确认的对局才能被匹配
let pendingGames = await MatchGame.findAll({
where: { where: {
match_id: matchId, match_id: matchId,
status: 0 status: 0,
confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED }
}, },
transaction transaction
}); });
console.log(`[自动匹配] 比赛 ${matchId}: 待匹配的对局数量=${pendingGames.length}`, pendingGames.map(g => ({ id: g.id, p1: g.player1_id, p2: g.player2_id, status: g.status, confirm_status: g.confirm_status })));
// 如果待匹配的对局数量为0检查是否有状态异常的对局status=1但未确认可能是之前匹配过但确认失败
// 如果两个选手都是 waiting 状态,说明对局应该被重置,允许重新匹配
if (pendingGames.length === 0) {
const abnormalGames = await MatchGame.findAll({
where: {
match_id: matchId,
status: 1, // 只检查 status=1 的对局status=2 且未确认的可能是其他情况)
confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED }
},
transaction
});
if (abnormalGames.length > 0) {
console.log(`[自动匹配] 发现 ${abnormalGames.length} 个状态异常的对局(已开始但未确认)`, abnormalGames.map(g => ({
id: g.id,
p1: g.player1_id,
p2: g.player2_id,
status: g.status,
confirm_status: g.confirm_status
})));
// 检查这些异常对局的两个选手是否都是 waiting 状态
for (const game of abnormalGames) {
const p1 = waitingPlayers.find(p => String(p.ladder_user_id) === String(game.player1_id));
const p2 = waitingPlayers.find(p => String(p.ladder_user_id) === String(game.player2_id));
if (p1 && p2) {
// 两个选手都是 waiting说明对局应该被重置
console.log(`[自动匹配] 重置异常对局 ${game.id}: 选手 ${game.player1_id}${game.player2_id} 都是 waiting 状态`);
await game.update({
status: 0, // 重置为待比赛状态
player1_score: null,
player2_score: null,
winner_id: null,
loser_id: null,
submit_by: null
}, { transaction });
// 将这个对局添加到待匹配列表
pendingGames.push(game);
}
}
}
}
// 找到可以匹配的选手对 // 找到可以匹配的选手对
for (const game of pendingGames) { for (const game of pendingGames) {
@ -811,6 +970,7 @@ class MatchAdminController {
const player2 = waitingPlayers.find(p => String(p.ladder_user_id) === String(game.player2_id)); const player2 = waitingPlayers.find(p => String(p.ladder_user_id) === String(game.player2_id));
if (player1 && player2) { if (player1 && player2) {
console.log(`[自动匹配] 匹配成功: 对局 ${game.id}, 选手1=${player1.ladder_user_id}, 选手2=${player2.ladder_user_id}`);
// 更新选手状态 // 更新选手状态
await MatchPlayer.update( await MatchPlayer.update(
{ player_status: 'playing', current_opponent_id: game.player2_id }, { player_status: 'playing', current_opponent_id: game.player2_id },
@ -824,6 +984,52 @@ class MatchAdminController {
// 更新对局状态 // 更新对局状态
await game.update({ status: 1 }, { transaction }); await game.update({ status: 1 }, { transaction });
// 发送匹配成功 WebSocket 通知给双方
try {
const [ladder1, ladder2] = await Promise.all([
LadderUser.findByPk(game.player1_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }],
transaction
}),
LadderUser.findByPk(game.player2_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }],
transaction
})
]);
if (ladder1 && ladder1.user_id) {
sendMatchNotification(ladder1.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder2?.id,
realName: ladder2?.real_name,
level: ladder2?.level,
powerScore: ladder2?.power_score,
nickname: ladder2?.user?.nickname,
avatar: ladder2?.user?.avatar
}
});
}
if (ladder2 && ladder2.user_id) {
sendMatchNotification(ladder2.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder1?.id,
realName: ladder1?.real_name,
level: ladder1?.level,
powerScore: ladder1?.power_score,
nickname: ladder1?.user?.nickname,
avatar: ladder1?.user?.avatar
}
});
}
} catch (notifyErr) {
console.error('发送排位赛匹配通知失败:', notifyErr);
}
// 从等待列表移除 // 从等待列表移除
const idx1 = waitingPlayers.indexOf(player1); const idx1 = waitingPlayers.indexOf(player1);
const idx2 = waitingPlayers.indexOf(player2); const idx2 = waitingPlayers.indexOf(player2);
@ -831,8 +1037,42 @@ class MatchAdminController {
waitingPlayers.splice(Math.min(idx1, idx2), 1); waitingPlayers.splice(Math.min(idx1, idx2), 1);
if (waitingPlayers.length < 2) break; if (waitingPlayers.length < 2) break;
} else {
console.log(`[自动匹配] 对局 ${game.id} 无法匹配: player1=${player1 ? player1.ladder_user_id : 'null'}, player2=${player2 ? player2.ladder_user_id : 'null'}`);
} }
} }
console.log(`[自动匹配] 比赛 ${matchId}: 匹配完成,剩余等待选手=${waitingPlayers.length}`);
}
// 手动触发匹配(用于调试)
async triggerMatch(req, res) {
const t = await sequelize.transaction();
try {
const { id } = req.params;
const match = await Match.findByPk(id, {
include: [{ model: MatchPlayer, as: 'players' }],
transaction: t
});
if (!match || match.type !== MATCH_TYPES.RANKING) {
await t.rollback();
return res.status(400).json(error('比赛不存在或类型错误', 400));
}
if (match.stage !== RANKING_STAGE.ROUND_ROBIN) {
await t.rollback();
return res.status(400).json(error('只有循环赛阶段才能手动触发匹配', 400));
}
await this._autoMatchPlayers(match.id, t);
await t.commit();
res.json(success(null, '匹配已触发'));
} catch (err) {
await t.rollback();
console.error('手动触发匹配失败:', err);
res.status(500).json(error('操作失败'));
}
} }
/** /**
@ -898,6 +1138,148 @@ class MatchAdminController {
} }
); );
} }
/**
* 在所有对局都确认后自动结算排位赛生成最终排名
* 如果 force=true则只检查比赛是否存在不再检查是否还有未确认对局用于手动结束按钮
*/
async _autoFinishRankingMatch(matchId, transaction, force = false) {
const match = await Match.findByPk(matchId, {
include: [
{ model: MatchPlayer, as: 'players' },
{
model: MatchRound,
as: 'rounds',
include: [{ model: MatchGame, as: 'games' }]
}
],
transaction
});
if (!match) return false;
// 如果不是排位赛,暂不处理
if (match.type !== MATCH_TYPES.RANKING) return false;
// 如果还在循环赛阶段,不自动结束(需要手动开始淘汰赛)
if (match.stage === RANKING_STAGE.ROUND_ROBIN) {
return false;
}
// 如果不在淘汰赛阶段,也不自动结束(可能是其他状态)
if (match.stage !== RANKING_STAGE.ELIMINATION) {
return false;
}
if (!force) {
// 检查是否还有未确认的对局,有的话暂不结束
const remainingGames = await MatchGame.count({
where: {
match_id: matchId,
confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED }
},
transaction
});
if (remainingGames > 0) {
return false;
}
// 检查是否有决赛,并且决赛是否已确认
const finalRound = match.rounds.find(r => r.round_type === 'elimination' && r.round_name === '决赛');
if (!finalRound || !finalRound.games || finalRound.games.length === 0) {
// 没有决赛,不自动结束
return false;
}
// 检查决赛是否已确认
const finalGame = finalRound.games[0];
if (finalGame.confirm_status !== CONFIRM_STATUS.CONFIRMED) {
// 决赛未确认,不自动结束
return false;
}
}
// 计算最终排名:先按胜场,再按总得分(自己得分总和),最后按初始战力
const confirmedGamesAll = await MatchGame.findAll({
where: {
match_id: matchId,
confirm_status: CONFIRM_STATUS.CONFIRMED
},
transaction
});
const scoreMap = new Map(); // ladder_user_id -> 总得分
const addScore = (playerId, score) => {
const key = String(playerId);
const prev = scoreMap.get(key) || 0;
scoreMap.set(key, prev + (Number(score) || 0));
};
confirmedGamesAll.forEach(g => {
addScore(g.player1_id, g.player1_score);
addScore(g.player2_id, g.player2_score);
});
// 先创建一个副本进行排序,避免修改原数组
const players = [...match.players].sort((a, b) => {
// 第一优先级:胜场数(降序)
if (b.win_count !== a.win_count) {
return b.win_count - a.win_count;
}
// 第二优先级:总得分(降序)
const scoreA = scoreMap.get(String(a.ladder_user_id)) || 0;
const scoreB = scoreMap.get(String(b.ladder_user_id)) || 0;
if (scoreB !== scoreA) {
return scoreB - scoreA;
}
// 第三优先级:初始战力(降序)
return b.initial_power - a.initial_power;
});
// 调试日志:打印排序结果
console.log(`[最终排名] 比赛 ${matchId} 排序结果:`, players.map((p, idx) => ({
rank: idx + 1,
name: p.ladderUser?.real_name || p.ladder_user_id,
win_count: p.win_count,
total_score: scoreMap.get(String(p.ladder_user_id)) || 0,
initial_power: p.initial_power
})));
for (let i = 0; i < players.length; i++) {
const player = players[i];
const ladderUser = await LadderUser.findByPk(player.ladder_user_id, { transaction });
if (!ladderUser) continue;
await player.update(
{
rank: i + 1,
final_power: ladderUser.power_score,
player_status: 'finished',
},
{ transaction }
);
// 处理升降级(排位赛规则)
const promotion = PowerCalculator.determinePromotion(i + 1, players.length);
if (promotion === 'promote' && ladderUser.level < 5) {
// 冠军:段位 +1
await ladderUser.update({ level: ladderUser.level + 1 }, { transaction });
} else if (promotion === 'demote' && (ladderUser.level === 4 || ladderUser.level === 5)) {
// 末位:只有 4、5 段才降一级
await ladderUser.update({ level: ladderUser.level - 1 }, { transaction });
} // 其他情况不变
}
await match.update(
{
status: MATCH_STATUS.FINISHED,
stage: RANKING_STAGE.FINISHED,
end_time: new Date(),
},
{ transaction }
);
return true;
}
} }
module.exports = new MatchAdminController(); module.exports = new MatchAdminController();

View File

@ -248,7 +248,7 @@ class MatchController {
async refereeStartElimination(req, res) { async refereeStartElimination(req, res) {
const t = await sequelize.transaction(); const t = await sequelize.transaction();
try { try {
const { match_id, elimination_size } = req.body; const { match_id, elimination_size, selected_player_ids } = req.body;
const user = req.user; const user = req.user;
const match = await Match.findByPk(match_id, { const match = await Match.findByPk(match_id, {
@ -289,14 +289,63 @@ class MatchController {
return res.status(400).json(error('循环赛尚未结束', 400)); return res.status(400).json(error('循环赛尚未结束', 400));
} }
// 根据胜场排名 // 根据胜场和总得分排名(循环赛阶段只统计循环赛已确认对局)
const confirmedGames = await MatchGame.findAll({
where: {
match_id,
confirm_status: CONFIRM_STATUS.CONFIRMED
},
include: [{
model: MatchRound,
as: 'round',
where: { round_type: 'round_robin' }
}]
});
const scoreMap = new Map(); // ladder_user_id -> 总得分(自己得分之和)
const addScore = (playerId, score) => {
const key = String(playerId);
const prev = scoreMap.get(key) || 0;
scoreMap.set(key, prev + (Number(score) || 0));
};
confirmedGames.forEach(g => {
addScore(g.player1_id, g.player1_score);
addScore(g.player2_id, g.player2_score);
});
const rankedPlayers = match.players.sort((a, b) => { const rankedPlayers = match.players.sort((a, b) => {
if (b.win_count !== a.win_count) return b.win_count - a.win_count; if (b.win_count !== a.win_count) return b.win_count - a.win_count;
const scoreA = scoreMap.get(String(a.ladder_user_id)) || 0;
const scoreB = scoreMap.get(String(b.ladder_user_id)) || 0;
if (scoreB !== scoreA) return scoreB - scoreA;
return b.initial_power - a.initial_power; return b.initial_power - a.initial_power;
}); });
const size = Math.min(elimination_size, rankedPlayers.length); // 支持手动选择淘汰赛选手:
const qualifiedPlayers = rankedPlayers.slice(0, size); // - 如果传入 selected_player_idsladder_user_id 列表),则优先使用该列表
// - 否则按排名取前 elimination_size 名
let size;
let qualifiedPlayers;
if (Array.isArray(selected_player_ids) && selected_player_ids.length >= 2) {
const idSet = new Set(selected_player_ids.map((v) => String(v)));
const picked = match.players.filter((p) =>
idSet.has(String(p.ladder_user_id)),
);
if (picked.length < 2) {
await t.rollback();
return res.status(400).json(error('所选选手数量不足 2 人', 400));
}
size = picked.length;
qualifiedPlayers = picked;
} else {
const safeSize = Math.min(elimination_size || 2, rankedPlayers.length);
if (safeSize < 2) {
await t.rollback();
return res.status(400).json(error('参赛人数不足以开启淘汰赛', 400));
}
size = safeSize;
qualifiedPlayers = rankedPlayers.slice(0, size);
}
// 更新比赛状态 // 更新比赛状态
await match.update({ await match.update({
@ -304,8 +353,12 @@ class MatchController {
elimination_size: size elimination_size: size
}, { transaction: t }); }, { transaction: t });
// 创建淘汰赛首轮1 vs 最后, 2 vs 倒数第二... // 根据人数确定轮次名称
const roundName = size === 4 ? '半决赛' : size === 8 ? '四分之一决赛' : '淘汰赛首轮'; // 2人直接决赛
// 4人半决赛
// 8人四分之一决赛
// 其他:淘汰赛首轮
const roundName = size === 2 ? '决赛' : size === 4 ? '半决赛' : size === 8 ? '四分之一决赛' : '淘汰赛首轮';
const round = await MatchRound.create({ const round = await MatchRound.create({
match_id: match.id, match_id: match.id,
round_number: 100, // 淘汰赛轮次从100开始 round_number: 100, // 淘汰赛轮次从100开始
@ -315,17 +368,86 @@ class MatchController {
}, { transaction: t }); }, { transaction: t });
// 配对1 vs size, 2 vs size-1, ... // 配对1 vs size, 2 vs size-1, ...
const createdGames = [];
for (let i = 0; i < size / 2; i++) { for (let i = 0; i < size / 2; i++) {
await MatchGame.create({ const game = await MatchGame.create({
match_id: match.id, match_id: match.id,
round_id: round.id, round_id: round.id,
player1_id: qualifiedPlayers[i].ladder_user_id, player1_id: qualifiedPlayers[i].ladder_user_id,
player2_id: qualifiedPlayers[size - 1 - i].ladder_user_id, player2_id: qualifiedPlayers[size - 1 - i].ladder_user_id,
status: 0 status: 0
}, { transaction: t }); }, { transaction: t });
createdGames.push({
game,
player1: qualifiedPlayers[i],
player2: qualifiedPlayers[size - 1 - i]
});
} }
// 更新选手状态为进行中
await MatchPlayer.update(
{ player_status: 'playing' },
{
where: {
match_id: match.id,
ladder_user_id: qualifiedPlayers.map(p => p.ladder_user_id)
},
transaction: t
}
);
await t.commit(); await t.commit();
// 发送WebSocket通知给所有匹配的选手
try {
for (const { game, player1, player2 } of createdGames) {
// 获取选手的天梯用户信息包含user_id
const [ladder1, ladder2] = await Promise.all([
LadderUser.findByPk(player1.ladder_user_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }]
}),
LadderUser.findByPk(player2.ladder_user_id, {
include: [{ model: User, as: 'user', attributes: ['id', 'nickname', 'avatar'] }]
})
]);
// 通知选手1
if (ladder1 && ladder1.user_id) {
sendMatchNotification(ladder1.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder2?.id,
realName: ladder2?.real_name,
level: ladder2?.level,
powerScore: ladder2?.power_score,
nickname: ladder2?.user?.nickname,
avatar: ladder2?.user?.avatar
}
});
}
// 通知选手2
if (ladder2 && ladder2.user_id) {
sendMatchNotification(ladder2.user_id, {
matchId: match.id,
matchCode: match.match_code,
opponent: {
id: ladder1?.id,
realName: ladder1?.real_name,
level: ladder1?.level,
powerScore: ladder1?.power_score,
nickname: ladder1?.user?.nickname,
avatar: ladder1?.user?.avatar
}
});
}
}
} catch (notifyErr) {
console.error('发送淘汰赛匹配通知失败:', notifyErr);
// 通知失败不影响主流程,只记录错误
}
res.json(success(null, '淘汰赛已开始')); res.json(success(null, '淘汰赛已开始'));
} catch (err) { } catch (err) {
await t.rollback(); await t.rollback();
@ -460,12 +582,6 @@ class MatchController {
loserId = game.player1_id; loserId = game.player1_id;
} }
// 只有胜者可以提交比分
if (myLadderUser.id !== winnerId) {
await t.rollback();
return res.status(400).json(error('败方不能提交比分,请等待胜方提交', 400));
}
await game.update({ await game.update({
player1_score: player1Score, player1_score: player1Score,
player2_score: player2Score, player2_score: player2Score,
@ -478,19 +594,26 @@ class MatchController {
await t.commit(); await t.commit();
// 通知败方确认 // 通知另一方确认(与胜负无关)
const loserLadderUser = await LadderUser.findByPk(loserId); const opponentLadderUserId =
const loserUser = await User.findByPk(loserLadderUser.user_id); String(myLadderUser.id) === String(game.player1_id)
? game.player2_id
: game.player1_id;
const opponentLadderUser = await LadderUser.findByPk(opponentLadderUserId);
const opponentUser =
opponentLadderUser && (await User.findByPk(opponentLadderUser.user_id));
sendScoreConfirmNotification(loserUser.id, { if (opponentUser) {
matchId: match.id, sendScoreConfirmNotification(opponentUser.id, {
gameId: game.id, matchId: match.id,
player1Score, gameId: game.id,
player2Score, player1Score,
submitter: { player2Score,
realName: myLadderUser.real_name submitter: {
} realName: myLadderUser.real_name,
}); },
});
}
res.json(success(null, '比分已提交,等待对方确认')); res.json(success(null, '比分已提交,等待对方确认'));
} catch (err) { } catch (err) {
@ -516,34 +639,63 @@ class MatchController {
return res.status(400).json(error('比赛不存在或状态无效', 400)); return res.status(400).json(error('比赛不存在或状态无效', 400));
} }
// 获取确认者的天梯用户 // 检查是否为裁判
const myLadderUser = await LadderUser.findOne({ const isReferee = game.match.referee_id === user.id;
where: { user_id: user.id, store_id: game.match.store_id, status: 1 }
}); let myLadderUser = null;
if (!myLadderUser) { if (!isReferee) {
await t.rollback(); // 非裁判:必须是参赛者
return res.status(403).json(error('您不是参赛者', 403)); myLadderUser = await LadderUser.findOne({
} where: { user_id: user.id, store_id: game.match.store_id, status: 1 }
});
if (!myLadderUser) {
await t.rollback();
return res.status(403).json(error('您不是参赛者', 403));
}
if (!game.submit_by || !game.winner_id || !game.loser_id || game.status !== 2) { if (!game.submit_by || !game.winner_id || !game.loser_id || game.status !== 2) {
await t.rollback(); await t.rollback();
return res.status(400).json(error('请等待对方提交比分', 400)); return res.status(400).json(error('请等待对方提交比分', 400));
} }
if (game.match.type === MATCH_TYPES.RANKING) { // 任意一方提交,另一方确认(挑战赛和排位赛统一逻辑)
if (String(myLadderUser.id) === String(game.submit_by)) { if (String(myLadderUser.id) === String(game.submit_by)) {
await t.rollback(); await t.rollback();
return res.status(403).json(error('提交者不能确认比分', 403)); return res.status(403).json(error('提交者不能确认比分', 403));
} }
if (String(myLadderUser.id) !== String(game.player1_id) && String(myLadderUser.id) !== String(game.player2_id)) { if (
String(myLadderUser.id) !== String(game.player1_id) &&
String(myLadderUser.id) !== String(game.player2_id)
) {
await t.rollback(); await t.rollback();
return res.status(403).json(error('您不是参赛者', 403)); return res.status(403).json(error('您不是参赛者', 403));
} }
} else { } else {
// 败方确认(挑战赛保持原逻辑) // 裁判:可以直接确认,但需要确保有比分
if (String(myLadderUser.id) !== String(game.loser_id)) { if (!game.player1_score && game.player1_score !== 0 || !game.player2_score && game.player2_score !== 0) {
await t.rollback(); await t.rollback();
return res.status(403).json(error('只有败方可以确认比分', 403)); return res.status(400).json(error('请先填写比分', 400));
}
// 如果没有提交者,裁判确认时自动设置提交者为裁判
if (!game.submit_by) {
const refereeLadderUser = await LadderUser.findOne({
where: { user_id: user.id, store_id: game.match.store_id, status: 1 },
transaction: t
});
if (refereeLadderUser) {
await game.update({
submit_by: refereeLadderUser.id,
status: 2
}, { transaction: t });
// 计算胜者和败者
const winnerId = game.player1_score > game.player2_score ? game.player1_id : game.player2_id;
const loserId = game.player1_score > game.player2_score ? game.player2_id : game.player1_id;
await game.update({
winner_id: winnerId,
loser_id: loserId
}, { transaction: t });
await game.reload({ transaction: t });
}
} }
} }
@ -574,12 +726,18 @@ class MatchController {
); );
// 更新游戏记录 // 更新游戏记录
const confirmedById = isReferee ? (await LadderUser.findOne({
where: { user_id: user.id, store_id: game.match.store_id, status: 1 },
transaction: t
}))?.id : myLadderUser.id;
await game.update({ await game.update({
confirm_status: CONFIRM_STATUS.CONFIRMED, confirm_status: CONFIRM_STATUS.CONFIRMED,
confirmed_by: myLadderUser.id, confirmed_by: confirmedById,
confirmed_at: new Date(), confirmed_at: new Date(),
winner_power_change: winnerChange, winner_power_change: winnerChange,
loser_power_change: loserChange loser_power_change: loserChange,
status: 2 // 已结束
}, { transaction: t }); }, { transaction: t });
// 更新胜者战力值和统计 // 更新胜者战力值和统计
@ -604,6 +762,27 @@ class MatchController {
last_match_time: new Date() last_match_time: new Date()
}, { transaction: t }); }, { transaction: t });
// 更新 MatchPlayer 的胜负记录(排位赛)
if (game.match.type === MATCH_TYPES.RANKING) {
// 更新胜者的 MatchPlayer 记录
await MatchPlayer.increment('win_count', {
where: {
match_id: game.match.id,
ladder_user_id: game.winner_id
},
transaction: t
});
// 更新败者的 MatchPlayer 记录
await MatchPlayer.increment('lose_count', {
where: {
match_id: game.match.id,
ladder_user_id: game.loser_id
},
transaction: t
});
}
// 更新比赛状态 // 更新比赛状态
if (game.match.type === MATCH_TYPES.CHALLENGE) { if (game.match.type === MATCH_TYPES.CHALLENGE) {
await game.match.update({ await game.match.update({
@ -730,10 +909,24 @@ class MatchController {
{ {
model: MatchPlayer, model: MatchPlayer,
as: 'players', as: 'players',
include: [{ model: LadderUser, as: 'ladderUser', include: [{ model: User, as: 'user' }] }] required: false,
include: [{ model: LadderUser, as: 'ladderUser', required: false, include: [{ model: User, as: 'user', required: false }] }]
}, },
{ model: MatchRound, as: 'rounds', include: [{ model: MatchGame, as: 'games' }] }, {
{ model: Store, as: 'store' } model: MatchRound,
as: 'rounds',
required: false,
include: [{
model: MatchGame,
as: 'games',
required: false
}]
},
{ model: Store, as: 'store', required: false }
],
order: [
[{ model: MatchRound, as: 'rounds' }, 'round_number', 'ASC'],
[{ model: MatchRound, as: 'rounds' }, { model: MatchGame, as: 'games' }, 'id', 'ASC']
] ]
}); });
@ -744,6 +937,56 @@ class MatchController {
const stageNames = ['报名中', '循环赛', '淘汰赛', '已结束']; const stageNames = ['报名中', '循环赛', '淘汰赛', '已结束'];
const statusNames = ['待开始', '进行中', '已结束', '已取消']; const statusNames = ['待开始', '进行中', '已结束', '已取消'];
const user = req.user;
const isReferee = match.referee_id === user.id;
// 构建选手映射表,便于快速查找
const playersMap = new Map();
(match.players || []).forEach(p => {
if (p.ladder_user_id) {
playersMap.set(p.ladder_user_id, {
id: p.id,
ladderUserId: p.ladder_user_id,
realName: p.ladderUser?.real_name || `选手${p.ladder_user_id}`,
nickname: p.ladderUser?.user?.nickname,
avatar: p.ladderUser?.user?.avatar,
level: p.ladderUser?.level
});
}
});
// 确保 rounds 和 games 数组存在,并为每个 game 添加选手名称
const rounds = (match.rounds || []).map(r => ({
id: r.id,
roundNumber: r.round_number,
roundType: r.round_type,
roundName: r.round_name,
status: r.status,
games: (r.games || []).map(g => {
const player1 = playersMap.get(g.player1_id);
const player2 = playersMap.get(g.player2_id);
return {
id: g.id,
player1Id: g.player1_id,
player2Id: g.player2_id,
player1Name: player1?.realName || `选手${g.player1_id}`,
player2Name: player2?.realName || `选手${g.player2_id}`,
player1Score: g.player1_score,
player2Score: g.player2_score,
winnerId: g.winner_id,
confirmStatus: g.confirm_status,
status: g.status
};
})
}));
// 调试日志
console.log(`[getRankingDetail] 比赛 ${matchCode}: rounds数量=${rounds.length}, 总对局数=${rounds.reduce((sum, r) => sum + (r.games?.length || 0), 0)}`);
if (rounds.length > 0 && rounds[0].games.length > 0) {
console.log(`[getRankingDetail] 示例对局:`, rounds[0].games[0]);
}
res.json(success({ res.json(success({
id: match.id, id: match.id,
matchCode: match.match_code, matchCode: match.match_code,
@ -755,7 +998,9 @@ class MatchController {
weight: match.weight, weight: match.weight,
storeName: match.store?.name, storeName: match.store?.name,
startTime: match.start_time, startTime: match.start_time,
players: match.players.map(p => ({ refereeId: match.referee_id,
isReferee: isReferee,
players: (match.players || []).map(p => ({
id: p.id, id: p.id,
ladderUserId: p.ladder_user_id, ladderUserId: p.ladder_user_id,
realName: p.ladderUser?.real_name, realName: p.ladderUser?.real_name,
@ -768,23 +1013,7 @@ class MatchController {
rank: p.rank, rank: p.rank,
status: p.player_status status: p.player_status
})), })),
rounds: match.rounds.map(r => ({ rounds: rounds
id: r.id,
roundNumber: r.round_number,
roundType: r.round_type,
roundName: r.round_name,
status: r.status,
games: r.games.map(g => ({
id: g.id,
player1Id: g.player1_id,
player2Id: g.player2_id,
player1Score: g.player1_score,
player2Score: g.player2_score,
winnerId: g.winner_id,
confirmStatus: g.confirm_status,
status: g.status
}))
}))
})); }));
} catch (err) { } catch (err) {
console.error('获取排位赛详情失败:', err); console.error('获取排位赛详情失败:', err);
@ -809,24 +1038,41 @@ class MatchController {
return res.status(404).json(error('比赛不存在', 404)); return res.status(404).json(error('比赛不存在', 404));
} }
const ladderUser = await LadderUser.findOne({ // 检查是否为裁判
where: { user_id: user.id, store_id: match.store_id, status: 1 }, const isReferee = match.referee_id === user.id;
transaction: t
}); let ladderUser = null;
let player = null;
if (!isReferee) {
// 非裁判:必须是参赛者
ladderUser = await LadderUser.findOne({
where: { user_id: user.id, store_id: match.store_id, status: 1 },
transaction: t
});
if (!ladderUser) { if (!ladderUser) {
await t.rollback(); await t.rollback();
return res.status(400).json(error('您不是参赛者', 400)); return res.status(400).json(error('您不是参赛者', 400));
} }
const player = await MatchPlayer.findOne({ player = await MatchPlayer.findOne({
where: { match_id: match.id, ladder_user_id: ladderUser.id }, where: { match_id: match.id, ladder_user_id: ladderUser.id },
transaction: t transaction: t
}); });
if (!player) { if (!player) {
await t.rollback(); await t.rollback();
return res.status(400).json(error('您不是参赛者', 400)); return res.status(400).json(error('您不是参赛者', 400));
}
} else {
// 裁判:返回所有未确认的对局,不限制为当前对局
await t.commit();
return res.json(success({
status: 'referee',
currentGame: null,
isReferee: true
}));
} }
const findCurrentGame = async () => MatchGame.findOne({ const findCurrentGame = async () => MatchGame.findOne({
@ -836,7 +1082,8 @@ class MatchController {
{ player1_id: ladderUser.id }, { player1_id: ladderUser.id },
{ player2_id: ladderUser.id } { player2_id: ladderUser.id }
], ],
status: { [Op.in]: [1, 2] }, // 循环赛和淘汰赛都需要看到“已生成但尚未开始”的对局,因此包含 status=0/1/2
status: { [Op.in]: [0, 1, 2] },
// 已确认的对局不应再作为“当前对局”返回,否则前端会一直显示“待确认” // 已确认的对局不应再作为“当前对局”返回,否则前端会一直显示“待确认”
confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED } confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED }
}, },
@ -845,14 +1092,26 @@ class MatchController {
transaction: t transaction: t
}); });
let currentGame = await findCurrentGame(); // 如果用户状态是 'waiting',说明还没有匹配到对手,不应该返回任何对局信息
if (player.player_status === 'waiting') {
// 如果当前没有对局且我处于等待状态,尝试触发一次自动匹配 // 尝试触发一次自动匹配
if (!currentGame && player.player_status === 'waiting') {
await matchAdminController._autoMatchPlayers(match.id, t); await matchAdminController._autoMatchPlayers(match.id, t);
currentGame = await findCurrentGame(); // 重新查询玩家状态(匹配后可能变为 'playing'
await player.reload({ transaction: t });
// 如果匹配后状态仍然是 'waiting',说明没有匹配成功,返回 null
if (player.player_status === 'waiting') {
await t.commit();
return res.json(success({
status: player.player_status,
currentGame: null
}));
}
} }
// 只有状态是 'playing' 时才查询当前对局
let currentGame = await findCurrentGame();
if (!currentGame) { if (!currentGame) {
await t.commit(); await t.commit();
return res.json(success({ return res.json(success({
@ -931,7 +1190,9 @@ class MatchController {
const game = await MatchGame.findOne({ const game = await MatchGame.findOne({
where: { where: {
match_id: match.id, match_id: match.id,
status: 1, // 循环赛与淘汰赛都可能存在“已生成但未开始”的对局status=0
// 这里允许在 status=0 或 1 时提交比分
status: { [Op.in]: [0, 1] },
[Op.or]: [ [Op.or]: [
{ player1_id: myLadderUser.id }, { player1_id: myLadderUser.id },
{ player2_id: myLadderUser.id } { player2_id: myLadderUser.id }
@ -993,11 +1254,16 @@ class MatchController {
await t.commit(); await t.commit();
const loserLadderUser = await LadderUser.findByPk(loserId); // 通知另一方确认(与胜负无关)
if (loserLadderUser) { const opponentLadderUserId =
const loserUser = await User.findByPk(loserLadderUser.user_id); String(myLadderUser.id) === String(game.player1_id)
if (loserUser) { ? game.player2_id
sendScoreConfirmNotification(loserUser.id, { : game.player1_id;
const opponentLadderUser = await LadderUser.findByPk(opponentLadderUserId);
if (opponentLadderUser) {
const opponentUser = await User.findByPk(opponentLadderUser.user_id);
if (opponentUser) {
sendScoreConfirmNotification(opponentUser.id, {
matchId: match.id, matchId: match.id,
gameId: game.id, gameId: game.id,
player1Score, player1Score,
@ -1277,7 +1543,7 @@ class MatchController {
if (player) { if (player) {
myStatus = player.player_status; myStatus = player.player_status;
// 获取当前对局 // 获取当前对局(循环赛 + 淘汰赛)
const game = await MatchGame.findOne({ const game = await MatchGame.findOne({
where: { where: {
match_id: match.id, match_id: match.id,
@ -1285,7 +1551,10 @@ class MatchController {
{ player1_id: ladderUser.id }, { player1_id: ladderUser.id },
{ player2_id: ladderUser.id } { player2_id: ladderUser.id }
], ],
status: { [Op.in]: [1, 2] } // 包含 status=0已生成但未开始方便淘汰赛在还没开打时也能看到对手
status: { [Op.in]: [0, 1, 2] },
// 已确认的对局不应再作为“当前对局”显示,否则会出现对手信息不同步的问题
confirm_status: { [Op.ne]: CONFIRM_STATUS.CONFIRMED }
}, },
order: [['status', 'DESC'], ['updated_at', 'DESC'], ['id', 'DESC']] order: [['status', 'DESC'], ['updated_at', 'DESC'], ['id', 'DESC']]
}); });
@ -1314,6 +1583,9 @@ class MatchController {
confirmStatus: game.confirm_status, confirmStatus: game.confirm_status,
gameStatus: game.status gameStatus: game.status
}; };
} else {
// 如果没有当前对局(例如上一局已确认且新一局尚未开始),保持 opponent 为 null
currentGame = null;
} }
} }
} }
@ -1432,11 +1704,15 @@ class MatchController {
return res.json(success([])); return res.json(success([]));
} }
// 查找需要我确认的比赛(我是败方 // 查找需要我确认的比赛(对方已提交,我尚未确认
const pendingGames = await MatchGame.findAll({ const pendingGames = await MatchGame.findAll({
where: { where: {
loser_id: ladderUser.id, confirm_status: CONFIRM_STATUS.PENDING,
confirm_status: CONFIRM_STATUS.PENDING submit_by: { [Op.ne]: ladderUser.id },
[Op.or]: [
{ player1_id: ladderUser.id },
{ player2_id: ladderUser.id }
]
}, },
include: [ include: [
{ model: Match, as: 'match' } { model: Match, as: 'match' }
@ -1445,13 +1721,15 @@ class MatchController {
}); });
const list = await Promise.all(pendingGames.map(async game => { const list = await Promise.all(pendingGames.map(async game => {
const winner = await LadderUser.findByPk(game.winner_id); // 对手是“不是我”的那一方
const opponentId = game.player1_id === ladderUser.id ? game.player2_id : game.player1_id;
const opponent = await LadderUser.findByPk(opponentId);
return { return {
id: game.id, id: game.id,
matchId: game.match_id, matchId: game.match_id,
matchName: game.match?.name, matchName: game.match?.name,
matchType: game.match?.type, matchType: game.match?.type,
opponentName: winner?.real_name, opponentName: opponent?.real_name,
myScore: game.player1_id === ladderUser.id ? game.player1_score : game.player2_score, myScore: game.player1_id === ladderUser.id ? game.player1_score : game.player2_score,
opponentScore: game.player1_id === ladderUser.id ? game.player2_score : game.player1_score, opponentScore: game.player1_id === ladderUser.id ? game.player2_score : game.player1_score,
createdAt: game.created_at createdAt: game.created_at

View File

@ -16,6 +16,7 @@ const {
const PowerCalculator = require("../services/powerCalculator"); const PowerCalculator = require("../services/powerCalculator");
const { Op } = require("sequelize"); const { Op } = require("sequelize");
const sequelize = require("../config/database"); const sequelize = require("../config/database");
const { sendToUser } = require("../websocket");
class PointsAdminController { class PointsAdminController {
// === 积分行为管理 === // === 积分行为管理 ===
@ -492,6 +493,19 @@ class PointsAdminController {
verified_by: admin.id, verified_by: admin.id,
}); });
// 通过 WebSocket 通知用户订单已核销
if (order.user_id) {
sendToUser(order.user_id, {
type: "points_order_verified",
data: {
orderId: order.id,
orderNo: order.order_no,
status: order.status,
verifiedAt: order.verified_at,
},
});
}
res.json(success(null, "核销成功")); res.json(success(null, "核销成功"));
} catch (err) { } catch (err) {
console.error("核销订单失败:", err); console.error("核销订单失败:", err);
@ -534,6 +548,19 @@ class PointsAdminController {
verified_by: admin.id, verified_by: admin.id,
}); });
// 通过 WebSocket 通知用户订单已核销
if (order.user_id) {
sendToUser(order.user_id, {
type: "points_order_verified",
data: {
orderId: order.id,
orderNo: order.order_no,
status: order.status,
verifiedAt: order.verified_at,
},
});
}
res.json( res.json(
success( success(
{ {

View File

@ -46,6 +46,7 @@ router.put('/matches/:id', authAdmin, matchAdminController.update);
router.post('/matches/:id/start', authAdmin, matchAdminController.startMatch); router.post('/matches/:id/start', authAdmin, matchAdminController.startMatch);
router.post('/matches/:id/start-elimination', authAdmin, matchAdminController.startElimination); router.post('/matches/:id/start-elimination', authAdmin, matchAdminController.startElimination);
router.post('/matches/:id/end', authAdmin, matchAdminController.endMatch); router.post('/matches/:id/end', authAdmin, matchAdminController.endMatch);
router.post('/matches/:id/trigger-match', authAdmin, matchAdminController.triggerMatch);
router.post('/matches/:id/players', authAdmin, matchAdminController.addPlayer); router.post('/matches/:id/players', authAdmin, matchAdminController.addPlayer);
router.delete('/matches/:id/players/:playerId', authAdmin, matchAdminController.removePlayer); router.delete('/matches/:id/players/:playerId', authAdmin, matchAdminController.removePlayer);
router.put('/matches/:matchId/games/:gameId', authAdmin, matchAdminController.updateGameResult); router.put('/matches/:matchId/games/:gameId', authAdmin, matchAdminController.updateGameResult);