Showing 48 changed files with 1214 additions and 374 deletions
... ... @@ -4,11 +4,11 @@ export default {
props: {
tag: {
type: String,
default: 'dev'
default: 'div'
}
},
render(h, { scopedSlots, props, data, parent }) {
return h(props.props, {
render(h, { scopedSlots, props, data }) {
return h(props.tag, {
'!click': this.onClick
}, [h(scopedSlots.defaults(), data)]);
},
... ...
... ... @@ -2,10 +2,11 @@
<div class="layout">
<slot name="header">
<LayoutHeader v-if="!hideHeader"
class="layout-header"
:title="title"
:opacity="opacity"
:show-back="showBack"
class="layout-header"
:title="title"
:opacity="opacity"
:show-back="showBack"
:back-action="backAction"
></LayoutHeader>
</slot>
... ... @@ -35,6 +36,10 @@ export default {
hideHeader: {
type: Boolean,
default: false
},
backAction: {
type: Function,
default: null
}
}
};
... ...
... ... @@ -15,7 +15,7 @@
</template>
<script>
import {mapState} from 'vuex';
import { mapState } from 'vuex';
export default {
name: 'LayoutHeader',
... ... @@ -28,6 +28,10 @@ export default {
showBack: {
type: Boolean,
default: true
},
backAction: {
type: Function,
default: null
}
},
title(setTitle) {
... ... @@ -36,7 +40,7 @@ export default {
}
if (this.title) {
setTitle(this.title);
this.$xianyu.setXianyuTitle({title: this.title});
this.$xianyu.setXianyuTitle({ title: this.title });
}
this.setTitle = setTitle;
},
... ... @@ -45,7 +49,11 @@ export default {
},
methods: {
onBack() {
this.$router.go(-1);
if (this.backAction) {
this.backAction();
} else {
this.$router.go(-1);
}
}
}
};
... ...
<template>
<LayoutApp title="选择地址" :show-back="true">
<LayoutApp title="选择地址" :show-back="true" :back-action="goBack">
<CubeScroll class="main-container" ref="scroll" :options="scrollOpts">
<div class="user-list">
<div
... ... @@ -21,7 +21,7 @@
<p class="name">{{ item.consignee }}</p>
<p class="mobile">{{ item.mobile }}</p>
<div v-if="item.is_default === 'Y'" class="tag-btn">默认</div>
<div v-if="item.tag_code" class="tag-btn">{{ item.tag }}</div>
<div v-if="item.tag_code && item.tag" class="tag-btn">{{ item.tag }}</div>
<div
class="option-btn"
:data-item="JSON.stringify(item)"
... ... @@ -42,23 +42,22 @@
</template>
<script>
import Layout from "../../../components/layout/layout-app";
import { get } from "lodash";
import { Scroll, Loading } from "cube-ui";
import { get } from 'lodash';
import { Scroll, Loading } from 'cube-ui';
import {
SET_USER_ADDRESS_INFO,
STORE_UPDATE_ADDRESS_INFO
} from "store/address/address/types";
} from 'store/address/address/types';
import { createNamespacedHelpers } from 'vuex';
import { createNamespacedHelpers } from "vuex";
const { mapState, mapMutations, mapActions } = createNamespacedHelpers(
"address/address"
'address/address'
);
export default {
name: "addressManager",
name: 'addressManager',
components: {
LayoutApp: Layout,
CubeScroll: Scroll
},
data() {
... ... @@ -66,20 +65,26 @@ export default {
scrollOpts: {
bounce: false
},
pageName: "",
selectedAddressId: "",
pageName: '',
selectedAddressId: '',
query: {}
};
},
computed: {
...mapState(["addressList"])
...mapState(['addressList'])
},
methods: {
...mapMutations(["SET_USER_ADDRESS_INFO", "STORE_UPDATE_ADDRESS_INFO"]),
...mapActions(["fetchUserAddressList"]),
...mapMutations(['SET_USER_ADDRESS_INFO', 'STORE_UPDATE_ADDRESS_INFO']),
...mapActions(['fetchUserAddressList']),
toOrderPage(item) {
this.SET_USER_ADDRESS_INFO(item);
this.$router.push({
this.$router.replace({
name: this.pageName,
query: this.query
});
},
goBack() {
this.$router.replace({
name: this.pageName,
query: this.query
});
... ... @@ -93,8 +98,8 @@ export default {
if (isAdd) {
if (this.addressList.length >= 5) {
this.toast = this.$createToast({
type: "error",
txt: "地址不能超过5个",
type: 'error',
txt: '地址不能超过5个',
mask: true
}).show();
... ... @@ -104,8 +109,8 @@ export default {
//编辑地址时保存item
if (!isAdd) {
let addressInfo = JSON.parse(item || "{}");
Object.assign(addressInfo, { isUpdate: !isAdd, orderCode: "" });
let addressInfo = JSON.parse(item || '{}');
Object.assign(addressInfo, { isUpdate: !isAdd, orderCode: '' });
this.STORE_UPDATE_ADDRESS_INFO(addressInfo);
} else {
... ... @@ -113,7 +118,10 @@ export default {
}
this.$router.push({
name: "addressEdit"
name: 'addressEdit',
query: {
fromPage: this.pageName
}
});
}
},
... ... @@ -124,7 +132,7 @@ export default {
beforeRouteEnter(to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
if (from.name !== "addressEdit") {
if (from.name !== 'addressEdit') {
vm.query = from.query;
vm.pageName = from.name;
}
... ... @@ -171,6 +179,7 @@ export default {
background: url(~statics/image/address/selected.png) no-repeat;
background-size: cover;
}
.uncheck-item {
margin-left: 28px;
width: 40px;
... ...
... ... @@ -84,21 +84,22 @@
</template>
<script>
import Layout from "../../../components/layout/layout-app";
import Input from "./components/input";
import FormItem from "./components/form-item";
import Radio from "./components/radio";
import AddressAct from "./components/address-act";
import RadioGroup from "./components/radio-group";
import { Scroll } from "cube-ui";
import { createNamespacedHelpers } from "vuex";
import Layout from '../../../components/layout/layout-app';
import Input from './components/input';
import FormItem from './components/form-item';
import Radio from './components/radio';
import AddressAct from './components/address-act';
import RadioGroup from './components/radio-group';
import { Scroll } from 'cube-ui';
import { createNamespacedHelpers } from 'vuex';
const { mapState, mapMutations, mapActions } = createNamespacedHelpers(
"address/address"
'address/address'
);
export default {
name: "addressEdit",
name: 'addressEdit',
components: {
LayoutApp: Layout,
CInput: Input,
... ... @@ -115,24 +116,24 @@ export default {
},
isShowProvince: false,
isUpdate: false,
updateMobileNum: "",
updateMobileNum: '',
isMobileNumEdit: false,
title: "",
orderCode: "",
title: '',
orderCode: '',
model: {
consignee: "",
address_id: "",
mobile: "",
area_code: "",
area: "",
address: "",
tag_code: "",
consignee: '',
address_id: '',
mobile: '',
area_code: '',
area: '',
address: '',
tag_code: '',
is_default: false
}
};
},
watch: {
"model.mobile": function(val) {
'model.mobile': function(val) {
if (val === this.updateMobileNum) {
this.isMobileNumEdit = false;
} else {
... ... @@ -141,10 +142,10 @@ export default {
}
},
computed: {
...mapState(["addressTags", "updateAddressInfo"]),
...mapState(['addressTags', 'updateAddressInfo']),
submitClass() {
return [
"sure-btn",
'sure-btn',
{
active: this.inNotEmpty
}
... ... @@ -162,11 +163,11 @@ export default {
methods: {
...mapMutations({}),
...mapActions([
"fetchAddressTags",
"addUserAddress",
"updateUserAddress",
"deleteUserAddress",
"updateReceiptAddressInOrder"
'fetchAddressTags',
'addUserAddress',
'updateUserAddress',
'deleteUserAddress',
'updateReceiptAddressInOrder'
]),
async onSubmit() {
... ... @@ -196,15 +197,15 @@ export default {
if (result && result.code === 200) {
this.$createToast({
type: "txt",
txt: result.message.split(".").join("")
type: 'txt',
txt: result.message.split('.').join('')
}).show();
await this.sleep(1000);
this.$router.go(-1);
} else {
this.$createToast({
type: "error",
type: 'error',
txt: result.message,
mask: true
}).show();
... ... @@ -212,16 +213,16 @@ export default {
},
validator() {
let info = this.model;
let username = info.consignee.replace(/(^\s+)|(\s+$)/g, "");
let username = info.consignee.replace(/(^\s+)|(\s+$)/g, '');
// 简单的表单校验
if (!username) {
this.showToast("收件人不能为空");
this.showToast('收件人不能为空');
return false;
}
if (!/^[\u4E00-\u9FA5A-Za-z0-9*]+$/gi.test(username)) {
this.showToast("收货人姓名不支持特殊符号");
this.showToast('收货人姓名不支持特殊符号');
return false;
}
... ... @@ -233,32 +234,32 @@ export default {
}
if (!info.mobile) {
this.showToast("手机号不能为空");
this.showToast('手机号不能为空');
return false;
} else {
if (!reg.test(info.mobile)) {
this.showToast("请输入正确11位手机号码");
this.showToast('请输入正确11位手机号码');
return;
}
}
if (!info.area_code || !info.area) {
this.showToast("省市区不能为空");
this.showToast('省市区不能为空');
return false;
}
if (!info.address) {
this.showToast("地址不能为空");
this.showToast('地址不能为空');
return false;
}
return {
id: info.address_id || "",
id: info.address_id || '',
consignee: username,
mobile: info.mobile,
area_code: info.area_code,
area: info.area,
address: info.address,
is_default: info.is_default ? "Y" : "N",
is_default: info.is_default ? 'Y' : 'N',
tag_code: info.tag_code
};
},
... ... @@ -266,15 +267,15 @@ export default {
const result = await this.deleteUserAddress(this.model.address_id);
if (result && result.code === 200) {
this.$createToast({
type: "txt",
txt: result.message.split(".").join("")
type: 'txt',
txt: result.message.split('.').join('')
}).show();
await this.sleep(1000);
this.$router.go(-1);
} else {
this.$createToast({
type: "error",
type: 'error',
txt: result.message,
mask: true
}).show();
... ... @@ -300,7 +301,7 @@ export default {
},
showToast(tip) {
this.$createToast({
type: "txt",
type: 'txt',
txt: tip
}).show();
},
... ... @@ -316,9 +317,10 @@ export default {
activated() {
let addressInfo = this.updateAddressInfo;
this.isUpdate = addressInfo.isUpdate;
this.isUpdate =
addressInfo.isUpdate && this.$route.query.fromPage !== 'OrderSellConfirm';
this.orderCode = addressInfo.orderCode;
this.title = addressInfo.isUpdate ? "编辑地址" : "添加地址";
this.title = addressInfo.isUpdate ? '编辑地址' : '添加地址';
// 订单编辑 不查标签
if (!this.orderCode) {
... ... @@ -334,7 +336,7 @@ export default {
this.model.area = addressInfo.area;
this.model.address = addressInfo.address;
this.model.tag_code = addressInfo.tag_code;
this.model.is_default = addressInfo.is_default === "Y" ? true : false;
this.model.is_default = addressInfo.is_default === 'Y' ? true : false;
} else {
this.model = {};
}
... ...
... ... @@ -29,7 +29,6 @@ export default {
console.log(item);
let { type, description } = item;
this.$router.push({name:'newsDetail',query: {type,description}})
this.$emit('clearStore',1);
}
}
};
... ...
... ... @@ -8,8 +8,7 @@
:data="newsList.list">
<div class="news-content">
<Tab
v-if="newsList.tabList.length > 0" :list="newsList.tabList"
@clearStore="clearStoreData"></Tab>
v-if="newsList.tabList.length > 0" :list="newsList.tabList"></Tab>
<List v-if="newsList.list.length > 0" :list="newsList && newsList.list || []"></List>
<UfoNoItem v-else :tip="`暂无数据`" style="margin-6op: 50px"></UfoNoItem>
</div>
... ... @@ -65,13 +64,6 @@ export default {
await this.fetchNewsList(params);
this.$refs.scroll.forceUpdate();
},
clearStoreData(index) {
console.log(index);
}
},
watch:{
// '$route':["fetchNewsList","fetchNewsTabList"]
},
components: {
Style,
... ...
... ... @@ -38,7 +38,6 @@ export default {
...mapState(['newsList','newsDeatilList']),
},
activated() {
console.log('111');
let params = {
type: this.type,
isPage: true
... ...
... ... @@ -15,11 +15,11 @@
<span class="size">{{sizeInfo}}</span>
<div class="pricedetail">
<div>
<span class="priceTitle">最低售价: </span>
<span class="priceTitle">现货最低售价: </span>
<span class="price">¥{{originProductData.least_price || '-'}}</span>
</div>
<div>
<span class="priceTitle">最高求购价: </span>
<span class="priceTitle">现货最高求购价: </span>
<span class="price">¥{{originProductData.bid_moster_price || '-'}}</span>
</div>
</div>
... ... @@ -60,7 +60,15 @@
<div class="line"></div>
<div class="space"></div>
<day-choose :value="chooseDay" :options="dayOptions" :choose="BUYER_ASK_SET_CHOOSEDAY"></day-choose>
<!--<day-choose :chooseDay="chooseDay" :options="dayOptions" :choose="BUYER_ASK_SET_CHOOSEDAY"></day-choose>-->
<div class="dayChoose" @click="showPicker">
<span class="leftText" >求购期限:</span>
<div class="rightWrapper">
<span class="rightText">{{chooseDay || '7天'}}</span>
<i class="cubeic-arrow" ></i>
</div>
</div>
<div class="space"></div>
<div class="line"></div>
... ... @@ -90,10 +98,7 @@ const {mapState, mapActions, mapMutations, mapGetters} = createNamespacedHelpers
export default {
name: 'BuyerAskOrder',
components: {Button, Input, DayChoose, OrderAddress, OrderAgree},
props: {
lazy: Boolean,
storageId: Number,
},
props: ['lazy', 'storageId'],
component: {
Input,
OrderAddress,
... ... @@ -138,8 +143,11 @@ export default {
next(vm => {
// 通过 `vm` 访问组件实例
vm.inputPrice = '';
vm.BUYER_ASK_RESET_DATA();
if (from.name !== 'address') {
vm.inputPrice = '';
vm.BUYER_ASK_RESET_DATA();
}
});
},
... ... @@ -331,13 +339,39 @@ export default {
// vm.onClose(orderResult.data.orderCode);
}
}).show();
}
},
showPicker() {
console.log(this.options);
this.$createPicker({
title: '选择求购时限',
data: [this.dayOptions],
onSelect: (value) => {
this.BUYER_ASK_SET_CHOOSEDAY(value[0]);
},
selectedIndex: [2],
onCancel: () => {
}
}).show();
},
}
};
</script>
<style lang="scss" scoped>
.dayChoose {
height: 60px;
font-family: PingFang-SC-Regular;
font-size: 14*2px;
color: #000000;
display: flex;
justify-content: space-between;
flex-direction: row;
}
.body {
height: 100%;
/*position: relative;*/
... ... @@ -399,7 +433,7 @@ export default {
.productPrice {
width: calc(100% - 120*2px - 40*2px - 10*2px);
width: calc(100% - 120*2px - 10*2px);
height: 120*2px;
margin-left: 10*2px;
}
... ...
... ... @@ -2,15 +2,16 @@
<LayoutApp :show-back="true" title="确认订单">
<div class="body">
<AddressInfo :data="address" class="order-item" :show-tip="false"></AddressInfo>
<ProductInfo :data="orderDetail.good" class="product-info order-item"></ProductInfo>
<ProductInfo :data="productDetail" class="product-info order-item"></ProductInfo>
<Coupon class="order-item" v-if="couponList.length > 0" :data="orderDetail.recommendedCouponInfo"
@click="onCouponClick"></Coupon>
<Promotion class="order-item" v-if="promotionList.length > 0" :data="orderDetail.promotionTips"
@click="onPromotionClick"></Promotion>
<BuyerFeeInfo :data="orderDetail.promotionFormulaList" class="order-item"></BuyerFeeInfo>
<div class="tip2 order-item">{{orderDetail.specialTips}}</div>
<div class="tip order-item" v-html="replaceBr(orderDetail.damagesDesc)"></div>
<OrderInfo class="order-item" :pay-way="orderDetail.paymentWay"
<BuyerFeeInfo :data="orderDetail.promotionFormulaList" v-if="orderDetail.promotionFormulaList"
class="order-item"></BuyerFeeInfo>
<div class="tip2 order-item" v-if="orderDetail.specialTips">{{orderDetail.specialTips}}</div>
<div class="tip order-item" v-if="orderDetail.damagesDesc" v-html="replaceBr(orderDetail.damagesDesc)"></div>
<OrderInfo class="order-item" v-if="orderDetail.paymentWay" :pay-way="orderDetail.paymentWay"
:delivery-way="orderDetail.deliveryWay"></OrderInfo>
</div>
... ... @@ -52,7 +53,6 @@ export default {
Promotion
},
async mounted() {
this.fetchUserStatus();
this.fetchOrderAddress({ tabType: UserType.buy });
await this.$store.dispatch('product/getSelectedTradeProduct', {
... ... @@ -60,25 +60,40 @@ export default {
storageId: this.storageId
});
const payInfo = await this.fetchPayment({ skup: this.productDetail.skup });
let user = await this.$sdk.getUser();
if (payInfo?.code !== 200) {
this.$createToast({
time: 2000,
txt: payInfo.message,
type: 'txt'
}).show();
}
if (user && user.uid) {
const payInfo = await this.fetchPayment({ skup: this.productDetail.skup });
if (this.address.address_id) {
await this.compute();
if (payInfo?.code !== 200) {
this.$createToast({
time: 2000,
txt: payInfo.message,
type: 'txt'
}).show();
}
if (this.address?.address_id) {
await this.compute();
}
}
},
beforeRouteLeave(to, from, next) {
if (to.name !== 'address') {
this[Types.CLEAR_BUY_STATUS]();
}
next();
},
computed: {
...mapOrderState(['address', 'orderDetail']),
...mapState({
productDetail: state => {
return {
goodImg: get(state.product.selectedProductInfo, 'product.goods_list[0].image_list[0].image_url', ''),
productName: get(state.product.selectedProductInfo, 'product.product_name', ''),
colorName: get(state.product.selectedProductInfo, 'product.goods_list[0].color_name', ''),
sizeName: get(state.product.selectedProductInfo, 'size.size_name', ''),
goodPrice: get(state.product.selectedProductInfo, 'size.least_price', ''),
skup: get(state.product.selectedProductInfo, 'size.skup', '')
};
}
... ... @@ -90,9 +105,17 @@ export default {
return get(this.orderDetail, 'promotionList', []);
},
},
watch: {
address: {
handler() {
this.compute();
},
deep: true
}
},
methods: {
...mapOrderAction(['fetchOrderAddress', 'fetchUserStatus', 'fetchPayList', 'fetchPayment', 'computeOrder', 'buyPayAction']),
...mapOrderMutations([Types.CHANGE_SELECT_COUPON_LIST, Types.CHANGE_SELECT_PROMOTION]),
...mapOrderMutations([Types.CHANGE_SELECT_COUPON_LIST, Types.CHANGE_SELECT_PROMOTION, Types.CLEAR_BUY_STATUS]),
replaceBr(str) {
return str ? str.replace(/\n/g, '<br />') : '';
},
... ... @@ -156,14 +179,37 @@ export default {
}
});
},
checkAddress() {
if (!this.address) {
this.$createToast({
time: 1500,
txt: '请选择地址',
type: 'txt'
}).show();
return false;
}
return true;
},
async onPayAction() {
const user = await this.$yoho.auth();
if (!user) {
return;
}
const vm = this;
if (!this.checkAddress()) {
return;
}
await this.compute();
const result = await this.buyPayAction({
skup: this.productDetail.skup,
addressId: this.address.address_id,
addressId: this.address?.address_id,
couponCode: get(this.orderDetail, 'recommendedCouponInfo.coupon_code', ''),
promotionId: get(this.orderDetail, 'promotionTips.promotionIds', '')
});
... ...
... ... @@ -2,11 +2,11 @@
<template>
<div class="customSelectWrapper">
<div class="customSelectTextWrapper" @click="showPicker">
<div class="customSelectWrapper" @click="showPicker">
<div class="customSelectTextWrapper" >
<span class="leftText">求购期限:</span>
<div class="rightWrapper">
<span class="rightText">{{value}}</span>
<span class="rightText">{{currentOption || '7天'}}</span>
<i class="cubeic-arrow" ></i>
</div>
</div>
... ... @@ -25,9 +25,9 @@ export default {
type: Array,
default: [],
},
value: {
chooseDay: {
type: String,
default: '',
default: '7天',
},
choose: {
type: Function,
... ... @@ -37,33 +37,35 @@ export default {
components: {Select},
computed: {
chooseday: {
currentOption: {
get() {
return this.value;
return this.current || this.chooseDay;
},
set(val) {
set(val) {
this.current = val;
}
}
},
data() {
return {
// options: ['1天', '3天', '7天', '15天', '30天'],
// value: '7天',
title: '选择求购时限',
current: '',
};
},
methods: {
change(value, index, text) {
console.log('change', value, index, text);
// console.log('change', value, index, text);
this.choose && this.choose(value[0]);
this.current = value[0];
},
showPicker() {
console.log(this.options)
console.log(this.options);
this.$createPicker({
title: '选择求购时限',
data: [this.options],
... ...
... ... @@ -34,13 +34,17 @@ export default {
}
},
methods: {
onClick() {
this.$router.push({
name: 'address',
query: {
address_id: this.data?.address_id
}
});
async onClick() {
const user = await this.$yoho.auth();
if (user) {
this.$router.push({
name: 'address',
query: {
address_id: this.data?.address_id
}
});
}
}
}
};
... ...
<template>
<div class="input-wrapper">
<div class="price-symbol">¥</div>
<input ref="input" :value="value" class="tip" type="text" placeholder="定价需以9结尾,例如¥1299" @blur="onBlur"
@change="onChange"></input>
</div>
<div class="input-comp">
<div class="input-wrapper">
<div class="price-symbol">¥</div>
<input ref="input" :value="value" class="tip" type="text" placeholder="定价需以9结尾,例如¥1299" @blur="onBlur"
@change="onChange"></input>
</div>
<div class="num-wrapper" v-if="superSell">
<i class="iconfont iconplus-minus icon-class" @click="onMinus"></i>
<span class="icon-class count">{{count}}</span>
<i class="iconfont iconi-add icon-class" @click="onAdd"></i>
</div>
</div>
</template>
<script>
... ... @@ -13,11 +20,20 @@ export default {
value: {
type: [Number, String],
default: ''
},
num: {
type: Number,
default: 1
},
superSell: {
type: Boolean,
default: false
}
},
data() {
return {
val: this.value
val: this.value,
count: this.num
};
},
methods: {
... ... @@ -26,6 +42,16 @@ export default {
},
onChange() {
this.$emit('input', this.$refs.input.value);
},
onMinus() {
if (this.count > 1) {
this.count -= 1;
this.$emit('on-num-change', this.count);
}
},
onAdd() {
this.count += 1;
this.$emit('on-num-change', this.count);
}
},
watch: {
... ... @@ -37,8 +63,14 @@ export default {
</script>
<style lang="scss" scoped>
.input-comp {
display: flex;
}
.input-wrapper {
display: flex;
flex: 1;
position: relative;
overflow: hidden;
height: 120px;
... ... @@ -68,4 +100,25 @@ export default {
opacity: 1; /* Firefox */
}
.num-wrapper {
width: 240px;
height: 120px;
margin-left: 10px;
background: #f5f5f5;
display: flex;
justify-content: space-around;
align-items: center;
.icon-class {
font-size: 40px;
color: #999;
font-weight: bold;
}
.count {
color: black;
}
}
</style>
... ...
<template>
<div>
<div class="tip">需支付保证金:<span class="red">{{data.earnestMoneyStr || '¥0'}}</span><i v-if="!hiddenIcon" class="iconfont iconquestion icon-class"
@click="onClick"></i></div>
<div class="tip" v-if="!superSell">需支付保证金:<span class="red">{{data.earnestMoneyStr || '¥0'}}</span><i v-if="!hiddenIcon"
class="iconfont iconquestion icon-class"
@click="onClick"></i></div>
<div class="tip2">所有商品必须为国内现货,且承诺36小时内发货,交易成功后将自动退还保证金</div>
</div>
</template>
... ... @@ -21,6 +22,12 @@ export default {
default() {
return false;
}
},
superSell: {
type: Boolean,
default() {
return false;
}
}
},
methods: {
... ...
... ... @@ -5,7 +5,7 @@
<div class="product-price">
<div class="product-price-wrapper">
<div class="price">{{data.colorName}},{{data.sizeName}}</div>
<div class="tip">{{ priceType || '最低售价:'}} <span class="price2">¥{{data.goodPrice}}</span></div>
<div class="tip">{{ priceType || '最低售价:'}} <span class="price2">¥{{data.goodPrice || '-'}}</span></div>
</div>
</div>
</div>
... ...
... ... @@ -6,24 +6,46 @@
</p>
<p class="price-item">
<span>当前最高求购价:</span>
<span>¥{{ goodsInfo.goodPrice }}</span>
<span>¥{{ goodsInfo.bidHighestPrice }}</span>
</p>
<p class="price-item">
<p v-if="goodsInfo.leastPrice" class="price-item">
<span>最低现货价:</span>
<span>¥{{ goodsInfo.leastPrice }}</span>
</p>
<p v-for="(priceInfo, i) in computePriceList" :key="i">
<InputUfo
type="number"
placeholder="定价需以9结尾 例如1999"
:maxlength="8"
:class="errorTip ? 'ipt-number show-error' : 'ipt-number'"
v-model="chgPrice"
>
<span class="prepend" slot="prepend">¥</span>
</InputUfo>
<p class="error-tip">{{ errorTip }}</p>
<p
:class="
i === computePriceList.length - 1
? 'promotion-list-item last'
: 'promotion-list-item'
"
v-for="(priceInfo, i) in computePriceList"
:key="i"
>
<span>{{ priceInfo.promotion }}:</span>
<span>{{ priceInfo.promotionAmount }}</span>
</p>
<p class="a-tip">Tip: 调整求购价成功后,当前的求购将被关闭</p>
<p class="tip">Tip: 调整求购价成功后,当前的求购将被关闭</p>
</div>
</template>
<script>
import { createNamespacedHelpers } from "vuex";
const { mapActions } = createNamespacedHelpers("order/orderList");
import InputUfo from "../price-change/components/input-ufo";
import { debounce } from "lodash";
const { mapActions, mapMutations } = createNamespacedHelpers("order/orderList");
export default {
components: { InputUfo },
props: {
computePriceInfo: {
type: Object,
... ... @@ -32,17 +54,75 @@ export default {
goodsInfo: {
type: Object,
default: () => ({})
},
orderCode: {
type: Number,
default: 0
}
},
data() {
return {
chgPrice: "",
errorTip: "",
computePrice: null
};
},
computed: {
computePriceList() {
return this.computePriceInfo.promotionFormulaList.filter(
const priceInfo = this.computePrice || this.computePriceInfo;
return priceInfo.promotionFormulaList.filter(
({ promotion }) => promotion === "运费" || promotion === "实付金额"
);
}
},
mounted() {
// debounce防抖动,输入数字后延迟500毫秒提交
this.inputChange = debounce(this.onChange.bind(this), 500);
},
methods: {
...mapActions(["computeChangePrice", "changePrice"])
...mapActions(["computeChangePrice", "changePrice"]),
...mapMutations(["setChangePrice"]),
async onChange(price) {
if (this.checkPrice(price)) {
const res = await this.computeChangePrice({
price,
orderCode: this.orderCode
});
if (typeof res === "string") {
this.errorTip = res;
this.setChangePrice(0);
} else {
this.computePrice = res;
this.setChangePrice(price);
}
} else {
this.setChangePrice(0);
}
},
checkPrice(price) {
let valid = false;
if (!price) {
this.errorTip = "没有价格";
return false;
} else if (!/^\d+$/.test(price)) {
this.errorTip = "价格只能为正整数";
} else if (!/9$/.test(price)) {
this.errorTip = "出售价格必须以9结尾";
} else if (+price === +this.goodsInfo.goodPrice) {
this.errorTip = "前后价格没有变化";
} else {
this.errorTip = "";
valid = true;
}
return valid;
}
},
watch: {
chgPrice(newVal) {
this.inputChange(newVal);
}
}
};
</script>
... ... @@ -54,8 +134,32 @@ export default {
padding: 0 38px;
letter-spacing: 0;
.ipt-number {
margin: 30px 0;
&.show-error {
margin-bottom: 0;
}
}
.error-tip {
color: #d0021b;
}
.promotion-list-item {
display: flex;
justify-content: space-between;
align-items: center;
color: #999;
&.last {
color: #000;
}
}
.tip {
color: #999;
margin-top: 40px;
}
}
</style>
\ No newline at end of file
... ...
... ... @@ -133,7 +133,10 @@ export default {
Object.assign(updateInfo, { isUpdate: true, orderCode: orderCode });
this.STORE_UPDATE_ADDRESS_INFO(updateInfo);
this.$router.push({
name: "addressEdit"
name: 'addressEdit',
query: {
fromPage: 'order-list'
}
});
break;
}
... ...
... ... @@ -7,11 +7,11 @@
</div>
<div class="address-info">
<div class="consignee">
<span>{{stateCenterAddress.address_name}}</span>
<span>{{ stateCenterAddress.address_name }}</span>
<span class="tag">有货鉴定中心</span>
</div>
<p class="location">{{stateCenterAddress.address}}</p>
<p>{{stateCenterAddress.mobile}}</p>
<p class="location">{{ stateCenterAddress.address }}</p>
<p>{{ stateCenterAddress.mobile }}</p>
</div>
</div>
<div class="deliver-express">
... ... @@ -20,41 +20,65 @@
</div>
<div class="express-info">
<div class="express-name">顺丰快运</div>
<CubeInput class="express-input" v-model="expressCode" placeholder="请填写顺丰运单号"></CubeInput>
<span v-if="canScan" class="iconfont iconscan scan-btn" @click="scanCode"></span>
<CubeInput
class="express-input"
v-model="expressCode"
placeholder="请填写顺丰运单号"
></CubeInput>
<span
v-if="canScan"
class="iconfont iconscan scan-btn"
@click="scanCode"
></span>
</div>
</div>
<div v-if="stateCenterAddress.deliverDesc" class="deliver-tip">
<span class="iconfont iconwarn"></span>
<p>{{stateCenterAddress.deliverDesc}}</p>
<p>{{ stateCenterAddress.deliverDesc }}</p>
</div>
<div class="submit-warp">
<div class="contract-check">
<i class="iconfont" :class="readContract ? 'iconcheck_full checked' : 'iconcheck_default'" @click="changeReadContract"></i>
<i
class="iconfont"
:class="
readContract ? 'iconcheck_full checked' : 'iconcheck_default'
"
@click="changeReadContract"
></i>
<span>我已阅读并同意</span>
<LayoutLink href="//activity.yoho.cn/feature/4049.html?share_id=6729&title=UFO卖家商品质检标准">《UFO卖家商品质检标准》</LayoutLink>
<LayoutLink
href="//activity.yoho.cn/feature/4049.html?share_id=6729&title=UFO卖家商品质检标准"
>《卖家商品质检标准》</LayoutLink
>
</div>
<p v-if="stateCenterAddress.warnTips" class="warn-tip">{{stateCenterAddress.warnTips}}</p>
<CubeButton class="deliver-btn" :disabled="deliverDisable" @click="submitDeliver">发货</CubeButton>
<p v-if="stateCenterAddress.warnTips" class="warn-tip">
{{ stateCenterAddress.warnTips }}
</p>
<CubeButton
class="deliver-btn"
:disabled="deliverDisable"
@click="submitDeliver"
>发货</CubeButton
>
</div>
</div>
</LayoutApp>
</template>
<script>
import { get } from 'lodash';
import { Button, Input } from 'cube-ui';
import { createNamespacedHelpers } from 'vuex';
import { get } from "lodash";
import { Button, Input } from "cube-ui";
import { createNamespacedHelpers } from "vuex";
const { mapState, mapActions } = createNamespacedHelpers('order/orderDeliver');
const { mapState, mapActions } = createNamespacedHelpers("order/orderDeliver");
export default {
name: 'OrderDeliver',
name: "OrderDeliver",
data() {
return {
canScan: false,
centerAddress: {},
expressCode: '',
expressCode: "",
readContract: false
};
},
... ... @@ -62,7 +86,7 @@ export default {
let { skup, code } = this.$route.params || {};
this.orderCode = code;
if (process.env.VUE_ENV !== 'server') {
if (process.env.VUE_ENV !== "server") {
this.fetchAppraiseAddress({
skup,
orderCode: code
... ... @@ -70,7 +94,7 @@ export default {
}
},
computed: {
...mapState(['appraiseAddress']),
...mapState(["appraiseAddress"]),
stateCenterAddress() {
if (!this.centerAddress.address) {
this.centerAddress = get(this.appraiseAddress, this.orderCode) || {};
... ... @@ -89,71 +113,99 @@ export default {
this.$yoho.auth();
this.fetchAppraiseAddressChangeNotice({orderCode: this.orderCode}).then(res => {
let isChanged = get(res, 'data.isChanged');
let isForceShow = get(res, 'data.isForceShow');
this.fetchAppraiseAddressChangeNotice({ orderCode: this.orderCode }).then(
res => {
let isChanged = get(res, "data.isChanged");
let isForceShow = get(res, "data.isForceShow");
if (!isChanged && !isForceShow) {
return;
}
let { title = '', tips, alert_address_name, alert_address, alert_mobile } = res.data || {};
let info = [
alert_address_name || '',
alert_address || '',
alert_mobile || ''
];
if (!isChanged && !isForceShow) {
return;
}
if (isChanged && tips) {
info.unshift(tips);
}
let {
title = "",
tips,
alert_address_name,
alert_address,
alert_mobile
} = res.data || {};
let info = [
alert_address_name || "",
alert_address || "",
alert_mobile || ""
];
this.$createDialog({
type: 'alert',
confirmBtn: {
text: '我知道了'
},
onConfirm() {
// Todo report()
console.log('Todo Report', res.data);
if (isChanged && tips) {
info.unshift(tips);
}
}, (createElement) => {
return [
createElement('div', {
class: {
'dg-notice-content': true
this.$createDialog(
{
type: "alert",
confirmBtn: {
text: "我知道了"
},
slot: 'content'
}, [
createElement('div', {
class: {
'dg-notice-content-title': true
}
}, isChanged ? 'UFO仓库调整公告' : title),
...info.map(val => {
return createElement('p', {
class: {
'dg-notice-content-info': true
onConfirm() {
// Todo report()
console.log("Todo Report", res.data);
}
},
createElement => {
return [
createElement(
"div",
{
class: {
"dg-notice-content": true
},
slot: "content"
},
}, val);
})
])
];
}).show();
});
[
createElement(
"div",
{
class: {
"dg-notice-content-title": true
}
},
isChanged ? "UFO仓库调整公告" : title
),
...info.map(val => {
return createElement(
"p",
{
class: {
"dg-notice-content-info": true
}
},
val
);
})
]
)
];
}
).show();
}
);
},
methods: {
...mapActions(['fetchAppraiseAddress', 'fetchAppraiseAddressChangeNotice', 'deliverOrderToDepot']),
...mapActions([
"fetchAppraiseAddress",
"fetchAppraiseAddressChangeNotice",
"deliverOrderToDepot"
]),
toast(msg, time = 1500) {
this.$createToast && this.$createToast({
txt: msg,
type: 'txt',
time
}).show();
this.$createToast &&
this.$createToast({
txt: msg,
type: "txt",
time
}).show();
},
scanCode() {
if (window && window.WindVane) {
window.WindVane.call('Scancode', 'scan', {}, e => {
window.WindVane.call("Scancode", "scan", {}, e => {
if (e && e.code) {
this.expressCode = e.code;
}
... ... @@ -184,11 +236,11 @@ export default {
this.$router.go(-1);
// Todo report()
} else {
this.toast(res.message || '网络异常,请稍后重试');
this.toast(res.message || "网络异常,请稍后重试");
}
});
} else {
this.toast('请输入正确的快递单号');
this.toast("请输入正确的快递单号");
}
}
},
... ... @@ -216,7 +268,6 @@ export default {
color: #000;
}
}
</style>
<style lang="scss" scoped>
... ... @@ -260,7 +311,7 @@ export default {
font-weight: 300;
padding: 0 14px;
margin-left: 6px;
color: #002B47;
color: #002b47;
border: 1px solid #ccc;
border-radius: 10px;
box-sizing: border-box;
... ... @@ -321,7 +372,6 @@ export default {
color: #444;
font-weight: 500;
margin-left: 10px;
}
}
... ...
<template>
<layout-app>
<layout-app :title="'\u200E'">
<div class="order-detail-wrapper">
<div class="content">
<!-- 状态信息 -->
... ... @@ -25,18 +25,24 @@
<!-- 商品信息 -->
<order-item-info class="item-wrapper" />
<!-- 鉴定视频 -->
<div
class="video-wrapper item-wrapper"
v-if="orderDetail.appraiseVideoUrl"
@click="() => onVideoHandler()"
></div>
<div class="video-img" v-if="orderDetail.appraiseVideoUrl" @click="() => onVideoHandler()"></div>
<div ref="videoWrapper" class="video-wrapper">
<VideoPlayer
ref="videoPlayer"
class="video-player"
:source="orderDetail.appraiseVideoUrl"
></VideoPlayer>
</div>
<!-- 价格信息 -->
<div class="price-info item-wrapper">
<p>
<span class="label">商品金额:</span>
<span>¥{{ priceInfo.goodPrice }}</span>
</p>
<p v-if="parseInt(priceInfo.activityCutPrice || '') > 0" class="delivery-fee">
<p
v-if="parseInt(priceInfo.activityCutPrice || '') > 0"
class="delivery-fee"
>
<span class="label">活动优惠:</span>
<span>-¥{{ priceInfo.activityCutPrice }}</span>
</p>
... ... @@ -44,15 +50,24 @@
<span class="label">运费:</span>
<span>¥{{ priceInfo.feePrice }}</span>
</p>
<p v-if="parseInt(priceInfo.couponCutPrice || '') > 0" class="delivery-fee">
<p
v-if="parseInt(priceInfo.couponCutPrice || '') > 0"
class="delivery-fee"
>
<span class="label">优惠券:</span>
<span>-¥{{ priceInfo.couponCutPrice }}</span>
</p>
<p v-if="parseInt(priceInfo.shippingCouponCutPrice || '') > 0" class="delivery-fee">
<p
v-if="parseInt(priceInfo.shippingCouponCutPrice || '') > 0"
class="delivery-fee"
>
<span class="label">运费券:</span>
<span>-¥{{ priceInfo.shippingCouponCutPrice }}</span>
</p>
<p v-if="parseInt(priceInfo.cutPromotionPrice || '') > 0" class="delivery-fee">
<p
v-if="parseInt(priceInfo.cutPromotionPrice || '') > 0"
class="delivery-fee"
>
<span class="label">促销:</span>
<span>-¥{{ priceInfo.cutPromotionPrice }}</span>
</p>
... ... @@ -103,10 +118,6 @@
"
/>
</div>
<div ref="videoWrapper">
<VideoPlayer ref="videoPlayer" class="play-video" :source="orderDetail.appraiseVideoUrl"></VideoPlayer>
</div>
</div>
</layout-app>
</template>
... ... @@ -176,12 +187,6 @@ export default {
}
this.$refs.videoPlayer.parentHandleclick();
}
},
mounted() {
if (this.$yoho.isAndroid) {
this.$refs.videoWrapper.style.position = "absolute";
this.$refs.videoWrapper.style.top = "-1000px";
}
}
};
</script>
... ... @@ -216,13 +221,25 @@ export default {
}
}
.video-wrapper {
width: 100%;
.video-img {
margin-top: 40px;
margin-left: -15px;
width: calc(100% + 20px);
height: 378px;
background: url("~statics/image/order/video-big@3x.png");
background-size: cover;
}
.video-wrapper {
overflow: hidden;
}
.video-player {
display: block;
height: 30px;
opacity: 0;
}
.item-wrapper {
border-top: 1px solid #eee;
padding: 40px 0;
... ... @@ -310,11 +327,5 @@ export default {
font-size: 28px;
color: #d0021b;
}
.play-video {
display: inline-block;
height: 10px;
opacity: 0;
}
}
</style>
... ...
... ... @@ -5,9 +5,13 @@
<div class="address-wrapper">
<i class="address-icon"></i>
<div>
<p class="consignee">{{ appraiseAddress.addressName }}</p>
<p class="consignee">
收货人地址:&nbsp;{{ appraiseAddress.addressName }}
</p>
<p class="area">{{ appraiseAddress.address }}</p>
<p class="mobile">{{ appraiseAddress.mobile }}</p>
<p class="mobile">
{{ appraiseAddress.mobile }}<i ref="copy" class="copy"></i>
</p>
</div>
</div>
<router-link
... ... @@ -37,6 +41,7 @@
<script>
import { createNamespacedHelpers } from "vuex";
import Clipboard from "clipboard";
const { mapGetters } = createNamespacedHelpers("order/orderDetail");
export default {
... ... @@ -48,6 +53,20 @@ export default {
},
computed: {
...mapGetters(["userAddress", "appraiseAddress"])
},
activated() {
this.copyBtn = new Clipboard(this.$refs.copy, {
text: () => {
const { addressName, address, mobile } = this.appraiseAddress;
return `${addressName} ${address} ${mobile}`;
}
});
this.copyBtn.on("success", () => {
this.$createToast({
txt: "复制成功",
type: "txt"
}).show();
});
}
};
</script>
... ... @@ -96,6 +115,15 @@ export default {
font-weight: bold;
}
.copy {
width: 50px;
height: 25px;
display: inline-block;
background: url("~statics/image/order/copy@3x.png") no-repeat;
background-size: contain;
background-position: center;
}
.address-icon {
width: 48px;
height: 48px;
... ...
/* eslint-disable operator-linebreak */
/* eslint-disable space-before-function-paren */
import { createNamespacedHelpers } from 'vuex';
const { mapActions } = createNamespacedHelpers('order/orderList');
const { mapActions, mapState } = createNamespacedHelpers('order/orderList');
import { orderActionsMap, ownType } from 'constants/order-constants';
import DialogConfirmInfo from '../../components/dialog-confirm-info';
import DialogChangeBidPrice from '../../components/dialog-change-bid-price';
export default {
data() {
... ... @@ -12,8 +13,17 @@ export default {
isMixin: true,
};
},
computed: {
...mapState(['changePrice']),
},
methods: {
...mapActions(['cancelTradeConfirmInfo', 'cancelTrade', 'deleteOrder']),
...mapActions([
'cancelTradeConfirmInfo',
'cancelTrade',
'deleteOrder',
'computeChangePrice',
'confirmChangePrice',
]),
async onSellerOrderAction({ action, order }) {
const { owner = ownType.SELL } = this.$route.params;
const { orderCode, earnestMoney } = order;
... ... @@ -89,7 +99,12 @@ export default {
},
async onBuyerOrderAction({ action, order }) {
const { owner = ownType.SELL } = this.$route.params;
const { orderCode, priceInfo = {}, bidDepositInfo = {} } = order;
const {
orderCode,
priceInfo = {},
bidDepositInfo = {},
goodsInfo,
} = order;
switch (action.name) {
case orderActionsMap.DEL_ORDER.name: {
... ... @@ -112,6 +127,57 @@ export default {
}).show();
break;
}
case orderActionsMap.CHANGE_BID_PRICE.name: {
const { goodPrice } = goodsInfo;
const computePriceInfo = await this.computeChangePrice({
orderCode,
price: goodPrice,
});
if (typeof computePriceInfo === 'string') {
this.$createToast({
type: 'alert',
txt: computePriceInfo,
mask: true,
}).show();
return;
}
this.$createDialog(
{
type: 'prompt',
confirmBtn: { text: '调整求购价' },
cancelBtn: { active: true },
onConfirm: async () => {
if (!this.changePrice) {
return;
}
const isOk = await this.confirmChangePrice({
price: this.changePrice,
orderCode,
});
if (isOk) {
this.fetchOrderDetail(this.$route.params);
}
},
},
createElement => {
return [
createElement(DialogChangeBidPrice, {
props: {
computePriceInfo,
goodsInfo,
orderCode,
},
slot: 'content',
}),
];
},
).show();
break;
}
case orderActionsMap.CANCEL_ORDER.name: {
let confirmInfo = await this.cancelTradeConfirmInfo({
orderCode,
... ...
<template>
<layout-app>
<layout-app :title="'\u200E'">
<div class="order-detail-wrapper">
<div class="content">
<!-- 状态信息 -->
... ...
... ... @@ -118,7 +118,7 @@ export default {
},
watch: {
source() {
this.showPlayer();
// this.showPlayer();
}
},
mounted() {
... ... @@ -131,6 +131,7 @@ export default {
},
methods: {
parentHandleclick() {
this.showVideo = true;
this.player.play();
const timeId = setTimeout(() => {
this.player.requestFullscreen();
... ... @@ -142,7 +143,6 @@ export default {
return;
}
this.showVideo = true;
this.$nextTick(() => {
this.initPlayer();
});
... ...
... ... @@ -69,7 +69,8 @@ export default {
...mapGetters(["orderList", "pullUpLoad"]),
options: function() {
return {
pullUpLoad: this.pullUpLoad
pullUpLoad: this.pullUpLoad,
pullDownRefresh: true
};
},
isFetchEntryOrder() {
... ...
... ... @@ -5,19 +5,24 @@ import { createNamespacedHelpers } from 'vuex';
import DialogConfirmInfo from '../../components/dialog-confirm-info';
import DialogChangeBidPrice from '../../components/dialog-change-bid-price';
const { mapActions, mapMutations } = createNamespacedHelpers('order/orderList');
const { mapActions, mapMutations, mapState } = createNamespacedHelpers(
'order/orderList',
);
const { mapMutations: inSaleMapMutations } = createNamespacedHelpers(
'order/inSaleOrderList',
);
export default {
computed: {
...mapState(['changePrice']),
},
methods: {
...mapActions([
'cancelTradeConfirmInfo',
'cancelTrade',
'deleteOrder',
'computeChangePrice',
'changePrice',
'confirmChangePrice',
]),
...mapMutations(['filterOrderList', 'resetData']),
...inSaleMapMutations(['filterInSaleOrderList']),
... ... @@ -158,16 +163,43 @@ export default {
price: goodPrice,
});
if (typeof computePriceInfo === 'string') {
this.$createToast({
type: 'alert',
txt: computePriceInfo,
mask: true,
}).show();
return;
}
this.$createDialog(
{
type: 'prompt',
confirmBtn: { text: '调整求购价' },
cancelBtn: { active: true },
onConfirm: async () => {
if (!this.changePrice) {
return;
}
const isOk = await this.confirmChangePrice({
price: this.changePrice,
orderCode,
});
if (isOk) {
this.resetData();
this.fetchData(this.$route.params);
}
},
},
createElement => {
return [
createElement(DialogChangeBidPrice, {
props: { computePriceInfo, goodsInfo },
props: {
computePriceInfo,
goodsInfo,
orderCode,
},
slot: 'content',
}),
];
... ...
... ... @@ -24,10 +24,10 @@
@on-video="params => onVideoHandle(params)"
/>
</div>
<div ref="videoWrapper">
<div ref="videoWrapper" class="video-wrapper">
<VideoPlayer
:ref="order.orderCode"
class="play-video"
class="video-player"
:source="order.appraiseVideoUrl"
></VideoPlayer>
</div>
... ... @@ -35,7 +35,11 @@
</ul>
</scroll>
<empty-list class="empty-wrapper" tip="这里什么都没有..." v-show="isShowEmpty" />
<empty-list
class="empty-wrapper"
tip="这里什么都没有..."
v-show="isShowEmpty"
/>
</div>
</layout-app>
</template>
... ... @@ -77,7 +81,8 @@ export default {
...mapState(["orderList", "pullUpLoad", "isShowEmpty"]),
options: function() {
return {
pullUpLoad: this.pullUpLoad
pullUpLoad: this.pullUpLoad,
pullDownRefresh: true
};
}
},
... ... @@ -142,20 +147,23 @@ export default {
.order-list-scroll-wrap {
.list-wrapper {
li {
padding: 40px 40px;
padding: 40px 40px 0;
border-bottom: 1px solid #eee;
}
.play-video {
display: inline-block;
height: 10px;
opacity: 0;
}
& :last-child {
border-bottom: 0;
}
}
}
.video-wrapper {
overflow: hidden;
}
.video-player {
display: block;
height: 40px;
opacity: 0;
}
}
</style>
... ...
... ... @@ -35,10 +35,13 @@
>
<span class="title">{{ detailInfo.title }}</span>
<time-line :isGoingOn="i === 0" :deliveryList="detailInfo.detailList">
<template v-slot:content="{detail: {miniFaultConfirm}}">
<template v-slot:content="{ detail: { miniFaultConfirm } }">
<div class="judge-content-wrapper" v-if="miniFaultConfirm">
<p class="tip">
<span :class="[miniFaultConfirm.showBtn ? '' : 'tipTextGray']">{{ miniFaultConfirm.text }}</span>
<span
:class="[miniFaultConfirm.showBtn ? '' : 'tipTextGray']"
>{{ miniFaultConfirm.text }}</span
>
<span v-if="miniFaultConfirm.showBtn">
,请在<count-down
:leftTime="miniFaultConfirm.leftTime"
... ... @@ -49,32 +52,29 @@
</p>
<div class="img-container">
<ul class="img-wrapper">
<template v-if="miniFaultConfirm.imageUrls.length > 3">
<li v-for="(imgUrl, i) in miniFaultConfirm.imageUrls" :key="i" v-if="i < 3" @click="showBigImage(miniFaultConfirm, i)">
<ImageFormat
:data-secc="imgUrl"
:src="imgUrl"
alt=""
:width="70"
:height="70"
/>
</li>
<li>
<Button class="more" @click="showBigImage(miniFaultConfirm, 3)">查看更多</Button>
</li>
</template>
<template v-else>
<li v-for="(imgUrl, i) in miniFaultConfirm.imageUrls" :key="i" @click="showBigImage">
<ImageFormat
:data-secc="imgUrl"
:src="imgUrl"
alt=""
:width="70"
:height="70"
/>
</li>
</template>
<li
v-for="(imgUrl, i) in miniFaultConfirm.imageUrls.slice(
0,
3
)"
:key="i"
@click="showBigImage(miniFaultConfirm, i)"
>
<ImageFormat
:data-secc="imgUrl"
:src="imgUrl"
alt=""
:width="70"
:height="70"
/>
</li>
<li v-if="miniFaultConfirm.imageUrls.length > 3">
<Button
class="more"
@click="showBigImage(miniFaultConfirm, 3)"
>查看更多</Button
>
</li>
</ul>
</div>
<div class="actions-wrapper" v-if="miniFaultConfirm.showBtn">
... ... @@ -189,11 +189,12 @@ export default {
onCancel: () => {}
}).show();
},
showBigImage(data, index) { // 点击小图展示大图
showBigImage(data, index) {
// 点击小图展示大图
if (data.imageUrls && data.imageUrls.length > 0) {
this.imageUrls = [];
data.imageUrls.forEach((val) => {
this.imageUrls.push(val.replace(/{width}x{height}/, '750x'));
data.imageUrls.forEach(val => {
this.imageUrls.push(val.replace(/{width}x{height}/, "750x"));
});
this.$createImagePreview({
... ... @@ -201,7 +202,6 @@ export default {
initialIndex: index
}).show();
}
},
flawRejectDialog() {
... ...
... ... @@ -20,9 +20,6 @@
下架商品保证金会被释放
</p>
</div>
<div class="change-price-modal">
<p class="modal-title">您确定不卖此商品吗?</p>
</div>
</Modal>
</template>
... ...
... ... @@ -3,7 +3,7 @@
<LayoutApp :show-back="true">
<div class="body">
<TitleComp txt="变现"></TitleComp>
<ProductInfo :data="originProductData" class="product-info" :priceType="'最高求购价'"></ProductInfo>
<ProductInfo :data="originProductData" class="product-info" :priceType="'现货最高求购价:'"></ProductInfo>
<div class="inputView">
<span class="inputViewIcon">
¥
... ... @@ -62,6 +62,7 @@ export default {
hiddenIcon: true,
agreeDesc: '有货卖家协议',
url: `http://m.yohobuy.com/activity/student/detail/renzhen?openby:yohobuy={\"action\":\"go.h5\",\"params\":{\"url\":\"https://activity.yoho.cn/feature/3187.html?title=卖家协议\"}}`,
isEntry: false,
};
},
... ... @@ -83,6 +84,14 @@ export default {
},
mounted() {
this.isEntry = false
this.fetchSellerEntryStatus({})
.then((res)=> {
console.log(res)
if (res) {
this.isEntry = get(res, 'entrySellerType', 0) !== 0
}
})
this.fetchSellerOrderCount({tabType: 'sell'});// 19268
this.sellerCompute({price: this.price, skup: this.skup});
... ... @@ -105,13 +114,51 @@ export default {
'fetchSellerOrderCount',
'sellerCompute',
'sellerPublish',
'fetchSellerEntryStatus',
]),
submitClick() {
this.sellerPublish({price: this.price, skup: this.skup, address_id: this.addressInfo.address_id})
.then(() => {
this.payOrder();
});
if (this.isEntry) {
this.$createDialog({
type: 'confirm',
title: '',
content: `确定以${this.price}出售此商品`,
confirmBtn: {
text: '确定出售',
active: true,
disabled: false,
href: 'javascript:;',
},
cancelBtn: {
text: '我再想想',
active: false,
disabled: false,
href: 'javascript:;'
},
onConfirm: () => {
this.sellerPublish({price: this.price, skup: this.skup, address_id: this.addressInfo.address_id})
.then(() => {
this.$createToast({
time: 1000,
type: 'txt',
txt: '出售成功'
}).show();
this.$router.go(-1);
});
},
onCancel: () => {
this.computePrice();
}
}).show();
} else {
this.sellerPublish({price: this.price, skup: this.skup, address_id: this.addressInfo.address_id})
.then(() => {
this.payOrder();
});
}
},
payOrder() {
... ...
<template>
<LayoutApp :show-back="true" title="确认出售">
<LayoutApp :show-back="true" title="出售">
<div class="body">
<ProductInfo :data="productDetail" class="product-info"></ProductInfo>
<InputPrice @input="changePrice" :value="price" class="input-price" @on-blur="compute"></InputPrice>
<OrderMargin class="order-item order-margin" :data="fee"></OrderMargin>
<InputPrice @input="changePrice" class="input-price"
:num="num" :value="price"
@on-blur="compute" :super-sell="superSell"
@on-num-change="onNumChange"
>
</InputPrice>
<OrderMargin class="order-item order-margin" :data="fee" :super-sell="superSell"></OrderMargin>
<OrderFee class="order-item" :data="fee"></OrderFee>
<AddressInfo :data="address" class="order-item"></AddressInfo>
</div>
... ... @@ -48,25 +53,34 @@ export default {
return {
txt: '提交',
error: false,
num: 1,
agreeDesc: '有货卖家协议',
url: 'https://activity.yoho.cn/feature/3187.html?share_id=5851&title=ufo-%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE'
url: 'https://activity.yoho.cn/feature/3187.html?share_id=5851&title=ufo-%E5%8D%96%E5%AE%B6%E5%8D%8F%E8%AE%AE',
superSell: false
};
},
mounted() {
this.fetchUserStatus();
this.fetchUserStatus().then(result => {
this.superSell = get(result, 'data.entrySellerType', 0) !== 0;
});
this.fetchOrderAddress({ tabType: UserType.sell });
this.$store.dispatch('product/getSelectedTradeProduct', {
productId: this.productId,
storageId: this.storageId
});
},
beforeRouteLeave(to, from, next) {
if (to.name !== 'address') {
this[Types.CLEAR_SELL_STATUS]();
}
next();
},
computed: {
...mapOrderState(['address', 'fee', 'price', 'agree']),
...mapOrderState(['address', 'fee', 'price', 'agree', 'num']),
...mapState({
productDetail: state => {
return {
goodImg: get(state.product.selectedProductInfo, 'product.goods_list[0].image_list[0].image_url', ''),
productName: get(state.product.selectedProductInfo, 'product.product_name', ''),
colorName: get(state.product.selectedProductInfo, 'product.goods_list[0].color_name', ''),
sizeName: get(state.product.selectedProductInfo, 'size.size_name', ''),
goodPrice: get(state.product.selectedProductInfo, 'size.least_price', ''),
... ... @@ -74,9 +88,17 @@ export default {
}
})
},
watch: {
address: {
handler() {
this.compute();
},
deep: true
}
},
methods: {
...mapOrderAction(['fetchOrderAddress', 'fetchUserStatus', 'fetchOrderPrice', 'submitOrder', 'fetchPayList']),
...mapOrderMutations([Types.CHANGE_PRICE, Types.CHANGE_AGREE]),
...mapOrderMutations([Types.CHANGE_PRICE, Types.CHANGE_AGREE, Types.CLEAR_SELL_STATUS, Types.CHANGE_SELL_NUM]),
onClick() {
this.submit();
... ... @@ -103,12 +125,28 @@ export default {
changePrice(val) {
this[Types.CHANGE_PRICE](val);
},
checkAddress() {
if (!this.address) {
this.$createToast({
time: 1500,
txt: '请选择地址',
type: 'txt'
}).show();
return false;
}
return true;
},
changeAgree(val) {
this[Types.CHANGE_AGREE](val);
},
async submit() {
const vm = this;
if (!this.checkAddress()) {
return;
}
await this.compute();
if (this.error) {
... ... @@ -116,8 +154,8 @@ export default {
}
const orderResult = await this.submitOrder({
address_id: this.address.address_id,
num: 1,
address_id: this.address?.address_id,
num: this.num,
price: this.price,
storage_id: this.storageId,
});
... ... @@ -138,6 +176,13 @@ export default {
txt: orderResult.message,
type: 'txt'
}).show();
this.$router.replace({
name: 'ProductDetail',
params: {
productId: this.productId
}
});
return;
}
... ... @@ -174,6 +219,9 @@ export default {
}
});
},
onNumChange(count) {
this[Types.CHANGE_SELL_NUM](count);
}
}
};
</script>
... ...
... ... @@ -160,7 +160,7 @@ export default {
}
.size-list {
flex: 1 0 100%;
flex: 1;
overflow: hidden;
}
... ...
... ... @@ -34,8 +34,7 @@ export default {
name: 'size-list',
props: {
list: {
type: [Array, null],
required: true,
type: Array,
},
addSize: {
type: Boolean,
... ...
... ... @@ -37,6 +37,11 @@ const { mapActions } = createNamespacedHelpers('product');
export default {
name: 'SizeRequest',
mixins: [stateShortCutsMixins],
props: {
productId: {
type: Number,
},
},
components: {
LayoutApp,
SizeList,
... ... @@ -78,9 +83,10 @@ export default {
}
},
_requestSize() {
const sizeIds = this.selected.map(item => item.size_id).join(',');
const size_ids = this.selected.map(item => item.size_id).join(',');
const goods_id = this.productDetail.goods_list[0].goods_id;
this.requestSize({sizeIds}).then(() => {
this.requestSize({ product_id: this.productId, goods_id, size_ids }).then(() => {
this.$createDialog({
type: 'alert',
content: '您的尺码添加申请已提交,我们会尽快审核并通知您,请耐心等待',
... ...
... ... @@ -102,7 +102,7 @@ export default {
return null;
},
canAddSize() {
return get(this.product, 'goods_list[0].canAddSize', false);
return get(this.product, 'goods_list[0].canAddSize', false) && this.config.type === 'sell';
},
isAvailable() {
... ... @@ -115,7 +115,7 @@ export default {
isTradable() {
return this.isAvailable && (
(this.config.type === 'buy' && this.selectedSize.storage_num > 0 && this.selectedSize.least_price !== '-') ||
this.isMarketable
this.config.type === 'sell'
);
},
... ... @@ -189,8 +189,6 @@ export default {
this.$yoho.auth()
.then(() => {
console.log(this.selectedSize);
this.$store.commit('order/sellerAskOrder/SELLER_ASK_SET_PRODUCTINFO', {
goodImg: get(this.product, 'goods_list[0].image_list[0].image_url', ''),
colorName: get(this.product, 'goods_list[0].color_name', ''),
... ...
... ... @@ -80,7 +80,7 @@
@hidden="onSizeSelectSheetHidden"
@select="onSelectTradeProduct"
@add="onRequestSize"/>
<size-request-sheet v-if="showSizeRequestSheet" @hidden="onSizeRequestHidden"/>
<size-request-sheet v-if="showSizeRequestSheet" @hidden="onSizeRequestHidden" :productId="productId"/>
<buy-sheet v-if="showBuySheet" @hidden="onBuyHidden" :productId="productId"/>
</div>
</template>
... ... @@ -381,9 +381,6 @@ export default {
qiugou() {
this.showBuySheet = true;
},
onBuyHidden() {
this.showBuySheet = false;
},
},
};
</script>
... ...
... ... @@ -53,8 +53,11 @@ export default function() {
const result = await this.$api.get('/api/ufo/channel/channelList', {
content_code: 'f788335b57b67c1711f255648c744dab',
});
console.log(result);
console.log("resultresultresult");
if (result.code === 200) {
commit(Types.FETCH_CHANNEL, { list: result.data });
return result.data;
}
}
... ...
... ... @@ -31,25 +31,35 @@ export default function() {
},
[Types.FETCH_NEWSDETAIL_LIST](state, { list }) {
console.log(list.page);
console.log("list.page");
state.newsDeatilList.list = list.page > 1 ? state.newsDeatilList.list.concat(list.list) : list.list;
state.newsDeatilList.page = list.page;
state.newsDeatilList.totalPage = list.totalPage;
list.page < list.totalPage ? state.newsDeatilList.isMoreData = true : state.newsDeatilList.isMoreData = false;
},
resPages(state, {page, isMoreData}) {
state.newsDeatilList.page = page;
state.newsDeatilList.isMoreData = isMoreData;
},
[Types.FETCH_NEWS_TAB_LIST](state, { list }) {
state.newsList.tabList = list;
},
},
actions: {
async fetchNewsList({ commit, state }, obj) {
let page = state.newsList.page + 1;
let limit = state.newsList.limit;
console.log(obj)
console.log("objobj")
let type = obj && obj.type;
let page = type ? state.newsDeatilList.page + 1 : state.newsList.page + 1;
let limit = state.newsList.limit;
let isPage = obj && obj.isPage;
// 页面跳转重置page页码
isPage ? page = 1 : state.newsList.page + 1;
if (isPage) {
page = 1;
}
const result = await this.$api.post('/api/ufo/home/newsList', {
page, type: type || '', limit
});
... ... @@ -59,8 +69,10 @@ export default function() {
res.createTime = moment(new Date(res.createTime * 1000)).format('YYYY.MM.DD HH:mm');
});
if (type) {
console.log('1');
commit(Types.FETCH_NEWSDETAIL_LIST, {list: result.data});
} else {
console.log('2');
commit(Types.FETCH_NEWS_LIST, {list: result.data});
}
}
... ...
... ... @@ -41,7 +41,7 @@ export default function() {
state.notEntryOrder.page = ++page;
state.notEntryOrder.pagetotal = pagetotal;
state.notEntryOrder.list = state.entryOrder.list.concat(data);
state.notEntryOrder.list = state.notEntryOrder.list.concat(data);
// 分页结束
if (page > pagetotal) {
... ...
... ... @@ -12,7 +12,10 @@ export const Types = {
CHANGE_SELECT_PROMOTION: 'CHANGE_SELECT_PROMOTION',
COMPUTE_ORDER: 'COMPUTE_ORDER',
UPDATE_ORDER: 'UPDATE_ORDER',
CHANGE_BUY_AGREE: 'CHANGE_BUY_AGREE'
CHANGE_BUY_AGREE: 'CHANGE_BUY_AGREE',
CHANGE_SELL_NUM: 'CHANGE_SELL_NUM',
CLEAR_SELL_STATUS: 'CLEAR_SELL_STATUS',
CLEAR_BUY_STATUS: 'CLEAR_BUY_STATUS'
};
export const UserType = {
... ... @@ -28,7 +31,7 @@ export default function() {
return {
namespaced: true,
state: {
address: {},
address: null,
fee: {
income: '',
bankTransferFee: '',
... ... @@ -43,8 +46,11 @@ export default function() {
},
alipayStatus: false,
userStatus: false,
price: '',
agree: false,
num: 1,
buyAgree: false,
orderDetail: {},
... ... @@ -71,6 +77,17 @@ export default function() {
[Types.FETCH_ORDER_BUY_ORDER](state, data) {
state.orderDetail = data;
},
[Types.CLEAR_SELL_STATUS](state) {
state.agree = false;
state.price = '';
state.num = 1;
},
[Types.CHANGE_SELL_NUM](state, data) {
state.num = data;
},
[Types.CLEAR_BUY_STATUS](state) {
state.buyAgree = false;
},
[Types.UPDATE_ORDER](state, { amount, couponInfo, couponList, promotionFormulaList, promotionList, promotionTips }) {
state.orderDetail.amount = amount;
state.orderDetail.promotionFormulaList = promotionFormulaList;
... ... @@ -155,7 +172,9 @@ export default function() {
const address = find(get(addressInfo, 'data', []), { is_default: 'Y' });
commit(Types.FETCH_ORDER_ADDRESS, address);
if (address) {
commit(Types.FETCH_ORDER_ADDRESS, address);
}
}
},
... ... @@ -173,7 +192,7 @@ export default function() {
},
async fetchUserStatus() {
const userStatus = await this.$api.get('/api/order/user/status');
return this.$api.get('/api/order/user/status');
},
async submitOrder({ commit }, payload) {
... ...
... ... @@ -10,6 +10,9 @@ const initailData = () => ({
currentStatus: null,
routeParamStatus: null,
isShowEmpty: false,
// 求购调价
changePrice: 0,
});
export default function() {
... ... @@ -49,6 +52,9 @@ export default function() {
state.pagetotal = 0;
state.pullUpLoad = true;
},
setChangePrice(state, price) {
state.changePrice = price;
},
resetData(state) {
const s = initailData();
... ... @@ -168,16 +174,19 @@ export default function() {
},
);
return res.code === 200 ? res.data : null;
return res.code === 200 ? res.data : res.message || '';
},
// 买家调价
async changePrice(_, { orderCode, price }) {
async confirmChangePrice({ commit }, { orderCode, price }) {
const res = await this.$api.post('/api/order/buyerask/changeprice', {
orderCode: `${orderCode}`,
price: +price,
});
if (res.code) {
commit('setChangePrice', 0);
}
return res.code === 200 ? res.data : null;
},
},
... ...
... ... @@ -67,7 +67,7 @@ export default function() {
mutations: {
[SELLER_ASK_SET_IS_SHOWTOAST](state, payload) {
state.isShowTip = payload
state.isShowTip = payload;
},
[SELLER_ASK_SET_PRODUCTINFO](state, payload) {
... ... @@ -124,6 +124,20 @@ export default function() {
actions: {
fetchSellerEntryStatus({commit}, {} = {}) {
return this.$api.get('/api/ufo/sellerOrder/entryStatus')
.then(result => {
if (result.code === 200) {
return result.data;
} else {
return null;
}
}, error => {
return null;
});
},
fetchSellerOrderCount({commit, dispatch}, {tabType = 'sell', uid} = {}) {
this.$api.get('/api/order/ordercount', {
tabType,
... ...
... ... @@ -103,13 +103,13 @@ export default {
resetSelectedSize({commit}) {
commit(Types.RESET_SELECTED_PRODUCT_SIZE);
},
async requestSize({ state }, { sizeIds }) {
async requestSize({ state }, { product_id, goods_id, size_ids }) {
const selectedProduct = state.selectedProductInfo;
await this.$api.get('/api/ufo/product/addsize', {
product_id: selectedProduct.productId,
goods_id: get(selectedProduct.product, 'goods_list[0].goods_id'),
size_ids: sizeIds
product_id,
goods_id,
size_ids,
});
// 忽略错误
... ...
... ... @@ -238,7 +238,7 @@ if (isProduction) {
'http://java-yohoufo-fore.test3.ingress.dev.yohocorp.com/ufo-gateway/',
service: process.env.TEST_API || 'http://api-test3.dev.yohocorp.com/',
},
useCache: false,
useCache: true,
monitorReport: {
host: '192.168.102.22',
port: 8086,
... ...
... ... @@ -72,6 +72,7 @@ module.exports = {
'/api/ufo/mine/resource': {
ufo: true,
api: 'ufo.resource.get',
cache: true,
params: {
content_code: { type: String }},
},
... ... @@ -93,6 +94,7 @@ module.exports = {
content_code: { type: String },
},
auth: true,
cache: true
},
'/api/ufo/home/newsList': {
ufo: true,
... ...
... ... @@ -68,6 +68,19 @@ module.exports = {
},
},
// 建议尺码
'/api/ufo/product/addsize': {
ufo: true,
auth: true,
path: '/ufo-gateway/ufoLive',
api: 'ufo.product.addSize',
params: {
product_id: {type: Number}, // 商品id
goods_id: {type: Number}, // 商品id
size_ids: {type: String}, // 建议尺码id
},
},
// 推荐
'/api/ufo/product/recommend': {
ufo: true,
... ...
... ... @@ -93,12 +93,18 @@ const handlerError = (err = {}, req, res, next) => {
return next(err);
};
const getCacheKey = (urlPath, cackeKey = '') => {
const urlObj = url.parse(urlPath);
const getCacheKey = (req, route) => {
const urlObj = url.parse(req.url);
let ck = urlObj.pathname;
return md5(cackeKey
.replace('$url', urlObj.pathname)
.replace('$params', urlObj.query));
if (route.query) {
const qks = Object.keys(route.query);
ck += `?${qks.map(qk => `${qk}=${req.query && req.query[qk] || ''}`).join('&')}`;
}
ck += `|${pkg.version}`;
return md5(ck);
};
const render = (route) => {
... ... @@ -125,7 +131,7 @@ const render = (route) => {
if (isDegrade) {
return res.send(degradeHtml);
}
const ck = route.cackeKey ? getCacheKey(req.url, route.cackeKey) : void 0;
const ck = getCacheKey(req, route);
if (config.useCache && route.cache && ck) {
const html = await redis.getAsync(ck);
... ... @@ -183,7 +189,7 @@ const devRender = (route) => {
return async(req, res, next) => {
try {
res.setHeader('X-YOHO-Version', pkg.version);
const ck = route.cackeKey ? getCacheKey(req.url, route.cackeKey) : void 0;
const ck = getCacheKey(req, route);
if (route.accessLog) {
logger.info(`${req.yoho.clientIp} | ${req.url} | uid:${req.user.uid} | ${new Date()}`);
... ... @@ -196,7 +202,7 @@ const devRender = (route) => {
const html = await redis.getAsync(ck);
if (html) {
logger.debug(`cached ${req.url}`);
logger.info(`cached ${req.url}`);
res.setHeader('X-YOHO-Cached', 'HIT');
return res.send(html);
}
... ...
{
"name": "xianyu-ufo-app-web",
"version": "0.0.2-beta-20",
"version": "0.0.2-beta-23",
"private": true,
"description": "Xianyu Project With Express",
"repository": {
... ...
... ... @@ -728,6 +728,13 @@
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@^7.4.5":
version "7.6.3"
resolved "http://npm.yohops.com/@babel%2fruntime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f"
integrity sha1-k1Eix0xz0iQMr9Mt21/Cps01zx8=
dependencies:
regenerator-runtime "^0.13.2"
"@babel/template@^7.1.0", "@babel/template@^7.1.2":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644"
... ... @@ -1067,6 +1074,19 @@
resolved "http://r.cnpmjs.org/@types/yargs/download/@types/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916"
integrity sha1-Rd0dBjjoyPFT6H0paQdlkpaHORY=
"@videojs/http-streaming@1.10.6":
version "1.10.6"
resolved "http://npm.yohops.com/@videojs%2fhttp-streaming/-/http-streaming-1.10.6.tgz#a9119b1828b354c5cc17b42ea051cc7bcce2dca0"
integrity sha1-qRGbGCizVMXMF7QuoFHMe8zi3KA=
dependencies:
aes-decrypter "3.0.0"
global "^4.3.0"
m3u8-parser "4.4.0"
mpd-parser "0.8.1"
mux.js "5.2.1"
url-toolkit "^2.1.3"
video.js "^6.8.0 || ^7.0.0"
"@vue/component-compiler-utils@^3.0.0":
version "3.0.0"
resolved "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.0.0.tgz#d16fa26b836c06df5baaeb45f3d80afc47e35634"
... ... @@ -1299,6 +1319,15 @@ address@>=0.0.1:
resolved "http://npm.yohops.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
integrity sha1-tfUGMfjWzsi9IMljljr7VeBsvOk=
aes-decrypter@3.0.0:
version "3.0.0"
resolved "http://npm.yohops.com/aes-decrypter/-/aes-decrypter-3.0.0.tgz#7848a1c145b9fdbf57ae3e2b5b1bc7cf0644a8fb"
integrity sha1-eEihwUW5/b9Xrj4rWxvHzwZEqPs=
dependencies:
commander "^2.9.0"
global "^4.3.2"
pkcs7 "^1.0.2"
agentkeepalive@3.3.0:
version "3.3.0"
resolved "http://npm.yohops.com/agentkeepalive/-/agentkeepalive-3.3.0.tgz#6d5de5829afd3be2712201a39275fd11c651857c"
... ... @@ -2639,6 +2668,11 @@ commander@^2.18.0, commander@^2.19.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=
commander@^2.9.0:
version "2.20.3"
resolved "http://npm.yohops.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=
commander@~2.14.1:
version "2.14.1"
resolved "http://npm.yohops.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
... ... @@ -3354,6 +3388,11 @@ dom-serializer@0:
domelementtype "~1.1.1"
entities "~1.1.1"
dom-walk@^0.1.0:
version "0.1.1"
resolved "http://npm.yohops.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
dom7@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/dom7/-/dom7-2.1.2.tgz#a914070c0abe8465384997a9c4f34475f67f75bd"
... ... @@ -3573,6 +3612,22 @@ es-abstract@^1.12.0:
string.prototype.trimleft "^2.0.0"
string.prototype.trimright "^2.0.0"
es-abstract@^1.13.0:
version "1.15.0"
resolved "http://npm.yohops.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57"
integrity sha1-iISSjsfkCnnjybyBLTfRDIskzFc=
dependencies:
es-to-primitive "^1.2.0"
function-bind "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.0"
is-callable "^1.1.4"
is-regex "^1.0.4"
object-inspect "^1.6.0"
object-keys "^1.1.1"
string.prototype.trimleft "^2.1.0"
string.prototype.trimright "^2.1.0"
es-abstract@^1.5.1:
version "1.12.0"
resolved "http://npm.yohops.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
... ... @@ -4196,6 +4251,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.3.0:
dependencies:
debug "=3.1.0"
for-each@^0.3.3:
version "0.3.3"
resolved "http://npm.yohops.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
integrity sha1-abRH6IoKXTLD5whPPxcQA0shN24=
dependencies:
is-callable "^1.1.3"
for-in@^0.1.3:
version "0.1.8"
resolved "http://npm.yohops.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
... ... @@ -4486,6 +4548,22 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
global@4.3.2, global@~4.3.0:
version "4.3.2"
resolved "http://npm.yohops.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
dependencies:
min-document "^2.19.0"
process "~0.5.1"
global@^4.3.0, global@^4.3.1, global@^4.3.2:
version "4.4.0"
resolved "http://npm.yohops.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
integrity sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=
dependencies:
min-document "^2.19.0"
process "^0.11.10"
globals@^10.0.0:
version "10.4.0"
resolved "http://r.cnpmjs.org/globals/download/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7"
... ... @@ -5068,6 +5146,11 @@ indexof@0.0.1:
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
individual@^2.0.0:
version "2.0.0"
resolved "http://npm.yohops.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
inflight@^1.0.4:
version "1.0.6"
resolved "http://npm.yohops.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
... ... @@ -5350,6 +5433,11 @@ is-fullwidth-code-point@^2.0.0:
resolved "http://npm.yohops.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-function@^1.0.1:
version "1.0.1"
resolved "http://npm.yohops.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
is-generator-fn@^2.0.0:
version "2.1.0"
resolved "http://r.cnpmjs.org/is-generator-fn/download/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
... ... @@ -6119,6 +6207,11 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
keycode@^2.2.0:
version "2.2.0"
resolved "http://npm.yohops.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=
keygrip@~1.0.3:
version "1.0.3"
resolved "http://npm.yohops.com/keygrip/-/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc"
... ... @@ -6502,6 +6595,13 @@ lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3:
pseudomap "^1.0.2"
yallist "^2.1.2"
m3u8-parser@4.4.0:
version "4.4.0"
resolved "http://npm.yohops.com/m3u8-parser/-/m3u8-parser-4.4.0.tgz#adf606c0af6d97f6750095a42006c2ae03dde177"
integrity sha1-rfYGwK9tl/Z1AJWkIAbCrgPd4Xc=
dependencies:
global "^4.3.2"
make-dir@^1.0.0:
version "1.2.0"
resolved "http://npm.yohops.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
... ... @@ -6770,6 +6870,13 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=
min-document@^2.19.0:
version "2.19.0"
resolved "http://npm.yohops.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
dependencies:
dom-walk "^0.1.0"
mini-css-extract-plugin@^0.5.0:
version "0.5.0"
resolved "http://npm.yohops.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
... ... @@ -6916,6 +7023,14 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mpd-parser@0.8.1:
version "0.8.1"
resolved "http://npm.yohops.com/mpd-parser/-/mpd-parser-0.8.1.tgz#db299dbec337999fbbbace989d227c7b03dc8ea7"
integrity sha1-2ymdvsM3mZ+7us6YnSJ8ewPcjqc=
dependencies:
global "^4.3.2"
url-toolkit "^2.1.1"
ms@0.7.1:
version "0.7.1"
resolved "http://npm.yohops.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
... ... @@ -6959,6 +7074,11 @@ mute-stream@0.0.7:
resolved "http://npm.yohops.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
mux.js@5.2.1:
version "5.2.1"
resolved "http://npm.yohops.com/mux.js/-/mux.js-5.2.1.tgz#6698761fc88da5acecea0758ac25f11d3a08bee8"
integrity sha1-Zph2H8iNpazs6gdYrCXxHToIvug=
mysql@^2.16.0:
version "2.16.0"
resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba"
... ... @@ -7658,6 +7778,14 @@ parse-filepath@^1.0.1:
map-cache "^0.2.0"
path-root "^0.1.1"
parse-headers@^2.0.0:
version "2.0.2"
resolved "http://npm.yohops.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
integrity sha1-lUXopMGuXq6n0kmSvKiQKB7SbjQ=
dependencies:
for-each "^0.3.3"
string.prototype.trim "^1.1.2"
parse-json@^2.2.0:
version "2.2.0"
resolved "http://npm.yohops.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
... ... @@ -7893,6 +8021,11 @@ pirates@^4.0.1:
dependencies:
node-modules-regexp "^1.0.0"
pkcs7@^1.0.2:
version "1.0.2"
resolved "http://npm.yohops.com/pkcs7/-/pkcs7-1.0.2.tgz#b6dba527528c2942bfc122ce2dafcdb5e59074e7"
integrity sha1-ttulJ1KMKUK/wSLOLa/NteWQdOc=
pkg-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
... ... @@ -8197,6 +8330,11 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
process@~0.5.1:
version "0.5.2"
resolved "http://npm.yohops.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
progress@^2.0.0:
version "2.0.3"
resolved "http://npm.yohops.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
... ... @@ -8583,6 +8721,11 @@ regenerator-runtime@^0.12.0:
resolved "http://npm.yohops.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
integrity sha1-+hpxVEdkwDb4xJsToIsllMn4oN4=
regenerator-runtime@^0.13.2:
version "0.13.3"
resolved "http://npm.yohops.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
integrity sha1-fPanfY9cb2Drc8X8GVWyzrAea/U=
regenerator-transform@^0.13.3:
version "0.13.3"
resolved "http://npm.yohops.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb"
... ... @@ -8987,6 +9130,13 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
rust-result@^1.0.0:
version "1.0.0"
resolved "http://npm.yohops.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
dependencies:
individual "^2.0.0"
rxjs@^6.1.0:
version "6.3.3"
resolved "http://npm.yohops.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
... ... @@ -9004,6 +9154,13 @@ safe-buffer@5.1.2, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
safe-json-parse@4.0.0:
version "4.0.0"
resolved "http://npm.yohops.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
dependencies:
rust-result "^1.0.0"
safe-regex@^1.1.0:
version "1.1.0"
resolved "http://npm.yohops.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
... ... @@ -9676,7 +9833,16 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string.prototype.trimleft@^2.0.0:
string.prototype.trim@^1.1.2:
version "1.2.0"
resolved "http://npm.yohops.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d"
integrity sha1-dacpsQz8G+Q5VD2uRCEpRZzmHj0=
dependencies:
define-properties "^1.1.3"
es-abstract "^1.13.0"
function-bind "^1.1.1"
string.prototype.trimleft@^2.0.0, string.prototype.trimleft@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
integrity sha1-bMR/DX641isPNwFhFxWjlUWR1jQ=
... ... @@ -9684,7 +9850,7 @@ string.prototype.trimleft@^2.0.0:
define-properties "^1.1.3"
function-bind "^1.1.1"
string.prototype.trimright@^2.0.0:
string.prototype.trimright@^2.0.0, string.prototype.trimright@^2.1.0:
version "2.1.0"
resolved "http://npm.yohops.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
integrity sha1-Zp0WS+nfm291WfqOiZRbFopabFg=
... ... @@ -10530,6 +10696,11 @@ url-parse@^1.4.3:
querystringify "^2.0.0"
requires-port "^1.0.0"
url-toolkit@^2.1.1, url-toolkit@^2.1.3:
version "2.1.6"
resolved "http://npm.yohops.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2"
integrity sha1-bQMkZJnlGarSJMRARKSuIFRBVPI=
url@^0.11.0:
version "0.11.0"
resolved "http://npm.yohops.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
... ... @@ -10684,6 +10855,32 @@ vfile@^2.0.0:
unist-util-stringify-position "^1.0.0"
vfile-message "^1.0.0"
"video.js@^6.8.0 || ^7.0.0", video.js@^7.5.5:
version "7.6.5"
resolved "http://npm.yohops.com/video.js/-/video.js-7.6.5.tgz#af66a71bc05fd79c581c1673ac5a78a6b31bc831"
integrity sha1-r2anG8Bf15xYHBZzrFp4prMbyDE=
dependencies:
"@babel/runtime" "^7.4.5"
"@videojs/http-streaming" "1.10.6"
global "4.3.2"
keycode "^2.2.0"
safe-json-parse "4.0.0"
videojs-font "3.2.0"
videojs-vtt.js "^0.14.1"
xhr "2.4.0"
videojs-font@3.2.0:
version "3.2.0"
resolved "http://npm.yohops.com/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232"
integrity sha1-ISydP05Ow/pzRRZ9ZDFq3TXpIjI=
videojs-vtt.js@^0.14.1:
version "0.14.1"
resolved "http://npm.yohops.com/videojs-vtt.js/-/videojs-vtt.js-0.14.1.tgz#da583eb1fc9c81c826a9432b706040e8dea49911"
integrity sha1-2lg+sfycgcgmqUMrcGBA6N6kmRE=
dependencies:
global "^4.3.1"
vm-browserify@0.0.4:
version "0.0.4"
resolved "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
... ... @@ -11215,6 +11412,16 @@ xdg-basedir@^3.0.0:
resolved "http://npm.yohops.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
xhr@2.4.0:
version "2.4.0"
resolved "http://npm.yohops.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
integrity sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=
dependencies:
global "~4.3.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "http://r.cnpmjs.org/xml-name-validator/download/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
... ...