header.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <template>
  2. <div id="proginn-header" :class="{transparent: transparent}">
  3. <div class="list">
  4. <a :href="baseUrl" class="nav-item">
  5. <img
  6. class="logo"
  7. :src="transparent ? blueWhiteLogo : 'https://stacdn.proginn.com/image/common/logo3@2x.png'"
  8. />
  9. </a>
  10. <a :href="baseUrl" class="nav-item">首页</a>
  11. <a :href="baseUrl+'/cloud?from=top_nav'" class="nav-item">云端工作</a>
  12. <a :href="baseUrl+'/users'" class="nav-item">程序员</a>
  13. <el-dropdown class="nav-dropdown">
  14. <el-button type="text" class="dashboard-title">更多服务</el-button>
  15. <el-dropdown-menu slot="dropdown">
  16. <el-dropdown-item>
  17. <a
  18. class="workstation"
  19. :href="jishuBaseUrl+'/?from=top_nav'"
  20. style="display: flex; align-items: center;"
  21. >
  22. <img
  23. src="@/assets/img/header/jishuin.png"
  24. style="width: 24px;height: 24px;margin-right: 5px;"
  25. />技术圈
  26. </a>
  27. </el-dropdown-item>
  28. <el-dropdown-item>
  29. <a
  30. class="workstation"
  31. href="http://www.binstd.com/?from=proginn"
  32. style="display: flex; align-items: center;"
  33. >
  34. <img
  35. src="@/assets/img/header/binstd.png"
  36. style="width: 24px;height: 24px;margin-right: 5px;"
  37. />进制数据
  38. </a>
  39. </el-dropdown-item>
  40. <el-dropdown-item>
  41. <a
  42. class="workstation"
  43. :href="'/credit'"
  44. style="display: flex; align-items: center;"
  45. >
  46. <img
  47. src="@/assets/img/header/creditIconMore.png"
  48. style="width: 24px;height: 24px;margin-right: 5px;"
  49. />技术信用
  50. </a>
  51. </el-dropdown-item>
  52. </el-dropdown-menu>
  53. </el-dropdown>
  54. <div>
  55. <div style="position: relative;">
  56. <input
  57. class="input"
  58. autocomplete="off"
  59. placeholder="搜索您感兴趣的程序员"
  60. v-model="keywork"
  61. @keyup.enter="clickInputEnter"
  62. />
  63. <i class="el-icon-search" @click="clickInputEnter"></i>
  64. </div>
  65. <div class="dropdown" style="display:none;"></div>
  66. <div class="dropdown" style="display:none;"></div>
  67. </div>
  68. <template v-if="myInfo.nickname">
  69. <el-dropdown class="nav-dropdown">
  70. <el-button type="text" class="dashboard-title" :class>
  71. <i class="el-icon-tickets"></i>工作台
  72. </el-button>
  73. <el-dropdown-menu slot="dropdown">
  74. <el-dropdown-item>
  75. <a class="workstation" :href="baseUrl+'/wo/work_todo'">
  76. <i class="el-icon-edit"></i>我的待办
  77. </a>
  78. </el-dropdown-item>
  79. <el-dropdown-item>
  80. <a class="workstation" :href="baseUrl+'/wo/work_platform'">
  81. <i class="el-icon-date"></i>我的项目
  82. </a>
  83. </el-dropdown-item>
  84. <el-dropdown-item>
  85. <a class="workstation" :href="baseUrl+'/wo/work_hire'">
  86. <i class="el-icon-news"></i>我的雇佣
  87. </a>
  88. </el-dropdown-item>
  89. <el-dropdown-item>
  90. <a class="workstation" :href="baseUrl+'/wo/work_cloud'">
  91. <i class="el-icon-service"></i>我的云端
  92. </a>
  93. </el-dropdown-item>
  94. </el-dropdown-menu>
  95. </el-dropdown>
  96. <el-dropdown class="nav-dropdown">
  97. <el-button type="text" class="message-box-title">
  98. <i class="el-icon-message"></i>消息
  99. <span
  100. v-if="messageCount.total > 0"
  101. class="message-count message-total"
  102. >{{messageCount.total}}</span>
  103. </el-button>
  104. <el-dropdown-menu slot="dropdown">
  105. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/system')">
  106. <i class="circle blue"></i>系统消息
  107. <span v-if="messageCount.system" class="message-count">{{messageCount.system}}</span>
  108. </el-dropdown-item>
  109. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/project')">
  110. <i class="circle orange"></i>工作通知
  111. <span v-if="messageCount.work" class="message-count">{{messageCount.work}}</span>
  112. </el-dropdown-item>
  113. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/comment')">
  114. <i class="circle red"></i>评论回复
  115. <span v-if="messageCount.reply" class="message-count">{{messageCount.reply}}</span>
  116. </el-dropdown-item>
  117. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/at')">
  118. <i class="circle green"></i>@我的
  119. <span v-if="messageCount.at" class="message-count">{{messageCount.at}}</span>
  120. </el-dropdown-item>
  121. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/plus')">
  122. <i class="circle pink"></i>赞及其它
  123. <span
  124. v-if="messageCount.community_other"
  125. class="message-count"
  126. >{{messageCount.community_other}}</span>
  127. </el-dropdown-item>
  128. <el-dropdown-item class="message-box" @click.native="clickMessages('/message/coin')">
  129. <i class="circle yellow"></i>收支信息
  130. <span v-if="messageCount.balance" class="message-count">{{messageCount.balance}}</span>
  131. </el-dropdown-item>
  132. </el-dropdown-menu>
  133. </el-dropdown>
  134. <el-popover class="nav-popover" placement="bottom" width="226" trigger="hover">
  135. <div class="ref" slot="reference">
  136. <a class="nav-header" href="/wo/work_todo">
  137. <img class="header-user" :src="myInfo.icon_url" />
  138. <img
  139. v-if="myInfo.is_vip"
  140. class="header-vip-icon"
  141. :src="baseUrl+`/Public/image/h5/vip_icon${vipImage}.png`"
  142. alt="vip-icon"
  143. />
  144. </a>
  145. <span class="nickname">{{myInfo.nickname}}</span>
  146. </div>
  147. <div class="menu">
  148. <div v-if="myInfo.is_vip" class="vip-info vip-info-com">
  149. <div class="vip-info-top" >
  150. <img class="vip-icon" :src="baseUrl+`/Public/image/h5/vip_icon${vipImage}.png`" alt="vip-icon"/>
  151. <span class="vip-content">
  152. <span class="vip-title" :class="vipTextClass">{{vipText}}</span>
  153. <br />
  154. <span class="vip-end-date">{{vipInfo.endDate}}到期</span>
  155. </span>
  156. </div>
  157. <div class="vip-arcs">
  158. <a class="vip-arc" :class="vipTextClass" :href="baseUrl+'/type/vip/'+vipType">查看权益</a>
  159. <a
  160. class="vip-arc"
  161. :class="vipTextClass"
  162. :href="baseUrl+'/vip/pay?number=3&amp;product_id='+this.$store.state.userinfo.vip_type_id+'&amp;next=/type/vip/'+vipType"
  163. >立即续费</a>
  164. </div>
  165. </div>
  166. <div class="vip-items">
  167. <a class="vip-item divider" :href="baseUrl+'/wo/work_platform'">
  168. <i class="el-icon-date"></i>我的项目
  169. </a>
  170. <a class="vip-item" :href="baseUrl+'/wo/work_hire'">
  171. <i class="el-icon-news"></i>我的雇佣
  172. </a>
  173. <a class="vip-item" :href="baseUrl+'/wo/work_cloud'">
  174. <i class="el-icon-service"></i>我的云端
  175. </a>
  176. <a class="vip-item divider" :href="baseUrl+`/wo/${myInfo.uid}`">
  177. <i class="el-icon-document"></i>我的主页
  178. </a>
  179. <a class="vip-item" :href="baseUrl+'/index/app'">
  180. <i class="el-icon-view"></i>关注微信
  181. </a>
  182. <a class="vip-item" :href="'/credit/pages'">
  183. <i class="el-icon-credit"></i>技术信用
  184. </a>
  185. <a class="vip-item divider" @click="clickQuit">
  186. <i class="el-icon-back"></i>退出
  187. </a>
  188. </div>
  189. </div>
  190. </el-popover>
  191. </template>
  192. <div v-else>
  193. <a class="account-ctrl" :href="baseUrl+'/?loginbox=show'">登录</a>
  194. <a class="account-ctrl" style="margin-left: 40px;" :href="baseUrl+'/user/register'">注册</a>
  195. </div>
  196. </div>
  197. </div>
  198. </template>
  199. <script>
  200. import blueWhiteLogo from "@/assets/img/logo_blue_white.png";
  201. export default {
  202. props: ["transparent"],
  203. data() {
  204. return {
  205. baseUrl: "",
  206. jishuBaseUrl: "",
  207. // 搜索的关键词
  208. keywork: "",
  209. // 消息数量
  210. messageCount: {},
  211. blueWhiteLogo
  212. };
  213. },
  214. computed: {
  215. vipInfo() {
  216. let userinfo = this.$store.state.userinfo;
  217. return {
  218. id: userinfo.vip_type_id,
  219. endDate: userinfo.vip_end_date
  220. };
  221. },
  222. myInfo() {
  223. return this.$store.state.userinfo;
  224. },
  225. isCom() {
  226. return this.$store.state.userinfo.vip_type_id === "1";
  227. },
  228. vipImage(){
  229. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  230. case 1:
  231. return '_com';
  232. case 2:
  233. return '';
  234. case 3:
  235. return '_premium';
  236. default:
  237. return '';
  238. }
  239. },
  240. vipType(){
  241. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  242. case 1:
  243. case 3:
  244. return 'enterprise';
  245. break;
  246. case 2:
  247. return 'developer';
  248. }
  249. },
  250. vipTextClass(){
  251. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  252. case 1:
  253. return 'is-newly';
  254. case 2:
  255. return 'is-dev';
  256. case 3:
  257. return 'is-premium';
  258. default:
  259. return '';
  260. }
  261. },
  262. vipText(){
  263. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  264. case 1:
  265. return '初创版会员';
  266. case 2:
  267. return '开发者会员';
  268. case 3:
  269. return '企业版会员';
  270. default:
  271. return '';
  272. }
  273. }
  274. },
  275. mounted() {
  276. if (this.myInfo && this.myInfo.nickname) {
  277. this.getMessageCount();
  278. }
  279. },
  280. methods: {
  281. async clickQuit() {
  282. location.href = this.baseUrl + "/user/quit";
  283. },
  284. clickMessages(url) {
  285. location.href = url;
  286. },
  287. clickInputEnter() {
  288. window.location.href = this.baseUrl + "/search/?keyword=" + this.keywork;
  289. },
  290. async getMessageCount() {
  291. let res = await this.$axios.$get(
  292. "/api/message/getUnreadCount",
  293. {},
  294. { neverLogout: true }
  295. );
  296. if (res) {
  297. this.messageCount = res.data;
  298. }
  299. }
  300. },
  301. created() {
  302. this.baseUrl = process.env.baseUrl;
  303. this.jishuBaseUrl = process.env.jishuBaseUrl;
  304. }
  305. };
  306. </script>
  307. <style scoped>
  308. #proginn-header {
  309. position: relative;
  310. display: flex;
  311. justify-content: center;
  312. width: 100%;
  313. background: white;
  314. z-index: 10;
  315. }
  316. .list {
  317. display: flex;
  318. justify-content: space-between;
  319. align-items: center;
  320. width: 1000px;
  321. }
  322. .nav-item {
  323. display: flex;
  324. height: 83px;
  325. align-items: center;
  326. font-size: 15px;
  327. color: #515151;
  328. /* padding: 0 15px; */
  329. box-sizing: border-box;
  330. }
  331. .nav-item:first-child {
  332. padding: 0;
  333. }
  334. .nav-item:nth-child(n + 2):hover {
  335. color: #1782d9;
  336. border-top: 5px solid transparent;
  337. border-bottom: 5px solid #1782d9;
  338. }
  339. .nav-dropdown,
  340. .nav-popover {
  341. --imgWidth: 28px;
  342. height: 40px;
  343. display: flex;
  344. align-items: center;
  345. }
  346. .nav-popover > .ref {
  347. display: flex;
  348. align-items: center;
  349. }
  350. .nav-header {
  351. position: relative;
  352. width: var(--imgWidth);
  353. height: var(--imgWidth);
  354. margin-right: 5px;
  355. }
  356. .logo {
  357. width: 140px;
  358. height: auto;
  359. }
  360. .input {
  361. width: 234px;
  362. height: 40px;
  363. border-radius: 20px;
  364. background: #f6f6f6;
  365. padding: 0 40px;
  366. border: 1px solid #ebebeb;
  367. font-size: 13px;
  368. }
  369. .el-icon-search {
  370. position: absolute;
  371. top: 12px;
  372. right: 20px;
  373. color: grey;
  374. cursor: pointer;
  375. }
  376. .el-icon-credit {
  377. background: url('~@/assets/img/header/creditIconMine.png') no-repeat;
  378. background-size: cover;
  379. width: 18px;
  380. height: 18px;
  381. vertical-align: middle;
  382. margin: 0 8px;
  383. }
  384. .el-icon-search::before {
  385. font-size: 14px;
  386. font-weight: 800;
  387. }
  388. i {
  389. margin-right: 4px;
  390. }
  391. i.circle {
  392. display: inline-block;
  393. --width: 12px;
  394. width: var(--width);
  395. height: var(--width);
  396. border-radius: calc(var(--width) / 2);
  397. }
  398. i.blue {
  399. background: #3b83c0;
  400. }
  401. i.orange {
  402. background: #e07b53;
  403. }
  404. i.red {
  405. background: #d95c5c;
  406. }
  407. i.green {
  408. background: #5bbd72;
  409. }
  410. i.pink {
  411. background: #d9499a;
  412. }
  413. i.yellow {
  414. background: #f2c61f;
  415. }
  416. .message-box {
  417. position: relative;
  418. display: flex;
  419. align-items: center;
  420. }
  421. .message-count {
  422. color: white;
  423. margin-left: 4px;
  424. display: block;
  425. line-height: 18px;
  426. padding: 0 8px;
  427. border-radius: 9px;
  428. background: grey;
  429. }
  430. .message-count.message-total {
  431. position: absolute;
  432. top: 0px;
  433. right: -10px;
  434. background: #d95c5c;
  435. }
  436. span.other-icon {
  437. display: block;
  438. margin-left: 30px;
  439. }
  440. .nickname {
  441. font-size: 15px;
  442. }
  443. .vip-info {
  444. display: flex;
  445. flex-direction: column;
  446. justify-content: center;
  447. align-items: center;
  448. width: 206px;
  449. height: 120px;
  450. }
  451. .vip-info-top {
  452. display: flex;
  453. width: 142px;
  454. }
  455. .vip-title {
  456. color: #cb9d53;
  457. font-size: 16px;
  458. line-height: 36px;
  459. }
  460. .vip-icon {
  461. width: 24px;
  462. height: 24px;
  463. margin: 10px 8px 0 0;
  464. }
  465. .vip-end-date {
  466. font-size: 12px;
  467. color: #999;
  468. }
  469. .vip-arcs {
  470. display: flex;
  471. justify-content: space-between;
  472. width: 142px;
  473. margin-top: 11px;
  474. }
  475. .vip-arc {
  476. flex: 1;
  477. font-size: 13px;
  478. color: #cb9d53;
  479. text-align: center;
  480. }
  481. .vip-arc:first-child {
  482. border-right: 1px solid rgba(245, 245, 245, 1);
  483. }
  484. .vip-info-com .vip-title {
  485. color: rgb(113, 177, 253);
  486. }
  487. .vip-info-com .vip-arc {
  488. color: rgb(113, 177, 253);
  489. }
  490. .header-user {
  491. width: var(--imgWidth);
  492. height: var(--imgWidth);
  493. border-radius: 20px;
  494. }
  495. .header-vip-icon {
  496. position: absolute;
  497. top: 16px;
  498. left: 18px;
  499. width: 16px;
  500. height: 16px;
  501. }
  502. .vip-items {
  503. display: flex;
  504. flex-direction: column;
  505. }
  506. .vip-item {
  507. line-height: 32px;
  508. color: #606266;
  509. }
  510. .vip-item > i {
  511. margin: 0 10px;
  512. }
  513. .divider {
  514. border-top: 1px solid rgba(0, 0, 0, 0.05);
  515. margin-top: 10px;
  516. padding-top: 10px;
  517. cursor: pointer;
  518. }
  519. .vip-info-com .is-dev {
  520. color: #cb9d53;
  521. }
  522. .vip-info-com .is-newly{
  523. color: #308EFF;
  524. }
  525. .vip-info-com .is-premium{
  526. color: #00C469;
  527. }
  528. .workstation {
  529. color: #606266;
  530. }
  531. .account-ctrl {
  532. color: #606266;
  533. }
  534. #proginn-header a {
  535. text-decoration: none !important;
  536. }
  537. #proginn-header.transparent {
  538. background: transparent;
  539. border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  540. }
  541. #proginn-header.transparent a {
  542. color: white;
  543. }
  544. .message-box-title,
  545. .dashboard-title {
  546. color: #515151;
  547. font-size: 15px;
  548. }
  549. #proginn-header.transparent .message-box-title,
  550. #proginn-header.transparent .dashboard-title {
  551. color: white;
  552. }
  553. #proginn-header.transparent .nickname {
  554. color: white;
  555. }
  556. </style>