Commit e349f6bb authored by shilei's avatar shilei

feat: 列表筛选

parent 6e714dbc
...@@ -34,11 +34,12 @@ module.exports = { ...@@ -34,11 +34,12 @@ module.exports = {
'no-debugger': 'off', 'no-debugger': 'off',
'no-plusplus': 'off', 'no-plusplus': 'off',
'no-shadow': 'off', 'no-shadow': 'off',
'no-param-reassign': ['error', { props: false }],
'@typescript-eslint/no-shadow': 'error', '@typescript-eslint/no-shadow': 'error',
'no-unused-vars': 'off', 'no-unused-vars': 'off',
'no-else-return': 'off', 'no-else-return': 'off',
'@typescript-eslint/no-unused-vars': 'error', '@typescript-eslint/no-unused-vars': 'error',
'vue-scoped-css/enforce-style-type': ['error', { allows: ['plain', 'scoped'] }], 'vue-scoped-css/enforce-style-type': ['error', { allows: ['plain', 'scoped', 'module'] }],
'vue/block-order': [ 'vue/block-order': [
'error', 'error',
{ {
......
...@@ -8,6 +8,7 @@ export {} ...@@ -8,6 +8,7 @@ export {}
declare module 'vue' { declare module 'vue' {
export interface GlobalComponents { export interface GlobalComponents {
CommonHeader: typeof import('./src/components/common/CommonHeader.vue')['default'] CommonHeader: typeof import('./src/components/common/CommonHeader.vue')['default']
copy: typeof import('./src/components/list/list-land-item copy.vue')['default']
DetailInfoCell: typeof import('./src/components/detail/DetailInfoCell.vue')['default'] DetailInfoCell: typeof import('./src/components/detail/DetailInfoCell.vue')['default']
DetailMain: typeof import('./src/components/detail/DetailMain.vue')['default'] DetailMain: typeof import('./src/components/detail/DetailMain.vue')['default']
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
...@@ -20,6 +21,7 @@ declare module 'vue' { ...@@ -20,6 +21,7 @@ declare module 'vue' {
ElForm: typeof import('element-plus/es')['ElForm'] ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader'] ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElInput: typeof import('element-plus/es')['ElInput'] ElInput: typeof import('element-plus/es')['ElInput']
ElMain: typeof import('element-plus/es')['ElMain'] ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenu: typeof import('element-plus/es')['ElMenu']
...@@ -32,8 +34,12 @@ declare module 'vue' { ...@@ -32,8 +34,12 @@ declare module 'vue' {
ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
Filter: typeof import('./src/components/filter/filter.vue')['default']
FilterView: typeof import('./src/components/filter/filter-view.vue')['default']
ListCarrierItem: typeof import('./src/components/list/list-carrier-item.vue')['default']
ListIndustryCategory: typeof import('./src/components/list/list-industryCategory.vue')['default'] ListIndustryCategory: typeof import('./src/components/list/list-industryCategory.vue')['default']
ListLand: typeof import('./src/components/list/list-land.vue')['default'] ListLand: typeof import('./src/components/list/list-land.vue')['default']
ListLandItem: typeof import('./src/components/list/list-land-item.vue')['default']
ListPagination: typeof import('./src/components/list/list-pagination.vue')['default'] ListPagination: typeof import('./src/components/list/list-pagination.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
"name": "liyeyun", "name": "liyeyun",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@vueuse/core": "^10.6.1",
"@amap/amap-jsapi-loader": "^1.0.1", "@amap/amap-jsapi-loader": "^1.0.1",
"@vueuse/core": "^10.6.1",
"axios": "^1.6.2", "axios": "^1.6.2",
"big.js": "^6.2.1", "big.js": "^6.2.1",
"element-plus": "^2.4.2", "element-plus": "^2.4.2",
...@@ -2716,9 +2716,9 @@ ...@@ -2716,9 +2716,9 @@
} }
}, },
"node_modules/@element-plus/icons-vue": { "node_modules/@element-plus/icons-vue": {
"version": "2.1.0", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"peerDependencies": { "peerDependencies": {
"vue": "^3.2.0" "vue": "^3.2.0"
} }
...@@ -3188,8 +3188,7 @@ ...@@ -3188,8 +3188,7 @@
"node_modules/@floating-ui/utils": { "node_modules/@floating-ui/utils": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
"integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
"dev": true
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.13", "version": "0.11.13",
...@@ -3421,8 +3420,7 @@ ...@@ -3421,8 +3420,7 @@
"name": "@sxzz/popperjs-es", "name": "@sxzz/popperjs-es",
"version": "2.11.7", "version": "2.11.7",
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
"dev": true
}, },
"node_modules/@rollup/pluginutils": { "node_modules/@rollup/pluginutils": {
"version": "5.0.5", "version": "5.0.5",
...@@ -3697,8 +3695,7 @@ ...@@ -3697,8 +3695,7 @@
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.14.201", "version": "4.14.201",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz",
"integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ=="
"dev": true
}, },
"node_modules/@types/lodash-es": { "node_modules/@types/lodash-es": {
"version": "4.17.11", "version": "4.17.11",
...@@ -3781,10 +3778,9 @@ ...@@ -3781,10 +3778,9 @@
} }
}, },
"node_modules/@types/web-bluetooth": { "node_modules/@types/web-bluetooth": {
"version": "0.0.16", "version": "0.0.20",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
"dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.12.0", "version": "6.12.0",
...@@ -4495,36 +4491,33 @@ ...@@ -4495,36 +4491,33 @@
"dev": true "dev": true
}, },
"node_modules/@vueuse/core": { "node_modules/@vueuse/core": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.6.1.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "integrity": "sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==",
"dev": true,
"dependencies": { "dependencies": {
"@types/web-bluetooth": "^0.0.16", "@types/web-bluetooth": "^0.0.20",
"@vueuse/metadata": "9.13.0", "@vueuse/metadata": "10.6.1",
"@vueuse/shared": "9.13.0", "@vueuse/shared": "10.6.1",
"vue-demi": "*" "vue-demi": ">=0.14.6"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/antfu" "url": "https://github.com/sponsors/antfu"
} }
}, },
"node_modules/@vueuse/metadata": { "node_modules/@vueuse/metadata": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.1.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", "integrity": "sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw==",
"dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/antfu" "url": "https://github.com/sponsors/antfu"
} }
}, },
"node_modules/@vueuse/shared": { "node_modules/@vueuse/shared": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.1.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "integrity": "sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==",
"dev": true,
"dependencies": { "dependencies": {
"vue-demi": "*" "vue-demi": ">=0.14.6"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/antfu" "url": "https://github.com/sponsors/antfu"
...@@ -4872,8 +4865,7 @@ ...@@ -4872,8 +4865,7 @@
"node_modules/async-validator": { "node_modules/async-validator": {
"version": "4.2.5", "version": "4.2.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
"dev": true
}, },
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
...@@ -5891,8 +5883,7 @@ ...@@ -5891,8 +5883,7 @@
"node_modules/dayjs": { "node_modules/dayjs": {
"version": "1.11.10", "version": "1.11.10",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
"dev": true
}, },
"node_modules/de-indent": { "node_modules/de-indent": {
"version": "1.0.2", "version": "1.0.2",
...@@ -6339,28 +6330,6 @@ ...@@ -6339,28 +6330,6 @@
"vue-demi": "*" "vue-demi": "*"
} }
}, },
"node_modules/element-plus/node_modules/@vueuse/core/node_modules/vue-demi": {
"version": "0.14.6",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
"integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/element-plus/node_modules/@vueuse/metadata": { "node_modules/element-plus/node_modules/@vueuse/metadata": {
"version": "9.13.0", "version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
...@@ -6374,28 +6343,6 @@ ...@@ -6374,28 +6343,6 @@
"vue-demi": "*" "vue-demi": "*"
} }
}, },
"node_modules/element-plus/node_modules/@vueuse/shared/node_modules/vue-demi": {
"version": "0.14.6",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
"integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/emoji-regex": { "node_modules/emoji-regex": {
"version": "9.2.2", "version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
...@@ -6566,8 +6513,7 @@ ...@@ -6566,8 +6513,7 @@
"node_modules/escape-html": { "node_modules/escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
"dev": true
}, },
"node_modules/escape-string-regexp": { "node_modules/escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
...@@ -9243,8 +9189,7 @@ ...@@ -9243,8 +9189,7 @@
"node_modules/lodash": { "node_modules/lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"dev": true
}, },
"node_modules/lodash-es": { "node_modules/lodash-es": {
"version": "4.17.21", "version": "4.17.21",
...@@ -9430,8 +9375,7 @@ ...@@ -9430,8 +9375,7 @@
"node_modules/memoize-one": { "node_modules/memoize-one": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
"dev": true
}, },
"node_modules/memorystream": { "node_modules/memorystream": {
"version": "0.3.1", "version": "0.3.1",
...@@ -9877,8 +9821,7 @@ ...@@ -9877,8 +9821,7 @@
"node_modules/normalize-wheel-es": { "node_modules/normalize-wheel-es": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
"dev": true
}, },
"node_modules/npm-run-all2": { "node_modules/npm-run-all2": {
"version": "6.1.1", "version": "6.1.1",
...@@ -18203,14 +18146,12 @@ ...@@ -18203,14 +18146,12 @@
"@ctrl/tinycolor": { "@ctrl/tinycolor": {
"version": "3.6.1", "version": "3.6.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
"dev": true
}, },
"@element-plus/icons-vue": { "@element-plus/icons-vue": {
"version": "2.1.0", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"dev": true,
"requires": {} "requires": {}
}, },
"@esbuild/android-arm": { "@esbuild/android-arm": {
...@@ -18439,7 +18380,6 @@ ...@@ -18439,7 +18380,6 @@
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz",
"integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==",
"dev": true,
"requires": { "requires": {
"@floating-ui/utils": "^0.1.3" "@floating-ui/utils": "^0.1.3"
} }
...@@ -18448,7 +18388,6 @@ ...@@ -18448,7 +18388,6 @@
"version": "1.5.3", "version": "1.5.3",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
"integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
"dev": true,
"requires": { "requires": {
"@floating-ui/core": "^1.4.2", "@floating-ui/core": "^1.4.2",
"@floating-ui/utils": "^0.1.3" "@floating-ui/utils": "^0.1.3"
...@@ -18457,8 +18396,7 @@ ...@@ -18457,8 +18396,7 @@
"@floating-ui/utils": { "@floating-ui/utils": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
"integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
"dev": true
}, },
"@humanwhocodes/config-array": { "@humanwhocodes/config-array": {
"version": "0.11.13", "version": "0.11.13",
...@@ -18642,8 +18580,7 @@ ...@@ -18642,8 +18580,7 @@
"@popperjs/core": { "@popperjs/core": {
"version": "npm:@sxzz/popperjs-es@2.11.7", "version": "npm:@sxzz/popperjs-es@2.11.7",
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
"dev": true
}, },
"@rollup/pluginutils": { "@rollup/pluginutils": {
"version": "5.0.5", "version": "5.0.5",
...@@ -18832,14 +18769,12 @@ ...@@ -18832,14 +18769,12 @@
"@types/lodash": { "@types/lodash": {
"version": "4.14.201", "version": "4.14.201",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz",
"integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ=="
"dev": true
}, },
"@types/lodash-es": { "@types/lodash-es": {
"version": "4.17.11", "version": "4.17.11",
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.11.tgz", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.11.tgz",
"integrity": "sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==", "integrity": "sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==",
"dev": true,
"requires": { "requires": {
"@types/lodash": "*" "@types/lodash": "*"
} }
...@@ -18916,10 +18851,9 @@ ...@@ -18916,10 +18851,9 @@
} }
}, },
"@types/web-bluetooth": { "@types/web-bluetooth": {
"version": "0.0.16", "version": "0.0.20",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
"dev": true
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "6.12.0", "version": "6.12.0",
...@@ -19428,30 +19362,27 @@ ...@@ -19428,30 +19362,27 @@
"dev": true "dev": true
}, },
"@vueuse/core": { "@vueuse/core": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.6.1.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "integrity": "sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==",
"dev": true,
"requires": { "requires": {
"@types/web-bluetooth": "^0.0.16", "@types/web-bluetooth": "^0.0.20",
"@vueuse/metadata": "9.13.0", "@vueuse/metadata": "10.6.1",
"@vueuse/shared": "9.13.0", "@vueuse/shared": "10.6.1",
"vue-demi": "*" "vue-demi": ">=0.14.6"
} }
}, },
"@vueuse/metadata": { "@vueuse/metadata": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.1.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", "integrity": "sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw=="
"dev": true
}, },
"@vueuse/shared": { "@vueuse/shared": {
"version": "9.13.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.1.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "integrity": "sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==",
"dev": true,
"requires": { "requires": {
"vue-demi": "*" "vue-demi": ">=0.14.6"
} }
}, },
"abab": { "abab": {
...@@ -19697,8 +19628,7 @@ ...@@ -19697,8 +19628,7 @@
"async-validator": { "async-validator": {
"version": "4.2.5", "version": "4.2.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
"dev": true
}, },
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",
...@@ -19825,6 +19755,11 @@ ...@@ -19825,6 +19755,11 @@
"integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
"dev": true "dev": true
}, },
"big.js": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/big.js/-/big.js-6.2.1.tgz",
"integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ=="
},
"binary-extensions": { "binary-extensions": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
...@@ -20388,8 +20323,7 @@ ...@@ -20388,8 +20323,7 @@
"dayjs": { "dayjs": {
"version": "1.11.10", "version": "1.11.10",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
"dev": true
}, },
"de-indent": { "de-indent": {
"version": "1.0.2", "version": "1.0.2",
...@@ -20689,7 +20623,6 @@ ...@@ -20689,7 +20623,6 @@
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.4.2.tgz", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.4.2.tgz",
"integrity": "sha512-E/HwXX7JF1LPvQSjs0fZ8WblIoc0quoXsRXQZiL7QDq7xJdNGSUaXtdk7xiEv7axPmLfEFtxE5du9fFspDrmJw==", "integrity": "sha512-E/HwXX7JF1LPvQSjs0fZ8WblIoc0quoXsRXQZiL7QDq7xJdNGSUaXtdk7xiEv7axPmLfEFtxE5du9fFspDrmJw==",
"dev": true,
"requires": { "requires": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6", "@element-plus/icons-vue": "^2.0.6",
...@@ -20706,6 +20639,37 @@ ...@@ -20706,6 +20639,37 @@
"lodash-unified": "^1.0.2", "lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0", "memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0" "normalize-wheel-es": "^1.2.0"
},
"dependencies": {
"@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
},
"@vueuse/core": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"requires": {
"@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
}
},
"@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
},
"@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"requires": {
"vue-demi": "*"
}
}
} }
}, },
"emoji-regex": { "emoji-regex": {
...@@ -20847,8 +20811,7 @@ ...@@ -20847,8 +20811,7 @@
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
"dev": true
}, },
"escape-string-regexp": { "escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
...@@ -22754,8 +22717,7 @@ ...@@ -22754,8 +22717,7 @@
"lodash": { "lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"dev": true
}, },
"lodash-es": { "lodash-es": {
"version": "4.17.21", "version": "4.17.21",
...@@ -22766,7 +22728,6 @@ ...@@ -22766,7 +22728,6 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"dev": true,
"requires": {} "requires": {}
}, },
"lodash.debounce": { "lodash.debounce": {
...@@ -22901,8 +22862,7 @@ ...@@ -22901,8 +22862,7 @@
"memoize-one": { "memoize-one": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
"dev": true
}, },
"memorystream": { "memorystream": {
"version": "0.3.1", "version": "0.3.1",
...@@ -23240,8 +23200,7 @@ ...@@ -23240,8 +23200,7 @@
"normalize-wheel-es": { "normalize-wheel-es": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
"dev": true
}, },
"npm-run-all2": { "npm-run-all2": {
"version": "6.1.1", "version": "6.1.1",
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
/* 单行文字溢出虚点显 示*/
.ell {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
/* 两行文字溢出虚点显 示*/
.ell2 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
@import './base'; @import './base';
@import './reset';
html,body { html,
font-family: -apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,Helvetica Neue,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif; body {
font-family:
-apple-system,
BlinkMacSystemFont,
PingFang SC,
Microsoft YaHei,
Helvetica Neue,
Source Han Sans SC,
Noto Sans CJK SC,
WenQuanYi Micro Hei,
sans-serif;
}
#app {
.el-checkbox {
margin-right: 20px;
}
.el-checkbox__input.is-checked .el-checkbox__inner {
background-color: #c0322b;
border-color: #c0322b;
}
.el-checkbox__input.is-checked + .el-checkbox__label {
color: rgba(0, 0, 0, 0.65);
}
.el-checkbox__label {
font-size: 12px;
font-weight: 400;
color: rgba(0, 0, 0, 0.45);
}
.el-input__inner::-webkit-outer-spin-button,
.el-input__inner::-webkit-inner-spin-button {
-webkit-appearance: none;
}
.el-input__inner[type='number'] {
-moz-appearance: textfield;
}
} }
<template> <template>
<div class="flex items-center justify-between pt-[12px] pl-[40px] header-view"> <div class="header-view flex items-center justify-between pl-[40px] pt-[12px]">
<!-- <div>logo</div> --> <!-- <div>logo</div> -->
<div class="flex flex-1 justify-start"> <div class="flex flex-1 justify-start">
<ElMenu <ElMenu
......
export const defaultFiltersConfig = {
// 产业园级别
park_level: {
type: 'select',
label: '产业园级别',
key: 'levelName',
},
// 招商方向
park_direction: {
type: 'select',
label: '招商方向',
key: 'investmentDirection',
},
// 产业园面积
park_area: {
type: 'select',
label: '产业园面积',
key: 'coverArea',
plugins: {
type: 'section',
unit: '亩',
},
},
// 产业资源
park_resources: {
type: 'select',
label: '产业资源',
key: 'parkResourcesList',
multiple: true,
},
// 产业政策
industry_policy: {
type: 'select',
label: '产业政策',
key: 'industryPolicyList',
multiple: true,
},
// 开发区级别
development_level: {
type: 'select',
label: '开发区级别',
key: 'levelName',
multiple: false,
},
// 开发区类型
development_type: {
type: 'select',
label: '开发区类型',
key: 'type',
multiple: false,
},
// 招商方向
development_direction: {
type: 'select',
label: '招商方向',
key: 'investmentDirection',
multiple: false,
},
// 开发区面积
development_area: {
type: 'select',
label: '开发区面积',
key: 'planArea',
multiple: false,
plugins: {
type: 'section',
unit: '平方公里',
},
},
// 土地价格
land_price: {
type: 'select',
label: '土地价格',
key: 'price',
multiple: false,
plugins: {
type: 'section',
unit: '万元/亩',
},
},
// 土地类型
land_type: {
type: 'select',
label: '土地类型',
key: 'landType',
multiple: false,
},
// 土地面积
land_area: {
type: 'select',
label: '土地面积',
key: 'area',
multiple: false,
plugins: {
type: 'section',
unit: '亩',
},
},
// 载体面积
carrier_area: {
type: 'select',
label: '载体面积',
key: 'carrierArea',
multiple: false,
plugins: {
type: 'section',
unit: '㎡',
},
},
// 载体类型
carrier_type: {
type: 'select',
label: '载体类型',
key: 'typeInfo',
multiple: false,
},
// 建筑结构
carrier_construction: {
type: 'select',
label: '建筑结构',
key: 'carrierConstruction',
multiple: false,
},
// 标准层高
floor_height: {
type: 'select',
label: '标准层高',
key: 'floorHeight',
multiple: false,
plugins: {
type: 'section',
unit: 'm',
},
},
// 标准承重
load_bearing: {
type: 'select',
label: '标准承重',
key: 'loadBearing',
multiple: false,
plugins: {
type: 'section',
unit: 'kg/㎡',
},
},
// 柱距
pillar_distance: {
type: 'select',
label: '柱距',
key: 'pillarDistance',
multiple: false,
plugins: {
type: 'section',
unit: 'm',
},
},
};
<template>
<div class="filter-view">
<div v-if="selected.length" class="flex text-xs text-black/[.65]">
<span class="w-[100px] shrink-0 leading-9 text-black/[.65]">已选条件</span>
<div class="flex w-[701px] flex-wrap pt-1.5">
<span
v-for="(item, index) in selected"
:key="index"
class="selected-item mb-1 mr-2.5 flex items-center px-2 py-1 leading-none"
>
{{ item.label }}{{
Array.isArray(item.value) ? item.value.join(' | ') : item.valueLabel
}}
<img
class="ml-2.5 h-3 w-3 cursor-pointer"
src="@/assets/images/icon-close.png"
alt=""
@click="removeSelected(item)"
/>
</span>
</div>
<div
class="ml-[15px] flex h-[25px] w-[104px] cursor-pointer items-center justify-center"
@click="removeAll"
>
<img class="h-3 w-3" src="@/assets/images/icon-del.png" alt="" />
<span>清空所有条件</span>
</div>
</div>
<div v-for="(filter, index) in filterList" :key="index" class="flex flex-wrap">
<div class="w-[100px] shrink-0 text-xs leading-9 text-black/[.65]">
<span>{{ filter.label }}</span>
</div>
<div>
<div v-if="!filter.multiple" class="flex pt-1.5 text-xs">
<div
class="shrink-0"
@click="
filter.value = '';
filter.valueLabel = '';
"
>
<span
class="block cursor-pointer px-2 py-1 text-black/[0.45]"
:class="{ selected: !filter.value }"
>
全部
</span>
</div>
<div class="flex">
<div v-for="(item, idx) in filter.list" :key="idx" class="Filter--keysWrap">
<div
class="Filter-ListWrap cursor-pointer px-2 py-1 text-black/[.45]"
:class="{ selected: filter.value === item.dictValue }"
@click="handleFilterClick(item, filter)"
>
<span>
{{ item.dictLabel }}
</span>
</div>
</div>
</div>
<div v-if="filter.plugins" class="ml-2 flex items-center">
<template v-if="filter.plugins.type === 'section'">
<ElInput
v-model="filter.plugins.value1"
class="section-input"
type="number"
placeholder=""
></ElInput>
<span class="mx-1">-</span>
<ElInput
v-model="filter.plugins.value2"
class="section-input"
type="number"
placeholder=""
></ElInput>
<span class="ml-1 text-black/[0.45]">{{ filter.plugins.unit }}</span>
<button class="btn-default" @click="handleEnter(filter)">确定</button>
</template>
</div>
</div>
<div v-else>
<ElCheckboxGroup v-model="filter.value">
<ElCheckbox v-for="(item, idx) in filter.list" :key="idx" :label="item.dictLabel">
{{ item.dictLabel }}
</ElCheckbox>
</ElCheckboxGroup>
</div>
</div>
<div class="Filter--operateWrap" style="width: 100px"></div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, computed, watch } from 'vue';
import { FilterListItem } from '@/types/common.ts';
import { filterStore } from '@/stores/filterEnum.ts';
import { defaultFiltersConfig } from '@/components/filter/config.ts';
import { isEmpty } from 'lodash-es';
const props = defineProps<{
filterKeyList: string[];
}>();
function handleFilterClick<T>(select: Ref<T>, filters: Ref<T>) {
console.log(select, filters);
filters.value = select.dictValue;
filters.valueLabel = select.dictLabel;
console.log(filters);
}
const filterList = ref<FilterListItem[]>([]);
onMounted(async () => {
const store = filterStore();
const filterEnum = await store.getFilterEnum();
console.log(props);
props.filterKeyList.forEach((item) => {
const list = filterEnum[item];
filterList.value.push({ ...defaultFiltersConfig[item], list });
});
});
// 处理输入
function handleEnter<T>(arg: Ref<T>) {
if (!isEmpty(arg.plugins.value1) || !isEmpty(arg.plugins.value2)) {
if (isEmpty(arg.plugins.value2)) {
arg.valueLabel = `≥${arg.plugins.value1}${arg.plugins.unit}`;
arg.value = `${arg.plugins.value1}-`;
} else if (isEmpty(arg.plugins.value1)) {
arg.valueLabel = `≤${arg.plugins.value2}${arg.plugins.unit}`;
arg.value = `0-${arg.plugins.value2}`;
} else {
if (Number(arg.plugins.value1) > Number(arg.plugins.value2)) {
const temp = arg.plugins.value1;
arg.plugins.value1 = arg.plugins.value2;
arg.plugins.value2 = temp;
}
arg.valueLabel = `${arg.plugins.value1}-${arg.plugins.value2}${arg.plugins.unit}`;
arg.value = `${arg.plugins.value1}-${arg.plugins.value2}`;
}
}
}
// 删除已选筛选项
function removeSelected(select: any) {
filterList.value.forEach((item) => {
if (item.label === select.label) {
item.value = Array.isArray(item.value) ? [] : '';
if (item.plugins) {
item.plugins.value1 = '';
item.plugins.value2 = '';
}
}
});
}
// 已选项
const selected = computed(() => {
let temp = [];
temp = filterList.value.filter((item) => {
return !isEmpty(item.value);
});
return temp || [];
});
// 删除所有已选筛选项
function removeAll() {
console.log(selected.value);
for (const i of selected.value) {
removeSelected(i);
}
}
// 选项改变事件传递
const emit = defineEmits(['change']);
watch(
selected,
(newVal) => {
console.log(newVal);
emit('change', selected);
},
{
immediate: false,
},
);
</script>
<style lang="scss" scoped>
.filter-view {
background: #fbfbfb;
padding-top: 10px;
padding-left: 20px;
width: 926px;
}
.selected {
background: rgba(192, 50, 43, 0.06);
color: #c0322b;
}
.section-input {
width: 52px;
::v-deep {
.el-input__wrapper {
border-radius: 2px;
padding: 4px 8px;
}
.el-input__inner {
height: 17px;
}
}
}
.btn-default {
background: #c0322b;
width: 44px;
height: 22px;
color: #fff;
margin-left: 8px;
font-size: 12px;
border-radius: 2px;
}
.selected-item {
background: #f2f2f2;
border: 1px solid rgba(0, 0, 0, 0.15);
height: 25px;
line-height: 15px;
}
</style>
<template>
<div class="flex">
<div class="media-left mr-[16px]">
<img class="h-[156px] w-[208px]" :src="detail.imgUrl" alt="" />
</div>
<div
class="media-right relative flex w-[408px] flex-col justify-between pt-[8px] text-[12px] leading-[20px] text-[#4d4d4d]"
>
<p class="ell2 mb-[7px] text-[20px] font-semibold leading-[20px] text-[#1a1a1a]">
{{ detail.provinceName?.replace('省', '').replace('市', '')
}}{{ detail.cityName?.replace('市', '') }}{{ detail.regionName }}{{ detail.area }}{{
detail.type
}}
</p>
<div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-local.png" alt="" />
<p>所在地区:{{ detail.provinceName }}-{{ detail.cityName }}-{{ detail.regionName }}</p>
</div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-map.png" alt="" />
<p>建筑面积:{{ detail.area }}</p>
</div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-draw.png" alt="" />
<p>载体类型:{{ detail.type }}</p>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import type { CarrierListItem } from '@/types/api/carrierList';
withDefaults(
defineProps<{
detail: CarrierListItem;
}>(),
{},
);
</script>
<style lang="scss" scoped>
.info-icon {
width: 16px;
height: 16px;
margin-right: 4px;
}
</style>
<template>
<div class="flex">
<div class="media-left mr-[16px]">
<img class="h-[156px] w-[208px]" :src="detail.imgUrl" alt="" />
</div>
<div
class="media-right relative flex w-[408px] flex-col justify-between pt-[8px] text-[12px] leading-[20px] text-[#4d4d4d]"
>
<p class="ell2 mb-[7px] text-[20px] font-semibold leading-[20px] text-[#1a1a1a]">
{{ detail.provinceName?.replace('省', '').replace('市', '')
}}{{ detail.cityName?.replace('市', '') }}{{ detail.regionName }}{{ detail.area }}{{
detail.landType
}}
</p>
<div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-local.png" alt="" />
<p>所在地区:{{ detail.provinceName }}-{{ detail.cityName }}-{{ detail.regionName }}</p>
</div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-map.png" alt="" />
<p>占地面积:{{ detail.area }}</p>
</div>
<div class="mb-[8px] flex items-center">
<img class="info-icon" src="@/assets/images/icon-draw.png" alt="" />
<p>土地属性:{{ detail.landType }}</p>
</div>
</div>
<div class="absolute bottom-[8px] right-0 text-[20px] font-semibold text-[#C0322B]">
{{ detail.price }}元/亩
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import type { LandListItem } from '@/types/api/landList';
withDefaults(
defineProps<{
detail: LandListItem;
}>(),
{},
);
</script>
<style lang="scss" scoped>
.info-icon {
width: 16px;
height: 16px;
margin-right: 4px;
}
</style>
...@@ -9,7 +9,7 @@ import { useRequest } from './useRequest.ts'; ...@@ -9,7 +9,7 @@ import { useRequest } from './useRequest.ts';
export function useListView< export function useListView<
T extends { id: number; [index: string]: any }, T extends { id: number; [index: string]: any },
C extends Record<any, any>, C extends Record<any, any>,
>(url: RequestUrl) { >(url: RequestUrl, searchParams: any = {}) {
const router = useRouter(); const router = useRouter();
const { request: requestList } = useRequest<CommonListResp<T>, CommonListParams<C>>(url, { const { request: requestList } = useRequest<CommonListResp<T>, CommonListParams<C>>(url, {
method: 'POST', method: 'POST',
...@@ -18,11 +18,11 @@ export function useListView< ...@@ -18,11 +18,11 @@ export function useListView<
const { pageNum, pageSize, totalCount, queryList } = useQueryList<T, C>(requestList); const { pageNum, pageSize, totalCount, queryList } = useQueryList<T, C>(requestList);
const datas = ref([]) as Ref<T[]>; const datas = ref([]) as Ref<T[]>;
const searchParams = ref({}) as Ref<C>; // const searchParams = ref({}) as Ref<C>;
watchEffect(async () => { watchEffect(async () => {
try { try {
const { data } = await queryList(searchParams.value); const { data } = await queryList(searchParams);
datas.value = data.records; datas.value = data.records;
} catch (error) { } catch (error) {
console.log(error); console.log(error);
......
...@@ -26,7 +26,7 @@ export function useQueryList<T, C>(queryFn: QueryFn<T, CommonListParams<C>>) { ...@@ -26,7 +26,7 @@ export function useQueryList<T, C>(queryFn: QueryFn<T, CommonListParams<C>>) {
}; };
const changePageNum = (page: number) => { const changePageNum = (page: number) => {
pageSize.value = page; pageNum.value = page;
}; };
const changeTotalCount = (total: number) => { const changeTotalCount = (total: number) => {
......
import { ref } from 'vue';
import { defineStore } from 'pinia';
import { useRequest } from '@/composable/useRequest.ts';
import { RequestUrl } from '@/types/api.ts';
import type { FilterListItem } from '@/types/common.ts';
import type { Ref } from 'vue';
export const filterStore = defineStore('filterEnum', () => {
const filterEnum: any = ref<FilterListItem[]>([]);
async function getFilterEnum(): Promise<Ref<FilterListItem> | Error> {
if (filterEnum.value.length) {
return filterEnum;
} else {
try {
const queryStr =
'park_level,park_direction,park_area,park_resources,land_price,industry_policy,development_level,development_type,development_direction,development_area,industry_policy,land_type,land_area,carrier_area,carrier_type,carrier_construction,floor_height,load_bearing,pillar_distance';
const { request: getFilterList } = useRequest(RequestUrl.getFiltersList, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
const data = await getFilterList({ code: queryStr });
filterEnum.value = data;
return filterEnum.value;
} catch (error: any) {
return new Error(error);
}
}
}
return { filterEnum, getFilterEnum };
});
...@@ -15,4 +15,10 @@ export enum RequestUrl { ...@@ -15,4 +15,10 @@ export enum RequestUrl {
landList = '/lyy/api/land/v1.0/page', landList = '/lyy/api/land/v1.0/page',
/** 土地详情 */ /** 土地详情 */
landDetail = '/lyy/api/land/v1.0/detail', landDetail = '/lyy/api/land/v1.0/detail',
/** 载体列表 */
carrierList = '/lyy/api/carrier/v1.0/page',
/** 载体详情 */
carrierDetail = '/lyy/api/carrier/v1.0/detail',
/** 筛选项查询 */
getFiltersList = '/lyy/api/sysDictData/listByCodes',
} }
/**
* 载体列表请求条件参数
*/
export interface CarrierListCondition {
/** 面积 */
carrierArea: string;
/** */
cityCode: string;
/** */
cityName: string;
/** 建筑结构 */
carrierConstruction: string;
/** 载体名称 */
name: string;
/** */
provinceCode: string;
/** */
provinceName: string;
/** */
regionCode: string;
/** */
regionName: string;
/** 标准层高 */
floorHeight?: string;
/** 标准承重 */
loadBearing?: string;
/** 柱距 */
pillarDistance?: string;
/** 载体类型 */
typeInfo?: string;
}
/**
* 载体列表项
*/
export interface CarrierListItem {
/** 面积(亩) */
area: number;
/** */
cityCode: string;
/** */
cityName: string;
/** */
id: number;
/** 首屏图片 */
imgUrl: string;
/** 载体类型 */
type: number;
/** 地块名称 */
name: string;
/** */
provinceCode: string;
/** */
provinceName: string;
/** */
regionCode: string;
/** */
regionName: string;
}
...@@ -45,3 +45,21 @@ export interface CommonListParams<T> { ...@@ -45,3 +45,21 @@ export interface CommonListParams<T> {
property?: string; property?: string;
}[]; }[];
} }
/** *
* 筛选项
*/
export type FilterListItem = {
label: string;
key: string;
list: any[];
type: string;
multiple?: boolean;
value?: string | string[];
plugin?: {
type: string;
unit: string;
value1?: number | string;
value2?: number | string;
};
};
...@@ -18608,4 +18608,4 @@ ...@@ -18608,4 +18608,4 @@
"name": "澳 门", "name": "澳 门",
"children": [] "children": []
} }
] ]
\ No newline at end of file
...@@ -53,8 +53,8 @@ ...@@ -53,8 +53,8 @@
</div> </div>
<div class="map-search-info"> <div class="map-search-info">
<p <p
class="position-item"
v-for="item in infoList" v-for="item in infoList"
class="position-item"
@mousemove="showInfoWindow(item)" @mousemove="showInfoWindow(item)"
@mouseout="hideInfoWindow" @mouseout="hideInfoWindow"
> >
...@@ -79,7 +79,7 @@ interface Window { ...@@ -79,7 +79,7 @@ interface Window {
}; };
let placeSearch: any = null; let placeSearch: any = null;
let infoWindow: any = null; let infoWindow: any = null;
let markers: any = []; const markers: any = [];
let AMapRoot: any = null; let AMapRoot: any = null;
onMounted(() => { onMounted(() => {
AMapLoader.load({ AMapLoader.load({
...@@ -123,7 +123,7 @@ onMounted(() => { ...@@ -123,7 +123,7 @@ onMounted(() => {
}); });
}); });
let infoList = ref<any[]>([]); const infoList = ref<any[]>([]);
const handleSearch = (keyWords: String, radius: Number, type: String) => { const handleSearch = (keyWords: String, radius: Number, type: String) => {
map1.remove(markers); map1.remove(markers);
placeSearch.setType(type); placeSearch.setType(type);
...@@ -136,7 +136,7 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => { ...@@ -136,7 +136,7 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => {
console.log('searchNearBy', status, results); console.log('searchNearBy', status, results);
if (status === 'complete') { if (status === 'complete') {
infoList.value = results.poiList.pois; infoList.value = results.poiList.pois;
for (let item of results.poiList.pois) { for (const item of results.poiList.pois) {
const marker = new AMapRoot.Marker({ const marker = new AMapRoot.Marker({
map: map1, map: map1,
position: [item.location.lng, item.location.lat], position: [item.location.lng, item.location.lat],
...@@ -146,13 +146,13 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => { ...@@ -146,13 +146,13 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => {
marker.on('mouseover', () => { marker.on('mouseover', () => {
console.log('mouseover', item.name); console.log('mouseover', item.name);
let info = []; const info = [];
info.push("<div class='input-card'>"); info.push("<div class='input-card'>");
info.push(`<p class='input-item'>${item.name}</p>`); info.push(`<p class='input-item'>${item.name}</p>`);
info.push(`<p class='input-item'>${item.distance}米</p></div>`); info.push(`<p class='input-item'>${item.distance}米</p></div>`);
infoWindow = new AMapRoot.InfoWindow({ infoWindow = new AMapRoot.InfoWindow({
content: info.join(''), //使用默认信息窗体框样式,显示信息内容 content: info.join(''), // 使用默认信息窗体框样式,显示信息内容
isCustom: true, isCustom: true,
autoMove: false, autoMove: false,
offset: new AMapRoot.Pixel(0, -35), offset: new AMapRoot.Pixel(0, -35),
...@@ -174,12 +174,12 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => { ...@@ -174,12 +174,12 @@ const handleSearch = (keyWords: String, radius: Number, type: String) => {
}; };
const showInfoWindow = (info: any) => { const showInfoWindow = (info: any) => {
let infoContent = []; const infoContent = [];
infoContent.push("<div class='input-card'>"); infoContent.push("<div class='input-card'>");
infoContent.push(`<p class='input-item'>${info.name}</p>`); infoContent.push(`<p class='input-item'>${info.name}</p>`);
infoContent.push(`<p class='input-item'>${info.distance}米</p></div>`); infoContent.push(`<p class='input-item'>${info.distance}米</p></div>`);
infoWindow = new AMapRoot.InfoWindow({ infoWindow = new AMapRoot.InfoWindow({
content: infoContent.join(''), //使用默认信息窗体框样式,显示信息内容 content: infoContent.join(''), // 使用默认信息窗体框样式,显示信息内容
isCustom: true, isCustom: true,
autoMove: false, autoMove: false,
offset: new AMapRoot.Pixel(0, -35), offset: new AMapRoot.Pixel(0, -35),
......
<!-- 载体 --> <!-- 载体 -->
<template> <template>
<div>载体</div> <div class="container">
<FilterView
class="mb-6"
:filter-key-list="filterKeyList"
@change="handleFilterChange"
></FilterView>
<div>
<!-- 载体列表 -->
<p>
搜索到
<span>{{ totalCount }}</span>
个相关载体
</p>
<div>
<div
v-for="item in datas"
:key="item.id"
class="mb-5"
@click="handleDetail(RouteName.landDetail, item)"
>
<CarrierListItemView :detail="item"></CarrierListItemView>
</div>
<ListPagination
v-model:current-page="pageNum"
v-model:page-size="pageSize"
:total="totalCount"
></ListPagination>
</div>
</div>
</div>
</template> </template>
<script lang="ts" setup></script> <script lang="ts" setup>
import { useListView } from '@/composable/useListView.ts';
import { RouteName } from '@/router/router.ts';
import { RequestUrl } from '@/types/api.ts';
import ListPagination from '@/components/list/list-pagination.vue';
import CarrierListItemView from '@/components/list/list-carrier-item.vue';
import FilterView from '@/components/filter/filter-view.vue';
import type { CarrierListCondition, CarrierListItem } from '@/types/api/carrierList';
import { ref } from 'vue';
const { pageNum, pageSize, totalCount, datas, handleDetail, queryList } = useListView<
CarrierListItem,
CarrierListCondition
>(RequestUrl.carrierList);
// 筛选项
const filterKeyList = ref([
'carrier_area',
'carrier_type',
'carrier_construction',
'floor_height',
'load_bearing',
'pillar_distance',
]);
// 处理筛选条件
const handleFilterChange = async function (selectList) {
const temp: any = {};
for (const item of selectList.value) {
temp[item.key] = item.value;
}
pageNum.value = 1;
const { data } = await queryList(temp);
datas.value = data.records;
};
</script>
<style lang="scss" scoped>
.container {
width: 926px;
margin: 0 auto;
}
</style>
<!-- 土地列表 --> <!-- 土地列表 -->
<template> <template>
<div> <div class="container">
<div> <div>
<div v-for="item in datas" :key="item.id" @click="handleDetail(RouteName.landDetail, item)"> <FilterView
<div>{{ item.name }}</div> :filter-key-list="filterKeyList"
class="mb-6"
@change="handleFilterChange"
></FilterView>
<div
v-for="item in datas"
:key="item.id"
class="mb-5"
@click="handleDetail(RouteName.landDetail, item)"
>
<LandListItemView :detail="item"></LandListItemView>
</div> </div>
<ListPagination <ListPagination
...@@ -20,10 +30,30 @@ import { useListView } from '@/composable/useListView.ts'; ...@@ -20,10 +30,30 @@ import { useListView } from '@/composable/useListView.ts';
import { RouteName } from '@/router/router.ts'; import { RouteName } from '@/router/router.ts';
import { RequestUrl } from '@/types/api.ts'; import { RequestUrl } from '@/types/api.ts';
import ListPagination from '@/components/list/list-pagination.vue'; import ListPagination from '@/components/list/list-pagination.vue';
import LandListItemView from '@/components/list/list-land-item.vue';
import FilterView from '@/components/filter/filter-view.vue';
import type { LandListCondition, LandListItem } from '@/types/api/landList'; import type { LandListCondition, LandListItem } from '@/types/api/landList';
import { onMounted, ref } from 'vue';
const { pageNum, pageSize, totalCount, datas, handleDetail } = useListView< const Response = useListView<LandListItem, LandListCondition>(RequestUrl.landList);
LandListItem, const { datas, pageNum, totalCount, pageSize, handleDetail, queryList } = Response;
LandListCondition
>(RequestUrl.landList); const filterKeyList = ref(['land_price', 'land_type', 'land_area']);
onMounted(() => {});
// 处理筛选条件
const handleFilterChange = async function (selectList) {
const temp: any = {};
for (const item of selectList.value) {
temp[item.key] = item.value;
}
pageNum.value = 1;
const { data } = await queryList(temp);
datas.value = data.records;
};
</script> </script>
<style scoped>
.container {
width: 926px;
margin: 0 auto;
}
</style>
module.exports = { module.exports = {
lintOnSave: false devServer: {
} overlay: {
warnings: false,
errors: false,
},
lintOnSave: false,
},
};
This source diff could not be displayed because it is too large. You can view the blob instead.
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