Commit c178b023 authored by gongs's avatar gongs

init 0422

parents
This diff is collapsed.
{
"version" : "1",
"prompt" : "template",
"title" : "用户协议与隐私政策",
"message" : "\t请务必审慎阅读、充分理解“用户协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。<br/>
你可以阅读 <a href=\"pages/columnGoods/static/yhxy.html\">《用户协议》</a>与 <a href=\"pages/columnGoods/static/yszc.html\">《隐私政策》</a>了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。",
"buttonAccept" : "同意并接受",
"buttonRefuse" : "暂不同意",
"second" : {
"title" : "确认提示",
"message" : "进入应用前,你需先同意<a href=\"pages/columnGoods/static/yhxy.html\">《用户协议》</a>与<a href=\"pages/columnGoods/static/yszc.html\">《隐私政策》</a>,否则将退出应用。",
"buttonAccept" : "同意并继续",
"buttonRefuse" : "退出应用"
},
"styles" : {
"backgroundColor" : "#fff",
"borderRadius" : "5px",
"title" : {
"color" : "#000"
},
"buttonAccept" : {
"color" : "#fff"
},
"buttonRefuse" : {
"color" : "#ccc"
}
}
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
*
* 所有活动接口 包括:拼团,砍价,秒杀
*
*/
/**
* 拼团列表
*
*/
export function getCombinationList(data) {
return request.get('combination/list', data, {
noAuth: true
});
}
/**
* 拼团详情
*
*/
export function getCombinationDetail(id) {
return request.get('combination/detail/' + id);
}
/**
* 拼团 开团
*/
export function getCombinationPink(id) {
return request.get("combination/pink/" + id);
}
/**
* 拼团 取消开团
*/
export function postCombinationRemove(data) {
return request.post("combination/remove", data);
}
/**
* 砍价列表
*/
export function getBargainList(data) {
return request.get("bargain/list", data, {
noAuth: true
});
}
/**
* 拼团轮播
*
*/
export function getCombinationBannerList(data) {
return request.get('combination/banner_list', data, {
noAuth: true
});
}
/**
* 拼团人数
*
*/
export function getPink(data) {
return request.get('pink', data, {
noAuth: true
});
}
/**
*
* 砍价列表(已参与)
* @param object data
*/
export function getBargainUserList(data) {
return request.get('bargain/user/list', data);
}
/**
* 砍价产品详情
*/
export function getBargainDetail(id, uid) {
return request.get(`bargain/detail/${id}?bargainUid=${uid}`);
}
/**
* 砍价 开启砍价用户信息
*/
export function postBargainStartUser(data) {
return request.post("bargain/start/user", data);
}
/**
* 砍价开启
*/
export function postBargainStart(bargainId) {
return request.post("bargain/start", {
bargainId: bargainId
});
}
/**
* 砍价 帮助好友砍价
*/
export function postBargainHelp(data) {
return request.post("bargain/help", data);
}
/**
* 砍价 砍掉金额
*/
export function postBargainHelpPrice(data) {
return request.post("bargain/help/price", data);
}
/**
* 砍价 砍价帮
*/
export function postBargainHelpList(data) {
return request.post("bargain/help/list", data);
}
/**
* 砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
*/
export function postBargainHelpCount(data) {
return request.post("bargain/help/count", data);
}
/**
* 砍价 观看/分享/参与次数
*/
export function postBargainShare(bargainId) {
return request.post("bargain/share", {
bargainId: bargainId
});
}
/**
* 秒杀产品时间区间
*
*/
export function getSeckillIndexTime() {
return request.get('seckill/index', {}, {
noAuth: true
});
}
/**
* 秒杀产品列表
* @param int time
* @param object data
*/
export function getSeckillList(time, data) {
return request.get('seckill/list/' + time, data, {
noAuth: true
});
}
/**
* 秒杀产品详情
* @param int id
*/
export function getSeckillDetail(id, data) {
return request.get(`seckill/detail/${id}`, data);
}
/**
* 砍价海报
* @param object data
*
*/
export function getBargainPoster(data) {
return request.post('bargain/poster', data)
}
/**
* 拼团海报
* @param object data
*
*/
export function getCombinationPoster(data) {
return request.post('combination/poster', data)
}
/**
* 砍价取消
*/
export function getBargainUserCancel(data) {
return request.post("bargain/user/cancel", data);
}
/**
* 获取秒杀小程序二维码
*/
export function seckillCode(id, data) {
return request.get("seckill/code/" + id, data);
}
/**
* 获取拼团小程序二维码
*/
export function scombinationCode(id) {
return request.get("combination/code/" + id);
}
/**
* 获取砍价海报详细信息
*/
export function getCombinationPosterData(id) {
return request.get("combination/poster_info/" + id);
}
/**
* 获取砍价海报详细信息
*/
export function getBargainPosterData(id) {
return request.get("bargain/poster_info/" + id);
}
/**
* 获取积分订单详细信息
*/
export function integralOrderConfirm(data) {
return request.post('store_integral/order/confirm', data);
}
/**
* 获取积分订单创建
*/
export function integralOrderCreate(data) {
return request.post('store_integral/order/create', data);
}
/**
* 获取积分订单详情
* @param string cartId
*/
export function integralOrderDetails(order) {
return request.get(`store_integral/order/detail/${order}`);
}
/**
* 积分产品详情
* @param int id
*
*/
export function getIntegralProductDetail(id) {
return request.get('store_integral/detail/' + id, {}, {
noAuth: true
});
}
/**
* 积分商城商品列表
* @param object data
*/
export function getStoreIntegralList(data) {
return request.get('store_integral/list', data, {
noAuth: true
});
}
/**
* 积分兑换列表
* @param object data
*/
export function getIntegralOrderList(data) {
return request.get('store_integral/order/list', data);
}
/**
* 积分兑换详情
*/
export function getLogisticsDetails(orderId) {
return request.get(`store_integral/order/express/${orderId}`);
}
/**
* 积分兑换订单确认收货
* @param object data
*/
export function orderTake(data) {
return request.post(`store_integral/order/take`, data);
}
/**
* 积分兑换订单删除
* @param object data
*/
export function orderDel(data) {
return request.post(`store_integral/order/del`, data);
}
/**
* 预售商品列表
*/
export function getPresellList(data) {
return request.get("advance/list", data);
}
\ No newline at end of file
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 统计数据
*/
export function getStatisticsInfo() {
return request.get(
"admin/order/statistics",
{},
{
login: true,
},
);
}
/**
* 订单月统计
*/
export function getStatisticsMonth(where) {
return request.get("admin/order/data", where, {
login: true,
});
}
/**
* 订单月统计
*/
export function getAdminOrderList(where) {
return request.get("admin/order/list", where, {
login: true,
});
}
/**
* 订单改价
*/
export function setAdminOrderPrice(data) {
return request.post("admin/order/price", data, {
login: true,
});
}
/**
* 订单备注
*/
export function setAdminOrderRemark(data) {
return request.post("admin/order/remark", data, {
login: true,
});
}
/**
* 订单详情
*/
export function getAdminOrderDetail(orderId) {
return request.get(
"admin/order/detail/" + orderId,
{},
{
login: true,
},
);
}
/**
* 退款订单详情
*/
export function getAdminRefundOrderDetail(orderId) {
return request.get(
"admin/refund_order/detail/" + orderId,
{},
{
login: true,
},
);
}
/**
* 订单发货信息获取
*/
export function getAdminOrderDelivery(orderId) {
return request.get(
"admin/order/delivery/gain/" + orderId,
{},
{
login: true,
},
);
}
/**
* 订单发货保存
*/
export function setAdminOrderDelivery(id, data) {
return request.post("admin/order/delivery/keep/" + id, data, {
login: true,
});
}
/**
* 订单统计图
*/
export function getStatisticsTime(data) {
return request.get("admin/order/time", data, {
login: true,
});
}
/**
* 线下付款订单确认付款
*/
export function setOfflinePay(data) {
return request.post("admin/order/offline", data, {
login: true,
});
}
/**
* 订单确认退款
*/
export function setOrderRefund(data) {
return request.post("admin/order/refund", data, {
login: true,
});
}
/**
* 获取快递公司
* @returns {*}
*/
export function getLogistics(data) {
return request.get("logistics", data, {
login: false,
});
}
/**
* 订单核销
* @returns {*}
*/
export function orderVerific(verify_code, is_confirm, auth = 0) {
return request.post("order/order_verific", {
verify_code,
is_confirm,
auth,
});
}
/**
* 获取物流公司模板
* @returns {*}
*/
export function orderExportTemp(data) {
return request.get("admin/order/export_temp", data);
}
/**
* 获取订单打印默认配置
* @returns {*}
*/
export function orderDeliveryInfo() {
return request.get("admin/order/delivery_info");
}
/**
* 配送员列表
* @returns {*}
*/
export function orderOrderDelivery() {
return request.get("admin/order/delivery");
}
/**
* 退款列表
* @returns {*}
*/
export function orderRefund_order(where) {
return request.get("admin/refund_order/list", where, {
login: true,
});
}
/**
* 订单备注(退款)
*/
export function setAdminRefundRemark(data) {
return request.post("admin/refund_order/remark", data, {
login: true,
});
}
/**
* 订单同意退货
*/
export function agreeExpress(data) {
return request.post("admin/order/agreeExpress", data, {
login: true,
});
}
/**
* 商家管理统计
*/
export function getManageStatistics() {
return request.get(
"admin/manage/statistics",
{},
{
login: true,
},
);
}
/**
* 平台-商品列表
*/
export function adminProductList(data) {
return request.get("admin/manage/product", data);
}
/**
* 商品上下架
*/
export function productSetShow(data) {
return request.post("admin/manage/product/set_show", data, {
login: true,
});
}
/**
* 获取标签数据
*/
export function getProductLabel() {
return request.get(
"admin/manage/product/label",
{},
{
login: true,
},
);
}
/**
* 获取分类数据
*/
export function getProductCate() {
return request.get(
"admin/manage/product/cate",
{},
{
login: true,
},
);
}
/**
* 商品标签修改
*/
export function postBatchProcess(data) {
return request.post("admin/manage/product/save_label", data, {
login: true,
});
}
/**
* 商品分类修改
*/
export function postManageSaveCate(data) {
return request.post("admin/manage/product/save_cate", data, {
login: true,
});
}
/**
* 商品规格
*/
export function getManageProductAttr(id) {
return request.get(
`admin/manage/product/attr/${id}`,
{},
{
login: true,
},
);
}
export function postUpdateAttrs(id, data) {
return request.post(`admin/manage/product/save_attr/${id}`, data, {
login: true,
});
}
/**
* 统计管理-获取订单可拆分商品列表
*/
export function orderSplitInfo(id) {
return request.get("admin/order/split_cart_info/" + id);
}
/**
* 统计管理-提交
*/
export function orderSplitDelivery(id, data) {
return request.put("admin/order/split_delivery/" + id, data);
}
/**
* 平台-用户列表
*/
export function getUserList(data) {
return request.get(`admin/manage/user`, data);
}
/**
* 平台-修改余额、积分
*/
export function postUserUpdateOther(uid, data) {
return request.post(`admin/manage/user/update/${uid}`, data);
}
/**
* 平台-分组列表
*/
export function getGroupList() {
return request.get(`admin/manage/user/group`);
}
/**
* 平台-修改用户信息
*/
export function postUserUpdate(data) {
return request.post(`admin/user/update`, data);
}
/**
* 平台-优惠券
*/
export function getUserCoupon(data) {
return request.get(`admin/manage/user/coupon`, data);
}
/**
* 平台-用户标签
*/
export function getUserLabel(uid) {
return request.get(`admin/manage/user/label/${uid}`);
}
/**
* 平台-等级列表
*/
export function getLevelList() {
return request.get(`admin/manage/user/level`);
}
/**
* 平台-用户详情
*/
export function getUserInfo(uid) {
return request.get(`admin/manage/user/info/${uid}`);
}
/**
* 平台-退款列表
*/
export function adminRefundList(data) {
return request.get("admin/refund_order/list", data);
}
/**
* 订单详情(退款)
*/
export function getAdminRefundDetail(orderId) {
return request.get(
"admin/refund_order/detail/" + orderId,
{},
{
login: true,
},
);
}
export function getTemplateOption() {
return request.get(`admin/manage/product/shipping_temp`);
}
export function productCreate(data) {
return request.post(`admin/manage/product/create`, data);
}
/**
* 配送员-核销订单获取商品信息
*/
export function orderCartInfo(data) {
return request.post("store/order/cart_info", data);
}
/**
* 配送员-订单核销
*/
export function orderWriteoff(data) {
return request.post("store/order/writeoff", data);
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 公共接口 ,优惠券接口 , 行业此讯 , 手机号码注册
*
*/
export function getAjcaptcha(data) {
return request.get("ajcaptcha", data, {
noAuth: true,
});
}
export function ajcaptchaCheck(data) {
return request.post("ajcheck", data, {
noAuth: true,
});
}
/**
* 获取主页数据 无需授权
*
*/
export function getIndexData() {
return request.get(
"v2/index",
{},
{
noAuth: true,
},
);
}
/**
* 获取服务器类型
*
*/
export function getServerType() {
return request.get(
"v2/site_serve",
{},
{
noAuth: true,
},
);
}
/**
* 获取登录授权login
*
*/
export function getLogo() {
return request.get(
"wechat/get_logo",
{},
{
noAuth: true,
},
);
}
/**
* 保存form_id
* @param string formId
*/
export function setFormId(formId) {
return request.post("wechat/set_form_id", {
formId: formId,
});
}
/**
* 领取优惠卷
* @param int couponId
*
*/
export function setCouponReceive(couponId) {
return request.post("coupon/receive", {
couponId: couponId,
});
}
/**
* 优惠券列表
* @param object data
*/
export function getCoupons(data) {
return request.get("v2/coupons", data, {
noAuth: true,
});
}
/**
* 首页优惠券列表组件数据
* @param object data
*/
export function getCouponsIndex(data) {
return request.get("coupons", data, {
noAuth: true,
});
}
/**
* 我的优惠券
* @param int types 0全部 1未使用 2已使用
*/
export function getUserCoupons(types, data) {
return request.get("coupons/user/" + types, data);
}
/**
* 首页新人优惠券
*
*/
export function getNewCoupon() {
return request.get("v2/new_coupon");
}
/**
* 文章分类列表
*
*/
export function getArticleCategoryList() {
return request.get(
"article/category/list",
{},
{
noAuth: true,
},
);
}
/**
* 文章列表
* @param int cid
*
*/
export function getArticleList(cid, data) {
return request.get("article/list/" + cid, data, {
noAuth: true,
});
}
/**
* 文章 热门列表
*
*/
export function getArticleHotList() {
return request.get(
"article/hot/list",
{},
{
noAuth: true,
},
);
}
/**
* 文章 轮播列表
*
*/
export function getArticleBannerList() {
return request.get(
"article/banner/list",
{},
{
noAuth: true,
},
);
}
/**
* 文章详情
* @param int id
*
*/
export function getArticleDetails(id) {
return request.get(
"article/details/" + id,
{},
{
noAuth: true,
},
);
}
/**
* 手机号+验证码登录接口
* @param object data
*/
export function loginMobile(data) {
return request.post("login/mobile", data, {
noAuth: true,
});
}
/**
* 获取短信KEY
* @param object phone
*/
export function verifyCode() {
return request.get(
"verify_code",
{},
{
noAuth: true,
},
);
}
/**
* 验证码发送
* @param object phone
*/
export function registerVerify(
phone,
reset,
key,
captchaType,
captchaVerification,
) {
return request.post(
"register/verify",
{
phone: phone,
type: reset === undefined ? "reset" : reset,
key: key,
captchaType: captchaType,
captchaVerification: captchaVerification,
},
{
noAuth: true,
},
);
}
/**
* 手机号注册
* @param object data
*
*/
export function phoneRegister(data) {
return request.post("register", data, {
noAuth: true,
});
}
/**
* 手机号修改密码
* @param object data
*
*/
export function phoneRegisterReset(data) {
return request.post("register/reset", data, {
noAuth: true,
});
}
/**
* 手机号+密码登录
* @param object data
*
*/
export function phoneLogin(data) {
return request.post("login", data, {
noAuth: true,
});
}
/**
* 切换H5登录
* @param object data
*/
// #ifdef MP
export function switchH5Login() {
return request.post("switch_h5", {
from: "routine",
});
}
// #endif
/*
* h5切换公众号登录
* */
// #ifdef H5
export function switchH5Login() {
return request.post("switch_h5", {
from: "wechat",
});
}
// #endif
/**
* 绑定手机号
*
*/
export function bindingPhone(data) {
return request.post("binding", data, {
noAuth: true,
});
}
/**
* 绑定手机号
*
*/
export function bindingUserPhone(data) {
return request.post("user/binding", data);
}
/**
* 退出登錄
*
*/
export function logout() {
return request.get("logout");
}
/**
* 获取订阅消息id
*/
export function getTempIds() {
return request.get(
"wechat/temp_ids",
{},
{
noAuth: true,
},
);
}
/**
* 首页拼团数据
*/
export function pink() {
return request.get(
"pink",
{},
{
noAuth: true,
},
);
}
/**
* 获取城市信息
*/
export function getCity() {
return request.get(
"city_list",
{},
{
noAuth: true,
},
);
}
/**
* 获取列表
*/
export function getLiveList(page, limit) {
return request.get(
"wechat/live",
{
page,
limit,
},
{
noAuth: true,
},
);
}
/**
* 获取首页DIY;
*/
export function getDiy(id) {
return request.get(
`v2/diy/get_diy/default${id ? "?id=" + id : ""}`,
{},
{
noAuth: true,
},
);
}
/**
* 一键换色;
*/
export function colorChange(name) {
return request.get(
"v2/diy/color_change/" + name,
{},
{
noAuth: true,
},
);
}
/**
* 获取公众号关注
* @returns {*}
*/
export function follow() {
return request.get(
"wechat/follow",
{},
{
noAuth: true,
},
);
}
/**
* 更换手机号码
* @returns {*}
*/
export function updatePhone(data) {
return request.post("user/updatePhone", data, {
noAuth: true,
});
}
/**
* 首页优惠券弹窗
* @returns {*}
*/
export function getCouponV2() {
return request.get(
"v2/get_today_coupon",
{},
{
noAuth: true,
},
);
}
/**
* 新用户优惠券弹窗
* @returns {*}
*/
export function getCouponNewUser() {
return request.get(
"v2/new_coupon",
{},
{
noAuth: true,
},
);
}
/**
* 首页快速选择数据
* @param {Object} data
*/
export function category(data) {
return request.get("category", data, {
noAuth: true,
});
}
/**
* 个人搜索历史
* @param {Object} data
*/
export function searchList(data) {
return request.get("v2/user/search_list", data, {
noAuth: true,
});
}
/**
* 删除搜索历史
*/
export function clearSearch() {
return request.get("v2/user/clean_search");
}
/**
* 获取网站基础配置
*/
export function siteConfig(data) {
return request.get("site_config", data, {
noAuth: true,
});
}
/**
* App微信登录
* @returns {*}
*/
export function wechatAppAuth(data) {
return request.post("wechat/app_auth", data, {
noAuth: true,
});
}
/**
* 获取客服类型
* @returns {*}
*/
export function getCustomerType(data) {
return request.get(
"get_customer_type",
{},
{
noAuth: true,
},
);
}
/**
* 获取开屏广告
* @returns {*}
*/
export function getOpenAdv(data) {
return request.get(
"get_open_adv",
{},
{
noAuth: true,
},
);
}
/**
* 获取版权信息
*/
export function getCrmebCopyRight() {
return request.get(
"copyright",
{},
{
noAuth: true,
},
);
}
/**
* 获取DIY版本接口
* @param {Object} id
*/
export function getDiyVersion(name) {
return request.get(
`v2/diy/get_version/${name}`,
{},
{
noAuth: true,
},
);
}
/**
* 获取主题信息接口
* @param {Object} id
*/
export function getThemeInfo(type, data) {
return request.get(`theme_info/${type}`, data || {}, {
noAuth: true,
});
}
/**
* 获取DIY签到信息
* @param {Object} id
*/
export function getSign() {
return request.get(
"v2/diy/sign",
{},
{
noAuth: true,
},
);
}
/**
* @description 获取主题商品列表
*/
export function getThemeProduct(data) {
return request.get("theme/product", data, {
noAuth: true,
});
}
/**
* @description 获取文章列表
*/
export function getThemeArticle(data) {
return request.get("theme/article", data, {
noAuth: true,
});
}
/**
* @description 获取优惠券列表
*/
export function getThemeCoupon(data) {
return request.get("theme/coupon", data, {
noAuth: true,
});
}
/**
* 获取用户信息(DIY)
*
*/
export function getThemeUser() {
return request.get(
"theme/user",
{},
{
noAuth: true,
},
);
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 客服登录
* @param data object 用户账号密码
*/
export function kefuLogin(data) {
return request.post("login", data, {
noAuth: true,
kefu: true,
});
}
/**
* 获取左侧客服聊天用户列表
* @constructor
*/
export function record(data) {
return request.get("user/record", data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服话术
* @constructor
*/
export function speeChcraft(data) {
return request.get("service/speechcraft", data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服转接列表
* @constructor
*/
export function transferList(data) {
return request.get("service/transfer_list", data, {
noAuth: true,
kefu: true,
});
}
/**
* 商品购买记录
* @constructor
*/
export function productCart(id, data) {
return request.get("product/cart/" + id, data, {
noAuth: true,
kefu: true,
});
}
/**
* 热销商品
* @constructor
*/
export function productHot(id, data) {
return request.get("product/hot/" + id, data, {
noAuth: true,
kefu: true,
});
}
/**
* 商品足记
* @constructor
*/
export function productVisit(id, data) {
return request.get("product/visit/" + id, data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服用户聊天列表
* @constructor
*/
export function serviceList(data) {
return request.get("service/list", data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服转接
* @constructor
*/
export function serviceTransfer(data) {
return request.post("service/transfer", data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服详细信息
* @constructor
*/
export function serviceInfo(data) {
return request.get("service/info", data, {
noAuth: true,
kefu: true,
});
}
/**
* 客服反馈头部信息
* @constructor
*/
export function serviceFeedBack() {
return request.get("user/service/feedback");
}
/**
* 客服反馈
* @constructor
*/
export function feedBackPost(data) {
return request.post("user/service/feedback", data);
}
/**
* 检测登录code
* @constructor
*/
export function codeStauts(data) {
return request.get("user/code", data);
}
/**
* 获取客服端口
* @constructor
*/
export function getWorkermanUrl(data) {
return request.get(
"get_workerman_url",
{},
{
noAuth: true,
}
);
}
/**
* 客服扫码登录code
* @constructor
*/
export function kefuScanLogin(data) {
return request.post("user/code", data);
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 获取抽奖详情信息
*
*/
export function getLotteryData(type, lottery_id) {
return request.get(`v2/lottery/info/${type}${lottery_id ? '/' + lottery_id : ''}`);
}
/**
* 参与抽奖
*
*/
export function startLottery(data) {
return request.post(`v2/lottery`, data);
}
/**
* 领奖
*
*/
export function receiveLottery(data) {
return request.post(`v2/lottery/receive`, data);
}
/**
* 获取中奖记录
*
*/
export function getLotteryList(data) {
return request.get(`v2/lottery/record`, data);
}
\ No newline at end of file
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 获取购物车列表
* @param numType boolean true 购物车数量,false=购物车产品数量
*/
export function getCartCounts(numType) {
return request.get("cart/count", {
numType: numType === undefined ? 0 : numType
});
}
/**
* 获取购物车列表
*
*/
export function getCartList(data) {
return request.get("cart/list", data);
}
/**
* 修改购物车
*
*/
export function getResetCart(data) {
return request.post("v2/reset_cart", data);
}
/**
* 修改购物车数量
* @param int cartId 购物车id
* @param int number 修改数量
*/
export function changeCartNum(cartId, number) {
return request.post("cart/num", {
id: cartId,
number: number
});
}
/**
* 清除购物车
* @param object ids join(',') 切割成字符串
*/
export function cartDel(ids) {
if (typeof ids === 'object')
ids = ids.join(',');
return request.post('cart/del', {
ids: ids
});
}
/**
* 订单列表
* @param object data
*/
export function getOrderList(data) {
return request.get('order/list', data);
}
/**
* 订单产品信息
* @param string unique
*/
export function orderProduct(unique) {
return request.post('order/product', {
unique: unique
});
}
/**
* 订单评价
* @param object data
*
*/
export function orderComment(data) {
return request.post('order/comment', data);
}
/**
* 订单支付
* @param object data
*/
export function orderPay(data) {
return request.post('order/pay', data);
}
/**
* 删除已退款和拒绝退款的订单
* @param string uni
*
*/
export function refundOrderDel(uni) {
return request.get('order/refund/del/' + uni, {});
}
/**
* 订单统计数据
*/
export function orderData() {
return request.get('order/data')
}
/**
* 订单取消
* @param string id
*
*/
export function orderCancel(id) {
return request.post('order/cancel', {
id: id
});
}
/**
* 删除已完成订单
* @param string uni
*
*/
export function orderDel(uni) {
return request.post('order/del', {
uni: uni
});
}
/**
* 礼品订单详情
* @param string uni
*/
export function getGiftOrderDetail(id) {
return request.get('order/gift_detail/' + id);
}
/**
* 订单详情
* @param string uni
*/
export function getOrderDetail(uni, cart_id) {
return request.get('order/detail/' + uni + `${cart_id ? `/${cart_id}`:''}`);
}
/**
* 退款订单详情
* @param string uni
*/
export function getRefundOrderDetail(uni, cart_id) {
return request.get('order/refund_detail/' + uni + `${cart_id ? `/${cart_id}`:''}`);
}
/**
* 再次下单
* @param string uni
*
*/
export function orderAgain(uni) {
return request.post('order/again', {
uni: uni
});
}
/**
* 订单收货
* @param string uni
*
*/
export function orderTake(uni) {
return request.post('order/take', {
uni: uni
});
}
/**
* 订单查询物流信息
* @returns {*}
*/
export function express(uni, type) {
return request.get("order/express/" + uni + `${type?'/refund':''}`);
}
/**
* 订单查询物流信息
* @returns {*}
*/
export function adminExpress(uni, type) {
return request.get("admin/order/express/" + uni + `${type?'/refund':''}`);
}
/**
* 获取退款理由
*
*/
export function ordeRefundReason() {
return request.get('order/refund/reason');
}
/**
* 订单退款审核
* @param object data
*/
export function orderRefundVerify(data) {
return request.post('order/refund/verify', data);
}
/**
* 订单确认获取订单详细信息
* @param string cartId
*/
export function orderConfirm(data) {
return request.post('order/confirm', data);
}
/**
* 获取确认订单页面是否展示快递配送和到店自提
* @param string cartId
*/
export function checkShipping(cartId, news) {
return request.post('order/check_shipping', {
cartId,
'new': news
});
}
/**
* 获取当前金额能使用的优惠卷
* @param string price
*
*/
export function getCouponsOrderPrice(price, data) {
return request.get('coupons/order/' + price, data)
}
/**
* 订单创建
* @param string key
* @param object data
*
*/
export function orderCreate(key, data) {
return request.post('order/create/' + key, data);
}
/**
* 计算订单金额
* @param key
* @param data
* @returns {*}
*/
export function postOrderComputed(key, data) {
return request.post("order/computed/" + key, data);
}
/**
* 订单优惠券
* @param key
* @param data
* @returns {*}
*/
export function orderCoupon(orderId) {
return request.post("v2/order/product_coupon/" + orderId);
}
/**
* 计算会员线下付款金额
* @param {Object} data
*/
export function offlineCheckPrice(data) {
return request.post("order/offline/check/price", data);
}
/**
* 线下扫码付款
* @param {Object} data
*/
export function offlineCreate(data) {
return request.post("order/offline/create", data);
}
/**
* 支付方式开关
*/
export function orderOfflinePayType() {
return request.get('order/offline/pay/type');
}
/**
* 开票记录
*/
export function orderInvoiceList(data) {
return request.get('v2/order/invoice_list', data);
}
/**
* 开票订单详情
* @param {Object} id
*/
export function orderInvoiceDetail(id) {
return request.get(`v2/order/invoice_detail/${id}`);
}
/**
* 支付宝支付
* @param {Object} key
* @param {Object} quitUrl
*/
export function aliPay(key, quitUrl) {
return request.get('ali_pay', {
key,
quitUrl
}, {
noAuth: true
});
}
/**
* 退货物流单号提交
* @param {Object} data
*/
export function refundExpress(data) {
return request.post("order/refund/express", data);
}
/**
* 分类购物车列表
*/
export function vcartList() {
return request.get("v2/cart_list");
}
/**
* 退款商品列表
*/
export function refundGoodsList(orderId) {
return request.get(`order/refund/cart_info/${orderId}`);
}
/**
* 申请退款商品列表
*/
export function postRefundGoods(data) {
return request.post(`order/refund/cart_info`, data);
}
/**
* 退款商品提交
*/
export function returnGoodsSubmit(id, data) {
return request.post(`order/refund/apply/${id}`, data);
}
/**
* 新订单列表 2.1版本
* @param object data
*/
export function getNewOrderList(data) {
return request.get('order/refund/list', data);
}
/**
* 退款订单详情
* @param string uni
*/
export function refundOrderDetail(uni) {
return request.get('order/refund/detail/' + uni);
}
/**
* 放弃申请退款
* @param string uni
*/
export function cancelRefundOrder(uni) {
return request.post('order/refund/cancel/' + uni);
}
/**
* 收银台订单信息
* @param object data
*/
export function getCashierOrder(orderId, type) {
return request.get(`order/cashier/${orderId}/${type}`);
}
/**
* 发票地址获取
* @param object data
*/
export function getInvoiceLink(id) {
return request.get(`v2/order/down_invoice/${id}`);
}
/**
* 领取礼物
* @param orderId
* @param data
*/
export function orderReceiveGift(orderId, data) {
return request.post("order/receive_gift/" + orderId, data);
}
\ No newline at end of file
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 积分商城
*/
export function getStoreIntegral(data) {
return request.get("store_integral/index", data, {
noAuth: true
});
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
import wechat from "@/libs/wechat.js";
/**
* 获取微信sdk配置
* @returns {*}
*/
export function getWechatConfig() {
return request.get(
"wechat/config",
{
url: wechat.signLink(),
},
{
noAuth: true,
},
);
}
/**
* 获取微信sdk配置
* @returns {*}
*/
export function wechatAuth(code, spread, login_type) {
return request.get(
"wechat/auth",
{
code,
spread,
login_type,
},
{
noAuth: true,
},
);
}
/**
* 获取登录授权login
*
*/
export function getLogo() {
return request.get(
"wechat/get_logo",
{},
{
noAuth: true,
},
);
}
/**
* 小程序用户登录
* @param data object 小程序用户登录信息
*/
export function login(data) {
return request.post("wechat/mp_auth", data, {
noAuth: true,
});
}
/**
* 静默授权
* @param {Object} data
*/
export function silenceAuth(data) {
//#ifdef MP
return request.get("v2/wechat/silence_auth", data, {
noAuth: true,
});
//#endif
//#ifdef H5
return request.get("v2/wechat/auth_type", data, {
noAuth: true,
});
//#endif
}
/**
* 分享
* @returns {*}
*/
export function getShare() {
return request.get(
"share",
{},
{
noAuth: true,
},
);
}
/**
* 公众号登录
* @returns {*}
*/
export function wechatAuthLogin(data) {
return request.get("v2/wechat/auth_login", data, {
noAuth: true,
});
}
/**
* 获取关注海报
* @returns {*}
*/
export function follow() {
return request.get(
"wechat/follow",
{},
{
noAuth: true,
},
);
}
/**
* code生成用户
* @returns {*}
*/
export function authType(data) {
return request.get("v2/routine/auth_type", data, {
noAuth: true,
});
}
/**
* 授权登录
* @returns {*}
*/
export function authLogin(data) {
return request.get("v2/routine/auth_login", data, {
noAuth: true,
});
}
/**
* 获取图片base64
* @retins {*}
* */
export function imageBase64(image, code) {
return request.post(
"image_base64",
{
image: image,
code: code,
},
{
noAuth: true,
},
);
}
/**
* 自动复制口令功能
* @returns {*}
*/
export function copyWords() {
return request.get(
"copy_words",
{},
{
noAuth: true,
},
);
}
/**
* 获取商城是否强制绑定手机号
*/
export function getShopConfig() {
return request.get(
"v2/bind_status",
{},
{
noAuth: true,
},
);
}
/**
* 小程序绑定手机号
* @param {Object} data
*/
export function routineBindingPhone(data) {
return request.post("v2/routine/auth_binding_phone", data, {
noAuth: true,
});
}
/**
* 小程序绑定手机号
* @param {Object} data
*/
export function wechatBindingPhone(data) {
return request.post("v2/wechat/auth_binding_phone", data, {
noAuth: true,
});
}
/**
* 小程序手机号登录
* @param {Object} data
*/
export function phoneLogin(data) {
return request.post("v2/routine/phone_login", data, {
noAuth: true,
});
}
/**
* 小程序用户登录
* @param data object 小程序用户登录信息
*/
export function routineLogin(data) {
return request.get("v2/wechat/routine_auth", data, {
noAuth: true,
});
}
/**
* 获取微信sdk配置
* @returns {*}
*/
export function wechatAuthV2(code, spread) {
return request.get(
"v2/wechat/auth",
{
code,
spread,
},
{
noAuth: true,
},
);
}
/**
* 获取组件底部菜单
* @param data object 获取组件底部菜单
*/
export function getNavigation(data) {
return request.get("theme/navigation", data, {
noAuth: true,
});
}
export function getSubscribe() {
return request.get(
"subscribe",
{},
{
noAuth: true,
},
);
}
/**
* 获取版本信息
* @param 系统类型
*/
export function getUpdateInfo(type) {
return request.get(
"get_new_app/" + type,
{},
{
noAuth: true,
},
);
}
/**
* 获取首页DIY数据版本号
*
*/
export function getVersion(name) {
return request.get(
`v2/diy/get_version/${name}`,
{},
{
noAuth: true,
},
);
}
/**
* 获取商品分类版本号
*
*/
export function getCategoryVersion(name) {
return request.get(
`category_version`,
{},
{
noAuth: true,
},
);
}
/**
* 配置信息
*
*/
export function basicConfig(name) {
return request.get(
`basic_config`,
{},
{
noAuth: true,
},
);
}
/**
* 后台版本信息
*
*/
export function getSystemVersion() {
return request.get(
`version`,
{},
{
noAuth: true,
},
);
}
/**
* iframe登录
*
*/
export function remoteRegister(data) {
return request.get(`remote_register`, data, {
noAuth: true,
});
}
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 获取产品详情
* @param int id
*
*/
export function getProductDetail(id) {
return request.get('product/detail/' + id, {}, {
noAuth: true
});
}
/**
* 产品分享二维码 推广员
* @param int id
*/
// #ifdef H5 || APP-PLUS
export function getProductCode(id) {
return request.get('product/code/' + id, {}, {
noAuth: true
});
}
// #endif
// #ifdef MP
export function getProductCode(id) {
return request.get('product/code/' + id, {
user_type: 'routine',
}, {
noAuth: true
});
}
// #endif
/**
* 添加收藏
* @param int id
* @param string category product=普通产品,product_seckill=秒杀产品
*/
export function collectAdd(id, category) {
return request.post('collect/add', {
id: id,
'product': category === undefined ? 'product' : category
});
}
/**
* 删除收藏产品
* @param int id
* @param string category product=普通产品,product_seckill=秒杀产品
*/
export function collectDel(id, category) {
return request.post('collect/del', {
id: id,
category: category === undefined ? 'product' : category
});
}
/**
* 购车添加
*
*/
export function postCartAdd(data) {
return request.post('cart/add', data);
}
/**
* 获取分类列表
*
*/
export function getCategoryList() {
return request.get('category', {}, {
noAuth: true
});
}
/**
* 获取产品列表
* @param object data
*/
export function getProductslist(data) {
return request.get('products', data, {
noAuth: true
});
}
/**
* 获取推荐产品
*
*/
export function getProductHot(page, limit) {
return request.get("product/hot", {
page: page === undefined ? 1 : page,
limit: limit === undefined ? 4 : limit
}, {
noAuth: true
});
}
/**
* 批量收藏
*
* @param object id 产品编号 join(',') 切割成字符串
* @param string category
*/
export function collectAll(id, category) {
return request.post('collect/all', {
id: id,
category: category === undefined ? 'product' : category
});
}
/**
* 首页产品的轮播图和产品信息
* @param int type
*
*/
export function getGroomList(type, data) {
return request.get('groom/list/' + type, data, {
noAuth: true
});
}
/**
* 获取收藏列表
* @param object data
*/
export function getCollectUserList(data) {
return request.get('collect/user', data)
}
/**
* 获取产品评论
* @param int id
* @param object data
*
*/
export function getReplyList(id, data) {
return request.get('reply/list/' + id, data, {noAuth: true})
}
/**
* 产品评价数量和好评度
* @param int id
*/
export function getReplyConfig(id) {
return request.get('reply/config/' + id);
}
/**
* 获取搜索关键字获取
*
*/
export function getSearchKeyword() {
return request.get('search/keyword', {}, {
noAuth: true
});
}
/**
* 门店列表
* @returns {*}
*/
export function storeListApi(data) {
return request.get("store_list", data);
}
/**
* 套餐列表
* @param int id
*
*/
export function storeDiscountsList(id) {
return request.get('store_discounts/list/' + id, {}, {
noAuth: true
});
}
/**
* 购车添加、减少、修改
*
*/
export function postCartNum(data) {
return request.post('v2/set_cart_num', data);
}
/**
* 代理商申请
*
*/
export function create(data) {
return request.post(`agent/apply/${data.id}`, data);
}
/**
* 代理商规则
* @param object data
*/
export function getAgentAgreement(data) {
return request.get('agent/get_agent_agreement', {}, {
noAuth: true
});
}
/**
* h5用户发送验证码
* @param data object 用户手机号
*/
export function registerVerify(data) {
return request.post("register/verify", data, {
noAuth: true
});
}
/**
* 验证码key
*/
export function getCodeApi() {
return request.get("verify_code", {}, {
noAuth: true
});
}
/**
* 获取代理商表单信息
*/
export function getHistoryData() {
return request.get("agent/apply/info", {}, {
noAuth: true
});
}
/**
* 获取首页的属性
* @returns {*}
*/
export function getAttr(id, type) {
return request.get("v2/get_attr/" + id + "/" + type);
}
/**
* 获取首页商品列表(所有活动的)
* @param object data
*/
export function getHomeProducts(data) {
return request.get('home/products', data, {
noAuth: true
});
}
/**
* 预售详情
* @returns {*}
*/
export function getPresellProductDetail(id) {
return request.get("advance/detail/" + id);
}
/**
* 获取浏览记录列表
* @param object data
*/
export function getVisitList(data) {
return request.get('user/visit_list', data)
}
/**
* 获取浏览记录列表-删除
* @param object data
*/
export function deleteVisitList(data) {
return request.delete('user/visit', data)
}
/**
* 申请分销员详情接口
*
*/
export function userSpreadInfo() {
return request.get("user/spread/apply/info");
}
/**
* 分销员申请
* @param data
*
*/
export function spreadCreateApi(id, data) {
return request.post(`user/spread/apply/${id}`, data);
}
/**
* 到手价获取
*
*/
export function realPrice(id, unique) {
return request.get(`product/real_price/${id}/${unique}`, {}, {
noAuth: true
});
}
\ No newline at end of file
This diff is collapsed.
<template>
<view>
<view class="Popup" v-if="isShowAuth">
<image :src="logoUrl"></image>
<view class="title">授权提醒</view>
<view class="tip">请授权头像等信息,以便为您提供更好的服务</view>
<view class="bottom flex">
<view class="item" @click="close">随便逛逛</view>
<!-- #ifdef APP-PLUS -->
<button class="item grant" @click="setUserInfo">去授权</button>
<!-- #endif -->
<!-- #ifdef MP -->
<button class="item grant" type="primary" open-type="getPhoneNumber" lang="zh_CN" @getphonenumber="setUserInfo">去授权</button>
<!-- #endif -->
</view>
</view>
<view class="mask" v-if="isShowAuth" @click="close"></view>
</view>
</template>
<script>
const app = getApp();
import Cache from '../utils/cache';
import { getLogo, silenceAuth, routineBindingPhone } from '../api/public';
import { LOGO_URL, EXPIRES_TIME, USER_INFO, STATE_R_KEY } from '../config/cache';
import { mapGetters } from 'vuex';
import Routine from '../libs/routine';
import store from '../store';
export default {
name: 'Authorize',
props: {
isAuto: {
type: Boolean,
default: true
},
isGoIndex: {
type: Boolean,
default: true
},
isShowAuth: {
type: Boolean,
default: false
}
},
data() {
return {
logoUrl: '',
authKey: ''
};
},
computed: mapGetters(['isLogin', 'userInfo']),
watch: {
isLogin(n) {
n === true && this.$emit('onLoadFun', this.userInfo);
}
},
mounted() {
this.getLogoUrl();
let that = this;
if (!this.isLogin && !Cache.has(STATE_R_KEY)) {
wx.login({
success(res) {
Cache.set(STATE_R_KEY, res.code, 10800);
let spread = app.globalData.spid ? app.globalData.spid : '';
// silenceAuth({ code: res.code, spread: spread, spid: app.globalData.code })
// .then(res => {
// if (res.data.key !== undefined && res.data.key) {
// that.authKey = res.data.key;
// } else {
// app.globalData.code = 0;
// let time = res.data.expires_time - Cache.time();
// // store.commit('UPDATE_USERINFO', res.data.userInfo);
// store.commit('LOGIN', { token: res.data.token, time: time });
// // store.commit('SETUID', res.data.userInfo.uid);
// // Cache.set(EXPIRES_TIME,res.data.expires_time,time);
// // Cache.set(USER_INFO,res.data.userInfo,time);
// }
// })
// .catch(res => {
// });
}
});
} else {
this.setAuthStatus();
}
},
methods: {
setAuthStatus() {
Routine.authorize()
.then(res => {
if (res.islogin === false) this.setUserInfo();
else this.$emit('onLoadFun', this.userInfo);
})
.catch(res => {
if (this.isAuto) this.$emit('authColse', true);
});
},
getUserInfo(code) {
Routine.getUserInfo()
.then(res => {
let userInfo = res.userInfo;
userInfo.code = code;
userInfo.spread_spid = app.globalData.spid; //获取推广人ID
userInfo.spread_code = app.globalData.code; //获取推广人分享二维码ID
Routine.authUserInfo(userInfo)
.then(res => {
uni.hideLoading();
this.$emit('authColse', false);
this.$emit('onLoadFun', this.userInfo);
})
.catch(res => {
uni.hideLoading();
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
});
})
.catch(res => {
uni.hideLoading();
});
},
getUserPhoneNumber(encryptedData, iv, code) {
routineBindingPhone({
encryptedData: encryptedData,
iv: iv,
code: code,
spid: app.globalData.spid,
spread: app.globalData.code
})
.then(res => {
let time = res.data.expires_time - this.$Cache.time();
this.$store.commit('LOGIN', {
token: res.data.token,
time: time
});
this.$emit('authColse', false);
this.$emit('onLoadFun', res.data.userInfo);
uni.hideLoading();
})
.catch(res => {
uni.hideLoading();
});
},
setUserInfo(e) {
uni.showLoading({ title: '正在登录中' });
Routine.getCode()
.then(code => {
this.getUserPhoneNumber(e.detail.encryptedData, e.detail.iv, code);
})
.catch(res => {
uni.hideLoading();
});
},
getLogoUrl() {
let that = this;
if (Cache.has(LOGO_URL)) {
this.logoUrl = Cache.get(LOGO_URL);
return;
}
getLogo().then(res => {
that.logoUrl = res.data.logo_url;
Cache.set(LOGO_URL, that.logoUrl);
});
},
close() {
let pages = getCurrentPages(),
currPage = pages[pages.length - 1];
if (this.isGoIndex) {
uni.navigateTo({ url: '/pages/index/index' });
} else {
this.$emit('authColse', false);
}
// if (currPage && currPage.isShowAuth != undefined){
// currPage.isShowAuth = true;
// }
}
}
};
</script>
<style scoped lang="scss">
.Popup {
width: 500rpx;
background-color: #fff;
position: fixed;
top: 50%;
left: 50%;
margin-left: -250rpx;
transform: translateY(-50%);
z-index: 320;
}
.Popup image {
width: 150rpx;
height: 150rpx;
margin: -67rpx auto 0 auto;
display: block;
border: 8rpx solid #fff;
border-radius: 50%;
}
.Popup .title {
font-size: 28rpx;
color: #000;
text-align: center;
margin-top: 30rpx;
}
.Popup .tip {
font-size: 22rpx;
color: #555;
padding: 0 24rpx;
margin-top: 25rpx;
}
.Popup .bottom .item {
width: 50%;
height: 80rpx;
background-color: #eeeeee;
text-align: center;
line-height: 80rpx;
font-size: 24rpx;
color: #666;
margin-top: 54rpx;
}
.Popup .bottom .item.on {
width: 100%;
}
.flex {
display: flex;
}
.Popup .bottom .item.grant {
font-size: 28rpx;
color: #fff;
font-weight: bold;
background-color: var(--view-theme);
border-radius: 0;
padding: 0;
}
.mask {
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.65);
z-index: 310;
}
</style>
<template>
<view class="uni-badge--x">
<slot />
<text v-if="text" :class="classNames" :style="[positionStyle, customStyle, dotStyle]"
class="uni-badge" @click="onClick()">{{displayValue}}</text>
</view>
</template>
<script>
/**
* Badge 数字角标
* @description 数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景
* @tutorial https://ext.dcloud.net.cn/plugin?id=21
* @property {String} text 角标内容
* @property {String} size = [normal|small] 角标内容
* @property {String} type = [info|primary|success|warning|error] 颜色类型
* @value info 灰色
* @value primary 蓝色
* @value success 绿色
* @value warning 黄色
* @value error 红色
* @property {String} inverted = [true|false] 是否无需背景颜色
* @property {Number} maxNum 展示封顶的数字值,超过 99 显示 99+
* @property {String} absolute = [rightTop|rightBottom|leftBottom|leftTop] 开启绝对定位, 角标将定位到其包裹的标签的四角上
* @value rightTop 右上
* @value rightBottom 右下
* @value leftTop 左上
* @value leftBottom 左下
* @property {Array[number]} offset 距定位角中心点的偏移量,只有存在 absolute 属性时有效,例如:[-10, -10] 表示向外偏移 10px,[10, 10] 表示向 absolute 指定的内偏移 10px
* @property {String} isDot = [true|false] 是否显示为一个小点
* @event {Function} click 点击 Badge 触发事件
* @example <uni-badge text="1"></uni-badge>
*/
export default {
name: 'UniBadge',
emits: ['click'],
props: {
type: {
type: String,
default: 'error'
},
inverted: {
type: Boolean,
default: false
},
isDot: {
type: Boolean,
default: false
},
maxNum: {
type: Number,
default: 99
},
absolute: {
type: String,
default: ''
},
offset: {
type: Array,
default () {
return [0, 0]
}
},
text: {
type: [String, Number],
default: ''
},
size: {
type: String,
default: 'small'
},
customStyle: {
type: Object,
default () {
return {}
}
}
},
data() {
return {};
},
computed: {
width() {
return String(this.text).length * 8 + 12
},
classNames() {
const {
inverted,
type,
size,
absolute
} = this
return [
inverted ? 'uni-badge--' + type + '-inverted' : '',
'uni-badge--' + type,
'uni-badge--' + size,
absolute ? 'uni-badge--absolute' : ''
].join(' ')
},
positionStyle() {
if (!this.absolute) return {}
let w = this.width / 2,
h = 10
if (this.isDot) {
w = 5
h = 5
}
const x = `${- w + this.offset[0]}px`
const y = `${- h + this.offset[1]}px`
const whiteList = {
rightTop: {
right: x,
top: y
},
rightBottom: {
right: x,
bottom: y
},
leftBottom: {
left: x,
bottom: y
},
leftTop: {
left: x,
top: y
}
}
const match = whiteList[this.absolute]
return match ? match : whiteList['rightTop']
},
dotStyle() {
if (!this.isDot) return {}
return {
width: '10px',
minWidth: '0',
height: '10px',
padding: '0',
borderRadius: '10px'
}
},
displayValue() {
const {
isDot,
text,
maxNum
} = this
return isDot ? '' : (Number(text) > maxNum ? `${maxNum}+` : text)
}
},
methods: {
onClick() {
this.$emit('click');
}
}
};
</script>
<style lang="scss" >
$uni-primary: #2979ff !default;
$uni-success: #4cd964 !default;
$uni-warning: #f0ad4e !default;
$uni-error: var(--view-theme) !default;
$uni-info: #909399 !default;
$bage-size: 12px;
$bage-small: scale(0.8);
.uni-badge--x {
/* #ifdef APP-NVUE */
// align-self: flex-start;
/* #endif */
/* #ifndef APP-NVUE */
display: inline-block;
/* #endif */
position: relative;
}
.uni-badge--absolute {
position: absolute;
}
.uni-badge--small {
transform: $bage-small;
transform-origin: center center;
}
.uni-badge {
/* #ifndef APP-NVUE */
display: flex;
overflow: hidden;
box-sizing: border-box;
/* #endif */
justify-content: center;
flex-direction: row;
height: 20px;
min-width: 20px;
padding: 0 4px;
line-height: 18px;
color: #fff;
border-radius: 100px;
background-color: $uni-info;
background-color: transparent;
border: 1px solid #fff;
text-align: center;
font-family: 'Helvetica Neue', Helvetica, sans-serif;
font-feature-settings: "tnum";
font-size: $bage-size;
/* #ifdef H5 */
z-index: 999;
cursor: pointer;
/* #endif */
&--info {
color: #fff;
background-color: $uni-info;
}
&--primary {
background-color: $uni-primary;
}
&--success {
background-color: $uni-success;
}
&--warning {
background-color: $uni-warning;
}
&--error {
background-color: $uni-error;
}
&--inverted {
padding: 0 5px 0 0;
color: $uni-info;
}
&--info-inverted {
color: $uni-info;
background-color: transparent;
}
&--primary-inverted {
color: $uni-primary;
background-color: transparent;
}
&--success-inverted {
color: $uni-success;
background-color: transparent;
}
&--warning-inverted {
color: $uni-warning;
background-color: transparent;
}
&--error-inverted {
color: $uni-error;
background-color: transparent;
}
}
</style>
<template>
<view :class="{ line: line, weight: weight }"
:style="{color:color, fontFamily: SemiBold ? 'SemiBold' : 'Regular'}"
class="base-money">
<text v-show="preFix" class="preFix" :style="{'font-size': preFixSize + 'rpx','color':textColor}">{{preFix}}</text>
<text v-if="symbol" class="symbol" :style="{'font-size': symbolSize +'rpx'}">¥</text><text class="integer"
:style="{'font-size': integerSize +'rpx'}">{{ integer }}</text>
<text v-if="digits && ((isCoupon && decimal != '00') || !isCoupon)" class="decimal"
:style="{'font-size': decimalSize +'rpx'}">.{{ decimal }}</text>
</view>
</template>
<script>
export default {
name: 'BaseMoney',
props: {
// 小数位数,为0则不显示
digits: {
type: Number,
default: 2
},
money: {
type: String | Number,
default: ""
},
// 删除线
line: {
type: Boolean,
default: false
},
// 粗体
weight: {
type: Boolean,
default: false
},
symbol: {
type: Boolean,
default: true
},
color:{
type: String,
default: 'var(--view-theme)'
},
textColor:{
type: String,
default: '#999'
},
symbolSize: {
type: String,
default: '20'
},
integerSize: {
type: String,
default: '26'
},
decimalSize: {
type: String,
default: '24'
},
inline: {
type: Boolean,
default: false
},
preFix:{
type: String,
default: ''
},
preFixSize:{
type: String,
default: '24'
},
SemiBold:{
type: Boolean,
default: true
},
isCoupon:{
type: Boolean,
default: false
}
},
data() {
return {
integer: 0,
decimal: 0
};
},
watch: {
money: {
handler(newValue, oldValue) {
let value = Number(newValue).toFixed(this.digits);
value = value.split('.');
this.integer = value[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
if (value[1]) {
this.decimal = value[1];
}
},
immediate: true
}
},
computed:{}
}
</script>
<style lang="scss" scoped>
.base-money {
display: inline-block;
&.line {
text-decoration: line-through;
}
&.weight {
font-weight: 500;
}
}
.preFix{
font-weight: 500 !important;
font-family: PingFang SC-Medium, PingFang SC !important;
}
.SemiBold{
font-family:'SemiBold';
}
.Regular{
font-family:'Regular';
}
</style>
<template>
<view class="base-tag" :class="{middle: size == 'middle'}" v-if="!imgSrc" :style="[tagStyle]" >{{text}}</view>
<image class="img-tag" :class="{'middle-img-tag': size == 'middle'}" :src="imgSrc" mode="heightFix" v-else></image>
</template>
<script>
export default {
name: "tag",
props: {
size: {
// 标签大小 normal, small
type: String,
default: "normal"
},
// 标签内容
text: {
type: String,
default: ""
},
circle: {
type: [Boolean, String],
default: false
},
background: {
type: String,
default: '#e93323'
},
color: {
type: String,
default: '#ffffff'
},
borderColor:{
type: String,
default: ''
},
imgSrc:{
type: String,
default: ''
}
},
computed:{
tagStyle(){
return {
background: this.background,
color: this.color,
border: this.borderColor ? `1rpx solid ${this.borderColor}` : 'none'
}
}
}
};
</script>
<style lang="scss">
.base-tag {
display: flex;
justify-content: center;
align-items: center;
height: 30rpx;
font-size: 18rpx;
padding: 0 8rpx;
color: #333;
border-radius: 4rpx;
background-color: #fff;
margin-right: 8rpx;
box-sizing: border-box;
margin-bottom: 8rpx;
}
.middle{
height: 36rpx;
padding: 0 12rpx;
border-radius: 8rpx;
font-size: 20rpx;
margin-right: 16rpx;
}
.img-tag{
display: block;
height: 30rpx;
border-radius: 4rpx;
margin-right: 14rpx;
box-sizing: border-box;
margin-bottom: 8rpx;
}
.middle-img-tag{
height: 36rpx;
border-radius: 8rpx;
margin-right: 8rpx;
}
</style>
<template>
<view>
<view class="Loads acea-row row-center-wrapper" v-if="loading && !loaded" style="margin-top: .2rem;">
<view v-if="loading">
<view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
{{$t(`正在加载中`)}}
</view>
<view v-else>
{{$t(`上拉加载更多`)}}
</view>
</view>
</view>
</template>
<script>
export default {
name: "Loading",
props: {
loaded: {
type: Boolean,
default: false
},
loading: {
type: Boolean,
default: false
}
}
};
</script>
<style>
.Loads {
height: 80upx;
font-size: 25upx;
color: #000;
}
.Loads .iconfont {
font-size: 30upx;
margin-right: 10upx;
height: 32upx;
line-height: 32upx;
}
/*加载动画*/
@keyframes load {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.loadingpic {
animation: load 3s linear 1s infinite;
}
.loading {
animation: load linear 1s infinite;
}
</style>
\ No newline at end of file
<template>
<view class="navbar">
<view class="content" :style="{ background: isScrolling ? '#fff' : bagColor,'padding-top': sysHeight + 'px' }">
<view class="flex-center h-80 px-20">
<view class="w-40 h-40 flex-center">
<view
v-show="showBack"
@click="back"
class="iconfont icon-fanhui"
:style="{ color: `${iconColor}`, fontSize: `${iconSize}`, fontWeight: `${iconWeight}` }"
></view>
</view>
<view class="flex-1 text-center"
:style="{ color: `${textColor}`, fontSize: `${textSize}`, fontWeight: `${textWeight}` }"
v-if="!custom">{{ titleText }}</view>
<view class="flex-1" v-else>
<slot></slot>
</view>
<view class="w-40 h-40 flex-center">
<view v-show="showRight" class="right-icon"></view>
</view>
</view>
</view>
<view :style="{'padding-top': sysHeight + 'px'}" v-if="showEmpty">
<view class="h-80"></view>
</view>
</view>
</template>
<script>
let sysHeight = uni.getWindowInfo().statusBarHeight;
export default {
name: 'navbar',
props: {
custom:{
type: Boolean,
default: false
},
fixed: {
type: Boolean,
default: true
},
showEmpty:{
type: Boolean,
default: true
},
// 滚动至下部
isScrolling: {
type: Boolean,
default: false
},
// 是否显示返回icon
showBack: {
type: Boolean,
default: false
},
// Title
titleText: {
type: String,
default: ''
},
// icon 颜色
iconColor: {
type: String,
default: '#000000'
},
// icon 字号
iconSize: {
type: String,
default: '40rpx'
},
// icon 字重
iconWeight: {
type: String,
default: 'bold'
},
// Title 颜色
textColor: {
type: String,
default: '#333'
},
// Title 字号
textSize: {
type: String,
default: '34rpx'
},
// Title 字重
textWeight: {
type: String,
default: '500'
},
// 背景色
bagColor: {
type: String,
default: 'transparent'
},
showRight:{
type: Boolean,
default: false
}
},
data() {
return {
sysHeight:sysHeight,
};
},
methods: {
back() {
let pages = getCurrentPages(); // 获取当前打开过的页面路由数,
if (pages.length > 1) {
uni.navigateBack()
} else {
uni.switchTab({
url: '/pages/index/index'
});
}
}
}
};
</script>
<style lang="scss">
.navbar {
position: relative;
color: #333;
.content {
position: fixed;
top: 0;
right: 0;
left: 0;
z-index: 998;
background-color: var(--view-theme);
font-weight: 500;
font-size: 34rpx;
color: #ffffff;
}
}
</style>
<template>
<view :class="'wf-page wf-page' + type">
<!-- left -->
<view>
<view id="left" v-if="leftList.length">
<view v-for="(item, index) in leftList" :key="index" class="wf-item" @tap="itemTap(item)">
<WaterfallsFlowItem :item="item" :isStore="isStore" :type="type" :recommend="recommend" :goDetail="goDetail" />
</view>
</view>
</view>
<!-- right -->
<view>
<view id="right" v-if="rightList.length">
<view v-for="(item, index) in rightList" :key="index" class="wf-item" @tap="itemTap(item)">
<WaterfallsFlowItem :item="item" :isStore="isStore" :type="type" :recommend="recommend" :goDetail="goDetail" />
</view>
</view>
</view>
</view>
</template>
<script>
import WaterfallsFlowItem from './WaterfallsFlowItem.vue';
export default {
components: {
WaterfallsFlowItem
},
props: {
// 瀑布流列表
wfList: {
type: Array,
require: true
},
updateNum: {
type: Number,
default: 10
},
type: {
type: Number,
default: 0
},
isStore: {
type: [String, Number],
default: '1'
},
recommend: {
type: Boolean,
default: false
},
goDetail: {
type: String,
default: ''
}
},
data() {
return {
allList: [], // 全部列表
leftList: [], // 左边列表
rightList: [], // 右边列表
mark: 0, // 列表标记
boxHeight: [] // 下标0和1分别为左列和右列高度
};
},
watch: {
// 监听列表数据变化
wfList: {
handler(nVal, oVal) {
// 如果数据为空或新的列表数据少于旧的列表数据(通常为下拉刷新或切换排序或使用筛选器),初始化变量
if (!this.wfList.length || (this.wfList.length === this.updateNum && this.wfList.length <= this.allList.length)) {
this.allList = [];
this.leftList = [];
this.rightList = [];
this.boxHeight = [];
this.mark = 0;
}
// 如果列表有值,调用waterfall方法
if (this.wfList.length) {
this.allList = this.wfList;
this.leftList = [];
this.rightList = [];
this.boxHeight = [];
this.allList.forEach((v, i) => {
if (this.allList.length < 3 || (this.allList.length <= 7 && this.allList.length - i > 1) || (this.allList.length > 7 && this.allList.length - i > 2)) {
if (i % 2) {
this.rightList.push(v);
} else {
this.leftList.push(v);
}
}
});
if (this.allList.length < 3) {
this.mark = this.allList.length + 1;
} else if (this.allList.length <= 7) {
this.mark = this.allList.length - 1;
} else {
this.mark = this.allList.length - 2;
}
if (this.mark < this.allList.length) {
this.waterFall();
}
}
},
immediate: true,
deep: true
},
mounted() {},
// 监听标记,当标记发生变化,则执行下一个item排序
mark() {
const len = this.allList.length;
if (this.mark < len && this.mark !== 0 && this.boxHeight.length) {
this.waterFall();
}
}
},
methods: {
// 瀑布流排序
waterFall() {
const i = this.mark;
if (i == 0) {
// 初始化,从左边开始插入
this.leftList.push(this.allList[i]);
// 更新左边列表高度
this.getViewHeight(0);
} else if (i == 1) {
// 第二个item插入,默认为右边插入
this.rightList.push(this.allList[i]);
// 更新右边列表高度
this.getViewHeight(1);
} else {
// 根据左右列表高度判断下一个item应该插入哪边
if (!this.boxHeight.length) {
this.rightList.length < this.leftList.length ? this.rightList.push(this.allList[i]) : this.leftList.push(this.allList[i]);
} else {
const leftOrRight = this.boxHeight[0] > this.boxHeight[1] ? 1 : 0;
if (leftOrRight) {
this.rightList.push(this.allList[i]);
} else {
this.leftList.push(this.allList[i]);
}
}
// 更新插入列表高度
this.getViewHeight();
}
},
// 获取列表高度
getViewHeight() {
// 使用nextTick,确保页面更新结束后,再请求高度
this.$nextTick(() => {
setTimeout(() => {
uni
.createSelectorQuery()
.in(this)
.select('#right')
.boundingClientRect((res) => {
res ? (this.boxHeight[1] = res.height) : '';
uni
.createSelectorQuery()
.in(this)
.select('#left')
.boundingClientRect((res) => {
res ? (this.boxHeight[0] = res.height) : '';
this.mark = this.mark + 1;
})
.exec();
})
.exec();
}, 100);
});
},
// item点击
itemTap(item) {
this.$emit('itemTap', item);
},
// item点击
goShop(item) {
this.$emit('goShop', item);
}
}
};
</script>
<style lang="scss" scoped>
$page-padding: 10px;
$grid-gap: 10px;
.wf-page {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: $grid-gap;
}
.wf-item {
width: calc((100vw - 2 * #{$page-padding} - #{$grid-gap}) / 2);
padding-bottom: $grid-gap;
}
.wf-page1 .wf-item {
margin-top: 20rpx;
background-color: #fff;
border-radius: 20rpx;
padding-bottom: 0;
}
</style>
<template>
<view class="wf-item-page wf-page0">
<view class='pictrue'>
<easy-loadimage
mode="widthFix"
:image-src="item.image"
width="100%"
height="345rpx"
borderRadius="16rpx 16rpx 0 0"></easy-loadimage>
</view>
<view class="info_box">
<view class="w-full line2 fs-28 text--w111-333 lh-40rpx">
<text v-if="item.brand_name" class="brand-tag">{{ item.brand_name }}</text>{{item.store_name}}
</view>
<view class="mt-8">
<view class="flex-y-center flex-wrap mt-8">
<baseMoney :money="item.price" symbolSize="24" integerSize="40" decimalSize="24" weight></baseMoney>
<view class="inline-block h-26 lh-28rpx rd-14rpx bg--w111-F7E9CD fs-22 ml-8"
v-if="Number(item.vip_price) > 0">
<text class="inline-block h-26 lh-28rpx svip_rd fs-18 bg--w111-484643 text--w111-FDDAA4 px-8">SVIP</text>
<text class="px-8 fs-22 SemiBold">¥{{item.vip_price}}</text>
</view>
</view>
<view class="flex-between-center mt-12">
<text class="fs-22 text--w111-999">已售{{item.sales}}{{item.unit_name}}</text>
<view class="w-44 h-44 rd-24 bg-gradient flex-center" v-if="goDetail=='goDetail'">
<text class="iconfont icon-ic_ShoppingCart1 text--w111-fff fs-26"></text>
</view>
<view class="w-44 h-44 rd-24 bg-gradient flex-center" @tap.stop="addCartChange" v-else>
<text class="iconfont icon-ic_ShoppingCart1 text--w111-fff fs-26"></text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import easyLoadimage from '@/components/easy-loadimage/easy-loadimage.vue'
import {mapGetters} from "vuex";
import {HTTP_REQUEST_URL} from '@/config/app';
export default {
components: {
easyLoadimage
},
props: {
item: {
type: Object,
require: true
},
type: {
type: Number,
default: 0
},
recommend:{
type: Boolean,
default: false
},
goDetail: {
type: String,
default: ''
}
},
data() {
return {
domain: HTTP_REQUEST_URL
}
},
methods: {
addCartChange(){
this.$eventHub.$emit('onCartAddChange',this.item);
},
}
}
</script>
<style lang="scss" scoped>
.wf-item-page {
background: #fff;
overflow: hidden;
border-radius: 20rpx;
}
.info_box{
padding: 16rpx 20rpx;
border-radius: 0 0 20rpx 20rpx;
background-color: #fff;
}
.text-primary-con{
color: var(--view-theme);
}
.bg-primary-light{
background: var(--view-minorColorT);
}
.bg--w111-484643{
background: linear-gradient(90deg, #484643 0%, #1F1B17 100%);
}
.text--w111-FDDAA4{
color: #FDDAA4;
}
.svip_rd{
border-radius: 14rpx 0 8rpx 14rpx;
}
</style>
<template>
<view>
<view class="address-window" :class="address.address==true?'on':''">
<view class='title'>{{$t(`选择地址`)}}<text class='iconfont icon-guanbi' @tap='close'></text></view>
<view class='list'>
<view class='item acea-row row-between-wrapper' :class='active==index?"font-num":""'
v-for="(item,index) in addressList" @tap='tapAddress(index,item.id)' :key='index'>
<text class='iconfont icon-ditu' :class='active==index?"font-num":""'></text>
<view class='address'>
<view class='name' :class='active==index?"font-num":""'>{{item.real_name}}<text
class='phone'>{{item.phone}}</text></view>
<view class='line1'>{{item.province}}{{item.city}}{{item.district}}{{item.detail}}</view>
</view>
<text class='iconfont icon-complete' :class='active==index?"font-num":""'></text>
</view>
</view>
<!-- 无地址 -->
<view class='pictrue' v-if="!is_loading && !addressList.length">
<image :src="imgHost + '/statics/images/noAddress.png'"></image>
</view>
<view class='addressBnt bg-color' @tap='goAddressPages'>{{$t(`选择其它地址`)}}</view>
</view>
<view class='mask' catchtouchmove="true" :hidden='address.address==false' @tap='close'></view>
</view>
</template>
<script>
import {
getAddressList
} from '@/api/user.js';
import {
HTTP_REQUEST_URL
} from '@/config/app';
export default {
props: {
pagesUrl: {
type: String,
default: '',
},
address: {
type: Object,
default: function() {
return {
address: true,
addressId: 0,
};
}
},
isLog: {
type: Boolean,
default: false,
},
},
data() {
return {
imgHost: HTTP_REQUEST_URL,
active: 0,
//地址列表
addressList: [],
is_loading: true
};
},
methods: {
tapAddress: function(e, addressid) {
this.active = e;
this.$emit('OnChangeAddress', addressid);
},
close: function() {
this.$emit('changeClose');
this.$emit('changeTextareaStatus');
},
goAddressPages: function() {
this.$emit('changeClose');
this.$emit('changeTextareaStatus');
uni.navigateTo({
url: this.pagesUrl
});
},
getAddressList: function() {
let that = this;
getAddressList({
page: 1,
limit: 5
}).then(res => {
let addressList = res.data;
//处理默认选中项
for (let i = 0, leng = addressList.length; i < leng; i++) {
if (addressList[i].id == that.address.addressId) {
that.active = i;
}
}
that.$set(that, 'addressList', addressList);
that.is_loading = false;
if (addressList.length) {
this.$emit('onHaveAddressList', true)
}
})
}
}
}
</script>
<style scoped lang="scss">
.address-window {
background-color: #fff;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
z-index: 1000;
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
}
.address-window.on {
transform: translate3d(0, 0, 0);
}
.address-window .title {
font-size: 32rpx;
font-weight: bold;
text-align: center;
height: 123rpx;
line-height: 123rpx;
position: relative;
}
.address-window .title .iconfont {
position: absolute;
right: 30rpx;
color: #8a8a8a;
font-size: 35rpx;
}
.address-window .list .item {
margin-left: 30rpx;
padding-right: 30rpx;
border-bottom: 1px solid #eee;
height: 129rpx;
font-size: 25rpx;
color: #333;
}
.address-window .list .item .iconfont {
font-size: 37rpx;
color: #2c2c2c;
}
.address-window .list .item .iconfont.icon-complete {
font-size: 30rpx;
color: #fff;
}
.address-window .list .item .address {
width: 560rpx;
}
.address-window .list .item .address .name {
font-size: 28rpx;
font-weight: bold;
color: #282828;
margin-bottom: 4rpx;
}
.address-window .list .item .address .name .phone {
margin-left: 18rpx;
}
.address-window .addressBnt {
font-size: 30rpx;
font-weight: bold;
color: #fff;
width: 690rpx;
height: 86rpx;
border-radius: 43rpx;
text-align: center;
line-height: 86rpx;
margin: 85rpx auto;
}
.address-window .pictrue {
width: 414rpx;
height: 336rpx;
margin: 0 auto;
}
.address-window .pictrue image {
width: 100%;
height: 100%;
}
</style>
<template>
<view>
<view class="cartList" :class="cartData.iScart?'on':''">
<view class="title acea-row row-between-wrapper">
<view class="name">{{$t(`已选商品`)}}</view>
<view class="del acea-row row-middle" @click="subDel">
<view class="iconfont icon-shanchu1"></view>{{$t(`清空`)}}
</view>
</view>
<view class="list">
<view class="item acea-row row-between-wrapper" v-for="(item,index) in cartData.cartList" :key="index">
<view class="pictrue">
<image v-if="item.productInfo.attrInfo" :src='item.productInfo.attrInfo.image'></image>
<image v-else :src='item.productInfo.image'></image>
<view class="mantle" v-if="!item.status || !item.attrStatus"></view>
</view>
<view class="txtPic">
<view class="name line2" :class="(item.attrStatus && item.status)?'':'on'">
{{item.productInfo.store_name}}
</view>
<view v-if="item.attrStatus && item.status">
<view class="info" v-if="item.productInfo.attrInfo">{{item.productInfo.attrInfo.suk}}</view>
<view class="bottom acea-row row-between-wrapper">
<view class="money">{{$t(`¥`)}}<text class="num">{{item.truePrice}}</text></view>
<view class="cartNum acea-row row-middle">
<view class="reduce iconfont icon-jianhao1" @click="leaveCart(index)"></view>
<view class="num">{{item.cart_num}}</view>
<view class="plus iconfont icon-jiahao1" @click="joinCart(index)"></view>
</view>
</view>
</view>
<view class="noBnt" v-else-if="!item.attrStatus">{{$t(`已售罄`)}}</view>
<view class="noBnt" v-else-if="!item.status">{{$t(`已下架`)}}</view>
<view class="delTxt acea-row row-right" v-if="!item.status || !item.attrStatus"><text
@click="oneDel(item.id,index)">{{$t(`删除`)}}</text></view>
</view>
</view>
</view>
</view>
<view class="mask" v-if="cartData.iScart" @click="closeList"></view>
</view>
</template>
<script>
export default {
props: {
cartData: {
type: Object,
default: () => {}
}
},
data() {
return {};
},
mounted() {},
methods: {
closeList() {
this.$emit('closeList', false);
},
leaveCart(index) {
this.$emit('ChangeCartNumDan', false, index);
},
joinCart(index) {
this.$emit('ChangeCartNumDan', true, index);
},
subDel() {
this.$emit('ChangeSubDel');
},
oneDel(id, index) {
this.$emit('ChangeOneDel', id, index);
}
}
}
</script>
<style lang="scss">
.mask {
z-index: 99;
}
.cartList {
position: fixed;
left: 0;
// bottom: 0;
width: 100%;
background-color: #fff;
z-index: 100;
padding: 0 30rpx 100rpx 30rpx;
box-sizing: border-box;
border-radius: 16rpx 16rpx 0 0;
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
bottom: 0rpx;
bottom: calc(0rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
bottom: calc(0rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
&.on {
transform: translate3d(0, 0, 0);
}
.title {
height: 108rpx;
.name {
font-size: 28rpx;
color: #282828;
font-weight: bold;
}
.del {
font-size: 26rpx;
color: var(--view-theme);
.iconfont {
margin-right: 5rpx;
font-size: 34rpx;
}
}
}
.list {
max-height: 720rpx;
overflow-x: hidden;
overflow-y: auto;
.item {
margin-bottom: 40rpx;
.pictrue {
width: 176rpx;
height: 176rpx;
border-radius: 16rpx;
position: relative;
image {
width: 100%;
height: 100%;
border-radius: 16rpx;
}
.mantle {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.65);
border-radius: 16rpx;
}
}
.txtPic {
width: 486rpx;
.name {
font-size: 28rpx;
color: #282828;
&.on {
color: #A3A3A3;
}
}
.noBnt {
width: 126rpx;
height: 44rpx;
background: rgba(242, 242, 242, 1);
border-radius: 22rpx;
text-align: center;
line-height: 44rpx;
font-size: 24rpx;
color: #A3A3A3;
margin-top: 10rpx;
}
.delTxt {
margin-top: 48rpx;
font-size: 24rpx;
color: #E93323;
text {
width: 70rpx;
height: 50rpx;
text-align: center;
line-height: 50rpx;
}
}
.info {
font-size: 23rpx;
color: #989898;
margin-top: 5rpx;
}
.bottom {
margin-top: 11rpx;
.money {
font-weight: bold;
font-size: 26rpx;
color: var(--view-priceColor);
.num {
font-size: 34rpx;
}
}
.cartNum {
font-weight: bold;
.num {
font-size: 34rpx;
color: #282828;
width: 120rpx;
text-align: center;
}
.reduce {
color: #282828;
font-size: 24rpx;
width: 60rpx;
height: 60rpx;
text-align: center;
line-height: 60rpx;
}
.plus {
color: #282828;
font-size: 24rpx;
width: 60rpx;
height: 60rpx;
text-align: center;
line-height: 60rpx;
}
}
}
}
}
}
}
</style>
\ No newline at end of file
<template>
<view class="goodsList">
<view class="item" v-for="(item, index) in tempArr" :key="index" @click="goDetail(item)">
<view class="pictrue">
<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1' && $permission('seckill')">{{ $t(`秒杀`) }}</span>
<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2' && $permission('bargain')">{{ $t(`砍价`) }}</span>
<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3' && $permission('combination')">{{ $t(`拼团`) }}</span>
<image :src="item.recommend_image" mode="" v-if="item.recommend_image"></image>
<image :src="item.image" mode="" v-else></image>
</view>
<view class="text line2">{{ item.store_name }}</view>
<view class="bottom acea-row row-between-wrapper">
<view class="sales acea-row row-middle">
<view class="money font-color">
<text>{{ $t(`¥`) }}</text>
{{ item.price }}
</view>
<view>{{ $t(`已售`) }}{{ item.sales }}</view>
</view>
<view v-if="item.stock > 0">
<view
class="bnt"
v-if="(item.activity && (item.activity.type === '1' || item.activity.type === '2' || item.activity.type === '3')) || item.is_virtual || !item.cart_button"
>
{{ $t(`立即购买`) }}
</view>
<view v-else>
<view class="bnt" v-if="!item.spec_type && !item.cart_num" @click.stop="goCartDan(item, index)">
{{ $t(`加入购物车`) }}
</view>
<view class="cart acea-row row-middle" v-else-if="!item.spec_type && item.cart_num">
<view class="iconfont icon-jianhao" @click.stop="CartNumDes(index, item)"></view>
<view class="num">{{ item.cart_num }}</view>
<view class="iconfont icon-jiahao" @click.stop="CartNumAdd(index, item)"></view>
</view>
<!-- 多规格 -->
<view class="bnt" @click.stop="goCartDuo(item)" v-else-if="item.spec_type">
{{ $t(`加入购物车`) }}
<view class="num" v-if="isLogin && item.cart_num">{{ item.cart_num }}</view>
</view>
<!-- 单规格 -->
</view>
</view>
<view class="bnt end" v-else>{{ $t(`已售罄`) }}</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'catGoodList',
props: {
dataConfig: {
type: Object,
default: () => {}
},
tempArr: {
type: Array,
default: []
},
isLogin: {
type: Boolean,
default: false
}
},
data() {
return {
addIng: false
};
},
created() {},
mounted() {},
methods: {
goDetail(item) {
this.$emit('detail', item);
},
goCartDuo(item) {
this.$emit('gocartduo', item);
},
goCartDan(item, index) {
this.$emit('gocartdan', item, index);
},
CartNumDes(index, item) {
if (this.addIng) return;
this.addIng = true;
this.$emit('ChangeCartNumDan', false, index, item);
},
CartNumAdd(index, item) {
if (this.addIng) return;
this.addIng = true;
this.$emit('ChangeCartNumDan', true, index, item);
}
}
};
</script>
<style lang="scss">
.goodsList {
padding: 0 30rpx;
.item {
width: 100%;
box-sizing: border-box;
margin-bottom: 63rpx;
.pictrue {
// width: 100%;
// height: 290rpx;
border-radius: 16rpx;
position: relative;
padding-top: 40%;
image {
border-radius: 10rpx;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
}
.text {
font-size: 30rpx;
font-family: PingFang SC;
font-weight: bold;
color: #282828;
margin: 20rpx 0;
}
.bottom {
.sales {
font-size: 22rpx;
color: #8e8e8e;
.money {
font-size: 42rpx;
font-weight: bold;
margin-right: 18rpx;
text {
font-size: 28rpx;
}
}
}
.cart {
height: 56rpx;
.pictrue {
color: var(--view-theme);
font-size: 46rpx;
width: 50rpx;
height: 50rpx;
text-align: center;
line-height: 50rpx;
}
.num {
font-size: 30rpx;
color: #282828;
font-weight: bold;
width: 80rpx;
text-align: center;
}
}
.bnt {
padding: 0 30rpx;
height: 56rpx;
line-height: 56rpx;
background: var(--view-theme);
border-radius: 42rpx;
font-size: 26rpx;
color: #fff;
position: relative;
&.end {
background: rgba(203, 203, 203, 1);
}
.num {
background-color: var(--view-priceColor);
min-width: 12rpx;
color: #fff;
border-radius: 15px;
position: absolute;
right: -14rpx;
top: -15rpx;
font-size: 22rpx;
padding: 0 10rpx;
height: 34rpx;
line-height: 34rpx;
}
}
}
}
}
</style>
<template>
<view class="time" :style="justifyLeft">
<text class="red" v-if="tipText">{{ tipText }}</text>
<text class="styleAll" :style="[timeStyle]" v-if="isDay === true">{{
day
}}</text>
<text class="timeTxt red" :style="[timeTxtStyle]" v-if="dayText">{{
dayText
}}</text>
<text class="styleAll" :style="[timeStyle]">{{ hour }}</text>
<text class="timeTxt red" :style="[timeTxtStyle]" v-if="hourText">{{
hourText
}}</text>
<text class="styleAll" :style="[timeStyle]">{{ minute }}</text>
<text class="timeTxt red" :style="[timeTxtStyle]" v-if="minuteText">{{
minuteText
}}</text>
<text class="styleAll" :style="[timeStyle]">{{ second }}</text>
<text class="timeTxt red" :style="[timeTxtStyle]" v-if="secondText">{{
secondText
}}</text>
</view>
</template>
<script>
export default {
name: "countDown",
props: {
justifyLeft: {
type: String,
default: "",
},
//距离开始提示文字
tipText: {
type: String,
default: "倒计时",
},
dayText: {
type: String,
default: "天",
},
hourText: {
type: String,
default: "时",
},
minuteText: {
type: String,
default: "分",
},
secondText: {
type: String,
default: "秒",
},
datatime: {
type: Number,
default: 0,
},
isDay: {
type: Boolean,
default: true,
},
bgColor: {
type: String,
default: "",
},
colors: {
type: String,
default: "",
},
},
data() {
return {
day: "00",
hour: "00",
minute: "00",
second: "00",
};
},
computed: {
timeStyle() {
return {
background: this.bgColor,
color: this.colors,
};
},
timeTxtStyle() {
if (this.colors === "rgba(255, 255, 255, 0)") {
return {
color: "transparent",
};
}
return {};
},
},
created() {},
mounted() {
this.show_time();
},
methods: {
show_time() {
let that = this;
function runTime() {
//时间函数
let intDiff = that.datatime - Date.parse(new Date()) / 1000; //获取数据中的时间戳的时间差;
let day = 0,
hour = 0,
minute = 0,
second = 0;
if (intDiff > 0) {
//转换时间
if (that.isDay === true) {
day = Math.floor(intDiff / (60 * 60 * 24));
} else {
day = 0;
}
hour = Math.floor(intDiff / (60 * 60)) - day * 24;
minute = Math.floor(intDiff / 60) - day * 24 * 60 - hour * 60;
second =
Math.floor(intDiff) -
day * 24 * 60 * 60 -
hour * 60 * 60 -
minute * 60;
if (hour <= 9) hour = "0" + hour;
if (minute <= 9) minute = "0" + minute;
if (second <= 9) second = "0" + second;
that.$set(that, "day", day);
that.$set(that, "hour", hour);
that.$set(that, "minute", minute);
that.$set(that, "second", second);
} else {
that.day = "00";
that.hour = "00";
that.minute = "00";
that.second = "00";
}
}
runTime();
setInterval(runTime, 1000);
},
},
};
</script>
<style>
.time {
display: flex;
justify-content: center;
}
.red {
color: var(--view-theme);
margin: 0 4rpx;
}
</style>
<template>
<view>
<view class='coupon-list-window' :class='coupon.coupon==true?"on":""'>
<view v-if="coupon.count" class="nav acea-row row-around">
<view v-if="coupon.count[2]" :class="['acea-row', 'row-middle', coupon.type === 2 ? 'on' : '']"
@click="setType(2)">{{$t(`商品券`)}}</view>
<view v-if="coupon.count[1]" :class="['acea-row', 'row-middle', coupon.type === 1 ? 'on' : '']"
@click="setType(1)">{{$t(`品类券`)}}</view>
<view v-if="coupon.count[0]" :class="['acea-row', 'row-middle', coupon.type === 0 ? 'on' : '']"
@click="setType(0)">{{$t(`通用券`)}}</view>
</view>
<view class='title' v-else>{{$t(`优惠券`)}}<text class='iconfont icon-guanbi' @click='close'></text></view>
<view v-if="coupon.count" class="occupy"></view>
<view class='coupon-list' v-if="coupon.list.length">
<view class='item acea-row row-center-wrapper' v-for="(item,index) in coupon.list"
@click="getCouponUser(index,item.id)" :key='index' :class="{svip: item.receive_type === 4}">
<view class="moneyCon acea-row row-center-wrapper">
<view class='money acea-row row-column row-center-wrapper'
:class='item.is_use >= item.receive_limit && coupon.count?"moneyGray":""'>
<view>{{$t(`¥`)}}<text class='num'>{{item.coupon_price}}</text></view>
<view class="pic-num" v-if="item.use_min_price > 0">
{{$t(`满`)}}{{item.use_min_price}}{{$t(`元可用`)}}</view>
<view class="pic-num" v-else>{{$t(`无门槛券`)}}</view>
</view>
</view>
<view class='text'>
<view class='condition line2' :class="coupon.count?'':'order'">
<span class='line-title' :class='item.is_use >= item.receive_limit && coupon.count?"gray":""'
v-if='item.type===0'>{{$t(`通用券`)}}</span>
<span class='line-title' :class='item.is_use >= item.receive_limit && coupon.count?"gray":""'
v-else-if='item.type===1'>{{$t(`品类券`)}}</span>
<span class='line-title' :class='item.is_use >= item.receive_limit && coupon.count?"gray":""'
v-else>{{$t(`商品券`)}}</span>
<image src='../../static/images/fvip.png' class="pic" v-if="item.receive_type===4"></image>
<span class='name'>{{$t(item.title)}}</span>
</view>
<view class='data acea-row row-between-wrapper'>
<view v-if="item.coupon_time">{{$t(`领取后`)}}{{item.coupon_time}}{{$t(`天内可用`)}}</view>
<view v-else>{{ item.start_use_time ? item.start_use_time + "-" : ""}}{{ item.end_use_time }}</view>
<view v-if="coupon.count">
<view class='bnt gray' v-if="item.is_use >= item.receive_limit">
{{item.use_title || $t(`已领取`)}}</view>
<view class='bnt bg-color' v-else>{{coupon.statusTile || $t(`立即领取`)}}</view>
</view>
<view v-else class="orderCou">
<view class="iconfont icon-xuanzhong11"
:class="item.receive_type === 4?'svip':'font-num'" v-if="item.is_use"></view>
<view class="iconfont icon-weixuan" v-else></view>
</view>
</view>
</view>
</view>
</view>
<!-- 无优惠券 -->
<view class='pictrue' v-else>
<image :src="imgHost + '/statics/images/noCoupon.png'"></image>
</view>
</view>
<view class='mask' catchtouchmove="true" :hidden='coupon.coupon==false' @click='close'></view>
</view>
</template>
<script>
import {
setCouponReceive
} from '@/api/api.js';
import {
HTTP_REQUEST_URL
} from '@/config/app';
export default {
props: {
//打开状态 0=领取优惠券,1=使用优惠券
openType: {
type: Number,
default: 0,
},
coupon: {
type: Object,
default: function() {
return {};
}
}
},
data() {
return {
imgHost: HTTP_REQUEST_URL,
type: 0
};
},
methods: {
close: function() {
this.$emit('ChangCouponsClone');
this.type = 0;
},
getCouponUser: function(index, id) {
let that = this;
let list = that.coupon.list;
if (list[index].is_use >= list[index].receive_limit && this.openType == 0) return true;
switch (this.openType) {
case 0:
//领取优惠券
setCouponReceive(id).then(res => {
that.$emit('ChangCouponsUseState', index);
that.$util.Tips({
title: "领取成功"
});
// that.$emit('ChangCoupons', list[index]);
}).catch(err => {
uni.showToast({
title: err,
icon: 'none'
});
})
break;
case 1:
that.$emit('ChangCoupons', index);
break;
}
},
setType: function(type) {
this.type = type;
this.$emit('tabCouponType', type);
}
}
}
</script>
<style scoped lang="scss">
.orderCou {
position: absolute;
right: 20rpx;
top: 50%;
margin-top: -20rpx;
}
.orderCou .iconfont {
font-size: 40rpx;
}
.orderCou .svip {
color: #EDBB75;
}
.coupon-list .item .text {
position: relative;
}
.coupon-list .item .text .condition.order {
width: 350rpx;
}
.coupon-list-window .coupon-list .text .condition .pic {
width: 30rpx;
height: 30rpx;
margin-right: 10rpx;
vertical-align: middle;
}
.coupon-list-window .coupon-list .text .condition .name {
vertical-align: middle;
font-size: 26rpx;
font-weight: 500;
}
.coupon-list-window {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: #FFFFFF;
border-radius: 16rpx 16rpx 0 0;
z-index: 999;
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
}
.coupon-list-window.on {
transform: translate3d(0, 0, 0);
}
.coupon-list-window .title {
height: 124rpx;
width: 100%;
text-align: center;
line-height: 124rpx;
font-size: 32rpx;
font-weight: bold;
position: relative;
}
.coupon-list-window .title .iconfont {
position: absolute;
right: 30rpx;
top: 50%;
transform: translateY(-50%);
font-size: 35rpx;
color: #8a8a8a;
font-weight: normal;
}
.coupon-list-window .coupon-list {
margin: 0 0 50rpx 0;
height: 721rpx;
padding-top: 28rpx;
overflow: auto;
}
.coupon-list-window .pictrue {
width: 414rpx;
height: 336rpx;
margin: 192rpx auto 243rpx auto;
}
.coupon-list-window .pictrue image {
width: 100%;
height: 100%;
}
.pic-num {
color: #fff;
font-size: 24rpx;
}
.line-title {
width: 70rpx;
height: 32rpx !important;
padding: 0 10rpx;
line-height: 30rpx;
text-align: center;
background: var(--view-minorColorT);
border: 1px solid var(--view-theme);
opacity: 1;
border-radius: 20rpx;
font-size: 18rpx;
color: var(--view-theme);
margin-right: 12rpx;
box-sizing: border-box;
}
.line-title.gray {
border-color: #C1C1C1 !important;
color: #C1C1C1 !important;
background-color: #F7F7F7 !important;
}
.nav {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 106rpx;
border-bottom: 2rpx solid #F5F5F5;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
background-color: #FFFFFF;
font-size: 30rpx;
color: #999999;
}
.nav .acea-row {
border-top: 5rpx solid transparent;
border-bottom: 5rpx solid transparent;
}
.nav .acea-row.on {
border-bottom-color: var(--view-theme);
color: #282828;
}
.nav .acea-row:only-child {
border-bottom-color: transparent;
}
.occupy {
height: 106rpx;
}
.coupon-list .item {
margin-bottom: 18rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
}
.coupon-list .item .money {
font-weight: normal;
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment