header.vue 16 KB

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