Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

etcDeviceInfo.vue 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <template>
  2. <view class="wrapper">
  3. <view class="info-card">
  4. <view class="title">卡信息</view>
  5. <view class="cell">
  6. <view class="cell-left">卡号</view>
  7. <view class="cell-right">{{ card.cardNo }}</view>
  8. </view>
  9. <view class="cell">
  10. <view class="cell-left">用户姓名</view>
  11. <view class="cell-right">{{ card.userName }}</view>
  12. </view>
  13. <view class="cell">
  14. <view class="cell-left">身份证号</view>
  15. <view class="cell-right">{{ card.idNum }}</view>
  16. </view>
  17. <view class="cell">
  18. <view class="cell-left">车辆类型</view>
  19. <view class="cell-right">{{ card.type }}</view>
  20. </view>
  21. <!-- <view class="cell">
  22. <view class="cell-left">车辆用户类型</view>
  23. <view class="cell-right">{{ card.v_userType }}</view>
  24. </view> -->
  25. <view class="cell">
  26. <view class="cell-left">车牌号</view>
  27. <view class="cell-right">{{ card.vehiclePlate }}</view>
  28. </view>
  29. <view class="cell">
  30. <view class="cell-left">车牌颜色</view>
  31. <view class="cell-right">{{ card.color }}</view>
  32. </view>
  33. <view class="cell">
  34. <view class="cell-left">启用时间</view>
  35. <view class="cell-right">{{ card.startTime }}</view>
  36. </view>
  37. <view class="cell">
  38. <view class="cell-left">结束时间</view>
  39. <view class="cell-right">{{ card.endTime }}</view>
  40. </view>
  41. <view class="cell">
  42. <view class="cell-left">卡签绑定</view>
  43. <view class="cell-right">{{ card.favourable }}</view>
  44. </view>
  45. <view class="cell">
  46. <view class="cell-left">校验值</view>
  47. <view class="cell-right">{{ card.money }}</view>
  48. </view>
  49. <view class="cell">
  50. <view class="cell-left">版本号</view>
  51. <view class="cell-right">{{ card.version }}</view>
  52. </view>
  53. <view class="cell" v-if="state.cardStatus">
  54. <view class="cell-left">卡状态</view>
  55. <view class="cell-right">{{getCodeName('CARD_STATE_TYPE',state.cardStatus)}}</view>
  56. </view>
  57. <view class="cell" v-if="state.cardTypeName">
  58. <view class="cell-left">卡类型</view>
  59. <view class="cell-right">{{state.cardTypeName}}</view>
  60. </view>
  61. </view>
  62. <view class="info-card">
  63. <view class="title">OBU信息</view>
  64. <view class="cell">
  65. <view class="cell-left">obu号</view>
  66. <view class="cell-right">{{ obu.num }}</view>
  67. </view>
  68. <view class="cell">
  69. <view class="cell-left">车辆类型</view>
  70. <view class="cell-right">{{ obu.type }}</view>
  71. </view>
  72. <view class="cell">
  73. <view class="cell-left">车辆用户类型</view>
  74. <view class="cell-right">{{ obu.userType }}</view>
  75. </view>
  76. <view class="cell">
  77. <view class="cell-left">车牌号</view>
  78. <view class="cell-right">{{ obu.vehiclePlate }}</view>
  79. </view>
  80. <view class="cell">
  81. <view class="cell-left">车牌颜色</view>
  82. <view class="cell-right">{{ obu.vehiclePlateColor }}</view>
  83. </view>
  84. <view class="cell">
  85. <view class="cell-left">核定载人数</view>
  86. <view class="cell-right">{{ obu.approvedCount }}</view>
  87. </view>
  88. <view class="cell">
  89. <view class="cell-left">车辆识别代号</view>
  90. <view class="cell-right">{{ obu.vin }}</view>
  91. </view>
  92. <view class="cell">
  93. <view class="cell-left">车牌发动机号</view>
  94. <view class="cell-right">{{ obu.engineNum }}</view>
  95. </view>
  96. <view class="cell">
  97. <view class="cell-left">车轴数</view>
  98. <view class="cell-right">{{ obu.axleCount }}</view>
  99. </view>
  100. <view class="cell">
  101. <view class="cell-left">车轮数</view>
  102. <view class="cell-right">{{ obu.wheelCount }}</view>
  103. </view>
  104. <view class="cell">
  105. <view class="cell-left">轴距</view>
  106. <view class="cell-right">{{ obu.axleDistance }}</view>
  107. </view>
  108. <view class="cell">
  109. <view class="cell-left">外廓尺寸</view>
  110. <view class="cell-right">{{ obu.outsideDimensions }}mm</view>
  111. </view>
  112. <view class="cell">
  113. <view class="cell-left">启用时间</view>
  114. <view class="cell-right">{{ obu.startTime }}</view>
  115. </view>
  116. <view class="cell">
  117. <view class="cell-left">结束时间</view>
  118. <view class="cell-right">{{ obu.endTime }}</view>
  119. </view>
  120. <view class="cell">
  121. <view class="cell-left">是否激活</view>
  122. <view class="cell-right">{{ obu.isJH }}</view>
  123. </view>
  124. <view class="cell">
  125. <view class="cell-left">版本号</view>
  126. <view class="cell-right">{{ obu.version }}</view>
  127. </view>
  128. <view class="cell">
  129. <view class="cell-left">签状态</view>
  130. <view class="cell-right">{{getCodeName('OBU_STATE_TYPE',state.obuStatus)}}</view>
  131. </view>
  132. </view>
  133. <view class="btn" @click="back">返回订单列表</view>
  134. </view>
  135. </template>
  136. <script setup>
  137. import {
  138. getCodeName
  139. } from "@/datas/queryKey.js";
  140. import {
  141. reactive
  142. } from "vue";
  143. import {
  144. onLoad,
  145. onUnload
  146. } from "@dcloudio/uni-app";
  147. import {
  148. request
  149. } from "@/utils/network/request";
  150. import {
  151. obuDecrypt,
  152. cardList,
  153. searchObuInfo
  154. } from "@/utils/network/api";
  155. import {
  156. stringToJson
  157. } from "@/utils/network/encryption";
  158. import {
  159. HexToStrig,
  160. hexStringToByteArray,
  161. HexToInt
  162. } from "@/utils/util/fileData.js";
  163. import {
  164. getVehicleType
  165. } from "@/subpackage/carPark/js/vehicleType.js"
  166. import {
  167. getVehiclePlateColor
  168. } from "@/datas/vehiclePlateColor.js"
  169. const cmd = require("../../../static/etcUtil/cmdConfig.js");
  170. const tools = require("../../../static/etcUtil/tools.js");
  171. const datas = require("../../../static/etcUtil/datas.js");
  172. const bluetoothUtil = require("../../../static/etcUtil/index.js");
  173. let jyApiEtc = require("../../../static/etc/JYAPI-ETC/jy-bluetooth-obu-wechatmp.js"); //前装-金溢
  174. const card = reactive({
  175. cardNo: "",
  176. startTime: "",
  177. endTime: "",
  178. userName: "",
  179. idNum: "",
  180. vehiclePlate: "",
  181. vehiclePlateColor: "",
  182. color: "",
  183. version: "",
  184. type: "",
  185. favourable: "",
  186. money: "",
  187. v_userType: "",
  188. })
  189. const obu = reactive({
  190. num: "",
  191. startTime: "",
  192. endTime: "",
  193. version: "",
  194. approvedCount: "",
  195. axleCount: "",
  196. axleDistance: "",
  197. engineNum: "",
  198. type: "",
  199. userType: "",
  200. vehiclePlate: "",
  201. vehiclePlateColor: "",
  202. vin: "",
  203. wheelCount: "",
  204. isJH: "",
  205. outsideDimensions: "",
  206. })
  207. const state = reactive({
  208. vehicleId: "",
  209. obuStatus: "",
  210. cardStatus: "",
  211. cardTypeName: ""
  212. })
  213. onLoad((option) => {
  214. getCardId()
  215. })
  216. /**
  217. * 获取卡号
  218. */
  219. const getCardId = () => {
  220. //执行0015文件
  221. tools.showLoadingAlert("执行指令");
  222. // if (datas.getData("deviceName").includes("JY")) {
  223. // jyApiEtc.getCardInfo(function(res) {
  224. // if (res.code == '0') {
  225. // var cardInfo = res.cardInfo;
  226. // console.log("res.cardInfo", res.cardInfo)
  227. // card.cardNo = cardInfo.cardId;
  228. // card.startTime = cardInfo.signedDate;
  229. // card.endTime = cardInfo.expiredDate;
  230. // // message = "卡片方标识:" + cardInfo.provider + " 卡片类型:" + cardInfo.cardType + " 卡片版本号:" +
  231. // // cardInfo.cardVersion + " 卡号:" + cardInfo.cardId + " 启用时间:" +
  232. // // cardInfo.signedDate + " 到期时间:" + cardInfo.expiredDate + " 车牌号:" + cardInfo
  233. // // .vehicleNumber +
  234. // // " 用户类型:" + cardInfo.userType + " 车牌颜色:" + cardInfo.plateColor + " 车型:" + cardInfo
  235. // // .vehicleModel;
  236. // getObuId();
  237. // } else {
  238. // tools.alertF("获取卡片信息失败" + res.code);
  239. // }
  240. // })
  241. // } else {
  242. let cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, "00B095002B"];
  243. console.log(cmdArr);
  244. console.log(bluetoothUtil);
  245. bluetoothUtil.transCmd(cmdArr, '10', function(res) { //10:写卡 20:写OBU
  246. console.log("res====", res)
  247. var cardStr = res[2];
  248. if (cardStr == undefined || cardStr == "undefined" || cardStr == "") {
  249. tools.alertF("卡指令不符" + cardStr);
  250. return;
  251. }
  252. if (cardStr.length < 40) {
  253. tools.alertF("卡指令长度不符" + cardStr);
  254. return;
  255. }
  256. card.cardNo = cardStr.substring(24, 40)
  257. getObuId();
  258. return;
  259. let str = res[2].substring(res[2].length - 4, res[2].length); //判断是否为9000
  260. let str3 = res[3].substring(res[3].length - 4, res[3].length); //判断是否为9000
  261. if (str == "9000" || str3 == "9000") {
  262. if (res[2].length > 86 || res[3] >= 12) {
  263. console.log("res[2]", res[2].substring(84, 86), getVehiclePlateColor(parseInt(res[2]
  264. .substring(82, 84), 16)), res[2].substring(18, 19))
  265. card.cardNo = res[2].substring(20, 40);
  266. card.startTime = res[2].substring(40, 48);
  267. card.endTime = res[2].substring(48, 56);
  268. card.version = res[2].substring(18, 19) >= 4 ? "4x" : "2x";
  269. card.money = res[3].substring(0, 8);
  270. card.v_userType = parseInt(res[2].substring(80, 82), 16);
  271. console.log("card.v_userType", card.v_userType)
  272. card.vehiclePlate = HexToStrig(res[2].substring(56, 80));
  273. if (res[2].substring(18, 19) >= 4) {
  274. //4x卡
  275. card.type = getVehicleType(parseInt(res[2].substring(84, 86), 16));
  276. // card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16);
  277. card.color = getVehiclePlateColor(parseInt(res[2].substring(82, 84), 16))
  278. } else {
  279. //2x卡--获取车牌颜色
  280. card.type = "--";
  281. // card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16);
  282. card.color = getVehiclePlateColor(parseInt(res[2].substring(82, 86), 16))
  283. }
  284. state.vehicleId = card.vehiclePlate + "_" + parseInt(res[2].substring(82, 84), 16)
  285. console.log("card.color===========", card.vehiclePlate, parseInt(res[2].substring(82,
  286. 84),
  287. 16))
  288. // 读卡信息
  289. getCardList()
  290. //执行0016文件
  291. let arr = [cmd.HOME_DIRECTORY, cmd.PERSONAL_INFORMATION]
  292. bluetoothUtil.transCmd(arr, '10', function(res) {
  293. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  294. if (str2 == "9000") {
  295. if (res[1].length > 108) {
  296. card.userName = HexToStrig(res[1].substring(4, 44)); //姓名
  297. card.userName = card.userName[0] + '*'.repeat(card.userName
  298. .length - 1)
  299. card.idNum = HexToStrig(res[1].substring(44, 108)).replace(
  300. /^\d{14}/,
  301. '**************'); //身份证号码
  302. //获取是否有优惠
  303. let cmdArr3 = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd
  304. .CMD_00B08E0000
  305. ];
  306. bluetoothUtil.transCmd(cmdArr3, '10', function(res) {
  307. let str3 = res[2].substring(res[2].length - 4, res[2]
  308. .length);
  309. if (str3 == "9000") {
  310. if (res[2].length > 131) {
  311. let _str = parseInt(res[2].substring(129, 130),
  312. 16);
  313. switch (_str) {
  314. case 0:
  315. card.favourable = "否";
  316. break;
  317. case 1:
  318. card.favourable = "是";
  319. break;
  320. default:
  321. card.favourable = '未知' + "_" + _str;
  322. break;
  323. }
  324. //回调读取OBU指令
  325. getObuId()
  326. tools.hideLoadingAlert();
  327. } else {
  328. alertF("CMD_00B08E0000指令长度不符" + res[2]);
  329. }
  330. return;
  331. }
  332. alertF(cmd.PERSONAL_INFORMATION + "_" + str);
  333. })
  334. } else {
  335. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  336. }
  337. return;
  338. }
  339. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  340. })
  341. } else {
  342. alertF("CMD_READBINARY指令长度不符" + res[2]);
  343. }
  344. return;
  345. }
  346. alertF("CMD_READBINARY指令长度不符" + res[2]);
  347. })
  348. // }
  349. };
  350. /**
  351. * 获取OBU号
  352. */
  353. const getObuId = () => {
  354. tools.showLoadingAlert("执行指令");
  355. // if (datas.getData("deviceName").includes("JY")) {
  356. // jyApiEtc.getSystemInfo(function(res) {
  357. // console.log("获取OBU===", res)
  358. // if (res.code == 0) {
  359. // obu.num = res.systemInfo.serialNumber
  360. // obu.startTime = res.systemInfo.signedDate
  361. // obu.endTime = res.systemInfo.expiredDate
  362. // } else {
  363. // tools.alertF("获取OBU信息失败");
  364. // }
  365. // });
  366. // } else {
  367. let cmdArr = [cmd.HOME_DIRECTORY, cmd.OBU_SYSTEM_FILE];
  368. bluetoothUtil.transCmd(cmdArr, '20', function(res) {
  369. var obuStr = res[1];
  370. if (obuStr == undefined || obuStr == "undefined" || obuStr == "") {
  371. tools.alertF("OBU指令不符" + obuStr);
  372. return;
  373. }
  374. if (obuStr.length < 36) {
  375. tools.alertF("OBU指令长度不符" + obuStr);
  376. return;
  377. }
  378. obu.num = obuStr.substring(20, 36)
  379. let rand = datas.generateMixed(16);
  380. let arr = [cmd.OBU_DF01, cmd.OBU_00B400000A + rand + cmd.OBU_4F00];
  381. bluetoothUtil.transCmd(arr, '20', function(res) {
  382. console.log("解密信息kc没问题",res);
  383. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  384. if (str2 == "9000") {
  385. console.log("===========", obu.num, res[1].substring(0, res[1].length -
  386. 4))
  387. decryptObuVehicleInfo(obu.num, res[1].substring(0, res[1].length - 4),
  388. function(res) {
  389. console.log("obu信息", '车辆类型', res, res.substring(28, 30),
  390. HexToInt(res.substring(28, 30)));
  391. obu.approvedCount = HexToInt(res.substring(48, 54));
  392. obu.axleCount = HexToInt(res.substring(42, 44));
  393. obu.axleDistance = HexToInt(res.substring(44, 48));
  394. obu.engineNum = HexToStrig(res.substring(86, 118));
  395. obu.type = getVehicleType(HexToInt(res.substring(28, 30)));
  396. obu.userType = HexToInt(res.substring(30, 32)) == 1 ?
  397. "个人用户" :
  398. "单位用户";
  399. obu.vehiclePlate = HexToStrig(res.substring(0, 24), 2);
  400. //获取车牌颜色
  401. obu.vehiclePlateColor = getVehiclePlateColor(HexToInt(res
  402. .substring(24, 28)));
  403. obu.vin = HexToStrig(res.substring(54, 86));
  404. obu.wheelCount = HexToInt(res.substring(40, 42));
  405. obu.outsideDimensions = HexToInt(res.substring(32, 36)) +
  406. "x" +
  407. HexToInt(res.substring(36, 38)) + "x" + HexToInt(res
  408. .substring(38, 40))
  409. tools.hideLoadingAlert();
  410. });
  411. }
  412. })
  413. return;
  414. let str = res[1].substring(res[1].length - 4, res[1].length);
  415. if (str == "9000") {
  416. if (res[1].length > 52) {
  417. obu.num = res[1].substring(20, 36);
  418. obu.startTime = res[1].substring(36, 44);
  419. obu.endTime = res[1].substring(44, 52);
  420. obu.version = res[1].substring(18, 19) >= 4 ? "4x" : "2x";
  421. obu.isJH = res[1].substring(53, 54) == "1" ? "是" : res[1].substring(53, 54) == "0" ?
  422. "否" : "其他:" + res[1].substring(53, 54);
  423. let rand = datas.generateMixed(16);
  424. let arr = [cmd.OBU_DF01, cmd.OBU_00B400000A + rand + cmd.OBU_4F00];
  425. bluetoothUtil.transCmd(arr, '20', function(res) {
  426. console.log(res);
  427. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  428. if (str2 == "9000") {
  429. console.log("===========", obu.num, res[1].substring(0, res[1].length -
  430. 4))
  431. decryptObuVehicleInfo(obu.num, res[1].substring(0, res[1].length - 4),
  432. function(res) {
  433. console.log("obu信息", '车辆类型', res, res.substring(28, 30),
  434. HexToInt(res.substring(28, 30)));
  435. obu.approvedCount = HexToInt(res.substring(48, 54));
  436. obu.axleCount = HexToInt(res.substring(42, 44));
  437. obu.axleDistance = HexToInt(res.substring(44, 48));
  438. obu.engineNum = HexToStrig(res.substring(86, 118));
  439. obu.type = getVehicleType(HexToInt(res.substring(28, 30)));
  440. obu.userType = HexToInt(res.substring(30, 32)) == 1 ?
  441. "个人用户" :
  442. "单位用户";
  443. obu.vehiclePlate = HexToStrig(res.substring(0, 24), 2);
  444. //获取车牌颜色
  445. obu.vehiclePlateColor = getVehiclePlateColor(HexToInt(res
  446. .substring(24, 28)));
  447. obu.vin = HexToStrig(res.substring(54, 86));
  448. obu.wheelCount = HexToInt(res.substring(40, 42));
  449. obu.outsideDimensions = HexToInt(res.substring(32, 36)) +
  450. "x" +
  451. HexToInt(res.substring(36, 38)) + "x" + HexToInt(res
  452. .substring(38, 40))
  453. getObuList();
  454. tools.hideLoadingAlert();
  455. //提交设备信息
  456. // that.submitDeviceInfo();
  457. });
  458. //断开蓝牙
  459. bluetoothUtil.disconnectDevice();
  460. tools.showToastAlert("蓝牙已断开");
  461. console.log('蓝牙已断开=========')
  462. return;
  463. }
  464. alertF("OBU_00B400000A+rand+OBU_4F00指令长度不符" + res[1]);
  465. })
  466. } else {
  467. alertF("OBU_SYSTEM_FILE指令长度不符" + res[1]);
  468. }
  469. return;
  470. }
  471. alertF("OBU_SYSTEM_FILE指令长度不符" + res[1]);
  472. })
  473. // }
  474. };
  475. /**
  476. * 解密OBU车辆信息
  477. */
  478. const decryptObuVehicleInfo = (num, data, func) => {
  479. const options = {
  480. type: 2,
  481. data: {
  482. obuSerailNo: num,
  483. fileData: data
  484. },
  485. method: "POST",
  486. showLoading: true,
  487. };
  488. request(obuDecrypt, options).then((res) => {
  489. const data = stringToJson(res.bizContent)
  490. const FileData = data.data.FileData
  491. func(FileData)
  492. });
  493. };
  494. //返回按钮
  495. const back = () => {
  496. uni.$emit("refreshOrder");
  497. uni.switchTab({
  498. url: "/pages/order/order"
  499. })
  500. }
  501. //提示对话框
  502. const alertF = (msg) => {
  503. //隐藏加载框
  504. tools.hideLoadingAlert();
  505. //提示对话框
  506. tools.showModalAlert(msg);
  507. }
  508. const getCardList = () => {
  509. var data = {
  510. vehicleId: state.vehicleId
  511. };
  512. const options = {
  513. type: 2,
  514. data: data,
  515. method: "POST",
  516. showLoading: true,
  517. };
  518. request(cardList, options).then((res) => {
  519. let result = stringToJson(res.bizContent);
  520. state.cardStatus = result.data[0].cardStatus
  521. if (result.data[0].cardType == 1 && result.data[0].debitType == 1) {
  522. state.cardTypeName = "预存卡"
  523. } else if (result.data[0].cardType == 2) {
  524. state.cardTypeName = "储值卡"
  525. } else {
  526. state.cardTypeName = "记账卡"
  527. }
  528. console.log("152", result)
  529. })
  530. }
  531. const getObuList = () => {
  532. var data = {
  533. obuId: obu.num
  534. };
  535. const options = {
  536. type: 2,
  537. data: data,
  538. method: "POST",
  539. showLoading: true,
  540. };
  541. request(searchObuInfo, options).then((res) => {
  542. tools.hideLoadingAlert();
  543. let result = stringToJson(res.bizContent);
  544. console.log("153", result)
  545. state.obuStatus = result.data[0].obuStatus
  546. })
  547. }
  548. </script>
  549. <style scoped>
  550. .wrapper {
  551. padding-bottom: 50rpx;
  552. }
  553. .info-card {
  554. margin: 30rpx;
  555. border-radius: 16rpx;
  556. padding-bottom: 40rpx;
  557. box-shadow: 0rpx 6rpx 25rpx 0rpx rgba(0, 0, 0, 0.3);
  558. }
  559. .info-card .title {
  560. padding: 30rpx 0;
  561. font-size: 36rpx;
  562. text-align: center;
  563. color: #13E7C1;
  564. }
  565. .info-card .cell {
  566. display: flex;
  567. flex-direction: row;
  568. padding: 15rpx 40rpx;
  569. font-size: 30rpx;
  570. }
  571. .cell-left {
  572. flex: 1;
  573. text-align: left;
  574. color: #666;
  575. }
  576. .cell-right {
  577. margin-left: 30rpx;
  578. text-align: right;
  579. color: #333;
  580. overflow: hidden;
  581. }
  582. .btn {
  583. background: linear-gradient(to right, #13E7C1, #43A1E0);
  584. opacity: 1;
  585. border-radius: 100rpx;
  586. color: #fff;
  587. font-size: 30rpx;
  588. height: 80rpx;
  589. line-height: 80rpx;
  590. box-shadow: 0rpx 4rpx 11rpx 1rpx rgba(223, 223, 223, 0.5);
  591. width: 670rpx;
  592. margin: 40rpx;
  593. text-align: center;
  594. }
  595. </style>