first commit
This commit is contained in:
commit
db4a95e35d
|
|
@ -0,0 +1,17 @@
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
onLaunch: function() {
|
||||||
|
console.log('App Launch')
|
||||||
|
},
|
||||||
|
onShow: function() {
|
||||||
|
console.log('App Show')
|
||||||
|
},
|
||||||
|
onHide: function() {
|
||||||
|
console.log('App Hide')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/*每个页面公共css */
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
|
// 推送播报
|
||||||
|
export function cancelPaymentSoundAPI(data) {
|
||||||
|
return request.get('MiniProgram/Order/cancelPaymentSound', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取消发声
|
||||||
|
export function cancelPay(data) {
|
||||||
|
return request.post('/api/gzh/cancelPay', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取商户信息
|
||||||
|
export function getMerchantAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/getMerchant', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户信息
|
||||||
|
export function userInfoAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/userInfo', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支付
|
||||||
|
export function createScanOrderAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/submitOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送验证码
|
||||||
|
export function sendSmsAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/sendSms', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 绑定手机号
|
||||||
|
export function bindPhoneAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/bindPhone', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 商户端支付
|
||||||
|
export function againPayAPI(data) {
|
||||||
|
return request.get('client/mall/againPay', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 订单详情?
|
||||||
|
export function orderDetailAPI(data) {
|
||||||
|
return request.get('MiniProgram/Api/orderDetail', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// code查店铺
|
||||||
|
export function getMerchantInfoByCode(data) {
|
||||||
|
return request.post('/api/gzh/getMerchantInfoByCode', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// id查店铺
|
||||||
|
export function getMerchantInfo(data) {
|
||||||
|
return request.post('/api/gzh/getMerchantInfo', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下单 1
|
||||||
|
export function doOrder(data) {
|
||||||
|
return request.post('/api/merchant/doOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下单 0
|
||||||
|
export function dogzhOrder(data) {
|
||||||
|
return request.post('/api/gzh/doOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 券 1
|
||||||
|
export function computedOrder(data) {
|
||||||
|
return request.post('/api/merchant/computedOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 券 0
|
||||||
|
export function gzhcomputedOrder(data) {
|
||||||
|
return request.post('/api/gzh/computedOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支付宝订单号查询 1
|
||||||
|
export function getOfflineOrderDetail(data) {
|
||||||
|
return request.post('/api/merchant/getOfflineOrderDetail', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支付宝订单号查询 0
|
||||||
|
export function getgzhlineOrderDetail(data) {
|
||||||
|
return request.post('/api/gzh/getOfflineOrderDetail', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,448 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 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('/api/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('mall/api/cancel_order', {
|
||||||
|
order_id: id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除已完成订单
|
||||||
|
* @param string uni
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function orderDel(uni) {
|
||||||
|
return request.post('order/del', {
|
||||||
|
uni: uni
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单详情
|
||||||
|
* @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(cartId, news, addressId, shipping_type) {
|
||||||
|
return request.post('order/confirm', {
|
||||||
|
cartId,
|
||||||
|
'new': news,
|
||||||
|
addressId,
|
||||||
|
shipping_type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取确认订单页面是否展示快递配送和到店自提
|
||||||
|
* @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(`/api/order/cashier/${orderId}/${type}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发票地址获取
|
||||||
|
* @param object data
|
||||||
|
*/
|
||||||
|
export function getInvoiceLink(id) {
|
||||||
|
return request.get(`v2/order/down_invoice/${id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点餐取消订单
|
||||||
|
* @param string data
|
||||||
|
*/
|
||||||
|
export function cancelShopOrder(data) {
|
||||||
|
return request.post('merchant_order/order/cancelOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * 线上商品取消订单
|
||||||
|
// * @param string data
|
||||||
|
// */
|
||||||
|
// export function cancelonlineOrder(data) {
|
||||||
|
// return request.post('/mall/api/cancel_order', data);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点餐扫码订单详情
|
||||||
|
* @param string data
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function getOrderShopDetail(id) {
|
||||||
|
return request.get(`merchant/getOrderDetail?id=${id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 线上订单详情
|
||||||
|
* @param string data
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function getonlineOrderDetail(id) {
|
||||||
|
return request.get(`order/detail/${id}`);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 充值订单详情
|
||||||
|
* @param string data
|
||||||
|
*/
|
||||||
|
export function RechargeOrderDetail(id) {
|
||||||
|
return request.get(`virtual/orderDetail?id=${id}`);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 充值订单取消
|
||||||
|
*/
|
||||||
|
export function RechargeorderCancel(data) {
|
||||||
|
return request.post('virtual/cancelOrder', data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取订单顶部Tabs
|
||||||
|
*/
|
||||||
|
export function OrderTabs(data) {
|
||||||
|
return request.get('order_tab_config', data);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置信息
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function basicConfig(name) {
|
||||||
|
return request.get(`/api/basic_config`, {}, {
|
||||||
|
noAuth: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,573 @@
|
||||||
|
<!-- 统一收银台支付 -->
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<view class="page">
|
||||||
|
<view class="pay-price">
|
||||||
|
<view class="price">
|
||||||
|
<text class="unit">¥</text>
|
||||||
|
<view v-if="fromType == 'order'">
|
||||||
|
<numberScroll :num='payPriceShow' color="#E93323" width='30' height='50' fontSize='50'></numberScroll>
|
||||||
|
</view>
|
||||||
|
<view v-else>
|
||||||
|
<numberScroll :num='orderData.price' color="#E93323" width='30' height='50' fontSize='50'></numberScroll>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="count-down">
|
||||||
|
支付剩余时间:
|
||||||
|
<countDown :is-day="false" :tip-text="' '" :day-text="' '" :hour-text="' : '" :minute-text="' : '" :second-text="' '" :datatime="invalidTime"></countDown>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="payment">
|
||||||
|
<view class="title">
|
||||||
|
支付方式
|
||||||
|
</view>
|
||||||
|
<view class="item acea-row row-between-wrapper" v-for="(item,index) in cartArr" :key="index"
|
||||||
|
v-show='item.payStatus' @click="payType(item.number || 0, item.value, index)">
|
||||||
|
<view class="left acea-row row-between-wrapper">
|
||||||
|
<image class="iconfont" src="https://imgs.agrimedia.cn/shop/shop-icon.png"
|
||||||
|
style="width: 50rpx; height: 50rpx;"></image>
|
||||||
|
<view class="text">
|
||||||
|
<view class="name">{{item.name}}</view>
|
||||||
|
<view class="info" v-if="item.value == 'yue'">
|
||||||
|
{{item.title}} <span class="money">¥{{ item.number }}</span>
|
||||||
|
</view>
|
||||||
|
<view class="info" v-else>{{item.title}}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image style="width: 31rpx;height: 31rpx; margin-top: 10rpx"
|
||||||
|
src="https://imgs.agrimedia.cn/shop/select_icon-red.png"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="btn">
|
||||||
|
<view class="button acea-row row-center-wrapper" @click='goPay(number, paytype)'>确认支付</view>
|
||||||
|
<view class="wait-pay" @click="waitPay">暂不支付</view>
|
||||||
|
</view>
|
||||||
|
<view v-show="false" v-html="formContent"></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import countDown from '@/components/countDown';
|
||||||
|
import numberScroll from '@/components/numberScroll.vue';
|
||||||
|
import {
|
||||||
|
HTTP_REQUEST_URL
|
||||||
|
} from '@/config/app';
|
||||||
|
import {
|
||||||
|
getCashierOrder,
|
||||||
|
orderPay
|
||||||
|
} from '@/api/order.js';
|
||||||
|
import {
|
||||||
|
basicConfig
|
||||||
|
} from '@/api/public.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
countDown,
|
||||||
|
numberScroll
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
orderId: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
fromType: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
// 怡亚通支付参数
|
||||||
|
dat: {
|
||||||
|
type: Object,
|
||||||
|
default: {}
|
||||||
|
},
|
||||||
|
// 点餐订单参数
|
||||||
|
orderData: {
|
||||||
|
type: Object,
|
||||||
|
default: {}
|
||||||
|
},
|
||||||
|
tabIndex: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
//支付方式
|
||||||
|
cartArr: [{
|
||||||
|
"name": '微信支付',
|
||||||
|
"icon": "icon-weixin2",
|
||||||
|
value: 'middle_pay',
|
||||||
|
title: '使用微信快捷支付',
|
||||||
|
payStatus: 1,
|
||||||
|
}],
|
||||||
|
active: 0,
|
||||||
|
payPrice: 0,
|
||||||
|
payPriceShow: 0,
|
||||||
|
payPostage: 0,
|
||||||
|
offlinePostage: false,
|
||||||
|
invalidTime: 0,
|
||||||
|
initIn: false,
|
||||||
|
jumpData: {
|
||||||
|
orderId: '',
|
||||||
|
msg: ''
|
||||||
|
},
|
||||||
|
formContent: '',
|
||||||
|
oid: 0,
|
||||||
|
number: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
cartArr: {
|
||||||
|
handler(newV, oldValue) {
|
||||||
|
let newPayList = [];
|
||||||
|
newV.forEach((item, index) => {
|
||||||
|
if (item.payStatus) {
|
||||||
|
item.index = index;
|
||||||
|
newPayList.push(item)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.$nextTick(e => {
|
||||||
|
this.active = newPayList[0].index;
|
||||||
|
this.paytype = newPayList[0].value;
|
||||||
|
})
|
||||||
|
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad() {
|
||||||
|
if (typeof window.WeixinJSBridge === "undefined") {
|
||||||
|
if (document.addEventListener) {
|
||||||
|
document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady.bind(this), false);
|
||||||
|
} else if (document.attachEvent) {
|
||||||
|
document.attachEvent('WeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBridgeReady.call(this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getBasicConfig() {
|
||||||
|
basicConfig().then(res => {
|
||||||
|
//微信支付是否开启
|
||||||
|
this.cartArr[0].payStatus = res.data.pay_weixin_open || 0
|
||||||
|
//支付宝是否开启
|
||||||
|
this.cartArr[1].payStatus = res.data.ali_pay_status || 0;
|
||||||
|
//#ifdef MP
|
||||||
|
this.cartArr[1].payStatus = 0;
|
||||||
|
//#endif
|
||||||
|
//余额支付是否开启
|
||||||
|
this.cartArr[2].payStatus = res.data.yue_pay_status
|
||||||
|
if (res.data.offline_pay_status) {
|
||||||
|
this.cartArr[3].payStatus = 1
|
||||||
|
} else {
|
||||||
|
this.cartArr[3].payStatus = 0
|
||||||
|
}
|
||||||
|
//好友代付是否开启
|
||||||
|
this.cartArr[4].payStatus = res.data.friend_pay_status || 0;
|
||||||
|
this.getCashierOrder()
|
||||||
|
}).catch(err => {
|
||||||
|
uni.hideLoading();
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getCashierOrder() {
|
||||||
|
uni.showLoading({
|
||||||
|
title: `创建订单中`
|
||||||
|
});
|
||||||
|
getCashierOrder(this.orderId, this.fromType).then(res => {
|
||||||
|
this.payPrice = this.payPriceShow = res.data.pay_price
|
||||||
|
this.payPostage = res.data.pay_postage
|
||||||
|
this.offlinePostage = res.data.offline_postage
|
||||||
|
this.invalidTime = res.data.invalid_time
|
||||||
|
this.cartArr[2].number = res.data.now_money;
|
||||||
|
this.number = Number(res.data.now_money) || 0;
|
||||||
|
this.oid = res.data.oid
|
||||||
|
uni.hideLoading();
|
||||||
|
}).catch(err => {
|
||||||
|
uni.hideLoading();
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
payType(number, paytype, index) {
|
||||||
|
this.active = index;
|
||||||
|
this.paytype = paytype;
|
||||||
|
this.number = number;
|
||||||
|
if (this.offlinePostage) {
|
||||||
|
if (paytype == 'offline') {
|
||||||
|
this.payPriceShow = this.$util.$h.Sub(this.payPrice, this.payPostage);
|
||||||
|
} else {
|
||||||
|
this.payPriceShow = this.payPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
formpost(url, postData) {
|
||||||
|
let tempform = document.createElement("form");
|
||||||
|
tempform.action = url;
|
||||||
|
tempform.method = "post";
|
||||||
|
tempform.target = "_self";
|
||||||
|
tempform.style.display = "none";
|
||||||
|
for (let x in postData) {
|
||||||
|
let opt = document.createElement("input");
|
||||||
|
opt.name = x;
|
||||||
|
opt.value = postData[x];
|
||||||
|
tempform.appendChild(opt);
|
||||||
|
}
|
||||||
|
document.body.appendChild(tempform);
|
||||||
|
this.$nextTick(e => {
|
||||||
|
tempform.submit();
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
waitPay() {
|
||||||
|
window.location.href = `${HTTP_REQUEST_URL}/JXH5/pages/goods/order_list/index?activeInd=1`
|
||||||
|
},
|
||||||
|
|
||||||
|
goPay(number, paytype) {
|
||||||
|
let that = this;
|
||||||
|
uni.showLoading({
|
||||||
|
title: `支付中`
|
||||||
|
});
|
||||||
|
|
||||||
|
// 检查环境
|
||||||
|
const ua = window.navigator.userAgent.toLowerCase();
|
||||||
|
const isWechat = ua.includes('micromessenger');
|
||||||
|
const isH5 = typeof window !== 'undefined';
|
||||||
|
|
||||||
|
if (!isH5 || !isWechat) {
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: '请在微信浏览器中使用微信支付功能',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 支付参数直接支付
|
||||||
|
if (this.dat.prePay?.appId || this.dat.appId) {
|
||||||
|
let jsConfig = that.dat.prePay || that.dat
|
||||||
|
const onBridgeReady = () => {
|
||||||
|
window.WeixinJSBridge.invoke(
|
||||||
|
'getBrandWCPayRequest', {
|
||||||
|
'appId': jsConfig.appId,
|
||||||
|
'timeStamp': jsConfig.timeStamp || jsConfig.timestamp,
|
||||||
|
'nonceStr': jsConfig.nonceStr,
|
||||||
|
'package': jsConfig.package,
|
||||||
|
'signType': jsConfig.signType,
|
||||||
|
'paySign': jsConfig.paySign,
|
||||||
|
'redirect_url': 'www.baidu.com',
|
||||||
|
}, (res) => {
|
||||||
|
const isSuccess = res.err_msg === 'get_brand_wcpay_request:ok';
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: isSuccess ? "支付完成" : "取消支付",
|
||||||
|
icon: isSuccess ? 'success' : 'none',
|
||||||
|
duration: 2000,
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = `${HTTP_REQUEST_URL}/JXH5/pages/goods/order_list/index`
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof window.WeixinJSBridge === "undefined") {
|
||||||
|
if (document.addEventListener) {
|
||||||
|
document.addEventListener('WeixinJSBridgeReady', onBridgeReady.bind(this), false);
|
||||||
|
} else if (document.attachEvent) {
|
||||||
|
document.attachEvent('WeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBridgeReady.call(this);
|
||||||
|
}
|
||||||
|
return
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 电商下单支付
|
||||||
|
orderPay({
|
||||||
|
uni: that.orderId,
|
||||||
|
paytype: paytype,
|
||||||
|
type: that.friendPay ? 1 : 0,
|
||||||
|
quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location
|
||||||
|
.port +
|
||||||
|
'/pages/goods/order_details/index?order_id=' + this.orderId : location.protocol +
|
||||||
|
'//' + location.hostname +
|
||||||
|
'/pages/goods/order_details/index?order_id=' + this.orderId
|
||||||
|
}).then(res => {
|
||||||
|
let status = res.data.status,
|
||||||
|
orderId = res.data.result.order_id,
|
||||||
|
jsConfig = res.data.result.jsConfig
|
||||||
|
|
||||||
|
// 必须通过下单操作才算是0元支付,所以回调里执行跳转操作
|
||||||
|
if (Number(this.payPriceShow) == 0) {
|
||||||
|
window.location.href = `${HTTP_REQUEST_URL}/JXH5/pages/goods/order_list/index?activeInd=${this.tabIndex}`
|
||||||
|
return
|
||||||
|
};
|
||||||
|
switch (status) {
|
||||||
|
case 'MIDDLE_PAY':
|
||||||
|
case 'WECHAT_PAY':
|
||||||
|
// 微信支付处理
|
||||||
|
if (!jsConfig) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '支付参数错误',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
uni.hideLoading();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const onBridgeReady = () => {
|
||||||
|
window.WeixinJSBridge.invoke(
|
||||||
|
'getBrandWCPayRequest', {
|
||||||
|
'appId': jsConfig.appId,
|
||||||
|
'timeStamp': jsConfig.timeStamp,
|
||||||
|
'nonceStr': jsConfig.nonceStr,
|
||||||
|
'package': jsConfig.package,
|
||||||
|
'signType': jsConfig.signType,
|
||||||
|
'paySign': jsConfig.paySign,
|
||||||
|
'redirect_url': 'www.baidu.com',
|
||||||
|
}, (res) => {
|
||||||
|
const isSuccess = res.err_msg === 'get_brand_wcpay_request:ok';
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: isSuccess ? "支付完成" : "取消支付",
|
||||||
|
icon: isSuccess ? 'success' : 'none',
|
||||||
|
duration: 2000,
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = `${HTTP_REQUEST_URL}/JXH5/pages/goods/order_list/index?activeInd=${this.tabIndex}`
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof window.WeixinJSBridge === "undefined") {
|
||||||
|
if (document.addEventListener) {
|
||||||
|
document.addEventListener('WeixinJSBridgeReady', onBridgeReady.bind(this), false);
|
||||||
|
} else if (document.attachEvent) {
|
||||||
|
document.attachEvent('WeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBridgeReady.call(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}).catch(err => {
|
||||||
|
// 弹出提示需要登录
|
||||||
|
uni.hideLoading();
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = `${HTTP_REQUEST_URL}/JXH5/pages/goods/order_list/index`
|
||||||
|
}, 2000);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 自定义时长
|
||||||
|
getTime() {
|
||||||
|
this.invalidTime = this.getTimestampAfter(15);
|
||||||
|
},
|
||||||
|
|
||||||
|
getTimestampAfter(val) {
|
||||||
|
const now = Math.floor(Date.now() / 1000); // 转换为秒级
|
||||||
|
return now + (val * 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
page {
|
||||||
|
background-color: #F5F5F5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page {
|
||||||
|
.pay-price {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 50rpx 0 40rpx 0;
|
||||||
|
|
||||||
|
.price {
|
||||||
|
color: #E93323;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
|
||||||
|
.unit {
|
||||||
|
font-size: 34rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 41rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.num {
|
||||||
|
font-size: 50rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-down {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 8rpx 28rpx;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #E93323;
|
||||||
|
|
||||||
|
.time {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment {
|
||||||
|
width: 690rpx;
|
||||||
|
border-radius: 14rpx 14rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
z-index: 999;
|
||||||
|
margin: 0 30rpx;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: #000;
|
||||||
|
font-weight: 800;
|
||||||
|
font-size: 30rpx;
|
||||||
|
padding: 30rpx 0 0 30rpx;
|
||||||
|
margin-bottom: 30rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payMoney {
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #333333;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 50rpx;
|
||||||
|
|
||||||
|
.font-color {
|
||||||
|
margin-left: 10rpx;
|
||||||
|
|
||||||
|
.money {
|
||||||
|
font-size: 40rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment.on {
|
||||||
|
transform: translate3d(0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xuanzhong11 {
|
||||||
|
color: #E93323 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item {
|
||||||
|
border-bottom: 1rpx solid #eee;
|
||||||
|
height: 100rpx;
|
||||||
|
margin-left: 30rpx;
|
||||||
|
padding-right: 30rpx;
|
||||||
|
display: flex;
|
||||||
|
padding-bottom: 20rpx;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .text {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .text .name {
|
||||||
|
font-size: 30rpx;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .text .info {
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .text .info .money {
|
||||||
|
color: #ff9900;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .iconfont {
|
||||||
|
font-size: 50rpx;
|
||||||
|
color: #09bb07;
|
||||||
|
margin-right: 28rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .iconfont.icon-zhifubao {
|
||||||
|
color: #00aaea;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .iconfont.icon-yuezhifu {
|
||||||
|
color: #ff9900;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .iconfont.icon-yuezhifu1 {
|
||||||
|
color: #eb6623;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .left .iconfont.icon-tonglianzhifu1 {
|
||||||
|
color: #305fd8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment .item .iconfont {
|
||||||
|
font-size: 40rpx;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-haoyoudaizhifu {
|
||||||
|
color: #F34C3E !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
position: fixed;
|
||||||
|
left: 30rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
bottom: 30rpx;
|
||||||
|
bottom: calc(30rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
|
||||||
|
bottom: calc(30rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
|
||||||
|
}
|
||||||
|
|
||||||
|
.wait-pay {
|
||||||
|
color: #aaa;
|
||||||
|
font-size: 24rpx;
|
||||||
|
padding-top: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
width: 690rpx;
|
||||||
|
height: 90rpx;
|
||||||
|
border-radius: 45rpx;
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #E93323;
|
||||||
|
line-height: 90rpx;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,128 @@
|
||||||
|
<template>
|
||||||
|
<view class="time" :style="justifyLeft">
|
||||||
|
<text class="red" v-if="tipText">{{ tipText }}</text>
|
||||||
|
<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'" v-if="isDay === true">{{ day }}</text>
|
||||||
|
<text class="timeTxt red" v-if="dayText">{{ dayText }}</text>
|
||||||
|
<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ hour }}</text>
|
||||||
|
<text class="timeTxt red" v-if="hourText">{{ hourText }}</text>
|
||||||
|
<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ minute }}</text>
|
||||||
|
<text class="timeTxt red" v-if="minuteText">{{ minuteText }}</text>
|
||||||
|
<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ second }}</text>
|
||||||
|
<text class="timeTxt red" 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: function() {
|
||||||
|
return {
|
||||||
|
day: "00",
|
||||||
|
hour: "00",
|
||||||
|
minute: "00",
|
||||||
|
second: "00"
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created: function() {
|
||||||
|
this.show_time();
|
||||||
|
},
|
||||||
|
mounted: function() {},
|
||||||
|
methods: {
|
||||||
|
show_time: function() {
|
||||||
|
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.day = day;
|
||||||
|
that.hour = hour;
|
||||||
|
that.minute = minute;
|
||||||
|
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>
|
||||||
|
|
@ -0,0 +1,223 @@
|
||||||
|
<template>
|
||||||
|
<view class="keyboard " :class="{'show':show,'dark':dark}">
|
||||||
|
<view class="keyboard-content">
|
||||||
|
<view class="keyboard-content-left">
|
||||||
|
<view class="keyboard-content-left-item" v-for="item in KeyboardNumber" :index="item" @click="_setValue(item)" >
|
||||||
|
<view class="keyboard-content-left-item-cell hover">
|
||||||
|
{{item}}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="keyboard-content-left-item" v-if="isDecimal" @click="_setValue('.')">
|
||||||
|
<view class="keyboard-content-left-item-cell hover" >.</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="keyboard-content-right">
|
||||||
|
<view class="keyboard-content-right-item" @click="_setValue('delete')">
|
||||||
|
<view class="keyboard-content-right-item-cell hover">
|
||||||
|
<image class="icon" v-if="!dark" src="../../static/mono-keyboard/backspace.png" mode="aspectFill"></image>
|
||||||
|
<image class="icon" v-else src="../../static/mono-keyboard/backspace_dark.png" mode="aspectFill"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="keyboard-content-right-item" @click="confirm" :style="isPay? 'opacity: 1' : 'opacity: 0.5'">
|
||||||
|
<view class="keyboard-content-right-item-confirm" :class="{'disable':!money,'hover':money}" :style="{'background-color':btnColor }">{{confirmText}}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name:'monokeyboard',
|
||||||
|
props:{
|
||||||
|
show:{
|
||||||
|
default:false,
|
||||||
|
type:Boolean
|
||||||
|
},
|
||||||
|
dark:{
|
||||||
|
default:false,
|
||||||
|
type:Boolean
|
||||||
|
},
|
||||||
|
btnColor:{
|
||||||
|
default:'#07C160',
|
||||||
|
type:String
|
||||||
|
},
|
||||||
|
confirmText:{
|
||||||
|
default:'去支付',
|
||||||
|
type:String
|
||||||
|
},
|
||||||
|
isDecimal:{
|
||||||
|
default:true,
|
||||||
|
type:Boolean
|
||||||
|
},
|
||||||
|
isPay: {
|
||||||
|
default:true,
|
||||||
|
type:Boolean
|
||||||
|
},
|
||||||
|
value:{
|
||||||
|
default:'',
|
||||||
|
type:[Number,String]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
KeyboardNumber:[1,2,3,4,5,6,7,8,9,0],
|
||||||
|
money:''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created(){
|
||||||
|
this.money+=this.value
|
||||||
|
},
|
||||||
|
computed:{
|
||||||
|
|
||||||
|
},
|
||||||
|
onHide() {
|
||||||
|
this.money = ''
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
_setValue:function(e){
|
||||||
|
switch(e){
|
||||||
|
case '.':
|
||||||
|
if(this.money.indexOf('.') > -1) break
|
||||||
|
if(this.money==''){
|
||||||
|
this.money = '0.'
|
||||||
|
}else{
|
||||||
|
this.money += e.toString()
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case 'delete':
|
||||||
|
if(this.money.length > 0){
|
||||||
|
this.money = this.money.substr(0,this.money.length-1)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
this.money +=e.toString()
|
||||||
|
}
|
||||||
|
this.$emit("change",this.money)
|
||||||
|
},
|
||||||
|
confirm:function(){
|
||||||
|
if (this.isPay == 1) {
|
||||||
|
if(this.money.length>0){
|
||||||
|
this.$emit("confirm",this.money)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.dark{
|
||||||
|
background-color: #1E1E1E !important;
|
||||||
|
.keyboard-content-left-item-cell{
|
||||||
|
background-color: #2c2c2c !important;
|
||||||
|
color: rgba(255,255,255,0.6);
|
||||||
|
}
|
||||||
|
.keyboard-content-right-item-cell{
|
||||||
|
background-color: #2c2c2c !important;
|
||||||
|
}
|
||||||
|
.keyboard-content-left-item-cell:active{
|
||||||
|
background-color: rgba(255,255,255,0.2) !important;
|
||||||
|
}
|
||||||
|
.keyboard-content-right-item-cell:active{
|
||||||
|
background-color: rgba(255,255,255,0.2) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboard{
|
||||||
|
position:fixed;
|
||||||
|
left: 0;
|
||||||
|
transform: translateY(100%);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #F7F7F7;
|
||||||
|
width: 100%;
|
||||||
|
padding: 20rpx 0 40rpx 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
.keyboard-content{
|
||||||
|
display: flex;
|
||||||
|
.keyboard-content-left{
|
||||||
|
width: 75%;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
.keyboard-content-left-item{
|
||||||
|
flex-basis: 33%;
|
||||||
|
flex-grow: 1;
|
||||||
|
padding: 0 0 15rpx 15rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
.keyboard-content-left-item-cell{
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 46rpx;
|
||||||
|
line-height: 92rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
.keyboard-content-left-item-cell:active{
|
||||||
|
background-color: rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboard-content-left-item:nth-child(10){
|
||||||
|
flex-basis: 66%;
|
||||||
|
flex-grow:1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboard-content-right{
|
||||||
|
width: 25%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-sizing: border-box;
|
||||||
|
.keyboard-content-right-item{
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 15rpx 15rpx 15rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.keyboard-content-right-item-cell{
|
||||||
|
border-radius: 8rpx;
|
||||||
|
background-color: #ffffff;
|
||||||
|
height: 92rpx;
|
||||||
|
line-height: 92rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
image{
|
||||||
|
height: 60%;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboard-content-right-item-cell:active{
|
||||||
|
background-color: rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboard-content-right-item:nth-child(2){
|
||||||
|
flex:1;
|
||||||
|
.keyboard-content-right-item-confirm{
|
||||||
|
background-color: #07C160;
|
||||||
|
opacity: 1;
|
||||||
|
color: rgba(255,255,255,0.8);
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-size: 36rpx;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
.disable{
|
||||||
|
opacity: 0.4;
|
||||||
|
}
|
||||||
|
.hover:active{
|
||||||
|
//background-color: rgba(8,165,82,1);
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.show {
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
transform: translateY(0%) !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,160 @@
|
||||||
|
<template>
|
||||||
|
<view class="number-box">
|
||||||
|
<block v-for="(myIndex, index) in indexArr" :key="index">
|
||||||
|
<swiper class="swiper" vertical="true" :current="myIndex" circular="true"
|
||||||
|
v-bind:style="{color:color,width:myIndex == 10 ? '14rpx' : myIndex == 1 ? '22rpx' : width+'rpx',height:height+'rpx',lineHeight:fontSize+'rpx',fontSize:fontSize+'rpx',fontWeight: fontWeight}">
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">0</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">1</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">2</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">3</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">4</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">5</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">6</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">7</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">8</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">9</view>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item>
|
||||||
|
<view class="swiper-item">.</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
</block>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
num: [String, Number],
|
||||||
|
color: {
|
||||||
|
type: String,
|
||||||
|
default: '#000000'
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '30'
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: '30'
|
||||||
|
},
|
||||||
|
fontSize: {
|
||||||
|
type: String,
|
||||||
|
default: '30'
|
||||||
|
},
|
||||||
|
fontWeight: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 500
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
indexArr: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
let {
|
||||||
|
num
|
||||||
|
} = this;
|
||||||
|
let arr = new Array(num.toString().length);
|
||||||
|
arr.fill(0);
|
||||||
|
this.indexArr = arr;
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
num: function(val, oldVal) {
|
||||||
|
// 处理新老数据长度不一样的情况
|
||||||
|
let arr = Array.prototype.slice.apply(this.indexArr);
|
||||||
|
let newLen = val.toString().length;
|
||||||
|
let oldLen = oldVal.toString().length;
|
||||||
|
if (newLen > oldLen) {
|
||||||
|
for (let i = 0; i < newLen - oldLen; i++) {
|
||||||
|
arr.push(0);
|
||||||
|
}
|
||||||
|
this.indexArr = arr;
|
||||||
|
}
|
||||||
|
if (newLen < oldLen) {
|
||||||
|
for (let i = 0; i < oldLen - newLen; i++) {
|
||||||
|
arr.pop();
|
||||||
|
}
|
||||||
|
this.indexArr = arr;
|
||||||
|
}
|
||||||
|
this.numChange(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
//定时器作用:app显示数字滚动
|
||||||
|
this._time = setTimeout(() => {
|
||||||
|
this.numChange(this.num);
|
||||||
|
clearTimeout(this._time);
|
||||||
|
}, 50);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/**
|
||||||
|
* 数字改变
|
||||||
|
* @value 数字
|
||||||
|
*/
|
||||||
|
numChange(num) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
let {
|
||||||
|
indexArr
|
||||||
|
} = this;
|
||||||
|
let copyIndexArr = Array.prototype.slice.apply(indexArr);
|
||||||
|
let _num = num.toString();
|
||||||
|
for (let i = 0; i < _num.length; i++) {
|
||||||
|
if (_num[i] === '.') {
|
||||||
|
copyIndexArr[i] = 10;
|
||||||
|
} else {
|
||||||
|
copyIndexArr[i] = Number(_num[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.indexArr = copyIndexArr;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.number-box {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper {
|
||||||
|
position: relative;
|
||||||
|
// line-height: 30upx;
|
||||||
|
// width: 30upx;
|
||||||
|
// height: 30upx;
|
||||||
|
// font-size: 30upx;
|
||||||
|
// background: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
module.exports = {
|
||||||
|
HTTP_REQUEST_URL: 'https://point.agrimedia.cn',
|
||||||
|
HEADER: {},
|
||||||
|
TOKENNAME: 'Authori-zation',
|
||||||
|
// 缓存时间 0 永久
|
||||||
|
EXPIRE: 0,
|
||||||
|
//分页最多显示条数
|
||||||
|
LIMIT: 10,
|
||||||
|
// 请求超时限制 默认10秒
|
||||||
|
TIMEOUT: 10000
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
//token
|
||||||
|
LOGIN_STATUS: 'LOGIN_STATUS_TOKEN',
|
||||||
|
ISPAY: '',
|
||||||
|
//uid
|
||||||
|
UID:'UID',
|
||||||
|
//用户信息
|
||||||
|
USER_INFO: 'USER_INFO',
|
||||||
|
//token过期时间
|
||||||
|
EXPIRES_TIME: 'EXPIRES_TIME',
|
||||||
|
//微信登录
|
||||||
|
WX_AUTH: 'WX_AUTH',
|
||||||
|
//公众号登录code
|
||||||
|
STATE_KEY: 'wx_authorize_state',
|
||||||
|
//登录类型
|
||||||
|
LOGINTYPE: 'loginType',
|
||||||
|
//登录跳转地址
|
||||||
|
BACK_URL: 'login_back_url',
|
||||||
|
//小程序登录状态code
|
||||||
|
STATE_R_KEY: 'roution_authorize_state',
|
||||||
|
//logo 地址
|
||||||
|
LOGO_URL: 'LOGO_URL',
|
||||||
|
//模板缓存
|
||||||
|
SUBSCRIBE_MESSAGE: 'SUBSCRIBE_MESSAGE',
|
||||||
|
|
||||||
|
TIPS_KEY: 'TIPS_KEY',
|
||||||
|
|
||||||
|
SPREAD: 'spread',
|
||||||
|
//缓存经度
|
||||||
|
CACHE_LONGITUDE: 'LONGITUDE',
|
||||||
|
//缓存纬度
|
||||||
|
CACHE_LATITUDE: 'LATITUDE',
|
||||||
|
|
||||||
|
// 店铺信息
|
||||||
|
USER_ADDRESS: 'USER_ADDRESS'
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
import store from '@/store/index.js';
|
||||||
|
import { HTTP_REQUEST_URL } from '@/config/app';
|
||||||
|
import { getMerchantInfo } from '@/api/user.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用方式:
|
||||||
|
* 进入半屏小程序所需的参数
|
||||||
|
* parameter: {
|
||||||
|
need_login: 1,
|
||||||
|
shop_id: 1
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
const PayParams = function(parameter) {
|
||||||
|
return getMerchantInfo(parameter.shop_id).then(res => {
|
||||||
|
let shopData = res.data;
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: shopData.name,
|
||||||
|
code: res.data.bar_code,
|
||||||
|
need_login: parameter.need_login,
|
||||||
|
shop_id: parameter.shop_id,
|
||||||
|
price: parameter.price,
|
||||||
|
isVip: parameter.isVip,
|
||||||
|
envVersion: parameter.envVersion,
|
||||||
|
|
||||||
|
status: parameter.status,
|
||||||
|
token: parameter.token,
|
||||||
|
BASE_URL: HTTP_REQUEST_URL,
|
||||||
|
REQUEST_URL: parameter.REQUEST_URL,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PayParams;
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Socket链接 暂不做配置
|
||||||
|
WSS_SERVER_URL:'',
|
||||||
|
// Socket调试模式
|
||||||
|
SERVER_DEBUG:true,
|
||||||
|
// 心跳间隔
|
||||||
|
PINGINTERVAL:3000
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<script>
|
||||||
|
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
|
||||||
|
CSS.supports('top: constant(a)'))
|
||||||
|
document.write(
|
||||||
|
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
|
||||||
|
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
|
||||||
|
</script>
|
||||||
|
<title></title>
|
||||||
|
<!--preload-links-->
|
||||||
|
<!--app-context-->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"><!--app-html--></div>
|
||||||
|
<script type="module" src="/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
import App from './App'
|
||||||
|
import store from './store'
|
||||||
|
import util from 'utils/util'
|
||||||
|
|
||||||
|
// #ifndef VUE3
|
||||||
|
import Vue from 'vue'
|
||||||
|
import './uni.promisify.adaptor'
|
||||||
|
|
||||||
|
Vue.prototype.$util = util;
|
||||||
|
Vue.config.productionTip = false
|
||||||
|
App.mpType = 'app'
|
||||||
|
const app = new Vue({
|
||||||
|
store,
|
||||||
|
...App
|
||||||
|
})
|
||||||
|
app.$mount()
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef VUE3
|
||||||
|
import { createSSRApp } from 'vue'
|
||||||
|
export function createApp() {
|
||||||
|
const app = createSSRApp(App)
|
||||||
|
return {
|
||||||
|
app
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
"name" : "收银台支付",
|
||||||
|
"appid" : "__UNI__B05F7DA",
|
||||||
|
"description" : "",
|
||||||
|
"versionName" : "1.0.0",
|
||||||
|
"versionCode" : "100",
|
||||||
|
"transformPx" : false,
|
||||||
|
/* 5+App特有相关 */
|
||||||
|
"app-plus" : {
|
||||||
|
"usingComponents" : true,
|
||||||
|
"nvueStyleCompiler" : "uni-app",
|
||||||
|
"compilerVersion" : 3,
|
||||||
|
"splashscreen" : {
|
||||||
|
"alwaysShowBeforeRender" : true,
|
||||||
|
"waiting" : true,
|
||||||
|
"autoclose" : true,
|
||||||
|
"delay" : 0
|
||||||
|
},
|
||||||
|
/* 模块配置 */
|
||||||
|
"modules" : {},
|
||||||
|
/* 应用发布信息 */
|
||||||
|
"distribute" : {
|
||||||
|
/* android打包配置 */
|
||||||
|
"android" : {
|
||||||
|
"permissions" : [
|
||||||
|
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
|
||||||
|
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
|
||||||
|
"<uses-feature android:name=\"android.hardware.camera\"/>",
|
||||||
|
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
/* ios打包配置 */
|
||||||
|
"ios" : {},
|
||||||
|
/* SDK配置 */
|
||||||
|
"sdkConfigs" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* 快应用特有相关 */
|
||||||
|
"quickapp" : {},
|
||||||
|
/* 小程序特有相关 */
|
||||||
|
"mp-weixin" : {
|
||||||
|
"appid" : "",
|
||||||
|
"setting" : {
|
||||||
|
"urlCheck" : false
|
||||||
|
},
|
||||||
|
"usingComponents" : true
|
||||||
|
},
|
||||||
|
"mp-alipay" : {
|
||||||
|
"usingComponents" : true
|
||||||
|
},
|
||||||
|
"mp-baidu" : {
|
||||||
|
"usingComponents" : true
|
||||||
|
},
|
||||||
|
"mp-toutiao" : {
|
||||||
|
"usingComponents" : true
|
||||||
|
},
|
||||||
|
"uniStatistics" : {
|
||||||
|
"enable" : false
|
||||||
|
},
|
||||||
|
"vueVersion" : "2",
|
||||||
|
"h5" : {
|
||||||
|
"router" : {
|
||||||
|
"mode" : "history"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
|
||||||
|
{
|
||||||
|
"path": "pages/index/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "向商家付款",
|
||||||
|
"enablePullDownRefresh": false,
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/Paysuccessful/jxPaysuccessful",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "支付结果",
|
||||||
|
"enablePullDownRefresh": false,
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"globalStyle": {
|
||||||
|
"navigationBarTextStyle": "black",
|
||||||
|
"navigationBarTitleText": "uni-app",
|
||||||
|
"navigationBarBackgroundColor": "#F8F8F8",
|
||||||
|
"backgroundColor": "#F8F8F8"
|
||||||
|
},
|
||||||
|
"uniIdRouter": {}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,189 @@
|
||||||
|
<template>
|
||||||
|
<view class="Content-Box">
|
||||||
|
<template v-if="Name && Status != -1">
|
||||||
|
<view class="Status">
|
||||||
|
<image class="img" v-if="Status == 1" src="../../static/success.png" mode="widthFix" />
|
||||||
|
<image class="img" v-if="Status == 2" src="../../static/fail.png" mode="widthFix" />
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="Shop-Name">
|
||||||
|
<text>{{ Name }}</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="Pay-Infor">
|
||||||
|
<view class="Pay-Item">
|
||||||
|
<view class="Label"><text>订单状态</text></view>
|
||||||
|
<view class="Value"><text>{{ Status == 1 ? '支付成功' : '取消支付' }}</text></view>
|
||||||
|
</view>
|
||||||
|
<view class="Pay-Item">
|
||||||
|
<view class="Label"><text>支付时间</text></view>
|
||||||
|
<view class="Value"><text>{{ paytime }}</text></view>
|
||||||
|
</view>
|
||||||
|
<view class="Pay-Item" v-if="amountInfo.order_price">
|
||||||
|
<view class="Label"><text>支付总额</text></view>
|
||||||
|
<view class="Value"><text>¥{{ amountInfo.order_price }}</text></view>
|
||||||
|
</view>
|
||||||
|
<!-- <view class="Pay-Item" v-if="amountInfo.broker_ded">
|
||||||
|
<view class="Label"><text>余额抵扣</text></view>
|
||||||
|
<view class="Value"><text>¥{{ amountInfo.broker_ded }}</text></view>
|
||||||
|
</view> -->
|
||||||
|
<view v-if="Number(isAllApi) == 1">
|
||||||
|
<view class="Pay-Item">
|
||||||
|
<view class="Label"><text>抵用券抵扣</text></view>
|
||||||
|
<view class="Value">
|
||||||
|
<text>¥{{ (Number(amountInfo.coin_ded) + Number(amountInfo.broker_ded)).toFixed(2) }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="Pay-Item" v-if="amountInfo.real_pay">
|
||||||
|
<view class="Label"><text>实际付款</text></view>
|
||||||
|
<view class="Value"><text>¥{{ amountInfo.real_pay }}</text></view>
|
||||||
|
</view>
|
||||||
|
<view class="Pay-Item">
|
||||||
|
<view class="Label"><text>获得积分</text></view>
|
||||||
|
<view class="Value" v-if="amountInfo.agent_id"><text>{{ amountInfo.user_integral }}</text></view>
|
||||||
|
<view class="Value" v-else><text>{{ amountInfo.integral }}</text></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<image class="img" src="../../static/fail.png" mode="widthFix" />
|
||||||
|
<view class="Shop-Name">
|
||||||
|
<text>订单错误请联系管理员</text>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<button class="complete" @click="closePage">完成</button>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getOfflineOrderDetail,
|
||||||
|
getgzhlineOrderDetail
|
||||||
|
} from '@/api/index.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JxPaysuccessful',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 支付时间
|
||||||
|
paytime: '',
|
||||||
|
Status: 1,
|
||||||
|
Name: '',
|
||||||
|
order_sn: '',
|
||||||
|
|
||||||
|
// 支付抵扣参数
|
||||||
|
amountInfo: {} // 支付相关信息
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onLoad(option) {
|
||||||
|
let date = new Date();
|
||||||
|
this.paytime =
|
||||||
|
`${date.getFullYear()}/${this.f0(date.getMonth() + 1)}/${this.f0(date.getDate())} ${this.f0(date.getHours())}:${this.f0(date.getMinutes())}:${this.f0(date.getSeconds())}`;
|
||||||
|
this.Status = option?.Status;
|
||||||
|
this.Name = option?.merchant_name;
|
||||||
|
this.order_sn = option?.order_sn;
|
||||||
|
this.isAllApi = option?.isAllApi;
|
||||||
|
|
||||||
|
this.fetchOrderDetail();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
// 补0
|
||||||
|
f0(n) {
|
||||||
|
if (n <= 9) return `0${n}`;
|
||||||
|
return n;
|
||||||
|
},
|
||||||
|
|
||||||
|
async fetchOrderDetail() {
|
||||||
|
try {
|
||||||
|
const apiCall = Number(this.isAllApi) ? getOfflineOrderDetail : getgzhlineOrderDetail;
|
||||||
|
const res = await apiCall({
|
||||||
|
order_sn: this.order_sn
|
||||||
|
});
|
||||||
|
this.amountInfo = res.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取订单详情失败:', error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 关闭H5页面
|
||||||
|
closePage() {
|
||||||
|
// H5环境下关闭当前页面
|
||||||
|
window.close();
|
||||||
|
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
|
||||||
|
WeixinJSBridge.invoke('closeWindow', {}, function(res) {
|
||||||
|
if (res.err_msg == "close_window:ok") {
|
||||||
|
// 关闭成功的处理
|
||||||
|
console.log('关闭成功的处理')
|
||||||
|
} else {
|
||||||
|
// 关闭失败的处理
|
||||||
|
console.log('关闭失败的处理')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.Content-Box {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
margin: 0rpx 50rpx;
|
||||||
|
|
||||||
|
.Status {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 296.15rpx;
|
||||||
|
height: 167.31rpx;
|
||||||
|
|
||||||
|
.img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.Shop-Name {
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 50rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 50rpx 0rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Pay-Infor {
|
||||||
|
// margin-top: 42.31rpx;
|
||||||
|
padding: 19.23rpx;
|
||||||
|
width: 100%;
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
border-radius: 23.08rpx;
|
||||||
|
font-size: 26.92rpx;
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.Pay-Item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
line-height: 76.92rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.complete {
|
||||||
|
width: 500rpx;
|
||||||
|
margin: 32rpx auto;
|
||||||
|
background: linear-gradient(90deg, #FF9999 0%, #E11616 100%);
|
||||||
|
color: #FFFFFF;
|
||||||
|
border-radius: 50rpx;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,606 @@
|
||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<!-- 店铺扫码支付页 -->
|
||||||
|
<view class="content">
|
||||||
|
<view class="main">
|
||||||
|
<view class="title">
|
||||||
|
<image class="shop-images" src="https://img.agrimedia.cn/APP-ZhiFuBusiness/shop.png"></image>
|
||||||
|
<view class="name">{{form.name? form.name : '--'}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="money" @click="inputClick()">
|
||||||
|
<view class="input">
|
||||||
|
<text class="txt">消费金额</text>
|
||||||
|
<view class="flex wrap">
|
||||||
|
<input class="num" type="text" v-model="money" disabled="true" />
|
||||||
|
<text class="line" v-if="!money">|</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="container">
|
||||||
|
<view class="list-item" @click="rateTypeClick(2)">
|
||||||
|
<text class="titles">抵用券抵扣</text>
|
||||||
|
<view class="right-section">
|
||||||
|
<text>{{(Number(broker) + Number(vouchers)).toFixed(2) == 0? '0.00' : (Number(broker) + Number(vouchers)).toFixed(2)}}</text>
|
||||||
|
<view class="wx_flex wx_flex-items-center">
|
||||||
|
<image style="width: 31rpx;height: 31rpx; margin-top: 10rpx"
|
||||||
|
:src="couponUsed==1?'https://imgs.agrimedia.cn/shop/select_icon.png':'https://imgs.agrimedia.cn/shop/unselect_icon.png'"
|
||||||
|
mode=""></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 实际支付 -->
|
||||||
|
<view class="payment-section">
|
||||||
|
<text class="titles">实际支付</text>
|
||||||
|
<text class="payment-amount">¥{{actualPayment}}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="pay-btn" @click="keyConfirm">
|
||||||
|
去支付
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- <monokeyboard
|
||||||
|
ref="mono"
|
||||||
|
:value="money"
|
||||||
|
:show="keyshow"
|
||||||
|
@confirm="keyConfirm"
|
||||||
|
@change="keyChange"
|
||||||
|
:isPay="a">
|
||||||
|
</monokeyboard> -->
|
||||||
|
|
||||||
|
<!-- <view class="shadow" v-if="loading"></view> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
HTTP_REQUEST_URL
|
||||||
|
} from '@/config/app';
|
||||||
|
import monokeyboard from '@/components/mono-keyboard/mono-keyboard.vue';
|
||||||
|
import OnlineShop from '@/components/OnlineShop.vue';
|
||||||
|
|
||||||
|
import UrlUtils from '@/utils/urlUtils.js';
|
||||||
|
import getUrlParam from '@/utils/utils.js';
|
||||||
|
import {
|
||||||
|
middleLogin,
|
||||||
|
computedOrder,
|
||||||
|
gzhcomputedOrder,
|
||||||
|
getMerchantInfo,
|
||||||
|
doOrder,
|
||||||
|
dogzhOrder,
|
||||||
|
cancelPay,
|
||||||
|
getMerchantInfoByCode
|
||||||
|
} from '@/api/index';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
monokeyboard,
|
||||||
|
OnlineShop
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
authKey: '',
|
||||||
|
bindPhone: '',
|
||||||
|
keyshow: true,
|
||||||
|
token: '',
|
||||||
|
|
||||||
|
qrcode: '',
|
||||||
|
merchant_id: '', //下单店铺id
|
||||||
|
ID: '',
|
||||||
|
form: {},
|
||||||
|
money: '', // 手动输入
|
||||||
|
couponUsed: false, // 抵用券使用状态
|
||||||
|
commissionUsed: false, // 佣金使用状态
|
||||||
|
vouchers: '',
|
||||||
|
broker: '',
|
||||||
|
actualPayment: '', // 实际支付金额
|
||||||
|
a: false,
|
||||||
|
hasAssigned: false, // 标志变量
|
||||||
|
loading: true,
|
||||||
|
amountInfo: {},
|
||||||
|
|
||||||
|
dikou: 0,
|
||||||
|
|
||||||
|
|
||||||
|
order_id: '', // 查询订单号
|
||||||
|
dat: '', // 直接支付的参数
|
||||||
|
tabIndex: '', // 支付结束的tab选项
|
||||||
|
orderData: {} // 显示的价格 { price: '100' }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
money: {
|
||||||
|
handler: function(newV, oldV) {
|
||||||
|
this.getTotal()
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onLoad() {
|
||||||
|
const url = window.location.href;
|
||||||
|
const cleanUrl = this.cleanUrl(url);
|
||||||
|
|
||||||
|
const token = getUrlParam('token') || this.$store.state.app.token;
|
||||||
|
if (token) {
|
||||||
|
this.$store.commit('UPDATE_LOGIN', token);
|
||||||
|
|
||||||
|
// 扫码店铺支付
|
||||||
|
if (getUrlParam('merchant_id') && !getUrlParam('from_type')) {
|
||||||
|
this.getData(getUrlParam('merchant_id'));
|
||||||
|
} else if (getUrlParam('code')) {
|
||||||
|
this.getQrData(getUrlParam('code'));
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '店铺码为空',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 没有token,拼接当前url跳转到登录页
|
||||||
|
console.log(encodeURIComponent(cleanUrl), '跳转');
|
||||||
|
window.location.replace(`${HTTP_REQUEST_URL}/api/v2/routine/gzhLogin?back_url=${encodeURIComponent(cleanUrl)}`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
// 清理URL格式,处理多个问号的情况 将多个连续的?替换为单个&
|
||||||
|
cleanUrl(url) {
|
||||||
|
let cleanUrl = url.replace(/\?+/g, '?');
|
||||||
|
const firstQuestionMarkIndex = cleanUrl.indexOf('?');
|
||||||
|
if (firstQuestionMarkIndex !== -1) {
|
||||||
|
const beforeParams = cleanUrl.substring(0, firstQuestionMarkIndex + 1);
|
||||||
|
const afterParams = cleanUrl.substring(firstQuestionMarkIndex + 1).replace(/\?/g, '&');
|
||||||
|
cleanUrl = beforeParams + afterParams;
|
||||||
|
}
|
||||||
|
return cleanUrl;
|
||||||
|
},
|
||||||
|
|
||||||
|
// ID获取店铺
|
||||||
|
getData(id) {
|
||||||
|
getMerchantInfo({
|
||||||
|
id: id
|
||||||
|
}).then(res => {
|
||||||
|
this.form = res.data;
|
||||||
|
this.merchant_id = res.data.merchant_id
|
||||||
|
this.a = true;
|
||||||
|
this.loading = false;
|
||||||
|
// 获取商户信息后,初始化抵用券信息
|
||||||
|
this.calculatePayment();
|
||||||
|
}).catch(error => {
|
||||||
|
uni.showToast({
|
||||||
|
title: error,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// CODE获取商户信息
|
||||||
|
getQrData(qrcode) {
|
||||||
|
let that = this;
|
||||||
|
this.qrcode = qrcode;
|
||||||
|
getMerchantInfoByCode({
|
||||||
|
code: qrcode
|
||||||
|
}).then(res => {
|
||||||
|
this.form = res.data.merchantInfo;
|
||||||
|
this.merchant_id = res.data.merchantInfo.merchant_id;
|
||||||
|
this.a = true;
|
||||||
|
this.loading = false;
|
||||||
|
|
||||||
|
// 获取商户信息后,初始化抵用券信息
|
||||||
|
this.calculatePayment();
|
||||||
|
}).catch(error => {
|
||||||
|
// 返回的文字判断,优先显示未绑定码牌
|
||||||
|
this.loading = false
|
||||||
|
this.showModal = true;
|
||||||
|
this.form.merchantInfo = 0;
|
||||||
|
this.form.status = 1;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 抵用券状态变化
|
||||||
|
rateTypeClick(val) {
|
||||||
|
if (this.money > 0 || this.money !== '') {
|
||||||
|
if (val == 1) {
|
||||||
|
this.commissionUsed = !this.commissionUsed;
|
||||||
|
this.couponUsed = !this.couponUsed
|
||||||
|
} else {
|
||||||
|
this.couponUsed = !this.couponUsed
|
||||||
|
this.commissionUsed = !this.commissionUsed;
|
||||||
|
}
|
||||||
|
this.getTotal();
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '请输入金额',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 实际支付展示
|
||||||
|
getTotal() {
|
||||||
|
if (Number(this.amountInfo.broker_balance) + Number(this.amountInfo.coin_balance) >= Number(this.money) &&
|
||||||
|
Number(this.money) && this.couponUsed) {
|
||||||
|
this.actualPayment = 0.01
|
||||||
|
this.dikou = (Number(this.money) - (Number(this.amountInfo.broker_balance) + Number(this.amountInfo
|
||||||
|
.coin_balance))).toFixed(2);
|
||||||
|
} else if (Number(this.money) && this.couponUsed) {
|
||||||
|
this.actualPayment = (Number(this.money) - (Number(this.amountInfo.broker_balance) + Number(this
|
||||||
|
.amountInfo.coin_balance))).toFixed(2);
|
||||||
|
this.dikou = (Number(this.amountInfo.broker_balance) + Number(this.amountInfo.coin_balance)).toFixed(
|
||||||
|
2);
|
||||||
|
} else {
|
||||||
|
this.actualPayment = this.money;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询抵用券余额
|
||||||
|
async calculatePayment() {
|
||||||
|
const params = {
|
||||||
|
pay_price: this.money || 0,
|
||||||
|
use_coin: this.couponUsed ? 1 : 0,
|
||||||
|
use_broker: this.commissionUsed ? 1 : 0
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const apiCall = Number(this.isAllApi) === 1 ? computedOrder : gzhcomputedOrder;
|
||||||
|
const res = await apiCall(params);
|
||||||
|
|
||||||
|
this.actualPayment = res.data.real_pay_price;
|
||||||
|
this.amountInfo = res.data;
|
||||||
|
|
||||||
|
if (!this.hasAssigned) {
|
||||||
|
this.hasAssigned = true;
|
||||||
|
this.vouchers = res.data.coin_balance;
|
||||||
|
this.broker = res.data.broker_balance;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// console.error('获取抵用券余额失败:', error.msg);
|
||||||
|
uni.showToast({
|
||||||
|
title: error.msg,
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
async keyConfirm(e) {
|
||||||
|
// 输入验证
|
||||||
|
if (isNaN(this.money)) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '请输入正常的数字',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Number(this.money) >= 1000000) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '支付金额不能大于一百万',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Number(this.money) <= 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '支付金额不能为0',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uni.showLoading({
|
||||||
|
title: "正在跳转中",
|
||||||
|
mask: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!this.merchant_id) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 准备支付参数
|
||||||
|
const params = {
|
||||||
|
pay_price: Number(this.money),
|
||||||
|
use_coin: this.couponUsed ? 1 : 0,
|
||||||
|
use_broker: this.commissionUsed ? 1 : 0,
|
||||||
|
merchant_id: this.merchant_id,
|
||||||
|
code: this.qrcode,
|
||||||
|
is_middle_pay: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
// 执行支付
|
||||||
|
const apiCall = Number(this.isAllApi) ? doOrder : dogzhOrder;
|
||||||
|
const res = await apiCall(params);
|
||||||
|
const jsConfig = res.data;
|
||||||
|
const order_sn = jsConfig.order_sn;
|
||||||
|
|
||||||
|
// 检查环境
|
||||||
|
const ua = window.navigator.userAgent.toLowerCase();
|
||||||
|
const isWechat = ua.includes('micromessenger');
|
||||||
|
const isH5 = typeof window !== 'undefined';
|
||||||
|
|
||||||
|
if (!isH5 || !isWechat) {
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: '请在微信浏览器中使用微信支付功能',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000
|
||||||
|
});
|
||||||
|
this.cancelVideo();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 微信支付处理
|
||||||
|
if (!jsConfig) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '支付参数错误',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
uni.hideLoading();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onBridgeReady = () => {
|
||||||
|
window.WeixinJSBridge.invoke(
|
||||||
|
'getBrandWCPayRequest', {
|
||||||
|
'appId': jsConfig.appId,
|
||||||
|
'timeStamp': jsConfig.timeStamp,
|
||||||
|
'nonceStr': jsConfig.nonceStr,
|
||||||
|
'package': jsConfig.package,
|
||||||
|
'signType': jsConfig.signType,
|
||||||
|
'paySign': jsConfig.paySign
|
||||||
|
}, (res) => {
|
||||||
|
const isSuccess = res.err_msg === 'get_brand_wcpay_request:ok';
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: isSuccess ? "支付完成" : "取消支付",
|
||||||
|
icon: isSuccess ? 'success' : 'none',
|
||||||
|
duration: 2000,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.clearPaymentData();
|
||||||
|
if (!isSuccess) this.cancelVideo();
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
const url =
|
||||||
|
`/pages/Paysuccessful/jxPaysuccessful?merchant_name=${this.form.name}&order_sn=${order_sn}&Status=${isSuccess ? 1 : 2}&isAllApi=${this.isAllApi}`;
|
||||||
|
uni.redirectTo({
|
||||||
|
url
|
||||||
|
});
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof window.WeixinJSBridge === "undefined") {
|
||||||
|
if (document.addEventListener) {
|
||||||
|
document.addEventListener('WeixinJSBridgeReady', onBridgeReady.bind(this), false);
|
||||||
|
} else if (document.attachEvent) {
|
||||||
|
document.attachEvent('WeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady.bind(this));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBridgeReady.call(this);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
uni.hideLoading();
|
||||||
|
uni.showToast({
|
||||||
|
title: err.msg || err.message || err.data.message || '支付处理失败',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 2000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
keyChange(e) {
|
||||||
|
if (this.isTwoDecimalPlaces(e)) {
|
||||||
|
console.log(e, '123')
|
||||||
|
this.money = e
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
inputClick() {
|
||||||
|
uni.showToast({
|
||||||
|
title: '使用键盘输入',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
isTwoDecimalPlaces(num) {
|
||||||
|
const numStr = num.toString();
|
||||||
|
const decimalIndex = numStr.indexOf('.');
|
||||||
|
|
||||||
|
// 如果没有小数点,或者小数点后的位数不超过 2 位
|
||||||
|
if (decimalIndex === -1 || numStr.length - decimalIndex - 1 <= 2) {
|
||||||
|
return true; // 输入到了小数点后两位
|
||||||
|
} else {
|
||||||
|
return false; // 没有输入到小数点后两位
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// 清理支付数据
|
||||||
|
clearPaymentData() {
|
||||||
|
this.money = '';
|
||||||
|
this.actualPayment = '';
|
||||||
|
this.couponUsed = false;
|
||||||
|
this.commissionUsed = false;
|
||||||
|
if (this.$refs.mono) {
|
||||||
|
this.$refs.mono.money = '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 取消发声
|
||||||
|
cancelVideo() {
|
||||||
|
cancelPay({
|
||||||
|
merchant_id: this.merchant_id
|
||||||
|
}).then(res => {
|
||||||
|
console.log(res)
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('取消支付播报失败:', error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.content {
|
||||||
|
margin: 0 auto;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
height: 100vh;
|
||||||
|
overflow: hidden;
|
||||||
|
.main {
|
||||||
|
margin: 20rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 30rpx;
|
||||||
|
padding: 30rpx;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 36rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-top: 30rpx;
|
||||||
|
|
||||||
|
.shop-images {
|
||||||
|
width: 50rpx;
|
||||||
|
height: 50rpx;
|
||||||
|
margin-right: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.money {
|
||||||
|
text-align: left;
|
||||||
|
padding: 30rpx 40rpx;
|
||||||
|
font-size: 42rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-top: 40rpx;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
|
||||||
|
.input {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 38rpx;
|
||||||
|
|
||||||
|
.txt {
|
||||||
|
width: 300rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-right: 30rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.num {
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 38rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
// /deep/ .u-input--radius {
|
||||||
|
// background-color: transparent !important;
|
||||||
|
// border: none !important;
|
||||||
|
// }
|
||||||
|
.wrap {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.line {
|
||||||
|
position: absolute;
|
||||||
|
top: 10rpx;
|
||||||
|
right: 14rpx;
|
||||||
|
animation: blink 1s infinite;
|
||||||
|
color: #556dea;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 光标闪烁动画 */
|
||||||
|
@keyframes blink {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 30rpx 20rpx;
|
||||||
|
border-bottom: 1rpx solid #eee;
|
||||||
|
|
||||||
|
.titles {
|
||||||
|
font-size: 32rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-section {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-section {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 40rpx 20rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 38rpx;
|
||||||
|
|
||||||
|
.titles {}
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-amount {
|
||||||
|
color: #ff2d55;
|
||||||
|
font-size: 38rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shadow {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #000;
|
||||||
|
opacity: .5;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
z-index: 999999;
|
||||||
|
}
|
||||||
|
.pay-btn {
|
||||||
|
background-color: #07c160;
|
||||||
|
width: 200rpx;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
padding: 20rpx 10rpx;
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
font-size: 38rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-top: 80rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#app {
|
||||||
|
max-width: 750rpx;
|
||||||
|
min-width: 750rpx;
|
||||||
|
height: auto;
|
||||||
|
margin: 0 auto;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
page {
|
||||||
|
/* // background-color: #1C1C1E;
|
||||||
|
// background-image: url('https://img.agrimedia.cn/sch5/bg.png');
|
||||||
|
// background-size: cover; */
|
||||||
|
padding: 30.77rpx;
|
||||||
|
height: 100%;
|
||||||
|
width: 100;
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
|
|
@ -0,0 +1,539 @@
|
||||||
|
/* Logo 字体 */
|
||||||
|
@font-face {
|
||||||
|
font-family: "iconfont logo";
|
||||||
|
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||||
|
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "iconfont logo";
|
||||||
|
font-size: 160px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tabs */
|
||||||
|
.nav-tabs {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-tabs .nav-more {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 42px;
|
||||||
|
line-height: 42px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabs {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabs li {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 16px;
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#tabs .active {
|
||||||
|
border-bottom-color: #f00;
|
||||||
|
color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-container .content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 页面布局 */
|
||||||
|
.main {
|
||||||
|
padding: 30px 100px;
|
||||||
|
width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo {
|
||||||
|
color: #333;
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
line-height: 1;
|
||||||
|
height: 110px;
|
||||||
|
margin-top: -50px;
|
||||||
|
overflow: hidden;
|
||||||
|
*zoom: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo a {
|
||||||
|
font-size: 160px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.helps {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.helps pre {
|
||||||
|
padding: 20px;
|
||||||
|
margin: 10px 0;
|
||||||
|
border: solid 1px #e7e1cd;
|
||||||
|
background-color: #fffdef;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists {
|
||||||
|
width: 100% !important;
|
||||||
|
overflow: hidden;
|
||||||
|
*zoom: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li {
|
||||||
|
width: 100px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
margin-right: 20px;
|
||||||
|
text-align: center;
|
||||||
|
list-style: none !important;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li .code-name {
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .icon {
|
||||||
|
display: block;
|
||||||
|
height: 100px;
|
||||||
|
line-height: 100px;
|
||||||
|
font-size: 42px;
|
||||||
|
margin: 10px auto;
|
||||||
|
color: #333;
|
||||||
|
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .icon:hover {
|
||||||
|
font-size: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .svg-icon {
|
||||||
|
/* 通过设置 font-size 来改变图标大小 */
|
||||||
|
width: 1em;
|
||||||
|
/* 图标和文字相邻时,垂直对齐 */
|
||||||
|
vertical-align: -0.15em;
|
||||||
|
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||||
|
fill: currentColor;
|
||||||
|
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||||
|
normalize.css 中也包含这行 */
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li .name,
|
||||||
|
.icon_lists li .code-name {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* markdown 样式 */
|
||||||
|
.markdown {
|
||||||
|
color: #666;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown img {
|
||||||
|
vertical-align: middle;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1 {
|
||||||
|
color: #404040;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 40px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h2,
|
||||||
|
.markdown h3,
|
||||||
|
.markdown h4,
|
||||||
|
.markdown h5,
|
||||||
|
.markdown h6 {
|
||||||
|
color: #404040;
|
||||||
|
margin: 1.6em 0 0.6em 0;
|
||||||
|
font-weight: 500;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1 {
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h2 {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h5 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h6 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown hr {
|
||||||
|
height: 1px;
|
||||||
|
border: 0;
|
||||||
|
background: #e9e9e9;
|
||||||
|
margin: 16px 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown p {
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>p,
|
||||||
|
.markdown>blockquote,
|
||||||
|
.markdown>.highlight,
|
||||||
|
.markdown>ol,
|
||||||
|
.markdown>ul {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown ul>li {
|
||||||
|
list-style: circle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ul li,
|
||||||
|
.markdown blockquote ul>li {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ul li p,
|
||||||
|
.markdown>ol li p {
|
||||||
|
margin: 0.6em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown ol>li {
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ol li,
|
||||||
|
.markdown blockquote ol>li {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown code {
|
||||||
|
margin: 0 3px;
|
||||||
|
padding: 0 5px;
|
||||||
|
background: #eee;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown strong,
|
||||||
|
.markdown b {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0px;
|
||||||
|
empty-cells: show;
|
||||||
|
border: 1px solid #e9e9e9;
|
||||||
|
width: 95%;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th {
|
||||||
|
white-space: nowrap;
|
||||||
|
color: #333;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th,
|
||||||
|
.markdown>table td {
|
||||||
|
border: 1px solid #e9e9e9;
|
||||||
|
padding: 8px 16px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th {
|
||||||
|
background: #F7F7F7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown blockquote {
|
||||||
|
font-size: 90%;
|
||||||
|
color: #999;
|
||||||
|
border-left: 4px solid #e9e9e9;
|
||||||
|
padding-left: 0.8em;
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown blockquote p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown .anchor {
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown .waiting {
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1:hover .anchor,
|
||||||
|
.markdown h2:hover .anchor,
|
||||||
|
.markdown h3:hover .anchor,
|
||||||
|
.markdown h4:hover .anchor,
|
||||||
|
.markdown h5:hover .anchor,
|
||||||
|
.markdown h6:hover .anchor {
|
||||||
|
opacity: 1;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>br,
|
||||||
|
.markdown>p>br {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
display: block;
|
||||||
|
background: white;
|
||||||
|
padding: 0.5em;
|
||||||
|
color: #333333;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-meta {
|
||||||
|
color: #969896;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-string,
|
||||||
|
.hljs-variable,
|
||||||
|
.hljs-template-variable,
|
||||||
|
.hljs-strong,
|
||||||
|
.hljs-emphasis,
|
||||||
|
.hljs-quote {
|
||||||
|
color: #df5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-selector-tag,
|
||||||
|
.hljs-type {
|
||||||
|
color: #a71d5d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-literal,
|
||||||
|
.hljs-symbol,
|
||||||
|
.hljs-bullet,
|
||||||
|
.hljs-attribute {
|
||||||
|
color: #0086b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-section,
|
||||||
|
.hljs-name {
|
||||||
|
color: #63a35c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-tag {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-attr,
|
||||||
|
.hljs-selector-id,
|
||||||
|
.hljs-selector-class,
|
||||||
|
.hljs-selector-attr,
|
||||||
|
.hljs-selector-pseudo {
|
||||||
|
color: #795da3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-addition {
|
||||||
|
color: #55a532;
|
||||||
|
background-color: #eaffea;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-deletion {
|
||||||
|
color: #bd2c00;
|
||||||
|
background-color: #ffecec;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-link {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 代码高亮 */
|
||||||
|
/* PrismJS 1.15.0
|
||||||
|
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||||
|
/**
|
||||||
|
* prism.js default theme for JavaScript, CSS and HTML
|
||||||
|
* Based on dabblet (http://dabblet.com)
|
||||||
|
* @author Lea Verou
|
||||||
|
*/
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
color: black;
|
||||||
|
background: none;
|
||||||
|
text-shadow: 0 1px white;
|
||||||
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
-o-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-moz-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::-moz-selection,
|
||||||
|
pre[class*="language-"] ::-moz-selection,
|
||||||
|
code[class*="language-"]::-moz-selection,
|
||||||
|
code[class*="language-"] ::-moz-selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::selection,
|
||||||
|
pre[class*="language-"] ::selection,
|
||||||
|
code[class*="language-"]::selection,
|
||||||
|
code[class*="language-"] ::selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code blocks */
|
||||||
|
pre[class*="language-"] {
|
||||||
|
padding: 1em;
|
||||||
|
margin: .5em 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
:not(pre)>code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
background: #f5f2f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline code */
|
||||||
|
:not(pre)>code[class*="language-"] {
|
||||||
|
padding: .1em;
|
||||||
|
border-radius: .3em;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.comment,
|
||||||
|
.token.prolog,
|
||||||
|
.token.doctype,
|
||||||
|
.token.cdata {
|
||||||
|
color: slategray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.punctuation {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.namespace {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.property,
|
||||||
|
.token.tag,
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
|
.token.constant,
|
||||||
|
.token.symbol,
|
||||||
|
.token.deleted {
|
||||||
|
color: #905;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.selector,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.string,
|
||||||
|
.token.char,
|
||||||
|
.token.builtin,
|
||||||
|
.token.inserted {
|
||||||
|
color: #690;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.operator,
|
||||||
|
.token.entity,
|
||||||
|
.token.url,
|
||||||
|
.language-css .token.string,
|
||||||
|
.style .token.string {
|
||||||
|
color: #9a6e3a;
|
||||||
|
background: hsla(0, 0%, 100%, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.atrule,
|
||||||
|
.token.attr-value,
|
||||||
|
.token.keyword {
|
||||||
|
color: #07a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.function,
|
||||||
|
.token.class-name {
|
||||||
|
color: #DD4A68;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.regex,
|
||||||
|
.token.important,
|
||||||
|
.token.variable {
|
||||||
|
color: #e90;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.important,
|
||||||
|
.token.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,257 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<title>iconfont Demo</title>
|
||||||
|
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
|
||||||
|
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
|
||||||
|
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
|
||||||
|
<link rel="stylesheet" href="demo.css">
|
||||||
|
<link rel="stylesheet" href="iconfont.css">
|
||||||
|
<script src="iconfont.js"></script>
|
||||||
|
<!-- jQuery -->
|
||||||
|
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
|
||||||
|
<!-- 代码高亮 -->
|
||||||
|
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
|
||||||
|
<style>
|
||||||
|
.main .logo {
|
||||||
|
margin-top: 0;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo a {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo .sub-title {
|
||||||
|
margin-left: 0.5em;
|
||||||
|
font-size: 22px;
|
||||||
|
color: #fff;
|
||||||
|
background: linear-gradient(-45deg, #3967FF, #B500FE);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="main">
|
||||||
|
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
|
||||||
|
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
|
||||||
|
|
||||||
|
</a></h1>
|
||||||
|
<div class="nav-tabs">
|
||||||
|
<ul id="tabs" class="dib-box">
|
||||||
|
<li class="dib active"><span>Unicode</span></li>
|
||||||
|
<li class="dib"><span>Font class</span></li>
|
||||||
|
<li class="dib"><span>Symbol</span></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3770712" target="_blank" class="nav-more">查看项目</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="tab-container">
|
||||||
|
<div class="content unicode" style="display: block;">
|
||||||
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">对勾_块</div>
|
||||||
|
<div class="code-name">&#xed1d;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">警告</div>
|
||||||
|
<div class="code-name">&#xeb65;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">购物车满</div>
|
||||||
|
<div class="code-name">&#xe600;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<div class="article markdown">
|
||||||
|
<h2 id="unicode-">Unicode 引用</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
|
||||||
|
<ul>
|
||||||
|
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
|
||||||
|
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
|
||||||
|
</ul>
|
||||||
|
<blockquote>
|
||||||
|
<p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Unicode 使用步骤如下:</p>
|
||||||
|
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
|
||||||
|
<pre><code class="language-css"
|
||||||
|
>@font-face {
|
||||||
|
font-family: 'iconfont';
|
||||||
|
src: url('iconfont.woff2?t=1669284444124') format('woff2'),
|
||||||
|
url('iconfont.woff?t=1669284444124') format('woff'),
|
||||||
|
url('iconfont.ttf?t=1669284444124') format('truetype');
|
||||||
|
}
|
||||||
|
</code></pre>
|
||||||
|
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
||||||
|
<pre><code class="language-css"
|
||||||
|
>.iconfont {
|
||||||
|
font-family: "iconfont" !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
</code></pre>
|
||||||
|
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
|
||||||
|
<pre>
|
||||||
|
<code class="language-html"
|
||||||
|
><span class="iconfont">&#x33;</span>
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="content font-class">
|
||||||
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-duigou_kuai"></span>
|
||||||
|
<div class="name">
|
||||||
|
对勾_块
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-duigou_kuai
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-jinggao"></span>
|
||||||
|
<div class="name">
|
||||||
|
警告
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-jinggao
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-gouwucheman"></span>
|
||||||
|
<div class="name">
|
||||||
|
购物车满
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-gouwucheman
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<div class="article markdown">
|
||||||
|
<h2 id="font-class-">font-class 引用</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
|
||||||
|
<p>与 Unicode 使用方式相比,具有如下特点:</p>
|
||||||
|
<ul>
|
||||||
|
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
|
||||||
|
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
|
||||||
|
</ul>
|
||||||
|
<p>使用步骤如下:</p>
|
||||||
|
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
|
||||||
|
<pre><code class="language-html"><link rel="stylesheet" href="./iconfont.css">
|
||||||
|
</code></pre>
|
||||||
|
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||||
|
<pre><code class="language-html"><span class="iconfont icon-xxx"></span>
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p>"
|
||||||
|
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="content symbol">
|
||||||
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-duigou_kuai"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">对勾_块</div>
|
||||||
|
<div class="code-name">#icon-duigou_kuai</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-jinggao"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">警告</div>
|
||||||
|
<div class="code-name">#icon-jinggao</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-gouwucheman"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">购物车满</div>
|
||||||
|
<div class="code-name">#icon-gouwucheman</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<div class="article markdown">
|
||||||
|
<h2 id="symbol-">Symbol 引用</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
|
||||||
|
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
|
||||||
|
<ul>
|
||||||
|
<li>支持多色图标了,不再受单色限制。</li>
|
||||||
|
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
|
||||||
|
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
|
||||||
|
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
|
||||||
|
</ul>
|
||||||
|
<p>使用步骤如下:</p>
|
||||||
|
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
|
||||||
|
<pre><code class="language-html"><script src="./iconfont.js"></script>
|
||||||
|
</code></pre>
|
||||||
|
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
|
||||||
|
<pre><code class="language-html"><style>
|
||||||
|
.icon {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
vertical-align: -0.15em;
|
||||||
|
fill: currentColor;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</code></pre>
|
||||||
|
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||||
|
<pre><code class="language-html"><svg class="icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-xxx"></use>
|
||||||
|
</svg>
|
||||||
|
</code></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('.tab-container .content:first').show()
|
||||||
|
|
||||||
|
$('#tabs li').click(function (e) {
|
||||||
|
var tabContent = $('.tab-container .content')
|
||||||
|
var index = $(this).index()
|
||||||
|
|
||||||
|
if ($(this).hasClass('active')) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
$('#tabs li').removeClass('active')
|
||||||
|
$(this).addClass('active')
|
||||||
|
|
||||||
|
tabContent.hide().eq(index).fadeIn()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "iconfont"; /* Project id 3770712 */
|
||||||
|
src: url('iconfont.woff2?t=1669284444124') format('woff2'),
|
||||||
|
url('iconfont.woff?t=1669284444124') format('woff'),
|
||||||
|
url('iconfont.ttf?t=1669284444124') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
font-family: "iconfont" !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-duigou_kuai:before {
|
||||||
|
content: "\ed1d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-jinggao:before {
|
||||||
|
content: "\eb65";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-gouwucheman:before {
|
||||||
|
content: "\e600";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
window._iconfont_svg_string_3770712='<svg><symbol id="icon-duigou_kuai" viewBox="0 0 1024 1024"><path d="M817.728 198.72l111.744 114.56-545.216 532.128-285.92-273.024 110.528-115.712 174.176 166.336z" ></path></symbol><symbol id="icon-jinggao" viewBox="0 0 1024 1024"><path d="M512 32C246.912 32 32 246.912 32 512c0 265.088 214.912 480 480 480 265.088 0 480-214.912 480-480 0-265.088-214.912-480-480-480z m0 896C282.24 928 96 741.76 96 512S282.24 96 512 96s416 186.24 416 416-186.24 416-416 416z" ></path><path d="M512 384a32 32 0 0 0-32 32v352a32 32 0 0 0 64 0V416a32 32 0 0 0-32-32z" ></path><path d="M512 272m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" ></path></symbol><symbol id="icon-gouwucheman" viewBox="0 0 1024 1024"><path d="M346.112 806.912q19.456 0 36.864 7.168t30.208 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.208 20.48-36.864 7.68q-20.48 0-37.888-7.68t-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 37.888-7.168zM772.096 808.96q19.456 0 37.376 7.168t30.72 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.72 20.48-37.376 7.68-36.864-7.68-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 36.864-7.168zM944.128 227.328q28.672 0 44.544 7.68t22.528 18.944 6.144 24.064-3.584 22.016-13.312 37.888-22.016 62.976-23.552 68.096-18.944 53.248q-13.312 40.96-33.28 56.832t-49.664 15.872l-35.84 0-65.536 0-86.016 0-96.256 0-253.952 0 14.336 92.16 517.12 0q49.152 0 49.152 41.984 0 20.48-9.728 35.328t-38.4 14.848l-49.152 0-94.208 0-118.784 0-119.808 0-99.328 0-55.296 0q-20.48 0-34.304-9.216t-23.04-24.064-14.848-32.256-8.704-32.768q-1.024-6.144-5.632-29.696t-11.264-58.88-14.848-78.848-16.384-87.552q-19.456-103.424-44.032-230.4l-76.8 0q-15.36 0-25.6-7.68t-16.896-18.432-9.216-23.04-2.56-22.528q0-20.48 13.824-33.792t37.376-13.312l21.504 0 21.504 0 25.6 0 34.816 0q20.48 0 32.768 6.144t19.456 15.36 10.24 19.456 5.12 17.408q2.048 8.192 4.096 23.04t4.096 30.208q3.072 18.432 6.144 38.912l700.416 0zM867.328 194.56l-374.784 0 135.168-135.168q23.552-23.552 51.712-24.064t51.712 23.04z" ></path></symbol></svg>',function(n){var t=(t=document.getElementsByTagName("script"))[t.length-1],e=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var o,i,a,d,c,s=function(t,e){e.parentNode.insertBefore(t,e)};if(e&&!n.__iconfont__svg__cssinject__){n.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}o=function(){var t,e=document.createElement("div");e.innerHTML=n._iconfont_svg_string_3770712,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?s(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),o()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(a=o,d=n.document,c=!1,r(),d.onreadystatechange=function(){"complete"==d.readyState&&(d.onreadystatechange=null,l())})}function l(){c||(c=!0,a())}function r(){try{d.documentElement.doScroll("left")}catch(t){return void setTimeout(r,50)}l()}}(window);
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
"id": "3770712",
|
||||||
|
"name": "no name",
|
||||||
|
"font_family": "iconfont",
|
||||||
|
"css_prefix_text": "icon-",
|
||||||
|
"description": "",
|
||||||
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "7954334",
|
||||||
|
"name": "对勾_块",
|
||||||
|
"font_class": "duigou_kuai",
|
||||||
|
"unicode": "ed1d",
|
||||||
|
"unicode_decimal": 60701
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3868273",
|
||||||
|
"name": "警告",
|
||||||
|
"font_class": "jinggao",
|
||||||
|
"unicode": "eb65",
|
||||||
|
"unicode_decimal": 60261
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "5030",
|
||||||
|
"name": "购物车满",
|
||||||
|
"font_class": "gouwucheman",
|
||||||
|
"unicode": "e600",
|
||||||
|
"unicode_decimal": 58880
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,5 @@
|
||||||
|
import { createSSRApp } from "vue";
|
||||||
|
const app = createSSRApp(App);
|
||||||
|
const globals = app.config.globalProperties;
|
||||||
|
// console.log(app,'globals');
|
||||||
|
export {globals};
|
||||||
|
|
@ -0,0 +1,214 @@
|
||||||
|
import Request_ from '../../api/request';
|
||||||
|
|
||||||
|
|
||||||
|
class _init {
|
||||||
|
|
||||||
|
// 登录完成回调(包含处理完成用户携带数据)
|
||||||
|
UserLoginInitCollback = undefined;
|
||||||
|
userInfor = {};
|
||||||
|
// 微信登录之后获取到 参数
|
||||||
|
openid : String = "";
|
||||||
|
session_key : string = "";
|
||||||
|
// Wechat = {};
|
||||||
|
// 支付宝登录之后获取到的参数
|
||||||
|
Apple = {
|
||||||
|
access_token: "0",
|
||||||
|
alipay_user_id: "0",
|
||||||
|
auth_start: "0",
|
||||||
|
expires_in: 0,
|
||||||
|
re_expires_in: 0,
|
||||||
|
refresh_token: "",
|
||||||
|
user_id: "",
|
||||||
|
};
|
||||||
|
code = '';
|
||||||
|
pay_type : number = 0;
|
||||||
|
provider : "weixin" | "qq" | "sinaweibo" | "xiaomi" | "apple" | "univerify" = 'weixin';
|
||||||
|
// 进入来源 Scan | Half
|
||||||
|
referrerInfo:'Scan' | 'Half';
|
||||||
|
// 初始参数
|
||||||
|
__programParameter__ = null;
|
||||||
|
/** 请求参数 */
|
||||||
|
APIoptions = {};
|
||||||
|
constructor(parameters) {
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
this['pay_type'] = 2;
|
||||||
|
// #endif
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
this['pay_type'] = 1;
|
||||||
|
// #endif
|
||||||
|
/**
|
||||||
|
* 初始化来源
|
||||||
|
*/
|
||||||
|
// parameters.referrerInfo = {
|
||||||
|
// path:"pages/index/index",
|
||||||
|
// quer:{},
|
||||||
|
// scene:1037,
|
||||||
|
// referrerInfo:{"appId":"wxc8e2e1d28d15d2e3"},
|
||||||
|
// extraData:{
|
||||||
|
// "thrust_code":"4871020984",
|
||||||
|
// code:"49750683"
|
||||||
|
// },
|
||||||
|
// mode:"embedded",
|
||||||
|
// apiCategory:"embedded"
|
||||||
|
// };
|
||||||
|
if(parameters?.referrerInfo && Object.keys(parameters['referrerInfo'])['length']){
|
||||||
|
this.referrerInfo = 'Half';
|
||||||
|
/**
|
||||||
|
* 初始化参数
|
||||||
|
*/
|
||||||
|
this.__programParameter__ = parameters['referrerInfo']['extraData'];
|
||||||
|
this.APIoptions = this['__programParameter__'];
|
||||||
|
}else{
|
||||||
|
this.referrerInfo = 'Scan';
|
||||||
|
/**
|
||||||
|
* 初始化参数
|
||||||
|
*/
|
||||||
|
this.__programParameter__ = parameters;
|
||||||
|
/**处理拿到的初始化参数 */
|
||||||
|
this.InitParam();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 获取来源 */
|
||||||
|
get source(){
|
||||||
|
return this['referrerInfo'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 推送播报
|
||||||
|
// Pushbroadcast(data){
|
||||||
|
// if(getApp()['globalData']['Pay_Status'] == 2) return;
|
||||||
|
// Request_.GET({ url:"/MiniProgram/Order/cancelPaymentSound", data });
|
||||||
|
// }
|
||||||
|
|
||||||
|
Login() {
|
||||||
|
let url : string = null;
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
url = '/MiniProgram/Api/alipayCodeLogin';
|
||||||
|
this['pay_type'] = 2;
|
||||||
|
// #endif
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
url = '/MiniProgram/Api/wechatCodeLogin';
|
||||||
|
this['pay_type'] = 1;
|
||||||
|
console.log(uni.login,this['provider'],'执行登录');
|
||||||
|
// #endif
|
||||||
|
uni.login({
|
||||||
|
provider: this['provider'],
|
||||||
|
success: loginRes => {
|
||||||
|
console.log(loginRes['code'], 'code---');
|
||||||
|
if (loginRes.code) {
|
||||||
|
let data = null;
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
console.log(loginRes['code'], 'apple:code');
|
||||||
|
data = { code: loginRes['code'] };
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
console.log(loginRes['code'], 'WeChat:code');
|
||||||
|
data = { code: loginRes['code'], type: 1 };
|
||||||
|
// #endif
|
||||||
|
data['thrust_code'] = this['options']['thrust_code'] || '';
|
||||||
|
data['invite_code'] = this['options']['invite_code'] || '';
|
||||||
|
// return
|
||||||
|
|
||||||
|
console.log(data,'data')
|
||||||
|
this.userInfor = data;
|
||||||
|
Request_.GET({ url, data }).then(res => {
|
||||||
|
this.userInfor = {...this['userInfor'],...res['data']}
|
||||||
|
uni.setStorageSync('token', res['data']['token']);
|
||||||
|
console.log(res, '登录信息');
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
// let { openid, session_key } = res['data'];
|
||||||
|
this['Apple'] = res['data'];
|
||||||
|
// #endif
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
let { scan_openid, session_key } = res['data'];
|
||||||
|
this['openid'] = scan_openid;
|
||||||
|
this['session_key'] = session_key;
|
||||||
|
// #endif
|
||||||
|
console.log(this['UserLoginInitCollback'], 'UserLoginInitCollback');
|
||||||
|
if (this['UserLoginInitCollback'] != null && typeof this['UserLoginInitCollback'] == 'function') {
|
||||||
|
this.UserLoginInitCollback();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '登录失败!未获取到code',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fail:error=>{
|
||||||
|
console.log(error,'error')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支付时获取指定平台字段
|
||||||
|
get Getopenid() {
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
return this['Apple']['user_id'];
|
||||||
|
// #endif
|
||||||
|
// #ifdef MP-WEIXIN
|
||||||
|
return this['openid'];
|
||||||
|
// #endif
|
||||||
|
}
|
||||||
|
|
||||||
|
get options(){
|
||||||
|
return this['APIoptions']
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析小程序初始参数
|
||||||
|
InitParam() {
|
||||||
|
console.log(this['__programParameter__'],this['source'],'__programParameter__');
|
||||||
|
// 扫码进入
|
||||||
|
if (this['__programParameter__']?.query?.q || this['__programParameter__']?.query?.scene || this['__programParameter__']?.query?.qrCode) {
|
||||||
|
let searchParamToObj = '';
|
||||||
|
searchParamToObj = this['__programParameter__']['query']?.q || this['__programParameter__']['query']?.scene || this['__programParameter__']['query']?.qrCode;
|
||||||
|
console.log(searchParamToObj, 'searchParamToObj');
|
||||||
|
const obj = {};
|
||||||
|
const Para = this.escape2Html(decodeURIComponent(searchParamToObj));
|
||||||
|
const _i = Para.indexOf('?');
|
||||||
|
console.log(Para, _i, 'Para');
|
||||||
|
if (~_i) {
|
||||||
|
const _U = Para.slice(_i + 1, Para['length']);
|
||||||
|
const _M = _U.split('&');
|
||||||
|
|
||||||
|
for (let i = 0; i < _M['length']; i++) {
|
||||||
|
const index = _M[i].indexOf("=");
|
||||||
|
console.log(index, 'index');
|
||||||
|
const KEY = _M[i].substring(0, index);
|
||||||
|
const VAL = _M[i].substring(index + 1, _M[i].length);
|
||||||
|
obj[KEY] = VAL;
|
||||||
|
};
|
||||||
|
this.APIoptions = obj;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.APIoptions = {};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 商户端扫码进入
|
||||||
|
try{
|
||||||
|
this.APIoptions = this['__programParameter__']['query'];
|
||||||
|
}catch(e){
|
||||||
|
this.APIoptions = {};
|
||||||
|
//TODO handle the exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 字符转义
|
||||||
|
escape2Html(str) {
|
||||||
|
var arrEntities = { 'lt': '<', 'gt': '>', 'nbsp': ' ', 'amp': '&', 'quot': '"' };
|
||||||
|
return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) { return arrEntities[t]; });
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default _init;
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 959 B |
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
|
|
@ -0,0 +1,28 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
export default {
|
||||||
|
token: state => state.app.token,
|
||||||
|
isLogin: state => !!state.app.token,
|
||||||
|
backgroundColor: state => state.app.backgroundColor,
|
||||||
|
userInfo: state => state.app.userInfo || {},
|
||||||
|
uid: state => state.app.uid,
|
||||||
|
homeActive: state => state.app.homeActive,
|
||||||
|
home: state => state.app.home,
|
||||||
|
cartNum: state => state.indexData.cartNum,
|
||||||
|
activityTab: state => state.app.activityTab,
|
||||||
|
address: state => state.app.addressInfo
|
||||||
|
};
|
||||||
|
// export default {
|
||||||
|
// token: state => 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJrYWlmYS5jcm1lYi5uZXQiLCJhdWQiOiJrYWlmYS5jcm1lYi5uZXQiLCJpYXQiOjE1NzcwODM1MzQsIm5iZiI6MTU3NzA4MzUzNCwiZXhwIjoxNTc3MDk0MzM0LCJqdGkiOnsiaWQiOjExMCwidHlwZSI6InVzZXIifX0.U-i1pbdRjyXI1gr79Uq2XBPZ89T8f5Ai9jwrR8woTwE',
|
||||||
|
// isLogin: state => true,
|
||||||
|
// backgroundColor: state => state.app.backgroundColor,
|
||||||
|
// userInfo: state => state.app.userInfo || {}
|
||||||
|
// };
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
import Vue from "vue";
|
||||||
|
import Vuex from "vuex";
|
||||||
|
import modules from "./modules";
|
||||||
|
import getters from "./getters";
|
||||||
|
|
||||||
|
Vue.use(Vuex);
|
||||||
|
const debug = process.env.NODE_ENV !== "production";
|
||||||
|
|
||||||
|
export default new Vuex.Store({
|
||||||
|
modules,
|
||||||
|
getters,
|
||||||
|
strict: debug
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
import {
|
||||||
|
LOGIN_STATUS,
|
||||||
|
ISPAY,
|
||||||
|
UID,
|
||||||
|
USER_INFO,
|
||||||
|
USER_ADDRESS
|
||||||
|
} from '../../config/cache';
|
||||||
|
import Cache from '../../utils/cache';
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
token: Cache.get(LOGIN_STATUS) || false,
|
||||||
|
ISPAY: Cache.get(ISPAY) || '',
|
||||||
|
};
|
||||||
|
|
||||||
|
const mutations = {
|
||||||
|
LOGIN(state, opt) {
|
||||||
|
state.token = opt.token;
|
||||||
|
},
|
||||||
|
UPDATE_LOGIN(state, token) {
|
||||||
|
state.token = token;
|
||||||
|
Cache.set(LOGIN_STATUS, token);
|
||||||
|
},
|
||||||
|
SETALL_PAT(state, data) {
|
||||||
|
state.ISPAY = data;
|
||||||
|
Cache.set(ISPAY, data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const actions = {
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
state,
|
||||||
|
mutations,
|
||||||
|
actions
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
import app from "./app";
|
||||||
|
export default {
|
||||||
|
app,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
uni.addInterceptor({
|
||||||
|
returnValue (res) {
|
||||||
|
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
res.then((res) => {
|
||||||
|
if (!res) return resolve(res)
|
||||||
|
return res[0] ? reject(res[0]) : resolve(res[1])
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
* 这里是uni-app内置的常用样式变量
|
||||||
|
*
|
||||||
|
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||||
|
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||||
|
*
|
||||||
|
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 颜色变量 */
|
||||||
|
|
||||||
|
/* 行为相关颜色 */
|
||||||
|
$uni-color-primary: #007aff;
|
||||||
|
$uni-color-success: #4cd964;
|
||||||
|
$uni-color-warning: #f0ad4e;
|
||||||
|
$uni-color-error: #dd524d;
|
||||||
|
|
||||||
|
/* 文字基本颜色 */
|
||||||
|
$uni-text-color:#333;//基本色
|
||||||
|
$uni-text-color-inverse:#fff;//反色
|
||||||
|
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
|
||||||
|
$uni-text-color-placeholder: #808080;
|
||||||
|
$uni-text-color-disable:#c0c0c0;
|
||||||
|
|
||||||
|
/* 背景颜色 */
|
||||||
|
$uni-bg-color:#ffffff;
|
||||||
|
$uni-bg-color-grey:#f8f8f8;
|
||||||
|
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
|
||||||
|
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
|
||||||
|
|
||||||
|
/* 边框颜色 */
|
||||||
|
$uni-border-color:#c8c7cc;
|
||||||
|
|
||||||
|
/* 尺寸变量 */
|
||||||
|
|
||||||
|
/* 文字尺寸 */
|
||||||
|
$uni-font-size-sm:12px;
|
||||||
|
$uni-font-size-base:14px;
|
||||||
|
$uni-font-size-lg:16px;
|
||||||
|
|
||||||
|
/* 图片尺寸 */
|
||||||
|
$uni-img-size-sm:20px;
|
||||||
|
$uni-img-size-base:26px;
|
||||||
|
$uni-img-size-lg:40px;
|
||||||
|
|
||||||
|
/* Border Radius */
|
||||||
|
$uni-border-radius-sm: 2px;
|
||||||
|
$uni-border-radius-base: 3px;
|
||||||
|
$uni-border-radius-lg: 6px;
|
||||||
|
$uni-border-radius-circle: 50%;
|
||||||
|
|
||||||
|
/* 水平间距 */
|
||||||
|
$uni-spacing-row-sm: 5px;
|
||||||
|
$uni-spacing-row-base: 10px;
|
||||||
|
$uni-spacing-row-lg: 15px;
|
||||||
|
|
||||||
|
/* 垂直间距 */
|
||||||
|
$uni-spacing-col-sm: 4px;
|
||||||
|
$uni-spacing-col-base: 8px;
|
||||||
|
$uni-spacing-col-lg: 12px;
|
||||||
|
|
||||||
|
/* 透明度 */
|
||||||
|
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
|
||||||
|
|
||||||
|
/* 文章场景相关 */
|
||||||
|
$uni-color-title: #2C405A; // 文章标题颜色
|
||||||
|
$uni-font-size-title:20px;
|
||||||
|
$uni-color-subtitle: #555555; // 二级标题颜色
|
||||||
|
$uni-font-size-subtitle:26px;
|
||||||
|
$uni-color-paragraph: #3F536E; // 文章段落颜色
|
||||||
|
$uni-font-size-paragraph:15px;
|
||||||
|
|
@ -0,0 +1,230 @@
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
import {
|
||||||
|
EXPIRE
|
||||||
|
} from '../config/app';
|
||||||
|
|
||||||
|
class Cache {
|
||||||
|
|
||||||
|
constructor(handler) {
|
||||||
|
this.cacheSetHandler = uni.setStorageSync;
|
||||||
|
this.cacheGetHandler = uni.getStorageSync;
|
||||||
|
this.cacheClearHandler = uni.removeStorageSync;
|
||||||
|
this.cacheExpire = 'UNI-APP-CRMEB:TAG';
|
||||||
|
this.clearOverdue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前时间戳
|
||||||
|
*/
|
||||||
|
time() {
|
||||||
|
return Math.round(new Date() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串转时间戳
|
||||||
|
* @param {Object} expiresTime
|
||||||
|
*/
|
||||||
|
strTotime(expiresTime) {
|
||||||
|
let expires_time = expiresTime.substring(0, 19);
|
||||||
|
expires_time = expires_time.replace(/-/g, '/');
|
||||||
|
return Math.round(new Date(expires_time).getTime() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置过期时间缓存
|
||||||
|
* @param {Object} key
|
||||||
|
* @param {Object} expire
|
||||||
|
*/
|
||||||
|
setExpireCaheTag(key, expire) {
|
||||||
|
expire = expire !== undefined ? expire : EXPIRE;
|
||||||
|
if (typeof expire === 'number') {
|
||||||
|
let tag = this.cacheGetHandler(this.cacheExpire),
|
||||||
|
newTag = [],
|
||||||
|
newKeys = [];
|
||||||
|
if (typeof tag === 'object' && tag.length) {
|
||||||
|
newTag = tag.map(item => {
|
||||||
|
newKeys.push(item.key);
|
||||||
|
if (item.key === key) {
|
||||||
|
item.expire = expire === 0 ? 0 : this.time() + expire;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!newKeys.length || newKeys.indexOf(key) === -1) {
|
||||||
|
newTag.push({
|
||||||
|
key: key,
|
||||||
|
expire: expire === 0 ? 0 : this.time() + expire
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.cacheSetHandler(this.cacheExpire, newTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存是否过期,过期自动删除
|
||||||
|
* @param {Object} key
|
||||||
|
* @param {Object} $bool true = 删除,false = 不删除
|
||||||
|
*/
|
||||||
|
getExpireCahe(key, $bool) {
|
||||||
|
try {
|
||||||
|
let tag = this.cacheGetHandler(this.cacheExpire),
|
||||||
|
time = 0,
|
||||||
|
index = false;
|
||||||
|
if (typeof tag === 'object' && tag.length) {
|
||||||
|
tag.map((item, i) => {
|
||||||
|
if (item.key === key) {
|
||||||
|
time = item.expire
|
||||||
|
index = i
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (time) {
|
||||||
|
let newTime = parseInt(time);
|
||||||
|
if (time && time < this.time() && !Number.isNaN(newTime)) {
|
||||||
|
if ($bool === undefined || $bool === true) {
|
||||||
|
this.cacheClearHandler(key);
|
||||||
|
if (index !== false) {
|
||||||
|
tag.splice(index, 1)
|
||||||
|
this.cacheSetHandler(this.cacheExpire, tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return !!this.cacheGetHandler(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置缓存
|
||||||
|
* @param {Object} key
|
||||||
|
* @param {Object} data
|
||||||
|
*/
|
||||||
|
set(key, data, expire) {
|
||||||
|
if (data === undefined) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeof data === 'object')
|
||||||
|
data = JSON.stringify(data);
|
||||||
|
try {
|
||||||
|
this.setExpireCaheTag(key, expire);
|
||||||
|
return this.cacheSetHandler(key, data);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测缓存是否存在
|
||||||
|
* @param {Object} key
|
||||||
|
*/
|
||||||
|
has(checkwhethethecacheexists, isDel) {
|
||||||
|
this.clearOverdue();
|
||||||
|
return this.getExpireCahe(checkwhethethecacheexists, isDel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取缓存
|
||||||
|
* @param {Object} key
|
||||||
|
* @param {Object} $default
|
||||||
|
* @param {Object} expire
|
||||||
|
*/
|
||||||
|
get(key, $default, expire) {
|
||||||
|
this.clearOverdue();
|
||||||
|
try {
|
||||||
|
let isBe = this.getExpireCahe(key);
|
||||||
|
let data = this.cacheGetHandler(key);
|
||||||
|
if (data && isBe) {
|
||||||
|
if (typeof $default === 'boolean')
|
||||||
|
return JSON.parse(data);
|
||||||
|
else
|
||||||
|
return data;
|
||||||
|
} else {
|
||||||
|
if (typeof $default === 'function') {
|
||||||
|
let value = $default();
|
||||||
|
this.set(key, value, expire);
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
this.set(key, $default, expire);
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除缓存
|
||||||
|
* @param {Object} key
|
||||||
|
*/
|
||||||
|
clear(key) {
|
||||||
|
try {
|
||||||
|
let cahceValue = this.cacheGetHandler(this.cacheExpire),
|
||||||
|
index = false;
|
||||||
|
if (cahceValue && typeof cahceValue === 'object' && cahceValue.length) {
|
||||||
|
cahceValue.map((item, i) => {
|
||||||
|
if (item.key === key) {
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (index !== false) {
|
||||||
|
cahceValue.splice(index, 1);
|
||||||
|
}
|
||||||
|
this.cacheSetHandler(this.cacheExpire, cahceValue);
|
||||||
|
}
|
||||||
|
return this.cacheClearHandler(key);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除过期缓存
|
||||||
|
*/
|
||||||
|
clearOverdue() {
|
||||||
|
let cahceValue = this.cacheGetHandler(this.cacheExpire),
|
||||||
|
time = this.time(),
|
||||||
|
newBeOverdueValue = [],
|
||||||
|
newTagValue = [];
|
||||||
|
|
||||||
|
if (cahceValue && typeof cahceValue === 'object' && cahceValue.length) {
|
||||||
|
cahceValue.map(item => {
|
||||||
|
if (item) {
|
||||||
|
if ((item.expire !== undefined && item.expire > time) || item.expire === 0) {
|
||||||
|
newTagValue.push(item);
|
||||||
|
} else {
|
||||||
|
newBeOverdueValue.push(item.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//保存没有过期的缓存标签
|
||||||
|
if (newTagValue.length !== cahceValue.length) {
|
||||||
|
this.cacheSetHandler(this.cacheExpire, newTagValue);
|
||||||
|
}
|
||||||
|
//删除过期缓存
|
||||||
|
newBeOverdueValue.forEach(k => {
|
||||||
|
this.cacheClearHandler(k);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default new Cache;
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
import {
|
||||||
|
HTTP_REQUEST_URL,
|
||||||
|
HEADER,
|
||||||
|
TOKENNAME,
|
||||||
|
TIMEOUT
|
||||||
|
} from '@/config/app';
|
||||||
|
import store from '../store';
|
||||||
|
import UrlUtils from './urlUtils.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送请求
|
||||||
|
*/
|
||||||
|
function baseRequest(url, method, data, {
|
||||||
|
noAuth = false,
|
||||||
|
noVerify = false
|
||||||
|
}) {
|
||||||
|
let Url = HTTP_REQUEST_URL;
|
||||||
|
let header = HEADER;
|
||||||
|
|
||||||
|
HEADER['form-type'] = 'gzh';
|
||||||
|
header = HEADER;
|
||||||
|
|
||||||
|
|
||||||
|
if (store.state.app.token) header[TOKENNAME] = 'Bearer ' + store.state.app.token;
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
if (uni.getStorageSync('locale')) {
|
||||||
|
header['Cb-lang'] = uni.getStorageSync('locale')
|
||||||
|
}
|
||||||
|
uni.request({
|
||||||
|
url: url,
|
||||||
|
method: method || 'GET',
|
||||||
|
header: header,
|
||||||
|
data: data || {},
|
||||||
|
timeout: TIMEOUT,
|
||||||
|
success: (res) => {
|
||||||
|
if (noVerify)
|
||||||
|
reslove(res.data, res);
|
||||||
|
else if (res.data.status == 200)
|
||||||
|
reslove(res.data, res);
|
||||||
|
else if ([110002, 110003, 110004].indexOf(res.data.status) !== -1) {
|
||||||
|
// #ifdef H5
|
||||||
|
window.location.replace(`${HTTP_REQUEST_URL}/api/v2/routine/gzhLogin?back_url=${encodeURIComponent(UrlUtils.keepParams(window.location.href))}`);
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
reject(res.data);
|
||||||
|
} else if (res.data.status == 400 && res.data.msg !== '商户未绑定码牌') {
|
||||||
|
uni.showToast({
|
||||||
|
title: res.data.msg,
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
reject(res.data.msg || '系统错误');
|
||||||
|
} else if (res.data.status == 100103) {
|
||||||
|
uni.showModal({
|
||||||
|
title: '提示',
|
||||||
|
content: res.data.msg,
|
||||||
|
showCancel: false,
|
||||||
|
confirmText: 我知道了
|
||||||
|
});
|
||||||
|
} else
|
||||||
|
reject(res.data.msg || '系统错误');
|
||||||
|
},
|
||||||
|
fail: (msg) => {
|
||||||
|
console.log(msg)
|
||||||
|
let data = {
|
||||||
|
mag: '请求失败1',
|
||||||
|
status: 1 //1没网
|
||||||
|
}
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
reject(data);
|
||||||
|
// #endif
|
||||||
|
// #ifndef APP-PLUS
|
||||||
|
reject('请求失败');
|
||||||
|
// #endif
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const request = {};
|
||||||
|
|
||||||
|
['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
|
||||||
|
request[method] = (api, data, opt) => baseRequest(api, method, data, opt || {})
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export default request;
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
const UrlUtils = {
|
||||||
|
/**
|
||||||
|
* 清理URL(合并多余的?,规范参数分隔符)
|
||||||
|
* @param {string} url - 原始URL
|
||||||
|
* @returns {string} 清理后的URL
|
||||||
|
*/
|
||||||
|
clean: function(url) {
|
||||||
|
let cleanUrl = url.replace(/\?+/g, '?');
|
||||||
|
const firstQuestionMarkIndex = cleanUrl.indexOf('?');
|
||||||
|
|
||||||
|
if (firstQuestionMarkIndex !== -1) {
|
||||||
|
const beforeParams = cleanUrl.substring(0, firstQuestionMarkIndex + 1);
|
||||||
|
const afterParams = cleanUrl.substring(firstQuestionMarkIndex + 1).replace(/\?/g, '&');
|
||||||
|
cleanUrl = beforeParams + afterParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cleanUrl;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保留URL中指定的参数(默认只保留merchant_id)
|
||||||
|
* @param {string} url - 原始URL
|
||||||
|
* @param {string[]} [paramsToKeep=['merchant_id']] - 需要保留的参数名数组
|
||||||
|
* @returns {string} 简化后的URL
|
||||||
|
*/
|
||||||
|
keepParams: function(url, paramsToKeep = ['merchant_id']) {
|
||||||
|
// 先清理URL
|
||||||
|
const cleanedUrl = this.clean(url);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const urlObj = new URL(cleanedUrl);
|
||||||
|
const newSearchParams = new URLSearchParams();
|
||||||
|
|
||||||
|
// 遍历原始参数,只保留需要的
|
||||||
|
urlObj.searchParams.forEach((value, key) => {
|
||||||
|
if (paramsToKeep.includes(key)) {
|
||||||
|
newSearchParams.append(key, value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 重建URL
|
||||||
|
urlObj.search = newSearchParams.toString();
|
||||||
|
return urlObj.toString();
|
||||||
|
} catch (e) {
|
||||||
|
// 如果URL解析失败(如缺少协议),回退到字符串处理
|
||||||
|
const [basePart, queryPart] = cleanedUrl.split('?');
|
||||||
|
if (!queryPart) return basePart;
|
||||||
|
|
||||||
|
const keptParams = queryPart.split('&').filter(param => {
|
||||||
|
const [key] = param.split('=');
|
||||||
|
return paramsToKeep.includes(key);
|
||||||
|
});
|
||||||
|
|
||||||
|
return keptParams.length > 0
|
||||||
|
? `${basePart}?${keptParams.join('&')}`
|
||||||
|
: basePart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UrlUtils
|
||||||
|
|
||||||
|
|
||||||
|
// // 使用示例
|
||||||
|
// const dirtyUrl = "http://10.210.254.149:8081/h5_pay/??merchant_id=1&token=xxx&expires_time=123??is_all_api=1";
|
||||||
|
|
||||||
|
// // 1. 只清理URL
|
||||||
|
// console.log(UrlUtils.clean(dirtyUrl));
|
||||||
|
// // 输出: "http://10.210.254.149:8081/h5_pay/?merchant_id=1&token=xxx&expires_time=123&is_all_api=1"
|
||||||
|
|
||||||
|
// // 2. 清理并只保留merchant_id
|
||||||
|
// console.log(UrlUtils.keepParams(dirtyUrl));
|
||||||
|
// // 输出: "http://10.210.254.149:8081/h5_pay/?merchant_id=1"
|
||||||
|
|
||||||
|
// // 3. 清理并保留多个参数
|
||||||
|
// console.log(UrlUtils.keepParams(dirtyUrl, ['merchant_id', 'expires_time']));
|
||||||
|
// // 输出: "http://10.210.254.149:8081/h5_pay/?merchant_id=1&expires_time=123"
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* @LastEditors: whitechiina 1293616053@qq.com
|
||||||
|
* @LastEditTime: 2025-07-31 13:42:48
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 获取URL参数工具函数
|
||||||
|
* @param {string|array} keys - 要获取的参数名,可以是字符串或数组
|
||||||
|
* @param {any} defaultValue - 当参数不存在时的默认值
|
||||||
|
* @returns {any} 返回参数值或参数对象
|
||||||
|
*/
|
||||||
|
|
||||||
|
const getUrlParam = function(keys, defaultValue = undefined) {
|
||||||
|
// 获取原始查询字符串(包含开头的'?')
|
||||||
|
let queryString = window.location.search;
|
||||||
|
|
||||||
|
// 预处理:将第一个问号后的所有问号替换为'&'
|
||||||
|
if (queryString.includes('?')) {
|
||||||
|
// 移除开头的'?',然后处理多个问号
|
||||||
|
let queryWithoutQuestion = queryString.substring(1);
|
||||||
|
// 将多个问号替换为&
|
||||||
|
queryWithoutQuestion = queryWithoutQuestion.replace(/\?/g, '&');
|
||||||
|
queryString = '?' + queryWithoutQuestion;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析处理后的查询字符串
|
||||||
|
const params = new URLSearchParams(queryString);
|
||||||
|
|
||||||
|
// 1. 未传入keys:返回全部参数组成的对象
|
||||||
|
if (!keys) {
|
||||||
|
const result = {};
|
||||||
|
for (const [key, value] of params.entries()) {
|
||||||
|
result[key] = decodeURIComponent(value);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 传入数组:返回包含这些参数的对象
|
||||||
|
if (Array.isArray(keys)) {
|
||||||
|
return keys.reduce((result, key) => {
|
||||||
|
result[key] = params.has(key)
|
||||||
|
? decodeURIComponent(params.get(key))
|
||||||
|
: defaultValue;
|
||||||
|
return result;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 传入字符串:返回单个参数值
|
||||||
|
if (typeof keys === 'string') {
|
||||||
|
return params.has(keys)
|
||||||
|
? decodeURIComponent(params.get(keys))
|
||||||
|
: defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 无效keys类型返回默认值
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default getUrlParam;
|
||||||
Loading…
Reference in New Issue