index.vue 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383
  1. <template>
  2. <div class="home">
  3. <header class="header">
  4. <div class="header__header">
  5. <div class="container">
  6. <div class="text-list" v-if="!userInfo">
  7. <a @click="go('/login', { state: 1 })">登录</a>
  8. <a @click="go('/login', { state: 2 })">注册</a>
  9. </div>
  10. <div class="icon-list" v-else>
  11. <!-- <a @click="go('/person-center/my-message')">
  12. <i class="el-icon-message-solid icon"></i>
  13. </a> -->
  14. <el-tooltip
  15. placement="bottom-end"
  16. v-model="msgShow"
  17. :hide-after="0"
  18. manual
  19. popper-class="tooltipStyle"
  20. >
  21. <el-badge
  22. :is-dot="msgCount > 0 ? true : false"
  23. class="item"
  24. style="vertical-align: baseline"
  25. >
  26. <el-button
  27. style="font-size: 20px; padding: 0px"
  28. icon="el-icon-message-solid"
  29. type="text"
  30. @click="go('/person-center/my-message')"
  31. ></el-button>
  32. </el-badge>
  33. <div slot="content" class="dis_plays">
  34. <p style="max-width: 247px">{{ msgData.text }}</p>
  35. <div class="toolbth" @click="newGoToStudy">立即学习</div>
  36. <i
  37. style="font-size: 18px;cursor:pointer;"
  38. class="el-icon-close"
  39. @click="clearMsg"
  40. ></i>
  41. </div>
  42. </el-tooltip>
  43. <el-dropdown @command="handleCommand">
  44. <span class="el-dropdown-link">
  45. <i
  46. class="el-icon-user-solid"
  47. style="
  48. font-size: 20px;
  49. color: #3f8dfd;
  50. cursor: pointer;
  51. margin-left: 20px;
  52. "
  53. @click="go('/person-center/my-course')"
  54. ></i>
  55. </span>
  56. <el-dropdown-menu slot="dropdown">
  57. <el-dropdown-item command="1">我的课程</el-dropdown-item>
  58. <el-dropdown-item command="2">我的题库</el-dropdown-item>
  59. <el-dropdown-item command="3">个人中心</el-dropdown-item>
  60. <el-dropdown-item command="4">退出登录</el-dropdown-item>
  61. </el-dropdown-menu>
  62. </el-dropdown>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="header__body">
  67. <div class="container clearfix">
  68. <a class="logo">
  69. <img
  70. v-if="header.companyLogo"
  71. :src="$tools.splitImgHost(header.companyLogo)"
  72. alt=""
  73. />
  74. <h1 v-else></h1>
  75. </a>
  76. <div class="search">
  77. <div class="search__select">
  78. <select v-model="type">
  79. <option value="1">课程</option>
  80. <option value="2">题库</option>
  81. <option value="6">直播</option>
  82. </select>
  83. </div>
  84. <div class="search__input">
  85. <input
  86. v-model="searchKey"
  87. type="text"
  88. autocomplete="new-password"
  89. />
  90. </div>
  91. <el-button type="primary" @click="search" class="search__btn"
  92. >搜索</el-button
  93. >
  94. </div>
  95. <div
  96. class="contact"
  97. v-show="false"
  98. v-if="header.serviceTel.status == 1"
  99. >
  100. <div class="contact__phone">{{ header.serviceTel.tel }}</div>
  101. <div class="contact__time">
  102. {{ header.serviceTel.time }}
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. </header>
  108. <section class="section">
  109. <div class="container">
  110. <div class="tabs">
  111. <template v-for="(item, index) in showNav(header.Nav)">
  112. <a v-if="item.name === '首页'" :key="index" class="tab active"
  113. >首页</a
  114. >
  115. <a
  116. v-if="item.name === '走进祥粤'"
  117. :key="index"
  118. class="tab"
  119. @click="go('/about')"
  120. >走进祥粤</a
  121. >
  122. <a
  123. v-if="item.name === '课程'"
  124. :key="index"
  125. class="tab"
  126. @click="go('/course-list')"
  127. >课程</a
  128. >
  129. <a
  130. v-if="item.name === '题库'"
  131. :key="index"
  132. class="tab"
  133. @click="go('/bank-list')"
  134. >题库</a
  135. >
  136. <a
  137. v-if="item.name === '直播'"
  138. :key="index"
  139. class="tab"
  140. @click="go('/live-list')"
  141. >直播</a
  142. >
  143. </template>
  144. </div>
  145. </div>
  146. <div class="swiper-wrap" :style="{ background: color }">
  147. <div class="container">
  148. <div class="left-box">
  149. <div class="left-box__header">课程导航</div>
  150. <div class="left-box__body">
  151. <div class="bg"></div>
  152. <div class="slide-list">
  153. <div
  154. class="slide-list__item"
  155. v-for="(type, typeItem) in typeList"
  156. :key="'type' + typeItem"
  157. >
  158. <div class="title" @click="goCourse(type)">
  159. {{ type.educationName }}
  160. </div>
  161. <ul class="nav">
  162. <li
  163. v-for="(slideItem, slideIndex) in slideList[typeItem]"
  164. :key="'item' + slideIndex"
  165. @click="goCourse(slideItem)"
  166. >
  167. <div class="text">
  168. <!-- {{ slideItem.projectName }}-{{ slideItem.businessName }} -->
  169. {{ slideItem.aliasName }}
  170. </div>
  171. </li>
  172. </ul>
  173. </div>
  174. </div>
  175. <ul class="list">
  176. <li v-for="(item, index) in typeList" :key="index">
  177. <div class="text">
  178. <div class="text__title" @click="goCourse(item)">
  179. {{ item.educationName }}
  180. </div>
  181. <div class="text__desc">
  182. <a
  183. @click="goCourse(aItem)"
  184. class="item"
  185. v-for="(aItem, aIndex) in item.list"
  186. :key="'aItem' + aIndex"
  187. >
  188. <!-- {{ aItem.projectName }}-{{ aItem.businessName }} -->
  189. {{ aItem.aliasName }}
  190. </a>
  191. </div>
  192. </div>
  193. </li>
  194. </ul>
  195. </div>
  196. </div>
  197. <div class="swiper">
  198. <swiper
  199. v-if="bannerList.length > 0"
  200. ref="mySwiper"
  201. @slideChangeTransitionStart="slideChangeTransitionStart($event)"
  202. class=""
  203. v-bind:options="swiperOptions"
  204. >
  205. <swiper-slide
  206. v-for="(item, index) in bannerList"
  207. v-bind:key="index"
  208. @click.native="swiperJump(item)"
  209. >
  210. <img
  211. :src="$tools.splitImgHost(item.adverUrl, true, 1272)"
  212. alt=""
  213. />
  214. </swiper-slide>
  215. <div class="swiper-pagination" slot="pagination"></div>
  216. <!-- <div class="swiper-button-prev" slot="button-prev"></div>
  217. <div class="swiper-button-next" slot="button-next"></div> -->
  218. </swiper>
  219. </div>
  220. <div class="right-box">
  221. <div class="bg"></div>
  222. <div class="no-login" v-if="!userInfo">
  223. <template v-if="loginType == 1">
  224. <el-form :model="loginForm" ref="loginForm" :rules="loginRules">
  225. <div class="input">
  226. <el-form-item prop="account">
  227. <el-input
  228. autocomplete="new-password"
  229. v-model="loginForm.account"
  230. @keyup.enter.native="login"
  231. placeholder="请输入手机号或身份证号"
  232. ></el-input>
  233. </el-form-item>
  234. </div>
  235. <div class="input">
  236. <el-form-item prop="pwd">
  237. <el-input
  238. autocomplete="new-password"
  239. type="password"
  240. v-model="loginForm.pwd"
  241. placeholder="请输入密码"
  242. @keyup.enter.native="login"
  243. ></el-input>
  244. </el-form-item>
  245. </div>
  246. <el-button
  247. type="primary"
  248. class="submit"
  249. @click="login()"
  250. :loading="isLogin"
  251. >登录</el-button
  252. >
  253. <div class="bottom-text">
  254. <a class="text" @click="loginType = 2">手机验证码登录</a>
  255. <a class="text" @click="go('/login?state=2')">注册</a>
  256. </div>
  257. <div class="dis_flex">
  258. <div class="dis_flex_wxloginImg">
  259. <img src="@/assets/wx.png" alt="" @click="wxLoginFunc" />
  260. </div>
  261. </div>
  262. </el-form>
  263. </template>
  264. <template v-if="loginType == 2">
  265. <el-form
  266. :model="loginSmsForm"
  267. ref="loginSmsForm"
  268. :rules="loginSmsRules"
  269. >
  270. <div class="input">
  271. <el-form-item prop="tel">
  272. <el-input
  273. autocomplete="new-password"
  274. v-model="loginSmsForm.tel"
  275. placeholder="请输入手机号"
  276. ></el-input>
  277. </el-form-item>
  278. </div>
  279. <div class="input">
  280. <el-form-item prop="code">
  281. <el-input
  282. autocomplete="new-password"
  283. v-model="loginSmsForm.code"
  284. placeholder="请输入验证码"
  285. >
  286. <span slot="suffix" @click="getLoginSms" class="btn">{{
  287. countDown == 0
  288. ? "获取验证码"
  289. : `${countDown}秒重新获取`
  290. }}</span>
  291. </el-input>
  292. </el-form-item>
  293. </div>
  294. <el-button
  295. type="primary"
  296. class="submit"
  297. :loading="isloginSms"
  298. @click="loginSms()"
  299. >登录</el-button
  300. >
  301. <div class="bottom-text">
  302. <a class="text" @click="loginType = 1">账号密码登录</a>
  303. <a class="text" @click="go('/login?state=2')">注册</a>
  304. </div>
  305. <div class="dis_flex">
  306. <div class="dis_flex_wxloginImg">
  307. <img src="@/assets/wx.png" alt="" @click="wxLoginFunc" />
  308. </div>
  309. </div>
  310. </el-form>
  311. </template>
  312. </div>
  313. <div class="has-login" v-else>
  314. <div class="userinfo">
  315. <img src="@/assets/ava.png" class="avatar" alt="" />
  316. <div class="nickname">{{ userInfo && userInfo.realname }}</div>
  317. </div>
  318. <div class="type-list">
  319. <div
  320. class="type-list__item"
  321. @click="go('/person-center/my-course')"
  322. >
  323. <img src="@/assets/kc.png" alt="" />
  324. <div class="text">课程</div>
  325. </div>
  326. <div
  327. class="type-list__item"
  328. @click="go('/person-center/my-bank')"
  329. >
  330. <img src="@/assets/tk.png" alt="" />
  331. <div class="text">题库</div>
  332. </div>
  333. <div
  334. class="type-list__item"
  335. @click="go('/person-center/my-order')"
  336. >
  337. <img src="@/assets/dd.png" alt="" />
  338. <div class="text">订单</div>
  339. </div>
  340. </div>
  341. <div class="history">
  342. <div class="btn">上次播放</div>
  343. <div class="title" @click="goLast">
  344. {{ recordList.goodsName }}
  345. </div>
  346. <div class="progress">
  347. <span
  348. >已学{{
  349. toFixed(
  350. (recordList.videoCurrentTime /
  351. recordList.durationTime) *
  352. 100
  353. )
  354. }}%</span
  355. >
  356. <span>{{ recordList.date }}</span>
  357. </div>
  358. </div>
  359. </div>
  360. </div>
  361. </div>
  362. </div>
  363. </section>
  364. <section class="course">
  365. <div class="container">
  366. <div class="course__header">
  367. <div class="title">推荐课程</div>
  368. <div class="course__footer">
  369. <div class="btn" @click="go('/course-list')">查看更多</div>
  370. </div>
  371. </div>
  372. <!-- <div class="tabs">
  373. <div
  374. v-for="(item, index) in goodsList1"
  375. :key="index"
  376. class="tab"
  377. :class="active1 === index ? 'active' : ''"
  378. @click="active1 = index"
  379. >
  380. {{ item.name }}
  381. </div>
  382. </div>
  383. <div class="course__body">
  384. <p
  385. v-if="
  386. !goodsList1[active1] ||
  387. !goodsList1[active1].goodsList ||
  388. goodsList1[active1].goodsList.length === 0
  389. "
  390. class="text_align"
  391. >
  392. 该培训项目无推荐课程
  393. </p>
  394. <ul v-else class="list clearfix">
  395. <template v-for="(item, index) in goodsList1[active1].goodsList">
  396. <li class="course-item" :key="index" v-if="index < 15">
  397. <GoodsItem :item="item"></GoodsItem>
  398. </li>
  399. </template>
  400. </ul>
  401. </div> -->
  402. <div v-if="courseName.length > 1" class="tabs">
  403. <div
  404. v-for="(item, index) in courseName"
  405. :key="index"
  406. class="tab"
  407. :class="couIndex === index ? 'active' : ''"
  408. @click="changeCou(item.recommendId, index)"
  409. >
  410. {{ item.name }}
  411. </div>
  412. </div>
  413. <div class="course__body">
  414. <p
  415. v-if="
  416. !goodsList1.length
  417. "
  418. class="text_align"
  419. >
  420. 该培训项目无推荐课程
  421. </p>
  422. <ul v-else class="list clearfix">
  423. <template v-for="(item, index) in goodsList1">
  424. <li class="course-item" :key="index">
  425. <GoodsItem :item="item"></GoodsItem>
  426. </li>
  427. </template>
  428. </ul>
  429. </div>
  430. <div class="pagination">
  431. <el-pagination
  432. @current-change="currentChangeCou"
  433. background
  434. layout="prev, pager, next"
  435. :total="paramList[0].total"
  436. :current-page.sync="paramList[0].currentPage"
  437. :page-size="paramList[0].pageSize"
  438. >
  439. </el-pagination>
  440. </div>
  441. <!-- <div class="course__footer">
  442. <div class="btn" @click="go('/course-list')">查看更多</div>
  443. </div> -->
  444. </div>
  445. </section>
  446. <section class="bank">
  447. <div class="container">
  448. <div class="bank__header">
  449. <div class="title">推荐题库</div>
  450. <div class="bank__footer">
  451. <div class="btn" @click="go('/bank-list')">查看更多</div>
  452. </div>
  453. </div>
  454. <!-- <div class="tabs">
  455. <div
  456. v-for="(item, index) in goodsList2"
  457. :key="index"
  458. class="tab"
  459. :class="active2 === index ? 'active' : ''"
  460. @click="active2 = index"
  461. >
  462. {{ item.name }}
  463. </div>
  464. </div>
  465. <div class="bank__body">
  466. <p
  467. v-if="
  468. !goodsList2[active2] ||
  469. !goodsList2[active2].goodsList ||
  470. goodsList2[active2].goodsList.length === 0
  471. "
  472. class="text_align"
  473. >
  474. 该培训项目无推荐题库
  475. </p>
  476. <ul v-else class="list clearfix">
  477. <template v-for="(item, index) in goodsList2[active2].goodsList">
  478. <li
  479. class="bank-item"
  480. v-if="index < 15"
  481. :key="index"
  482. @click="goodsDetail(item, 2)"
  483. >
  484. <GoodsItem :item="item"></GoodsItem>
  485. </li>
  486. </template>
  487. </ul>
  488. </div> -->
  489. <div v-if="bankName.length > 1" class="tabs">
  490. <div
  491. v-for="(item, index) in bankName"
  492. :key="index"
  493. class="tab"
  494. :class="bankIndex === index ? 'active' : ''"
  495. @click="changebank(item.recommendId, index)"
  496. >
  497. {{ item.name }}
  498. </div>
  499. </div>
  500. <div class="bank__body">
  501. <p
  502. v-if="
  503. !goodsList2.length
  504. "
  505. class="text_align"
  506. >
  507. 该培训项目无推荐题库
  508. </p>
  509. <ul v-else class="list clearfix">
  510. <template v-for="(item, index) in goodsList2">
  511. <li
  512. class="bank-item"
  513. :key="index"
  514. @click="goodsDetail(item, 2)"
  515. >
  516. <GoodsItem :item="item"></GoodsItem>
  517. </li>
  518. </template>
  519. </ul>
  520. </div>
  521. <div class="pagination">
  522. <el-pagination
  523. @current-change="currentChangeBank"
  524. background
  525. layout="prev, pager, next"
  526. :total="paramList[1].total"
  527. :current-page.sync="paramList[1].currentPage"
  528. :page-size="paramList[1].pageSize"
  529. >
  530. </el-pagination>
  531. </div>
  532. </div>
  533. </section>
  534. <el-dialog
  535. :visible.sync="bindShow"
  536. width="348px"
  537. center
  538. :close-on-click-modal="false"
  539. :close-on-press-escape="false"
  540. class="bind"
  541. >
  542. <a class="bind__close" @click="bindNext">X</a>
  543. <div class="bind__header">关联学员身份</div>
  544. <div class="bind__body">
  545. <el-form
  546. class="bind-form"
  547. ref="bindForm"
  548. :model="bindForm"
  549. :rules="bindForm"
  550. >
  551. <el-form-item prop="realname"
  552. ><el-input placeholder="真实姓名" v-model="bindForm.realname">
  553. </el-input
  554. ></el-form-item>
  555. <el-form-item prop="idCard">
  556. <el-input placeholder="身份证号码" v-model="bindForm.idCard" maxlength="18">
  557. </el-input
  558. ></el-form-item>
  559. <el-button
  560. class="submit"
  561. type="primary"
  562. :loading="isBind"
  563. round
  564. @click="bind()"
  565. >确定</el-button
  566. >
  567. <div class="bind-next" @click="bindNext">下次再关联</div>
  568. </el-form>
  569. </div>
  570. </el-dialog>
  571. <ToolBar></ToolBar>
  572. <Footer></Footer>
  573. <wx-login ref="wxLogin" @wxLoginBack="wxLoginBack"></wx-login>
  574. <RebuildModal
  575. ref="rebuildModal"
  576. @rebuildSubmit="rebuildSubmit($event)"
  577. ></RebuildModal>
  578. </div>
  579. </template>
  580. <script>
  581. import RebuildModal from "@/components/rebuildModal";
  582. import wxLogin from "@/components/wxLogin/index";
  583. import Footer from "@/components/footer/index";
  584. import ToolBar from "@/components/toolbar/index";
  585. import GoodsItem from "@/components/goodsItem/index";
  586. import { swiper, swiperSlide } from "vue-awesome-swiper";
  587. import { mapGetters, mapMutations } from "vuex";
  588. import "swiper/swiper-bundle.css";
  589. export default {
  590. name: "Home",
  591. components: {
  592. swiper,
  593. swiperSlide,
  594. Footer,
  595. GoodsItem,
  596. ToolBar,
  597. wxLogin,
  598. RebuildModal,
  599. },
  600. computed: {
  601. ...mapGetters(["userInfo", "token", "header", "msgCount"]),
  602. showNav: function () {
  603. return function (list) {
  604. var newList = [];
  605. if (list) {
  606. newList = list.filter((item) => {
  607. return item.status === 1;
  608. });
  609. }
  610. return newList;
  611. };
  612. },
  613. },
  614. data() {
  615. return {
  616. msgShow: false,
  617. msgData: {},
  618. showBox: false,
  619. indexToken: "",
  620. indexUserAccount: "",
  621. colors: [],
  622. color: "",
  623. countDown: 0,
  624. countDownTimer: null,
  625. loginRules: {
  626. account: [
  627. { required: true, trigger: "blur", message: "请输入手机号/身份证号" },
  628. ],
  629. pwd: [{ required: true, trigger: "blur", message: "请输入密码" }],
  630. },
  631. loginSmsRules: {
  632. code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
  633. tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
  634. },
  635. bindRules: {
  636. code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
  637. tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
  638. pwd: [{ required: true, trigger: "blur", message: "请输入密码" }],
  639. read: [{ required: true, trigger: "blur", message: "请勾选服务协议" }],
  640. },
  641. bindShow: false,
  642. loginType: 2,
  643. loginForm: {},
  644. loginSmsForm: {},
  645. bindForm: {},
  646. isLogin: false,
  647. isLoginSms: false,
  648. isBind: false,
  649. getLoginCodeLock: false,
  650. isloginSms: false,
  651. swiperOptions: {
  652. loop: true,
  653. observer: true,
  654. observeParents: true,
  655. speed: 300,
  656. autoplayDisableOnInteraction: false,
  657. autoplayStopOnLast: false,
  658. autoplay: {
  659. delay: 1000,
  660. disableOnInteraction: false,
  661. },
  662. // 显示分页
  663. pagination: {
  664. el: ".swiper-pagination",
  665. clickable: true, //允许分页点击跳转
  666. },
  667. // 设置点击箭头
  668. navigation: {
  669. nextEl: ".swiper-button-next",
  670. prevEl: ".swiper-button-prev",
  671. },
  672. },
  673. bannerList: [],
  674. goodsList1: [{}], //推荐课程列表
  675. goodsList2: [{}], //推荐题库列表
  676. typeList: [],
  677. slideList: [],
  678. active1: 0, //推荐课程index
  679. active2: 0, //推荐题库index
  680. searchKey: "",
  681. type: "1",
  682. recordList: {},
  683. params: {
  684. pageNum: 1,
  685. pageSize: 10,
  686. },
  687. paramList: [
  688. {
  689. pageNum: 1,
  690. pageSize: 15,
  691. currentPage: 1,
  692. total: 0,
  693. },
  694. {
  695. pageNum: 1,
  696. pageSize: 15,
  697. currentPage: 1,
  698. total: 0,
  699. }
  700. ],
  701. total1: 0,
  702. total2: 0,
  703. courseName: [],
  704. bankName: [],
  705. couIndex: 0,
  706. bankIndex: 0,
  707. courseId: '',
  708. bankId: '',
  709. };
  710. },
  711. created() {
  712. this.goodsList1 = []
  713. this.goodsList2 = []
  714. this.courseLists()
  715. },
  716. mounted() {
  717. if (this.userInfo) {
  718. this.getRecord();
  719. this.getmsg();
  720. this.getMsgCount();
  721. }
  722. // this.getActivityList();
  723. // this.color = this.colors[0];
  724. this.advertisingList();
  725. this.educationTypeList();
  726. },
  727. watch: {
  728. userInfo(val) {
  729. if (val) {
  730. this.getRecord();
  731. this.getmsg();
  732. this.getMsgCount();
  733. }
  734. },
  735. },
  736. methods: {
  737. //课程
  738. courseLists() {
  739. this.$request.appCommonActivityRecommendList({ platform: 2, status: 1 }).then(async (res) => {
  740. // return
  741. if (res.code == 200) {
  742. let list = res.rows || []
  743. //课程
  744. this.courseName = list.filter(x => x.type == 1).sort((a,b) => a.sort - b.sort).map(x => {
  745. return {
  746. name: x.name,
  747. recommendId: x.recommendId
  748. }
  749. });
  750. console.log('couIndex', this.couIndex, this.courseName)
  751. //题库
  752. this.bankName = list.filter(x => x.type == 2).sort((a,b) => a.sort - b.sort).map(x => {
  753. return {
  754. name: x.name,
  755. recommendId: x.recommendId
  756. }
  757. });
  758. if (this.courseName.length) {
  759. this.courseId = this.courseName[0].recommendId
  760. let list1 = await this.getGoodsList(this.courseName[0].recommendId, 0)
  761. this.goodsList1.push(...list1)
  762. }
  763. if (this.bankName.length) {
  764. this.bankId = this.bankName[0].recommendId
  765. let list2 = await this.getGoodsList(this.bankName[0].recommendId, 1)
  766. this.goodsList2.push(...list2)
  767. }
  768. }
  769. });
  770. },
  771. getGoodsList(recommendId, num) {
  772. return new Promise((resolve, reject) => {
  773. this.$axios({
  774. url: `/app/common/activity/recommend/goodsList`,
  775. method: 'get',
  776. params: {
  777. pageNum: this.paramList[num].pageNum,
  778. pageSize: this.paramList[num].pageSize,
  779. recommendId: recommendId
  780. },
  781. noToken: true
  782. }).then((res) => {
  783. if (res.code == 200) {
  784. this.paramList[num].total = res.total
  785. resolve(res.rows)
  786. }
  787. })
  788. })
  789. },
  790. async currentChangeCou(val) {
  791. console.log('vallll', val)
  792. this.paramList[0].pageNum = val
  793. this.goodsList1 = []
  794. let list1 = await this.getGoodsList(this.courseId, 0)
  795. this.goodsList1.push(...list1)
  796. },
  797. async changeCou(recommendId, index) {
  798. this.couIndex = index
  799. this.courseId = recommendId
  800. this.paramList[0].pageNum = 1
  801. this.paramList[0].currentPage = 1
  802. this.goodsList1 = []
  803. let list1 = await this.getGoodsList(recommendId, 0)
  804. this.goodsList1.push(...list1)
  805. },
  806. async currentChangeBank(val) {
  807. console.log('val--', val)
  808. this.paramList[1].pageNum = val
  809. this.goodsList2 = []
  810. let list2 = await this.getGoodsList(this.bankId, 1)
  811. this.goodsList2.push(...list2)
  812. },
  813. async changebank(recommendId, index) {
  814. this.bankIndex = index
  815. this.bankId = recommendId
  816. this.paramList[1].pageNum = 1
  817. this.paramList[1].currentPage = 1
  818. this.goodsList2 = []
  819. let list2 = await this.getGoodsList(recommendId, 1)
  820. this.goodsList2.push(...list2)
  821. },
  822. /**
  823. * 关闭消息
  824. */
  825. clearMsg() {
  826. let ary = {
  827. userId: this.msgData.userId,
  828. msgId: this.msgData.id,
  829. updateTime: new Date(new Date().toLocaleDateString()).getTime(),
  830. };
  831. localStorage.setItem("msg", JSON.stringify(ary));
  832. this.msgShow = false;
  833. },
  834. rebuildSubmit(item) {
  835. this.$router.push({
  836. path: `/my-course-detail/${item.goodsId}`,
  837. query: {
  838. gradeId: item.gradeId,
  839. orderGoodsId: item.orderGoodsId,
  840. rebuild: 1,
  841. },
  842. });
  843. },
  844. getGoodsData() {
  845. return new Promise((resolve, reject) => {
  846. this.$request.goodsDetail(this.msgData.goodsId).then((res) => {
  847. resolve(res.data);
  848. });
  849. });
  850. },
  851. /**
  852. * 前往学习
  853. */
  854. async newGoToStudy() {
  855. let item = await this.getGoodsData();
  856. if (item.goodsType == 1) {
  857. this.sysTime = this.$tools.timest();
  858. item.orderGoodsId = this.msgData.orderGoodsId;
  859. this.canJump(item).then((res) => {
  860. this.clearMsg();
  861. this.$router.push({
  862. path: `/my-course-detail/${item.goodsId}`,
  863. query: {
  864. gradeId: item.gradeId,
  865. orderGoodsId: item.orderGoodsId,
  866. courseId: res.rows[0].courseId || "",
  867. },
  868. });
  869. });
  870. // arsty = '立刻学习';
  871. //题库
  872. } else if (item.goodsType == 2) {
  873. this.clearMsg();
  874. this.$router.push({
  875. path: "/person-center/my-bank/bank-detail/" + item.goodsId,
  876. query: {
  877. orderGoodsId: item.orderGoodsId,
  878. },
  879. });
  880. }
  881. },
  882. canJump(item) {
  883. return new Promise((resolve) => {
  884. this.$request
  885. .orderInfo({
  886. orderGoodsId: item.orderGoodsId,
  887. })
  888. .then(async (res) => {
  889. let items = res.data;
  890. let currentTime = this.$tools.timest();
  891. if (items.interfaceAccountId > 0) {
  892. //学习账号已开通
  893. if (items.learnStatus == 1) {
  894. //跳转第三方h5
  895. const confirmText = [
  896. "您的学习账号已经开通,请按照步骤操作,进行学习。",
  897. "1.点击【跳转学习网址】按钮",
  898. "2.打开学习网址后,选择【个人用户】进行登录",
  899. "(1)账号:您个人的身份证号码",
  900. "(2)密码:身份证号码,再加111111",
  901. ];
  902. const newDatas = [];
  903. const h = this.$createElement;
  904. for (const i in confirmText) {
  905. newDatas.push(h("p", null, confirmText[i]));
  906. }
  907. this.$confirm(h("div", null, newDatas), "温馨提示", {
  908. confirmButtonText: "跳转学习网址",
  909. cancelButtonText: "关闭",
  910. closeOnClickModal: false,
  911. closeOnPressEscape: false,
  912. distinguishCancelAndClose: false,
  913. showClose: false,
  914. })
  915. .then((_) => {
  916. window.open("http://admin.zhujianpeixun.com/", "_blank");
  917. })
  918. .catch((_) => {});
  919. return;
  920. } else {
  921. this.$message({
  922. type: "warning",
  923. message:
  924. "您的学习账号未开通,请稍后再尝试,有疑问,请联系020-87085982!",
  925. });
  926. return;
  927. }
  928. }
  929. // //内部系统
  930. // if (items.interfacePushId > 0 && items.officialStatus != 1) {
  931. // this.$message({
  932. // type: "warning",
  933. // message:
  934. // "机构正在为您报名中,请耐心等待,有疑问请联系020-87085982!",
  935. // });
  936. // return;
  937. // }
  938. if (items.goodsType !== 6) {
  939. if (
  940. this.sysTime <= items.serviceStartTime ||
  941. this.sysTime >= items.serviceEndTime
  942. ) {
  943. this.$message({
  944. type: "warning",
  945. message: "不在学习服务期,不能进入学习",
  946. });
  947. return;
  948. }
  949. if (
  950. (items.classStartTime &&
  951. this.sysTime <= items.classStartTime) ||
  952. (items.classEndTime && this.sysTime >= items.classEndTime)
  953. ) {
  954. this.$message({
  955. type: "warning",
  956. message: "不在班级有效期,不能进入学习",
  957. });
  958. return;
  959. }
  960. if (items.learningStatus == 2) {
  961. this.$message({
  962. type: "warning",
  963. message: "开放学习时间待定,不能进入学习",
  964. });
  965. return;
  966. }
  967. if (items.classStatus == 0) {
  968. this.$message({
  969. type: "warning",
  970. message: "尚未开班,不能进入学习",
  971. });
  972. return;
  973. }
  974. if (
  975. items.learningStatus == 3 &&
  976. this.sysTime < items.learningTimeStart
  977. ) {
  978. this.$message({
  979. type: "warning",
  980. message: "不在开放学习时间,不能进入学习",
  981. });
  982. return;
  983. }
  984. let rebuildStatus = await this.courseGoodsRebuildStatus(
  985. items.goodsId,
  986. items.gradeId
  987. );
  988. if (rebuildStatus == 0) {
  989. this.$refs.rebuildModal.showModal(items);
  990. return;
  991. }
  992. }
  993. // if (item.educationName == "继续教育") {
  994. this.$request
  995. .lockLockStatus({
  996. action: "jxjy",
  997. })
  998. .then((res) => {
  999. //有其他端在操作,不能学习
  1000. this.$message({
  1001. type: "warning",
  1002. message: res.msg,
  1003. });
  1004. })
  1005. .catch((err) => {
  1006. //可以学习
  1007. this.$request
  1008. .courseCourseList({
  1009. pageNum: 1,
  1010. pageSize: 1,
  1011. goodsId: items.goodsId,
  1012. gradeId: items.gradeId,
  1013. })
  1014. .then((res) => {
  1015. if (res.rows.length) {
  1016. resolve(res);
  1017. } else {
  1018. this.$message({
  1019. type: "warning",
  1020. message: "课程内暂无可以学习的科目",
  1021. });
  1022. }
  1023. });
  1024. });
  1025. // } else {
  1026. // this.$request
  1027. // .courseCourseList({
  1028. // pageNum: 1,
  1029. // pageSize: 1,
  1030. // goodsId: items.goodsId,
  1031. // gradeId: items.gradeId,
  1032. // })
  1033. // .then((res) => {
  1034. // if (res.rows.length) {
  1035. // resolve(res);
  1036. // } else {
  1037. // this.$message({
  1038. // type: "warning",
  1039. // message: "课程内暂无可以学习的科目",
  1040. // });
  1041. // }
  1042. // });
  1043. // }
  1044. });
  1045. });
  1046. },
  1047. /**
  1048. * @param {Object} goodsId 商品id
  1049. * 查询商品重修状态
  1050. */
  1051. courseGoodsRebuildStatus(goodsId, gradeId) {
  1052. return new Promise((resolve) => {
  1053. this.$request
  1054. .courseGoodsRebuildStatus({
  1055. goodsId: goodsId,
  1056. gradeId: gradeId,
  1057. })
  1058. .then((res) => {
  1059. resolve(res.data);
  1060. });
  1061. });
  1062. },
  1063. /**
  1064. * 微信登入
  1065. */
  1066. wxLoginFunc() {
  1067. this.$refs.wxLogin.openBoxs();
  1068. },
  1069. /**
  1070. * 微信登入—返回数据
  1071. */
  1072. wxLoginBack(res) {
  1073. localStorage.setItem("user_account", res.data.user_account);
  1074. localStorage.setItem("token", res.data.token);
  1075. if (res.data.full_info) {
  1076. this.getInfo();
  1077. } else {
  1078. this.indexUserAccount = res.data.user_account;
  1079. this.indexToken = res.data.token;
  1080. this.isLogin = false;
  1081. // 弹窗
  1082. this.bindShow = true;
  1083. }
  1084. },
  1085. goLast() {
  1086. if (this.recordList.goodsType == 6) {
  1087. this.go("/my-live-detail/" + this.recordList.goodsId, {
  1088. gradeId: this.recordList.gradeId,
  1089. orderGoodsId: this.recordList.orderGoodsId,
  1090. courseId: this.recordList.courseId,
  1091. });
  1092. } else if (this.recordList.goodsType == 1) {
  1093. this.go("/my-course-detail/" + this.recordList.goodsId, {
  1094. gradeId: this.recordList.gradeId,
  1095. orderGoodsId: this.recordList.orderGoodsId,
  1096. courseId: this.recordList.courseId,
  1097. });
  1098. }
  1099. },
  1100. swiperJump(swiper) {
  1101. if (swiper.jumpType == 1) {
  1102. //无跳转
  1103. return;
  1104. } else if (swiper.jumpType == 2) {
  1105. //url
  1106. window.open(swiper.jumpUrl, "_blank");
  1107. } else if (swiper.jumpType == 3) {
  1108. //内部接口
  1109. this.$router.push({
  1110. path: swiper.jumpUrl,
  1111. });
  1112. }
  1113. },
  1114. handleCommand(command) {
  1115. switch (command) {
  1116. case "1":
  1117. this.go("/person-center/my-course");
  1118. break;
  1119. case "2":
  1120. this.go("/person-center/my-bank");
  1121. break;
  1122. case "3":
  1123. this.go("/person-center/my-info");
  1124. break;
  1125. case "4":
  1126. this.$tools.exit();
  1127. break;
  1128. default:
  1129. break;
  1130. }
  1131. },
  1132. toFixed(num) {
  1133. if (num) {
  1134. let str = String(num).indexOf(".");
  1135. if (str != -1) {
  1136. return +num.toFixed(2);
  1137. } else {
  1138. return num;
  1139. }
  1140. } else {
  1141. return 0;
  1142. }
  1143. },
  1144. ...mapMutations(["setUserInfo", "getMsgCount"]),
  1145. /**
  1146. * 播放记录
  1147. */
  1148. getRecord() {
  1149. this.$request
  1150. .studRrecordListUserRecord({
  1151. pageNum: 1,
  1152. pageSize: 1,
  1153. })
  1154. .then((res) => {
  1155. if (res.rows.length) {
  1156. this.recordList = res.rows[0];
  1157. }
  1158. });
  1159. },
  1160. search() {
  1161. if (!this.searchKey.trim()) {
  1162. this.$message({
  1163. type: "warning",
  1164. duration: 2000,
  1165. message: "请输入搜索内容",
  1166. });
  1167. return;
  1168. }
  1169. let type = this.type;
  1170. //根据类型跳转题库或者列表页面
  1171. if (type == "1") {
  1172. this.$router.push({
  1173. path: "/course-list",
  1174. query: {
  1175. searchKey: this.searchKey,
  1176. },
  1177. });
  1178. } else if (type == "6") {
  1179. this.$router.push({
  1180. path: "/live-list",
  1181. query: {
  1182. searchKey: this.searchKey,
  1183. },
  1184. });
  1185. } else {
  1186. this.$router.push({
  1187. path: "/bank-list",
  1188. query: {
  1189. searchKey: this.searchKey,
  1190. },
  1191. });
  1192. }
  1193. },
  1194. /**
  1195. * 查看商品详情
  1196. */
  1197. goodsDetail(item, type) {
  1198. if (type === 1) {
  1199. this.$router.push({
  1200. path: "/course-detail/" + item.goodsId,
  1201. });
  1202. }
  1203. if (type === 2) {
  1204. this.$router.push({
  1205. path: "/bank-detail/" + item.goodsId,
  1206. });
  1207. }
  1208. },
  1209. educationTypeList() {
  1210. this.$request.educationTypeList().then((res) => {
  1211. this.typeList = res.rows.slice(0, 5);
  1212. this.typeList.forEach((typeItem, index) => {
  1213. this.businessList(typeItem.id, index);
  1214. });
  1215. });
  1216. },
  1217. businessList(educationId, index) {
  1218. this.$request
  1219. .businessList({ educationId })
  1220. .then((res) => {
  1221. let rows = res.rows.filter((item) => item.aliasName)
  1222. this.$set(this.slideList, index, rows);
  1223. if (rows.length >= 2) {
  1224. let newRows = rows.slice(0, 2);
  1225. let length = 0;
  1226. newRows.forEach((row) => {
  1227. let str = row.projectName + "-" + row.businessName;
  1228. length = length + str.length;
  1229. });
  1230. if (length >= 17) {
  1231. this.$set(this.typeList[index], "list", rows.slice(0, 1));
  1232. } else {
  1233. this.$set(this.typeList[index], "list", rows.slice(0, 2));
  1234. }
  1235. } else {
  1236. this.$set(this.typeList[index], "list", rows);
  1237. }
  1238. console.log('this.typeList:',this.slideList, this.typeList)
  1239. })
  1240. .catch((err) => {
  1241. console.log(err, "err");
  1242. });
  1243. },
  1244. /**
  1245. * 加入购物车
  1246. */
  1247. addCart(item) {
  1248. this.$request
  1249. .addCart({ goodsId: item.goodsId })
  1250. .then((res) => {
  1251. if (res) {
  1252. this.getCartCount();
  1253. this.$message({
  1254. message: "加入购物车成功",
  1255. type: "success",
  1256. });
  1257. }
  1258. })
  1259. .catch((err) => {
  1260. if (err.code == 500) {
  1261. this.$message({
  1262. message: err.msg,
  1263. type: "warning",
  1264. });
  1265. }
  1266. });
  1267. },
  1268. /**
  1269. * 获取推荐商品
  1270. */
  1271. getActivityList() {
  1272. this.$request
  1273. .appCommonActivityRecommendList({ platform: 2, status: 1 })
  1274. .then((res) => {
  1275. let goodsList1 = []; //推荐视频商品
  1276. let goodsList2 = []; //推荐题库商品
  1277. res.rows.forEach((item) => {
  1278. if (item.type === 1) {
  1279. goodsList1.push(item);
  1280. }
  1281. if (item.type === 2) {
  1282. goodsList2.push(item);
  1283. }
  1284. });
  1285. this.goodsList1 = goodsList1.sort((a, b) => a.sort - b.sort);
  1286. this.goodsList2 = goodsList2.sort((a, b) => a.sort - b.sort);
  1287. });
  1288. },
  1289. goCourse(item) {
  1290. console.log('sdsf', item)
  1291. if (item.topicId) {
  1292. this.$router.push({
  1293. path: "/goodsTopic",
  1294. query: {
  1295. topicId: item.topicId,
  1296. },
  1297. })
  1298. return
  1299. }
  1300. this.$router.push({
  1301. path: "/course-list",
  1302. query: {
  1303. educationId: item.educationId ? item.educationId : item.id || "",
  1304. projectId: item.projectId || "",
  1305. businessId: item.educationId ? item.id : "",
  1306. },
  1307. });
  1308. },
  1309. slideChangeTransitionStart(e) {
  1310. this.color = this.colors[this.$refs.mySwiper.swiper.realIndex];
  1311. },
  1312. advertisingList() {
  1313. this.$request
  1314. .advertisinghomeLocationList({
  1315. platform: 2, //1小程序2PC网站
  1316. status: 1,
  1317. locationKey: "home-banner", //首页轮播KEY
  1318. })
  1319. .then((res) => {
  1320. this.swiperOptions.autoplay.delay = res.data[0].intervalTime * 1000;
  1321. /**
  1322. * 如果存在-调用轮播图列表
  1323. */
  1324. if (res.data.length) {
  1325. this.$request
  1326. .advertisingList({ locationId: res.data[0].locationId })
  1327. .then((res) => {
  1328. this.bannerList = res.rows;
  1329. this.colors = res.rows.map((item) => {
  1330. return item.color ? item.color : "rgba(225,225,225,0.1)";
  1331. });
  1332. this.color = this.colors[0];
  1333. });
  1334. }
  1335. });
  1336. },
  1337. go(path, query) {
  1338. this.$router.push({
  1339. path,
  1340. query,
  1341. });
  1342. },
  1343. mouseover() {
  1344. clearTimeout(this.timer);
  1345. this.showBox = true;
  1346. },
  1347. mouseLeave() {
  1348. clearTimeout(this.timer);
  1349. this.timer = setTimeout(() => {
  1350. this.showBox = false;
  1351. }, 500);
  1352. },
  1353. login() {
  1354. this.$refs.loginForm.validate((valid) => {
  1355. if (valid) {
  1356. this.isLogin = true;
  1357. let loginForm = JSON.parse(JSON.stringify(this.loginForm));
  1358. loginForm.pwd = this.$tools.encryptor(loginForm.pwd);
  1359. console.log(this.loginForm);
  1360. this.$request
  1361. .login(loginForm)
  1362. .then((res) => {
  1363. localStorage.setItem("user_account", res.data.user_account);
  1364. localStorage.setItem("token", res.data.token);
  1365. if (res.data.full_info) {
  1366. // localStorage.setItem("user_account", res.data.user_account);
  1367. // localStorage.setItem("token", res.data.token);
  1368. this.getInfo();
  1369. } else {
  1370. this.indexUserAccount = res.data.user_account;
  1371. this.indexToken = res.data.token;
  1372. this.isLogin = false;
  1373. // 弹窗
  1374. this.bindShow = true;
  1375. }
  1376. })
  1377. .catch((err) => {
  1378. this.isLogin = false;
  1379. this.$message({
  1380. message: err.msg,
  1381. type: "error",
  1382. });
  1383. });
  1384. }
  1385. });
  1386. },
  1387. /**
  1388. * 获取登录短信
  1389. */
  1390. getLoginSms() {
  1391. this.$refs.loginSmsForm.validateField("tel", (valid) => {
  1392. if (!valid) {
  1393. if (this.countDown == 0) {
  1394. if (this.getLoginCodeLock) {
  1395. return;
  1396. }
  1397. this.getLoginCodeLock = true;
  1398. this.$request
  1399. .getLoginSms({ tel: this.loginSmsForm.tel })
  1400. .then((res) => {
  1401. this.getLoginCodeLock = false;
  1402. this.$message({
  1403. message: `验证码已发送`,
  1404. type: "success",
  1405. });
  1406. this.countDown = 60;
  1407. this.countDownTimer = setInterval(() => {
  1408. if (this.countDown == 0) {
  1409. clearInterval(this.countDownTimer);
  1410. } else {
  1411. this.countDown--;
  1412. }
  1413. }, 1000);
  1414. })
  1415. .catch((err) => {
  1416. this.$message.error(err.msg);
  1417. this.getLoginCodeLock = false;
  1418. });
  1419. }
  1420. }
  1421. });
  1422. },
  1423. /**
  1424. * 手机号登录
  1425. */
  1426. loginSms() {
  1427. this.$refs.loginSmsForm.validate((valid) => {
  1428. if (valid) {
  1429. this.isloginSms = true;
  1430. this.$request
  1431. .loginSms(this.loginSmsForm)
  1432. .then((res) => {
  1433. this.isloginSms = false;
  1434. localStorage.setItem("user_account", res.data.user_account);
  1435. localStorage.setItem("token", res.data.token);
  1436. this.$tools.setUuid(new Date().valueOf() + "");
  1437. if (res.data.full_info) {
  1438. this.getInfo();
  1439. } else {
  1440. this.indexUserAccount = res.data.user_account;
  1441. this.indexToken = res.data.token;
  1442. this.bindShow = true;
  1443. }
  1444. })
  1445. .catch((err) => {
  1446. this.isloginSms = false;
  1447. this.$message({
  1448. message: err.msg,
  1449. type: "error",
  1450. });
  1451. });
  1452. }
  1453. });
  1454. },
  1455. /**
  1456. * 消息提示
  1457. */
  1458. getmsg() {
  1459. this.$request.informUserselectLastUnStudyMsg().then((res) => {
  1460. if (res.data && res.data.id) {
  1461. let today = new Date(new Date().toLocaleDateString()).getTime();
  1462. if (localStorage.getItem("msg")) {
  1463. let ary = JSON.parse(localStorage.getItem("msg"));
  1464. if (ary.updateTime === today) {
  1465. this.msgShow = false;
  1466. return;
  1467. }
  1468. }
  1469. this.$nextTick(() => {
  1470. this.msgData = res.data;
  1471. this.msgShow = true;
  1472. });
  1473. } else {
  1474. this.msgShow = false;
  1475. }
  1476. });
  1477. },
  1478. /**
  1479. * 获取用户登录信息
  1480. */
  1481. getInfo() {
  1482. this.$request
  1483. .getInfo({fromPlat: 2})
  1484. .then((res) => {
  1485. this.loginForm = {};
  1486. this.loginSmsForm = {};
  1487. this.isLogin = false;
  1488. this.isloginSms = false;
  1489. this.setUserInfo(res.data);
  1490. this.getmsg();
  1491. })
  1492. .catch((err) => {
  1493. this.isLogin = false;
  1494. this.isloginSms = false;
  1495. this.$message({
  1496. message: err.msg,
  1497. type: "error",
  1498. });
  1499. });
  1500. },
  1501. bind() {
  1502. this.$refs.bindForm.validate((valid) => {
  1503. if (valid) {
  1504. this.isBind = true;
  1505. let bindForm = JSON.parse(JSON.stringify(this.bindForm));
  1506. bindForm.token = this.indexToken;
  1507. this.$request
  1508. .bindIdCard(bindForm)
  1509. .then((res) => {
  1510. this.isBind = false;
  1511. this.bindShow = false;
  1512. this.$message({
  1513. message: "关联成功",
  1514. type: "success",
  1515. });
  1516. localStorage.setItem("user_account", this.indexUserAccount);
  1517. localStorage.setItem("token", this.indexToken);
  1518. this.$tools.setUuid(new Date().valueOf() + "");
  1519. this.getInfo();
  1520. })
  1521. .catch((err) => {
  1522. this.isBind = false;
  1523. this.$message({
  1524. message: err.msg,
  1525. type: "error",
  1526. });
  1527. });
  1528. }
  1529. });
  1530. },
  1531. bindNext() {
  1532. this.bindShow = false;
  1533. this.indexToken = "";
  1534. this.indexUserAccount = "";
  1535. this.getInfo();
  1536. },
  1537. },
  1538. };
  1539. </script>
  1540. <!-- Add "scoped" attribute to limit CSS to this component only -->
  1541. <style scoped lang="scss">
  1542. .text_align {
  1543. text-align: center;
  1544. font-size: 18px;
  1545. margin: 40px 0px;
  1546. }
  1547. .home {
  1548. .header {
  1549. background: #ffffff;
  1550. &__header {
  1551. box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04);
  1552. .text-list {
  1553. height: 40px;
  1554. line-height: 40px;
  1555. text-align: right;
  1556. font-size: 0;
  1557. a {
  1558. color: #3f8dfd;
  1559. font-size: 14px;
  1560. padding: 0 14px;
  1561. &:nth-last-of-type(1) {
  1562. padding-right: 0;
  1563. border-left: 1px solid #3f8dfd;
  1564. }
  1565. }
  1566. }
  1567. .icon-list {
  1568. height: 40px;
  1569. line-height: 40px;
  1570. text-align: right;
  1571. font-size: 0;
  1572. a {
  1573. color: #3f8dfd;
  1574. font-size: 14px;
  1575. padding: 0 14px;
  1576. position: relative;
  1577. .icon {
  1578. font-size: 20px;
  1579. }
  1580. .modal-box {
  1581. width: 162px;
  1582. background: #ffffff;
  1583. box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.1);
  1584. border-radius: 8px;
  1585. position: absolute;
  1586. top: 34px;
  1587. left: -40px;
  1588. li {
  1589. margin-left: 10px;
  1590. border-bottom: 1px solid #eeeeee;
  1591. height: 40px;
  1592. line-height: 40px;
  1593. cursor: pointer;
  1594. padding-left: 5px;
  1595. color: #666666;
  1596. text-align: left;
  1597. &:hover {
  1598. background: #eeeeee;
  1599. color: #3f8dfd;
  1600. }
  1601. &:nth-last-of-type(1) {
  1602. border: 0;
  1603. }
  1604. }
  1605. }
  1606. }
  1607. }
  1608. }
  1609. &__body {
  1610. margin-top: 16px;
  1611. .logo {
  1612. float: left;
  1613. img {
  1614. width: 162px;
  1615. height: 33px;
  1616. }
  1617. h1 {
  1618. background: url("~@/assets/logo.png") no-repeat center;
  1619. width: 162px;
  1620. height: 33px;
  1621. }
  1622. }
  1623. .search {
  1624. float: left;
  1625. margin-left: 160px;
  1626. width: 648px;
  1627. background: #fafbfc;
  1628. border: 1px solid #3f8dfd;
  1629. border-radius: 8px;
  1630. display: flex;
  1631. overflow: hidden;
  1632. &__select {
  1633. width: 76px;
  1634. border-right: 1px solid #fff;
  1635. select {
  1636. text-align: center;
  1637. width: 100%;
  1638. height: 100%;
  1639. border: 0;
  1640. outline: none;
  1641. }
  1642. }
  1643. &__input {
  1644. flex: 1;
  1645. input {
  1646. width: 100%;
  1647. height: 100%;
  1648. }
  1649. }
  1650. &__btn {
  1651. padding: 0;
  1652. text-align: center;
  1653. width: 80px;
  1654. height: 40px;
  1655. line-height: 40px;
  1656. font-size: 14px;
  1657. border-radius: 0;
  1658. }
  1659. }
  1660. .contact {
  1661. float: right;
  1662. padding-left: 45px;
  1663. background: url("~@/assets/cus.png") no-repeat left top;
  1664. &__phone {
  1665. font-size: 18px;
  1666. font-family: Microsoft YaHei;
  1667. font-weight: bold;
  1668. color: #666666;
  1669. }
  1670. &__time {
  1671. font-size: 14px;
  1672. font-family: Microsoft YaHei;
  1673. font-weight: 400;
  1674. color: #666666;
  1675. }
  1676. }
  1677. }
  1678. }
  1679. .section {
  1680. margin-top: 40px;
  1681. .tabs {
  1682. margin-left: 324px;
  1683. .tab {
  1684. display: inline-block;
  1685. width: 138px;
  1686. height: 40px;
  1687. font-size: 16px;
  1688. text-align: center;
  1689. line-height: 40px;
  1690. color: #333;
  1691. &.active {
  1692. color: #3f8dfd;
  1693. background: #f0f5fc;
  1694. }
  1695. }
  1696. }
  1697. .swiper-wrap {
  1698. transition: background 0.3s;
  1699. height: 400px;
  1700. position: relative;
  1701. .container {
  1702. position: relative;
  1703. height: 400px;
  1704. .left-box {
  1705. position: absolute;
  1706. top: -40px;
  1707. left: 0;
  1708. height: 440px;
  1709. width: 300px;
  1710. z-index: 10;
  1711. &__header {
  1712. height: 40px;
  1713. line-height: 40px;
  1714. color: #fff;
  1715. font-size: 16px;
  1716. background: #3f8dfd;
  1717. text-align: center;
  1718. }
  1719. &__body {
  1720. position: relative;
  1721. height: 400px;
  1722. background: rgba(0, 0, 0, 0.5);
  1723. overflow: hidden;
  1724. &:hover {
  1725. overflow: visible;
  1726. .slide-list {
  1727. opacity: 1;
  1728. left: 100%;
  1729. }
  1730. }
  1731. .slide-list {
  1732. opacity: 0;
  1733. transition: all 0.3s;
  1734. width: 672px;
  1735. padding: 0;
  1736. background: rgba(255, 255, 255, 1);
  1737. position: absolute;
  1738. top: 0;
  1739. left: 0;
  1740. padding-left: 24px;
  1741. z-index: 10;
  1742. &__item {
  1743. min-height: 80px;
  1744. display: flex;
  1745. align-items: center;
  1746. border-bottom: 1px solid #ddd;
  1747. &:nth-last-of-type(1) {
  1748. border: 0;
  1749. }
  1750. .title {
  1751. cursor: pointer;
  1752. color: #fff;
  1753. width: 120px;
  1754. height: 28px;
  1755. border: 1px solid #ffffff;
  1756. border-radius: 14px;
  1757. background: #3f8dfd;
  1758. line-height: 26px;
  1759. text-align: center;
  1760. border-radius: 15px;
  1761. margin-right: 10px;
  1762. }
  1763. .nav {
  1764. flex: 1;
  1765. display: flex;
  1766. flex-wrap: wrap;
  1767. li {
  1768. margin: 9px 24px 9px 0;
  1769. display: flex;
  1770. .text {
  1771. cursor: pointer;
  1772. font-size: 14px;
  1773. font-family: Microsoft YaHei;
  1774. font-weight: 400;
  1775. color: #666;
  1776. }
  1777. }
  1778. }
  1779. }
  1780. }
  1781. .bg {
  1782. backdrop-filter: blur(10px);
  1783. position: absolute;
  1784. left: 0;
  1785. top: 0;
  1786. width: 100%;
  1787. height: 100%;
  1788. z-index: 12;
  1789. }
  1790. .list {
  1791. position: relative;
  1792. z-index: 22;
  1793. padding-left: 16px;
  1794. li {
  1795. padding: 12px 0;
  1796. height: 80px;
  1797. border-bottom: 1px solid rgba(255, 255, 255, 0.6);
  1798. display: flex;
  1799. &:nth-last-of-type(1) {
  1800. border: 0;
  1801. }
  1802. .text {
  1803. flex: 1;
  1804. &__title {
  1805. cursor: pointer;
  1806. font-size: 16px;
  1807. font-family: Microsoft YaHei;
  1808. font-weight: 400;
  1809. color: #ffffff;
  1810. }
  1811. &__desc {
  1812. margin-top: 16px;
  1813. .item {
  1814. font-size: 14px;
  1815. font-family: Microsoft YaHei;
  1816. font-weight: 400;
  1817. color: #ffffff;
  1818. margin-right: 30px;
  1819. }
  1820. }
  1821. }
  1822. }
  1823. }
  1824. }
  1825. }
  1826. .swiper {
  1827. .swiper-slide {
  1828. cursor: pointer;
  1829. height: 400px;
  1830. img {
  1831. width: 100%;
  1832. height: 100%;
  1833. }
  1834. }
  1835. .swiper-pagination {
  1836. text-align: right;
  1837. padding-right: 324px;
  1838. /deep/ .swiper-pagination-bullet {
  1839. background: rgba(255, 255, 255, 0.4);
  1840. &-active {
  1841. background: rgba(255, 255, 255, 1);
  1842. }
  1843. }
  1844. }
  1845. }
  1846. .right-box {
  1847. width: 300px;
  1848. background: rgba(0, 0, 0, 0.5);
  1849. position: absolute;
  1850. right: 0;
  1851. bottom: 0;
  1852. top: 0;
  1853. z-index: 10;
  1854. .bg {
  1855. backdrop-filter: blur(10px);
  1856. position: absolute;
  1857. left: 0;
  1858. top: 0;
  1859. width: 100%;
  1860. height: 100%;
  1861. z-index: 2;
  1862. }
  1863. .no-login {
  1864. position: relative;
  1865. z-index: 10;
  1866. .input {
  1867. margin: 16px;
  1868. height: 40px;
  1869. background: #ffffff;
  1870. border-radius: 8px;
  1871. input {
  1872. padding: 0 16px;
  1873. width: 100%;
  1874. height: 100%;
  1875. font-size: 14px;
  1876. color: #333;
  1877. &::placeholder {
  1878. color: #999;
  1879. }
  1880. }
  1881. .btn {
  1882. font-size: 14px;
  1883. font-family: Microsoft YaHei;
  1884. font-weight: 400;
  1885. color: #3f8dfd;
  1886. white-space: nowrap;
  1887. cursor: pointer;
  1888. }
  1889. }
  1890. .submit {
  1891. margin: 16px;
  1892. font-size: 16px;
  1893. margin-top: 16px;
  1894. box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.08);
  1895. display: block;
  1896. width: 268px;
  1897. }
  1898. .bottom-text {
  1899. margin: 16px;
  1900. display: flex;
  1901. justify-content: space-between;
  1902. .text {
  1903. color: #fff;
  1904. }
  1905. }
  1906. }
  1907. .has-login {
  1908. position: relative;
  1909. z-index: 10;
  1910. padding: 14px 0 0 14px;
  1911. .userinfo {
  1912. display: flex;
  1913. align-items: center;
  1914. .avatar {
  1915. width: 40px;
  1916. height: 40px;
  1917. }
  1918. .nickname {
  1919. font-size: 16px;
  1920. font-family: Microsoft YaHei;
  1921. font-weight: bold;
  1922. color: #ffffff;
  1923. margin-left: 7px;
  1924. }
  1925. }
  1926. .type-list {
  1927. display: flex;
  1928. margin-top: 28px;
  1929. padding-bottom: 14px;
  1930. border-bottom: 1px solid #fff;
  1931. &__item {
  1932. cursor: pointer;
  1933. margin-right: 38px;
  1934. .img {
  1935. width: 64px;
  1936. height: 64px;
  1937. }
  1938. .text {
  1939. text-align: center;
  1940. margin-top: 10px;
  1941. font-size: 14px;
  1942. font-family: Microsoft YaHei;
  1943. font-weight: 400;
  1944. color: #ffffff;
  1945. }
  1946. &:nth-last-of-type(1) {
  1947. margin-right: 0;
  1948. }
  1949. }
  1950. }
  1951. .history {
  1952. border-bottom: 1px solid #fff;
  1953. padding-bottom: 15px;
  1954. .btn {
  1955. margin-top: 15px;
  1956. width: 64px;
  1957. height: 24px;
  1958. border: 1px solid #ffffff;
  1959. border-radius: 8px;
  1960. text-align: center;
  1961. line-height: 24px;
  1962. color: #fff;
  1963. }
  1964. .title {
  1965. cursor: pointer;
  1966. margin-top: 15px;
  1967. padding-right: 15px;
  1968. font-size: 14px;
  1969. font-family: Microsoft YaHei;
  1970. font-weight: 400;
  1971. color: #ffffff;
  1972. }
  1973. .progress {
  1974. margin-top: 15px;
  1975. display: flex;
  1976. justify-content: space-between;
  1977. padding-right: 15px;
  1978. span {
  1979. font-size: 14px;
  1980. font-family: Microsoft YaHei;
  1981. font-weight: 400;
  1982. color: #ffffff;
  1983. }
  1984. }
  1985. }
  1986. }
  1987. }
  1988. }
  1989. }
  1990. }
  1991. .course {
  1992. background: #f5f7fa;
  1993. padding-top: 40px;
  1994. &__header {
  1995. display: flex;
  1996. align-items: center;
  1997. justify-content: space-between;
  1998. .title {
  1999. background: url("~@/assets/video.png") no-repeat left center;
  2000. padding-left: 36px;
  2001. font-size: 24px;
  2002. font-family: YouSheBiaoTiHei;
  2003. font-weight: 400;
  2004. color: #333333;
  2005. text-shadow: 0px 6px 6px rgba(249, 113, 13, 0.08);
  2006. }
  2007. }
  2008. .tabs {
  2009. margin-left: 28px;
  2010. display: flex;
  2011. align-items: center;
  2012. .tab {
  2013. cursor: pointer;
  2014. user-select: none;
  2015. // width: 88px;
  2016. padding: 0px 6px;
  2017. height: 24px;
  2018. border: 1px solid #f84e05;
  2019. border-radius: 12px;
  2020. text-align: center;
  2021. line-height: 24px;
  2022. color: #f84e05;
  2023. font-size: 14px;
  2024. margin: 0 4px;
  2025. &.active {
  2026. color: #fff;
  2027. background: #f84e05;
  2028. }
  2029. }
  2030. }
  2031. .pagination {
  2032. padding: 30px 0;
  2033. text-align: center;
  2034. }
  2035. &__body {
  2036. .list {
  2037. width: 100%;
  2038. .course-item {
  2039. float: left;
  2040. }
  2041. }
  2042. }
  2043. &__footer {
  2044. overflow: hidden;
  2045. .btn {
  2046. cursor: pointer;
  2047. width: 146px;
  2048. height: 40px;
  2049. background: #e3eaf7;
  2050. border-radius: 8px;
  2051. margin: 20px auto 40px;
  2052. color: #3f8dfd;
  2053. text-align: center;
  2054. line-height: 40px;
  2055. transition: all 0.2s;
  2056. &:hover {
  2057. color: #fff;
  2058. box-shadow: 0px 8px 4px 0px rgba(7, 82, 208, 0.08);
  2059. background: #3f8dfd;
  2060. }
  2061. }
  2062. }
  2063. }
  2064. .bank {
  2065. background: #fff;
  2066. padding-top: 40px;
  2067. &__header {
  2068. display: flex;
  2069. align-items: center;
  2070. justify-content: space-between;
  2071. .title {
  2072. background: url("~@/assets/exercise.png") no-repeat left center;
  2073. padding-left: 36px;
  2074. font-size: 24px;
  2075. font-family: YouSheBiaoTiHei;
  2076. font-weight: 400;
  2077. color: #333333;
  2078. text-shadow: 0px 6px 6px rgba(249, 113, 13, 0.08);
  2079. }
  2080. }
  2081. .tabs {
  2082. margin-left: 40px;
  2083. display: flex;
  2084. align-items: center;
  2085. .tab {
  2086. cursor: pointer;
  2087. user-select: none;
  2088. padding: 0px 6px;
  2089. // width: 88px;
  2090. height: 24px;
  2091. border: 1px solid #437cff;
  2092. border-radius: 12px;
  2093. text-align: center;
  2094. line-height: 24px;
  2095. color: #437cff;
  2096. font-size: 14px;
  2097. margin: 0 4px;
  2098. &.active {
  2099. color: #fff;
  2100. background: #437cff;
  2101. }
  2102. }
  2103. }
  2104. .pagination {
  2105. padding: 30px 0;
  2106. text-align: center;
  2107. }
  2108. &__body {
  2109. .list {
  2110. width: 100%;
  2111. .bank-item {
  2112. float: left;
  2113. }
  2114. }
  2115. }
  2116. &__footer {
  2117. overflow: hidden;
  2118. .btn {
  2119. cursor: pointer;
  2120. width: 146px;
  2121. height: 40px;
  2122. background: #e3eaf7;
  2123. border-radius: 8px;
  2124. margin: 20px auto 40px;
  2125. color: #3f8dfd;
  2126. text-align: center;
  2127. line-height: 40px;
  2128. transition: all 0.2s;
  2129. &:hover {
  2130. color: #fff;
  2131. box-shadow: 0px 8px 4px 0px rgba(7, 82, 208, 0.08);
  2132. background: #3f8dfd;
  2133. }
  2134. }
  2135. }
  2136. }
  2137. .bind {
  2138. /deep/ .el-dialog__header {
  2139. display: none;
  2140. }
  2141. /deep/ .el-dialog__body {
  2142. padding: 0;
  2143. overflow: unset;
  2144. }
  2145. &__close {
  2146. position: absolute;
  2147. right: 0;
  2148. top: -28px;
  2149. width: 24px;
  2150. height: 24px;
  2151. line-height: 24px;
  2152. text-align: center;
  2153. color: #eee;
  2154. border: 1px solid #eee;
  2155. border-radius: 50%;
  2156. }
  2157. &__header {
  2158. height: 40px;
  2159. text-align: center;
  2160. line-height: 40px;
  2161. border-bottom: 1px solid #eeeeee;
  2162. }
  2163. &__body {
  2164. height: 248px;
  2165. padding: 24px;
  2166. position: relative;
  2167. box-shadow: 0px 2px 2px 0px rgba(0, 0, 0, 0.04);
  2168. border-radius: 8px;
  2169. .submit {
  2170. width: 100%;
  2171. }
  2172. .bind-next {
  2173. font-size: 14px;
  2174. text-align: center;
  2175. color: #999;
  2176. margin-top: 10px;
  2177. cursor: pointer;
  2178. }
  2179. }
  2180. }
  2181. }
  2182. .fade-enter,
  2183. .fade-leave-to {
  2184. opacity: 0;
  2185. height: 0;
  2186. }
  2187. .fade-enter-to,
  2188. .fade-leave {
  2189. opacity: 1;
  2190. height: 122px;
  2191. }
  2192. .fade-enter-active,
  2193. .fade-leave-active {
  2194. transition: all 0.3s;
  2195. }
  2196. .dis_flex {
  2197. user-select: none;
  2198. display: flex;
  2199. align-items: center;
  2200. justify-content: center;
  2201. .dis_flex_wxloginImg {
  2202. cursor: pointer;
  2203. width: 76px;
  2204. height: 76px;
  2205. border-radius: 50%;
  2206. overflow: hidden;
  2207. background-color: #fff;
  2208. line-height: 76px;
  2209. text-align: center;
  2210. img {
  2211. vertical-align: middle;
  2212. width: 40px;
  2213. height: 40px;
  2214. }
  2215. }
  2216. }
  2217. /deep/ .el-badge__content.is-fixed {
  2218. top: 7px;
  2219. }
  2220. .dis_plays {
  2221. display: flex;
  2222. align-items: center;
  2223. }
  2224. .toolbth {
  2225. border-radius: 55px;
  2226. background-color: #fff;
  2227. color: #3f8dfd;
  2228. font-size: 14px;
  2229. padding: 5px 14px;
  2230. margin-right: 16px;
  2231. user-select: none;
  2232. cursor: pointer;
  2233. }
  2234. </style>
  2235. <style lang="scss">
  2236. .tooltipStyle {
  2237. background-color: #3f8dfd !important;
  2238. color: #fff;
  2239. }
  2240. .tooltipStyle .popper__arrow {
  2241. border-bottom-color: #3f8dfd!important;
  2242. }
  2243. .tooltipStyle .popper__arrow::after {
  2244. border-bottom-color: #3f8dfd!important;
  2245. }
  2246. </style>