index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  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/learn/index')">
  301. <span class="developer-skill-icon icon3"></span>上传课程
  302. </div>
  303. <div class="developer-skill-item" @click="goto('/otherpage/works/create')">
  304. <span class="developer-skill-icon icon4"></span>上传资源
  305. </div>
  306. </div>
  307. <!-- <div class="developer-ad block no-padding"> -->
  308. <Ad-List location="developer"></Ad-List>
  309. <!-- </div> -->
  310. </div>
  311. </div>
  312. <el-dialog title="" custom-class="ma-level-dialog" width="880px" :visible.sync="levelIntroduceVisible">
  313. <Level-Introduce :show="levelIntroduceVisible" :level-info="levelInfo"></Level-Introduce>
  314. </el-dialog>
  315. </div>
  316. </template>
  317. <script>
  318. import {
  319. mapState
  320. } from "vuex";
  321. import qs from "qs";
  322. import DeveloperSeoData from "./developData";
  323. import Empty from "./empty";
  324. import personalIcon from "@/assets/img/account/personal.png"
  325. import LevelIntroduce from "./component/level-introduce.vue";
  326. import AdList from "@/components/ad.vue";
  327. export default {
  328. name: "SeoLearnList",
  329. components: {
  330. Empty,
  331. LevelIntroduce,
  332. AdList
  333. },
  334. data() {
  335. return {
  336. baseUrl: "",
  337. mobile: false,
  338. // firstLoad: true,
  339. isWeixinApp: true,
  340. isShowBablance: 1,
  341. init: false,
  342. tid: "",
  343. page: 1,
  344. pageSize: 10,
  345. list: [],
  346. isMore: true,
  347. pageLoading: false,
  348. personalIcon,
  349. levelIntroduceVisible: false,
  350. userGrade: ''
  351. };
  352. },
  353. head() {
  354. const {
  355. title = "程序员客栈-领先的程序员自由远程工作平台",
  356. keyword = "软件开发,网站系统,APP小程序,UI设计,web前端,原型产品经理,程序员兼职,程序员招聘",
  357. description = "程序员客栈是领先的程序员自由远程工作平台,未来互联网企业用人方式。提供优秀程序员为您进行网站建设制作、测试运维服务、人工智能AI、大数据区块链、软件开发等优质服务。",
  358. h1 = "",
  359. canonical = "",
  360. metaLocation
  361. } = this.head || {};
  362. let obj = {
  363. title: title,
  364. meta: [{
  365. name: "keywords",
  366. content: keyword
  367. },
  368. {
  369. name: "description",
  370. content: description
  371. },
  372. {
  373. name: "h1",
  374. content: h1
  375. }
  376. ],
  377. link: [{
  378. rel: "canonical",
  379. href: canonical
  380. }]
  381. };
  382. if (metaLocation) {
  383. obj.meta.push({
  384. name: "location",
  385. content: metaLocation
  386. });
  387. }
  388. return obj;
  389. },
  390. computed: {
  391. ...mapState(["deviceType"]),
  392. showWxHeader() {
  393. return (
  394. !this.deviceType.app &&
  395. !this.isWeixinApp &&
  396. (this.deviceType.android || this.deviceType.ios)
  397. );
  398. },
  399. mainMarginTop() {
  400. if (this.mobile && this.showWxHeader) {
  401. return "64px !important";
  402. } else if (this.mobile) {
  403. return "0px !important";
  404. } else {
  405. return "20px !important";
  406. }
  407. },
  408. // 是否实名
  409. isRealName() {
  410. return this.userInfo["realname_verify_status"] == 2 ? true : false;
  411. // return false
  412. },
  413. // 是否签约
  414. isSign() {
  415. return this.userInfo["realname_re"] == 2 ? true : false;
  416. // return false
  417. },
  418. // 是否技术认证
  419. is_freework_level() {
  420. return this.userInfo["freework_level"] >0 ? true : false;
  421. // return false
  422. },
  423. dynamicTranlate() {
  424. return;
  425. let typeList = this.typeList;
  426. let total = 680;
  427. let block = parseInt(total / typeList.length);
  428. let half = parseInt(block / 2);
  429. let line = 24 / 2;
  430. let curIndex = this.typeList.findIndex(item => {
  431. return item.typeId == this.tid;
  432. });
  433. curIndex = curIndex ? curIndex : 0;
  434. let result = curIndex * block + half - line;
  435. return result;
  436. },
  437. isLogin() {
  438. return this.$store.getters.isLogin
  439. }
  440. },
  441. async asyncData({
  442. ...params
  443. }) {
  444. let dealDataObj = new DeveloperSeoData(params);
  445. let ans = await dealDataObj.dealData();
  446. return {
  447. ...ans
  448. };
  449. },
  450. created() {},
  451. mounted() {
  452. let isShowBablance = window.localStorage.getItem("banlanceShow");
  453. if (isShowBablance === null || isShowBablance === undefined) {
  454. isShowBablance = 1;
  455. }
  456. this.isShowBablance = Number(isShowBablance);
  457. this.init = true;
  458. this.baseUrl = this.$store.state.domainConfig.siteUrl;
  459. this.isWeixinApp = navigator.userAgent.indexOf("miniProgram") > -1;
  460. this.tid = this.firstType.typeId;
  461. this.list = [...this.dynamicList];
  462. this.$nextTick(() => {
  463. this.listenToEnd();
  464. });
  465. this.fetchUserGrade()
  466. },
  467. destroy: function () {
  468. window.onscroll = null;
  469. },
  470. methods: {
  471. gotoApp() {
  472. this.checkLogin(true);
  473. this.$message("请前往APP完成实名");
  474. },
  475. gotoAppTips() {
  476. this.checkLogin(true);
  477. this.$message("请前往APP查看");
  478. },
  479. goto(url, title = "") {
  480. this.cnzz("开发者首页", title, "");
  481. location.href = url;
  482. },
  483. async ping(type = "") {
  484. this.cnzz("开发者首页", "ping" + type, "")
  485. let res = await this.$axios.$post("/api/remote/ping");
  486. if (res.status == 1) {
  487. this.$message.success("操作成功");
  488. }
  489. },
  490. toggleBanlace() {
  491. if (this.isShowBablance) {
  492. this.hideBanlance();
  493. } else {
  494. this.showBanlance();
  495. }
  496. },
  497. hideBanlance() {
  498. this.isShowBablance = 0;
  499. window.localStorage.setItem("banlanceShow", 0);
  500. },
  501. showBanlance() {
  502. this.isShowBablance = 1;
  503. window.localStorage.setItem("banlanceShow", 1);
  504. },
  505. listenToEnd() {
  506. let that = this;
  507. window.onscroll = function () {
  508. var scrollTop =
  509. document.documentElement.scrollTop || document.body.scrollTop;
  510. var windowHeight =
  511. document.documentElement.clientHeight || document.body.clientHeight;
  512. var scrollHeight =
  513. document.documentElement.scrollHeight || document.body.scrollHeight;
  514. if (scrollHeight - scrollTop - windowHeight < 400) {
  515. that.fetchDynamicData();
  516. }
  517. };
  518. },
  519. reset(type_id) {
  520. if (this.pageLoading) return;
  521. this.page = 0;
  522. this.isMore = true;
  523. this.tid = type_id;
  524. this.list = [];
  525. this.pageLoading = false;
  526. this.fetchDynamicData();
  527. },
  528. async fetchDynamicData() {
  529. if (this.pageLoading || !this.isMore) return;
  530. this.pageLoading = true;
  531. let page = this.page + 1;
  532. let type_id = this.tid
  533. let res = await this.$axios.$post("/uapi/dynamic/get_dynamic_detail", {
  534. type_id: type_id,
  535. page: page,
  536. pagesize: this.pageSize
  537. });
  538. setTimeout(() => {
  539. this.pageLoading = false;
  540. }, 100);
  541. if (Number(res.status) === 1) {
  542. // if (type_id != this.tid) {
  543. // return
  544. // }
  545. let info = res.data.list;
  546. info = info.map((item) => {
  547. let imgList = item.img
  548. imgList = imgList.map(item => {
  549. return item.img
  550. })
  551. return {
  552. ...item,
  553. imgList
  554. }
  555. })
  556. this.page = page;
  557. this.list = [...this.list, ...info];
  558. this.isMore = info.length < this.pageSize ? false : true;
  559. } else if (Number(res.status) === 40001) {
  560. this.isExist = false;
  561. }
  562. },
  563. clickResource(resources) {
  564. if (resources.resources_status != 1) {
  565. this.$message.info(resources.resources_text)
  566. } else {
  567. location.href = resources.resources_url
  568. }
  569. },
  570. login() {
  571. this.goLogin()
  572. },
  573. linkToUser() {
  574. if (this.isLogin) {
  575. location.href = 'https://jishuin.proginn.com/u/' + this.userinfo.uid
  576. }
  577. },
  578. async fetchUserGrade() {
  579. let res = await this.$axios.$post("/api/userGrade/userGrade", {
  580. uid: this.userinfo.uid
  581. });
  582. if (Number(res.status) === 1) {
  583. this.userGrade = res.data.perfect
  584. }
  585. }
  586. }
  587. };
  588. </script>
  589. <style lang="scss">
  590. @import "@/assets/css/developer/index.scss";
  591. .no-padding{
  592. padding:0
  593. }
  594. </style>