feature/v-xuexi
wangdong 10 months ago
parent db609de774
commit 74584fe7dd
  1. 15
      api/store.js
  2. 6
      pages.json
  3. 17
      pages/learningCenter/brushQuestion.vue
  4. 2
      pages/my/address.vue
  5. 1
      pages/my/follow_lecturer.vue
  6. 140
      pages/my/invoiceList.vue
  7. 2
      pages/my/orgCooperation.vue
  8. 22
      pages/special/grade_list.vue
  9. 10
      pages/store/applyInvoicing.vue
  10. 22
      pages/store/detail.vue
  11. 43
      pages/store/goodsCate.vue
  12. 23
      pages/store/goodsList.vue
  13. 429
      pages/store/shoppingCart.vue
  14. BIN
      static/images/learning/exam-bg.png
  15. BIN
      static/images/learning/exam-icon.png
  16. BIN
      static/images/learning/to.png

@ -58,4 +58,17 @@ export function editInvoiceHeader(params) {
export function applyInvoice(params) {
return http.post("/invoice/make", params);
}
}
export function deleteInvoice(params) {
return http.post("/invoice/delete", params);
}
export function getCartList(params) {
return http.get("/Auth_Api/get_cart_list", params);
}
export function joinCart(params) {
return http.get("/Auth_Api/set_cart", params);
}

