Authored by 陈峰

merge master

Showing 63 changed files with 4022 additions and 354 deletions

Too many changes to show.

To preserve performance only 63 of 63+ files are displayed.

... ... @@ -120,6 +120,8 @@ nbactions.xml
# sftp configuration file
sftp-config.json
### TSD ###
typings/
### Vim ###
# swap
... ...
... ... @@ -19,10 +19,10 @@
<section class="s-feild">
<label>身份证号</label><input type="text" id="tb_cert_no" name="tb_cert_no" placeholder="请输入您身份证号码" maxlength="18">
</section>
<section class="s-feild" data-aslider-in="province|fade">
<section class="s-feild province-select" data-aslider-in="province|fade">
<label>学校省份</label><input type="text" id="s-province-tb" name="s-province-tb" readonly="readonly" placeholder="请选择省份"><span class="s-select iconfont" >&#xe604;</span>
</section>
<section class="s-feild" data-aslider-in="school|fade" aslider-isShow="false">
<section class="s-feild school-select" data-aslider-in="school|fade" aslider-isShow="false">
<label>学校名称</label><input type="text" id="s-school-tb" name="s-school-tb" readonly="readonly" placeholder="请选择您的所在学校"><span id='s-toast-school' class="s-select iconfont">&#xe604;</span>
</section>
... ...
/**
* 购物车
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/21
*/
'use strict';
const helpers = global.yoho.helpers;
const headerModel = require('../../../doraemon/models/header'); // 头部model
const indexModel = require('../models/index');
/**
* [购物车首页]
*/
const index = (req, res) => {
let isLogin = req.user && req.user.uid,
pageData = {
isLogin,
signurl: helpers.urlFormat('/signin.html', {
refer: '/cart/index/index'
})
};
res.render('index', Object.assign(pageData, {
title: '购物车',
module: 'cart',
page: 'index',
localCss: true,
width750: true,
pageHeader: headerModel.setNav({
navTitle: '购物车',
navBack: true,
suggestSub: {
text: ' '
},
navBtn: false
})
}));
};
/**
* [购物车数据]
*/
const indexData = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
channel = req.cookies._Channel,
cartType = req.cookies.cartType || 'ordinary',
uid = req.user && req.user.uid;
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.indexData(uid, shoppingKey, channel, cartType).then(data => {
data ? res.json({
code: 200,
data
}) : res.status(400).json({
message: '操作失败'
});
}).catch(next);
};
/**
* [选择或者取消商品]
*/
const select = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
uid = req.user && req.user.uid;
let skuList = req.body.skuList,
cartType = req.cookies.cartType || 'ordinary';
if (!skuList || !skuList.length) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.selectGood(uid, skuList, shoppingKey, cartType).then(data => {
data ? res.json({
code: 200,
data
}) : res.status(400).json({
message: '操作失败'
});
}).catch(next);
};
/**
* [移出购物车]
*/
const del = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
uid = req.user && req.user.uid;
let skuList = req.body.skuList,
cartType = req.cookies.cartType || 'ordinary';
if (!skuList || !skuList.length) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.removeFromCart(uid, skuList, shoppingKey, cartType).then(data => {
data ? res.json({
code: 200,
data
}) : res.status(400).json({
message: '操作失败'
});
}).catch(next);
};
/**
* [加入购物车]
*/
const add = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
uid = req.user && req.user.uid;
let productSku = req.body.productSku,
buyNumber = req.body.buyNumber || 1,
goodsType = req.body.goodsType || 0,
promotionId = req.body.promotionId || 0,
isEdit = req.body.isEdit || 0;
if (!productSku) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.addToCart(productSku, buyNumber, goodsType, isEdit, promotionId, uid, shoppingKey).then(data => {
data ? res.json(data) : res.status(400).json({
message: '操作失败'
});
}).catch(next);
};
/**
* [获取购物车数据]
*/
const goodinfo = (req, res, next) => {
if (!req.xhr) {
return next();
}
let result = {};
let uid = req.user && req.user.uid,
buyNum = req.body.buy_num,
mnum = req.body.mnum,
skn = req.body.skn,
promotionId = req.body.promotion_id;
if (!buyNum || !skn) {
return res.json({
code: 400,
message: '参数错误'
});
}
return indexModel.cartProductData(uid, skn, buyNum).then(data => {
return new Promise((resolve) => {
if (mnum && data) {
return indexModel.handleBundleInfo(skn).then(disRes => {
result.discountBuy = disRes;
resolve(data);
});
}
resolve(data);
}).then(cartInfo => {
result.cartInfo = cartInfo;
cartInfo ? res.json(Object.assign({
code: 200,
promotionId: promotionId
}, result)) : res.status(400).json({
message: '操作失败'
});
});
}).catch(next);
};
/**
* [加入收藏]
*/
const col = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid;
let skuList = req.body.skuList,
cartType = req.cookies.cartType || 'ordinary';
if (!skuList || !skuList.length) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
if (!uid) {
return res.json({
code: 401,
message: '请先登录',
data: helpers.urlFormat('/signin.html')
});
}
return indexModel.addToFav(uid, skuList, cartType).then(data => {
data ? res.json({
code: 200,
data
}) : res.status(400).json({
message: '操作失败'
});
}).catch(next);
};
/**
* [修改购物车数量]
*/
const modifyNum = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '',
sku = req.body.sku,
increaseNum = req.body.increaseNum,
decreaseNum = req.body.decreaseNum;
if (!sku || (!increaseNum && !decreaseNum)) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
let promise;
if (increaseNum > 0) {
promise = indexModel.increaseProductNum(uid, sku, increaseNum, shoppingKey);
} else if (decreaseNum > 0) {
promise = indexModel.decreaseProductNum(uid, sku, decreaseNum, shoppingKey);
}
return promise.then(data => {
if (data && data.code === 200 && data.data) {
res.json({
code: 200,
goodsCount: data.data.goods_count
});
} else {
res.json({
code: 400,
message: data.message
});
}
}).catch(next);
};
/**
* [修改购物车数据]
*/
const modify = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '';
let oldProductSku = req.body.old_product_sku || 0,
newProductSku = req.body.new_product_sku || 0,
buyNumber = req.body.buy_number || 0,
selected = req.body.selected;
if (!oldProductSku || !newProductSku) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.modifyCartProduct(uid, [{
old_product_sku: oldProductSku,
new_product_sku: newProductSku,
buy_number: buyNumber,
selected: selected
}], shoppingKey).then(data => {
data ? res.json(data) : res.status(400).json({
message: '操作失败'
});
});
};
/**
* [修改购物车赠品、加价购数据]
*/
const modifyPriceGift = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '';
let newProductSku = req.body.new_product_sku || 0,
newProductSkn = req.body.new_product_skn || 0,
promotionId = req.body.promotionId || 0;
if (!promotionId || !newProductSku) {
return res.json({
code: 400,
message: '参数错误'
});
}
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
return indexModel.modifyCartPriceGiftProduct(uid, newProductSku, newProductSkn, promotionId, shoppingKey).then(data => {
data ? res.json(data) : res.status(400).json({
message: '操作失败'
});
});
};
/**
* [获取赠品商品列表]
*/
const gift = (req, res, next) => {
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '',
channel = req.cookies._Channel,
cartType = req.cookies.cartType || 'ordinary',
promotionId = req.query.promotion_id;
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
let promise;
if (promotionId) {
promise = indexModel.getPriceGiftList(promotionId);
} else {
promise = indexModel.indexData(uid, shoppingKey, channel, cartType, true);
}
return promise.then(data => {
res.render('gift', Object.assign(data, {
title: '赠品',
module: 'cart',
page: 'gift',
localCss: true,
pageHeader: headerModel.setNav({
navTitle: '赠品',
navBack: true,
suggestSub: {
text: ' '
},
navBtn: false
})
}, {
giftPage: true,
cartType: cartType
}));
}).catch(next);
};
/**
* [获取加价购商品列表]
*/
const advanceBuy = (req, res, next) => {
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '',
channel = req.cookies._Channel,
cartType = req.cookies.cartType || 'ordinary',
promotionId = req.query.promotion_id;
// shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
// uid = 20422448;
let promise;
if (promotionId) {
promise = indexModel.getPriceGiftList(promotionId);
} else {
promise = indexModel.indexData(uid, shoppingKey, channel, cartType, false, true);
}
return promise.then(data => {
res.render('gift', Object.assign(data, {
title: '加价购',
module: 'cart',
page: 'gift',
localCss: true,
pageHeader: headerModel.setNav({
navTitle: '加价购',
navBack: true,
suggestSub: {
text: ' '
},
navBtn: false
})
}, {
advanceBuyPage: true,
cartType: cartType
}));
}).catch(next);
};
/**
* [获取购物车加价购商品数据]
*/
const giftinfo = (req, res, next) => {
if (!req.xhr) {
return next();
}
let skn = req.body.skn,
promotionId = req.body.promotionId;
if (!skn) {
return res.json({
code: 400,
message: '参数错误'
});
}
return indexModel.giftProductData(skn, promotionId).then(data => {
data ? res.json({
promotionId: promotionId,
cartInfo: data
}) : res.status(400).json({
message: '操作失败'
});
});
};
module.exports = {
index,
indexData,
select,
del,
goodinfo,
col,
modifyNum,
add,
modify,
gift,
giftinfo,
advanceBuy,
modifyPriceGift
};
... ...
'use strict';
const _ = require('lodash');
const helpers = global.yoho.helpers;
const co = require('bluebird').coroutine;
const cartModel = require('../models/cart');
const headerModel = require('../../../doraemon/models/header');
const userModel = require('../../serverAPI/user');
const addressModel = require('../../serverAPI/user/address');
const orderModel = require('../models/order');
exports.orderEnsure = (req, res, next) => {
let headerData = headerModel.setNav({
navTitle: '确认订单',
navBtn: false
});
let uid = req.user.uid;
let returnUrl = helpers.urlFormat('/cart/index/new');
let cartType = req.query.cartType || 'ordinary';
let orderInfo;
try {
orderInfo = JSON.parse(req.cookies['order-info']);
} catch (e) {
orderInfo = {};
}
let cookieCartType = _.get(orderInfo, 'cartType');
if (cookieCartType) {
cartType = cookieCartType;
}
// 如果传递了code, skn, sku, buy_number 就代表限购商品
let limitProductCode = req.query.limitproductcode || '';
let sku = req.query.sku || '';
let skn = req.query.skn || '';
let buyNumber = req.query.buy_number || 1;
if (limitProductCode) {
headerData.backUrl = req.get('Referer') || returnUrl;
}
let order = cartModel.cartPay(uid, cartType, orderInfo, sku, skn, buyNumber, req.xhr);
let userProfile = userModel.queryProfile(uid);
let address = addressModel.addressData(uid);
return Promise.all([order, userProfile, address]).then(result => {
order = result[0];
userProfile = result[1];
address = result[2];
if (order.cartUrl) { // TODO? 普通或者预售商品为空时, BUT WHEN AJAX?
return res.redirect(order.cartUrl);
}
if (req.xhr) {
return res.json(order);
}
// 获取用户完整手机号
let mobile = _.get(userProfile, 'data.mobile', '');
let orderAddress = _.get(order, 'address', []);
let addressList = _.get(address, 'data', []);
orderAddress.length && addressList.forEach(address => { //eslint-disable-line
if (address.address_id === orderAddress.address_id) {
mobile = address.mobile;
}
});
let viewData = {
orderEnsurePage: true,
isOrdinaryCart: cartType !== 'advance',
orderEnsure: order,
userMobile: mobile
};
viewData.pageHeader = headerData;
viewData.pageFooter = true;
viewData.module = 'cart';
viewData.page = 'order-ensure';
viewData.width750 = true;
viewData.title = '确认订单';
res.render('order-ensure', viewData);
}).catch(next);
};
/**
* 下单流程 选择优惠券
*/
exports.selectCoupon = (req, res) => {
let headerData = headerModel.setNav({
navTitle: '选择优惠券',
backUrl: helpers.urlFormat('/cart/new/orderEnsure'),
navBtn: false
});
res.render('select-coupon', {
module: 'cart',
page: 'select-coupon',
title: '选择优惠券',
selectCouponPage: true,
pageHeader: headerData,
pageFooter: true
});
};
/**
* 购物车结算--获取优惠券列表
*/
exports.couponList = (req, res, next) => {
let uid = req.user.uid;
if (req.xhr) {
return cartModel.getCouponList(uid)
.then(data => {
res.json(data);
});
} else {
return next();
}
};
/**
* 购物车输入优惠券码使用优惠券
*/
exports.couponSearch = (req, res, next) => {
let couponCode = req.body.couponCode || '';
let uid = req.user.uid;
co(function* () {
if (req.xhr) {
let result = yield cartModel.searchCoupon(uid, couponCode);
res.json(result);
} else {
return next();
}
})();
};
/**
* 选择地址
*/
exports.selectAddress = (req, res, next) => {
let uid = req.user.uid;
return addressModel.addressData(uid).then(address => {
let moreUrl = req.get('Referer') || '/cart/index/new/orderEnsure'; // 取跳过来的url
address = address.data;
// 购物车订单进来,秒杀进来
if (
moreUrl.indexOf('/cart/index/new/orderEnsure') !== -1 ||
moreUrl.indexOf('/cart/index/seckill') !== -1
) {
req.session.addressMore = moreUrl; // TODO: 注意cookie-session
}
moreUrl = req.session.addressMore;
let headerData = headerModel.setNav({
navTitle: '选择地址',
navBtn: false,
backUrl: moreUrl
});
res.render('select-address', {
module: 'cart',
page: 'select-address',
pageHeader: headerData,
pageFooter: true,
moreUrl,
address
});
}).catch(next);
};
/**
* 发票信息
*/
exports.invoiceInfo = (req, res) => {
let uid = req.user.uid;
let cookieData = req.cookies['order-info'];
let orderInfo = JSON.parse(cookieData);
co(function* () {
let userData = yield userModel.queryProfile(uid);
let mobile = _.get(userData, 'data.mobile', '');
let addresslist = yield userModel.addressTextData(uid);
let returnData = orderModel.processInvoiceData(orderInfo, mobile, addresslist);
let headerData = headerModel.setNav({
navTitle: '发票信息',
navBtn: false
});
res.render('select-invoice', _.assign(returnData, {
pageHeader: headerData,
module: 'cart',
page: 'select-invoice'
}));
})();
};
... ...
/**
* 支付成功页
* @author: jing.li<jing.li@yoho.cn>
* @date: 2016/10/25
/*
* 支付
* @Author: Targaryen
* @Date: 2017-01-04 15:17:51
* @Last Modified by: Targaryen
* @Last Modified time: 2017-01-17 16:02:22
*/
'use strict';
const mRoot = '../models';
const payModel = require(`${mRoot}/pay`);
const payTool = payModel.payTool;
const headerModel = require('../../../doraemon/models/header'); // 头部model
const co = require('bluebird').coroutine;
const helpers = global.yoho.helpers;
const Payment = require('../helpers/payment');
const WxPay = require('../helpers/pay/wechat');
const common = require('../helpers/pay/common');
/**
* 支付中心
* @param req
* @param res
* @param next
*/
const payCenter = (req, res) => {
let orderCode = req.query.order_code;
let uid = req.user.uid;
let sessionKey = req.session.TOKEN;
let userAgent = req.get('User-Agent');
let hasWxShare = Boolean(userAgent.match(/MicroMessenger/i) && userAgent.match(/MicroMessenger/i).length > 0);
if (!orderCode || !uid) {
res.redirect('/');
}
if (sessionKey) {
sessionKey = sessionKey.substr(0, sessionKey.length - 8);
}
co(function* () {
let orderDetail = yield payModel.payCenter({
orderCode: orderCode,
uid: uid
});
if (hasWxShare) {
let openId = req.cookies['weixinOpenId' + orderCode];
if (!openId) {
let getOpenidResult = yield WxPay.getOpenid(req.query.code, req.originalUrl);
if (getOpenidResult.openid) {
openId = getOpenidResult.openid;
}
if (getOpenidResult.redirectUrl) {
return res.redirect(getOpenidResult.redirectUrl);
}
if (openId) {
res.cookie('weixinOpenId' + orderCode, openId, {
domain: 'yohobuy.com',
expires: new Date(Date.now() + 24 * 60 * 60 * 1000)
});
}
}
}
let responseData = {
pageHeader: headerModel.setNav({
navTitle: '支付中心'
}),
module: 'cart',
page: 'pay',
title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停',
payAppInfo: payTool.payAppInfo(orderCode),
orderCode: orderCode,
hasWxShare: hasWxShare,
orderTotal: orderDetail.payment_amount || 0,
orderTotalFormat: parseInt(orderDetail.payment_amount, 10),
orderCount: payTool.calBuyNumCount(orderDetail.order_goods),
uid: uid,
isOldUser: Boolean(req.cookies._isOldUser && req.cookies._isOldUser === '4')
};
res.render('pay/pay-center', responseData);
})();
};
/**
* 统一支付入口
* @param req
* @param res
*/
const pay = (req, res, next) => {
let orderCode = req.query.order_code;
let user = req.user;
let uid = req.user.uid;
let sessionKey = req.session.TOKEN;
let payment = req.query.payment;
let paymentCode = common.getPaymentCode(payment);
let openId = req.cookies['weixinOpenId' + orderCode];
if (!orderCode || !uid || !sessionKey) {
return res.redirect('/');
}
co(function* () {
let orderDetail = yield payModel.getOtherDetail({
uid: uid,
orderCode: orderCode,
sessionKey: sessionKey
});
if (!orderDetail || !orderDetail.data) {
return res.json({
code: 400,
msg: '没有找到该订单!'
});
}
if (orderDetail.data.is_cancel === 'Y') {
let url = helpers.urlFormat('/home/orders/detail', { order_code: orderCode });
return res.json({
code: 400,
msg: '订单已经取消'
}).redirect(url);
}
Payment.pay(user, orderDetail.data, payment, {
protocol: req.protocol,
openId: openId
}).then(result => {
if (result && paymentCode === payModel.payments.wechat) {
return res.json(result);
}
if (result && result.data && result.data.href && paymentCode === payModel.payments.alipay) {
return res.redirect(result.data.href);
} else {
return res.redirect('/');
}
}).catch(next);
})();
};
// 货到付款
const payCod = (req, res, next) => {
... ... @@ -23,12 +159,16 @@ const payCod = (req, res, next) => {
title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停'
};
let sessionKey = req.session.TOKEN;
let param = {
uid: req.user.uid,
udid: req.sessionID || require('md5')(req.ip) || 'yoho',
orderCode: req.query.order_code,
contentCode: '78d0fb6c97d691863286edcb4d8abfa9',
client_id: req.cookies._yasvd || ''
client_id: req.cookies._yasvd || '',
sessionKey: sessionKey && sessionKey.substr(0, sessionKey.length - 8) || ''
};
// 如果没有uid,跳转到首页
... ... @@ -47,7 +187,7 @@ const payCod = (req, res, next) => {
}).catch(next);
};
// 支付宝支付
// 支付宝支付结果页
const payAli = (req, res, next) => {
let headerData = headerModel.setNav({
navTitle: '支付完成'
... ... @@ -136,6 +276,8 @@ const payZero = (req, res, next) => {
};
module.exports = {
payCenter,
pay,
payCod,
payAli,
payZero
... ...
/**
* TAR NOTE: 从 YOHO-BLK 项目复制,未针对本项目做适配
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/22
*/
'use strict';
const config = global.yoho.config;
const helpers = global.yoho.helpers;
const common = require('./common');
const sign = require('./sign');
const payHelpersBank = require('./bank');
const md5 = require('md5');
const logger = global.yoho.logger;
const ALIPAY_URL = 'https://mapi.alipay.com/gateway.do';
const Alibank = {
pay(user, order, param, protocol) {
let payParams = JSON.parse(param.payParams);
let extraParam = JSON.stringify({
sign_id_ext: user.uid,
defaultbank: param.bankCode || ''
});
let params = {
service: 'create_direct_pay_by_user',
partner: payParams.merchant_id,
_input_charset: 'utf-8',
notify_url: config.pay.serviceNotify + 'payment/alipay_notify',
return_url: protocol + ':' + helpers.urlFormat('/shopping/pay/callback/alibank'),
subject: 'BLK订单号:' + order.order_code,
out_trade_no: order.order_code,
it_b_pay: common.getPayExpireMin(order.pay_expire) + 'm',
total_fee: order.payment_amount,
payment_type: '1',
defaultbank: param.bankCode,
seller_email: payParams.merchant_other_code,
extra_common_param: extraParam
};
// TODO 防钓鱼配置,参考php
let signStr = md5(sign.raw(params) + payParams.merchant_key);
let body = sign.rawUncode(params) + '&sign=' + signStr + '&sign_type=MD5';
return {
code: 200,
data: {
href: ALIPAY_URL + '?' + body
}
};
},
notify(data, param) {
let payParams = param.payParams && JSON.parse(param.payParams) || {};
let orderCode = parseInt(data.out_trade_no, 10);
let extraParam = data.extra_common_param && JSON.parse(data.extra_common_param) || {};
let bankName = payHelpersBank.getList()[extraParam.defaultbank] &&
payHelpersBank.getList()[extraParam.defaultbank].name || '';
logger.info(`Alibank notify, params = ${JSON.stringify(data)}`);
if (!this.checkNotify(data, payParams)) {
return {payResult: -1, bankName: bankName};
} else {
return {
bankName: bankName,
orderCode: orderCode,
payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
payTime: data.gmt_payment || '',
totalFee: data.total_fee,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.trade_no,
bankBillNo: data.bank_seq_no || ''
};
}
},
checkNotify(data, payParams) {
let signValue = data.sign;
if (!payParams || !data) {
return false;
}
delete data.sign;
delete data.sign_type;
delete data.code;
let signStr = md5(sign.raw(data) + payParams.merchant_key);
return signValue === signStr;
}
};
module.exports = Alibank;
... ...
/**
*
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/22
*/
'use strict';
const config = global.yoho.config;
const helpers = global.yoho.helpers;
const sign = require('./sign');
const md5 = require('md5');
const logger = global.yoho.logger;
const AlipayConfig = config.alipayConfig;
const Alipay = {
pay(user, order, param, protocol) {
let params = {
service: AlipayConfig.service,
partner: AlipayConfig.partner,
_input_charset: AlipayConfig.inputCharset,
notify_url: config.domains.service + 'payment/alipay_notify',
return_url: protocol + ':' + helpers.urlFormat(AlipayConfig.returnUrl),
subject: '有货订单号:' + order.order_code,
out_trade_no: order.order_code,
it_b_pay: order.pay_expire,
total_fee: parseFloat(order.payment_amount),
seller_id: AlipayConfig.partner,
payment_type: '1',
show_url: protocol + ':' + helpers.urlFormat('/home/orderdetail', { order_code: order.order_code })
};
// TODO 防钓鱼配置,参考php
let signStr = md5(sign.raw(params) + AlipayConfig.alipayKey);
let body = sign.rawUncode(params) + '&sign=' + signStr + '&sign_type=MD5';
return {
code: 200,
data: {
href: AlipayConfig.payUrl + '?' + body
}
};
},
notify(data, param) {
let payParams = JSON.parse(param.payParams);
logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);
if (!this.checkNotify(data, payParams)) {
return { payResult: -1 };
} else {
let orderCode = parseInt(data.out_trade_no, 10);
return {
bankName: '',
orderCode: orderCode,
payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
payTime: data.gmt_payment || '',
totalFee: data.total_fee,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.trade_no,
bankBillNo: ''
};
}
},
checkNotify(data, payParams) {
let signValue = data.sign;
delete data.sign;
delete data.sign_type;
delete data.code;
let signStr = md5(sign.raw(data) + payParams.merchant_key);
return signValue === signStr;
}
};
module.exports = Alipay;
... ...
/**
* Created by TaoHuang on 2016/7/18.
*/
'use strict';
const Bank = {
getList() {
return {
BOCB2C: {
name: '中国银行',
ico: '//static.yohobuy.com/images/pay/icon/zhongguo.png'
},
ABC: {
name: '中国农业银行',
ico: '//static.yohobuy.com/images/pay/icon/nongye.png'
},
SPABANK: {
name: '平安银行',
ico: '//static.yohobuy.com/images/pay/icon/pingan.png'
},
CMBC: {
name: '中国民生银行',
ico: '//static.yohobuy.com/images/pay/icon/minsheng.png'
},
ICBCB2C: {
name: '中国工商银行',
ico: '//static.yohobuy.com/images/pay/icon/gongshang.png'
},
SPDB: {
name: '浦发银行',
ico: '//static.yohobuy.com/images/pay/icon/pufa.png'
},
BJRCB: {
name: '北京农商银行',
ico: '//static.yohobuy.com/images/pay/icon/beijingnongshang.png'
},
HZCBB2C: {
name: '杭州银行',
ico: '//static.yohobuy.com/images/pay/icon/hangzhou.png'
},
CMB: {
name: '招商银行',
ico: '//static.yohobuy.com/images/pay/icon/zhaoshang.png'
},
CIB: {
name: '兴业银行',
ico: '//static.yohobuy.com/images/pay/icon/xingye.png'
},
FDB: {
name: '富滇银行',
ico: '//static.yohobuy.com/images/pay/icon/fudian.png'
},
CEBDEBIT: {
name: '中国光大银行',
ico: '//static.yohobuy.com/images/pay/icon/guangda.png'
},
CCB: {
name: '中国建设银行',
ico: '//static.yohobuy.com/images/pay/icon/zhongguojianshe.png'
},
GDB: {
name: '广发银行',
ico: '//static.yohobuy.com/images/pay/icon/guangfa.png'
},
POSTGC: {
name: '中国邮政储蓄',
ico: '//static.yohobuy.com/images/pay/icon/zhongguoyouzhengchuxu.png'
},
SHBANK: {
name: '上海银行',
ico: '//static.yohobuy.com/images/pay/icon/shanghai.png'
},
NBBANK: {
name: '宁波银行',
ico: '//static.yohobuy.com/images/pay/icon/ningbo.png'
}
};
}
};
module.exports = Bank;
... ...
/**
*
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/22
*/
'use strict';
const moment = require('moment');
const xml2js = require('xml2js');
const common = {
getPayExpireMin(expire) {
let defaultValue = 120;
if (expire) {
let expireTime = moment(expire, 'YYYY-MM-DD HH:mm:ss');
let diff = expireTime.diff(moment());
return Math.floor(diff / 1000 / 60);
// if (diff > 0) {
// return Math.floor(diff / 1000 / 60);
// } else {
// return 0;
// }
} else {
return defaultValue;
}
},
getPayExpireCouple(expire) {
let start = expire ? moment(expire, 'YYYY-MM-DD HH:mm:ss') : moment();
let end = expire ? moment(expire, 'YYYY-MM-DD HH:mm:ss') : moment();
return {
start: start.subtract(2, 'hours'),
end: end.add(5, 'minutes')
};
},
nonceStr(length) {
length = length || 32;
let chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
let str = '';
for (let i = 0; i < length; i++) {
str += chars[parseInt(Math.random() * length, 10)];
}
return str;
},
toXml(obj, root) {
let xmlBuilder = new xml2js.Builder({
rootName: root || 'xml'
});
return xmlBuilder.buildObject(obj);
},
xml2Obj(xml) {
let xmlParser = new xml2js.Parser({
trim: true,
explicitArray: false
});
return new Promise((resolve, reject) => {
xmlParser.parseString(xml, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
},
getPaymentCode(payment) {
let paymentPars = payment.split('_');
if (paymentPars.length !== 2) {
return false;
} else {
return paymentPars[0] * 1;
}
}
};
module.exports = common;
... ...
/**
*
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/22
*/
'use strict';
const Sign = {
raw(args) {
let keys = Object.keys(args);
keys = keys.filter(k => {
return args[k] === '' || args[k] === 'undefined' ? false : true;
}).sort();
return keys.map(k => {
return k + '=' + decodeURI(args[k]);
}).join('&');
},
rawUncode(args) {
let keys = Object.keys(args);
keys = keys.filter(k => {
return args[k] === '' || args[k] === 'undefined' ? false : true;
}).sort();
return keys.map(k => {
return k.toLowerCase() + '=' + args[k];
}).join('&');
}
};
module.exports = Sign;
... ...
/*
* @Author: Targaryen
* @Date: 2017-01-03 17:42:41
* @Last Modified by: Targaryen
* @Last Modified time: 2017-01-09 17:53:16
*/
'use strict';
const config = global.yoho.config;
const WxPayConfig = config.WxPayConfig;
const _ = require('lodash');
const logger = global.yoho.logger;
const rp = require('request-promise');
const Promise = require('bluebird');
const co = Promise.coroutine;
const sign = require('./sign');
const md5 = require('md5');
const common = require('./common');
/**
* 微信支付相关工具类
*/
const tools = {
/**
* 拼接签名字符串
*/
toUrlParams(urlObj) {
let buff = '';
_.forEach(urlObj, (value, key) => {
if (key !== 'sign') {
buff += key + '=' + value + '&';
}
});
buff = _.trimEnd(buff, '&');
return buff;
},
/**
* 构造获取code的url连接
*/
createOauthUrlForCode(redirectUrl) {
let urlObj = {
appid: WxPayConfig.appId,
redirect_uri: redirectUrl,
response_type: 'code',
scope: 'snsapi_base',
state: 'STATE#wechat_redirect',
};
let bizString = tools.toUrlParams(urlObj);
return 'https://open.weixin.qq.com/connect/oauth2/authorize?' + bizString;
},
/**
* 构造获取open和access_toke的url地址
*/
createOauthUrlForOpenid(code) {
let urlObj = {
appid: WxPayConfig.appId,
secret: WxPayConfig.appSecret,
code: code,
grant_type: 'authorization_code'
};
let bizString = tools.toUrlParams(urlObj);
return 'https://api.weixin.qq.com/sns/oauth2/access_token?' + bizString;
},
/**
* 通过code从工作平台获取openid机器access_token
*/
getOpenidFromMp(code) {
let uri = tools.createOauthUrlForOpenid(code);
let rpOption = {
method: 'POST',
uri: uri,
body: {
some: 'payload'
},
json: true
};
return rp(rpOption).then(resultFromWx => {
return resultFromWx && resultFromWx.openid;
}).catch(err => {
logger.error(err);
});
},
/**
* 微信统一下单接口
*/
unifiedOrder(params) {
let unifiedParams = {
appid: WxPayConfig.appId,
mch_id: WxPayConfig.mchId,
notify_url: WxPayConfig.notifyUrl,
device_info: 'WEB',
nonce_str: common.nonceStr(),
body: '有货订单号:' + params.orderCode,
out_trade_no: 'YOHOBuy_' + params.orderCode,
total_fee: params.totalFee * 100,
trade_type: 'JSAPI',
openid: params.openId,
sign_type: 'MD5'
};
let signStr = md5(sign.raw(unifiedParams) + '&key=' + WxPayConfig.key).toUpperCase();
_.assign(unifiedParams, { sign: signStr });
let xml = common.toXml(unifiedParams);
let xmlParams = {
method: 'POST',
uri: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: xml,
timeout: 1000
};
return co(function* () {
let xmlResult = yield rp(xmlParams);
let jsonResult = yield common.xml2Obj(xmlResult);
return jsonResult && jsonResult.xml;
})();
}
};
// TODO 微信支付
const Wechat = {
/**
* 支付中心微信支付相关处理
*/
getOpenid(code, originalUrl) {
if (!code) {
let baseUrl = 'http://m.yohobuy.com' + originalUrl;
let redirectUrl = tools.createOauthUrlForCode(baseUrl);
return Promise.resolve({ redirectUrl: redirectUrl });
} else {
return tools.getOpenidFromMp(code).then(openid => {
return { openid: openid };
});
}
},
/**
* 异步拉起微信支付相关处理
*/
pay(user, order, openId) {
return co(function* () {
let unifiedOrderResult = yield tools.unifiedOrder({
orderCode: order.order_code,
totalFee: parseFloat(order.payment_amount),
openId: openId
});
if (unifiedOrderResult) {
let nonceStr = common.nonceStr();
let resParams = {
appId: unifiedOrderResult.appid,
timeStamp: parseInt(Date.parse(new Date()) / 1000, 10),
nonceStr: nonceStr,
package: 'prepay_id=' + unifiedOrderResult.prepay_id,
signType: 'MD5',
};
let paySign = md5(sign.raw(resParams) + '&key=' + WxPayConfig.key).toUpperCase();
_.assign(resParams, { paySign: paySign });
return {
code: 200,
data: {
jsApiParameters: resParams
}
};
} else {
return {};
}
})();
}
};
module.exports = Wechat;
... ...
/**
* 各种支付的入口
* TAR NOTE: 本项目中仅支持支付宝支付,微信支付,其他支付方式需调试
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/22
*/
'use strict';
const PayModel = require('../models/pay');
const Alipay = require('./pay/alipay');
const Alibank = require('./pay/alibank');
const Wechat = require('./pay/wechat');
const Promise = require('bluebird');
const co = Promise.coroutine;
const logger = global.yoho.logger;
const common = require('./pay/common');
const Payment = {
/**
* 统一支付入口
* reqParams: 需要从 controller 传递的参数,支付宝需要 req.protocol,微信需要 openId
*/
pay(user, order, payType, reqParams) {
return co(function*() {
let result = {
code: 400,
message: '获取支付方式信息失败'
};
let payInfo;
let bankCode = '';
if (!order.order_code) {
result.message = '没有找到该订单';
return result;
}
if (order.is_cancel && order.is_cancel === 'Y') {
result.message = '该订单已经取消';
return result;
}
// if (order.pay_expire && common.getPayExpireMin(order.pay_expire) <= 0) {
// result.message = '当前订单不可支付'; // 该订单已超过2个小时
// return result;
// }
let method = common.getPaymentCode(payType);
if (!method) {
return result;
}
if (method === PayModel.payments.wechat) {
result = yield Wechat.pay(user, order, reqParams.openId);
} else {
payInfo = yield PayModel.getPaymentInfo(method);
if (!payInfo.payParams) {
return result;
}
switch (payInfo.id) {
case PayModel.payments.alipay:
result = Alipay.pay(user, order, payInfo, reqParams.protocol);
break;
default:
break;
}
}
logger.info(`pay to url, params = ${JSON.stringify(result)}`);
if (result.code === 200) {
let updateInfo = yield Payment.beforePay(user, order, method, bankCode);
if (updateInfo && updateInfo.code !== 200) {
return updateInfo;
}
}
return result;
})();
},
beforePay(user, order, method, bankCode) {
return Promise.all([
PayModel.updateOrderPayment(order.order_code, method, user.uid),
PayModel.getBankByOrder(order.order_code)
]).then(result => {
let paymentRecord = result[0];
let bankRecord = result[1];
if (!paymentRecord || paymentRecord.code !== 200) {
let message = paymentRecord && paymentRecord.message ? paymentRecord.message : '系统繁忙,请稍后再试';
return { code: 400, message: message };
}
if (bankRecord && bankRecord.bankCode) {
return PayModel.updateOrderPayBank(order.order_code, method, bankCode);
} else {
return PayModel.setOrderPayBank(order.order_code, method, bankCode);
}
}).catch(e => {
logger.error('update order pay info error.', e);
return Promise.resolve({
code: 400,
message: '更新订单支付信息失败'
});
});
},
afterPay(query, payId, user, sessionKey) {
return co(function*() {
let payInfo = yield PayModel.getPaymentInfo(payId);
let payResult = {};
let payData = {};
let payName = '';
if (payId === PayModel.payments.alipay) {
payResult = Alipay.notify(query, payInfo);
} else if (payId === PayModel.payments.alibank) {
payResult = Alibank.notify(query, payInfo);
}
payResult.bankName = payName = payResult.bankName || payInfo.payName || '';
payResult.bankCode = payResult.bankCode || payInfo.pay_code || '';
// 记录日志
logger.info(`\r\n\r\n pay back confirmreq = ${JSON.stringify({
query: query,
payId: payId,
user: user,
payResult: payResult
})}`);
if (payResult && payResult.payResult === 200) {
if (payResult.orderCode) {
logger.info('pay back confirm');
yield PayModel.sendPayConfirm(payResult.orderCode, payId, user.uid);
}
payData = yield PayModel.procOrderData(payResult, user.uid, sessionKey);
} else {
payData = {
code: 500,
message: '支付失败'
};
}
payData.payName = payName;
return payData;
})();
}
};
module.exports = Payment;
... ...
/**
<<<<<<< HEAD
* sub app cart
* @author: xuan.chen@yoho.cn<xuan.chen@yoho.cn>
* @date: 2016/09/26
=======
* sub app guang
* @author: Bi Kai<kai.bi@yoho.cn>
* @date: 2016/05/09
>>>>>>> feature/payment
*/
var express = require('express'),
... ...
'use strict';
const _ = require('lodash');
const helpers = global.yoho.helpers;
const paymentProcess = require(global.utils + '/payment-process');
const shoppingAPI = require('../../serverAPI/order/shopping');
/**
* 调用购物车结算接口返回的数据处理
*
*
*
* @param int $uid 用户ID
* @param string $cartType 购物车类型,ordinary表示普通购物车
* @param array $orderInfo cookie中记录的一些订单有关数据
* @param string $limitProductCode 限购商品码,用户限购商品购买
* @param string $sku 商品sku,用于限购商品购买
* @param stirng $skn 商品skn,用于限购商品购买
* @param int $buyNumber 购买商品数目,用户限购商品支付
* @param bool $isAjax 是否是异步请求
* @return array 接口返回的数据
*/
exports.cartPay = (uid, cartType, orderInfo, limitProductCode, sku, skn, buyNumber, isAjax) => {
isAjax = isAjax || false;
let result = {};
let skuList = [];
let isLimitGoods = skn && sku && buyNumber; // 存在sku, skn 和buyNumber时为限购商品
let orderComputeAPI = null;
if (isLimitGoods) {
skuList.push({
type: 'limitcode',
limitproductcode: limitProductCode,
buy_number: buyNumber,
skn,
sku
});
result.isLimit = true;
}
// cookie保存的数据
if (!_.isEmpty(orderInfo)) {
orderInfo.paymentType = orderInfo.paymentType ? orderInfo.paymentType : '';
orderComputeAPI = shoppingAPI.orderComputeAPI(
uid,
cartType,
orderInfo.deliveryId,
orderInfo.paymentType,
orderInfo.couponCode,
orderInfo.yohoCoin, skuList
);
}
return Promise.all([
shoppingAPI.cartPayAPI(uid, cartType, 0, skuList), // 0. 订单数据
orderComputeAPI,
shoppingAPI.getValidCouponCount(uid) // 2. 有效优惠券
]).then(res => {
let pay = res[0];
let orderCompute = _.get(res[1], 'data', {});
let validCouponCount = _.get(res[2], 'data.count', 0);
let goodsList = _.get(pay, 'data.goods_list', []);
if (_.isEmpty(goodsList)) {
if (isLimitGoods) {
result.error = true;
result.message = pay.message;
} else {
result.cartUrl = helpers.urlFormat('/cart/index/new');
}
return pay;
}
result = Object.assign(
result,
paymentProcess.tranformPayment(pay.data, orderInfo, cartType, skuList, orderCompute),
{
coupon: paymentProcess.coupon(validCouponCount, orderInfo, orderCompute)
}
);
return result;
});
};
/**
* 处理优惠券列表数据
*
* @param int $uid 用户ID
* @return array|mixed 处理之后的优惠券数据
*/
exports.getCouponList = uid => {
let result = {
notAvailableCoupons: [],
coupons: []
};
return shoppingAPI.listCoupon(uid)
.then(coupons => {
let unusableCoupons = _.get(coupons, 'data.unusable_coupons', []);
let usableCoupons = _.get(coupons, 'data.usable_coupons', []);
let procCouponsData = coupon => {
return {
couponCode: coupon.coupon_code,
couponDetailInfomation: coupon.coupon_name,
couponValue: coupon.coupon_value,
couponValidity: coupon.coupon_validity
};
};
result.notAvailableCoupons = unusableCoupons.map(procCouponsData);
result.coupons = usableCoupons.map(procCouponsData);
return result;
},
() => result
);
};
exports.searchCoupon = (uid, couponCode) => {
let result = {code: 400, message: '出错啦~'};
if (!couponCode) {
return Promise.resolve({
code: 401,
message: '优惠券代码为空'
});
}
return shoppingAPI.useCoupon(uid, couponCode)
.catch(() => result);
};
... ...
/**
* 购物车
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/21
*/
'use strict';
const api = global.yoho.API;
const cartProcess = require(global.utils + '/cart-process');
/**
* 获取购物车信息
*
* @param integer $uid 用户ID
* @param string $shoppingKey 未登录用户唯一识别码
* @param string $cartType 购物车类型,默认是是所有购物车,ordinary为普通购物车,advance为预售购物车
* @param bool $onlyGift 只获取赠品的商品数据
* @param bool $onlyAdvanceBuy 只获取加价购的商品数据
* @return array|mixed 处理之后的购物车数据
*/
const indexData = (uid, shoppingKey, saleChannel, cartType, onlyGift, onlyAdvanceBuy) => {
return api.get('', {
method: 'app.Shopping.queryCart',
uid: uid,
shopping_key: shoppingKey,
sale_channel: saleChannel
}).then((data) => {
return data.code === 200 ? cartProcess.processData(data, cartType, onlyGift, onlyAdvanceBuy) : undefined;
});
};
/**
* 购物车商品选择与取消接口
*
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 购物车接口返回的数据
*/
const selectGood = (uid, sku, shoppingKey, cartType) => {
return api.get('', {
method: 'app.Shopping.selectedAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return data.code === 200 ? cartProcess.processData(data, cartType) : undefined;
});
};
/**
* 移出购物车
*
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const removeFromCart = (uid, sku, shoppingKey, cartType) => {
return api.get('', {
method: 'app.Shopping.removeAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return data.code === 200 ? cartProcess.processData(data, cartType) : undefined;
});
};
/**
* 获取购物车商品数据
*
* @param int $uid 用户ID
* @param int $skn 商品skn
* @param int $num 购物车商品数量
* @return array 接口返回的数据
*/
const cartProductData = (uid, skn, num) => {
return api.get('', {
method: 'app.product.data',
product_skn: skn,
uid: uid,
showcomment: 'N'
}).then((data) => {
return data.code === 200 ? cartProcess.procGoodsDetail(data.data, num) : undefined;
});
};
/**
* 修改购物车商品数量-增加
*
* @param int $uid 用户ID
* @param string $sku 商品SKU
* @param int $increaseNum 增加的数目
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const increaseProductNum = (uid, sku, increaseNum, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.increase',
product_sku: sku,
increase_number: increaseNum,
uid: uid,
shopping_key: shoppingKey
});
};
/**
* 修改购物车商品数量-减少
*
* @param int $uid 用户ID
* @param string $sku 商品SKU
* @param int $decreaseNum 减少的数目
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const decreaseProductNum = (uid, sku, decreaseNum, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.decrease',
product_sku: sku,
decrease_number: decreaseNum,
uid: uid,
shopping_key: shoppingKey
});
};
/**
* 修改购物车商品数据
*
* @param int $uid 用户ID
* @param string $param 要更改的数据
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const modifyCartProduct = (uid, swapData, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.swap',
swap_data: JSON.stringify(swapData),
uid: uid,
shopping_key: shoppingKey
});
};
/**
* 修改购物车赠品、加价购数据
*
* @param int $uid 用户ID
* @param string $param 要更改的数据
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const modifyCartPriceGiftProduct = (uid, newProductSku, newProductSkn, promotionId, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.swapGift',
promotion_id: promotionId,
new_product_sku: newProductSku,
new_product_skn: newProductSkn,
uid: uid,
shopping_key: shoppingKey
});
};
/**
* 移入收藏夹
*
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @return array 接口返回的数据
*/
const addToFav = (uid, sku, shoppingKey, cartType) => {
return api.get('', {
method: 'app.Shopping.addfavoriteAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return data.code === 200 ? cartProcess.processData(data, cartType) : undefined;
});
};
/**
* 加入购物车
*
* @param int $productSku 商品SKU
* @param int $buyNumber 购买数量
* @param int $goodsType 商品类型,0表示普通商品,1表示加价购商品
* @param int $isEdit 是否是编辑商品SKU,0表示不是编辑
* @param null|int $promotionId 促销id,默认null(加价购有关)
* @param null|int $uid 用户UID,可以不传
* @param string $shoppingKey 未登录用户唯一识别码,可以不传
* @return array 加入购物车接口返回的数据
*/
const addToCart = (productSku, buyNumber, goodsType, isEdit, promotionId, uid, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.add',
product_sku: productSku,
buy_number: buyNumber,
goods_type: goodsType,
edit_product_sku: isEdit,
selected: 'Y',
promotion_id: promotionId,
uid: uid,
shopping_key: shoppingKey
});
};
/**
* 获取商品的套餐量贩信息
* @param $productSkn
* @return mixed
*/
const handleBundleInfo = (productSkn) => {
return api.get('', {
method: 'app.query.bundleSkn',
product_skn: productSkn,
}).then(data => {
return data.code === 200 ? cartProcess.handleBundleInfo(data) : undefined;
});
};
/**
* 获取加价购商品数据
*
* @param int $skn 商品skn
* @param int $promotionId 加价购商品促销ID
* @return array 接口返回的数据
*/
const giftProductData = (skn, promotionId) => {
return api.get('', {
method: 'app.product.gift',
product_skn: skn,
promotion_id: promotionId
}).then(data => {
return data.code === 200 ? cartProcess.procGoodsDetail(data.data) : undefined;
});
};
/**
* [获取赠品、加价购促销商品列表]
*/
const getPriceGiftList = (promotionId) => {
return api.get('', {
method: 'app.Shopping.queryPromotionGift',
promotion_id: promotionId
}).then((data) => {
return data.code === 200 ? cartProcess.procPriceGiftData(data.data) : undefined;
});
};
module.exports = {
indexData,
selectGood,
removeFromCart,
cartProductData,
addToFav,
increaseProductNum,
decreaseProductNum,
addToCart,
handleBundleInfo,
modifyCartProduct,
giftProductData,
getPriceGiftList,
modifyCartPriceGiftProduct
};
... ...
'use strict';
const _ = require('lodash');
const crypto = global.yoho.crypto;
const processInvoiceData = (orderInfo, mobile, addresslist) => {
let invoices_title = '';
let invoiceType = '7';
let invoices_type = '2';
let invoice_Top = '个人';
// 用户手机号处理
if (orderInfo.receiverMobile && orderInfo.isModifyTel) {
mobile = orderInfo.receiverMobile;
} else {
_.forEach(addresslist, addressValue => {
if (addressValue.address_id === crypto.encryption('', orderInfo.addressId)) {
mobile = addressValue.mobile;
}
});
}
// 发票信息处理
if (orderInfo.invoiceType && orderInfo.invoiceTitle) {
invoices_title = orderInfo.invoiceText;
invoiceType = orderInfo.invoiceType;
invoices_type = orderInfo.invoicesType * 1;
invoice_Top = orderInfo.invoiceTitle;
}
return {
invoiceNotice: '发票须知',
phone: mobile ? mobile : '', // TODO 字符串替换 ****
completeTel: mobile,
isCompany: invoice_Top !== '单位',
companyName: invoices_title,
isPaper: invoices_type === 1,
invoicesType: [
{
id: '2',
type: '电子发票',
choosed: !invoices_type || invoices_type === 2,
},
{
id: '1',
type: '纸质发票',
choosed: invoices_type === 1
}
],
invoiceTitle: [
{
type: '个人',
choosed: invoice_Top === '个人'
},
{
type: '单位',
choosed: invoice_Top === '单位'
}
],
content: [
{
choosed: !invoiceType || invoiceType === 7,
id: 7,
text: '服装'
},
{
choosed: invoiceType === 9,
id: 9,
text: '配件'
},
{
choosed: invoiceType === 11,
id: 11,
text: '日用品'
},
// 暂停办公用品开票
// {
// choosed: invoiceType === 3,
// id: 3,
// text: '办公用品'
// },
{
choosed: invoiceType === 6,
id: 6,
text: '体育用品'
},
{
choosed: invoiceType === 10,
id: 10,
text: '数码产品'
},
]
};
};
module.exports = {
processInvoiceData
};
... ...
/**
* 支付相关api调用
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 2016/07/18
*/
'use strict';
const api = global.yoho.API;
// 获取支付宝等平台支付方式列表
const getPayProvider = () => {
return api.get('', {
method: 'web.SpaceOrders.getPaymentList'
}, {cache: true});
};
// 获取单个支付方式相关详细信息
const getPaymentInfo = (id) => {
return api.get('', {
method: 'web.SpaceOrders.getPaymentById',
id: id
}, {cache: true});
};
/* 获取上次使用的支付方式*/
const getBankByOrder = (code) => {
return api.get('', {
method: 'web.SpaceOrders.getOrderPayBank',
orderCode: code
});
};
/* 记录支付方式*/
const setOrderPayBank = (code, payment, bankCode) => {
return api.get('', {
method: 'web.SpaceOrders.addOrderPayBank',
orderCode: code,
payment: payment,
bankCode: bankCode
});
};
/* 更改支付方式*/
const updateOrderPayBank = (code, payment, bankCode) => {
return api.get('', {
method: 'web.SpaceOrders.modifyOrderPayBank',
orderCode: code,
payment: payment,
bankCode: bankCode
});
};
/* 发送支付确认*/
const sendPayConfirm = (code, payment, uid) => {
return api.get('', {
method: 'app.SpaceOrders.payConfirm',
order_code: code,
payment_id: payment,
uid: uid
});
};
const sendMessage = (mobile, template, codes) => {
return api.get('', {
method: 'app.message.sendMsg',
mobile: mobile,
template: template,
codes: codes
});
};
module.exports = {
getPayProvider,
getPaymentInfo,
getBankByOrder,
setOrderPayBank,
updateOrderPayBank,
sendPayConfirm,
sendMessage
};
... ...
/**
* 支付成功页
* 支付
* @author: jing.li<jing.li@yoho.cn>
* @date: 2016/10/25
*/
... ... @@ -10,9 +10,20 @@ const api = global.yoho.API;
const serviceAPI = global.yoho.ServiceAPI;
const utils = '../../../utils';
const productProcess = require(`${utils}/product-process`);
const _ = require('lodash');
const ApipayConfig = global.yoho.config.alipayConfig;
const md5 = require('md5');
const payApi = require('./pay-api');
const helpers = global.yoho.helpers;
const _ = require('lodash');
const co = require('bluebird').coroutine;
const logger = global.yoho.logger;
// 支付方式
const payments = {
alipay: 33,
wechat: 22,
alibank: 42
};
// 资源位
const _getBanner = (param) => {
... ... @@ -20,7 +31,6 @@ const _getBanner = (param) => {
content_code: param.contentCode,
platform: 'iphone'
}, { code: 200 }).then((result) => {
result = result.data;
return result;
... ... @@ -37,7 +47,6 @@ const _getOthersBuy2 = (param) => {
limit: 2,
client_id: param.client_id
}, { code: 200 }).then((result) => {
if (result && result.data && result.data.product_list) {
return productProcess.processProductList(result.data.product_list);
}
... ... @@ -47,14 +56,17 @@ const _getOthersBuy2 = (param) => {
// 订单信息
const _getOtherDetail = (param) => {
if (!param.uid || !param.orderCode) {
return Promise.resolve({});
}
return api.get('', {
method: 'app.SpaceOrders.detail',
uid: param.uid,
order_code: param.orderCode
}, { code: 200 }).then((result) => {
order_code: param.orderCode,
session_key: param.sessionKey
}, { code: 200 }).then(result => {
return result;
});
};
... ... @@ -78,6 +90,218 @@ const _getOthersBuy = (param) => {
});
};
/**
* 获取订单支付银行信息
* @param id
*/
const getBankByOrder = (id) => {
return co(function* () {
let result = yield payApi.getBankByOrder(id);
if (result && result.code === 200 && result.data) {
return result.data;
}
return {};
})();
};
/**
* 设置订单支付银行
* @param code
* @param payment
* @param bankCode
*/
const setOrderPayBank = (code, payment, bankCode) => {
return co(function* () {
let data = yield payApi.setOrderPayBank(code, payment, bankCode);
return data;
})();
};
/**
* 获取支付方式的相关参数, (密钥等信息)
* @param id
*/
const getPaymentInfo = (id) => {
return co(function* () {
let result = yield payApi.getPaymentInfo(id);
if (result && result.code === 200 && result.data) {
return result.data;
}
return {};
})();
};
/**
* 支付确认
* @param code
* @param payment
* @param uid
*/
const sendPayConfirm = (code, payment, uid) => {
return co(function* () {
let data = yield payApi.sendPayConfirm(code, payment, uid);
return data;
})();
};
/**
* 更新订单支付方式
* @param code
* @param payment
* @param uid
* @returns {*}
*/
const updateOrderPayment = (code, payment, uid) => {
return api.get('', {
method: 'app.SpaceOrders.updateOrdersPaymentByCode',
order_code: code,
payment: payment,
uid: uid
});
};
/**
* 更新订单支付银行
* @param code
* @param payment
* @param bankCode
*/
const updateOrderPayBank = (code, payment, bankCode) => {
return co(function* () {
let data = yield payApi.updateOrderPayBank(code, payment, bankCode);
return data;
})();
};
/**
* 支付成功,前端回调时,处理订单信息
* @param payResult
* @param uid
* @param sessionKey
*/
const procOrderData = (payResult, uid, sessionKey) => {
return co(function* () {
let orderCode = payResult.orderCode;
let result = { code: 400, message: '' };
if (!orderCode) {
result.message = '未查到订单信息,订单状态更新失败!';
return result;
} else {
let orderInfo = yield _getOtherDetail({
uid: uid,
orderCode: orderCode,
sessionKey: sessionKey
});
if (orderInfo && orderInfo.data) {
let order = orderInfo.data;
let amount = order.payment_amount;
if (order.is_cancel === 'Y') {
logger.warn('front pay success but order is cancel.', { payResult: payResult, order: order });
payApi.sendMessage(order.mobile, 'error_sms', '支付成功,但订单已取消,订单号为' + orderCode);
return { code: 417, message: '支付成功,但订单已取消,需联系客服!' };
}
if (order.payment_status === 'N') {
logger.warn('front pay success but may be notify fail');
}
if (_.round(parseFloat(amount), 2) !== _.round(parseFloat(payResult.totalFee), 2)) {
logger.warn('front pay success but the amount is not same.', { payResult: payResult, order: order });
return {
code: 415,
message: '支付金额与订单金额不一致,订单状态更新失败!'
};
}
return {
code: 200,
message: '支付成功,请等待发货',
data: {
order: order
}
};
} else {
result.message = '未查到订单信息,订单状态更新失败!';
}
}
return result;
})();
};
/**
* 支付相关的数据处理函数
*/
const payTool = {
/**
* 支持的支付方式列表
* @returns {[*,*]}
*/
payAppInfo(orderCode) {
return [{
appIcon: '',
payLink: helpers.urlFormat('/cart/index/new/pay', {
payment: payments.alipay + '_platform',
order_code: orderCode
}),
appId: 'alipay',
app: '支付宝支付',
hint: '支付宝钱包支付',
subHint: '推荐支付宝用户使用'
}, {
appIcon: '',
payLink: '',
appId: 'weixin',
app: '微信支付',
hint: '推荐使用',
subHint: ''
}];
},
/**
* 计算购买商品总数量
* @param goodsArray
* @returns {number}
* @private
*/
calBuyNumCount(goodsArray) {
let buyNumCount = 0;
if (_.isArray(goodsArray)) {
_.forEach(goodsArray, value => {
buyNumCount = value.buy_number ? parseInt(value.buy_number, 10) : 0;
});
}
return buyNumCount;
}
};
/**
* 支付中心
* @param params
*/
const payCenter = (params) => {
return _getOtherDetail({
uid: params.uid,
orderCode: params.orderCode
}).then(result => {
return _.get(result, 'data', {});
});
};
// 货到付款
const getPayCod = (param) => {
return api.all([
... ... @@ -234,6 +458,17 @@ const getPayAli = (param) => {
};
module.exports = {
payments,
getOtherDetail: _getOtherDetail,
updateOrderPayment,
updateOrderPayBank,
getBankByOrder,
getPaymentInfo,
setOrderPayBank,
sendPayConfirm,
procOrderData,
payCenter,
payTool,
getPayCod,
getPayAli,
alipayResultVerify
... ...
... ... @@ -11,8 +11,10 @@ const cRoot = './controllers';
const authMW = require('../../doraemon/middleware/auth');
const seckill = require(cRoot + '/seckill');
const order = require(cRoot + '/order');
const countController = require(`${cRoot}/count`);
const payController = require(`${cRoot}/pay`);
const indexController = require(`${cRoot}/index`);
// Your controller here
router.all('/index/seckill/', authMW);
... ... @@ -26,4 +28,29 @@ router.get('/paySuccess/payCod', payController.payCod);// 支付成功,货到
router.get('/shopping/pay/aliwapreturn', payController.payAli);// 支付成功,支付宝付款
router.get('/shopping/pay/payZero', payController.payZero);// 支付成功,支付为0
router.get('/index/new/pay', authMW, payController.pay);// 统一支付 URL,支持微信,支付宝
router.get('/index/new/pay/alipayresult', authMW, payController.payAli);// 支付宝付款支付成功
router.get('/index/new/orderEnsure', authMW, order.orderEnsure); // 订单结算
router.get('/index/new/selectCoupon', authMW, order.selectCoupon); // 选择优惠券 页面
router.get('/index/new/couponList', order.couponList); // [ajax]获取优惠券列表
router.post('/index/new/couponSearch', order.couponSearch); // [ajax]购物车输入优惠券码使用优惠券
router.get('/index/new/selectAddress', authMW, order.selectAddress); // 选择地址
router.get('/index/new/invoiceInfo', authMW, order.invoiceInfo); // 发票信息
router.get('/index/index', indexController.index); // 购物车
router.post('/index/add', indexController.add); // 加入购物车
router.post('/index/new/data', indexController.indexData); // 购物车
router.post('/index/new/select', indexController.select); // 选择取消购物车商品
router.post('/index/new/del', indexController.del); // 删除购物车商品
router.post('/index/new/col', indexController.col); // 删除购物车商品
router.post('/index/new/goodinfo', indexController.goodinfo); // 获取购物车商品数据,chosepanel
router.post('/index/new/modifyNum', indexController.modifyNum); // 修改购物车商品数量
router.post('/index/new/modify', indexController.modify); // 修改购物车商品数据
router.post('/index/new/modifyPriceGift', indexController.modifyPriceGift); // 修改购物车赠品、加价购商品数据
router.get('/index/new/gift', indexController.gift); // 获取购物车赠品
router.get('/index/new/advanceBuy', indexController.advanceBuy); // 获取购物车加价购
router.post('/index/new/giftinfo', indexController.giftinfo); // 获取购物车加价购商品数据,chosepanel
module.exports = router;
... ...
<div class="gift-advance-page yoho-page">
{{#if advanceBuyPage}}
{{# advanceBuy}}
<div class="advance-block" data-promotion-id="{{promotionId}}">
<p class="title">{{promotionTitle}}</p>
{{#goods}}
{{> cart/gift-advance-good}}
{{/goods}}
</div>
{{/ advanceBuy}}
{{else}}
{{# freebie}}
<div class="advance-block gift-block" data-promotion-id="{{promotionId}}">
<p class="title">{{promotionTitle}}</p>
{{#goods}}
{{> cart/gift-advance-good}}
{{/goods}}
</div>
{{/ freebie}}
{{/if}}
<div id="chose-panel"></div>
</div>
\ No newline at end of file
... ...
{{> cart/chose-panel}}
\ No newline at end of file
... ...
<div class="shopping-cart-page yoho-page ">
{{#unless isLogin}}
<p class="login-info">
<span class="iconfont">&#xe628;</span>
请您先
<a class="btn btn-login" href="{{signurl}}">登录</a>
可以同步电脑和手机中的商品
</p>
{{/unless}}
<div class="cart-box">
</div>
<div id="chose-panel"></div>
</div>
... ...
<div class="order-ensure-page yoho-page">
<input id="cart-token" type="hidden" name="token" value="{{cartToken}}">
{{#if orderEnsure}}
{{# orderEnsure}}
{{#if addressInfo}}
<div class="address block address-wrap {{#if pageHeader.boys}} boys{{/if}}{{#if pageHeader.girls}} girls{{/if}}{{#if pageHeader.kids}} kids{{/if}}{{#if pageHeader.lifeStyle}} life-style{{/if}}" data-id ="{{addressId}}">
<div class="address block address-wrap {{#if @root.pageChannel.boys}} boys{{/if}}{{#if @root.pageChannel.girls}} girls{{/if}}{{#if @root.pageChannel.kids}} kids{{/if}}{{#if @root.pageChannel.lifeStyle}} life-style{{/if}}" data-id ="{{addressId}}">
<div class="info">
<span class="info-name">{{name}}</span>
<span class="info-phone">{{phoneNum}}</span>
<a href="/cart/index/selectAddress"><span class="info-address">{{addressInfo}}</span></a>
<a href="/cart/index/new/selectAddress"><span class="info-address">{{addressInfo}}</span></a>
<i class="iconfont">&#xe637;</i>
</div>
<a class="rest" href="/cart/index/selectAddress">其他地址<span class="iconfont">&#xe614;</span></a>
<a class="rest" href="/cart/index/new/selectAddress">其他地址<span class="iconfont">&#xe614;</span></a>
</div>
{{else}}
<div class="address block address-wrap not-address">
<i class="iconfont">&#xe637;</i>
<a class="choose" href="/cart/index/selectAddress">请选择收货地址<span class="iconfont">&#xe614;</span></a>
<a class="choose" href="/cart/index/new/selectAddress">请选择收货地址<span class="iconfont">&#xe614;</span></a>
</div>
{{/if}}
<section class="dispatch block">
... ... @@ -132,21 +132,10 @@
<input type="hidden" class="user-mobile" value="{{userMobile}}" />
<span class="title">发票</span>
<span class="iconfont checkbox {{#if needInvoice}}icon-cb-radio{{else}}icon-radio{{/if}}"></span>
<a id="invoice" class="invoice-info" href="/cart/index/invoiceInfo">
<a id="invoice" class="invoice-info" href="/cart/index/new/invoiceInfo">
<span class="title">发票信息</span>
<span class="invoice-type"><i class="iconfont">&#xe614;</i></span>
</a>
<!-- <form id="invoice">
<input type="text" name="invoice-title" value="{{invoiceText}}" maxlength="30" placeholder="发票抬头">
<label>
发票类型
<select class="invoice-type" name="invoice-type">
{{# invoice}}
<option value="{{id}}" {{#if isSelected}}selected{{/if}}>{{name}}</option>
{{/ invoice}}
</select>
</label>
</form> -->
</li>
{{/if}}
</ul>
... ... @@ -201,5 +190,5 @@
<div class="order-ensure-error">
{{message}}
</div>
{{/if}}
{{/ orderEnsure}}
</div>
... ...
... ... @@ -7,7 +7,6 @@
</div>
</div>
{{/ prompt}}
<div class="top-tip">
<div class="img-c"></div>
<p class="ok-tip">恭喜您,付款成功!</p>
... ...
<div class="pay-page yoho-page">
{{#if orderCode}}
<input id='ordercode' type="hidden" value="{{orderCode}}">
{{/if}}
<div class="payapp-list">
{{# payAppInfo}}
{{#if payLink}}
<a href="{{payLink}}">
{{/if}}
<div class="box" id="{{appId}}">
<div class="icon">
{{#if appIcon}}
<img src="{{appIcon}}" alt="app图标">
{{else}}
<div></div>
{{/if}}
</div>
<div class="app">{{app}}</div>
<div class="hint">
{{hint}}
{{#if subHint}}
<br>
{{subHint}}
{{/if}}
</div>
<div class="iconfont">&#xe604</div>
</div>
{{#if payLink}}
</a>
{{/if}}
{{/ payAppInfo}}
</div>
<div class="loading-toast hide"></div>
</div>
<!-- TODO richTip -->
<input type="hidden" class="order-code" value="{{orderCode}}">
<input type="hidden" class="order-total" value="{{orderTotal}}">
<script>_ozprm="orderid={{orderCode}}&ordertotal={{orderTotal}}";</script>
<script type="text/javascript" src ="//static.yohobuy.com/m/v1/js/AG_Tracking.js"></script>
<script type="text/javascript">
var _agq = _agq || [];
_agq.push(['_cid', '415']); //生成value
_agq.push(['_eid', '102']); //生成value
_agq.push(['_orderSum',"{{orderTotal}}"]);//订单金额,客户在页面填写
_agq.push(['_orderNo',"{{orderCode}}"]);//订单号,客户在页面填写
_agq.push(['_orderNew',"{{isOldUser}}"]);//是否新客单,客户标记是为true否为false
_agq.push(['_orderCount',"{{orderCount}}"]);//订单货品数目,客户填写
ag_send(_agq);
var __order_code = "{{orderCode}}";
var __order_amount = "{{orderTotal}}";
var __order_user = "{{isOldUser}}";
var __order_goods_num = "{{orderCount}}";
var __order_uid = "{{uid}}";
var _fxcmd=_fxcmd||[];
_fxcmd.push(['trackOrder', {
oid: "{{orderCode}}",
otp : "{{orderTotalFormat}}",
unid : "{{uid}}"
}]);
</script>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
{ event: "setAccount", account: [21397] },
{ event: "setHashedEmail", email: "" },
{ event: "setSiteType", type: "m" },
{ event: "trackTransaction" , id: "{{orderCode}}", currency: "CNY", item: ""}
);
</script>
... ...
<div class="my-address-page select-address-page yoho-page">
<div class="page-wrap clearfix">
{{# address}}
<div class="address-item" data-address-id="{{address_id}}" data-is-support="{{is_support}}" data-href="{{../moreUrl}}">
<span class="name">{{consignee}}</span>
<span class="tel">{{mobile}}</span>
<p class="address-info">{{area}} {{address}}</p>
<div class="action iconfont">
<span class="edit" data-href="/home/addressAct?id={{address_id}}&refer=shopping">&#xe61e;</span>
<span class="del" data-id="{{address_id}}">&#xe621;</span>
</div>
</div>
{{/ address}}
<a class="add-address" data-href="/home/addressAct?refer=shopping">
添加新地址
</a>
<div class="confim-mask hide">
<div class="confim-box">
<div class="content">
您确定要删除地址?
</div>
<div class="action">
<span class="cancel">
取消
</span>
<span class="confim">
确认
</span>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
... ...
<div class="yoho-page select-coupon-page my-coupon-page">
<form id="new-coupon" method="POST" action="">
<input type="text" name="couponCode" value="" placeholder="输入优惠券码">
<button type="submit" class="submit">确定</button>
</form>
<div class="coupon-wrap">
<div id="coupon-list" class="coupon-list"></div>
<div class="not-avaliable-coupon-line hide">不可使用的优惠券</div>
<div id="coupon-list-not" class="coupon-list"></div>
</div>
</div>
<script id="tmpl-no-coupon" type="text/tmpl">
<div class="coupon-list">
<div class="null">
<i></i>
<p>您还没有优惠券!</p>
</div>
</div>
</script>
... ...
<div class="invoice-info-page yoho-page">
<ul class="invoice-form">
<li>
<span class="title">发票类型:</span>
<div class="invoice-type">
{{#invoicesType}}
<span {{#if choosed}}class="on"{{/if}} data-id="{{id}}">{{type}}</span>
{{/invoicesType}}
</div>
</li>
<li>
<span class="title">发票抬头:</span>
<div class="invoice-top">
{{#invoiceTitle}}
<span {{#if choosed}}class="on"{{/if}}><i class="iconfont choose {{#if choosed}}icon-cb-radio{{else}}icon-radio{{/if}}"></i>{{type}}</span>
{{/invoiceTitle}}
</div>
</li>
<li {{#isPaper}}style="display: none;"{{/isPaper}} class="tel-area">
<span class="title"><i class="txt-point">*</i>发票人手机:</span>
<span class="phone">
<input type="hidden" class="copy-tel" value="{{completeTel}}">
<input type="text" name="tel" data-tel="{{completeTel}}" class="tel {{#phone}}istel{{/phone}}" value="{{phone}}" placeholder="可通过手机号在发票服务平台查询">
</span>
</li>
<li class="company-area" {{#isCompany}}style="display: none;"{{/isCompany}}><input type="text" name="company" class="company" value="{{companyName}}" placeholder="填写单位名称" maxlength="30"></li>
</ul>
<ul class="invoice-cont">
<li class="cont-title">
<span>发票内容:</span>
<span class="choose-cont" data-id=""></span>
</li>
{{#each content}}
<li><span class="iconfont choose {{#if choosed}}icon-cb-radio{{else}}icon-radio{{/if}}" data-id="{{id}}"></span>{{text}}</li>
{{/each}}
</ul>
<div class="btn-area"><span class="confirm-btn">确认</span></div>
<div class="invoice-notice">
<div class="mask-bg"></div>
<div class="notice-area">
<div class="notice-cont">
<h2>发票须知</h2>
<p>1、发票金额不含优惠券/有货币/红包/优惠码/运费,只包含商品实付金额</p>
<p>2、电子发票:是税局认可的有效收付款凭证,其法律效力、基本用途及使用规定同纸质发票,如需纸质发票可自行下载打印</p>
</div>
<div class="think-ok">我知道了</div>
</div>
</div>
<input type="hidden" class="edit-flag" value="false" />
<input type="hidden" class="address-more" value="{{addressMore}}" />
</div>
... ...
<div class="gift-advance-good" data-id={{id}}>
<div class="thumb-wrap">
<img class="thumb lazy" data-original={{thumb}}>
<p class="tag"></p>
</div>
<div class="deps">
<p class="name row">{{name}}</p>
<p class="row">
<span class="price">&yen;{{#if price}}{{price}}{{else}}{{marketPrice}}{{/if}}</span>
{{#if price}}
<span class="price market-price">&yen;{{marketPrice}}</span>
{{/if}}
</p>
<span class="chose">选择</span>
</div>
</div>
... ...
... ... @@ -142,7 +142,7 @@ const _getOrderStatus = (order, showLogistics) => {
/* 待付款 */
Object.assign(result, {
unpaid: true,
payUrl: helpers.urlFormat('/home/orders/pay', {order_code: order.order_code})
payUrl: helpers.urlFormat('/home/orders/paynew', {order_code: order.order_code})
});
break;
case 1:
... ...
... ... @@ -70,7 +70,7 @@ const _getOrderStatus = (order, showLogistics) => {
/* 待付款 */
Object.assign(result, {
unpaid: true,
payUrl: helpers.urlFormat('/home/orders/pay', {order_code: order.orderCode})
payUrl: helpers.urlFormat('/home/orders/paynew', {order_code: order.orderCode})
});
break;
case 1:
... ...
... ... @@ -29,6 +29,8 @@ const suggest = require(`${cRoot}/suggest`);
const message = require(`${cRoot}/message`);
const onlineService = require(`${cRoot}/onlineService`);
const payController = require('../cart/controllers/pay');
// const myDetail = require(`${cRoot}/myDetail);
... ... @@ -132,4 +134,7 @@ router.get('/installment/card-detail', installment.cardDetail); // 银行å¡è¯¦æ
router.get('/installment/delBankCard', installment.delBankCard); // 删除绑定
router.get('/installment/setMasterCard', installment.setMasterCard); // 切换主卡
// 支付中心 URL,由于微信安全限制,在现有 URL 后追加 new
router.get('/orders/paynew', auth, payController.payCenter);
module.exports = router;
... ...
... ... @@ -252,7 +252,8 @@ const category = (req, res, next) => {
pageFooter: true,
category: true,
localCss: true,
appPath: appPath
appPath: appPath,
introText: req.query.intro_text
});
}).catch(next);
};
... ...
... ... @@ -817,82 +817,79 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
let notForSale = origin.attribute === 2;
let preSale = (origin.status === 0 && origin.advance_shelve_time > 0);
// 悬浮的购物车信息
dest.cartInfo = {
cartUrl: helpers.urlFormat('/cart/index/index'),
numInCart: 0,
goodsInstore: origin.storage_sum
};
return new Promise((resolve, reject) => {
// 悬浮的购物车信息
dest.cartInfo = {
cartUrl: helpers.urlFormat('/cart/index/index'),
numInCart: 0,
goodsInstore: origin.storage_sum
};
// 显示加入购物车链接
if (!soldOut && !notForSale && !preSale || origin.isLimitBuy) {
_.orderBy(colorGroup);
Object.assign(dest.cartInfo, {
productId: origin.product_id,
thumbs: thumbImageList,
name: dest.goodsName || '',
price: dest.goodsPrice.previousPrice ? dest.goodsPrice.previousPrice : '',
salePrice: dest.goodsPrice.currentPrice ? dest.goodsPrice.currentPrice : '',
totalNum: totalStorageNum,
colors: _.toArray(colorGroup),
sizes: sizeGroup
});
// 显示加入购物车链接
if (!soldOut && !notForSale && !preSale || origin.isLimitBuy) {
_.orderBy(colorGroup);
Object.assign(dest.cartInfo, {
productId: origin.product_id,
thumbs: thumbImageList,
name: dest.goodsName || '',
price: dest.goodsPrice.previousPrice ? dest.goodsPrice.previousPrice : '',
salePrice: dest.goodsPrice.currentPrice ? dest.goodsPrice.currentPrice : '',
totalNum: totalStorageNum,
colors: _.toArray(colorGroup),
sizes: sizeGroup
});
// 限购商品
if (origin.isLimitBuy) {
return api.get('', {
method: 'app.limitProduct.productStatus',
limitProductCode: origin.limitProductCode,
uid: uid,
product_skn: origin.product_skn
}, {
code: 200,
cache: true
}).then((result) => {
if (result.data) {
if (!result.data.isLimitBuy) {
dest.cartInfo.soldOut = true;
return callback();
}
// 限购商品
if (origin.isLimitBuy) {
return api.get('', {
method: 'app.limitProduct.productStatus',
limitProductCode: origin.limitProductCode,
uid: uid,
product_skn: origin.product_skn
}, {
code: 200,
cache: true
}).then((result) => {
if (result.data) {
if (!result.data.isLimitBuy) {
dest.cartInfo.soldOut = true;
return resolve(dest);
}
// 是否开售
let isBeginSale = (result.data.saleStatus === 1);
// 是否开售
let isBeginSale = (result.data.saleStatus === 1);
// 限购商品有关的展示状态
let showStatus = 1;
// 限购商品有关的展示状态
let showStatus = 1;
origin.showStatus && (showStatus = parseInt(result.data.showStatus, 10));
origin.showStatus && (showStatus = parseInt(result.data.showStatus, 10));
// 处理限购商品有关的按钮状态
dest = _procShowStatus(dest, showStatus, isBeginSale);
// 处理限购商品有关的按钮状态
dest = _procShowStatus(dest, showStatus, isBeginSale);
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = _getLimitCodeUrl(origin.limitProductCode, origin.product_skn, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure');
return callback();
} else {
dest.cartInfo.soldOut = true;
return callback();
}
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = _getLimitCodeUrl(origin.limitProductCode, origin.product_skn, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure');
return resolve(dest);
} else {
dest.cartInfo.soldOut = true;
return resolve(dest);
}
});
} else {
dest.cartInfo.addToCartUrl = helpers.urlFormat('/product/buy_' + origin.product_id + '_' +
origin.goods_id + '.html');
return callback();
});
} else {
dest.cartInfo.addToCartUrl = helpers.urlFormat('/product/buy_' + origin.product_id + '_' +
origin.goods_id + '.html');
}
} else if (notForSale && !preSale) {
dest.cartInfo.notForSale = true;
} else if (soldOut && !preSale) {
dest.cartInfo.soldOut = true;
} else if (preSale) {
dest.cartInfo.preSale = true;
}
} else if (notForSale && !preSale) {
dest.cartInfo.notForSale = true;
return callback();
} else if (soldOut && !preSale) {
dest.cartInfo.soldOut = true;
return callback();
} else if (preSale) {
dest.cartInfo.preSale = true;
return callback();
}
function callback() {
return resolve(dest);
}).then(dest => {
// 虚拟商品(门票)
if (origin.attribute * 1 === 3) {
dest.tickets = true;
... ... @@ -917,21 +914,8 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
if (dest.isSecKill === 'Y' && dest.cartInfo.totalNum > 0) {
dest.totalNum = 1;
}
return Promise.resolve(dest);
}
return api.get('', {
method: 'app.shop.queryShopsByBrandId',
brand_id: _.toString(brandId)
}, {
cache: true
}).then(shops => {
if (shops && shops.code === 200) {
return _processShopsInfo(shops.data);
}
return [];
});
return dest;
})
};
... ... @@ -980,5 +964,6 @@ module.exports = {
getProductAsyncData,
getNewProductAsyncData,
getUserProfile: _getUserProfile,
productInfoBySkns: _productInfoBySkns
productInfoBySkns: _productInfoBySkns,
detailDataPkgAsync: _detailDataPkgAsync
};
... ...
... ... @@ -160,6 +160,9 @@ const _searchGoods = (params) => {
method = 'app.search.newProduct';
params.app_type = 1;
}
if (params.promotion_id) {
method = 'app.search.promotion';
}
if (params.students) {
method = 'app.student.discount';
... ...
... ... @@ -131,7 +131,9 @@
<!--搜索默认排序列表-->
{{> product/search-default-sort-list}}
</div>
{{#@root.introText}}
<p class="intro-text">{{@root.introText}}</p>
{{/@root.introText}}
<div id="goods-container" class="goods-container">
<div class="firstscreen-goods container clearfix">
{{#@root.firstPageGoodsList}}
... ...
'use strict';
const _ = require('lodash');
const api = global.yoho.API;
/**
* 购物车结算
* doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
* @param int $uid 用户ID
* @param string $cartType 购物车类型,ordinary表示普通购物车
* @param int $isUseYohoCoin 是否使用有货币,0不使用, 1使用
* @param string $skuList 购买限购商品时需要传递的参数
* @return see doc
*/
exports.cartPayAPI = (uid, cartType, isUseYohoCoin, skuList) => {
let param = {
method: 'app.Shopping.payment',
enable_red_envelopes: 0, // h5不返回红包
cart_type: cartType,
yoho_coin_mode: isUseYohoCoin,
uid: uid
};
// 购买限购商品时需要传递product_sku_list参数
if (!_.isEmpty(skuList)) {
param.product_sku_list = skuList;
}
return api.get('', param);
};
/**
* 购物车结算--支付方式和配送方式选择以及是否使用有货币接口返回的数据处理
* doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
* @param int $uid 用户ID
* @param string $cartType 购物车类型,ordinary表示普通购物车
* @param int $deliveryWay 配送方式,1表示普通快递,2表示顺丰速运
* @param int $paymentType 支付方式,1表示在线支付,2表示货到付款
* @param string $couponCode 优惠券码
* @param mixed $yohoCoin 使用的有货币数量
* @param string $skuList 购买限购商品时需要传递的参数
* @return see doc
*
*
* Note:
* 1. 大多数情况下,调用完此接口,请显示的调用 utils/payment-process.js@yohoCoinCompute;
* 2. 除非同时调用app.Shopping.payment 与该接口,用改接口的data值替换app.Shopping.payment相关值,
* 显示调用utils/payment-process.js@tranformPayment(他会帮你调yohoCoinCompute)处理payment的data;
*/
exports.orderComputeAPI = (uid, cartType, deliveWay, paymentType, couponCode, yohoCoin, skuList) => {
let param = {
method: 'app.Shopping.compute',
cart_type: cartType,
delive_way: deliveWay,
payment_type: paymentType
};
if (couponCode) {
param.coupon_code = couponCode;
}
if (yohoCoin) {
param.use_yoho_coin = yohoCoin;
}
if (!_.isEmpty(skuList)) {
param.product_sku_list = skuList;
}
return api.get('', param);
};
/**
* 获取用户可用的优惠券张数
* doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
* @param uid int 用户uid
* @return see doc
*/
exports.getValidCouponCount = uid => {
let param = {
method: 'app.Shopping.countUsableCoupon',
uid
};
return api.get('', param);
};
/**
* 获取用户优惠券列表,可用和不可用
* doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
* @param uid int 用户uid
* @return see doc
*/
exports.listCoupon = uid => {
let param = {
method: 'app.Shopping.listCoupon',
uid
};
return api.get('', param);
};
/**
* 购物车结算--使用优惠券
* @param uid int 用户uid
* @param couponCode string 优惠券代码
* @return
*/
exports.useCoupon = (uid, couponCode) => {
let param = {
method: 'app.Shopping.useCoupon',
coupon_code: couponCode,
uid
};
return api.get('', param);
};
... ...
'use strict';
// doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/个人中心/地址管理.md';
const api = global.yoho.API;
const crypto = global.yoho.crypto;
/**
* 地址数据
* @param uid
* @return
* {
* "code":200,
* "data":[
* {
* "area":"江苏省 南京市 浦口区",
* "address":"沿江街道******,
* "consignee":"孟令阶",
* "is_support":"Y",
* "area_code":"320111",
* "mobile":"180****2255",
* "address_id":"6117354", // 会被加密
* "is_default":"N",
* "is_delivery":"Y",
* "zip_code":"",
* "uid":"14616040",
* "phone":"",
* "email":""}
* ],
* "md5":"c35872955397cd0aabff4583cd41ac4b",
* "message":"Address List"
* }
*/
exports.addressData = (uid) => {
let params = {
method: 'app.address.gethidden',
uid
};
let options = {
cache: true
};
return api.get('', params, options)
.then(
result => {
if (result.code === 200) {
// 加密address_id
result.data.forEach(address => {
address.address_id = crypto.encryption(null, address.address_id);
});
}
return result;
}
,
() => {
return {code: 500, data: [], message: '地址获取失败'};
}
);
};
... ...
'use strict';
const api = global.yoho.API;
/**
* 获取用户信息
* doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/个人中心/addUserprofile.md
* @param uid 用户id
* @return
*/
exports.queryProfile = (uid) => {
let params = {
method: 'app.passport.profile',
uid
};
let options = {
cache: true
};
return api.get('', params, options);
};
exports.addressTextData = (uid) => {
return api.get('', {
method: 'app.address.get',
uid: uid
});
};
... ...
... ... @@ -18,20 +18,18 @@ module.exports = {
testCode: 'yoho4946abcdef#$%&!@',
domains: {
api: 'http://api-test3.yohops.com:9999/',
service: 'http://service-test3.yohops.com:9999/',
liveApi: 'http://testapi.live.yohops.com:9999/',
singleApi: 'http://api-test3.yohops.com:9999/',
imSocket: 'ws://im.yohobuy.com:10240',
imCs: 'http://im.yohobuy.com/api',
imServer: 'http://im.yohobuy.com/server'
// service: 'http://service-test3.yohops.com:9999/',
// liveApi: 'http://testapi.live.yohops.com:9999/',
// singleApi: 'http://api-test3.yohops.com:9999/',
// api: 'http://api.yoho.cn/',
// service: 'http://service.yoho.cn/',
// liveApi: 'http://api.live.yoho.cn/',
// singleApi: 'http://single.yoho.cn/',
// imSocket: 'wss://imsocket.yohobuy.com:443',
// imCs: 'https://imhttp.yohobuy.com/api',
// imServer: 'https://imhttp.yohobuy.com/server'
// api: 'http://dev-api.yohops.com:9999/',
service: 'http://service.yoho.cn/',
liveApi: 'http://api.live.yoho.cn/',
singleApi: 'http://single.yoho.cn/',
imSocket: 'wss://imsocket.yohobuy.com:443',
imCs: 'https://imhttp.yohobuy.com/api',
imServer: 'https://imhttp.yohobuy.com/server'
},
subDomains: {
host: '.m.yohobuy.com',
... ... @@ -89,7 +87,24 @@ module.exports = {
},
zookeeperServer: '192.168.102.168:2188',
alipayConfig: {
alipayKey: 'kcxawi9bb07mzh0aq2wcirsf9znusobw'
payUrl: 'https://mapi.alipay.com/gateway.do',
service: 'alipay.wap.create.direct.pay.by.user',
partner: '2088701661478015',
inputCharset: 'utf-8',
notifyUrl: 'payment/alipay_notify',
returnUrl: '/shopping/pay/aliwapreturn',
signType: 'MD5',
paymentType: '1',
alipayKey: 'kcxawi9bb07mzh0aq2wcirsf9znusobw',
sellerMail: 'zfb@yoho.cn',
merchantUrl: 'http://m.yohobuy.com/home/orders/detail?order_code='
},
WxPayConfig: {
appId: 'wx75e5a7c0c88e45c2',
mchId: '1227694201',
key: '7e6f3307b64cc87c79c472814b88f7fb',
appSecret: 'ce21ae4a3f93852279175a167e54509b',
notifyUrl: 'payment/alipay_notify',
}
};
... ...
... ... @@ -19,6 +19,9 @@ module.exports = app => {
app.use('/activity', require('./apps/activity'));
app.use('/cart', require('./apps/cart'));
// 微信支付的 URL 处理
app.use('/shopping', require('./apps/cart'));
// 分期付款
app.use('/home', require('./apps/home'));
... ...
{{#cartInfo}}
<div class="chose-panel">
<div class="main">
<div class="infos {{#if ../tickets}}tickets-info{{/if}}">
<div class="basic-info" >
{{#thumbs}}
<img class="thumb {{#unless @first}}hide{{/unless}}" src={{img}}>
{{/thumbs}}
<div class="text-info">
<p class="name">{{name}}</p>
<p class="price">
<span class="sale-price{{^price}} no-price{{/price}}">{{salePrice}}</span>
{{#if price}}
<span class="market-price">{{price}}</span>
{{/if}}
</p>
</div>
</div>
<div class="chose-items">
<div class="color-list block-list">
<span>{{colorName}}</span>
{{# colors}}
<ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{# color}}
<li class="block {{#if chosed}}chosed{{/if}} {{#unless colorNum}}zero-stock{{/unless}}" data-num="{{colorNum}}">
{{name}}
</li>
{{/ color}}
</ul>
{{/ colors}}
</div>
<div class="size-list block-list {{#if ../single}}hide{{/if}}">
<span>{{sizeName}}</span>
{{# sizes}}
<ul class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{# size}}
<li class="block {{#if chosed}}chosed{{/if}} {{#unless sizeNum}}zero-stock{{/unless}}" data-num="{{sizeNum}}" data-id="{{id}}" data-skuid="{{skuId}}">
{{name}}
</li>
{{/ size}}
</ul>
{{/ sizes}}
</div>
<p>
<div class="num">
<span>数量</span>
<div class="clearfix">
<a class="btn btn-minus" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe625;</span>
</a>
<input id="good-num" class="good-num disabled" type="text" value="1" disabled="true">
<a class="btn btn-plus" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe624;</span>
</a>
</div>
<span class="left-num"></span>
<input id="left-num" type="hidden" value="0">
<input id="limitNum" type="hidden" value="{{limit}}">
</div>
</div>
</div>
<div class="btn-wrap">
<button id="chose-btn-sure" class="btn btn-sure">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</button>
</div>
</div>
</div>
{{/cartInfo}}
<input id="promotionId" type="hidden" value="{{promotionId}}">
<input id="single" type="hidden" value="{{single}}">
\ No newline at end of file
... ...
... ... @@ -91,4 +91,7 @@
{{/if}}
{{#if physical_channel}}
<input class="query-param" type="hidden" data-attr="physical_channel" value="{{physical_channel}}">
{{/if}}
\ No newline at end of file
{{/if}}
{{#if promotion_id}}
<input class="query-param" type="hidden" data-attr="promotion_id" value="{{promotion_id}}">
{{/if}}
... ...
... ... @@ -29,7 +29,13 @@
<p class="nav-title">{{.}}</p>
{{/navTitle}}
{{#suggestSub}}
<span class="nav-btn">提交</span>
<span class="nav-btn">
{{#if text}}
{{text}}
{{^}}
提交
{{/if}}
</span>
{{/suggestSub}}
{{#saleNav}}
<span class="sale-nav nav-home">
... ...
... ... @@ -43,6 +43,7 @@
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.2",
"uuid": "^2.0.3",
"xml2js": "^0.4.17",
"yoho-express-session": "^2.0.0",
"yoho-node-lib": "0.2.6",
"yoho-zookeeper": "^1.0.6"
... ...
No preview for this file type
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<metadata>
Created by FontForge 20120731 at Thu Dec 22 17:56:59 2016
By admin
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="896" descent="-128" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="0" d="" />
<glyph unicode="&#x78;" glyph-name="x" horiz-adv-x="1001" d="M281 543q-27-1-53-1h-83q-18 0-36.5-6t-32.5-18.5-23-32-9-45.5v-76h912v41q0 16-0.5 30t-0.5 18q0 13-5 29t-17 29.5-31.5 22.5-49.5 9h-133v-97h-438v97zM955 310v-52q0-23 0.5-52t0.5-58-10.5-47.5-26-30-33-16-31.5-4.5q-14-1-29.5-0.5t-29.5 0.5h-32l-45 128h-439l-44-128h-63q-20 0-45 1-25 0-41 9.5t-25.5 23-13.5 29.5-4 30v167h911zM163 247q-12 0-21-8.5t-9-21.5 9-21.5 21-8.5q13 0 22 8.5t9 21.5-9 21.5-22 8.5zM316 123q-8-26-14-48-5-19-10.5-37t-7.5-25-3-15 1-14.5 9.5-10.5 21.5-4h365q23 0 34 12t2 38q-5 13-9.5 30.5t-9.5 34.5q-5 19-11 39h-368zM336 498v228q0 11 2.5 23t10 21.5 20.5 15.5 34 6h188q31 0 51.5-14.5t20.5-52.5v-227h-327z" />
<glyph unicode="&#xe600;" glyph-name="uniE600" horiz-adv-x="1463" d="M798-64q0-46 25-58t61 16l537 420q36 28 36 68t-36 68l-537 424q-36 29-61 16.5t-25-57.5v-238q-486 0-676-290-102-157-102-361 0-49 2-49 47 62 87 104t90 78 103.5 57.5 127 36.5 161.5 21 207 6v-262z" />
<glyph unicode="&#xe601;" glyph-name="uniE601" d="M281 468q-14-9-23-23t-9-28v-490h1q5-24 24-39.5t44-15.5h582q28 0 48.5 20t20.5 49-20.5 49-48.5 20h41q35 0 59 24.5t24 58.5-24 58.5-59 24.5v0q35 0 59 24t24 58.5-24 58.5-59 24h-48q31 0 53.5 22.5t22.5 53.5v-13q0 31-22.5 54t-53.5 24q-125 6-259 9 40 148 16 278-8 44-30.5 70.5t-49.5 31-53-4-43-35-17-62.5q-5-34-6.5-64t-2.5-42-5-30.5-14-42.5q-24-60-133-115-7-2-13-6zM60 452q-25 0-42.5-17.5t-17.5-42.5v-405q0-25 17.5-42.5t42.5-17.5h134v525h-134z" />
<glyph unicode="&#xe602;" glyph-name="uniE602" horiz-adv-x="1323" d="M643 568q0-68-47.5-116t-113.5-48q0-68 47-116t113.5-48 113.5 48 47 116-47 116-113 48zM643 896q-79 0-162-28.5t-152-74.5-131-102-105-110.5-68-101.5-25-75 25-75 68-102 105-111 131-101.5 152-74.5 161.5-29 161.5 29 152 74.5 131 101.5 105 111 68 102 25 75-25 75-68 101.5-105 110.5-131 102-152 74.5-161 28.5zM643 75q-88 0-162 44t-117 120-43 165 43 164.5 117 119.5 161.5 44 161.5-44 117-119.5 43-164.5-43-165-117-120-161-44z" />
<glyph unicode="&#xe603;" glyph-name="uniE603" d="M512 382v343h85v-426h-81v-2h-256v85h252zM512-128q139 0 257 68.5t186.5 186.5 68.5 257-68.5 257-186.5 186.5-257 68.5-257-68.5-186.5-186.5-68.5-257 68.5-257 186.5-186.5 257-68.5z" />
<glyph unicode="&#xe604;" glyph-name="uniE604" d="M774 420q13-17 11.5-39.5t-17.5-38.5q0-1-1-1l-427-428q-18-17-42.5-17t-42 17.5-17.5 42 17 41.5l387 387-387 387q-17 17-17 41.5t17.5 42 42 17.5 42.5-17l427-428q1 0 1-1z" />
<glyph unicode="&#xe605;" glyph-name="uniE605" d="M707 844q-112 0-195-77-83 77-195 77-121 0-207-88t-86-212q0-110 69-194l2-2 344-391q30-33 73-33t73 33l346 393q69 84 69 194 0 124-86 212t-207 88z" />
<glyph unicode="&#xe606;" glyph-name="uniE606" horiz-adv-x="1000" d="M109.5 511q37.5 0 64-26.5t26.5-63.5-26.5-63.5-64-26.5-64 26.5-26.5 63.5 26.5 63.5 64 26.5zM515.5 511q37.5 0 63.5-26.5t26-63.5-26-63.5-63.5-26.5-64 26.5-26.5 63.5 26.5 63.5 64 26.5zM921 511q37 0 63.5-26.5t26.5-63.5-26.5-63.5-63.5-26.5-63.5 26.5-26.5 63.5 26.5 63.5 63.5 26.5z" />
<glyph unicode="&#xe607;" glyph-name="uniE607" horiz-adv-x="1643" d="M547 286h-1l45-46 248 239-45 46-201-194-195 201-46-44z" />
<glyph unicode="&#xe608;" glyph-name="uniE608" horiz-adv-x="1821" d="M930 231q-14-13-33.5-13t-33.5 13l-252 242q-14 13-14 32t14 32 34 13 34-13l251-242q14-13 14-32t-14-32zM360 231q-14 13-14 32t14 32l251 242q14 13 34 13t33.5-13 13.5-32-13-32l-252-242q-14-13-33.5-13t-33.5 13z" />
<glyph unicode="&#xe609;" glyph-name="uniE609" horiz-adv-x="1821" d="M930 473l-251-242q-14-13-34-13t-34 13-14 32 14 32l252 242q14 13 33.5 13t33.5-13 14-32-14-32zM427 537l252-242q13-13 13-32t-13.5-32-33.5-13-34 13l-251 242q-14 13-14 32t14 32 33.5 13 33.5-13z" />
<glyph unicode="&#xe60a;" glyph-name="uniE60A" d="M1024 384q0-139-68.5-257t-186.5-186.5-257-68.5-257 68.5-186.5 186.5-68.5 257 68.5 257 186.5 186.5 257 68.5 257-68.5 186.5-186.5 68.5-257zM801 594l-365-366-156 156-37-37 193-193 403 403z" />
<glyph unicode="&#xe60b;" glyph-name="uniE60B" horiz-adv-x="1344" d="M1280 320h-1216q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5h1216q27 0 45.5-18.5t18.5-45.5-18.5-45.5-45.5-18.5zM1280-128h-1216q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5h1216q27 0 45.5-18.5t18.5-45.5-18.5-45.5-45.5-18.5zM1280 768h-1216q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5h1216q27 0 45.5-18.5t18.5-45.5-18.5-45.5-45.5-18.5z" />
<glyph unicode="&#xe60c;" glyph-name="uniE60C" d="M1024 384q0-139-68.5-257t-186.5-186.5-257-68.5-257 68.5-186.5 186.5-68.5 257 68.5 257 186.5 186.5 257 68.5 257-68.5 186.5-186.5 68.5-257z" />
<glyph unicode="&#xe60d;" glyph-name="uniE60D" horiz-adv-x="1685" d="M1229 7l289-135 58 124-281 131q-21-54-66-120zM944 559v-134h137v258q42 47 62 81l-118 69q-2-4-8-12t-24.5-30.5-41-45.5-60.5-54.5-81-59.5l75-114q30 20 59 42zM1524 103v304h-605v-304h137v167h332v-167h136zM1283 253h-137v-66q0-31-20-57.5t-49.5-45-70.5-34.5-76.5-25-73.5-17l74-124q55 14 103 30.5t95.5 43 80.5 58 53.5 75.5 20.5 96v66zM1088 654l31-133q42 9 85 21 19-49 59-78 49-36 120-36 45 0 92 14 69 21 133 78l-67 125q-17-19-46-40.5t-60-31.5q-63-19-91 1-4 3-8 9 147 51 240 103l-81 111q-74-38-173-74v85h-137v-129q-50-14-97-25zM755 561v137h-348q11 42 19 84l-134 26q-11-56-28-110h-200v-137h142q-79-149-206-260l90-103q43 38 85 83v-389h137v165h260v-24h-124l48-137h83q54 0 92 38t38 92v490h-373q11 22 21 45h398zM312 218h260v-24h-260v24zM312 379h260v-24h-260v24zM1683 816q0-33-22.5-56t-55.5-23-56 23-23 56 23 55.5 56 22.5 55.5-22.5 22.5-55.5zM1545 816q0-26 17.5-44.5t42.5-18.5 41.5 18 16.5 44q0 27-16.5 45.5t-42.5 18.5q-25 0-42-18.5t-17-44.5zM1592 775h-17v79q17 2 29 2 18 0 26-6t8-17q0-13-16-19v-1q10-3 14-19 2-13 6-19h-19q-2 3-6 19-2 12-16 12h-9v-31zM1593 819h8q18 0 18 12t-16 12q-6 0-10-1v-23z" />
<glyph unicode="&#xe60e;" glyph-name="uniE60E" horiz-adv-x="3958" d="M611 723h-177l-150-222-95 222h-178l168-395v-2l-31-243h156l30 231zM699 565q-100 0-179.5-72.5t-92.5-175.5q-13-105 51-178 61-68 157-68 99 0 178.5 72.5t92.5 175.5q13 104-51 177-60 69-156 69zM759 317q-5-41-35.5-70.5t-68.5-29.5q-37 0-60 27-27 30-21 75 5 41 36 70.5t69 29.5q36 0 59-27 27-30 21-75zM1656 565q-100 0-179.5-72.5t-92.5-175.5q-13-105 51-178 61-68 157-68 99 0 178.5 72.5t92.5 175.5q13 104-51 177-60 69-156 69zM1717 317q-6-41-36.5-70.5t-68.5-29.5q-37 0-60 27-27 30-21 75 5 41 36 70.5t69 29.5q36 0 60-27 26-30 21-75zM1332 502q-44 50-114 50-51 0-97-27l-10-6 26 204h-156l-80-640h155l37 288q3 24 22 41t43 17q25 0 40.5-17.5t11.5-41.5l-36-287h156l37 298q10 71-35 121zM2949 544l-37-288q-3-24-22-41t-44-17q-24 0-39.5 17.5t-12.5 41.5l37 287h-156l-38-298q-9-71 36-121 43-50 114-50 51 0 97 27l9 6-3-25h156l58 461h-155zM1951 723l-55-432h156l55 432h-156zM1970 252q-37 0-67-26.5t-34.5-63.5 18.5-63q22-26 59-26t67 26.5 34 63.5q5 37-18 63t-59 26zM2608 262q6 51-14.5 93.5t-62.5 65.5l-8 5 8 5q39 21 64 57t30 78q8 63-30 108-37 44-97 48l-6 1h-314l-81-640h317q72 3 128.5 55t65.5 124zM2451 284q-3-27-25-46.5t-50-19.5h-106l17 134h107q27-1 43.5-20.5t13.5-47.5zM2483 531q-3-25-23-43t-45-18h-113l15 124h112q25 0 41.5-18.5t12.5-44.5zM3132-127q65 0 124 37.5t89 99.5l264 534h-156l-127-258-63 258h-156l113-471-7-14q-8-18-25-29t-36-11q-10 0-20 4l-29 11-67-139 29-10q31-12 67-12zM3943 730q0-65-45-110.5t-110.5-45.5-111 45.5-45.5 111 45.5 110.5 111.5 45q65 0 110-45t45-111zM3670 730q0-52 34-88t84-36q49-1 82.5 35.5t33.5 87.5q0 53-33.5 89.5t-84.5 36.5q-49 0-82.5-36.5t-33.5-88.5zM3763 650h-35v155q35 5 58 5 36 0 52-12t16-34q0-26-32-37v-2q20-6 27-37 5-26 11-38h-37q-4 5-12 38-4 23-31 23h-17v-61zM3764 737h17q35 0 35 23t-32 23q-13 0-20-1v-45z" />
<glyph unicode="&#xe60f;" glyph-name="uniE60F" d="M682 158q-108-89-249-89-107 0-197.5 53t-143.5 143.5-53 197.5 53 197.5 143.5 143.5 197.5 53 197.5-53 143.5-143.5 53-197.5q0-141-89-249l286-286-56-56zM433.5 148q130.5 0 222.5 92t92 222.5-92 223-222.5 92.5-223-92.5-92.5-223 92.5-222.5 223-92z" />
<glyph unicode="&#xe610;" glyph-name="uniE610" d="M245 384l-9 9 472 472 80-80-400-401 400-401-80-80-472 472z" />
<glyph unicode="&#xe611;" glyph-name="uniE611" d="M509 876q-4-2-245-245-176-179-208.5-213.5t-32.5-46.5q0-35 42-33 7 0 233 227l225 228 226-228q225-227 232-227 21-1 31.5 7.5t10.5 25.5q0 12-31.5 46t-206.5 212q-241 243-246 246-15 8-30 1zM171 341q-12-8-14-38.5t-2-188 2-188 14-38.5q7-6 352.5-6t352.5 6q11 8 13 38.5t2 188-2 188-13 38.5q-8 7-21.5 5.5t-21.5-10.5l-10-9v-381h-600v381l-10 9q-8 9-21 10.5t-21-5.5zM398 298l-11-12v-215l11-12q10-13 25.5-13t25.5 13l10 12v175h128v-175l11-12q11-13 25.5-13t25.5 13l10 12v215l-20 24h-231z" />
<glyph unicode="&#xe612;" glyph-name="uniE612" d="M951 77h-878l439 614z" />
<glyph unicode="&#xe613;" glyph-name="uniE613" d="M512 77l-439 614h878z" />
<glyph unicode="&#xe614;" glyph-name="uniE614" d="M313 35l349 349-349 349q-7 7-7 16.5t6.5 16 16 6.5 16.5-6l345-345q16-15 21-20 7-7 7-17t-7-17q-44-44-48-47l-318-318q-7-6-16.5-6t-16 6.5-6.5 16 7 16.5z" />
<glyph unicode="&#xe615;" glyph-name="uniE615" d="M527 559q8 0 14-6l293-288q6-6 6.5-14.5t-5.5-14.5-14.5-6-14.5 6l-279 273-278-273q-7-6-15-6t-14 6-6 14.5 6 14.5l293 288q6 6 14 6z" />
<glyph unicode="&#xe616;" glyph-name="uniE616" d="M527.5 230q-8.5 0-14.5 6l-293 288q-6 6-6 14t6 14.5 14 6.5 15-6l278-274 279 274q6 6 14.5 6t14.5-6.5 5.5-14.5-6.5-14l-293-288q-5-6-13.5-6z" />
<glyph unicode="&#xe617;" glyph-name="uniE617" horiz-adv-x="1030" d="M520 866q-98 0-187.5-38t-154-102.5-102.5-154-38-187.5 38-187.5 102.5-154 154-102.5 187.5-38 187.5 38 154 102.5 102.5 154 38 187.5-38 187.5-102.5 154-154 102.5-187.5 38zM857 581l-339-451-328 238q-12 9-14 23.5t6.5 26.5 23 14 26.5-6l271-198 297 396q9 12 23.5 14t26.5-7 14-23.5-7-26.5z" />
<glyph unicode="&#xe618;" glyph-name="uniE618" d="M224 288q-40 0-68 28t-28 68 28 68 68 28 68-28 28-68-28-68-68-28zM512 288q-40 0-68 28t-28 68 28 68 68 28 68-28 28-68-28-68-68-28zM800 288q-40 0-68 28t-28 68 28 68 68 28 68-28 28-68-28-68-68-28z" />
<glyph unicode="&#xe619;" glyph-name="uniE619" d="M125.5 309q30.5 0 51 21.5t20.5 52.5q0 33-20.5 54.5t-51 21.5-51.5-21.5-21-54.5q0-31 21-52.5t51.5-21.5zM512.5 309q30.5 0 51 21.5t20.5 52.5q0 33-20.5 54.5t-51 21.5-51.5-21.5-21-54.5q0-31 21-52.5t51.5-21.5zM899.5 309q30.5 0 51 21.5t20.5 52.5q0 33-20.5 54.5t-51 21.5-51.5-21.5-21-54.5q0-31 21-52.5t51.5-21.5z" />
<glyph unicode="&#xe61a;" glyph-name="uniE61A" d="M512-62q-91 0-173.5 35.5t-142 95-95 142-35.5 173.5 35.5 173.5 95 142 142 95 173.5 35.5 173.5-35.5 142-95 95-142 35.5-173.5-35.5-173.5-95-142-142-95-173.5-35.5zM512 766q-104 0-192-51t-139-139-51-192 51-192 139-139 192-51 192 51 139 139 51 192-51 192-139 139-192 51zM464 592q0 20 14 34t34 14 34-14 14-34-14-34-34-14-34 14-14 34zM512 128q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5 22.5-9.5 9.5-22.5v-288q0-13-9.5-22.5t-22.5-9.5z" />
<glyph unicode="&#xe61b;" glyph-name="uniE61B" d="M437 137h-193q-27 2-41.5 22.5t-17.5 45.5q3 25 17.5 41t41.5 18h193v63l-193 1q-27 2-41.5 19t-17.5 43q3 25 17.5 41t41.5 18h144l-134 236q-10 12-19 30.5t-8 40.5q5 28 20 45.5t56 22.5q24-2 43-16.5t31-31.5l152-278 167 280q12 17 31 30t43 16q15-1 27.5-4t22-10 16-20 9.5-34q0-29-20-55l-155-252h147q26-2 41-18t17-41q-2-26-17.5-44t-41.5-20l-191-1v-61h192q26-2 41-20t17-43q-2-26-17-43.5t-41-19.5l-192 1v-106q-4-85-93-85-44 0-68.5 21t-26.5 64v104z" />
<glyph unicode="&#xe61c;" glyph-name="uniE61C" d="M946-112h-868q-26 0-44 18t-18 44v868q0 26 18 44t44 18h868q26 0 44-18t18-44v-868q0-26-18-44t-44-18zM946 787q0 13-9 22t-22 9h-806q-13 0-22-9t-9-22v-806q0-13 9-22t22-9h806q13 0 22 9t9 22v806z" />
<glyph unicode="&#xe61d;" glyph-name="uniE61D" d="M939-106h-876q-26 0-44.5 18.5t-18.5 44.5v876q0 26 18.5 44.5t44.5 18.5h876q26 0 44.5-18.5t18.5-44.5v-876q0-26-18.5-44.5t-44.5-18.5zM814 708l-376-438-250 188-63-126 313-250 439 501z" />
<glyph unicode="&#xe61e;" glyph-name="uniE61E" d="M224 307l416 410 179-179-416-410zM659 621l-19 19-333-333 19-19zM698 582l-20 20-332-333 19-19zM736 544l-19 19-333-333 19-19zM717 800q14 14 38 14t39-14l102-102q14-15 14-39t-14-38l-64-58-173 173zM211 282l167-167-148-51-70 70zM205 51l-83-32 32 83z" />
<glyph unicode="&#xe61f;" glyph-name="uniE61F" d="M512 896q-138 0-256-69t-187-187-69-256 69-256 187-187 256-69 256 69 187 187 69 256-69 256-187 187-256 69zM563 128h-102v307h102v-307zM563 538h-102v102h102v-102z" />
<glyph unicode="&#xe620;" glyph-name="uniE620" d="M938 372h-400v274h-50v-274h-399q-31 0-53 21.5t-22 52.5v175q0 31 22 53t53 22h90q-40 47-40 100 0 27 10 47.5t25 30 29.5 15 24.5 6.5l11 1q53 0 100-15.5t81-42 56-50 39-50.5q17 27 39.5 51t56 50 79.5 41.5 98 15.5q4 0 11-1t24-7 30-15.5 24-30.5 11-49q0-51-35-97h85q31 0 53-22t22-53v-175q0-31-22-52.5t-53-21.5zM264 821q-15 0-26-2.5t-15.5-6-6.5-7.5-2-6v-3q0-49 66-100h173q-14 30-30 52.5t-34 35.5-33 21-34.5 11.5-30 4-27.5 0.5zM763 819q-17 0-27.5-1t-29.5-4-33.5-11-32-20.5-33.5-34.5-30-52h177q59 50 59 97 2 0 0 6.5t-14 13-36 6.5zM488-128h-349q-31 0-53 22t-22 53v375h424v-450zM538 322h400v-375q0-31-22-53t-53-22h-325v450z" />
<glyph unicode="&#xe621;" glyph-name="uniE621" d="M160 576v-640q0-26 19-45t45-19h576q26 0 45 19t19 45v640h-704zM352 0h-64v448h64v-448zM480 0h-64v448h64v-448zM608 0h-64v448h64v-448zM736 0h-64v448h64v-448zM880 768h-208v80q0 20-14 34t-34 14h-224q-20 0-34-14t-14-34v-80h-208q-20 0-34-14t-14-34v-80h832v80q0 20-14 34t-34 14zM608 768h-192v63h192v-63z" />
<glyph unicode="&#xe622;" glyph-name="uniE622" horiz-adv-x="1173" d="M586 672q-28 65-69 113t-86.5 73.5-96 34-97.5-2-90-39.5-75.5-73-51.5-107.5-20-138.5q0-41 9-78.5t24-66.5 39-57.5 47-48.5 55.5-43 56.5-38 58.5-35.5 53.5-33.5q93-61 162-138.5t82-120.5q10 39 81.5 118.5t160.5 142.5q24 17 71.5 47t79 50.5 71.5 54.5 64 67 41 81 16 102q0 75-19.5 138t-52.5 105.5-76.5 70.5-91 37.5-98 1-96-34.5-85.5-72.5-67-108.5z" />
<glyph unicode="&#xe623;" glyph-name="uniE623" d="M835 660l-60 63-263-275-263 275-60-63 262-276-262-276 60-63 263 275 263-275 60 63-262 276z" />
<glyph unicode="&#xe624;" glyph-name="uniE624" horiz-adv-x="1000" d="M459 850h109v-382h382v-109h-382v-381h-109v381h-381q-1 37-1 109h382v382z" />
<glyph unicode="&#xe625;" glyph-name="uniE625" horiz-adv-x="1000" d="M77 468h873v-109h-873v109z" />
<glyph unicode="&#xe626;" glyph-name="uniE626" d="M866.5 747.5q-97.5 97.5-228 132t-261.5 0-228.5-132-132-228.5 0-261.5 132-228 228.5-132 261.5 0 228 132 132 228 0 261.5-132 228.5zM798 199l-101-101-187 186-186-186-101 101 186 186-186 187 101 101 186-186 187 186 101-101-186-187z" />
<glyph unicode="&#xe627;" glyph-name="uniE627" d="M741 342q-23 9-22 34 6 114-8 186-13 68-37.5 125.5t-48 89.5-50.5 57-38 32-18 10l-7 3-7-3q-7-3-18-10t-38-32-50.5-57-48-89.5-37.5-125.5q-14-72-8-186 1-25-22-34-25-11-47.5-26t-47-40.5-39-65-14.5-87.5v-16h198q2-22 17.5-36.5t37.5-14.5h248q22 0 37.5 14.5t17.5 36.5h198v16q0 48-14.5 87.5t-39 65-47 40.5-47.5 26zM512 526q-31 0-53 22t-22 53 22 53 53 22 53-22 22-53-22-53-53-22zM453 23q-14 0-23.5-10t-9.5-24v-83q0-14 9.5-24t23.5-10 24 10 10 24v83q0 14-10 24t-24 10zM571 23q-14 0-24-10t-10-24v-83q0-14 10-24t24-10 23.5 10 9.5 24v83q0 14-9.5 24t-23.5 10z" />
<glyph unicode="&#xe628;" glyph-name="uniE628" d="M505 860q95 0 182-37t150-100 100.5-150 37.5-182-37.5-182-100.5-150-150-100.5-182-37.5-182 37.5-150 100.5-100 150-37 182 37 182 100 150 150 100 182 37zM505-20q112 0 206.5 55t149.5 149.5 55 206-55 206-149.5 149.5-206 55-206-55-149.5-149.5-55-206 55-206 149.5-149.5 205.5-55zM528 222v-59h-58v59h58zM470 648h58v-349h-58v349z" />
<glyph unicode="&#xe629;" glyph-name="uniE629" d="M512 893v0q-58 0-112.5-12t-105.5-38-80.5-44-77.5-51v-450q0-57 19.5-110.5t49-93.5 69-76 75.5-59.5 73.5-43 57-28 32.5-12.5q13 4 32.5 12.5t57 28 73.5 43 75.5 59.5 69 76 49 93.5 19.5 110.5v450q-48 33-77.5 51t-80.5 44-105.5 38-112.5 12zM808 298q0-76-36.5-138t-112.5-117q-73-53-147-82-74 29-147 82-76 55-112.5 117t-36.5 138v421q87 53 146.5 75t149.5 23q90-1 149.5-23t146.5-75v-421zM512 755q-67 0-112.5-12.5t-119.5-49.5v-399q0-35 12.5-68.5t30-57.5 44-46 47-35.5 46-26 34-16 18.5-6.5q10 3 18.5 6.5t34 16 46 26 47 35.5 44 46 30 57.5 12.5 68.5v399q-74 37-119.5 49.5t-112.5 12.5v0zM667 599v-47h-105v-67h92v-61h-92v-77h116v-57h-332v57h42v168h64v-168h46v205h-138v61h307v-14z" />
<glyph unicode="&#xe62a;" glyph-name="uniE62A" d="M497 890l-451-386q-20-18-20-45v-500q0-32 22.5-54.5t53.5-22.5h256v333h308v-333h256q31 0 53.5 22.5t22.5 54.5v500q0 27-20 45l-451 386q-15 13-30 0z" />
<glyph unicode="&#xe62b;" glyph-name="uniE62B" d="M761 623q0-104-73-177t-176.5-73-177 73-73.5 177 73.5 177 177 73 176.5-73 73-177zM888-80q11 22 9 48-7 99-60 181.5t-139 130-186.5 47.5-187-47.5-139.5-130-60-181.5q-1-26 10-48 12-25 40-25h673q27 0 40 25z" />
<glyph unicode="&#xe62c;" glyph-name="uniE62C" horiz-adv-x="1048" d="M832-42.5q0-35.5-25-60.5t-60.5-25-60.5 25-25 60.5 25 60.5 60.5 25 60.5-25 25-60.5zM533-42.5q0-35.5-25-60.5t-60-25-60 25-25 60.5 25 60.5 60 25 60-25 25-60.5zM277 704l-35 159q-3 14-15 23.5t-27 9.5h-147q-22 0-37.5-15.5t-15.5-37.5 15.5-38 37.5-16h54l157-627q6-25 25.5-40t44.5-15h527q25 0 44.5 15t25.5 40l113 452q9 34-13 62t-57 28h-697z" />
<glyph unicode="&#xe62d;" glyph-name="uniE62D" d="M442 358h-84v-76h-230v76h-81q-20 0-33.5-12.5t-13.5-31.5v-395q0-20 13.5-33.5t33.5-13.5h395q19 0 31.5 13.5t12.5 33.5v395q0 19-12.5 31.5t-31.5 12.5zM977 896h-81v-77h-230v77h-84q-19 0-31.5-13.5t-12.5-33.5v-395q0-19 12.5-31.5t31.5-12.5h395q20 0 33.5 12.5t13.5 31.5v395q0 20-13.5 33.5t-33.5 13.5zM977 358h-81v-76h-230v76h-84q-19 0-31.5-12.5t-12.5-31.5v-395q0-20 12.5-33.5t31.5-13.5h395q20 0 33.5 13.5t13.5 33.5v395q0 19-13.5 31.5t-33.5 12.5z" />
<glyph unicode="&#xe62e;" glyph-name="uniE62E" horiz-adv-x="1639" d="M1 867h1045v-625h-1045v625zM1424 867h-337v-625l61-33q33 14 70 14 66 0 116-42t61-105l7-4h205v398zM1178 495v290h164l121-290h-285zM235 209h-235v-163h111q2 57 36.5 101.5t87.5 61.5zM452 38q0 66-47 112.5t-113.5 46.5-114-46.5-47.5-112.5 47.5-112.5 114-46.5 113.5 46.5 47 112.5zM1067 209h-721q54-17 88.5-61.5t36.5-101.5h570q0 50 26 92v71zM1380 40q0 66-47 112.5t-113.5 46.5-113.5-46.5-47-112.5 47-112.5 113.5-46.5 113.5 46.5 47 112.5z" />
<glyph unicode="&#xe62f;" glyph-name="uniE62F" d="M474 112v161h-167v50h167v74h-167v49h134l-168 265h87l152-257v386q-35 0-70.5 2t-64 6-55 8.5-46.5 8.5-34.5 8-22.5 6-7 2q-2-43-16.5-74t-34-44-38.5-20-33-7h-13q0-40 1.5-78t3.5-69 5.5-59.5 7-51 6.5-41.5 6.5-32.5 5.5-23 3-13.5l2-5q15-61 45-120.5t65.5-105.5 75-87 76.5-70.5 67-50.5 47.5-32 17.5-10v225h-38zM550 112v161h167v50h-167v74h167v49h-134l168 265h-87l-152-257v386q76 0 151 10.5t112 20.5l37 10q2-43 16.5-74t34-44 38.5-20 33-7h13q0-234-40-368l-1-5q-15-61-44.5-120.5t-65.5-105.5-75.5-87-76.5-70.5-66.5-50.5-47.5-32-18-10v225h38z" />
<glyph unicode="&#xe630;" glyph-name="uniE630" d="M629 25h-268v20q0 31-21.5 53t-52.5 22-52.5-22-21.5-53v-20h-174v609h590v-609zM400 66h188v527h-508v-527h94q7 41 39 68t74 27 74-27 39-68zM989 25h-136v20q0 31-21.5 53t-52.5 22-52.5-22-21.5-53v-20h-117v476h210q22 0 57-34 27-26 58-67 31-40 52-75 24-41 24-62v-238zM892 66h56v197q0 9-18 40t-46 68-53 63q-23 23-34 26h-168v-394h37q7 41 39 68t74 27 74-27 39-68zM989 233h-287v193h191l6-8q35-43 61-84 29-48 29-71v-30zM743 274h202q-6 15-21 39-21 34-50 72h-131v-111zM779.5-70q-47.5 0-81.5 34t-34 81.5 34 81.5 81.5 34 81-34 33.5-81.5-33.5-81.5-81-34zM779 120q-31 0-52.5-22t-21.5-52.5 21.5-52.5 52.5-22 52.5 22 21.5 52.5-21.5 52.5-52.5 22zM287-70q-48 0-81.5 34t-33.5 81.5 33.5 81.5 81.5 34 81.5-34 33.5-81.5-33.5-81.5-81.5-34zM287 120q-31 0-52.5-22t-21.5-52.5 21.5-52.5 52.5-22 52.5 22 21.5 52.5-21.5 52.5-52.5 22z" />
<glyph unicode="&#xe631;" glyph-name="uniE631" d="M24 895v0zM47 895v0zM70 895v0zM94 895v0zM117 895v0zM140 895v0zM163 895v0zM187 895v0zM210 895v0zM233 895v0zM256 895v0zM280 895v0zM303 895v0zM326 895v0zM349 895v0zM373 895v0zM396 895v0zM419 895v0zM442 895v0zM466 895v0zM489 895v0zM512 895v0zM535 895v0zM558 895v0zM582 895v0zM605 895v0zM628 895v0zM651 895v0zM675 895v0zM698 895v0zM721 895v0zM744 895v0zM768 895v0zM791 895v0zM814 895v0zM837 895v0zM861 895v0zM884 895v0zM907 895v0zM930 895v0zM954 895v0zM977 895v0zM1000 895v0zM1 872v0zM1 849v0zM1 826v0zM1 802v0zM1 779v0zM1 756v0zM1 733v0zM1 709v0zM1 686v0zM1 663v0zM1 640v0zM1 616v0zM1 593v0zM1 570v0zM1 547v0zM1 523v0zM1 500v0zM1 477v0zM1 454v0zM1 430v0zM1 407v0zM1 384v0zM1 361v0zM1 338v0zM1 314v0zM1 291v0zM1 268v0zM1 245v0zM1 221v0zM1 198v0zM1 175v0zM1 152v0zM1 128v0zM1 105v0zM1 82v0zM1 59v0zM1 35v0zM1 12v0zM1-11v0zM1-34v0zM1-58v0zM1-81v0zM1-104v0zM512-127q-7 8-18.5 22t-45.5 59-64.5 91-68 113.5-64.5 131.5-45.5 139-18.5 141q0 52 11 96.5t30 75.5 43 56.5 51 41 54 27 51.5 17 43.5 8.5 30 3h11q7 0 18.5-0.5t45.5-7 64.5-17.5 68-35.5 64.5-57.5 45.5-87 18.5-120q0-237-215-552-60-88-110-145zM740 613q-16 85-86 140-1 1-4 3.5t-5 3.5q-5 4-22 13t-19 10q-1 0-20 7-21 7-24 7-24 5-48 5v0q-24 0-47-5-44-8-82-34h-1q-12-9-27-23-2-1-5-4l-3-3q-4-4-16-19.5t-13-16.5q-2-3-4.5-7.5t-3.5-5.5q-10-19-13-27-1-2-2-6t-2-5q-7-21-9-32-4-22-4-44 0-65 23.5-146.5t58-151.5 68.5-129.5 58-95.5 24-35q9 13 25 36.5t56 92 70.5 133.5 55.5 148 25 148q0 22-4 43zM373 570q0 58 40.5 98.5t98.5 40.5 98.5-40.5 40.5-98.5-40.5-99-98.5-41-98.5 41-40.5 99z" />
<glyph unicode="&#xe632;" glyph-name="uniE632" d="M313 247h397v69h-397v-69zM313 110h397v68h-397v-68zM611 831h-430q-14 0-23.5-10t-9.5-24v-825q0-14 9.5-24t23.5-10h661q14 0 24 10t10 24v619zM644 710l131-119h-131v119zM809 7h-595v755h364v-206q0-14 9.5-24t23.5-10h198v-515zM313 384h397v69h-397v-69z" />
<glyph unicode="&#xe633;" glyph-name="uniE633" horiz-adv-x="1304" d="M1303 538l-161 242h-304v-443h233q19 0 32.5 14t13.5 33-13.5 33-32.5 14h-140v256h161l118-177v-242h-442v577q0 21-15 36t-36 15h-666q-21 0-36-15t-15-36v-620q0-21 15-35.5t36-14.5h142q-30-49-30-105 0-82 58-140t140-58 140 58 58 140q0 56-31 105h363q-30-49-30-105 0-82 58-140t140-58 140 58 58 140q0 56-31 105h77v363zM93 803h582v-535h-582v535zM465 70q0-43-30.5-74t-74-31-74 31-30.5 74 30.5 74 74 31 74-31 30.5-74zM1164 70q0-43-31-74t-74-31-74 31-31 74 31 74 74 31 74-31 31-74z" />
<glyph unicode="&#xe634;" glyph-name="uniE634" horiz-adv-x="1476" d="M1403 896h-1331q-30 0-51-21t-21-51v-880q0-30 21-51t51-21h1331q30 0 51.5 21t21.5 51v880q0 30-21.5 51t-51.5 21zM120 776h1235v-151h-1235v151zM120 414h1235v-422h-1235v422zM211 294h572v-61h-572v61zM211 173h331v-60h-331v60z" />
<glyph unicode="&#xe635;" glyph-name="uniE635" d="M512 881q-102 0-194.5-39.5t-160-106.5-107-160-39.5-194.5 39.5-194.5 107-160 160-107 194.5-40 194.5 40 160 107 107 160 39.5 194.5-39.5 194.5-107 160-160 106.5-194.5 39.5zM512-34q-112 0-207.5 55.5t-151 151-55.5 208 55.5 207.5 151 150.5 207.5 55.5 207.5-55.5 151-150.5 55.5-207.5-55.5-208-151-151-207.5-55.5zM512 555q25 0 43-18t18-44h87q0 50-29 89t-75 53v50q0 9-6.5 15.5t-15.5 6.5h-44q-9 0-15.5-6.5t-6.5-15.5v-50q-46-14-75-53t-29-89q0-104 133-154 27-9 44-20t23-22 7.5-16.5 1.5-13.5q0-25-18-43t-43-18-43 18-18 43h-87q0-49 29-88t75-54v-50q0-9 6.5-15t15.5-6h44q9 0 15.5 6t6.5 15v50q46 15 75 54t29 88q0 105-133 154-27 10-44 21t-23 22-7.5 16.5-1.5 12.5q0 26 18 44t43 18z" />
<glyph unicode="&#xe636;" glyph-name="uniE636" d="M947 759h-892q-23 0-39-16t-16-38v-642q0-23 16-39t39-16h892q22 0 38 16t16 39v642q0 22-16 38t-38 16zM836 668l-335-260-336 260h671zM91 100v511l376-293q15-11 33.5-11t33.5 11l376 293v-511h-819z" />
<glyph unicode="&#xe637;" glyph-name="uniE637" d="M512 656q-63 0-107.5-44.5t-44.5-107.5 44.5-107.5 107.5-44.5 107.5 44.5 44.5 107.5-44.5 107.5-107.5 44.5zM512 880q-102 0-188.5-50.5t-136.5-137-50-188.5q0-56 36-137.5t81-151 104-146.5 85-107 44-50l25-28 25 28q18 20 44 50t85 107 104 146.5 81 151 36 137.5q0 102-50 188.5t-136.5 137-188.5 50.5zM512-13q-46 54-93.5 115.5t-98.5 137-83 147-32 117.5q0 127 90 217t217 90 217-90 90-217q0-46-32-117.5t-83-147-98.5-137-93.5-115.5z" />
<glyph unicode="&#xe638;" glyph-name="uniE638" horiz-adv-x="1335" d="M1273-4h-1179q-26 0-44-18t-18-44 18-44 44-18h1179q26 0 44 18t18 44-18 44-44 18zM841 741h429q27 0 46 18t19 44-19 44-46 18h-429q-27 0-46-18t-19-44 19-44 46-18zM841 314h429q27 0 46 18t19 44-19 44-46 18h-429q-27 0-46-18t-19-44 19-44 46-18zM85 314h434q26 0 44 18t18 44v435q0 25-18 43.5t-44 18.5h-434q-26 0-44-18.5t-18-43.5v-435q0-25 18-43.5t44-18.5zM147 749h310v-311h-310v311z" />
<glyph unicode="&#xe639;" glyph-name="uniE639" d="M507 895q-101 0-194-40t-160-107-107-160-40-194.5 40-194.5 107-160 160-107 194.5-40 194.5 40 160 107 107 160 40 194.5-40 194.5-107 160-160 107-195 40zM507-20q-112 0-207.5 55.5t-150.5 150.5-55 207.5 55 208 150.5 151 208 55.5 207.5-55.5 150.5-151 55.5-208-55.5-207.5-150.5-150.5-208-55.5zM506 689h-2q-67 0-115-47-48-48-48-116 0-18 12.5-31t30.5-13 31 13 13 31q0 32 22 54 22 21 55 22 30-1 52.5-23t22.5-52q1-24-12-43t-34-29q-34-14-54-44.5t-20-68.5v-36q0-18 13-30.5t31-12.5 31 12.5 13 30.5v36q0 24 20 33 46 20 73 61.5t26 91.5q-1 66-48 113t-113 48zM504 219q-23 0-39-16t-16-38.5 16-38.5 39-16 38.5 16 15.5 38.5-15.5 38.5-38.5 16z" />
<glyph unicode="&#xe63a;" glyph-name="uniE63A" d="M964 460q21 1 35 16t14 36v147q0 21-15.5 36.5t-36.5 15.5h-898q-21 0-36.5-15.5t-15.5-36.5v-147q0-21 14-36t35-16q29-2 49.5-24t20.5-52-20.5-52-49.5-24q-21-1-35-16t-14-36v-147q0-21 15.5-36.5t36.5-15.5h898q21 0 36.5 15.5t15.5 36.5v147q0 21-14 36t-35 16q-29 2-49.5 24t-20.5 52 20.5 52 49.5 24zM926 227v-83h-828v83q52 15 85.5 58.5t33.5 98.5-33.5 98.5-85.5 58.5v83h283v-66h66v66h479v-83q-52-15-85.5-58.5t-33.5-98.5 33.5-98.5 85.5-58.5zM381 362h66v-109h-66v109zM381 515h66v-109h-66v109zM381 210h66v-66h-66v66z" />
<glyph unicode="&#xe63b;" glyph-name="uniE63B" horiz-adv-x="1199" d="M1149 896h-1099q-21 0-35.5-14.5t-14.5-35.5v-350q0-20 14.5-35t35.5-15h1099q21 0 35.5 15t14.5 35v350q0 21-14.5 35.5t-35.5 14.5zM100 796h999v-250h-999v250zM1024 396q-21 0-35.5-14.5t-14.5-34.5v-375h-749v375q0 20-14.5 34.5t-35.5 14.5-35.5-14.5-14.5-34.5v-425q0-21 14.5-35.5t35.5-14.5h849q21 0 35.5 14.5t14.5 35.5v425q0 20-14.5 34.5t-35.5 14.5zM325 396q-21 0-35.5-14.5t-14.5-34.5v-200q0-21 14.5-35.5t35.5-14.5h549q21 0 35.5 14.5t14.5 35.5v200q0 20-14.5 34.5t-35.5 14.5-35.5-14.5-14.5-34.5v-150h-449v150q0 20-15 34.5t-35 14.5z" />
<glyph unicode="&#xe63c;" glyph-name="uniE63C" horiz-adv-x="1048" d="M297.5 521q-20.5 0-35-14.5t-14.5-35.5 14.5-35.5 35-14.5 35.5 14.5 15 35.5-15 35.5-35.5 14.5zM953 29q95 93 95 215t-94 214q2 20 2 23 0 111-64 205t-174.5 148.5-240 54.5-239.5-54.5-174-148.5-64-205q0-78 33-148.5t93-125.5l-77-123q-8-12-6.5-26t10.5-25q13-15 32-15 9 0 18 4l180 80q4 2 7 4 20-7 39-12 48-80 138.5-128t199.5-48q75 0 145 25 1-1 2-1l140-62q8-4 17-4 20 0 32 15 10 10 11 24t-7 26zM286 244q0-17 2-35v1q-88 42-140.5 114t-52.5 157 51.5 157 139.5 114 192 42q142 0 249.5-76.5t128.5-189.5q-88 43-189 43-104 0-191.5-43.5t-138.5-119-51-164.5zM381 244q0 96 84 164t202 68 202-68 84-163.5-84-163.5-202-68-202 68-84 163zM527 275q-16 0-27.5-11t-11.5-27 11.5-27.5 27.5-11.5 27.5 11.5 11.5 27.5-11.5 27-27.5 11zM667 275q-16 0-27.5-11t-11.5-27 11.5-27.5 27.5-11.5 27.5 11.5 11.5 27.5-11.5 27-27.5 11zM806 275q-16 0-27-11t-11-27 11-27.5 27-11.5 27.5 11.5 11.5 27.5-11.5 27-27.5 11z" />
<glyph unicode="&#xe63d;" glyph-name="uniE63D" d="M512 13q-131 0-241.5 55t-175 149.5-64.5 205.5 64.5 205.5 175 149.5 241.5 55 241.5-55 175-149.5 64.5-205.5-64.5-205.5-175-149.5-241.5-55zM512 751q-108 0-200-44t-145.5-119.5-53.5-164.5 53.5-164.5 145.5-119.5 200-44 200 44 145.5 119.5 53.5 164.5-53.5 164.5-145.5 119.5-200 44zM730 75l184-82-102 164zM914-44q-8 0-15 3l-184 82q-14 6-19.5 20.5t0.5 28.5 20.5 19.5 28.5-1.5l74-33-39 62q-8 13-4.5 28t16.5 23 28 4.5 23-16.5l102-164q15-23-3-43-11-13-28-13zM379 412.5q0-21.5-15-36.5t-36.5-15-36.5 15-15 36.5 15 36.5 36.5 15 36.5-15 15-36.5zM563 412.5q0-21.5-15-36.5t-36-15-36 15-15 36.5 15 36.5 36 15 36-15 15-36.5zM748 413q0-22-15-37t-36.5-15-36.5 15-15 36.5 15 36.5 36.5 15 36.5-15 15-36z" />
<glyph unicode="&#xe63e;" glyph-name="uniE63E" d="M768-94q-94 0-205 56-145 72-277 204.5t-205 277.5q-55 113-56.5 201t52.5 140q13 13 30 13t29.5-13 12.5-30-12-30q-32-32-26.5-98t47.5-149q68-137 187.5-256.5t256.5-187.5q83-42 149-47.5t98 26.5q13 13 30 13t30-13 13-30-13-30q-54-47-141-47zM333 439q-26 0-39 26-9 16-4 32.5t21 23.5l99 46q15 8 26 23t8 33q0 13-17 30l-141 145q-20 20-56 13-12-7-25-13l-68-73q-13-12-30-12t-30 12.5-13 29.5 13 30l68 68q28 28 60 34 80 20 141-34l140-140q32-32 39-82 6-41-16.5-81.5t-64.5-63.5l-98-47h-13zM875-55q-17 0-30 12.5t-13 29.5 13 30l68 68q5 6 7.5 8.5t4 7 1.5 10.5q7 35-13 55l-141 141q-4 4-30 17-18 3-33-7t-22-27l-47-98q-6-16-22.5-21.5t-32.5 4.5q-17 6-22 22.5t4 32.5l47 99q23 42 62 64.5t83 16.5q45-7 77-39l141-141q29-28 38-65t-4-75q-17-43-34-60l-72-73q-13-12-30-12zM602 171q-9 0-26 8-77 58-154 128-76 77-128 154-9 12-6 29.5t19 30.5q16 9 33 6.5t27-15.5q69-95 119-141 94-85 141-119 16-10 18.5-27t-9.5-33q-6-21-34-21z" />
<glyph unicode="&#xe63f;" glyph-name="uniE63F" horiz-adv-x="1025" d="M512 18q-11 0-31-1t-36.5-1-30.5 2l-222-146q0 227 5 243-91 65-144 152.5t-53 189.5q0 122 68.5 223t186 158.5 257.5 57.5 257.5-57.5 186-158.5 68.5-222.5-68.5-223-186-159-257.5-57.5zM512 847q-122 0-229-52.5t-170.5-143-63.5-194.5q0-95 53-179t142-138v-170l146 97q16-3 35.5-4t49 0 37.5 1q122 0 229 53.5t170.5 144.5 63.5 195-63.5 194.5-170.5 143-229 52.5zM768 384q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5 45.5-18.5 18.5-45.5-18.5-45.5-45.5-18.5zM512 384q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5 45.5-18.5 18.5-45.5-18.5-45.5-45.5-18.5zM256 384q-27 0-45.5 18.5t-18.5 45.5 18.5 45.5 45.5 18.5 45.5-18.5 18.5-45.5-18.5-45.5-45.5-18.5z" />
<glyph unicode="&#xe640;" glyph-name="uniE640" d="M957 594q-12 19-38 19h-598l-29 62q-3 7-8 14-3 4-8 8-4 3-7 6l-10 5h-2q-5 2-9 2l-4 1h-123q-23 0-40-16.5t-17-40 17-40.5 40-17h81l33-71q2-6 5-13t5-12 4.5-9.5 3.5-6.5l1-2 81-181q0-2 2-5l15-32q9-30 39-38v-3h392l18 1v2q30 9 39 38l98 217q40 77 19 112zM909 497l-93-207-3 1-4-15q-5-19-25-19l-19 1v-1h-358q-19 0-24 19l-4 15-3-1-93 208q-10 17-18 40l-42 92h-102q-10 0-17 7t-7 17 7 17.5 17 7.5h119l3-1q1 0 4-1 2 0 4-2 2-1 4-3 2-1 3-3l4-6 38-83h619q8 0 10-3 5-8-1.5-32.5t-18.5-47.5zM470 191q-33 0-56.5-23t-23.5-56 23.5-56.5 56.5-23.5 56.5 23.5 23.5 56.5-23.5 56-56.5 23zM470 61q-21 0-36 15t-15 36 15 36 36 15 36-15 15-36.5-15-36-36-14.5zM747 191q-33 0-56.5-23t-23.5-56 23.5-56.5 56.5-23.5 56.5 23.5 23.5 56.5-23.5 56-56.5 23zM747 61q-21 0-36 14.5t-15 36 15 36.5 36 15 36-15 15-36-15-36-36-15z" />
<glyph unicode="&#xe641;" glyph-name="uniE641" horiz-adv-x="1045" d="M522 893q-103 0-197-40t-162-108-108.5-162-40.5-197.5 40.5-197.5 108.5-162 162-108 197.5-40 197.5 40 162 108 108 162 40 197.5-40 197.5-108 162-162 108-198 40zM522-49q-88 0-168.5 34.5t-138.5 93-92.5 138.5-34.5 168.5 34.5 169 92.5 138.5 138.5 92.5 169 34.5 168.5-34.5 138.5-92.5 93-138.5 34.5-169-34.5-168.5-93-138.5-138.5-93-169-34.5zM775 268l-105 61q-11 4-21 6.5t-18 2.5-15-0.5-13-4-10-5.5-9-6l-6-7q-2-2-6-7l-3-4-6-10q-34-4-59 21l-51 50q-24 25-20 60l9 4q3 5 16 16t17 18 4 25-11 43h-1l-60 105q-12 20-33 25.5t-41-5.5l-62-36q-6-3-14-11.5t-13-14.5l-5-6q-14-87 24.5-183.5t121.5-174.5q72-68 157-101.5t165-29.5q4 1 10.5 2.5t20.5 10 21 20.5l36 62q11 20 5.5 41.5t-25.5 32.5z" />
<glyph unicode="&#xe642;" glyph-name="uniE642" d="M439 324h110l-54 148zM501 881q-101 0-192.5-39.5t-158-105.5-105.5-158-39-192.5 39-192.5 105.5-158.5 158-105.5 192.5-39 192.5 39 158 105.5 105.5 158.5 39 192.5-39 192.5-105.5 158-158 105.5-192.5 39.5zM656 180l-19-9q-5-3-11-3-5 0-9 2-10 4-14 14l-27 69h-163l-25-69q-4-10-14.5-14t-19.5 1l-20 9q-9 4-12.5 13t-0.5 18l151 401q6 16 23 16t23-16l151-401q3-9-0.5-18t-12.5-13z" />
<glyph unicode="&#xe643;" glyph-name="uniE643" horiz-adv-x="1124" d="M859 896h-595q-109 0-186.5-77.5t-77.5-186.5v-760l200 135q18 14 49.5 24t63.5 14.5 71.5 6.5 66 2 57-1 34.5-1h317q109 0 186.5 77.5t77.5 186.5v316q0 109-77.5 186.5t-186.5 77.5zM477 367q-42 0-71.5 29.5t-29.5 70.5 29.5 70 71.5 29 71.5-29 29.5-70-29.5-70.5-71.5-29.5zM848 367q-42 0-71.5 29.5t-29.5 70.5 29.5 70 71.5 29 71.5-29 29.5-70-29.5-70.5-71.5-29.5z" />
<glyph unicode="&#xe644;" glyph-name="uniE644" d="M523 881q-101 0-192.5-39.5t-158-105.5-105.5-158-39-192.5 39-192.5 105.5-158.5 158-105.5 192.5-39 192.5 39 158 105.5 105.5 158.5 39 192.5-39 192.5-105.5 158-158 105.5-192.5 39.5zM739 224q8-8 7.5-18.5t-8.5-17.5q-11-10-15-14-7-7-17-7t-18 7l-34 34q-59-42-131-42-94 0-160.5 66.5t-66.5 160.5 67 160.5 160.5 66.5 160-66.5 66.5-160.5q0-75-45-135zM592 337q8 7 18 6.5t17-7.5l27-27q25 39 25 84 0 64-45.5 109.5t-110 45.5-110-45.5-45.5-109.5 45.5-109.5 109.5-45.5q44 0 80 21l-27 28q-8 7-7.5 18t7.5 18z" />
<glyph unicode="&#xe645;" glyph-name="uniE645" d="M512 894q-104 0-198-40.5t-162.5-109-109-162.5-40.5-198 40.5-198 109-162.5 162.5-109 198-40.5 198 40.5 162.5 109 109 162.5 40.5 198-40.5 198-109 162.5-162.5 109-198 40.5zM512-53q-89 0-170 34.5t-139.5 93-93 139.5-34.5 170 34.5 170 93 139.5 139.5 93 170 34.5 170-34.5 139.5-93 93-139.5 34.5-170-34.5-170-93-139.5-139.5-93-170-34.5zM659 384q15 0 25.5 10.5t10.5 25.5-10.5 26-25.5 11h-111v17l135 141q11 11 10.5 26t-11 25.5-25.5 10-26-11.5l-115-121-123 122q-11 11-26 10.5t-25.5-11-11-25.5 10.5-26l135-135v-22h-108q-15 0-26-11t-11-26 11-25.5 26-10.5h108v-73h-108q-15 0-26-10.5t-11-25.5 11-26 26-11h108v-108q0-15 10.5-25.5t25.5-10.5 25.5 10.5 10.5 25.5v108h111q15 0 25.5 11t10.5 26-10.5 25.5-25.5 10.5h-111v73h111z" />
<glyph unicode="&#xe646;" glyph-name="uniE646" d="M708 553l-257-267-135 141q-12 13-28.5 13t-28-12.5-11.5-29.5 11-29l164-170q4-4 8-7 12-7 25.5-5.5t23.5 12.5l284 295q12 13 12 30t-12 29q-41 16-56 0zM17 384q0 101 39 192.5t105.5 158 158 105.5 192.5 39 192.5-39 158-105.5 105.5-158 39-192.5-39-192.5-105.5-158-158-105.5-192.5-39-192.5 39-158 105.5-105.5 158-39 192.5z" />
<glyph unicode="&#xe647;" glyph-name="uniE647" d="M512-92q-97 0-185 37.5t-152 101.5-101.5 152-37.5 185 37.5 185 101.5 152 152 101.5 185 37.5 185-37.5 152-101.5 101.5-152 37.5-185-37.5-185-101.5-152-152-101.5-185-37.5zM512 828q-90 0-172.5-35t-142-94.5-94.5-142-35-172.5 35-172.5 94.5-142 142-94.5 172.5-35 172.5 35 142 94.5 94.5 142 35 172.5-35 172.5-94.5 142-142 94.5-172.5 35z" />
<glyph unicode="&#xe648;" glyph-name="uniE648" d="M512 882q-101 0-193.5-39.5t-159-106-106-159-39.5-193.5 39.5-193.5 106-159 159-106 193.5-39.5 193.5 39.5 159 106 106 159 39.5 193.5-39.5 193.5-106 159-159 106-193.5 39.5zM512-82q-95 0-181 37t-148.5 99.5-99.5 148.5-37 181 37 181 99.5 148.5 148.5 99.5 181 37 181-37 148.5-99.5 99.5-148.5 37-181-37-181-99.5-148.5-148.5-99.5-181-37zM420 217l-156 155-22-22 178-179 361 361-23 23z" />
<glyph unicode="&#xe649;" glyph-name="uniE649" d="M875 126l-363-164-363 164v610q247 75 363 75t363-75v-610zM930 808q-34 11-84.5 26t-159.5 38.5-174 23.5-174-23.5-159.5-38.5-84.5-26q-14-4-22-15.5t-8-25.5v-669q0-27 25-39l405-183q9-3 18-3t18 3l405 183q25 12 25 39v669q0 14-8 25.5t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />
<glyph unicode="&#xe64a;" glyph-name="uniE64A" d="M510.5-61q-90.5 0-173.5 35.5t-142.5 95-95 142.5-35.5 173.5 35.5 173.5 95 142.5 142.5 95 173.5 35.5 173.5-35.5 142.5-95 95-142.5 35.5-173.5-35.5-173.5-95-142.5-142.5-95-173.5-35.5zM510.5 793q-110.5 0-204.5-54.5t-148.5-148.5-54.5-204.5 54.5-204.5 148.5-148.5 204.5-54.5 204.5 54.5 148.5 148.5 54.5 204.5-54.5 204.5-148.5 148.5-204.5 54.5zM491 347q-8 0-13.5 5.5t-5.5 13.5v330q0 8 5.5 14t13.5 6 14-6 6-14v-330q0-8-6-13.5t-14-5.5zM763 347h-272q-8 0-13.5 5.5t-5.5 13.5 5.5 13.5 13.5 5.5h272q8 0 13.5-5.5t5.5-13.5-5.5-13.5-13.5-5.5z" />
<glyph unicode="&#xe64b;" glyph-name="uniE64B" d="M379-128q-57 0-122 51.5t-97 132.5q-26 71-27 149.5t24 151.5q11 33 32.5 70.5t37 58.5 46.5 62q17 20 51 68l11 14 23 34q9 14 21 35t18.5 38.5 11.5 38 4 42.5-7 44q-6 11 7 24 7 7 20 7 149-50 216-284 27 50 58 69 12 6 23 0t11-21q-3-59 11.5-126.5t42.5-126.5q4-5 9-17t8-17q51-89 55-157 4-63-14.5-126.5t-65.5-120-115-80.5q-30-11-61-11-18 0-30.5 5t-18 12.5-7.5 13-2 10.5q0 7 2 13t4 10 7.5 9.5 7.5 7 9 6.5 8 6l3 3q36 26 54 75.5t7 95.5q-4 28-27 75-2 6-7.5 20t-8.5 22-6.5 20-4.5 23q0-2-2-5t-2-5q-15-42-20-75 0-45 7-58 7-5 7.5-14.5t-4.5-16.5q-5-8-14-10t-17 3v0q-67 44-85 120 7 34 7 78v45q0 68-10 92-14-53-28-72-22-39-37-58-6-6-15.5-20t-12.5-18q-13-22-24-46.5t-21.5-61.5-5.5-78 28-76q3-7 7.5-12.5t8-10 8.5-10 7.5-8 8-7 7.5-6.5 7.5-6.5 6.5-4.5q11-9 16.5-14.5t10-14.5 0.5-19q-5-18-21.5-29.5t-39.5-11.5z" />
<glyph unicode="&#xe64c;" glyph-name="uniE64C" d="M911 725h-242v123q0 21-13.5 34.5t-34.5 13.5h-246q-20 0-33.5-13.5t-13.5-34.5v-123h-246q-21 0-34.5-13.5t-13.5-34 13.5-34 34.5-13.5h829q21 0 34.5 13.5t13.5 34-13.5 34-34.5 13.5zM423 725v72h147v-72h-147zM765 579q-21 0-34.5-14t-13.5-34v-560h-441v560q0 20-13.5 34t-34 14-34-14-13.5-34v-611q0-21 13.5-34.5t34.5-13.5h536q20 0 33.5 13.5t13.5 34.5v611q3 20-11.5 34t-35.5 14zM447 67v389q0 20-13.5 33.5t-34 13.5-34-13.5-13.5-33.5v-389q0-21 13.5-34.5t34-13.5 34 13.5 13.5 34.5zM645 67v389q0 20-13.5 33.5t-34.5 13.5q-20 0-35.5-13.5t-15.5-33.5v-389q0-21 13.5-34.5t34.5-13.5 36 13.5 15 34.5z" />
<glyph unicode="&#xe64d;" glyph-name="uniE64D" d="M562 224h109v-111h-109v111zM889 224h109v-111h-109v111zM562 113h109v-110h-109v110zM438 458h-438v438h438v-438zM111 569h216v216h-216v-216zM1000 458h-438v438h438v-438zM673 569h216v216h-216v-216zM438-106h-438v438h438v-438zM111 5h216v216h-216v-216zM561 335h222v-111h-222v111zM889 334h109v-111h-109v111zM780 113h109v-111h-109v111zM562 2h218v-110h-218v110zM889 2h109v-110h-109v110z" />
<glyph unicode="&#xe900;" glyph-name="right" d="M370.851 73.927c-12.635-12.635-33.118-12.635-45.753 0l-251.641 251.641c-12.635 12.635-12.635 33.118 0 45.753v0c12.635 12.635 33.118 12.635 45.753 0l251.641-251.641c12.635-12.634 12.635-33.118 0-45.753v0zM325.361 74.19c-12.635 12.635-12.635 33.118 0 45.753l578.84 574.639c12.635 12.635 33.118 12.635 45.753 0v0c12.635-12.635 12.635-33.118 0-45.753l-578.84-574.639c-12.634-12.634-33.118-12.634-45.753 0v0z" />
<glyph unicode="&#xe901;" glyph-name="arrow-r" d="M835.918 379.851l-378.504 378.504 70.080 70.087 448.589-448.591-448.589-448.599-70.075 70.080 378.499 378.519zM423.154 386.889l-378.504 378.496 70.085 70.090 448.589-448.591-448.589-448.597-70.085 70.080 378.504 378.522z" />
<glyph unicode="&#xe902;" glyph-name="quan" d="M806.934 879.547h-604.98c-110.906 0-201.661-90.751-201.661-201.661v-604.982c0-110.91 90.755-201.66 201.661-201.66h604.98c110.918 0 201.663 90.75 201.663 201.66v604.982c-0.001 110.91-90.745 201.661-201.663 201.661zM850.766 187.323c-43.087 19.867-84.506 43.085-122.626 68.751-4.134-48.052-9.932-105.206-11.596-121.792-7.44-84.507-39.759-108.532-127.592-108.532h-121.793l-14.912 75.403h99.418c62.976 0 76.236 10.766 81.204 57.987 2.496 19.89 7.462 67.943 9.126 87.834h-179.802c-23.194-133.391-91.138-194.701-264.298-260.151l-43.086 80.349c147.483 43.085 198.019 87 217.898 179.802h-80.36v16.564c-38.939-28.993-83.687-57.156-134.222-84.508l-43.086 77.877c90.306 47.221 155.764 91.137 204.649 143.336h-183.106v73.74h238.62c12.429 19.89 23.194 40.601 33.14 63.796h-242.767v74.572h136.717l-75.405 96.937 66.291 44.737c28.162-34.791 67.111-84.507 95.273-120.962l-29.825-20.711h77.056c14.080 45.569 28.992 103.566 35.623 151.618l86.991-13.261c-9.934-49.704-20.7-95.273-32.309-138.358h111.849l-28.162 19.059c32.319 34.792 70.414 83.676 97.767 123.446l67.944-43.085c-22.387-29.826-52.213-68.764-78.71-99.42h138.356v-74.572h-333.071c-8.282-22.362-16.576-43.905-27.342-63.796h392.731v-73.74h-191.397c54.683-56.335 122.626-97.756 217.898-131.739l-43.086-81.182zM571.556 400.242h-141.673c-19.889-27.341-43.085-53.84-69.595-78.698h285.010c-26.521 24.026-51.379 50.525-73.742 78.698z" />
<glyph unicode="&#xe903;" glyph-name="notdef" horiz-adv-x="374" d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
</font></defs></svg>
\ No newline at end of file
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
panose-1="2 0 6 3 0 0 0 0 0 0"
ascent="896"
descent="-128"
x-height="792"
bbox="-0.75 -212 3943 896.75"
underline-thickness="0"
underline-position="0"
unicode-range="U+0078-E6B5"
/>
<missing-glyph
/>
<glyph glyph-name=".notdef"
/>
<glyph glyph-name=".notdef"
/>
<glyph glyph-name=".null" horiz-adv-x="0"
/>
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"
/>
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
<glyph glyph-name="more" unicode="&#xe606;" horiz-adv-x="1000"
d="M109.5 511q37.5 0 64 -26.5t26.5 -63.5t-26.5 -63.5t-64 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM515.5 511q37.5 0 63.5 -26.5t26 -63.5t-26 -63.5t-63.5 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM921 511q37 0 63.5 -26.5t26.5 -63.5t-26.5 -63.5
t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5z" />
<glyph glyph-name="plus" unicode="&#xe624;" horiz-adv-x="1000"
d="M459 850h55h54v-120v-142v-120h191h191v-109h-191h-191v-191v-190h-109v190.5v190.5h-190.5h-190.5q-1 37 -1 109h191.5h190.5v382z" />
<glyph glyph-name="minus" unicode="&#xe625;" horiz-adv-x="1000"
d="M77 468h873v-109h-873v109z" />
<glyph glyph-name="money" unicode="&#xe61b;"
d="M437 137h-193q-27 2 -41.5 22.5t-17.5 45.5q3 25 17.5 41t41.5 18h193v63l-193 1q-27 2 -41.5 19t-17.5 43q3 25 17.5 41t41.5 18h144l-134 236q-10 12 -19 30.5t-8 40.5q5 28 20 45.5t56 22.5q24 -2 43 -16.5t31 -31.5l152 -278l167 280q12 17 31 30t43 16
q15 -1 27.5 -4t22 -10t16 -20t9.5 -34q0 -29 -20 -55l-155 -252h147q26 -2 41 -18t17 -41q-2 -26 -17.5 -44t-41.5 -20l-191 -1v-61h192q26 -2 41 -20t17 -43q-2 -26 -17 -43.5t-41 -19.5l-192 1v-106q-4 -85 -93 -85q-44 0 -68.5 21t-26.5 64v104z" />
<glyph glyph-name="gouwuche" unicode="&#xe640;"
d="M957 594q-12 19 -38 19h-598l-29 62q-3 7 -8 14q-3 4 -8 8q-4 3 -7 6l-2 1l-8 4h-2q-5 2 -9 2l-4 1h-5h-118q-23 0 -40 -16.5t-17 -40t17 -40.5t40 -17h81l33 -71q2 -6 5 -13t5 -12t4.5 -9.5t3.5 -6.5l1 -2l81 -181q0 -2 2 -5l15 -32q9 -30 39 -38v-3h392l18 1v2
q30 9 39 38l98 217q40 77 19 112zM909 497l-93 -207l-3 1l-4 -15q-5 -19 -25 -19v0l-19 1v-1h-340h-18q-19 0 -24 19l-4 15l-3 -1l-93 208q-10 17 -18 40l-42 92h-102q-10 0 -17 7t-7 17t7 17.5t17 7.5h119l3 -1q1 0 4 -1q2 0 4 -2q2 -1 4 -3q2 -1 3 -3l4 -6l38 -83h619
q8 0 10 -3q5 -8 -1.5 -32.5t-18.5 -47.5zM470 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM470 61q-21 0 -36 15t-15 36t15 36t36 15t36 -15t15 -36.5t-15 -36t-36 -14.5zM747 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5
t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM747 61q-21 0 -36 14.5t-15 36t15 36.5t36 15t36 -15t15 -36t-15 -36t-36 -15z" />
<glyph glyph-name="Logistics" unicode="&#xe630;"
d="M629 25h-268v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-174v609h590v-609zM400 66h188v527h-508v-527h94q7 41 39 68t74 27t74 -27t39 -68zM989 25h-136v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-117v476h210q22 0 57 -34q27 -26 58 -67
q31 -40 52 -75q24 -41 24 -62v-238zM892 66h56v197q0 9 -18 40t-46 68t-53 63q-23 23 -34 26h-168v-394h37q7 41 39 68t74 27t74 -27t39 -68zM989 233h-287v193h191l6 -8q35 -43 61 -84q29 -48 29 -71v-30zM743 274h202q-6 15 -21 39q-21 34 -50 72h-131v-111zM779.5 -70
q-47.5 0 -81.5 34t-34 81.5t34 81.5t81.5 34t81 -34t33.5 -81.5t-33.5 -81.5t-81 -34zM779 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22zM287 -70q-48 0 -81.5 34t-33.5 81.5t33.5 81.5t81.5 34t81.5 -34t33.5 -81.5
t-33.5 -81.5t-81.5 -34zM287 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22z" />
<glyph glyph-name="more1" unicode="&#xe618;"
d="M224 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM512 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM800 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28z" />
<glyph glyph-name="close01" unicode="&#xe623;"
d="M835 660l-60 63l-263 -275v0v0v0l-263 275l-60 -63l262 -276l-262 -276l60 -63l263 275v0v0v0l263 -275l60 63l-262 276z" />
<glyph glyph-name="location" unicode="&#xe631;"
d="M24 895v-1022v1022zM47 895v-1022v1022zM70 895v-1022v1022zM94 895v-1022v1022zM117 895v-1022v1022zM140 895v-1022v1022zM163 895v-1022v1022zM187 895v-1022v1022zM210 895v-1022v1022zM233 895v-1022v1022zM256 895v-1022v1022zM280 895v-1022v1022zM303 895v-1022
v1022zM326 895v-1022v1022zM349 895v-1022v1022zM373 895v-1022v1022zM396 895v-1022v1022zM419 895v-1022v1022zM442 895v-1022v1022zM466 895v-1022v1022zM489 895v-1022v1022zM512 895v-1022v1022zM535 895v-1022v1022zM558 895v-1022v1022zM582 895v-1022v1022zM605 895
v-1022v1022zM628 895v-1022v1022zM651 895v-1022v1022zM675 895v-1022v1022zM698 895v-1022v1022zM721 895v-1022v1022zM744 895v-1022v1022zM768 895v-1022v1022zM791 895v-1022v1022zM814 895v-1022v1022zM837 895v-1022v1022zM861 895v-1022v1022zM884 895v-1022v1022z
M907 895v-1022v1022zM930 895v-1022v1022zM954 895v-1022v1022zM977 895v-1022v1022zM1000 895v-1022v1022zM1 872h1022h-1022zM1 849h1022h-1022zM1 826h1022h-1022zM1 802h1022h-1022zM1 779h1022h-1022zM1 756h1022h-1022zM1 733h1022h-1022zM1 709h1022h-1022zM1 686
h1022h-1022zM1 663h1022h-1022zM1 640h1022h-1022zM1 616h1022h-1022zM1 593h1022h-1022zM1 570h1022h-1022zM1 547h1022h-1022zM1 523h1022h-1022zM1 500h1022h-1022zM1 477h1022h-1022zM1 454h1022h-1022zM1 430h1022h-1022zM1 407h1022h-1022zM1 384h1022h-1022zM1 361
h1022h-1022zM1 338h1022h-1022zM1 314h1022h-1022zM1 291h1022h-1022zM1 268h1022h-1022zM1 245h1022h-1022zM1 221h1022h-1022zM1 198h1022h-1022zM1 175h1022h-1022zM1 152h1022h-1022zM1 128h1022h-1022zM1 105h1022h-1022zM1 82h1022h-1022zM1 59h1022h-1022zM1 35h1022
h-1022zM1 12h1022h-1022zM1 -11h1022h-1022zM1 -34h1022h-1022zM1 -58h1022h-1022zM1 -81h1022h-1022zM1 -104h1022h-1022zM512 -127q-7 8 -18.5 22t-45.5 59t-64.5 91t-68 113.5t-64.5 131.5t-45.5 139t-18.5 141q0 52 11 96.5t30 75.5t43 56.5t51 41t54 27t51.5 17
t43.5 8.5t30 3h11q7 0 18.5 -0.5t45.5 -7t64.5 -17.5t68 -35.5t64.5 -57.5t45.5 -87t18.5 -120q0 -237 -215 -552q-60 -88 -110 -145zM740 613q-16 85 -86 140q-1 1 -4 3.5t-5 3.5q-5 4 -22 13t-19 10q-1 0 -20 7q-21 7 -24 7q-24 5 -48 5v0v0q-24 0 -47 -5q-44 -8 -82 -34
h-0.5h-0.5q-12 -9 -27 -23q-2 -1 -4.5 -3.5l-3.5 -3.5q-4 -4 -16 -19.5t-13 -16.5q-2 -3 -4.5 -7.5t-3.5 -5.5q-10 -19 -13 -27q-1 -2 -2 -6t-2 -5q-7 -21 -9 -32q-4 -22 -4 -44q0 -65 23.5 -146.5t58 -151.5t68.5 -129.5t58 -95.5t24 -35q9 13 25 36.5t56 92t70.5 133.5
t55.5 148t25 148q0 22 -4 43zM373 570q0 58 40.5 98.5t98.5 40.5t98.5 -40.5t40.5 -98.5t-40.5 -99t-98.5 -41t-98.5 41t-40.5 99z" />
<glyph glyph-name="checkbox" unicode="&#xe61c;"
d="M946 -112h-868q-26 0 -44 18t-18 44v868q0 26 18 44t44 18h868q26 0 44 -18t18 -44v-868q0 -26 -18 -44t-44 -18zM946 787q0 13 -9 22t-22 9h-806q-13 0 -22 -9t-9 -22v-806q0 -13 9 -22t22 -9h806q13 0 22 9t9 22v806z" />
<glyph glyph-name="sanjiao2" unicode="&#xe612;"
d="M951 77h-878l439 614z" />
<glyph glyph-name="sanjiao1" unicode="&#xe613;"
d="M512 77l-439 614h878z" />
<glyph glyph-name="closezhuanhuan" unicode="&#xe626;"
d="M866.5 747.5q-97.5 97.5 -228 132t-261.5 0t-228.5 -132t-132 -228.5t0 -261.5t132 -228t228.5 -132t261.5 0t228 132t132 228t0 261.5t-132 228.5zM798 199l-101 -101l-187 186l-186 -186l-101 101l186 186l-186 187l101 101l186 -186l187 186l101 -101l-186 -187z" />
<glyph glyph-name="info" unicode="&#xe61a;"
d="M512 -62q-91 0 -173.5 35.5t-142 95t-95 142t-35.5 173.5t35.5 173.5t95 142t142 95t173.5 35.5t173.5 -35.5t142 -95t95 -142t35.5 -173.5t-35.5 -173.5t-95 -142t-142 -95t-173.5 -35.5zM512 766q-104 0 -192 -51t-139 -139t-51 -192t51 -192t139 -139t192 -51t192 51
t139 139t51 192t-51 192t-139 139t-192 51zM512 592zM464 592q0 20 14 34t34 14t34 -14t14 -34t-14 -34t-34 -14t-34 14t-14 34zM512 128q-13 0 -22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-288q0 -13 -9.5 -22.5t-22.5 -9.5z" />
<glyph glyph-name="cb-checked" unicode="&#xe61d;"
d="M939 -106h-876q-26 0 -44.5 18.5t-18.5 44.5v876q0 26 18.5 44.5t44.5 18.5h876q26 0 44.5 -18.5t18.5 -44.5v-876q0 -26 -18.5 -44.5t-44.5 -18.5zM814 708l-376 -438l-250 188l-63 -126l313 -250l439 501z" />
<glyph glyph-name="edit" unicode="&#xe61e;"
d="M224 307l416 410l179 -179l-416 -410zM659 621l-19 19l-333 -333l19 -19zM698 582l-20 20l-332 -333l19 -19zM736 544l-19 19l-333 -333l19 -19zM717 800q14 14 38 14t39 -14l102 -102q14 -15 14 -39t-14 -38l-64 -58l-173 173zM211 282l167 -167l-148 -51l-70 70z
M205 51l-83 -32l32 83z" />
<glyph glyph-name="up" unicode="&#xe615;"
d="M527 559q8 0 14 -6l293 -288q6 -6 6.5 -14.5t-5.5 -14.5t-14.5 -6t-14.5 6l-279 273l-278 -273q-7 -6 -15 -6t-14 6t-6 14.5t6 14.5l293 288q6 6 14 6z" />
<glyph glyph-name="down" unicode="&#xe616;"
d="M527.5 230q-8.5 0 -14.5 6l-293 288q-6 6 -6 14t6 14.5t14 6.5t15 -6l278 -274l279 274q6 6 14.5 6t14.5 -6.5t5.5 -14.5t-6.5 -14l-293 -288q-5 -6 -13.5 -6z" />
<glyph glyph-name="info1" unicode="&#xe61f;"
d="M512 896q-138 0 -256 -69t-187 -187t-69 -256t69 -256t187 -187t256 -69t256 69t187 187t69 256t-69 256t-187 187t-256 69v0zM563 128h-102v307h102v-307v0zM563 538h-102v102h102v-102v0z" />
<glyph glyph-name="more2" unicode="&#xe619;"
d="M125.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM512.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM899.5 309q30.5 0 51 21.5
t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5z" />
<glyph glyph-name="yoho-share" unicode="&#xe600;" horiz-adv-x="1463"
d="M798 -64q0 -46 25 -58t61 16l537 420q36 28 36 68t-36 68l-537 424q-36 29 -61 16.5t-25 -57.5v-238q-486 0 -676 -290q-102 -157 -102 -361q0 -49 2 -49q47 62 87 104t90 78t103.5 57.5t127 36.5t161.5 21t207 6v-262z" />
<glyph glyph-name="yoho-good" unicode="&#xe601;"
d="M281 468q-14 -9 -23 -23t-9 -28v-7v-19v0v-464h1v0q5 -24 24 -39.5t44 -15.5h582q28 0 48.5 20t20.5 49t-20.5 49t-48.5 20h-215h256q35 0 59 24.5t24 58.5t-24 58.5t-59 24.5h-235h235q35 0 59 24t24 58.5t-24 58.5t-59 24h-259h211q31 0 53.5 22.5t22.5 53.5v-13
q0 31 -22.5 54t-53.5 24q-125 6 -259 9q40 148 16 278q-8 44 -30.5 70.5t-49.5 31t-53 -4t-43 -35t-17 -62.5q-5 -34 -6.5 -64t-2.5 -42t-5 -30.5t-14 -42.5q-24 -60 -133 -115q-7 -2 -13 -6l-2 -1v0zM60 452q-25 0 -42.5 -17.5t-17.5 -42.5v-405q0 -25 17.5 -42.5
t42.5 -17.5h134v525h-134z" />
<glyph glyph-name="yoho-view" unicode="&#xe602;" horiz-adv-x="1323"
d="M643 568q0 -68 -47.5 -116t-113.5 -48q0 -68 47 -116t113.5 -48t113.5 48t47 116t-47 116t-113 48v0zM643 896q-79 0 -162 -28.5t-152 -74.5t-131 -102t-105 -110.5t-68 -101.5t-25 -75t25 -75t68 -102t105 -111t131 -101.5t152 -74.5t161.5 -29t161.5 29t152 74.5
t131 101.5t105 111t68 102t25 75t-25 75t-68 101.5t-105 110.5t-131 102t-152 74.5t-161 28.5v0zM643 75q-88 0 -162 44t-117 120t-43 165t43 164.5t117 119.5t161.5 44t161.5 -44t117 -119.5t43 -164.5t-43 -165t-117 -120t-161 -44v0z" />
<glyph glyph-name="yoho-time" unicode="&#xe603;"
d="M512 382v343h85v-426h-81v-2h-256v85h252zM512 -128q139 0 257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5t-257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5z" />
<glyph glyph-name="yoho-enter" unicode="&#xe604;"
d="M774 420q13 -17 11.5 -39.5t-17.5 -38.5q0 -1 -1 -1l-427 -428q-18 -17 -42.5 -17t-42 17.5t-17.5 42t17 41.5l387 387l-387 387q-17 17 -17 41.5t17.5 42t42 17.5t42.5 -17l427 -428q1 0 1 -1z" />
<glyph glyph-name="yoho-like" unicode="&#xe605;"
d="M707 844q-112 0 -195 -77q-83 77 -195 77q-121 0 -207 -88t-86 -212q0 -110 69 -194l2 -2l344 -391q30 -33 73 -33t73 33l344 391l2 2q69 84 69 194q0 124 -86 212t-207 88z" />
<glyph glyph-name="enter" unicode="&#xe607;" horiz-adv-x="1643"
d="M547 286h-1l45 -46l248 239l-45 46l-201 -194l-195 201l-46 -44z" />
<glyph glyph-name="up1" unicode="&#xe608;" horiz-adv-x="1821"
d="M930 231v0q-14 -13 -33.5 -13t-33.5 13l-252 242q-14 13 -14 32t14 32t34 13t34 -13l251 -242q14 -13 14 -32t-14 -32zM360 231v0q-14 13 -14 32t14 32l251 242q14 13 34 13t33.5 -13t13.5 -32t-13 -32l-252 -242q-14 -13 -33.5 -13t-33.5 13z" />
<glyph glyph-name="downn" unicode="&#xe609;" horiz-adv-x="1821"
d="M930 473l-251 -242q-14 -13 -34 -13t-34 13t-14 32t14 32l252 242q14 13 33.5 13t33.5 -13t14 -32t-14 -32zM427 537l252 -242q13 -13 13 -32t-13.5 -32t-33.5 -13t-34 13l-251 242q-14 13 -14 32t14 32t33.5 13t33.5 -13z" />
<glyph glyph-name="gou" unicode="&#xe60a;"
d="M1024 300q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257zM801 510l-365 -366l-156 156l-37 -37l193 -193l403 403l-38 37v0z" />
<glyph glyph-name="zidongdenglu" unicode="&#xe648;"
d="M512 882q-101 0 -193.5 -39.5t-159 -106t-106 -159t-39.5 -193.5t39.5 -193.5t106 -159t159 -106t193.5 -39.5t193.5 39.5t159 106t106 159t39.5 193.5t-39.5 193.5t-106 159t-159 106t-193.5 39.5zM512 -82q-95 0 -181 37t-148.5 99.5t-99.5 148.5t-37 181t37 181
t99.5 148.5t148.5 99.5t181 37t181 -37t148.5 -99.5t99.5 -148.5t37 -181t-37 -181t-99.5 -148.5t-148.5 -99.5t-181 -37zM420 217l-156 155l-22 -22l178 -179l361 361l-23 23z" />
<glyph glyph-name="qianjin" unicode="&#xe614;"
d="M313 35l349 349l-349 349q-7 7 -7 16.5t6.5 16t16 6.5t16.5 -6l345 -345q16 -15 21 -20q7 -7 7 -17t-7 -17q-44 -44 -48 -47l-318 -318q-7 -6 -16.5 -6t-16 6.5t-6.5 16t7 16.5z" />
<glyph glyph-name="back" unicode="&#xe610;"
d="M245 384l-9 9l472 472l80 -80l-400 -401l400 -401l-80 -80l-472 472z" />
<glyph glyph-name="search" unicode="&#xe60f;"
d="M682 158q-108 -89 -249 -89q-107 0 -197.5 53t-143.5 143.5t-53 197.5t53 197.5t143.5 143.5t197.5 53t197.5 -53t143.5 -143.5t53 -197.5q0 -141 -89 -249l286 -286l-56 -56zM433.5 148q130.5 0 222.5 92t92 222.5t-92 223t-222.5 92.5t-223 -92.5t-92.5 -223
t92.5 -222.5t223 -92z" />
<glyph glyph-name="rmb" unicode="&#xe645;"
d="M512 894q-104 0 -198 -40.5t-162.5 -109t-109 -162.5t-40.5 -198t40.5 -198t109 -162.5t162.5 -109t198 -40.5t198 40.5t162.5 109t109 162.5t40.5 198t-40.5 198t-109 162.5t-162.5 109t-198 40.5zM512 -53q-89 0 -170 34.5t-139.5 93t-93 139.5t-34.5 170t34.5 170
t93 139.5t139.5 93t170 34.5t170 -34.5t139.5 -93t93 -139.5t34.5 -170t-34.5 -170t-93 -139.5t-139.5 -93t-170 -34.5zM659 384q15 0 25.5 10.5t10.5 25.5t-10.5 26t-25.5 11h-111v17l135 141q11 11 10.5 26t-11 25.5t-25.5 10t-26 -11.5l-115 -121l-123 122
q-11 11 -26 10.5t-25.5 -11t-11 -25.5t10.5 -26l135 -135v-22h-108q-15 0 -26 -11t-11 -26t11 -25.5t26 -10.5h108v-73h-108q-15 0 -26 -10.5t-11 -25.5t11 -26t26 -11h108v-108q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v108h111q15 0 25.5 11t10.5 26t-10.5 25.5
t-25.5 10.5h-111v73h111z" />
<glyph glyph-name="gou1" unicode="&#xe617;" horiz-adv-x="1030"
d="M-195 258zM520 866q-98 0 -187.5 -38t-154 -102.5t-102.5 -154t-38 -187.5t38 -187.5t102.5 -154t154 -102.5t187.5 -38t187.5 38t154 102.5t102.5 154t38 187.5t-38 187.5t-102.5 154t-154 102.5t-187.5 38zM857 581l-339 -451l-328 238q-12 9 -14 23.5t6.5 26.5t23 14
t26.5 -6l271 -198l297 396q9 12 23.5 14t26.5 -7t14 -23.5t-7 -26.5z" />
<glyph glyph-name="del" unicode="&#xe621;"
d="M160 576v-640q0 -26 19 -45t45 -19h576q26 0 45 19t19 45v640h-704zM352 0h-64v448h64v-448zM480 0h-64v448h64v-448zM608 0h-64v448h64v-448zM736 0h-64v448h64v-448zM880 768h-208v80q0 20 -14 34t-34 14h-224q-20 0 -34 -14t-14 -34v-80h-208q-20 0 -34 -14t-14 -34
v-80h832v80q0 20 -14 34t-34 14zM608 768h-192v63h192v-63z" />
<glyph glyph-name="heart" unicode="&#xe622;" horiz-adv-x="1173"
d="M586 672q-28 65 -69 113t-86.5 73.5t-96 34t-97.5 -2t-90 -39.5t-75.5 -73t-51.5 -107.5t-20 -138.5q0 -41 9 -78.5t24 -66.5t39 -57.5t47 -48.5t55.5 -43t56.5 -38t58.5 -35.5t53.5 -33.5q93 -61 162 -138.5t82 -120.5q10 39 81.5 118.5t160.5 142.5q24 17 71.5 47
t79 50.5t71.5 54.5t64 67t41 81t16 102q0 75 -19.5 138t-52.5 105.5t-76.5 70.5t-91 37.5t-98 1t-96 -34.5t-85.5 -72.5t-67 -108.5z" />
<glyph glyph-name="home" unicode="&#xe611;"
d="M509 876q-4 -2 -245 -245q-176 -179 -208.5 -213.5t-32.5 -46.5q0 -35 42 -33q7 0 233 227l225 228l226 -228q225 -227 232 -227q21 -1 31.5 7.5t10.5 25.5q0 12 -31.5 46t-206.5 212q-241 243 -246 246q-15 8 -30 1zM171 341q-12 -8 -14 -38.5t-2 -188t2 -188t14 -38.5
q7 -6 352.5 -6t352.5 6q11 8 13 38.5t2 188t-2 188t-13 38.5q-8 7 -21.5 5.5t-21.5 -10.5l-10 -9v-381h-600v381l-10 9q-8 9 -21 10.5t-21 -5.5zM398 298l-11 -12v-215l11 -12q10 -13 25.5 -13t25.5 13l10 12v175h128v-175l11 -12q11 -13 25.5 -13t25.5 13l10 12v215l-20 24
h-231z" />
<glyph glyph-name="duigou" unicode="&#xe646;"
d="M708 553l-257 -267l-135 141q-12 13 -28.5 13t-28 -12.5t-11.5 -29.5t11 -29l164 -170q4 -4 8 -7q12 -7 25.5 -5.5t23.5 12.5l284 295q12 13 12 30t-12 29q-41 16 -56 0zM512 384zM17 384v0q0 101 39 192.5t105.5 158t158 105.5t192.5 39t192.5 -39t158 -105.5
t105.5 -158t39 -192.5v0q0 -101 -39 -192.5t-105.5 -158t-158 -105.5t-192.5 -39t-192.5 39t-158 105.5t-105.5 158t-39 192.5z" />
<glyph glyph-name="icon1" unicode="&#xe60b;" horiz-adv-x="1344"
d="M1280 320h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 -128h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 768
h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5v0z" />
<glyph glyph-name="point1" unicode="&#xe60c;"
d="M1024 384q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257v0z" />
<glyph glyph-name="logo2" unicode="&#xe60d;" horiz-adv-x="1685"
d="M1229 7l289 -135l58 124l-281 131q-21 -54 -66 -120zM944 559v-134h137v258q42 47 62 81l-118 69q-2 -4 -8 -12t-24.5 -30.5t-41 -45.5t-60.5 -54.5t-81 -59.5l75 -114q30 20 59 42zM1524 103v304h-605v-304h137v167h332v-167h136zM1283 253h-137v-66q0 -31 -20 -57.5
t-49.5 -45t-70.5 -34.5t-76.5 -25t-73.5 -17l74 -124q55 14 103 30.5t95.5 43t80.5 58t53.5 75.5t20.5 96v66zM1088 654l31 -133q42 9 85 21q19 -49 59 -78q49 -36 120 -36q45 0 92 14q69 21 133 78l-67 125q-17 -19 -46 -40.5t-60 -31.5q-63 -19 -91 1q-4 3 -8 9
q147 51 240 103l-81 111q-74 -38 -173 -74v85h-137v-129q-50 -14 -97 -25zM755 561v137h-348q11 42 19 84l-134 26q-11 -56 -28 -110h-200v-137h142q-79 -149 -206 -260l90 -103q43 38 85 83v-389h137v165h260v-24h-124l48 -137h83q54 0 92 38t38 92v490h-373q11 22 21 45
h398v0zM312 218h260v-24h-260v24zM312 379h260v-24h-260v24zM1683 816q0 -33 -22.5 -56t-55.5 -23t-56 23t-23 56t23 55.5t56 22.5t55.5 -22.5t22.5 -55.5v0zM1545 816q0 -26 17.5 -44.5t42.5 -18.5t41.5 18t16.5 44q0 27 -16.5 45.5t-42.5 18.5q-25 0 -42 -18.5t-17 -44.5
v0zM1592 775h-17v79q17 2 29 2q18 0 26 -6t8 -17q0 -13 -16 -19v-1q10 -3 14 -19q2 -13 6 -19h-19q-2 3 -6 19q-2 12 -16 12h-9v-31v0zM1593 819h8q18 0 18 12t-16 12q-6 0 -10 -1v-23v0z" />
<glyph glyph-name="logo1" unicode="&#xe60e;" horiz-adv-x="3958"
d="M611 723h-177l-150 -222l-95 222h-178l168 -395v-2l-31 -243h156l30 231zM699 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69v0zM759 317q-5 -41 -35.5 -70.5t-68.5 -29.5
q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 59 -27q27 -30 21 -75v0zM1656 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69v0zM1717 317q-6 -41 -36.5 -70.5t-68.5 -29.5
q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 60 -27q26 -30 21 -75v0zM1332 502q-44 50 -114 50q-51 0 -97 -27l-10 -6l26 204h-156l-80 -640h155l37 288q3 24 22 41t43 17q25 0 40.5 -17.5t11.5 -41.5l-36 -287h156l37 298q10 71 -35 121zM2949 544l-37 -288
q-3 -24 -22 -41t-44 -17q-24 0 -39.5 17.5t-12.5 41.5l37 287h-156l-38 -298q-9 -71 36 -121q43 -50 114 -50q51 0 97 27l9 6l-3 -25h156l58 461h-155zM1951 723l-55 -432h156l55 432h-156zM1970 252q-37 0 -67 -26.5t-34.5 -63.5t18.5 -63q22 -26 59 -26t67 26.5t34 63.5
q5 37 -18 63t-59 26zM2608 262q6 51 -14.5 93.5t-62.5 65.5l-8 5l8 5q39 21 64 57t30 78q8 63 -30 108q-37 44 -97 48l-6 1v0h-314l-81 -640h317q72 3 128.5 55t65.5 124v0zM2451 284q-3 -27 -25 -46.5t-50 -19.5h-106l17 134h107q27 -1 43.5 -20.5t13.5 -47.5v0zM2483 531
q-3 -25 -23 -43t-45 -18h-113l15 124h112q25 0 41.5 -18.5t12.5 -44.5v0zM3132 -127q65 0 124 37.5t89 99.5l264 534h-156l-127 -258l-63 258h-156l113 -471l-7 -14q-8 -18 -25 -29t-36 -11q-10 0 -20 4l-29 11l-67 -139l29 -10q31 -12 67 -12zM3943 730q0 -65 -45 -110.5
t-110.5 -45.5t-111 45.5t-45.5 111t45.5 110.5t111.5 45q65 0 110 -45t45 -111v0zM3670 730q0 -52 34 -88t84 -36q49 -1 82.5 35.5t33.5 87.5q0 53 -33.5 89.5t-84.5 36.5q-49 0 -82.5 -36.5t-33.5 -88.5v0zM3763 650h-35v155q35 5 58 5q36 0 52 -12t16 -34q0 -26 -32 -37
v-2q20 -6 27 -37q5 -26 11 -38h-37q-4 5 -12 38q-4 23 -31 23h-17v-61v0zM3764 737h17q35 0 35 23t-32 23q-13 0 -20 -1v-45v0z" />
<glyph glyph-name="gift" unicode="&#xe620;"
d="M938 372h-30h-370v274h-50v-274h-395h-4q-31 0 -53 21.5t-22 52.5v175q0 31 22 53t53 22h90q-40 47 -40 100q0 27 10 47.5t25 30t29.5 15t24.5 6.5l11 1q53 0 100 -15.5t81 -42t56 -50t39 -50.5q17 27 39.5 51t56 50t79.5 41.5t98 15.5q4 0 11 -1t24 -7t30 -15.5
t24 -30.5t11 -49q0 -51 -35 -97h85q31 0 53 -22t22 -53v-175q0 -31 -22 -52.5t-53 -21.5zM264 821q-15 0 -26 -2.5t-15.5 -6t-6.5 -7.5t-2 -6v-3q0 -49 66 -100h173q-14 30 -30 52.5t-34 35.5t-33 21t-34.5 11.5t-30 4t-27.5 0.5zM763 819q-17 0 -27.5 -1t-29.5 -4
t-33.5 -11t-32 -20.5t-33.5 -34.5t-30 -52h177q59 50 59 97q2 0 0 6.5t-14 13t-36 6.5zM488 -128h-349q-31 0 -53 22t-22 53v375h424v-450zM538 322h400v-375q0 -31 -22 -53t-53 -22h-325v450z" />
<glyph glyph-name="phone" unicode="&#xe63e;"
d="M521 401zM768 -94q-94 0 -205 56q-145 72 -277 204.5t-205 277.5q-55 113 -56.5 201t52.5 140q13 13 30 13t29.5 -13t12.5 -30t-12 -30q-32 -32 -26.5 -98t47.5 -149q68 -137 187.5 -256.5t256.5 -187.5q83 -42 149 -47.5t98 26.5q13 13 30 13t30 -13t13 -30t-13 -30
q-54 -47 -141 -47zM333 439q-26 0 -39 26q-9 16 -4 32.5t21 23.5l99 46q15 8 26 23t8 33q0 13 -17 30l-141 145q-20 20 -56 13q-12 -7 -25 -13l-68 -73q-13 -12 -30 -12t-30 12.5t-13 29.5t13 30l68 68q28 28 60 34q80 20 141 -34l140 -140q32 -32 39 -82q6 -41 -16.5 -81.5
t-64.5 -63.5l-98 -47h-13zM875 -55q-17 0 -30 12.5t-13 29.5t13 30l68 68q5 6 7.5 8.5t4 7t1.5 10.5q7 35 -13 55l-141 141q-4 4 -30 17q-18 3 -33 -7t-22 -27l-47 -98q-6 -16 -22.5 -21.5t-32.5 4.5q-17 6 -22 22.5t4 32.5l47 99q23 42 62 64.5t83 16.5q45 -7 77 -39
l141 -141q29 -28 38 -65t-4 -75q-17 -43 -34 -60l-72 -73q-13 -12 -30 -12zM602 171q-9 0 -26 8q-77 58 -154 128q-76 77 -128 154q-9 12 -6 29.5t19 30.5q16 9 33 6.5t27 -15.5q69 -95 119 -141q94 -85 141 -119q16 -10 18.5 -27t-9.5 -33q-6 -21 -34 -21z" />
<glyph glyph-name="comment" unicode="&#xe63f;" horiz-adv-x="1025"
d="M512 18q-11 0 -31 -1t-36.5 -1t-30.5 2l-222 -146q0 227 5 243q-91 65 -144 152.5t-53 189.5q0 122 68.5 223t186 158.5t257.5 57.5t257.5 -57.5t186 -158.5t68.5 -222.5t-68.5 -223t-186 -159t-257.5 -57.5v0zM512 847q-122 0 -229 -52.5t-170.5 -143t-63.5 -194.5
q0 -95 53 -179t142 -138v-170l146 97q16 -3 35.5 -4t49 0t37.5 1q122 0 229 53.5t170.5 144.5t63.5 195t-63.5 194.5t-170.5 143t-229 52.5v0zM768 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5v0zM512 384
q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5v0zM256 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5v0z" />
<glyph glyph-name="03tanhao" unicode="&#xe628;"
d="M505 860q95 0 182 -37t150 -100t100.5 -150t37.5 -182t-37.5 -182t-100.5 -150t-150 -100.5t-182 -37.5t-182 37.5t-150 100.5t-100 150t-37 182t37 182t100 150t150 100t182 37v0zM505 -20q112 0 206.5 55t149.5 149.5t55 206t-55 206t-149.5 149.5t-206 55t-206 -55
t-149.5 -149.5t-55 -206t55 -206t149.5 -149.5t205.5 -55v0zM528 222v-59h-58v59h58zM470 648h58v-349h-58v349z" />
<glyph glyph-name="file" unicode="&#xe632;"
d="M313 247h397v69h-397v-69zM313 110h397v68h-397v-68zM611 831h-430q-14 0 -23.5 -10t-9.5 -24v-825q0 -14 9.5 -24t23.5 -10h661q14 0 24 10t10 24v619zM644 710l131 -119h-131v119zM809 7h-595v755h364v-206q0 -14 9.5 -24t23.5 -10h198v-515zM313 384h397v69h-397v-69z
" />
<glyph glyph-name="home1" unicode="&#xe62a;"
d="M497 890l-451 -386q-20 -18 -20 -45v-500q0 -32 22.5 -54.5t53.5 -22.5h256v333h308v-333h256q31 0 53.5 22.5t22.5 54.5v500q0 27 -20 45l-451 386q-15 13 -30 0v0z" />
<glyph glyph-name="mine" unicode="&#xe62b;"
d="M761 623q0 -104 -73 -177t-176.5 -73t-177 73t-73.5 177t73.5 177t177 73t176.5 -73t73 -177zM888 -80q11 22 9 48q-7 99 -60 181.5t-139 130t-186.5 47.5t-187 -47.5t-139.5 -130t-60 -181.5q-1 -26 10 -48q12 -25 40 -25h673q27 0 40 25v0z" />
<glyph glyph-name="shoppingcard" unicode="&#xe62c;" horiz-adv-x="1048"
d="M832 -42.5q0 -35.5 -25 -60.5t-60.5 -25t-60.5 25t-25 60.5t25 60.5t60.5 25t60.5 -25t25 -60.5zM533 -42.5q0 -35.5 -25 -60.5t-60 -25t-60 25t-25 60.5t25 60.5t60 25t60 -25t25 -60.5zM277 704l-35 159q-3 14 -15 23.5t-27 9.5h-147q-22 0 -37.5 -15.5t-15.5 -37.5
t15.5 -38t37.5 -16h54l157 -627q6 -25 25.5 -40t44.5 -15h527q25 0 44.5 15t25.5 40l113 452q9 34 -13 62t-57 28h-697v0z" />
<glyph glyph-name="shopping" unicode="&#xe62d;"
d="M442 358h-84v-76h-230v76h-81q-20 0 -33.5 -12.5t-13.5 -31.5v-395q0 -20 13.5 -33.5t33.5 -13.5h395q19 0 31.5 13.5t12.5 33.5v395q0 19 -12.5 31.5t-31.5 12.5zM977 896h-81v-77h-230v77h-84q-19 0 -31.5 -13.5t-12.5 -33.5v-395q0 -19 12.5 -31.5t31.5 -12.5h395
q20 0 33.5 12.5t13.5 31.5v395q0 20 -13.5 33.5t-33.5 13.5zM977 358h-81v-76h-230v76h-84q-19 0 -31.5 -12.5t-12.5 -31.5v-395q0 -20 12.5 -33.5t31.5 -13.5h395q20 0 33.5 13.5t13.5 33.5v395q0 19 -13.5 31.5t-33.5 12.5v0z" />
<glyph glyph-name="shopping1" unicode="&#xe627;"
d="M741 342q-23 9 -22 34q6 114 -8 186q-13 68 -37.5 125.5t-48 89.5t-50.5 57t-38 32t-18 10l-7 3l-7 -3q-7 -3 -18 -10t-38 -32t-50.5 -57t-48 -89.5t-37.5 -125.5q-14 -72 -8 -186q1 -25 -22 -34q-25 -11 -47.5 -26t-47 -40.5t-39 -65t-14.5 -87.5v-16h198v0
q2 -22 17.5 -36.5t37.5 -14.5h248q22 0 37.5 14.5t17.5 36.5v0h198v16q0 48 -14.5 87.5t-39 65t-47 40.5t-47.5 26v0zM512 526q-31 0 -53 22t-22 53t22 53t53 22t53 -22t22 -53t-22 -53t-53 -22v0zM453 23q-14 0 -23.5 -10t-9.5 -24v-83q0 -14 9.5 -24t23.5 -10t24 10t10 24
v83q0 14 -10 24t-24 10zM571 23q-14 0 -24 -10t-10 -24v-83q0 -14 10 -24t24 -10t23.5 10t9.5 24v83q0 14 -9.5 24t-23.5 10v0z" />
<glyph glyph-name="importedlayers" unicode="&#xe629;"
d="M512 893v0v0q-58 0 -112.5 -12t-105.5 -38t-80.5 -44t-77.5 -51v-450q0 -57 19.5 -110.5t49 -93.5t69 -76t75.5 -59.5t73.5 -43t57 -28t32.5 -12.5q13 4 32.5 12.5t57 28t73.5 43t75.5 59.5t69 76t49 93.5t19.5 110.5v450q-48 33 -77.5 51t-80.5 44t-105.5 38t-112.5 12
v0zM808 298q0 -76 -36.5 -138t-112.5 -117q-73 -53 -147 -82q-74 29 -147 82q-76 55 -112.5 117t-36.5 138v421q87 53 146.5 75t149.5 23q90 -1 149.5 -23t146.5 -75v-421v0zM512 755q-67 0 -112.5 -12.5t-119.5 -49.5v-399q0 -35 12.5 -68.5t30 -57.5t44 -46t47 -35.5
t46 -26t34 -16t18.5 -6.5q10 3 18.5 6.5t34 16t46 26t47 35.5t44 46t30 57.5t12.5 68.5v399q-74 37 -119.5 49.5t-112.5 12.5v0v0v0zM667 599v-47h-105v-67h92v-61h-92v-77h116v-57h-332v57h42v168h64v-168h46v205h-138v61h307v-14v0z" />
<glyph glyph-name="huodaofukuan" unicode="&#xe62e;" horiz-adv-x="1639"
d="M1 867h1045v-625h-1045v625v0zM1424 867h-337v-625l61 -33q33 14 70 14q66 0 116 -42t61 -105l7 -4h205v398l-183 397v0zM1178 495v290h164l121 -290h-285v0zM235 209h-235v-163h111q2 57 36.5 101.5t87.5 61.5zM452 38q0 66 -47 112.5t-113.5 46.5t-114 -46.5
t-47.5 -112.5t47.5 -112.5t114 -46.5t113.5 46.5t47 112.5zM1067 209h-721q54 -17 88.5 -61.5t36.5 -101.5h570q0 50 26 92v71zM1380 40q0 66 -47 112.5t-113.5 46.5t-113.5 -46.5t-47 -112.5t47 -112.5t113.5 -46.5t113.5 46.5t47 112.5v0z" />
<glyph glyph-name="pay" unicode="&#xe62f;"
d="M474 112v161h-167v50h167v74h-167v49h134l-168 265h87l152 -257v386q-35 0 -70.5 2t-64 6t-55 8.5t-46.5 8.5t-34.5 8t-22.5 6t-7 2q-2 -43 -16.5 -74t-34 -44t-38.5 -20t-33 -7h-13q0 -40 1.5 -78t3.5 -69t5.5 -59.5t7 -51t6.5 -41.5t6.5 -32.5t5.5 -23t3.5 -14
l1.5 -4.5q15 -61 45 -120.5t65.5 -105.5t75 -87t76.5 -70.5t67 -50.5t47.5 -32t17.5 -10v225h-38zM550 112v161h167v50h-167v74h167v49h-134l168 265h-87l-152 -257v386q76 0 151 10.5t112 20.5l37 10q2 -43 16.5 -74t34 -44t38.5 -20t33 -7h13q0 -234 -40 -368l-1 -5
q-15 -61 -44.5 -120.5t-65.5 -105.5t-75.5 -87t-76.5 -70.5t-66.5 -50.5t-47.5 -32t-18 -10v225h38v0z" />
<glyph glyph-name="car" unicode="&#xe633;" horiz-adv-x="1304"
d="M1303 538l-161 242h-304v-443h233q19 0 32.5 14t13.5 33t-13.5 33t-32.5 14h-140v256h161l118 -177v-242h-442v577q0 21 -15 36t-36 15h-666q-21 0 -36 -15t-15 -36v-620q0 -21 15 -35.5t36 -14.5h142q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140
q0 56 -31 105h363q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140q0 56 -31 105h77v363v0zM93 803h582v-535h-582v535zM465 70q0 -43 -30.5 -74t-74 -31t-74 31t-30.5 74t30.5 74t74 31t74 -31t30.5 -74v0zM1164 70q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74
t74 31t74 -31t31 -74v0z" />
<glyph glyph-name="card" unicode="&#xe634;" horiz-adv-x="1476"
d="M1403 896h-1331q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h1331q30 0 51.5 21t21.5 51v880q0 30 -21.5 51t-51.5 21v0zM120 776h1235v-151h-1235v151zM120 414h1235v-422h-1235v422zM211 294h572v-61h-572v61zM211 173h331v-60h-331v60z" />
<glyph glyph-name="dl" unicode="&#xe635;"
d="M512 881q-102 0 -194.5 -39.5t-160 -106.5t-107 -160t-39.5 -194.5t39.5 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t39.5 194.5t-39.5 194.5t-107 160t-160 106.5t-194.5 39.5v0zM512 -34q-112 0 -207.5 55.5t-151 151t-55.5 208t55.5 207.5
t151 150.5t207.5 55.5t207.5 -55.5t151 -150.5t55.5 -207.5t-55.5 -208t-151 -151t-207.5 -55.5v0zM512 555q25 0 43 -18t18 -44h87q0 50 -29 89t-75 53v50q0 9 -6.5 15.5t-15.5 6.5h-44q-9 0 -15.5 -6.5t-6.5 -15.5v-50q-46 -14 -75 -53t-29 -89q0 -104 133 -154
q27 -9 44 -20t23 -22t7.5 -16.5t1.5 -13.5q0 -25 -18 -43t-43 -18t-43 18t-18 43h-87q0 -49 29 -88t75 -54v-50q0 -9 6.5 -15t15.5 -6h44q9 0 15.5 6t6.5 15v50q46 15 75 54t29 88q0 105 -133 154q-27 10 -44 21t-23 22t-7.5 16.5t-1.5 12.5q0 26 18 44t43 18v0z" />
<glyph glyph-name="map" unicode="&#xe637;"
d="M512 656q-63 0 -107.5 -44.5t-44.5 -107.5t44.5 -107.5t107.5 -44.5t107.5 44.5t44.5 107.5t-44.5 107.5t-107.5 44.5zM512 880q-102 0 -188.5 -50.5t-136.5 -137t-50 -188.5q0 -56 36 -137.5t81 -151t104 -146.5t85 -107t44 -50l25 -28l25 28q18 20 44 50t85 107
t104 146.5t81 151t36 137.5q0 102 -50 188.5t-136.5 137t-188.5 50.5v0zM512 -13q-46 54 -93.5 115.5t-98.5 137t-83 147t-32 117.5q0 127 90 217t217 90t217 -90t90 -217q0 -46 -32 -117.5t-83 -147t-98.5 -137t-93.5 -115.5v0z" />
<glyph glyph-name="nav" unicode="&#xe638;" horiz-adv-x="1335"
d="M1273 -4h-1179q-26 0 -44 -18t-18 -44t18 -44t44 -18h1179q26 0 44 18t18 44t-18 44t-44 18zM841 741h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44t46 -18zM841 314h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44
t46 -18zM85 314h434q26 0 44 18t18 44v435q0 25 -18 43.5t-44 18.5h-434q-26 0 -44 -18.5t-18 -43.5v-435q0 -25 18 -43.5t44 -18.5v0zM147 749h310v-311h-310v311z" />
<glyph glyph-name="qt" unicode="&#xe639;"
d="M507 895q-101 0 -194 -40t-160 -107t-107 -160t-40 -194.5t40 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t40 194.5t-40 194.5t-107 160t-160 107t-195 40v0zM507 -20q-112 0 -207.5 55.5t-150.5 150.5t-55 207.5t55 208t150.5 151t208 55.5
t207.5 -55.5t150.5 -151t55.5 -208t-55.5 -207.5t-150.5 -150.5t-208 -55.5v0zM506 689h-1h-1q-67 0 -115 -47q-48 -48 -48 -116q0 -18 12.5 -31t30.5 -13t31 13t13 31q0 32 22 54q22 21 55 22q30 -1 52.5 -23t22.5 -52q1 -24 -12 -43t-34 -29q-34 -14 -54 -44.5t-20 -68.5
v-36q0 -18 13 -30.5t31 -12.5t31 12.5t13 30.5v36q0 24 20 33q46 20 73 61.5t26 91.5q-1 66 -48 113t-113 48zM504 219q-23 0 -39 -16t-16 -38.5t16 -38.5t39 -16t38.5 16t15.5 38.5t-15.5 38.5t-38.5 16v0z" />
<glyph glyph-name="save" unicode="&#xe63b;" horiz-adv-x="1199"
d="M1149 896h-1099q-21 0 -35.5 -14.5t-14.5 -35.5v-350q0 -20 14.5 -35t35.5 -15h1099q21 0 35.5 15t14.5 35v350q0 21 -14.5 35.5t-35.5 14.5v0zM100 796h999v-250h-999v250zM1024 396q-21 0 -35.5 -14.5t-14.5 -34.5v-375h-749v375q0 20 -14.5 34.5t-35.5 14.5
t-35.5 -14.5t-14.5 -34.5v-425q0 -21 14.5 -35.5t35.5 -14.5h849q21 0 35.5 14.5t14.5 35.5v425q0 20 -14.5 34.5t-35.5 14.5zM325 396q-21 0 -35.5 -14.5t-14.5 -34.5v-200q0 -21 14.5 -35.5t35.5 -14.5h549q21 0 35.5 14.5t14.5 35.5v200q0 20 -14.5 34.5t-35.5 14.5
t-35.5 -14.5t-14.5 -34.5v-150h-449v150q0 20 -15 34.5t-35 14.5v0z" />
<glyph glyph-name="say" unicode="&#xe63c;" horiz-adv-x="1048"
d="M297.5 521q-20.5 0 -35 -14.5t-14.5 -35.5t14.5 -35.5t35 -14.5t35.5 14.5t15 35.5t-15 35.5t-35.5 14.5zM953 29q95 93 95 215t-94 214v0q2 20 2 23q0 111 -64 205t-174.5 148.5t-240 54.5t-239.5 -54.5t-174 -148.5t-64 -205q0 -78 33 -148.5t93 -125.5l-77 -123
q-8 -12 -6.5 -26t10.5 -25q13 -15 32 -15q9 0 18 4l180 80q4 2 7 4q20 -7 39 -12v0q48 -80 138.5 -128t199.5 -48q75 0 145 25q1 -1 1.5 -1h0.5l140 -62q8 -4 17 -4q20 0 32 15q10 10 11 24t-7 26l-54 88v0zM286 244q0 -17 2 -35v0.5v0.5q-88 42 -140.5 114t-52.5 157
t51.5 157t139.5 114t192 42q142 0 249.5 -76.5t128.5 -189.5v0q-88 43 -189 43q-104 0 -191.5 -43.5t-138.5 -119t-51 -164.5v0zM381 244q0 96 84 164t202 68t202 -68t84 -163.5t-84 -163.5t-202 -68t-202 68t-84 163v0zM527 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5
t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM667 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM806 275q-16 0 -27 -11t-11 -27t11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11v0z" />
<glyph glyph-name="news" unicode="&#xe636;"
d="M947 759h-892q-23 0 -39 -16t-16 -38v-642q0 -23 16 -39t39 -16h892q22 0 38 16t16 39v642q0 22 -16 38t-38 16v0zM836 668l-335 -260l-336 260h671v0zM91 100v511l376 -293q15 -11 33.5 -11t33.5 11l376 293v-511h-819v0z" />
<glyph glyph-name="quan" unicode="&#xe63a;"
d="M964 460q21 1 35 16t14 36v147q0 21 -15.5 36.5t-36.5 15.5h-898q-21 0 -36.5 -15.5t-15.5 -36.5v-147q0 -21 14 -36t35 -16q29 -2 49.5 -24t20.5 -52t-20.5 -52t-49.5 -24q-21 -1 -35 -16t-14 -36v-147q0 -21 15.5 -36.5t36.5 -15.5h898q21 0 36.5 15.5t15.5 36.5v147
q0 21 -14 36t-35 16q-29 2 -49.5 24t-20.5 52t20.5 52t49.5 24v0zM926 227v-83h-828v83q52 15 85.5 58.5t33.5 98.5t-33.5 98.5t-85.5 58.5v83h283v-66h66v66h479v-83q-52 -15 -85.5 -58.5t-33.5 -98.5t33.5 -98.5t85.5 -58.5v0zM381 362h66v-109h-66v109zM381 515h66v-109
h-66v109zM381 210h66v-66h-66v66z" />
<glyph glyph-name="comment1" unicode="&#xe63d;"
d="M512 13q-131 0 -241.5 55t-175 149.5t-64.5 205.5t64.5 205.5t175 149.5t241.5 55t241.5 -55t175 -149.5t64.5 -205.5t-64.5 -205.5t-175 -149.5t-241.5 -55v0zM512 751q-108 0 -200 -44t-145.5 -119.5t-53.5 -164.5t53.5 -164.5t145.5 -119.5t200 -44t200 44
t145.5 119.5t53.5 164.5t-53.5 164.5t-145.5 119.5t-200 44v0zM730 75l184 -82l-102 164zM914 -44q-8 0 -15 3l-184 82q-14 6 -19.5 20.5t0.5 28.5t20.5 19.5t28.5 -1.5l74 -33l-39 62q-8 13 -4.5 28t16.5 23t28 4.5t23 -16.5l102 -164q15 -23 -3 -43q-11 -13 -28 -13z
M379 412.5q0 -21.5 -15 -36.5t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36.5zM563 412.5q0 -21.5 -15 -36.5t-36 -15t-36 15t-15 36.5t15 36.5t36 15t36 -15t15 -36.5zM748 413q0 -22 -15 -37t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15
t15 -36v0z" />
<glyph glyph-name="importedlayers1" unicode="&#xe641;" horiz-adv-x="1045"
d="M522 893q-103 0 -197 -40t-162 -108t-108.5 -162t-40.5 -197.5t40.5 -197.5t108.5 -162t162 -108t197.5 -40t197.5 40t162 108t108 162t40 197.5t-40 197.5t-108 162t-162 108t-198 40v0zM522 -49q-88 0 -168.5 34.5t-138.5 93t-92.5 138.5t-34.5 168.5t34.5 169
t92.5 138.5t138.5 92.5t169 34.5t168.5 -34.5t138.5 -92.5t93 -138.5t34.5 -169t-34.5 -168.5t-93 -138.5t-138.5 -93t-169 -34.5v0zM775 268l-105 61v0q-11 4 -21 6.5t-18 2.5t-15 -0.5t-13 -4t-10 -5.5t-8.5 -6.5l-6.5 -6.5t-5.5 -6.5l-3.5 -4.5l-6 -10q-34 -4 -59 21
l-51 50q-24 25 -20 60l9 4q3 5 16 16t17 18t4 25t-11 43h-1l-60 105q-12 20 -33 25.5t-41 -5.5l-62 -36q-6 -3 -14 -11.5t-13 -14.5l-5 -6q-14 -87 24.5 -183.5t121.5 -174.5q72 -68 157 -101.5t165 -29.5q4 1 10.5 2.5t20.5 10t21 20.5l36 62q11 20 5.5 41.5t-25.5 32.5v0z
" />
<glyph glyph-name="aa" unicode="&#xe642;"
d="M439 324h110l-54 148zM501 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105.5 -158.5t158 -105.5t192.5 -39t192.5 39t158 105.5t105.5 158.5t39 192.5t-39 192.5t-105.5 158t-158 105.5t-192.5 39.5v0zM656 180l-19 -9q-5 -3 -11 -3
q-5 0 -9 2q-10 4 -14 14l-27 69h-163l-25 -69q-4 -10 -14.5 -14t-19.5 1l-20 9q-9 4 -12.5 13t-0.5 18l151 401q6 16 23 16t23 -16l151 -401q3 -9 -0.5 -18t-12.5 -13v0z" />
<glyph glyph-name="askic1" unicode="&#xe643;" horiz-adv-x="1124"
d="M859 896h-595q-109 0 -186.5 -77.5t-77.5 -186.5v-760l200 135q18 14 49.5 24t63.5 14.5t71.5 6.5t66 2t57 -1t34.5 -1h317q109 0 186.5 77.5t77.5 186.5v316q0 109 -77.5 186.5t-186.5 77.5v0zM477 367q-42 0 -71.5 29.5t-29.5 70.5t29.5 70t71.5 29t71.5 -29t29.5 -70
t-29.5 -70.5t-71.5 -29.5v0zM848 367q-42 0 -71.5 29.5t-29.5 70.5t29.5 70t71.5 29t71.5 -29t29.5 -70t-29.5 -70.5t-71.5 -29.5v0z" />
<glyph glyph-name="qq" unicode="&#xe644;"
d="M523 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105.5 -158.5t158 -105.5t192.5 -39t192.5 39t158 105.5t105.5 158.5t39 192.5t-39 192.5t-105.5 158t-158 105.5t-192.5 39.5v0zM739 224q8 -8 7.5 -18.5t-8.5 -17.5q-11 -10 -15 -14
q-7 -7 -17 -7v0q-10 0 -18 7l-34 34q-59 -42 -131 -42q-94 0 -160.5 66.5t-66.5 160.5t67 160.5t160.5 66.5t160 -66.5t66.5 -160.5q0 -75 -45 -135l34 -34v0zM592 337q8 7 18 6.5t17 -7.5l27 -27q25 39 25 84q0 64 -45.5 109.5t-110 45.5t-110 -45.5t-45.5 -109.5
t45.5 -109.5t109.5 -45.5q44 0 80 21l-27 28q-8 7 -7.5 18t7.5 18l16 14v0z" />
<glyph glyph-name="39" unicode="&#xe647;"
d="M512 -92q-97 0 -185 37.5t-152 101.5t-101.5 152t-37.5 185t37.5 185t101.5 152t152 101.5t185 37.5t185 -37.5t152 -101.5t101.5 -152t37.5 -185t-37.5 -185t-101.5 -152t-152 -101.5t-185 -37.5zM512 828q-90 0 -172.5 -35t-142 -94.5t-94.5 -142t-35 -172.5t35 -172.5
t94.5 -142t142 -94.5t172.5 -35t172.5 35t142 94.5t94.5 142t35 172.5t-35 172.5t-94.5 142t-142 94.5t-172.5 35z" />
<glyph glyph-name="z" unicode="&#xe649;"
d="M875 126l-363 -164l-363 164v610q247 75 363 75t363 -75v-610zM930 808q-34 11 -84.5 26t-159.5 38.5t-174 23.5t-174 -23.5t-159.5 -38.5t-84.5 -26q-14 -4 -22 -15.5t-8 -25.5v-669q0 -27 25 -39l405 -183q9 -3 18 -3t18 3l405 183q25 12 25 39v669q0 14 -8 25.5
t-22 15.5v0zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />
<glyph glyph-name="shijian1" unicode="&#xe64a;"
d="M510.5 -61q-90.5 0 -173.5 35.5t-142.5 95t-95 142.5t-35.5 173.5t35.5 173.5t95 142.5t142.5 95t173.5 35.5t173.5 -35.5t142.5 -95t95 -142.5t35.5 -173.5t-35.5 -173.5t-95 -142.5t-142.5 -95t-173.5 -35.5zM510.5 793q-110.5 0 -204.5 -54.5t-148.5 -148.5
t-54.5 -204.5t54.5 -204.5t148.5 -148.5t204.5 -54.5t204.5 54.5t148.5 148.5t54.5 204.5t-54.5 204.5t-148.5 148.5t-204.5 54.5zM491 347q-8 0 -13.5 5.5t-5.5 13.5v330q0 8 5.5 14t13.5 6t14 -6t6 -14v-330q0 -8 -6 -13.5t-14 -5.5zM763 347h-272q-8 0 -13.5 5.5
t-5.5 13.5t5.5 13.5t13.5 5.5h272q8 0 13.5 -5.5t5.5 -13.5t-5.5 -13.5t-13.5 -5.5z" />
<glyph glyph-name="huo" unicode="&#xe64b;"
d="M379 -128q-57 0 -122 51.5t-97 132.5q-26 71 -27 149.5t24 151.5q11 33 32.5 70.5t37 58.5t46.5 62q17 20 51 68l11 14l23 34.5t21 34.5t18.5 38.5t11.5 38t4 42.5t-7 44q-6 11 7 24q7 7 20 7q149 -50 216 -284q27 50 58 69q12 6 23 0t11 -21q-3 -59 11.5 -126.5
t42.5 -126.5q4 -5 9 -17t8 -17q51 -89 55 -157q4 -63 -14.5 -126.5t-65.5 -120t-115 -80.5q-30 -11 -61 -11q-18 0 -30.5 5t-18 12.5t-7.5 13t-2 10.5q0 7 2 13t4 10t7.5 9.5t7.5 7t9 6.5t8 6l3 3q36 26 54 75.5t7 95.5q-4 28 -27 75q-2 6 -7.5 20t-8.5 22t-6.5 20t-4.5 23
q0 -2 -2 -5t-2 -5q-15 -42 -20 -75q0 -45 7 -58q7 -5 7.5 -14.5t-4.5 -16.5q-5 -8 -14 -10t-17 3v0v0v0q-67 44 -85 120q7 34 7 78v21v24q0 68 -10 92q-14 -53 -28 -72q-22 -39 -37 -58q-6 -6 -15.5 -20t-12.5 -18q-13 -22 -24 -46.5t-21.5 -61.5t-5.5 -78t28 -76
q3 -7 7.5 -12.5t8 -10t8.5 -10t7.5 -8t8 -7t7.5 -6.5t7.5 -6.5t6.5 -4.5q11 -9 16.5 -14.5t10 -14.5t0.5 -19q-5 -18 -21.5 -29.5t-39.5 -11.5v0z" />
<glyph glyph-name="shanchu" unicode="&#xe64c;"
d="M911 725h-242v123q0 21 -13.5 34.5t-34.5 13.5h-246q-20 0 -33.5 -13.5t-13.5 -34.5v-123h-246q-21 0 -34.5 -13.5t-13.5 -34t13.5 -34t34.5 -13.5h293h243h293q21 0 34.5 13.5t13.5 34t-13.5 34t-34.5 13.5zM423 725v72h147v-72h-147zM765 579q-21 0 -34.5 -14
t-13.5 -34v-560h-441v560q0 20 -13.5 34t-34 14t-34 -14t-13.5 -34v-611q0 -21 13.5 -34.5t34.5 -13.5h536q20 0 33.5 13.5t13.5 34.5v611q3 20 -11.5 34t-35.5 14zM447 67v389q0 20 -13.5 33.5t-34 13.5t-34 -13.5t-13.5 -33.5v-389q0 -21 13.5 -34.5t34 -13.5t34 13.5
t13.5 34.5zM645 67v389q0 20 -13.5 33.5t-34.5 13.5q-20 0 -35.5 -13.5t-15.5 -33.5v-389q0 -21 13.5 -34.5t34.5 -13.5t36 13.5t15 34.5z" />
<glyph glyph-name="2" unicode="&#xe64d;"
d="M562 224h109v-111h-109v111zM889 224h109v-111h-109v111zM562 113h109v-110h-109v110zM438 458h-438v438h438v-438zM111 569h216v216h-216v-216zM1000 458h-438v438h438v-438zM673 569h216v216h-216v-216zM438 -106h-438v438h438v-438zM111 5h216v216h-216v-216zM561 335
h222v-111h-222v111zM889 334h109v-111h-109v111zM780 113h109v-111h-109v111zM562 2h218v-110h-218v110zM889 2h109v-110h-109v110z" />
<glyph glyph-name="cuxiaobiaoqian" unicode="&#xe6b5;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5q104 0 199 40.5t163.5 109t109 163.5t40.5 199q0 139 -68.5 257t-186.5 186.5t-257 68.5zM789 369l-85 -85l-51 51l64 65l2 183l-183 -1l-277 -276q-5 -5 0 -10l171 -171
q5 -5 10 0l161 160l52 -51l-161 -162q-23 -23 -57 -23t-57 23l-171 171q-24 24 -24 57t24 57l296 297l288 2z" />
</font>
</defs></svg>
... ...
No preview for this file type
No preview for this file type
<div class="normal-box">
{{#goodPools}}
<div class="cart-brand box good-pools-data">
{{#if isPromotion}}
<div class="promotion-header {{#if promotionMore}}more-box{{/if}}">
{{#promotions}}
<div class="promo-item" data-id="{{promotionId}}" data-title="{{promotionOriginTitle}}" data-type="{{promotionType}}" data-status="{{status}}">
<div class="info"><i class="iconfont cuxiao"></i>{{promotionTitle}}</div>
{{#if optTitle}}
<div class="opt to-gift">
<a href="javascript:;">{{optTitle}}</a><i class="iconfont to-arrow"></i>
</div>
{{/if}}
</div>
{{/promotions}}
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
</div>
{{#sub_pool}}
{{#if isPromotion}}
<div class="promos {{#if promotionMore}}more-box{{/if}}">
{{#promotions}}
<div class="promo-item" data-id="{{promotionId}}" data-title="{{promotionOriginTitle}}" data-type="{{promotionType}}" data-status="{{status}}">
<div class="info">
<span class="flag">{{promotionFlag}}</span>{{promotionTitle}}
</div>
<div class="opt to-gift">
<a href="javascript:;">{{optTitle}}</a><i class="iconfont to-arrow"></i>
</div>
</div>
{{/promotions}}
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
</div>
{{/if}}
{{#goods}}
{{> cart-good}}
{{/goods}}
{{/sub_pool}}
{{/if}}
{{#if isBrand}}
<div class="good-list">
{{#goods}}
{{> cart-good}}
{{/goods}}
</div>
{{/if}}
</div>
{{/goodPools}}
{{#goods}}
<div class="cart-brand box goods-data">
<div class="good-list">
{{> cart-good}}
</div>
</div>
{{/goods}}
</div>
{{#if freebieOrAdvanceBuy}}
<div class="all-gift-box box">
{{#if advanceBuyCount}}
<div class="gift-item advanceBuy">
<div class="flag">
<i class="iconfont price-gift"></i>
</div>
<div class="content">
<div class="info">已满足全场加价购</div>
<div class="opt to-gift">
<a href="javascript:;">去换购</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
{{/if}}
{{#if giftCount}}
<div class="gift-item freebie">
<div class="flag">
<i class="iconfont gift"></i>
</div>
<div class="content">
<div class="info">已满足全场赠品</div>
<div class="opt to-gift">
<a href="javascript:;">领赠品</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
{{/if}}
</div>
{{/if}}
{{#if hasNoSaleGoods}}
<div class="disable-box box">
{{#notValidGoods}}
{{> cart-good}}
{{/notValidGoods}}
{{#offShelveGoods}}
{{> cart-good}}
{{/offShelveGoods}}
<div class="remove-all">
<button class="btn btn-remove">清空失效商品</button>
</div>
</div>
{{/if}}
<div class="total box">
{{#if promotionInfo.length}}
<div class="activity-title">
<h1>已参与活动</h1>
</div>
<div class="activity">
<ul>
{{#promotionInfo}}
<li>{{name}}</li>
{{/promotionInfo}}
</ul>
</div>
{{/if}}
<div class="price-compute">
<p>{{formulaPrice}}</p>
</div>
</div>
<div class="cart-footer">
<div class="check-all">
<i class="iconfont chk select {{#if isAllSelected}}checked{{/if}}"></i>
<i class="iconfont chk edit"></i>
<p>全选</p>
</div>
<div class="opts edit">
<button class="btn btn-gray btn-fav">移入<br>收藏夹</button>
<button class="btn btn-red btn-del">删除</button>
</div>
<div class="opts bill ">
<div class="total">
<p class="price">总计:¥{{sumPrice}}&nbsp;&nbsp;({{count}}件)</p>
<p class="intro">不含运费</p>
</div>
<button class="btn btn-red btn-balance">结算</button>
</div>
</div>
\ No newline at end of file
... ...
<div class="good-item{{#if lowStocks}} low-stocks{{/if}}{{#if isStudents}} is-students{{/if}}{{#if isVipPrice}} is-vip-price{{/if}}{{#ifand checked showCheckbox}} is-checked{{/ifand}}{{#if noEdit}} no-edit{{/if}}{{#if inValid}} in-valid{{/if}}{{#if inValidLow}} in-valid-low{{/if}}{{#ifor isGift isAdvanceBuy}} is-gift{{/ifor}}" data-promotion="{{promotion_id}}" data-id="{{id}}" data-skn="{{skn}}" data-mnum="{{minNumber}}" data-link="{{link}}">
<div class="opt">
{{#if showCheckbox}}
<i class="iconfont chk select{{#if checked}} checked{{/if}}"></i>
{{/if}}
<i class="iconfont chk edit"></i>
{{#inValid}}
<span class="disable fill-text">失效</span>
{{/inValid}}
</div>
<div class="good-new-info">
<a href="javascript:;" class="img-a">
<div class="img">
<img class="thumb lazy" data-original="{{thumb}}" alt="">
{{#isGift}}
<div class="flag gift"><div class="text">赠品</div></div>
{{/isGift}}
{{#isAdvanceBuy}}
<div class="flag price-gift"><div class="text">加价购</div></div>
{{/isAdvanceBuy}}
</div>
</a>
<div class="info">
<div class="fixed-height">
<div class="intro intro-name">
<div class="name-row">
<div class="name">
<a href="javascript:;">{{name}}</a>
</div>
</div>
<p class="color-size-row"><span class="color">颜色:{{color}}</span><span class="size">尺码:{{size}}</span></p>
</div>
{{#ifnot noEdit}}
<div class="intro intro-edit">
<div class="edit-box">
<div class="num-opt">
<a href="javascript:;" class="btn btn-opt-minus{{#ifor minSelectNum isGift isAdvanceBuy}} disabled{{/ifor}}"><span class="iconfont"></span></a>
<input type="text" class="good-num" disabled="true" value="{{count}}" data-min="{{minNumber}}" data-max="{{maxNumber}}">
<a href="javascript:;" class="btn btn-opt-plus{{#ifor maxSelectNum isGift isAdvanceBuy}} disabled{{/ifor}}"><span class="iconfont"></span></a>
</div>
<div class="edit-size-info">
<div class="txt">颜色:{{color}} 尺码:{{size}}</div>
<div class="down">
<i class="iconfont"></i>
</div>
</div>
</div>
</div>
{{^}}
<input type="hidden" class="good-num" value="{{count}}" data-min="{{minNumber}}" data-max="{{maxNumber}}">
{{/ifnot}}
<div class="count">x{{count}}</div>
</div>
<p class="price">
<span class="market-price">{{price}}</span>
{{#if isStudents}}<span class="vip fill-text"></span>{{/if}}
{{#if isVipPrice}}<span class="vip fill-text">VIP</span>{{/if}}
</p>
<div class="tags">
{{#if lowStocks}}<span class="low-stocks fill-text">库存不足</span>{{/if}}
{{#appearDate}}<span class="appear-date">上市期:{{.}}</span>{{/appearDate}}
</div>
</div>
</div>
</div>
... ...
{{#if isEmptyCart}}
<div class="cart-zero">
<i class="iconfont">&#xe640;</i>
<p>您的购物车暂无商品</p>
<a href="/product/new">随便逛逛</a>
</div>
{{^}}
{{#if cartNav}}
<ul class="cart-nav clearfix">
<li class="{{#if ordinaryCart}}active{{/if}}" id="common-cart-nav" data-type="ordinary">
<span>普通商品({{commonGoodsCount}})</span>
</li>
<li class="{{#if advanceCart}}active{{/if}}" id="presell-cart-nav" data-type="advance">
<span >预售商品({{presellGoodsCount}})</span>
<div id="presell-tip" class="presell-tip hide">
<div class="triangle"></div>
<p class="pt-content">预售商品点这里结算哦~</p>
</div>
</li>
</ul>
{{/if}}
{{#if ordinaryCart}}
<div class="cart-content normal-good active">
{{#commonCart}}
{{> cart-content}}
{{/commonCart}}
</div>
{{/if}}
{{#if advanceCart}}
<div class="cart-content advance-good active">
<p class="presell-info">
<span class="iconfont">&#xe61a;</span>
<span class="txt">由于商品上市期不同,先到的将先发货</span>
<span class="txt">预售商品不参加活动,不可使用优惠券</span>
</p>
{{#preSellCart}}
{{> cart-content}}
{{/preSellCart}}
</div>
{{/if}}
<input id="cartType" type="hidden" value="{{cartType}}">
<div class="recommend-for-you box hide">
</div>
{{/if}}
\ No newline at end of file
... ...
{{# notAvailableCoupons}}
<div class="employ-main not-avaliable">
<span>{{ couponValue}}</span>
<p class="coupon-name">{{ couponDetailInfomation}}</p>
<p>有效期:{{ couponValidity}}</p>
</div>
{{/ notAvailableCoupons}}
\ No newline at end of file
... ...
{{#coupons}}
{{^ notAvailable}}
<a class="employ-main" data-coupon-code="{{ couponCode}}" data-coupon-name="{{ couponDetailInfomation}}" href="javascript:void(0);">
<span>{{ couponValue}}</span>
<p class="coupon-name">{{ couponDetailInfomation}}</p>
<p>有效期:{{ couponValidity}}</p>
</a>
{{/ notAvailable}}
{{/coupons}}
<a class="not-use" href="javascript:void(0);">不使用任何优惠券</a>
\ No newline at end of file
... ...
{{# cartInfo}}
<div class="chose-panel" data-skn="{{productSkn}}">
<div class="main">
<div class="close iconfont">&#xe626;</div>
<div class="infos {{#if @root.tickets}} tickets-info {{/if}}">
<div class="basic-info">
<div class="thumb-img">
{{#each thumbs}}
<img class="thumb {{#unless @first}}hide{{/unless}}" src="{{img}}"> {{/each}}
</div>
<div class="text-info">
<p class="price">
{{#if price}}
<span class="sale-price">{{salePrice}}</span>
<span class="market-price">{{price}}</span> {{else}} {{# isY isSecKill}}
<span class="sale-price">{{salePrice}}</span>
<span class="market-price">{{salePrice}}</span> {{else}}
<span class="sale-price no-price">{{salePrice}}</span> {{/ isY}} {{/if}}
</p>
<p class="not-choose">请选择颜色、尺码</p>
<p class="choosed-info hide"></p>
<p class="size-info hide"></p>
</div>
</div>
<div class="chose-items">
<div class="color-list block-list">
<span class="name">{{#if @root.tickets}}日期{{else}}颜色{{/if}}</span> {{#each colors}}
<ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{#each color}}
<li class="block {{#if chosed}} chosed{{/if}} {{#unless colorNum}} zero-stock{{/unless}}" data-num="{{colorNum}}">{{name}}</li>
{{/each}}
</ul>
{{/each}}
</div>
<div class="size-list block-list {{#if @root.single}} hide{{/if}}">
<span class="name">{{#if @root.tickets}}区域{{else}}尺码{{/if}}</span> {{#each sizes}}
<ul class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{#each size}}
<li class="block {{#if chosed}} chosed{{/if}} {{#unless sizeNum}} zero-stock {{/unless}}" data-num="{{sizeNum}}" data-id="{{id}}"
data-skuid="{{skuId}}" data-info="{{sizeInfo}}">{{name}}</li>
{{/each}}
</ul>
{{/each}}
</div>
<div class="num">
<span class="name">数量</span>
<div class="clearfix">
<a class="btn btn-minus {{#if @root.discountBuy}}discount-gray{{/if}}" href="javascript:void(0);">
<span class="iconfont {{#if ../promotionId}}disabled{{/if}}">&#xe625;</span>
</a>
<input id="good-num" class="good-num disabled" type="text" {{#if @root.discountBuy}}value="{{@root.discountBuy.num}}" {{^}} value="1"
{{/if}} disabled="true">
<a class="btn btn-plus" href="javascript:void(0);">
<span class="iconfont {{#if ../promotionId}}disabled{{/if}}">&#xe624;</span>
</a>
</div>
{{#if @root.discountBuy}}
<input id="mnum" type="hidden" value="{{@root.discountBuy.num}}">
{{#if @root.discountBuy.discount}}
<span class="left-num-discount">{{@root.discountBuy.num}}件起购享{{@root.discountBuy.discount}}</span>
{{^}}
<span class="left-num-discount">{{@root.discountBuy.num}}件起购</span>
{{/if}}
{{^}}
<span class="left-num"></span>
{{/if}}
<input id="left-num" type="hidden" value="0">
<input id="limitNum" type="hidden" value="{{limit}}">
</div>
</div>
</div>
<div class="btn-wrap">
<button id="chose-btn-sure" class="btn btn-sure">{{#if @root.tickets}}立即购买{{else}}加入购物车{{/if}}</button>
</div>
</div>
</div>
{{/ cartInfo}}
<input id="promotionId" type="hidden" value="{{promotionId}}">
<input id="single" type="hidden" value="{{@root.single}}">
... ...
{{> ../../common/chose-panel}}
{{# cartInfo}}
<div class="chose-panel">
<div class="main">
<div class="close iconfont">&#xe626;</div>
<div class="infos {{#if @root.tickets}} tickets-info {{/if}}">
<div class="basic-info" >
<div class="thumb-img">
{{#each thumbs}}
<img class="thumb {{#unless @first}}hide{{/unless}}" src="{{img}}">
{{/each}}
</div>
<div class="text-info">
<p class="price">
{{#if price}}
<span class="sale-price">{{salePrice}}</span>
<span class="market-price">{{price}}</span>
{{else}}
{{# isY isSecKill}}
<span class="sale-price">{{salePrice}}</span>
<span class="market-price">{{salePrice}}</span>
{{else}}
<span class="sale-price no-price">{{salePrice}}</span>
{{/ isY}}
{{/if}}
</p>
<p class="not-choose">请选择颜色、尺码</p>
<p class="choosed-info hide"></p>
<p class="size-info hide"></p>
</div>
</div>
<div class="chose-items">
<div class="color-list block-list">
<span class="name">{{#if @root.tickets}}日期{{else}}颜色{{/if}}</span>
{{#each colors}}
<ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{#each color}}
<li class="block {{#if chosed}} chosed{{/if}} {{#unless colorNum}} zero-stock{{/unless}}" data-num="{{colorNum}}">{{name}}</li>
{{/each}}
</ul>
{{/each}}
</div>
<div class="size-list block-list {{#if @root.single}} hide{{/if}}">
<span class="name">{{#if @root.tickets}}区域{{else}}尺码{{/if}}</span>
{{#each sizes}}
<ul class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{#each size}}
<li class="block {{#if chosed}} chosed{{/if}} {{#unless sizeNum}} zero-stock {{/unless}}" data-num="{{sizeNum}}" data-id="{{id}}" data-skuid="{{skuId}}" data-info="{{sizeInfo}}">{{name}}</li>
{{/each}}
</ul>
{{/each}}
</div>
<div class="num">
<span class="name">数量</span>
<div class="clearfix">
<a class="btn btn-minus {{#if @root.discountBuy}}discount-gray{{/if}}" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe625;</span>
</a>
<input id="good-num" class="good-num disabled" type="text" {{#if @root.discountBuy}}value="{{@root.discountBuy.num}}" {{^}} value="1"{{/if}} disabled="true">
<a class="btn btn-plus" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe624;</span>
</a>
</div>
{{#if @root.discountBuy}}
<input id="mnum" type="hidden" value="{{@root.discountBuy.num}}">
{{#if @root.discountBuy.discount}}
<span class="left-num-discount" style="color: #e10;position: absolute;top: 0.5rem;left: 9.5rem;overflow: hidden;white-space: nowrap;width: 5.2rem;-o-text-overflow: ellipsis;text-overflow: ellipsis;">{{@root.discountBuy.num}}件起购享{{@root.discountBuy.discount}}</span>
{{^}}
<span class="left-num-discount" style="color: #e10;position: absolute;top: 0.5rem;left: 9.5rem;overflow: hidden;white-space: nowrap;width: 5.2rem;-o-text-overflow: ellipsis;text-overflow: ellipsis;">{{@root.discountBuy.num}}件起购</span>
{{/if}}
{{^}}
<span class="left-num"></span>
{{/if}}
<input id="left-num" type="hidden" value="0">
<input id="limitNum" type="hidden" value="{{limit}}">
</div>
</div>
</div>
<div class="btn-wrap">
<button id="chose-btn-sure" class="btn btn-sure">{{#if @root.tickets}}立即购买{{else}}加入购物车{{/if}}</button>
</div>
</div>
<input id="promotionId" type="hidden" value="{{promotionId}}">
<input id="single" type="hidden" value="{{@root.single}}">
</div>
<div class="cart-bar">
{{#unless @root.wap.common.removeCartCount}}
<input type="hidden" id="remove-cart-count" value="1">
... ...
... ... @@ -575,6 +575,7 @@ AsideSlider.prototype.asideSlideIn = AsideSlider.prototype.slideIn = function($e
$('body').bind('touchmove', function(e) {
e.preventDefault();
});
console.log('JI_bilibili')
window.JI_bilibili && window.JI_bilibili($el);
};
// $(function () {
... ...
... ... @@ -3,12 +3,12 @@
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/20
*/
var $ = require('jquery'),
ellipsis = require('mlellipsis'),
Hammer = require('yoho.hammer');
var $ = require('yoho-jquery'),
ellipsis = require('yoho-mlellipsis'),
Hammer = require('yoho-hammer');
var chosePanel = require('./chose-panel'),
dialog = require('../me/dialog'),
dialog = require('../plugin/dialog'),
loading = require('../plugin/loading'),
tip = require('../plugin/tip');
... ...
/**
* 购物车选择尺寸、颜色和数量面板
* 显示时构造当前商品信息的HTML插入yoho-page;消失则是直接清除HTML
... ... @@ -50,7 +51,8 @@ var $chosePanel = $('#chose-panel'),
// 购物车编辑标相关变量
var isEdit,
isSelected,
oldSknId;
oldSknId,
isGift;
// 限购商品的商品码。只有限购商品时才会设置。
var limitProductCode,
... ... @@ -84,6 +86,7 @@ function disableNumEdit() {
// 初始化购物车面板显示
function init() {
discountNum = $('#mnum').val() - 0;
hasChooseColor = false;
hasChooseSize = false;
$curSizeBlock = null;
... ... @@ -109,13 +112,16 @@ function init() {
*
* @param {Bool} isThisGoodSelected. 当前编辑商品的在购物车中是否被选中
*
* @param {Bool} gift. 是促销选择尺码
*
* @return {undefined}
*/
function setEditModeWithSknId(sknId, isThisGoodSelected) {
function setEditModeWithSknId(sknId, isThisGoodSelected, gift) {
$('#chose-btn-sure').html('确认');
isEdit = 1;
oldSknId = sknId;
isSelected = isThisGoodSelected;
isGift = gift;
}
/*
... ... @@ -280,7 +286,7 @@ function displayGoodNum(curGoodNum) {
// 老的选中尺码去掉勾选,新的选中尺码加上勾选
function changeSizeChosed(newSizeIndex) {
var sizes,
queryString,
sizeBlock,
i;
if (curColorIndex && $curSizeBlock && $curSizeBlock.length > 0) {
... ... @@ -289,8 +295,8 @@ function changeSizeChosed(newSizeIndex) {
for (i = 0; i < sizes.length; i++) {
if ($(sizes[i]).data('id') === $curSizeBlock.data('id')) {
$curSizeBlock = $(sizes[i]);
queryString = '#' + $curSizeBlock.data('id');
curColorIndex = $(queryString).data('index');
sizeBlock = '#' + $curSizeBlock.data('id');
curColorIndex = $(sizeBlock).data('index');
$curSizeBlock.addClass('chosed');
return $curSizeBlock.data('num');
}
... ... @@ -388,19 +394,17 @@ function chosedLength() {
for (var i = 0; i < chosedStr.length; i++) {
if (chosedStr.charCodeAt(i) > 255) {
strlen += 2;
    } else {
strlen ++;
} else {
strlen++;
}
if (strlen >= 16) {
chosedStr = chosedStr.substring(0, i) + '...';
break;
}
  }
}
if ($chosedL.length === 2) {
$chosedL.each(function(val) {
$chosedL.each(function() {
infoHtml = '已选:' + chosedStr + '、' + $chosedL.eq(1).html();
});
} else if ($chosedL.length === 1) {
... ... @@ -633,6 +637,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
}).on('touchstart', '#chose-btn-sure', function() {
var productSku,
productSkn,
buyNumber = $('#good-num').val() - 0,
promotionId,
cartGoodData,
... ... @@ -685,6 +690,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
isSecKills = $('.seckill-time').length; // 秒杀标记
productSku = $curSizeBlock.data('skuid');
productSkn = $('.chose-panel').data('skn');
promotionId = $('#promotionId').val();
if (confirming) {
return false;
... ... @@ -707,12 +713,15 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
if (isEdit) {
cartGoodData = {
new_product_sku: productSku,
new_product_skn: productSkn,
old_product_sku: oldSknId,
buy_number: buyNumber,
selected: isSelected
};
url = '/cart/index/modify';
if (isGift) {
cartGoodData.promotionId = promotionId;
}
url = isGift ? '/cart/index/new/modifyPriceGift' : '/cart/index/new/modify';
} else if (limitProductCode) {
isSecKills = $('.seckill-time').length; // 秒杀标记
... ... @@ -754,6 +763,7 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
} else {
cartGoodData = {
productSku: productSku,
new_product_skn: productSkn,
buyNumber: buyNumber,
promotionId: promotionId,
isEdit: isEdit,
... ... @@ -781,10 +791,10 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
confirming = false;
if (cbFn) {
cbFn();
cbFn(cartGoodData);
}
}
if (res.message && !isEdit) {
tip.show(res.message);
}
... ... @@ -793,13 +803,16 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
if (isEdit) {
loading.showLoadingMask();
// 延迟刷新,否则面板可能无法隐藏
setTimeout(function() {
// 获取当前页面商品类型:普通商品/预售商品
window.location.href = '/cart/index/index?cartType=' + $('#cartType').val();
}, 1);
if (cbFn) {
cbFn(cartGoodData);
} else {
// 延迟刷新,否则面板可能无法隐藏
setTimeout(function() {
// 获取当前页面商品类型:普通商品/预售商品
window.location.href = '/cart/index/index?cartType=' + $('#cartType').val();
}, 1);
}
}
}).fail(function() {
tip.show('网络出了点问题~');
... ... @@ -825,11 +838,11 @@ $yohoPage.on('touchstart', '.btn-minus', function() {
return false; // 阻止加入购物车按钮冒泡
});
$('.close').on('click', function() {
$yohoPage.on('click', '.close', function() {
hide();
});
$('.thumb').on('touchstart', function() {
$yohoPage.on('touchstart', '.thumb', function() {
if ($thumbImg.hasClass('hover')) {
$thumbImg.removeClass('hover');
... ...
... ... @@ -4,10 +4,10 @@
* @date: 2015/10/23
*/
var $ = require('jquery'),
ellipsis = require('mlellipsis'),
lazyLoad = require('yoho.lazyload'),
Hammer = require('yoho.hammer'),
var $ = require('yoho-jquery'),
ellipsis = require('yoho-mlellipsis'),
lazyLoad = require('yoho-jquery-lazyload'),
Hammer = require('yoho-hammer'),
tip = require('../plugin/tip'),
loading = require('../plugin/loading'),
chosePanel = require('./chose-panel');
... ... @@ -22,17 +22,36 @@ ellipsis.init();
function getProductInfo(skn, promotionId) {
loading.showLoadingMask();
$.get('/cart/index/giftinfo', {
$.post('/cart/index/new/giftinfo', {
skn: skn,
promotionId: promotionId
}).then(function(html) {
if (!html) {
}).then(function(data) {
if (!data) {
tip.show('网络错误');
return;
}
chosePanel.show(html, function() {
window.location.href = '/cart/index/index?cartType=' + queryString.cartType;
});
let html = require('common/chose-panel.hbs')(data);
if (queryString.edit) {
// 删掉页面上原有的pannel
chosePanel.remove();
$(html).appendTo('#chose-panel');
chosePanel.init();
chosePanel.setEditModeWithSknId(skn, true, true);
chosePanel.disableNumEdit();
chosePanel.show('', function() {
window.location.href = '/cart/index/index?cartType=' + queryString.cartType;
});
} else {
chosePanel.show(html, function() {
window.location.href = '/cart/index/index?cartType=' + queryString.cartType;
});
}
}, function() {
tip.show('网络错误');
}).always(function() {
... ...
require('cart/gift.page.css')
require('./gift-advance')
\ No newline at end of file
... ...
/**
* 购物车商品
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/22
*/
'use strict';
require('cart/index.page.css');
require('../common');
let $ = require('yoho-jquery'),
hbsTemplate = require('cart/index/index.hbs'),
lazyLoad = require('yoho-jquery-lazyload');
let indexObj = {
editMode: false,
posting: false,
init() {
let self = this;
$('.nav-btn').on('click', () => {
self.navClick();
});
self.refreshPage();
require('./index/recommend-for-you').init(self);
},
navClick() {
let self = this;
$('.main-wrap').toggleClass('edit');
if ($('.main-wrap').hasClass('edit')) {
self.editMode = true;
$('.chk.edit').removeClass('checked');
} else {
self.editMode = false;
}
},
getCartData() {
return $.ajax({
url: '/cart/index/new/data',
type: 'POST'
});
},
refreshPage(data) {
let self = this;
if (!data) {
return self.getCartData().then(cartData => {
return self.renderPage(cartData.data, true);
});
}
return self.renderPage(data);
},
renderPage(data, no_try) {
let self = this;
if ((!data || (!data.commonCart && !data.preSellCart)) && no_try !== true) {
self.refreshPage();
return;
}
let cartType = window.cookie('cartType') || 'ordinary';
// 普通购物车空,则显示预售购物车
if (data.commonGoodsCount === 0 && data.ordinarySoldOut === 0) {
data.cartNav = false;
data.cartType = 'advance';
} else if (data.presellGoodsCount === 0 && data.advanceSoldOut === 0) { // 预售购物车空,则显示普通购物车
data.cartNav = false;
data.cartType = 'ordinary';
} else { // 以上两个购物车中都有数据, 默认显示普通购物车
data.cartNav = true;
data.cartType = cartType || 'ordinary';
}
window.setCookie('cartType', data.cartType);
data.ordinaryCart = data.cartType === 'ordinary';
data.advanceCart = !data.ordinaryCart;
if (data.isEmptyCart) {
$('.nav-btn').hide();
} else {
$('.nav-btn').show();
}
$('.cart-box').html(hbsTemplate(data));
require('./index/cart').init(self);
require('./index/good').init(self);
lazyLoad($('img.lazy'));
return Promise.resolve();
}
};
$(() => {
indexObj.init();
});
... ...
/**
* 购物车页面操作
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/29
*/
'use strict';
let $ = require('yoho-jquery'),
tip = require('../../plugin/tip'),
dialog = require('../../plugin/dialog');
let cartObj = {
init(handle) {
let self = this;
self.handle = handle;
$('.cart-nav').on('click', 'li', function(e) {
self.cartNavClick(e);
});
$('.more-box>.down-arrow').on('click', function(e) {
self.arrowClick(e);
});
$('.btn-balance').on('click', function() {
self.balanceClick();
});
$('.promo-item').on('click', function(e) {
self.promoItemClick(e);
});
$('.all-gift-box').on('click', '.gift-item', (e) => {
self.allGiftBoxClick(e);
});
self.initPresellTip();
},
arrowClick(e) {
$(e.currentTarget).parent().toggleClass('down');
},
cartNavClick(e) {
let self = this;
let type = $(e.currentTarget).data('type');
window.setCookie('cartType', type);
self.handle.refreshPage('');
},
initPresellTip() {
if (typeof window.cookie === 'function' && window.cookie('_hasShowCartPresellTip') === 'y') {
$('#presell-tip').removeClass('show').addClass('hide');
} else {
$('#presell-tip').removeClass('hide').addClass('show');
setTimeout(function() {
$('#presell-tip').removeClass('show').addClass('hide');
window.setCookie('_hasShowCartPresellTip', 'y');
}, 3000);
}
},
promoItemClick(e) {
let cartType = window.cookie('cartType') || 'ordinary';
let promotionId = $(e.currentTarget).data('id');
let promotionType = $(e.currentTarget).data('type');
let promotionTitle = encodeURIComponent($(e.currentTarget).data('title'));
let title = '促销商品';
if (promotionType === 'Gift') {
if ($(e.currentTarget).data('status') === 30) {
window.location.href = `/cart/index/new/gift?promotion_id=${promotionId}&title=${title}&intro_text=${promotionTitle}&cartType=${cartType}&edit=1`;
} else {
window.location.href = `/cart/index/new/gift?promotion_id=${promotionId}&title=${title}&intro_text=${promotionTitle}&cartType=${cartType}`;
}
} else if (promotionType === 'Needpaygift') {
if ($(e.currentTarget).data('status') === 30) {
window.location.href = `/cart/index/new/advanceBuy?promotion_id=${promotionId}&title=${title}&intro_text=${promotionTitle}&cartType=${cartType}&edit=1`;
} else {
window.location.href = `/cart/index/new/advanceBuy?promotion_id=${promotionId}&title=${title}&intro_text=${promotionTitle}&cartType=${cartType}`;
}
} else {
window.location.href = `/product/index/index?promotion_id=${promotionId}&title=${title}&intro_text=${promotionTitle}&cartType=${cartType}`;
}
},
allGiftBoxClick(e) {
let cartType = window.cookie('cartType') || 'ordinary';
if ($(e.currentTarget).hasClass('advanceBuy')) {
window.location.href = '/cart/index/new/advanceBuy?cartType=' + cartType;
} else {
window.location.href = '/cart/index/new/gift?cartType=' + cartType;
}
},
balanceClick() {
let cartType = window.cookie('cartType') || 'ordinary';
if (window._yas && window._yas.sendCustomInfo) {
let productId = Array.from($('.good-item.is-checked').map((i, e) => $(e).data('id')));
setTimeout(function() {
if (window._yas && window._yas.sendCustomInfo) {
window._yas.sendCustomInfo({
op: 'YB_SC_TOBUY_CLICK',
param: JSON.stringify({
C_ID: window.C_ID,
PRD_ID: productId.join(','),
})
}, true);
}
}, 200);
}
let lowStocks = $('.good-item.low-stocks.is-checked').length;
if (lowStocks > 0) {
tip.show(`所选商品中有${lowStocks}种库存不足的商品`);
return false;
}
if ($('.all-gift-box>.freebie').length) {
dialog.showDialog({
dialogText: '您还未选择赠品,是否去选择赠品',
hasFooter: {
leftBtnText: '我不要赠品',
rightBtnText: '去选择'
}
}, function() {
window.location.href = '/cart/index/new/gift?cartType=' + cartType;
}, function() {
window.location.href = '/cart/index/orderEnsure?cartType=' + cartType;
});
return false;
}
if (!$('.good-item.is-checked').length) {
tip.show('请先勾选商品');
return false;
}
window.location.href = '/cart/index/new/orderEnsure?cartType=' + cartType;
}
};
module.exports = cartObj;
... ...