index.vue 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. <template>
  2. <view class="container">
  3. <image class="topImg" src="../static/img/img02.png" mode="widthFix"></image>
  4. <view class="contentBox">
  5. <view class="btoomBg"></view>
  6. <view class="topBg">
  7. <image class="leftIcon" src="../static/img/img06.png" mode="widthFix"></image>
  8. <image class="topImg" src="../static/img/img08.png" mode="widthFix"></image>
  9. <view class="tpConent">
  10. <view class="tpRight"><view class="textBox" @click="nextTo('/pages/activity/index')">活动细则</view></view>
  11. <view class="erweima">
  12. <image :src="erweima" mode=""></image>
  13. </view>
  14. <view class="Etitle">
  15. 识别母婴健康专委会公众号查看中奖详情
  16. </view>
  17. <view class="tpTitle">评选活动</view>
  18. <view class="endTextBox flex">
  19. <view class="leftLine"><view class="roundness"></view></view>
  20. <view class="textLine">距离活动结束还有</view>
  21. <view class="rightLine"><view class="roundness"></view></view>
  22. </view>
  23. <view class="down">
  24. <u-count-down
  25. separator="zh"
  26. font-size="32"
  27. separator-color="#666666"
  28. separator-size="32"
  29. bg-color="#D7272B"
  30. color="#FFFFFF"
  31. :show-border="false"
  32. :timestamp="timestamp"
  33. @end="stopTime"
  34. ></u-count-down>
  35. </view>
  36. <view class="tjContent flex">
  37. <view class="tjItem">
  38. <view class="topText">
  39. {{ item.pepole }}
  40. <text class="iconTip">人</text>
  41. </view>
  42. <view class="bottomText">参与者</view>
  43. </view>
  44. <view class="tjItem">
  45. <view class="topText">
  46. {{ item.votes }}
  47. <text class="iconTip">票</text>
  48. </view>
  49. <view class="bottomText">投票数</view>
  50. </view>
  51. <view class="tjItem">
  52. <view class="topText">
  53. {{ item.count }}
  54. <text class="iconTip">次</text>
  55. </view>
  56. <view class="bottomText">浏览量</view>
  57. </view>
  58. </view>
  59. <view class="input flex">
  60. <u-input
  61. type="select"
  62. v-model="input.value"
  63. confirm-type="search"
  64. @confirm="searchProduct"
  65. placeholder="请输入选手姓名和编号"
  66. :height="input.height"
  67. :type="input.type"
  68. />
  69. <u-icon color="#999999" class="iconT" @click="searchProduct" name="search"></u-icon>
  70. </view>
  71. <view class="tabsBox"><u-tabs :list="list" active-color="#D7272B" :is-scroll="false" :current="rank" @change="changeRank"></u-tabs></view>
  72. <!-- 最新 -->
  73. <view v-if="rank == 0" class="itemList flex">
  74. <view class="itemData" v-for="item in userlist.list">
  75. <view class="itemContentBox" @click="nextTo('/pages/activity/userInfo?id='+item.id)">
  76. <view class="itemImgbox">
  77. <view class="iconBox">
  78. <view>{{ item.sub_id }}</view>
  79. <view>号</view>
  80. </view>
  81. <image class="itemImg" :src="item.avatar" mode="scaleToFill"></image>
  82. <view class="itemAddress clamp" v-if="item.type==2">{{ item.company }}</view>
  83. </view>
  84. <view class="itemNameBox flex">
  85. <view class="itemName">{{ item.name }}</view>
  86. <view class="itemVote">{{ item.vote }}票</view>
  87. </view>
  88. </view>
  89. <view class="itemBottom" @click="chargeConfirm(item)">投票</view>
  90. </view>
  91. </view>
  92. <u-loadmore v-if="rank == 0" :status="userlist.loadingType" />
  93. <!-- 产康师排行 -->
  94. <view class="phItemList" v-if="rank == 1">
  95. <view class="phItem flex" v-for="(item, ind) in phlist.list">
  96. <view class="icon">
  97. <image v-if="ind == 0" class="tipImg" src="../static/img/rank1.png" mode="widthFix"></image>
  98. <image v-if="ind == 1" class="tipImg" src="../static/img/rank2.png" mode="widthFix"></image>
  99. <image v-if="ind == 2" class="tipImg" src="../static/img/rank3.png" mode="widthFix"></image>
  100. <view class="tipText" v-if="ind > 2">{{ ind }}</view>
  101. </view>
  102. <view class="flex phRightBox">
  103. <view class="avatarBox"><image class="avatarImg" :src="item.avatar" mode="scaleToFill"></image></view>
  104. <view class="phTextBox">
  105. <view class="phTtemName">{{ item.name }}</view>
  106. <view class="phItemAddress" v-if="item.type==2">{{ item.company }}</view>
  107. </view>
  108. <view class="phRight flex">
  109. <text class="textVote">{{ item.vote }}</text>
  110. <image class="phTipImg" src="../static/img/level.png" mode="widthFix"></image>
  111. </view>
  112. </view>
  113. </view>
  114. </view>
  115. <u-loadmore v-if="rank == 1" :status="phlist.loadingType" />
  116. <!-- 母乳喂养排行 -->
  117. <view class="phItemList" v-if="rank == 2">
  118. <view class="phItem flex" v-for="(item, ind) in mrlist.list">
  119. <view class="icon">
  120. <image v-if="ind == 0" class="tipImg" src="../static/img/rank1.png" mode="widthFix"></image>
  121. <image v-if="ind == 1" class="tipImg" src="../static/img/rank2.png" mode="widthFix"></image>
  122. <image v-if="ind == 2" class="tipImg" src="../static/img/rank3.png" mode="widthFix"></image>
  123. <view class="tipText" v-if="ind > 2">{{ ind }}</view>
  124. </view>
  125. <view class="flex phRightBox">
  126. <view class="avatarBox"><image class="avatarImg" :src="item.avatar" mode="scaleToFill"></image></view>
  127. <view class="phTextBox">
  128. <view class="phTtemName">{{ item.name }}</view>
  129. <view class="phItemAddress" v-if="item.type==2">{{ item.company }}</view>
  130. </view>
  131. <view class="phRight flex">
  132. <text class="textVote">{{ item.vote }}</text>
  133. <image class="phTipImg" src="../static/img/level.png" mode="widthFix"></image>
  134. </view>
  135. </view>
  136. </view>
  137. </view>
  138. <u-loadmore v-if="rank == 2" :status="mrlist.loadingType" />
  139. <!-- 母乳喂养排行 -->
  140. <view class="phItemList" v-if="rank == 3">
  141. <view class="phItem flex" v-for="(item, ind) in mylist.list">
  142. <view class="icon">
  143. <image v-if="ind == 0" class="tipImg" src="../static/img/rank1.png" mode="widthFix"></image>
  144. <image v-if="ind == 1" class="tipImg" src="../static/img/rank2.png" mode="widthFix"></image>
  145. <image v-if="ind == 2" class="tipImg" src="../static/img/rank3.png" mode="widthFix"></image>
  146. <view class="tipText" v-if="ind > 2">{{ ind }}</view>
  147. </view>
  148. <view class="flex phRightBox">
  149. <view class="avatarBox"><image class="avatarImg" :src="item.avatar" mode="scaleToFill"></image></view>
  150. <view class="phTextBox">
  151. <view class="phTtemName">{{ item.name }}</view>
  152. <view class="phItemAddress" v-if="item.type==2">{{ item.company }}</view>
  153. </view>
  154. <view class="phRight flex">
  155. <text class="textVote">{{ item.vote }}</text>
  156. <image class="phTipImg" src="../static/img/level.png" mode="widthFix"></image>
  157. </view>
  158. </view>
  159. </view>
  160. </view>
  161. <u-loadmore v-if="rank == 3" :status="mylist.loadingType" />
  162. </view>
  163. </view>
  164. </view>
  165. <view class="alertAddBox flex">
  166. <view class="textAlertBox">
  167. <view class="psBox">
  168. <image class="psImgIcon" src="../static/img/alertPIcon.png" mode="widthFix"></image>
  169. <text>{{ myVote }}</text>
  170. </view>
  171. <view>剩余票数</view>
  172. </view>
  173. <view class="addUser" @click="pushUserData">我要参与</view>
  174. </view>
  175. <u-popup border-radius="20" width="540" v-model="showAlert" mode="center">
  176. <view class="alertBox">
  177. <image class="titleImg" src="../static/img/alertbg.png" mode="widthFix"></image>
  178. <view class="title">参赛类型</view>
  179. <view class="titleTip">请选择您的参赛身份类型</view>
  180. <view class="lxTtem flex" @click="csType = 0">
  181. <view class="leftTitle flex">
  182. <image class="leftImgTip" src="../static/img/user.png" mode="heightFix"></image>
  183. <text>个人参赛</text>
  184. </view>
  185. <view class="rightTip flex"><view v-if="csType == 0" class="xzTip"></view></view>
  186. </view>
  187. <view class="lxTtem flex" @click="csType = 1">
  188. <view class="leftTitle flex">
  189. <image class="leftImgTip" src="../static/img/userAll.png" mode="heightFix"></image>
  190. <text>企业参赛(我有所属企业)</text>
  191. </view>
  192. <view class="rightTip flex"><view v-if="csType == 1" class="xzTip"></view></view>
  193. </view>
  194. <view class="pushtyle" @click="pushBm">确认</view>
  195. </view>
  196. </u-popup>
  197. <u-popup border-radius="20" v-model="showCharge" mode="bottom">
  198. <view class="alertChargeBox">
  199. <view class="alertCharge flex">
  200. <view class="chargeItem" :class="{ actionCharge: ind == moneyIndex }" v-for="(ls, ind) in voteNumList" @click="moneyIndex = ind">
  201. <view class="chargeImgIcon">{{ ls.num }}票</view>
  202. <view class="chargeImgBox"><image class="chargeImg" :src="'../static/img/chargeIcon' + (ind + 1) + '.png'" mode="widthFix"></image></view>
  203. <view class="chargeTextBox flex">
  204. <image class="chargeIcon" src="../static/img/moneyIcon.png" mode="scaleToFill"></image>
  205. <text>{{ ls.num }}</text>
  206. </view>
  207. </view>
  208. </view>
  209. <view class="flex chargeButtom">
  210. <view class="left flex">
  211. <image class="chargeIcon" src="../static/img/moneyIcon.png" mode="scaleToFill"></image>
  212. <text class="num">¥{{ payMoneyNum }}</text>
  213. <text class="tip">可为选手加{{ voteNumList[moneyIndex].num }}票</text>
  214. </view>
  215. <view class="right" @click="payLoding ? false : commitCharge()">赠送</view>
  216. </view>
  217. </view>
  218. </u-popup>
  219. </view>
  220. </template>
  221. <script>
  222. import { ptDetail, ptJoin, ptPush, rechargeWechat } from '@/api/tp.js';
  223. import weixinObj from '@/plugin/jweixin-module/index.js';
  224. import { shareLoad } from '@/utils/wxAuthorized.js';
  225. import {
  226. share
  227. } from '@/api/wx';
  228. export default {
  229. data() {
  230. return {
  231. timestamp: 600000,
  232. // 拼团信息
  233. item: {
  234. pepole: 20,
  235. votes: 20,
  236. count: 20
  237. },
  238. // 搜索框
  239. input: {
  240. value: '',
  241. type: 'text',
  242. height: 60
  243. },
  244. // 最新列表
  245. userlist: {
  246. list: [],
  247. page: 1,
  248. limit: 10,
  249. loadingType: 'loadmore'
  250. },
  251. // 产康师排行
  252. phlist: {
  253. list: [],
  254. page: 1,
  255. limit: 10,
  256. loadingType: 'loadmore'
  257. },
  258. // 喂养师排行
  259. mrlist: {
  260. list: [],
  261. page: 1,
  262. limit: 10,
  263. loadingType: 'loadmore'
  264. },
  265. // 护理师排行
  266. mylist: {
  267. list: [],
  268. page: 1,
  269. limit: 10,
  270. loadingType: 'loadmore'
  271. },
  272. /* 选中的类型0为最新1为排行 */
  273. rank: 0,
  274. // 切换列表
  275. list: [
  276. {
  277. name: '最新'
  278. },
  279. {
  280. name: '产康师'
  281. },
  282. {
  283. name: '喂养师'
  284. },
  285. {
  286. name: '护理师'
  287. }
  288. ],
  289. voteNumList: [
  290. {
  291. num: 1
  292. },
  293. {
  294. num: 3
  295. },
  296. {
  297. num: 5
  298. },
  299. {
  300. num: 10
  301. },
  302. {
  303. num: 20
  304. },
  305. {
  306. num: 50
  307. },
  308. {
  309. num: 100
  310. },
  311. {
  312. num: 200
  313. }
  314. ],
  315. //参赛类型
  316. csType: 0, //0个人 1企业
  317. showAlert: false, //显示参赛弹窗
  318. showCharge: false, //显示投票弹窗
  319. moneyIndex: 0, //当前选中的投票对象
  320. priceBl: 1, //默认1票对应金额投票比例
  321. chargeUserItem: {}, //当前选中的投票对象
  322. timeStop: false, //判断倒计时是否结束
  323. dayFree: '', //可投票数
  324. dayFreeVote: '', //已投票数
  325. payLoding: false, //是否微信充值
  326. activtyName: '', //活动标题
  327. erweima: '',//首页分享二维码
  328. };
  329. },
  330. computed: {
  331. // 我剩余可投票数
  332. myVote() {
  333. return this.dayFree - this.dayFreeVote;
  334. },
  335. // 需要支付的金额
  336. payMoneyNum() {
  337. return this.voteNumList[this.moneyIndex].num * this.priceBl;
  338. }
  339. },
  340. watch: {
  341. rank(newValue, oldValue) {
  342. let data = {};
  343. let rank = 0;
  344. let job = '';
  345. // 判断是否为最新
  346. if (newValue == 0) {
  347. data = this.userlist;
  348. rank = 0;
  349. } else {
  350. rank = 1;
  351. }
  352. // 判断是否为产康师排行
  353. if (newValue == 1) {
  354. data = this.phlist;
  355. job = '产康师';
  356. }
  357. // 判断是否为母乳喂养排行
  358. if (newValue == 2) {
  359. data = this.mrlist;
  360. job = '母乳喂养指导师';
  361. }
  362. // 判断是否为母乳喂养排行
  363. if (newValue == 3) {
  364. data = this.mylist;
  365. job = '母婴护理师';
  366. }
  367. this.getData(data, rank, job);
  368. }
  369. },
  370. onLoad() {
  371. this.loadShare();
  372. },
  373. onShow() {
  374. this.init();
  375. },
  376. // 页面下拉到底部加载
  377. onReachBottom() {
  378. this.ptJoin();
  379. },
  380. methods: {
  381. loadShare() {
  382. // 请求获取默认数据
  383. shareLoad();
  384. share({}).then(({data}) =>{
  385. console.log(data,'fengxiang')
  386. this.erweima = data.data.qr
  387. })
  388. },
  389. init() {
  390. this.ptDetail();
  391. this.ptJoin();
  392. },
  393. // 倒计时结束
  394. stopTime() {
  395. this.timeStop = true;
  396. },
  397. //开始投票
  398. async commitCharge() {
  399. // 创建对象
  400. let payType, num;
  401. // 判断是否有剩余投票次数
  402. if (this.myVote > 0) {
  403. payType = 'free';
  404. num = 1;
  405. } else {
  406. payType = 'yue';
  407. num = this.voteNumList[this.moneyIndex].num;
  408. await this.payMoney();
  409. }
  410. uni.showLoading({
  411. title: '投票中',
  412. mask: true
  413. });
  414. ptPush(
  415. {
  416. num,
  417. payType
  418. },
  419. this.chargeUserItem.id
  420. )
  421. .then(e => {
  422. uni.hideLoading();
  423. if (e.msg == '余额支付成功' || e.msg == '投票成功') {
  424. uni.showToast({
  425. title: '投票成功!'
  426. });
  427. // 修改当前用户获得的票数
  428. this.chargeUserItem.vote += num;
  429. if (e.msg == '投票成功') {
  430. // 修改当前可投票数
  431. this.dayFree -= num;
  432. }
  433. } else {
  434. this.showCharge = false;
  435. uni.showModal({
  436. title: '错误',
  437. content: '余额不足请充值',
  438. success: res => {
  439. if (res.confirm) {
  440. uni.navigateTo({
  441. url: '/pages/recharge/pay'
  442. });
  443. }
  444. },
  445. fail: () => {},
  446. complete: () => {}
  447. });
  448. }
  449. })
  450. .catch(e => {
  451. uni.hideLoading();
  452. });
  453. },
  454. // 调用微信支付
  455. payMoney() {
  456. let obj = this;
  457. return new Promise((ok, err) => {
  458. if (obj.payLoding) {
  459. return;
  460. }
  461. obj.payLoding = true;
  462. rechargeWechat({ price: this.payMoneyNum, from: 'weixin' })
  463. .then(e => {
  464. let da = e.data.data;
  465. console.log(da);
  466. console.log(weixinObj, 'weixinObj');
  467. try {
  468. weixinObj.ready(() => {
  469. weixinObj.chooseWXPay({
  470. timestamp: da.timestamp,
  471. nonceStr: da.nonceStr,
  472. package: da.package,
  473. signType: da.signType,
  474. paySign: da.paySign,
  475. success: function(res) {
  476. console.log(res);
  477. ok(true);
  478. },
  479. fail: function(res) {
  480. console.log(res);
  481. err(false);
  482. }
  483. });
  484. });
  485. } catch (e) {
  486. console.log(e);
  487. }
  488. obj.payLoding = false;
  489. })
  490. .catch(e => {
  491. obj.payLoding = false;
  492. });
  493. });
  494. },
  495. // 投票弹窗
  496. chargeConfirm(item) {
  497. if (this.timeStop) {
  498. uni.showModal({
  499. title: '提示',
  500. content: '投票已结束!',
  501. showCancel: false
  502. });
  503. return;
  504. }
  505. // 保存当前选中的投票对象
  506. this.chargeUserItem = item;
  507. // 判断是否还有剩余投票次数
  508. if (this.myVote <= 0) {
  509. uni.showToast({
  510. title: '已无免费票数'
  511. });
  512. // this.showCharge = true;
  513. } else {
  514. this.commitCharge();
  515. }
  516. },
  517. // 确认报名
  518. pushBm() {
  519. this.showAlert = false;
  520. if (this.csType == 0) {
  521. uni.navigateTo({
  522. url: '/pages/addTp/user'
  523. });
  524. }
  525. if (this.csType == 1) {
  526. uni.navigateTo({
  527. url: '/pages/addTp/company'
  528. });
  529. }
  530. },
  531. // 切换当前选中的查询
  532. changeRank(index) {
  533. this.rank = index;
  534. },
  535. //获取用户列表
  536. ptJoin() {
  537. // 获取项目对象
  538. let navItem = this.userlist;
  539. // 获取最新数据
  540. this.getData(navItem, 0);
  541. },
  542. // 请求返回项目数据
  543. ptDetail() {
  544. ptDetail()
  545. .then(e => {
  546. const data = e.data;
  547. this.timestamp = data.end_time - new Date().getTime() / 1000;
  548. this.item.pepole = data.join_num;
  549. this.item.votes = data.vote_num;
  550. this.item.count = data.visit;
  551. this.priceBl = +data.price;
  552. this.dayFree = data.day_free; //可投免费票数
  553. this.dayFreeVote = data.today_free_vote_num; //已投免费 票数
  554. this.activtyName = data.title;
  555. })
  556. .catch(e => {
  557. console.log();
  558. });
  559. },
  560. // 查询报名数据
  561. searchProduct(e) {
  562. // 初始化数据
  563. const data = {
  564. list: [],
  565. page: 1,
  566. limit: 10,
  567. loadingType: 'loadmore'
  568. };
  569. // 判断是否为最新
  570. if (this.rank == 0) {
  571. this.userlist = data;
  572. }
  573. // 判断是否为排行
  574. if (this.rank == 1) {
  575. this.phlist = data;
  576. }
  577. this.getData(data, this.rank);
  578. },
  579. // 页面跳转
  580. nextTo(url) {
  581. console.log(url, '跳转地址');
  582. uni.navigateTo({
  583. url,
  584. fail: e => {
  585. console.log(e);
  586. }
  587. });
  588. },
  589. // 报名
  590. pushUserData() {
  591. if (this.timeStop) {
  592. uni.showModal({
  593. title: '提示',
  594. content: '投票已结束!',
  595. showCancel: false
  596. });
  597. return;
  598. }
  599. this.showAlert = true;
  600. },
  601. // 请求用户数据
  602. getData(navItem, rank, job) {
  603. // 获取项目对象
  604. if (navItem.loadingType === 'loading') {
  605. //防止重复加载
  606. return;
  607. }
  608. if (navItem.loadingType === 'nomore') {
  609. //防止重复加载
  610. return;
  611. }
  612. // 修改当前对象状态为加载中
  613. navItem.loadingType = 'loading';
  614. ptJoin({
  615. page: navItem.page,
  616. limit: navItem.limit,
  617. key_word: this.input.value,
  618. rank: rank,
  619. job: job
  620. })
  621. .then(e => {
  622. const data = e.data.data;
  623. navItem.list = navItem.list.concat(data);
  624. navItem.page++;
  625. if (navItem.limit == data.length) {
  626. //判断是否还有数据, 有改为 more, 没有改为noMore
  627. navItem.loadingType = 'loadmore';
  628. return;
  629. } else {
  630. //判断是否还有数据, 有改为 more, 没有改为noMore
  631. navItem.loadingType = 'nomore';
  632. }
  633. this.$set(navItem, 'loaded', true);
  634. })
  635. .catch(e => {
  636. navItem.loadingType = 'loadmore';
  637. console.log(e);
  638. });
  639. }
  640. }
  641. };
  642. </script>
  643. <style lang="scss">
  644. page,
  645. .container {
  646. height: auto;
  647. min-height: 100%;
  648. background-color: rgb(1, 9, 172);
  649. }
  650. .container {
  651. padding-bottom: 130rpx;
  652. position: relative;
  653. }
  654. .alertChargeBox {
  655. .alertCharge {
  656. justify-content: flex-start;
  657. flex-wrap: wrap;
  658. padding: 30rpx;
  659. .chargeItem {
  660. width: 25%;
  661. text-align: center;
  662. position: relative;
  663. height: 180rpx;
  664. padding: 40rpx;
  665. margin: 20rpx 0;
  666. &.actionCharge {
  667. border: 1px solid #d7272b;
  668. border-radius: 10rpx;
  669. }
  670. .chargeImgIcon {
  671. position: absolute;
  672. top: 10rpx;
  673. right: 10rpx;
  674. font-size: 18rpx;
  675. font-weight: bold;
  676. color: #ffffff;
  677. border-top-right-radius: 90rpx;
  678. border-top-left-radius: 90rpx;
  679. border-bottom-right-radius: 90rpx;
  680. padding: 5rpx 15rpx;
  681. background-color: #d7272b;
  682. }
  683. .chargeTextBox {
  684. position: absolute;
  685. bottom: 10rpx;
  686. right: 0;
  687. left: 0;
  688. justify-content: center;
  689. color: #223438;
  690. font-size: 24rpx;
  691. text-align: center;
  692. .chargeIcon {
  693. width: 35rpx;
  694. height: 35rpx;
  695. margin-right: 10rpx;
  696. }
  697. }
  698. .chargeImgBox {
  699. .chargeImg {
  700. width: 77rpx;
  701. }
  702. }
  703. }
  704. }
  705. .chargeButtom {
  706. padding: 30rpx;
  707. background-color: #fff6f6;
  708. .left {
  709. font-weight: bold;
  710. flex-grow: 1;
  711. justify-content: flex-start;
  712. .chargeIcon {
  713. width: 40rpx;
  714. height: 40rpx;
  715. }
  716. .num {
  717. margin-left: 10rpx;
  718. color: #16363a;
  719. font-size: 30rpx;
  720. }
  721. .tip {
  722. margin-left: 10rpx;
  723. color: #d82a2e;
  724. font-size: 24rpx;
  725. }
  726. }
  727. .right {
  728. background-color: #d7272b;
  729. color: #ffffff;
  730. border-radius: 99rpx;
  731. padding: 5rpx 40rpx;
  732. font-size: 26rpx;
  733. }
  734. }
  735. }
  736. .alertAddBox {
  737. background: rgb(1, 9, 172);
  738. position: fixed;
  739. bottom: 0;
  740. left: 0;
  741. right: 0;
  742. padding: 20rpx 30rpx;
  743. z-index: 1;
  744. .textAlertBox {
  745. flex-shrink: 0;
  746. text-align: center;
  747. font-size: 28rpx;
  748. color: #ffffff;
  749. padding-right: 20rpx;
  750. .psBox {
  751. font-size: 40rpx;
  752. font-weight: bold;
  753. .psImgIcon {
  754. margin-right: 10rpx;
  755. width: 30rpx;
  756. }
  757. }
  758. }
  759. .addUser {
  760. flex-grow: 1;
  761. background: #d7272b;
  762. border: 1px solid #170911;
  763. border-radius: 7px;
  764. line-height: 1;
  765. font-size: 31rpx;
  766. font-weight: bold;
  767. color: #ffffff;
  768. text-align: center;
  769. padding: 30rpx;
  770. line-height: 24rpx;
  771. }
  772. }
  773. .topImg {
  774. width: 100%;
  775. }
  776. .contentBox {
  777. position: relative;
  778. width: 0px;
  779. min-width: 100%;
  780. margin-bottom: 32rpx;
  781. .btoomBg {
  782. background-color: #ffffff;
  783. min-height: 50vh;
  784. height: 100%;
  785. position: absolute;
  786. top: 32rpx;
  787. right: 30rpx;
  788. left: 42rpx;
  789. }
  790. .topBg {
  791. position: relative;
  792. margin-left: 30rpx;
  793. margin-right: 42rpx;
  794. box-shadow: 3px 5rpx 3rpx 0rpx rgba(4, 0, 0, 0.15);
  795. line-height: 0;
  796. .leftIcon {
  797. position: absolute;
  798. top: 30rpx;
  799. left: -30rpx;
  800. width: 100rpx;
  801. }
  802. .tpConent {
  803. background: #ffffff;
  804. line-height: 1;
  805. min-height: 50vh;
  806. padding-top: 28rpx;
  807. padding-bottom: 20rpx;
  808. .erweima {
  809. width: 300rpx;
  810. height: 300rpx;
  811. margin: 0 auto;
  812. image {
  813. width: 100%;
  814. height: 100%;
  815. }
  816. }
  817. .Etitle {
  818. margin-top: 20rpx;
  819. text-align: center;
  820. font-size: 24rpx;
  821. }
  822. }
  823. .down {
  824. text-align: center;
  825. }
  826. .tjContent {
  827. margin-top: 70rpx;
  828. justify-content: space-around;
  829. text-align: center;
  830. .tjItem {
  831. .topText {
  832. font-size: 50rpx;
  833. font-weight: bold;
  834. color: #3a3a3a;
  835. .iconTip {
  836. font-size: 20rpx;
  837. }
  838. }
  839. .bottomText {
  840. margin-top: 10rpx;
  841. font-size: 24rpx;
  842. font-family: PingFang SC;
  843. font-weight: 500;
  844. color: #333333;
  845. }
  846. }
  847. }
  848. .tpTitle {
  849. text-align: center;
  850. font-size: 48rpx;
  851. font-weight: bold;
  852. color: #ffc103;
  853. margin-top: 50rpx;
  854. margin-bottom: 45rpx;
  855. }
  856. .tpRight {
  857. display: flex;
  858. justify-content: flex-end;
  859. .textBox {
  860. background: #d7272b;
  861. border-radius: 99rpx 0px 0px 99rpx;
  862. padding: 10rpx;
  863. padding-left: 20rpx;
  864. font-size: 25rpx;
  865. font-weight: 500;
  866. color: #ffffff;
  867. }
  868. }
  869. .endTextBox {
  870. padding: 0 84rpx;
  871. margin-bottom: 32rpx;
  872. .leftLine,
  873. .rightLine {
  874. border-bottom: 1rpx solid #d7272b;
  875. flex-grow: 1;
  876. position: relative;
  877. .roundness {
  878. position: absolute;
  879. top: -5rpx;
  880. height: 10rpx;
  881. width: 10rpx;
  882. background-color: #d7272b;
  883. border-radius: 99rpx;
  884. }
  885. }
  886. .leftLine {
  887. .roundness {
  888. right: 0;
  889. }
  890. }
  891. .rightLine {
  892. .roundness {
  893. left: 0;
  894. }
  895. }
  896. .textLine {
  897. padding: 0 20rpx;
  898. }
  899. }
  900. .input {
  901. padding: 0 30rpx;
  902. margin: 50rpx 30rpx;
  903. margin-bottom: 20rpx;
  904. background: #ebebeb;
  905. border-radius: 30rpx;
  906. }
  907. .tabsBox {
  908. padding-bottom: 20rpx;
  909. border-bottom: 1px solid #ebebeb;
  910. margin-bottom: 50rpx;
  911. }
  912. .itemList {
  913. flex-wrap: wrap;
  914. justify-content: start;
  915. padding: 0 15rpx;
  916. .itemData {
  917. width: 50%;
  918. flex-grow: 0;
  919. flex-shrink: 0;
  920. padding: 0 15rpx;
  921. margin-bottom: 30rpx;
  922. .itemContentBox {
  923. padding: 0 15rpx;
  924. .itemImgbox {
  925. width: 100%;
  926. padding-top: 100%;
  927. position: relative;
  928. margin-bottom: 20rpx;
  929. .itemAddress {
  930. position: absolute;
  931. bottom: 0;
  932. left: 0;
  933. right: 0;
  934. background: #262626;
  935. opacity: 0.6;
  936. color: #ffffff;
  937. font-size: 24rpx;
  938. padding: 10rpx 0;
  939. text-align: center;
  940. }
  941. .itemImg {
  942. position: absolute;
  943. top: 0;
  944. left: 0;
  945. width: 100%;
  946. height: 100%;
  947. }
  948. .iconBox {
  949. padding-top: 10rpx;
  950. position: absolute;
  951. top: -18rpx;
  952. left: -18rpx;
  953. height: 73rpx;
  954. width: 62rpx;
  955. z-index: 1;
  956. background-image: url(../static/img/img07.png);
  957. background-size: 100% 100%;
  958. color: #ffffff;
  959. font-size: 24rpx;
  960. text-align: center;
  961. }
  962. }
  963. .itemNameBox {
  964. margin-bottom: 20rpx;
  965. font-size: 30rpx;
  966. font-weight: bold;
  967. .itemName {
  968. color: #333333;
  969. }
  970. .itemVote {
  971. color: #d7272b;
  972. }
  973. }
  974. }
  975. .itemBottom {
  976. background: #ffc103;
  977. color: #ffffff;
  978. font-size: 30rpx;
  979. padding: 15rpx;
  980. text-align: center;
  981. }
  982. }
  983. }
  984. .phItemList {
  985. padding: 0 30rpx;
  986. margin-top: -50rpx;
  987. .phItem {
  988. padding: 20rpx 0;
  989. .icon {
  990. flex-shrink: 0;
  991. width: 50rpx;
  992. .tipImg {
  993. width: 42rpx;
  994. }
  995. .tipText {
  996. color: #d7272b;
  997. font-size: 36rpx;
  998. font-weight: bold;
  999. }
  1000. }
  1001. .phRightBox {
  1002. flex-grow: 1;
  1003. border-bottom: 1px solid #ebebeb;
  1004. padding: 20rpx 0;
  1005. .avatarBox {
  1006. flex-shrink: 0;
  1007. .avatarImg {
  1008. width: 96rpx;
  1009. height: 96rpx;
  1010. border-radius: 99rpx;
  1011. margin-left: 10rpx;
  1012. }
  1013. }
  1014. .phTextBox {
  1015. flex-grow: 1;
  1016. margin-left: 15rpx;
  1017. .phTtemName {
  1018. color: #333333;
  1019. font-size: 32rpx;
  1020. }
  1021. .phItemAddress {
  1022. color: #999999;
  1023. font-size: 24rpx;
  1024. margin-top: 10rpx;
  1025. }
  1026. }
  1027. .phRight {
  1028. flex-shrink: 0;
  1029. text-align: right;
  1030. justify-content: right;
  1031. .textVote {
  1032. color: #ffbb17;
  1033. font-size: 36rpx;
  1034. font-weight: bold;
  1035. margin-right: 13rpx;
  1036. }
  1037. .phTipImg {
  1038. width: 23rpx;
  1039. height: 39rpx;
  1040. }
  1041. }
  1042. }
  1043. }
  1044. }
  1045. }
  1046. }
  1047. /deep/ .u-countdown-item {
  1048. padding: 10rpx;
  1049. border-radius: 8rpx;
  1050. overflow: hidden;
  1051. }
  1052. .alertBox {
  1053. padding-bottom: 40rpx;
  1054. .titleImg {
  1055. width: 100%;
  1056. z-index: -1;
  1057. }
  1058. .title {
  1059. text-align: center;
  1060. font-size: 36rpx;
  1061. font-weight: bold;
  1062. color: #333333;
  1063. margin-top: -80rpx;
  1064. }
  1065. .titleTip {
  1066. text-align: center;
  1067. font-size: 24rpx;
  1068. font-weight: bold;
  1069. color: #808080;
  1070. }
  1071. .lxTtem {
  1072. margin: 0 40rpx;
  1073. padding: 30rpx 0;
  1074. border-bottom: 1px solid #ebebeb;
  1075. .leftTitle {
  1076. justify-content: start;
  1077. width: 43rpx;
  1078. flex-grow: 1;
  1079. color: #333333;
  1080. font-size: 28rpx;
  1081. .leftImgTip {
  1082. flex-shrink: 0;
  1083. // width: 30rpx;
  1084. height: 30rpx;
  1085. margin-right: 20rpx;
  1086. }
  1087. }
  1088. .rightTip {
  1089. border: 1px solid #d7272b;
  1090. opacity: 0.5;
  1091. border-radius: 50%;
  1092. width: 32rpx;
  1093. height: 32rpx;
  1094. justify-content: center;
  1095. .xzTip {
  1096. width: 20rpx;
  1097. height: 20rpx;
  1098. border-radius: 99rpx;
  1099. background-color: #d7272b;
  1100. }
  1101. }
  1102. }
  1103. .pushtyle {
  1104. background: #d7272b;
  1105. box-shadow: 0px 16rpx 16rpx 0px rgba(215, 39, 43, 0.5);
  1106. border-radius: 10rpx;
  1107. color: #ffffff;
  1108. font-size: 28rpx;
  1109. font-weight: bold;
  1110. text-align: center;
  1111. padding: 20rpx 0;
  1112. margin: 0 40rpx;
  1113. margin-top: 40rpx;
  1114. }
  1115. }
  1116. </style>