NavBar.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <template>
  2. <div>
  3. <el-row id="navbar" class="main">
  4. <!--logo-->
  5. <el-col :sm="4" class="right">
  6. <a href="/" class="tit">
  7. <img src="@/assets/img/icon/logo.png" class="logo" alt="img">
  8. <span>bili</span>
  9. </a>
  10. </el-col>
  11. <el-col :sm="1" class="right">
  12. <a href="/status" class="tit">
  13. <span>状态</span>
  14. </a>
  15. </el-col>
  16. <el-col :sm="1" class="right">
  17. <a href="/video" class="tit">
  18. <span>视频</span>
  19. </a>
  20. </el-col>
  21. <el-col :sm="1" class="right">
  22. <a href="/audio" class="tit">
  23. <span>音频</span>
  24. </a>
  25. </el-col>
  26. <el-col :sm="1" class="right">
  27. <a href="/image" class="tit">
  28. <span>图片</span>
  29. </a>
  30. </el-col>
  31. <el-col :sm="1" class="right">
  32. <a href="/discover" class="tit">
  33. <span>发现</span>
  34. </a>
  35. </el-col>
  36. <!--搜索框-->
  37. <el-col :sm="8" class="search">
  38. <search-box />
  39. </el-col>
  40. <el-col :sm="1" class="right logo">
  41. <a href="/message" class="tit logo">
  42. <span class="el-icon-bell logo" />
  43. </a>
  44. </el-col>
  45. <el-col :sm="1" class="right logo">
  46. <a href="/post/publish" class="tit logo">
  47. <span class="el-icon-upload logo" />
  48. </a>
  49. </el-col>
  50. <!--用户信息-->
  51. <el-col :sm="5" class="user-info">
  52. <!--头像-->
  53. <img
  54. v-if="!user"
  55. src="@/assets/img/icon/avatar.png"
  56. title="点击登录"
  57. class="el-avatar--medium"
  58. style="cursor: pointer"
  59. alt=""
  60. @click="login"
  61. >
  62. <img
  63. v-else
  64. :src="user.avatarUrl"
  65. class="el-avatar--circle el-avatar--medium"
  66. alt=""
  67. >
  68. <!--下拉菜单-->
  69. <el-dropdown class="drop">
  70. <span class="el-dropdown-link">
  71. <span v-if="user">{{ user.username }}</span>
  72. <span
  73. v-else
  74. title="点击登录"
  75. @click="login"
  76. >登录</span>
  77. <i class="el-icon-arrow-down el-icon--right" />
  78. </span>
  79. <el-dropdown-menu /><!--防止该标签隐藏的时候控制台会报错-->
  80. <el-dropdown-menu v-if="user" slot="dropdown" class="iconsize">
  81. <el-dropdown-item
  82. icon="el-icon-user-solid"
  83. class="size"
  84. @click.native="goToProfile"
  85. >我的帐号</el-dropdown-item>
  86. <el-dropdown-item
  87. icon="el-icon-s-home"
  88. class="size"
  89. @click.native="goToHome"
  90. >我的主页</el-dropdown-item>
  91. <el-dropdown-item
  92. icon="el-icon-s-data"
  93. class="size"
  94. @click.native="goToPost"
  95. >我的稿件
  96. </el-dropdown-item>
  97. <el-dropdown-item
  98. icon="el-icon-star-on"
  99. class="size"
  100. @click.native="goToCollection"
  101. >收藏夹
  102. </el-dropdown-item>
  103. <el-dropdown-item
  104. icon="el-icon-video-camera-solid"
  105. class="size"
  106. @click.native="goToHistory"
  107. >历史记录
  108. </el-dropdown-item>
  109. <el-dropdown-item
  110. icon="el-icon-error"
  111. class="size"
  112. @click.native="goToLogout"
  113. >退出</el-dropdown-item>
  114. </el-dropdown-menu>
  115. </el-dropdown>
  116. </el-col>
  117. </el-row>
  118. <!--防止下面的盒子上移动,nav-bar脱离了标准流-->
  119. <div style="height: 50px" />
  120. <!--登录弹窗-->
  121. <el-dialog
  122. title="用户登录"
  123. append-to-body
  124. :visible.sync="dialogVisible"
  125. width="30%"
  126. center
  127. >
  128. <el-input
  129. v-model="userLogin.username"
  130. placeholder="请输入手机号或邮箱"
  131. style="width: 70%; padding-right: 2px"
  132. clearable
  133. />
  134. <br>
  135. <br>
  136. <el-input
  137. v-model="userLogin.password"
  138. placeholder="请输入验证码"
  139. style="width: 45%; padding-right: 2px"
  140. />
  141. <el-button :disabled="isBtn" @click="fetchVerifyCode">{{ code }}</el-button>
  142. <br>
  143. <br>
  144. <el-image :src="captchaCode" @click="getCaptcha" />
  145. <el-input
  146. v-model="userLogin.captchaCode"
  147. placeholder="请输入图形验证码"
  148. style="width: 45%; padding-right: 2px"
  149. />
  150. <br>
  151. <br>
  152. <span
  153. class="register"
  154. >账号不存在会自动注册</span>
  155. <span slot="footer" class="dialog-footer">
  156. <el-button
  157. type="primary"
  158. :loading="isLoading"
  159. @click.native="loginBtn"
  160. >登 录</el-button>
  161. </span>
  162. </el-dialog>
  163. </div>
  164. </template>
  165. <script>
  166. import Vue from 'vue'
  167. import SearchBox from '@/components/layout/SearchBox'
  168. import { userMixin } from 'assets/js/mixin'
  169. import { getMyInfo } from '@/api/user'
  170. import VueCookies from "vue-cookies";
  171. export default {
  172. name: 'NavBar',
  173. components: { SearchBox },
  174. mixins: [userMixin],
  175. data() {
  176. return {
  177. user: null,
  178. drawer: false
  179. }
  180. },
  181. created() {
  182. const userdata = Vue.$cookies.get('USERDATA')
  183. if (userdata !== null) {
  184. getMyInfo().then(res => {
  185. if (res.code === 0) {
  186. this.user = res.data
  187. }
  188. })
  189. }
  190. },
  191. methods: {
  192. login() {
  193. this.fetchPubkey()
  194. this.dialogVisible2 = false
  195. this.dialogVisible = true
  196. },
  197. register() {
  198. this.fetchPubkey()
  199. this.dialogVisible2 = false
  200. this.dialogVisible = true
  201. },
  202. goToHome() {
  203. const path = '/user/' + this.user.userId
  204. if (this.$route.path === path) {
  205. this.$router.go(0)
  206. return
  207. }
  208. this.$router.push(path)
  209. },
  210. }
  211. }
  212. </script>
  213. <style scoped>
  214. #navbar {
  215. height: 50px;
  216. border-bottom: 1px solid rgba(34, 36, 38, 0.15);
  217. box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
  218. position: fixed;
  219. top: 0;
  220. left: 0;
  221. right: 0;
  222. background-color: #ffffff;
  223. z-index: 9;
  224. }
  225. .navmenu {
  226. height: 50px;
  227. border-bottom: 1px solid rgba(34, 36, 38, 0.15);
  228. box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
  229. position: fixed;
  230. top: 0;
  231. left: 0;
  232. right: 0;
  233. background-color: #ffffff;
  234. z-index: 9;
  235. }
  236. .main {
  237. padding-left: 1%;
  238. padding-right: 1%;
  239. }
  240. .search-icon {
  241. display: none;
  242. }
  243. @media screen and (max-width: 768px) {
  244. .main {
  245. padding-left: 1%;
  246. padding-right: 1%;
  247. }
  248. .search,
  249. .user-info {
  250. display: none;
  251. }
  252. .search-icon {
  253. display: inline;
  254. cursor: pointer;
  255. font-size: 30px;
  256. align-content: flex-end;
  257. }
  258. }
  259. .right {
  260. word-break: keep-all; /* 不换行 */
  261. white-space: nowrap; /* 不换行 */
  262. display: flex;
  263. align-items: center;
  264. justify-content: space-between;
  265. }
  266. .tit {
  267. display: block;
  268. font-weight: 700;
  269. height: 45px;
  270. text-decoration: none;
  271. color: #333;
  272. }
  273. .tit span {
  274. margin-left: 5px;
  275. }
  276. .logo {
  277. width: 30px;
  278. position: relative;
  279. top: 5px;
  280. }
  281. .search {
  282. text-align: center;
  283. padding-top: 6px;
  284. }
  285. .user-info {
  286. padding-top: 6px;
  287. word-break: keep-all; /* 不换行 */
  288. white-space: nowrap; /* 不换行 */
  289. }
  290. .drop {
  291. cursor: pointer;
  292. position: relative;
  293. font-size: 16px;
  294. bottom: 10px;
  295. left: 5px;
  296. }
  297. .size {
  298. font-size: 16px;
  299. }
  300. .avatar-name {
  301. text-align: center;
  302. }
  303. .avatar {
  304. width: 70px;
  305. height: 70px;
  306. border-radius: 50%;
  307. }
  308. </style>