index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. <template>
  2. <div :class="mobile ? 'mobileMain' : ''" :style="{
  3. marginTop: mainMarginTop,
  4. marginBottom: mobile ? '0px' : '30px !important'
  5. }">
  6. <div class="developer-container" v-if="!mobile">
  7. <div class="developer-left">
  8. <!-- 接单流程:start -->
  9. <section class="developer-process block" v-if="!is_freework_level">
  10. <h3 class="title">接单流程</h3>
  11. <div class="developer-process-list">
  12. <article class="developer-process-item cur">
  13. <div class="developer-process-step line">
  14. <div class="developer-process-step-icon icon-1"></div>
  15. <div class="developer-process-step-content">注册</div>
  16. </div>
  17. <div class="developer-process-tips">成为客栈注册用户</div>
  18. </article>
  19. <article class="developer-process-item" :class="isSign ? 'cur' : ''">
  20. <div class="developer-process-step normal line">
  21. <div class="developer-process-step-icon icon-3"></div>
  22. <div class="developer-process-step-content">签约开发者</div>
  23. </div>
  24. <div class="developer-process-tips">
  25. <p v-if="!isSign">尚未签约 <a :click="this.cnzz('开发者首页','立即签约','')" href="/sign/new">立即签约</a></p>
  26. <p v-else>已签约</p>
  27. </div>
  28. </article>
  29. <article class="developer-process-item" :class="is_freework_level ? 'cur' : ''">
  30. <div class="developer-process-step normal line">
  31. <div class="developer-process-step-icon icon-2" :class="is_freework_level ? 'icon-1' : 'icon-2'"></div>
  32. <div class="developer-process-step-content">技术等级认证</div>
  33. </div>
  34. <div class="developer-process-tips">
  35. <p>
  36. 派单第一优先,认证永久保留! <a v-if="!is_freework_level" :click="this.cnzz('开发者首页','立即认证','')" href="/frontend/skill_cert/profile">立即认证</a>
  37. </p>
  38. </div>
  39. </article>
  40. <article class="developer-process-item" :class="isSign ? '' : ''">
  41. <div class="developer-process-step normal">
  42. <div class="developer-process-step-icon icon-4"></div>
  43. <div class="developer-process-step-content">开始接单</div>
  44. </div>
  45. <!-- <div class="developer-process-tips">内容已通过</div>-->
  46. </article>
  47. </div>
  48. </section>
  49. <!-- 接单流程:end -->
  50. <!-- 新人如何接单:start -->
  51. <section class="developer-order block">
  52. <h3 class="title">新人如何接单</h3>
  53. <p class="tips">
  54. 客栈接单采用智能对接池匹配原则,权重越高优先匹配。当前在“前端”对接池的<span style="color: #308eff;font-weight: bold;">排名{{ userInfo.rand_score || "100+" }}</span>,影响对接池的因素有以下几点:
  55. </p>
  56. <div class="developer-order-list">
  57. <article class="developer-order-item developer-order-item-activity">
  58. <div class="developer-order-title-area">
  59. <div class="developer-order-title-area-wrap">
  60. <div class="developer-order-icon icon-2"></div>
  61. <h5 class="developer-order-title">
  62. <span>开通开发者会员</span>
  63. </h5>
  64. </div>
  65. <div class="developer-order-link">
  66. <a :click="this.cnzz('开发者首页','立即认证','')" href="/type/vip/developer">会员介绍</a>
  67. </div>
  68. </div>
  69. <p class="developer-order-tips">
  70. 开发者会员出来提高权重,还有更多权益!
  71. </p>
  72. </article>
  73. <article class="developer-order-item">
  74. <div class="developer-order-title-area">
  75. <div class="developer-order-title-area-wrap">
  76. <div class="developer-order-icon icon-4"></div>
  77. <h5 class="developer-order-title">专业认证</h5>
  78. </div>
  79. <div class="developer-order-link">
  80. <a :click="this.cnzz('开发者首页','立即认证','')" href="/credit/professional">立即认证</a>
  81. </div>
  82. </div>
  83. <p class="developer-order-tips">
  84. 产品经理、项目经理、整包协作开发者、全职自由工作者等
  85. </p>
  86. </article>
  87. <!-- <article class="developer-order-item">
  88. <div class="developer-order-title-area">
  89. <div class="developer-order-title-area-wrap">
  90. <div class="developer-order-icon icon-1"></div>
  91. <h5 class="developer-order-title">完善个人资料<span v-if="userGrade">({{userGrade}})</span></h5>
  92. </div>
  93. <div class="developer-order-link">
  94. <a :click="this.cnzz('开发者首页','立即完善','')" :href="'/wo/'+userinfo.uid">立即完善</a>
  95. </div>
  96. </div>
  97. <p class="developer-order-tips">
  98. 账号信息完善度(个人信息+简历+作品)越高,客户信任感更高,也更容易为您精准匹配。
  99. </p>
  100. </article> -->
  101. <article class="developer-order-item">
  102. <div class="developer-order-title-area">
  103. <div class="developer-order-title-area-wrap">
  104. <div class="developer-order-icon icon-1"></div>
  105. <h5 class="developer-order-title">添加作品</h5>
  106. </div>
  107. <div class="developer-order-link">
  108. <a :click="this.cnzz('开发者首页','去添加','')" href="/otherpage/works/create">去添加</a>
  109. </div>
  110. </div>
  111. <p class="developer-order-tips">
  112. 添加更多作品,增加对接池权重
  113. </p>
  114. </article>
  115. <div class="developer-activity-tips">100%派单活动</div>
  116. </div>
  117. </section>
  118. <!-- 新人如何接单:end -->
  119. <!-- 热门课程:start -->
  120. <section class="developer-hot block">
  121. <article class="developer-hot-class">
  122. <h3 class="title">热门课程</h3>
  123. <ul class="developer-hot-list">
  124. <li v-for="(learnItem, index) in hotInfo['learn']" :key="learnItem.link" class="developer-hot-item text-line-1">
  125. <span class="index">{{ index + 1 }}</span>
  126. <a :href="learnItem.link">{{ learnItem.title }}</a>
  127. </li>
  128. </ul>
  129. </article>
  130. <article class="developer-hot-resource">
  131. <h3 class="title">热门资源</h3>
  132. <ul class="developer-hot-list">
  133. <li v-for="(workItem, index2) in hotInfo['works']" :key="workItem.link" class="developer-hot-item text-line-1">
  134. <span class="index">{{ index2 + 1 }}</span>
  135. <a :href="workItem.link">{{ workItem.title }}</a>
  136. </li>
  137. </ul>
  138. </article>
  139. </section>
  140. <!-- 热门课程:end -->
  141. <!-- 推荐tab:start -->
  142. <section class="developer-tab block">
  143. <div class="developer-tab-title-list">
  144. <!-- cur -->
  145. <div v-for="typeItem in typeList" :key="typeItem.typeId" @click="reset(typeItem.typeId)" :data-typeid="typeItem.typeId" :class="tid == typeItem.typeId ? 'cur' : ''" class="developer-tab-title-item">
  146. {{ typeItem.name }}
  147. </div>
  148. </div>
  149. <div class="developer-tab-main">
  150. <p class="developer-tab-tips">
  151. PC端圈子发布功能尚未上线,可下载APP体验哦~
  152. </p>
  153. <ul class="developer-dynamic-list" v-if="list.length > 0">
  154. <li v-for="dynamic in list" :key="dynamic.dynamicId" class="developer-dynamic-item">
  155. <div class="dynamic-user">
  156. <a :href="'https://jishuin.proginn.com/u/'+dynamic.user_info.uid" class="dynamic-user-avatar">
  157. <img :src="dynamic.user_info.icon_url" />
  158. </a>
  159. <div class="dynamic-user-info">
  160. <p class="dynamic-user-nickname text-line-1">
  161. <span>{{ dynamic.user_info.nickname }}</span><span v-if="dynamic.user_info.freework_level > 2" class="dynamic-level">F{{ dynamic.user_info.freework_level }}</span>
  162. </p>
  163. <p class="dynamic-job">
  164. {{ dynamic.user_info.tag[0].name }} ·
  165. {{ dynamic.user_info.tag[1].name }}
  166. </p>
  167. </div>
  168. </div>
  169. <div class="dynamic-title dynamic-margin">
  170. {{ dynamic.title }}
  171. </div>
  172. <div class="dynamic-type-list dynamic-margin">
  173. <span class="dynamic-type-item">{{ dynamic.type_text }}</span>
  174. </div>
  175. <div class="dynamic-img-area dynamic-margin" v-if="dynamic.img && dynamic.img.length > 0">
  176. <div class="dynamic-img-item" v-for="d_img in dynamic.img" :key="d_img.img">
  177. <!-- <img :src="d_img.img" /> -->
  178. <el-image style="width:90px;height:90px" fit="cover" :src="d_img.img" :preview-src-list="dynamic.imgList">
  179. </el-image>
  180. </div>
  181. </div>
  182. <div class="dynamic-link-area dynamic-margin" @click.capture.stop="clickResource(dynamic.resources)" v-if="dynamic.resources.resources_exist == 1">
  183. <div class="dynamic-link-img-area">
  184. <img :src="dynamic.resources.resources_img" />
  185. </div>
  186. <div class="dynamic-link-content text-line-1">
  187. <span :href="dynamic.resources.resources_url">{{dynamic.resources.resources_title}}</span>
  188. </div>
  189. </div>
  190. <div class="dynamic-control">
  191. <div class="dynamic-control-item" @click="gotoAppTips"><span class="dynamic-icon icon-share"></span>分享</div>
  192. <div class="dynamic-control-item" @click="gotoAppTips"><span class="dynamic-icon icon-comment"></span>评论</div>
  193. <div class="dynamic-control-item" @click="gotoAppTips"><span class="dynamic-icon icon-like"></span>赞</div>
  194. </div>
  195. </li>
  196. </ul>
  197. <div class="dynamic-empty" v-else>
  198. <Empty></Empty>
  199. <p>暂无动态</p>
  200. </div>
  201. </div>
  202. </section>
  203. <!-- 推荐tab:start -->
  204. </div>
  205. <div class="developer-right">
  206. <!-- 工作台:start -->
  207. <section class="developer-workbench block">
  208. <div class="developer-workbench-user" @click='linkToUser' :class="isLogin ? 'developer-workbench-user-logined' : ''">
  209. <div class="developer-user-avatar">
  210. <img :src="userInfo.icon_url || personalIcon" />
  211. </div>
  212. <div class="developer-user-info">
  213. <div v-if="isLogin" class="developer-user-name text-line-1">
  214. {{ userInfo.nickname }}
  215. </div>
  216. <div @click="login" v-else class="developer-user-name nologin text-line-1">
  217. 登录/注册
  218. </div>
  219. <div v-if="isLogin" class="developer-user-level">
  220. <span>uid:{{ userinfo.uid }}</span>
  221. </div>
  222. <div class="developer-user-level" @click.stop="levelIntroduceVisible = true">
  223. <span class="arrow_icon">当前等级Lv.{{ userInfo.dynamic_rand || 0 }}
  224. </span>
  225. </div>
  226. </div>
  227. </div>
  228. <h5 class="user-title">工作台</h5>
  229. <div class="developer-work-list">
  230. <div class="developer-work-item" @click="goto('/wo/work_todo','工作台')">
  231. <div class="developer-work-count">
  232. {{ workPlatInfo.pendingNumber || 0 }}
  233. </div>
  234. <div class="developer-work-tips">待办</div>
  235. </div>
  236. <div class="developer-work-item" @click="gotoAppTips">
  237. <div class="developer-work-count">
  238. {{ workPlatInfo.recruitDeveloperCount || 0 }}
  239. </div>
  240. <div class="developer-work-tips">沟通</div>
  241. </div>
  242. <div class="developer-work-item" @click="goto('/wo/work_hire','工作')">
  243. <div class="developer-work-count">
  244. {{ workPlatInfo.developerWorkNumber || 0 }}
  245. </div>
  246. <div class="developer-work-tips">工作</div>
  247. </div>
  248. <div class="developer-work-item" @click="goto('/wo/work_platform','整包')">
  249. <div class="developer-work-count">
  250. {{ workPlatInfo.developerProjectNumber || 0 }}
  251. </div>
  252. <div class="developer-work-tips">整包</div>
  253. </div>
  254. </div>
  255. <div class="developer-setting-area">
  256. <div class="developer-setting-item" @click="goto('/setting/work','接单设置')">
  257. <div class="developer-setting-icon setting-icon"></div>
  258. <div class="developer-setting-tips ">接单设置</div>
  259. </div>
  260. <div class="developer-setting-item">
  261. <div class="developer-setting-icon ping-icon"></div>
  262. <div class="developer-setting-tips" @click="ping(2)">Ping</div>
  263. </div>
  264. <div class="developer-setting-line"></div>
  265. </div>
  266. </section>
  267. <!-- 工作台:end -->
  268. <!-- 收入:start -->
  269. <section @click.stop="goto('/wo/account','总收入')" class="developer-reward block" v-if="init">
  270. <div class="developer-reward-title">
  271. <p>总收入 (元) <span class="arrow_icon"></span></p>
  272. <div @click.stop="toggleBanlace" class="developer-reward-show-setting" :class="isShowBablance ? 'show' : 'hide'"></div>
  273. </div>
  274. <div v-if="isLogin" class="developer-reward-count">
  275. {{ isShowBablance ? balanceInfo.historyTotalBalance : "****" }}
  276. </div>
  277. <div v-else class="developer-reward-count">
  278. {{ isShowBablance ? 0 : "****" }}
  279. </div>
  280. <div class="developer-reward-detail">
  281. <div class="developer-reward-item">
  282. <span>账户余额:</span>
  283. <span v-if="isLogin" class="num">{{isShowBablance ? balanceInfo.totalBalance : "****"}}</span>
  284. <span v-else class="num">{{isShowBablance ? 0 : "****"}}</span>
  285. </div>
  286. <div class="developer-reward-item">
  287. <span>薪资余额:</span>
  288. <span v-if="isLogin" class="num">{{isShowBablance ? balanceInfo.gongMallBalance : "****"}}</span>
  289. <span v-else class="num">{{isShowBablance ? 0 : "****"}}</span>
  290. </div>
  291. <div class="developer-reward-item">
  292. <span>冻结余额:</span>
  293. <span v-if="isLogin" class="num">{{isShowBablance ? balanceInfo.frozenBalance : "****"}}</span>
  294. <span v-else class="num">{{isShowBablance ? 0 : "****"}}</span>
  295. </div>
  296. </div>
  297. </section>
  298. <!-- 收入:end -->
  299. <div class="developer-skill block">
  300. <div class="developer-skill-item" @click="goto('/workbench/skill/index')">
  301. <span class="developer-skill-icon icon1"></span>发布技能
  302. </div>
  303. <div class="developer-skill-item" @click="goto('https://jishuin.proginn.com/topics/create')">
  304. <span class="developer-skill-icon icon2"></span>发布文章
  305. </div>
  306. <div class="developer-skill-item" @click="goto('/workbench/learn/index')">
  307. <span class="developer-skill-icon icon3"></span>上传课程
  308. </div>
  309. <div class="developer-skill-item" @click="goto('/otherpage/works/create')">
  310. <span class="developer-skill-icon icon4"></span>上传资源
  311. </div>
  312. </div>
  313. <!-- <div class="developer-ad block no-padding"> -->
  314. <Ad-List location="developer"></Ad-List>
  315. <!-- </div> -->
  316. </div>
  317. </div>
  318. <el-dialog title="" custom-class="ma-level-dialog" width="880px" :visible.sync="levelIntroduceVisible">
  319. <Level-Introduce :show="levelIntroduceVisible" :level-info="levelInfo"></Level-Introduce>
  320. </el-dialog>
  321. </div>
  322. </template>
  323. <script>
  324. import {
  325. mapState
  326. } from "vuex";
  327. import qs from "qs";
  328. import DeveloperSeoData from "./developData";
  329. import Empty from "./empty";
  330. import personalIcon from "@/assets/img/account/personal.png"
  331. import LevelIntroduce from "./component/level-introduce.vue";
  332. import AdList from "@/components/ad.vue";
  333. export default {
  334. name: "SeoLearnList",
  335. components: {
  336. Empty,
  337. LevelIntroduce,
  338. AdList
  339. },
  340. data() {
  341. return {
  342. baseUrl: "",
  343. mobile: false,
  344. // firstLoad: true,
  345. isWeixinApp: true,
  346. isShowBablance: 1,
  347. init: false,
  348. tid: "",
  349. page: 1,
  350. pageSize: 10,
  351. list: [],
  352. isMore: true,
  353. pageLoading: false,
  354. personalIcon,
  355. levelIntroduceVisible: false,
  356. userGrade: ''
  357. };
  358. },
  359. head() {
  360. const {
  361. title = "程序员客栈-领先的程序员自由远程工作平台",
  362. keyword = "软件开发,网站系统,APP小程序,UI设计,web前端,原型产品经理,程序员兼职,程序员招聘",
  363. description = "程序员客栈是领先的程序员自由远程工作平台,未来互联网企业用人方式。提供优秀程序员为您进行网站建设制作、测试运维服务、人工智能AI、大数据区块链、软件开发等优质服务。",
  364. h1 = "",
  365. canonical = "",
  366. metaLocation
  367. } = this.head || {};
  368. let obj = {
  369. title: title,
  370. meta: [{
  371. name: "keywords",
  372. content: keyword
  373. },
  374. {
  375. name: "description",
  376. content: description
  377. },
  378. {
  379. name: "h1",
  380. content: h1
  381. }
  382. ],
  383. link: [{
  384. rel: "canonical",
  385. href: canonical
  386. }]
  387. };
  388. if (metaLocation) {
  389. obj.meta.push({
  390. name: "location",
  391. content: metaLocation
  392. });
  393. }
  394. return obj;
  395. },
  396. computed: {
  397. ...mapState(["deviceType"]),
  398. showWxHeader() {
  399. return (
  400. !this.deviceType.app &&
  401. !this.isWeixinApp &&
  402. (this.deviceType.android || this.deviceType.ios)
  403. );
  404. },
  405. mainMarginTop() {
  406. if (this.mobile && this.showWxHeader) {
  407. return "64px !important";
  408. } else if (this.mobile) {
  409. return "0px !important";
  410. } else {
  411. return "20px !important";
  412. }
  413. },
  414. // 是否实名
  415. isRealName() {
  416. return this.userInfo["realname_verify_status"] == 2 ? true : false;
  417. // return false
  418. },
  419. // 是否签约
  420. isSign() {
  421. return this.userInfo["realname_re"] == 2 ? true : false;
  422. // return false
  423. },
  424. // 是否技术认证
  425. is_freework_level() {
  426. return this.userInfo["freework_level"] >0 ? true : false;
  427. // return false
  428. },
  429. dynamicTranlate() {
  430. return;
  431. let typeList = this.typeList;
  432. let total = 680;
  433. let block = parseInt(total / typeList.length);
  434. let half = parseInt(block / 2);
  435. let line = 24 / 2;
  436. let curIndex = this.typeList.findIndex(item => {
  437. return item.typeId == this.tid;
  438. });
  439. curIndex = curIndex ? curIndex : 0;
  440. let result = curIndex * block + half - line;
  441. return result;
  442. },
  443. isLogin() {
  444. return this.$store.getters.isLogin
  445. }
  446. },
  447. async asyncData({
  448. ...params
  449. }) {
  450. let dealDataObj = new DeveloperSeoData(params);
  451. let ans = await dealDataObj.dealData();
  452. return {
  453. ...ans
  454. };
  455. },
  456. created() {},
  457. mounted() {
  458. let isShowBablance = window.localStorage.getItem("banlanceShow");
  459. if (isShowBablance === null || isShowBablance === undefined) {
  460. isShowBablance = 1;
  461. }
  462. this.isShowBablance = Number(isShowBablance);
  463. this.init = true;
  464. this.baseUrl = this.$store.state.domainConfig.siteUrl;
  465. this.isWeixinApp = navigator.userAgent.indexOf("miniProgram") > -1;
  466. this.tid = this.firstType.typeId;
  467. this.list = [...this.dynamicList];
  468. this.$nextTick(() => {
  469. this.listenToEnd();
  470. });
  471. this.fetchUserGrade()
  472. },
  473. destroy: function () {
  474. window.onscroll = null;
  475. },
  476. methods: {
  477. gotoApp() {
  478. this.checkLogin(true);
  479. this.$message("请前往APP完成实名");
  480. },
  481. gotoAppTips() {
  482. this.checkLogin(true);
  483. this.$message("请前往APP查看");
  484. },
  485. goto(url, title = "") {
  486. this.cnzz("开发者首页", title, "");
  487. location.href = url;
  488. },
  489. async ping(type = "") {
  490. this.cnzz("开发者首页", "ping" + type, "")
  491. let res = await this.$axios.$post("/api/remote/ping");
  492. if (res.status == 1) {
  493. this.$message.success("操作成功");
  494. }
  495. },
  496. toggleBanlace() {
  497. if (this.isShowBablance) {
  498. this.hideBanlance();
  499. } else {
  500. this.showBanlance();
  501. }
  502. },
  503. hideBanlance() {
  504. this.isShowBablance = 0;
  505. window.localStorage.setItem("banlanceShow", 0);
  506. },
  507. showBanlance() {
  508. this.isShowBablance = 1;
  509. window.localStorage.setItem("banlanceShow", 1);
  510. },
  511. listenToEnd() {
  512. let that = this;
  513. window.onscroll = function () {
  514. var scrollTop =
  515. document.documentElement.scrollTop || document.body.scrollTop;
  516. var windowHeight =
  517. document.documentElement.clientHeight || document.body.clientHeight;
  518. var scrollHeight =
  519. document.documentElement.scrollHeight || document.body.scrollHeight;
  520. if (scrollHeight - scrollTop - windowHeight < 400) {
  521. that.fetchDynamicData();
  522. }
  523. };
  524. },
  525. reset(type_id) {
  526. if (this.pageLoading) return;
  527. this.page = 0;
  528. this.isMore = true;
  529. this.tid = type_id;
  530. this.list = [];
  531. this.pageLoading = false;
  532. this.fetchDynamicData();
  533. },
  534. async fetchDynamicData() {
  535. if (this.pageLoading || !this.isMore) return;
  536. this.pageLoading = true;
  537. let page = this.page + 1;
  538. let type_id = this.tid
  539. let res = await this.$axios.$post("/uapi/dynamic/get_dynamic_detail", {
  540. type_id: type_id,
  541. page: page,
  542. pagesize: this.pageSize
  543. });
  544. setTimeout(() => {
  545. this.pageLoading = false;
  546. }, 100);
  547. if (Number(res.status) === 1) {
  548. // if (type_id != this.tid) {
  549. // return
  550. // }
  551. let info = res.data.list;
  552. info = info.map((item) => {
  553. let imgList = item.img
  554. imgList = imgList.map(item => {
  555. return item.img
  556. })
  557. return {
  558. ...item,
  559. imgList
  560. }
  561. })
  562. this.page = page;
  563. this.list = [...this.list, ...info];
  564. this.isMore = info.length < this.pageSize ? false : true;
  565. } else if (Number(res.status) === 40001) {
  566. this.isExist = false;
  567. }
  568. },
  569. clickResource(resources) {
  570. if (resources.resources_status != 1) {
  571. this.$message.info(resources.resources_text)
  572. } else {
  573. location.href = resources.resources_url
  574. }
  575. },
  576. login() {
  577. this.goLogin()
  578. },
  579. linkToUser() {
  580. if (this.isLogin) {
  581. location.href = 'https://jishuin.proginn.com/u/' + this.userinfo.uid
  582. }
  583. },
  584. async fetchUserGrade() {
  585. let res = await this.$axios.$post("/api/userGrade/userGrade", {
  586. uid: this.userinfo.uid
  587. });
  588. if (Number(res.status) === 1) {
  589. this.userGrade = res.data.perfect
  590. }
  591. }
  592. }
  593. };
  594. </script>
  595. <style lang="scss">
  596. @import "@/assets/css/developer/index.scss";
  597. .no-padding{
  598. padding:0
  599. }
  600. </style>