Commit 5beeac2e by York

山西互联网联合辟谣平台 接口调试

parent 6c17a607
......@@ -8,6 +8,7 @@
"name": "emergency-project",
"version": "0.0.0",
"dependencies": {
"axios": "^1.7.9",
"element-plus": "^2.9.1",
"pinia": "^2.3.0",
"swiper": "^11.1.15",
......@@ -1767,6 +1768,11 @@
"resolved": "https://repo.huaweicloud.com/repository/npm/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/autoprefixer": {
"version": "10.4.20",
"resolved": "https://repo.huaweicloud.com/repository/npm/autoprefixer/-/autoprefixer-10.4.20.tgz",
......@@ -1804,6 +1810,16 @@
"postcss": "^8.1.0"
}
},
"node_modules/axios": {
"version": "1.7.9",
"resolved": "https://repo.huaweicloud.com/repository/npm/axios/-/axios-1.7.9.tgz",
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz",
......@@ -1982,6 +1998,17 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://repo.huaweicloud.com/repository/npm/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "4.1.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/commander/-/commander-4.1.1.tgz",
......@@ -2132,6 +2159,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://repo.huaweicloud.com/repository/npm/didyoumean/-/didyoumean-1.2.2.tgz",
......@@ -2356,6 +2391,25 @@
"node": ">=8"
}
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://repo.huaweicloud.com/repository/npm/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/foreground-child": {
"version": "3.3.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/foreground-child/-/foreground-child-3.3.0.tgz",
......@@ -2372,6 +2426,19 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://repo.huaweicloud.com/repository/npm/fraction.js/-/fraction.js-4.3.7.tgz",
......@@ -2897,6 +2964,25 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://repo.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-9.0.5.tgz",
......@@ -3402,6 +3488,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://repo.huaweicloud.com/repository/npm/queue-microtask/-/queue-microtask-1.2.3.tgz",
......
......@@ -10,7 +10,10 @@
"type-check": "vue-tsc --build"
},
"dependencies": {
"axios": "^1.7.9",
"element-plus": "^2.9.1",
"file-saver": "^2.0.5",
"nprogress": "^0.2.0",
"pinia": "^2.3.0",
"swiper": "^11.1.15",
"vue": "^3.5.13",
......
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
axios:
specifier: ^1.7.9
version: 1.7.9
element-plus:
specifier: ^2.9.1
version: 2.9.2(vue@3.5.13(typescript@5.6.3))
file-saver:
specifier: ^2.0.5
version: 2.0.5
nprogress:
specifier: ^0.2.0
version: 0.2.0
pinia:
specifier: ^2.3.0
version: 2.3.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))
swiper:
specifier: ^11.1.15
version: 11.2.0
vue:
specifier: ^3.5.13
version: 3.5.13(typescript@5.6.3)
vue-router:
specifier: ^4.5.0
version: 4.5.0(vue@3.5.13(typescript@5.6.3))
devDependencies:
'@tsconfig/node22':
specifier: ^22.0.0
version: 22.0.0
'@types/node':
specifier: ^22.10.2
version: 22.10.5
'@vitejs/plugin-vue':
specifier: ^5.2.1
version: 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))
'@vue/tsconfig':
specifier: ^0.7.0
version: 0.7.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.49)
npm-run-all2:
specifier: ^7.0.2
version: 7.0.2
postcss:
specifier: ^8.4.49
version: 8.4.49
tailwindcss:
specifier: ^3.4.17
version: 3.4.17
typescript:
specifier: ~5.6.3
version: 5.6.3
vite:
specifier: ^6.0.5
version: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
vite-plugin-vue-devtools:
specifier: ^7.6.8
version: 7.6.8(rollup@4.29.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))
vue-tsc:
specifier: ^2.1.10
version: 2.2.0(typescript@5.6.3)
packages:
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
'@antfu/utils@0.7.10':
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
'@babel/code-frame@7.26.2':
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
'@babel/compat-data@7.26.3':
resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
engines: {node: '>=6.9.0'}
'@babel/core@7.26.0':
resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
engines: {node: '>=6.9.0'}
'@babel/generator@7.26.3':
resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
'@babel/helper-compilation-targets@7.25.9':
resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-create-class-features-plugin@7.25.9':
resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-member-expression-to-functions@7.25.9':
resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-module-imports@7.25.9':
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
'@babel/helper-module-transforms@7.26.0':
resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-optimise-call-expression@7.25.9':
resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-plugin-utils@7.25.9':
resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
engines: {node: '>=6.9.0'}
'@babel/helper-replace-supers@7.25.9':
resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-option@7.25.9':
resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
'@babel/helpers@7.26.0':
resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.26.3':
resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/plugin-proposal-decorators@7.25.9':
resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-syntax-decorators@7.25.9':
resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-syntax-import-attributes@7.26.0':
resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-syntax-import-meta@7.10.4':
resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-syntax-jsx@7.25.9':
resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-syntax-typescript@7.25.9':
resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-typescript@7.26.3':
resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/template@7.25.9':
resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
'@babel/traverse@7.26.4':
resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
engines: {node: '>=6.9.0'}
'@babel/types@7.26.3':
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
'@ctrl/tinycolor@3.6.1':
resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
engines: {node: '>=10'}
'@element-plus/icons-vue@2.3.1':
resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
peerDependencies:
vue: ^3.2.0
'@esbuild/aix-ppc64@0.24.2':
resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.24.2':
resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.24.2':
resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.24.2':
resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.24.2':
resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.24.2':
resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.24.2':
resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.24.2':
resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.24.2':
resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.24.2':
resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.24.2':
resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.24.2':
resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.24.2':
resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.24.2':
resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.24.2':
resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.24.2':
resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.24.2':
resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.24.2':
resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.24.2':
resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.24.2':
resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.24.2':
resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/sunos-x64@0.24.2':
resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.24.2':
resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.24.2':
resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.24.2':
resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@floating-ui/core@1.6.8':
resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
'@floating-ui/dom@1.6.12':
resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
'@floating-ui/utils@0.2.8':
resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
'@jridgewell/set-array@1.2.1':
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
'@nodelib/fs.stat@2.0.5':
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'}
'@nodelib/fs.walk@1.2.8':
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
'@polka/url@1.0.0-next.28':
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
'@rollup/pluginutils@5.1.4':
resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.29.2':
resolution: {integrity: sha512-s/8RiF4bdmGnc/J0N7lHAr5ZFJj+NdJqJ/Hj29K+c4lEdoVlukzvWXB9XpWZCdakVT0YAw8iyIqUP2iFRz5/jA==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.29.2':
resolution: {integrity: sha512-mKRlVj1KsKWyEOwR6nwpmzakq6SgZXW4NUHNWlYSiyncJpuXk7wdLzuKdWsRoR1WLbWsZBKvsUCdCTIAqRn9cA==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.29.2':
resolution: {integrity: sha512-vJX+vennGwygmutk7N333lvQ/yKVAHnGoBS2xMRQgXWW8tvn46YWuTDOpKroSPR9BEW0Gqdga2DHqz8Pwk6X5w==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.29.2':
resolution: {integrity: sha512-e2rW9ng5O6+Mt3ht8fH0ljfjgSCC6ffmOipiLUgAnlK86CHIaiCdHCzHzmTkMj6vEkqAiRJ7ss6Ibn56B+RE5w==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.29.2':
resolution: {integrity: sha512-/xdNwZe+KesG6XJCK043EjEDZTacCtL4yurMZRLESIgHQdvtNyul3iz2Ab03ZJG0pQKbFTu681i+4ETMF9uE/Q==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.29.2':
resolution: {integrity: sha512-eXKvpThGzREuAbc6qxnArHh8l8W4AyTcL8IfEnmx+bcnmaSGgjyAHbzZvHZI2csJ+e0MYddl7DX0X7g3sAuXDQ==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.29.2':
resolution: {integrity: sha512-h4VgxxmzmtXLLYNDaUcQevCmPYX6zSj4SwKuzY7SR5YlnCBYsmvfYORXgiU8axhkFCDtQF3RW5LIXT8B14Qykg==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.29.2':
resolution: {integrity: sha512-EObwZ45eMmWZQ1w4N7qy4+G1lKHm6mcOwDa+P2+61qxWu1PtQJ/lz2CNJ7W3CkfgN0FQ7cBUy2tk6D5yR4KeXw==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.29.2':
resolution: {integrity: sha512-Z7zXVHEXg1elbbYiP/29pPwlJtLeXzjrj4241/kCcECds8Zg9fDfURWbZHRIKrEriAPS8wnVtdl4ZJBvZr325w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.29.2':
resolution: {integrity: sha512-TF4kxkPq+SudS/r4zGPf0G08Bl7+NZcFrUSR3484WwsHgGgJyPQRLCNrQ/R5J6VzxfEeQR9XRpc8m2t7lD6SEQ==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-loongarch64-gnu@4.29.2':
resolution: {integrity: sha512-kO9Fv5zZuyj2zB2af4KA29QF6t7YSxKrY7sxZXfw8koDQj9bx5Tk5RjH+kWKFKok0wLGTi4bG117h31N+TIBEg==}
cpu: [loong64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.29.2':
resolution: {integrity: sha512-gIh776X7UCBaetVJGdjXPFurGsdWwHHinwRnC5JlLADU8Yk0EdS/Y+dMO264OjJFo7MXQ5PX4xVFbxrwK8zLqA==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.29.2':
resolution: {integrity: sha512-YgikssQ5UNq1GoFKZydMEkhKbjlUq7G3h8j6yWXLBF24KyoA5BcMtaOUAXq5sydPmOPEqB6kCyJpyifSpCfQ0w==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.29.2':
resolution: {integrity: sha512-9ouIR2vFWCyL0Z50dfnon5nOrpDdkTG9lNDs7MRaienQKlTyHcDxplmk3IbhFlutpifBSBr2H4rVILwmMLcaMA==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.29.2':
resolution: {integrity: sha512-ckBBNRN/F+NoSUDENDIJ2U9UWmIODgwDB/vEXCPOMcsco1niTkxTXa6D2Y/pvCnpzaidvY2qVxGzLilNs9BSzw==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.29.2':
resolution: {integrity: sha512-jycl1wL4AgM2aBFJFlpll/kGvAjhK8GSbEmFT5v3KC3rP/b5xZ1KQmv0vQQ8Bzb2ieFQ0kZFPRMbre/l3Bu9JA==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.29.2':
resolution: {integrity: sha512-S2V0LlcOiYkNGlRAWZwwUdNgdZBfvsDHW0wYosYFV3c7aKgEVcbonetZXsHv7jRTTX+oY5nDYT4W6B1oUpMNOg==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.29.2':
resolution: {integrity: sha512-pW8kioj9H5f/UujdoX2atFlXNQ9aCfAxFRaa+mhczwcsusm6gGrSo4z0SLvqLF5LwFqFTjiLCCzGkNK/LE0utQ==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.29.2':
resolution: {integrity: sha512-p6fTArexECPf6KnOHvJXRpAEq0ON1CBtzG/EY4zw08kCHk/kivBc5vUEtnCFNCHOpJZ2ne77fxwRLIKD4wuW2Q==}
cpu: [x64]
os: [win32]
'@sec-ant/readable-stream@0.4.1':
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
'@sindresorhus/merge-streams@4.0.0':
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
'@sxzz/popperjs-es@2.11.7':
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
'@tsconfig/node22@22.0.0':
resolution: {integrity: sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==}
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/lodash-es@4.17.12':
resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
'@types/lodash@4.17.14':
resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==}
'@types/node@22.10.5':
resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==}
'@types/web-bluetooth@0.0.16':
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
'@vitejs/plugin-vue@5.2.1':
resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0 || ^6.0.0
vue: ^3.2.25
'@volar/language-core@2.4.11':
resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==}
'@volar/source-map@2.4.11':
resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==}
'@volar/typescript@2.4.11':
resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==}
'@vue/babel-helper-vue-transform-on@1.2.5':
resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
'@vue/babel-plugin-jsx@1.2.5':
resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==}
peerDependencies:
'@babel/core': ^7.0.0-0
peerDependenciesMeta:
'@babel/core':
optional: true
'@vue/babel-plugin-resolve-type@1.2.5':
resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==}
peerDependencies:
'@babel/core': ^7.0.0-0
'@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
'@vue/compiler-dom@3.5.13':
resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
'@vue/compiler-sfc@3.5.13':
resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
'@vue/compiler-ssr@3.5.13':
resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
'@vue/compiler-vue2@2.7.16':
resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
'@vue/devtools-api@6.6.4':
resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
'@vue/devtools-core@7.6.8':
resolution: {integrity: sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==}
peerDependencies:
vue: ^3.0.0
'@vue/devtools-kit@7.6.8':
resolution: {integrity: sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==}
'@vue/devtools-shared@7.6.8':
resolution: {integrity: sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==}
'@vue/language-core@2.2.0':
resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
'@vue/reactivity@3.5.13':
resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
'@vue/runtime-core@3.5.13':
resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
'@vue/runtime-dom@3.5.13':
resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
'@vue/server-renderer@3.5.13':
resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
peerDependencies:
vue: 3.5.13
'@vue/shared@3.5.13':
resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
'@vue/tsconfig@0.7.0':
resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==}
peerDependencies:
typescript: 5.x
vue: ^3.4.0
peerDependenciesMeta:
typescript:
optional: true
vue:
optional: true
'@vueuse/core@9.13.0':
resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
'@vueuse/metadata@9.13.0':
resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
'@vueuse/shared@9.13.0':
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
alien-signals@0.4.12:
resolution: {integrity: sha512-Og0PgAihxlp1R22bsoBsyhhMG4+qhU+fkkLPoGBQkYVc3qt9rYnrwYTf+M6kqUqUZpf3rXDnpL90iKa0QcSVVg==}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-regex@6.1.0:
resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
async-validator@4.2.5:
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
axios@1.7.9:
resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
birpc@0.2.19:
resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
browserslist@4.24.3:
resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
bundle-name@4.1.0:
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
engines: {node: '>=18'}
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
caniuse-lite@1.0.30001690:
resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
copy-anything@3.0.5:
resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
engines: {node: '>=12.13'}
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
dayjs@1.11.13:
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
debug@4.4.0:
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
default-browser-id@5.0.0:
resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
engines: {node: '>=18'}
default-browser@5.2.1:
resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
engines: {node: '>=18'}
define-lazy-prop@3.0.0:
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
engines: {node: '>=12'}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
electron-to-chromium@1.5.76:
resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==}
element-plus@2.9.2:
resolution: {integrity: sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==}
peerDependencies:
vue: ^3.2.0
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
error-stack-parser-es@0.1.5:
resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
esbuild@0.24.2:
resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
engines: {node: '>=18'}
hasBin: true
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
execa@9.5.2:
resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==}
engines: {node: ^18.19.0 || >=20.5.0}
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
fastq@1.18.0:
resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
figures@6.1.0:
resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
engines: {node: '>=18'}
file-saver@2.0.5:
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
follow-redirects@1.15.9:
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
foreground-child@3.3.0:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
form-data@4.0.1:
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
fs-extra@11.2.0:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
get-stream@9.0.1:
resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
engines: {node: '>=18'}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
glob-parent@6.0.2:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
human-signals@8.0.0:
resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==}
engines: {node: '>=18.18.0'}
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
is-docker@3.0.0:
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
hasBin: true
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
is-inside-container@1.0.0:
resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
engines: {node: '>=14.16'}
hasBin: true
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
is-stream@4.0.1:
resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
engines: {node: '>=18'}
is-unicode-supported@2.1.0:
resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
engines: {node: '>=18'}
is-what@4.1.16:
resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
engines: {node: '>=12.13'}
is-wsl@3.1.0:
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
engines: {node: '>=16'}
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
isexe@3.1.1:
resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
engines: {node: '>=16'}
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jiti@1.21.7:
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
hasBin: true
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
jsesc@3.1.0:
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'}
hasBin: true
json-parse-even-better-errors@4.0.0:
resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==}
engines: {node: ^18.17.0 || >=20.5.0}
json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
hasBin: true
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
kolorist@1.8.0:
resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
lodash-unified@1.0.3:
resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
peerDependencies:
'@types/lodash-es': '*'
lodash: '*'
lodash-es: '*'
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
memorystream@0.3.1:
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
engines: {node: '>= 0.10.0'}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
mrmime@2.0.0:
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
engines: {node: '>=10'}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@5.0.9:
resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
engines: {node: ^18 || >=20}
hasBin: true
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
normalize-range@0.1.2:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
normalize-wheel-es@1.2.0:
resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
npm-normalize-package-bin@4.0.0:
resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==}
engines: {node: ^18.17.0 || >=20.5.0}
npm-run-all2@7.0.2:
resolution: {integrity: sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==}
engines: {node: ^18.17.0 || >=20.5.0, npm: '>= 9'}
hasBin: true
npm-run-path@6.0.0:
resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
engines: {node: '>=18'}
nprogress@0.2.0:
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
open@10.1.0:
resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
engines: {node: '>=18'}
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
parse-ms@4.0.0:
resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
engines: {node: '>=18'}
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
path-key@4.0.0:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
engines: {node: '>=12'}
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
path-scurry@1.11.1:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
picomatch@4.0.2:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
hasBin: true
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
pinia@2.3.0:
resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==}
peerDependencies:
typescript: '>=4.4.4'
vue: ^2.7.0 || ^3.5.11
peerDependenciesMeta:
typescript:
optional: true
pirates@4.0.6:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
postcss-js@4.0.1:
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
postcss-load-config@4.0.2:
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
postcss-nested@6.2.0:
resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
postcss@8.4.49:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
pretty-ms@9.2.0:
resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
engines: {node: '>=18'}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
read-package-json-fast@4.0.0:
resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==}
engines: {node: ^18.17.0 || >=20.5.0}
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
resolve@1.22.10:
resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
engines: {node: '>= 0.4'}
hasBin: true
reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
rollup@4.29.2:
resolution: {integrity: sha512-tJXpsEkzsEzyAKIaB3qv3IuvTVcTN7qBw1jL4SPPXM3vzDrJgiLGFY6+HodgFaUHAJ2RYJ94zV5MKRJCoQzQeA==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
run-applescript@7.0.0:
resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
engines: {node: '>=18'}
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
shell-quote@1.8.2:
resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
engines: {node: '>= 0.4'}
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
sirv@3.0.0:
resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
engines: {node: '>=18'}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
string-width@5.1.2:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
strip-ansi@7.1.0:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
strip-final-newline@4.0.0:
resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
engines: {node: '>=18'}
sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
superjson@2.2.2:
resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'}
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
svg-tags@1.0.0:
resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
swiper@11.2.0:
resolution: {integrity: sha512-rjjAKgDEs+grR2eQshVDCcE4KNPC7CI294nfcbV9gE8WCsLdvOYXDeZKUYevqAZZp8j5hE7kpT3dAGVKFBWlxQ==}
engines: {node: '>= 4.7.0'}
tailwindcss@3.4.17:
resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
engines: {node: '>=14.0.0'}
hasBin: true
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
typescript@5.6.3:
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
hasBin: true
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
unicorn-magic@0.3.0:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
engines: {node: '>=18'}
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
update-browserslist-db@1.1.1:
resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
vite-hot-client@0.2.4:
resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==}
peerDependencies:
vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
vite-plugin-inspect@0.8.9:
resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': '*'
vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1
peerDependenciesMeta:
'@nuxt/kit':
optional: true
vite-plugin-vue-devtools@7.6.8:
resolution: {integrity: sha512-32aIps8C1Y7UEoqyWf+ES3J1OozsCYMIqTqd+I5qass+R0Tcf8SaA2bX1/rskAzkcKCteVoBjEENmqwTcMebbw==}
engines: {node: '>=v14.21.3'}
peerDependencies:
vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0
vite-plugin-vue-inspector@5.3.1:
resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==}
peerDependencies:
vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0
vite@6.0.7:
resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
jiti: '>=1.21.0'
less: '*'
lightningcss: ^1.21.0
sass: '*'
sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
jiti:
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
tsx:
optional: true
yaml:
optional: true
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'}
hasBin: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
vue-router@4.5.0:
resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
peerDependencies:
vue: ^3.2.0
vue-tsc@2.2.0:
resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
vue@3.5.13:
resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
which@5.0.0:
resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==}
engines: {node: ^18.17.0 || >=20.5.0}
hasBin: true
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
wrap-ansi@8.1.0:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yaml@2.7.0:
resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
engines: {node: '>= 14'}
hasBin: true
yoctocolors@2.1.1:
resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
engines: {node: '>=18'}
snapshots:
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@antfu/utils@0.7.10': {}
'@babel/code-frame@7.26.2':
dependencies:
'@babel/helper-validator-identifier': 7.25.9
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/compat-data@7.26.3': {}
'@babel/core@7.26.0':
dependencies:
'@ampproject/remapping': 2.3.0
'@babel/code-frame': 7.26.2
'@babel/generator': 7.26.3
'@babel/helper-compilation-targets': 7.25.9
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
'@babel/helpers': 7.26.0
'@babel/parser': 7.26.3
'@babel/template': 7.25.9
'@babel/traverse': 7.26.4
'@babel/types': 7.26.3
convert-source-map: 2.0.0
debug: 4.4.0
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
'@babel/generator@7.26.3':
dependencies:
'@babel/parser': 7.26.3
'@babel/types': 7.26.3
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.3
'@babel/helper-compilation-targets@7.25.9':
dependencies:
'@babel/compat-data': 7.26.3
'@babel/helper-validator-option': 7.25.9
browserslist: 4.24.3
lru-cache: 5.1.1
semver: 6.3.1
'@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-annotate-as-pure': 7.25.9
'@babel/helper-member-expression-to-functions': 7.25.9
'@babel/helper-optimise-call-expression': 7.25.9
'@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
'@babel/helper-skip-transparent-expression-wrappers': 7.25.9
'@babel/traverse': 7.26.4
semver: 6.3.1
transitivePeerDependencies:
- supports-color
'@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
'@babel/traverse': 7.26.4
'@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
'@babel/helper-module-imports@7.25.9':
dependencies:
'@babel/traverse': 7.26.4
'@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
'@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-module-imports': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@babel/traverse': 7.26.4
transitivePeerDependencies:
- supports-color
'@babel/helper-optimise-call-expression@7.25.9':
dependencies:
'@babel/types': 7.26.3
'@babel/helper-plugin-utils@7.25.9': {}
'@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-member-expression-to-functions': 7.25.9
'@babel/helper-optimise-call-expression': 7.25.9
'@babel/traverse': 7.26.4
transitivePeerDependencies:
- supports-color
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
dependencies:
'@babel/traverse': 7.26.4
'@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
'@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/helper-validator-option@7.25.9': {}
'@babel/helpers@7.26.0':
dependencies:
'@babel/template': 7.25.9
'@babel/types': 7.26.3
'@babel/parser@7.26.3':
dependencies:
'@babel/types': 7.26.3
'@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
'@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-annotate-as-pure': 7.25.9
'@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
'@babel/helper-plugin-utils': 7.25.9
'@babel/helper-skip-transparent-expression-wrappers': 7.25.9
'@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
'@babel/template@7.25.9':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/parser': 7.26.3
'@babel/types': 7.26.3
'@babel/traverse@7.26.4':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/generator': 7.26.3
'@babel/parser': 7.26.3
'@babel/template': 7.25.9
'@babel/types': 7.26.3
debug: 4.4.0
globals: 11.12.0
transitivePeerDependencies:
- supports-color
'@babel/types@7.26.3':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@ctrl/tinycolor@3.6.1': {}
'@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.6.3))':
dependencies:
vue: 3.5.13(typescript@5.6.3)
'@esbuild/aix-ppc64@0.24.2':
optional: true
'@esbuild/android-arm64@0.24.2':
optional: true
'@esbuild/android-arm@0.24.2':
optional: true
'@esbuild/android-x64@0.24.2':
optional: true
'@esbuild/darwin-arm64@0.24.2':
optional: true
'@esbuild/darwin-x64@0.24.2':
optional: true
'@esbuild/freebsd-arm64@0.24.2':
optional: true
'@esbuild/freebsd-x64@0.24.2':
optional: true
'@esbuild/linux-arm64@0.24.2':
optional: true
'@esbuild/linux-arm@0.24.2':
optional: true
'@esbuild/linux-ia32@0.24.2':
optional: true
'@esbuild/linux-loong64@0.24.2':
optional: true
'@esbuild/linux-mips64el@0.24.2':
optional: true
'@esbuild/linux-ppc64@0.24.2':
optional: true
'@esbuild/linux-riscv64@0.24.2':
optional: true
'@esbuild/linux-s390x@0.24.2':
optional: true
'@esbuild/linux-x64@0.24.2':
optional: true
'@esbuild/netbsd-arm64@0.24.2':
optional: true
'@esbuild/netbsd-x64@0.24.2':
optional: true
'@esbuild/openbsd-arm64@0.24.2':
optional: true
'@esbuild/openbsd-x64@0.24.2':
optional: true
'@esbuild/sunos-x64@0.24.2':
optional: true
'@esbuild/win32-arm64@0.24.2':
optional: true
'@esbuild/win32-ia32@0.24.2':
optional: true
'@esbuild/win32-x64@0.24.2':
optional: true
'@floating-ui/core@1.6.8':
dependencies:
'@floating-ui/utils': 0.2.8
'@floating-ui/dom@1.6.12':
dependencies:
'@floating-ui/core': 1.6.8
'@floating-ui/utils': 0.2.8
'@floating-ui/utils@0.2.8': {}
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
string-width-cjs: string-width@4.2.3
strip-ansi: 7.1.0
strip-ansi-cjs: strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
'@nodelib/fs.stat@2.0.5': {}
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.18.0
'@pkgjs/parseargs@0.11.0':
optional: true
'@polka/url@1.0.0-next.28': {}
'@rollup/pluginutils@5.1.4(rollup@4.29.2)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.29.2
'@rollup/rollup-android-arm-eabi@4.29.2':
optional: true
'@rollup/rollup-android-arm64@4.29.2':
optional: true
'@rollup/rollup-darwin-arm64@4.29.2':
optional: true
'@rollup/rollup-darwin-x64@4.29.2':
optional: true
'@rollup/rollup-freebsd-arm64@4.29.2':
optional: true
'@rollup/rollup-freebsd-x64@4.29.2':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.29.2':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.29.2':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-arm64-musl@4.29.2':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-x64-gnu@4.29.2':
optional: true
'@rollup/rollup-linux-x64-musl@4.29.2':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.29.2':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.29.2':
optional: true
'@rollup/rollup-win32-x64-msvc@4.29.2':
optional: true
'@sec-ant/readable-stream@0.4.1': {}
'@sindresorhus/merge-streams@4.0.0': {}
'@sxzz/popperjs-es@2.11.7': {}
'@tsconfig/node22@22.0.0': {}
'@types/estree@1.0.6': {}
'@types/lodash-es@4.17.12':
dependencies:
'@types/lodash': 4.17.14
'@types/lodash@4.17.14': {}
'@types/node@22.10.5':
dependencies:
undici-types: 6.20.0
'@types/web-bluetooth@0.0.16': {}
'@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))':
dependencies:
vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
vue: 3.5.13(typescript@5.6.3)
'@volar/language-core@2.4.11':
dependencies:
'@volar/source-map': 2.4.11
'@volar/source-map@2.4.11': {}
'@volar/typescript@2.4.11':
dependencies:
'@volar/language-core': 2.4.11
path-browserify: 1.0.1
vscode-uri: 3.0.8
'@vue/babel-helper-vue-transform-on@1.2.5': {}
'@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
dependencies:
'@babel/helper-module-imports': 7.25.9
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
'@babel/template': 7.25.9
'@babel/traverse': 7.26.4
'@babel/types': 7.26.3
'@vue/babel-helper-vue-transform-on': 1.2.5
'@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0)
html-tags: 3.3.1
svg-tags: 1.0.0
optionalDependencies:
'@babel/core': 7.26.0
transitivePeerDependencies:
- supports-color
'@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/core': 7.26.0
'@babel/helper-module-imports': 7.25.9
'@babel/helper-plugin-utils': 7.25.9
'@babel/parser': 7.26.3
'@vue/compiler-sfc': 3.5.13
transitivePeerDependencies:
- supports-color
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.26.3
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.1
'@vue/compiler-dom@3.5.13':
dependencies:
'@vue/compiler-core': 3.5.13
'@vue/shared': 3.5.13
'@vue/compiler-sfc@3.5.13':
dependencies:
'@babel/parser': 7.26.3
'@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.17
postcss: 8.4.49
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.13':
dependencies:
'@vue/compiler-dom': 3.5.13
'@vue/shared': 3.5.13
'@vue/compiler-vue2@2.7.16':
dependencies:
de-indent: 1.0.2
he: 1.2.0
'@vue/devtools-api@6.6.4': {}
'@vue/devtools-core@7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@vue/devtools-kit': 7.6.8
'@vue/devtools-shared': 7.6.8
mitt: 3.0.1
nanoid: 5.0.9
pathe: 1.1.2
vite-hot-client: 0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))
vue: 3.5.13(typescript@5.6.3)
transitivePeerDependencies:
- vite
'@vue/devtools-kit@7.6.8':
dependencies:
'@vue/devtools-shared': 7.6.8
birpc: 0.2.19
hookable: 5.5.3
mitt: 3.0.1
perfect-debounce: 1.0.0
speakingurl: 14.0.1
superjson: 2.2.2
'@vue/devtools-shared@7.6.8':
dependencies:
rfdc: 1.4.1
'@vue/language-core@2.2.0(typescript@5.6.3)':
dependencies:
'@volar/language-core': 2.4.11
'@vue/compiler-dom': 3.5.13
'@vue/compiler-vue2': 2.7.16
'@vue/shared': 3.5.13
alien-signals: 0.4.12
minimatch: 9.0.5
muggle-string: 0.4.1
path-browserify: 1.0.1
optionalDependencies:
typescript: 5.6.3
'@vue/reactivity@3.5.13':
dependencies:
'@vue/shared': 3.5.13
'@vue/runtime-core@3.5.13':
dependencies:
'@vue/reactivity': 3.5.13
'@vue/shared': 3.5.13
'@vue/runtime-dom@3.5.13':
dependencies:
'@vue/reactivity': 3.5.13
'@vue/runtime-core': 3.5.13
'@vue/shared': 3.5.13
csstype: 3.1.3
'@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
vue: 3.5.13(typescript@5.6.3)
'@vue/shared@3.5.13': {}
'@vue/tsconfig@0.7.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))':
optionalDependencies:
typescript: 5.6.3
vue: 3.5.13(typescript@5.6.3)
'@vueuse/core@9.13.0(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
'@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.6.3))
vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@vueuse/metadata@9.13.0': {}
'@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.6.3))':
dependencies:
vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
alien-signals@0.4.12: {}
ansi-regex@5.0.1: {}
ansi-regex@6.1.0: {}
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
ansi-styles@6.2.1: {}
any-promise@1.3.0: {}
anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
arg@5.0.2: {}
async-validator@4.2.5: {}
asynckit@0.4.0: {}
autoprefixer@10.4.20(postcss@8.4.49):
dependencies:
browserslist: 4.24.3
caniuse-lite: 1.0.30001690
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.1
postcss: 8.4.49
postcss-value-parser: 4.2.0
axios@1.7.9:
dependencies:
follow-redirects: 1.15.9
form-data: 4.0.1
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
balanced-match@1.0.2: {}
binary-extensions@2.3.0: {}
birpc@0.2.19: {}
brace-expansion@2.0.1:
dependencies:
balanced-match: 1.0.2
braces@3.0.3:
dependencies:
fill-range: 7.1.1
browserslist@4.24.3:
dependencies:
caniuse-lite: 1.0.30001690
electron-to-chromium: 1.5.76
node-releases: 2.0.19
update-browserslist-db: 1.1.1(browserslist@4.24.3)
bundle-name@4.1.0:
dependencies:
run-applescript: 7.0.0
camelcase-css@2.0.1: {}
caniuse-lite@1.0.30001690: {}
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
braces: 3.0.3
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
color-name@1.1.4: {}
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
commander@4.1.1: {}
convert-source-map@2.0.0: {}
copy-anything@3.0.5:
dependencies:
is-what: 4.1.16
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
cssesc@3.0.0: {}
csstype@3.1.3: {}
dayjs@1.11.13: {}
de-indent@1.0.2: {}
debug@4.4.0:
dependencies:
ms: 2.1.3
default-browser-id@5.0.0: {}
default-browser@5.2.1:
dependencies:
bundle-name: 4.1.0
default-browser-id: 5.0.0
define-lazy-prop@3.0.0: {}
delayed-stream@1.0.0: {}
didyoumean@1.2.2: {}
dlv@1.1.3: {}
eastasianwidth@0.2.0: {}
electron-to-chromium@1.5.76: {}
element-plus@2.9.2(vue@3.5.13(typescript@5.6.3)):
dependencies:
'@ctrl/tinycolor': 3.6.1
'@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.6.3))
'@floating-ui/dom': 1.6.12
'@popperjs/core': '@sxzz/popperjs-es@2.11.7'
'@types/lodash': 4.17.14
'@types/lodash-es': 4.17.12
'@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.6.3))
async-validator: 4.2.5
dayjs: 1.11.13
escape-html: 1.0.3
lodash: 4.17.21
lodash-es: 4.17.21
lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
memoize-one: 6.0.0
normalize-wheel-es: 1.2.0
vue: 3.5.13(typescript@5.6.3)
transitivePeerDependencies:
- '@vue/composition-api'
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
entities@4.5.0: {}
error-stack-parser-es@0.1.5: {}
esbuild@0.24.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.24.2
'@esbuild/android-arm': 0.24.2
'@esbuild/android-arm64': 0.24.2
'@esbuild/android-x64': 0.24.2
'@esbuild/darwin-arm64': 0.24.2
'@esbuild/darwin-x64': 0.24.2
'@esbuild/freebsd-arm64': 0.24.2
'@esbuild/freebsd-x64': 0.24.2
'@esbuild/linux-arm': 0.24.2
'@esbuild/linux-arm64': 0.24.2
'@esbuild/linux-ia32': 0.24.2
'@esbuild/linux-loong64': 0.24.2
'@esbuild/linux-mips64el': 0.24.2
'@esbuild/linux-ppc64': 0.24.2
'@esbuild/linux-riscv64': 0.24.2
'@esbuild/linux-s390x': 0.24.2
'@esbuild/linux-x64': 0.24.2
'@esbuild/netbsd-arm64': 0.24.2
'@esbuild/netbsd-x64': 0.24.2
'@esbuild/openbsd-arm64': 0.24.2
'@esbuild/openbsd-x64': 0.24.2
'@esbuild/sunos-x64': 0.24.2
'@esbuild/win32-arm64': 0.24.2
'@esbuild/win32-ia32': 0.24.2
'@esbuild/win32-x64': 0.24.2
escalade@3.2.0: {}
escape-html@1.0.3: {}
estree-walker@2.0.2: {}
execa@9.5.2:
dependencies:
'@sindresorhus/merge-streams': 4.0.0
cross-spawn: 7.0.6
figures: 6.1.0
get-stream: 9.0.1
human-signals: 8.0.0
is-plain-obj: 4.1.0
is-stream: 4.0.1
npm-run-path: 6.0.0
pretty-ms: 9.2.0
signal-exit: 4.1.0
strip-final-newline: 4.0.0
yoctocolors: 2.1.1
fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
micromatch: 4.0.8
fastq@1.18.0:
dependencies:
reusify: 1.0.4
figures@6.1.0:
dependencies:
is-unicode-supported: 2.1.0
file-saver@2.0.5: {}
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
follow-redirects@1.15.9: {}
foreground-child@3.3.0:
dependencies:
cross-spawn: 7.0.6
signal-exit: 4.1.0
form-data@4.0.1:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
fraction.js@4.3.7: {}
fs-extra@11.2.0:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.1
fsevents@2.3.3:
optional: true
function-bind@1.1.2: {}
gensync@1.0.0-beta.2: {}
get-stream@9.0.1:
dependencies:
'@sec-ant/readable-stream': 0.4.1
is-stream: 4.0.1
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
glob-parent@6.0.2:
dependencies:
is-glob: 4.0.3
glob@10.4.5:
dependencies:
foreground-child: 3.3.0
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
globals@11.12.0: {}
graceful-fs@4.2.11: {}
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
he@1.2.0: {}
hookable@5.5.3: {}
html-tags@3.3.1: {}
human-signals@8.0.0: {}
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
is-docker@3.0.0: {}
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
is-inside-container@1.0.0:
dependencies:
is-docker: 3.0.0
is-number@7.0.0: {}
is-plain-obj@4.1.0: {}
is-stream@4.0.1: {}
is-unicode-supported@2.1.0: {}
is-what@4.1.16: {}
is-wsl@3.1.0:
dependencies:
is-inside-container: 1.0.0
isexe@2.0.0: {}
isexe@3.1.1: {}
jackspeak@3.4.3:
dependencies:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
jiti@1.21.7: {}
js-tokens@4.0.0: {}
jsesc@3.1.0: {}
json-parse-even-better-errors@4.0.0: {}
json5@2.2.3: {}
jsonfile@6.1.0:
dependencies:
universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
kolorist@1.8.0: {}
lilconfig@3.1.3: {}
lines-and-columns@1.2.4: {}
lodash-es@4.17.21: {}
lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
dependencies:
'@types/lodash-es': 4.17.12
lodash: 4.17.21
lodash-es: 4.17.21
lodash@4.17.21: {}
lru-cache@10.4.3: {}
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
memoize-one@6.0.0: {}
memorystream@0.3.1: {}
merge2@1.4.1: {}
micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
mime-db@1.52.0: {}
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.1
minipass@7.1.2: {}
mitt@3.0.1: {}
mrmime@2.0.0: {}
ms@2.1.3: {}
muggle-string@0.4.1: {}
mz@2.7.0:
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
nanoid@3.3.8: {}
nanoid@5.0.9: {}
node-releases@2.0.19: {}
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
normalize-wheel-es@1.2.0: {}
npm-normalize-package-bin@4.0.0: {}
npm-run-all2@7.0.2:
dependencies:
ansi-styles: 6.2.1
cross-spawn: 7.0.6
memorystream: 0.3.1
minimatch: 9.0.5
pidtree: 0.6.0
read-package-json-fast: 4.0.0
shell-quote: 1.8.2
which: 5.0.0
npm-run-path@6.0.0:
dependencies:
path-key: 4.0.0
unicorn-magic: 0.3.0
nprogress@0.2.0: {}
object-assign@4.1.1: {}
object-hash@3.0.0: {}
open@10.1.0:
dependencies:
default-browser: 5.2.1
define-lazy-prop: 3.0.0
is-inside-container: 1.0.0
is-wsl: 3.1.0
package-json-from-dist@1.0.1: {}
parse-ms@4.0.0: {}
path-browserify@1.0.1: {}
path-key@3.1.1: {}
path-key@4.0.0: {}
path-parse@1.0.7: {}
path-scurry@1.11.1:
dependencies:
lru-cache: 10.4.3
minipass: 7.1.2
pathe@1.1.2: {}
perfect-debounce@1.0.0: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {}
picomatch@4.0.2: {}
pidtree@0.6.0: {}
pify@2.3.0: {}
pinia@2.3.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)):
dependencies:
'@vue/devtools-api': 6.6.4
vue: 3.5.13(typescript@5.6.3)
vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3))
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- '@vue/composition-api'
pirates@4.0.6: {}
postcss-import@15.1.0(postcss@8.4.49):
dependencies:
postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.10
postcss-js@4.0.1(postcss@8.4.49):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.49
postcss-load-config@4.0.2(postcss@8.4.49):
dependencies:
lilconfig: 3.1.3
yaml: 2.7.0
optionalDependencies:
postcss: 8.4.49
postcss-nested@6.2.0(postcss@8.4.49):
dependencies:
postcss: 8.4.49
postcss-selector-parser: 6.1.2
postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-value-parser@4.2.0: {}
postcss@8.4.49:
dependencies:
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
pretty-ms@9.2.0:
dependencies:
parse-ms: 4.0.0
proxy-from-env@1.1.0: {}
queue-microtask@1.2.3: {}
read-cache@1.0.0:
dependencies:
pify: 2.3.0
read-package-json-fast@4.0.0:
dependencies:
json-parse-even-better-errors: 4.0.0
npm-normalize-package-bin: 4.0.0
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
resolve@1.22.10:
dependencies:
is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
reusify@1.0.4: {}
rfdc@1.4.1: {}
rollup@4.29.2:
dependencies:
'@types/estree': 1.0.6
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.29.2
'@rollup/rollup-android-arm64': 4.29.2
'@rollup/rollup-darwin-arm64': 4.29.2
'@rollup/rollup-darwin-x64': 4.29.2
'@rollup/rollup-freebsd-arm64': 4.29.2
'@rollup/rollup-freebsd-x64': 4.29.2
'@rollup/rollup-linux-arm-gnueabihf': 4.29.2
'@rollup/rollup-linux-arm-musleabihf': 4.29.2
'@rollup/rollup-linux-arm64-gnu': 4.29.2
'@rollup/rollup-linux-arm64-musl': 4.29.2
'@rollup/rollup-linux-loongarch64-gnu': 4.29.2
'@rollup/rollup-linux-powerpc64le-gnu': 4.29.2
'@rollup/rollup-linux-riscv64-gnu': 4.29.2
'@rollup/rollup-linux-s390x-gnu': 4.29.2
'@rollup/rollup-linux-x64-gnu': 4.29.2
'@rollup/rollup-linux-x64-musl': 4.29.2
'@rollup/rollup-win32-arm64-msvc': 4.29.2
'@rollup/rollup-win32-ia32-msvc': 4.29.2
'@rollup/rollup-win32-x64-msvc': 4.29.2
fsevents: 2.3.3
run-applescript@7.0.0: {}
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
semver@6.3.1: {}
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
shebang-regex@3.0.0: {}
shell-quote@1.8.2: {}
signal-exit@4.1.0: {}
sirv@3.0.0:
dependencies:
'@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
source-map-js@1.2.1: {}
speakingurl@14.0.1: {}
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
string-width@5.1.2:
dependencies:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
strip-ansi@7.1.0:
dependencies:
ansi-regex: 6.1.0
strip-final-newline@4.0.0: {}
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.8
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
ts-interface-checker: 0.1.13
superjson@2.2.2:
dependencies:
copy-anything: 3.0.5
supports-preserve-symlinks-flag@1.0.0: {}
svg-tags@1.0.0: {}
swiper@11.2.0: {}
tailwindcss@3.4.17:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.3
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.7
lilconfig: 3.1.3
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.1
postcss: 8.4.49
postcss-import: 15.1.0(postcss@8.4.49)
postcss-js: 4.0.1(postcss@8.4.49)
postcss-load-config: 4.0.2(postcss@8.4.49)
postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
resolve: 1.22.10
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
thenify@3.3.1:
dependencies:
any-promise: 1.3.0
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
totalist@3.0.1: {}
ts-interface-checker@0.1.13: {}
typescript@5.6.3: {}
undici-types@6.20.0: {}
unicorn-magic@0.3.0: {}
universalify@2.0.1: {}
update-browserslist-db@1.1.1(browserslist@4.24.3):
dependencies:
browserslist: 4.24.3
escalade: 3.2.0
picocolors: 1.1.1
util-deprecate@1.0.2: {}
vite-hot-client@0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)):
dependencies:
vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
vite-plugin-inspect@0.8.9(rollup@4.29.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.4(rollup@4.29.2)
debug: 4.4.0
error-stack-parser-es: 0.1.5
fs-extra: 11.2.0
open: 10.1.0
perfect-debounce: 1.0.0
picocolors: 1.1.1
sirv: 3.0.0
vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
- supports-color
vite-plugin-vue-devtools@7.6.8(rollup@4.29.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3)):
dependencies:
'@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))
'@vue/devtools-kit': 7.6.8
'@vue/devtools-shared': 7.6.8
execa: 9.5.2
sirv: 3.0.0
vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
vite-plugin-inspect: 0.8.9(rollup@4.29.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))
vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))
transitivePeerDependencies:
- '@nuxt/kit'
- rollup
- supports-color
- vue
vite-plugin-vue-inspector@5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)):
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
'@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
'@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0)
'@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0)
'@vue/compiler-dom': 3.5.13
kolorist: 1.8.0
magic-string: 0.30.17
vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0):
dependencies:
esbuild: 0.24.2
postcss: 8.4.49
rollup: 4.29.2
optionalDependencies:
'@types/node': 22.10.5
fsevents: 2.3.3
jiti: 1.21.7
yaml: 2.7.0
vscode-uri@3.0.8: {}
vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)):
dependencies:
vue: 3.5.13(typescript@5.6.3)
vue-router@4.5.0(vue@3.5.13(typescript@5.6.3)):
dependencies:
'@vue/devtools-api': 6.6.4
vue: 3.5.13(typescript@5.6.3)
vue-tsc@2.2.0(typescript@5.6.3):
dependencies:
'@volar/typescript': 2.4.11
'@vue/language-core': 2.2.0(typescript@5.6.3)
typescript: 5.6.3
vue@3.5.13(typescript@5.6.3):
dependencies:
'@vue/compiler-dom': 3.5.13
'@vue/compiler-sfc': 3.5.13
'@vue/runtime-dom': 3.5.13
'@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3))
'@vue/shared': 3.5.13
optionalDependencies:
typescript: 5.6.3
which@2.0.2:
dependencies:
isexe: 2.0.0
which@5.0.0:
dependencies:
isexe: 3.1.1
wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi@8.1.0:
dependencies:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
yallist@3.1.1: {}
yaml@2.7.0: {}
yoctocolors@2.1.1: {}
import request from "@/utils/request";
// 轮播图
export function getBanner(query) {
return request({
url: "/exam/setup/list",
method: "get",
params: query,
});
}
// http://192.168.19.142:9002/cms/category/list?categoryFlag=tyshlwyjzhhjbzx
export function getTab(data) {
return request({
url: "/cms/category/list",
method: "post",
params: data,
});
}
// // 查询考试设置详细
// export function getSetup(id) {
// return request({
// url: "/exam/setup/" + id,
// method: "get",
// });
// }
// // 新增考试设置
// export function addSetup(data) {
// return request({
// url: "/exam/setup",
// method: "post",
// data: data,
// });
// }
import request from "@/utils/request";
// 新闻详情
// export function getNewsDetail(id) {
// return request({
// url: "/cms/content/get/?id=" + id,
// method: "get",
// });
// }
export function getNewsDetail(data) {
return request({
url: "/cms/content/get",
method: "get",
params: data,
});
}
import request from "@/utils/request";
// 新闻列表
export function getNewsList(data) {
return request({
url: "/cms/content/list",
method: "get",
params: data,
});
}
// 新闻点击数量
export function getHit(contentId) {
return request({
url: "/cms/content/" + contentId + "/hit",
method: "get",
});
}
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
@click="getToDetail(news.id)"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img :src="news.images" class="w-full h-full object-cover" />
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.contentTitle }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.contentDescription }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.contentDatetime }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.contentTags }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.contentHit }}
</span>
</div>
</div>
<!-- <div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div> -->
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 辟谣专区 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
辟谣专区
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in pyNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.contentHit }} 阅读
</div>
</div>
</div>
</div>
<!-- 专家解读-->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
专家解读
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in zjNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img :src="item.images" class="w-full h-full object-cover" />
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
</div>
</div>
</div>
<!-- 法律法规 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
法律法规
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in flNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img :src="item.images" class="w-full h-full object-cover" />
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import { useRouter, useRoute } from "vue-router";
import DetailRight from "@/components/news/DetailRight.vue";
const router = useRouter();
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(0);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const newsList = ref([]);
const pyNews = ref([]);
const zjNews = ref([]);
const flNews = ref([]);
getList(10, 1);
//获取权威发布
function getList(pageSize: number, pageNo: number) {
const datas = {
contentType: qwfb,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
newsList.value = rowsList;
});
}
getPyList();
//获取辟谣专区
function getPyList() {
const datas = {
contentType: pyzq,
pageSize: 5,
pageNo: 1,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
pyNews.value = rowsList;
});
}
getZjList();
//获取专家解读
function getZjList() {
const datas = {
contentType: zjjd,
pageSize: 2,
pageNo: 1,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
zjNews.value = rowsList;
});
}
getFlList();
//获取法律法规
function getFlList() {
const datas = {
contentType: flfg,
pageSize: 2,
pageNo: 1,
};
getNewsList(datas).then((response) => {
flNews.value = response.data.rows;
});
}
function getToDetail(id: number) {
router.push({
path: "/py/news/detail",
query: {
type: 1,
id: id,
},
});
}
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div
class="flex items-center text-sm text-gray-500 mb-5"
v-if="homeMoreType == '-1'"
>
<router-link to="/py/pyhome" class="text-gray-500 hover:text-blue-500"
>首页</router-link
>
<el-icon class="mx-2"><ArrowRight /></el-icon>
<span class="text-gray-900">{{ getTitleLink() }}</span>
</div>
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(item, index) in list"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img :src="item.images" class="w-full h-full object-cover" />
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ item.contentDescription }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ item.contentDatetime }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ item.contentTags }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ item.contentHit }}
</span>
</div>
</div>
<!-- <div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div> -->
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 辟谣专区 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
{{ title1 }}
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in list1"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.contentHit }} 阅读
</div>
</div>
</div>
</div>
<!-- 专家解读-->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
{{ title2 }}
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in list2"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img :src="item.images" class="w-full h-full object-cover" />
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
</div>
</div>
</div>
<!-- 法律法规 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
{{ title3 }}
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in list3"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img :src="item.images" class="w-full h-full object-cover" />
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import { useRouter, useRoute } from "vue-router";
import { ca } from "element-plus/es/locales.mjs";
const router = useRouter();
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(0);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const list = ref([]);
const list1 = ref([]);
const list2 = ref([]);
const list3 = ref([]);
const props = defineProps({
typePage: String,
type0: String,
type1: String,
type2: String,
type3: String,
title1: String,
title2: String,
title3: String,
homeMoreType: String,
});
function getTitleLink() {
switch (props.typePage) {
case "3": {
return "专家解读";
}
case "2": {
return "辟谣专区";
}
case "4": {
return "法律法规";
}
}
}
getList(10, 1);
getList1();
getList2();
getList3();
//获取主列表
function getList(pageSize: number, pageNo: number) {
const datas = {
contentType: props.type0,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list.value = rowsList;
});
}
//获取测边列表 1
function getList1() {
const datas = {
contentType: props.type1,
pageSize: 5,
pageNo: 1,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list1.value = rowsList;
});
}
//获取测边列表 2
function getList2() {
const datas = {
contentType: props.type2,
pageSize: 2,
pageNo: 1,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list2.value = rowsList;
});
}
//获取测边列表 3
function getList3() {
const datas = {
contentType: props.type3,
pageSize: 2,
pageNo: 1,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list3.value = rowsList;
});
}
function getToDetail(id: number) {
router.push({
path: "/py/news/detail",
query: {
type: props.typePage,
type1: props.type1,
type2: props.type2,
title1: props.title1,
title2: props.title2,
id: id,
},
});
}
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
......@@ -32,9 +32,9 @@
:key="index"
class="flex items-center cursor-pointer hover:bg-blue-700 px-4"
:class="{ 'bg-blue-700': activeNav === index }"
@click="navigateTo(index)"
@click="navigateTo(index, item)"
>
<span class="text-white">{{ item }}</span>
<span class="text-white">{{ item.categoryTitle }}</span>
</li>
</ul>
</div>
......@@ -84,22 +84,38 @@ import {
Search,
Document,
} from "@element-plus/icons-vue";
import { getTab } from "@/api/home/home";
import { HLW_YJZH_JBZX } from "@/utils/config";
const router = useRouter();
const swiperModules = [Pagination, Autoplay];
const searchQuery = ref("");
const activeNav = ref(0);
const navItems = ["首页", "新闻热点", "太原新闻", "山西新闻", "通知公告"];
// const navItems = ["首页", "新闻热点", "太原新闻", "山西新闻", "通知公告"];
const navItems = ref([]);
const data = {
categoryFlag: HLW_YJZH_JBZX,
};
getTab(data).then((res) => {
console.log(res);
const data = res.data.rows;
// //用data内的categorySort排序
data.sort((a, b) => a.categorySort - b.categorySort);
//将data内categoryTitle等于“权威发布”和“辟谣专区”和“轮播图”的数据过滤不在navItems.value中显示
const filterData = data.filter((item) => item.categoryTitle !== "轮播图");
navItems.value = filterData;
});
function navigateTo(index) {
function navigateTo(index, item) {
const routes = [
{ path: "/home/home" },
{ path: "/home/news" },
{ path: "/home/tynews" },
{ path: "/home/sxnews" },
{ path: "/home/announcements" },
{ path: "/home/home", query: { id: item.id } },
{ path: "/home/news", query: { id: item.id } },
{ path: "/home/tynews", query: { id: item.id } },
{ path: "/home/sxnews", query: { id: item.id } },
{ path: "/home/announcements", query: { id: item.id } },
];
router.push(routes[index].path).catch((err) => {});
router.push({ path: routes[index].path });
activeNav.value = index;
}
......
import useUserStore from '@/store/modules/user'
function authPermission(permission) {
const all_permission = "*:*:*";
const permissions = useUserStore().permissions
if (permission && permission.length > 0) {
return permissions.some(v => {
return all_permission === v || v === permission
})
} else {
return false
}
}
function authRole(role) {
const super_admin = "admin";
const roles = useUserStore().roles
if (role && role.length > 0) {
return roles.some(v => {
return super_admin === v || v === role
})
} else {
return false
}
}
export default {
// 验证用户是否具备某权限
hasPermi(permission) {
return authPermission(permission);
},
// 验证用户是否含有指定权限,只需包含其中一个
hasPermiOr(permissions) {
return permissions.some(item => {
return authPermission(item)
})
},
// 验证用户是否含有指定权限,必须全部拥有
hasPermiAnd(permissions) {
return permissions.every(item => {
return authPermission(item)
})
},
// 验证用户是否具备某角色
hasRole(role) {
return authRole(role);
},
// 验证用户是否含有指定角色,只需包含其中一个
hasRoleOr(roles) {
return roles.some(item => {
return authRole(item)
})
},
// 验证用户是否含有指定角色,必须全部拥有
hasRoleAnd(roles) {
return roles.every(item => {
return authRole(item)
})
}
}
const sessionCache = {
set (key, value) {
if (!sessionStorage) {
return
}
if (key != null && value != null) {
sessionStorage.setItem(key, value)
}
},
get (key) {
if (!sessionStorage) {
return null
}
if (key == null) {
return null
}
return sessionStorage.getItem(key)
},
setJSON (key, jsonValue) {
if (jsonValue != null) {
this.set(key, JSON.stringify(jsonValue))
}
},
getJSON (key) {
const value = this.get(key)
if (value != null) {
return JSON.parse(value)
}
},
remove (key) {
sessionStorage.removeItem(key);
}
}
const localCache = {
set (key, value) {
if (!localStorage) {
return
}
if (key != null && value != null) {
localStorage.setItem(key, value)
}
},
get (key) {
if (!localStorage) {
return null
}
if (key == null) {
return null
}
return localStorage.getItem(key)
},
setJSON (key, jsonValue) {
if (jsonValue != null) {
this.set(key, JSON.stringify(jsonValue))
}
},
getJSON (key) {
const value = this.get(key)
if (value != null) {
return JSON.parse(value)
}
},
remove (key) {
localStorage.removeItem(key);
}
}
export default {
/**
* 会话级缓存
*/
session: sessionCache,
/**
* 本地缓存
*/
local: localCache
}
import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import { saveAs } from 'file-saver'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { blobValidate } from '@/utils/ruoyi'
const baseURL = import.meta.env.VITE_APP_BASE_API
let downloadLoadingInstance;
export default {
name(name, isDelete = true) {
var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete
axios({
method: 'get',
url: url,
responseType: 'blob',
headers: { 'Authorization': 'Bearer ' + getToken() }
}).then((res) => {
const isBlob = blobValidate(res.data);
if (isBlob) {
const blob = new Blob([res.data])
this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
} else {
this.printErrMsg(res.data);
}
})
},
resource(resource) {
var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource);
axios({
method: 'get',
url: url,
responseType: 'blob',
headers: { 'Authorization': 'Bearer ' + getToken() }
}).then((res) => {
const isBlob = blobValidate(res.data);
if (isBlob) {
const blob = new Blob([res.data])
this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
} else {
this.printErrMsg(res.data);
}
})
},
zip(url, name) {
var url = baseURL + url
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
axios({
method: 'get',
url: url,
responseType: 'blob',
headers: { 'Authorization': 'Bearer ' + getToken() }
}).then((res) => {
const isBlob = blobValidate(res.data);
if (isBlob) {
const blob = new Blob([res.data], { type: 'application/zip' })
this.saveAs(blob, name)
} else {
this.printErrMsg(res.data);
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
},
saveAs(text, name, opts) {
saveAs(text, name, opts);
},
async printErrMsg(data) {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
}
}
import tab from './tab'
import auth from './auth'
import cache from './cache'
import modal from './modal'
import download from './download'
export default function installPlugins(app){
// 页签操作
app.config.globalProperties.$tab = tab
// 认证对象
app.config.globalProperties.$auth = auth
// 缓存对象
app.config.globalProperties.$cache = cache
// 模态框对象
app.config.globalProperties.$modal = modal
// 下载文件
app.config.globalProperties.$download = download
}
import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
let loadingInstance;
export default {
// 消息提示
msg(content) {
ElMessage.info(content)
},
// 错误消息
msgError(content) {
ElMessage.error(content)
},
// 成功消息
msgSuccess(content) {
ElMessage.success(content)
},
// 警告消息
msgWarning(content) {
ElMessage.warning(content)
},
// 弹出提示
alert(content) {
ElMessageBox.alert(content, "系统提示")
},
// 错误提示
alertError(content) {
ElMessageBox.alert(content, "系统提示", { type: 'error' })
},
// 成功提示
alertSuccess(content) {
ElMessageBox.alert(content, "系统提示", { type: 'success' })
},
// 警告提示
alertWarning(content) {
ElMessageBox.alert(content, "系统提示", { type: 'warning' })
},
// 通知提示
notify(content) {
ElNotification.info(content)
},
// 错误通知
notifyError(content) {
ElNotification.error(content);
},
// 成功通知
notifySuccess(content) {
ElNotification.success(content)
},
// 警告通知
notifyWarning(content) {
ElNotification.warning(content)
},
// 确认窗体
confirm(content) {
return ElMessageBox.confirm(content, "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
},
// 提交内容
prompt(content) {
return ElMessageBox.prompt(content, "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
},
// 打开遮罩层
loading(content) {
loadingInstance = ElLoading.service({
lock: true,
text: content,
background: "rgba(0, 0, 0, 0.7)",
})
},
// 关闭遮罩层
closeLoading() {
loadingInstance.close();
}
}
import useTagsViewStore from '@/store/modules/tagsView'
import router from '@/router'
export default {
// 刷新当前tab页签
refreshPage(obj) {
const { path, query, matched } = router.currentRoute.value;
if (obj === undefined) {
matched.forEach((m) => {
if (m.components && m.components.default && m.components.default.name) {
if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
obj = { name: m.components.default.name, path: path, query: query };
}
}
});
}
return useTagsViewStore().delCachedView(obj).then(() => {
const { path, query } = obj
router.replace({
path: '/redirect' + path,
query: query
})
})
},
// 关闭当前tab页签,打开新页签
closeOpenPage(obj) {
useTagsViewStore().delView(router.currentRoute.value);
if (obj !== undefined) {
return router.push(obj);
}
},
// 关闭指定tab页签
closePage(obj) {
if (obj === undefined) {
return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => {
const latestView = visitedViews.slice(-1)[0]
if (latestView) {
return router.push(latestView.fullPath)
}
return router.push('/');
});
}
return useTagsViewStore().delView(obj);
},
// 关闭所有tab页签
closeAllPage() {
return useTagsViewStore().delAllViews();
},
// 关闭左侧tab页签
closeLeftPage(obj) {
return useTagsViewStore().delLeftTags(obj || router.currentRoute.value);
},
// 关闭右侧tab页签
closeRightPage(obj) {
return useTagsViewStore().delRightTags(obj || router.currentRoute.value);
},
// 关闭其他tab页签
closeOtherPage(obj) {
return useTagsViewStore().delOthersViews(obj || router.currentRoute.value);
},
// 打开tab页签
openPage(url) {
return router.push(url);
},
// 修改tab页签
updatePage(obj) {
return useTagsViewStore().updateVisitedView(obj);
}
}
......@@ -8,7 +8,7 @@ import TaiyuanNews from "../views/home/tynews/TaiyuanNews.vue";
import ShanxiNews from "../views/home/sxnews/ShanxiNews.vue";
import Announcements from "../views/home/announcements/Announcements.vue";
import Jb from "../views/home/jb/Jb.vue";
import NewsDetail from "../views/home/hotnews/NewsDetail.vue";
import NewsDetail from "../views/home/detail/NewsDetail.vue";
//辟谣
import PyLayout from "../layout/py.vue";
......@@ -18,6 +18,7 @@ import Rumor from "../views/py/rumor/Rumor.vue";
import Expert from "../views/py/expert/Expert.vue";
import Law from "../views/py/law/Law.vue";
import Reading from "../views/py/reading/Reading.vue";
import PyNewsDetail from "../views/py/detail/NewsDetail.vue";
//网名有话说
import WmLayout from "../layout/wm.vue";
......@@ -69,7 +70,7 @@ const router = createRouter({
},
{
name: "NewsDetail",
path: "/home/newsdetail",
path: "/home/news/detail",
component: NewsDetail,
},
],
......@@ -109,6 +110,11 @@ const router = createRouter({
path: "/py/reading",
component: Reading,
},
{
name: "PyNewsDetail",
path: "/py/news/detail",
component: PyNewsDetail,
},
],
},
......
let baseImageUrl;
if (process.env.NODE_ENV === "development") {
// baseImageUrl = (path) => `${window.location.origin}${path}`;
baseImageUrl = (path) => "http://192.168.19.142:9002" + path;
// console.log(baseImageUrl);
} else {
baseImageUrl = (path) => path;
}
export { baseImageUrl };
// 栏目属性
export const HLW_YJZH_JBZX = "tyshlwyjzhhjbzx"; //太原市互联网应急指挥和举报中心
export const HLW_LH_PYPT = "sxhlwlhpypt"; //山西互联网联合辟谣平台
export const WM_YHS = "wmyhs"; //网民有话说
export const XW_RD_ID = "1666653706550321158"; //新闻热点
export const TY_XW_ID = "1876175326853881857"; //太原新闻
export const SX_XW_ID = "1876175475609067521"; //山西新闻
export const TZ_GG_ID = "1876175589341814786"; //通知公告
export const QW_FB_ID = "1876540452316536834"; //权威发布
export const PY_ZQ_ID = "1876540606213939201"; //辟谣专区
export const LBT_ID = "1876561611942682626"; //轮播图
//文章类型
export const lbt = "lbt"; // 轮播图
export const rdxw = "rdxw"; // 热点新闻
export const tyxw = "tyxw"; // 太原新闻
export const sxxw = "sxxw"; // 山西新闻
export const tzgg = "tzgg"; // 通知公告
export const qwfb = "qwfb"; // 权威发布
export const pyzq = "pyzq"; // 辟谣专区
export const zjjd = "zjjd"; // 专家解读
export const flfg = "flfg"; // 法律法规
export const dtsy = "dtsy"; // 读图识谣
export default {
401: "认证失败,无法访问系统资源",
403: "当前操作没有权限",
404: "访问资源不存在",
default: "系统未知错误,请反馈给管理员",
};
import axios from "axios";
import {
ElNotification,
ElMessageBox,
ElMessage,
ElLoading,
} from "element-plus";
// import { getToken } from '@/utils/auth'
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
// import useUserStore from "@/store/modules/user";
// import { useRouter } from "vue-router";
let downloadLoadingInstance;
// const router = useRouter();
// 是否显示重新登录
// export let isRelogin = { show: false };
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 10000,
});
// request拦截器
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
// const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
// if (getToken() && !isToken) {
// config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
// }
// get请求映射params参数
if (config.method === "get" && config.params) {
let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = {
url: config.url,
data:
typeof config.data === "object"
? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(
`[${config.url}]: ` +
"请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
);
return config;
}
const sessionObj = cache.session.getJSON("sessionObj");
if (
sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (
s_data === requestObj.data &&
requestObj.time - s_time < interval &&
s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else {
cache.session.setJSON("sessionObj", requestObj);
}
}
}
return config;
},
(error) => {
console.log(error);
Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode["default"];
// 二进制数据则直接返回
if (
res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
}
if (code === 401) {
// if (!isRelogin.show) {
// isRelogin.show = true;
// ElMessageBox.confirm(
// "登录状态已过期,您可以继续留在该页面,或者重新登录",
// "系统提示",
// {
// confirmButtonText: "重新登录",
// cancelButtonText: "取消",
// type: "warning",
// }
// )
// .then(() => {
// isRelogin.show = false;
// useUserStore()
// .logOut()
// .then(() => {
// router.push("/login");
// });
// })
// .catch(() => {
// isRelogin.show = false;
// });
// }
// return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
return Promise.reject("链接失败");
} else if (code === 500) {
ElMessage({ message: msg, type: "error" });
return Promise.reject(new Error(msg));
} else if (code === 601) {
ElMessage({ message: msg, type: "warning" });
return Promise.reject(new Error(msg));
} else if (code !== 200) {
ElNotification.error({ title: msg });
return Promise.reject("error");
} else {
return Promise.resolve(res.data);
}
},
(error) => {
console.log("err" + error);
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
ElMessage({ message: message, type: "error", duration: 5 * 1000 });
return Promise.reject(error);
}
);
// 通用下载方法
export function download(url, params, filename, config) {
downloadLoadingInstance = ElLoading.service({
text: "正在下载数据,请稍候",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
transformRequest: [
(params) => {
return tansParams(params);
},
],
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
...config,
})
.then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service;
/**
* 通用js方法封装处理
* Copyright (c) 2019 ruoyi
*/
// 日期格式化
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
// 表单重置
export function resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
}
// 添加日期范围
export function addDateRange(params, dateRange, propName) {
let search = params;
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (typeof (propName) === 'undefined') {
search.params['beginTime'] = dateRange[0];
search.params['endTime'] = dateRange[1];
} else {
search.params['begin' + propName] = dateRange[0];
search.params['end' + propName] = dateRange[1];
}
return search;
}
// 回显数据字典
export function selectDictLabel(datas, value) {
if (value === undefined) {
return "";
}
var actions = [];
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + value)) {
actions.push(datas[key].label);
return true;
}
})
if (actions.length === 0) {
actions.push(value);
}
return actions.join('');
}
// 回显数据字典(字符串数组)
export function selectDictLabels(datas, value, separator) {
if (value === undefined || value.length ===0) {
return "";
}
if (Array.isArray(value)) {
value = value.join(",");
}
var actions = [];
var currentSeparator = undefined === separator ? "," : separator;
var temp = value.split(currentSeparator);
Object.keys(value.split(currentSeparator)).some((val) => {
var match = false;
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + temp[val])) {
actions.push(datas[key].label + currentSeparator);
match = true;
}
})
if (!match) {
actions.push(temp[val] + currentSeparator);
}
})
return actions.join('').substring(0, actions.join('').length - 1);
}
// 字符串格式化(%s )
export function sprintf(str) {
var args = arguments, flag = true, i = 1;
str = str.replace(/%s/g, function () {
var arg = args[i++];
if (typeof arg === 'undefined') {
flag = false;
return '';
}
return arg;
});
return flag ? str : '';
}
// 转换字符串,undefined,null等转化为""
export function parseStrEmpty(str) {
if (!str || str == "undefined" || str == "null") {
return "";
}
return str;
}
// 数据合并
export function mergeRecursive(source, target) {
for (var p in target) {
try {
if (target[p].constructor == Object) {
source[p] = mergeRecursive(source[p], target[p]);
} else {
source[p] = target[p];
}
} catch (e) {
source[p] = target[p];
}
}
return source;
};
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
*/
export function handleTree(data, id, parentId, children) {
let config = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children'
};
var childrenListMap = {};
var nodeIds = {};
var tree = [];
for (let d of data) {
let parentId = d[config.parentId];
if (childrenListMap[parentId] == null) {
childrenListMap[parentId] = [];
}
nodeIds[d[config.id]] = d;
childrenListMap[parentId].push(d);
}
for (let d of data) {
let parentId = d[config.parentId];
if (nodeIds[parentId] == null) {
tree.push(d);
}
}
for (let t of tree) {
adaptToChildrenList(t);
}
function adaptToChildrenList(o) {
if (childrenListMap[o[config.id]] !== null) {
o[config.childrenList] = childrenListMap[o[config.id]];
}
if (o[config.childrenList]) {
for (let c of o[config.childrenList]) {
adaptToChildrenList(c);
}
}
}
return tree;
}
/**
* 参数处理
* @param {*} params 参数
*/
export function tansParams(params) {
let result = ''
for (const propName of Object.keys(params)) {
const value = params[propName];
var part = encodeURIComponent(propName) + "=";
if (value !== null && value !== "" && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']';
var subPart = encodeURIComponent(params) + "=";
result += subPart + encodeURIComponent(value[key]) + "&";
}
}
} else {
result += part + encodeURIComponent(value) + "&";
}
}
}
return result
}
// 返回项目路径
export function getNormalPath(p) {
if (p.length === 0 || !p || p == 'undefined') {
return p
};
let res = p.replace('//', '/')
if (res[res.length - 1] === '/') {
return res.slice(0, res.length - 1)
}
return res;
}
// 验证是否为blob格式
export function blobValidate(data) {
return data.type !== 'application/json'
}
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template>
<div class="min-h-screen bg-gray-50 py-5 px-0">
<div class="w-[1440px] mx-auto">
<!-- 列表区域 -->
<div class="bg-white rounded-lg shadow-sm">
<div class="divide-y divide-gray-200">
<div
v-for="item in tableData"
:key="item.id"
class="p-4 hover:bg-gray-50 transition-colors"
>
<div class="flex items-center justify-between">
<div class="flex-1 min-w-0">
<div class="flex items-center mb-1">
<h3
class="text-blue-600 hover:text-blue-800 cursor-pointer text-lg font-medium truncate mr-2"
@click="handleTitleClick(item)"
>
{{ item.contentTitle }}
</h3>
</div>
<div class="flex items-center text-sm text-gray-500">
<span class="mr-4">发布人:{{ item.contentAuthor }}</span>
<span class="mr-4">发布时间:{{ item.contentDatetime }}</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ item.contentHit }}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 分页 -->
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { Search, Refresh, View } from "@element-plus/icons-vue";
import { getNewsList } from "@/api/home/news/list";
import { useRouter, useRoute } from "vue-router";
import { baseImageUrl, rdxw, sxxw, tzgg } from "@/utils/config";
const router = useRouter();
const route = useRoute();
const searchKeyword = ref("");
const dateRange = ref([]);
const noticeType = ref("");
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(100);
const tableData = ref([]);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const handleTitleClick = (row: any) => {
router.push({
// path: "/home/announcements/detail",
path: "/home/news/detail",
query: {
type: "4",
id: row.id,
tabId: route.query.id,
},
});
};
getList(pageSize.value, pageNo.value);
//获取新闻热点列表
function getList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
total.value = data.total;
tableData.value = rowsList;
});
}
</script>
<style scoped>
.el-input :deep(.el-input__wrapper) {
box-shadow: 0 0 0 1px #e5e7eb inset;
}
.el-input :deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409eff inset;
}
.el-select :deep(.el-input__wrapper) {
box-shadow: 0 0 0 1px #e5e7eb inset;
}
.el-select :deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409eff inset;
}
.el-date-editor :deep(.el-range-separator) {
color: #606266;
}
</style>
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="w-[1440px] mx-auto px-4 py-8">
<!-- 公告列表 -->
<div class="bg-white rounded-lg shadow-sm">
<el-table
:data="currentPageData"
style="width: 100%"
:header-cell-style="{ background: '#f8f9fa' }"
>
<el-table-column label="标题" min-width="400">
<template #default="{ row }">
<div class="flex items-center">
<el-icon v-if="row.isTop" class="mr-2 text-red-500">
<Top />
</el-icon>
<span :class="{ 'text-red-500': row.isTop }">{{
row.title
}}</span>
<el-tag v-if="row.isNew" size="small" type="danger" class="ml-2"
></el-tag
<div class="container mx-auto px-0 py-5 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<!-- 列表区域 -->
<div class="bg-white rounded-lg shadow-sm">
<div class="divide-y divide-gray-200">
<div
v-for="item in tableData"
:key="item.id"
class="p-4 hover:bg-gray-50 transition-colors"
>
<div class="flex items-center justify-between">
<div class="flex-1 min-w-0">
<div class="flex items-center mb-1">
<h3
class="text-blue-600 hover:text-blue-800 cursor-pointer text-lg font-medium truncate mr-2"
@click="goToDetail(item.id)"
>
{{ item.contentTitle }}
</h3>
</div>
<div class="flex items-center text-sm text-gray-500">
<span class="mr-4">发布人:{{ item.contentAuthor }}</span>
<span class="mr-4"
>发布时间:{{ item.contentDatetime }}</span
>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ item.contentHit }}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 分页 -->
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
太原新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in tyNews"
:key="index"
class="group cursor-pointer"
@click="goToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<!-- <el-image
class="w-full h-full object-cover"
:src="item.images"
:fit="fit"
></el-image> -->
<img
:src="item.images"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.contentTitle }}
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="category" label="类别" width="120">
<template #default="{ row }">
<el-tag :type="row.categoryType" size="small">{{
row.category
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="department" label="发布部门" width="150" />
<el-table-column prop="date" label="发布时间" width="180" />
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button
type="primary"
link
size="small"
class="!rounded-button whitespace-nowrap"
@click="viewDetail(row)"
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-orange-500"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="goToDetail(item.id)"
>
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="flex justify-center p-4">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="filteredData.length"
:page-sizes="[10, 20, 30, 50]"
layout="total, sizes, prev, pager, next, jumper"
/>
<el-tag size="small" :type="item.type">公告 </el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.contentTitle }}</span
>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, computed } from "vue";
import { Top } from "@element-plus/icons-vue";
interface Announcement {
id: number;
title: string;
category: string;
categoryType: "" | "success" | "warning" | "info";
department: string;
date: string;
isTop: boolean;
isNew: boolean;
}
import { ref } from "vue";
import { Search, Refresh, View } from "@element-plus/icons-vue";
import { getNewsList } from "@/api/home/news/list";
import { useRouter, useRoute } from "vue-router";
import { baseImageUrl, rdxw, sxxw, tzgg, tyxw } from "@/utils/config";
const currentPage = ref(1);
const router = useRouter();
const route = useRoute();
const searchKeyword = ref("");
const dateRange = ref([]);
const noticeType = ref("");
const pageNo = ref(1);
const pageSize = ref(10);
const announcements: Announcement[] = [
{
id: 1,
title: "关于 2024 年度科技创新项目申报工作的通知",
category: "重要通知",
categoryType: "warning",
department: "科技创新部",
date: "2024-01-15 14:30",
isTop: true,
isNew: true,
},
{
id: 2,
title: "2024 年春节放假安排及工作调整说明",
category: "公告",
categoryType: "info",
department: "人力资源部",
date: "2024-01-14 16:45",
isTop: true,
isNew: true,
},
{
id: 3,
title: "关于开展 2023 年度员工满意度调查的通知",
category: "普通通知",
categoryType: "",
department: "综合管理部",
date: "2024-01-13 09:15",
isTop: false,
isNew: false,
},
{
id: 4,
title: "公司新版办公系统上线试运行通知",
category: "系统通知",
categoryType: "success",
department: "信息技术部",
date: "2024-01-12 11:20",
isTop: false,
isNew: true,
},
{
id: 5,
title: "2023 年度优秀员工表彰大会通知",
category: "重要通知",
categoryType: "warning",
department: "人力资源部",
date: "2024-01-11 15:30",
isTop: false,
isNew: false,
},
{
id: 6,
title: "关于组织开展消防安全培训的通知",
category: "普通通知",
categoryType: "",
department: "安全管理部",
date: "2024-01-10 13:45",
isTop: false,
isNew: false,
},
{
id: 7,
title: "2024 年第一季度经营工作会议通知",
category: "重要通知",
categoryType: "warning",
department: "经营管理部",
date: "2024-01-09 10:00",
isTop: false,
isNew: false,
},
{
id: 8,
title: "公司新版企业文化手册发布通知",
category: "公告",
categoryType: "info",
department: "企业文化部",
date: "2024-01-08 16:20",
isTop: false,
isNew: false,
},
{
id: 9,
title: "关于开展年度健康体检工作的通知",
category: "普通通知",
categoryType: "",
department: "人力资源部",
date: "2024-01-07 14:15",
isTop: false,
isNew: false,
},
{
id: 10,
title: "公司新版薪酬福利制度实施通知",
category: "重要通知",
categoryType: "warning",
department: "人力资源部",
date: "2024-01-06 09:30",
isTop: false,
isNew: false,
},
{
id: 11,
title: "关于加强办公场所节能降耗工作的通知",
category: "普通通知",
categoryType: "",
department: "行政管理部",
date: "2024-01-05 11:40",
isTop: false,
isNew: false,
},
{
id: 12,
title: "2024 年度培训计划发布通知",
category: "公告",
categoryType: "info",
department: "人力资源部",
date: "2024-01-04 15:50",
isTop: false,
isNew: false,
},
];
const filteredData = computed(() => announcements);
const currentPageData = computed(() => {
const start = (currentPage.value - 1) * pageSize.value;
const end = start + pageSize.value;
return filteredData.value.slice(start, end);
});
const viewDetail = (row: Announcement) => {
// 查看详情逻辑
console.log("查看详情:", row);
const total = ref(100);
const tableData = ref([]);
const tyNews = ref([]);
const announcements = ref([]);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
getTyNewsList(3, 1);
//获取太原新闻
function getTyNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tyxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
tyNews.value = rowsList;
});
}
function goToDetail(id: number) {
router.push({
path: "/home/news/detail",
query: {
type: 4,
id: id,
},
});
}
getTzGgNewsList(5, 1);
//获取通知公告
function getTzGgNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
announcements.value = rowsList;
});
}
getList(pageSize.value, pageNo.value);
//获取新闻热点列表
function getList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
total.value = data.total;
tableData.value = rowsList;
});
}
</script>
<style scoped>
.el-input :deep(.el-input__wrapper) {
box-shadow: none !important;
box-shadow: 0 0 0 1px #e5e7eb inset;
}
.el-input :deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409eff inset;
}
.el-select :deep(.el-input__wrapper) {
box-shadow: 0 0 0 1px #e5e7eb inset;
}
.el-select :deep(.el-input__wrapper.is-focus) {
box-shadow: 0 0 0 1px #409eff inset;
}
.el-table :deep(th.el-table__cell) {
font-weight: 600;
.el-date-editor :deep(.el-range-separator) {
color: #606266;
}
</style>
<template>
<div class="min-h-screen bg-gray-50">
<div class="w-[1440px] mx-auto px-0 py-5">
<div class="flex items-center text-sm text-gray-500 mb-2">
<router-link
:to="toRoute()"
class="text-gray-500 hover:text-blue-500"
>{{ toRouteName() }}</router-link
>
<el-icon class="mx-2"><ArrowRight /></el-icon>
<span class="text-gray-900">新闻详情</span>
</div>
<!-- 主要内容区 -->
<div class="grid grid-cols-3 gap-8">
<!-- 左侧主要新闻内容 -->
<div class="col-span-2 bg-white rounded-lg shadow-sm p-6">
<h1 class="text-3xl font-bold mb-4 text-black">
{{ details.title }}
</h1>
<div class="flex items-center text-gray-600 mb-6 space-x-4">
<div class="flex items-center">
<el-icon><User /></el-icon>
<span class="ml-1">{{ details.author }}</span>
</div>
<div class="flex items-center">
<el-icon><Clock /></el-icon>
<span class="ml-1">{{ details.date }}</span>
</div>
<div class="flex items-center">
<el-icon><View /></el-icon>
<span class="ml-1">阅读 {{ details.hit }}</span>
</div>
</div>
<div v-html="details.content"></div>
</div>
<!-- 右侧边栏 -->
<div class="space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-6">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="text-red-500 mr-2"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
@click="itemTyClick(item.id)"
>
<div class="relative h-40 mb-2 overflow-hidden rounded-lg">
<img
:src="item.images"
:alt="item.contentTitle"
class="w-full h-full object-cover object-center group-hover:scale-105 transition-transform duration-300"
/>
</div>
<h3
class="text-base font-medium group-hover:text-blue-600 text-black"
>
{{ item.contentTitle }}
</h3>
<p class="text-sm text-gray-500">{{ item.contentDatetime }}</p>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-6 text-black">
<h2 class="text-xl font-bold mb-4 flex items-center">
<el-icon class="text-yellow-500 mr-2"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="itemTyClick(item.id)"
>
<el-icon><Document /></el-icon>
<span class="text-sm group-hover:text-blue-600">{{
item.contentTitle
}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, watch } from "vue";
import {
User,
Clock,
View,
Star,
Location,
Bell,
Document,
ArrowRight,
} from "@element-plus/icons-vue";
import { useRoute, useRouter } from "vue-router";
import { getHit } from "@/api/home/news/list";
import { getNewsDetail } from "@/api/home/news/details";
import {
baseImageUrl,
XW_RD_ID,
TY_XW_ID,
SX_XW_ID,
TZ_GG_ID,
} from "@/utils/config";
import { getNewsList } from "@/api/home/news/list";
const route = useRoute();
const router = useRouter();
function toRouteName() {
switch (route.query.type) {
case "0":
return "首页";
case "1":
return "新闻热点";
case "2":
return "太原新闻";
case "3":
return "山西新闻";
case "4":
return "通知公告";
}
}
function toRoute() {
switch (route.query.type) {
case "0":
return "/home/home";
case "1":
return "/home/news";
case "2":
return "/home/tynews";
case "3":
return "/home/sxnews";
case "4":
return "/home/announcements";
}
}
const hotNews = ref([]);
const announcements = ref([]);
getHotsNewsList(3, 1);
//获取太原新闻
function getHotsNewsList(pageSize: number, pageNo: number) {
const datas = {
categoryId: XW_RD_ID,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
hotNews.value = rowsList;
});
}
function itemTyClick(id: number) {
router.push({
path: "/home/news/detail",
query: {
type: toType(),
id: id,
tabId: route.query.tabId,
},
});
}
function toType() {
switch (route.query.type) {
case "0":
return "0";
case "1":
return "1";
case "2":
return "2";
case "3":
return "3";
case "4":
return "4";
}
}
getTzGgNewsList(5, 1);
//获取通知公告
function getTzGgNewsList(pageSize: number, pageNo: number) {
const datas = {
categoryId: TZ_GG_ID,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
announcements.value = rowsList;
});
}
const details = ref({});
//统计点击数量
getHit(route.query.id);
const data = {
id: route.query.id,
};
// 监听数据变化
watch(
() => route.query.id,
(newVal, oldVal) => {
if (newVal) {
data.id = newVal;
getNewsDetail(data).then((res) => {
details.value = res.data;
console.log(details.value);
});
}
}
);
getNewsDetail(data).then((res) => {
details.value = res.data;
console.log(details.value);
});
function itemClicks(id: number) {
router.push({
path: "/home/news/detail",
query: {
id: id,
tabId: route.query.tabId,
},
});
}
</script>
<style scoped>
.prose img {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
}
.prose p {
margin-bottom: 1.5rem;
line-height: 1.75;
}
</style>
......@@ -13,14 +13,16 @@
<swiper-slide v-for="(slide, index) in slides" :key="index">
<div class="relative w-full h-full">
<img
:src="slide.image"
:alt="slide.title"
:src="slide.images"
class="w-full h-full object-cover"
@click="goToDetail(slide.id)"
/>
<div
class="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-6"
>
<h3 class="text-white text-xl font-medium">{{ slide.title }}</h3>
<h3 class="text-white text-xl font-medium">
{{ slide.contentTitle }}
</h3>
</div>
</div>
</swiper-slide>
......@@ -63,30 +65,42 @@
<!-- 最新新闻 -->
<div class="col-span-2 bg-white rounded-lg p-6 shadow-sm">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold" style="color: #000">最新新闻</h2>
<el-button type="primary" class="!rounded-button" text
<h2 class="text-xl font-bold" style="color: #000">太原新闻</h2>
<el-button
type="primary"
class="!rounded-button"
text
@click="goToTyMoreList()"
>更多</el-button
>
</div>
<div class="space-y-4">
<div
v-for="(news, index) in latestNews"
v-for="(item, index) in tyNews"
:key="index"
class="flex items-start space-x-4 pb-4 border-b last:border-0"
>
<img
:src="news.image"
:alt="news.title"
class="w-32 h-24 object-cover rounded"
/>
>
<!-- <el-image
class="w-102 h-24 object-cover rounded"
:src="item.images"
fit="fill"
/> -->
<img :src="item.images" class="w-32 h-24 object-cover rounded" />
<div>
<h3
class="text-lg font-medium mb-2 hover:text-blue-600 text-black"
@click="goToDetail(item.id)"
>
{{ news.title }}
{{ item.contentTitle }}
</h3>
<p class="text-gray-600 text-sm line-clamp-2">{{ news.desc }}</p>
<div class="mt-2 text-sm text-gray-500">{{ news.date }}</div>
<p class="text-gray-600 text-sm line-clamp-2">
{{ item.contentDescription }}
</p>
<div class="mt-2 text-sm text-gray-500">
{{ item.contentDatetime }}
</div>
</div>
</div>
</div>
......@@ -104,15 +118,18 @@
>
<h3
class="text-base font-medium hover:text-blue-600 cursor-pointer text-black"
@click="goToDetail(hot.id)"
>
{{ hot.title }}
{{ hot.contentTitle }}
</h3>
<div class="mt-2 text-sm text-gray-500">{{ hot.date }}</div>
<div class="mt-2 text-sm text-gray-500">
{{ hot.contentDatetime }}
</div>
</div>
</div>
</div>
<!-- 视频新闻 -->
<div class="bg-white rounded-lg p-6 shadow-sm">
<div class="bg-white rounded-lg p-6 shadow-sm" v-if="0">
<h2 class="text-xl font-bold mb-4 text-black">视频新闻</h2>
<div class="space-y-4">
<div
......@@ -143,30 +160,33 @@
</div>
</div>
<!-- 权威发布与辟谣专区 -->
<div class="container mx-auto px-4 mt-10 w-[1440px]">
<div class="container mx-auto px-4 mt-0 w-[1440px]">
<div class="grid grid-cols-2 gap-6">
<!-- 权威发布 -->
<div class="bg-white rounded-lg p-6 shadow-sm">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-black">权威发布</h2>
<el-button type="primary" class="!rounded-button" text
<!-- <el-button type="primary" class="!rounded-button" text
>更多</el-button
>
> -->
</div>
<div class="space-y-4">
<div
v-for="(item, index) in authoritativeNews"
:key="index"
class="flex items-center space-x-3 pb-3 border-b last:border-b-0"
@click="goToDetail(item.id)"
>
<!-- <el-icon class="text-blue-600 text-xl"><Document /></el-icon> -->
<div class="flex-1">
<h3
class="text-base font-medium hover:text-blue-600 cursor-pointer text-black"
>
{{ item.title }}
{{ item.contentTitle }}
</h3>
<div class="mt-1 text-sm text-gray-500">{{ item.date }}</div>
<div class="mt-1 text-sm text-gray-500">
{{ item.contentDatetime }}
</div>
</div>
</div>
</div>
......@@ -175,20 +195,20 @@
<div class="bg-white rounded-lg p-6 shadow-sm">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-black">辟谣专区</h2>
<el-button type="primary" class="!rounded-button" text
<!-- <el-button type="primary" class="!rounded-button" text
>更多</el-button
>
> -->
</div>
<div class="space-y-4">
<div
v-for="(item, index) in rumourNews"
:key="index"
class="flex items-start space-x-3 pb-4 border-b last:border-b-0"
@click="goToDetail(item.id)"
>
<div class="flex-shrink-0 w-24 h-16">
<img
:src="item.image"
:alt="item.title"
:src="item.images"
class="w-full h-full object-cover rounded"
/>
</div>
......@@ -200,11 +220,11 @@
<h3
class="text-base font-medium hover:text-blue-600 cursor-pointer text-black"
>
{{ item.title }}
{{ item.contentTitle }}
</h3>
</div>
<p class="mt-1 text-sm text-gray-500 line-clamp-2">
{{ item.desc }}
{{ item.contentDescription }}
</p>
</div>
</div>
......@@ -221,6 +241,7 @@
v-for="(link, index) in friendLinks"
:key="index"
:href="link.url"
target="_blank"
class="text-gray-600 hover:text-blue-600"
>
{{ link.name }}
......@@ -247,6 +268,18 @@ import "swiper/css";
import "swiper/css/pagination";
import "swiper/css/autoplay";
import "swiper/css/navigation";
import { getBanner } from "@/api/home/home";
import { getNewsList } from "@/api/home/news/list";
import {
baseImageUrl,
rdxw,
sxxw,
tzgg,
tyxw,
lbt,
pyzq,
qwfb,
} from "@/utils/config";
const router = useRouter();
const swiperModules = [Pagination, Autoplay];
......@@ -269,23 +302,131 @@ const handleClick = (index: number, entry: any) => {
}
// 处理点击事件
};
const slides = [
{
image:
"https://ai-public.mastergo.com/ai/img_res/4897a9dab80e53628f1ca854d891279f.jpg",
title: "太原市召开互联网安全工作会议,部署2024年重点任务",
},
{
image:
"https://ai-public.mastergo.com/ai/img_res/8b7a009fc227cb96122e46df2f91e4bd.jpg",
title: "我市成功举办2024年网络安全宣传周活动",
},
{
image:
"https://ai-public.mastergo.com/ai/img_res/14df14e37438beb78afd9827e433a0a0.jpg",
title: "太原互联网产业发展论坛圆满落幕",
},
];
const tyNews = ref([]);
const hotNews = ref([]);
const authoritativeNews = ref([]);
const rumourNews = ref([]);
//获取轮播图数据
getBanner().then((response) => {
console.log(response);
});
getTyNewsList(5, 1);
//获取太原新闻
function getTyNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tyxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
tyNews.value = rowsList;
});
}
function goToDetail(id: number) {
router.push({
path: "/home/news/detail",
query: {
type: 0,
id: id,
},
});
}
//太原更多
function goToTyMoreList() {
router.push({
path: "/home/tynews",
query: {
type: 0,
},
});
}
getHotsNewsList(4, 1);
//获取新闻热点
function getHotsNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: rdxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
hotNews.value = rowsList;
});
}
getQwList(5, 1);
//获取权威发布
function getQwList(pageSize: number, pageNo: number) {
const datas = {
contentType: qwfb,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
authoritativeNews.value = rowsList;
});
}
getPyList(5, 1);
//获取辟谣专区
function getPyList(pageSize: number, pageNo: number) {
const datas = {
contentType: pyzq,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
rumourNews.value = rowsList;
});
}
getLbtList(5, 1);
//获取首页轮播图
function getLbtList(pageSize: number, pageNo: number) {
const datas = {
contentType: lbt,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
slides.value = rowsList;
});
}
const slides = ref([]);
const quickEntries = [
{
title: "太原市互联网联合辟谣平台",
......@@ -303,114 +444,27 @@ const quickEntries = [
bg: "https://ai-public.mastergo.com/ai/img_res/c907287d38d89eb460120dc7cf6b2d17.jpg",
},
];
const latestNews = [
{
title: "太原市举办首届数字经济创新发展大会",
desc: "大会聚焦数字经济发展趋势,探讨人工智能、大数据等新技术在城市发展中的应用前景。",
date: "2024-01-15",
image:
"https://ai-public.mastergo.com/ai/img_res/5c3df44b8184cf0a53cd29c1a0133b7f.jpg",
},
{
title: '我市启动"智慧城市"建设新阶段',
desc: "计划在未来三年内完成城市数字化转型升级,打造智能交通、智慧医疗等重点项目。",
date: "2024-01-14",
image:
"https://ai-public.mastergo.com/ai/img_res/ee06f443e7bc41d264c3987e7650de69.jpg",
},
{
title: "太原市成功举办第三届网络安全技能大赛",
desc: "来自全市各大院校和企业的300多名选手参加比赛,展示网络安全攻防技能。",
date: "2024-01-13",
image:
"https://ai-public.mastergo.com/ai/img_res/38920bb1d8a7b9cc8065be10a25c1efe.jpg",
},
{
title: '太原市推出"互联网+政务服务"新举措',
desc: "新平台整合了200多项政务服务,市民足不出户即可办理多项业务。",
date: "2024-01-12",
image:
"https://ai-public.mastergo.com/ai/img_res/8507bb9bc9c2848826d89bc7ab19a969.jpg",
},
{
title: "太原互联网产业园区引进十家知名科技企业",
desc: "产业园区新引进的企业将带来近千个就业岗位,推动本地数字经济发展。",
date: "2024-01-11",
image:
"https://ai-public.mastergo.com/ai/img_res/065d985659cc9f2d37dbf9c00429ed2f.jpg",
},
];
const hotNews = [
{
title: '太原市获评"2023年度网络安全示范城市"',
date: "2024-01-13",
},
{
title: "我市开展网络安全专项整治行动",
date: "2024-01-12",
},
{
title: "太原互联网企业助力乡村振兴",
date: "2024-01-11",
},
];
const videoNews = [
{
title: "2024太原网络安全周开幕式",
cover:
"https://ai-public.mastergo.com/ai/img_res/c127709d932c688f0fd802b468fbeb1b.jpg",
},
{
title: "太原智慧城市建设成果展示",
cover:
"https://ai-public.mastergo.com/ai/img_res/04b4d2ca1d91d73dac6a0f4316b13165.jpg",
},
];
const authoritativeNews = [
{
title: "太原市网信办发布《2024年网络安全管理规定》",
date: "2024-01-15",
},
{
title: "关于加强网络信息内容生态治理的实施意见",
date: "2024-01-14",
},
{
title: "太原市互联网行业自律公约发布",
date: "2024-01-13",
},
{
title: "2024年太原市互联网发展白皮书",
date: "2024-01-12",
},
];
const rumourNews = [
{
title: '关于"太原将全面取消公交卡"的谣言说明',
desc: '近期网传"太原将全面取消公交卡"的消息不实,公交卡服务将继续保留。',
image:
"https://ai-public.mastergo.com/ai/img_res/aed0abc9ee93b7f23cba4f63bd702c60.jpg",
},
{
title: "辟谣:太原地铁工程已全面停工",
desc: "相关部门表示,太原地铁工程正在有序推进中,网传停工消息为谣言。",
image:
"https://ai-public.mastergo.com/ai/img_res/f75dddff6745c8bb45fc7828053d8b2c.jpg",
},
{
title: "澄清:关于网传医保卡系统升级消息",
desc: "针对网传医保卡系统升级将导致服务暂停的消息,市医保局进行了澄清。",
image:
"https://ai-public.mastergo.com/ai/img_res/32ff2002f36671ecf2465d6c03b3a61f.jpg",
},
];
// const videoNews = [
// {
// title: "2024太原网络安全周开幕式",
// cover:
// "https://ai-public.mastergo.com/ai/img_res/c127709d932c688f0fd802b468fbeb1b.jpg",
// },
// {
// title: "太原智慧城市建设成果展示",
// cover:
// "https://ai-public.mastergo.com/ai/img_res/04b4d2ca1d91d73dac6a0f4316b13165.jpg",
// },
// ];
const friendLinks = [
{ name: "太原市人民政府", url: "#" },
{ name: "山西省网信办", url: "#" },
{ name: "太原日报", url: "#" },
{ name: "山西新闻网", url: "#" },
{ name: "太原广播电视台", url: "#" },
{ name: "太原市公安局", url: "#" },
{ name: "太原市人民政府", url: "https://www.taiyuan.gov.cn" },
{ name: "山西省网信办", url: "http://www.casx.gov.cn" },
{ name: "太原日报", url: "http://www.tynews.com.cn" },
{ name: "山西新闻网", url: "https://www.sxgov.cn" },
{ name: "太原广播电视台", url: "https://www.sxtygdy.com" },
{ name: "太原市公安局", url: "https://gaj.taiyuan.gov.cn" },
];
</script>
<style scoped>
......
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="container mx-auto px-0 py-5 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
......@@ -9,57 +9,68 @@
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
@click="itemClick(news.id)"
@click="getToDetail(news.id)"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
<el-image
class="w-full h-full object-cover"
:src="news.images"
fit="fill"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
{{ news.contentTitle }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
{{ news.contentDescription }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
{{ news.contentDatetime }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
{{ news.contentTags }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
{{ news.contentHit }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<div class="w-24 flex-shrink-0 text-right text-blue-500">
<el-tag
:type="news.category.type"
:type="news.contentTags"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
{{ news.contentTags }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<!-- <el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage4"
:page-sizes="[100, 200, 300, 400]"
:page-size="100"
layout="total, sizes, prev, pager, next, jumper"
:total="400"
>
</el-pagination> -->
<el-pagination
v-model:current-page="currentPage"
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
......@@ -70,17 +81,23 @@
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
太原新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
v-for="(item, index) in tyNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<!-- <el-image
class="w-full h-full object-cover"
:src="item.images"
:fit="fit"
></el-image> -->
<img
:src="item.image"
:src="item.images"
:alt="item.title"
class="w-full h-full object-cover"
/>
......@@ -88,7 +105,7 @@
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
{{ item.contentTitle }}
</div>
</div>
</div>
......@@ -104,11 +121,12 @@
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="getToDetail(item.id)"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<el-tag size="small" :type="item.type">公告 </el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>{{ item.contentTitle }}</span
>
</div>
</div>
......@@ -120,6 +138,8 @@
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, rdxw, tyxw, tzgg } from "@/utils/config";
import {
Clock,
Document,
......@@ -129,127 +149,97 @@ import {
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
import { useRouter } from "vue-router";
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const currentPage = ref(1);
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(100);
const total = ref(0);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
function itemClick(id: number) {
const newsList = ref([]);
const tyNews = ref([]);
const announcements = ref([]);
getTyNewsList(3, 1);
//获取太原新闻
function getTyNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tyxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
tyNews.value = rowsList;
});
}
getTzGgNewsList(5, 1);
//获取通知公告
function getTzGgNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
announcements.value = rowsList;
});
}
getList(pageSize.value, pageNo.value);
//获取新闻热点列表
function getList(pageSize: number, pageNo: number) {
// newsList.value = [];
const datas = {
contentType: rdxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
total.value = data.total;
newsList.value = rowsList;
// console.log(newsList.value);
});
}
function getToDetail(id: number) {
router.push({
path: "/home/newsdetail",
path: "/home/news/detail",
query: {
type: 1,
id: id,
......
<template>
<div class="min-h-screen bg-gray-50">
<div class="w-[1440px] mx-auto px-0 py-5">
<div class="flex items-center text-sm text-gray-500 mb-2">
<router-link to="/home/news" class="text-gray-500 hover:text-blue-500"
>新闻热点</router-link
>
<el-icon class="mx-2"><ArrowRight /></el-icon>
<span class="text-gray-900">新闻详情</span>
</div>
<!-- 主要内容区 -->
<div class="grid grid-cols-3 gap-8">
<!-- 左侧主要新闻内容 -->
<div class="col-span-2 bg-white rounded-lg shadow-sm p-6">
<h1 class="text-3xl font-bold mb-4 text-black">
中国科技创新助力"双碳"目标实现 打造绿色发展新优势
</h1>
<div class="flex items-center text-gray-600 mb-6 space-x-4">
<div class="flex items-center">
<el-icon><User /></el-icon>
<span class="ml-1">李明远</span>
</div>
<div class="flex items-center">
<el-icon><Clock /></el-icon>
<span class="ml-1">2024 年 1 月 15 日 14:30</span>
</div>
<div class="flex items-center">
<el-icon><View /></el-icon>
<span class="ml-1">阅读 2,387</span>
</div>
</div>
<div class="prose max-w-none">
<img
:src="mainImage"
alt="科技创新"
class="w-full h-[400px] object-cover object-center rounded-lg mb-6"
/>
<p class="text-lg leading-relaxed mb-4 text-black">
近日,国务院新闻办公室发布《中国应对气候变化的政策与行动》白皮书,全面介绍中国应对气候变化的最新政策措施、行动成效和基本立场。白皮书指出,中国将秉持人类命运共同体理念,为应对全球气候变化作出更大贡献。
</p>
<p class="text-lg leading-relaxed mb-4 text-black">
在"双碳"目标引领下,中国正在加快构建清洁低碳安全高效的能源体系。2023年前三季度,我国可再生能源发电装机规模持续扩大,光伏发电新增装机超过
8000 万千瓦,风电新增装机超过 2500 万千瓦。
</p>
<img
:src="contentImage1"
alt="可再生能源"
class="w-full h-[300px] object-cover object-center rounded-lg my-6"
/>
<p class="text-lg leading-relaxed mb-4 text-black">
科技创新在推动绿色低碳发展中发挥着关键作用。我国在氢能、储能、智能电网等领域取得重要突破,新型电力系统建设稳步推进,能源技术创新能力显著增强。
</p>
</div>
</div>
<!-- 右侧边栏 -->
<div class="space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-6">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="text-red-500 mr-2"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
@click="itemClicks(item.id)"
>
<div class="relative h-40 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover object-center group-hover:scale-105 transition-transform duration-300"
/>
</div>
<h3
class="text-base font-medium group-hover:text-blue-600 text-black"
>
{{ item.title }}
</h3>
<p class="text-sm text-gray-500">{{ item.date }}</p>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-6 text-black">
<h2 class="text-xl font-bold mb-4 flex items-center">
<el-icon class="text-blue-500 mr-2"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="flex items-start space-x-3 group cursor-pointer"
@click="itemClicks(item.id)"
>
<div class="flex-shrink-0 w-20 h-20 overflow-hidden rounded">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover object-center"
/>
</div>
<div>
<h3 class="text-sm font-medium group-hover:text-blue-600">
{{ item.title }}
</h3>
<p class="text-xs text-gray-500 mt-1">{{ item.date }}</p>
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-6 text-black">
<h2 class="text-xl font-bold mb-4 flex items-center">
<el-icon class="text-yellow-500 mr-2"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(notice, index) in notices"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
>
<el-icon><Document /></el-icon>
<span class="text-sm group-hover:text-blue-600">{{
notice.title
}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
User,
Clock,
View,
Star,
Location,
Bell,
Document,
ArrowRight,
} from "@element-plus/icons-vue";
import { useRouter } from "vue-router";
const router = useRouter();
const mainImage =
"https://ai-public.mastergo.com/ai/img_res/fc0c8191fe99a188a31adcb3a2740d5c.jpg";
const contentImage1 =
"https://ai-public.mastergo.com/ai/img_res/fa798b4a2d6f1644a8e92055a99ebd18.jpg";
const hotNews = ref([
{
title: "新能源汽车产业链全面布局,本地企业创新发展提速",
image:
"https://ai-public.mastergo.com/ai/img_res/33a919df2dcf2f3a8273be6a047741d9.jpg",
date: "2024-01-15",
},
{
title: "智慧城市建设再添新章,5G 技术赋能城市治理",
image:
"https://ai-public.mastergo.com/ai/img_res/c88855fc16b1e5c2a4d2dc275b8160f2.jpg",
date: "2024-01-14",
},
]);
const localNews = ref([
{
title: "我市举办 2024 年科技创新成果展",
image:
"https://ai-public.mastergo.com/ai/img_res/e0c468c5b9241d5d19cadc683c030bbd.jpg",
date: "2024-01-15",
},
{
title: "本地高新技术企业突破 500 家",
image:
"https://ai-public.mastergo.com/ai/img_res/cb9da54c9a1ba3bdf71ba9abcf8cee40.jpg",
date: "2024-01-14",
},
{
title: "首届数字经济发展论坛成功举办",
image:
"https://ai-public.mastergo.com/ai/img_res/09e109cd6473f1976e4949acc619b480.jpg",
date: "2024-01-13",
},
]);
const notices = ref([
{
title: "关于组织申报 2024 年度科技创新项目的通知",
},
{
title: "2024 年第一季度高新技术企业认定工作启动",
},
{
title: "关于开展科技型中小企业评价工作的通知",
},
{
title: "2024 年科技创新券申领指南",
},
{
title: "关于征集科技创新政策建议的公告",
},
]);
function itemClicks(id: number) {
router.push({
path: "/home/newsdetail",
query: {
id: id,
},
});
}
</script>
<style scoped>
.prose img {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
}
.prose p {
margin-bottom: 1.5rem;
line-height: 1.75;
}
</style>
......@@ -9,56 +9,58 @@
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
@click="getToDetail(news.id)"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
<el-image
class="w-full h-full object-cover"
:src="news.images"
fit="fill"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
{{ news.contentTitle }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
{{ news.contentDescription }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
{{ news.contentDatetime }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
{{ news.contentTags }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
{{ news.contentHit }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<div class="w-24 flex-shrink-0 text-right text-blue-500">
<el-tag
:type="news.category.type"
:type="news.contentTags"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
{{ news.contentTags }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
......@@ -77,45 +79,20 @@
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
{{ item.contentTitle }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
{{ item.contentHit }} 阅读
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
......@@ -127,11 +104,12 @@
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="getToDetail(item.id)"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<el-tag size="small" :type="item.type">公告</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>{{ item.contentTitle }}</span
>
</div>
</div>
......@@ -143,6 +121,8 @@
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, rdxw, sxxw, tzgg } from "@/utils/config";
import {
Clock,
Document,
......@@ -152,133 +132,99 @@ import {
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(100);
const total = ref(0);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
const newsList = ref([]);
const hotNews = ref([]);
const announcements = ref([]);
getHotsNewsList(3, 1);
//获取太原新闻
function getHotsNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: rdxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
hotNews.value = rowsList;
});
}
getTzGgNewsList(5, 1);
//获取通知公告
function getTzGgNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
announcements.value = rowsList;
});
}
getList(pageSize.value, pageNo.value);
//获取新闻热点列表
function getList(pageSize: number, pageNo: number) {
// newsList.value = [];
const datas = {
contentType: sxxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
total.value = data.total;
newsList.value = rowsList;
// console.log(newsList.value);
});
}
function getToDetail(id: number, contentDetails: string) {
router.push({
path: "/home/news/detail",
query: {
type: 3,
id: id,
},
});
}
</script>
<style scoped>
.line-clamp-2 {
......
......@@ -9,56 +9,58 @@
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
@click="getToDetail(news.id)"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
<el-image
class="w-full h-full object-cover"
:src="news.images"
fit="fill"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
{{ news.contentTitle }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
{{ news.contentDescription }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
{{ news.contentDatetime }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
{{ news.contentTags }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
{{ news.contentHit }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<div class="w-24 flex-shrink-0 text-right text-blue-500">
<el-tag
:type="news.category.type"
:type="news.contentTags"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
{{ news.contentTags }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
......@@ -77,45 +79,20 @@
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
@click="getToDetail(item.id)"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
{{ item.contentTitle }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
{{ item.contentHit }} 阅读
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
......@@ -127,11 +104,12 @@
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="getToDetail(item.id)"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<el-tag size="small" :type="item.type">公告</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>{{ item.contentTitle }}</span
>
</div>
</div>
......@@ -143,6 +121,8 @@
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, rdxw, tyxw, tzgg } from "@/utils/config";
import {
Clock,
Document,
......@@ -152,133 +132,99 @@ import {
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(100);
const total = ref(0);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
const newsList = ref([]);
const hotNews = ref([]);
const announcements = ref([]);
getHotsNewsList(3, 1);
//获取太原新闻
function getHotsNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: rdxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
hotNews.value = rowsList;
});
}
getTzGgNewsList(5, 1);
//获取通知公告
function getTzGgNewsList(pageSize: number, pageNo: number) {
const datas = {
contentType: tzgg,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
announcements.value = rowsList;
});
}
getList(pageSize.value, pageNo.value);
//获取新闻热点列表
function getList(pageSize: number, pageNo: number) {
// newsList.value = [];
const datas = {
contentType: tyxw,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
total.value = data.total;
newsList.value = rowsList;
// console.log(newsList.value);
});
}
function getToDetail(id: number) {
router.push({
path: "/home/news/detail",
query: {
type: 2,
id: id,
},
});
}
</script>
<style scoped>
.line-clamp-2 {
......
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<!-- 权威发布 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
class="w-full h-full object-cover"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-orange-500"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<news-list
typePage="1"
title1="辟谣专区"
title2="专家解读"
title3="法律法规"
:type0="qwfb"
:type1="pyzq"
:type2="zjjd"
:type3="flfg"
/>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(100);
const handleSizeChange = (val: number) => {
pageSize.value = val;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
import { pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import NewsList from "@/components/py/NewsList.vue";
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<style scoped></style>
<template>
<div class="min-h-screen bg-gray-50">
<div class="w-[1440px] mx-auto px-0 py-5">
<div class="flex items-center text-sm text-gray-500 mb-2">
<router-link
:to="toRoute()"
class="text-gray-500 hover:text-blue-500"
>{{ toRouteName() }}</router-link
>
<el-icon class="mx-2"><ArrowRight /></el-icon>
<span class="text-gray-900">新闻详情</span>
</div>
<!-- 主要内容区 -->
<div class="grid grid-cols-3 gap-8">
<!-- 左侧主要新闻内容 -->
<div class="col-span-2 bg-white rounded-lg shadow-sm p-6">
<h1 class="text-3xl font-bold mb-4 text-black">
{{ details.title }}
</h1>
<div class="flex items-center text-gray-600 mb-6 space-x-4">
<div class="flex items-center">
<el-icon><User /></el-icon>
<span class="ml-1">{{ details.author }}</span>
</div>
<div class="flex items-center">
<el-icon><Clock /></el-icon>
<span class="ml-1">{{ details.date }}</span>
</div>
<div class="flex items-center">
<el-icon><View /></el-icon>
<span class="ml-1">阅读 {{ details.hit }}</span>
</div>
</div>
<div v-html="details.content"></div>
</div>
<!-- 右侧边栏 -->
<div class="space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-6">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="text-red-500 mr-2"><Star /></el-icon>
{{ route.query.title1 }}
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in list1"
:key="index"
class="group cursor-pointer"
@click="goToDetail(item.id)"
>
<div class="relative h-40 mb-2 overflow-hidden rounded-lg">
<img
:src="item.images"
:alt="item.contentTitle"
class="w-full h-full object-cover object-center group-hover:scale-105 transition-transform duration-300"
/>
</div>
<h3
class="text-base font-medium group-hover:text-blue-600 text-black"
>
{{ item.contentTitle }}
</h3>
<p class="text-sm text-gray-500">{{ item.contentDatetime }}</p>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-6 text-black">
<h2 class="text-xl font-bold mb-4 flex items-center">
<el-icon class="text-yellow-500 mr-2"><Bell /></el-icon>
{{ route.query.title2 }}
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in list2"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
@click="goToDetail(item.id)"
>
<el-icon><Document /></el-icon>
<span class="text-sm group-hover:text-blue-600">{{
item.contentTitle
}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, watch } from "vue";
import {
User,
Clock,
View,
Star,
Location,
Bell,
Document,
ArrowRight,
} from "@element-plus/icons-vue";
import { useRoute, useRouter } from "vue-router";
import { getHit } from "@/api/home/news/list";
import { getNewsDetail } from "@/api/home/news/details";
import { baseImageUrl } from "@/utils/config";
import { getNewsList } from "@/api/home/news/list";
const route = useRoute();
const router = useRouter();
const details = ref({});
const list1 = ref([]);
const list2 = ref([]);
function toRouteName() {
switch (route.query.type) {
case "0":
return "首页";
case "1":
return "权威发布";
case "2":
return "辟谣专区";
case "3":
return "专家解读";
case "4":
return "法律法规";
case "5":
return "读图识谣";
}
}
function toRoute() {
switch (route.query.type) {
case "0":
return "/py/pyhome";
case "1":
return "/py/authority";
case "2":
return "/py/rumor";
case "3":
return "/py/expert";
case "4":
return "/py/law";
case "5":
return "/py/reading";
}
}
getList1(3, 1);
getList2(5, 1);
function getList1(pageSize: number, pageNo: number) {
const datas = {
contentType: route.query.type1,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list1.value = rowsList;
});
}
function goToDetail(id: number) {
router.push({
path: "/py/news/detail",
query: {
type: route.query.type,
id: id,
},
});
}
//获取通知公告
function getList2(pageSize: number, pageNo: number) {
const datas = {
contentType: route.query.type2,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
list2.value = rowsList;
});
}
//统计点击数量
getHit(route.query.id);
const data = {
id: route.query.id,
};
// 监听数据变化
watch(
() => route.query.id,
(newVal, oldVal) => {
if (newVal) {
data.id = newVal;
getNewsDetail(data).then((res) => {
details.value = res.data;
console.log(details.value);
});
}
}
);
getNewsDetail(data).then((res) => {
details.value = res.data;
console.log(details.value);
});
</script>
<style scoped>
.prose img {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
}
.prose p {
margin-bottom: 1.5rem;
line-height: 1.75;
}
</style>
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<!-- 专家解读 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
class="w-full h-full object-cover"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-orange-500"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<news-list
typePage="3"
title1="权威发布"
title2="辟谣专区"
title3="法律法规"
:type0="zjjd"
:type1="qwfb"
:type2="pyzq"
:type3="flfg"
:homeMoreType="route.query.homeMoreType"
/>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(100);
const handleSizeChange = (val: number) => {
pageSize.value = val;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
import { pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import NewsList from "@/components/py/NewsList.vue";
import { useRoute } from "vue-router";
const route = useRoute();
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<style scoped></style>
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<!-- 首页 -->
<template>
<div class="mx-auto bg-gray-200">
<main class="container mx-auto px-8 py-8">
......@@ -51,7 +51,7 @@
</div>
<div class="grid grid-cols-3 gap-6">
<el-card
v-for="(section, index) in sections"
v-for="(section, index) in list1"
:key="index"
class="h-full"
>
......@@ -60,7 +60,9 @@
<span class="text-xl font-bold text-primary">{{
section.title
}}</span>
<el-button type="primary" text>更多 ></el-button>
<el-button type="primary" text @click="goToTyMoreList(index)"
>更多 ></el-button
>
</div>
</template>
<el-scrollbar height="400px">
......@@ -74,7 +76,7 @@
<el-link
:underline="false"
class="text-gray-700 hover:text-primary truncate"
>{{ item }}</el-link
>{{ item.contentTitle }}</el-link
>
</li>
</ul>
......@@ -130,6 +132,12 @@ import "swiper/css";
import "swiper/css/pagination";
import "swiper/css/autoplay";
import "swiper/css/navigation";
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, dtsy, zjjd, pyzq, flfg } from "@/utils/config";
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const route = useRoute();
const activeIndex = ref("0");
const swiperModules = [Pagination, Navigation, Autoplay];
const menuItems = [
......@@ -140,6 +148,46 @@ const menuItems = [
"法律法规",
"读图识谣",
];
//专家解读、辟谣专区、法律法规 更多
function goToTyMoreList(index: number) {
switch (index) {
case 0: //专家解读
router.push({
path: "/py/expert",
query: {
homeMoreType: "-1",
},
});
break;
case 1: //辟谣专区
router.push({
path: "/py/rumor",
query: {
homeMoreType: "-1",
},
});
break;
case 2: //法律法规
router.push({
path: "/py/law",
query: {
homeMoreType: "-1",
},
});
break;
}
}
// function getToDetail(section: any) {
// router.push({
// path: "/py/news/detail",
// query: {
// type: 5,
// id: id,
// },
// });
// }
const slides = [
{
src: "https://ai-public.mastergo.com/ai/img_res/a6c6b005094da8f76e79def3225b4ea0.jpg",
......@@ -160,51 +208,48 @@ const quickLinks = [
{ icon: Bell, title: "举报中心" },
{ icon: Collection, title: "知识库" },
];
const sections = [
const list1 = ref([
{
title: "专家解读",
items: [
"专家详解:新冠病毒变异株的特点与防护要点",
"权威专家谈饮食健康:科学认识营养补充剂",
"医学专家解读:常见慢性病的预防与管理",
"专家视角:解读最新公共卫生政策",
"心理健康专家:如何应对现代生活压力",
"环境卫生专家:空气污染与健康防护",
"运动医学专家:科学健身指南",
"营养学专家:平衡饮食的重要性",
"中医专家:传统养生之道的现代价值",
"公共卫生专家:群体免疫的科学认识",
],
items: [],
},
{
title: "辟谣专区",
items: [
"辟谣:喝热水可以预防新冠病毒感染?",
"谣言粉碎:5G基站会传播病毒",
"假新闻核实:某食品添加剂致癌?",
"事实核查:网传特效药可治百病",
"辟谣:转发朋友圈可以赚钱?",
"真相:某款保健品包治百病",
"谣言终结:吃某水果可预防癌症",
"揭秘:网传养生方法的科学依据",
],
items: [],
},
{
title: "法律法规",
items: [
"《中华人民共和国网络安全法》解读",
"《互联网信息服务管理办法》要点",
"《网络谣言治理规定》重点条款",
"《个人信息保护法》主要内容",
"《数据安全法》核心要义",
"《未成年人网络保护条例》解析",
"《网络信息内容生态治理规定》",
"《网络安全审查办法》要点",
"《互联网新闻信息服务管理规定》",
"《网络直播营销管理办法》解读",
],
items: [],
},
];
]);
getList(zjjd, 10, 1);
getList(pyzq, 10, 1);
getList(flfg, 10, 1);
//获取专家解读
function getList(value: string, pageSize: number, pageNo: number) {
const datas = {
contentType: value,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
switch (value) {
case zjjd:
list1.value[0].items = response.data.rows;
break;
case pyzq:
list1.value[1].items = response.data.rows;
break;
case flfg:
list1.value[2].items = response.data.rows;
break;
}
});
}
const serviceCards = [
{
image:
......
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<!-- 法律法规 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
class="w-full h-full object-cover"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-orange-500"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<news-list
typePage="4"
title1="辟谣专区"
title2="专家解读"
title3="权威发布"
:type0="flfg"
:type1="pyzq"
:type2="zjjd"
:type3="qwfb"
:homeMoreType="route.query.homeMoreType"
/>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(100);
const handleSizeChange = (val: number) => {
pageSize.value = val;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
import { baseImageUrl, pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import NewsList from "@/components/py/NewsList.vue";
import { useRoute } from "vue-router";
const route = useRoute();
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<style scoped></style>
......@@ -6,31 +6,33 @@
<!-- 分类卡片 -->
<div class="grid grid-cols-4 gap-6">
<div
v-for="(card, index) in displayedCards"
v-for="(card, index) in newsList"
:key="index"
class="bg-white rounded-lg shadow-lg p-6 transition-transform hover:scale-105"
>
<div class="h-48 w-full mb-4 overflow-hidden rounded-lg">
<img
:src="card.image"
:src="card.images"
class="w-full h-full object-cover object-top"
:alt="card.title"
/>
</div>
<h3 class="text-lg font-semibold mb-2 text-black">
{{ card.title }}
{{ card.contentTitle }}
</h3>
<p class="text-gray-600 text-sm">{{ card.description }}</p>
<p class="text-gray-600 text-sm">{{ card.contentDescription }}</p>
</div>
</div>
<!-- 分页器 -->
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
:page-size="pageSize"
:total="categoryCards.length"
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@current-change="handlePageChange"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
......@@ -39,112 +41,55 @@
</template>
<script lang="ts" setup>
import { ref, computed } from "vue";
const currentPage = ref(1);
const pageSize = ref(20); // 5行 * 4列 = 20个卡片每页
const categoryCards = ref([
{
title: "健康科普讲堂",
description: "权威专家为您解读健康知识",
image:
"https://ai-public.mastergo.com/ai/img_res/6800ba6e6e9d58a5213dc35cf45aa935.jpg",
},
{
title: "食品安全专区",
description: "关注食品安全 守护健康生活",
image:
"https://ai-public.mastergo.com/ai/img_res/78f282fecb2ca46ce277f577524926de.jpg",
},
{
title: "网络安全知识",
description: "提高网络安全意识",
image:
"https://ai-public.mastergo.com/ai/img_res/bb7c7391590947d1b62c033101ceab1f.jpg",
},
{
title: "法律咨询服务",
description: "专业律师在线解答",
image:
"https://ai-public.mastergo.com/ai/img_res/08d0b1cfc3bcd904005904ec16e87573.jpg",
},
{
title: "医疗保健资讯",
description: "最新医疗动态与健康资讯",
image:
"https://ai-public.mastergo.com/ai/img_res/408a398536fdd6b6a1ee1833fd871af9.jpg",
},
{
title: "金融理财教育",
description: "理财知识普及与风险防范",
image:
"https://ai-public.mastergo.com/ai/img_res/09d3e310f9675431ec0f0b01930223bf.jpg",
},
{
title: "环境保护知识",
description: "关注环保 共建绿色家园",
image:
"https://ai-public.mastergo.com/ai/img_res/1b0f2097ceb49e335495ef6095572d4c.jpg",
},
{
title: "科技创新资讯",
description: "前沿科技动态解读",
image:
"https://ai-public.mastergo.com/ai/img_res/ec1abd62da14d0096ae77aa443cb22e8.jpg",
},
{
title: "教育培训专区",
description: "优质教育资源分享",
image:
"https://ai-public.mastergo.com/ai/img_res/7c7de0bf98bbf1ac35654cd1503ba162.jpg",
},
{
title: "消费者权益",
description: "维护消费者合法权益",
image:
"https://ai-public.mastergo.com/ai/img_res/f42618aed905f908d6bfbde74424ad96.jpg",
},
{
title: "心理健康咨询",
description: "专业心理疏导服务",
image:
"https://ai-public.mastergo.com/ai/img_res/c0e8ccc1760dc19341bb90378d5881e0.jpg",
},
{
title: "职业发展指导",
description: "职业规划与发展建议",
image:
"https://ai-public.mastergo.com/ai/img_res/8d9d7cff19219ee57277896ffe595daf.jpg",
},
{
title: "社会公益服务",
description: "传播正能量 服务社会",
image:
"https://ai-public.mastergo.com/ai/img_res/3624cecd0bd83bc1c7c42a4855ea86c4.jpg",
},
{
title: "文化艺术鉴赏",
description: "提升文化艺术素养",
image:
"https://ai-public.mastergo.com/ai/img_res/ec0d55c0836f437f63cb01abd4de66b6.jpg",
},
{
title: "旅游出行提醒",
description: "安全出行 精彩旅程",
image:
"https://ai-public.mastergo.com/ai/img_res/267be4f0ac5afd82e63d9d014910f868.jpg",
},
{
title: "家居生活指南",
description: "美好生活 从家开始",
image:
"https://ai-public.mastergo.com/ai/img_res/0d72b856588b033151967bb4c2630a15.jpg",
},
]);
const displayedCards = computed(() => {
const start = (currentPage.value - 1) * pageSize.value;
return categoryCards.value.slice(start, start + pageSize.value);
});
const handlePageChange = (val: number) => {
currentPage.value = val;
import { getNewsList } from "@/api/home/news/list";
import { baseImageUrl, dtsy } from "@/utils/config";
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const route = useRoute();
const pageNo = ref(1);
const pageSize = ref(10);
const total = ref(0);
const newsList = ref([]);
const handleSizeChange = (val: number) => {
pageSize.value = val;
pageNo.value = pageNo.value;
};
const handleCurrentChange = (val: number) => {
pageSize.value = pageSize.value;
pageNo.value = val;
getList(pageSize.value, pageNo.value);
};
getList(10, 1);
//获取专家解读
function getList(pageSize: number, pageNo: number) {
const datas = {
contentType: dtsy,
pageSize: pageSize,
pageNo: pageNo,
};
getNewsList(datas).then((response) => {
const data = response.data;
const rowsList = data.rows;
rowsList.forEach((item: any) => {
if (item.contentImg) {
item.images = baseImageUrl(JSON.parse(item.contentImg)[0].path);
}
});
newsList.value = rowsList;
});
}
function getToDetail(id: number) {
router.push({
path: "/py/news/detail",
query: {
type: 5,
id: id,
},
});
}
</script>
<style scoped></style>
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<!-- 辟谣专区 -->
<template>
<div class="min-h-screen bg-gray-50">
<div class="container mx-auto px-4 py-8 w-[1440px]">
<div class="flex gap-6">
<div class="flex-1">
<div class="bg-white rounded-lg shadow-sm">
<div
v-for="(news, index) in newsList"
:key="index"
class="group p-4 flex items-start border-b border-gray-100 hover:bg-gray-50 transition-colors cursor-pointer"
>
<div class="w-32 h-32 flex-shrink-0 overflow-hidden rounded-lg">
<img
:src="news.image"
:alt="news.title"
class="w-full h-full object-cover"
/>
</div>
<div class="flex-grow px-6">
<h2
class="text-lg font-semibold mb-2 group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ news.title }}
</h2>
<p class="text-gray-600 text-sm line-clamp-2">
{{ news.summary }}
</p>
<div class="mt-3 flex items-center space-x-4">
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Clock /></el-icon>
{{ news.time }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><Document /></el-icon>
{{ news.source }}
</span>
<span class="text-sm text-gray-500 flex items-center">
<el-icon class="mr-1"><View /></el-icon>
{{ news.views }}
</span>
</div>
</div>
<div class="w-24 flex-shrink-0 text-right">
<el-tag
:type="news.category.type"
size="small"
class="whitespace-nowrap"
>
{{ news.category.name }}
</el-tag>
</div>
</div>
</div>
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<div class="w-80 flex-shrink-0 space-y-6">
<!-- 热点新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-red-500"><Star /></el-icon>
热点新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in hotNews"
:key="index"
class="group cursor-pointer"
>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
<div class="text-xs text-gray-500 mt-1">
{{ item.views }} 阅读
</div>
</div>
</div>
</div>
<!-- 本地新闻 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-blue-500"><Location /></el-icon>
本地新闻
</h2>
<div class="space-y-4">
<div
v-for="(item, index) in localNews"
:key="index"
class="group cursor-pointer"
>
<div class="h-32 mb-2 overflow-hidden rounded-lg">
<img
:src="item.image"
:alt="item.title"
class="w-full h-full object-cover"
/>
</div>
<div
class="text-sm font-medium group-hover:text-blue-600 line-clamp-2 text-black"
>
{{ item.title }}
</div>
</div>
</div>
</div>
<!-- 通知公告 -->
<div class="bg-white rounded-lg shadow-sm p-4">
<h2 class="text-xl font-bold mb-4 flex items-center text-black">
<el-icon class="mr-2 text-orange-500"><Bell /></el-icon>
通知公告
</h2>
<div class="space-y-3">
<div
v-for="(item, index) in announcements"
:key="index"
class="flex items-center space-x-2 group cursor-pointer"
>
<el-tag size="small" :type="item.type">{{ item.tag }}</el-tag>
<span
class="text-sm group-hover:text-blue-600 flex-1 line-clamp-1 text-black"
>{{ item.title }}</span
>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<news-list
typePage="2"
title1="权威发布"
title2="专家解读"
title3="法律法规"
:type0="pyzq"
:type1="qwfb"
:type2="zjjd"
:type3="flfg"
:homeMoreType="route.query.homeMoreType"
/>
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import {
Clock,
Document,
View,
Star,
Location,
Bell,
ArrowRight,
} from "@element-plus/icons-vue";
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(100);
const handleSizeChange = (val: number) => {
pageSize.value = val;
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
};
const newsList = ref([
{
title: "国务院常务会议:部署进一步优化营商环境的政策措施",
summary:
"会议强调要持续优化营商环境,激发市场主体活力,促进经济持续健康发展。会议通过了《关于进一步优化营商环境的实施意见》,提出了一系列具体措施。",
image:
"https://ai-public.mastergo.com/ai/img_res/7008561e2575928d48be3eb6abb45ed5.jpg",
time: "2024-01-15 14:30",
source: "新华网",
views: "12,458",
category: { name: "时政", type: "danger" },
},
{
title: "科技创新引领未来:量子计算研究获重大突破",
summary:
"中国科学家在量子计算领域取得重大突破,成功实现了72量子比特的量子优势验证,为未来量子计算的实用化奠定了重要基础。",
image:
"https://ai-public.mastergo.com/ai/img_res/2e87bb273492cc07fca2c54839b12c72.jpg",
time: "2024-01-15 10:15",
source: "科技日报",
views: "8,932",
category: { name: "科技", type: "primary" },
},
{
title: "全国医疗改革新政策出台:提升基层医疗服务能力",
summary:
"国家卫健委发布新政策,加强基层医疗机构建设,推进分级诊疗制度落实,提高基层医疗服务水平,让群众就医更便利。",
image:
"https://ai-public.mastergo.com/ai/img_res/4e1300130f5ddc4b058201ce0863e853.jpg",
time: "2024-01-15 09:00",
source: "健康时报",
views: "15,674",
category: { name: "民生", type: "success" },
},
{
title: "2024年春节消费预测:文旅市场将迎来开门红",
summary:
"随着假期临近,文旅部门预计今年春节期间国内旅游人次将突破4亿,旅游收入有望超过5000亿元,文旅市场将迎来强劲复苏。",
image:
"https://ai-public.mastergo.com/ai/img_res/00343eaf70fed629fbaa7ab9f692eb8d.jpg",
time: "2024-01-14 16:45",
source: "经济观察报",
views: "9,876",
category: { name: "财经", type: "warning" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
{
title: "教育部发布新规:加强中小学生心理健康教育",
summary:
"教育部近日印发《关于加强中小学生心理健康教育的指导意见》,要求各地建立健全学生心理健康教育体系,预防和干预学生心理问题。",
image:
"https://ai-public.mastergo.com/ai/img_res/a2b931119f927fa4e1b42724d9f274ef.jpg",
time: "2024-01-14 14:20",
source: "中国教育报",
views: "11,234",
category: { name: "教育", type: "info" },
},
]);
const hotNews = ref([
{
title: "AI 技术在医疗领域取得重大突破:精准诊断率提升 35%",
views: "28.5万",
},
{ title: "2024 全球经济展望:新兴市场或成增长主引擎", views: "25.3万" },
{ title: "环保新政出台:到 2025 年可再生能源占比将达 30%", views: "22.1万" },
{
title: "第五代移动通信技术实现全域覆盖,用户体验显著提升",
views: "19.8万",
},
{
title: "首届全球数字经济博览会将在深圳举办,聚焦前沿科技",
views: "18.2万",
},
]);
const localNews = ref([
{
title: "城市地铁 12 号线正式开通,打通南北交通大动脉",
image:
"https://ai-public.mastergo.com/ai/img_res/3d43624529823eeaf292c07dcd59244d.jpg",
},
{
title: "市中心文化广场改造完工,将举办系列文化活动",
image:
"https://ai-public.mastergo.com/ai/img_res/449f75b182bd83a315e2e9e85d2b33b7.jpg",
},
]);
const announcements = ref([
{
title: "关于举办 2024 年春季人才招聘会的通知",
tag: "招聘",
type: "success",
},
{ title: "2024 年度市政府工作报告公开征求意见", tag: "公示", type: "info" },
{ title: "关于开展春节期间文化惠民活动的通知", tag: "活动", type: "warning" },
{ title: "2024 年度重点民生工程项目公示", tag: "公示", type: "info" },
{ title: "关于调整部分公交线路的通知", tag: "出行", type: "danger" },
]);
import { pyzq, qwfb, zjjd, flfg } from "@/utils/config";
import NewsList from "@/components/py/NewsList.vue";
import { useRoute } from "vue-router";
const route = useRoute();
</script>
<style scoped>
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.line-clamp-1 {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<style scoped></style>
......@@ -2,11 +2,23 @@ import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";
import vueDevTools from "vite-plugin-vue-devtools";
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueDevTools()],
resolve: {
// https://cn.vitejs.dev/config/#resolve-alias
alias: {
// 设置路径
"~": path.resolve(__dirname, "./"),
// 设置别名
"@": path.resolve(__dirname, "./src"),
},
// https://cn.vitejs.dev/config/#resolve-extensions
extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
},
server: {
// 是否开启 https
https: false,
......@@ -15,17 +27,12 @@ export default defineConfig({
host: "0.0.0.0",
// 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
proxy: {
"/api": {
"/cms": {
// target: "http://localhost:8081",
// target: "http://172.16.70.52:8081",
target: "http://192.168.19.247:8081",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
"/jeeplus": {
target: "ws://192.168.1.205:8081", // 线上服务器websocket地址
ws: true,
target: "http://192.168.19.142:9002",
changeOrigin: true,
// rewrite: (path) => path.replace(/^\/cms/, "/cms"),
},
},
cors: true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment