index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. <template>
  2. <view class="product">
  3. <view class="top"></view>
  4. <view class="head">
  5. <view class="handle">
  6. <view class="head_left">
  7. <span class="cuIcon-back" @click="back"></span>
  8. </view>
  9. <span class="center">商品管理</span>
  10. <view class="head_right">
  11. <!-- <span class="cuIcon-search" @click="goSearch"></span> -->
  12. <view class="manage" @click="manage">
  13. {{isManage?'退出管理':'管理'}}
  14. </view>
  15. </view>
  16. </view>
  17. <div class="tab-container">
  18. <div class="tab-item" :class="tabIndex == 1?'active':''" @click="tabIndex=1;productName='';productStatus=0;getProductList();getStatus()">品牌标品</div>
  19. <div class="tab-item" :class="tabIndex == 0?'active':''" @click="tabIndex=0;productName='';productStatus=0;getProductList();getStatus()">自有商品</div>
  20. </div>
  21. <view class="search">
  22. <span class="cuIcon-search"></span>
  23. <!-- <input @blur="InputBlur" :adjust-position="false" type="text" placeholder="请输入关键词" confirm-type="search"> -->
  24. <u-input v-model="productName" />
  25. </input>
  26. <view class="search_btn" @click.stop="getProductList()">
  27. <span></span>搜索
  28. </view>
  29. </view>
  30. <view class="type">
  31. <view class="type_item" :class="currentIndex == index?'active':''" v-for="(item,index) in typeList" :key="index"
  32. @click="selectType(item,index)">
  33. {{item.statusName}}({{item.number}})
  34. <span class="line" v-if="currentIndex == index"></span>
  35. </view>
  36. </view>
  37. </view>
  38. <view class="list">
  39. <view class="product_item" v-for="(item,index) in productList" :key="index" @click="goDetails(item)">
  40. <view class="status">
  41. <span class="round" v-if="item.productStatus =='1'">售卖中</span>
  42. <span class="round no" v-if="item.productStatus =='0'" style="color:#666666 ;">未上架</span>
  43. <span class="audit " v-if="item.productStatus =='2'" style="color:#596ABB ;">审核中</span>
  44. <span class="reject " v-if="item.productStatus =='3'" style="color:#F55D65 ;">未通过</span>
  45. <span class="line"></span>
  46. <span v-if="item.saleStartDate">{{item.saleStartDate.slice(0,10)}}-{{item.saleEndDate.slice(0,10)}}</span>
  47. <view class="error insufficient" v-if="item.sellingOvertime && item.stockQuantity ==0">
  48. 库存不足
  49. </view>
  50. <view class="error overtime" v-if="item.sellingOvertime && item.stockQuantity >0">
  51. 售卖超时
  52. </view>
  53. <!-- <span>已售:{{item.num}}</span>
  54. <span>库存:{{item.inventory}}</span> -->
  55. </view>
  56. <view class="details">
  57. <view class="img">
  58. <image :src="item.productImage" mode=""></image>
  59. </view>
  60. <view class="data">
  61. <span>{{item.productName}}</span>
  62. <!-- <span>售卖时间:{{item.time}}</span> -->
  63. <view class="repertory">库存:{{item.stockQuantity}} <span></span> 销量:{{item.soldQuantity}}</view>
  64. <view class="price">
  65. <span style="font-size: 22rpx;margin: 0px;">¥</span>{{item.soldPrice}}
  66. <span style="color:#999 ;font-size: 22rpx; text-decoration: line-through;">¥{{item.price}}</span>
  67. </view>
  68. </view>
  69. <view class="tag" v-if="isManage" @click.stop="select(item)">
  70. <!-- <span>组合套餐</span> -->
  71. <!-- <span class="frame"></span> -->
  72. <image src="/static/product/select.png" mode="" v-if="item.select"></image>
  73. <image src="/static/product/round.png" mode="" v-else></image>
  74. </view>
  75. </view>
  76. <view class="btn_box">
  77. <view class="delist" @click.stop="sell(item)" v-if="item.productStatus==0">
  78. 上架
  79. </view>
  80. <view class="delist" @click.stop="delist(item)" v-if="item.productStatus==1">
  81. 下架
  82. </view>
  83. <view class="edit delist" @click.stop="edit(item)">
  84. 编辑
  85. </view>
  86. </view>
  87. </view>
  88. </view>
  89. <view class="creat">
  90. <view class="operate" v-if="isManage">
  91. <view class="all" @click="allSelect">
  92. <image src="/static/product/select.png" mode="" v-if="isAll"></image>
  93. <image src="/static/product/round.png" mode="" v-else></image>
  94. 全选
  95. </view>
  96. <view class="delete" @click="remove">删除</view>
  97. <view class="delete delist" @click="deletes(1)" v-if="currentIndex == 0">上架</view>
  98. <view class="delete delist" @click="deletes(0)" v-else>下架</view>
  99. </view>
  100. <view class="btn" @click="creatProduct" v-else-if="tabIndex==0">
  101. <image src="/static/product/product.png" mode=""></image>
  102. 创建自有商品
  103. </view>
  104. <view class="btn" @click="creatStandard" v-else-if="tabIndex==1">
  105. <image src="/static/product/standard.png" mode=""></image>
  106. 添加品牌标品
  107. </view>
  108. </view>
  109. <view class="popup" v-if="isDelete">
  110. <view class="content">
  111. <view class="title">
  112. <span>删除商品</span>
  113. </view>
  114. <view class="center">
  115. <image src="/static/index/close.png" mode="" v-if="canBeDelete"></image>
  116. <image src="/static/product/error.png" mode="" v-else></image>
  117. <view class="error" v-if="canBeDelete">
  118. 确定要删除?
  119. </view>
  120. <view class="error" v-else>
  121. 当前门店还存在有效服务券<br />
  122. <span style="margin-top: 12rpx;">暂时无法关闭门店</span>
  123. </view>
  124. </view>
  125. <view class="sub" @click="isSuccess = false">
  126. <view class="button">
  127. 确定
  128. </view>
  129. </view>
  130. </view>
  131. </view>
  132. </view>
  133. </template>
  134. <script>
  135. export default {
  136. data() {
  137. return {
  138. isManage: false,
  139. currentIndex: 0,
  140. productStatus: 0, //商品状态,默认1售卖中,0未上架,2审核中,3未通过
  141. isAll: false,
  142. isDelete: false,
  143. canBeDelete: true,
  144. productName: '',
  145. typeList: [{
  146. type: '待上架',
  147. productStatus: 0
  148. },
  149. {
  150. type: '售卖中',
  151. productStatus: 1
  152. },
  153. {
  154. type: '审核中',
  155. productStatus: 2
  156. },
  157. {
  158. type: '未通过',
  159. productStatus: 3
  160. }
  161. ],
  162. productList: [],
  163. merchantId: '',
  164. productHandleList: [],
  165. tabIndex:1
  166. }
  167. },
  168. methods: {
  169. //返回
  170. back() {
  171. uni.switchTab({
  172. url: '/pages/index/index'
  173. })
  174. },
  175. handleClear() {
  176. this.getProductList()
  177. // 这里可以添加其他逻辑
  178. },
  179. //切换分类
  180. selectType(item, index) {
  181. if (!this.isManage) {
  182. this.currentIndex = index
  183. this.productStatus = item.code
  184. this.getProductList()
  185. }
  186. },
  187. //是否管理商品
  188. manage() {
  189. this.isManage = !this.isManage
  190. this.isAll = true
  191. this.allSelect()
  192. },
  193. // 跳转至搜索页面
  194. goSearch() {
  195. uni.navigateTo({
  196. url: '/pages/product/search'
  197. })
  198. },
  199. //跳转至详情
  200. goDetails(item) {
  201. uni.navigateTo({
  202. url: '/pages/product/details?productId=' + item.productId
  203. })
  204. },
  205. //跳转至创建商品
  206. creatProduct() {
  207. uni.navigateTo({
  208. url: '/pages/product/creatProduct'
  209. })
  210. },
  211. //跳转至品牌标品
  212. creatStandard() {
  213. uni.navigateTo({
  214. url: '/pages/product/creatStandard'
  215. })
  216. },
  217. //编辑
  218. edit(item) {
  219. uni.navigateTo({
  220. url: '/pages/product/creatProduct?productId=' + item.productId+'&tabIndex='+this.tabIndex
  221. })
  222. },
  223. select(item) {
  224. item.select = !item.select
  225. this.productHandleList.push(item.productId)
  226. },
  227. //批量上下架status:0下级。1上架
  228. deletes(status) {
  229. let shelves = []
  230. this.productList.forEach(item => {
  231. shelves.push({
  232. productId: item.productId,
  233. productStatus: status
  234. })
  235. })
  236. let that = this
  237. uni.showModal({
  238. title: this.productStatus==0?'确定上架商品?':'确定下架商品?',
  239. success: function(res) {
  240. if (res.confirm) {
  241. that.$http.post("/app/product/shelves", shelves)
  242. .then(res => {
  243. if (res.data.code == 200) {
  244. uni.showToast({
  245. title: this.productStatus==0?'上架成功':'下架成功',
  246. duration: 2000,
  247. icon: 'none'
  248. });
  249. that.$router.go(0)
  250. that.isManage = false
  251. that.isAll = false
  252. }
  253. })
  254. } else if (res.cancel) {
  255. console.log('用户点击取消');
  256. that.isAll = false
  257. that.allSelect()
  258. }
  259. }
  260. });
  261. },
  262. //批量删除
  263. remove() {
  264. this.productList.forEach((item => {
  265. this.productHandleList.push(item.productId)
  266. }))
  267. let ids = this.productHandleList.join(',')
  268. console.log(ids)
  269. let that = this
  270. uni.showModal({
  271. title: '确定删除商品?',
  272. success: function(res) {
  273. if (res.confirm) {
  274. that.$http.get("/app/product/deleteBatch?ids=" + ids, )
  275. .then(res => {
  276. if (res.data.code == 200) {
  277. console.log(res)
  278. uni.showToast({
  279. title: '删除成功',
  280. duration: 2000,
  281. icon: 'none'
  282. });
  283. that.$router.go(0)
  284. that.isManage = false
  285. that.isAll = false
  286. }
  287. })
  288. } else if (res.cancel) {
  289. console.log('用户点击取消');
  290. }
  291. }
  292. });
  293. },
  294. //全选
  295. allSelect() {
  296. if (this.isAll) {
  297. this.isAll = false
  298. this.productList.forEach(item => {
  299. item.select = false
  300. })
  301. } else {
  302. this.isAll = true
  303. this.productList.forEach(item => {
  304. item.select = true
  305. })
  306. }
  307. },
  308. getProductList() {
  309. this.$http.get("/app/product/list?merchantId=" + this.merchantId + "&productStatus=" + this.productStatus +
  310. '&productName=' + this.productName +'&isPlatform='+this.tabIndex, )
  311. .then(res => {
  312. if (res.data.code == 200) {
  313. res.data.result.records.forEach((item) => {
  314. item.select = false;
  315. })
  316. this.productList = res.data.result.records
  317. }
  318. })
  319. },
  320. // getStandardList() {
  321. // this.$http.get("/app/product/purveyor/list?merchantId=" + this.merchantId + "&productStatus=" + this.productStatus +
  322. // '&productName=' + this.productName, )
  323. // .then(res => {
  324. // if (res.data.code == 200) {
  325. // res.data.result.records.forEach((item) => {
  326. // item.select = false;
  327. // })
  328. // this.productList = res.data.result.records
  329. // }
  330. // })
  331. // },
  332. delist(item) {
  333. let shelves = []
  334. shelves.push({
  335. productId: item.productId,
  336. productStatus: 0
  337. })
  338. let that = this
  339. uni.showModal({
  340. title: '确定下架商品',
  341. success: function(res) {
  342. if (res.confirm) {
  343. that.$http.post("/app/product/shelves", shelves)
  344. .then(res => {
  345. if (res.data.code == 200) {
  346. that.getProductList()
  347. that.getStatus()
  348. uni.showToast({
  349. title: '下架成功',
  350. duration: 2000,
  351. icon: 'none'
  352. });
  353. }
  354. })
  355. } else if (res.cancel) {
  356. console.log('用户点击取消');
  357. }
  358. }
  359. });
  360. },
  361. //上架
  362. sell(item) {
  363. console.log(item)
  364. let shelves = []
  365. shelves.push({
  366. productId: item.productId,
  367. productStatus: 1
  368. })
  369. let that = this
  370. uni.showModal({
  371. title: '确定上架商品?',
  372. success: function(res) {
  373. if (res.confirm) {
  374. that.$http.post("/app/product/shelves", shelves)
  375. .then(res => {
  376. if (res.data.code == 200) {
  377. that.getProductList()
  378. that.getStatus()
  379. uni.showToast({
  380. title: '上架成功',
  381. duration: 2000,
  382. icon: 'none'
  383. });
  384. }
  385. })
  386. } else if (res.cancel) {
  387. console.log('用户点击取消');
  388. }
  389. }
  390. });
  391. },
  392. getStatus() {
  393. this.$http.get("/app/product/statusCount?merchantId=" + this.merchantId+'&isPlatform='+this.tabIndex ).then(res => {
  394. if (res.data.code == 200) {
  395. this.typeList = res.data.result
  396. }
  397. })
  398. }
  399. },
  400. mounted() {
  401. this.getProductList()
  402. this.getStatus()
  403. },
  404. onShow() {
  405. let that = this
  406. uni.getStorage({
  407. key: 'login_user_info',
  408. success: function(res) {
  409. that.merchantId = res.data.merchantId
  410. }
  411. })
  412. uni.removeStorage({
  413. key: 'smdate',
  414. });
  415. uni.removeStorage({
  416. key: 'group',
  417. });
  418. }
  419. }
  420. </script>
  421. <style lang="scss" scoped>
  422. .product {
  423. width: 100%;
  424. height: 100vh;
  425. display: flex;
  426. flex-direction: column;
  427. justify-content: space-between;
  428. background: #F7F8FC;
  429. .top {
  430. width: 100%;
  431. height: var(--status-bar-height);
  432. background: linear-gradient(87deg, #FFFFFF 0%, #A3CDFF 100%), linear-gradient(360deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%);
  433. }
  434. .head {
  435. width: 100%;
  436. background: #ffffff;
  437. .handle {
  438. height: 112rpx;
  439. display: flex;
  440. justify-content: space-between;
  441. align-items: center;
  442. padding: 0px 24rpx;
  443. position: relative;
  444. background: linear-gradient(87deg, #FFFFFF 0%, #A3CDFF 100%), linear-gradient(360deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%);
  445. .head_left {
  446. font-size: 40rpx;
  447. }
  448. .center {
  449. position: absolute;
  450. left: 50%;
  451. top: 50%;
  452. transform: translate(-50%, -50%);
  453. font-size: 36rpx;
  454. font-weight: 600;
  455. }
  456. .head_right {
  457. display: flex;
  458. justify-content: space-between;
  459. align-items: center;
  460. span {
  461. width: 40rpx;
  462. height: 40rpx;
  463. display: flex;
  464. justify-content: center;
  465. align-items: center;
  466. }
  467. .manage {
  468. // width: 150rpx;
  469. margin-left: 28rpx;
  470. }
  471. }
  472. }
  473. .search {
  474. width: 93%;
  475. height: 56rpx;
  476. background: #F7F8FC;
  477. border-radius: 12rpx;
  478. display: flex;
  479. align-items: center;
  480. justify-content: space-between;
  481. margin: 24rpx auto;
  482. font-size: 26rpx;
  483. padding: 13rpx 20rpx;
  484. span {
  485. margin-right: 15rpx;
  486. }
  487. input {
  488. flex: 1;
  489. font-size: 26rpx;
  490. }
  491. .search_btn {
  492. width: 72rpx;
  493. color: #333333;
  494. display: flex;
  495. align-items: center;
  496. justify-content: space-between;
  497. span {
  498. display: block;
  499. width: 1px;
  500. height: 26rpx;
  501. background-color: #eeeeee;
  502. }
  503. }
  504. }
  505. .type {
  506. display: flex;
  507. justify-content: space-between;
  508. background-color: #fff;
  509. padding: 8px 24rpx 16rpx;
  510. .type_item {
  511. height: 54rpx;
  512. display: flex;
  513. justify-content: center;
  514. align-items: center;
  515. font-size: 26rpx;
  516. color: #888888;
  517. position: relative;
  518. padding: 8rpx 12rpx;
  519. background: #F2F3F5;
  520. border-radius: 8rpx;
  521. }
  522. .active {
  523. color: #2D88F4;
  524. background: #ECF5FF;
  525. }
  526. }
  527. }
  528. .list {
  529. width: 100%;
  530. flex: 1;
  531. // padding: 0px 20rpx;
  532. overflow-y: auto;
  533. .product_item {
  534. width: 100%;
  535. background-color: #fff;
  536. border-radius: 20rpx;
  537. padding: 20rpx 40rpx;
  538. margin-top: 20rpx;
  539. .status {
  540. display: flex;
  541. align-items: center;
  542. position: relative;
  543. .round {
  544. display: flex;
  545. align-items: center;
  546. color: #49A03F;
  547. }
  548. .round::before {
  549. content: "";
  550. display: inline-block;
  551. width: 9rpx;
  552. height: 9rpx;
  553. background: #49A03F;
  554. border-radius: 50%;
  555. margin-right: 8rpx;
  556. }
  557. .no {
  558. color: #666666;
  559. }
  560. .no::before {
  561. content: "";
  562. display: inline-block;
  563. width: 9rpx;
  564. height: 9rpx;
  565. background: #666666;
  566. border-radius: 50%;
  567. margin-right: 8rpx;
  568. }
  569. .audit {
  570. display: flex;
  571. align-items: center;
  572. color: #596ABB;
  573. }
  574. .audit::before {
  575. content: "";
  576. display: inline-block;
  577. width: 9rpx;
  578. height: 9rpx;
  579. background: #596ABB;
  580. border-radius: 50%;
  581. margin-right: 8rpx;
  582. }
  583. .reject {
  584. display: flex;
  585. align-items: center;
  586. color: #F55D65;
  587. }
  588. .reject::before {
  589. content: "";
  590. display: inline-block;
  591. width: 9rpx;
  592. height: 9rpx;
  593. background: #F55D65;
  594. border-radius: 50%;
  595. margin-right: 8rpx;
  596. }
  597. .line {
  598. display: block;
  599. width: 1rpx;
  600. height: 20rpx;
  601. background: #d9d9d9;
  602. margin: 0 12rpx;
  603. }
  604. .error {
  605. position: absolute;
  606. top: 0;
  607. right: 0;
  608. width: 140rpx;
  609. height: 53rpx;
  610. border-radius: 4rpx;
  611. display: flex;
  612. align-items: center;
  613. justify-content: center;
  614. }
  615. .overtime {
  616. background: #FFF2E8;
  617. color: #FF7918;
  618. }
  619. .insufficient {
  620. background: #FFE8E8;
  621. color: #FF1818;
  622. }
  623. }
  624. .details {
  625. width: 100%;
  626. height: auto;
  627. min-height: 132rpx;
  628. height: 132rpx;
  629. display: flex;
  630. align-items: center;
  631. margin-top: 20rpx;
  632. .img {
  633. margin-right: 16rpx;
  634. border-radius: 12rpx;
  635. overflow: hidden;
  636. image {
  637. width: 132rpx;
  638. height: 132rpx;
  639. }
  640. }
  641. .data {
  642. flex: 1;
  643. height: 100%;
  644. display: flex;
  645. flex-direction: column;
  646. justify-content: space-between;
  647. font-weight: 600;
  648. font-style: 28rpx;
  649. .repertory {
  650. font-size: 24rpx;
  651. display: flex;
  652. align-items: center;
  653. color: #666;
  654. font-weight: 400;
  655. span {
  656. display: block;
  657. width: 1rpx;
  658. height: 20rpx;
  659. background: #d9d9d9;
  660. margin: 0 12rpx;
  661. }
  662. }
  663. .price {
  664. display: flex;
  665. align-items: center;
  666. font-size: 30rpx;
  667. font-weight: 600;
  668. span {
  669. font-size: 26rpx;
  670. margin-left: 20rpx;
  671. font-weight: 400;
  672. }
  673. }
  674. }
  675. .tag {
  676. width: 40rpx;
  677. height: 40rpx;
  678. display: flex;
  679. flex-direction: column;
  680. align-items: center;
  681. image {
  682. width: 40rpx;
  683. height: 40rpx;
  684. }
  685. }
  686. }
  687. .btn_box {
  688. width: 100%;
  689. display: flex;
  690. justify-content: flex-end;
  691. align-items: center;
  692. margin-top: 20rpx;
  693. .delist {
  694. width: 100rpx;
  695. height: 50rpx;
  696. border-radius: 8rpx;
  697. border: 1px solid #CCCCCC;
  698. display: flex;
  699. justify-content: center;
  700. align-items: center;
  701. font-size: 26rpx;
  702. color: #666666;
  703. }
  704. .edit {
  705. margin-left: 20rpx;
  706. background: rgba(68, 154, 255, 0.05);
  707. border: 1px solid #449AFF;
  708. color: #449AFF;
  709. }
  710. }
  711. }
  712. }
  713. .creat {
  714. width: 100%;
  715. height: 100rpx;
  716. background-color: #fff;
  717. display: flex;
  718. justify-content: center;
  719. align-items: center;
  720. .btn {
  721. width: 672rpx;
  722. height: 76rpx;
  723. display: flex;
  724. justify-content: center;
  725. align-items: center;
  726. background: linear-gradient(90deg, #77B6FF 0%, #449AFF 100%);
  727. border-radius: 75rpx;
  728. font-size: 28rpx;
  729. color: #FFFFFF;
  730. image {
  731. width: 40rpx;
  732. height: 40rpx;
  733. margin-right: 10rpx;
  734. }
  735. }
  736. .operate {
  737. width: 100%;
  738. display: flex;
  739. // justify-content: space-between;
  740. align-items: center;
  741. padding: 0px 20rpx;
  742. .delete {
  743. width: 205rpx;
  744. height: 76rpx;
  745. background: linear-gradient(90deg, #77B6FF 0%, #449AFF 100%);
  746. border-radius: 49rpx;
  747. font-size: 28rpx;
  748. color: #FFFFFF;
  749. display: flex;
  750. justify-content: center;
  751. align-items: center;
  752. margin-right: 24rpx;
  753. margin-left: 140rpx;
  754. }
  755. .delist {
  756. margin-left: 0rpx;
  757. background: linear-gradient(90deg, #FFA05B 0%, #FF7918 100%);
  758. }
  759. .all {
  760. width: 25%;
  761. // height: 60rpx;
  762. // border: 1px solid #999;
  763. display: flex;
  764. justify-content: center;
  765. align-items: center;
  766. image {
  767. width: 40rpx;
  768. height: 40rpx;
  769. margin-right: 10rpx;
  770. }
  771. }
  772. }
  773. }
  774. .popup {
  775. width: 100vw;
  776. height: 100vh;
  777. position: fixed;
  778. top: 0;
  779. left: 0;
  780. background: rgba(0, 0, 0, 0.4);
  781. display: flex;
  782. align-items: center;
  783. justify-content: center;
  784. .content {
  785. width: 570rpx;
  786. background: #FFFFFF;
  787. border-radius: 16rpx;
  788. padding: 0px 24rpx;
  789. padding-bottom: 16rpx;
  790. .title {
  791. width: 100%;
  792. height: 86rpx;
  793. font-size: 32rpx;
  794. color: #333333;
  795. font-weight: 600;
  796. border-bottom: 1px solid #EEEEEE;
  797. display: flex;
  798. align-items: center;
  799. justify-content: center;
  800. }
  801. .center {
  802. font-size: 30rpx;
  803. color: #333333;
  804. line-height: 35rpx;
  805. display: flex;
  806. flex-direction: column;
  807. align-items: center;
  808. justify-content: center;
  809. padding-top: 28rpx;
  810. border-bottom: 1px solid #EEEEEE;
  811. padding-bottom: 40rpx;
  812. margin-bottom: 16rpx;
  813. .error {
  814. text-align: center;
  815. }
  816. image {
  817. width: 100rpx;
  818. height: 100rpx;
  819. margin-bottom: 10rpx;
  820. }
  821. }
  822. .sub {
  823. width: 320rpx;
  824. height: 68rpx;
  825. border-radius: 66rpx;
  826. font-size: 28rpx;
  827. color: #FFFFFF;
  828. display: flex;
  829. align-items: center;
  830. justify-content: center;
  831. margin: 0rpx auto;
  832. .button {
  833. width: 320rpx;
  834. height: 68rpx;
  835. background: #449AFF;
  836. border-radius: 66rpx;
  837. display: flex;
  838. align-items: center;
  839. justify-content: center;
  840. }
  841. }
  842. .start {
  843. background: #53CC48;
  844. }
  845. .rest {
  846. background: #FF8024;
  847. }
  848. }
  849. }
  850. }
  851. .tab-container {
  852. display: flex;
  853. justify-content: space-around;
  854. .tab-item {
  855. position: relative;
  856. padding: 18rpx 0;
  857. cursor: pointer;
  858. color: #333;
  859. font-weight: 400;
  860. font-size: 28rpx;
  861. }
  862. .tab-item.active {
  863. color: #449AFF;
  864. font-weight: 600;
  865. }
  866. .tab-item.active::after {
  867. content: '';
  868. position: absolute;
  869. bottom: -28px;
  870. left: 35%;
  871. width: 38rpx;
  872. height: 100%;
  873. background: url(/static/product/tab-act.png) no-repeat;
  874. background-size: contain;
  875. }
  876. }
  877. </style>