天波h5前端应用
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

390 行
16KB

  1. <!--
  2. * @Date: 2022-04-15 10:22:36
  3. * @LastEditors: JinxChen
  4. * @LastEditTime: 2023-04-17 14:43:11
  5. * @FilePath: \TelpoH5FrontendWeb\src\views\card-info\index.vue
  6. * @description:
  7. -->
  8. <template>
  9. <div class="card-info-container" v-show="isShowPage">
  10. <van-nav-bar title="话费查询"
  11. :left-arrow="false"
  12. :border="true">
  13. </van-nav-bar>
  14. <div class="check-container">
  15. <!-- header -->
  16. <div class="header">
  17. <!-- banner -->
  18. <div class="banner">
  19. <van-image
  20. :src="logo"
  21. round
  22. >
  23. </van-image>
  24. <div class="right-message">
  25. <p>{{ setMeal.msisdn }}</p>
  26. </div>
  27. </div>
  28. <p class="padding-left">ICCID:{{ setMeal.iccid || '--' }}</p>
  29. <p class="padding-left">语音通话接听免费,免漫游费。禁止手机使用</p>
  30. <div class="action">
  31. <div class="action-item"><p>{{ setMeal.realname || '--' }}</p></div> <span> | </span> <div class="action-item"><p>{{ setMeal.cardState || '--' }}</p></div> <span> | </span> <div class="btn"><p @click="onRefresh">刷新</p></div>
  32. </div>
  33. </div>
  34. <!-- 套餐详情 -->
  35. <div class="card-details">
  36. <div class="set-meal">
  37. <p class="font-orange">{{ setMeal.expireTime || '--' }}</p>
  38. <p>套餐到期时间</p>
  39. </div>
  40. <div class="set-meal">
  41. <p class="font-orange">{{ setMeal.residueVoiceData || '--' }}</p>
  42. <p>剩余语音(分钟)</p>
  43. </div>
  44. <div class="set-meal" v-show="false">
  45. <p class="font-orange">{{ setMeal || '--' }}</p>
  46. <p>套餐流量(M)</p>
  47. </div>
  48. <div class="set-meal">
  49. <p class="font-orange">{{ setMeal.residueFlow || '--' }}</p>
  50. <p>剩余流量(M)</p>
  51. </div>
  52. </div>
  53. <!-- 套餐操作 -->
  54. <div class="card-details-menu">
  55. <div class="meal-item" @click="onMealBuy">
  56. <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAADgUlEQVRYR+2XTWhUVxTH/+cl5IPQUhG0ASlWWoRaF22hSDeCRUT6gV+LUnEkQt+5b9GAUdRu2odupGDEQOa9+1IKRgUZLZUq1I1SF10VFdSNFqGKdBZtJ0UYTWi5R26ZFJmMvnvnRVDJ3QzDPR+/9z9zzpxHeMoPPeV8mAMsWqFnT8Esyz43xmxoevJTSqlDRdVox3+Ggs2ARPQaAGHmV9pJUNQnt8Ra6whA2RjzahRFvxVN6OvvArgcwBUR2aKUOuqboKh9LqCIUJZlfwI4wcyqaEJf/1xAGzBN09NEtISZl/kmKGrvBKi13gVgv4icICIpmrSVPxGdDsPwWPOdE2CWZe+JyM8AqgD+nmXAAMBSAEeYudQWYKVS6ZqYmLBgZWbeOZuASZKsCoLgnJ29URR93xagddJa/wSgh5lXzCZgmqYJEW3u6upaMDAwMNk2YJZl+0RkN4CXmPleA/pTAB94At9m5i+sT6VS6ajVar8DOKeUsrFmHKffoPXKsmyNiJw1xrwfRdH5BuBXAFoGfgy0BVxt7/PKa22cAUdGRl7s7u6uEdHeMAz3eqrW0ny6vPV6feHQ0ND9Qgo2FLsIoDatQBFIl/J6KdgAtBvNtmq1Oi+O43+TJFkcBEEsIp15sEQ0NTU1tWdwcPAP1/J6A46NjW0yxthh/W4Yhr+Uy+V3Ojo6jgDIBQRgO3Q9M9+0iV3K6w04Ojr6cmdnp+26Hcx8ME+1R927ltcbsFHmX0XkqlKqeal15nXp3ulgzl087aC1/haAhTvrTDTT8A0Aix/XvW0Dpmk6QEQW8haA/wZ2m+ckM3+Z5+utYJqmrxPRDQCfMfM3eQmK3vsC2uV1nTGmQkR2/bdz0eX0AvirsVKdsu84Lk5eTRLHcdDf32/3tU9EZIKI7Gh5oZHseouk9uHtGkUichfAP0Q0H8DxarW6OY5j4wLprGCapiUiOiwie5j560ZH7yIiu8huVUqNP5zQ1/5RsD6A3xHRm8xsVfn/aK2vi8g1pdTGJkAv+9kAtO8li5j5rSbAyyJyRyn1UROgl31hQK31dgAHjDEfR1F0xgZMkuTDIAh+aPXP4mtfGHB4eLi3r6/vAoC3RcR+gohWArhUr9dXNq9LvvaFAW2A8fHxvsnJyR3GmLX2exAEP/b09BwolUr1Vgl87VvFcG4Sl5HwJGzmAIuqOqfgc6/gA38wwThLucAeAAAAAElFTkSuQmCC" alt=""/>
  57. <p>套餐订购</p>
  58. </div>
  59. <div class="meal-item" @click="onRecordCheck">
  60. <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAD6UlEQVRYR+2YXWgcVRiG3+9sshtSiUaKmFAvSlEReiFuKSKWoNbUm17401DFH0KTOWdCDLheCHrhoCBi1MhKMnMmCaEJuZFaGhRrTVFaQW8MXigiFmqVyipYwRKM7GTOJyfsStimmbS72QbN3C3n7JyH9/t5vzOEDf7QBufDJmC1EdpUsFLBfD7fkk6n3wVwVCk1k6RwooJa605mlgBuTHpZ5ToRMRGNO44zbde01lsBfAwgCyBi5oNKqaOrvXdVQAsH4DiA88x8thrA8fHx9sXFxU8AbGfmZwAMENHdSZCrAgZB8D4R7Uqn07d3d3f/faWA5f2jo6Pb4zg+SUS3MPNepdTp4eHh61Kp1EclyAOXC3cS4Gf2EKXUfVXA3WGMmWXmrUSUATAkpcyVQn4AwHvMPKmUsqpe8qwr4MjISLahoeE4MxejKNrX2Nh4CMBzFjKVSh2L49iufVcsFh8YGBi4WFdArfW9AD4EcCGO4wf7+vqWclhr/XYJMgLwQxRFHf39/RcuF6F1UTAMw33MbKvznDGm03XdX8oAvu/vFEJ8ZQsPwB4pZeGqqzgIgivOQd/3HxVCTBPRt8z8kJTy9zKA1noHgM8BxMaYPa7rnkvK7ZoqqLW2iT7GzF8S0X4p5Z/LKnmbMcbCNQPokFJ+nwRn12sGGATBs0T0DjPPEtEjUsq/loX1JiHEKQA3G2Pud13367XA1QxQa/0SgFetfRUKhSc8zyuWAYaGhm5obm7+FMBtRNTpOM4XYRiOGWNsazmdBFq1gkEQ5IjoLQCHW1tbD3V1dcXlQwcHB7e0tLRY97jLhtxxnJM2alprw8wvK6VeWVdAz/NEW1vbTwC2WY8tFAoPe5635Dj5fD6TyWRsm+kA0CWlPFaCqR9gGIZ7bc4xs63agwBmLSSAxfb29iPGmP1CiKfLw8K1ADxsIYrFYltTU9PjzDxmIQH8AcD+7lNKBRVhrI+Ck5OTWxYWFn4FMC2lVBMTE01RFE3Y6aQE9IKU8o2V7LUuORgEwZNENMXMLwohdjDzYwCuB/AzM7+plLJD6Yr2WhdArfUJAHZeBDNfJKIjQoipnp6eU3ZQXaU66xNirfUMETUAmJqfn5/J5XILSS2j7kWyRqDKbfVR8CrhltyrLjm4YQCJ6B4A/04lSWC2sh3HeV5rbW+C1sqW22lhbm5uVzabLdbM6ojoVgBlm0risxV9Qin1ge/7u4UQT1UCSilf+1+FuCbXzuWyl0b+bwD0SymHk0Kyrhf3S/oLkT3vTvtVQQixs7e397eqAO2fq/n0sQKgdZgfmfl1pdSZJLilnrSWTddyzyZgtepvKvifV/Af4cRYRyl1cksAAAAASUVORK5CYII=" alt=""/>
  61. <p>订购记录</p>
  62. </div>
  63. </div>
  64. <div class="tips-container">
  65. <p>注:</p>
  66. <p>通话结束后,剩余语音时长需1小时后才更新。</p>
  67. </div>
  68. </div>
  69. </div>
  70. </template>
  71. <script>
  72. import APIWx from "@/api/wx";
  73. import { APIPay } from "@/api/pay";
  74. import { isNotNull } from "@/utils/index";
  75. import APICore from "@/api/core";
  76. import AppId from "@/config/appId";
  77. export default {
  78. name:'cardInfo',
  79. inject: ["reload"],
  80. data(){
  81. return {
  82. //套餐信息
  83. setMeal: {
  84. expireTime: '', //套餐过期时间
  85. residueVoiceData: '', //剩余语音
  86. availableData: '', //流量套餐
  87. residueFlow: '', //剩余流量
  88. iccid: this.$route.query.iccid, //iccid
  89. cardState: '', //卡激活状态
  90. realname: '', //是否已实名 1是 0 否
  91. msisdn: '', //msisdn
  92. isUnicom: null, //是否是联通
  93. },
  94. isShowMenu: this.$route.query.isShowMenu,
  95. params: {},
  96. isShowPage: false, //是否显示整个页面
  97. }
  98. },
  99. computed: {
  100. // 顶部图标
  101. logo(){
  102. if(this.setMeal.isUnicom !== null) {
  103. return this.setMeal.isUnicom ? require('@/assets/img/unicom.png') : require('@/assets/img/yidong_logo.png')
  104. } else {
  105. return null
  106. }
  107. }
  108. },
  109. created() {
  110. this.getAuth();
  111. this.getToken();
  112. this.getParams();
  113. this.getCardInfo();
  114. },
  115. methods: {
  116. // 获取core token
  117. getAuth() {
  118. let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650";
  119. APICore.getAuth({ manufactorId: manufactorId }).then(res => {
  120. this.$store.commit("gatewayToken", res.data.data);
  121. });
  122. },
  123. // 获取token
  124. getToken() {
  125. let manufacturerNo = '9f166b07-ff83-4991-84dc-ca6ad4a6b95b';
  126. APIPay.getToken(manufacturerNo).then(res => {
  127. console.log("token的数据", res.data)
  128. let data = res.data;
  129. if(data.code === 20000) {
  130. this.$store.commit("token", data.token);
  131. console.log("token的数据", localStorage.getItem('token'))
  132. }
  133. })
  134. },
  135. // 获取url传过来的参数
  136. getParams() {
  137. let params = this.$route.query;
  138. if (params) {
  139. this.params = {...params};
  140. let url = window.location.href.split("?code=")[1];
  141. if ( isNotNull(url) || window.location.href.indexOf("code") > -1) {
  142. let timeStamp = new Date().getTime();
  143. let code = url.split("&")[0];
  144. if (isNotNull(code)) {
  145. this.isShowPage = true;
  146. this.getOpenId(code);
  147. } else {
  148. this.$dialog({
  149. message: '系统繁忙,请重新进入'
  150. })
  151. }
  152. } else {
  153. this.getWxCode();
  154. }
  155. }
  156. },
  157. getWxCode() {
  158. let params = this.params;
  159. let commonUrl = process.env.VUE_APP_BASE_API;
  160. let redUrl = encodeURIComponent(`${commonUrl}/h5-frontendweb/#/cardInfo?imei=${params.imei}&iccid=${params.iccid}`);
  161. let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${AppId}&redirect_uri=${redUrl}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect`;
  162. window.location.href = url;
  163. },
  164. // 根据code获取openId
  165. getOpenId(code) {
  166. let openId = this.$store.getters.openId;
  167. APIPay.getOpenId(code).then(res => {
  168. let data= res.data;
  169. if(data.code === 20000) {
  170. this.$store.commit("openId", data.data.openId);
  171. }else if (data.state === false) {
  172. console.log("token过期");
  173. this.getToken();
  174. this.getOpenId(this.code);
  175. }
  176. })
  177. },
  178. //获取小台风物联网卡信息
  179. getCardInfo() {
  180. if( !this.isShowPage ) {return}
  181. this.$toast.loading({ message: '查询中...' });
  182. let reqBody = {
  183. imei: this.$route.query.imei,
  184. iccid: '' || this.$route.query.iccid
  185. }
  186. APIWx.GetCardInfo(reqBody)
  187. .then(res => {
  188. let data = res.data;
  189. if (data.stateCode === 1 ) {
  190. let item = data.data;
  191. this.setMeal.expireTime = this.$dayjs(item.expireTime).format("YYYY-MM-DD");
  192. this.setMeal.residueVoiceData = item.availableVoiceData;
  193. this.setMeal.residueFlow = item.availableData;
  194. this.setMeal.cardState = item.cardState;
  195. this.setMeal.realname = Number(item.realname) === 1 ? '已实名' : '未实名';
  196. this.setMeal.msisdn = item.msisdn;
  197. // 截取msisdn 前三位, 148 是移动,其它都是联通
  198. this.setMeal.isUnicom = item.msisdn.slice(0,3) === '148' ? false : true;
  199. this.$toast.success({
  200. message: "查询成功",
  201. duration: 1500
  202. });
  203. }
  204. })
  205. .catch(error => {
  206. console.log("接口报错了", error);
  207. }).finally(() => {
  208. this.$toast.clear();
  209. })
  210. },
  211. // 返回
  212. onNavBack() {
  213. /* this.$router.push({ name: 'device'}); */
  214. },
  215. // onRefresh 刷新
  216. onRefresh() {
  217. this.reload();
  218. },
  219. // 购买套餐
  220. onMealBuy() {
  221. this.$router.replace({
  222. name: 'packageBuy',
  223. query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu}
  224. })
  225. },
  226. // 订购记录
  227. onRecordCheck () {
  228. this.$router.replace({
  229. name: 'buyRecord',
  230. query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu}
  231. })
  232. }
  233. }
  234. }
  235. </script>
  236. <style scoped lang="scss">
  237. .card-info-container {
  238. max-height: 100vh;
  239. width: 100%;
  240. position: relative;
  241. background-color: #fff;
  242. p {
  243. font-size: 16px;
  244. color: #9B9B9B;
  245. }
  246. .check-container {
  247. height: calc(100vh - 88px);
  248. padding: 8px 10px;
  249. display: flex;
  250. justify-content: flex-start;
  251. align-items: center;
  252. flex-direction: column;
  253. .header {
  254. height: 200px;
  255. width: 100%;
  256. display: flex;
  257. justify-content: space-around;
  258. flex-direction: column;
  259. align-items: flex-start;
  260. border: 1px solid #fff;
  261. box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px;
  262. .padding-left {
  263. padding-left: 10px;
  264. }
  265. .banner {
  266. height: 75px;
  267. margin: 10px 0;
  268. padding-left: 5px;
  269. display: flex;
  270. justify-content: flex-start;
  271. align-items: center;
  272. .van-image {
  273. height: 75px;
  274. width: 75px;
  275. border: 5px solid #E0EEFF;
  276. }
  277. .right-message {
  278. text-align: center;
  279. margin-left: 10px;
  280. p {
  281. font-size: 18px;
  282. color: #64A9FF;
  283. }
  284. }
  285. }
  286. .action {
  287. height: 35px;
  288. text-align: center;
  289. padding-left: 10px;
  290. width: 100%;
  291. display: flex;
  292. justify-content: flex-start;
  293. align-items: center;
  294. p {
  295. font-size: 16px;
  296. color: #64A9FF;
  297. }
  298. span {
  299. display: block;
  300. color: #9B9B9B;
  301. font-size: 16px;
  302. padding: 0 8px;
  303. }
  304. .btn {
  305. height: 25px;
  306. width: 75px;
  307. line-height: 25px;
  308. text-align: center;
  309. background-color: #64A9FF;
  310. border-radius: 10px;
  311. p {
  312. color: #fff;
  313. }
  314. }
  315. }
  316. }
  317. .card-details {
  318. height: 75px;
  319. width: 100%;
  320. display: flex;
  321. justify-content: space-between;
  322. align-items: center;
  323. margin-top: 20px;
  324. border: 1px solid #fff;
  325. box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px;
  326. .set-meal {
  327. flex: 1;
  328. height: 50px;
  329. display: flex;
  330. justify-content: center;
  331. align-items: center;
  332. flex-direction: column;
  333. p {
  334. font-size: 16px;
  335. padding: 5px 0;
  336. }
  337. .font-orange {
  338. color: orange;
  339. }
  340. }
  341. .set-meal:nth-of-type(2) {
  342. border-left: 1px solid #DDDDDD;
  343. border-right: 1px solid #DDDDDD;
  344. }
  345. }
  346. .card-details-menu {
  347. height: 75px;
  348. width: 100%;
  349. display: flex;
  350. justify-content: flex-start;
  351. align-items: center;
  352. margin-top: 20px;
  353. border: 1px solid #fff;
  354. box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px;
  355. .meal-item {
  356. flex: 1;
  357. display: flex;
  358. justify-content: center;
  359. align-items: center;
  360. flex-direction: column;
  361. padding-left: 10px;
  362. img {
  363. height: 45px;
  364. width: 40px
  365. }
  366. p {
  367. font-size: 14px;
  368. padding: 5px 0;
  369. }
  370. }
  371. }
  372. .tips-container {
  373. width: 100%;
  374. display: flex;
  375. justify-content: flex-start;
  376. align-items: flex-start;
  377. flex-direction: column;
  378. p {
  379. margin: 10px;
  380. color: red;
  381. }
  382. }
  383. }
  384. }
  385. </style>