NavBar.vue 6.7 KB

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