Compare commits
12 Commits
38e26fed3e
...
prod
| Author | SHA1 | Date | |
|---|---|---|---|
| 5032b86d69 | |||
| ecb9de0d9b | |||
| 4cde9d6b7b | |||
| ce84ecc537 | |||
| c141bdb7b5 | |||
| ac2e2f5aad | |||
| 4431f29dff | |||
| 614fd15b81 | |||
| ffe9fa58f2 | |||
| 4b1e8066f0 | |||
| 23ccde5250 | |||
| 24d7345056 |
@@ -1,5 +1,5 @@
|
||||
//当前环境 test,prod
|
||||
export const ENV = 'test'
|
||||
export const ENV = 'prod'
|
||||
export const ENV_BASE_URL = {
|
||||
java: {
|
||||
prod: 'https://cashier.sxczgkj.com/',
|
||||
|
||||
@@ -19,15 +19,15 @@ export function getOrderPayUrl(data, urlType = 'order') {
|
||||
* 扫码支付
|
||||
* @returns
|
||||
*/
|
||||
export function scanPay(data, urlType = 'order') {
|
||||
return request({
|
||||
url: `${urlType}/pay/scanPay`,
|
||||
method: "POST",
|
||||
data: {
|
||||
...data
|
||||
}
|
||||
})
|
||||
}
|
||||
// export function scanPay(data, urlType = 'order') {
|
||||
// return request({
|
||||
// url: `${urlType}/pay/scanPay`,
|
||||
// method: "POST",
|
||||
// data: {
|
||||
// ...data
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
|
||||
/**
|
||||
* 现金支付
|
||||
|
||||
12
http/api/system/help.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import http from "@/http/http.js";
|
||||
const request = http.request;
|
||||
const urlType = "system";
|
||||
export function getHelp(data) {
|
||||
return request({
|
||||
url: urlType + '/user/getHelp',
|
||||
method: "GET",
|
||||
data: {
|
||||
...data,
|
||||
},
|
||||
});
|
||||
}
|
||||
852
lib/coupon.ts
@@ -1,852 +0,0 @@
|
||||
import { BigNumber } from "bignumber.js";
|
||||
import _ from "lodash";
|
||||
|
||||
import {
|
||||
ShopInfo,
|
||||
couponCalcParams,
|
||||
BaseCartItem,
|
||||
TimeLimitDiscountConfig,
|
||||
CanDikouGoodsArrArgs,
|
||||
Coupon,
|
||||
ShopUserInfo,
|
||||
GoodsType,
|
||||
BackendCoupon,
|
||||
ExchangeCalculationResult,
|
||||
PointDeductionRule,
|
||||
OrderCostSummary,
|
||||
} from "./types";
|
||||
|
||||
import { getCompatibleFieldValue } from "./utils";
|
||||
|
||||
/**
|
||||
* 返回商品单价
|
||||
* @param goods 商品
|
||||
* @param user 用户信息
|
||||
* @param {Object} shopInfo
|
||||
*/
|
||||
export function returnGoodsPrice(
|
||||
goods: BaseCartItem,
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
if (!goods) {
|
||||
return 0;
|
||||
}
|
||||
//是否可以使用会员价
|
||||
const canUseVipPrice =
|
||||
user &&
|
||||
user.isVip &&
|
||||
user.isMemberPrice &&
|
||||
goods.memberPrice * 1 > 0 &&
|
||||
shopInfo &&
|
||||
shopInfo.isMemberPrice;
|
||||
// 商家改价
|
||||
if (goods.discount_sale_amount && goods.discount_sale_amount * 1 > 0) {
|
||||
return goods.salePrice;
|
||||
}
|
||||
// 限时折扣
|
||||
if (limitTimeDiscount && limitTimeDiscount.id) {
|
||||
//优先使用
|
||||
// 兼容 isTimeDiscount/is_time_discount(这里顺便处理该字段的命名兼容)
|
||||
const isTimeDiscount = getCompatibleFieldValue(
|
||||
goods,
|
||||
"isTimeDiscount",
|
||||
"is_time_discount"
|
||||
);
|
||||
if (isTimeDiscount) {
|
||||
return new BigNumber(goods.salePrice)
|
||||
.times(limitTimeDiscount.discountRate / 100)
|
||||
.decimalPlaces(2, BigNumber.ROUND_UP)
|
||||
.toNumber();
|
||||
}
|
||||
const canUseFoods = limitTimeDiscount.foods.split(",");
|
||||
const canUseLimit =
|
||||
limitTimeDiscount.foodType == 1 ||
|
||||
canUseFoods.includes(`${goods.productId}`);
|
||||
if (canUseLimit && limitTimeDiscount.discountPriority == "limit-time") {
|
||||
return new BigNumber(goods.salePrice)
|
||||
.times(limitTimeDiscount.discountRate / 100)
|
||||
.decimalPlaces(2, BigNumber.ROUND_UP)
|
||||
.toNumber();
|
||||
}
|
||||
|
||||
if (canUseLimit && limitTimeDiscount.discountPriority == "vip-price") {
|
||||
if (canUseVipPrice) {
|
||||
return goods.memberPrice;
|
||||
} else {
|
||||
return new BigNumber(goods.salePrice)
|
||||
.times(limitTimeDiscount.discountRate / 100)
|
||||
.decimalPlaces(2, BigNumber.ROUND_UP)
|
||||
.toNumber();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (canUseVipPrice) {
|
||||
return goods.memberPrice;
|
||||
}
|
||||
return goods.salePrice;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回商品分组
|
||||
* @param arr 商品列表
|
||||
*/
|
||||
export function returnGoodsGroupMap(arr: BaseCartItem[]) {
|
||||
let map: { [key: string]: BaseCartItem[] } = {};
|
||||
arr.forEach((v) => {
|
||||
const key = v.productId + "_" + v.skuId;
|
||||
if (!map[key]) {
|
||||
map[key] = [];
|
||||
}
|
||||
map[key].push(v);
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
interface CouponTypes {
|
||||
1: "满减券";
|
||||
2: "商品券";
|
||||
3: "折扣券";
|
||||
4: "第二件半价券";
|
||||
5: "消费送券";
|
||||
6: "买一送一券";
|
||||
7: "固定价格券";
|
||||
8: "免配送费券";
|
||||
}
|
||||
/**
|
||||
* 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券
|
||||
* @param coupon
|
||||
*/
|
||||
export function returnCoupType(coupon: Coupon) {
|
||||
const couponTypes: CouponTypes = {
|
||||
1: "满减券",
|
||||
2: "商品券",
|
||||
3: "折扣券",
|
||||
4: "第二件半价券",
|
||||
5: "消费送券",
|
||||
6: "买一送一券",
|
||||
7: "固定价格券",
|
||||
8: "免配送费券",
|
||||
};
|
||||
return couponTypes[coupon.type as keyof CouponTypes] || "未知类型";
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回商品券抵扣后的商品列表
|
||||
* @param canDikouGoodsArr 可抵扣商品列表
|
||||
* @param selCoupon 已选择的优惠券列表
|
||||
* @param user 用户信息
|
||||
*/
|
||||
export function returnCanDikouGoodsArr(args: CanDikouGoodsArrArgs) {
|
||||
const { canDikouGoodsArr, selCoupon, user, shopInfo, limitTimeDiscount } =
|
||||
args;
|
||||
const types = [2, 4, 6];
|
||||
// 收集已抵扣商品并关联对应的优惠券类型
|
||||
const goodsCouponGoods = selCoupon
|
||||
.filter((v) => types.includes(v.type))
|
||||
.reduce((prev: BaseCartItem[], cur) => {
|
||||
// 给每个抵扣商品添加所属优惠券类型
|
||||
if (cur && cur.discount) {
|
||||
const goodsWithType = cur.discount.hasDiscountGoodsArr.map((goods) => ({
|
||||
...goods,
|
||||
couponType: cur.type, // 记录该商品是被哪种类型的优惠券抵扣的
|
||||
}));
|
||||
prev.push(...goodsWithType);
|
||||
}
|
||||
return prev;
|
||||
}, []);
|
||||
const arr = _.cloneDeep(canDikouGoodsArr)
|
||||
.map((v) => {
|
||||
const findCart = goodsCouponGoods.find((carts) => carts.id == v.id);
|
||||
if (findCart) {
|
||||
// 根据优惠券类型判断扣减数量
|
||||
if ([4, 6].includes(findCart.couponType ?? 0)) {
|
||||
// 类型4(第二件半价)或6(买一送一),数量减2
|
||||
if (v.num) {
|
||||
v.num -= 2;
|
||||
}
|
||||
} else {
|
||||
// 其他类型(如类型2商品券),按原逻辑扣减对应数量
|
||||
if (v.num) {
|
||||
v.num -= findCart.num ?? 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return v;
|
||||
})
|
||||
.filter((v) => {
|
||||
const canUseNum = (v.num ?? 0) - (v.returnNum || 0);
|
||||
// 兼容 is_temporary/isTemporary 和 is_gift/isGift
|
||||
const isTemporary = getCompatibleFieldValue(
|
||||
v,
|
||||
"isTemporary",
|
||||
"is_temporary"
|
||||
);
|
||||
const isGift = getCompatibleFieldValue(v, "isGift", "is_gift");
|
||||
|
||||
if (canUseNum <= 0 || isTemporary || isGift) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}); // 过滤掉数量<=0的商品,赠菜,临时菜
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回商品是否享用了会员价/会员折扣
|
||||
* @param {*} goods
|
||||
*/
|
||||
function returnGoodsIsUseVipPrice(
|
||||
shopInfo: ShopInfo,
|
||||
user: ShopUserInfo,
|
||||
goods: BaseCartItem
|
||||
) {
|
||||
// 兼容 isTimeDiscount/is_time_discount
|
||||
const isTimeDiscount = getCompatibleFieldValue(
|
||||
goods,
|
||||
"isTimeDiscount",
|
||||
"is_time_discount"
|
||||
);
|
||||
if (isTimeDiscount) {
|
||||
return false;
|
||||
}
|
||||
if (shopInfo.isMemberPrice != 1 || user.isVip != 1) {
|
||||
return false;
|
||||
}
|
||||
if (shopInfo.isMemberPrice == 1 && user.isVip == 1) {
|
||||
if (goods.memberPrice <= 0) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回可以计算抵扣金额的商品列表
|
||||
*/
|
||||
function returnCanCalcGoodsList(
|
||||
canCalcGoodsArr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
shopInfo: ShopInfo,
|
||||
user: ShopUserInfo
|
||||
) {
|
||||
return canCalcGoodsArr.filter((goods) => {
|
||||
// 兼容 isTimeDiscount/is_time_discount
|
||||
const isTimeDiscount = getCompatibleFieldValue(
|
||||
goods,
|
||||
"isTimeDiscount",
|
||||
"is_time_discount"
|
||||
);
|
||||
if (!coupon.discountShare && isTimeDiscount) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
!coupon.vipPriceShare &&
|
||||
returnGoodsIsUseVipPrice(shopInfo, user, goods)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断优惠券是否可使用,并返回不可用原因
|
||||
*
|
||||
* @param {Object} args - 函数参数集合
|
||||
* @param {Array} args.canDikouGoodsArr - 可参与抵扣的商品列表
|
||||
* @param {Object} args.coupon - 优惠券信息对象
|
||||
* @param {boolean} args.coupon.use - 优惠券是否启用
|
||||
* @param {Array} args.coupon.useFoods - 优惠券适用的商品ID列表
|
||||
* @param {number} args.coupon.fullAmount - 优惠券使用门槛金额
|
||||
* @param {number} args.coupon.type - 优惠券类型
|
||||
* @param {number} args.goodsOrderPrice - 订单中所有商品的总金额
|
||||
* @param {Object} args.user - 用户信息对象
|
||||
* @param {Object} args.selCoupon - 已经选择的优惠券信息对象
|
||||
* @param {Object} args.shopInfo
|
||||
* @param {boolean} args.limitTimeDiscount - 限时折扣
|
||||
* @returns {Object} - { canUse: boolean, reason: string } 可用状态及不可用原因
|
||||
*/
|
||||
export function returnCouponCanUse(args: couponCalcParams) {
|
||||
let {
|
||||
canDikouGoodsArr,
|
||||
coupon,
|
||||
goodsOrderPrice,
|
||||
user,
|
||||
selCoupon,
|
||||
shopInfo,
|
||||
isMemberPrice,
|
||||
limitTimeDiscount,
|
||||
} = args;
|
||||
// 优惠券未启用
|
||||
if (!coupon.use) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: coupon.noUseRestrictions || "不在可用时间段内",
|
||||
};
|
||||
}
|
||||
if (
|
||||
limitTimeDiscount &&
|
||||
limitTimeDiscount.id &&
|
||||
limitTimeDiscount.foodType == 1 &&
|
||||
!coupon.discountShare
|
||||
) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: coupon.noUseRestrictions || "不可与限时折扣同享",
|
||||
};
|
||||
}
|
||||
|
||||
// 计算门槛金额
|
||||
let fullAmount = goodsOrderPrice;
|
||||
canDikouGoodsArr = returnCanDikouGoodsArr(args);
|
||||
//优惠券指定门槛商品列表
|
||||
let canCalcGoodsArr = [...canDikouGoodsArr];
|
||||
//部分商品参与门槛计算
|
||||
if (coupon.thresholdFoods.length) {
|
||||
canCalcGoodsArr = canDikouGoodsArr.filter((v) => {
|
||||
return coupon.thresholdFoods.find((food) => food.id == v.productId);
|
||||
});
|
||||
}
|
||||
|
||||
canCalcGoodsArr = returnCanCalcGoodsList(
|
||||
canCalcGoodsArr,
|
||||
coupon,
|
||||
shopInfo,
|
||||
user
|
||||
);
|
||||
|
||||
fullAmount = canCalcGoodsArr.reduce((pre, cur) => {
|
||||
return (
|
||||
pre +
|
||||
returnGoodsPrice(cur, user, shopInfo, limitTimeDiscount) * (cur.num || 0)
|
||||
);
|
||||
}, 0);
|
||||
|
||||
// 是否全部商品可用
|
||||
const isDikouAll = coupon.useFoods.length === 0;
|
||||
// 订单可用商品列表
|
||||
let canUseGoodsArr: BaseCartItem[] = [];
|
||||
if (!isDikouAll) {
|
||||
canUseGoodsArr = canDikouGoodsArr.filter((v) => {
|
||||
return coupon.useFoods.find((food) => food.id == v.productId);
|
||||
});
|
||||
}
|
||||
// if (user.isVip && !coupon.vipPriceShare) {
|
||||
// return {
|
||||
// canUse: false,
|
||||
// reason: "非会员可用",
|
||||
// };
|
||||
// }
|
||||
if (selCoupon.length > 0 && !selCoupon[0].otherCouponShare) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "当前选中的券不可与其他券同享",
|
||||
};
|
||||
}
|
||||
if (selCoupon.length > 0 && !coupon.otherCouponShare) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "当前选中的券不可与其他券同享",
|
||||
};
|
||||
}
|
||||
|
||||
// 满减券和折扣券计算门槛金额是否满足
|
||||
if ([1, 3].includes(coupon.type)) {
|
||||
if (canCalcGoodsArr.length <= 0) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "没有可参与计算门槛的商品",
|
||||
};
|
||||
}
|
||||
// 不满足门槛金额
|
||||
if (fullAmount < (coupon.fullAmount || 0)) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`,
|
||||
};
|
||||
}
|
||||
}
|
||||
// 商品兑换券,第二件半价和买一送一判断是否有可用商品
|
||||
if ([2, 4, 5].includes(coupon.type)) {
|
||||
// 没有符合条件的商品
|
||||
if (isDikouAll && canDikouGoodsArr.length === 0) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "没有符合条件的商品",
|
||||
};
|
||||
}
|
||||
if (!isDikouAll && canUseGoodsArr.length === 0) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "没有符合条件的商品",
|
||||
};
|
||||
}
|
||||
if (coupon.type == 2) {
|
||||
if (canCalcGoodsArr.length <= 0) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "没有符合计算门槛条件的商品",
|
||||
};
|
||||
}
|
||||
if (fullAmount < (coupon.fullAmount || 0)) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
//商品兑换券是否达到门槛金额
|
||||
if (coupon.type == 2 && goodsOrderPrice < (coupon.fullAmount || 0)) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: `满${coupon.fullAmount}元可用,当前可参与金额${fullAmount}元`,
|
||||
};
|
||||
}
|
||||
|
||||
// 买一送一券特殊验证
|
||||
if (coupon.type === 6) {
|
||||
let canUse = false;
|
||||
if (isDikouAll) {
|
||||
canUse = canDikouGoodsArr.some((v) => (v.num || 0) >= 2);
|
||||
} else if (canUseGoodsArr.length > 0) {
|
||||
canUse = canUseGoodsArr.some((v) => (v.num || 0) >= 2);
|
||||
}
|
||||
|
||||
if (!canUse) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "需要购买至少2件相同的商品才能使用",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 第二件半价券特殊验证
|
||||
if (coupon.type === 4) {
|
||||
let canUse = false;
|
||||
if (isDikouAll) {
|
||||
canUse = canDikouGoodsArr.some((v) => (v.num || 0) >= 2);
|
||||
} else if (canUseGoodsArr.length > 0) {
|
||||
canUse = canUseGoodsArr.some((v) => (v.num || 0) >= 2);
|
||||
}
|
||||
if (!canUse) {
|
||||
return {
|
||||
canUse: false,
|
||||
reason: "需要购买至少2件相同的商品才能使用",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 所有条件都满足
|
||||
return {
|
||||
canUse: true,
|
||||
reason: "",
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算抵扣商品金额
|
||||
* @param discountGoodsArr 可抵扣商品列表
|
||||
* @param discountNum 抵扣数量
|
||||
* @param user 用户信息
|
||||
* @param {Object} shopInfo 店铺信息
|
||||
*/
|
||||
export function calcDiscountGoodsArrPrice(
|
||||
discountGoodsArr: BaseCartItem[],
|
||||
discountNum: number,
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
let hasCountNum = 0;
|
||||
let discountPrice = 0;
|
||||
let hasDiscountGoodsArr:BaseCartItem[] = [];
|
||||
|
||||
for (let i = 0; i < discountGoodsArr.length; i++) {
|
||||
if (hasCountNum >= discountNum) {
|
||||
break;
|
||||
}
|
||||
const goods = discountGoodsArr[i];
|
||||
const shengyuNum = discountNum - hasCountNum;
|
||||
const num = Math.min(goods.num || 0, shengyuNum);
|
||||
const realPrice = returnGoodsPrice(
|
||||
goods,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
|
||||
discountPrice += realPrice * num;
|
||||
|
||||
hasCountNum += num;
|
||||
if(goods){
|
||||
hasDiscountGoodsArr.push({
|
||||
...goods,
|
||||
num,
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
discountPrice,
|
||||
hasDiscountGoodsArr,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算优惠券抵扣金额
|
||||
* @param arr 可抵扣商品列表
|
||||
* @param coupon 优惠券
|
||||
* @param user 用户信息
|
||||
* @param goodsOrderPrice 商品订单金额
|
||||
* @param selCoupon 已选择的优惠券列表
|
||||
* @param shopInfo 店铺信息
|
||||
* @param limitTimeDiscount 限时折扣
|
||||
*/
|
||||
export function returnCouponDiscount(
|
||||
arr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
user: ShopUserInfo,
|
||||
goodsOrderPrice: number,
|
||||
selCoupon: Coupon[],
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
arr = returnCanDikouGoods(arr, user, shopInfo, limitTimeDiscount);
|
||||
const canDikouGoodsArr = returnCanDikouGoodsArr({
|
||||
canDikouGoodsArr: arr,
|
||||
selCoupon,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount,
|
||||
});
|
||||
if (coupon.type == 2) {
|
||||
return returnCouponProductDiscount(
|
||||
canDikouGoodsArr,
|
||||
coupon,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
}
|
||||
if (coupon.type == 6) {
|
||||
const result = returnCouponBuyOneGiveOneDiscount(
|
||||
canDikouGoodsArr,
|
||||
coupon,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
return result;
|
||||
}
|
||||
if (coupon.type == 4) {
|
||||
return returnSecoendDiscount(
|
||||
canDikouGoodsArr,
|
||||
coupon,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
}
|
||||
if (coupon.type == 3) {
|
||||
return returnCouponZhekouDiscount(
|
||||
canDikouGoodsArr,
|
||||
coupon,
|
||||
user,
|
||||
goodsOrderPrice,
|
||||
selCoupon,
|
||||
limitTimeDiscount
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 折扣券抵扣金额
|
||||
* @param canDikouGoodsArr 可抵扣商品列表
|
||||
* @param coupon 优惠券
|
||||
* @param user 用户信息
|
||||
* @param goodsOrderPrice 商品订单金额
|
||||
* @param selCoupon 已选择的优惠券列表
|
||||
* @param limitTimeDiscount 限时折扣
|
||||
*/
|
||||
export function returnCouponZhekouDiscount(
|
||||
canDikouGoodsArr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
user: ShopUserInfo,
|
||||
goodsOrderPrice: number,
|
||||
selCoupon: Coupon[],
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
let { discountRate, maxDiscountAmount } = coupon;
|
||||
maxDiscountAmount = maxDiscountAmount || 0;
|
||||
// 计算商品优惠券折扣总和,使用BigNumber避免精度问题
|
||||
const goodsCouponDiscount = selCoupon
|
||||
.filter((v) => v.type == 2)
|
||||
.reduce((prve, cur) => {
|
||||
return new BigNumber(prve).plus(
|
||||
new BigNumber(cur?.discount?.discountPrice || 0)
|
||||
);
|
||||
}, new BigNumber(0));
|
||||
|
||||
// 将商品订单价格转换为BigNumber并减去优惠券折扣
|
||||
const adjustedGoodsOrderPrice = new BigNumber(goodsOrderPrice).minus(
|
||||
goodsCouponDiscount
|
||||
);
|
||||
|
||||
// 计算优惠比例:(100 - 折扣率) / 100
|
||||
const discountAmountRatio = new BigNumber(100)
|
||||
.minus(discountRate || 0)
|
||||
.dividedBy(100);
|
||||
|
||||
// 计算折扣金额:调整后的商品订单金额 × 优惠比例
|
||||
let discountPrice = adjustedGoodsOrderPrice
|
||||
.times(discountAmountRatio)
|
||||
.decimalPlaces(2, BigNumber.ROUND_FLOOR)
|
||||
.toNumber();
|
||||
|
||||
// 应用最大折扣金额限制
|
||||
if (maxDiscountAmount !== 0) {
|
||||
discountPrice =
|
||||
discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice;
|
||||
}
|
||||
|
||||
return {
|
||||
discountPrice, // 折扣抵扣金额(即优惠的金额)
|
||||
hasDiscountGoodsArr: [],
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品券抵扣金额
|
||||
* @param canDikouGoodsArr 可抵扣商品列表
|
||||
* @param coupon 优惠券
|
||||
* @param user 用户信息
|
||||
* @param shopInfo 店铺信息
|
||||
*/
|
||||
export function returnCouponProductDiscount(
|
||||
canDikouGoodsArr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
let { useFoods, discountNum, useRule } = coupon;
|
||||
discountNum = discountNum || 0;
|
||||
//抵扣商品数组
|
||||
let discountGoodsArr:BaseCartItem[] = [];
|
||||
|
||||
//抵扣全部商品
|
||||
if (useFoods.length === 0) {
|
||||
if (useRule == "price_asc") {
|
||||
discountGoodsArr = canDikouGoodsArr.slice(discountNum * -1).reverse();
|
||||
} else {
|
||||
discountGoodsArr = canDikouGoodsArr.slice(0, discountNum);
|
||||
}
|
||||
} else {
|
||||
//抵扣选中商品
|
||||
const discountSelGoodsArr = canDikouGoodsArr.filter((v) =>
|
||||
useFoods.find((food) => food.id == v.productId)
|
||||
);
|
||||
if (useRule == "price_asc") {
|
||||
discountGoodsArr = discountSelGoodsArr.slice(discountNum * -1).reverse();
|
||||
} else {
|
||||
discountGoodsArr = discountSelGoodsArr.slice(0, discountNum);
|
||||
}
|
||||
}
|
||||
|
||||
const result = calcDiscountGoodsArrPrice(
|
||||
discountGoodsArr,
|
||||
discountNum,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回买一送一券抵扣详情
|
||||
* @param canDikouGoodsArr 可抵扣商品列表
|
||||
* @param coupon 优惠券
|
||||
* @param user 用户信息
|
||||
* @param shopInfo 店铺信息
|
||||
*/
|
||||
function returnCouponBuyOneGiveOneDiscount(
|
||||
canDikouGoodsArr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
const { useFoods, useRule } = coupon;
|
||||
//抵扣商品
|
||||
let discountGoods:BaseCartItem | undefined = undefined;
|
||||
//符合买一送一条件的商品(数量>=2 + 非临时/非赠品)
|
||||
const canUseGoods = canDikouGoodsArr.filter((v) => {
|
||||
const isTemporary = getCompatibleFieldValue(
|
||||
v,
|
||||
"isTemporary",
|
||||
"is_temporary"
|
||||
);
|
||||
const isGift = getCompatibleFieldValue(v, "isGift", "is_gift");
|
||||
return (v.num || 0) >= 2 && !isTemporary && !isGift;
|
||||
});
|
||||
//抵扣全部商品
|
||||
if (useFoods.length === 0) {
|
||||
if (useRule == "price_asc") {
|
||||
discountGoods = canUseGoods[canUseGoods.length - 1];
|
||||
} else {
|
||||
discountGoods = canUseGoods[0];
|
||||
}
|
||||
} else {
|
||||
//符合抵扣条件的商品
|
||||
const canUseGoods1 = canUseGoods.filter((v) =>
|
||||
useFoods.find((food) => food.id == v.productId)
|
||||
);
|
||||
if (useRule == "price_asc") {
|
||||
discountGoods = canUseGoods1[canUseGoods1.length - 1];
|
||||
} else {
|
||||
discountGoods = canUseGoods1[0];
|
||||
}
|
||||
}
|
||||
let discountPrice = 0;
|
||||
let hasDiscountGoodsArr: BaseCartItem[] = [];
|
||||
if (discountGoods) {
|
||||
discountPrice = returnGoodsPrice(
|
||||
discountGoods,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
hasDiscountGoodsArr = [discountGoods];
|
||||
}
|
||||
return {
|
||||
discountPrice: discountPrice <= 0 ? 0 : discountPrice,
|
||||
hasDiscountGoodsArr,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回第二件半价券抵扣详情
|
||||
* @param canDikouGoodsArr 可抵扣商品列表
|
||||
* @param coupon 优惠券
|
||||
* @param user 用户信息
|
||||
* @param shopInfo 店铺信息
|
||||
*/
|
||||
function returnSecoendDiscount(
|
||||
canDikouGoodsArr: BaseCartItem[],
|
||||
coupon: Coupon,
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
const { useFoods, useRule } = coupon;
|
||||
//抵扣商品
|
||||
let discountGoods:BaseCartItem | undefined = undefined;
|
||||
//符合条件的商品(数量>=2 + 非临时/非赠品)
|
||||
const canUseGoods = canDikouGoodsArr.filter((v) => {
|
||||
const isTemporary = getCompatibleFieldValue(
|
||||
v,
|
||||
"isTemporary",
|
||||
"is_temporary"
|
||||
);
|
||||
const isGift = getCompatibleFieldValue(v, "isGift", "is_gift");
|
||||
return (v.num || 0) >= 2 && !isTemporary && !isGift;
|
||||
});
|
||||
//抵扣全部商品
|
||||
if (useFoods.length === 0) {
|
||||
if (useRule == "price_asc") {
|
||||
discountGoods = canUseGoods[canUseGoods.length - 1];
|
||||
} else {
|
||||
discountGoods = canUseGoods[0];
|
||||
}
|
||||
} else {
|
||||
//符合抵扣条件的商品
|
||||
const canUseGoods1 = canUseGoods.filter((v) =>
|
||||
useFoods.find((food) => food.id == v.productId)
|
||||
);
|
||||
if (useRule == "price_asc") {
|
||||
discountGoods = canUseGoods1[canUseGoods1.length - 1];
|
||||
} else {
|
||||
discountGoods = canUseGoods1[0];
|
||||
}
|
||||
}
|
||||
let discountPrice = 0;
|
||||
let hasDiscountGoodsArr: BaseCartItem[] = [];
|
||||
if (discountGoods) {
|
||||
discountPrice = returnGoodsPrice(
|
||||
discountGoods,
|
||||
user,
|
||||
shopInfo,
|
||||
limitTimeDiscount
|
||||
);
|
||||
hasDiscountGoodsArr = [discountGoods];
|
||||
}
|
||||
//返回半价价格
|
||||
return {
|
||||
discountPrice:
|
||||
discountPrice <= 0
|
||||
? 0
|
||||
: new BigNumber(discountPrice).dividedBy(2).toNumber(),
|
||||
hasDiscountGoodsArr,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回可以抵扣优惠券的商品列表,过滤掉赠品、临时商品,价格从高到低排序
|
||||
* @param arr 商品列表
|
||||
* @param user 用户信息
|
||||
* @param shopInfo 店铺信息
|
||||
* @param limitTimeDiscount 限时折扣
|
||||
*/
|
||||
export function returnCanDikouGoods(
|
||||
arr: BaseCartItem[],
|
||||
user: ShopUserInfo,
|
||||
shopInfo: ShopInfo,
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined
|
||||
) {
|
||||
const result = arr
|
||||
.filter((v) => {
|
||||
// 兼容 is_temporary/isTemporary 和 is_gift/isGift
|
||||
const isTemporary = getCompatibleFieldValue(
|
||||
v,
|
||||
"isTemporary",
|
||||
"is_temporary"
|
||||
);
|
||||
const isGift = getCompatibleFieldValue(v, "isGift", "is_gift");
|
||||
return !isTemporary && !isGift;
|
||||
})
|
||||
.filter((v) => {
|
||||
return (v.num || 0) > 0;
|
||||
})
|
||||
.sort((a, b) => {
|
||||
return (
|
||||
returnGoodsPrice(b, user, shopInfo, limitTimeDiscount) -
|
||||
returnGoodsPrice(a, user, shopInfo, limitTimeDiscount)
|
||||
);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export const utils = {
|
||||
returnGoodsPrice,
|
||||
returnGoodsGroupMap,
|
||||
returnCoupType,
|
||||
returnCanDikouGoods,
|
||||
returnCanDikouGoodsArr,
|
||||
returnCouponCanUse,
|
||||
calcDiscountGoodsArrPrice,
|
||||
returnCouponDiscount,
|
||||
returnCouponProductDiscount,
|
||||
returnCouponZhekouDiscount,
|
||||
};
|
||||
|
||||
export default utils;
|
||||
1382
lib/goods.ts
11
lib/index.ts
@@ -1,11 +0,0 @@
|
||||
export * from "./types";
|
||||
import OrderPriceCalculator from "./goods";
|
||||
import couponUtils from "./coupon";
|
||||
import limitUtils from "./limit";
|
||||
|
||||
export { OrderPriceCalculator, couponUtils, limitUtils };
|
||||
export default {
|
||||
OrderPriceCalculator,
|
||||
couponUtils,
|
||||
limitUtils,
|
||||
};
|
||||
216
lib/limit.ts
@@ -1,216 +0,0 @@
|
||||
import BigNumber from "bignumber.js";
|
||||
|
||||
import _ from "lodash";
|
||||
|
||||
import {
|
||||
BaseCartItem,
|
||||
ShopUserInfo,
|
||||
ShopInfo,
|
||||
TimeLimitDiscountConfig,
|
||||
CanReturnMemberPriceArgs,
|
||||
returnPriceArgs,
|
||||
} from "./types";
|
||||
|
||||
/**
|
||||
* 判断商品是否可以使用限时折扣
|
||||
* @param goods 商品对象
|
||||
* @param limitTimeDiscountRes 限时折扣配置
|
||||
* @param shopInfo 店铺信息
|
||||
* @param shopUserInfo 店铺用户信息
|
||||
* @param idKey 商品ID键名,默认"id"
|
||||
* @returns
|
||||
*/
|
||||
export function canUseLimitTimeDiscount(
|
||||
goods: BaseCartItem,
|
||||
limitTimeDiscountRes: TimeLimitDiscountConfig | null | undefined,
|
||||
shopInfo: ShopInfo,
|
||||
shopUserInfo: ShopUserInfo,
|
||||
idKey = "id" as keyof BaseCartItem
|
||||
) {
|
||||
shopInfo = shopInfo || {};
|
||||
shopUserInfo = shopUserInfo || {};
|
||||
if(shopInfo.isMemberPrice){
|
||||
shopUserInfo.isMemberPrice=1
|
||||
}
|
||||
if (!limitTimeDiscountRes || !limitTimeDiscountRes.id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const canUseFoods = (limitTimeDiscountRes.foods || "").split(",");
|
||||
|
||||
const goodsCanUse =
|
||||
limitTimeDiscountRes.foodType == 1 ||
|
||||
canUseFoods.includes(`${goods[idKey]}`);
|
||||
if (!goodsCanUse) {
|
||||
return false;
|
||||
}
|
||||
if (limitTimeDiscountRes.discountPriority == "limit-time") {
|
||||
return true;
|
||||
}
|
||||
if (limitTimeDiscountRes.discountPriority == "vip-price") {
|
||||
if (
|
||||
shopUserInfo.isVip == 1 &&
|
||||
shopUserInfo.isMemberPrice == 1 &&
|
||||
goods.memberPrice * 1 > 0
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回商品显示价格
|
||||
* @params {*} args 参数对象
|
||||
* @params {*} args.goods 商品对象
|
||||
* @params {*} args.shopInfo 店铺信息
|
||||
* @params {*} args.limitTimeDiscountRes 限时折扣信息
|
||||
* @params {*} args.shopUserInfo 店铺用户信息
|
||||
* @returns
|
||||
*/
|
||||
export function returnPrice(args: returnPriceArgs) {
|
||||
let {
|
||||
goods,
|
||||
shopInfo,
|
||||
limitTimeDiscountRes,
|
||||
shopUserInfo,
|
||||
idKey = "product_id",
|
||||
} = args;
|
||||
limitTimeDiscountRes = limitTimeDiscountRes || {
|
||||
foods: "",
|
||||
foodType: 2,
|
||||
discountPriority: "",
|
||||
discountRate: 0,
|
||||
id: 0,
|
||||
shopId: 0,
|
||||
useType: "",
|
||||
};
|
||||
const canUseFoods = (limitTimeDiscountRes.foods || "").split(",");
|
||||
const includesGoods =
|
||||
limitTimeDiscountRes.foodType == 1 ||
|
||||
canUseFoods.includes("" + goods[idKey]);
|
||||
shopInfo = shopInfo || {};
|
||||
shopUserInfo = shopUserInfo || {};
|
||||
if (
|
||||
shopUserInfo.isMemberPrice == 1 &&
|
||||
shopUserInfo.isVip == 1 &&
|
||||
shopInfo.isMemberPrice == 1
|
||||
) {
|
||||
const memberPrice = goods.memberPrice || goods.salePrice;
|
||||
|
||||
//是会员而且启用会员价
|
||||
if (limitTimeDiscountRes) {
|
||||
//使用限时折扣
|
||||
//限时折扣优先
|
||||
if (limitTimeDiscountRes.discountPriority == "limit-time") {
|
||||
if (includesGoods) {
|
||||
return returnLimitPrice({
|
||||
price: goods.salePrice,
|
||||
limitTimeDiscountRes,
|
||||
});
|
||||
} else {
|
||||
return memberPrice;
|
||||
}
|
||||
}
|
||||
if (
|
||||
limitTimeDiscountRes.discountPriority == "vip-price" &&
|
||||
includesGoods
|
||||
) {
|
||||
if (goods.memberPrice * 1 > 0) {
|
||||
//会员优先
|
||||
return memberPrice;
|
||||
} else {
|
||||
const price = returnLimitPrice({
|
||||
price: goods.salePrice,
|
||||
limitTimeDiscountRes,
|
||||
goods: goods,
|
||||
});
|
||||
|
||||
return price;
|
||||
}
|
||||
} else {
|
||||
return memberPrice;
|
||||
}
|
||||
} else {
|
||||
//是会员没有限时折扣
|
||||
return memberPrice;
|
||||
}
|
||||
} else {
|
||||
//不是会员或者没有启用会员价
|
||||
if (limitTimeDiscountRes && limitTimeDiscountRes.id && includesGoods) {
|
||||
const price = returnLimitPrice({
|
||||
price: goods.salePrice,
|
||||
limitTimeDiscountRes,
|
||||
goods: goods,
|
||||
});
|
||||
|
||||
return price;
|
||||
} else {
|
||||
return goods.salePrice;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface returnLimitPriceArgs {
|
||||
limitTimeDiscountRes: TimeLimitDiscountConfig | null | undefined;
|
||||
price: number;
|
||||
goods?: BaseCartItem;
|
||||
}
|
||||
/**
|
||||
* 返回限时折扣价格
|
||||
* @params {*} args 参数对象
|
||||
* @params {*} args.limitTimeDiscountRes 限时折扣信息
|
||||
* @params {*} args.price 商品价格
|
||||
* @param {*} args.goods 商品对象
|
||||
* @returns
|
||||
*/
|
||||
export function returnLimitPrice(args: returnLimitPriceArgs) {
|
||||
const { limitTimeDiscountRes, price, goods } = args;
|
||||
const discountRate = new BigNumber(
|
||||
limitTimeDiscountRes ? limitTimeDiscountRes.discountRate : 100
|
||||
).dividedBy(100);
|
||||
|
||||
const result = BigNumber(price)
|
||||
.times(discountRate)
|
||||
.decimalPlaces(2, BigNumber.ROUND_UP)
|
||||
.toNumber();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否返回会员价
|
||||
* @param {*} args 参数对象
|
||||
* @param {*} args.shopInfo 店铺信息
|
||||
* @param {*} args.shopUserInfo 店铺用户信息
|
||||
* @returns
|
||||
*/
|
||||
export function canReturnMemberPrice(args: CanReturnMemberPriceArgs) {
|
||||
const { shopInfo, shopUserInfo } = args;
|
||||
if (shopUserInfo.isMemberPrice == 1 && shopUserInfo.isVip == 1) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回会员价格
|
||||
* @param {*} goods
|
||||
* @returns
|
||||
*/
|
||||
export function returnMemberPrice(goods: BaseCartItem) {
|
||||
return goods.memberPrice || goods.salePrice;
|
||||
}
|
||||
|
||||
export const utils = {
|
||||
returnPrice,
|
||||
canUseLimitTimeDiscount,
|
||||
returnLimitPrice,
|
||||
canReturnMemberPrice,
|
||||
returnMemberPrice,
|
||||
};
|
||||
|
||||
export default utils;
|
||||
430
lib/types.ts
@@ -1,430 +0,0 @@
|
||||
/** 商品类型枚举 */
|
||||
export enum GoodsType {
|
||||
NORMAL = "normal", // 普通商品
|
||||
WEIGHT = "weight", // 称重商品
|
||||
GIFT = "gift", // 赠菜(继承普通商品逻辑,标记用)
|
||||
EMPTY = "", // 空字符串类型(后端未返回时默认归类为普通商品)
|
||||
PACKAGE = "package", // 打包商品(如套餐/预打包商品,按普通商品逻辑处理,可扩展特殊规则)
|
||||
}
|
||||
|
||||
/** 优惠券计算结果类型(新增细分字段) */
|
||||
export interface CouponResult {
|
||||
deductionAmount: number; // 抵扣金额
|
||||
excludedProductIds: string[]; // 不适用商品ID列表(注意:是商品ID,非购物车ID)
|
||||
usedCoupon: Coupon | undefined; // 实际使用的优惠券
|
||||
productCouponDeduction: number; // 新增:商品优惠券抵扣(兑换券等)
|
||||
fullCouponDeduction: number; // 新增:满减优惠券抵扣
|
||||
}
|
||||
|
||||
/** 兑换券计算结果类型(新增细分字段) */
|
||||
export interface ExchangeCalculationResult {
|
||||
deductionAmount: number;
|
||||
excludedProductIds: string[]; // 不适用商品ID列表(商品ID)
|
||||
productCouponDeduction: number; // 新增:兑换券属于商品券,同步记录
|
||||
}
|
||||
|
||||
export interface CouponTypes {
|
||||
1: "满减券";
|
||||
2: "商品券";
|
||||
3: "折扣券";
|
||||
4: "第二件半价券";
|
||||
5: "消费送券";
|
||||
6: "买一送一券";
|
||||
7: "固定价格券";
|
||||
8: "免配送费券";
|
||||
}
|
||||
|
||||
/** 优惠券类型枚举 */
|
||||
export enum CouponType {
|
||||
FULL_REDUCTION = "full_reduction", // 满减券
|
||||
DISCOUNT = "discount", // 折扣券
|
||||
SECOND_HALF = "second_half", // 第二件半价券
|
||||
BUY_ONE_GET_ONE = "buy_one_get_one", // 买一送一券
|
||||
EXCHANGE = "exchange", // 商品兑换券
|
||||
}
|
||||
|
||||
/** 后端返回的优惠券原始字段类型 */
|
||||
export interface BackendCoupon {
|
||||
id?: number; // 自增主键(int64)
|
||||
shopId?: number; // 店铺ID(int64)
|
||||
syncId?: number; // 同步Id(int64)
|
||||
type?: number; // 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券
|
||||
name?: string; // 券名称
|
||||
useShopType?: string; // 可用门店类型:only-仅本店;all-所有门店,custom-指定门店
|
||||
useShops?: string; // 可用门店(逗号分隔字符串,如"1,2,3")
|
||||
useType?: string; // 可使用类型:dine堂食/pickup自取/deliv配送/express快递
|
||||
validType?: string; // 有效期类型:fixed(固定时间),custom(自定义时间)
|
||||
validDays?: number; // 有效期(天)
|
||||
validStartTime?: string; // 有效期开始时间(如"2024-01-01 00:00:00")
|
||||
validEndTime?: string; // 有效期结束时间
|
||||
daysToTakeEffect?: number; // 隔天生效
|
||||
useDays?: string; // 可用周期(如"周一,周二")
|
||||
useTimeType?: string; // 可用时间段类型:all-全时段,custom-指定时段
|
||||
useStartTime?: string; // 可用开始时间(每日)
|
||||
useEndTime?: string; // 可用结束时间(每日)
|
||||
getType?: string; // 发放设置:不可自行领取/no,可领取/yes
|
||||
getMode?: string; // 用户领取方式
|
||||
giveNum?: number; // 总发放数量,-10086为不限量
|
||||
getUserType?: string; // 可领取用户:全部/all,新用户一次/new,仅会员/vip
|
||||
getLimit?: number; // 每人领取限量,-10086为不限量
|
||||
useLimit?: number; // 每人每日使用限量,-10086为不限量
|
||||
discountShare?: number; // 与限时折扣同享:0-否,1-是
|
||||
vipPriceShare?: number; // 与会员价同享:0-否,1-是
|
||||
ruleDetails?: string; // 附加规则说明
|
||||
status?: number; // 状态:0-禁用,1-启用
|
||||
useNum?: number; // 已使用数量
|
||||
leftNum?: number; // 剩余数量
|
||||
foods?: string; // 指定门槛商品(逗号分隔字符串,如"101,102",此处为商品ID)
|
||||
fullAmount?: number; // 使用门槛:满多少金额(元)
|
||||
discountAmount?: number; // 使用门槛:减多少金额(元)
|
||||
discountRate?: number; // 折扣%(如90=9折)
|
||||
maxDiscountAmount?: number; // 可抵扣最大金额(元)
|
||||
useRule?: string; // 使用规则:price_asc-价格低到高,price_desc-高到低
|
||||
discountNum?: number; // 抵扣数量
|
||||
otherCouponShare?: number; // 与其它优惠共享:0-否,1-是
|
||||
createTime?: string; // 创建时间
|
||||
updateTime?: string; // 更新时间
|
||||
}
|
||||
|
||||
/** 营销活动类型枚举 */
|
||||
export enum ActivityType {
|
||||
TIME_LIMIT_DISCOUNT = "time_limit_discount", // 限时折扣
|
||||
}
|
||||
|
||||
/** 基础购物车商品项(核心修正:新增product_id,明确各ID含义) */
|
||||
export interface BaseCartItem {
|
||||
id: string | number; // 购物车ID(唯一标识购物车中的条目,如购物车项主键)
|
||||
product_id: string | number; // 商品ID(唯一标识商品,用于优惠券/活动匹配,必选)
|
||||
productId?: string | number; // 商品ID
|
||||
salePrice: number; // 商品原价(元)
|
||||
number: number; // 商品数量
|
||||
num?: number; // 商品数量
|
||||
isTimeDiscount?: boolean; // 是否限时折扣商品(默认false)
|
||||
is_time_discount?: boolean; // 是否限时折扣商品(默认false)
|
||||
product_type: GoodsType; // 商品类型
|
||||
is_temporary?: boolean; // 是否临时菜(默认false)
|
||||
isTemporary?: boolean; // 是否临时菜(默认false)
|
||||
is_gift?: boolean; // 是否赠菜(默认false)
|
||||
isGift?: boolean; // 是否赠菜(默认false)
|
||||
returnNum?: number; // 退货数量(历史订单用,默认0)
|
||||
memberPrice: number; // 商品会员价(元,优先级:商品会员价 > 会员折扣)
|
||||
discountSaleAmount?: number; // 商家改价后单价(元,优先级最高)
|
||||
discount_sale_amount?: number; // 商家改价后单价(元,优先级最高)
|
||||
packFee?: number; // 单份打包费(元,默认0)
|
||||
packNumber?: number; // 堂食打包数量(默认0)
|
||||
activityInfo?: {
|
||||
// 商品参与的营销活动(如限时折扣)
|
||||
type: ActivityType;
|
||||
discountRate: number; // 折扣率(如0.8=8折)
|
||||
vipPriceShare: boolean; // 是否与会员优惠同享(默认false)
|
||||
};
|
||||
skuData?: {
|
||||
// SKU扩展数据(可选)
|
||||
id: string | number; // SKU ID(唯一标识商品规格,如颜色/尺寸)
|
||||
memberPrice: number; // SKU会员价
|
||||
salePrice?: number; // SKU原价
|
||||
};
|
||||
skuId?: string | number; // SKU ID(唯一标识商品规格,如颜色/尺寸)
|
||||
couponType?: number; // 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券
|
||||
}
|
||||
|
||||
export interface CouponFoods {
|
||||
id: string;
|
||||
name: string;
|
||||
images: string;
|
||||
}
|
||||
|
||||
/** 基础优惠券接口(所有券类型继承,包含统一门槛商品字段) */
|
||||
export interface BaseCoupon {
|
||||
otherCouponShare?: number; // 与其它优惠共享:0-否,1-是
|
||||
id: string | number; // 优惠券ID
|
||||
type: number; // 工具库字符串枚举(由后端couponType转换)
|
||||
name: string; // 对应后端title
|
||||
available: boolean; // 基于BackendCoupon字段计算的可用性
|
||||
useShopType?: string; // only-仅本店;all-所有门店,custom-指定门店
|
||||
useShops: string[]; // 可用门店ID列表
|
||||
discountShare: boolean; // 与限时折扣同享:0-否,1-是(后端字段转换为布尔值)
|
||||
vipPriceShare: boolean; // 与会员价同享:0-否,1-是(后端字段转换为布尔值)
|
||||
useType?: string[]; // 可使用类型:dine堂食/pickup自取/deliv配送/express快递
|
||||
isValid: boolean; // 是否在有效期内
|
||||
discountAmount?: number; // 减免金额 (满减券有)
|
||||
fullAmount?: number; // 使用门槛:满多少金额
|
||||
maxDiscountAmount?: number; // 可抵扣最大金额 元
|
||||
use: boolean;
|
||||
discountNum?: number; // 抵扣数量
|
||||
useRule?: string; // 使用规则:price_asc-价格低到高,price_desc-高到低
|
||||
discountRate?: number; // 折扣%(如90=9折)
|
||||
noUseRestrictions?: boolean; // 是不可用原因
|
||||
thresholdFoods: CouponFoods[]; // 门槛商品ID列表(空数组=全部商品,非空=指定商品ID)
|
||||
useFoods: CouponFoods[]; // 可用商品ID列表(空数组=全部商品,非空=指定商品ID)
|
||||
}
|
||||
export interface couponDiscount {
|
||||
discountPrice: number;
|
||||
hasDiscountGoodsArr: BaseCartItem[];
|
||||
}
|
||||
/** 满减券(适配后端字段) */
|
||||
export interface FullReductionCoupon extends BaseCoupon {
|
||||
fullAmount: number; // 对应后端fullAmount(满减门槛)
|
||||
discountAmount: number; // 对应后端discountAmount(减免金额)
|
||||
maxDiscountAmount?: number; // 对应后端maxDiscountAmount(最大减免)
|
||||
discount?: couponDiscount;
|
||||
}
|
||||
|
||||
/** 折扣券(适配后端字段) */
|
||||
export interface DiscountCoupon extends BaseCoupon {
|
||||
discountRate: number; // 后端discountRate(%)转小数(如90→0.9)
|
||||
maxDiscountAmount: number; // 对应后端maxDiscountAmount(最大减免)
|
||||
discount?: couponDiscount;
|
||||
}
|
||||
|
||||
/** 第二件半价券(适配后端字段) */
|
||||
export interface SecondHalfPriceCoupon extends BaseCoupon {
|
||||
maxUseCountPerOrder?: number; // 对应后端useLimit(-10086=不限)
|
||||
discount?: couponDiscount;
|
||||
}
|
||||
|
||||
/** 买一送一券(适配后端字段) */
|
||||
export interface BuyOneGetOneCoupon extends BaseCoupon {
|
||||
maxUseCountPerOrder?: number; // 对应后端useLimit(-10086=不限)
|
||||
discount?: couponDiscount;
|
||||
}
|
||||
|
||||
/** 商品兑换券(适配后端字段) */
|
||||
export interface ExchangeCoupon extends BaseCoupon {
|
||||
deductCount: number; // 对应后端discountNum(抵扣数量)
|
||||
sortRule: "low_price_first" | "high_price_first"; // 后端useRule转换
|
||||
discount?: couponDiscount;
|
||||
}
|
||||
|
||||
/** 所有优惠券类型联合 */
|
||||
export type Coupon =
|
||||
| FullReductionCoupon
|
||||
| DiscountCoupon
|
||||
| SecondHalfPriceCoupon
|
||||
| BuyOneGetOneCoupon
|
||||
| ExchangeCoupon;
|
||||
|
||||
/** 营销活动配置(如限时折扣,applicableProductIds为商品ID列表) */
|
||||
export interface ActivityConfig {
|
||||
type: ActivityType;
|
||||
applicableProductIds?: string[]; // 适用商品ID列表(与BaseCartItem.product_id匹配)
|
||||
discountRate: number; // 折扣率(如0.8=8折)
|
||||
vipPriceShare: boolean; // 是否与会员优惠同享
|
||||
}
|
||||
|
||||
/** 积分抵扣规则 */
|
||||
export interface PointDeductionRule {
|
||||
pointsPerYuan: number; // X积分=1元(如100=100积分抵1元)
|
||||
maxDeductionAmount?: number; // 最大抵扣金额(元,默认不限)
|
||||
}
|
||||
|
||||
/** 餐位费配置 */
|
||||
export interface SeatFeeConfig {
|
||||
pricePerPerson: number; // 每人餐位费(元)
|
||||
personCount: number; // 用餐人数(默认1)
|
||||
isEnabled: boolean; // 是否启用餐位费(默认false)
|
||||
}
|
||||
/** 商家减免类型枚举 */
|
||||
export enum MerchantReductionType {
|
||||
FIXED_AMOUNT = "fixed_amount", // 固定金额减免(如直接减 10 元)
|
||||
DISCOUNT_RATE = "discount_rate", // 比例折扣减免(如打 9 折,即减免 10%)
|
||||
}
|
||||
|
||||
/** 商家减免配置(新增,替代原单一金额字段) */
|
||||
export interface MerchantReductionConfig {
|
||||
type: MerchantReductionType; // 减免类型(二选一)
|
||||
fixedAmount?: number; // 固定减免金额(元,仅 FIXED_AMOUNT 生效,≥0)
|
||||
discountRate?: number; // 折扣率(%,仅 DISCOUNT_RATE 生效,0-100,如 90 代表 9 折)
|
||||
}
|
||||
/**商家霸王餐配置 */
|
||||
export interface FreeDineConfig {
|
||||
enable: boolean; //是否开启
|
||||
rechargeThreshold: number; //订单满多少元可以使用
|
||||
rechargeTimes: number; //充值多少倍免单
|
||||
withCoupon: boolean; //与优惠券同享
|
||||
withPoints: boolean; //与积分同享
|
||||
useType?: string[]; //使用类型 dine-in店内 takeout 自取 post快递,takeaway外卖
|
||||
useShopType?: string; //all 全部 part部分
|
||||
shopIdList?: number[]; //可用门店id
|
||||
}
|
||||
|
||||
//限时折扣配置
|
||||
export interface TimeLimitDiscountConfig {
|
||||
/**
|
||||
* 折扣优先级 limit-time/vip-price
|
||||
*/
|
||||
discountPriority: string;
|
||||
/**
|
||||
* 折扣% 范围1-99
|
||||
*/
|
||||
discountRate: number;
|
||||
/**
|
||||
* 参与商品
|
||||
*/
|
||||
foods: string;
|
||||
/**
|
||||
* 参与商品 1全部 2部分
|
||||
*/
|
||||
foodType: number;
|
||||
/**
|
||||
* 自增主键
|
||||
*/
|
||||
id: number;
|
||||
/**
|
||||
* 店铺ID
|
||||
*/
|
||||
shopId: number;
|
||||
/**
|
||||
* 可使用类型:堂食 dine-in 外带 take-out 外卖 take-away 配送 post
|
||||
*/
|
||||
useType: string;
|
||||
[property: string]: any;
|
||||
}
|
||||
|
||||
//用户信息
|
||||
export interface ShopUserInfo {
|
||||
isVip: number | null; //是否会员
|
||||
discount: number | null; //用户折扣
|
||||
isMemberPrice: number | null; //会员折扣与会员价是否同时使用
|
||||
id?: number; //用户ID
|
||||
}
|
||||
/** 订单额外费用配置 */
|
||||
export interface OrderExtraConfig {
|
||||
// merchantReduction: number; // 商家减免金额(元,默认0)
|
||||
// 替换原单一金额字段,支持两种减免形式
|
||||
merchantReduction: MerchantReductionConfig;
|
||||
additionalFee: number; // 附加费(元,如余额充值、券包,默认0)
|
||||
pointDeductionRule: PointDeductionRule; // 积分抵扣规则
|
||||
seatFeeConfig: SeatFeeConfig; // 餐位费配置
|
||||
currentStoreId: string; // 当前门店ID(用于验证优惠券适用门店)
|
||||
userPoints: number; // 用户当前积分(用于积分抵扣)
|
||||
isMember: boolean; // 用户是否会员(用于会员优惠)
|
||||
memberDiscountRate?: number; // 会员折扣率(如0.95=95折,无会员价时用)
|
||||
newUserDiscount?: number; // 新用户减免金额(元,默认0)
|
||||
fullReductionActivities: FullReductionActivity[]; // 当前店铺的满减活动列表(后端返回结构)
|
||||
currentDinnerType: "dine-in" | "take-out" | "take-away" | "post"; // 当前就餐类型(匹配useType)
|
||||
isFreeDine?: boolean; //是否霸王餐
|
||||
freeDineConfig?: FreeDineConfig;
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig; //限时折扣
|
||||
shopUserInfo: ShopUserInfo; // 用户信息
|
||||
}
|
||||
|
||||
/** 订单费用汇总(修改:补充商家减免类型和明细) */
|
||||
export interface OrderCostSummary {
|
||||
goodsList: BaseCartItem[];
|
||||
// 商品总件数
|
||||
goodsTotal: number;
|
||||
totalDiscountAmount: number;
|
||||
goodsRealAmount: number; // 商品真实原价总和
|
||||
goodsOriginalAmount: number; // 商品原价总和
|
||||
goodsDiscountAmount: number; // 商品折扣金额
|
||||
couponDeductionAmount: number; // 优惠券总抵扣
|
||||
productCouponDeduction: number; // 商品优惠券抵扣
|
||||
fullCouponDeduction: number; // 满减优惠券抵扣
|
||||
pointDeductionAmount: number; // 积分抵扣金额
|
||||
seatFee: number; // 餐位费
|
||||
packFee: number; // 打包费
|
||||
scoreMaxMoney: number; // 积分最大可抵扣金额
|
||||
// 新增:商家减免明细
|
||||
merchantReduction: {
|
||||
type: MerchantReductionType; // 实际使用的减免类型
|
||||
originalConfig: MerchantReductionConfig; // 原始配置(便于前端展示)
|
||||
actualAmount: number; // 实际减免金额(计算后的值,≥0)
|
||||
};
|
||||
additionalFee: number; // 附加费
|
||||
finalPayAmount: number; // 最终实付金额
|
||||
couponUsed?: Coupon; // 实际使用的优惠券
|
||||
pointUsed: number; // 实际使用的积分
|
||||
newUserDiscount: number; // 新用户减免金额(元,默认0)
|
||||
dinnerType?: "dine-in" | "take-out"; // 就餐类型(堂食/自取/配送/快递)
|
||||
config: OrderExtraConfig; // 订单额外费用配置
|
||||
//满减活动
|
||||
fullReduction: {
|
||||
usedFullReductionActivityFullAmount: number; // 计算出的满减活动的门槛金额
|
||||
usedActivity?: FullReductionActivity; // 实际使用的满减活动
|
||||
usedThreshold?: FullReductionThreshold; // 实际使用的满减阈值(多门槛中选最优)
|
||||
actualAmount: number; // 满减实际减免金额(元)
|
||||
};
|
||||
vipDiscountAmount: number; //会员折扣减免金额
|
||||
// 订单原支付金额
|
||||
orderOriginFinalPayAmount: number; //订单原金额(包含打包费+餐位费)
|
||||
}
|
||||
|
||||
/** 满减活动阈值(单条满减规则:满X减Y)- 对应 MkDiscountThresholdInsertGroupDefaultGroup */
|
||||
export interface FullReductionThreshold {
|
||||
activityId?: number; // 关联满减活动ID
|
||||
fullAmount?: number; // 满多少金额(元,必填)
|
||||
discountAmount?: number; // 减多少金额(元,必填)
|
||||
}
|
||||
|
||||
/** 满减活动主表 - 对应 Request 接口(后端真实字段) */
|
||||
export interface FullReductionActivity {
|
||||
id?: number; // 自增主键(后端字段:id)
|
||||
shopId?: number; // 店铺ID(后端字段:shopId)
|
||||
status?: number; // 活动状态:1=未开始,2=进行中,3=已结束(后端字段:status)
|
||||
sort?: number; // 排序值(越大优先级越高,后端字段:sort)
|
||||
createTime?: string; // 创建时间(后端字段:createTime,格式如"2025-10-14 13:56:07")
|
||||
updateTime?: string; // 最新修改时间(后端字段:updateTime,用于优先级排序)
|
||||
validStartTime?: string; // 有效期开始时间(后端字段:validStartTime,格式如"2025-10-14")
|
||||
validEndTime?: string; // 有效期结束时间(后端字段:validEndTime,格式如"2025-12-14")
|
||||
useType?: string; // 可使用类型(后端字段:useType,如"dine,pickup,deliv,express")
|
||||
useDays?: string; // 可用周期(后端字段:useDays,如"周一,周二,周三,周四,周五,周六,周日")
|
||||
useTimeType?: string; // 可用时间段类型(后端字段:useTimeType,all=全时段,custom=指定时段)
|
||||
useStartTime?: string; // 每日可用开始时间(后端字段:useStartTime,如"09:00:00",仅custom时有效)
|
||||
useEndTime?: string; // 每日可用结束时间(后端字段:useEndTime,如"22:00:00",仅custom时有效)
|
||||
couponShare?: number; // 与优惠券同享:0=否,1=是(后端字段:couponShare)
|
||||
discountShare?: number; // 与限时折扣同享:0=否,1=是(后端字段:discountShare)
|
||||
vipPriceShare?: number; // 与会员价同享:0=否,1=是(后端字段:vipPriceShare)
|
||||
pointsShare?: number; // 与积分抵扣同享:0=否,1=是(后端字段:pointsShare)
|
||||
thresholds?: FullReductionThreshold[]; // 满减阈值列表(多门槛,后端字段:thresholds)
|
||||
isDel?: boolean; // 是否删除:0=否,1=是(后端字段:isDel,默认false)
|
||||
}
|
||||
|
||||
// 辅助枚举:星期映射(用于useDays校验)
|
||||
export const WEEKDAY_MAP = {
|
||||
周一: 1,
|
||||
周二: 2,
|
||||
周三: 3,
|
||||
周四: 4,
|
||||
周五: 5,
|
||||
周六: 6,
|
||||
周日: 0, // JS中getDay()返回0=周日
|
||||
};
|
||||
|
||||
export interface ShopInfo {
|
||||
isMemberPrice: number; // 是否开启会员价 1是开启
|
||||
[property: string]: any;
|
||||
}
|
||||
|
||||
export interface couponCalcParams {
|
||||
canDikouGoodsArr: BaseCartItem[];
|
||||
coupon: Coupon;
|
||||
user: ShopUserInfo;
|
||||
shopInfo: ShopInfo;
|
||||
selCoupon: Coupon[];
|
||||
goodsOrderPrice: number; //商品订单总价
|
||||
isMemberPrice: number; // 是否开启会员价 1是开启
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
|
||||
}
|
||||
export interface CanDikouGoodsArrArgs {
|
||||
canDikouGoodsArr: BaseCartItem[];
|
||||
selCoupon: Coupon[];
|
||||
user: ShopUserInfo;
|
||||
shopInfo: ShopInfo;
|
||||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
|
||||
}
|
||||
export interface returnPriceArgs {
|
||||
goods: BaseCartItem;
|
||||
selCoupon: Coupon[];
|
||||
user: ShopUserInfo;
|
||||
shopInfo: ShopInfo;
|
||||
shopUserInfo: ShopUserInfo;
|
||||
limitTimeDiscountRes?: TimeLimitDiscountConfig | null | undefined;
|
||||
idKey?: keyof BaseCartItem;
|
||||
}
|
||||
|
||||
|
||||
export interface CanReturnMemberPriceArgs {
|
||||
shopInfo?: ShopInfo;
|
||||
shopUserInfo: ShopUserInfo;
|
||||
}
|
||||
33
lib/utils.ts
@@ -1,33 +0,0 @@
|
||||
/**
|
||||
* 通用字段兼容工具函数:处理驼峰/下划线命名的字段取值
|
||||
* @param obj 目标对象(如商品信息 BaseCartItem)
|
||||
* @param camelCaseKey 驼峰命名字段(如 'isTemporary')
|
||||
* @param snakeCaseKey 下划线命名字段(如 'is_temporary')
|
||||
* @param defaultValue 默认值(默认 false,适配布尔类型字段)
|
||||
* @returns 字段值(优先取存在的字段,无则返回默认值)
|
||||
*/
|
||||
export function getCompatibleFieldValue(
|
||||
obj: Record<string, any>,
|
||||
camelCaseKey: string,
|
||||
snakeCaseKey: string,
|
||||
defaultValue: boolean = false
|
||||
): boolean {
|
||||
// 优先判断驼峰字段(如果存在且不是 undefined/null)
|
||||
if (
|
||||
obj.hasOwnProperty(camelCaseKey) &&
|
||||
obj[camelCaseKey] !== undefined &&
|
||||
obj[camelCaseKey] !== null
|
||||
) {
|
||||
return Boolean(obj[camelCaseKey]);
|
||||
}
|
||||
// 再判断下划线字段
|
||||
if (
|
||||
obj.hasOwnProperty(snakeCaseKey) &&
|
||||
obj[snakeCaseKey] !== undefined &&
|
||||
obj[snakeCaseKey] !== null
|
||||
) {
|
||||
return Boolean(obj[snakeCaseKey]);
|
||||
}
|
||||
// 都不存在时返回默认值(布尔类型字段默认 false)
|
||||
return defaultValue;
|
||||
}
|
||||
129
package-lock.json
generated
@@ -14,10 +14,11 @@
|
||||
"jsbn": "^1.1.0",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"lodash": "^4.17.21",
|
||||
"marked": "4.x",
|
||||
"pinia-plugin-unistorage": "^0.1.2",
|
||||
"to-arraybuffer": "^1.0.1",
|
||||
"uview-plus": "^3.3.32",
|
||||
"ysk-utils": "^1.0.78"
|
||||
"ysk-utils": "^1.0.85"
|
||||
},
|
||||
"devDependencies": {
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
@@ -30,7 +31,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
|
||||
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/set-array": "^1.2.1",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.10",
|
||||
@@ -45,7 +45,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
@@ -55,7 +54,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
|
||||
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
@@ -65,7 +63,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz",
|
||||
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.25"
|
||||
@@ -75,15 +72,13 @@
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.25",
|
||||
"resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
|
||||
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.1.0",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
@@ -141,7 +136,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz",
|
||||
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/estree": "*",
|
||||
"@types/json-schema": "*"
|
||||
@@ -152,7 +146,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
|
||||
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/eslint": "*",
|
||||
"@types/estree": "*"
|
||||
@@ -162,8 +155,7 @@
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz",
|
||||
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/json-schema": {
|
||||
"version": "7.0.15",
|
||||
@@ -176,7 +168,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@types/node/-/node-22.14.1.tgz",
|
||||
"integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
}
|
||||
@@ -186,7 +177,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
|
||||
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/helper-numbers": "1.13.2",
|
||||
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
|
||||
@@ -196,29 +186,25 @@
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
|
||||
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-api-error": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
|
||||
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-buffer": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
|
||||
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-numbers": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
|
||||
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
|
||||
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||
@@ -229,15 +215,13 @@
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
|
||||
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-wasm-section": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
|
||||
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -250,7 +234,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
|
||||
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@xtuc/ieee754": "^1.2.0"
|
||||
}
|
||||
@@ -260,7 +243,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
|
||||
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@xtuc/long": "4.2.2"
|
||||
}
|
||||
@@ -269,15 +251,13 @@
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
|
||||
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@webassemblyjs/wasm-edit": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
|
||||
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -294,7 +274,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
|
||||
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||
@@ -308,7 +287,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
|
||||
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -321,7 +299,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
|
||||
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||
@@ -336,7 +313,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
|
||||
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@xtuc/long": "4.2.2"
|
||||
@@ -346,22 +322,19 @@
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
|
||||
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@xtuc/long": {
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
|
||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.14.1",
|
||||
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
|
||||
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -374,6 +347,7 @@
|
||||
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
|
||||
"integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"json-schema-traverse": "^1.0.0",
|
||||
@@ -547,8 +521,7 @@
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001715",
|
||||
@@ -568,8 +541,7 @@
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"peer": true
|
||||
]
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "3.6.0",
|
||||
@@ -612,7 +584,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
|
||||
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
}
|
||||
@@ -631,8 +602,7 @@
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/copy-webpack-plugin": {
|
||||
"version": "12.0.2",
|
||||
@@ -672,8 +642,7 @@
|
||||
"version": "1.5.141",
|
||||
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.141.tgz",
|
||||
"integrity": "sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/emojis-list": {
|
||||
"version": "3.0.0",
|
||||
@@ -689,7 +658,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
|
||||
"integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
@@ -702,15 +670,13 @@
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
|
||||
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
|
||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
@@ -720,7 +686,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
|
||||
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"esrecurse": "^4.3.0",
|
||||
"estraverse": "^4.1.1"
|
||||
@@ -734,7 +699,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
|
||||
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"estraverse": "^5.2.0"
|
||||
},
|
||||
@@ -747,7 +711,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
|
||||
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
}
|
||||
@@ -757,7 +720,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
|
||||
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
}
|
||||
@@ -767,7 +729,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
|
||||
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.8.x"
|
||||
}
|
||||
@@ -863,8 +824,7 @@
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
|
||||
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/globby": {
|
||||
"version": "14.0.2",
|
||||
@@ -908,15 +868,13 @@
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
@@ -1001,7 +959,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
|
||||
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*",
|
||||
"merge-stream": "^2.0.0",
|
||||
@@ -1030,8 +987,7 @@
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json-schema-traverse": {
|
||||
"version": "1.0.0",
|
||||
@@ -1065,7 +1021,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
|
||||
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.11.5"
|
||||
}
|
||||
@@ -1095,12 +1050,23 @@
|
||||
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"node_modules/marked": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmmirror.com/marked/-/marked-4.3.0.tgz",
|
||||
"integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"marked": "bin/marked.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12"
|
||||
}
|
||||
},
|
||||
"node_modules/merge-stream": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/merge2": {
|
||||
"version": "1.4.1",
|
||||
@@ -1129,7 +1095,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
@@ -1139,7 +1104,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
@@ -1157,8 +1121,7 @@
|
||||
"version": "2.0.19",
|
||||
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
|
||||
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/normalize-path": {
|
||||
"version": "3.0.0",
|
||||
@@ -1185,8 +1148,7 @@
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "2.3.1",
|
||||
@@ -1322,6 +1284,7 @@
|
||||
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.78.0.tgz",
|
||||
"integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"chokidar": ">=3.0.0 <4.0.0",
|
||||
"immutable": "^4.0.0",
|
||||
@@ -1376,6 +1339,7 @@
|
||||
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
|
||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.1",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
@@ -1482,7 +1446,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -1501,7 +1464,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
@@ -1512,7 +1474,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
|
||||
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
@@ -1528,7 +1489,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
@@ -1538,7 +1498,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz",
|
||||
"integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/source-map": "^0.3.3",
|
||||
"acorn": "^8.8.2",
|
||||
@@ -1557,7 +1516,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
|
||||
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/trace-mapping": "^0.3.25",
|
||||
"jest-worker": "^27.4.5",
|
||||
@@ -1613,8 +1571,7 @@
|
||||
"version": "6.21.0",
|
||||
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
|
||||
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/unicorn-magic": {
|
||||
"version": "0.1.0",
|
||||
@@ -1647,7 +1604,6 @@
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"escalade": "^3.2.0",
|
||||
"picocolors": "^1.1.1"
|
||||
@@ -1685,7 +1641,6 @@
|
||||
"resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz",
|
||||
"integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"glob-to-regexp": "^0.4.1",
|
||||
"graceful-fs": "^4.1.2"
|
||||
@@ -1746,15 +1701,15 @@
|
||||
"resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
|
||||
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ysk-utils": {
|
||||
"version": "1.0.78",
|
||||
"resolved": "https://registry.npmmirror.com/ysk-utils/-/ysk-utils-1.0.78.tgz",
|
||||
"integrity": "sha512-Bgr5B3WWiy0nbgL91QVKoVPYm4wt13Rlav757zEjMVRHbmTjwFEhi3wJlYus0JGd52mbknSxXHMazAPHXwA7uQ==",
|
||||
"version": "1.0.85",
|
||||
"resolved": "https://registry.npmmirror.com/ysk-utils/-/ysk-utils-1.0.85.tgz",
|
||||
"integrity": "sha512-HkbV4Jidi3G6DAuGAN972tClUYtC2zVoxo4crrxexfn0rZa8HjXatUfEbawHOeEzyl6G1CdC+160I2bKfxEBlA==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"bignumber.js": "^9.3.1",
|
||||
"loadsh": "^0.0.4",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"pinia-plugin-unistorage": "^0.1.2",
|
||||
"to-arraybuffer": "^1.0.1",
|
||||
"uview-plus": "^3.3.32",
|
||||
"ysk-utils": "^1.0.82"
|
||||
"ysk-utils": "^1.0.85"
|
||||
},
|
||||
"devDependencies": {
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
placeholder-class="color-999 u-font-28"
|
||||
type="digit"
|
||||
@input="checkNumberCommission($event,index)"
|
||||
v-model="item.levelOneCommission"
|
||||
v-model="item.commission"
|
||||
/>
|
||||
<view class="unit">%</view>
|
||||
</view>
|
||||
@@ -144,7 +144,7 @@ function toggle(index) {
|
||||
const allCommission=()=>{
|
||||
let sum=0
|
||||
for(let item of form.levelConfigList){
|
||||
sum+=parseFloat(item.levelOneCommission)
|
||||
sum+=parseFloat(item.commission)
|
||||
}
|
||||
return sum
|
||||
}
|
||||
@@ -162,7 +162,7 @@ function checkNumberCommission(e,index){
|
||||
icon:'none'
|
||||
})
|
||||
timer= setTimeout(()=>{
|
||||
form.levelConfigList[index].levelOneCommission=''
|
||||
form.levelConfigList[index].commission=''
|
||||
},30)
|
||||
|
||||
return false
|
||||
@@ -172,7 +172,7 @@ function checkNumberCommission(e,index){
|
||||
const arr=value.split('.')
|
||||
if(arr[1].length>2){
|
||||
timer= setTimeout(()=>{
|
||||
form.levelConfigList[index].levelOneCommission=arr[0]+'.'+arr[1].substring(0,2)
|
||||
form.levelConfigList[index].commission=arr[0]+'.'+arr[1].substring(0,2)
|
||||
},30)
|
||||
}
|
||||
}
|
||||
@@ -200,7 +200,7 @@ function remove(index){
|
||||
function addLevelConfig(){
|
||||
form.levelConfigList.push({
|
||||
name:'',
|
||||
levelOneCommission:'',
|
||||
commission:'',
|
||||
inviteCount:'',
|
||||
costAmount:''
|
||||
})
|
||||
@@ -217,7 +217,7 @@ function addLevelConfig(){
|
||||
})
|
||||
return false
|
||||
}
|
||||
if(!item.levelOneCommission){
|
||||
if(!item.commission){
|
||||
uni.showToast({
|
||||
title:'请输入分成比例',
|
||||
icon:'none'
|
||||
@@ -279,7 +279,7 @@ onLoad(()=>{
|
||||
const levelConfigList=[...distributionStore.config.levelConfigList||[]]
|
||||
form.levelConfigList=levelConfigList.length?levelConfigList:[
|
||||
{ name:'',
|
||||
levelOneCommission:'',
|
||||
commission:'',
|
||||
inviteCount:0,
|
||||
costAmount:0}
|
||||
]
|
||||
|
||||
@@ -102,6 +102,12 @@
|
||||
"style": {
|
||||
"navigationBarTitleText": "运营余额"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/help/help",
|
||||
"style": {
|
||||
"navigationBarTitleText": "帮助中心"
|
||||
}
|
||||
}
|
||||
],
|
||||
"subPackages": [{
|
||||
|
||||
190
pages/help/help.vue
Normal file
@@ -0,0 +1,190 @@
|
||||
<template>
|
||||
<view class="bg-f7 min-page color-333 u-font-28">
|
||||
<view class="default-box-padding bg-fff default-box-radius">
|
||||
<view class="u-font-32 font-bold color-333">官方公众号</view>
|
||||
<view class="color-666 u-font-24">关注后即可查看所有操作教程视频</view>
|
||||
<view class="u-m-t-26 u-flex u-row-center">
|
||||
<image :src="state.help_ac_qrcode" mode="" class="img" show-menu-by-longpress></image>
|
||||
</view>
|
||||
|
||||
<view class="u-m-t-16 color-666 u-font-24 u-text-center">长按识别二维码关注公众号</view>
|
||||
|
||||
<view class="u-m-t-30 desc">
|
||||
<view class="line" v-for="(item,index) in desc" :key="index">
|
||||
<view class="num"><text>{{index+1}}</text></view>
|
||||
<view>{{item}}</view>
|
||||
</view>
|
||||
<!-- <view class="line">
|
||||
<view class="num"><text>1</text></view>
|
||||
<view>关注官方公众号-“超掌柜”</view>
|
||||
</view>
|
||||
<view class="line">
|
||||
<view class="num"><text>2</text></view>
|
||||
<view>方法1:点击底部菜单栏「功能演示」,选择对应功能即可</view>
|
||||
</view>
|
||||
<view class="line">
|
||||
<view class="num"><text>3</text></view>
|
||||
<view>方法2:直接在公众号中,发送想查询教程的功能名字即可</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</view>
|
||||
<view class="default-box-padding bg-fff default-box-radius u-m-t-48 color-666">
|
||||
<view class="u-font-32 font-bold color-333">联系方式</view>
|
||||
<view class="u-flex u-row-between u-m-t-30">
|
||||
<view class="u-flex">
|
||||
<view class="blue-block"><up-icon name="phone" size="14" color="#fff"></up-icon></view>
|
||||
<text>客服电话</text>
|
||||
</view>
|
||||
|
||||
<view class="u-flex" style="gap: 8rpx;">
|
||||
<view class="color-main">{{state.service_phone}}</view>
|
||||
<image :src="copy" class="copy" @click="copyText(state.service_phone)"></image>
|
||||
<up-icon name="phone-fill" color="#318AFE" size="14"
|
||||
@click="callphone(state.service_phone)"></up-icon>
|
||||
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
<view class="u-flex u-m-t-20">
|
||||
<view class="blue-block"><up-icon name="email" size="14" color="#fff"></up-icon></view>
|
||||
<view class="u-flex-1">
|
||||
<view class="u-flex u-row-between w-full">
|
||||
<text>QQ告前咨询</text>
|
||||
<view class="u-flex" style="gap: 8rpx;">
|
||||
<text class="color-main">{{state.qq_consult}}</text>
|
||||
<image :src="copy" class="copy" @click="copyText(state.qq_consult)"></image>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
<view class="u-m-t-12 u-flex u-row-between w-full">
|
||||
<text>QQ投诉通道</text>
|
||||
<view class="u-flex" style="gap: 8rpx;">
|
||||
<text class="color-main">{{state.qq_complaint}}</text>
|
||||
<image :src="copy" class="copy" @click="copyText(state.qq_complaint)"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<view class="u-flex u-row-between u-m-t-20">
|
||||
<view class="u-flex">
|
||||
<view class="blue-block"><up-icon name="phone" size="14" color="#fff"></up-icon></view>
|
||||
<text>上班时间</text>
|
||||
</view>
|
||||
|
||||
<view class="u-flex" style="gap: 8rpx;">
|
||||
<view class="color-main">{{state.work_time}}</view>
|
||||
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
onLoad
|
||||
} from '@dcloudio/uni-app'
|
||||
import {
|
||||
getHelp
|
||||
} from '@/http/api/system/help.js'
|
||||
import {
|
||||
reactive,
|
||||
ref
|
||||
} from 'vue'
|
||||
const img = 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/8b257f73f985494a8e5f95caef6b3925.jpg'
|
||||
const copy = 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/178604ce6c3548c0950319fc89f86d93.png'
|
||||
|
||||
function copyText(text) {
|
||||
uni.setClipboardData({
|
||||
data: text
|
||||
})
|
||||
}
|
||||
|
||||
function callphone(phone) {
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: phone
|
||||
})
|
||||
}
|
||||
const state = reactive({
|
||||
help_ac_qrcode: '',
|
||||
work_time: '',
|
||||
qq_complaint: '',
|
||||
qq_consult: '',
|
||||
service_phone: '',
|
||||
official_account: '',
|
||||
|
||||
})
|
||||
|
||||
const desc = ref([])
|
||||
|
||||
function init() {
|
||||
getHelp().then(res => {
|
||||
Object.assign(state, res)
|
||||
desc.value=res.official_account.split('\r\n')
|
||||
})
|
||||
}
|
||||
onLoad(init)
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.min-page {
|
||||
padding: 56rpx 30rpx;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 290rpx;
|
||||
height: 290rpx;
|
||||
}
|
||||
|
||||
.desc {
|
||||
.line {
|
||||
display: flex;
|
||||
background-color: #fff;
|
||||
margin-top: 30rpx;
|
||||
height: auto;
|
||||
|
||||
.num {
|
||||
margin-right: 22rpx;
|
||||
display: flex;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
padding: 10rpx;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 20rpx;
|
||||
color: #fff;
|
||||
border-radius: 30rpx;
|
||||
background: #318AFE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.copy {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
}
|
||||
|
||||
.blue-block {
|
||||
margin-right: 22rpx;
|
||||
display: flex;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
padding: 10rpx;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 20rpx;
|
||||
color: #fff;
|
||||
border-radius: 30rpx;
|
||||
background: #318AFE;
|
||||
}
|
||||
</style>
|
||||
@@ -120,7 +120,7 @@ const pageData = reactive({
|
||||
bgcolor: "#31ACFE",
|
||||
},
|
||||
{
|
||||
payType: "主扫收款",
|
||||
payType: "扫码收款金额",
|
||||
key: "backScanPayAmount",
|
||||
payAmount: 0,
|
||||
bgcolor: "#FF5C6D",
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
</template>
|
||||
</up-navbar> -->
|
||||
|
||||
<view class="income ">
|
||||
<view class="u-flex">
|
||||
<view class="income u-flex">
|
||||
<view class="u-flex u-flex-1">
|
||||
<up-avatar :src="shopInfo.logo" size="88rpx"></up-avatar>
|
||||
<view class="u-flex-1 u-p-l-30 u-text-left">
|
||||
<view class="u-flex">
|
||||
@@ -38,6 +38,13 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="u-font-28 color-fff change-shop u-flex u-row-center" @click="toHelp">
|
||||
<text class="u-m-r-6 u-font-24 ">帮助中心</text>
|
||||
<view class="u-flex u-m-t-4">
|
||||
<up-icon name="question-circle" size="12" color="#fff"></up-icon>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- <view class="income">
|
||||
@@ -151,6 +158,12 @@
|
||||
return go.to(nav.pageUrl)
|
||||
}
|
||||
}
|
||||
|
||||
function toHelp(){
|
||||
uni.navigateTo({
|
||||
url:'/pages/help/help'
|
||||
})
|
||||
}
|
||||
// 导航列表
|
||||
const navList = [
|
||||
// {
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
</view>
|
||||
</scroll-view>
|
||||
<scroll-view :scroll-top="data.scrollRightTop" scroll-y scroll-with-animation class="right-box"
|
||||
@scroll="rightScroll">
|
||||
@scroll="rightScroll"
|
||||
@scrolltoupper="scrolltoupper"
|
||||
>
|
||||
<view class="page-view u-p-l-24">
|
||||
<view class="list-tight-top">
|
||||
<template v-if="lingshi.show">
|
||||
@@ -323,7 +325,7 @@
|
||||
getElRect("list-tight-top").then((res) => {
|
||||
data.topZhanwei = res.height;
|
||||
});
|
||||
getMenuItemTop();
|
||||
// getMenuItemTop();
|
||||
});
|
||||
|
||||
onHide(() => {
|
||||
@@ -447,7 +449,7 @@
|
||||
websocketUtil.offMessage();
|
||||
websocketUtil.onMessage(async (res) => {
|
||||
let msg = JSON.parse(res);
|
||||
console.log('收到消息',msg)
|
||||
// console.log('收到消息',msg)
|
||||
let cartItem;
|
||||
let cartArr = [];
|
||||
// console.log("onMessage===",msg)
|
||||
@@ -1423,17 +1425,25 @@
|
||||
* @param {Object} index
|
||||
*/
|
||||
async function swichMenu(index) {
|
||||
if (data.arr.length == 0) {
|
||||
if (data.arr.length !=data.tabbar.length) {
|
||||
await getMenuItemTop();
|
||||
}
|
||||
if (index == data.current) return;
|
||||
isTabClickOver = false;
|
||||
data.scrollRightTop = data.oldScrollTop;
|
||||
nextTick(function() {
|
||||
data.scrollRightTop = data.arr[index] + data.topZhanwei;
|
||||
data.current = index;
|
||||
leftMenuStatus(index);
|
||||
});
|
||||
// data.scrollRightTop = data.oldScrollTop;
|
||||
// console.log('oldScrollTop',data.scrollRightTop );
|
||||
// nextTick(()=> {
|
||||
// data.scrollRightTop = data.arr[index] + data.topZhanwei;
|
||||
// console.log('scrollRightTop',data.scrollRightTop );
|
||||
// data.current = index;
|
||||
// leftMenuStatus(index);
|
||||
// });
|
||||
|
||||
|
||||
data.scrollRightTop = data.arr[index] + data.topZhanwei;
|
||||
console.log('scrollRightTop',data.scrollRightTop );
|
||||
data.current = index;
|
||||
leftMenuStatus(index);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1508,18 +1518,30 @@
|
||||
arr.push(rect.top - rects[0].top);
|
||||
});
|
||||
data.arr = arr;
|
||||
console.log('每一项高度',data.arr);
|
||||
resolve();
|
||||
})
|
||||
.exec();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function scrolltoupper(){
|
||||
data.current = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 右边菜单滚动
|
||||
* @param {Object} e
|
||||
*/
|
||||
async function rightScroll(e) {
|
||||
|
||||
data.oldScrollTop = e.detail.scrollTop;
|
||||
if(e.detail.scrollTop<=0||e.detail.scrollTop<data.arr[1]){
|
||||
data.current = 0;
|
||||
isTabClickOver = true;
|
||||
return
|
||||
}
|
||||
if (data.arr.length == 0) {
|
||||
await getMenuItemTop();
|
||||
}
|
||||
|
||||
@@ -126,7 +126,21 @@
|
||||
let $goodsMap = {}
|
||||
let goosZhonglei = ref(0)
|
||||
let goodsNumber = ref(0)
|
||||
let originAmount = ref(0)
|
||||
let originAmount = computed(()=>{
|
||||
let total=0;
|
||||
for (let i in props.data.goods) {
|
||||
const goods = props.data.goods[i]
|
||||
if ($goodsMap.hasOwnProperty(goods.productId)) {
|
||||
$goodsMap[goods.productId] += goods.num * 1
|
||||
goodsNumber.value += goods.num * 1
|
||||
} else {
|
||||
$goodsMap[goods.productId] = goods.num * 1
|
||||
goosZhonglei.value += 1
|
||||
}
|
||||
total += goods.payAmount
|
||||
}
|
||||
return total
|
||||
})
|
||||
const priceSize = 9
|
||||
let minWidth=ref(36)
|
||||
|
||||
@@ -138,17 +152,7 @@
|
||||
}
|
||||
|
||||
function goodsMapInit() {
|
||||
for (let i in props.data.goods) {
|
||||
const goods = props.data.goods[i]
|
||||
if ($goodsMap.hasOwnProperty(goods.productId)) {
|
||||
$goodsMap[goods.productId] += goods.num * 1
|
||||
goodsNumber.value += goods.num * 1
|
||||
} else {
|
||||
$goodsMap[goods.productId] = goods.num * 1
|
||||
goosZhonglei.value += 1
|
||||
}
|
||||
originAmount.value += goods.unitPrice
|
||||
}
|
||||
|
||||
}
|
||||
goodsMapInit()
|
||||
watch(() => props.data.goods.length, (newval) => {
|
||||
|
||||
16
pnpm-lock.yaml
generated
@@ -48,8 +48,8 @@ importers:
|
||||
specifier: ^3.3.32
|
||||
version: 3.6.15
|
||||
ysk-utils:
|
||||
specifier: ^1.0.82
|
||||
version: 1.0.82
|
||||
specifier: ^1.0.85
|
||||
version: 1.0.85
|
||||
devDependencies:
|
||||
copy-webpack-plugin:
|
||||
specifier: ^12.0.2
|
||||
@@ -120,36 +120,42 @@ packages:
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-arm-musl@2.5.1':
|
||||
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-linux-arm64-glibc@2.5.1':
|
||||
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-arm64-musl@2.5.1':
|
||||
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-linux-x64-glibc@2.5.1':
|
||||
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@parcel/watcher-linux-x64-musl@2.5.1':
|
||||
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@parcel/watcher-win32-arm64@2.5.1':
|
||||
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
|
||||
@@ -708,8 +714,8 @@ packages:
|
||||
webpack-cli:
|
||||
optional: true
|
||||
|
||||
ysk-utils@1.0.82:
|
||||
resolution: {integrity: sha512-rIds6x9PnvNmNcAVN/uR6KbhzhElS0f79qvpsO/wPSgnTORTGyKnb6aMLPBgcfDI7SaZXUoyKdljjznXH+O+cw==}
|
||||
ysk-utils@1.0.85:
|
||||
resolution: {integrity: sha512-HkbV4Jidi3G6DAuGAN972tClUYtC2zVoxo4crrxexfn0rZa8HjXatUfEbawHOeEzyl6G1CdC+160I2bKfxEBlA==}
|
||||
|
||||
snapshots:
|
||||
|
||||
@@ -1324,7 +1330,7 @@ snapshots:
|
||||
- esbuild
|
||||
- uglify-js
|
||||
|
||||
ysk-utils@1.0.82:
|
||||
ysk-utils@1.0.85:
|
||||
dependencies:
|
||||
bignumber.js: 9.3.1
|
||||
loadsh: 0.0.4
|
||||
|
||||
|
Before Width: | Height: | Size: 7.0 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8917 2H42.1083C43.8909 1.99995 45.3881 1.9999 46.5982 2.131C47.8701 2.26881 49.0596 2.57044 50.1145 3.33689C50.7088 3.76864 51.2314 4.29124 51.6631 4.88551C52.4296 5.94043 52.7312 7.12995 52.869 8.40184C53.0001 9.61184 53.0001 11.109 53 12.8915V12.8916V12.8916V12.8917V12.8917V40.1083V40.1083V40.1084V40.1084V40.1085C53.0001 41.891 53.0001 43.3882 52.869 44.5982C52.7312 45.8701 52.4296 47.0596 51.6631 48.1145C51.2314 48.7088 50.7088 49.2314 50.1145 49.6631C49.0596 50.4296 47.8701 50.7312 46.5982 50.869C45.3882 51.0001 43.891 51.0001 42.1085 51H42.1084H42.1084H42.1083H42.1083H32V54H51C52.1046 54 53 54.8954 53 56C53 57.1046 52.1046 58 51 58H32H28H9C7.89543 58 7 57.1046 7 56C7 54.8954 7.89543 54 9 54H28V51H17.8917H17.8917H17.8916H17.8916H17.8915C16.109 51.0001 14.6118 51.0001 13.4018 50.869C12.1299 50.7312 10.9404 50.4296 9.88551 49.6631C9.29124 49.2314 8.76864 48.7088 8.33689 48.1145C7.57044 47.0596 7.26881 45.8701 7.131 44.5982C6.9999 43.3881 6.99995 41.8909 7 40.1083V12.8917C6.99995 11.1091 6.9999 9.61188 7.131 8.40184C7.26881 7.12995 7.57044 5.94043 8.33689 4.88551C8.76864 4.29124 9.29124 3.76864 9.88551 3.33689C10.9404 2.57044 12.1299 2.26881 13.4018 2.131C14.6119 1.9999 16.1091 1.99995 17.8917 2ZM13.8327 6.10773C12.9011 6.20866 12.4961 6.38449 12.2366 6.57295C11.982 6.75799 11.758 6.98196 11.573 7.23665C11.3845 7.49605 11.2087 7.90113 11.1077 8.83269C11.0027 9.80168 11 11.0806 11 13V40C11 41.9194 11.0027 43.1983 11.1077 44.1673C11.2087 45.0989 11.3845 45.504 11.573 45.7634C11.758 46.018 11.982 46.242 12.2366 46.4271C12.4961 46.6155 12.9011 46.7913 13.8327 46.8923C14.8017 46.9973 16.0806 47 18 47H42C43.9194 47 45.1983 46.9973 46.1673 46.8923C47.0989 46.7913 47.504 46.6155 47.7634 46.4271C48.018 46.242 48.242 46.018 48.4271 45.7634C48.6155 45.504 48.7913 45.0989 48.8923 44.1673C48.9973 43.1983 49 41.9194 49 40V13C49 11.0806 48.9973 9.80168 48.8923 8.83269C48.7913 7.90113 48.6155 7.49605 48.4271 7.23665C48.242 6.98196 48.018 6.75799 47.7634 6.57295C47.504 6.38449 47.0989 6.20866 46.1673 6.10773C45.1983 6.00275 43.9194 6 42 6H18C16.0806 6 14.8017 6.00275 13.8327 6.10773ZM30 15C23.3726 15 18 20.3726 18 27C18 33.6274 23.3726 39 30 39C36.6274 39 42 33.6274 42 27C42 20.3726 36.6274 15 30 15ZM14 27C14 18.1634 21.1634 11 30 11C38.8366 11 46 18.1634 46 27C46 35.8366 38.8366 43 30 43C21.1634 43 14 35.8366 14 27ZM38.9429 28.0217C39.0682 26.9242 38.2803 25.9329 37.1828 25.8075C36.0854 25.6822 35.0941 26.4702 34.9687 27.5676C34.8516 28.5925 34.4204 29.5561 33.7341 30.3263C33.0479 31.0965 32.1402 31.6355 31.1355 31.8696C30.1308 32.1037 29.0784 32.0212 28.1224 31.6336C27.1664 31.246 26.3537 30.5722 25.7957 29.7046C25.1982 28.7756 23.9607 28.5068 23.0317 29.1043C22.1027 29.7018 21.8339 30.9393 22.4314 31.8683C23.4358 33.43 24.8986 34.6429 26.6194 35.3405C28.3402 36.0382 30.2347 36.1866 32.0431 35.7653C33.8515 35.344 35.4853 34.3736 36.7206 32.9873C37.9558 31.601 38.7321 29.8665 38.9429 28.0217Z" fill="url(#paint0_linear_516_209)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_516_209" x1="53" y1="29.9558" x2="7" y2="29.9558" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#238FFC"/>
|
||||
<stop offset="1" stop-color="#1A66FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="design-iconfont">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.0024 9.5012V43.4988C19.0024 45.1965 18.9995 46.2358 18.9376 47.0142C18.9088 47.3769 18.8725 47.5969 18.8419 47.7308C18.8273 47.7946 18.8151 47.8339 18.8077 47.8551C18.8007 47.8752 18.7966 47.8836 18.796 47.8848L18.796 47.8849C18.6013 48.2795 18.2819 48.5989 17.8873 48.7936L17.8824 48.7958C17.8779 48.7978 17.8699 48.801 17.8575 48.8053C17.8363 48.8127 17.797 48.8249 17.7332 48.8395C17.5993 48.8701 17.3793 48.9064 17.0166 48.9352C16.2382 48.9971 15.1989 49 13.5012 49C11.8035 49 10.7642 48.9971 9.98575 48.9352C9.62309 48.9064 9.40313 48.8701 9.26916 48.8395C9.20541 48.8249 9.16612 48.8127 9.14488 48.8053C9.12476 48.7983 9.1164 48.7942 9.11519 48.7936L9.11514 48.7936C8.7205 48.5989 8.40109 48.2795 8.20639 47.8849L8.20637 47.8848C8.20578 47.8836 8.20166 47.8752 8.19469 47.8551C8.18734 47.8339 8.17511 47.7946 8.16052 47.7308C8.12988 47.5969 8.09365 47.3769 8.06482 47.0142C8.00294 46.2358 8 45.1965 8 43.4988V9.5012C8 7.8035 8.00294 6.76416 8.06482 5.98575C8.09365 5.62309 8.12988 5.40313 8.16052 5.26916C8.17511 5.20541 8.18734 5.16612 8.19469 5.14488C8.20175 5.12448 8.20589 5.11616 8.20639 5.11514C8.40109 4.7205 8.7205 4.40109 9.11514 4.20639L9.11517 4.20638C9.11633 4.20581 9.12468 4.20168 9.14488 4.19469C9.16612 4.18734 9.20541 4.17511 9.26916 4.16052C9.40313 4.12988 9.62309 4.09365 9.98575 4.06482C10.7642 4.00294 11.8035 4 13.5012 4C15.1989 4 16.2382 4.00294 17.0166 4.06482C17.3793 4.09365 17.5993 4.12988 17.7332 4.16052C17.797 4.17511 17.8363 4.18734 17.8575 4.19469C17.8777 4.20168 17.8861 4.2058 17.8872 4.20638L17.8873 4.20639C18.2819 4.40109 18.6013 4.7205 18.796 5.11514C18.7965 5.11616 18.8006 5.12448 18.8077 5.14488C18.8151 5.16612 18.8273 5.20541 18.8419 5.26916C18.8725 5.40313 18.9088 5.62309 18.9376 5.98575C18.9995 6.76416 19.0024 7.8035 19.0024 9.5012ZM4 9.5012C4 6.23407 4 4.6005 4.61918 3.34542C5.20326 2.1615 6.1615 1.20326 7.34542 0.619181C8.6005 0 10.2341 0 13.5012 0C16.7683 0 18.4019 0 19.657 0.619181C20.8409 1.20326 21.7991 2.1615 22.3832 3.34542C23.0024 4.6005 23.0024 6.23407 23.0024 9.5012V43.4988C23.0024 46.7659 23.0024 48.3995 22.3832 49.6546C21.7991 50.8385 20.8409 51.7967 19.657 52.3808C18.6889 52.8584 17.4956 52.9676 15.5011 52.9926V56H22.0024C23.1071 56 24.0027 56.8954 24.0027 58C24.0027 59.1046 23.1071 60 22.0024 60H13.5011H5.00025C3.89554 60 3 59.1046 3 58C3 56.8954 3.89554 56 5.00025 56H11.5011V52.9926C9.50674 52.9676 8.31349 52.8584 7.34542 52.3808C6.1615 51.7967 5.20326 50.8385 4.61918 49.6546C4 48.3995 4 46.7659 4 43.4988V9.5012ZM32.2205 20.7829C31.4394 20.0019 30.173 20.0019 29.3919 20.7829C28.6108 21.5639 28.6108 22.8302 29.3919 23.6112C29.9026 24.1218 30.3078 24.7281 30.5842 25.3954C30.8606 26.0626 31.0029 26.7778 31.0029 27.5C31.0029 28.2222 30.8606 28.9374 30.5842 29.6046C30.3078 30.2719 29.9026 30.8782 29.3919 31.3888C28.6108 32.1698 28.6108 33.4361 29.3919 34.2171C30.173 34.9981 31.4394 34.9981 32.2205 34.2171C33.1027 33.335 33.8025 32.2878 34.28 31.1353C34.7574 29.9827 35.0032 28.7475 35.0032 27.5C35.0032 26.2525 34.7574 25.0173 34.28 23.8647C33.8025 22.7122 33.1027 21.665 32.2205 20.7829ZM16.001 9.5C16.001 10.8807 14.8817 12 13.501 12C12.1203 12 11.001 10.8807 11.001 9.5C11.001 8.11929 12.1203 7 13.501 7C14.8817 7 16.001 8.11929 16.001 9.5ZM13.501 20C14.8817 20 16.001 18.8807 16.001 17.5C16.001 16.1193 14.8817 15 13.501 15C12.1203 15 11.001 16.1193 11.001 17.5C11.001 18.8807 12.1203 20 13.501 20ZM16.001 25.5C16.001 26.8807 14.8817 28 13.501 28C12.1203 28 11.001 26.8807 11.001 25.5C11.001 24.1193 12.1203 23 13.501 23C14.8817 23 16.001 24.1193 16.001 25.5ZM13.501 36C14.8817 36 16.001 34.8807 16.001 33.5C16.001 32.1193 14.8817 31 13.501 31C12.1203 31 11.001 32.1193 11.001 33.5C11.001 34.8807 12.1203 36 13.501 36ZM37.4451 13.6962C38.2252 12.914 39.4917 12.9122 40.2739 13.6922C42.1458 15.5586 43.6186 17.7861 44.603 20.2393C45.5873 22.6924 46.0625 25.3201 45.9998 27.9625C45.9371 30.605 45.3378 33.2072 44.2382 35.6109C43.1386 38.0146 41.5618 40.1697 39.6035 41.9453C38.7851 42.6873 37.5202 42.6255 36.7781 41.8072C36.036 40.989 36.0978 39.7242 36.9162 38.9822C38.4728 37.5708 39.7262 35.8578 40.6002 33.9471C41.4742 32.0365 41.9506 29.9681 42.0004 27.8677C42.0503 25.7672 41.6725 23.6786 40.8901 21.7286C40.1077 19.7787 38.937 18.0082 37.4491 16.5246C36.6668 15.7446 36.6651 14.4783 37.4451 13.6962ZM47.5747 5.86219C46.7762 5.09891 45.51 5.12741 44.7467 5.92584C43.9833 6.72427 44.0118 7.99027 44.8103 8.75355C47.4154 11.2436 49.4851 14.2387 50.8931 17.5557C52.3011 20.8728 53.0177 24.4421 52.9991 28.0455C52.9805 31.6489 52.2272 35.2106 50.785 38.513C49.3429 41.8153 47.2424 44.7889 44.6118 47.2519C43.8054 48.0069 43.7639 49.2726 44.519 50.0788C45.2741 50.8851 46.5399 50.9266 47.3462 50.1716C50.3739 47.3368 52.7915 43.9144 54.4513 40.1136C56.1111 36.3128 56.9782 32.2134 56.9996 28.0661C57.021 23.9188 56.1962 19.8107 54.5757 15.993C52.9552 12.1752 50.573 8.72807 47.5747 5.86219Z" fill="url(#g20x3qzgy__paint0_linear_7_780)"/>
|
||||
<defs>
|
||||
<linearGradient id="g20x3qzgy__paint0_linear_7_780" x1="57" y1="29.9526" x2="3" y2="29.9526" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#238FFC"/>
|
||||
<stop offset="1" stop-color="#1A66FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="design-iconfont">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.5 4H41.5C44.1645 4 45.8473 4.0053 47.1023 4.13891C48.2849 4.2648 48.6139 4.4667 48.736 4.55332C49.0112 4.74856 49.2514 4.98882 49.4467 5.26399C49.5333 5.38606 49.7352 5.71509 49.8611 6.89766C49.9947 8.15273 50 9.83554 50 12.5C50 15.1645 49.9947 16.8473 49.8611 18.1023C49.7352 19.2849 49.5333 19.6139 49.4467 19.736C49.2514 20.0112 49.0112 20.2514 48.736 20.4467C48.6139 20.5333 48.2849 20.7352 47.1023 20.8611C45.8473 20.9947 44.1645 21 41.5 21H18.5C15.8355 21 14.1527 20.9947 12.8977 20.8611C11.7151 20.7352 11.3861 20.5333 11.264 20.4467C10.9888 20.2514 10.7486 20.0112 10.5533 19.736C10.4667 19.6139 10.2648 19.2849 10.1389 18.1023C10.0053 16.8473 10 15.1645 10 12.5C10 9.83554 10.0053 8.15273 10.1389 6.89766C10.2648 5.71509 10.4667 5.38606 10.5533 5.26399C10.7486 4.98882 10.9888 4.74856 11.264 4.55332C11.3861 4.4667 11.7151 4.2648 12.8977 4.13891C14.1527 4.0053 15.8355 4 18.5 4ZM6 12.5C6 7.34593 6 4.7689 7.29107 2.9493C7.74664 2.30724 8.30724 1.74664 8.9493 1.29107C10.7689 0 13.3459 0 18.5 0H41.5C46.6541 0 49.2311 0 51.0507 1.29107C51.6928 1.74664 52.2534 2.30724 52.7089 2.9493C54 4.7689 54 7.34593 54 12.5C54 17.6541 54 20.2311 52.7089 22.0507C52.2534 22.6928 51.6928 23.2534 51.0507 23.7089C50.0389 24.4268 48.793 24.7455 47 24.887V25V47.4C47 52.6496 47 55.2744 45.6631 57.1145C45.2314 57.7088 44.7088 58.2314 44.1145 58.6631C42.2744 60 39.6496 60 34.4 60H25.6C20.3504 60 17.7256 60 15.8855 58.6631C15.2912 58.2314 14.7686 57.7088 14.3369 57.1145C13 55.2744 13 52.6496 13 47.4V25V24.887C11.207 24.7455 9.96107 24.4268 8.9493 23.7089C8.30724 23.2534 7.74664 22.6928 7.29107 22.0507C6 20.2311 6 17.6541 6 12.5ZM17 24.9986V25V27V47.4C17 50.1139 17.0055 51.828 17.1438 53.105C17.2741 54.3071 17.4825 54.6388 17.5729 54.7634C17.758 55.018 17.982 55.242 18.2366 55.4271C18.3612 55.5175 18.6929 55.7259 19.895 55.8562C21.172 55.9945 22.8861 56 25.6 56H34.4C37.1139 56 38.828 55.9945 40.105 55.8562C41.3071 55.7259 41.6388 55.5175 41.7634 55.4271C42.018 55.242 42.242 55.018 42.4271 54.7634C42.5175 54.6388 42.7259 54.3071 42.8562 53.105C42.9945 51.828 43 50.1139 43 47.4V27V25V24.9986C42.5256 25 42.0262 25 41.5 25H18.5C17.9738 25 17.4744 25 17 24.9986ZM13.191 7.41221C13 7.67508 13 8.05005 13 8.8V12.2C13 12.9499 13 13.3249 13.191 13.5878C13.2527 13.6727 13.3273 13.7473 13.4122 13.809C13.6751 14 14.0501 14 14.8 14H45.2C45.9499 14 46.3249 14 46.5878 13.809C46.6727 13.7473 46.7473 13.6727 46.809 13.5878C47 13.3249 47 12.9499 47 12.2V8.8C47 8.05005 47 7.67508 46.809 7.41221C46.7473 7.32732 46.6727 7.25266 46.5878 7.19098C46.3249 7 45.9499 7 45.2 7H14.8C14.0501 7 13.6751 7 13.4122 7.19098C13.3273 7.25266 13.2527 7.32732 13.191 7.41221ZM26 51.8C26 51.0501 26 50.6751 26.191 50.4122C26.2527 50.3273 26.3273 50.2527 26.4122 50.191C26.6751 50 27.0501 50 27.8 50H32.2C32.9499 50 33.3249 50 33.5878 50.191C33.6727 50.2527 33.7473 50.3273 33.809 50.4122C34 50.6751 34 51.0501 34 51.8V52.2C34 52.9499 34 53.3249 33.809 53.5878C33.7473 53.6727 33.6727 53.7473 33.5878 53.809C33.3249 54 32.9499 54 32.2 54H27.8C27.0501 54 26.6751 54 26.4122 53.809C26.3273 53.7473 26.2527 53.6727 26.191 53.5878C26 53.3249 26 52.9499 26 52.2V51.8Z" fill="url(#pqjpdjg7m__paint0_linear_7_827)"/>
|
||||
<defs>
|
||||
<linearGradient id="pqjpdjg7m__paint0_linear_7_827" x1="54" y1="29.9526" x2="6" y2="29.9526" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#238FFC"/>
|
||||
<stop offset="1" stop-color="#1A66FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="design-iconfont">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.6 8H36.4C39.1139 8 40.828 8.00549 42.105 8.14384C43.3071 8.27408 43.6388 8.48249 43.7634 8.57295C44.018 8.75799 44.242 8.98196 44.4271 9.23664C44.5175 9.36116 44.7259 9.69294 44.8562 10.895C44.9945 12.172 45 13.8861 45 16.6V17.4C45 17.9767 44.9998 18.5082 44.998 19H15.002C15.0002 18.5082 15 17.9767 15 17.4V16.6C15 13.8861 15.0055 12.172 15.1438 10.895C15.2741 9.69294 15.4825 9.36116 15.5729 9.23664C15.758 8.98196 15.982 8.75799 16.2366 8.57295C16.3612 8.48249 16.6929 8.27408 17.895 8.14384C19.172 8.00549 20.8861 8 23.6 8ZM49 17.4C49 17.9633 49 18.4965 48.9983 19.0016C53.2028 19.0153 55.4715 19.1432 57.1145 20.3369C57.7088 20.7686 58.2314 21.2912 58.6631 21.8855C60 23.7256 60 26.3504 60 31.6V32.4C60 37.6496 60 40.2744 58.6631 42.1145C58.2314 42.7088 57.7088 43.2314 57.1145 43.6631C55.4715 44.8568 53.2028 44.9847 48.9984 44.9984C48.9847 49.2028 48.8568 51.4715 47.6631 53.1145C47.2314 53.7088 46.7088 54.2314 46.1145 54.6631C44.2744 56 41.6496 56 36.4 56H23.6C18.3504 56 15.7256 56 13.8855 54.6631C13.2912 54.2314 12.7686 53.7088 12.3369 53.1145C11.1432 51.4715 11.0153 49.2028 11.0016 44.9984C6.79724 44.9847 4.52853 44.8568 2.8855 43.6631C2.29124 43.2314 1.76864 42.7088 1.33688 42.1145C0 40.2744 0 37.6496 0 32.4V31.6C0 26.3504 0 23.7256 1.33688 21.8855C1.76864 21.2912 2.29124 20.7686 2.8855 20.3369C4.52853 19.1432 6.79725 19.0153 11.0017 19.0016C11 18.4965 11 17.9634 11 17.4V16.6C11 11.3504 11 8.72556 12.3369 6.8855C12.7686 6.29124 13.2912 5.76864 13.8855 5.33688C15.7256 4 18.3504 4 23.6 4H36.4C41.6496 4 44.2744 4 46.1145 5.33688C46.7088 5.76864 47.2314 6.29124 47.6631 6.8855C49 8.72556 49 11.3504 49 16.6V17.4ZM47.4 23H12.6C9.88609 23 8.17196 23.0055 6.89502 23.1438C5.69294 23.2741 5.36116 23.4825 5.23664 23.5729C4.98196 23.758 4.75799 23.982 4.57295 24.2366C4.48249 24.3612 4.27408 24.6929 4.14384 25.895C4.00549 27.172 4 28.8861 4 31.6V32.4C4 35.1139 4.00549 36.828 4.14384 38.105C4.27408 39.3071 4.48249 39.6388 4.57295 39.7634C4.75799 40.018 4.98196 40.242 5.23664 40.4271C5.36116 40.5175 5.69294 40.7259 6.89502 40.8562C7.90092 40.9651 9.17813 40.9917 11.0017 40.998C11.0154 36.7959 11.1435 34.5281 12.3369 32.8855C12.7686 32.2912 13.2912 31.7686 13.8855 31.3369C15.7256 30 18.3504 30 23.6 30H36.4C41.6496 30 44.2744 30 46.1145 31.3369C46.7088 31.7686 47.2314 32.2912 47.6631 32.8855C48.8565 34.5281 48.9846 36.7959 48.9983 40.998C50.8219 40.9917 52.0991 40.9651 53.105 40.8562C54.3071 40.7259 54.6388 40.5175 54.7634 40.4271C55.018 40.242 55.242 40.018 55.4271 39.7634C55.5175 39.6388 55.7259 39.3071 55.8562 38.105C55.9945 36.828 56 35.1139 56 32.4V31.6C56 28.8861 55.9945 27.172 55.8562 25.895C55.7259 24.6929 55.5175 24.3612 55.4271 24.2366C55.242 23.982 55.018 23.758 54.7634 23.5729C54.6388 23.4825 54.3071 23.2741 53.105 23.1438C51.828 23.0055 50.1139 23 47.4 23ZM23.6 34H36.4C39.1139 34 40.828 34.0055 42.105 34.1438C43.3071 34.2741 43.6388 34.4825 43.7634 34.5729C44.018 34.758 44.242 34.982 44.4271 35.2366C44.5175 35.3612 44.7259 35.6929 44.8562 36.895C44.9945 38.172 45 39.8861 45 42.6V43.4C45 46.1139 44.9945 47.828 44.8562 49.105C44.7259 50.3071 44.5175 50.6388 44.4271 50.7634C44.242 51.018 44.018 51.242 43.7634 51.4271C43.6388 51.5175 43.3071 51.7259 42.105 51.8562C40.828 51.9945 39.1139 52 36.4 52H23.6C20.8861 52 19.172 51.9945 17.895 51.8562C16.6929 51.7259 16.3612 51.5175 16.2366 51.4271C15.982 51.242 15.758 51.018 15.5729 50.7634C15.4825 50.6388 15.2741 50.3071 15.1438 49.105C15.0055 47.828 15 46.1139 15 43.4V42.6C15 39.8861 15.0055 38.172 15.1438 36.895C15.2741 35.6929 15.4825 35.3612 15.5729 35.2366C15.758 34.982 15.982 34.758 16.2366 34.5729C16.3612 34.4825 16.6929 34.2741 17.895 34.1438C19.172 34.0055 20.8861 34 23.6 34ZM9.5 31C10.8807 31 12 29.8807 12 28.5C12 27.1193 10.8807 26 9.5 26C8.11929 26 7 27.1193 7 28.5C7 29.8807 8.11929 31 9.5 31Z" fill="url(#fozfhulz2__paint0_linear_7_688)"/>
|
||||
<defs>
|
||||
<linearGradient id="fozfhulz2__paint0_linear_7_688" x1="60" y1="29.9589" x2="1.3e-7" y2="29.9589" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#238FFC"/>
|
||||
<stop offset="1" stop-color="#1A66FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="design-iconfont">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.6 4H40.4C43.1139 4 44.828 4.00549 46.105 4.14384C47.3071 4.27408 47.6388 4.48249 47.7634 4.57295C48.018 4.75799 48.242 4.98196 48.4271 5.23664C48.5175 5.36116 48.7259 5.69294 48.8562 6.89502C48.9945 8.17196 49 9.88609 49 12.6V34H53V12.6C53 7.35037 53 4.72556 51.6631 2.8855C51.2314 2.29124 50.7088 1.76864 50.1145 1.33688C48.2744 0 45.6496 0 40.4 0H19.6C14.3504 0 11.7256 0 9.8855 1.33688C9.29124 1.76864 8.76864 2.29124 8.33688 2.8855C7 4.72556 7 7.35037 7 12.6V34H11V12.6C11 9.88609 11.0055 8.17196 11.1438 6.89502C11.2741 5.69294 11.4825 5.36116 11.5729 5.23664C11.758 4.98196 11.982 4.75799 12.2366 4.57295C12.3612 4.48249 12.6929 4.27408 13.895 4.14384C15.172 4.00549 16.8861 4 19.6 4ZM11 44H7V47.4C7 52.6496 7 55.2744 8.33688 57.1145C8.76864 57.7088 9.29124 58.2314 9.8855 58.6631C11.7256 60 14.3504 60 19.6 60H40.4C45.6496 60 48.2744 60 50.1145 58.6631C50.7088 58.2314 51.2314 57.7088 51.6631 57.1145C53 55.2744 53 52.6496 53 47.4V44H49V47.4C49 50.1139 48.9945 51.828 48.8562 53.105C48.7259 54.3071 48.5175 54.6388 48.4271 54.7634C48.242 55.018 48.018 55.242 47.7634 55.4271C47.6388 55.5175 47.3071 55.7259 46.105 55.8562C44.828 55.9945 43.1139 56 40.4 56H19.6C16.8861 56 15.172 55.9945 13.895 55.8562C12.6929 55.7259 12.3612 55.5175 12.2366 55.4271C11.982 55.242 11.758 55.018 11.5729 54.7634C11.4825 54.6388 11.2741 54.3071 11.1438 53.105C11.0055 51.828 11 50.1139 11 47.4V44ZM21 19C19.8954 19 19 19.8954 19 21V34H23V21C23 19.8954 22.1046 19 21 19ZM19 44V47C19 48.1046 19.8954 49 21 49C22.1046 49 23 48.1046 23 47V44H19ZM31 44V47C31 48.1046 30.1046 49 29 49C27.8954 49 27 48.1046 27 47V44H31ZM27 34V21C27 19.8954 27.8954 19 29 19C30.1046 19 31 19.8954 31 21V34H27ZM34 44V45.5C34 46.9045 34 47.6067 34.3371 48.1111C34.483 48.3295 34.6705 48.517 34.8889 48.6629C35.3933 49 36.0955 49 37.5 49C38.9045 49 39.6067 49 40.1111 48.6629C40.3295 48.517 40.517 48.3295 40.6629 48.1111C41 47.6067 41 46.9045 41 45.5V44H34ZM34 34V22.5C34 21.0955 34 20.3933 34.3371 19.8889C34.483 19.6705 34.6705 19.483 34.8889 19.3371C35.3933 19 36.0955 19 37.5 19C38.9045 19 39.6067 19 40.1111 19.3371C40.3295 19.483 40.517 19.6705 40.6629 19.8889C41 20.3933 41 21.0955 41 22.5V34H34ZM2 37C0.895431 37 0 37.8954 0 39C0 40.1046 0.895432 41 2 41H58C59.1046 41 60 40.1046 60 39C60 37.8954 59.1046 37 58 37H2Z" fill="url(#47umcq4q1__paint0_linear_8_17)"/>
|
||||
<defs>
|
||||
<linearGradient id="47umcq4q1__paint0_linear_8_17" x1="60" y1="29.9526" x2="1.3e-7" y2="29.9526" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#238FFC"/>
|
||||
<stop offset="1" stop-color="#1A66FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
@@ -1,15 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="design-iconfont">
|
||||
<defs>
|
||||
<clipPath id="4vn0u2nsia">
|
||||
<path data-name="矩形 3396" transform="translate(78 1064)" stroke="#707070" fill="#666f80" d="M0 0H60V60H0z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g data-name="蒙版组 14" transform="translate(-78 -1064)" clip-path="url(#4vn0u2nsia)">
|
||||
<g data-name="组 1186" fill="#666f80">
|
||||
<path data-name="矩形 3392" d="M2,0H46.333a2,2,0,0,1,2,2V23.333a0,0,0,0,1,0,0H0a0,0,0,0,1,0,0V2A2,2,0,0,1,2,0Z" transform="translate(83.833 1069)"/>
|
||||
<path data-name="矩形 3393" d="M2,0H46.333a2,2,0,0,1,2,2V23.333a0,0,0,0,1,0,0H0a0,0,0,0,1,0,0V2A2,2,0,0,1,2,0Z" transform="rotate(180 66.083 559.5)" opacity=".7"/>
|
||||
<path data-name="矩形 3394" d="M1,0H2.5a0,0,0,0,1,0,0V3.333a0,0,0,0,1,0,0H1a1,1,0,0,1-1-1V1A1,1,0,0,1,1,0Z" transform="translate(81.333 1092.333)"/>
|
||||
<path data-name="矩形 3395" d="M0,0H1.5a1,1,0,0,1,1,1V2.333a1,1,0,0,1-1,1H0a0,0,0,0,1,0,0V0A0,0,0,0,1,0,0Z" transform="translate(132.166 1092.333)"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,10 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="design-iconfont">
|
||||
<defs>
|
||||
<clipPath id="4x4sc48saa">
|
||||
<rect data-name="矩形 3977" width="50" height="50" rx="10" transform="translate(180 998)" fill="#fff"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g data-name="蒙版组 198" transform="translate(-180 -998)" clip-path="url(#4x4sc48saa)">
|
||||
<path d="M43.75,0H6.25A6.268,6.268,0,0,0,0,6.25v37.5A6.268,6.268,0,0,0,6.25,50h37.5A6.268,6.268,0,0,0,50,43.75V6.25A6.268,6.268,0,0,0,43.75,0ZM25,38.438a18.189,18.189,0,0,1-5.937-.938c-1.25.625-3.125,2.187-3.75,2.5-1.25.625-.938-.625-.938-.625L15,35.625A13.105,13.105,0,0,1,9.062,24.688c0-7.813,7.188-14.063,15.938-14.063a17.368,17.368,0,0,1,13.125,5.938L22.5,23.75a2.483,2.483,0,0,1-2.5-.312l-2.5-1.875S15.625,20,16.562,22.5l2.5,5.625s.313,1.562,2.188.625c1.563-.625,13.125-7.812,18.125-10.625a14.219,14.219,0,0,1,1.562,6.25c0,7.5-7.187,14.063-15.937,14.063Z" transform="translate(180 998)" fill="#06c05f"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 984 B |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="design-iconfont">
|
||||
<path data-name="路径 10777" d="M0,0,11.111,0H38.889Q50,0,50,11.111V38.889Q50,50,38.889,50H11.111Q0,50,0,38.889V11.111Q0,0,11.111,0Z" fill="#fd2821"/>
|
||||
<path data-name="路径 10778" d="M115.226,385a.74.74,0,0,1,.837.837v10.914a.837.837,0,1,1-1.675,0V385.839A.74.74,0,0,1,115.226,385Zm3.554,5,2.614,2.614a.933.933,0,1,1-1.32,1.32l-2.614-2.614a.835.835,0,0,1,0-1.32A.807.807,0,0,1,118.78,390Zm-18.249-1.4v8.046a.939.939,0,1,1-1.878,0v-8.046a.824.824,0,0,1,.939-.939A.833.833,0,0,1,100.531,388.606Zm-15.38-3.2h10a.939.939,0,0,1,0,1.879h-10a.824.824,0,0,1-.939-.939A.834.834,0,0,1,85.15,385.408Z" transform="translate(-80.099 -366.203)" fill="#fff"/>
|
||||
<path data-name="路径 10779" d="M99.185,377.8a.927.927,0,0,0-1.32.025l-3.68,3.756v-2.234a.7.7,0,0,0-.076-.33.948.948,0,0,0-.913-.736H84.439l-.431-.431a.933.933,0,1,0-1.294,1.345l.711.685a.861.861,0,0,0,.685.254h8.249v3.35l-.736.761-2.589-2.589a.452.452,0,0,0-.178-.127.928.928,0,0,0-1.32.025l-3.3,3.274a.933.933,0,0,0,1.32,1.32l2.614-2.614,2.665,2.665a.865.865,0,0,0,.355.228.927.927,0,0,0,1.117-.178l.025-.025v2.233c0,.076-.051.152-.1.152l-.964.025a.939.939,0,0,0,0,1.879l1.853-.025h.152a.953.953,0,0,0,.939-.939V384.27l5-5.127a.958.958,0,0,0-.025-1.345Zm9.873,2.031h-.787v-1.32a.939.939,0,1,0-1.878,0v1.32H101.14a.939.939,0,0,0,0,1.878h5.254v6.954a.116.116,0,0,1-.1.127h-1.244a.939.939,0,0,0,0,1.879h2.284a1.141,1.141,0,0,0,.964-1.091v-7.868h.787a.954.954,0,0,0,.939-.939.994.994,0,0,0-.965-.939Zm-37.817,4.949a.739.739,0,0,0,.051-.228H79.21a.939.939,0,1,0,.051-1.878H67.485a.939.939,0,1,0-.051,1.878h1.853l-1.726,4.492a.963.963,0,0,0,.355,1.117.944.944,0,0,0,.711.33H78.6a.5.5,0,0,0,.2-.025.865.865,0,0,0,.355-.051.967.967,0,0,0,.584-1.193l-1.015-2.893a.939.939,0,1,0-1.776.609l.533,1.523a.171.171,0,0,1-.1.152H69.947a.127.127,0,0,1-.127-.152v-.051l1.421-3.629Z" transform="translate(-63.271 -359.101)" fill="#fff"/>
|
||||
<path data-name="路径 10780" d="M491.818,417.077l7.436-7.64.077.076-7.437,7.64-.076-.076Zm-4.771-4.188.076-.076,4.721,4.746-.077.077-4.721-4.746Z" transform="translate(-463.265 -389.445)" fill="#ff2217"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="design-iconfont">
|
||||
<g fill="#0d72ff">
|
||||
<path data-name="路径 10775" d="M87.9,103.816a18.921,18.921,0,0,1-12.7,1.8c-4.655-1.1-7.959-4.075-7.391-9.571s6.444-7.392,11.276-7.392,14,3.132,14,3.132.77-1.726,1.519-3.7a17.85,17.85,0,0,0,.96-3.559H76.046V82.57h9.486V78.826l-11.826.085V76.444H85.533V70.828h6.211v5.615h12.678v2.468L91.744,79v3.488l10.468.085a24.572,24.572,0,0,1-1.516,5.516,27.025,27.025,0,0,1-2.57,5.375L114,98.67V74a10,10,0,0,0-10-10H74A10,10,0,0,0,64,74v30a10,10,0,0,0,10,10h30a10,10,0,0,0,9.633-7.348L95.318,97.97S91.647,102.03,87.9,103.816Z" transform="translate(-64 -64)"/>
|
||||
<path data-name="路径 10776" d="M175.257,559.5c-5.829.371-7.253,2.936-7.253,5.3s1.439,5.64,8.29,5.64,12.662-6.907,12.662-6.907S181.084,559.124,175.257,559.5Z" transform="translate(-162.2 -531.824)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 881 B |