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="baseUrl+'/?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="'/job'"
  44. style="display: flex; align-items: center;"
  45. >
  46. <img
  47. src="@/assets/img/header/present_job.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+'/type/partners?from=top_nav'"
  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" :class>
  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="/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 class="vip-icon" :src="baseUrl+`/Public/image/h5/vip_icon${vipImage}.png`" alt="vip-icon"/>
  163. <span class="vip-content">
  164. <span class="vip-title" :class="vipTextClass">{{vipText}}</span>
  165. <br />
  166. <span class="vip-end-date">{{vipInfo.endDate}}到期</span>
  167. </span>
  168. </div>
  169. <div class="vip-arcs">
  170. <a class="vip-arc" :class="vipTextClass" :href="baseUrl+'/type/vip/'+vipType">查看权益</a>
  171. <a
  172. class="vip-arc"
  173. :class="vipTextClass"
  174. :href="baseUrl+'/vip/pay?number=3&amp;product_id='+this.$store.state.userinfo.vip_type_id+'&amp;next=/type/vip/'+vipType"
  175. >立即续费</a>
  176. </div>
  177. </div>
  178. <div class="vip-items">
  179. <a class="vip-item divider" :href="baseUrl+'/wo/work_platform'">
  180. <i class="el-icon-date"></i>我的项目
  181. </a>
  182. <a class="vip-item" :href="baseUrl+'/wo/work_hire'">
  183. <i class="el-icon-news"></i>我的雇佣
  184. </a>
  185. <a class="vip-item" :href="baseUrl+'/wo/work_cloud'">
  186. <i class="el-icon-service"></i>我的云端
  187. </a>
  188. <a class="vip-item divider" :href="baseUrl+`/wo/${myInfo.uid}`">
  189. <i class="el-icon-document"></i>我的主页
  190. </a>
  191. <a class="vip-item" :href="baseUrl+'/index/app'">
  192. <i class="el-icon-view"></i>关注微信
  193. </a>
  194. <a class="vip-item divider" @click="clickQuit">
  195. <i class="el-icon-back"></i>退出
  196. </a>
  197. </div>
  198. </div>
  199. </el-popover>
  200. </template>
  201. <div v-else>
  202. <a class="account-ctrl" :href="baseUrl+'/?loginbox=show'">登录</a>
  203. <a class="account-ctrl" style="margin-left: 40px;" :href="baseUrl+'/user/register'">注册</a>
  204. </div>
  205. </div>
  206. </div>
  207. </template>
  208. <script>
  209. import blueWhiteLogo from "@/assets/img/logo_blue_white.png";
  210. export default {
  211. props: ["transparent"],
  212. data() {
  213. return {
  214. baseUrl: "",
  215. jishuBaseUrl: "",
  216. // 搜索的关键词
  217. keywork: "",
  218. // 消息数量
  219. messageCount: {},
  220. blueWhiteLogo
  221. };
  222. },
  223. computed: {
  224. vipInfo() {
  225. let userinfo = this.$store.state.userinfo;
  226. return {
  227. id: userinfo.vip_type_id,
  228. endDate: userinfo.vip_end_date
  229. };
  230. },
  231. myInfo() {
  232. return this.$store.state.userinfo;
  233. },
  234. isCom() {
  235. return this.$store.state.userinfo.vip_type_id === "1";
  236. },
  237. vipImage(){
  238. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  239. case 1:
  240. return '_com';
  241. case 2:
  242. return '';
  243. case 3:
  244. return '_premium';
  245. default:
  246. return '';
  247. }
  248. },
  249. vipType(){
  250. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  251. case 1:
  252. case 3:
  253. return 'enterprise';
  254. break;
  255. case 2:
  256. return 'developer';
  257. }
  258. },
  259. vipTextClass(){
  260. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  261. case 1:
  262. return 'is-newly';
  263. case 2:
  264. return 'is-dev';
  265. case 3:
  266. return 'is-premium';
  267. default:
  268. return '';
  269. }
  270. },
  271. vipText(){
  272. switch (parseInt(this.$store.state.userinfo.vip_type_id)) {
  273. case 1:
  274. return '初创版会员';
  275. case 2:
  276. return '开发者会员';
  277. case 3:
  278. return '企业版会员';
  279. default:
  280. return '';
  281. }
  282. }
  283. },
  284. mounted() {
  285. if (this.myInfo && this.myInfo.nickname) {
  286. this.getMessageCount();
  287. }
  288. },
  289. methods: {
  290. async clickQuit() {
  291. location.href = this.baseUrl + "/user/quit";
  292. },
  293. clickMessages(url) {
  294. location.href = url;
  295. },
  296. clickInputEnter() {
  297. window.location.href = this.baseUrl + "/search/?keyword=" + this.keywork;
  298. },
  299. async getMessageCount() {
  300. let res = await this.$axios.$get(
  301. "/api/message/getUnreadCount",
  302. {},
  303. { neverLogout: true }
  304. );
  305. if (res) {
  306. this.messageCount = res.data;
  307. }
  308. }
  309. },
  310. created() {
  311. this.baseUrl = process.env.baseUrl;
  312. this.jishuBaseUrl = process.env.jishuBaseUrl;
  313. }
  314. };
  315. </script>
  316. <style scoped>
  317. #proginn-header {
  318. position: relative;
  319. display: flex;
  320. justify-content: center;
  321. width: 100%;
  322. background: white;
  323. z-index: 10;
  324. }
  325. .list {
  326. display: flex;
  327. justify-content: space-between;
  328. align-items: center;
  329. width: 1000px;
  330. }
  331. .nav-item {
  332. display: flex;
  333. height: 83px;
  334. align-items: center;
  335. font-size: 15px;
  336. color: #515151;
  337. /* padding: 0 15px; */
  338. box-sizing: border-box;
  339. }
  340. .nav-item:first-child {
  341. padding: 0;
  342. }
  343. .nav-item:nth-child(n + 2):hover {
  344. color: #1782d9;
  345. border-top: 5px solid transparent;
  346. border-bottom: 5px solid #1782d9;
  347. }
  348. .nav-dropdown,
  349. .nav-popover {
  350. --imgWidth: 28px;
  351. height: 40px;
  352. display: flex;
  353. align-items: center;
  354. }
  355. .nav-popover > .ref {
  356. display: flex;
  357. align-items: center;
  358. }
  359. .nav-header {
  360. position: relative;
  361. width: var(--imgWidth);
  362. height: var(--imgWidth);
  363. margin-right: 5px;
  364. }
  365. .logo {
  366. width: 140px;
  367. height: auto;
  368. }
  369. .input {
  370. width: 234px;
  371. height: 40px;
  372. border-radius: 20px;
  373. background: #f6f6f6;
  374. padding: 0 40px;
  375. border: 1px solid #ebebeb;
  376. font-size: 13px;
  377. }
  378. .el-icon-search {
  379. position: absolute;
  380. top: 12px;
  381. right: 20px;
  382. color: grey;
  383. cursor: pointer;
  384. }
  385. .el-icon-search::before {
  386. font-size: 14px;
  387. font-weight: 800;
  388. }
  389. i {
  390. margin-right: 4px;
  391. }
  392. i.circle {
  393. display: inline-block;
  394. --width: 12px;
  395. width: var(--width);
  396. height: var(--width);
  397. border-radius: calc(var(--width) / 2);
  398. }
  399. i.blue {
  400. background: #3b83c0;
  401. }
  402. i.orange {
  403. background: #e07b53;
  404. }
  405. i.red {
  406. background: #d95c5c;
  407. }
  408. i.green {
  409. background: #5bbd72;
  410. }
  411. i.pink {
  412. background: #d9499a;
  413. }
  414. i.yellow {
  415. background: #f2c61f;
  416. }
  417. .message-box {
  418. position: relative;
  419. display: flex;
  420. align-items: center;
  421. }
  422. .message-count {
  423. color: white;
  424. margin-left: 4px;
  425. display: block;
  426. line-height: 18px;
  427. padding: 0 8px;
  428. border-radius: 9px;
  429. background: grey;
  430. }
  431. .message-count.message-total {
  432. position: absolute;
  433. top: 0px;
  434. right: -10px;
  435. background: #d95c5c;
  436. }
  437. span.other-icon {
  438. display: block;
  439. margin-left: 30px;
  440. }
  441. .nickname {
  442. font-size: 15px;
  443. }
  444. .vip-info {
  445. display: flex;
  446. flex-direction: column;
  447. justify-content: center;
  448. align-items: center;
  449. width: 206px;
  450. height: 120px;
  451. }
  452. .vip-info-top {
  453. display: flex;
  454. width: 142px;
  455. }
  456. .vip-title {
  457. color: #cb9d53;
  458. font-size: 16px;
  459. line-height: 36px;
  460. }
  461. .vip-icon {
  462. width: 24px;
  463. height: 24px;
  464. margin: 10px 8px 0 0;
  465. }
  466. .vip-end-date {
  467. font-size: 12px;
  468. color: #999;
  469. }
  470. .vip-arcs {
  471. display: flex;
  472. justify-content: space-between;
  473. width: 142px;
  474. margin-top: 11px;
  475. }
  476. .vip-arc {
  477. flex: 1;
  478. font-size: 13px;
  479. color: #cb9d53;
  480. text-align: center;
  481. }
  482. .vip-arc:first-child {
  483. border-right: 1px solid rgba(245, 245, 245, 1);
  484. }
  485. .vip-info-com .vip-title {
  486. color: rgb(113, 177, 253);
  487. }
  488. .vip-info-com .vip-arc {
  489. color: rgb(113, 177, 253);
  490. }
  491. .header-user {
  492. width: var(--imgWidth);
  493. height: var(--imgWidth);
  494. border-radius: 20px;
  495. }
  496. .header-vip-icon {
  497. position: absolute;
  498. top: 16px;
  499. left: 18px;
  500. width: 16px;
  501. height: 16px;
  502. }
  503. .vip-items {
  504. display: flex;
  505. flex-direction: column;
  506. }
  507. .vip-item {
  508. line-height: 32px;
  509. color: #606266;
  510. }
  511. .vip-item > i {
  512. margin: 0 10px;
  513. }
  514. .divider {
  515. border-top: 1px solid rgba(0, 0, 0, 0.05);
  516. margin-top: 10px;
  517. padding-top: 10px;
  518. cursor: pointer;
  519. }
  520. .vip-info-com .is-dev {
  521. color: #cb9d53;
  522. }
  523. .vip-info-com .is-newly{
  524. color: #308EFF;
  525. }
  526. .vip-info-com .is-premium{
  527. color: #00C469;
  528. }
  529. .workstation {
  530. color: #606266;
  531. }
  532. .account-ctrl {
  533. color: #606266;
  534. }
  535. #proginn-header a {
  536. text-decoration: none !important;
  537. }
  538. #proginn-header.transparent {
  539. background: transparent;
  540. border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  541. }
  542. #proginn-header.transparent a {
  543. color: white;
  544. }
  545. .message-box-title,
  546. .dashboard-title {
  547. color: #515151;
  548. font-size: 15px;
  549. }
  550. #proginn-header.transparent .message-box-title,
  551. #proginn-header.transparent .dashboard-title {
  552. color: white;
  553. }
  554. #proginn-header.transparent .nickname {
  555. color: white;
  556. }
  557. </style>