index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. <!-- 菜单悬浮的原理: 通过给菜单添加position:sticky实现, 用法超简单, 仅APP端的低端机不兼容 https://caniuse.com/#feat=css-sticky -->
  2. <template>
  3. <view class="publish-page">
  4. <!-- 对于mescroll-body: 需设置:sticky="true", 此应避免在mescroll-body标签前面加其他非定位的元素, 否则下拉区域会被挤出, 无法会隐藏.-->
  5. <!-- 对于mescroll-uni: 则无需设置:sticky="true", 无其他限制和要求 -->
  6. <!-- sticky吸顶悬浮的菜单, 父元素必须是 mescroll -->
  7. <!-- <view class="sticky-tabs">
  8. <view class="flex align-center padding-left" style="background: #FFFFFF;">
  9. <image src="../../static/images/data.png" style="width: 26upx;height: 26upx;"></image>
  10. <view class="margin-left-xs flex align-center" style="color: #999999;">
  11. <view @click="bindData(1)">{{startTime?startTime:'开始时间'}}</view>
  12. <view @click="bindData(2)">{{endTime?endTime:'结束时间'}}</view>
  13. </view>
  14. </view>
  15. <u-tabs :list="tabs" :is-scroll="true" :current="tabIndex" @change="tabChange" active-color="#000000">
  16. </u-tabs>
  17. </view> -->
  18. <mescroll-body :sticky="true" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback">
  19. <!-- 数据列表 -->
  20. <view class="item" v-for="(item,index) in goods" :key='index'
  21. @click="goNav('/pages/index/game/myOrder?id=' + item.massageTypeId + '&userId=' + userId)">
  22. <view class="flex margin-bottom-sm">
  23. <view style="width: 160rpx;height: 160upx;border-radius: 32rpx;">
  24. <image :src="item.massageImg?item.massageImg: '../../static/logo.png'"
  25. style="width: 160rpx;height: 160upx;border-radius: 32rpx;"></image>
  26. </view>
  27. <view class="u-flex-1 text-white margin-left-sm">
  28. <view style="font-weight: bold;font-size: 32rpx;color: #222222;">{{item.title}}</view>
  29. <view style="font-size: 28upx;color: #222;" class="margin-top">{{item.createTime}}</view>
  30. <view style="color:#2FB57A;font-size: 32upx;" class="margin-top">
  31. <text style="font-size: 28upx;color: #222;">{{item.duration}}分钟</text>
  32. </view>
  33. <view class="u-font-14 u-tips-color " v-if="item.content && item.status == 3">
  34. <view class="text-red">拒绝理由:{{item.content}}</view>
  35. </view>
  36. </view>
  37. </view>
  38. <view class="flex justify-between u-p-t-20" style="border-top:1rpx solid #F0F0F0;"
  39. v-if="checkJs != '否'">
  40. <view style="font-weight: bold;font-size: 40rpx;color: #F24E4E;">¥{{item.price}}</view>
  41. <view class="flex">
  42. <u-button v-if="item.status == 1" :custom-style="customStyle"
  43. @click="updateStatus(item)">立即上架</u-button>
  44. <u-button v-if="item.status == 0" class="customStyle2" :custom-style="customStyle"
  45. @click="downdateStatus(item)">立即下架</u-button>
  46. <u-button v-if="item.status == 1" :custom-style="customStyle"
  47. @click="delStatus(item)">删除</u-button>
  48. <!-- <u-button v-if="item.status != 0" :custom-style="customStyle2" shape="square" :plain="true"
  49. @click="update(item)">重新编辑</u-button> -->
  50. </view>
  51. </view>
  52. </view>
  53. <empty v-if="goods.length == 0"></empty>
  54. </mescroll-body>
  55. <view class=" addbtn padding-lr-sm" v-if="checkJs != '否'" @click="bindFb()">
  56. 添加项目
  57. </view>
  58. <u-popup v-model="show" mode="bottom" border-radius="14" :closeable="true" height="800">
  59. <view style="padding: 30rpx 30rpx 0rpx;color: #2FB57A;">*备注:只能添加当前城市项目</view>
  60. <view class="fl_pop " style="margin-top: 40upx;padding-bottom: 120rpx;" v-if="orderList.length">
  61. <view class="flex margin-tb radius margin-lr-sm align-center" v-for="(item,index) in orderList"
  62. :key='index'>
  63. <view>
  64. <u-checkbox-group>
  65. <u-checkbox @change="checkboxChange(item)" v-model="item.checked" active-color="#2FB57A">
  66. </u-checkbox>
  67. </u-checkbox-group>
  68. </view>
  69. <view style="width: 220upx;height: 160upx;border-radius: 10rpx;">
  70. <image :src="item.massageImg?item.massageImg: '../../static/logo.png'"
  71. style="width: 220upx;height: 160upx;border-radius: 30rpx;"></image>
  72. </view>
  73. <view class="margin-left text-white flex flex-direction" style="width: 65%;">
  74. <view class="flex justify-between">
  75. <view class="flex">
  76. <image src="../../static/images/geren.png" style="width: 35rpx;height: 35rpx;">
  77. </image>
  78. <view class="text-bold text-df margin-left-xs text-black">{{item.title}}</view>
  79. </view>
  80. <!-- <view style="color: #999999;font-size: 22upx;">已售1286</view> -->
  81. </view>
  82. <view class="flex flex-wrap" style="margin-top: 10rpx;"
  83. v-if="item.labels && item.labels.length > 0">
  84. <text class="margin-bottom-xs box" v-for="(ite,index) in item.labels"
  85. :key="index">{{ite}}</text>
  86. </view>
  87. <view style="color:#FF1200;font-size: 24upx;margin-top: 10rpx;">
  88. ¥<text style="font-size: 32upx;font-weight: bold;">{{item.price}}/</text>{{item.duration}}分钟
  89. </view>
  90. </view>
  91. </view>
  92. <view class="addbtnf" v-if="checkJs != '否'">
  93. <view class="addbtn1" @click="bindGame()">发布</view>
  94. </view>
  95. </view>
  96. <empty v-if="orderList.length == 0"></empty>
  97. </u-popup>
  98. <!-- 开始时间 -->
  99. <u-picker v-model="startshow" mode="time" :params="paramsStart" @confirm="startData"></u-picker>
  100. <!-- 结束时间 -->
  101. <u-picker v-model="endshow" mode="time" :params="paramsEnd" @confirm="endData"></u-picker>
  102. </view>
  103. </template>
  104. <script>
  105. import MescrollMixin from "@/components/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
  106. import mescrollBody from "@/components/mescroll-uni/components/mescroll-body/mescroll-body.vue";
  107. import meTabs from "@/components/mescroll-uni/me-tabs/me-tabs.vue";
  108. import empty from '../../components/empty.vue'
  109. export default {
  110. mixins: [MescrollMixin], // 使用mixin
  111. components: {
  112. mescrollBody,
  113. meTabs,
  114. // orderList
  115. empty
  116. },
  117. data() {
  118. return {
  119. checkJs: '否',
  120. goods: [], // 数据列表
  121. tabs: [{
  122. name: '出售中',
  123. status: ''
  124. }, {
  125. name: '已下架',
  126. status: '1'
  127. }],
  128. tabIndex: 0, // tab下标
  129. game: [],
  130. page: 1,
  131. limit: 10,
  132. userId: 0,
  133. status: 1,
  134. nickName: '',
  135. avatar: '',
  136. customStyle: {
  137. color: '#FFFFFF',
  138. backgroundColor: '#1EDA94',
  139. borderRadius: "32rpx",
  140. width: '156rpx',
  141. height: '60rpx',
  142. margin: "0 0 0 20rpx",
  143. fontWeight: 'bold',
  144. fontSize: '28rpx',
  145. },
  146. customStyle2: {
  147. color: '#2FB57A',
  148. border: '2rpx solid #2FB57A',
  149. // backgroundColor: '#1E1F31',
  150. border: "8rpx",
  151. width: '160rpx',
  152. height: '54rpx',
  153. margin: "0 0 0 20rpx"
  154. },
  155. customStyle1: {
  156. backgroundColor: "#2FB57A",
  157. color: '#FFFFFF',
  158. border: 0,
  159. color: "#FFF",
  160. height: '98rpx'
  161. },
  162. customStyle2: {
  163. color: '#FFFFFF',
  164. position: "fixed",
  165. bottom: "15rpx",
  166. left: "0rpx",
  167. right: "0rpx",
  168. margin: "0rpx 50rpx",
  169. backgroundColor: '#2FB57A',
  170. },
  171. renzheng: 0,
  172. show: false,
  173. selarr: [],
  174. gameList: [],
  175. orderList: [],
  176. startshow: false,
  177. endshow: false,
  178. paramsStart: {
  179. year: true,
  180. month: true,
  181. day: true,
  182. hour: false,
  183. minute: false,
  184. second: false
  185. },
  186. paramsEnd: {
  187. year: true,
  188. month: true,
  189. day: true,
  190. hour: false,
  191. minute: false,
  192. second: false
  193. },
  194. startTime: '',
  195. endTime: '',
  196. page: 1,
  197. limit: 10,
  198. massageTypeId: [],
  199. classifyId: null,
  200. }
  201. },
  202. onLoad(query) {
  203. this.$queue.showLoading("加载中...");
  204. this.userId = uni.getStorageSync('userId')
  205. this.nickName = uni.getStorageSync('nickName')
  206. // this.getRenZheng()
  207. this.renzheng = uni.getStorageSync("renzheng")
  208. this.classifyId = query.id
  209. this.$Request.get('/app/common/type/319').then(res => {
  210. if (res.code == 0) {
  211. this.checkJs = res.data.value;
  212. }
  213. });
  214. },
  215. onShow() {
  216. // this.mescroll.resetUpScroll()
  217. },
  218. methods: {
  219. // 选中某个复选框时,由checkbox时触发
  220. checkboxChange(e) {
  221. },
  222. //时间弹框开关
  223. bindData(index) {
  224. // console.log(index, 1111)
  225. if (index == 1) {
  226. this.startshow = true
  227. } else if (index == 2) {
  228. this.endshow = true
  229. }
  230. },
  231. //开始时间
  232. startData(e) {
  233. // console.log(e)
  234. this.startTime = e.year + ' ' + e.month + '-' + e.day
  235. },
  236. // 结束时间
  237. endData(e) {
  238. this.endTime = e.year + ' ' + e.month + '-' + e.day
  239. // console.log(this.endTime)
  240. },
  241. //发布列表 查看详情
  242. goOrder(e) {
  243. uni.navigateTo({
  244. url: '/pages/index/game/myOrder?id=' + e.id
  245. })
  246. },
  247. // 技能列表
  248. bindList(index, item) {
  249. console.log(index)
  250. if (this.selarr.length > 0 && item.ischeck == false) {
  251. uni.showToast({
  252. title: '只能选择一个项目',
  253. icon: 'none'
  254. })
  255. return
  256. }
  257. if (item.ischeck == false) {
  258. item.ischeck = true;
  259. this.selarr.push(item)
  260. } else {
  261. item.ischeck = false;
  262. let index11 = this.selarr.indexOf(index)
  263. this.selarr.splice(index11, 1)
  264. }
  265. this.selarr = this.selarr;
  266. },
  267. getcity() {
  268. let that = this
  269. uni.getLocation({
  270. type: 'wgs84',
  271. success: function(res) {
  272. console.log('当前位置的经度:' + res.longitude);
  273. console.log('当前位置的纬度:' + res.latitude);
  274. that.Mycity(res.latitude, res.longitude)
  275. }
  276. });
  277. },
  278. //获取省市区
  279. Mycity(latitude, longitude) {
  280. this.$Request.get("/app/Login/selectCity", {
  281. lat: latitude,
  282. lng: longitude
  283. }).then(res => {
  284. console.log(res)
  285. this.city = res.data.city
  286. this.getMassageType()
  287. });
  288. },
  289. bindFb() {
  290. let renzheng = uni.getStorageSync('renzheng')
  291. let isCashDeposit = uni.getStorageSync('isCashDeposit')
  292. if (renzheng == 2) {
  293. let bzjCheck = this.$queue.getData("bzjCheck");
  294. if (bzjCheck != '否') {
  295. if (isCashDeposit == 2) {
  296. this.show = true
  297. this.getcity()
  298. } else if (isCashDeposit == 3) {
  299. uni.showToast({
  300. title: '系统审核中,请耐心等待',
  301. icon: 'none',
  302. duration: 1000
  303. })
  304. } else {
  305. uni.showModal({
  306. title: '提示',
  307. content: '您还未缴纳保证金,请先缴纳保证金',
  308. success: function(res) {
  309. if (res.confirm) {
  310. console.log('用户点击确定');
  311. uni.navigateTo({
  312. url: '/my/publish/money'
  313. })
  314. } else if (res.cancel) {
  315. console.log('用户点击取消');
  316. }
  317. }
  318. })
  319. }
  320. } else {
  321. this.show = true
  322. this.getcity()
  323. }
  324. } else {
  325. if (renzheng == 1) {
  326. uni.showToast({
  327. title: '系统审核中,请耐心等待',
  328. icon: 'none',
  329. })
  330. } else {
  331. uni.showModal({
  332. title: '提示',
  333. content: '您还未实名认证,请先认证',
  334. success: function(res) {
  335. if (res.confirm) {
  336. console.log('用户点击确定');
  337. uni.navigateTo({
  338. url: '/my/renzheng/rzType'
  339. })
  340. } else if (res.cancel) {
  341. console.log('用户点击取消');
  342. }
  343. }
  344. })
  345. }
  346. }
  347. },
  348. /*下拉刷新的回调 */
  349. downCallback() {
  350. // 这里加载你想下拉刷新的数据, 比如刷新轮播数据
  351. // loadSwiper();
  352. // 下拉刷新的回调,默认重置上拉加载列表为第一页 (自动执行 page.num=1, 再触发upCallback方法 )
  353. this.mescroll.resetUpScroll()
  354. },
  355. /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
  356. upCallback(page) {
  357. let curTab = this.tabs[this.tabIndex].status
  358. let data = {
  359. status: curTab,
  360. page: page.num,
  361. limit: page.size,
  362. artificerId: uni.getStorageSync('artificerId')
  363. }
  364. this.$Request.get('/app/artificer/selectArtificerMassage', data).then(res => {
  365. uni.hideLoading();
  366. this.mescroll.endBySize(res.data.list.length, res.data.totalCount)
  367. if (page.num == 1) this.goods = []; //如果是第一页需手动制空列表
  368. this.goods = [...this.goods, ...res.data.list]; //追加新数据
  369. // for (let i = 0; i < this.goods.length; i++) {
  370. // this.goods[i].gameName = this.goods[i].gameName.split(",");
  371. // console.log(this.goods[i].gameName)
  372. // }
  373. this.mescroll.endSuccess(res.data.list.length); // 隐藏加载状态栏
  374. }).catch(() => {
  375. //联网失败, 结束加载
  376. this.mescroll.endErr();
  377. });
  378. },
  379. // 切换菜单
  380. tabChange(index) {
  381. this.tabIndex = index
  382. this.goods = []; // 置空列表,显示加载进度条
  383. this.mescroll.resetUpScroll()
  384. },
  385. // 上架
  386. updateStatus(e) {
  387. let data = {
  388. artificerMassageId: e.artificerMassageId,
  389. status: 0
  390. }
  391. this.$Request.postJson('/app/artificer/updateArtificerMassage', data).then(res => {
  392. if (res.code == 0) {
  393. this.mescroll.resetUpScroll()
  394. } else {
  395. uni.showToast({
  396. title: res.msg,
  397. icon: 'none',
  398. duration: 1000
  399. })
  400. }
  401. })
  402. },
  403. //下架
  404. downdateStatus(e) {
  405. let data = {
  406. artificerMassageId: e.artificerMassageId,
  407. status: 1
  408. }
  409. this.$Request.postJson('/app/artificer/updateArtificerMassage', data).then(res => {
  410. if (res.code == 0) {
  411. this.mescroll.resetUpScroll()
  412. } else {
  413. uni.showToast({
  414. title: res.msg,
  415. icon: 'none',
  416. duration: 1000
  417. })
  418. }
  419. })
  420. },
  421. // 重新编辑
  422. update(e) {
  423. console.log(e)
  424. if (this.renzheng != 2 && this.renzheng != 5) {
  425. uni.showToast({
  426. title: '请先完成实名认证',
  427. icon: 'none',
  428. duration: 1000
  429. })
  430. } else {
  431. if (this.renzheng == 2) {
  432. if (e.authentication == 2) {
  433. uni.showToast({
  434. title: '当前为个人已实名状态,不可发布企业订单',
  435. icon: 'none',
  436. duration: 1000
  437. })
  438. } else if (e.authentication == 1) {
  439. uni.navigateTo({
  440. url: '/my/publish/editor?id=' + e.id
  441. })
  442. }
  443. } else if (this.renzheng == 5) {
  444. if (e.authentication == 1) {
  445. uni.showToast({
  446. title: '当前为企业已实名状态,不可发布个人订单',
  447. icon: 'none',
  448. duration: 1000
  449. })
  450. } else if (e.authentication == 2) {
  451. uni.navigateTo({
  452. url: '/my/publish/firm?id=' + e.id
  453. })
  454. }
  455. }
  456. }
  457. },
  458. //删除
  459. delStatus(e) {
  460. console.log(e)
  461. let that = this
  462. uni.showModal({
  463. title: '提示',
  464. content: '确定删除吗?',
  465. success: function(res) {
  466. if (res.confirm) {
  467. let data = {
  468. id: e.artificerMassageId
  469. }
  470. that.$Request.postT('/app/artificer/deleteArtificerMassage', data).then(res => {
  471. uni.showToast({
  472. title: "删除成功"
  473. })
  474. that.mescroll.resetUpScroll()
  475. })
  476. } else if (res.cancel) {
  477. console.log('用户点击取消');
  478. }
  479. }
  480. });
  481. },
  482. // 完善需求
  483. edit(item) {
  484. uni.navigateTo({
  485. url: '/pages/order/release?type=hasEdit&id=' + item.id + '&content=' + item.content +
  486. '&site=' + item.site +
  487. '&phone=' + item.phone + '&deliveryTime=' + item.deliveryTime + '&classifyId=' + item
  488. .classifyId +
  489. '&classifyName=' + item.classifyName + '&userType=' + item.userType + '&commission=' + item
  490. .commission + '&image=' + item.image + '&address=' + item.address + '&latitude=' + item
  491. .latitude + '&longitude=' + item.longitude
  492. })
  493. },
  494. clickItem: function(e) {
  495. console.log('点击', e)
  496. uni.navigateTo({
  497. url: '/pages/index/game/order?id=' + e.orderTakingId + '&userId=' + e.userId
  498. });
  499. },
  500. goNav(e) {
  501. uni.navigateTo({
  502. url: e
  503. })
  504. },
  505. //发布列表
  506. getMassageType() {
  507. let data = {
  508. // page: this.page,
  509. // limit: this.limit,
  510. city: this.city,
  511. artificerId: uni.getStorageSync('artificerId'),
  512. classifyId: this.classifyId
  513. }
  514. this.$Request.get('/app/artificer/selectMassageTypeList', data).then(res => {
  515. // console.log(res)
  516. for (let i = 0; i < res.data.length; i++) {
  517. if (res.data[i].labels) {
  518. res.data[i].labels = res.data[i].labels.split(",");
  519. }
  520. res.data[i].checked = false
  521. }
  522. // if (this.page == 1) this.orderList = []; //如果是第一页需手动制空列表
  523. // this.orderList = [...this.orderList, ...res.data]; //追加新数据
  524. this.orderList = res.data
  525. })
  526. },
  527. bindGame() {
  528. this.orderList.forEach(res => {
  529. if (res.checked == true) {
  530. this.massageTypeId.push(res.massageTypeId)
  531. this.getMassageType()
  532. // console.log(this.massageTypeId.push(res.massageTypeId))
  533. }
  534. })
  535. if (this.massageTypeId == '') {
  536. uni.showToast({
  537. title: '请选择发布的项目',
  538. icon: 'none',
  539. duration: 1000
  540. })
  541. return
  542. }
  543. let data = {
  544. artificerMassages: this.massageTypeId.toString()
  545. // artificerId:uni.getStorageSync('artificerId')
  546. }
  547. this.$Request.postT('/app/artificer/insertArtificerMassage', data).then(res => {
  548. console.log(res)
  549. if (res.code == 0) {
  550. this.show = false
  551. this.massageTypeId = []
  552. this.mescroll.resetUpScroll()
  553. } else {
  554. uni.showToast({
  555. title: res.msg,
  556. icon: 'none',
  557. duration: 1000
  558. })
  559. }
  560. })
  561. }
  562. },
  563. onReachBottom: function() {
  564. this.page = this.page + 1;
  565. // this.getMassageType();
  566. },
  567. onPullDownRefresh: function() {
  568. this.page = 1;
  569. // this.getMassageType();
  570. },
  571. }
  572. </script>
  573. <style lang="scss">
  574. /*
  575. sticky生效条件:
  576. 1、父元素不能overflow:hidden或者overflow:auto属性。(mescroll-body设置:sticky="true"即可, mescroll-uni本身没有设置overflow)
  577. 2、必须指定top、bottom、left、right4个值之一,否则只会处于相对定位
  578. 3、父元素的高度不能低于sticky元素的高度
  579. 4、sticky元素仅在其父元素内生效,所以父元素必须是 mescroll
  580. */
  581. .sticky-tabs {
  582. z-index: 990;
  583. position: sticky;
  584. top: var(--window-top);
  585. // background-color: #fff;
  586. }
  587. // 使用mescroll-uni,则top为0
  588. .mescroll-uni,
  589. /deep/.mescroll-uni {
  590. .sticky-tabs {
  591. top: 0;
  592. }
  593. }
  594. .demo-tip {
  595. padding: 18upx;
  596. font-size: 24upx;
  597. text-align: center;
  598. }
  599. .publish-page {
  600. background-color: #F5F5F5;
  601. padding: 20rpx 32rpx;
  602. .item {
  603. background: #FFFFFF;
  604. border-radius: 32rpx 32rpx 32rpx 32rpx;
  605. padding: 24rpx;
  606. margin-bottom: 20rpx;
  607. }
  608. }
  609. .addbtn {
  610. position: fixed;
  611. bottom: 40rpx;
  612. left: 32rpx;
  613. z-index: 99;
  614. width: 686rpx;
  615. height: 100rpx;
  616. line-height: 100rpx;
  617. background: #1EDA94;
  618. border-radius: 86rpx 86rpx 86rpx 86rpx;
  619. text-align: center;
  620. font-weight: bold;
  621. font-size: 32rpx;
  622. color: #FFFFFF;
  623. }
  624. .addbtnf {
  625. width: 100%;
  626. height: 100upx;
  627. z-index: 999;
  628. background: #FFFFFF;
  629. text-align: center;
  630. position: fixed;
  631. bottom: 0px;
  632. left: 0;
  633. right: 0;
  634. display: flex;
  635. align-items: center;
  636. }
  637. .addbtn1 {
  638. width: 685upx;
  639. height: 88upx;
  640. line-height: 88upx;
  641. z-index: 999;
  642. background: #2FB57A;
  643. color: #FFFFFF;
  644. text-align: center;
  645. margin: 0 auto;
  646. border-radius: 8upx;
  647. font-size: 32upx;
  648. font-weight: bold;
  649. }
  650. .tabBox {
  651. border: 1rpx solid #999999;
  652. // padding: 15rpx 20rpx;
  653. border-radius: 15rpx;
  654. font-size: 28rpx;
  655. width: 150upx;
  656. line-height: 60upx;
  657. text-align: center;
  658. }
  659. .box {
  660. // border: 3rpx solid #005dff;
  661. background: #E8FAE1;
  662. color: #2FB57A;
  663. padding: 5rpx 15rpx;
  664. font-size: 26rpx;
  665. letter-spacing: 2rpx;
  666. border-radius: 8rpx;
  667. // margin-top: 10rpx;
  668. margin-right: 8upx;
  669. }
  670. </style>