Navbar.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <div class="navbar">
  3. <hamburger
  4. id="hamburger-container"
  5. :is-active="sidebar.opened"
  6. class="hamburger-container"
  7. @toggleClick="toggleSideBar"
  8. />
  9. <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
  10. <div class="right-menu">
  11. <template v-if="device !== 'mobile'">
  12. <!-- <search id="header-search" class="right-menu-item" /> -->
  13. <!-- <notice-todo v-if="userIdentity === 1 && openSoket" /> -->
  14. <!-- <error-log class="errLog-container right-menu-item hover-effect" /> -->
  15. <screenfull id="screenfull" class="right-menu-item hover-effect" />
  16. </template>
  17. <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
  18. <div class="avatar-wrapper">
  19. <img src="https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" class="user-avatar">
  20. <span>{{ loginAccount || mobile || name }}</span>
  21. <template v-if="userIdentity === 2">
  22. <i v-if="vipInfo.vipStatus !== 3" class="vip-icon " :class="{ close: vipInfo.vipStatus === 0 }" />
  23. <el-button
  24. v-if="vipInfo.vipStatus === 3"
  25. type="primary"
  26. size="mini"
  27. class="vip-button"
  28. @click.stop="toOpenVipPage('open')"
  29. >开通会员</el-button>
  30. <el-button
  31. v-else
  32. type="primary"
  33. size="mini"
  34. class="vip-button xufei"
  35. @click.stop="toOpenVipPage('xufei')"
  36. >续费</el-button>
  37. </template>
  38. <i class="el-icon-caret-bottom" />
  39. </div>
  40. <el-dropdown-menu slot="dropdown" :class="{ user: userIdentity === 2 }">
  41. <template v-if="userIdentity === 2">
  42. <el-dropdown-item class="user-info">
  43. <img src="https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" class="user-avatar">
  44. <div class="right-content">
  45. <div class="name">
  46. <span>{{ loginAccount || mobile || name }}</span>
  47. <i class="vip-icon " :class="{ close: vipInfo.vipStatus === 0 || vipInfo.vipStatus === 3 }" />
  48. </div>
  49. <div class="info">
  50. <span v-if="vipInfo.endTime" class="time">到期时间:{{ vipInfo.endTime | formatTime }}</span>
  51. <span class="record">购买记录</span>
  52. </div>
  53. </div>
  54. </el-dropdown-item>
  55. <router-link to="/personal/info">
  56. <el-dropdown-item>个人资料</el-dropdown-item>
  57. </router-link>
  58. <router-link to="/personal/account">
  59. <el-dropdown-item>绑定登录账号</el-dropdown-item>
  60. </router-link>
  61. <router-link to="/password/edit">
  62. <el-dropdown-item>修改密码</el-dropdown-item>
  63. </router-link>
  64. <el-dropdown-item v-if="proxyState" divided @click.native="proxyLogout">
  65. 退出代理
  66. </el-dropdown-item>
  67. <el-dropdown-item v-else divided @click.native="logout">
  68. <span style="display:block;">退出登录</span>
  69. </el-dropdown-item>
  70. </template>
  71. <template v-else>
  72. <router-link to="/password/edit">
  73. <el-dropdown-item>修改密码</el-dropdown-item>
  74. </router-link>
  75. <el-dropdown-item divided @click.native="logout">
  76. <span style="display:block;">退出登录</span>
  77. </el-dropdown-item>
  78. </template>
  79. </el-dropdown-menu>
  80. </el-dropdown>
  81. </div>
  82. <vip-tip-dialog />
  83. </div>
  84. </template>
  85. <script>
  86. import { mapGetters } from 'vuex'
  87. import { formatDate } from '@/utils'
  88. import Breadcrumb from '@/components/Breadcrumb'
  89. import Hamburger from '@/components/Hamburger'
  90. // import ErrorLog from '@/components/ErrorLog'
  91. import Screenfull from '@/components/Screenfull'
  92. // import Search from '@/components/HeaderSearch'
  93. // import NoticeTodo from './NoticeTodo'
  94. import VipTipDialog from './VipTipDialog'
  95. export default {
  96. filters: {
  97. formatTime(time) {
  98. if (!time) {
  99. return ''
  100. }
  101. return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
  102. }
  103. },
  104. components: {
  105. Breadcrumb,
  106. Hamburger,
  107. // ErrorLog,
  108. Screenfull,
  109. VipTipDialog
  110. // NoticeTodo
  111. // Search
  112. },
  113. computed: {
  114. ...mapGetters([
  115. 'sidebar',
  116. 'device',
  117. 'name',
  118. 'userIdentity',
  119. 'openSoket',
  120. 'proxyState',
  121. 'mobile',
  122. 'loginAccount',
  123. 'vipInfo'
  124. ]),
  125. userName() {
  126. return this.name
  127. }
  128. },
  129. created() {
  130. console.log(this.vipInfo)
  131. },
  132. methods: {
  133. toggleSideBar() {
  134. this.$store.dispatch('app/toggleSideBar')
  135. },
  136. async logout() {
  137. this.$message.success('已退出当前账号')
  138. setTimeout(() => {
  139. // 退出登录重置用户信息
  140. this.$store.dispatch('user/logout').then(() => {
  141. // 重置相关state
  142. this.$router.replace('/login')
  143. })
  144. }, 500)
  145. },
  146. proxyLogout() {
  147. this.$message.success('已退出代理操作')
  148. setTimeout(() => {
  149. // 切换到真实登录用户的数据
  150. this.$store.dispatch('user/proxyLogout')
  151. this.$store.commit('proxy/CLOSE_PROXY')
  152. this.$router.replace('/proxy')
  153. }, 500)
  154. },
  155. // 去开通/续费会员
  156. toOpenVipPage(type) {
  157. if (type === 'open') {
  158. this.$router.push('/vip/vip-open')
  159. } else {
  160. this.$router.push('/vip/vip-open')
  161. }
  162. }
  163. }
  164. }
  165. </script>
  166. <style scoped>
  167. .el-dropdown-menu.user >>> .popper__arrow::after {
  168. border-bottom-color: #2c3e50;
  169. }
  170. </style>
  171. <style lang="scss" scoped>
  172. .el-dropdown-menu {
  173. &.user {
  174. padding-top: 0;
  175. width: 280px;
  176. border-radius: 8px;
  177. }
  178. }
  179. .vip-button {
  180. height: 24px;
  181. line-height: 24px;
  182. padding: 0 10px;
  183. margin-left: 4px;
  184. &.xufei {
  185. background: #ff6d6d;
  186. border-color: #ff6d6d;
  187. }
  188. }
  189. .user-info {
  190. display: flex;
  191. justify-content: space-between;
  192. align-items: center;
  193. background: #2c3e50;
  194. color: #f1f1f1;
  195. padding-top: 12px;
  196. padding-bottom: 12px;
  197. margin-bottom: 6px;
  198. border-radius: 8px 8px 0 0;
  199. .user-avatar {
  200. width: 48px;
  201. height: 48px;
  202. border-radius: 10px;
  203. }
  204. .right-content {
  205. width: 180px;
  206. .name {
  207. font-size: 20px;
  208. }
  209. .info {
  210. font-size: 12px;
  211. .record {
  212. margin-left: 6px;
  213. text-decoration: underline;
  214. }
  215. }
  216. }
  217. &:hover {
  218. background: #2c3e50;
  219. color: #f1f1f1;
  220. }
  221. }
  222. .vip-icon {
  223. display: inline-block;
  224. width: 40px;
  225. height: 32px;
  226. margin: 0 4px;
  227. background: url(~@/assets/img/vip-icon-active.png) no-repeat;
  228. background-size: 40px;
  229. vertical-align: -5px;
  230. &.close {
  231. background: url(~@/assets/img/vip-icon.png) no-repeat;
  232. }
  233. }
  234. .navbar {
  235. height: 50px;
  236. overflow: hidden;
  237. position: relative;
  238. background: #fff;
  239. box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
  240. .hamburger-container {
  241. line-height: 46px;
  242. height: 100%;
  243. float: left;
  244. cursor: pointer;
  245. transition: background 0.3s;
  246. -webkit-tap-highlight-color: transparent;
  247. &:hover {
  248. background: rgba(0, 0, 0, 0.025);
  249. }
  250. }
  251. .breadcrumb-container {
  252. float: left;
  253. }
  254. .errLog-container {
  255. display: inline-block;
  256. vertical-align: top;
  257. }
  258. .right-menu {
  259. float: right;
  260. height: 100%;
  261. line-height: 50px;
  262. &:focus {
  263. outline: none;
  264. }
  265. .right-menu-item {
  266. display: inline-block;
  267. padding: 0 8px;
  268. height: 100%;
  269. font-size: 18px;
  270. color: #5a5e66;
  271. vertical-align: text-bottom;
  272. &.hover-effect {
  273. cursor: pointer;
  274. transition: background 0.3s;
  275. // &:hover {
  276. // background: rgba(0, 0, 0, 0.025);
  277. // }
  278. }
  279. }
  280. .avatar-container {
  281. margin-right: 30px;
  282. .avatar-wrapper {
  283. // margin-top: 5px;
  284. position: relative;
  285. .user-avatar {
  286. cursor: pointer;
  287. width: 40px;
  288. height: 40px;
  289. border-radius: 10px;
  290. vertical-align: middle;
  291. }
  292. span {
  293. margin-left: 10px;
  294. }
  295. .el-icon-caret-bottom {
  296. cursor: pointer;
  297. position: absolute;
  298. right: -20px;
  299. top: 25px;
  300. font-size: 12px;
  301. }
  302. }
  303. }
  304. }
  305. }
  306. </style>