From 1d520cc8a2d5346b5bdb0ece6af5b8b24fdc8d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cyiyousong=E2=80=9D?= <鈥測ousong_yi@foxmail.com鈥�> Date: Mon, 8 Jul 2024 16:50:37 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E6=8E=92=E9=98=9F?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=97=B6=E9=97=B4=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engineSearch/components/Search copy 2.vue | 198 +++++++++++ .../pages/engineSearch/components/Search.vue | 321 +++++++++++------- .../components/date-picker/src/panel/date.vue | 51 +-- .../components/date-picker/src/picker.vue | 164 ++------- 4 files changed, 457 insertions(+), 277 deletions(-) create mode 100644 admin_2/src/pages/engineSearch/components/Search copy 2.vue diff --git a/admin_2/src/pages/engineSearch/components/Search copy 2.vue b/admin_2/src/pages/engineSearch/components/Search copy 2.vue new file mode 100644 index 0000000..01ec3b8 --- /dev/null +++ b/admin_2/src/pages/engineSearch/components/Search copy 2.vue @@ -0,0 +1,198 @@ +<template> + <div + class="search mb-[15px] flex h-[170px] w-full flex-col items-center justify-around" + > + <div class="flex gap-10"> + <router-link v-for="(v, i) in subMenus" :key="i" :to="v.path"> + {{ v.meta.title }} + </router-link> + </div> + <div class="flex items-center justify-center gap-2"> + <el-form ref="form" size="small" inline :model="form"> + <el-form-item prop="type"> + <el-select + style="width: 100px" + v-model="form.type" + placeholder="璇烽€夋嫨" + > + <el-option label="鎸夊勾" value="year"></el-option> + <el-option label="鎸夋湀" value="month"></el-option> + <el-option label="鎸夋棩" value="day"></el-option> + </el-select> + </el-form-item> + <el-form-item prop="year" v-if="form.type == 'year'"> + <el-date-picker + style="width: 150px" + v-model="form.year" + type="year" + value-format="yyyy" + placeholder="閫夋嫨骞�" + > + </el-date-picker> + </el-form-item> + <el-form-item prop="month" v-if="form.type == 'month'"> + <el-date-picker + style="width: 150px" + v-model="form.month" + type="month" + value-format="yyyy-MM" + placeholder="閫夋嫨鏈�" + > + </el-date-picker> + </el-form-item> + <el-form-item prop="day" v-if="form.type == 'day'"> + <el-date-picker + style="width: 150px" + v-model="form.day" + type="date" + value-format="yyyy-MM-dd" + placeholder="閫夋嫨鏃�" + > + </el-date-picker> + </el-form-item> + <el-form-item + prop="businessName" + v-if="$route.path == '/enginesearch/queueupdata'" + > + <el-select + style="width: 150px" + v-model="form.businessName" + placeholder="璇烽€夋嫨涓氬姟" + clearable + filterable + > + <el-option + v-for="v in businessList" + :key="v.id" + :label="v.businessName" + :value="v.businessName" + ></el-option> + </el-select> + </el-form-item> + <el-form-item prop="pjOption" v-else> + <el-select + style="width: 150px" + v-model="form.pjOption" + placeholder="璇烽€夋嫨璇勪环閫夐」" + clearable + filterable + > + <el-option + v-for="(v, i) in pjOption" + :key="i" + :label="v" + :value="v" + ></el-option> + </el-select> + </el-form-item> + <el-form-item prop="deptName"> + <el-select + style="width: 150px" + v-model="form.deptName" + placeholder="璇烽€夋嫨閮ㄩ棬" + clearable + filterable + > + <el-option + v-for="v in deptList" + :key="v.id" + :label="v.name" + :value="v.name" + ></el-option> + </el-select> + </el-form-item> + <el-form-item prop="windowName"> + <el-select + style="width: 150px" + v-model="form.windowName" + placeholder="璇烽€夋嫨绐楀彛" + clearable + filterable + > + <el-option + v-for="v in windowList" + :key="v.id" + :label="`${v.name}-${v.fromnum}`" + :value="v.fromnum" + ></el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button @click="handleSearch">妫€绱�</el-button> + </el-form-item> + <el-form-item> + <el-button @click="$router.push('/engine')">杩斿洖</el-button> + </el-form-item> + </el-form> + </div> + </div> +</template> + +<script> +import { mapState } from "vuex"; +import { findBottomSubarrays } from "@/utils"; +let pjOption = ["闈炲父婊℃剰", "婊℃剰", "鍩烘湰婊℃剰", "涓嶆弧鎰�", "闈炲父涓嶆弧鎰�"]; +export default { + components: {}, + data() { + return { + pjOption, + subMenus: [], + form: { + type: "year", + businessName: "", + deptName: "", + windowName: "", + year: "", + month: "", + day: "", + pjOption: "", + }, + }; + }, + computed: { + ...mapState("user", ["businessList", "deptList", "windowList"]), + activeKey() { + return this.$route.path; + }, + }, + created() { + this.getSubMenus(); + }, + mounted() {}, + methods: { + changeRouter(e) { + this.$router.push(e.name); + }, + // 鑾峰彇褰撳墠椤跺眰璺敱涓嬬殑鎵€鏈夊瓙璺敱 + getSubMenus() { + let path = this.$route?.meta.parentPath + ? this.$route.meta.parentPath + : this.$route.path; + let options = this.$router.options.routes[0].children; + let curRouters = options.filter((v) => v.path == path); + this.subMenus = findBottomSubarrays(curRouters).filter( + (v) => !v.meta.hidden + ); + }, + handleSearch() { + this.$emit("search", this.form); + }, + }, +}; +</script> + +<style lang="less" scoped> +.search { + flex-shrink: 0; + background: url("@/assets/img/engineSearch_bg.svg") no-repeat center / 100% + 100%; + a { + color: rgba(254, 254, 254, 0.65); + } + .router-link-active { + color: #fff; + font-weight: 600; + } +} +</style> diff --git a/admin_2/src/pages/engineSearch/components/Search.vue b/admin_2/src/pages/engineSearch/components/Search.vue index 01ec3b8..6cc89ed 100644 --- a/admin_2/src/pages/engineSearch/components/Search.vue +++ b/admin_2/src/pages/engineSearch/components/Search.vue @@ -8,135 +8,129 @@ </router-link> </div> <div class="flex items-center justify-center gap-2"> - <el-form ref="form" size="small" inline :model="form"> - <el-form-item prop="type"> - <el-select - style="width: 100px" - v-model="form.type" - placeholder="璇烽€夋嫨" - > - <el-option label="鎸夊勾" value="year"></el-option> - <el-option label="鎸夋湀" value="month"></el-option> - <el-option label="鎸夋棩" value="day"></el-option> - </el-select> - </el-form-item> - <el-form-item prop="year" v-if="form.type == 'year'"> - <el-date-picker - style="width: 150px" - v-model="form.year" - type="year" - value-format="yyyy" - placeholder="閫夋嫨骞�" - > - </el-date-picker> - </el-form-item> - <el-form-item prop="month" v-if="form.type == 'month'"> - <el-date-picker - style="width: 150px" - v-model="form.month" - type="month" - value-format="yyyy-MM" - placeholder="閫夋嫨鏈�" - > - </el-date-picker> - </el-form-item> - <el-form-item prop="day" v-if="form.type == 'day'"> - <el-date-picker - style="width: 150px" - v-model="form.day" - type="date" - value-format="yyyy-MM-dd" - placeholder="閫夋嫨鏃�" - > - </el-date-picker> - </el-form-item> - <el-form-item - prop="businessName" - v-if="$route.path == '/enginesearch/queueupdata'" - > - <el-select - style="width: 150px" - v-model="form.businessName" - placeholder="璇烽€夋嫨涓氬姟" - clearable - filterable - > - <el-option - v-for="v in businessList" - :key="v.id" - :label="v.businessName" - :value="v.businessName" - ></el-option> - </el-select> - </el-form-item> - <el-form-item prop="pjOption" v-else> - <el-select - style="width: 150px" - v-model="form.pjOption" - placeholder="璇烽€夋嫨璇勪环閫夐」" - clearable - filterable - > - <el-option - v-for="(v, i) in pjOption" - :key="i" - :label="v" - :value="v" - ></el-option> - </el-select> - </el-form-item> - <el-form-item prop="deptName"> - <el-select - style="width: 150px" - v-model="form.deptName" - placeholder="璇烽€夋嫨閮ㄩ棬" - clearable - filterable - > - <el-option - v-for="v in deptList" - :key="v.id" - :label="v.name" - :value="v.name" - ></el-option> - </el-select> - </el-form-item> - <el-form-item prop="windowName"> - <el-select - style="width: 150px" - v-model="form.windowName" - placeholder="璇烽€夋嫨绐楀彛" - clearable - filterable - > - <el-option - v-for="v in windowList" - :key="v.id" - :label="`${v.name}-${v.fromnum}`" - :value="v.fromnum" - ></el-option> - </el-select> - </el-form-item> - <el-form-item> - <el-button @click="handleSearch">妫€绱�</el-button> - </el-form-item> - <el-form-item> - <el-button @click="$router.push('/engine')">杩斿洖</el-button> - </el-form-item> - </el-form> + <div class="search-box"> + <div class="flex gap-2"> + <div class="item border"> + <span class="pl-[15px] text-[14px]">閫夋嫨鏃堕棿</span> + <el-popover + trigger="click" + placement="bottom-start" + popper-class="search-popover" + > + <div class="flex flex-col items-center"> + <div class="tab-box"> + <div + :class="['tab-item', { active: form.type == 'year' }]" + @click="changeTab('year')" + > + 鎸夊勾 + </div> + <div + :class="['tab-item', { active: form.type == 'month' }]" + @click="changeTab('month')" + > + 鎸夋湀 + </div> + <div + :class="['tab-item', { active: form.type == 'date' }]" + @click="changeTab('date')" + > + 鎸夋棩 + </div> + </div> + <div class="tab-content w-ull"> + <date-picker + v-show="form.type == 'year'" + v-model="form.year" + type="year" + value-format="yyyy" + placeholder="閫夋嫨骞�" + > + </date-picker> + <date-picker + v-show="form.type == 'month'" + v-model="form.month" + type="month" + value-format="yyyy-MM" + placeholder="閫夋嫨鏈�" + > + </date-picker> + <date-picker + v-show="form.type == 'date'" + v-model="form.day" + type="date" + value-format="yyyy-MM-dd" + placeholder="閫夋嫨鏃�" + > + </date-picker> + </div> + </div> + <el-input + size="small" + placeholder="鏆傛湭閫夋嫨" + :value="dateInputVal" + slot="reference" + clearable + @clear="handleClearDate" + ></el-input> + </el-popover> + </div> + <div class="item border"> + <span class="pl-[15px] text-[14px]">閫夋嫨涓氬姟</span> + <el-popover + trigger="click" + placement="bottom-start" + popper-class="search-popover" + > + <el-input + size="small" + placeholder="鏆傛湭閫夋嫨" + slot="reference" + ></el-input> + </el-popover> + </div> + <div class="item border"> + <span class="pl-[15px] text-[14px]">閫夋嫨閮ㄩ棬</span> + <el-popover + trigger="click" + placement="bottom-start" + popper-class="search-popover" + > + <el-input + size="small" + placeholder="鏆傛湭閫夋嫨" + slot="reference" + ></el-input> + </el-popover> + </div> + <div class="item"> + <span class="pl-[15px] text-[14px]">閫夋嫨绐楀彛</span> + <el-popover + trigger="click" + placement="bottom-start" + popper-class="search-popover" + > + <el-input + size="small" + placeholder="鏆傛湭閫夋嫨" + slot="reference" + ></el-input> + </el-popover> + </div> + </div> + <div class="btn">妫€绱�</div> + </div> + <div class="back-btn" @click="$router.push('/engine')">杩斿洖</div> </div> </div> </template> <script> -import { mapState } from "vuex"; import { findBottomSubarrays } from "@/utils"; -let pjOption = ["闈炲父婊℃剰", "婊℃剰", "鍩烘湰婊℃剰", "涓嶆弧鎰�", "闈炲父涓嶆弧鎰�"]; export default { components: {}, data() { return { - pjOption, subMenus: [], form: { type: "year", @@ -151,10 +145,18 @@ export default { }; }, computed: { - ...mapState("user", ["businessList", "deptList", "windowList"]), activeKey() { return this.$route.path; }, + dateInputVal() { + if (this.form.type == "year") { + return this.form.year; + } else if (this.form.type == "month") { + return this.form.month; + } else { + return this.form.day; + } + }, }, created() { this.getSubMenus(); @@ -175,8 +177,16 @@ export default { (v) => !v.meta.hidden ); }, - handleSearch() { - this.$emit("search", this.form); + changeTab(key) { + this.form.type = key; + }, + handlePick(val) { + console.log(val); + }, + handleClearDate() { + this.form.year = ""; + this.form.month = ""; + this.form.day = ""; }, }, }; @@ -184,7 +194,6 @@ export default { <style lang="less" scoped> .search { - flex-shrink: 0; background: url("@/assets/img/engineSearch_bg.svg") no-repeat center / 100% 100%; a { @@ -195,4 +204,70 @@ export default { font-weight: 600; } } +.border { + border-right: 1px solid #ccc; +} +.search-box { + height: 68px; + width: 60%; + padding: 0px 15px; + background: #fff; + border-radius: 34px; + display: flex; + align-items: center; +} + +.btn, +.back-btn { + width: 96px; + height: 60px; + flex-shrink: 0; + font-weight: 700; + color: #fff; + line-height: 60px; + text-align: center; + background: linear-gradient(90deg, #5ab6ff, #2e9aff); + border-radius: 30px; + cursor: pointer; +} +.back-btn { + color: var(--primary); + background: #fff; +} +:deep(.el-input) { + .el-input__inner { + border: none; + } +} +.tab-box { + width: 300px; + height: 40px; + background-color: #ebebeb; + border-radius: 20px; + display: flex; + position: relative; + .tab-item { + width: 100px; + height: 100%; + border-radius: 20px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + } + .active { + background-color: #fff; + border: 2px solid var(--primary); + } +} + +:deep(.el-picker-panel) { + border: none; + box-shadow: none; + border-radius: 0px; +} +:global(.search-popover) { + width: 348px; + min-height: 330px; +} </style> diff --git a/admin_2/src/pages/engineSearch/components/date-picker/src/panel/date.vue b/admin_2/src/pages/engineSearch/components/date-picker/src/panel/date.vue index 61093c9..7a0155c 100644 --- a/admin_2/src/pages/engineSearch/components/date-picker/src/panel/date.vue +++ b/admin_2/src/pages/engineSearch/components/date-picker/src/panel/date.vue @@ -6,7 +6,7 @@ > <div v-show="visible" - class="el-picker-panel el-date-picker" + class="el-picker-panel el-date-picker el-popper" :class="[ { 'has-sidebar': $slots.sidebar || shortcuts, @@ -218,30 +218,6 @@ export default { mixins: [Locale], directives: { Clickoutside }, - data() { - return { - popperClass: "", - date: new Date(), - value: "", - defaultValue: null, // use getDefaultValue() for time computation - defaultTime: null, - showTime: false, - selectionMode: "day", - shortcuts: "", - visible: true, - currentView: "date", - disabledDate: "", - cellClassName: "", - selectableRange: [], - firstDayOfWeek: 7, - showWeekNumber: false, - timePickerVisible: false, - format: "", - arrowControl: false, - userInputDate: null, - userInputTime: null, - }; - }, watch: { showTime(val) { @@ -659,6 +635,31 @@ export default { ElButton, }, + data() { + return { + popperClass: "", + date: new Date(), + value: "", + defaultValue: null, // use getDefaultValue() for time computation + defaultTime: null, + showTime: false, + selectionMode: "day", + shortcuts: "", + visible: true, + currentView: "date", + disabledDate: "", + cellClassName: "", + selectableRange: [], + firstDayOfWeek: 7, + showWeekNumber: false, + timePickerVisible: false, + format: "", + arrowControl: false, + userInputDate: null, + userInputTime: null, + }; + }, + computed: { year() { return this.date.getFullYear(); diff --git a/admin_2/src/pages/engineSearch/components/date-picker/src/picker.vue b/admin_2/src/pages/engineSearch/components/date-picker/src/picker.vue index d24362e..4bb1764 100644 --- a/admin_2/src/pages/engineSearch/components/date-picker/src/picker.vue +++ b/admin_2/src/pages/engineSearch/components/date-picker/src/picker.vue @@ -1,102 +1,5 @@ <template> - <el-input - class="el-date-editor" - :class="'el-date-editor--' + type" - :readonly=" - !editable || - readonly || - type === 'dates' || - type === 'week' || - type === 'years' || - type === 'months' - " - :disabled="pickerDisabled" - :size="pickerSize" - :name="name" - v-bind="firstInputId" - v-if="!ranged" - v-clickoutside="handleClose" - :placeholder="placeholder" - @focus="handleFocus" - @keydown.native="handleKeydown" - :value="displayValue" - @input="(value) => (userInput = value)" - @change="handleChange" - @mouseenter.native="handleMouseEnter" - @mouseleave.native="showClose = false" - :validateEvent="false" - ref="reference" - > - <i - slot="prefix" - class="el-input__icon" - :class="triggerClass" - @click="handleFocus" - > - </i> - <i - slot="suffix" - class="el-input__icon" - @click="handleClickIcon" - :class="[showClose ? '' + clearIcon : '']" - v-if="haveTrigger" - > - </i> - </el-input> - <div - class="el-date-editor el-range-editor el-input__inner" - :class="[ - 'el-date-editor--' + type, - pickerSize ? `el-range-editor--${pickerSize}` : '', - pickerDisabled ? 'is-disabled' : '', - pickerVisible ? 'is-active' : '', - ]" - @click="handleRangeClick" - @mouseenter="handleMouseEnter" - @mouseleave="showClose = false" - @keydown="handleKeydown" - ref="reference" - v-clickoutside="handleClose" - v-else - > - <i :class="['el-input__icon', 'el-range__icon', triggerClass]"></i> - <input - autocomplete="off" - :placeholder="startPlaceholder" - :value="displayValue && displayValue[0]" - :disabled="pickerDisabled" - v-bind="firstInputId" - :readonly="!editable || readonly" - :name="name && name[0]" - @input="handleStartInput" - @change="handleStartChange" - @focus="handleFocus" - class="el-range-input" - /> - <slot name="range-separator"> - <span class="el-range-separator">{{ rangeSeparator }}</span> - </slot> - <input - autocomplete="off" - :placeholder="endPlaceholder" - :value="displayValue && displayValue[1]" - :disabled="pickerDisabled" - v-bind="secondInputId" - :readonly="!editable || readonly" - :name="name && name[1]" - @input="handleEndInput" - @change="handleEndChange" - @focus="handleFocus" - class="el-range-input" - /> - <i - @click="handleClickIcon" - v-if="haveTrigger" - :class="[showClose ? '' + clearIcon : '']" - class="el-input__icon el-range__close-icon" - > - </i> - </div> + <div class="w-full" ref="reference"></div> </template> <script> @@ -109,25 +12,25 @@ import { isDateObject, getWeekNumber, } from "element-ui/src/utils/date-util"; -import Popper from "element-ui/src/utils/vue-popper"; +// import Popper from "element-ui/src/utils/vue-popper"; import Emitter from "element-ui/src/mixins/emitter"; import ElInput from "element-ui/packages/input"; -import merge from "element-ui/src/utils/merge"; - -const NewPopper = { - props: { - appendToBody: Popper.props.appendToBody, - offset: Popper.props.offset, - boundariesPadding: Popper.props.boundariesPadding, - arrowOffset: Popper.props.arrowOffset, - transformOrigin: Popper.props.transformOrigin, - }, - methods: Popper.methods, - data() { - return merge({ visibleArrow: true }, Popper.data); - }, - beforeDestroy: Popper.beforeDestroy, -}; +// import merge from "element-ui/src/utils/merge"; + +// const NewPopper = { +// props: { +// appendToBody: Popper.props.appendToBody, +// offset: Popper.props.offset, +// boundariesPadding: Popper.props.boundariesPadding, +// arrowOffset: Popper.props.arrowOffset, +// transformOrigin: Popper.props.transformOrigin, +// }, +// methods: Popper.methods, +// data() { +// return merge({ visibleArrow: true }, Popper.data); +// }, +// beforeDestroy: Popper.beforeDestroy, +// }; const DEFAULT_FORMATS = { date: "yyyy-MM-dd", @@ -384,7 +287,7 @@ const validator = function (val) { }; export default { - mixins: [Emitter, NewPopper], + mixins: [Emitter], inject: { elForm: { @@ -666,6 +569,9 @@ export default { this.$on("fieldReset", this.handleFieldReset); }, + mounted() { + this.showPicker(); + }, methods: { focus() { @@ -915,7 +821,7 @@ export default { if (this.picker) { this.picker.resetView && this.picker.resetView(); this.pickerVisible = this.picker.visible = false; - this.destroyPopper(); + // this.destroyPopper(); } }, @@ -926,7 +832,7 @@ export default { } this.pickerVisible = this.picker.visible = true; - this.updatePopper(); + // this.updatePopper(); this.picker.value = this.parsedValue; this.picker.resetView && this.picker.resetView(); @@ -994,21 +900,21 @@ export default { this.picker.$on("dodestroy", this.doDestroy); this.picker.$on("pick", (date = "", visible = false) => { this.userInput = null; - this.pickerVisible = this.picker.visible = visible; + // this.pickerVisible = this.picker.visible = visible; this.emitInput(date); this.picker.resetView && this.picker.resetView(); }); - this.picker.$on("select-range", (start, end, pos) => { - if (this.refInput.length === 0) return; - if (!pos || pos === "min") { - this.refInput[0].setSelectionRange(start, end); - this.refInput[0].focus(); - } else if (pos === "max") { - this.refInput[1].setSelectionRange(start, end); - this.refInput[1].focus(); - } - }); + // this.picker.$on("select-range", (start, end, pos) => { + // if (this.refInput.length === 0) return; + // if (!pos || pos === "min") { + // this.refInput[0].setSelectionRange(start, end); + // this.refInput[0].focus(); + // } else if (pos === "max") { + // this.refInput[1].setSelectionRange(start, end); + // this.refInput[1].focus(); + // } + // }); }, unmountPicker() { -- 2.24.3