@ -90,6 +90,12 @@
"style": {
"navigationBarTitleText": "申请开票"
}
},
{
"path": "pages/store/shoppingCart",
"style": {
"navigationBarTitleText": "购物车"
}
}
],
"subPackages": [

@ -3,12 +3,12 @@
<NavBar title="刷题过关" />
<advert :img="'/static/frontend/learning-advert.png'" :height="140" />
<view class="exam flex flex-center-x">
<image src="" mode="aspectFill"></image>
<image src="@/static/images/learning/exam-icon.png" mode="aspectFill" class="exam-icon"></image>
<view class="intro">
<view>组合卷考试</view>
<view>完成付费试题后可参加</view>
</view>
<view class="exam-btn"></view>
<image src="@/static/images/learning/to.png" mode="aspectFill" class="exam-to"></image>
</view>
<view class="list">
<template v-if="list.length > 0">
@ -68,11 +68,15 @@ import Advert from '@/components/Advert/index.vue';
width: 690rpx;
margin: 32rpx 30rpx 0;
height: 180rpx;
background: #386FF4;
background-color: #386FF4;
border-radius: 10rpx;
padding: 0 65rpx 0 50rpx;
>image {
width: 64rpx;
background-image: url(@/static/images/learning/exam-bg.png);
background-repeat: no-repeat;
background-position: center center;
background-size: 100% 100%;
.exam-icon {
width: 54rpx;
height: 64rpx;
margin-right: 55rpx;
}
@ -90,11 +94,10 @@ import Advert from '@/components/Advert/index.vue';
}
}
}
.exam-btn {
.exam-to {
width: 46rpx;
height: 46rpx;
border-radius: 50%;
background: #fff;
}
}
.list {

@ -94,7 +94,7 @@ export default {
try {
await removeUserAddress(id);
uni.hideLoading();
this.$util.showMsg("删除成功!");
uni.showMsg("删除成功!");
this.address = this.address.filter((value) => value.id !== id);
} catch (err) {
uni.hideLoading();

@ -189,6 +189,7 @@
.my-follow .empty {
display: block;
width: 414rpx;
height: 305rpx;
margin: 100rpx auto 0;
}
</style>

@ -17,9 +17,19 @@
<view class="content-time">开票时间{{ item.created_at }}</view>
</view>
</view>
<image v-if="!applyInvoicingList.length" class="empty" :src="getImgPath('/wap/first/zsff/images/empty.png')" alt=""/>
</view>
<view v-else class="invoice-header-list">
<view v-for="(item, index) in invoiceHeaderList" :key="index" class="invoice-header-item">
<view
v-for="(item, index) in invoiceHeaderList"
:key="index"
ref="box_center"
class="invoice-header-item"
@touchstart="drawStart"
@touchmove="drawMove(index,$event)"
@touchend="drawEnd(index,$event)"
:style="{ left: activeHeaderMask === index ? '-120rpx' : '' }"
>
<view class="item-head flex flex-center-x">
<text :style="item.header_type === 2 ? 'background: #FEE1E1;color: #FF5C6B;' : 'background: #F3F6FD;color: #1C92E7;'">{{ item.header_type === 1 ? '个人' : '企业' }}</text>
<text>{{ item.invoice_header }}</text>
@ -28,7 +38,12 @@
<view class="item-content">
普通发票-{{ item.header_type === 1 ? '个人' : '企业' }}抬头
</view>
<view class="function-mask" :style="{visibility: activeHeaderMask === index ? 'visible' : 'hidden' }" @click="activeHeaderMask = -1"></view>
<view class="function" @click.stop="deleteHeader(item)" data-name="删除">
<view class="btn">删除</view>
</view>
</view>
<image v-if="!invoiceHeaderList.length" class="empty" :src="getImgPath('/wap/first/zsff/images/empty.png')" alt=""/>
</view>
<view v-if="activeTab === tabList[1]" class="add-header" @click="addHeader">添加新的抬头</view>
</view>
@ -36,7 +51,7 @@
</template>
<script>
import { getApplyInvoicingList, getInvoiceHeaderList } from '@/api/store';
import { getApplyInvoicingList, getInvoiceHeaderList, deleteInvoice } from '@/api/store';
export default {
data() {
return {
@ -45,14 +60,9 @@
'发票抬头',
],
activeTab: '开票申请',
applyInvoicingList: [
{ type: '企业' , name: '南京梦航教育有限公司', status: 0, money: '1202.00', time: '2023-10-10 12:30:34' },
{ type: '个人' , name: '张三', status: 1, money: '1202.00', time: '2023-10-10 12:30:34' },
],
invoiceHeaderList: [
{ type: '企业' , name: '南京梦航教育有限公司' },
{ type: '个人' , name: '张三' },
]
applyInvoicingList: [],
invoiceHeaderList: [],
activeHeaderMask: -1,
};
},
watch: {
@ -126,16 +136,80 @@
url: `/pages/store/applyInvoicing?info=${JSON.stringify(item)}`,
});
},
//
drawStart(e) {
console.log('触摸',e);
this.clientX = e.changedTouches[0].clientX
},
//
drawMove(id, e) {
console.log('过程',e.changedTouches[0]);
var endX = e.changedTouches[0].clientX;
let diff = endX - this.clientX;
console.log(diff);
if (Math.abs(diff) <= 60 && diff < 0) {
let box_center = this.$refs.box_center[id]
// console.log(diff);
box_center.$el.style.left = diff + 'px'
}
},
//
drawEnd(id, e) {
console.log('结束',e.changedTouches[0], e);
var endX = e.changedTouches[0].clientX;
let diff = endX - this.clientX;
if (Math.abs(diff) > 20) {
// console.log('',diff,id,e);
if (diff < 0) {
this.activeHeaderMask = id;
} else {
this.activeHeaderMask = -1;
}
}
},
deleteHeader(item) {
console.log(item);
uni.showModal({
title: "提示",
content: "是否删除该抬头?",
success: async ({ confirm }) => {
if (!confirm) return;
uni.showLoading({
mask: true,
});
try {
await deleteInvoice({ id: item.id });
this.activeHeaderMask = -1;
// uni.hideLoading();
// this.$util.showMsg("!");
this.getInvoiceHeaderList();
} catch (err) {
uni.hideLoading();
this.$util.showMsg(err.msg);
}
},
});
},
},
};
</script>
<style lang="scss" scoped>
.invoice-list {
::v-deep .base-container {
width: 100%;
/* #ifdef MP-WEIXIN */
padding-bottom: 0!important;
/* #endif */
}
.invoice-list{
width: 100%;
height: 100vh;
background: #f5f5f5;
.invoice-content {
flex: 1;
height: 100%;
width: 100%;
.invoice-tab-list {
width: 100%;
height: 96rpx;
@ -180,9 +254,17 @@
}
.apply-invoicing-list,
.invoice-header-list {
width: 690rpx;
height: calc(100% - 96rpx);
overflow-y: auto;
padding-top: 20rpx;
padding: 20rpx 0 0;
margin: 0 auto;
.empty {
display: block;
width: 414rpx;
height: 305rpx;
margin: 100rpx auto 0;
}
.apply-invoicing-item{
width: 690rpx;
height: 228rpx;
@ -233,6 +315,7 @@
border-radius: 10rpx;
background: #fff;
padding: 0 16rpx;
position: relative;
.item-head {
padding: 0 8rpx 0 12rpx;
height: 88rpx;
@ -265,10 +348,41 @@
font-size: 28rpx;
padding-left: 12rpx;
}
.function-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 10;
visibility: hidden;
}
.function {
width: 120rpx;
height: 100%;
background: #F8473E;
border-radius: 0rpx 10rpx 10rpx 0rpx;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 0;
right: -120rpx;
z-index: 10;
.btn {
width: 30rpx;
white-space: pre-wrap;
overflow: auto;
font-size: 28rpx;
color: #fff;
line-height: 36rpx;
}
}
}
}
.invoice-header-list {
height: calc(100% - 226rpx);
overflow-x: hidden;
}
}
</style>

@ -56,14 +56,12 @@
data() {
return {
special_id: '',
specialInfo: {},
applyForm: {
real_name: '',
mobile: '',
recommend_user: '',
address: '',
},
payDialogOpen: false,
payDialogOpen: false, //
money: 200.0,
pay_type_num: 20,

@ -4,7 +4,7 @@
<NavBarTitle title="我的收藏" :height="88"/>
<view v-if="type" ref="tabbar" class="tabbar">
<view :class="{ on: active === 1 }" @click="tab(1)">资料</view>
<view :class="{ on: active === 2 }" @click="tab(2)">老师</view>
<!-- <view :class="{ on: active === 2 }" @click="tab(2)">老师</view> -->
<view :class="{ on: active === 0 }" @click="tab(0)">课程</view>
</view>
<view v-if="makeGradeList.length" :class="{ material: active }" class="list">
@ -18,11 +18,13 @@
@touchstart="drawStart"
@touchmove="drawMove(index,$event)"
@touchend="drawEnd(index,$event)"
:style="{ left: activeHeaderMask === index ? '-120rpx' : '' }"
>
<view>
<image mode="aspectFill" :src="item.image" alt="" />
<!-- <view v-if="!active">{{ type == 1 ? item.types : item.type }}</view> -->
</view>
<view class="function-mask" :style="{visibility: activeHeaderMask === index ? 'visible' : 'hidden' }" @click="activeHeaderMask = -1"></view>
<view class="function">
<view class="btn">取消收藏</view>
</view>
@ -94,6 +96,7 @@ export default {
page: 1,
limit: 10,
count: 0,
activeHeaderMask: -1,
};
},
computed: {
@ -189,15 +192,11 @@ export default {
if (Math.abs(diff) > 20) {
// console.log('',diff,id,e);
if (diff < 0) {
box_center.$el.style.left = '-60px'
this.activeHeaderMask = id;
} else {
box_center.$el.style.left = '0'
this.activeHeaderMask = -1;
}
}else{
box_center.$el.style.left = '0'
}
},
},
};
@ -239,6 +238,15 @@ page{
.list-item {
position: relative;
background: #ffffff;
.function-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 10;
visibility: hidden;
}
.function {
width: 120rpx;
height: 100%;

@ -110,7 +110,7 @@
methods: {
changeRadioType(e) {
console.log(e, this.invoicingInfo.type);
this.invoicingInfo.type = e.detail.value;
this.invoicingInfo.type = Number(e.detail.value);
this.invoicingInfo.invoiceHeader = '';
this.invoicingInfo.dutyParagraph = '';
this.invoicingInfo.address = '';
@ -246,8 +246,7 @@
font-size: 32rpx;
}
}
::v-deep {
uni-radio-group, {
radio-group {
display: flex;
align-items: center;
justify-content: flex-end;
@ -256,7 +255,7 @@
height: 34rpx;
}
}
.uni-label-pointer {
label {
display: flex;
align-items: center;
margin-left: 63rpx;
@ -264,10 +263,9 @@
input {
text-align: right;
}
uni-picker {
picker {
text-align: right;
}
}
}
}
}

@ -140,6 +140,7 @@ import {
getReplyList,
getStoreDetail,
createOrder,
joinCart,
} from "@/api/store";
import { getLecturer, getRebateAmount } from "@/api/auth";
import RebateGuide from "@/components/RebateGuide/index.vue";
@ -250,6 +251,11 @@ export default {
case 2:
this.$util.goSupport(CUSTOMER_DETAIL_TYPE.GOOD, CUSTOMER_SUPPORT_TYPE.STORE_GOOD, this.id, this.storeInfo.mer_id);
break;
case 3:
uni.navigateTo({
url: "/pages/store/shoppingCart",
});
break;
}
},
//
@ -273,7 +279,21 @@ export default {
}, true);
},
joinCart() {
// this.$util.checkLogin();
this.$util.checkLogin(async () => {
try {
const { code, data, msg } = await joinCart({
productId: this.storeInfo.id,
cartNum: 1,
});
if (code === 200) {
this.$util.showMsg('添加成功');
} else {
this.$util.showMsg(msg);
}
} catch (err) {
this.$util.showMsg(err.msg);
}
}, true);
},
//
changeVal(opt) {

@ -31,47 +31,7 @@
export default {
data() {
return {
goodsCateList: [
{
name: '特别推荐',
list: [
{
title: '四级必备',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
{
title: '托福雅思',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
]
},
{
name: '考研试卷',
list: [
{
title: '四级必备',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
{
title: '托福雅思',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
]
},
{
name: '语言学习',
list: [
{
title: '四级必备',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
{
title: '托福雅思',
list: [{name: '二级分类01'}, {name: '二级分类02'}, {name: '二级分类03'}, {name: '二级分类04'}],
},
]
}
],
goodsCateList: [],
bigCate: '',
};
},
@ -91,6 +51,7 @@
children: data.recommend,
},
].concat(data.category_list);
this.bigCate = '特别推荐';
console.log(this.goodsCateList);
} catch (err) { }
},

@ -39,7 +39,7 @@
<view class="price">
<span class="num">{{ item.price }}</span>
</view>
<image src="@/static/images/store/cart.png" mode="aspectFill" class="cart-image"></image>
<image src="@/static/images/store/cart.png" mode="aspectFill" class="cart-image" @click.stop="joinCart(item)"></image>
</view>
</view>
</navigator>
@ -53,7 +53,7 @@
</template>
<script>
import { getGoodsList } from "@/api/store";
import { getGoodsList, joinCart } from "@/api/store";
import { debounce } from 'lodash';
export default {
@ -112,6 +112,23 @@
this.loading = false;
},
joinCart(item) {
this.$util.checkLogin(async () => {
try {
const { code, data, msg } = await joinCart({
productId: item.id,
cartNum: 1,
});
if (code === 200) {
this.$util.showMsg('添加成功');
} else {
this.$util.showMsg(msg);
}
} catch (err) {
this.$util.showMsg(err.msg);
}
}, true);
},
},
};
</script>
@ -119,7 +136,7 @@
<style lang="scss" scoped>
.goods-list {
background: #f6f6f6;
padding: 0 30rpx 40rpx;
// padding: 0 30rpx 40rpx;
.form {
padding: 20rpx 0 ;
.left {

@ -0,0 +1,429 @@
<template>
<BaseContainer class="shopping-cart flex">
<NavBar title="购物车" />
<view class="cart-container">
<view class="cart-info flex flex-center-x">
<view> {{ goodsList.length }} 件商品</view>
<view class="edit">编辑</view>
</view>
<view class="list">
<view v-for="item in goodsList" :key="item.id" class="item">
<i class="iconfont icongouxuan" :class="{ active: checkedGoods.includes(item.productInfo.id) }" @click="checkGoods(item.productInfo.id)"></i>
<view class="image">
<image mode="aspectFit" class="img" :src="item.productInfo.image" alt="" />
</view>
<view class="text">
<view class="title">{{ item.productInfo.store_name }}</view>
<view class="label flex">
<view v-for="(label, k) in item.productInfo.label">{{ label }}</view>
</view>
<view class="group">
<view class="price">
<span class="num">{{ item.productInfo.price }}</span>
</view>
<view class="num">
<text @click="reduceCartNum(item)">-</text>
<input type="number" v-model="item.cart_num"/>
<text @click="addCartNum(item)">+</text>
</view>
</view>
</view>
</view>
</view>
<view v-if="!goodsList.length" class="empty">
<image mode="aspectFill" :src="getImgPath('/wap/first/zsff/images/empty.png')" alt="暂无商品" />
<view>暂无商品</view>
</view>
</view>
<view class="cart-footer flex flex-center-x">
<label class="radio" @click="changeAllSelect">
<radio value="全部" :checked="allSelect" /><text>全选</text>
</label>
<view class="total">合计<text>{{ total }}</text></view>
<view class="pay-btn" @click="toPay">去结算<text v-if="checkedGoods.length > 0">({{ checkedGoods.length }})</text></view>
</view>
<PayDialog v-if="initDataLoading" :open.sync="payDialogOpen" :money="Number(total)" :now_money="now_money"
:pay_type_num="pay_type_num" :special_id="Number(special_id)" :is-wechat="isWechat" :is-alipay="is_alipay" :is-balance="is_yue"
:template-id="templateId" :wxpay-h5="wxpayH5" @change="changeVal" />
</BaseContainer>
</template>
<script>
import { getCartList } from "@/api/store";
import {
getInitData
} from "@/api/special";
import PayDialog from "@/components/PayDialog/index.vue";
export default {
components: {
PayDialog,
},
data() {
return {
special_id: '',
allSelect: false,
selectGoods: [],
goodsList: [],
checkedGoods: [],
total: 0,
payDialogOpen: false, //
pay_type_num: 20,
is_alipay: false, //
is_yue: false, //
now_money: 0, //
templateId: "",
wxpayH5: false,
initDataLoading: false,
};
},
watch: {
checkedGoods: {
deep: true,
handler() {
console.log(this.checkedGoods);
let total = 0;
this.goodsList.forEach(v => {
if (this.checkedGoods.includes(v.productInfo.id)) {
total += Number(v.cart_num) * Number(v.productInfo.price);
}
});
this.total = total;
},
},
goodsList: {
deep: true,
handler() {
let total = 0;
this.goodsList.forEach(v => {
if (this.checkedGoods.includes(v.productInfo.id)) {
total += Number(v.cart_num) * Number(v.productInfo.price);
}
});
this.total = total;
},
},
},
onLoad() {
this.getCartList();
this.getInitData();
},
methods: {
getInitData() {
getInitData().then(({ data }) => {
const { isWechat, is_alipay, is_yue, now_money, wxpayH5 } = data;
Object.assign(this, {
isWechat,
url: isWechat ? "/pages/index/login" : "/pages/login/phone_check",
is_alipay: is_alipay == 1,
is_yue: is_yue == 1,
now_money: Number(now_money),
wxpayH5,
initDataLoading: true,
});
});
},
changeAllSelect() {
this.allSelect = !this.allSelect;
if (this.allSelect) {
const arr = [];
this.goodsList.forEach(v => {
arr.push(v.productInfo.id);
});
this.checkedGoods = arr;
} else {
this.checkedGoods = [];
}
},
async getCartList() {
try {
const { data } = await getCartList();
console.log(data);
this.goodsList = data.valid;
} catch (err) {
console.log(err);
}
},
checkGoods(id) {
if (this.checkedGoods.includes(id)) {
this.checkedGoods = this.checkedGoods.filter(item => item !== id);
} else {
this.checkedGoods.push(id);
}
this.allSelect = this.checkedGoods.length === this.goodsList.length;
},
reduceCartNum(item) {
item.cart_num = Number(item.cart_num) - 1 > 1 ? Number(item.cart_num) - 1 : 1;
},
addCartNum(item) {
item.cart_num = Number(item.cart_num) + 1;
},
toPay() {
console.log(111);
if (this.total === 0) {
console.log(111);
this.$util.showMsg("请选择商品");
} else {
this.payDialogOpen = true;
console.log(111);
}
},
changeVal(opt) {
if (typeof opt !== "object") {
opt = {};
}
console.log(opt);
var action = opt.action || "";
var value = opt.value || "";
this[action] && this[action](value);
},
//
pay_order: function (data) {
this.orderId = data.data.result.orderId || "";
switch (data.data.status) {
case "PAY_ERROR":
case "ORDER_EXIST":
case "ORDER_ERROR":
this.extendOrder(data.msg);
break;
case "WECHAT_PAY":
this.wechatPay(data.data.result.jsConfig);
break;
case "WECHAT_H5_PAY":
this.payDialogOpen = false;
this.$util.wechatH5Pay(data.data.result.jsConfig, this);
break;
case "WECHAT_ROUTINE_PAY":
this.$util.wechatRoutinePay(data.data.result.jsConfig, this);
break;
case "SUCCESS":
this.successOrder(data.msg);
break;
case "ZHIFUBAO_PAY":
this.aliPay(data.data.result, "datadownload");
break;
case 'TOUTIAO_PAY':
this.$util.toutiaoPay(data.data.result.jsConfig, this);
break;
case 'KUAISHOU_PAY':
this.$util.kuaishouPay(data.data.result.jsConfig, this);
break
}
},
extendOrder(msg) {
if (typeof msg === "object" && msg.errMsg === "chooseWXPay:cancel") {
msg = "微信支付取消";
} else {
msg = "支付失败";
}
this.$util.showMsg(msg);
this.payDialogOpen = false;
if (this.orderId) {
delSpecialOrder(this.orderId);
}
},
wechatPay(config) {
this.$util.weixinpay(config, this);
},
successOrder(msg) {
this.$util.showMsg(msg ? msg : "支付成功");
this.payDialogOpen = false;
this.submitApply();
},
aliPay(msn, type) {
this.$util.aliPay(msn, type, this);
},
},
};
</script>
<style lang="scss" scoped>
.shopping-cart {
background: #f6f6f6;
flex-direction: column;
.cart-container {
height: 100%;
.cart-info {
height: 78rpx;
color: #BBBBBB;
font-size: 28rpx;
padding: 0 35rpx 0 44rpx;
justify-content: space-between;
}
.list {
width: 690rpx;
margin: 0 auto;
}
.list .item {
margin-bottom: 30rpx;
padding: 26rpx 24rpx;
background: #fff;
display: flex;
border-radius: 10rpx;
align-items: center;
.iconfont {
display: inline-block;
width: 40rpx;
height: 40rpx;
border: 1px solid #e5e5e5;
border-radius: 50%;
box-sizing: border-box;
vertical-align: middle;
font-size: 0;
line-height: 40rpx;
text-align: center;
color: #c3c3c3;
margin-right: 12rpx;
&.active {
border: 0;
background: #2c8eff;
font-size: 20rpx;
color: #ffffff;
}
}
.label {
height: 38rpx;
view {
height: 38rpx;
line-height: 38rpx;
background: #e1feee;
padding: 0 15rpx;
margin-right: 10rpx;
color: #28ce8f;
font-size: 20rpx;
&:nth-child(2) {
color: #ff5c6b;
background: #fee1e1;
}
}
}
}
.list .image {
width: 156rpx;
height: 184rpx;
margin-right: 52rpx;
flex-shrink: 0;;
}
.list .image .img {
width: 100%;
height: 100%;
}
.list .text {
flex: 1;
display: flex;
flex-direction: column;
padding-top: 13rpx;
}
.list .title {
overflow: hidden;
font-size: 28rpx;
line-height: 35rpx;
height: 70rpx;
color: #333;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
margin-bottom: 13rpx;
}
.list .group {
margin-top: auto;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 6rpx;
.num {
display: flex;
text {
width: 60rpx;
height: 60rpx;
border-radius: 30rpx 0 0 30rpx;
text-align: center;
line-height: 60rpx;
border: 2rpx solid #E6E6E6;
box-sizing: border-box;
&:last-child {
border-radius: 0 30rpx 30rpx 0;
}
}
input {
width: 80rpx;
height: 60rpx;
text-align: center;
border-top: 2rpx solid #E6E6E6;
border-bottom: 2rpx solid #E6E6E6;
}
}
}
.list .price {
font-size: 32rpx;
color: #f8473e;
font-weight: 600;
display: flex;
}
.list .price .num {
font-size: 32rpx;
}
.list .cart-image {
width: 52rpx;
height: 52rpx;
}
.empty {
margin-top: 100rpx;
font-size: 28rpx;
text-align: center;
color: #bbb;
}
.empty image {
display: block;
width: 414rpx;
height: 305rpx;
margin: 0 auto;
pointer-events: none;
}
}
.cart-footer {
width: 100%;
height: 100rpx;
padding-left: 30rpx;
background: #fff;
box-shadow: 0rpx -19rpx 54rpx 0rpx rgba(34,34,34,0.05);
flex-shrink: 0;
position: fixed;
bottom: 0;
left: 0;
label {
color: #999999;
font-size: 28rpx;
}
.total {
margin-left: auto;
margin-right: 20rpx;
font-size: 30rpx;
color: #333333;
font-weight: bold;
text {
color: #FF2825;
}
}
.pay-btn {
width: 240rpx;
height: 100rpx;
background: #0F74BB;
text-align: center;
line-height: 100rpx;
font-size: 28rpx;
color: #fff;
}
}
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Loading…
Cancel
Save