Commit 3730a445 authored by Junling Bu's avatar Junling Bu
Browse files

chore[litemall-vue]: 继续调整代码

parent 31d04729
...@@ -56,7 +56,7 @@ export function goodsCount() { ...@@ -56,7 +56,7 @@ export function goodsCount() {
method: 'get' method: 'get'
}) })
} }
const GoodsList='wx/goods/list'; //获得商品列表 export const GoodsList='wx/goods/list'; //获得商品列表
export function goodsList(query) { export function goodsList(query) {
return request({ return request({
url: GoodsList, url: GoodsList,
...@@ -141,8 +141,22 @@ export function cartGoodsCount() { ...@@ -141,8 +141,22 @@ export function cartGoodsCount() {
}) })
} }
const CartCheckout='wx/cart/checkout'; // 下单前信息确认 const CartCheckout='wx/cart/checkout'; // 下单前信息确认
export function cartCheckout(query) {
return request({
url: CartCheckout,
method: 'get',
params: query
})
}
const CollectList='wx/collect/list'; //收藏列表 const CollectList='wx/collect/list'; //收藏列表
export function collectList(query) {
return request({
url: CollectList,
method: 'get',
params: query
})
}
const CollectAddOrDelete='wx/collect/addordelete'; //添加或取消收藏 const CollectAddOrDelete='wx/collect/addordelete'; //添加或取消收藏
export function collectAddOrDelete(data) { export function collectAddOrDelete(data) {
return request({ return request({
...@@ -165,22 +179,105 @@ const SearchHelper='wx/search/helper'; //搜索帮助 ...@@ -165,22 +179,105 @@ const SearchHelper='wx/search/helper'; //搜索帮助
const SearchClearHistory='wx/search/clearhistory'; //搜索历史清楚 const SearchClearHistory='wx/search/clearhistory'; //搜索历史清楚
const AddressList='wx/address/list'; //收货地址列表 const AddressList='wx/address/list'; //收货地址列表
export function addressList(query) {
return request({
url: AddressList,
method: 'get',
params: query
})
}
const AddressDetail='wx/address/detail'; //收货地址详情 const AddressDetail='wx/address/detail'; //收货地址详情
export function addressDetail(query) {
return request({
url: AddressDetail,
method: 'get',
params: query
})
}
const AddressSave='wx/address/save'; //保存收货地址 const AddressSave='wx/address/save'; //保存收货地址
export function addressSave(data) {
return request({
url: AddressSave,
method: 'post',
data
})
}
const AddressDelete='wx/address/delete'; //保存收货地址 const AddressDelete='wx/address/delete'; //保存收货地址
export function addressDelete(data) {
return request({
url: AddressDelete,
method: 'post',
data
})
}
const ExpressQuery='wx/express/query'; //物流查询 const ExpressQuery='wx/express/query'; //物流查询
const RegionList='wx/region/list'; //获取区域列表
const OrderSubmit='wx/order/submit'; // 提交订单 const OrderSubmit='wx/order/submit'; // 提交订单
export function orderSubmit(data) {
return request({
url: OrderSubmit,
method: 'post',
data
})
}
const OrderPrepay='wx/order/prepay'; // 订单的预支付会话 const OrderPrepay='wx/order/prepay'; // 订单的预支付会话
const OrderList='wx/order/list'; //订单列表 export function orderPrepay(data) {
return request({
url: OrderPrepay,
method: 'post',
data
})
}
export const OrderList='wx/order/list'; //订单列表
export function orderList(query) {
return request({
url: OrderList,
method: 'get',
params: query
})
}
const OrderDetail='wx/order/detail'; //订单详情 const OrderDetail='wx/order/detail'; //订单详情
export function orderDetail(query) {
return request({
url: OrderDetail,
method: 'get',
params: query
})
}
const OrderCancel='wx/order/cancel'; //取消订单 const OrderCancel='wx/order/cancel'; //取消订单
export function orderCancel(data) {
return request({
url: OrderCancel,
method: 'post',
data
})
}
const OrderRefund='wx/order/refund'; //退款取消订单 const OrderRefund='wx/order/refund'; //退款取消订单
export function orderRefund(data) {
return request({
url: OrderSubmit,
method: 'post',
data
})
}
const OrderDelete='wx/order/delete'; //删除订单 const OrderDelete='wx/order/delete'; //删除订单
export function orderDelete(data) {
return request({
url: OrderDelete,
method: 'post',
data
})
}
const OrderConfirm='wx/order/confirm'; //确认收货 const OrderConfirm='wx/order/confirm'; //确认收货
export function orderConfirm(data) {
return request({
url: OrderConfirm,
method: 'post',
data
})
}
const OrderGoods='wx/order/goods'; // 代评价商品信息 const OrderGoods='wx/order/goods'; // 代评价商品信息
const OrderComment='wx/order/comment'; // 评价订单商品信息 const OrderComment='wx/order/comment'; // 评价订单商品信息
...@@ -197,8 +294,29 @@ const GroupOnDetail='wx/groupon/detail'; //团购API-详情 ...@@ -197,8 +294,29 @@ const GroupOnDetail='wx/groupon/detail'; //团购API-详情
const GroupOnJoin='wx/groupon/join'; //团购API-详情 const GroupOnJoin='wx/groupon/join'; //团购API-详情
const CouponList='wx/coupon/list'; //优惠券列表 const CouponList='wx/coupon/list'; //优惠券列表
const CouponMyList='wx/coupon/mylist'; //我的优惠券列表 export function couponList(query) {
const CouponSelectList='coupon/selectlist'; //当前订单可用优惠券列表 return request({
url: CouponList,
method: 'get',
params: query
})
}
export const CouponMyList='wx/coupon/mylist'; //我的优惠券列表
export function couponMyList(query) {
return request({
url: CouponMyList,
method: 'get',
params: query
})
}
const CouponSelectList='wx/coupon/selectlist'; //当前订单可用优惠券列表
export function couponSelectList(query) {
return request({
url: CouponSelectList,
method: 'get',
params: query
})
}
const CouponReceive='wx/coupon/receive'; //优惠券领取 const CouponReceive='wx/coupon/receive'; //优惠券领取
export function couponReceive(data) { export function couponReceive(data) {
return request({ return request({
...@@ -219,3 +337,17 @@ export function userIndex() { ...@@ -219,3 +337,17 @@ export function userIndex() {
}) })
} }
const IssueList='wx/issue/list'; //帮助信息 const IssueList='wx/issue/list'; //帮助信息
export function issueList() {
return request({
url: IssueList,
method: 'get'
})
}
export function getList(api, query) {
return request({
url: api,
method: 'get',
params: query
})
}
\ No newline at end of file
...@@ -19,7 +19,7 @@ import { List } from 'vant'; ...@@ -19,7 +19,7 @@ import { List } from 'vant';
import { get } from 'lodash'; import { get } from 'lodash';
import IsEmpty from '@/components/is-empty'; import IsEmpty from '@/components/is-empty';
import loadMore from '@/mixin/load-more'; import loadMore from '@/mixin/load-more';
import { goodsList } from '@/api/api'; import { getList } from '@/api/api';
const DEFAULT_CONFIG = { const DEFAULT_CONFIG = {
params: {}, params: {},
...@@ -64,25 +64,23 @@ export default { ...@@ -64,25 +64,23 @@ export default {
beforeInitData() { beforeInitData() {
return this.beforeRequest ? this.beforeRequest() : DEFAULT_CONFIG; return this.beforeRequest ? this.beforeRequest() : DEFAULT_CONFIG;
}, },
async initData() { initData() {
const { params = {}, headers = {} } = this.beforeInitData(); const { params = {}, headers = {} } = this.beforeInitData();
const prePage = this.perPage || this.pages.perPage; const prePage = this.perPage || this.pages.perPage;
console.log(params); console.log(params);
console.log(headers); console.log(headers);
goodsList({ getList(this.apiUrl, {
// 'per-page': prePage,
page: this.pages.currPage, page: this.pages.currPage,
size: 100, limit: prePage,
categoryId: params.cid ...params
// ...params
}, },
headers headers
); ).then(res => {
await this.sleep(1000); const items = get(res.data.data, this.resKey, []);
const items = get(res.data, this.resKey, []); const page = get(res.data.data, this.pageKey, null);
const page = get(res.data, this.pageKey, null); this.$emit('onLoad', items);
this.$emit('onLoad', items); return page;
return page; });
}, },
sleep(time) { sleep(time) {
return new Promise(resolve => { return new Promise(resolve => {
......
...@@ -39,8 +39,6 @@ export default [ ...@@ -39,8 +39,6 @@ export default [
path: '/items/list', path: '/items/list',
name: 'list', name: 'list',
component: () => import('@/views/items/list'), component: () => import('@/views/items/list'),
props: route => ({ props: route => route.query
itemClass: +route.query.itemClass
})
} }
]; ];
...@@ -22,11 +22,6 @@ export default [ ...@@ -22,11 +22,6 @@ export default [
name: 'orderDetail', name: 'orderDetail',
component: () => import('@/views/order/orderDetail') component: () => import('@/views/order/orderDetail')
}, },
{
path: '/order/placeOrderVirtual',
name: 'placeOrderVirtual',
component: () => import('@/views/order/place-order-virtual')
},
{ {
path: '/order/payment', path: '/order/payment',
name: 'payment', name: 'payment',
......
...@@ -3,6 +3,7 @@ const UserCollect = () => import('@/views/user/module-collect'); ...@@ -3,6 +3,7 @@ const UserCollect = () => import('@/views/user/module-collect');
const UserAddress = () => import('@/views/user/module-address'); const UserAddress = () => import('@/views/user/module-address');
const UserAddressEdit = () => import('@/views/user/module-address-edit'); const UserAddressEdit = () => import('@/views/user/module-address-edit');
const UserServer = () => import('@/views/user/module-server'); const UserServer = () => import('@/views/user/module-server');
const UserHelp = () => import('@/views/user/module-help');
const UserInformation = () => import('@/views/user/user-information-set'); const UserInformation = () => import('@/views/user/user-information-set');
const UserInfo_SetBg = () => import('@/views/user/user-information-set/set-bg'); const UserInfo_SetBg = () => import('@/views/user/user-information-set/set-bg');
...@@ -42,7 +43,7 @@ export default [ ...@@ -42,7 +43,7 @@ export default [
component: UserAddress component: UserAddress
}, },
{ {
path: '/user/address/edit/:addressId', path: '/user/address/edit',
name: 'address-edit', name: 'address-edit',
props: true, props: true,
meta: { meta: {
...@@ -55,6 +56,11 @@ export default [ ...@@ -55,6 +56,11 @@ export default [
name: 'user-server', name: 'user-server',
component: UserServer component: UserServer
}, },
{
path: '/user/help',
name: 'user-help',
component: UserHelp
},
{ {
path: '/user/information', path: '/user/information',
name: 'user-information', name: 'user-information',
......
...@@ -32,7 +32,7 @@ service.interceptors.response.use( ...@@ -32,7 +32,7 @@ service.interceptors.response.use(
}, 1500) }, 1500)
return Promise.reject('error') return Promise.reject('error')
} else if (res.errno === 502) { } else if (res.errno === 502) {
Toast.alert('网站内部错误,请联系网站维护人员') Toast.fail('网站内部错误,请联系网站维护人员')
return Promise.reject('error') return Promise.reject('error')
} if (res.errno === 401) { } if (res.errno === 401) {
Toast.fail('参数不对'); Toast.fail('参数不对');
......
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
<div class="goods-channel"> <div class="goods-channel">
<div class="item" <div class="item"
@click="changeTabbar(iconJson)" @click="changeTabbar(channel)"
v-for="(iconJson, index) in shopInfos.channel" v-for="(channel, index) in shopInfos.channel"
:key="index"> :key="index">
<img :src="iconJson.iconUrl" background-size="cover"/> <img :src="channel.iconUrl" background-size="cover"/>
<span>{{iconJson.name}}</span> <span>{{channel.name}}</span>
</div> </div>
</div> </div>
...@@ -145,11 +145,11 @@ export default { ...@@ -145,11 +145,11 @@ export default {
}) })
}, },
changeTabbar(o) { changeTabbar(o) {
let that = this
goodsCategory({ id: o.id}).then(res => { goodsCategory({ id: o.id}).then(res => {
let categoryId = res.data.data.currentCategory.id; let categoryId = res.data.data.currentCategory.id;
this.$router.push({ this.$router.replace({
path: `items/list?keyword=&itemClass=${categoryId}` name: 'list',
query: { itemClass: categoryId }
}); });
}) })
}, },
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
import { goodsDetail, cartGoodsCount, collectAddOrDelete, cartAdd, cartFastAdd } from '@/api/api'; import { goodsDetail, cartGoodsCount, collectAddOrDelete, cartAdd, cartFastAdd } from '@/api/api';
import { Sku, Swipe, SwipeItem, GoodsAction, GoodsActionBigBtn, GoodsActionMiniBtn, Popup } from 'vant'; import { Sku, Swipe, SwipeItem, GoodsAction, GoodsActionBigBtn, GoodsActionMiniBtn, Popup } from 'vant';
import { setLocalStorage } from '@/utils/local-storage';
import popupProps from './popup-props'; import popupProps from './popup-props';
import _ from 'lodash'; import _ from 'lodash';
...@@ -254,11 +254,11 @@ computed: { ...@@ -254,11 +254,11 @@ computed: {
else { else {
params.productId = this.getProductIdByOne(data.selectedSkuComb.s1) params.productId = this.getProductIdByOne(data.selectedSkuComb.s1)
} }
cartFastAdd(params).then(() => { cartFastAdd(params).then(res => {
let cartId = res.data.data;
setLocalStorage({CartId: cartId})
that.showSku = false; that.showSku = false;
that.$router.push({ this.$router.push({ name: 'placeOrderEntity'});
name: 'cart'
});
}); });
}, },
skuAdapter() { skuAdapter() {
......
<template> <template>
<div class="item_list over-hide"> <div class="item_list over-hide">
<form action="/search"> <van-tabs v-model="navActive" @click="handleTabClick">
<van-search <van-tab v-for="(nav, index) in navList" :title="nav.name" :key="index">
placeholder="请输入商品名称" <!-- <InfinityScroll
v-model="searchVal"
@click="$router.push({ name: 'search' })"
showAction
/>
</form>
<van-tabs v-model="tabActive" @disabled="toggleFilterModal(true)">
<van-tab
v-for="(tab, tabIndex) in tabsItem"
:title="tab.name"
:key="tab.type"
:disabled="tab.sort === false"
>
<InfinityScroll
:ref="'tabScrolls' + tabIndex" :ref="'tabScrolls' + tabIndex"
class="full-page scroll-wrap fix-height" class="full-page scroll-wrap fix-height"
:beforeRequest="beforeRequest" :beforeRequest="beforeRequest"
:apiUrl="listApi" :apiUrl="listApi"
@onLoad="onLoad(tabIndex, $event)" @onLoad="onLoad(tabIndex, $event)"
> > -->
<div class="h">
<div class="name">{{currentCategory.name}}</div>
<div class="desc">{{currentCategory.desc}}</div>
</div>
<item-group> <item-group>
<item-card-hori <item-card-hori
v-for="(item, i) in tab.items" v-for="(item, i) in goodsList"
:key="i" :key="i"
:goods="item" :goods="item"
@click="itemClick(item.id)" @click="itemClick(item.id)"
/> />
</item-group> </item-group>
</InfinityScroll> <!-- </InfinityScroll> -->
</van-tab> </van-tab>
</van-tabs> </van-tabs>
<van-popup class="filterItem" v-model="filterItemShow" position="right">
<ul>
<li
v-for="(li, i) in filterItem"
:key="i"
@click="filterMethod(i)"
:class="{filter_active: li.isActive}"
>
{{li.name}}
<van-icon name="success" v-show="li.isActive" class="float-r"/>
</li>
</ul>
</van-popup>
<transition name="fade">
<van-icon
name="arrowupcircle"
class="backTop"
@click.native="backTop"
v-show="showArrow"
/>
</transition>
</div> </div>
</template> </template>
<script> <script>
import { GOODS_SEARCH } from '@/api/goods'; import { goodsCategory, goodsList, GoodsList } from '@/api/api';
import ItemGroup from '@/components/item-group'; import ItemGroup from '@/components/item-group';
import ItemCardHori from '@/components/item-card-hori/'; import ItemCardHori from '@/components/item-card-hori/';
import { Search, Tab, Tabs, Popup } from 'vant'; import { Search, Tab, Tabs, Popup } from 'vant';
// import { throttle } from 'lodash';
import InfinityScroll from '@/components/infinity-scroll'; import InfinityScroll from '@/components/infinity-scroll';
export default { export default {
name: 'Item-list', name: 'Item-list',
props: { props: {
keyword: {
type: String,
default: ''
},
itemClass: { itemClass: {
type: [String, Number], type: [String, Number],
default: '' default: ''
...@@ -84,108 +46,52 @@ export default { ...@@ -84,108 +46,52 @@ export default {
data() { data() {
return { return {
listApi: GOODS_SEARCH, listApi: GoodsList,
shop_id: 1, goodsList: [],
tabActive: 0, currentCategory: {},
tabsItem: [ navList: [],
{ name: '默认', sort: '', items: [] }, navActive: 0
{ name: '销量', sort: 'sold_quantity', items: [] },
{ name: '最新', sort: 'created_at', items: [] }
// { name: '筛选', sort: false, items: [] }
],
is_haitao: 0,
filterItem: [
{
name: '全部',
filterType: 2,
isActive: true
},
{
name: '店铺商品',
filterType: 0,
isActive: false
},
{
name: '海淘商品',
filterType: 1,
isActive: false
}
],
isHaitao: 2,
searchVal: '',
filterItemShow: false
// showArrow: false
}; };
}, },
computed: {
sortVal() {
const { tabActive: i } = this;
return this.tabsItem[i].sort;
}
},
created() { created() {
// this.scrollShowArrow = throttle(this.scrollShowArrow, 100); this.init();
}, },
methods: { methods: {
onLoad(i, items) { handleTabClick(index) {
this.tabsItem[i].items.push(...items); this.itemClass= this.navList[index].id;
}, this.$router.replace({
beforeRequest() { name: 'list',
return { query: { itemClass: this.itemClass }
params: {
q: this.searchVal,
shop_id: this.shop_id,
cid: this.itemClass,
sort: this.sortVal,
is_haitao: this.isHaitao
}
};
},
// 滚动容器改变, 导致滚动监听失效, 暂时先注释了
// eventListen(isBind = true) {
// if (isBind) {
// this.$el.addEventListener('scroll', this.scrollShowArrow);
// } else {
// this.$el.removeEventListener('scroll', this.scrollShowArrow);
// }
// },
// scrollShowArrow() {
// this.showArrow = this.$el.scrollTop > 120;
// },
activeFilter(i) {
this.filterItem.forEach((item, index) => {
item.isActive = i === index;
}); });
this.init();
}, },
resetActiveTab() { init() {
const { tabActive: i } = this; goodsCategory({id: this.itemClass}).then(res => {
this.tabsItem[i].items = []; this.navList = res.data.data.brotherCategory;
const targetScroll = this.$refs[`tabScrolls${i}`][0]; this.currentCategory= res.data.data.currentCategory;
// debugger;
targetScroll && targetScroll.resetInit(); // 当id是L1分类id时,这里需要重新设置成L1分类的一个子分类的id
}, if (res.data.data.parentCategory.id == this.itemClass) {
toggleFilterModal(status) { this.itemClass = res.data.data.currentCategory.id;
this.filterItemShow = status; }
},
filterMethod(i) { for (let i = 0; i < this.navList.length; i++) {
const filterType = this.filterItem[i].filterType; if (this.navList[i].id == this.itemClass) {
if (filterType === this.isHaitao) return; this.navActive = i
break;
this.isHaitao = filterType; }
this.activeFilter(i); }
this.toggleFilterModal(false); this.getGoodsList();
this.resetActiveTab(); });
},
// backTop() {
// this.$el.scrollTop = 0;
// },
itemClick(id) {
this.$router.push({ name: 'detail', params: { itemId: id } });
}
}, },
getGoodsList() {
goodsList({categoryId: this.itemClass}).then(res => {
this.goodsList= res.data.data.goodsList
});
},
},
components: { components: {
InfinityScroll, InfinityScroll,
...@@ -232,20 +138,28 @@ export default { ...@@ -232,20 +138,28 @@ export default {
.items_loading { .items_loading {
margin: 0 auto; margin: 0 auto;
} }
.filterItem {
width: 40%; .h {
height: 100%; height: 100px;
li { width: 100%;
padding: 10px; display: flex;
&.filter_active { flex-direction: column;
color: $red; align-items: center;
}
}
} }
.backTop {
position: fixed; .h .name {
right: 20px; display: block;
bottom: 20px; height: 30px;
font-size: 24px; margin-bottom: 10px;
font-size: 20px;
color: #333;
} }
.h .desc {
display: block;
height: 24px;
font-size: 16px;
color: #999;
}
</style> </style>
<template> <template>
<div class="payment_status"> <div class="payment_status">
<div class="status_top"> <div class="status_top">
<van-icon :name="statusIcon" :class="statusClass"/> <van-icon :name="statusIcon" :class="statusClass"/>
<div>{{statusText}}</div> <div>{{statusText}}</div>
</div> </div>
<div class="status_text" v-if="isSuccess"> <div class="status_text" v-if="isSuccess">
<span class="red">3秒</span>跳转订单 <span class="red">3秒</span>跳转订单
</div> </div>
<div class="status_text" v-else>系统繁忙, 支付遇到问题, 请您稍后再试!</div> <div class="status_text" v-else>系统繁忙, 支付遇到问题, 请您稍后再试!</div>
<div class="status_goLink"> <div class="status_goLink">
<router-link class="red" :to="{name: 'user'}">查看订单 <router-link class="red" :to="{name: 'user'}">查看订单
<van-icon name="arrow"/> <van-icon name="arrow"/>
</router-link> </router-link>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: 'payment-status', name: 'payment-status',
props: { props: {
status: String status: String
}, },
created() { created() {
setTimeout(() => { setTimeout(() => {
this.$router.push({ path: 'user/order/list/0' }); this.$router.push({ path: '/user/order/list/0' });
}, 3000); }, 3000);
}, },
data() { data() {
return { return {
isSuccess: true isSuccess: true
}; };
}, },
computed: { computed: {
statusText() { statusText() {
return this.isSuccess ? '支付成功' : '支付失败'; return this.isSuccess ? '支付成功' : '支付失败';
}, },
statusIcon() { statusIcon() {
return this.isSuccess ? 'checked' : 'fail'; return this.isSuccess ? 'checked' : 'fail';
}, },
statusClass() { statusClass() {
return this.isSuccess ? 'success_icon' : 'fail_icon'; return this.isSuccess ? 'success_icon' : 'fail_icon';
} }
}, },
activated() { activated() {
this.isSuccess = this.status === 'success'; this.isSuccess = this.status === 'success';
} }
}; };
</script> </script>
<style lang="scss" scopd> <style lang="scss" scopd>
.payment_status { .payment_status {
padding-top: 30px; padding-top: 30px;
box-sizing: border-box; box-sizing: border-box;
background-color: #fff; background-color: #fff;
text-align: center; text-align: center;
} }
.status_top { .status_top {
margin-bottom: 15px; margin-bottom: 15px;
i { i {
margin-bottom: 5px; margin-bottom: 5px;
} }
> div { > div {
font-size: 18px; font-size: 18px;
} }
} }
.status_text { .status_text {
color: $font-color-gray; color: $font-color-gray;
margin-bottom: 50px; margin-bottom: 50px;
} }
.status_icon { .status_icon {
font-size: 80px; font-size: 80px;
} }
i.success_icon { i.success_icon {
@extend .status_icon; @extend .status_icon;
color: #06bf04; color: #06bf04;
} }
i.fail_icon { i.fail_icon {
@extend .status_icon; @extend .status_icon;
color: #f44; color: #f44;
} }
</style> </style>
<template> <template>
<div class="payment"> <div class="payment">
<div class="time_down payment_group"> <div class="time_down payment_group">
请在 请在
<span class="red">半小时内</span> <span class="red">半小时内</span>
完成付款,否则系统自动取消订单 完成付款,否则系统自动取消订单
</div> </div>
<van-cell-group class="payment_group"> <van-cell-group class="payment_group">
<van-cell title="订单编号" :value="order_id"/> <van-cell title="订单编号" :value="order.orderInfo.orderSn"/>
<van-cell title="实付金额"> <van-cell title="实付金额">
<span class="red">{{order_info.orderInfo.actualPrice *100 | yuan}}</span> <span class="red">{{order.orderInfo.actualPrice *100 | yuan}}</span>
</van-cell> </van-cell>
</van-cell-group> </van-cell-group>
<div class="pay_way_group"> <div class="pay_way_group">
<div class="pay_way_title">选择支付方式</div> <div class="pay_way_title">选择支付方式</div>
<van-radio-group v-model="payWay" @change="payWay"> <van-radio-group v-model="payWay">
<van-cell-group> <van-cell-group>
<!-- <van-cell> <van-cell>
<van-radio @click-native="payWay" name="ali"> <template slot="title">
<img src="../../../assets/images/ali_pay.png" alt="支付宝" width="82" height="29"> <img src="../../../assets/images/ali_pay.png" alt="支付宝" width="82" height="29">
</van-radio> </template>
</van-cell>--> <van-radio name="ali"/>
<van-cell> </van-cell>
<van-radio name="wx"> <van-cell>
<img src="../../../assets/images/wx_pay.png" alt="微信支付" width="113" height="23"> <template slot="title">
</van-radio> <img src="../../../assets/images/wx_pay.png" alt="微信支付" width="113" height="23">
<!-- <button @click="pay">wx-pay-test</button> --> </template>
</van-cell> <van-radio name="wx"/>
</van-cell-group> </van-cell>
</van-radio-group> </van-cell-group>
</div> </van-radio-group>
</div>
<van-button class="pay_submit" @click="pay" :loading="isSubmit" type="primary" bottomAction>去支付</van-button>
</div> <van-button class="pay_submit" @click="pay" type="primary" bottomAction>去支付</van-button>
</template> </div>
</template>
<script>
import { Radio, RadioGroup } from 'vant'; <script>
import _ from 'lodash'; import { Radio, RadioGroup, Dialog } from 'vant';
import md5 from 'js-md5'; import { orderDetail, orderPrepay } from '@/api/api';
import _ from 'lodash';
export default { import md5 from 'js-md5';
name: 'payment',
export default {
data() { name: 'payment',
return {
isSubmit: false, data() {
payWay: 'wx', return {
order_info: {}, payWay: 'wx',
order_id: '', order: {
checkedName: '1' orderInfo: {},
}; orderGoods: []
}, },
created() { orderId: 0
if (_.has(this.$route.params, 'order_id')) { };
this.order_id = this.$route.params.order_id; },
this.getOrder(this.order_id); created() {
} if (_.has(this.$route.params, 'orderId')) {
}, this.orderId = this.$route.params.orderId;
methods: { this.getOrder(this.orderId);
payWay(name) { }
console.log(name); },
}, methods: {
async getOrder(id) { getOrder(orderId) {
let { data } = await this.$reqGet( orderDetail({orderId: orderId}).then(res => {
`/wx/order/detail?orderId=${id}` this.order = res.data.data;
); });
this.order_info = data.data; },
}, pay() {
async pay() {
let params = {}; Dialog.alert({
params.orderId = this.order_info.orderInfo.id; message: '你选择了' + (this.payWay === 'wx' ? '微信支付' : '支付宝支付')
let { data } = await this.$reqPost( }).then(() => {
`/wx/order/prepay`,
params this.$router.push({
); name: 'paymentStatus',
var that = this; params: {
function onBridgeReady() { status: 'success'
console.log(JSON.stringify(data)); }
// var timeStamp = Date.parse(new Date()); });
// var packageV = 'prepay_id=' + data.data.prepay_id; });
var params = {
appId: data.data.appId, //公众号名称,由商户传入 // // 利用weixin-js-sdk调用微信支付
timeStamp: data.data.timeStamp, //时间戳,自1970年以来的秒数 // orderPrepay({orderId: this.orderId}).then(res => {
nonceStr: data.data.nonceStr, //随机串 // var payParams = res.data.data;
package: data.data.packageValue,
signType: data.data.signType, //微信签名方式: // });
paySign: data.data.paySign //微信签名 }
}; },
console.log(params); components: {
WeixinJSBridge.invoke('getBrandWCPayRequest', params, function(res) { [Radio.name]: Radio,
console.log(JSON.stringify(res)); [RadioGroup.name]: RadioGroup,
if (res.err_msg == 'get_brand_wcpay_request:ok') { [Dialog.name]: Dialog
// 使用以上方式判断前端返回,微信团队郑重提示: }
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 };
that.$router.push({ </script>
name: 'paymentStatus',
params: { <style lang="scss" scoped>
status: 'success' .payment_group {
} margin-bottom: 10px;
}); }
}
}); .time_down {
} background-color: #fffeec;
if (typeof WeixinJSBridge == 'undefined') { padding: 10px 15px;
if (document.addEventListener) { }
document.addEventListener(
'WeixinJSBridgeReady', .pay_submit {
onBridgeReady, position: fixed;
false bottom: 0;
); width: 100%;
} else if (document.attachEvent) { }
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); .pay_way_group img {
} vertical-align: middle;
} else { }
onBridgeReady();
} .pay_way_title {
this.order_info = data.data; padding: 15px;
}, background-color: #fff;
paySubmit() { }
this.$router.push({ </style>
name: 'paymentStatus',
params: {
status: 'success'
}
});
}
},
components: {
[Radio.name]: Radio,
[RadioGroup.name]: RadioGroup
}
};
</script>
<style lang="scss" scoped>
.payment_group {
margin-bottom: 10px;
}
.time_down {
background-color: #fffeec;
padding: 10px 15px;
}
.pay_submit {
position: fixed;
bottom: 0;
width: 100%;
}
.pay_way_group img {
vertical-align: middle;
}
.pay_way_title {
padding: 15px;
background-color: #fff;
}
</style>
<template>
<div class="order">
<van-cell-group>
<van-cell v-if="checkedAddress" isLink @click="goAddressList()" title="收货地址">
<div slot="label">
<div>
<span>{{ checkedAddress.name }} </span>
<span>{{ checkedAddress.tel }} </span>
</div>
<div>
{{ checkedAddress.addressDetail }}
</div>
</div>
</van-cell>
</van-cell-group>
<van-cell-group>
<van-cell class="order-coupon" title="优惠券" is-link :value="getCouponValue()" @click="getCoupons" />
</van-cell-group>
<!-- 优惠券列表 -->
<van-popup v-model="showList" position="bottom">
<van-coupon-list
:coupons="coupons"
:chosen-coupon="chosenCoupon"
:disabled-coupons="disabledCoupons"
@change="onChange"
@exchange="onExchange"
/>
</van-popup>
<van-card
v-for="item in checkedGoodsList"
:key="item.id"
:title="item.goodsName"
:num="item.number"
:price="item.price +'.00'"
:thumb="item.picUrl"
>
<div slot="desc">
<div class="van-card__desc">
<van-tag plain style="margin-right:6px;" v-for="(spec, index) in item.specifications" :key="index">
{{spec}}
</van-tag>
</div>
</div>
</van-card>
<van-cell-group>
<van-cell title="商品金额">
<span class="red">{{goodsTotalPrice * 100 | yuan}}</span>
</van-cell>
<van-cell title="邮费">
<span class="red">{{ freightPrice * 100| yuan}}</span>
</van-cell>
<van-cell title="优惠券">
<span class="red">-{{ couponPrice * 100| yuan}}</span>
</van-cell>
<van-field v-model="message" placeholder="请输入备注" label="订单备注">
<template slot="icon">{{message.length}}/50</template>
</van-field>
</van-cell-group>
<van-submit-bar
:price="actualPrice*100"
label="总计:"
buttonText="提交订单"
:disabled="isDisabled"
@submit="onSubmit"
/>
</div>
</template>
<script>
import { Card, Tag, ard, Field, SubmitBar, Toast } from 'vant';
import { CouponCell, CouponList, Popup } from 'vant';
import { cartCheckout, orderSubmit, couponSelectList} from '@/api/api';
import { getLocalStorage, setLocalStorage } from '@/utils/local-storage';
import dayjs from 'dayjs';
export default {
data() {
return {
checkedGoodsList: [],
checkedAddress: {},
availableCouponLength: 0, // 可用的优惠券数量
goodsTotalPrice: 0, //商品总价
freightPrice: 0, //快递费
couponPrice: 0, //优惠券的价格
grouponPrice: 0, //团购优惠价格
orderTotalPrice: 0, //订单总价
actualPrice: 0, //实际需要支付的总价
message: '',
isDisabled: false,
showList: false,
chosenCoupon: -1,
coupons: [],
disabledCoupons: []
};
},
created() {
this.init();
},
methods: {
onSubmit() {
const {AddressId, CartId, CouponId} = getLocalStorage('AddressId', 'CartId', 'CouponId');
if (AddressId === null) {
Toast.fail('请设置收货地址');
return;
}
this.isDisabled = true;
orderSubmit({
addressId: AddressId,
cartId: CartId,
couponId: CouponId,
grouponLinkId: 0,
grouponRulesId: 0,
message: this.message
}).then(res => {
// 下单成功,重置下单参数。
setLocalStorage({AddressId: 0, CartId: 0, CouponId: 0});
let orderId = res.data.data.orderId;
this.$router.push({
name: 'payment',
params: { orderId: orderId }
});
}).catch(error => {
this.isDisabled = false;
this.$toast("下单失败");
})
},
goAddressList() {
this.$router.push({
path: '/user/address'
});
},
getCouponValue() {
if(this.couponPrice !== 0 ){
return "" + this.couponPrice + ".00元"
}
if(this.availableCouponLength !== 0){
return this.availableCouponLength + "张可用"
}
return '没有可用优惠券'
},
getCoupons() {
const {AddressId, CartId, CouponId} = getLocalStorage('AddressId', 'CartId', 'CouponId');
couponSelectList({cartId: CartId, grouponRulesId: 0}).then(res => {
var cList = res.data.data
this.coupons = []
for(var i = 0; i < cList.length; i++){
var c = cList[i]
var coupon = {
id: c.id,
name: c.name,
condition: c.min,
value: c.discount * 100,
description: c.desc,
startAt: new Date(c.startTime).getTime()/1000,
endAt: new Date(c.endTime).getTime()/1000,
valueDesc: c.discount,
unitDesc: ''
}
this.coupons.push(coupon)
if(c.id === this.couponId){
this.chosenCoupon = i;
break;
}
}
this.showList = true
})
},
init() {
const {AddressId, CartId, CouponId} = getLocalStorage('AddressId', 'CartId', 'CouponId');
cartCheckout({cartId: CartId, addressId: AddressId, couponId: CouponId, grouponRulesId: 0}).then(res => {
var data = res.data.data
this.checkedGoodsList = data.checkedGoodsList;
this.checkedAddress= data.checkedAddress;
this.availableCouponLength= data.availableCouponLength;
this.actualPrice= data.actualPrice;
this.couponPrice= data.couponPrice;
this.grouponPrice= data.grouponPrice;
this.freightPrice= data.freightPrice;
this.goodsTotalPrice= data.goodsTotalPrice;
this.orderTotalPrice= data.orderTotalPrice;
setLocalStorage({AddressId: data.addressId, CartId: data.cartId, CouponId: data.couponId});
});
},
onChange(index) {
this.showList = false;
this.chosenCoupon = index;
if(index === -1 ){
setLocalStorage({CouponId: -1});
}
else{
const couponId = this.coupons[index].id;
setLocalStorage({CouponId: couponId});
}
this.init()
},
onExchange() {
this.$toast("兑换暂不支持");
}
},
components: {
[Toast.name]: Toast ,
[SubmitBar.name]: SubmitBar,
[Card.name]: Card,
[Field.name]: Field,
[Tag.name]: Field,
[CouponCell.name]: CouponCell,
[CouponList.name]: CouponList,
[Popup.name]: Popup
}
};
</script>
<style lang="scss" scoped>
.order-coupon {
margin-top: 10px;
}
</style>
\ No newline at end of file
<template>
<div class="order-goods">
<van-card
v-for="item in goodsInfo.checkedGoodsList"
:key="item.id"
:title="item.goodsName"
desc="暂无描述"
:num="item.number"
:price="item.price +'.00'"
:thumb="item.picUrl"
>
<div slot="footer">添加日期 {{item.addTime}}</div>
</van-card>
<van-cell-group>
<!-- <van-field v-model="remark" placeholder="请输入备注" label="订单备注"> -->
<!-- <template slot="icon">{{remark.length}}/50</template> -->
<!-- </van-field> -->
<van-cell title="商品金额">
<span class="red">{{goodsInfo.actualPrice * 100 | yuan}}</span>
</van-cell>
<van-cell title="邮费" :value="goodsInfo.freightPrice "></van-cell>
<!-- <van-cell title="税费" value="¥8.96"></van-cell> -->
<van-cell title="优惠券">
<span class="red">-{{ goodsInfo.couponPrice * 100| yuan}}</span>
</van-cell>
</van-cell-group>
</div>
</template>
<script>
import { Card, Field } from 'vant';
export default {
name: 'bottom-goods-info',
props: {
goodsInfo: {
type: Object,
default: () => ({})
}
},
data() {
return {
remark: ''
// goodsInfo: {}
};
},
created() {},
methods: {
// async init() {
// let { data } = await this.$reqGet(
// '/wx/cart/checkout?cartId=0&addressId=0&couponId=0&grouponRulesId=0'
// );
// debugger;
// this.goodsInfo = data.data;
// }
},
components: {
[Card.name]: Card,
[Field.name]: Field
}
};
</script>
<style lang="scss" scoped>
.order-goods {
background-color: #fff;
}
</style>
<template>
<div class="place_order_entity">
<top-user-info :goodsInfo="goodsInfo" style="margin-bottom: 20px;"/>
<bottom-goods-info :goodsInfo="goodsInfo"/>
<van-submit-bar
:price="goodsInfo.orderTotalPrice*100"
label="总计:"
buttonText="提交订单"
:loading="isSubmit"
:disabled="isDisabled"
@submit="onSubmit"
/>
</div>
</template>
<script>
import topUserInfo from './top-user-info';
import bottomGoodsInfo from './bottom-goods-info';
import { SubmitBar, Dialog } from 'vant';
export default {
data() {
return {
isSubmit: false,
isDisabled: false,
goodsInfo: {}
};
},
created() {
this.init();
},
methods: {
async onSubmit() {
this.isSubmit = true;
let cartId = this.$route.params.cartId;
if (this.goodsInfo.addressId === 0) {
Dialog.alert({
message: '未选择收货地址'
}).then(() => {
// on close
});
}
let { data } = await this.$reqPost('/wx/order/submit', {
addressId: this.goodsInfo.addressId,
cartId: cartId || 0,
couponId: 0,
grouponLinkId: 0,
grouponRulesId: 0,
message: ''
});
this.$router.push({
name: 'payment',
params: { order_id: data.data.orderId }
});
},
async init() {
let cartId = this.$route.params.cartId;
let { data } = await this.$reqGet(
`/wx/cart/checkout?cartId=${cartId ||
0}&addressId=0&couponId=0&grouponRulesId=0`
);
this.goodsInfo = data.data;
}
},
components: {
[Dialog.name]: Dialog,
[SubmitBar.name]: SubmitBar,
[topUserInfo.name]: topUserInfo,
[bottomGoodsInfo.name]: bottomGoodsInfo
}
};
</script>
<style lang="scss" scoped>
.place_order_entity {
padding-bottom: 70px;
}
</style>
<template>
<van-cell-group>
<van-cell
v-if="goodsInfo.checkedAddress.id !== 0"
icon="dingwei"
isLink
@click="goAddressList(goodsInfo)"
:title="`${goodsInfo.checkedAddress.name} ${goodsInfo.checkedAddress.mobile}`"
:label="goodsInfo.checkedAddress.address"
/>
<van-cell
v-else
icon="dingwei"
isLink
@click="goAddressList(goodsInfo)"
title="您暂时没有配送地址,请输入配送地址"
:label="goodsInfo.checkedAddress.address"
/>
<!-- <van-cell class="daodian" title="到店自提" label="浙江省 杭州市 西湖区 创新创业园">
<van-checkbox v-model="isDaoDian" slot="icon"></van-checkbox>
</van-cell>-->
<!-- <van-cell icon="id-card" title="张三" label="330327********1574" isLink/> -->
</van-cell-group>
</template>
<script>
import { Checkbox } from 'vant';
export default {
name: 'top-user-info',
props: {
goodsInfo: {
type: Object,
default: () => ({})
}
},
data() {
return {
isDaoDian: false
};
},
methods: {
goAddressList(goodInfo) {
this.$router.push({
path: '/user/address'
});
}
},
components: {
[Checkbox.name]: Checkbox
}
};
</script>
<style lang="scss">
.daodian {
.van-checkbox .van-icon-success {
height: 16px;
width: 16px;
font-size: $font-size-small;
&::before {
line-height: 16px;
}
}
.van-checkbox__input {
height: 16px;
}
.van-checkbox__label {
margin-left: 0;
}
.shop_address {
padding-left: 25px;
box-sizing: border-box;
}
}
</style>
<template>
<div class="place_order_virtual">
<van-panel>
<van-card
slot="header"
:title="goods.title"
:desc="goods.desc"
num="2"
price="2.00"
:thumb="goods.thumb"
/>
<div class="panel_content">
<van-icon :name="showNotice ? 'arrow-up' : 'arrow-down'" class="panel_notice"/>
<div @click="showNotice = !showNotice">注意事项</div>
<ol v-if="showNotice">
<li>注意事项1</li>
<li>注意事项2</li>
<li>注意事项3</li>
<li>注意事项4</li>
</ol>
</div>
<div slot="footer" class="clearfix">
<div class="float-l">商品金额</div>
<div class="float-r red">{{7200 | yuan}}</div>
</div>
</van-panel>
<van-submit-bar
:price="3050"
label="总计:"
buttonText="提交订单"
:loading="isSubmit"
:disabled="isDisabled"
@submit="onSubmit"
/>
</div>
</template>
<script>
import { Panel, SubmitBar, Card } from 'vant';
export default {
data() {
return {
showNotice: false,
isSubmit: false,
isDisabled: false,
goods: {
id: '2',
title: '陕西蜜梨',
desc: '约600g',
price: 690,
status: 1,
num: 3,
thumb:
'https://img.yzcdn.cn/public_files/2017/10/24/f6aabd6ac5521195e01e8e89ee9fc63f.jpeg'
}
};
},
methods: {
async onSubmit() {
let { data } = await this.$reqPost('/wx/order/submit', {
addressId: 2,
cartId: 0,
couponId: 0,
grouponLinkId: 0,
grouponRulesId: 0,
message: ''
});
this.isSubmit = true;
console.log('提交订单');
}
},
components: {
[Panel.name]: Panel,
[Card.name]: Card,
[SubmitBar.name]: SubmitBar
}
};
</script>
<style scoped lang="scss">
.panel_content {
position: relative;
padding: 10px 15px;
.panel_notice {
position: absolute;
top: 15px;
right: 15px;
}
ol {
padding-left: 12px;
padding-top: 10px;
list-style: decimal;
color: $font-color-gray;
overflow: hidden;
li {
margin-bottom: 10px;
font-size: $font-size-small;
&:last-child {
margin: 0;
}
}
}
}
/*
.slide-enter,.slide-leave-to{
height: 0;
}
.slide-enter-active,.slide-leave-active{
transition: all 1s;
}
*/
</style>
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
<div v-for="(item, i) in goods" :key="i" class="card-goods__item"> <div v-for="(item, i) in goods" :key="i" class="card-goods__item">
<van-checkbox :key="item.id" :name="item.id" v-model="item.checked"></van-checkbox> <van-checkbox :key="item.id" :name="item.id" v-model="item.checked"></van-checkbox>
<van-card desc="暂无描述" :num="item.number" :thumb="item.picUrl"> <van-card :title="item.goodsName" :price="item.price" :num="item.number" :thumb="item.picUrl">
<div class="van-card__row" slot="title"> <div slot="desc">
<div class="van-card__title"> <div class="van-card__desc">
<!-- <van-tag plain type="danger">海淘</van-tag> --> <van-tag plain style="margin-right:6px;" v-for="(spec, index) in item.specifications" :key="index">
{{item.goodsName}} {{spec}}
</van-tag>
</div> </div>
<div class="van-card__price">{{item.price * 100 | yuan}}</div>
</div> </div>
<div slot="footer" v-if="isEditor"> <div slot="footer" v-if="isEditor">
<van-stepper v-model="item.number" @change="stepperEvent(item,arguments)" disableInput/> <van-stepper v-model="item.number" @change="stepperEvent(item,arguments)" disableInput/>
...@@ -26,10 +26,6 @@ ...@@ -26,10 +26,6 @@
</div> </div>
</van-checkbox-group> </van-checkbox-group>
<div class="clear_invalid" v-if="goods.length" @click="clearInvalid">
<van-icon name="lajitong"/>清除失效商品
</div>
<is-empty v-if="!goods.length">您的购物车空空如也~</is-empty> <is-empty v-if="!goods.length">您的购物车空空如也~</is-empty>
<van-submit-bar <van-submit-bar
...@@ -49,6 +45,7 @@ ...@@ -49,6 +45,7 @@
<script> <script>
import { Checkbox, CheckboxGroup, Card, SubmitBar, Stepper, Tag } from 'vant'; import { Checkbox, CheckboxGroup, Card, SubmitBar, Stepper, Tag } from 'vant';
import { cartList, cartUpdate, cartChecked, cartDelete} from '@/api/api'; import { cartList, cartUpdate, cartChecked, cartDelete} from '@/api/api';
import { setLocalStorage } from '@/utils/local-storage';
import isEmpty from '@/components/is-empty/'; import isEmpty from '@/components/is-empty/';
import _ from 'lodash'; import _ from 'lodash';
...@@ -136,7 +133,6 @@ export default { ...@@ -136,7 +133,6 @@ export default {
}).productId }).productId
); );
}); });
console.log(this.goods);
if (this.isEditor) { if (this.isEditor) {
this.$dialog this.$dialog
.confirm({ .confirm({
...@@ -147,30 +143,11 @@ export default { ...@@ -147,30 +143,11 @@ export default {
this.deleteNext(productIds); this.deleteNext(productIds);
}); });
} else { } else {
// for (check in checkedGoods){
// await this.doCheck(productIds);
// }
// let { data } = await this.$reqGet(
// '/wx/cart/checkout?cartId=0&addressId=0&couponId=0&grouponRulesId=0'
// );
this.isSubmit = true; this.isSubmit = true;
this.$router.push({ name: 'placeOrderEntity' }); setLocalStorage({AddressId: 0, CartId: 0, CouponId: 0});
this.$router.push({ name: 'placeOrderEntity'});
} }
}, },
doCheck(productIds, isChecked) {
// let good = _.find(this.goods, vv => {
// return id === vv.id;
// })
// let productId = good.productId;
cartChecked({productIds: productIds, isChecked: isChecked});
// if (this.checkedGoods.length == this.AllGoods.length) {
// this.allCheckedStatus = true;
// }
},
formatPrice(price) {
return (price / 100).toFixed(2);
},
setCheckAll(val) { setCheckAll(val) {
if (this.checkedGoods.length === this.AllGoods.length) { if (this.checkedGoods.length === this.AllGoods.length) {
this.checkedGoods = []; this.checkedGoods = [];
...@@ -183,7 +160,6 @@ export default { ...@@ -183,7 +160,6 @@ export default {
this.$dialog this.$dialog
.confirm({ message: '确定删除所选商品吗', cancelButtonText: '再想想' }) .confirm({ message: '确定删除所选商品吗', cancelButtonText: '再想想' })
.then(() => { .then(() => {
// const goodsId = this.goods.splice(i, 1)[0].id;
this.$nextTick(() => { this.$nextTick(() => {
this.deleteNext(productId); this.deleteNext(productId);
}); });
...@@ -207,13 +183,13 @@ export default { ...@@ -207,13 +183,13 @@ export default {
}); });
//没选中的不掉接口 //没选中的不掉接口
if (delProductIds.length > 0) { if (delProductIds.length > 0) {
this.doCheck(delProductIds, 0); cartChecked({productIds: delProductIds, isChecked: 0});
} }
if (addProductIds.length > 0) { if (addProductIds.length > 0) {
this.doCheck(addProductIds, 1); cartChecked({productIds: addProductIds, isChecked: 1});
} }
}, },
async deleteNext(o) { deleteNext(o) {
let productIds = []; let productIds = [];
if (o instanceof Array) { if (o instanceof Array) {
productIds = o; productIds = o;
...@@ -221,29 +197,12 @@ export default { ...@@ -221,29 +197,12 @@ export default {
productIds.push(o); productIds.push(o);
} }
cartDelete({productIds: productIds}).then(res => {
cartDelete({productIds: productIds}); this.goods = res.data.data.cartList;
this.AllGoods = this.getAllList();
this.count = this.count - productIds.length; this.checkedGoods = this.getCheckedList(this.goods);
this.goods = data.data.cartList; this.count = this.checkedGoods.length;
});
// this.isEditor = !!this.goods.length;
// this.checkedGoods.forEach((goods, i) => {
// if (goods.id == goodsId) {
// this.checkedGoods.splice(i, 1);
// return false;
// }
// });
},
clearInvalid() {
this.$dialog
.confirm({
message: '确定清除所有失效商品吗?',
cancelButtonText: '再想想'
})
.then(() => {
this.goods = this.goods.filter(goods => goods.checked);
});
} }
}, },
......
<template> <template>
<div> <div>
<van-nav-bar title="编辑地址" left-text="返回" left-arrow @click-left="goback"/> <van-nav-bar title="编辑地址" left-text="返回" left-arrow @click-left="goback"/>
<van-address-edit <van-address-edit
style="background-color: #fff;" style="background-color: #fff;"
:areaList="areaList" :areaList="areaList"
:addressInfo="addressInfo" :addressInfo="addressInfo"
:isSaving="isSave" show-set-default
showPostal show-delete
@save="save" @save="onSave"
/> @delete="onDelete"
</div> />
</template> </div>
</template>
<script>
import { AddressEdit, NavBar } from 'vant'; <script>
import areaList from './area.json'; import { AddressEdit, NavBar } from 'vant';
import areaList from './area.json';
export default { import { addressDetail, addressSave, addressDelete } from '@/api/api';
name: 'address-edit', import { removeLocalStorage } from '@/utils/local-storage';
props: { export default {
addressId: [Number, String] name: 'address-edit',
},
data() {
data() { return {
return { areaList,
areaList, addressId: 0,
isSave: false, addressInfo: {}
addressInfo: {} };
}; },
}, created() {
created() { this.addressId = this.$route.query.addressId;
if (this.addressId !== -1) { if (this.addressId !== -1 && this.addressId !== 0) {
this.init(); this.init();
} }
}, },
methods: { methods: {
async init() { init() {
let { data } = await this.$reqGet( addressDetail({id: this.addressId}).then(res => {
`/wx/address/detail?id=${this.addressId}` this.addressInfo = res.data.data;
); });
let address = data.data; },
this.addressInfo = { onSave(content) {
name: address.name, addressSave(content).then(res => {
tel: address.mobile, this.$toast('成功');
// country: '中国', this.$router.push({ path: '/user/address' });
province: address.provinceName, });
city: address.cityName, },
// county: '东城区', onDelete(content) {
areaCode: '110101', addressDelete({ id: content.id });
// postalCode: '000000', removeLocalStorage('AddressId')
// addressDetail: '1', this.$router.go(-1);
isDefault: false, },
id: this.addressId, goback() {
areaId: '' this.$router.go(-1);
}
// address_detail: '是的是的', },
// area_code: '330106',
// postal_code: 123456 components: {
}; [NavBar.name]: NavBar,
[AddressEdit.name]: AddressEdit
// litemall data }
// { };
// "errno":0, </script>
// "data":{
// "isDefault":true,
// "areaId":377,
// "address":"adadada",
// "cityName":"市辖区",
// "areaName":"西城区",
// "name":"asd",
// "mobile":"13664552998",
// "id":2,
// "cityId":32,
// "provinceName":"北京市",
// "provinceId":1
// },
// "errmsg":"成功"
// }
console.log(areaList);
},
async save(data) {
let params = {};
params.address = data.addressDetail;
params.areaId = 376;
params.cityId = 32;
params.id = 0;
params.isDefault = true;
params.mobile = data.tel;
params.name = data.name;
params.provinceId = 1;
let { response } = await this.$reqPost(
'/wx/address/save',
params
);
this.$toast('成功');
this.$router.push({ path: '/user/address' });
},
goback() {
this.$router.go(-1);
}
},
components: {
[NavBar.name]: NavBar,
[AddressEdit.name]: AddressEdit
}
};
</script>
<template> <template>
<div> <div>
<van-nav-bar title="收货地址" left-text="返回" left-arrow @click-left="goback"/> <van-nav-bar title="收货地址" left-text="返回" left-arrow @click-left="goback"/>
<van-radio-group v-model="checkedId"> <van-address-list v-model="chosenAddressId" :list="addressList" @add="onAdd" @edit="onEdit" @select="onSelect"/>
<van-cell-group v-for="item in addresses" :key="item.id" class="addressGroup"> </div>
<van-cell isLink icon="dingwei" :title="item.name" :label="item.detailedAddress"/> </template>
<van-cell> <script>
<van-radio slot="title" :name="item.id" @click="setDefaultAddress(item)"> import { addressList, addressDetail, addressSave, addressDelete } from '@/api/api';
<span>{{item.isDefault ? '默认地址' : '设为默认'}}</span> import { AddressList, NavBar } from 'vant';
</van-radio> import { setLocalStorage } from '@/utils/local-storage';
<div>
<router-link export default {
:to="{name: 'address-edit', params: {addressId: item.id}}" data() {
style="margin-right: 10px;" return {
> chosenAddressId: -1,
<van-icon name="editor"/>编辑 addressList: []
</router-link> };
<span @click="delAddress(item.id)"> },
<van-icon name="lajitong"/>删除
</span> created() {
</div> this.loadAddress();
</van-cell> },
</van-cell-group> methods: {
</van-radio-group> onAdd() {
this.$router.push({ name: 'address-edit', query: { addressId: -1 } });
<van-button class="bottom_btn" @click="setNewAddress" type="primary" bottomAction>添加地址</van-button> },
</div> onEdit(item, index) {
</template> this.$router.push({ name: 'address-edit', query: { addressId: item.id } });
},
<script> onSelect(item, index) {
import { Checkbox, Radio, RadioGroup, NavBar } from 'vant'; setLocalStorage({ AddressId: item.id });
import { async } from 'q'; this.$router.go(-1);
import _ from 'lodash'; },
goback() {
export default { this.$router.go(-1);
data() { },
return { loadAddress() {
checkedId: '', addressList().then(res => {
default_address: 1, this.addressList = res.data.data;
addressList: [ })
{ }
id: 1 },
},
{ components: {
id: 2 [NavBar.name]: NavBar,
}, [AddressList.name]: AddressList
{ }
id: 3 };
}, </script>
{
id: 4
} <style lang="scss" scoped>
], .addressGroup {
addresses: [] margin-bottom: 10px;
}; &:last-child {
}, margin-bottom: 0;
}
created() { }
this.loadAddress();
}, .bottom_btn {
methods: { position: fixed;
async setDefaultAddress(item) { bottom: 0;
let { data } = await this.$reqGet( }
`/wx/address/detail?id=${item.id}` </style>
);
let params = data.data;
params.isDefault = true;
await this.$reqPost('/wx/address/save', params);
},
async delAddress(id) {
let { data } = await this.$reqPost('/wx/address/delete', {
id: id
});
this.loadAddress();
},
setNewAddress() {
this.$router.push({ name: 'address-edit', params: { addressId: -1 } });
},
goback() {
this.$router.go(-1);
},
async loadAddress() {
let { data } = await this.$reqGet('/wx/address/list');
this.addresses = data.data;
this.checkedId = _.find(this.addresses, result => {
return result.isDefault === true;
}).id;
}
},
components: {
[NavBar.name]: NavBar,
[Checkbox.name]: Checkbox,
[Radio.name]: Radio,
[RadioGroup.name]: RadioGroup
}
};
</script>
<style lang="scss" scoped>
.addressGroup {
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
}
.bottom_btn {
position: fixed;
bottom: 0;
}
</style>
<template> <template>
<div class="user_collect"> <div class="user_collect">
<form action="/search" class="fixedTop">
<van-search placeholder="请输入商品名称" v-model="searchVal"/>
</form>
<van-list <van-list
v-model="loading" v-model="loading"
:finished="finished" :finished="finished"
...@@ -29,16 +25,13 @@ ...@@ -29,16 +25,13 @@
</item-group> </item-group>
</van-list> </van-list>
<is-empty v-if="isEmpty">没有商品收藏</is-empty> <is-empty v-if="items.length === 0">没有商品收藏</is-empty>
<!-- <div class="clear_invalid" v-if="items.length" @click="clearInvalid">
<van-icon name="lajitong"/>清除失效商品
</div>-->
</div> </div>
</template> </template>
<script> <script>
import { GOODS_COLLECT_LIST } from '@/api/user'; import { collectList, collectAddOrDelete } from '@/api/api';
import ItemGroup from '@/components/item-group/'; import ItemGroup from '@/components/item-group/';
import ItemCardHori from '@/components/item-card-hori/'; import ItemCardHori from '@/components/item-card-hori/';
...@@ -53,53 +46,33 @@ export default { ...@@ -53,53 +46,33 @@ export default {
data() { data() {
return { return {
shop_id: 1, page: 1,
items: [], limit: 10,
searchVal: '' total: 0,
items: []
}; };
}, },
created() { created() {
this.resetInit(); this.init();
}, },
methods: { methods: {
initData() { init() {
return this.$reqGet( collectList({type:0, page:this.page, limit:this.limit}).then(res => {
'/wx/collect/list?type=0&page=1&size=100',
{},
{
hideLoading: true
}
).then(res => {
// debugger;
const { collectList, page } = res.data.data; const { collectList, page } = res.data.data;
this.items.push(...collectList); this.items.push(...collectList);
return page;
}); });
}, },
cancelCollect(event, i, item) { cancelCollect(event, i, item) {
this.$dialog.confirm({ message: '是否取消收藏该商品' }).then(() => { this.$dialog.confirm({ message: '是否取消收藏该商品' }).then(() => {
this.$reqPost( collectAddOrDelete({ valueId: item.valueId, type: 0 }).then(res => {
'/wx/collect/addordelete',
{ valueId: item.valueId, type: 0 },
{
hideLoading: true
}
).then(res => {
this.items.splice(i, 1); this.items.splice(i, 1);
}); });
}); });
}, },
clearInvalid() {
this.$dialog.confirm({ message: '确定清除所有失效商品吗?' });
},
itemClick(i, item) { itemClick(i, item) {
// const item_id = this.items[i].item_id;
// const status = this.items[i].goods_status;
// status &&
this.$router.push(`/items/detail/${item.valueId}`); this.$router.push(`/items/detail/${item.valueId}`);
// !status && this.$toast('该商品已失效');
} }
}, },
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment