feat: 房型管理接口对接

This commit is contained in:
duanshuwen
2026-03-07 15:58:48 +08:00
parent 20e825215f
commit 03b85cffb0
12 changed files with 357 additions and 350 deletions

85
package-lock.json generated
View File

@@ -686,6 +686,7 @@
"integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"chalk": "^4.1.1",
"fs-extra": "^9.0.1",
@@ -1535,7 +1536,6 @@
"integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
},
@@ -1555,7 +1555,6 @@
"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
@@ -1566,7 +1565,6 @@
"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
@@ -1591,7 +1589,6 @@
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -1608,8 +1605,7 @@
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/@eslint/js": {
"version": "8.57.1",
@@ -1617,7 +1613,6 @@
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
@@ -1668,7 +1663,6 @@
"deprecated": "Use @eslint/config-array instead",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
@@ -1684,7 +1678,6 @@
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"engines": {
"node": ">=12.22"
},
@@ -1699,8 +1692,7 @@
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"deprecated": "Use @eslint/object-schema instead",
"dev": true,
"license": "BSD-3-Clause",
"peer": true
"license": "BSD-3-Clause"
},
"node_modules/@iconify-json/material-symbols": {
"version": "1.2.50",
@@ -1893,6 +1885,7 @@
"integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@inquirer/checkbox": "^3.0.1",
"@inquirer/confirm": "^4.0.1",
@@ -3157,6 +3150,7 @@
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/lodash": "*"
}
@@ -3176,6 +3170,7 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz",
"integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==",
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -3325,8 +3320,7 @@
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"dev": true,
"license": "ISC",
"peer": true
"license": "ISC"
},
"node_modules/@vitejs/plugin-vue": {
"version": "6.0.3",
@@ -3386,6 +3380,7 @@
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz",
"integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/parser": "^7.28.5",
"@vue/compiler-core": "3.5.25",
@@ -3475,6 +3470,7 @@
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.1.0.tgz",
"integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/web-bluetooth": "^0.0.21",
"@vueuse/metadata": "14.1.0",
@@ -3712,6 +3708,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3738,7 +3735,6 @@
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"license": "MIT",
"peer": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -3801,6 +3797,7 @@
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -4092,6 +4089,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -4816,8 +4814,7 @@
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/defaults": {
"version": "1.0.4",
@@ -4952,7 +4949,6 @@
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"esutils": "^2.0.2"
},
@@ -6081,7 +6077,6 @@
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -6099,7 +6094,6 @@
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@@ -6117,7 +6111,6 @@
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=4.0"
}
@@ -6128,7 +6121,6 @@
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"peer": true,
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -6141,8 +6133,7 @@
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/esniff": {
"version": "2.0.1",
@@ -6166,7 +6157,6 @@
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
@@ -6185,7 +6175,6 @@
"integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -6199,7 +6188,6 @@
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=4.0"
}
@@ -6253,7 +6241,6 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -6493,8 +6480,7 @@
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
@@ -6564,7 +6550,6 @@
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"flat-cache": "^3.0.4"
},
@@ -6636,7 +6621,6 @@
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
@@ -6996,7 +6980,6 @@
"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"type-fest": "^0.20.2"
},
@@ -7013,7 +6996,6 @@
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"peer": true,
"engines": {
"node": ">=10"
},
@@ -7109,8 +7091,7 @@
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/has-flag": {
"version": "4.0.0",
@@ -7487,7 +7468,6 @@
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=8"
}
@@ -7679,8 +7659,7 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/json-stringify-safe": {
"version": "5.0.1",
@@ -7729,7 +7708,6 @@
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -8161,13 +8139,15 @@
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash-unified": {
"version": "1.0.3",
@@ -8193,8 +8173,7 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/log-symbols": {
"version": "4.1.0",
@@ -8827,8 +8806,7 @@
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/negotiator": {
"version": "0.6.4",
@@ -9351,7 +9329,6 @@
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -9888,7 +9865,6 @@
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.8.0"
}
@@ -9899,6 +9875,7 @@
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -9973,7 +9950,6 @@
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6"
}
@@ -11038,7 +11014,6 @@
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=8"
},
@@ -11164,7 +11139,8 @@
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz",
"integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==",
"dev": true,
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/tapable": {
"version": "2.3.0",
@@ -11318,8 +11294,7 @@
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/timers-ext": {
"version": "0.1.8",
@@ -11535,7 +11510,6 @@
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -11561,6 +11535,7 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -11766,7 +11741,6 @@
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"punycode": "^2.1.0"
}
@@ -11828,6 +11802,7 @@
"integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
@@ -11902,6 +11877,7 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
"integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.25",
"@vue/compiler-sfc": "3.5.25",
@@ -12028,6 +12004,7 @@
"integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",

