页首修改
Showing
25 changed files
with
2168 additions
and
52 deletions
src/assets/images/home/icon-tel.png
0 → 100644
423 Bytes
src/components/home-bk/dropdown/dropdown.js
0 → 100644
| 1 | /** | ||
| 2 | * 组件描述:PC顶栏导航下拉菜单 | ||
| 3 | */ | ||
| 4 | import api from '@/api/api' | ||
| 5 | import { | ||
| 6 | httpPost | ||
| 7 | } from '@/api/fetch-api.js' | ||
| 8 | |||
| 9 | export default { | ||
| 10 | name: "DropDownList", | ||
| 11 | data() { | ||
| 12 | return { | ||
| 13 | activeIndex: 0, | ||
| 14 | sTitle: this.dataObj && this.dataObj.name || '', | ||
| 15 | reloadBlackList: [] | ||
| 16 | }; | ||
| 17 | }, | ||
| 18 | props: { | ||
| 19 | /** | ||
| 20 | * 导航类型 | ||
| 21 | * nav:普通菜单导航 | ||
| 22 | * login:登陆菜单 | ||
| 23 | * lang:三语切换菜单 | ||
| 24 | */ | ||
| 25 | type: { | ||
| 26 | type: String, | ||
| 27 | default () { | ||
| 28 | return "nav"; | ||
| 29 | } | ||
| 30 | }, | ||
| 31 | /** | ||
| 32 | * 传入菜单完整数据 | ||
| 33 | */ | ||
| 34 | dataObj: { | ||
| 35 | type: Object, | ||
| 36 | default () { | ||
| 37 | return {}; | ||
| 38 | } | ||
| 39 | }, | ||
| 40 | /** | ||
| 41 | * 传入菜单列表 | ||
| 42 | */ | ||
| 43 | dataList: { | ||
| 44 | type: Array, | ||
| 45 | default () { | ||
| 46 | return []; | ||
| 47 | } | ||
| 48 | }, | ||
| 49 | labelProperty: { | ||
| 50 | type: String, | ||
| 51 | default () { | ||
| 52 | return "name"; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | }, | ||
| 56 | directives: { | ||
| 57 | dpl: { | ||
| 58 | bind(el) { | ||
| 59 | el.style.display = "none"; | ||
| 60 | } | ||
| 61 | } | ||
| 62 | }, | ||
| 63 | methods: { | ||
| 64 | onNavHandler() { | ||
| 65 | console.log("this.dataObj:", this.dataObj); | ||
| 66 | let path = this.dataObj && this.dataObj.path || ""; | ||
| 67 | if (path) { | ||
| 68 | this.$router.push({ | ||
| 69 | path: path | ||
| 70 | }) | ||
| 71 | } | ||
| 72 | }, | ||
| 73 | onOverHandler(event) { | ||
| 74 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 75 | ul.style.display = "block"; | ||
| 76 | }, | ||
| 77 | onOutHandler(event) { | ||
| 78 | // console.log(event); | ||
| 79 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 80 | ul.style.display = "none"; | ||
| 81 | }, | ||
| 82 | onClickHandler(event, index) { | ||
| 83 | // 隐藏其他 | ||
| 84 | if (this.$refs.ul) { | ||
| 85 | this.$refs.ul.style.display = "none"; | ||
| 86 | } | ||
| 87 | |||
| 88 | // 选择item | ||
| 89 | this.activeIndex = index; | ||
| 90 | let curData = this.dataList[index]; | ||
| 91 | if (this.type == "lang") { | ||
| 92 | // 如果是语言设置,则设置语言 | ||
| 93 | let lang = curData.value; | ||
| 94 | if (lang != localStorage.getItem('lang')) { | ||
| 95 | localStorage.setItem("lang", lang); | ||
| 96 | if (this.reloadBlackList.indexOf(this.$route.path) >= 0) { | ||
| 97 | window.location.reload(); | ||
| 98 | } else { | ||
| 99 | this.$i18n.locale = lang; | ||
| 100 | this.sTitle = curData.name; | ||
| 101 | this.$root.eventBus.$emit("langChange"); | ||
| 102 | } | ||
| 103 | } | ||
| 104 | } else { | ||
| 105 | let item = curData; | ||
| 106 | let path = item && item.path || ""; | ||
| 107 | this.$root.eventBus.$emit(item.path); | ||
| 108 | if (path) { | ||
| 109 | // console.log("path:", path); | ||
| 110 | // modify | ||
| 111 | if (path == "/custom/service?q=m5") { | ||
| 112 | path = "/clarms" | ||
| 113 | } | ||
| 114 | this.$router.push({ | ||
| 115 | path: path | ||
| 116 | }) | ||
| 117 | } else { | ||
| 118 | let value = item && item.value || null; | ||
| 119 | if (value) { | ||
| 120 | switch (value) { | ||
| 121 | case "login": | ||
| 122 | this.onLoginHandler(); | ||
| 123 | break; | ||
| 124 | case "logout": | ||
| 125 | this.logoutHandler(); | ||
| 126 | break; | ||
| 127 | case "gotoVHIS": | ||
| 128 | // gotoVHIS(this.$i18n.locale); | ||
| 129 | this.$router.push({ | ||
| 130 | path: "/vhis" | ||
| 131 | }); | ||
| 132 | break; | ||
| 133 | } | ||
| 134 | } | ||
| 135 | } | ||
| 136 | } | ||
| 137 | }, | ||
| 138 | onLoginHandler() { | ||
| 139 | this.$root.eventBus.$emit("login"); | ||
| 140 | if (this.$route.name == "login") { | ||
| 141 | return; | ||
| 142 | } else if (this.$route.name == "register" || this.$route.name == "passwordFind") { | ||
| 143 | this.$router.push({ | ||
| 144 | path: "/login" | ||
| 145 | }); | ||
| 146 | } else { | ||
| 147 | let callback = this.$route.fullPath; | ||
| 148 | this.$router.push({ | ||
| 149 | path: "/login?callback=" + callback | ||
| 150 | }); | ||
| 151 | } | ||
| 152 | }, | ||
| 153 | logoutHandler() { | ||
| 154 | this.clearCache(); | ||
| 155 | httpPost({ | ||
| 156 | url: api.logout | ||
| 157 | }).then(() => { | ||
| 158 | this.$store.commit("SET_USER_INFO", null); | ||
| 159 | this.showLogoutTip(); | ||
| 160 | }); | ||
| 161 | }, | ||
| 162 | clearCache() { | ||
| 163 | for (let index = 0; index < sessionStorage.length; index++) { | ||
| 164 | let key = sessionStorage.key(index); | ||
| 165 | console.log(key); | ||
| 166 | sessionStorage.removeItem(key); | ||
| 167 | } | ||
| 168 | }, | ||
| 169 | showLogoutTip() { | ||
| 170 | // 登出后的提示 | ||
| 171 | // alert("登出成功"); | ||
| 172 | }, | ||
| 173 | updateTitle(name) { | ||
| 174 | this.sTitle = name || this.sTitle; | ||
| 175 | } | ||
| 176 | }, | ||
| 177 | computed: { | ||
| 178 | dplLable() { | ||
| 179 | return this.dataList[this.activeIndex][this.labelProperty]; | ||
| 180 | } | ||
| 181 | }, | ||
| 182 | created() {}, | ||
| 183 | }; |
| 1 | @import '@/styles/_support.scss'; | ||
| 2 | |||
| 3 | .drop-list { | ||
| 4 | display: inline-block; | ||
| 5 | min-width: 120px; | ||
| 6 | position: relative; | ||
| 7 | margin: 0 13.2px; | ||
| 8 | font-size: $fontSizeTitle; | ||
| 9 | |||
| 10 | .list { | ||
| 11 | position: absolute; | ||
| 12 | width: 132px; | ||
| 13 | left: 0; | ||
| 14 | right: 0; | ||
| 15 | margin: 0 auto; | ||
| 16 | font-size: $fontSize; | ||
| 17 | left: 50%; | ||
| 18 | transform: translateX(-50%); //居中处理 | ||
| 19 | |||
| 20 | .space { | ||
| 21 | height: 18px; | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
| 25 | span { | ||
| 26 | display: block; | ||
| 27 | text-align: center; | ||
| 28 | } | ||
| 29 | |||
| 30 | span:hover {} | ||
| 31 | |||
| 32 | ul { | ||
| 33 | display: none; | ||
| 34 | overflow: hidden; | ||
| 35 | box-shadow: 0 0 18px 0 rgba(255, 87, 0, 0.15); | ||
| 36 | border-radius: 6px; | ||
| 37 | |||
| 38 | li { | ||
| 39 | // border-bottom: solid 1px #f1f1f1; | ||
| 40 | background: #ffffff; | ||
| 41 | text-align: center; | ||
| 42 | padding: 18px 0; | ||
| 43 | position: relative; | ||
| 44 | |||
| 45 | &:after { | ||
| 46 | content: ""; | ||
| 47 | width: 84px; | ||
| 48 | height: 1px; | ||
| 49 | background: #f1f1f1; | ||
| 50 | position: absolute; | ||
| 51 | bottom: 0; | ||
| 52 | left: 50%; | ||
| 53 | transform: translateX(-50%); //居中处理 | ||
| 54 | } | ||
| 55 | |||
| 56 | } | ||
| 57 | |||
| 58 | li:last-child { | ||
| 59 | border-bottom: none; | ||
| 60 | |||
| 61 | &:after { | ||
| 62 | background: transparent; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | li:hover { | ||
| 67 | color: $cOrange; | ||
| 68 | } | ||
| 69 | } | ||
| 70 | } | ||
| 71 | .drop-list:lang(en){ | ||
| 72 | min-width: 0; | ||
| 73 | margin: 0 32px; | ||
| 74 | } | ||
| 75 | |||
| 76 | .user { | ||
| 77 | width: 111px; | ||
| 78 | height: 36px; | ||
| 79 | border-radius: 36px; | ||
| 80 | background-color: $cOrange; | ||
| 81 | display: flex; | ||
| 82 | align-items: center; | ||
| 83 | justify-content: center; | ||
| 84 | color: #ffffff; | ||
| 85 | margin: 0 auto; | ||
| 86 | |||
| 87 | span { | ||
| 88 | max-width: 51px; | ||
| 89 | overflow: hidden; | ||
| 90 | white-space: nowrap; | ||
| 91 | text-overflow: ellipsis; | ||
| 92 | } | ||
| 93 | |||
| 94 | .icon-img { | ||
| 95 | margin: 0 6px; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | // 登陆 | ||
| 100 | .login {} | ||
| 101 | |||
| 102 | |||
| 103 | @media (max-width: 1100px) { | ||
| 104 | .drop-list { | ||
| 105 | margin: 0 28px; | ||
| 106 | min-width: 0; | ||
| 107 | } | ||
| 108 | .drop-list:lang(en) { | ||
| 109 | margin: 0 22px; | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | |||
| 114 | @media (max-width: 1000px) { | ||
| 115 | // .drop-list { | ||
| 116 | // margin: 0 20px; | ||
| 117 | // } | ||
| 118 | } |
src/components/home-bk/dropdown/dropdown.vue
0 → 100644
| 1 | <template> | ||
| 2 | <div class="drop-list" :class="{'login':type=='login'}" @mouseover="onOverHandler($event)" @mouseout="onOutHandler($event)"> | ||
| 3 | <!-- 登陆下拉样式 --> | ||
| 4 | <template v-if="type=='login'"> | ||
| 5 | <div class="user" @click="onLoginHandler()"> | ||
| 6 | <img class="icon-img" src="@/assets/images/home/icon-user.png"> | ||
| 7 | <span>{{dataObj.name}}</span> | ||
| 8 | </div> | ||
| 9 | </template> | ||
| 10 | <!-- 其他下拉样式 --> | ||
| 11 | <template v-else> | ||
| 12 | <span @click="onNavHandler()"> | ||
| 13 | {{type == "lang" ? sTitle : dataObj.name}} | ||
| 14 | </span> | ||
| 15 | </template> | ||
| 16 | <div class="list"> | ||
| 17 | <div class="space"></div> | ||
| 18 | <ul ref="ul" > | ||
| 19 | <li v-for="(item, index) in dataList" :key="index" @mousedown="onClickHandler($event,index)">{{item[labelProperty]}}</li> | ||
| 20 | </ul> | ||
| 21 | </div> | ||
| 22 | </div> | ||
| 23 | </template> | ||
| 24 | |||
| 25 | <script src="./dropdown.js"></script> | ||
| 26 | <style lang="scss" scoped> | ||
| 27 | @import "./dropdown.scss"; | ||
| 28 | </style> |
src/components/home-bk/footer/footer.js
0 → 100644
| 1 | |||
| 2 | /** | ||
| 3 | * 组件描述:页脚 | ||
| 4 | * 静态页面 | ||
| 5 | */ | ||
| 6 | |||
| 7 | export default { | ||
| 8 | data() { | ||
| 9 | return { | ||
| 10 | key: 'value', | ||
| 11 | qrcodeVisible: false, | ||
| 12 | } | ||
| 13 | }, | ||
| 14 | components: {}, | ||
| 15 | methods: { | ||
| 16 | onOverHandler(event) { | ||
| 17 | this.qrcodeVisible = true; | ||
| 18 | }, | ||
| 19 | onOutHandler(event) { | ||
| 20 | this.qrcodeVisible = false; | ||
| 21 | }, | ||
| 22 | toPage(name) { | ||
| 23 | document.documentElement.scrollTop = 0; | ||
| 24 | document.body.scrollTop = 0; | ||
| 25 | this.$router.push({ | ||
| 26 | name: name | ||
| 27 | }) | ||
| 28 | }, | ||
| 29 | toPath(path) { | ||
| 30 | document.documentElement.scrollTop = 0; | ||
| 31 | document.body.scrollTop = 0; | ||
| 32 | this.$router.push({ | ||
| 33 | path: path | ||
| 34 | }) | ||
| 35 | }, | ||
| 36 | initData() {} | ||
| 37 | }, | ||
| 38 | mounted() {}, | ||
| 39 | created() {} | ||
| 40 | } |
src/components/home-bk/footer/footer.scss
0 → 100644
| 1 | @import '@/styles/_support.scss'; | ||
| 2 | |||
| 3 | .v-footer { | ||
| 4 | color: #ffffff; | ||
| 5 | background-color: #2e2b2a; | ||
| 6 | font-size: $fontSize; | ||
| 7 | |||
| 8 | .footer-containter { | ||
| 9 | margin: 0 auto; | ||
| 10 | max-width: 1200px; | ||
| 11 | |||
| 12 | .cont { | ||
| 13 | .logo-wrap { | ||
| 14 | padding: 26px 0; | ||
| 15 | |||
| 16 | .logo-img { | ||
| 17 | cursor: pointer; | ||
| 18 | } | ||
| 19 | } | ||
| 20 | |||
| 21 | .line { | ||
| 22 | width: 100%; | ||
| 23 | height: 1px; | ||
| 24 | opacity: 0.2; | ||
| 25 | background-color: #ffffff; | ||
| 26 | } | ||
| 27 | |||
| 28 | // 信息 | ||
| 29 | .info { | ||
| 30 | padding: 24px 0 24px; | ||
| 31 | display: flex; | ||
| 32 | |||
| 33 | // 热线 | ||
| 34 | .hotline { | ||
| 35 | min-width: 294px; | ||
| 36 | |||
| 37 | .contact { | ||
| 38 | .n-item { | ||
| 39 | margin-bottom: 7.2px; | ||
| 40 | } | ||
| 41 | |||
| 42 | .phone { | ||
| 43 | color: $cOrange; | ||
| 44 | font-size: $fontSizeTitle; | ||
| 45 | font-weight: bold; | ||
| 46 | } | ||
| 47 | |||
| 48 | &:first-child { | ||
| 49 | margin-bottom: 24px; | ||
| 50 | } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | // 导航 | ||
| 55 | .nav { | ||
| 56 | display: flex; | ||
| 57 | |||
| 58 | .nav-v {} | ||
| 59 | |||
| 60 | .n-item { | ||
| 61 | cursor: pointer; | ||
| 62 | min-width: 177px; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | .nav2 { | ||
| 67 | display: none; | ||
| 68 | } | ||
| 69 | |||
| 70 | // 公众号 | ||
| 71 | .public { | ||
| 72 | position: relative; | ||
| 73 | text-align: left; | ||
| 74 | margin-left: 63.84px; | ||
| 75 | |||
| 76 | .qrcode-wrap { | ||
| 77 | text-align: center; | ||
| 78 | margin-top: 3.6px; | ||
| 79 | |||
| 80 | |||
| 81 | .qrcode { | ||
| 82 | width: 100px; | ||
| 83 | } | ||
| 84 | |||
| 85 | .c1 { | ||
| 86 | margin-top: 3.6px; | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | .icon { | ||
| 91 | margin-top: 9px; | ||
| 92 | margin-right: 12px; | ||
| 93 | display: inline-block; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | // 公共组件 | ||
| 98 | .n-item { | ||
| 99 | margin-bottom: 24px; | ||
| 100 | padding-right: 36px; | ||
| 101 | color: #dcdddd; | ||
| 102 | |||
| 103 | &:first-child { | ||
| 104 | margin-bottom: 32px; | ||
| 105 | } | ||
| 106 | |||
| 107 | &:last-child { | ||
| 108 | margin-bottom: 0; | ||
| 109 | } | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | // 版权 | ||
| 114 | .copyright { | ||
| 115 | color: rgba(179, 177, 168, 0.5); | ||
| 116 | padding: 18px 0; | ||
| 117 | line-height: 1.58; | ||
| 118 | font-size: $fontSizeSmall; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 125 | |||
| 126 | @media (max-width: 1200px) { | ||
| 127 | .v-footer { | ||
| 128 | @include content-percent(); | ||
| 129 | |||
| 130 | .footer-containter { | ||
| 131 | .cont { | ||
| 132 | .info { | ||
| 133 | display: block; | ||
| 134 | |||
| 135 | .hotline {} | ||
| 136 | |||
| 137 | .nav { | ||
| 138 | margin-top: 24px; | ||
| 139 | display: flex; | ||
| 140 | |||
| 141 | .nav-v { | ||
| 142 | width: 100%; | ||
| 143 | } | ||
| 144 | |||
| 145 | .n-item { | ||
| 146 | min-width: 0; | ||
| 147 | margin-right: 0; | ||
| 148 | padding-right: 10px; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | .nav2 { | ||
| 153 | display: none; | ||
| 154 | } | ||
| 155 | |||
| 156 | .public { | ||
| 157 | margin: 0; | ||
| 158 | margin-top: 36px; | ||
| 159 | text-align: left; | ||
| 160 | min-height: 144px; | ||
| 161 | } | ||
| 162 | } | ||
| 163 | |||
| 164 | .copyright { | ||
| 165 | box-sizing: border-box; | ||
| 166 | padding-right: 24px; | ||
| 167 | } | ||
| 168 | } | ||
| 169 | } | ||
| 170 | } | ||
| 171 | } | ||
| 172 | |||
| 173 | @media (max-width: 768px) { | ||
| 174 | .v-footer { | ||
| 175 | font-size: $fontSizeSmall-M; | ||
| 176 | |||
| 177 | .footer-containter { | ||
| 178 | .cont { | ||
| 179 | .info { | ||
| 180 | display: flex; | ||
| 181 | justify-content: space-between; | ||
| 182 | |||
| 183 | .hotline { | ||
| 184 | min-width: 0; | ||
| 185 | |||
| 186 | .phone { | ||
| 187 | font-size: $fontSizeSmall-M !important; | ||
| 188 | font-weight: bold !important; | ||
| 189 | } | ||
| 190 | } | ||
| 191 | |||
| 192 | .nav { | ||
| 193 | display: none; | ||
| 194 | margin-top: 0; | ||
| 195 | |||
| 196 | .nav-v {} | ||
| 197 | |||
| 198 | .n-item {} | ||
| 199 | } | ||
| 200 | |||
| 201 | .nav2 { | ||
| 202 | display: block; | ||
| 203 | } | ||
| 204 | |||
| 205 | .public { | ||
| 206 | margin: 0; | ||
| 207 | min-width: 108px; | ||
| 208 | |||
| 209 | .qrcode-wrap { | ||
| 210 | img { | ||
| 211 | width: 84px; | ||
| 212 | } | ||
| 213 | |||
| 214 | .c1 { | ||
| 215 | display: none; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | } | ||
| 219 | |||
| 220 | // 公共组件 | ||
| 221 | .n-item { | ||
| 222 | margin-bottom: 24px; | ||
| 223 | |||
| 224 | &:first-child { | ||
| 225 | margin-bottom: 24px; | ||
| 226 | } | ||
| 227 | } | ||
| 228 | } | ||
| 229 | |||
| 230 | .copyright {} | ||
| 231 | } | ||
| 232 | } | ||
| 233 | } | ||
| 234 | |||
| 235 | } |
src/components/home-bk/footer/footer.vue
0 → 100644
| 1 | |||
| 2 | <template> | ||
| 3 | <footer class="v-footer "> | ||
| 4 | <div class="footer-containter "> | ||
| 5 | <div class="cont"> | ||
| 6 | <div class="logo-wrap"> | ||
| 7 | <img class="logo-img" src="@/assets/images/home/footer-logo.png"> | ||
| 8 | </div> | ||
| 9 | <div class="line"></div> | ||
| 10 | <!-- 信息 --> | ||
| 11 | <div class="info"> | ||
| 12 | <div class="hotline"> | ||
| 13 | <div class="contact"> | ||
| 14 | <div class="n-item">{{$t('footer.hkPhone')}}</div> | ||
| 15 | <div class="phone">(852)2983 8866</div> | ||
| 16 | </div> | ||
| 17 | <div class="contact"> | ||
| 18 | <div class="n-item">{{$t('footer.cnPhone')}}</div> | ||
| 19 | <div class="phone">(86)40078 95511</div> | ||
| 20 | </div> | ||
| 21 | </div> | ||
| 22 | <div class="nav"> | ||
| 23 | <div class="nav-v"> | ||
| 24 | <div @click="toPage('profile')" class="n-item">{{$t('footer.aboutUs')}}</div> | ||
| 25 | <div @click="toPage('profile')" class="n-item">{{$t('footer.companyIntroduction')}}</div> | ||
| 26 | <div @click="toPage('newsList')" class="n-item">{{$t('footer.news')}}</div> | ||
| 27 | <div @click="toPage('joinUs')" class="n-item">{{$t('footer.joinUs')}}</div> | ||
| 28 | </div> | ||
| 29 | <div class="nav-v"> | ||
| 30 | <div @click="toPage('help')" class="n-item">{{$t('footer.helpCenter')}}</div> | ||
| 31 | <div @click="toPage('privacy')" class="n-item">{{$t('footer.privacy')}}</div> | ||
| 32 | <div @click="toPage('terms')" class="n-item">{{$t('footer.terms')}}</div> | ||
| 33 | <div @click="toPage('personalDataCollection')" class="n-item">{{$t('footer.protocol')}}</div> | ||
| 34 | </div> | ||
| 35 | <div class="nav-v"> | ||
| 36 | <div @click="toPath('/custom/service?q=m1')" class="n-item">{{$t('footer.contactUs')}}</div> | ||
| 37 | <div @click="toPage('contactMethod')" class="n-item">{{$t('footer.contactInformation')}}</div> | ||
| 38 | <div @click="toPage('serviceNet')" class="n-item">{{$t('footer.service')}}</div> | ||
| 39 | <div @click="toPage('map')" class="n-item">{{$t('footer.map')}}</div> | ||
| 40 | </div> | ||
| 41 | </div> | ||
| 42 | |||
| 43 | <div class="nav nav2"> | ||
| 44 | <div class="nav-v"> | ||
| 45 | <div @click="toPage('privacy')" class="n-item">{{$t('footer.privacy')}}</div> | ||
| 46 | <div @click="toPage('terms')" class="n-item">{{$t('footer.terms')}}</div> | ||
| 47 | <div @click="toPage('personalDataCollection')" class="n-item">{{$t('footer.protocol')}}</div> | ||
| 48 | </div> | ||
| 49 | </div> | ||
| 50 | |||
| 51 | <div class="public"> | ||
| 52 | <div class="tit">{{$t('footer.qrcode')}}</div> | ||
| 53 | <div @click="qrcodeVisible = !qrcodeVisible" v-if="qrcodeVisible" class="qrcode-wrap"> | ||
| 54 | <img @mouseout="onOutHandler($event)" src="@/assets/images/home/qrcode.png" alt=""> | ||
| 55 | <div class="c1">{{$t('footer.qrcodeBot')}}</div> | ||
| 56 | </div> | ||
| 57 | <template v-else> | ||
| 58 | <img @click="qrcodeVisible = !qrcodeVisible" @mouseover="onOverHandler($event)" @mouseout="onOutHandler($event)" class="icon pointer" src="@/assets/images/home/footer-icon-1.png" alt=""> | ||
| 59 | <img class="icon pointer" src="@/assets/images/home/footer-icon-2.png" alt=""> | ||
| 60 | <img class="icon pointer" src="@/assets/images/home/footer-icon-3.png" alt=""> | ||
| 61 | </template> | ||
| 62 | </div> | ||
| 63 | |||
| 64 | </div> | ||
| 65 | <div class="line"></div> | ||
| 66 | <!-- 版权 --> | ||
| 67 | <div class="copyright"> | ||
| 68 | {{$t('footer.copyright')}} | ||
| 69 | </div> | ||
| 70 | </div> | ||
| 71 | </div> | ||
| 72 | </footer> | ||
| 73 | </template> | ||
| 74 | |||
| 75 | <script src="./footer.js"></script> | ||
| 76 | <style lang="scss" scoped> | ||
| 77 | @import "./footer.scss"; | ||
| 78 | </style> |
src/components/home-bk/header/header.js
0 → 100644
| 1 | /** | ||
| 2 | * 组件描述:官网顶栏导航 | ||
| 3 | * 通过@midea 媒体查询决定显示PC/移动端样式 | ||
| 4 | */ | ||
| 5 | |||
| 6 | import { | ||
| 7 | mapState | ||
| 8 | } from 'vuex' | ||
| 9 | |||
| 10 | import { | ||
| 11 | getObjByListKeyValue | ||
| 12 | } from '@utils/utils.js' | ||
| 13 | import VDropdown from '@components/home/dropdown/dropdown.vue' | ||
| 14 | import MDropdown from '@components/home/m-dropdown/m-dropdown.vue' | ||
| 15 | |||
| 16 | export default { | ||
| 17 | name: 'VHeader', | ||
| 18 | components: { | ||
| 19 | VDropdown, | ||
| 20 | MDropdown | ||
| 21 | }, | ||
| 22 | computed: { | ||
| 23 | i18n() { | ||
| 24 | return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {}; | ||
| 25 | } | ||
| 26 | }, | ||
| 27 | data() { | ||
| 28 | return { | ||
| 29 | dropdownMVisible: false, | ||
| 30 | loginMVisible: false, | ||
| 31 | maxClientWidth: 1200, | ||
| 32 | // 用于传入到导航组件dropdown 常规导航菜单数据 | ||
| 33 | navList: [], | ||
| 34 | // 用于传入到导航组件dropdown 登菜单数据 | ||
| 35 | loginData: {}, | ||
| 36 | // 用于传入到导航组件dropdown 语言菜单数据 | ||
| 37 | langData: { | ||
| 38 | name: "繁", | ||
| 39 | path: "", | ||
| 40 | list: [{ | ||
| 41 | name: "繁", | ||
| 42 | path: "", | ||
| 43 | value: "tc" | ||
| 44 | }, | ||
| 45 | { | ||
| 46 | name: "简", | ||
| 47 | path: "", | ||
| 48 | value: "zh" | ||
| 49 | }, | ||
| 50 | { | ||
| 51 | name: "EN", | ||
| 52 | path: "", | ||
| 53 | value: "en" | ||
| 54 | }, | ||
| 55 | ] | ||
| 56 | } | ||
| 57 | } | ||
| 58 | }, | ||
| 59 | computed: { | ||
| 60 | ...mapState({ | ||
| 61 | isSmallScreen: state => state.isSmallScreen, | ||
| 62 | userInfo: state => state.userInfo | ||
| 63 | }) | ||
| 64 | }, | ||
| 65 | methods: { | ||
| 66 | toIndex() { | ||
| 67 | this.$router.push({ | ||
| 68 | path: "/" | ||
| 69 | }) | ||
| 70 | }, | ||
| 71 | onShowDropdown(evtStr) { | ||
| 72 | this.dropdownMVisible = false; | ||
| 73 | this.loginMVisible = false; | ||
| 74 | if (evtStr == 'nav') { | ||
| 75 | this.dropdownMVisible = true; | ||
| 76 | } else if (evtStr == 'login') { | ||
| 77 | this.loginMVisible = true; | ||
| 78 | } else {} | ||
| 79 | }, | ||
| 80 | checkIsSmallScreen() { | ||
| 81 | const self = this; | ||
| 82 | if (document.body.clientWidth > self.maxClientWidth) { | ||
| 83 | self.$store.commit('IS_SMALL_SCREEN', false) | ||
| 84 | } else { | ||
| 85 | self.$store.commit('IS_SMALL_SCREEN', true) | ||
| 86 | } | ||
| 87 | }, | ||
| 88 | initData() { | ||
| 89 | let i18n = this.$i18n.messages[this.$i18n.locale] || {}; | ||
| 90 | this.buildLoginMenu(); | ||
| 91 | this.navList = i18n.nav.navList; | ||
| 92 | let curLang = getObjByListKeyValue(this.$i18n.locale, "value", this.langData.list) | ||
| 93 | this.langData.name = curLang.name; | ||
| 94 | }, | ||
| 95 | /** | ||
| 96 | * 根据登陆状态构建登陆菜单 | ||
| 97 | */ | ||
| 98 | buildLoginMenu() { | ||
| 99 | let i18n = this.$i18n.messages[this.$i18n.locale] || {}; | ||
| 100 | let menuData = JSON.parse(JSON.stringify(i18n.nav.loginData)); | ||
| 101 | let list = []; | ||
| 102 | if (this.userInfo && this.userInfo.name) { | ||
| 103 | menuData.name = this.userInfo.name; | ||
| 104 | if (this.$i18n.locale == "en" && this.userInfo.nameEn) { | ||
| 105 | menuData.name = this.userInfo.nameEn; | ||
| 106 | } | ||
| 107 | menuData.list.forEach(element => { | ||
| 108 | if (element.type == "auth") { | ||
| 109 | list.push(element); | ||
| 110 | } | ||
| 111 | }); | ||
| 112 | } else { | ||
| 113 | menuData.list.forEach(element => { | ||
| 114 | if (element.type == "noAuth") { | ||
| 115 | list.push(element); | ||
| 116 | } | ||
| 117 | }); | ||
| 118 | } | ||
| 119 | menuData.list = list; | ||
| 120 | this.$set(this, 'loginData', menuData); | ||
| 121 | } | ||
| 122 | }, | ||
| 123 | beforeDestroy() { | ||
| 124 | window.removeEventListener('resize', this.checkIsSmallScreen(), false) | ||
| 125 | }, | ||
| 126 | mounted() { | ||
| 127 | window.addEventListener('resize', () => this.checkIsSmallScreen(), false); | ||
| 128 | this.$root.eventBus.$on("langChange", () => { | ||
| 129 | this.initData(); | ||
| 130 | }); | ||
| 131 | }, | ||
| 132 | watch: { | ||
| 133 | userInfo(val) { | ||
| 134 | this.buildLoginMenu(); | ||
| 135 | } | ||
| 136 | }, | ||
| 137 | created() { | ||
| 138 | this.initData(); | ||
| 139 | }, | ||
| 140 | } |
src/components/home-bk/header/header.scss
0 → 100644
| 1 | @import '@/styles/_support.scss'; | ||
| 2 | |||
| 3 | $navHei: 92px; | ||
| 4 | $navHeiM: 72px; | ||
| 5 | |||
| 6 | .v-header { | ||
| 7 | height: $navHei; | ||
| 8 | background-color: #fff; | ||
| 9 | color: $cFontGray; | ||
| 10 | position: relative; | ||
| 11 | z-index: 1000; | ||
| 12 | font-size: $fontSize; | ||
| 13 | |||
| 14 | .header-container { | ||
| 15 | max-width: 1200px; | ||
| 16 | height: 100%; | ||
| 17 | margin: auto; | ||
| 18 | display: flex; | ||
| 19 | align-items: center; | ||
| 20 | position: relative; | ||
| 21 | } | ||
| 22 | |||
| 23 | .main-nav { | ||
| 24 | height: 100%; | ||
| 25 | flex: 1 0 auto; | ||
| 26 | } | ||
| 27 | |||
| 28 | .logo-img { | ||
| 29 | margin-right: 43.2px; | ||
| 30 | max-width: 213px; | ||
| 31 | cursor: pointer; | ||
| 32 | } | ||
| 33 | |||
| 34 | .nav-list { | ||
| 35 | height: 100%; | ||
| 36 | display: flex; | ||
| 37 | align-items: center; | ||
| 38 | justify-content: flex-end; | ||
| 39 | position: relative; | ||
| 40 | } | ||
| 41 | |||
| 42 | .nav-item { | ||
| 43 | display: flex; | ||
| 44 | align-items: center; | ||
| 45 | height: 100%; | ||
| 46 | margin: 0; | ||
| 47 | -ms-flex-pack: center; | ||
| 48 | justify-content: center; | ||
| 49 | position: relative; | ||
| 50 | cursor: pointer; | ||
| 51 | } | ||
| 52 | |||
| 53 | .main-nav-list { | ||
| 54 | display: flex; | ||
| 55 | cursor: pointer; | ||
| 56 | } | ||
| 57 | |||
| 58 | .nav-item.link-item { | ||
| 59 | padding: 0 50px; | ||
| 60 | height: 60px; | ||
| 61 | } | ||
| 62 | |||
| 63 | .nav-item.search { | ||
| 64 | flex: 1 1 auto; | ||
| 65 | } | ||
| 66 | |||
| 67 | .nav-item.auth { | ||
| 68 | color: #ffffff; | ||
| 69 | |||
| 70 | .lang { | ||
| 71 | color: $cOrange; | ||
| 72 | min-width: 96px; | ||
| 73 | } | ||
| 74 | } | ||
| 75 | } | ||
| 76 | |||
| 77 | .pc { | ||
| 78 | display: block; | ||
| 79 | } | ||
| 80 | |||
| 81 | // 移动端导航 | ||
| 82 | .mobile { | ||
| 83 | display: none; | ||
| 84 | |||
| 85 | &-nav-list { | ||
| 86 | position: absolute; | ||
| 87 | right: 0; | ||
| 88 | top: 24px; | ||
| 89 | |||
| 90 | display: flex; | ||
| 91 | align-items: center; | ||
| 92 | |||
| 93 | img { | ||
| 94 | width: 20px; | ||
| 95 | margin-left: 20px; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | } | ||
| 100 | |||
| 101 | @media (max-width: 1200px) { | ||
| 102 | .v-header { | ||
| 103 | @include content-percent(1%); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | |||
| 108 | @media (max-width: 1100px) { | ||
| 109 | .v-header { | ||
| 110 | .logo-img { | ||
| 111 | margin-right: 24px; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | |||
| 115 | .pc { | ||
| 116 | |||
| 117 | .auth { | ||
| 118 | margin-right: 20px; | ||
| 119 | } | ||
| 120 | |||
| 121 | .nav-item.auth { | ||
| 122 | |||
| 123 | .lang { | ||
| 124 | min-width: auto; | ||
| 125 | } | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 130 | |||
| 131 | @media (max-width: 980px) { | ||
| 132 | .v-header { | ||
| 133 | |||
| 134 | @include content-percent(); | ||
| 135 | |||
| 136 | .main-nav {} | ||
| 137 | |||
| 138 | .logo-img { | ||
| 139 | max-width: 213px; | ||
| 140 | margin: 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | .pc { | ||
| 144 | display: none; | ||
| 145 | } | ||
| 146 | |||
| 147 | .mobile { | ||
| 148 | display: block; | ||
| 149 | |||
| 150 | &-nav-list { | ||
| 151 | top: 32px; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | } | ||
| 155 | } | ||
| 156 | |||
| 157 | @media (max-width: 768px) { | ||
| 158 | .v-header { | ||
| 159 | |||
| 160 | // 原1200px临界样式 | ||
| 161 | |||
| 162 | .pc { | ||
| 163 | display: none; | ||
| 164 | } | ||
| 165 | |||
| 166 | height: $navHeight-M; | ||
| 167 | |||
| 168 | .logo-img { | ||
| 169 | width: 186px; | ||
| 170 | margin: 0; | ||
| 171 | } | ||
| 172 | |||
| 173 | .mobile { | ||
| 174 | display: block; | ||
| 175 | |||
| 176 | &-nav-list { | ||
| 177 | top: 24px; | ||
| 178 | } | ||
| 179 | } | ||
| 180 | } | ||
| 181 | } |
src/components/home-bk/header/header.vue
0 → 100644
| 1 | |||
| 2 | <template> | ||
| 3 | <header class="v-header"> | ||
| 4 | <div class="header-container"> | ||
| 5 | <img @click="toIndex" src="@/assets/images/home/header-logo.png" alt="中国平安人寿保险" class="logo-img"> | ||
| 6 | |||
| 7 | <div class="main-nav"> | ||
| 8 | <!-- mobile --> | ||
| 9 | <div class="nav-list-m mobile"> | ||
| 10 | <div class="mobile-nav-list"> | ||
| 11 | <img @click="onShowDropdown('login')" v-if="!loginMVisible" src="@/assets/images/home/mobile-user.png" alt=""> | ||
| 12 | <img @click="onShowDropdown('')" v-else src="@/assets/images/home/mobile-user.png" alt=""> | ||
| 13 | <img @click="onShowDropdown('nav')" v-if="!dropdownMVisible" src="@/assets/images/home/mobile-nav.png" alt=""> | ||
| 14 | <img @click="onShowDropdown('')" v-else src="@/assets/images/home/mobile-nav-close.png" alt=""> | ||
| 15 | </div> | ||
| 16 | <m-dropdown class="lang" :type="'nav'" :visible="dropdownMVisible" :show-dropdown-m="onShowDropdown" :lang-list="langData.list" ref="pcMenu"></m-dropdown> | ||
| 17 | <m-dropdown class="lang" :type="'login'" :visible="loginMVisible" :show-dropdown-m="onShowDropdown"></m-dropdown> | ||
| 18 | </div> | ||
| 19 | |||
| 20 | <!-- pc --> | ||
| 21 | <div class="nav-list pc"> | ||
| 22 | <div class="main-nav-list"> | ||
| 23 | <v-dropdown v-for="item in navList" :key="item.id" :data-obj="item" :data-list="item.list"> | ||
| 24 | </v-dropdown> | ||
| 25 | </div> | ||
| 26 | <div class="nav-item search"></div> | ||
| 27 | <div class="nav-item auth"> | ||
| 28 | <v-dropdown class="lang" :type="'login'" :data-obj="loginData" :data-list="loginData.list" ref="mobileMenu"></v-dropdown> | ||
| 29 | <v-dropdown class="lang" :type="'lang'" :data-obj="langData" :data-list="langData.list"></v-dropdown> | ||
| 30 | </div> | ||
| 31 | </div> | ||
| 32 | |||
| 33 | </div> | ||
| 34 | |||
| 35 | </div> | ||
| 36 | </header> | ||
| 37 | </template> | ||
| 38 | |||
| 39 | <script src="./header.js"></script> | ||
| 40 | <style lang="scss" scoped> | ||
| 41 | @import "./header.scss"; | ||
| 42 | </style> |
| 1 | import { | ||
| 2 | mapState | ||
| 3 | } from 'vuex' | ||
| 4 | |||
| 5 | import api from '@/api/api' | ||
| 6 | import { | ||
| 7 | httpPost | ||
| 8 | } from '@/api/fetch-api.js' | ||
| 9 | |||
| 10 | export default { | ||
| 11 | name: "DropDownList", | ||
| 12 | data() { | ||
| 13 | return { | ||
| 14 | navList: [], | ||
| 15 | activeNames: [], | ||
| 16 | activeName: [], | ||
| 17 | activeIndex: -1, | ||
| 18 | borderBoo: false | ||
| 19 | }; | ||
| 20 | }, | ||
| 21 | props: { | ||
| 22 | visible: { | ||
| 23 | type: Boolean, | ||
| 24 | default () { | ||
| 25 | return false; | ||
| 26 | } | ||
| 27 | }, | ||
| 28 | /** | ||
| 29 | * 导航类型 | ||
| 30 | * nav:普通菜单导航 | ||
| 31 | * login:登陆菜单 | ||
| 32 | * lang:三语切换菜单 | ||
| 33 | */ | ||
| 34 | type: { | ||
| 35 | type: String, | ||
| 36 | default () { | ||
| 37 | return "nav"; | ||
| 38 | } | ||
| 39 | }, | ||
| 40 | /** | ||
| 41 | * 传入菜单列表 | ||
| 42 | */ | ||
| 43 | langList: { | ||
| 44 | type: Array, | ||
| 45 | default () { | ||
| 46 | return []; | ||
| 47 | } | ||
| 48 | }, | ||
| 49 | // 显示/隐藏移动端导航 | ||
| 50 | showDropdownM: { | ||
| 51 | type: Function, | ||
| 52 | default: null | ||
| 53 | }, | ||
| 54 | }, | ||
| 55 | computed: { | ||
| 56 | ...mapState({ | ||
| 57 | isSmallScreen: state => state.isSmallScreen, | ||
| 58 | userInfo: state => state.userInfo | ||
| 59 | }), | ||
| 60 | locale() { | ||
| 61 | return this.$i18n.locale || 'tc'; | ||
| 62 | }, | ||
| 63 | i18n() { | ||
| 64 | return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {}; | ||
| 65 | }, | ||
| 66 | }, | ||
| 67 | methods: { | ||
| 68 | // 跳转菜单 | ||
| 69 | onClickHandler(item) { | ||
| 70 | let path = item && item.path || ""; | ||
| 71 | this.showDropdownM(''); | ||
| 72 | if (path) { | ||
| 73 | this.$router.push({ | ||
| 74 | path: path | ||
| 75 | }) | ||
| 76 | } else { | ||
| 77 | let value = item && item.value || null; | ||
| 78 | if (value) { | ||
| 79 | switch (value) { | ||
| 80 | case "login": | ||
| 81 | this.onLoginHandler(); | ||
| 82 | break; | ||
| 83 | case "logout": | ||
| 84 | this.logoutHandler(); | ||
| 85 | break; | ||
| 86 | case "gotoVHIS": | ||
| 87 | // gotoVHIS(this.$i18n.locale); | ||
| 88 | this.$router.push({ | ||
| 89 | path: "/vhis" | ||
| 90 | }); | ||
| 91 | break; | ||
| 92 | } | ||
| 93 | } | ||
| 94 | } | ||
| 95 | }, | ||
| 96 | onLoginHandler() { | ||
| 97 | if (this.$route.name == "login") { | ||
| 98 | return; | ||
| 99 | } else if (this.$route.name == "register" || this.$route.name == "passwordFind") { | ||
| 100 | this.$router.push({ | ||
| 101 | path: "/login" | ||
| 102 | }); | ||
| 103 | } else { | ||
| 104 | let callback = this.$route.fullPath; | ||
| 105 | this.$router.push({ | ||
| 106 | path: "/login?callback=" + callback | ||
| 107 | }); | ||
| 108 | } | ||
| 109 | }, | ||
| 110 | logoutHandler() { | ||
| 111 | this.clearCache(); | ||
| 112 | httpPost({ | ||
| 113 | url: api.logout | ||
| 114 | }).then(() => { | ||
| 115 | this.$store.commit("SET_USER_INFO", null); | ||
| 116 | this.showLogoutTip(); | ||
| 117 | }); | ||
| 118 | }, | ||
| 119 | clearCache() { | ||
| 120 | for (let index = 0; index < sessionStorage.length; index++) { | ||
| 121 | let key = sessionStorage.key(index); | ||
| 122 | sessionStorage.removeItem(key); | ||
| 123 | } | ||
| 124 | }, | ||
| 125 | // 点击item | ||
| 126 | onChangeHandler(evt) { | ||
| 127 | this.activeIndex = evt; | ||
| 128 | }, | ||
| 129 | /** | ||
| 130 | * 设置语言 | ||
| 131 | */ | ||
| 132 | setLangHandler(curData) { | ||
| 133 | this.showDropdownM(''); | ||
| 134 | // 如果是语言设置,则设置语言 | ||
| 135 | let lang = curData.value; | ||
| 136 | this.$i18n.locale = lang; | ||
| 137 | localStorage.setItem("lang", lang); | ||
| 138 | this.sTitle = curData.name; | ||
| 139 | window.location.reload(); | ||
| 140 | }, | ||
| 141 | initData() { | ||
| 142 | let navList = []; | ||
| 143 | if (this.type == "nav") { | ||
| 144 | navList = this.i18n.nav.navList; | ||
| 145 | navList.forEach(element => { | ||
| 146 | this.activeNames.push( | ||
| 147 | [] | ||
| 148 | ) | ||
| 149 | }); | ||
| 150 | } else if (this.type == "login") { | ||
| 151 | // 构建登陆页面 | ||
| 152 | let i18n = this.$i18n.messages[this.$i18n.locale] || {}; | ||
| 153 | let menuData = JSON.parse(JSON.stringify(i18n.nav.loginData)); | ||
| 154 | let list = []; | ||
| 155 | if (this.userInfo && this.userInfo.name) { | ||
| 156 | menuData.name = this.userInfo.name; | ||
| 157 | menuData.list.forEach(element => { | ||
| 158 | if (element.type == "auth") { | ||
| 159 | list.push(element); | ||
| 160 | } | ||
| 161 | }); | ||
| 162 | } else { | ||
| 163 | menuData.list.forEach(element => { | ||
| 164 | if (element.type == "noAuth") { | ||
| 165 | list.push(element); | ||
| 166 | } | ||
| 167 | }); | ||
| 168 | } | ||
| 169 | // menuData.list = list; | ||
| 170 | navList = list; | ||
| 171 | // console.log("navList:", navList); | ||
| 172 | } | ||
| 173 | this.navList = navList; | ||
| 174 | |||
| 175 | } | ||
| 176 | }, | ||
| 177 | created() { | ||
| 178 | this.initData(); | ||
| 179 | }, | ||
| 180 | watch: { | ||
| 181 | visible(newVal, oldVal) { | ||
| 182 | this.$nextTick(() => { | ||
| 183 | this.$refs.panel.scrollTop = 0; | ||
| 184 | }); | ||
| 185 | }, | ||
| 186 | userInfo(val) { | ||
| 187 | this.initData(); | ||
| 188 | } | ||
| 189 | }, | ||
| 190 | }; |
| 1 | @import '@/styles/_support.scss'; | ||
| 2 | |||
| 3 | .panel { | ||
| 4 | z-index: 9999; | ||
| 5 | display: block; | ||
| 6 | left: 0; | ||
| 7 | top: $navHeight-M; | ||
| 8 | position: fixed; | ||
| 9 | width: 100%; | ||
| 10 | height: 100%; | ||
| 11 | // background-color: rgba($color: #000000, $alpha: 0.3); | ||
| 12 | background-color: #ffffff; | ||
| 13 | overflow: scroll; | ||
| 14 | padding-bottom: 200px; | ||
| 15 | |||
| 16 | // 遮罩 | ||
| 17 | .mask { | ||
| 18 | width: 100%; | ||
| 19 | height: 100%; | ||
| 20 | position: fixed; | ||
| 21 | z-index: 5000; | ||
| 22 | left: 0; | ||
| 23 | top: 0; | ||
| 24 | } | ||
| 25 | |||
| 26 | .list { | ||
| 27 | position: relative; | ||
| 28 | z-index: 5001; | ||
| 29 | padding: 0 20px; | ||
| 30 | // background-color: #ffffff; | ||
| 31 | } | ||
| 32 | |||
| 33 | // 国际化 | ||
| 34 | .lang { | ||
| 35 | position: relative; | ||
| 36 | z-index: 5002; | ||
| 37 | display: flex; | ||
| 38 | background-color: #ffffff; | ||
| 39 | padding: 20px 36px; | ||
| 40 | |||
| 41 | &-item { | ||
| 42 | border-right: solid 1px #ebedf0; | ||
| 43 | padding: 0 12px; | ||
| 44 | @extend .fcc; | ||
| 45 | |||
| 46 | |||
| 47 | &:first-child { | ||
| 48 | padding: 0 10px 0 0; | ||
| 49 | } | ||
| 50 | |||
| 51 | &-act { | ||
| 52 | color: $cOrange; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | } | ||
| 57 | |||
| 58 | } | ||
| 59 | |||
| 60 | .coll-item-act { | ||
| 61 | color: $cOrange; | ||
| 62 | } | ||
| 63 | |||
| 64 | .list-item { | ||
| 65 | @extend .bb; | ||
| 66 | display: flex; | ||
| 67 | align-items: center; | ||
| 68 | padding: 16px 16px; | ||
| 69 | position: relative; | ||
| 70 | border-bottom: 1px solid #ebedf0; | ||
| 71 | font-size: 14px; | ||
| 72 | color: $cFontGray; | ||
| 73 | background-color: #fff; | ||
| 74 | |||
| 75 | .txt { | ||
| 76 | flex: 1; | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 | .icon-wrap { | ||
| 81 | @extend .fcc; | ||
| 82 | height: 100%; | ||
| 83 | } | ||
| 84 | |||
| 85 | .plus-icon { | ||
| 86 | width: 21px; | ||
| 87 | height: 21px; | ||
| 88 | background: url("~@/assets/images/home/icon-head-plus.png") no-repeat center; | ||
| 89 | @extend .bis; | ||
| 90 | transform: scale(.6); | ||
| 91 | } | ||
| 92 | |||
| 93 | .arrow-icon { | ||
| 94 | width: 21px; | ||
| 95 | height: 21px; | ||
| 96 | background: url("~@/assets/images/home/icon-head-right-arrow.png") no-repeat center; | ||
| 97 | @extend .bis; | ||
| 98 | transform: scale(.6); | ||
| 99 | } | ||
| 100 | |||
| 101 | .plus-icon-act { | ||
| 102 | background: url("~@/assets/images/home/icon-head-plus-act.png") no-repeat center; | ||
| 103 | } | ||
| 104 | |||
| 105 | |||
| 106 | |||
| 107 | .hide { | ||
| 108 | display: none; | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | .panel::-webkit-scrollbar { | ||
| 113 | display: none; | ||
| 114 | } |
| 1 | <template> | ||
| 2 | <div> | ||
| 3 | <div ref="panel" class="panel" :class="{'hide':!visible}"> | ||
| 4 | <div class="mask" @click="showDropdownM('')"></div> | ||
| 5 | <!-- 列表 --> | ||
| 6 | <div class="list"> | ||
| 7 | <div v-for="(item,index) in navList" :key="item.id" :index="index"> | ||
| 8 | <van-collapse @change="onChangeHandler" v-model="activeNames[index]" v-if="item && item.list && item.list.length > 0"> | ||
| 9 | <van-collapse-item :border="borderBoo" :title="item.name" :name="index"> | ||
| 10 | <div slot="title"> | ||
| 11 | <span :class="{'coll-item-act':index == activeIndex}">{{item.name}}</span> | ||
| 12 | </div> | ||
| 13 | <div slot="right-icon"> | ||
| 14 | <div class="icon-wrap"> | ||
| 15 | <div class="plus-icon" :class="{'plus-icon-act':index == activeIndex}"></div> | ||
| 16 | </div> | ||
| 17 | </div> | ||
| 18 | <div @click="onClickHandler(item2)" class="list-item" v-for="item2 in item.list" :key="item2.id"> | ||
| 19 | <div class="arrow-icon"></div> | ||
| 20 | <div class="txt">{{ item2.name }}</div> | ||
| 21 | </div> | ||
| 22 | </van-collapse-item> | ||
| 23 | </van-collapse> | ||
| 24 | <div v-else @click="onClickHandler(item)" class="list-item"> | ||
| 25 | {{item.name}} | ||
| 26 | </div> | ||
| 27 | </div> | ||
| 28 | </div> | ||
| 29 | <!-- 语言 --> | ||
| 30 | <div v-if="langList && langList.length > 0" class="lang"> | ||
| 31 | <div @click="setLangHandler(item)" class="lang-item pointer" :class="{'lang-item-act':locale==item.value}" v-for="item in langList" :key="item.id"> | ||
| 32 | {{ item.name }} | ||
| 33 | </div> | ||
| 34 | </div> | ||
| 35 | </div> | ||
| 36 | </div> | ||
| 37 | </template> | ||
| 38 | |||
| 39 | <script src="./m-dropdown.js"></script> | ||
| 40 | <style lang="scss" scoped> | ||
| 41 | @import "./m-dropdown.scss"; | ||
| 42 | </style> |
| 1 | /** | ||
| 2 | * 组件描述:PC顶栏导航下拉菜单 | ||
| 3 | */ | ||
| 4 | import api from '@/api/api' | ||
| 5 | import { | ||
| 6 | httpPost | ||
| 7 | } from '@/api/fetch-api.js' | ||
| 8 | |||
| 9 | export default { | ||
| 10 | name: "DropDownList", | ||
| 11 | data() { | ||
| 12 | return { | ||
| 13 | activeIndex: 0, | ||
| 14 | sTitle: this.dataObj && this.dataObj.name || '', | ||
| 15 | reloadBlackList: [], | ||
| 16 | listVisible: false, | ||
| 17 | }; | ||
| 18 | }, | ||
| 19 | props: { | ||
| 20 | /** | ||
| 21 | * 导航类型 | ||
| 22 | * nav:普通菜单导航 | ||
| 23 | * login:登陆菜单 | ||
| 24 | * lang:三语切换菜单 | ||
| 25 | */ | ||
| 26 | type: { | ||
| 27 | type: String, | ||
| 28 | default () { | ||
| 29 | return "nav"; | ||
| 30 | } | ||
| 31 | }, | ||
| 32 | /** | ||
| 33 | * 传入菜单完整数据 | ||
| 34 | */ | ||
| 35 | dataObj: { | ||
| 36 | type: Object, | ||
| 37 | default () { | ||
| 38 | return {}; | ||
| 39 | } | ||
| 40 | }, | ||
| 41 | /** | ||
| 42 | * 传入菜单列表 | ||
| 43 | */ | ||
| 44 | dataList: { | ||
| 45 | type: Array, | ||
| 46 | default () { | ||
| 47 | return []; | ||
| 48 | } | ||
| 49 | }, | ||
| 50 | labelProperty: { | ||
| 51 | type: String, | ||
| 52 | default () { | ||
| 53 | return "name"; | ||
| 54 | } | ||
| 55 | } | ||
| 56 | }, | ||
| 57 | directives: { | ||
| 58 | dpl: { | ||
| 59 | bind(el) { | ||
| 60 | el.style.display = "none"; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | }, | ||
| 64 | methods: { | ||
| 65 | onNavHandler() { | ||
| 66 | console.log("this.dataObj:", this.dataObj); | ||
| 67 | let path = this.dataObj && this.dataObj.path || ""; | ||
| 68 | if (path) { | ||
| 69 | this.$router.push({ | ||
| 70 | path: path | ||
| 71 | }) | ||
| 72 | } | ||
| 73 | }, | ||
| 74 | onOverHandler(event) { | ||
| 75 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 76 | ul.style.display = "block"; | ||
| 77 | this.listVisible = true; | ||
| 78 | }, | ||
| 79 | onOutHandler(event) { | ||
| 80 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 81 | ul.style.display = "none"; | ||
| 82 | this.listVisible = false; | ||
| 83 | }, | ||
| 84 | onClickHandler(event, index) { | ||
| 85 | // 隐藏其他 | ||
| 86 | if (this.$refs.ul) { | ||
| 87 | this.$refs.ul.style.display = "none"; | ||
| 88 | } | ||
| 89 | |||
| 90 | // 选择item | ||
| 91 | this.activeIndex = index; | ||
| 92 | let curData = this.dataList[index]; | ||
| 93 | if (this.type == "lang") { | ||
| 94 | // 如果是语言设置,则设置语言 | ||
| 95 | let lang = curData.value; | ||
| 96 | if (lang != localStorage.getItem('lang')) { | ||
| 97 | localStorage.setItem("lang", lang); | ||
| 98 | if (this.reloadBlackList.indexOf(this.$route.path) >= 0) { | ||
| 99 | window.location.reload(); | ||
| 100 | } else { | ||
| 101 | this.$i18n.locale = lang; | ||
| 102 | this.sTitle = curData.name; | ||
| 103 | this.$root.eventBus.$emit("langChange"); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | } else { | ||
| 107 | let item = curData; | ||
| 108 | let path = item && item.path || ""; | ||
| 109 | this.$root.eventBus.$emit(item.path); | ||
| 110 | if (path) { | ||
| 111 | // console.log("path:", path); | ||
| 112 | // modify | ||
| 113 | if (path == "/custom/service?q=m5") { | ||
| 114 | path = "/clarms" | ||
| 115 | } | ||
| 116 | this.$router.push({ | ||
| 117 | path: path | ||
| 118 | }) | ||
| 119 | } else { | ||
| 120 | let value = item && item.value || null; | ||
| 121 | if (value) { | ||
| 122 | switch (value) { | ||
| 123 | case "login": | ||
| 124 | this.onLoginHandler(); | ||
| 125 | break; | ||
| 126 | case "logout": | ||
| 127 | this.logoutHandler(); | ||
| 128 | break; | ||
| 129 | case "gotoVHIS": | ||
| 130 | // gotoVHIS(this.$i18n.locale); | ||
| 131 | this.$router.push({ | ||
| 132 | path: "/vhis" | ||
| 133 | }); | ||
| 134 | break; | ||
| 135 | } | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | ||
| 139 | }, | ||
| 140 | onLoginHandler() { | ||
| 141 | this.$root.eventBus.$emit("login"); | ||
| 142 | if (this.$route.name == "login") { | ||
| 143 | return; | ||
| 144 | } else if (this.$route.name == "register" || this.$route.name == "passwordFind") { | ||
| 145 | this.$router.push({ | ||
| 146 | path: "/login" | ||
| 147 | }); | ||
| 148 | } else { | ||
| 149 | let callback = this.$route.fullPath; | ||
| 150 | this.$router.push({ | ||
| 151 | path: "/login?callback=" + callback | ||
| 152 | }); | ||
| 153 | } | ||
| 154 | }, | ||
| 155 | logoutHandler() { | ||
| 156 | this.clearCache(); | ||
| 157 | httpPost({ | ||
| 158 | url: api.logout | ||
| 159 | }).then(() => { | ||
| 160 | this.$store.commit("SET_USER_INFO", null); | ||
| 161 | this.showLogoutTip(); | ||
| 162 | }); | ||
| 163 | }, | ||
| 164 | clearCache() { | ||
| 165 | for (let index = 0; index < sessionStorage.length; index++) { | ||
| 166 | let key = sessionStorage.key(index); | ||
| 167 | console.log(key); | ||
| 168 | sessionStorage.removeItem(key); | ||
| 169 | } | ||
| 170 | }, | ||
| 171 | showLogoutTip() { | ||
| 172 | // 登出后的提示 | ||
| 173 | // alert("登出成功"); | ||
| 174 | }, | ||
| 175 | updateTitle(name) { | ||
| 176 | this.sTitle = name || this.sTitle; | ||
| 177 | } | ||
| 178 | }, | ||
| 179 | computed: { | ||
| 180 | dplLable() { | ||
| 181 | return this.dataList[this.activeIndex][this.labelProperty]; | ||
| 182 | }, | ||
| 183 | locale() { | ||
| 184 | return this.$i18n.locale || "tc"; | ||
| 185 | }, | ||
| 186 | }, | ||
| 187 | created() {}, | ||
| 188 | }; |
| 1 | @import "@/styles/_support.scss"; | ||
| 2 | |||
| 3 | .drop-list { | ||
| 4 | display: inline-block; | ||
| 5 | position: relative; | ||
| 6 | margin: 0 0px; | ||
| 7 | font-size: $fontSizeTitle; | ||
| 8 | |||
| 9 | .list { | ||
| 10 | position: absolute; | ||
| 11 | width: 34px; | ||
| 12 | left: 0; | ||
| 13 | right: 0; | ||
| 14 | margin: 0 auto; | ||
| 15 | font-size: 16px; | ||
| 16 | left: 50%; | ||
| 17 | transform: translateX(-50%); //居中处理 | ||
| 18 | |||
| 19 | .space { | ||
| 20 | height: 18px; | ||
| 21 | } | ||
| 22 | |||
| 23 | .triangle-up { | ||
| 24 | opacity: 0; | ||
| 25 | margin: 2px auto 0; | ||
| 26 | width: 0; | ||
| 27 | height: 0; | ||
| 28 | border-left: 8px solid transparent; | ||
| 29 | border-right: 8px solid transparent; | ||
| 30 | border-bottom: 9px solid #f1f2f2; | ||
| 31 | } | ||
| 32 | .opacity1{ | ||
| 33 | opacity: 1; | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | span { | ||
| 38 | display: block; | ||
| 39 | text-align: center; | ||
| 40 | } | ||
| 41 | |||
| 42 | span:hover { | ||
| 43 | } | ||
| 44 | |||
| 45 | ul { | ||
| 46 | display: none; | ||
| 47 | overflow: hidden; | ||
| 48 | border-radius: 5px; | ||
| 49 | background-color: #f1f2f2; | ||
| 50 | |||
| 51 | li { | ||
| 52 | @extend .fcc; | ||
| 53 | text-align: center; | ||
| 54 | position: relative; | ||
| 55 | height: 28px; | ||
| 56 | color: $cFontGray2; | ||
| 57 | |||
| 58 | &:after { | ||
| 59 | content: ""; | ||
| 60 | width: 28px; | ||
| 61 | height: 1px; | ||
| 62 | background-color: #c5c5c5; | ||
| 63 | position: absolute; | ||
| 64 | bottom: 0; | ||
| 65 | left: 50%; | ||
| 66 | transform: translateX(-50%); //居中处理 | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | li:last-child { | ||
| 71 | border-bottom: none; | ||
| 72 | |||
| 73 | &:after { | ||
| 74 | background: transparent; | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | li:hover { | ||
| 79 | color: $cOrange2; | ||
| 80 | } | ||
| 81 | |||
| 82 | .act { | ||
| 83 | color: $cOrange2; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | } | ||
| 87 | // .drop-list:lang(en){ | ||
| 88 | // min-width: 0; | ||
| 89 | // margin: 0 13px; | ||
| 90 | // } | ||
| 91 | |||
| 92 | @media (max-width: 1100px) { | ||
| 93 | } | ||
| 94 | |||
| 95 | @media (max-width: 1000px) { | ||
| 96 | } |
| 1 | <template> | ||
| 2 | <div class="drop-list drop-list-lang" @mouseover="onOverHandler($event)" @mouseout="onOutHandler($event)"> | ||
| 3 | <!-- 登陆下拉样式 --> | ||
| 4 | <span @click="onNavHandler()"> | ||
| 5 | 中 | EN | ||
| 6 | </span> | ||
| 7 | <div class="list"> | ||
| 8 | |||
| 9 | <!-- <div class="space"></div> --> | ||
| 10 | <div class="triangle-up" :class="{'opacity1':listVisible}"></div> | ||
| 11 | <ul ref="ul"> | ||
| 12 | <li :class="{'act':item.value == locale}" v-for="(item, index) in dataList" :key="index" @mousedown="onClickHandler($event,index)">{{item[labelProperty]}}</li> | ||
| 13 | </ul> | ||
| 14 | |||
| 15 | </div> | ||
| 16 | </div> | ||
| 17 | </template> | ||
| 18 | |||
| 19 | <script src="./dropdown-lang.js"></script> | ||
| 20 | <style lang="scss" scoped> | ||
| 21 | @import "./dropdown-lang.scss"; | ||
| 22 | </style> |
| 1 | /** | ||
| 2 | * 组件描述:PC顶栏导航下拉菜单 | ||
| 3 | */ | ||
| 4 | import api from '@/api/api' | ||
| 5 | import { | ||
| 6 | httpPost | ||
| 7 | } from '@/api/fetch-api.js' | ||
| 8 | |||
| 9 | export default { | ||
| 10 | name: "DropDownList", | ||
| 11 | data() { | ||
| 12 | return { | ||
| 13 | activeIndex: 0, | ||
| 14 | sTitle: this.dataObj && this.dataObj.name || '', | ||
| 15 | reloadBlackList: [] | ||
| 16 | }; | ||
| 17 | }, | ||
| 18 | props: { | ||
| 19 | /** | ||
| 20 | * 导航类型 | ||
| 21 | * nav:普通菜单导航 | ||
| 22 | * login:登陆菜单 | ||
| 23 | * lang:三语切换菜单 | ||
| 24 | */ | ||
| 25 | type: { | ||
| 26 | type: String, | ||
| 27 | default () { | ||
| 28 | return "nav"; | ||
| 29 | } | ||
| 30 | }, | ||
| 31 | /** | ||
| 32 | * 传入菜单完整数据 | ||
| 33 | */ | ||
| 34 | dataObj: { | ||
| 35 | type: Object, | ||
| 36 | default () { | ||
| 37 | return {}; | ||
| 38 | } | ||
| 39 | }, | ||
| 40 | /** | ||
| 41 | * 传入菜单列表 | ||
| 42 | */ | ||
| 43 | dataList: { | ||
| 44 | type: Array, | ||
| 45 | default () { | ||
| 46 | return []; | ||
| 47 | } | ||
| 48 | }, | ||
| 49 | labelProperty: { | ||
| 50 | type: String, | ||
| 51 | default () { | ||
| 52 | return "name"; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | }, | ||
| 56 | directives: { | ||
| 57 | dpl: { | ||
| 58 | bind(el) { | ||
| 59 | el.style.display = "none"; | ||
| 60 | } | ||
| 61 | } | ||
| 62 | }, | ||
| 63 | methods: { | ||
| 64 | onNavHandler() { | ||
| 65 | console.log("this.dataObj:", this.dataObj); | ||
| 66 | let path = this.dataObj && this.dataObj.path || ""; | ||
| 67 | if (path) { | ||
| 68 | this.$router.push({ | ||
| 69 | path: path | ||
| 70 | }) | ||
| 71 | } | ||
| 72 | }, | ||
| 73 | onOverHandler(event) { | ||
| 74 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 75 | ul.style.display = "block"; | ||
| 76 | }, | ||
| 77 | onOutHandler(event) { | ||
| 78 | // console.log(event); | ||
| 79 | let ul = event.currentTarget.childNodes[1].childNodes[1]; | ||
| 80 | ul.style.display = "none"; | ||
| 81 | }, | ||
| 82 | onClickHandler(event, index) { | ||
| 83 | // 隐藏其他 | ||
| 84 | if (this.$refs.ul) { | ||
| 85 | this.$refs.ul.style.display = "none"; | ||
| 86 | } | ||
| 87 | |||
| 88 | // 选择item | ||
| 89 | this.activeIndex = index; | ||
| 90 | let curData = this.dataList[index]; | ||
| 91 | if (this.type == "lang") { | ||
| 92 | // 如果是语言设置,则设置语言 | ||
| 93 | let lang = curData.value; | ||
| 94 | if (lang != localStorage.getItem('lang')) { | ||
| 95 | localStorage.setItem("lang", lang); | ||
| 96 | if (this.reloadBlackList.indexOf(this.$route.path) >= 0) { | ||
| 97 | window.location.reload(); | ||
| 98 | } else { | ||
| 99 | this.$i18n.locale = lang; | ||
| 100 | this.sTitle = curData.name; | ||
| 101 | this.$root.eventBus.$emit("langChange"); | ||
| 102 | } | ||
| 103 | } | ||
| 104 | } else { | ||
| 105 | let item = curData; | ||
| 106 | let path = item && item.path || ""; | ||
| 107 | this.$root.eventBus.$emit(item.path); | ||
| 108 | if (path) { | ||
| 109 | // console.log("path:", path); | ||
| 110 | // modify | ||
| 111 | if (path == "/custom/service?q=m5") { | ||
| 112 | path = "/clarms" | ||
| 113 | } | ||
| 114 | this.$router.push({ | ||
| 115 | path: path | ||
| 116 | }) | ||
| 117 | } else { | ||
| 118 | let value = item && item.value || null; | ||
| 119 | if (value) { | ||
| 120 | switch (value) { | ||
| 121 | case "login": | ||
| 122 | this.onLoginHandler(); | ||
| 123 | break; | ||
| 124 | case "logout": | ||
| 125 | this.logoutHandler(); | ||
| 126 | break; | ||
| 127 | case "gotoVHIS": | ||
| 128 | // gotoVHIS(this.$i18n.locale); | ||
| 129 | this.$router.push({ | ||
| 130 | path: "/vhis" | ||
| 131 | }); | ||
| 132 | break; | ||
| 133 | } | ||
| 134 | } | ||
| 135 | } | ||
| 136 | } | ||
| 137 | }, | ||
| 138 | onLoginHandler() { | ||
| 139 | this.$root.eventBus.$emit("login"); | ||
| 140 | if (this.$route.name == "login") { | ||
| 141 | return; | ||
| 142 | } else if (this.$route.name == "register" || this.$route.name == "passwordFind") { | ||
| 143 | this.$router.push({ | ||
| 144 | path: "/login" | ||
| 145 | }); | ||
| 146 | } else { | ||
| 147 | let callback = this.$route.fullPath; | ||
| 148 | this.$router.push({ | ||
| 149 | path: "/login?callback=" + callback | ||
| 150 | }); | ||
| 151 | } | ||
| 152 | }, | ||
| 153 | logoutHandler() { | ||
| 154 | this.clearCache(); | ||
| 155 | httpPost({ | ||
| 156 | url: api.logout | ||
| 157 | }).then(() => { | ||
| 158 | this.$store.commit("SET_USER_INFO", null); | ||
| 159 | this.showLogoutTip(); | ||
| 160 | }); | ||
| 161 | }, | ||
| 162 | clearCache() { | ||
| 163 | for (let index = 0; index < sessionStorage.length; index++) { | ||
| 164 | let key = sessionStorage.key(index); | ||
| 165 | console.log(key); | ||
| 166 | sessionStorage.removeItem(key); | ||
| 167 | } | ||
| 168 | }, | ||
| 169 | showLogoutTip() { | ||
| 170 | // 登出后的提示 | ||
| 171 | // alert("登出成功"); | ||
| 172 | }, | ||
| 173 | updateTitle(name) { | ||
| 174 | this.sTitle = name || this.sTitle; | ||
| 175 | } | ||
| 176 | }, | ||
| 177 | computed: { | ||
| 178 | dplLable() { | ||
| 179 | return this.dataList[this.activeIndex][this.labelProperty]; | ||
| 180 | } | ||
| 181 | }, | ||
| 182 | created() {}, | ||
| 183 | }; |
| 1 | @import "@/styles/_support.scss"; | ||
| 2 | |||
| 3 | .drop-list { | ||
| 4 | position: relative; | ||
| 5 | cursor: pointer; | ||
| 6 | |||
| 7 | .list { | ||
| 8 | position: absolute; | ||
| 9 | width: 132px; | ||
| 10 | left: 0; | ||
| 11 | right: 0; | ||
| 12 | margin: 0 auto; | ||
| 13 | font-size: $fontSize; | ||
| 14 | left: 50%; | ||
| 15 | transform: translateX(-50%); //居中处理 | ||
| 16 | |||
| 17 | .space { | ||
| 18 | height: 18px; | ||
| 19 | } | ||
| 20 | |||
| 21 | } | ||
| 22 | |||
| 23 | span { | ||
| 24 | display: block; | ||
| 25 | text-align: center; | ||
| 26 | } | ||
| 27 | |||
| 28 | span:hover { | ||
| 29 | } | ||
| 30 | |||
| 31 | ul { | ||
| 32 | display: none; | ||
| 33 | overflow: hidden; | ||
| 34 | box-shadow: 0 0 18px 0 rgba(255, 87, 0, 0.15); | ||
| 35 | border-radius: 6px; | ||
| 36 | |||
| 37 | li { | ||
| 38 | // border-bottom: solid 1px #f1f1f1; | ||
| 39 | background: #ffffff; | ||
| 40 | text-align: center; | ||
| 41 | padding: 18px 0; | ||
| 42 | position: relative; | ||
| 43 | |||
| 44 | &:after { | ||
| 45 | content: ""; | ||
| 46 | width: 84px; | ||
| 47 | height: 1px; | ||
| 48 | background: #f1f1f1; | ||
| 49 | position: absolute; | ||
| 50 | bottom: 0; | ||
| 51 | left: 50%; | ||
| 52 | transform: translateX(-50%); //居中处理 | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | li:last-child { | ||
| 57 | border-bottom: none; | ||
| 58 | |||
| 59 | &:after { | ||
| 60 | background: transparent; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | li:hover { | ||
| 65 | color: $cOrange; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
| 69 | .drop-list:lang(en) { | ||
| 70 | min-width: 0; | ||
| 71 | margin: 0 13px; | ||
| 72 | } | ||
| 73 | |||
| 74 | .user { | ||
| 75 | @include border-tans-rev; | ||
| 76 | @extend .fcc; | ||
| 77 | cursor: pointer; | ||
| 78 | width: 70px; | ||
| 79 | height: 45px; | ||
| 80 | border-radius: 22.5px; | ||
| 81 | |||
| 82 | span { | ||
| 83 | max-width: 51px; | ||
| 84 | overflow: hidden; | ||
| 85 | white-space: nowrap; | ||
| 86 | text-overflow: ellipsis; | ||
| 87 | } | ||
| 88 | |||
| 89 | .icon-img { | ||
| 90 | margin: 0 6px; | ||
| 91 | } | ||
| 92 | } | ||
| 93 | |||
| 94 | // 登陆 | ||
| 95 | .login { | ||
| 96 | } | ||
| 97 | |||
| 98 | @media (max-width: 1100px) { | ||
| 99 | // .drop-list { | ||
| 100 | // margin: 0 28px; | ||
| 101 | // min-width: 0; | ||
| 102 | // } | ||
| 103 | // .drop-list:lang(en) { | ||
| 104 | // margin: 0 22px; | ||
| 105 | // } | ||
| 106 | } | ||
| 107 | |||
| 108 | @media (max-width: 1000px) { | ||
| 109 | } |
| 1 | <template> | ||
| 2 | <div class="drop-list" :class="{'login':type=='login'}" @mouseover="onOverHandler($event)" @mouseout="onOutHandler($event)"> | ||
| 3 | <div class="user" @click="onLoginHandler()"> | ||
| 4 | <!-- <img class="icon-img" src="@/assets/images/home/icon-user.png"> --> | ||
| 5 | <span>{{dataObj.name}}</span> | ||
| 6 | </div> | ||
| 7 | <div class="list"> | ||
| 8 | <div class="space"></div> | ||
| 9 | <ul ref="ul" > | ||
| 10 | <li v-for="(item, index) in dataList" :key="index" @mousedown="onClickHandler($event,index)">{{item[labelProperty]}}</li> | ||
| 11 | </ul> | ||
| 12 | </div> | ||
| 13 | </div> | ||
| 14 | </template> | ||
| 15 | |||
| 16 | <script src="./dropdown-login.js"></script> | ||
| 17 | <style lang="scss" scoped> | ||
| 18 | @import "./dropdown-login.scss"; | ||
| 19 | </style> |
| ... | @@ -2,10 +2,11 @@ | ... | @@ -2,10 +2,11 @@ |
| 2 | 2 | ||
| 3 | .drop-list { | 3 | .drop-list { |
| 4 | display: inline-block; | 4 | display: inline-block; |
| 5 | min-width: 120px; | 5 | min-width: 92px; |
| 6 | position: relative; | 6 | position: relative; |
| 7 | margin: 0 13.2px; | 7 | margin: 0 0px; |
| 8 | font-size: $fontSizeTitle; | 8 | font-size: $fontSizeTitle; |
| 9 | // background-color: wheat; | ||
| 9 | 10 | ||
| 10 | .list { | 11 | .list { |
| 11 | position: absolute; | 12 | position: absolute; |
| ... | @@ -70,7 +71,7 @@ | ... | @@ -70,7 +71,7 @@ |
| 70 | } | 71 | } |
| 71 | .drop-list:lang(en){ | 72 | .drop-list:lang(en){ |
| 72 | min-width: 0; | 73 | min-width: 0; |
| 73 | margin: 0 32px; | 74 | margin: 0 13px; |
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | .user { | 77 | .user { |
| ... | @@ -101,13 +102,13 @@ | ... | @@ -101,13 +102,13 @@ |
| 101 | 102 | ||
| 102 | 103 | ||
| 103 | @media (max-width: 1100px) { | 104 | @media (max-width: 1100px) { |
| 104 | .drop-list { | 105 | // .drop-list { |
| 105 | margin: 0 28px; | 106 | // margin: 0 28px; |
| 106 | min-width: 0; | 107 | // min-width: 0; |
| 107 | } | 108 | // } |
| 108 | .drop-list:lang(en) { | 109 | // .drop-list:lang(en) { |
| 109 | margin: 0 22px; | 110 | // margin: 0 22px; |
| 110 | } | 111 | // } |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | 114 | ... | ... |
| ... | @@ -15,7 +15,7 @@ | ... | @@ -15,7 +15,7 @@ |
| 15 | </template> | 15 | </template> |
| 16 | <div class="list"> | 16 | <div class="list"> |
| 17 | <div class="space"></div> | 17 | <div class="space"></div> |
| 18 | <ul ref="ul" v-dpl> | 18 | <ul ref="ul" > |
| 19 | <li v-for="(item, index) in dataList" :key="index" @mousedown="onClickHandler($event,index)">{{item[labelProperty]}}</li> | 19 | <li v-for="(item, index) in dataList" :key="index" @mousedown="onClickHandler($event,index)">{{item[labelProperty]}}</li> |
| 20 | </ul> | 20 | </ul> |
| 21 | </div> | 21 | </div> | ... | ... |
| ... | @@ -13,11 +13,17 @@ import { | ... | @@ -13,11 +13,17 @@ import { |
| 13 | import VDropdown from '@components/home/dropdown/dropdown.vue' | 13 | import VDropdown from '@components/home/dropdown/dropdown.vue' |
| 14 | import MDropdown from '@components/home/m-dropdown/m-dropdown.vue' | 14 | import MDropdown from '@components/home/m-dropdown/m-dropdown.vue' |
| 15 | 15 | ||
| 16 | // 语言下拉菜单 | ||
| 17 | import DropdownLang from '@components/home/dropdown-lang/dropdown-lang.vue' | ||
| 18 | import DropdownLogin from '@components/home/dropdown-login/dropdown-login.vue' | ||
| 19 | |||
| 16 | export default { | 20 | export default { |
| 17 | name: 'VHeader', | 21 | name: 'VHeader', |
| 18 | components: { | 22 | components: { |
| 19 | VDropdown, | 23 | VDropdown, |
| 20 | MDropdown | 24 | MDropdown, |
| 25 | DropdownLang, | ||
| 26 | DropdownLogin, | ||
| 21 | }, | 27 | }, |
| 22 | computed: { | 28 | computed: { |
| 23 | i18n() { | 29 | i18n() { | ... | ... |
| 1 | @import '@/styles/_support.scss'; | 1 | @import "@/styles/_support.scss"; |
| 2 | 2 | ||
| 3 | $navHei: 92px; | 3 | $navHei: 92px; |
| 4 | $navHeiM: 72px; | 4 | $navHeiM: 72px; |
| ... | @@ -26,7 +26,8 @@ $navHeiM: 72px; | ... | @@ -26,7 +26,8 @@ $navHeiM: 72px; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | .logo-img { | 28 | .logo-img { |
| 29 | margin-right: 43.2px; | 29 | // margin-right: 43.2px; |
| 30 | margin-right: 0; | ||
| 30 | max-width: 213px; | 31 | max-width: 213px; |
| 31 | cursor: pointer; | 32 | cursor: pointer; |
| 32 | } | 33 | } |
| ... | @@ -51,7 +52,8 @@ $navHeiM: 72px; | ... | @@ -51,7 +52,8 @@ $navHeiM: 72px; |
| 51 | } | 52 | } |
| 52 | 53 | ||
| 53 | .main-nav-list { | 54 | .main-nav-list { |
| 54 | display: flex; | 55 | // display: flex; |
| 56 | @extend .fcc; | ||
| 55 | cursor: pointer; | 57 | cursor: pointer; |
| 56 | } | 58 | } |
| 57 | 59 | ||
| ... | @@ -74,8 +76,67 @@ $navHeiM: 72px; | ... | @@ -74,8 +76,67 @@ $navHeiM: 72px; |
| 74 | } | 76 | } |
| 75 | } | 77 | } |
| 76 | 78 | ||
| 79 | // PC端导航 | ||
| 77 | .pc { | 80 | .pc { |
| 78 | display: block; | 81 | display: block; |
| 82 | display: flex; | ||
| 83 | |||
| 84 | justify-content: space-between; | ||
| 85 | |||
| 86 | .main-nav-list { | ||
| 87 | flex: 1; | ||
| 88 | } | ||
| 89 | |||
| 90 | .main-func { | ||
| 91 | display: flex; | ||
| 92 | align-items: center; | ||
| 93 | font-size: $fontSizeSmall-M2; | ||
| 94 | |||
| 95 | // 电话 | ||
| 96 | &-tel { | ||
| 97 | display: flex; | ||
| 98 | align-items: center; | ||
| 99 | font-size: $fontSize-M2; | ||
| 100 | font-weight: normal; | ||
| 101 | color: $cOrange2; | ||
| 102 | |||
| 103 | img { | ||
| 104 | margin-right: 2px; | ||
| 105 | margin-top: 4px; | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 109 | // 语言切换 | ||
| 110 | &-lang { | ||
| 111 | cursor: pointer; | ||
| 112 | color: $cOrange2; | ||
| 113 | margin-left: 24px; | ||
| 114 | } | ||
| 115 | |||
| 116 | // 登入 | ||
| 117 | &-login { | ||
| 118 | // cursor: pointer; | ||
| 119 | // @include border-tans; | ||
| 120 | // @extend .fcc; | ||
| 121 | // width: 69px; | ||
| 122 | // height: 45px; | ||
| 123 | // border-radius: 22.5px; | ||
| 124 | margin-left: 16px; | ||
| 125 | } | ||
| 126 | |||
| 127 | // 报价 | ||
| 128 | &-quote { | ||
| 129 | cursor: pointer; | ||
| 130 | @include linear-bg-top; | ||
| 131 | @extend .fcc; | ||
| 132 | width: 94px; | ||
| 133 | height: 45px; | ||
| 134 | border-radius: 22.5px; | ||
| 135 | margin-left: 16px; | ||
| 136 | font-weight: bold; | ||
| 137 | color: #ffffff; | ||
| 138 | } | ||
| 139 | } | ||
| 79 | } | 140 | } |
| 80 | 141 | ||
| 81 | // 移动端导航 | 142 | // 移动端导航 |
| ... | @@ -95,7 +156,6 @@ $navHeiM: 72px; | ... | @@ -95,7 +156,6 @@ $navHeiM: 72px; |
| 95 | margin-left: 20px; | 156 | margin-left: 20px; |
| 96 | } | 157 | } |
| 97 | } | 158 | } |
| 98 | |||
| 99 | } | 159 | } |
| 100 | 160 | ||
| 101 | @media (max-width: 1200px) { | 161 | @media (max-width: 1200px) { |
| ... | @@ -104,42 +164,37 @@ $navHeiM: 72px; | ... | @@ -104,42 +164,37 @@ $navHeiM: 72px; |
| 104 | } | 164 | } |
| 105 | } | 165 | } |
| 106 | 166 | ||
| 107 | |||
| 108 | @media (max-width: 1100px) { | 167 | @media (max-width: 1100px) { |
| 109 | .v-header { | 168 | // .v-header { |
| 110 | .logo-img { | 169 | // .logo-img { |
| 111 | margin-right: 24px; | 170 | // } |
| 112 | } | 171 | // } |
| 113 | } | 172 | |
| 114 | 173 | // .pc { | |
| 115 | .pc { | 174 | // .auth { |
| 116 | 175 | // margin-right: 20px; | |
| 117 | .auth { | 176 | // } |
| 118 | margin-right: 20px; | 177 | |
| 119 | } | 178 | // .nav-item.auth { |
| 120 | 179 | // .lang { | |
| 121 | .nav-item.auth { | 180 | // min-width: auto; |
| 122 | 181 | // } | |
| 123 | .lang { | 182 | // } |
| 124 | min-width: auto; | 183 | // } |
| 125 | } | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | 184 | } |
| 129 | 185 | ||
| 130 | 186 | @media (max-width: 1020px) { | |
| 131 | @media (max-width: 980px) { | ||
| 132 | .v-header { | 187 | .v-header { |
| 133 | |||
| 134 | @include content-percent(); | 188 | @include content-percent(); |
| 135 | 189 | ||
| 136 | .main-nav {} | 190 | .main-nav { |
| 137 | |||
| 138 | .logo-img { | ||
| 139 | max-width: 213px; | ||
| 140 | margin: 0; | ||
| 141 | } | 191 | } |
| 142 | 192 | ||
| 193 | // .logo-img { | ||
| 194 | // max-width: 213px; | ||
| 195 | // margin: 0; | ||
| 196 | // } | ||
| 197 | |||
| 143 | .pc { | 198 | .pc { |
| 144 | display: none; | 199 | display: none; |
| 145 | } | 200 | } |
| ... | @@ -156,7 +211,6 @@ $navHeiM: 72px; | ... | @@ -156,7 +211,6 @@ $navHeiM: 72px; |
| 156 | 211 | ||
| 157 | @media (max-width: 768px) { | 212 | @media (max-width: 768px) { |
| 158 | .v-header { | 213 | .v-header { |
| 159 | |||
| 160 | // 原1200px临界样式 | 214 | // 原1200px临界样式 |
| 161 | 215 | ||
| 162 | .pc { | 216 | .pc { | ... | ... |
| ... | @@ -2,6 +2,7 @@ | ... | @@ -2,6 +2,7 @@ |
| 2 | <template> | 2 | <template> |
| 3 | <header class="v-header"> | 3 | <header class="v-header"> |
| 4 | <div class="header-container"> | 4 | <div class="header-container"> |
| 5 | <!-- logo --> | ||
| 5 | <img @click="toIndex" src="@/assets/images/home/header-logo.png" alt="中国平安人寿保险" class="logo-img"> | 6 | <img @click="toIndex" src="@/assets/images/home/header-logo.png" alt="中国平安人寿保险" class="logo-img"> |
| 6 | 7 | ||
| 7 | <div class="main-nav"> | 8 | <div class="main-nav"> |
| ... | @@ -19,15 +20,41 @@ | ... | @@ -19,15 +20,41 @@ |
| 19 | 20 | ||
| 20 | <!-- pc --> | 21 | <!-- pc --> |
| 21 | <div class="nav-list pc"> | 22 | <div class="nav-list pc"> |
| 23 | <!-- 导航区 --> | ||
| 22 | <div class="main-nav-list"> | 24 | <div class="main-nav-list"> |
| 23 | <v-dropdown v-for="item in navList" :key="item.id" :data-obj="item" :data-list="item.list"> | 25 | <v-dropdown v-for="item in navList" :key="item.id" :data-obj="item" :data-list="item.list"> |
| 24 | </v-dropdown> | 26 | </v-dropdown> |
| 25 | </div> | 27 | </div> |
| 26 | <div class="nav-item search"></div> | 28 | <!-- 功能区 --> |
| 29 | <div class="main-func"> | ||
| 30 | |||
| 31 | <!-- 电话 --> | ||
| 32 | <div class="main-func-tel"> | ||
| 33 | <img src="@/assets/images/home/icon-tel.png" alt=""> | ||
| 34 | (852)2983 8866 | ||
| 35 | </div> | ||
| 36 | |||
| 37 | <!-- 语言切换 --> | ||
| 38 | <div class="main-func-lang"> | ||
| 39 | <!-- 中 | EN --> | ||
| 40 | <dropdown-lang class="lang" :type="'lang'" :data-obj="langData" :data-list="langData.list"></dropdown-lang> | ||
| 41 | </div> | ||
| 42 | |||
| 43 | <!-- 登入 --> | ||
| 44 | <div class="main-func-login"> | ||
| 45 | <dropdown-login class="lang" :type="'login'" :data-obj="loginData" :data-list="loginData.list" ref="mobileMenu"></dropdown-login> | ||
| 46 | </div> | ||
| 47 | |||
| 48 | <!-- 报价 --> | ||
| 49 | <div class="main-func-quote"> | ||
| 50 | 立即報價 | ||
| 51 | </div> | ||
| 52 | </div> | ||
| 53 | <!-- <div class="nav-item search"></div> | ||
| 27 | <div class="nav-item auth"> | 54 | <div class="nav-item auth"> |
| 28 | <v-dropdown class="lang" :type="'login'" :data-obj="loginData" :data-list="loginData.list" ref="mobileMenu"></v-dropdown> | 55 | <v-dropdown class="lang" :type="'login'" :data-obj="loginData" :data-list="loginData.list" ref="mobileMenu"></v-dropdown> |
| 29 | <v-dropdown class="lang" :type="'lang'" :data-obj="langData" :data-list="langData.list"></v-dropdown> | 56 | <v-dropdown class="lang" :type="'lang'" :data-obj="langData" :data-list="langData.list"></v-dropdown> |
| 30 | </div> | 57 | </div> --> |
| 31 | </div> | 58 | </div> |
| 32 | 59 | ||
| 33 | </div> | 60 | </div> | ... | ... |
| ... | @@ -114,7 +114,8 @@ | ... | @@ -114,7 +114,8 @@ |
| 114 | // background-image: linear-gradient(to bottom, #f05f28, #f05021); | 114 | // background-image: linear-gradient(to bottom, #f05f28, #f05021); |
| 115 | box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2); | 115 | box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2); |
| 116 | background-blend-mode: soft-light; | 116 | background-blend-mode: soft-light; |
| 117 | background-image: linear-gradient(to bottom, #ec6429, #ec6429), linear-gradient(to top, #000000, #ffffff); | 117 | background-image: linear-gradient(to bottom, #ec6429, #ec6429), |
| 118 | linear-gradient(to top, #000000, #ffffff); | ||
| 118 | // background-image: linear-gradient(to top, #000000, #ffffff), linear-gradient(to bottom, #ec6429, #ec6429); | 119 | // background-image: linear-gradient(to top, #000000, #ffffff), linear-gradient(to bottom, #ec6429, #ec6429); |
| 119 | } | 120 | } |
| 120 | 121 | ||
| ... | @@ -136,7 +137,8 @@ | ... | @@ -136,7 +137,8 @@ |
| 136 | font-size: $fontSize; | 137 | font-size: $fontSize; |
| 137 | border-radius: $hei; | 138 | border-radius: $hei; |
| 138 | text-align: center; | 139 | text-align: center; |
| 139 | background-image: linear-gradient(135deg, #f15a08, #feab1b), linear-gradient(90deg, #fff, #fff); | 140 | background-image: linear-gradient(135deg, #f15a08, #feab1b), |
| 141 | linear-gradient(90deg, #fff, #fff); | ||
| 140 | color: white; | 142 | color: white; |
| 141 | font-weight: 600; | 143 | font-weight: 600; |
| 142 | cursor: pointer; | 144 | cursor: pointer; |
| ... | @@ -152,16 +154,34 @@ | ... | @@ -152,16 +154,34 @@ |
| 152 | border: $borderSize solid transparent; | 154 | border: $borderSize solid transparent; |
| 153 | background-clip: padding-box, border-box; | 155 | background-clip: padding-box, border-box; |
| 154 | background-origin: padding-box, border-box; | 156 | background-origin: padding-box, border-box; |
| 155 | background-image: linear-gradient(90deg, #fff, #fff), linear-gradient(90deg, #feab1b, #f15a08); | 157 | background-image: linear-gradient(90deg, #fff, #fff), |
| 158 | linear-gradient(90deg, #feab1b, #f15a08); | ||
| 159 | border-radius: $borderRadius; | ||
| 160 | } | ||
| 161 | |||
| 162 | @mixin border-tans-rev($borderRadius: 1px, $borderSize: 2px) { | ||
| 163 | border: $borderSize solid transparent; | ||
| 164 | background-clip: padding-box, border-box; | ||
| 165 | background-origin: padding-box, border-box; | ||
| 166 | background-image: linear-gradient(90deg, #fff, #fff), | ||
| 167 | linear-gradient(90deg, #f15a08, #feab1b); | ||
| 156 | border-radius: $borderRadius; | 168 | border-radius: $borderRadius; |
| 157 | } | 169 | } |
| 158 | 170 | ||
| 159 | @mixin linear-bg() { | 171 | @mixin linear-bg() { |
| 160 | background-color: transparent; | 172 | background-color: transparent; |
| 161 | background-image: linear-gradient(135deg, #f15a08, #feab1b), linear-gradient(90deg, #fff, #fff); | 173 | background-image: linear-gradient(135deg, #f15a08, #feab1b), |
| 174 | linear-gradient(90deg, #fff, #fff); | ||
| 162 | } | 175 | } |
| 163 | 176 | ||
| 164 | @mixin linear-bg-rev() { | 177 | @mixin linear-bg-rev() { |
| 165 | background-color: transparent; | 178 | background-color: transparent; |
| 166 | background-image: linear-gradient(135deg, #feab1b, #f15a08), linear-gradient(90deg, #fff, #fff); | 179 | background-image: linear-gradient(135deg, #feab1b, #f15a08), |
| 180 | linear-gradient(90deg, #fff, #fff); | ||
| 181 | } | ||
| 182 | |||
| 183 | @mixin linear-bg-top() { | ||
| 184 | background-color: transparent; | ||
| 185 | background-image: linear-gradient(to top, #feab1b, #f15a08), | ||
| 186 | linear-gradient(90deg, #fff, #fff); | ||
| 167 | } | 187 | } | ... | ... |
-
Please register or sign in to post a comment