From 58f406ecca89ca7027392d97e28a906c476515f3 Mon Sep 17 00:00:00 2001 From: 刘嘉威 <daidaibg@163.com> Date: 星期一, 10 七月 2023 15:34:59 +0800 Subject: [PATCH] feat: 增加vue2版本的边框组件,添加vueuse依赖 样式微调 --- src/components/datav/border-box-13/border-box-13.vue | 90 ++++++++++++++++++ package-lock.json | 129 ++++++++++++++++++++++--- src/components/datav/border-box-13/index.ts | 3 src/components/item-wrap/item-wrap.vue | 20 ++-- package.json | 1 auto-imports.d.ts | 1 src/views/index/center-map.vue | 37 +++--- src/views/index/index.vue | 7 - 8 files changed, 237 insertions(+), 51 deletions(-) diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 918aad8..1d89ee8 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -1,6 +1,7 @@ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck +// noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import export {} declare global { diff --git a/package-lock.json b/package-lock.json index dc67e6f..68ebaa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@types/node": "^20.4.1", "@vitejs/plugin-vue": "^4.2.3", "@vue/tsconfig": "^0.4.0", + "@vueuse/core": "^10.2.1", "autoprefixer": "^10.4.14", "npm-run-all": "^4.1.5", "postcss": "^8.4.25", @@ -598,9 +599,10 @@ "dev": true }, "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "dev": true }, "node_modules/@vitejs/plugin-vue": { "version": "4.2.3", @@ -814,36 +816,91 @@ } }, "node_modules/@vueuse/core": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.3.1.tgz", - "integrity": "sha512-xriyD+v3D2ObH/UtnkEl+1sbcLBVHNaZaLi/rqoNEe/B92hggDEFQIGXoQUjdRzYOjASHSezf9uCDtmd7LeWyA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", + "dev": true, "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.3.1", - "@vueuse/shared": "9.3.1", - "vue-demi": "*" + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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/@vueuse/metadata": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.3.1.tgz", - "integrity": "sha512-G1BPhtx3OHaL/y4OZBofh6Xt02G1VA9PuOO8nac9sTKMkMqfyez5VfkF3D9GUjSRNO7cVWyH4rceeGXfr2wdMg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.3.1.tgz", - "integrity": "sha512-YFu3qcnVeu0S2L4XdQJtBpDcjz6xwqHZtTv/XRhu66/yge1XVhxskUcc7VZbX52xF9A34V6KCfwncP9YDqYFiw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", + "dev": true, "dependencies": { - "vue-demi": "*" + "vue-demi": ">=0.14.5" }, "funding": { "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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/acorn": { @@ -1278,6 +1335,44 @@ "vue": "^3.2.0" } }, + "node_modules/element-plus/node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/element-plus/node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", diff --git a/package.json b/package.json index b8b7890..7e20e0b 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@types/node": "^20.4.1", "@vitejs/plugin-vue": "^4.2.3", "@vue/tsconfig": "^0.4.0", + "@vueuse/core": "^10.2.1", "autoprefixer": "^10.4.14", "npm-run-all": "^4.1.5", "postcss": "^8.4.25", diff --git a/src/components/datav/border-box-13/border-box-13.vue b/src/components/datav/border-box-13/border-box-13.vue new file mode 100644 index 0000000..28e1efd --- /dev/null +++ b/src/components/datav/border-box-13/border-box-13.vue @@ -0,0 +1,90 @@ +<script setup lang="ts"> +import { computed, ref ,onBeforeUpdate, nextTick} from "vue"; +import merge from "lodash/merge"; +import { useElementSize } from "@vueuse/core"; +import type { PropType } from "vue"; + +const props = defineProps({ + color: { + type: Array as unknown as PropType<[string, string]>, + default: () => [], + }, + backgroundColor: { + type: String, + default: "transparent", + }, +}); +const defaultColor = ["#6586ec", "#2cf7fe"]; +const domRef = ref(null); +const { width, height } = useElementSize(domRef,{width:0,height:0}, { box: 'border-box' }); +const mergedColor = computed<[string, string]>(() => { + return merge(defaultColor, props.color); +}); + + +</script> + +<template> + <div class="dv-border-box-13 dv-border-box" ref="domRef"> + <svg :width="width" :height="height" class="dv-border-svg-container"> + <path + :fill="backgroundColor" + :stroke="mergedColor[0]" + :d="` + M 5 20 L 5 10 L 12 3 L 60 3 L 68 10 + L ${width - 20} 10 L ${width - 5} 25 + L ${width - 5} ${height - 5} L 20 ${height - 5} + L 5 ${height - 20} L 5 20 + `" + /> + + <path + fill="transparent" + stroke-width="3" + stroke-linecap="round" + stroke-dasharray="10, 5" + :stroke="mergedColor[0]" + :d="`M 16 9 L 61 9`" + /> + + <path + fill="transparent" + stroke="{mergedColor[1]}" + :d="`M 5 20 L 5 10 L 12 3 L 60 3 L 68 10`" + /> + + <path + fill="transparent" + :stroke="mergedColor[1]" + :d="`M ${width - 5} ${height - 30} L ${width - 5} ${height - 5} L ${ + width - 30 + } ${height - 5}`" + /> + </svg> + <div class="dv-border-box-content"> + <slot></slot> + </div> + </div> +</template> + +<style scoped lang="scss"> +.dv-border-box { + position: relative; + box-sizing: border-box; + width: 100%; + height: 100%; +} +.dv-border-svg-container { + position: absolute; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + display: block; +} +.dv-border-box-content { + position: relative; + width: 100%; + height: 100%; +} +</style> diff --git a/src/components/datav/border-box-13/index.ts b/src/components/datav/border-box-13/index.ts new file mode 100644 index 0000000..41e995c --- /dev/null +++ b/src/components/datav/border-box-13/index.ts @@ -0,0 +1,3 @@ +import BorderBox13 from "./border-box-13.vue" + +export default BorderBox13 \ No newline at end of file diff --git a/src/components/item-wrap/item-wrap.vue b/src/components/item-wrap/item-wrap.vue index b1e37f7..3f63d7f 100644 --- a/src/components/item-wrap/item-wrap.vue +++ b/src/components/item-wrap/item-wrap.vue @@ -1,4 +1,5 @@ <script setup lang="ts"> +import BorderBox13 from "@/components/datav/border-box-13"; const props = withDefaults( defineProps<{ // 鏍囬 @@ -8,29 +9,23 @@ title: "", } ); - </script> <template> - <div class="item-wrap"> + <BorderBox13> <div class="item_title" v-if="title !== ''"> <div class="zuo"></div> - <span class="title-inner"> {{title}} </span> + <span class="title-inner"> {{ title }} </span> <div class="you"></div> </div> <div :class="title !== '' ? 'item_title_content' : 'item_title_content_def'" > - <slot></slot> - </div> - </div> + <slot></slot></div + ></BorderBox13> </template> <style scoped lang="scss"> -.item-wrap { - // border: red dashed 1px; - box-sizing: border-box; -} $item-title-height: 38px; $item_title_content-height: calc(100% - 38px); @@ -70,6 +65,11 @@ } } +:deep(.dv-border-box-content) { + box-sizing: border-box; + padding: 6px 16px 0px; + } + .item_title_content { height: $item_title_content-height; } diff --git a/src/views/index/center-map.vue b/src/views/index/center-map.vue index a406a02..379890c 100644 --- a/src/views/index/center-map.vue +++ b/src/views/index/center-map.vue @@ -3,6 +3,7 @@ import { currentGET, GETNOBASE } from "@/api"; import { registerMap, getMap } from "echarts/core"; import { optionHandle, regionCodes } from "./center.map"; +import BorderBox13 from "@/components/datav/border-box-13"; import type { MapdataType } from "./center.map"; const option = ref({}); const code = ref("china"); //china 浠h〃涓浗 鍏朵粬鍦板競鏄鏀跨紪鐮� @@ -58,7 +59,7 @@ mapjson = await GETNOBASE(`./map-geojson/${regionCode}.json`).then( (data) => data ); - code.value=regionCode + code.value = regionCode; registerMap(regionCode, { geoJSON: mapjson as any, specialAreas: {}, @@ -75,30 +76,31 @@ if (xzqData) { getData(xzqData.adcode); } else { - - window["$message"].warning("鏆傛棤涓嬬骇鍦板競") + window["$message"].warning("鏆傛棤涓嬬骇鍦板競"); } }; </script> <template> <div class="centermap"> - <!-- <div class="maptitle"> + <div class="maptitle"> <div class="zuo"></div> <span class="titletext">{{ title }}</span> <div class="you"></div> - </div> --> + </div> <div class="mapwrap"> - <div class="quanguo" @click="getData('china')" v-if="code !== 'china'"> - 涓浗 - </div> - <v-chart - class="chart" - :option="option" - ref="centerMapRef" - @click="mapClick" - v-if="JSON.stringify(option)!='{}'" - /> + <BorderBox13> + <div class="quanguo" @click="getData('china')" v-if="code !== 'china'"> + 涓浗 + </div> + <v-chart + class="chart" + :option="option" + ref="centerMapRef" + @click="mapClick" + v-if="JSON.stringify(option) != '{}'" + /> + </BorderBox13> </div> </div> </template> @@ -156,8 +158,7 @@ .quanguo { position: absolute; right: 20px; - // top: -46px; - top: 0; + top: -46px; width: 80px; height: 28px; border: 1px solid #00eded; @@ -169,7 +170,7 @@ cursor: pointer; box-shadow: 0 2px 4px rgba(0, 237, 237, 0.5), 0 0 6px rgba(0, 237, 237, 0.4); - z-index: 10; + z-index: 10; } } } diff --git a/src/views/index/index.vue b/src/views/index/index.vue index defb1fa..3b7627a 100644 --- a/src/views/index/index.vue +++ b/src/views/index/index.vue @@ -8,14 +8,9 @@ import RightTop from "./right-top.vue"; import RightCenter from "./right-center.vue"; import RightBottom from "./right-bottom.vue"; - - - - </script> <template> - <div class="index-box"> <div class="contetn_left"> <!-- <div class="pagetab"> @@ -37,7 +32,7 @@ </ItemWrap> </div> <div class="contetn_center"> - <CenterMap class="contetn_center_top" title="璁惧鍒嗗竷鍥�"/> + <CenterMap class="contetn_center_top" title="璁惧鍒嗗竷鍥�" /> <ItemWrap class="contetn_center-bottom" title="瀹夎璁″垝"> <CenterBottom /> </ItemWrap> -- Gitblit v1.8.0