View File

@@ -6,3 +6,4 @@ export * from './code';
export * from './oauth2';
export * from './pcUser';
export * from './configChannel';
export * from './typeMapping';

View File

@@ -0,0 +1,95 @@
/* eslint-disable */
// @ts-ignore
import request from '@utils/request';
import * as API from './types';
/** 新增房型映射 新增房型映射新增房型映射 POST /hotelStaff/typeMapping/add */
export function hotelStaffTypeMappingAddUsingPost({
body,
options,
}: {
body: API.RoomTypeMapping;
options?: { [key: string]: unknown };
}) {
return request<API.RBoolean>('/hotelStaff/typeMapping/add', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 获取房型映射详细信息 获取房型映射详细信息获取房型映射详细信息 POST /hotelStaff/typeMapping/getInfo */
export function hotelStaffTypeMappingGetInfoUsingPost({
body,
options,
}: {
body: API.RoomTypeMapping;
options?: { [key: string]: unknown };
}) {
return request<API.RRoomTypeMapping>('/hotelStaff/typeMapping/getInfo', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 查询房型映射列表 查询房型映射列表查询房型映射列表 POST /hotelStaff/typeMapping/pageList */
export function hotelStaffTypeMappingPageListUsingPost({
body,
options,
}: {
body: API.RoomTypeMapping;
options?: { [key: string]: unknown };
}) {
return request<API.RPageRoomTypeMapping>('/hotelStaff/typeMapping/pageList', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 删除房型映射 删除房型映射删除房型映射 POST /hotelStaff/typeMapping/remove */
export function hotelStaffTypeMappingRemoveUsingPost({
body,
options,
}: {
body: API.RoomTypeMapping;
options?: { [key: string]: unknown };
}) {
return request<API.RBoolean>('/hotelStaff/typeMapping/remove', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 修改房型映射 修改房型映射修改房型映射 POST /hotelStaff/typeMapping/update */
export function hotelStaffTypeMappingUpdateUsingPost({
body,
options,
}: {
body: API.RoomTypeMapping;
options?: { [key: string]: unknown };
}) {
return request<API.RBoolean>('/hotelStaff/typeMapping/update', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@@ -40,6 +40,44 @@ export type HotelStaffPcUserUpdatePasswordUsingPostResponses = {
200: RBoolean;
};
export type HotelStaffTypeMappingAddUsingPostResponses = {
200: RBoolean;
};
export type HotelStaffTypeMappingGetInfoUsingPostResponses = {
200: RRoomTypeMapping;
};
export type HotelStaffTypeMappingPageListUsingPostResponses = {
200: RPageRoomTypeMapping;
};
export type HotelStaffTypeMappingRemoveUsingPostResponses = {
200: RBoolean;
};
export type HotelStaffTypeMappingUpdateUsingPostResponses = {
200: RBoolean;
};
export type OrderItem = {
column?: string;
asc?: boolean;
};
export type PageRoomTypeMapping = {
records?: RoomTypeMapping[];
total?: number;
size?: number;
current?: number;
orders?: OrderItem[];
optimizeCountSql?: boolean;
searchCount?: boolean;
optimizeJoinOfCountSql?: boolean;
maxLimit?: number;
countId?: string;
};
export type PcConfig = {
/** 创建者创建人 */
createBy?: string;
@@ -110,6 +148,51 @@ export type RListPcConfigChannel = {
data?: PcConfigChannel[];
};
export type RoomTypeMapping = {
/** 创建者创建人 */
createBy?: string;
/** 创建时间 */
createTime?: string;
/** 更新者更新人 */
updateBy?: string;
/** 更新时间 */
updateTime?: string;
/** 主键 */
id?: string;
/** pms名称 */
pmsName?: string;
/** 携程渠道名称 */
xcName?: string;
/** 飞猪渠道名称 */
fzName?: string;
/** 美团渠道名称 */
mtName?: string;
/** 抖音酒店渠道名称 */
dyHotelName?: string;
/** 抖音温泉渠道名称 */
dyHotSrpingName?: string;
/** 配置信息id */
pcConfigId?: string;
/** 删除标志 true/false 删除/未删除 */
delFlag?: number;
/** 分页数量 */
size?: number;
/** 分页标识 从1开始 */
current?: number;
};
export type RPageRoomTypeMapping = {
code?: number;
msg?: string;
data?: PageRoomTypeMapping;
};
export type RRoomTypeMapping = {
code?: number;
msg?: string;
data?: RoomTypeMapping;
};
export type UpdatePasswordForm = {
/** 旧密码 */
oldPassword?: string;

View File

@@ -83,11 +83,11 @@ import ChatAttach from './components/ChatAttach.vue';
import ChatInputArea from './components/ChatInputArea.vue';
import TaskCenter from './TaskCenter.vue';
import { Session } from '../../utils/storage';
import { Session } from '@utils/storage';
import userAvatar from '@assets/images/login/user_icon.png';
import aiAvatar from '@assets/images/login/blue_logo.png';
import { createConversation, conversationMessageList } from '../../api/ConversationApi';
import { createConversation, conversationMessageList } from '@api/ConversationApi';
import { ElMessage, ElLoading } from 'element-plus'
// 支持外部通过 prop 控制是否为引导页

View File

@@ -1,14 +1,6 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-30 12:08:51
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2026-01-04 10:30:54
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/components/EventManager/addDialog.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<el-dialog v-model="model" title="上传图片" :width="width" :before-close="handleClose" :close-on-click-modal="false"
:close-on-press-escape="false">
:close-on-press-escape="false" append-to-body>
<div class="flex justify-center">
<div class="w-[500px] mt-[20px]">
<el-steps style="max-width: 500px" :active="activeIndex" simple finish-status="success">
@@ -39,7 +31,9 @@
</el-alert>
<div v-for="(item, index) in picList" :key="index"
class="rounded-[12px] border border-[#E5E8EE] p-[16px] mt-[16px] relative">
<div class="absolute right-[0px] top-[0px] w-[28px] h-[28px] text-center bg-[rgba(0,0,0,0.5)] cursor-pointer z-10" style="border-radius: 0px 8px 0 8px;" @click="picList.splice(index, 1)">
<div
class="absolute right-[0px] top-[0px] w-[28px] h-[28px] text-center bg-[rgba(0,0,0,0.5)] cursor-pointer z-10"
style="border-radius: 0px 8px 0 8px;" @click="picList.splice(index, 1)">
<component :is="RiDeleteBinLine" color="#FFFFFF" class="w-[12px] h-[12px] ml-[7px] mt-[7px]" />
</div>
<div class="flex">
@@ -131,15 +125,20 @@ onMounted(() => {
:deep(.el-step__head.is-process .el-step__icon.is-text) {
border-color: #2B7FFF;
}
:deep(.el-step__head.is-success) {
color: #1FC16B;
}
:deep(.el-step__head.is-success .el-step__icon.is-text) {
background: #1FC16B;
}:deep(.el-step__head.is-success .el-step__icon.is-text) {
}
:deep(.el-step__head.is-success .el-step__icon.is-text) {
border-color: #1FC16B;
color: #ffffff;
}
:deep(.el-step__title.is-success) {
font-weight: 500;
font-size: 14px;

View File

@@ -1,14 +1,6 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-30 12:08:51
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2026-01-03 22:00:09
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/components/EventManager/addDialog.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<el-dialog v-model="model" title="添加事件" width="500" :before-close="handleClose" :close-on-click-modal="false"
:close-on-press-escape="false">
<el-dialog v-model="visible" title="添加事件" width="500" :before-close="handleClose" :close-on-click-modal="false"
:close-on-press-escape="false" append-to-body>
<div class="p-[20px]">
<el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" :rules="rules" label-position="top"
label-width="auto">
@@ -32,7 +24,7 @@
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="model = false">取消</el-button>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)">
确认
</el-button>
@@ -40,11 +32,12 @@
</template>
</el-dialog>
</template>
<script setup lang="ts">
import type { FormInstance } from 'element-plus';
import { ref, reactive, defineModel } from 'vue';
import { ref, reactive } from 'vue';
const model = defineModel({ type: Boolean, default: false })
const visible = ref(false)
interface RuleForm {
name: string
@@ -73,7 +66,7 @@ const ruleForm = reactive<RuleForm>({
// const dialogVisible = ref(false);
const handleClose = (done: () => void) => {
done();
model.value = false;
visible.value = false;
// dialogVisible.value = false;
}
const submitForm = async (formEl: FormInstance | undefined) => {

View File

@@ -1,16 +1,10 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-22 01:11:57
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2026-01-04 10:43:47
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/components/EventManagement/index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div>
<el-row class="mb-[20px]">
<el-button class="button" type="primary" :icon="Plus" @click="dialogVisible = true">添加事件</el-button>
<div class="zn-table mt-[20px]">
<el-table :data="tableData" class="zn-table" style="width: 100%" show-overflow-tooltip>
</el-row>
<el-table :data="tableData" show-overflow-tooltip border>
<el-table-column prop="date" label="事件名称" width="180" align="center" />
<el-table-column prop="name" label="事件描述" width="180" align="center" />
<el-table-column prop="address" label="生效时间" align="center" />
@@ -32,12 +26,12 @@
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 添加事件弹窗 -->
<AddDialog v-model="dialogVisible" />
<!-- 上传图片弹窗 -->
<UploadImage v-model="dialogVisibleUploadImage" width="80%" />
</div>
</template>
<script setup lang="ts">

View File

@@ -1,11 +1,3 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-29 13:45:28
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2026-01-04 10:43:09
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/page.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="bg-white box-border w-full h-full p-[20px]">
<TitleSection @back-to="handleBack" :title="data.date" :desc="data.name">
@@ -23,7 +15,8 @@
<template #content>
<div class="flex">
<span>https://image.baidu.com/search/index</span>
<el-button :icon="DocumentCopy" size="small" text class="ml-[3px] bg-[#000]" @click="copyText('https://image.baidu.com/search/index')" />
<el-button :icon="DocumentCopy" size="small" text class="ml-[3px] bg-[#000]"
@click="copyText('https://image.baidu.com/search/index')" />
</div>
</template>
<component :is="RiInformationLine" color="#99A0AE" class="w-[15px] ml-[11px] cursor-pointer" />
@@ -42,9 +35,10 @@
</div>
</div>
</div>
</div>
<!-- 添加事件弹窗 -->
<UploadImage v-model="dialogVisible" />
</div>
</template>
<script setup lang="ts">
@@ -55,17 +49,19 @@ import { RiInformationLine, RiEditLine, RiDeleteBinLine } from '@remixicon/vue';
import TitleSection from '@renderer/components/TitleSection/index.vue';
import UploadImage from '../../components/EventManager/UploadImage.vue';
interface Props {
data: object;
}
const props = defineProps<Props>();
const props = defineProps({
data: {
type: Object,
default: () => { },
},
});
const emits = defineEmits(["update:change"]);
const emits = defineEmits(["change"]);
const dialogVisible = ref(false);
// 复制文本
const copyText = async (text) => {
const copyText = async (text: string) => {
try {
await navigator.clipboard.writeText(text);
ElMessage({
@@ -81,7 +77,7 @@ const copyText = async (text) => {
};
// 返回上一页
const handleBack = (val) => {
const handleBack = (val: string) => {
emits("change", '返回事件管理');
};
@@ -96,6 +92,7 @@ const handleBack = (val) => {
.event-pic-item:nth-child(4n) {
margin-right: 0;
}
:deep(.el-button.button) {
background: linear-gradient(180deg, #4A8FF9 0%, rgba(0, 0, 0, 0) 100%), #2B7FFF;
box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.05), inset 0px 0px 0px 1px rgba(255, 255, 255, 0.24);

View File

@@ -1,150 +1,71 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-22 01:11:57
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2026-01-04 17:01:44
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/components/EventManagement/index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="mt-[10px]">
<div>
<el-input v-model="input1" style="width: 240px" size="large" placeholder="请输入" :prefix-icon="Search" />
<el-button type="primary" class="ml-[20px]" size="large">搜索</el-button>
</div>
<div class="zn-table mt-[20px]">
<el-table :data="tableData" class="zn-table" style="width: 100%">
<el-table-column prop="pms" label="PMS" align="center" />
<el-table-column prop="xc" label="携程" align="center">
<template #default="scope">
<el-tag v-for="(tag, index) in scope.row.xc" :key="index" type="info" closable :disable-transitions="false"
@close="handleClose(scope.$index, index, 'xc')" class="mb-[10px] mr-[8px]">
{{ tag }}
<el-table :data="tableData" border>
<el-table-column prop="pmsName" label="PMS" align="center" />
<el-table-column prop="xcName" label="携程" align="center">
<template #default="{ row }">
<el-tag v-if="row.xcName" type="info" :disable-transitions="false" class="mb-[10px] mr-[8px]">
{{ row.xcName }}
</el-tag>
<div>
<el-input v-if="tableIndex === scope.$index + 'xc'" ref="InputRef" v-model="inputValue" class="w-20" size="small"
@keyup.enter="handleInputConfirm(scope.$index, 'xc')" @blur="handleInputConfirm(scope.$index, 'xc')" />
<el-button v-else class="button-new-tag" size="small" @click="showInput(scope.$index, 'xc')" :icon="Plus" />
</div>
</template>
</el-table-column>
<el-table-column prop="fz" label="飞猪" align="center">
<template #default="scope">
<el-tag v-for="(tag, index) in scope.row.fz" :key="index" type="info" closable :disable-transitions="false"
@close="handleClose(scope.$index, index, 'fz')" class="mb-[10px] mr-[8px]">
{{ tag }}
<el-table-column prop="fzName" label="飞猪" align="center">
<template #default="{ row }">
<el-tag v-if="row.fzName" type="info" :disable-transitions="false" class="mb-[10px] mr-[8px]">
{{ row.fzName }}
</el-tag>
<div>
<el-input v-if="tableIndex === scope.$index + 'fz'" ref="InputRef" v-model="inputValue" class="w-20" size="small"
@keyup.enter="handleInputConfirm(scope.$index, 'fz')" @blur="handleInputConfirm(scope.$index, 'fz')" />
<el-button v-else class="button-new-tag" size="small" @click="showInput(scope.$index, 'fz')" :icon="Plus" />
</div>
</template>
</el-table-column>
<el-table-column prop="qne" label="去哪儿" align="center">
<template #default="scope">
<el-tag v-for="(tag, index) in scope.row.qne" :key="index" type="info" closable :disable-transitions="false"
@close="handleClose(scope.$index, index, 'qne')" class="mb-[10px] mr-[8px]">
{{ tag }}
<el-table-column prop="dyHotelName" label="抖音(息烽南山天沐温泉酒店)" align="center">
<template #default="{ row }">
<el-tag v-if="row.dyHotelName" type="info" :disable-transitions="false" class="mb-[10px] mr-[8px]">
{{ row.dyHotelName }}
</el-tag>
<div>
<el-input v-if="tableIndex === scope.$index + 'qne'" ref="InputRef" v-model="inputValue" class="w-20" size="small"
@keyup.enter="handleInputConfirm(scope.$index, 'qne')" @blur="handleInputConfirm(scope.$index, 'qne')" />
<el-button v-else class="button-new-tag" size="small" @click="showInput(scope.$index, 'qne')" :icon="Plus" />
</div>
</template>
</el-table-column>
<el-table-column prop="dy" label="抖音" align="center">
<template #default="scope">
<el-tag v-for="(tag, index) in scope.row.dy" :key="index" type="info" closable :disable-transitions="false"
@close="handleClose(scope.$index, index, 'dy')" class="mb-[10px] mr-[8px]">
{{ tag }}
<el-table-column prop="dyHotSrpingName" label="抖音(息烽南山天沐温泉)" align="center">
<template #default="{ row }">
<el-tag v-if="row.dyHotSrpingName" type="info" :disable-transitions="false" class="mb-[10px] mr-[8px]">
{{ row.dyHotSrpingName }}
</el-tag>
<div>
<el-input v-if="tableIndex === scope.$index + 'dy'" ref="InputRef" v-model="inputValue" class="w-20" size="small"
@keyup.enter="handleInputConfirm(scope.$index, 'dy')" @blur="handleInputConfirm(scope.$index, 'dy')" />
<el-button v-else class="button-new-tag" size="small" @click="showInput(scope.$index, 'dy')" :icon="Plus" />
</div>
</template>
</el-table-column>
<el-table-column prop="mt" label="美团" align="center">
<template #default="scope">
<el-tag v-for="(tag, index) in scope.row.mt" :key="index" type="info" closable :disable-transitions="false"
@close="handleClose(scope.$index, index, 'mt')" class="mb-[10px] mr-[8px]">
{{ tag }}
<el-table-column prop="mtName" label="美团" align="center">
<template #default="{ row }">
<el-tag v-if="row.mtName" type="info" :disable-transitions="false" class="mb-[10px] mr-[8px]">
{{ row.mtName }}
</el-tag>
<div>
<el-input v-if="tableIndex === scope.$index + 'mt'" ref="InputRef" v-model="inputValue" class="w-20" size="small"
@keyup.enter="handleInputConfirm(scope.$index, 'mt')" @blur="handleInputConfirm(scope.$index, 'mt')" />
<el-button v-else class="button-new-tag" size="small" @click="showInput(scope.$index, 'mt')" :icon="Plus" />
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, nextTick } from 'vue';
import { Search, Plus } from '@element-plus/icons-vue';
import type { InputInstance } from 'element-plus';
const input1 = ref('');
import { ref } from 'vue';
import { hotelStaffTypeMappingPageListUsingPost, RoomTypeMapping } from '@api/index';
type TableData = {
pms: string
xc: string[]
fz: string[]
qne: string[]
dy: string[]
mt: string[]
const tableData = ref([]);
// 获取房型列表数据
const queryParams: RoomTypeMapping = ref({
current: 1,
size: 10
})
const getRoomTypeList = async () => {
const res = await hotelStaffTypeMappingPageListUsingPost({ body: queryParams.value });
tableData.value = res.data?.records;
}
const tableData: TableData[] = ref([
{
pms: '大床房',
xc: ['雅致大床房', '标准间'],
mt: ['雅致大床房'],
fz: ['雅致大床房'],
qne: ['雅致大床房'],
dy: ['雅致大床房'],
},
{
pms: '标准间',
xc: ['雅致大床房'],
mt: ['雅致大床房'],
fz: ['雅致大床房'],
qne: ['雅致大床房'],
dy: ['雅致大床房'],
},
]);
const inputValue = ref('');
const InputRef = ref<InputInstance>()
const handleClose = (row: number, index: number, key: string) => {
tableData.value[row][key].splice(index, 1);
};
const tableIndex = ref('');
const showInput = (index: any, key: string) => {
tableIndex.value = index + key;
nextTick(() => {
InputRef.value!.input!.focus();
});
};
const handleInputConfirm = (index: number, key: string) => {
if (inputValue.value) {
tableData.value[index][key].push(inputValue.value);
}
tableIndex.value = '';
inputValue.value = '';
};
getRoomTypeList()
</script>
<style scoped>
:deep(.el-table tr td:nth-of-type(1)) {
background: #EFF6FF !important;
}
:deep(.el-tag) {
background: #FFFFFF !important;
border-radius: 6px !important;

View File

@@ -1,40 +1,42 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-28 16:08:45
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2025-12-30 12:03:50
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<component :is="componentData" @change="handleClick" :data="commData"></component>
<!-- <knowledgePage /> -->
<layout>
<div class="bg-white box-border w-full h-full p-[20px] rounded-[16px]">
<TitleSection title="知识库管理" desc="内容管理" />
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="房型管理" name="roomType">
<RoomTypeManager />
</el-tab-pane>
<el-tab-pane label="事件管理" name="event">
<EventManager />
</el-tab-pane>
</el-tabs>
</div>
</layout>
</template>
<script setup lang="ts" name="Knowledge">
<script setup lang="ts" name="KnowledgePage">
import TitleSection from '@renderer/components/TitleSection/index.vue'
import EventManager from './components/EventManager/index.vue'
import RoomTypeManager from './components/RoomTypeManager/index.vue'
import { ref } from 'vue';
import knowledgePage from './page.vue';
import EventPicList from './components/EventPic/index.vue';
const componentData = ref(knowledgePage);
import type { TabsPaneContext } from 'element-plus';
const commData = ref(null);
const handleClick = (type: string, val: any) => {
console.log(type, val, 11111111);
commData.value = val;
if (type === '查看图片') {
componentData.value = EventPicList;
} else {
componentData.value = knowledgePage;
}
const activeName = ref('roomType');
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event);
};
</script>
<style scoped>
:deep(.el-tabs__item) {
color: #99A0AE;
}
:deep(.el-tabs__item.is-active) {
color: #2B7FFF;
}
:deep(.el-tabs__active-bar) {
background-color: #2B7FFF;
}

View File

@@ -1,55 +0,0 @@
<!--
* @Author: kongbeiwu lishaohua-520@qq.com
* @Date: 2025-12-29 13:45:28
* @LastEditors: kongbeiwu lishaohua-520@qq.com
* @LastEditTime: 2025-12-30 01:48:36
* @FilePath: /project/zn-ai/src/renderer/views/knowledge/page.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<layout>
<div class="bg-white box-border w-full h-full p-[20px]">
<TitleSection title="知识库管理" desc="内容管理" />
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="事件管理" name="first">
<EventManager @change="handleChange" />
</el-tab-pane>
<el-tab-pane label="房型管理" name="second">
<RoomTypeManager />
</el-tab-pane>
</el-tabs>
</div>
</layout>
</template>
<script setup lang="ts" name="KnowledgePage">
import TitleSection from '@renderer/components/TitleSection/index.vue'
import EventManager from './components/EventManager/index.vue'
import RoomTypeManager from './components/RoomTypeManager/index.vue'
import { ref } from 'vue';
import type { TabsPaneContext } from 'element-plus';
const emits = defineEmits(["update:change"]);
const activeName = ref('first');
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event);
};
const handleChange = (type: string, value: any) => {
emits("change", type, value);
};
</script>
<style scoped>
:deep(.el-tabs__item) {
color: #99A0AE;
}
:deep(.el-tabs__item.is-active) {
color: #2B7FFF;
}
:deep(.el-tabs__active-bar) {
background-color: #2B7FFF;
}
</style>