-
-
-
+
{{ promos.title }}
+
@@ -61,7 +63,7 @@
+ @buy="onBuy" @change="onSkuChange" @close="state.showSelectSku = false" />
@@ -86,23 +88,28 @@
+
-
+
-
-
-
+ @close="state.showActivityModel = false" />
diff --git a/pages/goods/list.vue b/pages/goods/list.vue
index 40910e3e..d625d2e6 100644
--- a/pages/goods/list.vue
+++ b/pages/goods/list.vue
@@ -1,383 +1,352 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- {{ item.label }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ }" @tap="loadmore" />
+
+
+
+ .goods-box {
+ &:nth-last-of-type(1) {
+ margin-bottom: 0 !important;
+ }
+
+ &:nth-child(2n) {
+ margin-right: 0;
+ }
+ }
+
+ .list-icon {
+ width: 80rpx;
+
+ .sicon-goods-card {
+ font-size: 40rpx;
+ }
+
+ .sicon-goods-list {
+ font-size: 40rpx;
+ }
+ }
+
+ .goods-card {
+ margin-left: 20rpx;
+ }
+
+ .list-filter-tabs {
+ background-color: #fff;
+ }
+
+ .filter-list-box {
+ padding: 28rpx 52rpx;
+
+ .filter-item {
+ font-size: 28rpx;
+ font-weight: 500;
+ color: #333333;
+ line-height: normal;
+ margin-bottom: 24rpx;
+
+ &:nth-last-child(1) {
+ margin-bottom: 0;
+ }
+ }
+
+ .filter-item-active {
+ color: var(--ui-BG-Main);
+ }
+ }
+
+ .tab-item {
+ height: 50px;
+ position: relative;
+ z-index: 11;
+
+ .tab-title {
+ font-size: 30rpx;
+ }
+
+ .cur-tab-title {
+ font-weight: $font-weight-bold;
+ }
+
+ .tab-line {
+ width: 60rpx;
+ height: 6rpx;
+ border-radius: 6rpx;
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ bottom: 10rpx;
+ background-color: var(--ui-BG-Main);
+ z-index: 12;
+ }
+ }
+
\ No newline at end of file
diff --git a/pages/index/cart.vue b/pages/index/cart.vue
index 3ba03389..02c052f1 100644
--- a/pages/index/cart.vue
+++ b/pages/index/cart.vue
@@ -1,220 +1,200 @@
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .goods-box {
+ background-color: #fff;
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/pages/index/user.vue b/pages/index/user.vue
index fb194fc3..37e6291b 100644
--- a/pages/index/user.vue
+++ b/pages/index/user.vue
@@ -1,42 +1,41 @@
-
-
-
-
-
-
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/pages/order/aftersale/eturn-delivery.vue b/pages/order/aftersale/eturn-delivery.vue
new file mode 100644
index 00000000..529bf334
--- /dev/null
+++ b/pages/order/aftersale/eturn-delivery.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/confirm.vue b/pages/order/confirm.vue
index 9b4c8bf0..7f866a4c 100644
--- a/pages/order/confirm.vue
+++ b/pages/order/confirm.vue
@@ -1,388 +1,414 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ 配送方式
+
+ {{ item.dispatch_type_text }}
+
+
+
+
-
-
-
-
- 订单备注
-
-
-
-
-
+
+ 订单备注
+
+
+
+
+
+
+
+
+
+ 商品金额
+
+ ¥{{ state.orderInfo.goods_amount }}
+
+
+
+ 扣除积分
+
+
+ {{ state.orderInfo.score_amount }}
+
+
+
+ 运费
+
+ +¥{{ state.orderInfo.dispatch_amount }}
+
+
+
+
+ 优惠券
+
+ -¥{{ state.orderInfo.coupon_discount_fee }}
+ {{
+ state.couponInfo.can_use?.length > 0
+ ? state.couponInfo.can_use?.length + '张可用'
+ : '暂无可用优惠券'
+ }}
-
-
-
-
- 商品金额
-
-
- ¥{{ fen2yuan(state.orderInfo.price.totalPrice) }}
-
-
-
-
-
- 扣除积分
-
-
- {{ state.orderInfo.score_amount }}
-
-
-
- 运费
-
-
- +¥{{ fen2yuan(state.orderInfo.price.deliveryPrice) }}
-
-
-
-
-
- 优惠券
-
-
- -¥{{ fen2yuan(state.orderInfo.price.couponPrice) }}
-
-
- {{
- state.couponInfo.length > 0 ? state.couponInfo.length + ' 张可用' : '暂无可用优惠券'
- }}
-
-
-
-
-
- 活动优惠
-
-
-
- -¥{{ fen2yuan(state.orderInfo.price.discountPrice) }}
-
-
-
-
-
-
-
+
+
+
+
+
+ 活动优惠
+
+ -¥{{ state.orderInfo.promo_discount_fee }}
+
+
+
+
+
+
+
+
+
+ 发票申请
+
+ {{ state.invoiceInfo.name || '无需开具发票' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .cicon-box {
+ font-size: 36rpx;
+ color: #999999;
+ }
+
\ No newline at end of file
diff --git a/pages/pay/index.vue b/pages/pay/index.vue
index 7ea40be6..8b11d90e 100644
--- a/pages/pay/index.vue
+++ b/pages/pay/index.vue
@@ -2,17 +2,14 @@
-
-
-
选择支付方式
@@ -20,6 +17,7 @@
+ >
+ >
{{ item.title }}
-
+
余额: {{ userInfo.money }}元
+
+ 部分商品不支持
+
-
+
+
+ 充值金额
+
+ ¥
+
+
+
+
+
+
+
+
+ 关闭充值
+
+
+ .face-value-tag {
+ background: $white;
+ color: var(--ui-BG-Main);
+ font-family: OPPOSANS;
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/pages/pay/result.vue b/pages/pay/result.vue
index 82943712..5b18ba8e 100644
--- a/pages/pay/result.vue
+++ b/pages/pay/result.vue
@@ -2,27 +2,34 @@
-
-
+
+ >
- 支付成功
- 支付失败
- 该订单已关闭
- 检测支付结果...
+ >
+ {{
+ state.orderInfo.pay_mode === 'offline' ? '下单成功' : '支付成功'
+ }}
+ 支付失败
+ 该订单已关闭
+ 检测支付结果...
- ¥{{ fen2yuan(state.orderInfo.price) }}
+ ¥{{ state.orderInfo.pay_fee }}
+ +
+
+
+ {{ state.orderInfo.score_amount }}
+
-
-
-
-
-
+
获取实时发货信息与订单状态
立即订阅
@@ -66,20 +74,15 @@
import { reactive, computed } from 'vue';
import { isEmpty } from 'lodash';
import sheep from '@/sheep';
- import PayOrderApi from '@/sheep/api/pay/order';
- import { fen2yuan } from '../../sheep/hooks/useGoods';
- import OrderApi from '@/sheep/api/trade/order';
const state = reactive({
- id: 0, // 支付单号
- orderType: 'goods', // 订单类型
+ orderId: 0,
+ orderType: 'goods',
result: 'unpaid', // 支付状态
- orderInfo: {}, // 支付订单信息
- tradeOrder: {}, // 商品订单信息,只有在 orderType 为 goods 才会请求。目的:【我的拼团】按钮的展示
+ orderInfo: {}, // 订单详情
counter: 0, // 获取结果次数
});
- // 支付结果 result => payResult
const payResult = computed(() => {
if (state.result === 'unpaid') {
return 'waiting';
@@ -90,65 +93,57 @@
if (state.result === 'failed') {
return 'failed';
}
+
if (state.result === 'closed') {
return 'closed';
}
});
-
- // 获得订单信息
- async function getOrderInfo(id) {
+ async function getOrderInfo(orderId) {
+ let checkPayResult;
state.counter++;
- // 1. 加载订单信息
- const { data, code } = await PayOrderApi.getOrder(id);
- if (code === 0) {
+ if (state.orderType === 'recharge') {
+ checkPayResult = sheep.$api.trade.order;
+ } else {
+ checkPayResult = sheep.$api.order.detail;
+ }
+ const { data, error } = await checkPayResult(orderId);
+ if (error === 0) {
state.orderInfo = data;
- if (!state.orderInfo || state.orderInfo.status === 30) {
- // 支付关闭
+ if (state.orderInfo.status === 'closed') {
state.result = 'closed';
return;
}
- if (state.orderInfo.status !== 0) {
- // 非待支付,可能是已支付,可能是已退款
+ if (state.orderInfo.status !== 'unpaid') {
state.result = 'paid';
// #ifdef MP
subscribeMessage();
// #endif
- // 特殊:获得商品订单信息
- if (state.orderType === 'goods') {
- const { data, code } = await OrderApi.getOrder(state.orderInfo.merchantOrderId);
- if (code === 0) {
- state.tradeOrder = data;
- }
- }
return;
}
}
- // 2.1 情况三一:未支付,且轮询次数小于三次,则继续轮询
if (state.counter < 3 && state.result === 'unpaid') {
setTimeout(() => {
- getOrderInfo(id);
+ getOrderInfo(orderId);
}, 1500);
}
- // 2.2 情况二:超过三次检测才判断为支付失败
+ // 超过三次检测才判断为支付失败
if (state.counter >= 3) {
state.result = 'failed';
}
}
function onOrder() {
- // TODO 芋艿:待测试
- if (state.orderType === 'recharge') {
+ if ((state.orderType === 'recharge')) {
sheep.$router.redirect('/pages/pay/recharge-log');
} else {
sheep.$router.redirect('/pages/order/list');
}
}
- // TODO 芋艿:待测试
// #ifdef MP
function subscribeMessage() {
let event = ['order_dispatched'];
- if (state.tradeOrder.type === 3) {
+ if (['groupon', 'groupon_ladder'].includes(state.orderInfo.activity_type)) {
event.push('groupon_finish');
event.push('groupon_fail');
}
@@ -157,13 +152,18 @@
// #endif
onLoad(async (options) => {
+ let id = '';
// 支付订单号
- if (options.id) {
- state.id = options.id;
+ if (options.orderSN) {
+ id = options.orderSN;
}
- // 订单类型
- if (options.orderType) {
- state.orderType = options.orderType;
+ if (options.id) {
+ id = options.id;
+ }
+ state.orderId = id;
+
+ if (options.orderType === 'recharge') {
+ state.orderType = 'recharge';
}
// 支付结果传值过来是失败,则直接显示失败界面
@@ -171,16 +171,14 @@
state.result = 'failed';
} else {
// 轮询三次检测订单支付结果
- await getOrderInfo(state.id);
+ getOrderInfo(state.orderId);
}
});
onShow(() => {
- if (isEmpty(state.orderInfo)) {
- return;
- }
- getOrderInfo(state.id);
- });
+ if(isEmpty(state.orderInfo)) return;
+ getOrderInfo(state.orderId);
+ })
onHide(() => {
state.result = 'unpaid';
diff --git a/pages/user/address/edit.vue b/pages/user/address/edit.vue
index eb5e8929..e5dad0bc 100644
--- a/pages/user/address/edit.vue
+++ b/pages/user/address/edit.vue
@@ -101,6 +101,7 @@
},
);
const onRegionConfirm = (e) => {
+ console.log(e);
state.model = {
...state.model,
...e,
@@ -186,7 +187,13 @@
if (options.data) {
let data = JSON.parse(options.data);
- console.log(data)
+ const areaData = uni.getStorageSync('areaData');
+ let provinceArr = areaData.filter(item => item.name == data.province_name);
+ data.province_id = provinceArr[0].id;
+ let provinceArr2 = provinceArr[0].children.filter(item => item.name == data.city_name);
+ data.city_id = provinceArr2[0].id;
+ let provinceArr3 = provinceArr2[0].children.filter(item => item.name == data.district_name);
+ data.district_id = provinceArr3[0].id;
state.model = {
...state.model,
...data,
diff --git a/sheep/api/activity.js b/sheep/api/activity.js
index 83d620be..c8096f34 100644
--- a/sheep/api/activity.js
+++ b/sheep/api/activity.js
@@ -1,43 +1,64 @@
import request from '@/sheep/request';
export default {
- myGroupon: (params) =>
- request({
- url: 'activity/groupon/myGroupons',
- method: 'GET',
- params,
- }),
- getGrouponList: (params) =>
- request({
- url: 'activity/groupon',
- method: 'GET',
- params,
- }),
- grouponDetail: (id) =>
- request({
- url: 'activity/groupon/' + id,
- method: 'GET',
- }),
- signList: (params) =>
- request({
- url: 'activity/signin',
- method: 'GET',
- params,
- }),
- signAdd: () =>
- request({
- url: 'activity/signin',
- method: 'POST',
- }),
- replenish: (data) =>
- request({
- url: 'activity/signin/replenish',
- method: 'POST',
- data,
- }),
- activity: (id) =>
- request({
- url: 'activity/activity/' + id,
- method: 'GET',
- }),
-};
+ myGroupon: (params) =>
+ request({
+ url: 'activity/groupon/myGroupons',
+ method: 'GET',
+ params,
+ }),
+ getGrouponList: (params) =>
+ request({
+ url: 'activity/groupon',
+ method: 'GET',
+ params,
+ }),
+ grouponDetail: (id) =>
+ request({
+ url: 'activity/groupon/' + id,
+ method: 'GET',
+ }),
+ signList: (params) =>
+ request({
+ url: 'activity/signin',
+ method: 'GET',
+ params,
+ }),
+ signAdd: () =>
+ request({
+ url: '/app-api/member/sign-in/record/create',
+ method: 'POST',
+ }),
+ configLise: () =>
+ request({
+ url: '/app-api/member/sign-in/config/list',
+ method: 'GET',
+ }),
+ recordPage: () =>
+ request({
+ url: '/app-api/member/sign-in/record/page',
+ method: 'GET',
+ }),
+ // signAdd: () =>
+ // request({
+ // url: 'activity/signin',
+ // method: 'POST',
+ // }),
+ replenish: (data) =>
+ request({
+ url: 'activity/signin/replenish',
+ method: 'POST',
+ data,
+ }),
+ activity: (id) =>
+ request({
+ url: 'activity/activity/' + id,
+ method: 'GET',
+ }),
+ getSummary: () =>
+ request({
+ url: '/app-api/member/sign-in/record/get-summary',
+ method: 'GET',
+ }),
+
+};
\ No newline at end of file
diff --git a/sheep/api/app.js b/sheep/api/app.js
index a174686d..2bb92c6c 100644
--- a/sheep/api/app.js
+++ b/sheep/api/app.js
@@ -115,14 +115,12 @@ export default {
formData: {
group,
},
- // TODO 芋艿:临时写死
header: {
// Accept: 'text/json',
// Authorization: token,
- Accept : '*/*',
- 'tenant-id' :'1',
- 'terminal': 20,
- Authorization: 'Bearer test247',
+ Accept : '*/*',
+ 'tenant-id' :'1',
+ Authorization: 'Bearer test247',
},
success: (uploadFileRes) => {
let result = JSON.parse(uploadFileRes.data);
diff --git a/sheep/api/cart.js b/sheep/api/cart.js
index d4421d02..f4aacaa3 100644
--- a/sheep/api/cart.js
+++ b/sheep/api/cart.js
@@ -1,9 +1,10 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
list: (data) =>
- request({
- url: '/app-api/trade/cart/list',
+ request2({
+ url: 'trade/cart/list',
method: 'GET',
custom: {
showLoading: false,
@@ -12,40 +13,26 @@ export default {
}),
append: (data) =>
request({
- url: '/app-api/trade/cart/add',
+ url: 'cart',
method: 'POST',
- // TODO 芋艿:这里没提示
custom: {
showSuccess: true,
successMsg: '已添加到购物车~',
},
data: {
...data,
- // type: 'inc',
+ type: 'inc',
},
}),
- // append: (data) =>
- // request({
- // url: 'cart',
- // method: 'POST',
- // custom: {
- // showSuccess: true,
- // successMsg: '已添加到购物车~',
- // },
- // data: {
- // ...data,
- // type: 'inc',
- // },
- // }),
// 删除购物车
delete: (ids) =>
- request({
- url: '/app-api/trade/cart/delete?ids=' + ids,
+ request2({
+ url: 'trade/cart/delete?ids=' + ids,
method: 'DELETE',
}),
update: (data) =>
- request({
- url: '/app-api/trade/cart/update-count',
+ request2({
+ url: 'trade/cart/update-count',
method: 'PUT',
data: {
...data,
diff --git a/sheep/api/category.js b/sheep/api/category.js
index f74c3327..9c825069 100644
--- a/sheep/api/category.js
+++ b/sheep/api/category.js
@@ -1,8 +1,10 @@
+import request2 from '@/sheep/request2';
+
export default {
- list: (params) =>
- request({
- url: '/app-api/product/category/list',
- method: 'GET',
- params,
- }),
-};
\ No newline at end of file
+ list: (params) =>
+ request2({
+ url: 'product/category/list',
+ method: 'GET',
+ params,
+ }),
+};
diff --git a/sheep/api/coupon.js b/sheep/api/coupon.js
index a683df3a..3f5e8e6e 100644
--- a/sheep/api/coupon.js
+++ b/sheep/api/coupon.js
@@ -1,4 +1,5 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
// 我的拼团
@@ -12,8 +13,8 @@ export default {
},
}),
userCoupon: (params) =>
- request({
- url: '/app-api/promotion/coupon/page',
+ request2({
+ url: 'promotion/coupon/page',
method: 'GET',
params,
}),
@@ -33,20 +34,9 @@ export default {
}),
get: (id) =>
request({
- url: '/app-api/promotion/coupon/take',
+ url: 'coupon/get/' + id,
method: 'POST',
- data: {
- templateId: id
- },
- params: {
- templateId: id
- },
}),
- // get: (id) =>
- // request({
- // url: 'coupon/get/' + id,
- // method: 'POST',
- // }),
listByGoods: (id) =>
request({
url: 'coupon/listByGoods/' + id,
diff --git a/sheep/api/data.js b/sheep/api/data.js
index d1e38bb0..6a5b08b1 100644
--- a/sheep/api/data.js
+++ b/sheep/api/data.js
@@ -1,24 +1,25 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
- area: () =>
- request({
- url: '/app-api/system/area/tree',
- method: 'GET',
- }),
- // area: () =>
- // request({
- // url: 'data/area',
- // method: 'GET',
- // }),
- faq: () =>
- request({
- url: 'data/faq',
- method: 'GET',
- }),
- richtext: (id) =>
- request({
- url: 'data/richtext/' + id,
- method: 'GET',
- }),
-};
\ No newline at end of file
+ area: () =>
+ request2({
+ url: 'system/area/tree',
+ method: 'GET',
+ }),
+ // area: () =>
+ // request({
+ // url: 'data/area',
+ // method: 'GET',
+ // }),
+ faq: () =>
+ request({
+ url: 'data/faq',
+ method: 'GET',
+ }),
+ richtext: (id) =>
+ request({
+ url: 'data/richtext/' + id,
+ method: 'GET',
+ }),
+};
diff --git a/sheep/api/goods.js b/sheep/api/goods.js
index 44cf7149..61f422a6 100644
--- a/sheep/api/goods.js
+++ b/sheep/api/goods.js
@@ -1,84 +1,80 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
- // 商品详情
- detail: (id, params = {}) =>
- request({
- url: '/app-api/product/spu/get-detail?id=' + id,
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
+ // 商品详情
+ detail: (id, params = {}) =>
+ request2({
+ url: 'product/spu/get-detail?id=' + id,
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
- // 商品列表
- list: (params) =>
- request({
- url: '/app-api/product/spu/page',
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
+ // 商品列表
+ list: (params) =>
+ request2({
+ url: 'product/spu/page',
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
- // 商品查询
- ids: (params = {}) =>
- request({
- url: 'goods/goods/ids',
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
- // 商品评价列表
- comment: (id, params = {}) =>
- request({
- url: '/app-api/product/comment/list?spuId=' + id,
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
- // 商品评价类型
- getType: (id) =>
- request({
- url: 'goods/comment/getType/' + id,
- method: 'GET',
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
- // 活动商品查询
- // 商品查询
- activity: (params = {}) =>
- request({
- url: 'goods/goods/activity',
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- showError: false,
- },
- }),
- activityList: (params = {}) =>
- request({
- url: 'goods/goods/activityList',
- method: 'GET',
- params,
- }),
- // 检查是否收藏商品
- exits: (id) =>
- request({
- url: '/app-api/product/favorite/exits?spuId=' + id,
- method: 'GET',
- }),
-};
\ No newline at end of file
+ // 商品查询
+ ids: (params = {}) =>
+ request({
+ url: 'goods/goods/ids',
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
+
+ // 商品评价列表
+ comment: (id, params = {}) =>
+ request2({
+ url: 'product/comment/list?spuId=' + id,
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
+ // 商品评价类型
+ getType: (id) =>
+ request({
+ url: 'goods/comment/getType/' + id,
+ method: 'GET',
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
+ // 活动商品查询
+ // 商品查询
+ activity: (params = {}) =>
+ request({
+ url: 'goods/goods/activity',
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ showError: false,
+ },
+ }),
+ activityList: (params = {}) =>
+ request({
+ url: 'goods/goods/activityList',
+ method: 'GET',
+ params,
+ }),
+};
diff --git a/sheep/api/index2.js b/sheep/api/index2.js
index 7f6a12ef..1c068bf8 100644
--- a/sheep/api/index2.js
+++ b/sheep/api/index2.js
@@ -1,14 +1,14 @@
-import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
- decorate: () =>
- request({
- url: '/app-api/promotion/decorate/list?page=1',
- method: 'GET',
- }),
- spids: () =>
- request({
- url: '/app-api/product/spu/page?recommendType=best&pageNo=1&pageSize=10',
- method: 'GET',
- }),
-};
\ No newline at end of file
+ decorate: () =>
+ request2({
+ url: 'promotion/decorate/list?page=1',
+ method: 'GET',
+ }),
+ spids: () =>
+ request2({
+ url: 'product/spu/page?recommendType=best&pageNo=1&pageSize=10',
+ method: 'GET',
+ }),
+};
diff --git a/sheep/api/order.js b/sheep/api/order.js
index e3ce1546..8fb48cad 100644
--- a/sheep/api/order.js
+++ b/sheep/api/order.js
@@ -1,10 +1,11 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
export default {
// 订单详情
detail: (id, params) =>
- request({
- url: '/app-api/trade/order/get-detail?id=' + id,
+ request2({
+ url: 'trade/order/get-detail?id=' + id,
method: 'GET',
params,
}),
@@ -37,7 +38,16 @@ export default {
showLoading: false,
},
}),
-
+ // 订单列表
+ list: (params) =>
+ request2({
+ url: 'trade/order/page',
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ },
+ }),
// list: (params) =>
// request({
// url: 'order/order',
@@ -55,27 +65,27 @@ export default {
// 解决 SpringMVC 接受 List- 参数的问题
delete data2.items
for (let i = 0; i < data.items.length; i++) {
- // 此处转码问题,待解决方案
- data2[encodeURIComponent('items[' + i + '' + '].skuId')] = data.items[i].skuId + '';
- data2[encodeURIComponent('items[' + i + '' + '].count')] = data.items[i].count + '';
- data2[encodeURIComponent('items[' + i + '' + '].cartId')] = data.items[i].cartId + '';
-
- // data2['items' + `[${i}]` + '.skuId'] = data.items[i].skuId + '';
- // data2['items' + `[${i}]` + '.count'] = data.items[i].count + '';
- // data2['items' + `[${i}]` + '.cartId'] = data.items[i].cartId + '';
-
- // data2['items' + `%5B${i}%5D` + '.skuId'] = data.items[i].skuId + '';
- // data2['items' + `%5B${i}%5D` + '.count'] = data.items[i].count + '';
- // data2['items' + `%5B${i}%5D` + '.cartId'] = data.items[i].cartId + '';
+ // data2['items[' + i + '' + '].skuId'] = data.items[i].skuId + '';
+ // data2['items[' + i + '' + '].count'] = data.items[i].count + '';
+ // data2['items[' + i + '' + '].cartId'] = data.items[i].cartId + '';
+ data2['items' + `%5B${i}%5D` + '.skuId'] = data.items[i].skuId + '';
+ data2['items' + `%5B${i}%5D` + '.count'] = data.items[i].count + '';
+ data2['items' + `%5B${i}%5D` + '.cartId'] = data.items[i].cartId + '';
}
- console.log(data2, '手动转码的参数')
- return request({
- url: '/app-api/trade/order/settlement',
+ console.log(data2, '对比数据')
+ return request2({
+ url: 'trade/order/settlement',
method: 'GET',
- // data: data2,
+ // data,
params: data2
})
},
+ // calc: (data) =>
+ // request({
+ // url: 'order/order/calc',
+ // method: 'POST',
+ // data,
+ // }),
// 创建订单
create: (data) =>
request({
@@ -98,8 +108,8 @@ export default {
}),
// 评价订单
comment: (data) =>
- request({
- url: '/app-api/trade/order/item/create-comment',
+ request2({
+ url: 'trade/order/item/create-comment',
method: 'POST',
data,
}),
@@ -129,15 +139,31 @@ export default {
}),
// 售后
aftersale: {
- list: (params) =>
+ // 申请售后
+ apply: (data) =>
request({
- url: '/app-api/trade/after-sale/page',
+ url: 'order/aftersale',
+ method: 'POST',
+ data,
+ }),
+ list: (params) =>
+ request2({
+ url: 'trade/after-sale/page',
method: 'GET',
params,
custom: {
showLoading: false,
},
}),
+ // list: (params) =>
+ // request({
+ // url: 'order/aftersale',
+ // method: 'GET',
+ // params,
+ // custom: {
+ // showLoading: false,
+ // },
+ // }),
//取消售后
cancel: (id) =>
request({
@@ -150,10 +176,10 @@ export default {
url: 'order/aftersale/' + id,
method: 'DELETE',
}),
- // 售后详情 DONE
+ // 售后详情
detail: (id) =>
- request({
- url: '/app-api/trade/after-sale/get?id=' + id,
+ request2({
+ url: 'trade/after-sale/get?id=' + id,
method: 'GET',
}),
},
diff --git a/sheep/api/pay/channel.js b/sheep/api/pay/channel.js
deleted file mode 100644
index 20a8c28f..00000000
--- a/sheep/api/pay/channel.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import request from '@/sheep/request';
-
-const PayChannelApi = {
- // 获得指定应用的开启的支付渠道编码列表
- getEnableChannelCodeList: (appId) => {
- return request({
- url: '/app-api/pay/channel/get-enable-code-list',
- method: 'GET',
- params: { appId }
- });
- },
-};
-
-export default PayChannelApi;
diff --git a/sheep/api/pay/order.js b/sheep/api/pay/order.js
deleted file mode 100644
index f1935293..00000000
--- a/sheep/api/pay/order.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import request from '@/sheep/request';
-
-const PayOrderApi = {
- // 获得支付订单
- getOrder: (id) => {
- return request({
- url: '/app-api/pay/order/get',
- method: 'GET',
- params: { id }
- });
- },
- // 提交支付订单
- submitOrder: (data) => {
- return request({
- url: '/app-api/pay/order/submit',
- method: 'POST',
- data
- });
- }
-};
-
-export default PayOrderApi;
diff --git a/sheep/api/product/comment.js b/sheep/api/product/comment.js
index 35d0d175..01ce25c2 100644
--- a/sheep/api/product/comment.js
+++ b/sheep/api/product/comment.js
@@ -1,19 +1,18 @@
import request from '@/sheep/request';
const CommentApi = {
-
- // 获得商品评价分页
- getCommentPage: (spuId, pageNo, pageSize, type) => {
- return request({
- url: '/app-api/product/comment/page',
- method: 'GET',
- params: {
- spuId,
- pageNo,
- pageSize,
- type
- },
- });
- },
+ // 获得商品评价分页
+ getCommentPage: (spuId, pageNo, pageSize, type) => {
+ return request({
+ url: '/app-api/product/comment/page',
+ method: 'GET',
+ params: {
+ spuId,
+ pageNo,
+ pageSize,
+ type
+ },
+ });
+ },
};
-export default CommentApi;
\ No newline at end of file
+export default CommentApi;
diff --git a/sheep/api/promotion/activity.js b/sheep/api/promotion/activity.js
index b77b5bc2..efa0e1e9 100644
--- a/sheep/api/promotion/activity.js
+++ b/sheep/api/promotion/activity.js
@@ -1,16 +1,16 @@
-import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
const ActivityApi = {
- // 获得单个商品,近期参与的每个活动
- getActivityListBySpuId: (spuId) => {
- return request({
- url: '/app-api/promotion/activity/list-by-spu-id',
- method: 'GET',
- params: {
- spuId,
- },
- });
- },
+ // 获得单个商品,近期参与的每个活动
+ getActivityListBySpuId: (spuId) => {
+ return request2({
+ url: '/app-api/promotion/activity/list-by-spu-id',
+ method: 'GET',
+ params: {
+ spuId,
+ },
+ });
+ },
};
export default ActivityApi;
diff --git a/sheep/api/promotion/combination.js b/sheep/api/promotion/combination.js
index 5d09373e..eeeb9a0a 100644
--- a/sheep/api/promotion/combination.js
+++ b/sheep/api/promotion/combination.js
@@ -1,69 +1,67 @@
-import request from "@/sheep/request";
+import request2 from "@/sheep/request2";
// 拼团 API
const CombinationApi = {
- // 获得拼团活动列表
- getCombinationActivityList: (count) => {
- return request({
- url: "/app-api/promotion/combination-activity/list",
- method: 'GET',
- params: {
- count
- }
- });
- },
+ // 获得拼团活动列表
+ getCombinationActivityList: (count) => {
+ return request2({
+ url: "promotion/combination-activity/list",
+ method: 'GET',
+ params: {count}
+ });
+ },
- // 获得拼团活动分页
- getCombinationActivityPage: (params) => {
- return request({
- url: "/app-api/promotion/combination-activity/page",
- method: 'GET',
- params
- });
- },
+ // 获得拼团活动分页
+ getCombinationActivityPage: (params) => {
+ return request2({
+ url: "promotion/combination-activity/page",
+ method: 'GET',
+ params
+ });
+ },
- // 获得拼团活动明细
- getCombinationActivity: (id) => {
- return request({
- url: "/app-api/promotion/combination-activity/get-detail",
- method: 'GET',
- params: {
- id
- }
- });
- },
+ // 获得拼团活动明细
+ getCombinationActivity: (id) => {
+ return request2({
+ url: "promotion/combination-activity/get-detail",
+ method: 'GET',
+ params: {
+ id
+ }
+ });
+ },
- // 获得最近 n 条拼团记录(团长发起的)
- getHeadCombinationRecordList: (activityId, status, count) => {
- return request({
- url: "/app-api/promotion/combination-record/get-head-list",
- method: 'GET',
- params: {
- activityId,
- status,
- count
- }
- });
- },
+ // 获得最近 n 条拼团记录(团长发起的)
+ getHeadCombinationRecordList: (activityId, status, count) => {
+ return request2({
+ url: "promotion/combination-record/get-head-list",
+ method: 'GET',
+ params: {
+ activityId,
+ status,
+ count
+ }
+ });
+ },
- // 获得拼团记录明细
- getCombinationRecordDetail: (id) => {
- return request({
- url: "/app-api/promotion/combination-record/get-detail",
- method: 'GET',
- params: {
- id
- }
- });
- },
+ // 获得拼团记录明细
+ getCombinationRecordDetail: (id) => {
+ return request2({
+ url: "promotion/combination-record/get-detail",
+ method: 'GET',
+ params: {
+ id
+ }
+ });
+ },
- // 获得拼团记录的概要信息
- getCombinationRecordSummary: () => {
- return request({
- url: "/app-api/promotion/combination-record/get-summary",
- method: 'GET',
- });
- }
+ // 获得拼团记录的概要信息
+ getCombinationRecordSummary: () => {
+ return request2({
+ url: "promotion/combination-record/get-summary",
+ method: 'GET',
+ });
+ }
}
-export default CombinationApi
\ No newline at end of file
+export default CombinationApi
diff --git a/sheep/api/promotion/coupon.js b/sheep/api/promotion/coupon.js
index feeb0caa..9bdbb19e 100644
--- a/sheep/api/promotion/coupon.js
+++ b/sheep/api/promotion/coupon.js
@@ -17,17 +17,4 @@ export default {
params: { spuId, productScope, count },
});
},
- // 获得匹配指定商品的优惠劵列表
- getMatchCouponList: (price, spuIds, skuIds, categoryIds) => {
- return request({
- url: '/app-api/promotion/coupon/match-list',
- method: 'GET',
- params: {
- price,
- spuIds: spuIds.join(','),
- skuIds: skuIds.join(','),
- categoryIds: categoryIds.join(','),
- },
- });
- }
};
diff --git a/sheep/api/promotion/seckill.js b/sheep/api/promotion/seckill.js
index d16a0f79..ecbb4c1f 100644
--- a/sheep/api/promotion/seckill.js
+++ b/sheep/api/promotion/seckill.js
@@ -1,44 +1,33 @@
-import request from "@/sheep/request";
+import request2 from "@/sheep/request2";
const SeckillApi = {
- // 获得秒杀时间段列表
- getSeckillConfigList: () => {
- return request({
- url: '/app-api/promotion/seckill-config/list',
- method: 'GET'
- });
- },
+ // 获得秒杀时间段列表
+ getSeckillConfigList: () => {
+ return request2({ url: 'promotion/seckill-config/list', method: 'GET' });
+ },
- // 获得当前秒杀活动
- getNowSeckillActivity: () => {
- return request({
- url: '/app-api/promotion/seckill-activity/get-now',
- method: 'GET'
- });
- },
+ // 获得当前秒杀活动
+ getNowSeckillActivity: () => {
+ return request2({ url: 'promotion/seckill-activity/get-now', method: 'GET' });
+ },
- // 获得秒杀活动分页
- getSeckillActivityPage: () => {
- return request({
- url: '/app-api/promotion/seckill-activity/page',
- method: 'GET'
- });
- },
+ // 获得秒杀活动分页
+ getSeckillActivityPage: () => {
+ return request2({ url: 'promotion/seckill-activity/page', method: 'GET' });
+ },
- /**
- * 获得秒杀活动明细
- * @param {number} id 秒杀活动编号
- * @return {*}
- */
- getSeckillActivity: (id) => {
- return request({
- url: '/app-api/promotion/seckill-activity/get-detail',
- method: 'GET',
- params: {
- id
- }
- });
- }
+ /**
+ * 获得秒杀活动明细
+ * @param {number} id 秒杀活动编号
+ * @return {*}
+ */
+ getSeckillActivity: (id) => {
+ return request2({
+ url: 'promotion/seckill-activity/get-detail',
+ method: 'GET',
+ params: { id }
+ });
+ }
}
-export default SeckillApi;
\ No newline at end of file
+export default SeckillApi;
diff --git a/sheep/api/trade.js b/sheep/api/trade.js
index af9c335d..5abf1487 100644
--- a/sheep/api/trade.js
+++ b/sheep/api/trade.js
@@ -1,37 +1,46 @@
import request from '@/sheep/request';
export default {
- order: (id) =>
- request({
- url: 'trade/order/' + id,
- method: 'GET',
- custom: {
- showLoading: false,
- },
- }),
- orderLog: (params) =>
- request({
- url: 'trade/order',
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- },
- }),
+ order: (id) =>
+ request({
+ url: 'trade/order/' + id,
+ method: 'GET',
+ custom: {
+ showLoading: false,
+ },
+ }),
+ orderLog: (params) =>
+ request({
+ url: 'trade/order',
+ method: 'GET',
+ params,
+ custom: {
+ showLoading: false,
+ },
+ }),
- rechargeRules: () =>
- request({
- url: 'trade/order/rechargeRules',
- method: 'GET',
- custom: {
- showError: false,
- showLoading: false,
- },
- }),
- recharge: (data) =>
- request({
- url: 'trade/order/recharge',
- method: 'POST',
- data,
- }),
-};
+ rechargeRules: () =>
+ request({
+ url: 'trade/order/rechargeRules',
+ method: 'GET',
+ custom: {
+ showError: false,
+ showLoading: false,
+ },
+ }),
+ rechargeRules2: () =>
+ request({
+ url: '/app-api/pay/wallet-recharge-package/list',
+ method: 'GET',
+ custom: {
+ showError: false,
+ showLoading: false,
+ },
+ }),
+ recharge: (data) =>
+ request({
+ url: '/app-api/pay/wallet-recharge/create',
+ method: 'POST',
+ data,
+ }),
+};
\ No newline at end of file
diff --git a/sheep/api/trade/cart.js b/sheep/api/trade/cart.js
deleted file mode 100644
index f6a0104a..00000000
--- a/sheep/api/trade/cart.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import request2 from '@/sheep/request2';
-
-const CartApi = {
- addCart: (data) => {
- return request2({
- url: '/app-api/trade/cart/add',
- method: 'POST',
- data: data,
- // TODO 芋艿:这里没提示
- custom: {
- showSuccess: true,
- successMsg: '已添加到购物车~',
- }
- });
- },
- updateCartCount: (data) => {
- return request2({
- url: '/app-api/trade/cart/update-count',
- method: 'PUT',
- data: data
- });
- },
- updateCartSelected: (data) => {
- return request2({
- url: '/app-api/trade/cart/update-selected',
- method: 'PUT',
- data: data
- });
- },
- deleteCart: (ids) => {
- return request2({
- url: '/app-api/trade/cart/delete',
- method: 'DELETE',
- params: {
- ids
- }
- });
- },
- getCartList: () => {
- return request2({
- url: '/app-api/trade/cart/list',
- method: 'GET',
- });
- },
-};
-
-export default CartApi;
\ No newline at end of file
diff --git a/sheep/api/trade/order.js b/sheep/api/trade/order.js
deleted file mode 100644
index 96e4b707..00000000
--- a/sheep/api/trade/order.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import request2 from '@/sheep/request2';
-import request from '@/sheep/request';
-
-const OrderApi = {
- // 计算订单信息
- settlementOrder: (data) => {
- const data2 = {
- ...data,
- };
- // 移除多余字段
- if (!(data.couponId > 0)) {
- delete data2.couponId;
- }
- if (!(data.addressId > 0)) {
- delete data2.addressId;
- }
- // 解决 SpringMVC 接受 List
- 参数的问题
- delete data2.items;
- for (let i = 0; i < data.items.length; i++) {
- data2[encodeURIComponent('items[' + i + '' + '].skuId')] = data.items[i].skuId + '';
- data2[encodeURIComponent('items[' + i + '' + '].count')] = data.items[i].count + '';
- if (data.items[i].cartId) {
- data2[encodeURIComponent('items[' + i + '' + '].cartId')] = data.items[i].cartId + '';
- }
- }
- const queryString = Object.keys(data2)
- .map((key) => key + '=' + data2[key])
- .join('&');
- return request2({
- url: `trade/order/settlement?${queryString}`,
- method: 'GET',
- });
- },
- // 创建订单
- createOrder: (data) => {
- return request2({
- url: `trade/order/create`,
- method: 'POST',
- data,
- });
- },
- // 获得订单
- getOrder: (id) => {
- return request2({
- url: `trade/order/get-detail`,
- method: 'GET',
- params: {
- id,
- },
- });
- },
- // 订单列表
- getOrderPage: (params) => {
- return request({
- url: '/app-api/trade/order/page',
- method: 'GET',
- params,
- custom: {
- showLoading: false,
- },
- });
- },
- // 确认收货
- receiveOrder: (id) => {
- return request2({
- url: `/app-api/trade/order/receive`,
- method: 'PUT',
- params: {
- id,
- },
- });
- },
- // 获得交易订单的物流轨迹
- getOrderExpressTrackList: (id) => {
- return request2({
- url: `/app-api/trade/order/get-express-track-list`,
- method: 'GET',
- params: {
- id,
- },
- });
- }
-};
-
-export default OrderApi;
diff --git a/sheep/api/user.js b/sheep/api/user.js
index 10efc5aa..fb3e809c 100644
--- a/sheep/api/user.js
+++ b/sheep/api/user.js
@@ -1,10 +1,11 @@
import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
import $platform from '@/sheep/platform';
export default {
getUnused: () =>
- request({
- url: '/app-api/promotion/coupon/get-unused-count',
+ request2({
+ url: 'promotion/coupon/get-unused-count',
method: 'GET',
custom: {
showLoading: false,
@@ -12,8 +13,8 @@ export default {
},
}),
profile: () =>
- request({
- url: '/app-api/member/user/get',
+ request2({
+ url: 'member/user/get',
method: 'GET',
custom: {
showLoading: false,
@@ -21,7 +22,7 @@ export default {
},
}),
balance: () =>
- request({
+ request2({
url: '/app-api/pay/wallet/get',
method: 'GET',
custom: {
@@ -29,9 +30,28 @@ export default {
auth: true,
},
}),
+ // profile: () =>
+ // request({
+ // url: '/user/api/user/profile',
+ // method: 'GET',
+ // custom: {
+ // showLoading: false,
+ // auth: true,
+ // },
+ // }),
+ // update: (data) =>
+ // request({
+ // url: '/user/api/user/update',
+ // method: 'POST',
+ // custom: {
+ // showSuccess: true,
+ // auth: true,
+ // },
+ // data,
+ // }),
update: (data) =>
- request({
- url: '/app-api/member/user/update',
+ request2({
+ url: 'member/user/update',
method: 'PUT',
custom: {
showSuccess: true,
@@ -176,48 +196,90 @@ export default {
}),
address: {
+ // default: () =>
+ // request({
+ // url: 'user/address/default',
+ // method: 'GET',
+ // custom: {
+ // showError: false,
+ // },
+ // }),
default: () =>
- request({
- url: '/app-api/member/address/get-default',
+ request2({
+ url: 'member/address/get-default',
method: 'GET',
custom: {
showError: false,
},
}),
list: () =>
- request({
- url: '/app-api/member/address/list',
+ request2({
+ url: 'member/address/list',
method: 'GET',
custom: {},
}),
+ // list: () =>
+ // request({
+ // url: 'user/address',
+ // method: 'GET',
+ // custom: {},
+ // }),
create: (data) =>
- request({
- url: '/app-api/member/address/create',
+ request2({
+ url: 'member/address/create',
method: 'POST',
data,
custom: {
showSuccess: true,
},
}),
+ // create: (data) =>
+ // request({
+ // url: 'user/address',
+ // method: 'POST',
+ // data,
+ // custom: {
+ // showSuccess: true,
+ // },
+ // }),
update: (data) =>
- request({
- url: '/app-api/member/address/update',
+ request2({
+ url: 'member/address/update',
method: 'PUT',
data,
custom: {
showSuccess: true,
},
}),
+ // update: (id, data) =>
+ // request({
+ // url: 'user/address/' + id,
+ // method: 'PUT',
+ // data,
+ // custom: {
+ // showSuccess: true,
+ // },
+ // }),
detail: (id) =>
- request({
- url: '/app-api/member/address/get?id=' + id,
+ request2({
+ url: 'member/address/get?id=' + id,
method: 'GET',
}),
+ // detail: (id) =>
+ // request({
+ // url: 'user/address/' + id,
+ // method: 'GET',
+ // }),
delete: (id) =>
- request({
- url: '/app-api/member/address/delete?id=' + id,
+ request2({
+ url: 'member/address/delete?id=' + id,
method: 'DELETE',
}),
+ // delete: (id) =>
+ // request({
+ // url: 'user/address/' + id,
+ // method: 'DELETE',
+ // }),
},
invoice: {
list: () =>
@@ -257,29 +319,17 @@ export default {
},
favorite: {
list: (params) =>
- request({
- url: '/app-api/product/favorite/page',
+ request2({
+ url: 'product/favorite/page',
method: 'GET',
params,
}),
do: (id) =>
request({
- url: '/app-api/product/favorite/create',
+ url: 'user/goodsLog/favorite',
method: 'POST',
data: {
- spuId: id,
- },
- custom: {
- showSuccess: true,
- auth: true,
- },
- }),
- dos: (id) =>
- request({
- url: '/app-api/product/favorite/delete',
- method: 'DELETE',
- data: {
- spuId: id,
+ goods_id: id,
},
custom: {
showSuccess: true,
@@ -288,8 +338,8 @@ export default {
}),
// 取消收藏
cancel: (id) =>
- request({
- url: '/app-api/product/favorite/delete-list',
+ request2({
+ url: 'product/favorite/delete-list',
method: 'DELETE',
data: {
spuIds: id.split(',').map(item => item * 1),
@@ -300,6 +350,18 @@ export default {
auth: true,
},
}),
+ // cancel: (id) =>
+ // request({
+ // url: 'user/goodsLog/favorite',
+ // method: 'POST',
+ // data: {
+ // goods_ids: id,
+ // },
+ // custom: {
+ // showSuccess: true,
+ // auth: true,
+ // },
+ // }),
},
view: {
list: (params) =>
@@ -321,21 +383,28 @@ export default {
},
wallet: {
log: (params) =>
- request({
+ request2({
// url: 'member/point/record/page',
- url: '/app-api/pay/wallet-transaction/page',
+ url: 'pay/wallet-transaction/page',
method: 'GET',
params,
custom: {},
}),
log2: (params) =>
- request({
- url: '/app-api/member/point/record/page',
+ request2({
+ url: 'member/point/record/page',
// url: 'pay/wallet-transaction/page',
method: 'GET',
params,
custom: {},
}),
+ // log: (params) =>
+ // request({
+ // url: '/user/api/walletLog',
+ // method: 'GET',
+ // params,
+ // custom: {},
+ // }),
},
account: {
info: (params) =>
@@ -360,9 +429,18 @@ export default {
}),
},
//数量接口
+ // data: () =>
+ // request({
+ // url: 'user/user/data',
+ // method: 'GET',
+ // custom: {
+ // showLoading: false,
+ // auth: true,
+ // },
+ // }),
data: () =>
- request({
- url: '/app-api/trade/order/get-count',
+ request2({
+ url: 'trade/order/get-count',
method: 'GET',
custom: {
showLoading: false,
@@ -370,8 +448,8 @@ export default {
},
}),
data2: () =>
- request({
- url: '/app-api/trade/after-sale/get-applying-count',
+ request2({
+ url: 'trade/after-sale/get-applying-count',
method: 'GET',
custom: {
showLoading: false,
diff --git a/sheep/components/s-coupon-get/s-coupon-get.vue b/sheep/components/s-coupon-get/s-coupon-get.vue
index 7a346a8c..bfa9b9bb 100644
--- a/sheep/components/s-coupon-get/s-coupon-get.vue
+++ b/sheep/components/s-coupon-get/s-coupon-get.vue
@@ -1,104 +1,108 @@
-
-
- 优惠券
-
- 可使用优惠券
-
-
-
-
+
+ 优惠券
+
+ 可使用优惠券
+
+
+
+
-
-
- {{ item.get_status_text }}
-
-
-
-
-
-
-
+ "
+ @click.stop="getBuy(item.id)"
+ :disabled="item.get_status != 'can_get' && item.get_status != 'can_use'"
+ >
+ {{ item.get_status_text }}
+
+
+
+
+
+
+
\ No newline at end of file
+ .model-box {
+ height: 60vh;
+ .title {
+ font-size: 36rpx;
+ height: 80rpx;
+ font-weight: bold;
+ color: #333333;
+ }
+ .subtitle {
+ font-size: 26rpx;
+ font-weight: 500;
+ color: #333333;
+ }
+ }
+ .model-content {
+ height: 54vh;
+ }
+ .modal-footer {
+ width: 100%;
+ height: 120rpx;
+ background: #fff;
+ }
+ .confirm-btn {
+ width: 710rpx;
+ margin-left: 20rpx;
+ height: 80rpx;
+ background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+ border-radius: 40rpx;
+ color: #fff;
+ }
+ // 优惠券按钮
+ .card-btn {
+ // width: 144rpx;
+ padding: 0 16rpx;
+ height: 50rpx;
+ border-radius: 40rpx;
+ background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+ color: #ffffff;
+ font-size: 24rpx;
+ font-weight: 400;
+ }
+ .boder-btn {
+ background: linear-gradient(90deg, var(--ui-BG-Main-opacity-4), var(--ui-BG-Main-light));
+ color: #fff !important;
+ }
+
diff --git a/sheep/components/s-coupon-list/s-coupon-list.vue b/sheep/components/s-coupon-list/s-coupon-list.vue
index 35ba9563..648b32da 100644
--- a/sheep/components/s-coupon-list/s-coupon-list.vue
+++ b/sheep/components/s-coupon-list/s-coupon-list.vue
@@ -1,9 +1,13 @@
- {{ data.type_text }}
+ "
+ >{{ data.type_text }} -->
可使用优惠券
-
+
-
+ .share-title {
+ font-size: 24rpx;
+ color: $dark-6;
+ }
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/sheep/platform/pay.js b/sheep/platform/pay.js
index a23dcc61..29120038 100644
--- a/sheep/platform/pay.js
+++ b/sheep/platform/pay.js
@@ -3,20 +3,19 @@ import sheep from '@/sheep';
import $wxsdk from '@/sheep/libs/sdk-h5-weixin';
// #endif
import { getRootUrl } from '@/sheep/helper';
-import PayOrderApi from '@/sheep/api/pay/order';
/**
* 支付
*
* @param {String} payment = ['wechat','alipay','wallet','offline'] - 支付方式
* @param {String} orderType = ['goods','recharge','groupon'] - 订单类型
- * @param {String} id - 订单号
+ * @param {String} orderSN - 订单号
*/
export default class SheepPay {
- constructor(payment, orderType, id) {
+ constructor(payment, orderType, orderSN) {
this.payment = payment;
- this.id = id;
+ this.orderSN = orderSN;
this.orderType = orderType;
this.payAction();
}
@@ -30,8 +29,8 @@ export default class SheepPay {
alipay: () => {
this.redirectPay(); // 现在公众号可以直接跳转支付宝页面
},
- wallet: () => {
- this.walletPay();
+ money: () => {
+ this.moneyPay();
},
offline: () => {
this.offlinePay();
@@ -44,8 +43,8 @@ export default class SheepPay {
alipay: () => {
this.copyPayLink();
},
- wallet: () => {
- this.walletPay();
+ money: () => {
+ this.moneyPay();
},
offline: () => {
this.offlinePay();
@@ -58,8 +57,8 @@ export default class SheepPay {
alipay: () => {
this.alipay();
},
- wallet: () => {
- this.walletPay();
+ money: () => {
+ this.moneyPay();
},
offline: () => {
this.offlinePay();
@@ -72,8 +71,8 @@ export default class SheepPay {
alipay: () => {
this.redirectPay();
},
- wallet: () => {
- this.walletPay();
+ money: () => {
+ this.moneyPay();
},
offline: () => {
this.offlinePay();
@@ -84,21 +83,18 @@ export default class SheepPay {
}
// 预支付
- prepay(channel) {
+ prepay() {
return new Promise((resolve, reject) => {
let data = {
- id: this.id,
- channelCode: channel,
- channelExtras: {}
+ order_sn: this.orderSN,
+ payment: this.payment,
};
if (uni.getStorageSync('openid')) {
data.openid = uni.getStorageSync('openid');
}
- PayOrderApi.submitOrder(data).then((res) => {
- // 成功时
- res.code === 0 && resolve(res);
- // 失败时
- if (res.code !== 0 && res.msg === 'miss_openid') {
+ sheep.$api.pay.prepay(data).then((res) => {
+ res.error === 0 && resolve(res);
+ if (res.error === -1 && res.msg === 'miss_openid') {
uni.showModal({
title: '微信支付',
content: '请先绑定微信再使用微信支付',
@@ -113,7 +109,7 @@ export default class SheepPay {
});
}
// #ifdef H5
- // 微信公众号JSSDK支付 TODO 芋艿:待接入
+ // 微信公众号JSSDK支付
async wechatOfficialAccountPay() {
let that = this;
let { error, data, msg } = await this.prepay();
@@ -134,21 +130,21 @@ export default class SheepPay {
});
}
- //浏览器微信H5支付 TODO 芋艿:待接入
+ //浏览器微信H5支付
async wechatWapPay() {
const { error, data } = await this.prepay();
if (error === 0) {
- const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment
+ const redirect_url = `${getRootUrl()}pages/pay/result?orderSN=${this.orderSN}&payment=${this.payment
}&orderType=${this.orderType}`;
location.href = `${data.pay_data.h5_url}&redirect_url=${encodeURIComponent(redirect_url)}`;
}
}
- // 支付链接 TODO 芋艿:待接入
+ // 支付链接
async redirectPay() {
let { error, data } = await this.prepay();
if (error === 0) {
- const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment
+ const redirect_url = `${getRootUrl()}pages/pay/result?orderSN=${this.orderSN}&payment=${this.payment
}&orderType=${this.orderType}`;
location.href = data.pay_data + encodeURIComponent(redirect_url);
}
@@ -156,7 +152,7 @@ export default class SheepPay {
// #endif
- // 微信小程序支付 TODO 芋艿:待接入
+ // 微信小程序支付
async wechatMiniProgramPay() {
let that = this;
let result = await this.prepay();
@@ -177,18 +173,18 @@ export default class SheepPay {
}
// 余额支付
- async walletPay() {
- const { code } = await this.prepay('wallet');
- code === 0 && this.payResult('success');
+ async moneyPay() {
+ const { error } = await this.prepay();
+ error === 0 && this.payResult('success');
}
- // 货到付款 TODO 芋艿:待接入
+ // 货到付款
async offlinePay() {
const { error } = await this.prepay();
error === 0 && this.payResult('success');
}
- // 支付宝复制链接支付 TODO 芋艿:待接入
+ // 支付宝复制链接支付
async copyPayLink() {
let that = this;
let { error, data } = await this.prepay();
@@ -207,7 +203,7 @@ export default class SheepPay {
}
}
- // 支付宝支付 TODO 芋艿:待接入
+ // 支付宝支付
async alipay() {
let that = this;
const { error, data } = await this.prepay();
@@ -229,7 +225,7 @@ export default class SheepPay {
}
}
- // 微信支付 TODO 芋艿:待接入
+ // 微信支付
async wechatAppPay() {
let that = this;
let { error, data } = await this.prepay();
@@ -250,72 +246,10 @@ export default class SheepPay {
// 支付结果跳转,success:成功,fail:失败
payResult(resultType) {
sheep.$router.redirect('/pages/pay/result', {
- id: this.id,
+ orderSN: this.orderSN,
+ payment: this.payment, //重新支付的时候使用
+ payState: resultType,
orderType: this.orderType,
- payState: resultType
});
}
}
-
-export function getPayMethods(channels) {
- const payMethods = [
- {
- icon: '/static/img/shop/pay/wechat.png',
- title: '微信支付',
- value: 'wechat',
- disabled: true,
- },
- {
- icon: '/static/img/shop/pay/alipay.png',
- title: '支付宝支付',
- value: 'alipay',
- disabled: true,
- },
- {
- icon: '/static/img/shop/pay/wallet.png',
- title: '余额支付',
- value: 'wallet',
- disabled: true,
- },
- {
- icon: '/static/img/shop/pay/apple.png',
- title: 'Apple Pay',
- value: 'apple',
- disabled: true,
- },
- {
- icon: '/static/img/shop/pay/wallet.png',
- title: '模拟支付',
- value: 'mock',
- disabled: true,
- }
- ];
- const platform = sheep.$platform.name
-
- // 1. 处理【微信支付】
- const wechatMethod = payMethods[0];
- if ((platform === 'WechatOfficialAccount' && channels.includes('wx_pub'))
- || platform === 'WechatMiniProgram' && channels.includes('wx_lite')
- || platform === 'App' && channels.includes('wx_app')) {
- wechatMethod.disabled = false;
- }
- // 2. 处理【支付宝支付】
- const alipayMethod = payMethods[1];
- if ((platform === 'WechatOfficialAccount' && channels.includes('alipay_wap'))
- || platform === 'WechatMiniProgram' && channels.includes('alipay_wap')
- || platform === 'App' && channels.includes('alipay_app')) {
- alipayMethod.disabled = false;
- }
- // 3. 处理【余额支付】
- const walletMethod = payMethods[2];
- if (channels.includes('wallet')) {
- walletMethod.disabled = false;
- }
- // 4. 处理【苹果支付】TODO 芋艿:未来接入
- // 5. 处理【模拟支付】
- const mockMethod = payMethods[4];
- if (channels.includes('mock')) {
- mockMethod.disabled = false;
- }
- return payMethods;
-}
\ No newline at end of file
diff --git a/sheep/request2/index.js b/sheep/request2/index.js
index a525e9a9..545cc012 100644
--- a/sheep/request2/index.js
+++ b/sheep/request2/index.js
@@ -55,8 +55,7 @@ const http = new Request({
method: 'GET',
header: {
Accept: 'text/json',
- 'Content-Type': 'application/json',
- // ;charset=UTF-8
+ 'Content-Type': 'application/json;charset=UTF-8',
platform: $platform.name,
},
// #ifdef APP-PLUS
@@ -99,7 +98,6 @@ http.interceptors.request.use(
config.header['terminal'] = '20';
config.header['Authorization'] = 'Bearer test247';
}
- // console.log(config, '看参数')
return config;
},
(error) => {
diff --git a/sheep/store/app.js b/sheep/store/app.js
index f2486bac..28598e3d 100644
--- a/sheep/store/app.js
+++ b/sheep/store/app.js
@@ -23,8 +23,8 @@ const app = defineStore({
copytime: '', // 版权信息 II
},
platform: {
- payment: [], // 支持的支付方式 TODO 芋艿:可删除
- recharge_payment: [], // 支持的充值支付方式 TODO 芋艿:可删除
+ payment: [], // 支持的支付方式
+ recharge_payment: [], // 支持的充值支付方式
share: {
methods: [], // 支持的分享方式
forwardInfo: {}, // 默认转发信息
diff --git a/sheep/store/cart.js b/sheep/store/cart.js
index 5c7b408c..8e076343 100644
--- a/sheep/store/cart.js
+++ b/sheep/store/cart.js
@@ -1,93 +1,98 @@
import { defineStore } from 'pinia';
-import CartApi from '@/sheep/api/trade/cart';
+import cartApi from '@/sheep/api/cart';
const cart = defineStore({
id: 'cart',
state: () => ({
list: [], // 购物车列表
selectedIds: [], // 已选列表
- isAllSelected: false, // 是否全选
- totalPriceSelected: 0, // 选中项总金额
+ isAllSelected: false, //是否全选
+ cartSelectedTotalPrice: '0.00', // 选中项总金额
}),
+ getters: {
+ totalPriceSelected: (state) => {
+ let price = 0;
+ if (!state.selectedIds.length) return price.toFixed(2);
+ state.list.forEach((item) => {
+ price += state.selectedIds.includes(item.id)
+ ? Number(item.sku.price/100) * item.count
+ : 0;
+ });
+ return price.toFixed(2);
+ },
+ },
actions: {
// 获取购物车列表
async getList() {
- const { data, code } = await CartApi.getCartList();
+ const { data, code } = await cartApi.list();
if (code === 0) {
this.list = data.validList;
-
- // 计算各种关联属性
- this.selectedIds = [];
- this.isAllSelected = true;
- this.totalPriceSelected = 0;
- this.list.forEach((item) => {
- if (item.selected) {
- this.selectedIds.push(item.id);
- this.totalPriceSelected += item.count * item.sku.price;
- } else {
- this.isAllSelected = false;
- }
- });
}
},
-
// 添加购物车
async add(goodsInfo) {
- // 添加购物项
- const { code } = await CartApi.addCart({
- skuId: goodsInfo.id,
- count: goodsInfo.goods_num,
+ const { error } = await cartApi.append({
+ goods_id: goodsInfo.goods_id,
+ goods_num: goodsInfo.goods_num,
+ goods_sku_price_id: goodsInfo.id,
});
- // 刷新购物车列表
- if (code === 0) {
- await this.getList();
+ if (error === 0) {
+ this.getList();
}
},
// 更新购物车
async update(goodsInfo) {
- const { code } = await CartApi.updateCartCount({
+ const { error } = await cartApi.update({
id: goodsInfo.goods_id,
count: goodsInfo.goods_num,
+ goods_sku_price_id: goodsInfo.goods_sku_price_id,
});
- if (code === 0) {
- await this.getList();
+ if (error === 0) {
+ // this.getList();
}
},
// 移除购物车
async delete(ids) {
- const { code } = await CartApi.deleteCart(ids.join(','));
+ if (typeof ids === 'array') {
+ ids = ids.join(',');
+ }
+ const { code } = await cartApi.delete(ids);
if (code === 0) {
- await this.getList();
+ this.selectAll(false);
+ this.getList();
}
},
- // 单选购物车商品
- async selectSingle(goodsId) {
- const { code } = await CartApi.updateCartSelected({
- ids: [goodsId],
- selected: !this.selectedIds.includes(goodsId), // 取反
- });
- if (code === 0) {
- await this.getList();
+ // 选择购物车商品
+ selectSingle(goodsId) {
+ if (!this.selectedIds.includes(goodsId)) {
+ this.selectedIds.push(goodsId);
+ } else {
+ this.selectedIds.splice(this.selectedIds.indexOf(goodsId), 1);
}
+ this.isAllSelected = this.selectedIds.length === this.list.length;
},
- // 全选购物车商品
- async selectAll(flag) {
- const { code } = await CartApi.updateCartSelected({
- ids: this.list.map((item) => item.id),
- selected: flag
- });
- if (code === 0) {
- await this.getList();
+ // 全选
+ selectAll(flag) {
+ this.isAllSelected = flag;
+ if (!flag) {
+ this.selectedIds = [];
+ } else {
+ this.list.forEach((item) => {
+ this.selectedIds.push(item.id);
+ });
}
},
// 清空购物车
- async emptyList() {
- await this.delete(this.list.map((item) => item.id));
+ emptyList() {
+ this.list = [];
+ this.selectedIds = [];
+ this.isAllSelected = false;
+ this.cartSelectedTotalPrice = '0.00';
},
},
persist: {
@@ -100,4 +105,4 @@ const cart = defineStore({
},
});
-export default cart;
\ No newline at end of file
+export default cart;
diff --git a/uni_modules/mp-html/components/mp-html/parser.js b/uni_modules/mp-html/components/mp-html/parser.js
index c74b1a64..cdbb1359 100644
--- a/uni_modules/mp-html/components/mp-html/parser.js
+++ b/uni_modules/mp-html/components/mp-html/parser.js
@@ -4,88 +4,82 @@
// 配置
const config = {
- // 信任的标签(保持标签名不变)
- trustTags: makeMap(
- 'a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'
- ),
+ // 信任的标签(保持标签名不变)
+ trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
- // 块级标签(转为 div,其他的非信任标签转为 span)
- blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+ // 块级标签(转为 div,其他的非信任标签转为 span)
+ blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
- // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
- // 行内标签
- inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),
- // #endif
+ // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+ // 行内标签
+ inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),
+ // #endif
- // 要移除的标签
- ignoreTags: makeMap(
- 'area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'
- ),
+ // 要移除的标签
+ ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),
- // 自闭合的标签
- voidTags: makeMap(
- 'area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'
- ),
+ // 自闭合的标签
+ voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
- // html 实体
- entities: {
- lt: '<',
- gt: '>',
- quot: '"',
- apos: "'",
- ensp: '\u2002',
- emsp: '\u2003',
- nbsp: '\xA0',
- semi: ';',
- ndash: '–',
- mdash: '—',
- middot: '·',
- lsquo: '‘',
- rsquo: '’',
- ldquo: '“',
- rdquo: '”',
- bull: '•',
- hellip: '…',
- larr: '←',
- uarr: '↑',
- rarr: '→',
- darr: '↓'
- },
+ // html 实体
+ entities: {
+ lt: '<',
+ gt: '>',
+ quot: '"',
+ apos: "'",
+ ensp: '\u2002',
+ emsp: '\u2003',
+ nbsp: '\xA0',
+ semi: ';',
+ ndash: '–',
+ mdash: '—',
+ middot: '·',
+ lsquo: '‘',
+ rsquo: '’',
+ ldquo: '“',
+ rdquo: '”',
+ bull: '•',
+ hellip: '…',
+ larr: '←',
+ uarr: '↑',
+ rarr: '→',
+ darr: '↓'
+ },
- // 默认的标签样式
- tagStyle: {
- // #ifndef APP-PLUS-NVUE
- address: 'font-style:italic',
- big: 'display:inline;font-size:1.2em',
- caption: 'display:table-caption;text-align:center',
- center: 'text-align:center',
- cite: 'font-style:italic',
- dd: 'margin-left:40px',
- mark: 'background-color:yellow',
- pre: 'font-family:monospace;white-space:pre',
- s: 'text-decoration:line-through',
- small: 'display:inline;font-size:0.8em',
- strike: 'text-decoration:line-through',
- u: 'text-decoration:underline'
- // #endif
- },
+ // 默认的标签样式
+ tagStyle: {
+ // #ifndef APP-PLUS-NVUE
+ address: 'font-style:italic',
+ big: 'display:inline;font-size:1.2em',
+ caption: 'display:table-caption;text-align:center',
+ center: 'text-align:center',
+ cite: 'font-style:italic',
+ dd: 'margin-left:40px',
+ mark: 'background-color:yellow',
+ pre: 'font-family:monospace;white-space:pre',
+ s: 'text-decoration:line-through',
+ small: 'display:inline;font-size:0.8em',
+ strike: 'text-decoration:line-through',
+ u: 'text-decoration:underline'
+ // #endif
+ },
- // svg 大小写对照表
- svgDict: {
- animatetransform: 'animateTransform',
- lineargradient: 'linearGradient',
- viewbox: 'viewBox',
- attributename: 'attributeName',
- repeatcount: 'repeatCount',
- repeatdur: 'repeatDur'
- }
+ // svg 大小写对照表
+ svgDict: {
+ animatetransform: 'animateTransform',
+ lineargradient: 'linearGradient',
+ viewbox: 'viewBox',
+ attributename: 'attributeName',
+ repeatcount: 'repeatCount',
+ repeatdur: 'repeatDur'
+ }
}
-const tagSelector = {}
+const tagSelector={}
const {
- windowWidth,
- // #ifdef MP-WEIXIN
- system
- // #endif
+ windowWidth,
+ // #ifdef MP-WEIXIN
+ system
+ // #endif
} = uni.getSystemInfoSync()
const blankChar = makeMap(' ,\r,\n,\t,\f')
let idIndex = 0
@@ -105,13 +99,13 @@ config.ignoreTags.style = undefined
* @description 创建 map
* @param {String} str 逗号分隔
*/
-function makeMap(str) {
- const map = Object.create(null)
- const list = str.split(',')
- for (let i = list.length; i--;) {
- map[list[i]] = true
- }
- return map
+function makeMap (str) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = list.length; i--;) {
+ map[list[i]] = true
+ }
+ return map
}
/**
@@ -120,102 +114,100 @@ function makeMap(str) {
* @param {Boolean} amp 要不要解码 &
* @returns {String} 解码后的字符串
*/
-function decodeEntity(str, amp) {
- let i = str.indexOf('&')
- while (i !== -1) {
- const j = str.indexOf(';', i + 3)
- let code
- if (j === -1) break
- if (str[i + 1] === '#') {
- // { 形式的实体
- code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
- if (!isNaN(code)) {
- str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
- }
- } else {
- // 形式的实体
- code = str.substring(i + 1, j)
- if (config.entities[code] || (code === 'amp' && amp)) {
- str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
- }
- }
- i = str.indexOf('&', i + 1)
- }
- return str
+function decodeEntity (str, amp) {
+ let i = str.indexOf('&')
+ while (i !== -1) {
+ const j = str.indexOf(';', i + 3)
+ let code
+ if (j === -1) break
+ if (str[i + 1] === '#') {
+ // { 形式的实体
+ code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
+ if (!isNaN(code)) {
+ str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
+ }
+ } else {
+ // 形式的实体
+ code = str.substring(i + 1, j)
+ if (config.entities[code] || (code === 'amp' && amp)) {
+ str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
+ }
+ }
+ i = str.indexOf('&', i + 1)
+ }
+ return str
}
/**
* @description 合并多个块级标签,加快长内容渲染
* @param {Array} nodes 要合并的标签数组
*/
-function mergeNodes(nodes) {
- let i = nodes.length - 1
- for (let j = i; j >= -1; j--) {
- if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j]
- .name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {
- if (i - j >= 5) {
- nodes.splice(j + 1, i - j, {
- name: 'div',
- attrs: {},
- children: nodes.slice(j + 1, i + 1)
- })
- }
- i = j - 1
- }
- }
+function mergeNodes (nodes) {
+ let i = nodes.length - 1
+ for (let j = i; j >= -1; j--) {
+ if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {
+ if (i - j >= 5) {
+ nodes.splice(j + 1, i - j, {
+ name: 'div',
+ attrs: {},
+ children: nodes.slice(j + 1, i + 1)
+ })
+ }
+ i = j - 1
+ }
+ }
}
/**
* @description html 解析器
* @param {Object} vm 组件实例
*/
-function Parser(vm) {
- this.options = vm || {}
- this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
- this.imgList = vm.imgList || []
- this.imgList._unloadimgs = 0
- this.plugins = vm.plugins || []
- this.attrs = Object.create(null)
- this.stack = []
- this.nodes = []
- this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes(
- 'pre') ? 2 : 0
+function Parser (vm) {
+ this.options = vm || {}
+ this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
+ this.imgList = vm.imgList || []
+ this.imgList._unloadimgs = 0
+ this.plugins = vm.plugins || []
+ this.attrs = Object.create(null)
+ this.stack = []
+ this.nodes = []
+ this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0
}
/**
* @description 执行解析
* @param {String} content 要解析的文本
*/
-Parser.prototype.parse = function(content) {
- // 插件处理
- for (let i = this.plugins.length; i--;) {
- if (this.plugins[i].onUpdate) {
- content = this.plugins[i].onUpdate(content, config) || content
- }
- }
+Parser.prototype.parse = function (content) {
+ // 插件处理
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onUpdate) {
+ content = this.plugins[i].onUpdate(content, config) || content
+ }
+ }
- new Lexer(this).parse(content)
- // 出栈未闭合的标签
- while (this.stack.length) {
- this.popNode()
- }
- if (this.nodes.length > 50) {
- mergeNodes(this.nodes)
- }
- return this.nodes
+ new Lexer(this).parse(content)
+ // 出栈未闭合的标签
+ while (this.stack.length) {
+ this.popNode()
+ }
+ if (this.nodes.length > 50) {
+ mergeNodes(this.nodes)
+ }
+ return this.nodes
}
/**
* @description 将标签暴露出来(不被 rich-text 包含)
*/
-Parser.prototype.expose = function() {
- // #ifndef APP-PLUS-NVUE
- for (let i = this.stack.length; i--;) {
- const item = this.stack[i]
- if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
- item.c = 1
- }
- // #endif
+Parser.prototype.expose = function () {
+ // #ifndef APP-PLUS-NVUE
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
+ item.c = 1
+ }
+ // #endif
}
/**
@@ -223,13 +215,13 @@ Parser.prototype.expose = function() {
* @param {Object} node 要处理的标签
* @returns {Boolean} 是否要移除此标签
*/
-Parser.prototype.hook = function(node) {
- for (let i = this.plugins.length; i--;) {
- if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
- return false
- }
- }
- return true
+Parser.prototype.hook = function (node) {
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
+ return false
+ }
+ }
+ return true
}
/**
@@ -237,28 +229,26 @@ Parser.prototype.hook = function(node) {
* @param {String} url 需要拼接的链接
* @returns {String} 拼接后的链接
*/
-Parser.prototype.getUrl = function(url) {
- const domain = this.options.domain
- if (url[0] === '/') {
- if (url[1] === '/') {
- // // 开头的补充协议名
- url = (domain ? domain.split('://')[0] : 'http') + ':' + url
- } else if (domain) {
- // 否则补充整个域名
- url = domain + url
- } /* #ifdef APP-PLUS */
- else {
- url = plus.io.convertLocalFileSystemURL(url)
- } /* #endif */
- } else if (!url.includes('data:') && !url.includes('://')) {
- if (domain) {
- url = domain + '/' + url
- } /* #ifdef APP-PLUS */
- else {
- url = plus.io.convertLocalFileSystemURL(url)
- } /* #endif */
- }
- return url
+Parser.prototype.getUrl = function (url) {
+ const domain = this.options.domain
+ if (url[0] === '/') {
+ if (url[1] === '/') {
+ // // 开头的补充协议名
+ url = (domain ? domain.split('://')[0] : 'http') + ':' + url
+ } else if (domain) {
+ // 否则补充整个域名
+ url = domain + url
+ } /* #ifdef APP-PLUS */ else {
+ url = plus.io.convertLocalFileSystemURL(url)
+ } /* #endif */
+ } else if (!url.includes('data:') && !url.includes('://')) {
+ if (domain) {
+ url = domain + '/' + url
+ } /* #ifdef APP-PLUS */ else {
+ url = plus.io.convertLocalFileSystemURL(url)
+ } /* #endif */
+ }
+ return url
}
/**
@@ -266,60 +256,60 @@ Parser.prototype.getUrl = function(url) {
* @param {Object} node 标签
* @returns {Object}
*/
-Parser.prototype.parseStyle = function(node) {
- const attrs = node.attrs
- const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
- const styleObj = {}
- let tmp = ''
+Parser.prototype.parseStyle = function (node) {
+ const attrs = node.attrs
+ const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
+ const styleObj = {}
+ let tmp = ''
- if (attrs.id && !this.xml) {
- // 暴露锚点
- if (this.options.useAnchor) {
- this.expose()
- } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
- attrs.id = undefined
- }
- }
+ if (attrs.id && !this.xml) {
+ // 暴露锚点
+ if (this.options.useAnchor) {
+ this.expose()
+ } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
+ attrs.id = undefined
+ }
+ }
- // 转换 width 和 height 属性
- if (attrs.width) {
- styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
- attrs.width = undefined
- }
- if (attrs.height) {
- styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
- attrs.height = undefined
- }
+ // 转换 width 和 height 属性
+ if (attrs.width) {
+ styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
+ attrs.width = undefined
+ }
+ if (attrs.height) {
+ styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
+ attrs.height = undefined
+ }
- for (let i = 0, len = list.length; i < len; i++) {
- const info = list[i].split(':')
- if (info.length < 2) continue
- const key = info.shift().trim().toLowerCase()
- let value = info.join(':').trim()
- if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
- // 兼容性的 css 不压缩
- tmp += `;${key}:${value}`
- } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
- // 重复的样式进行覆盖
- if (value.includes('url')) {
- // 填充链接
- let j = value.indexOf('(') + 1
- if (j) {
- while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
- j++
- }
- value = value.substr(0, j) + this.getUrl(value.substr(j))
- }
- } else if (value.includes('rpx')) {
- // 转换 rpx(rich-text 内部不支持 rpx)
- value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
- }
- styleObj[key] = value
- }
- }
+ for (let i = 0, len = list.length; i < len; i++) {
+ const info = list[i].split(':')
+ if (info.length < 2) continue
+ const key = info.shift().trim().toLowerCase()
+ let value = info.join(':').trim()
+ if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
+ // 兼容性的 css 不压缩
+ tmp += `;${key}:${value}`
+ } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
+ // 重复的样式进行覆盖
+ if (value.includes('url')) {
+ // 填充链接
+ let j = value.indexOf('(') + 1
+ if (j) {
+ while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
+ j++
+ }
+ value = value.substr(0, j) + this.getUrl(value.substr(j))
+ }
+ } else if (value.includes('rpx')) {
+ // 转换 rpx(rich-text 内部不支持 rpx)
+ value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
+ }
+ styleObj[key] = value
+ }
+ }
- node.attrs.style = tmp
- return styleObj
+ node.attrs.style = tmp
+ return styleObj
}
/**
@@ -327,11 +317,11 @@ Parser.prototype.parseStyle = function(node) {
* @param {String} name 标签名
* @private
*/
-Parser.prototype.onTagName = function(name) {
- this.tagName = this.xml ? name : name.toLowerCase()
- if (this.tagName === 'svg') {
- this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
- }
+Parser.prototype.onTagName = function (name) {
+ this.tagName = this.xml ? name : name.toLowerCase()
+ if (this.tagName === 'svg') {
+ this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
+ }
}
/**
@@ -339,23 +329,23 @@ Parser.prototype.onTagName = function(name) {
* @param {String} name 属性名
* @private
*/
-Parser.prototype.onAttrName = function(name) {
- name = this.xml ? name : name.toLowerCase()
- if (name.substr(0, 5) === 'data-') {
- if (name === 'data-src' && !this.attrs.src) {
- // data-src 自动转为 src
- this.attrName = 'src'
- } else if (this.tagName === 'img' || this.tagName === 'a') {
- // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用
- this.attrName = name
- } else {
- // 剩余的移除以减小大小
- this.attrName = undefined
- }
- } else {
- this.attrName = name
- this.attrs[name] = 'T' // boolean 型属性缺省设置
- }
+Parser.prototype.onAttrName = function (name) {
+ name = this.xml ? name : name.toLowerCase()
+ if (name.substr(0, 5) === 'data-') {
+ if (name === 'data-src' && !this.attrs.src) {
+ // data-src 自动转为 src
+ this.attrName = 'src'
+ } else if (this.tagName === 'img' || this.tagName === 'a') {
+ // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用
+ this.attrName = name
+ } else {
+ // 剩余的移除以减小大小
+ this.attrName = undefined
+ }
+ } else {
+ this.attrName = name
+ this.attrs[name] = 'T' // boolean 型属性缺省设置
+ }
}
/**
@@ -363,18 +353,17 @@ Parser.prototype.onAttrName = function(name) {
* @param {String} val 属性值
* @private
*/
-Parser.prototype.onAttrVal = function(val) {
- // console.log(val, '解码转码')
- const name = this.attrName || ''
- if (name === 'style' || name === 'href') {
- // 部分属性进行实体解码
- this.attrs[name] = decodeEntity(val, true)
- } else if (name.includes('src')) {
- // 拼接主域名
- this.attrs[name] = this.getUrl(decodeEntity(val, true))
- } else if (name) {
- this.attrs[name] = val
- }
+Parser.prototype.onAttrVal = function (val) {
+ const name = this.attrName || ''
+ if (name === 'style' || name === 'href') {
+ // 部分属性进行实体解码
+ this.attrs[name] = decodeEntity(val, true)
+ } else if (name.includes('src')) {
+ // 拼接主域名
+ this.attrs[name] = this.getUrl(decodeEntity(val, true))
+ } else if (name) {
+ this.attrs[name] = val
+ }
}
/**
@@ -382,221 +371,213 @@ Parser.prototype.onAttrVal = function(val) {
* @param {Boolean} selfClose 是否有自闭合标识 />
* @private
*/
-Parser.prototype.onOpenTag = function(selfClose) {
- // 拼装 node
- const node = Object.create(null)
- node.name = this.tagName
- node.attrs = this.attrs
- // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
- if (this.options.nodes.length) {
- node.type = 'node'
- }
- this.attrs = Object.create(null)
+Parser.prototype.onOpenTag = function (selfClose) {
+ // 拼装 node
+ const node = Object.create(null)
+ node.name = this.tagName
+ node.attrs = this.attrs
+ // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
+ if (this.options.nodes.length) {
+ node.type = 'node'
+ }
+ this.attrs = Object.create(null)
- const attrs = node.attrs
- const parent = this.stack[this.stack.length - 1]
- const siblings = parent ? parent.children : this.nodes
- const close = this.xml ? selfClose : config.voidTags[node.name]
+ const attrs = node.attrs
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
+ const close = this.xml ? selfClose : config.voidTags[node.name]
- // 替换标签名选择器
- if (tagSelector[node.name]) {
- attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
- }
+ // 替换标签名选择器
+ if (tagSelector[node.name]) {
+ attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
+ }
- // 转换 embed 标签
- if (node.name === 'embed') {
- // #ifndef H5 || APP-PLUS
- const src = attrs.src || ''
- // 按照后缀名和 type 将 embed 转为 video 或 audio
- if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes(
- 'video')) {
- node.name = 'video'
- } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (
- attrs.type || '').includes('audio')) {
- node.name = 'audio'
- }
- if (attrs.autostart) {
- attrs.autoplay = 'T'
- }
- attrs.controls = 'T'
- // #endif
- // #ifdef H5 || APP-PLUS
- this.expose()
- // #endif
- }
+ // 转换 embed 标签
+ if (node.name === 'embed') {
+ // #ifndef H5 || APP-PLUS
+ const src = attrs.src || ''
+ // 按照后缀名和 type 将 embed 转为 video 或 audio
+ if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {
+ node.name = 'video'
+ } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {
+ node.name = 'audio'
+ }
+ if (attrs.autostart) {
+ attrs.autoplay = 'T'
+ }
+ attrs.controls = 'T'
+ // #endif
+ // #ifdef H5 || APP-PLUS
+ this.expose()
+ // #endif
+ }
- // #ifndef APP-PLUS-NVUE
- // 处理音视频
- if (node.name === 'video' || node.name === 'audio') {
- // 设置 id 以便获取 context
- if (node.name === 'video' && !attrs.id) {
- attrs.id = 'v' + idIndex++
- }
- // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
- if (!attrs.controls && !attrs.autoplay) {
- attrs.controls = 'T'
- }
- // 用数组存储所有可用的 source
- node.src = []
- if (attrs.src) {
- node.src.push(attrs.src)
- attrs.src = undefined
- }
- this.expose()
- }
- // #endif
+ // #ifndef APP-PLUS-NVUE
+ // 处理音视频
+ if (node.name === 'video' || node.name === 'audio') {
+ // 设置 id 以便获取 context
+ if (node.name === 'video' && !attrs.id) {
+ attrs.id = 'v' + idIndex++
+ }
+ // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
+ if (!attrs.controls && !attrs.autoplay) {
+ attrs.controls = 'T'
+ }
+ // 用数组存储所有可用的 source
+ node.src = []
+ if (attrs.src) {
+ node.src.push(attrs.src)
+ attrs.src = undefined
+ }
+ this.expose()
+ }
+ // #endif
- // 处理自闭合标签
- if (close) {
- if (!this.hook(node) || config.ignoreTags[node.name]) {
- // 通过 base 标签设置主域名
- if (node.name === 'base' && !this.options.domain) {
- this.options.domain = attrs.href
- } /* #ifndef APP-PLUS-NVUE */
- else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') &&
- attrs.src) {
- // 设置 source 标签(仅父节点为 video 或 audio 时有效)
- parent.src.push(attrs.src)
- } /* #endif */
- return
- }
+ // 处理自闭合标签
+ if (close) {
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 通过 base 标签设置主域名
+ if (node.name === 'base' && !this.options.domain) {
+ this.options.domain = attrs.href
+ } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {
+ // 设置 source 标签(仅父节点为 video 或 audio 时有效)
+ parent.src.push(attrs.src)
+ } /* #endif */
+ return
+ }
- // 解析 style
- const styleObj = this.parseStyle(node)
+ // 解析 style
+ const styleObj = this.parseStyle(node)
- // 处理图片
- if (node.name === 'img') {
- if (attrs.src) {
- // 标记 webp
- if (attrs.src.includes('webp')) {
- node.webp = 'T'
- }
- // data url 图片如果没有设置 original-src 默认为不可预览的小图片
- if (attrs.src.includes('data:') && !attrs['original-src']) {
- attrs.ignore = 'T'
- }
- if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
- for (let i = this.stack.length; i--;) {
- const item = this.stack[i]
- if (item.name === 'a') {
- node.a = item.attrs
- }
- if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {
- if (!styleObj.display || styleObj.display.includes('inline')) {
- node.t = 'inline-block'
- } else {
- node.t = styleObj.display
- }
- styleObj.display = undefined
- }
- // #ifndef H5 || APP-PLUS
- const style = item.attrs.style || ''
- if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!
- styleObj.width || parseInt(styleObj.width) > 100)) {
- styleObj.width = '100% !important'
- styleObj.height = ''
- for (let j = i + 1; j < this.stack.length; j++) {
- this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
- }
- } else if (style.includes('flex') && styleObj.width === '100%') {
- for (let j = i + 1; j < this.stack.length; j++) {
- const style = this.stack[j].attrs.style || ''
- if (!style.includes(';width') && !style.includes(' width') && style.indexOf(
- 'width') !== 0) {
- styleObj.width = ''
- break
- }
- }
- } else if (style.includes('inline-block')) {
- if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
- item.attrs.style += ';max-width:' + styleObj.width
- styleObj.width = ''
- } else {
- item.attrs.style += ';max-width:100%'
- }
- }
- // #endif
- item.c = 1
- }
- attrs.i = this.imgList.length.toString()
- let src = attrs['original-src'] || attrs.src
- // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
- if (this.imgList.includes(src)) {
- // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
- let i = src.indexOf('://')
- if (i !== -1) {
- i += 3
- let newSrc = src.substr(0, i)
- for (; i < src.length; i++) {
- if (src[i] === '/') break
- newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
- }
- newSrc += src.substr(i)
- src = newSrc
- }
- }
- // #endif
- this.imgList.push(src)
- if (!node.t) {
- this.imgList._unloadimgs += 1
- }
- // #ifdef H5 || APP-PLUS
- if (this.options.lazyLoad) {
- attrs['data-src'] = attrs.src
- attrs.src = undefined
- }
- // #endif
- }
- }
- if (styleObj.display === 'inline') {
- styleObj.display = ''
- }
- // #ifndef APP-PLUS-NVUE
- if (attrs.ignore) {
- styleObj['max-width'] = styleObj['max-width'] || '100%'
- attrs.style += ';-webkit-touch-callout:none'
- }
- // #endif
- // 设置的宽度超出屏幕,为避免变形,高度转为自动
- if (parseInt(styleObj.width) > windowWidth) {
- styleObj.height = undefined
- }
- // 记录是否设置了宽高
- if (!isNaN(parseInt(styleObj.width))) {
- node.w = 'T'
- }
- if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs
- .style || '').includes('height')))) {
- node.h = 'T'
- }
- } else if (node.name === 'svg') {
- siblings.push(node)
- this.stack.push(node)
- this.popNode()
- return
- }
- for (const key in styleObj) {
- if (styleObj[key]) {
- attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
- }
- }
- attrs.style = attrs.style.substr(1) || undefined
- // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
- if (!attrs.style) {
- delete attrs.style
- }
- // #endif
- } else {
- if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) &&
- this.pre !== 2) {
- this.pre = node.pre = 1
- }
- node.children = []
- this.stack.push(node)
- }
+ // 处理图片
+ if (node.name === 'img') {
+ if (attrs.src) {
+ // 标记 webp
+ if (attrs.src.includes('webp')) {
+ node.webp = 'T'
+ }
+ // data url 图片如果没有设置 original-src 默认为不可预览的小图片
+ if (attrs.src.includes('data:') && !attrs['original-src']) {
+ attrs.ignore = 'T'
+ }
+ if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.name === 'a') {
+ node.a = item.attrs
+ }
+ if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {
+ if (!styleObj.display || styleObj.display.includes('inline')) {
+ node.t = 'inline-block'
+ } else {
+ node.t = styleObj.display
+ }
+ styleObj.display = undefined
+ }
+ // #ifndef H5 || APP-PLUS
+ const style = item.attrs.style || ''
+ if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) {
+ styleObj.width = '100% !important'
+ styleObj.height = ''
+ for (let j = i + 1; j < this.stack.length; j++) {
+ this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
+ }
+ } else if (style.includes('flex') && styleObj.width === '100%') {
+ for (let j = i + 1; j < this.stack.length; j++) {
+ const style = this.stack[j].attrs.style || ''
+ if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {
+ styleObj.width = ''
+ break
+ }
+ }
+ } else if (style.includes('inline-block')) {
+ if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
+ item.attrs.style += ';max-width:' + styleObj.width
+ styleObj.width = ''
+ } else {
+ item.attrs.style += ';max-width:100%'
+ }
+ }
+ // #endif
+ item.c = 1
+ }
+ attrs.i = this.imgList.length.toString()
+ let src = attrs['original-src'] || attrs.src
+ // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
+ if (this.imgList.includes(src)) {
+ // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
+ let i = src.indexOf('://')
+ if (i !== -1) {
+ i += 3
+ let newSrc = src.substr(0, i)
+ for (; i < src.length; i++) {
+ if (src[i] === '/') break
+ newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
+ }
+ newSrc += src.substr(i)
+ src = newSrc
+ }
+ }
+ // #endif
+ this.imgList.push(src)
+ if (!node.t) {
+ this.imgList._unloadimgs += 1
+ }
+ // #ifdef H5 || APP-PLUS
+ if (this.options.lazyLoad) {
+ attrs['data-src'] = attrs.src
+ attrs.src = undefined
+ }
+ // #endif
+ }
+ }
+ if (styleObj.display === 'inline') {
+ styleObj.display = ''
+ }
+ // #ifndef APP-PLUS-NVUE
+ if (attrs.ignore) {
+ styleObj['max-width'] = styleObj['max-width'] || '100%'
+ attrs.style += ';-webkit-touch-callout:none'
+ }
+ // #endif
+ // 设置的宽度超出屏幕,为避免变形,高度转为自动
+ if (parseInt(styleObj.width) > windowWidth) {
+ styleObj.height = undefined
+ }
+ // 记录是否设置了宽高
+ if (!isNaN(parseInt(styleObj.width))) {
+ node.w = 'T'
+ }
+ if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) {
+ node.h = 'T'
+ }
+ } else if (node.name === 'svg') {
+ siblings.push(node)
+ this.stack.push(node)
+ this.popNode()
+ return
+ }
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+ // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+ if (!attrs.style) {
+ delete attrs.style
+ }
+ // #endif
+ } else {
+ if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {
+ this.pre = node.pre = 1
+ }
+ node.children = []
+ this.stack.push(node)
+ }
- // 加入节点树
- siblings.push(node)
+ // 加入节点树
+ siblings.push(node)
}
/**
@@ -604,582 +585,569 @@ Parser.prototype.onOpenTag = function(selfClose) {
* @param {String} name 标签名
* @private
*/
-Parser.prototype.onCloseTag = function(name) {
- // 依次出栈到匹配为止
- name = this.xml ? name : name.toLowerCase()
- let i
- for (i = this.stack.length; i--;) {
- if (this.stack[i].name === name) break
- }
- if (i !== -1) {
- while (this.stack.length > i) {
- this.popNode()
- }
- } else if (name === 'p' || name === 'br') {
- const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
- siblings.push({
- name,
- attrs: {
- class: tagSelector[name] || '',
- style: this.tagStyle[name] || ''
- }
- })
- }
+Parser.prototype.onCloseTag = function (name) {
+ // 依次出栈到匹配为止
+ name = this.xml ? name : name.toLowerCase()
+ let i
+ for (i = this.stack.length; i--;) {
+ if (this.stack[i].name === name) break
+ }
+ if (i !== -1) {
+ while (this.stack.length > i) {
+ this.popNode()
+ }
+ } else if (name === 'p' || name === 'br') {
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push({
+ name,
+ attrs: {
+ class: tagSelector[name] || '',
+ style: this.tagStyle[name] || ''
+ }
+ })
+ }
}
/**
* @description 处理标签出栈
* @private
*/
-Parser.prototype.popNode = function() {
- const node = this.stack.pop()
- let attrs = node.attrs
- const children = node.children
- const parent = this.stack[this.stack.length - 1]
- const siblings = parent ? parent.children : this.nodes
+Parser.prototype.popNode = function () {
+ const node = this.stack.pop()
+ let attrs = node.attrs
+ const children = node.children
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
- if (!this.hook(node) || config.ignoreTags[node.name]) {
- // 获取标题
- if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
- uni.setNavigationBarTitle({
- title: children[0].text
- })
- }
- siblings.pop()
- return
- }
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 获取标题
+ if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
+ uni.setNavigationBarTitle({
+ title: children[0].text
+ })
+ }
+ siblings.pop()
+ return
+ }
- if (node.pre && this.pre !== 2) {
- // 是否合并空白符标识
- this.pre = node.pre = undefined
- for (let i = this.stack.length; i--;) {
- if (this.stack[i].pre) {
- this.pre = 1
- }
- }
- }
+ if (node.pre && this.pre !== 2) {
+ // 是否合并空白符标识
+ this.pre = node.pre = undefined
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].pre) {
+ this.pre = 1
+ }
+ }
+ }
- const styleObj = {}
+ const styleObj = {}
- // 转换 svg
- if (node.name === 'svg') {
- if (this.xml > 1) {
- // 多层 svg 嵌套
- this.xml--
- return
- }
- // #ifdef APP-PLUS-NVUE
- (function traversal(node) {
- if (node.name) {
- // 调整 svg 的大小写
- node.name = config.svgDict[node.name] || node.name
- for (const item in node.attrs) {
- if (config.svgDict[item]) {
- node.attrs[config.svgDict[item]] = node.attrs[item]
- node.attrs[item] = undefined
- }
- }
- for (let i = 0; i < (node.children || []).length; i++) {
- traversal(node.children[i])
- }
- }
- })(node)
- // #endif
- // #ifndef APP-PLUS-NVUE
- let src = ''
- const style = attrs.style
- attrs.style = ''
- attrs.xmlns = 'http://www.w3.org/2000/svg';
- (function traversal(node) {
- if (node.type === 'text') {
- src += node.text
- return
- }
- const name = config.svgDict[node.name] || node.name
- src += '<' + name
- for (const item in node.attrs) {
- const val = node.attrs[item]
- if (val) {
- src += ` ${config.svgDict[item] || item}="${val}"`
- }
- }
- if (!node.children) {
- src += '/>'
- } else {
- src += '>'
- for (let i = 0; i < node.children.length; i++) {
- traversal(node.children[i])
- }
- src += '' + name + '>'
- }
- })(node)
- node.name = 'img'
- node.attrs = {
- src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
- style,
- ignore: 'T'
- }
- node.children = undefined
- // #endif
- this.xml = false
- return
- }
+ // 转换 svg
+ if (node.name === 'svg') {
+ if (this.xml > 1) {
+ // 多层 svg 嵌套
+ this.xml--
+ return
+ }
+ // #ifdef APP-PLUS-NVUE
+ (function traversal (node) {
+ if (node.name) {
+ // 调整 svg 的大小写
+ node.name = config.svgDict[node.name] || node.name
+ for (const item in node.attrs) {
+ if (config.svgDict[item]) {
+ node.attrs[config.svgDict[item]] = node.attrs[item]
+ node.attrs[item] = undefined
+ }
+ }
+ for (let i = 0; i < (node.children || []).length; i++) {
+ traversal(node.children[i])
+ }
+ }
+ })(node)
+ // #endif
+ // #ifndef APP-PLUS-NVUE
+ let src = ''
+ const style = attrs.style
+ attrs.style = ''
+ attrs.xmlns = 'http://www.w3.org/2000/svg';
+ (function traversal (node) {
+ if (node.type === 'text') {
+ src += node.text
+ return
+ }
+ const name = config.svgDict[node.name] || node.name
+ src += '<' + name
+ for (const item in node.attrs) {
+ const val = node.attrs[item]
+ if (val) {
+ src += ` ${config.svgDict[item] || item}="${val}"`
+ }
+ }
+ if (!node.children) {
+ src += '/>'
+ } else {
+ src += '>'
+ for (let i = 0; i < node.children.length; i++) {
+ traversal(node.children[i])
+ }
+ src += '' + name + '>'
+ }
+ })(node)
+ node.name = 'img'
+ node.attrs = {
+ src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+ style,
+ ignore: 'T'
+ }
+ node.children = undefined
+ // #endif
+ this.xml = false
+ return
+ }
- // #ifndef APP-PLUS-NVUE
- // 转换 align 属性
- if (attrs.align) {
- if (node.name === 'table') {
- if (attrs.align === 'center') {
- styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
- } else {
- styleObj.float = attrs.align
- }
- } else {
- styleObj['text-align'] = attrs.align
- }
- attrs.align = undefined
- }
+ // #ifndef APP-PLUS-NVUE
+ // 转换 align 属性
+ if (attrs.align) {
+ if (node.name === 'table') {
+ if (attrs.align === 'center') {
+ styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
+ } else {
+ styleObj.float = attrs.align
+ }
+ } else {
+ styleObj['text-align'] = attrs.align
+ }
+ attrs.align = undefined
+ }
- // 转换 dir 属性
- if (attrs.dir) {
- styleObj.direction = attrs.dir
- attrs.dir = undefined
- }
+ // 转换 dir 属性
+ if (attrs.dir) {
+ styleObj.direction = attrs.dir
+ attrs.dir = undefined
+ }
- // 转换 font 标签的属性
- if (node.name === 'font') {
- if (attrs.color) {
- styleObj.color = attrs.color
- attrs.color = undefined
- }
- if (attrs.face) {
- styleObj['font-family'] = attrs.face
- attrs.face = undefined
- }
- if (attrs.size) {
- let size = parseInt(attrs.size)
- if (!isNaN(size)) {
- if (size < 1) {
- size = 1
- } else if (size > 7) {
- size = 7
- }
- styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][
- size - 1
- ]
- }
- attrs.size = undefined
- }
- }
- // #endif
+ // 转换 font 标签的属性
+ if (node.name === 'font') {
+ if (attrs.color) {
+ styleObj.color = attrs.color
+ attrs.color = undefined
+ }
+ if (attrs.face) {
+ styleObj['font-family'] = attrs.face
+ attrs.face = undefined
+ }
+ if (attrs.size) {
+ let size = parseInt(attrs.size)
+ if (!isNaN(size)) {
+ if (size < 1) {
+ size = 1
+ } else if (size > 7) {
+ size = 7
+ }
+ styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1]
+ }
+ attrs.size = undefined
+ }
+ }
+ // #endif
- // 一些编辑器的自带 class
- if ((attrs.class || '').includes('align-center')) {
- styleObj['text-align'] = 'center'
- }
+ // 一些编辑器的自带 class
+ if ((attrs.class || '').includes('align-center')) {
+ styleObj['text-align'] = 'center'
+ }
- Object.assign(styleObj, this.parseStyle(node))
+ Object.assign(styleObj, this.parseStyle(node))
- if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
- styleObj['max-width'] = '100%'
- styleObj['box-sizing'] = 'border-box'
- }
+ if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
+ styleObj['max-width'] = '100%'
+ styleObj['box-sizing'] = 'border-box'
+ }
- // #ifndef APP-PLUS-NVUE
- if (config.blockTags[node.name]) {
- node.name = 'div'
- } else if (!config.trustTags[node.name] && !this.xml) {
- // 未知标签转为 span,避免无法显示
- node.name = 'span'
- }
+ // #ifndef APP-PLUS-NVUE
+ if (config.blockTags[node.name]) {
+ node.name = 'div'
+ } else if (!config.trustTags[node.name] && !this.xml) {
+ // 未知标签转为 span,避免无法显示
+ node.name = 'span'
+ }
- if (node.name === 'a' || node.name === 'ad'
- // #ifdef H5 || APP-PLUS
- ||
- node.name === 'iframe' // eslint-disable-line
- // #endif
- ) {
- this.expose()
- } else if (node.name === 'video') {
- if ((styleObj.height || '').includes('auto')) {
- styleObj.height = undefined
- }
- /* #ifdef APP-PLUS */
- let str = '
'
- node.html = str
- /* #endif */
- } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
- // 列表处理
- const types = {
- a: 'lower-alpha',
- A: 'upper-alpha',
- i: 'lower-roman',
- I: 'upper-roman'
- }
- if (types[attrs.type]) {
- attrs.style += ';list-style-type:' + types[attrs.type]
- attrs.type = undefined
- }
- for (let i = children.length; i--;) {
- if (children[i].name === 'li') {
- children[i].c = 1
- }
- }
- } else if (node.name === 'table') {
- // 表格处理
- // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
- let padding = parseFloat(attrs.cellpadding)
- let spacing = parseFloat(attrs.cellspacing)
- const border = parseFloat(attrs.border)
- const bordercolor = styleObj['border-color']
- const borderstyle = styleObj['border-style']
- if (node.c) {
- // padding 和 spacing 默认 2
- if (isNaN(padding)) {
- padding = 2
- }
- if (isNaN(spacing)) {
- spacing = 2
- }
- }
- if (border) {
- attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`
- }
- if (node.flag && node.c) {
- // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
- styleObj.display = 'grid'
- if (spacing) {
- styleObj['grid-gap'] = spacing + 'px'
- styleObj.padding = spacing + 'px'
- } else if (border) {
- // 无间隔的情况下避免边框重叠
- attrs.style += ';border-left:0;border-top:0'
- }
+ if (node.name === 'a' || node.name === 'ad'
+ // #ifdef H5 || APP-PLUS
+ || node.name === 'iframe' // eslint-disable-line
+ // #endif
+ ) {
+ this.expose()
+ } else if (node.name === 'video') {
+ if ((styleObj.height || '').includes('auto')) {
+ styleObj.height = undefined
+ }
+ /* #ifdef APP-PLUS */
+ let str = '
'
+ node.html = str
+ /* #endif */
+ } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
+ // 列表处理
+ const types = {
+ a: 'lower-alpha',
+ A: 'upper-alpha',
+ i: 'lower-roman',
+ I: 'upper-roman'
+ }
+ if (types[attrs.type]) {
+ attrs.style += ';list-style-type:' + types[attrs.type]
+ attrs.type = undefined
+ }
+ for (let i = children.length; i--;) {
+ if (children[i].name === 'li') {
+ children[i].c = 1
+ }
+ }
+ } else if (node.name === 'table') {
+ // 表格处理
+ // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
+ let padding = parseFloat(attrs.cellpadding)
+ let spacing = parseFloat(attrs.cellspacing)
+ const border = parseFloat(attrs.border)
+ const bordercolor = styleObj['border-color']
+ const borderstyle = styleObj['border-style']
+ if (node.c) {
+ // padding 和 spacing 默认 2
+ if (isNaN(padding)) {
+ padding = 2
+ }
+ if (isNaN(spacing)) {
+ spacing = 2
+ }
+ }
+ if (border) {
+ attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`
+ }
+ if (node.flag && node.c) {
+ // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
+ styleObj.display = 'grid'
+ if (spacing) {
+ styleObj['grid-gap'] = spacing + 'px'
+ styleObj.padding = spacing + 'px'
+ } else if (border) {
+ // 无间隔的情况下避免边框重叠
+ attrs.style += ';border-left:0;border-top:0'
+ }
- const width = [] // 表格的列宽
- const trList = [] // tr 列表
- const cells = [] // 保存新的单元格
- const map = {}; // 被合并单元格占用的格子
+ const width = [] // 表格的列宽
+ const trList = [] // tr 列表
+ const cells = [] // 保存新的单元格
+ const map = {}; // 被合并单元格占用的格子
- (function traversal(nodes) {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].name === 'tr') {
- trList.push(nodes[i])
- } else {
- traversal(nodes[i].children || [])
- }
- }
- })(children)
+ (function traversal (nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ if (nodes[i].name === 'tr') {
+ trList.push(nodes[i])
+ } else {
+ traversal(nodes[i].children || [])
+ }
+ }
+ })(children)
- for (let row = 1; row <= trList.length; row++) {
- let col = 1
- for (let j = 0; j < trList[row - 1].children.length; j++) {
- const td = trList[row - 1].children[j]
- if (td.name === 'td' || td.name === 'th') {
- // 这个格子被上面的单元格占用,则列号++
- while (map[row + '.' + col]) {
- col++
- }
- let style = td.attrs.style || ''
- let start = style.indexOf('width') ? style.indexOf(';width') : 0
- // 提取出 td 的宽度
- if (start !== -1) {
- let end = style.indexOf(';', start + 6)
- if (end === -1) {
- end = style.length
- }
- if (!td.attrs.colspan) {
- width[col] = style.substring(start ? start + 7 : 6, end)
- }
- style = style.substr(0, start) + style.substr(end)
- }
- // 设置竖直对齐
- style += ';display:flex'
- start = style.indexOf('vertical-align')
- if (start !== -1) {
- const val = style.substr(start + 15, 10)
- if (val.includes('middle')) {
- style += ';align-items:center'
- } else if (val.includes('bottom')) {
- style += ';align-items:flex-end'
- }
- } else {
- style += ';align-items:center'
- }
- // 设置水平对齐
- start = style.indexOf('text-align')
- if (start !== -1) {
- const val = style.substr(start + 11, 10)
- if (val.includes('center')) {
- style += ';justify-content: center'
- } else if (val.includes('right')) {
- style += ';justify-content: right'
- }
- }
- style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` +
- (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ?
- `;padding:${padding}px` : '') + ';' + style
- // 处理列合并
- if (td.attrs.colspan) {
- style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
- if (!td.attrs.rowspan) {
- style += `;grid-row-start:${row};grid-row-end:${row + 1}`
- }
- col += parseInt(td.attrs.colspan) - 1
- }
- // 处理行合并
- if (td.attrs.rowspan) {
- style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
- if (!td.attrs.colspan) {
- style += `;grid-column-start:${col};grid-column-end:${col + 1}`
- }
- // 记录下方单元格被占用
- for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
- for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
- map[(row + rowspan) + '.' + (col - colspan)] = 1
- }
- }
- }
- if (style) {
- td.attrs.style = style
- }
- cells.push(td)
- col++
- }
- }
- if (row === 1) {
- let temp = ''
- for (let i = 1; i < col; i++) {
- temp += (width[i] ? width[i] : 'auto') + ' '
- }
- styleObj['grid-template-columns'] = temp
- }
- }
- node.children = cells
- } else {
- // 没有使用合并单元格的表格通过 table 布局实现
- if (node.c) {
- styleObj.display = 'table'
- }
- if (!isNaN(spacing)) {
- styleObj['border-spacing'] = spacing + 'px'
- }
- if (border || padding) {
- // 遍历
- (function traversal(nodes) {
- for (let i = 0; i < nodes.length; i++) {
- const td = nodes[i]
- if (td.name === 'th' || td.name === 'td') {
- if (border) {
- td.attrs.style =
- `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`
- }
- if (padding) {
- td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
- }
- } else if (td.children) {
- traversal(td.children)
- }
- }
- })(children)
- }
- }
- // 给表格添加一个单独的横向滚动层
- if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
- const table = Object.assign({}, node)
- node.name = 'div'
- node.attrs = {
- style: 'overflow:auto'
- }
- node.children = [table]
- attrs = table.attrs
- }
- } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
- for (let i = this.stack.length; i--;) {
- if (this.stack[i].name === 'table') {
- this.stack[i].flag = 1 // 指示含有合并单元格
- break
- }
- }
- } else if (node.name === 'ruby') {
- // 转换 ruby
- node.name = 'span'
- for (let i = 0; i < children.length - 1; i++) {
- if (children[i].type === 'text' && children[i + 1].name === 'rt') {
- children[i] = {
- name: 'div',
- attrs: {
- style: 'display:inline-block;text-align:center'
- },
- children: [{
- name: 'div',
- attrs: {
- style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
- },
- children: children[i + 1].children
- }, children[i]]
- }
- children.splice(i + 1, 1)
- }
- }
- } else if (node.c) {
- (function traversal(node) {
- node.c = 2
- for (let i = node.children.length; i--;) {
- const child = node.children[i]
- // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
- if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes(
- 'inline') && child.children)) && !child.c) {
- traversal(child)
- }
- // #endif
- if (!child.c || child.name === 'table') {
- node.c = 1
- }
- }
- })(node)
- }
+ for (let row = 1; row <= trList.length; row++) {
+ let col = 1
+ for (let j = 0; j < trList[row - 1].children.length; j++) {
+ const td = trList[row - 1].children[j]
+ if (td.name === 'td' || td.name === 'th') {
+ // 这个格子被上面的单元格占用,则列号++
+ while (map[row + '.' + col]) {
+ col++
+ }
+ let style = td.attrs.style || ''
+ let start = style.indexOf('width') ? style.indexOf(';width') : 0
+ // 提取出 td 的宽度
+ if (start !== -1) {
+ let end = style.indexOf(';', start + 6)
+ if (end === -1) {
+ end = style.length
+ }
+ if (!td.attrs.colspan) {
+ width[col] = style.substring(start ? start + 7 : 6, end)
+ }
+ style = style.substr(0, start) + style.substr(end)
+ }
+ // 设置竖直对齐
+ style += ';display:flex'
+ start = style.indexOf('vertical-align')
+ if (start !== -1) {
+ const val = style.substr(start + 15, 10)
+ if (val.includes('middle')) {
+ style += ';align-items:center'
+ } else if (val.includes('bottom')) {
+ style += ';align-items:flex-end'
+ }
+ } else {
+ style += ';align-items:center'
+ }
+ // 设置水平对齐
+ start = style.indexOf('text-align')
+ if (start !== -1) {
+ const val = style.substr(start + 11, 10)
+ if (val.includes('center')) {
+ style += ';justify-content: center'
+ } else if (val.includes('right')) {
+ style += ';justify-content: right'
+ }
+ }
+ style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style
+ // 处理列合并
+ if (td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
+ if (!td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + 1}`
+ }
+ col += parseInt(td.attrs.colspan) - 1
+ }
+ // 处理行合并
+ if (td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
+ if (!td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + 1}`
+ }
+ // 记录下方单元格被占用
+ for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
+ for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
+ map[(row + rowspan) + '.' + (col - colspan)] = 1
+ }
+ }
+ }
+ if (style) {
+ td.attrs.style = style
+ }
+ cells.push(td)
+ col++
+ }
+ }
+ if (row === 1) {
+ let temp = ''
+ for (let i = 1; i < col; i++) {
+ temp += (width[i] ? width[i] : 'auto') + ' '
+ }
+ styleObj['grid-template-columns'] = temp
+ }
+ }
+ node.children = cells
+ } else {
+ // 没有使用合并单元格的表格通过 table 布局实现
+ if (node.c) {
+ styleObj.display = 'table'
+ }
+ if (!isNaN(spacing)) {
+ styleObj['border-spacing'] = spacing + 'px'
+ }
+ if (border || padding) {
+ // 遍历
+ (function traversal (nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ const td = nodes[i]
+ if (td.name === 'th' || td.name === 'td') {
+ if (border) {
+ td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`
+ }
+ if (padding) {
+ td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
+ }
+ } else if (td.children) {
+ traversal(td.children)
+ }
+ }
+ })(children)
+ }
+ }
+ // 给表格添加一个单独的横向滚动层
+ if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
+ const table = Object.assign({}, node)
+ node.name = 'div'
+ node.attrs = {
+ style: 'overflow:auto'
+ }
+ node.children = [table]
+ attrs = table.attrs
+ }
+ } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].name === 'table') {
+ this.stack[i].flag = 1 // 指示含有合并单元格
+ break
+ }
+ }
+ } else if (node.name === 'ruby') {
+ // 转换 ruby
+ node.name = 'span'
+ for (let i = 0; i < children.length - 1; i++) {
+ if (children[i].type === 'text' && children[i + 1].name === 'rt') {
+ children[i] = {
+ name: 'div',
+ attrs: {
+ style: 'display:inline-block;text-align:center'
+ },
+ children: [{
+ name: 'div',
+ attrs: {
+ style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
+ },
+ children: children[i + 1].children
+ }, children[i]]
+ }
+ children.splice(i + 1, 1)
+ }
+ }
+ } else if (node.c) {
+ (function traversal (node) {
+ node.c = 2
+ for (let i = node.children.length; i--;) {
+ const child = node.children[i]
+ // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+ if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) {
+ traversal(child)
+ }
+ // #endif
+ if (!child.c || child.name === 'table') {
+ node.c = 1
+ }
+ }
+ })(node)
+ }
- if ((styleObj.display || '').includes('flex') && !node.c) {
- for (let i = children.length; i--;) {
- const item = children[i]
- if (item.f) {
- item.attrs.style = (item.attrs.style || '') + item.f
- item.f = undefined
- }
- }
- }
- // flex 布局时部分样式需要提取到 rich-text 外层
- const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes(
- 'grid'))
- // #ifdef MP-WEIXIN
- // 检查基础库版本 virtualHost 是否可用
- &&
- !(node.c && wx.getNFCAdapter) // eslint-disable-line
- // #endif
- // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
- &&
- !node.c // eslint-disable-line
- // #endif
- if (flex) {
- node.f = ';max-width:100%'
- }
+ if ((styleObj.display || '').includes('flex') && !node.c) {
+ for (let i = children.length; i--;) {
+ const item = children[i]
+ if (item.f) {
+ item.attrs.style = (item.attrs.style || '') + item.f
+ item.f = undefined
+ }
+ }
+ }
+ // flex 布局时部分样式需要提取到 rich-text 外层
+ const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid'))
+ // #ifdef MP-WEIXIN
+ // 检查基础库版本 virtualHost 是否可用
+ && !(node.c && wx.getNFCAdapter) // eslint-disable-line
+ // #endif
+ // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
+ && !node.c // eslint-disable-line
+ // #endif
+ if (flex) {
+ node.f = ';max-width:100%'
+ }
- if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {
- mergeNodes(children)
- }
- // #endif
+ if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {
+ mergeNodes(children)
+ }
+ // #endif
- for (const key in styleObj) {
- if (styleObj[key]) {
- const val = `;${key}:${styleObj[key].replace(' !important', '')}`
- /* #ifndef APP-PLUS-NVUE */
- if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes(
- 'grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {
- node.f += val
- if (key === 'width') {
- attrs.style += ';width:100%'
- }
- } else /* #endif */ {
- attrs.style += val
- }
- }
- }
- attrs.style = attrs.style.substr(1) || undefined
- // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
- for (const key in attrs) {
- if (!attrs[key]) {
- delete attrs[key]
- }
- }
- // #endif
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ const val = `;${key}:${styleObj[key].replace(' !important', '')}`
+ /* #ifndef APP-PLUS-NVUE */
+ if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {
+ node.f += val
+ if (key === 'width') {
+ attrs.style += ';width:100%'
+ }
+ } else /* #endif */ {
+ attrs.style += val
+ }
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+ // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+ for (const key in attrs) {
+ if (!attrs[key]) {
+ delete attrs[key]
+ }
+ }
+ // #endif
}
/**
* @description 解析到文本
* @param {String} text 文本内容
*/
-Parser.prototype.onText = function(text) {
- if (!this.pre) {
- // 合并空白符
- let trim = ''
- let flag
- for (let i = 0, len = text.length; i < len; i++) {
- if (!blankChar[text[i]]) {
- trim += text[i]
- } else {
- if (trim[trim.length - 1] !== ' ') {
- trim += ' '
- }
- if (text[i] === '\n' && !flag) {
- flag = true
- }
- }
- }
- // 去除含有换行符的空串
- if (trim === ' ') {
- if (flag) return
- // #ifdef VUE3
- else {
- const parent = this.stack[this.stack.length - 1]
- if (parent && parent.name[0] === 't') return
- }
- // #endif
- }
- text = trim
- }
- const node = Object.create(null)
- node.type = 'text'
- // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3
- node.attrs = {}
- // #endif
- node.text = decodeEntity(text)
- if (this.hook(node)) {
- // #ifdef MP-WEIXIN
- if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse(
- 'rich-text.user-select')) {
- this.expose()
- }
- // #endif
- const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
- siblings.push(node)
- }
+Parser.prototype.onText = function (text) {
+ if (!this.pre) {
+ // 合并空白符
+ let trim = ''
+ let flag
+ for (let i = 0, len = text.length; i < len; i++) {
+ if (!blankChar[text[i]]) {
+ trim += text[i]
+ } else {
+ if (trim[trim.length - 1] !== ' ') {
+ trim += ' '
+ }
+ if (text[i] === '\n' && !flag) {
+ flag = true
+ }
+ }
+ }
+ // 去除含有换行符的空串
+ if (trim === ' ') {
+ if (flag) return
+ // #ifdef VUE3
+ else {
+ const parent = this.stack[this.stack.length - 1]
+ if (parent && parent.name[0] === 't') return
+ }
+ // #endif
+ }
+ text = trim
+ }
+ const node = Object.create(null)
+ node.type = 'text'
+ // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3
+ node.attrs = {}
+ // #endif
+ node.text = decodeEntity(text)
+ if (this.hook(node)) {
+ // #ifdef MP-WEIXIN
+ if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) {
+ this.expose()
+ }
+ // #endif
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push(node)
+ }
}
/**
* @description html 词法分析器
* @param {Object} handler 高层处理器
*/
-function Lexer(handler) {
- this.handler = handler
+function Lexer (handler) {
+ this.handler = handler
}
/**
* @description 执行解析
* @param {String} content 要解析的文本
*/
-Lexer.prototype.parse = function(content) {
- this.content = content || ''
- this.i = 0 // 标记解析位置
- this.start = 0 // 标记一个单词的开始位置
- this.state = this.text // 当前状态
- for (let len = this.content.length; this.i !== -1 && this.i < len;) {
- this.state()
- }
+Lexer.prototype.parse = function (content) {
+ this.content = content || ''
+ this.i = 0 // 标记解析位置
+ this.start = 0 // 标记一个单词的开始位置
+ this.state = this.text // 当前状态
+ for (let len = this.content.length; this.i !== -1 && this.i < len;) {
+ this.state()
+ }
}
/**
@@ -1188,158 +1156,158 @@ Lexer.prototype.parse = function(content) {
* @returns {Boolean} 是否闭合
* @private
*/
-Lexer.prototype.checkClose = function(method) {
- const selfClose = this.content[this.i] === '/'
- if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
- if (method) {
- this.handler[method](this.content.substring(this.start, this.i))
- }
- this.i += selfClose ? 2 : 1
- this.start = this.i
- this.handler.onOpenTag(selfClose)
- if (this.handler.tagName === 'script') {
- this.i = this.content.indexOf('', this.i)
- if (this.i !== -1) {
- this.i += 2
- this.start = this.i
- }
- this.state = this.endTag
- } else {
- this.state = this.text
- }
- return true
- }
- return false
+Lexer.prototype.checkClose = function (method) {
+ const selfClose = this.content[this.i] === '/'
+ if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
+ if (method) {
+ this.handler[method](this.content.substring(this.start, this.i))
+ }
+ this.i += selfClose ? 2 : 1
+ this.start = this.i
+ this.handler.onOpenTag(selfClose)
+ if (this.handler.tagName === 'script') {
+ this.i = this.content.indexOf('', this.i)
+ if (this.i !== -1) {
+ this.i += 2
+ this.start = this.i
+ }
+ this.state = this.endTag
+ } else {
+ this.state = this.text
+ }
+ return true
+ }
+ return false
}
/**
* @description 文本状态
* @private
*/
-Lexer.prototype.text = function() {
- this.i = this.content.indexOf('<', this.i) // 查找最近的标签
- if (this.i === -1) {
- // 没有标签了
- if (this.start < this.content.length) {
- this.handler.onText(this.content.substring(this.start, this.content.length))
- }
- return
- }
- const c = this.content[this.i + 1]
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
- // 标签开头
- if (this.start !== this.i) {
- this.handler.onText(this.content.substring(this.start, this.i))
- }
- this.start = ++this.i
- this.state = this.tagName
- } else if (c === '/' || c === '!' || c === '?') {
- if (this.start !== this.i) {
- this.handler.onText(this.content.substring(this.start, this.i))
- }
- const next = this.content[this.i + 2]
- if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
- // 标签结尾
- this.i += 2
- this.start = this.i
- this.state = this.endTag
- return
- }
- // 处理注释
- let end = '-->'
- if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
- end = '>'
- }
- this.i = this.content.indexOf(end, this.i)
- if (this.i !== -1) {
- this.i += end.length
- this.start = this.i
- }
- } else {
- this.i++
- }
+Lexer.prototype.text = function () {
+ this.i = this.content.indexOf('<', this.i) // 查找最近的标签
+ if (this.i === -1) {
+ // 没有标签了
+ if (this.start < this.content.length) {
+ this.handler.onText(this.content.substring(this.start, this.content.length))
+ }
+ return
+ }
+ const c = this.content[this.i + 1]
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
+ // 标签开头
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ this.start = ++this.i
+ this.state = this.tagName
+ } else if (c === '/' || c === '!' || c === '?') {
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ const next = this.content[this.i + 2]
+ if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
+ // 标签结尾
+ this.i += 2
+ this.start = this.i
+ this.state = this.endTag
+ return
+ }
+ // 处理注释
+ let end = '-->'
+ if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
+ end = '>'
+ }
+ this.i = this.content.indexOf(end, this.i)
+ if (this.i !== -1) {
+ this.i += end.length
+ this.start = this.i
+ }
+ } else {
+ this.i++
+ }
}
/**
* @description 标签名状态
* @private
*/
-Lexer.prototype.tagName = function() {
- if (blankChar[this.content[this.i]]) {
- // 解析到标签名
- this.handler.onTagName(this.content.substring(this.start, this.i))
- while (blankChar[this.content[++this.i]]);
- if (this.i < this.content.length && !this.checkClose()) {
- this.start = this.i
- this.state = this.attrName
- }
- } else if (!this.checkClose('onTagName')) {
- this.i++
- }
+Lexer.prototype.tagName = function () {
+ if (blankChar[this.content[this.i]]) {
+ // 解析到标签名
+ this.handler.onTagName(this.content.substring(this.start, this.i))
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < this.content.length && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
+ } else if (!this.checkClose('onTagName')) {
+ this.i++
+ }
}
/**
* @description 属性名状态
* @private
*/
-Lexer.prototype.attrName = function() {
- let c = this.content[this.i]
- if (blankChar[c] || c === '=') {
- // 解析到属性名
- this.handler.onAttrName(this.content.substring(this.start, this.i))
- let needVal = c === '='
- const len = this.content.length
- while (++this.i < len) {
- c = this.content[this.i]
- if (!blankChar[c]) {
- if (this.checkClose()) return
- if (needVal) {
- // 等号后遇到第一个非空字符
- this.start = this.i
- this.state = this.attrVal
- return
- }
- if (this.content[this.i] === '=') {
- needVal = true
- } else {
- this.start = this.i
- this.state = this.attrName
- return
- }
- }
- }
- } else if (!this.checkClose('onAttrName')) {
- this.i++
- }
+Lexer.prototype.attrName = function () {
+ let c = this.content[this.i]
+ if (blankChar[c] || c === '=') {
+ // 解析到属性名
+ this.handler.onAttrName(this.content.substring(this.start, this.i))
+ let needVal = c === '='
+ const len = this.content.length
+ while (++this.i < len) {
+ c = this.content[this.i]
+ if (!blankChar[c]) {
+ if (this.checkClose()) return
+ if (needVal) {
+ // 等号后遇到第一个非空字符
+ this.start = this.i
+ this.state = this.attrVal
+ return
+ }
+ if (this.content[this.i] === '=') {
+ needVal = true
+ } else {
+ this.start = this.i
+ this.state = this.attrName
+ return
+ }
+ }
+ }
+ } else if (!this.checkClose('onAttrName')) {
+ this.i++
+ }
}
/**
* @description 属性值状态
* @private
*/
-Lexer.prototype.attrVal = function() {
- const c = this.content[this.i]
- const len = this.content.length
- if (c === '"' || c === "'") {
- // 有冒号的属性
- this.start = ++this.i
- this.i = this.content.indexOf(c, this.i)
- if (this.i === -1) return
- this.handler.onAttrVal(this.content.substring(this.start, this.i))
- } else {
- // 没有冒号的属性
- for (; this.i < len; this.i++) {
- if (blankChar[this.content[this.i]]) {
- this.handler.onAttrVal(this.content.substring(this.start, this.i))
- break
- } else if (this.checkClose('onAttrVal')) return
- }
- }
- while (blankChar[this.content[++this.i]]);
- if (this.i < len && !this.checkClose()) {
- this.start = this.i
- this.state = this.attrName
- }
+Lexer.prototype.attrVal = function () {
+ const c = this.content[this.i]
+ const len = this.content.length
+ if (c === '"' || c === "'") {
+ // 有冒号的属性
+ this.start = ++this.i
+ this.i = this.content.indexOf(c, this.i)
+ if (this.i === -1) return
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ } else {
+ // 没有冒号的属性
+ for (; this.i < len; this.i++) {
+ if (blankChar[this.content[this.i]]) {
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ break
+ } else if (this.checkClose('onAttrVal')) return
+ }
+ }
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < len && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
}
/**
@@ -1347,19 +1315,19 @@ Lexer.prototype.attrVal = function() {
* @returns {String} 结束的标签名
* @private
*/
-Lexer.prototype.endTag = function() {
- const c = this.content[this.i]
- if (blankChar[c] || c === '>' || c === '/') {
- this.handler.onCloseTag(this.content.substring(this.start, this.i))
- if (c !== '>') {
- this.i = this.content.indexOf('>', this.i)
- if (this.i === -1) return
- }
- this.start = ++this.i
- this.state = this.text
- } else {
- this.i++
- }
+Lexer.prototype.endTag = function () {
+ const c = this.content[this.i]
+ if (blankChar[c] || c === '>' || c === '/') {
+ this.handler.onCloseTag(this.content.substring(this.start, this.i))
+ if (c !== '>') {
+ this.i = this.content.indexOf('>', this.i)
+ if (this.i === -1) return
+ }
+ this.start = ++this.i
+ this.state = this.text
+ } else {
+ this.i++
+ }
}
-export default Parser
\ No newline at end of file
+export default Parser
diff --git a/vite.config.js b/vite.config.js
index 9e90f89e..40016f4f 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,6 +1,4 @@
-import {
- loadEnv
-} from 'vite';
+import { loadEnv } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';
import path from 'path';
// import viteCompression from 'vite-plugin-compression';
@@ -33,4 +31,4 @@ export default (command, mode) => {
},
},
};
-};
\ No newline at end of file
+};