Merge branch 'Branch_1' of https://git.u8t.cn/tangxinyue/alipay-emulator into Branch_1

This commit is contained in:
小李 2026-05-15 09:38:41 +08:00
commit d690a8d48c
35 changed files with 4779 additions and 255 deletions

View File

@ -1,7 +1,8 @@
<template>
<view class="auto-width-input-container" :class="{ 'is-textarea': type === 'textarea' }">
<!-- 测量层用于计算宽度的影藏文本必须保持与 input 相同的字体样式 -->
<text v-if="type !== 'textarea'" class="measure-text" :style="[inputStyle, { visibility: 'hidden', position: 'absolute', whiteSpace: 'nowrap' }]">
<text v-if="type !== 'textarea'" class="measure-text"
:style="[inputStyle, { visibility: 'hidden', position: 'absolute', whiteSpace: 'nowrap' }]">
{{ modelValue || placeholder }}
</text>
@ -187,9 +188,10 @@ onMounted(() => {
vertical-align: middle;
max-width: 100%;
flex-wrap: nowrap;
// flex-1 width: 100% flex
&.flex-1, &.w100 {
&.flex-1,
&.w100 {
display: flex !important;
width: 100% !important;
}
@ -215,7 +217,7 @@ onMounted(() => {
height: 1.4em;
line-height: 1.4em;
flex-shrink: 0;
// input
& {
flex: 1;

View File

@ -87,6 +87,21 @@
"navigationBarTitleText": "淘宝购物外卖订单列表",
"navigationStyle": "custom"
}
},
{
"path": "taobao/shopping-order-detail/shopping-order-detail",
"style": {
"navigationBarTitleText": "淘宝购物详情页",
"navigationStyle": "custom"
}
},
{
"path" : "taobao/add-shopping-order/add-shopping-order",
"style" :
{
"navigationBarTitleText" : "新增淘宝购物订单",
"navigationStyle": "custom"
}
}
]
},
@ -303,18 +318,16 @@
}
},
{
"path" : "silkBanner/silkBanner",
"style" :
{
"navigationBarTitleText" : "锦旗",
"path": "silkBanner/silkBanner",
"style": {
"navigationBarTitleText": "锦旗",
"navigationStyle": "custom"
}
},
{
"path" : "certificate/index",
"style" :
{
"navigationBarTitleText" : "证书",
"path": "certificate/index",
"style": {
"navigationBarTitleText": "证书",
"navigationStyle": "custom"
}
}

View File

@ -961,7 +961,7 @@
{
"id": "70085b84-5e10-4ece-a971-9242e19b47de",
"shopType": "self",
"shopName": "路易威登京东官方旗舰店",
"shopName": "路易威登官方旗舰店",
"status": "正在出库",
"trackingTitle": "仓库处理中",
"trackingDesc": "预计明天9:00-15:00送达",

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
<template>
<view class="card-wrapper">
<view class="card-container" v-for="(item, index) in list" :key="index">
<view class="card-container" v-for="(item, index) in list" :key="index" @click.stop="clickItem(item)"
@touchstart="handleTouchStart($event, item)" @touchmove="handleTouchMove" @touchend="handleTouchEnd">
<!-- 顶部店铺和状态 -->
<view class="card-header">
<view class="shop-info">
@ -25,8 +26,8 @@
</image>
<view class="goods-info" :id="'goods-info-' + index + '-' + gIdx">
<view class="goods-title-row">
<view class="good-info-box">
<text class="goods-title">{{ goods.title }}</text>
<view class="good-info-box" :id="'title-box-' + index + '-' + gIdx">
<text class="goods-title">{{ getTruncatedTitle(item, index, goods, gIdx) }}</text>
<view class="goods-spec" v-if="goods.specs">{{ goods.specs }}</view>
</view>
@ -37,9 +38,8 @@
</view>
</view>
<view class="goods-tags"
v-if="goods.tags && goods.tags.length && item.statusType !== 'refunding'">
<text class="tag" v-for="(tag, tIdx) in goods.tags" :key="tIdx">{{ tag }}</text>
<view class="goods-tags" v-if="goods.tags && item.statusType !== 'refunding'">
<text class="tag">{{ goods.tags }}</text>
</view>
<!-- 单个商品的售后状态 -->
<view class="goods-evaluation" v-if="item.statusType == 'success'">
@ -83,7 +83,8 @@
:src="`/static/image/shopping/taobao/${item.isSignFor ? 'yiqianshou' : 'yunshuzhong'}.png`">
</image>
<text class="title">{{ item.isSignFor ? '已签收' : '运输中' }}</text>
<text class="text">{{ item.statusDesc }}</text>
<text class="text flex-1">{{ item.statusDesc2 || item.statusDesc1 }}</text>
<uni-icons v-if="item.statusDesc2" type="right" size="14" color="#7B7E8C"></uni-icons>
</view>
<view v-else-if="item.statusType == 'refunding'" class="tips-box yunshuzhong">
@ -120,7 +121,7 @@
</template>
<script setup>
import { defineProps, defineEmits, ref, watch, nextTick, getCurrentInstance } from 'vue';
import { defineProps, defineEmits, ref, watch, nextTick, getCurrentInstance, onMounted } from 'vue';
const props = defineProps({
list: {
@ -129,32 +130,81 @@ const props = defineProps({
}
});
const emit = defineEmits(['action', 'detail']);
const emit = defineEmits(['action', 'detail', 'click-item', 'longpress']);
const instance = getCurrentInstance();
const imgHeights = ref({});
const titleMap = ref({}); // key: 'itemIdx-goodsIdx'
const longPressTimer = ref(null);
const touchStartPos = ref({ x: 0, y: 0 });
/**
* shopping-card.vue 对齐的字符权重截断算法
*/
const calcFitTitle = (originalTitle, containerWidth) => {
const fontSize = uni.upx2px(26);
let currentWidth = 0;
let cutIndex = 0;
let found = false;
for (let i = 0; i < originalTitle.length; i++) {
const char = originalTitle[i];
const charCode = char.charCodeAt(0);
let weight = 1;
if (charCode <= 255) {
if (/[A-Z]/.test(char)) weight = 0.7;
else if (/[a-z]/.test(char)) weight = 0.5;
else if (/[0-9]/.test(char)) weight = 0.55;
else if (char === ' ') weight = 0.25;
else weight = 0.5;
}
currentWidth += weight * fontSize;
if (currentWidth > containerWidth - uni.upx2px(4)) {
cutIndex = i;
found = true;
break;
}
}
return found ? originalTitle.slice(0, cutIndex - 1) : originalTitle;
};
/**
* 供模板调用返回截取后的标题
*/
const getTruncatedTitle = (item, index, goods, gIdx) => {
const key = index + '-' + gIdx;
return titleMap.value[key] !== undefined ? titleMap.value[key] : (goods.title || '');
};
const calculateHeights = () => {
nextTick(() => {
setTimeout(() => {
if (!instance || !instance.proxy) return;
const query = uni.createSelectorQuery().in(instance.proxy);
let keys = [];
if (!props.list || props.list.length === 0) return;
const heightQuery = uni.createSelectorQuery().in(instance.proxy);
const titleQuery = uni.createSelectorQuery().in(instance.proxy);
let keys = [];
props.list.forEach((item, index) => {
if (!item.goodsList) return;
item.goodsList.forEach((goods, gIdx) => {
const key = index + '-' + gIdx;
keys.push(key);
query.select('#goods-info-' + key).boundingClientRect();
heightQuery.select('#goods-info-' + key).boundingClientRect();
titleQuery.select('#title-box-' + key).boundingClientRect();
});
});
if (keys.length > 0) {
query.exec((res) => {
//
heightQuery.exec((res) => {
if (res && res.length > 0) {
res.forEach((data, i) => {
if (data && data.height) {
@ -163,8 +213,23 @@ const calculateHeights = () => {
});
}
});
//
titleQuery.exec((res) => {
if (res && res.length > 0) {
res.forEach((data, i) => {
if (data && data.width) {
const [li, gi] = keys[i].split('-').map(Number);
const goods = props.list[li]?.goodsList?.[gi];
if (goods && goods.title) {
titleMap.value[keys[i]] = calcFitTitle(goods.title, data.width);
}
}
});
}
});
}
}, 100); //
}, 300); //
});
};
@ -172,6 +237,12 @@ watch(() => props.list, () => {
calculateHeights();
}, { deep: true, immediate: true });
//
// shopping-card.vue onMounted
onMounted(() => {
setTimeout(calculateHeights, 500);
});
//
const getStatusText = (status) => {
const map = {
@ -264,6 +335,51 @@ const getButtons = (status) => {
return map[status] || [];
};
const clickItem = (item) => {
emit('click-item', item);
}
const handleTouchStart = (e, item) => {
const touch = e.touches[0];
touchStartPos.value = { x: touch.clientX, y: touch.clientY };
//
if (longPressTimer.value) clearTimeout(longPressTimer.value);
// 800ms ()
longPressTimer.value = setTimeout(() => {
//
uni.vibrateShort();
emit('longpress', {
item,
x: touch.clientX,
y: touch.clientY
});
longPressTimer.value = null;
}, 800);
}
const handleTouchMove = (e) => {
const touch = e.touches[0];
const offsetX = Math.abs(touch.clientX - touchStartPos.value.x);
const offsetY = Math.abs(touch.clientY - touchStartPos.value.y);
// 10px
if (offsetX > 10 || offsetY > 10) {
if (longPressTimer.value) {
clearTimeout(longPressTimer.value);
longPressTimer.value = null;
}
}
}
const handleTouchEnd = () => {
if (longPressTimer.value) {
clearTimeout(longPressTimer.value);
longPressTimer.value = null;
}
}
const getTotalCount = (goodsList) => {
if (!goodsList || !goodsList.length) return 0;
return goodsList.reduce((sum, item) => sum + (Number(item.count) || 1), 0);
@ -331,6 +447,8 @@ const goToDetail = (item) => {
margin-bottom: 18rpx;
.goods-img {
height: 92px;
width: 92px;
min-width: 178rpx;
min-height: 178rpx;
border-radius: 12rpx;
@ -338,6 +456,8 @@ const goToDetail = (item) => {
flex-shrink: 0;
&.refunding {
width: 74px;
height: 74px;
min-width: 142rpx;
min-height: 142rpx;
}
@ -363,9 +483,7 @@ const goToDetail = (item) => {
font-size: 26rpx;
color: #00032A;
line-height: 36rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
white-space: nowrap;
overflow: hidden;
flex: 1;
margin-right: 18rpx;
@ -483,13 +601,16 @@ const goToDetail = (item) => {
align-items: center;
.title {
flex-shrink: 0;
color: #1A1A1A;
margin-left: 8rpx;
margin-right: 20rpx;
font-weight: 500;
white-space: nowrap;
}
.tip-icon {
flex-shrink: 0;
width: 30rpx;
height: 30rpx;
margin-right: 12rpx;
@ -498,6 +619,9 @@ const goToDetail = (item) => {
.text {
font-size: 26rpx;
color: #7C8495;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&.daifukuan {

View File

@ -3,61 +3,753 @@
"shoppingType": [
{
"label": "待付款",
"key": "daifukuan"
"key": "wait_pay"
},
{
"label": "待发货",
"key": "daifahuo"
"key": "wait_send"
},
{
"label": "待收货",
"key": "daishouhuo"
"key": "wait_recv"
},
{
"label": "退款/售后",
"key": "tuikuanshouhou"
"key": "refunding"
},
{
"label": "评价",
"key": "pingjia"
"label": "交易成功",
"key": "success"
},
{
"label": "已取消",
"key": "yiquxiao"
"label": "交易关闭",
"key": "closed"
}
],
//
"shoppingClassfiy": {
"daifukuan": {
"status": "待付款",
"statusDesc": "卖家未发货",
"shopName": "细条条",
"shopType": "taobao", //-taobao-tianmao-baiyibutie
"totalPrice": "",
"carriage": "0.00",
"products": [
"wait_pay": {
"id": "",
"orderType": "shopping",
"shopName": "路易威登京东官方旗舰店",
"statusType": "wait_pay",
"shopType": "taobao",
"statusDesc": "",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"totalPrice": "23979.25",
"platformDiscount": "",
"storeDiscount": "",
"points": "",
"coupons": "",
"goodsList": [
{
"image": "",
"title": "",
"desc": "",
"service": "",
"specs": "",
"price": "",
"count": "",
"stuta": {
"value": "买家已付款", //---,退
"key": "daifukuan",
"desc": "申请退款"
}
"oriPrice": "",
"count": 1,
"tags": "七天无理由退换"
}
],
"orderId": "",
"orderInfo": [
{
"label": "订单编号",
"key": "orderNumber",
"label": "创建时间",
"key": "createTime",
"value": "",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "",
"type": "number"
},
{
"label": "天猫积分",
"key": "tianmaoIntegral",
"value": "获得19点积分",
"type": "text"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据",
"type": "text"
}
],
"statusDesc1": "承诺48小时内发货",
"statusDesc2": "预计明天发货",
"payCountdown": "11:48:50"
},
"wait_send": {
"id": "",
"orderType": "shopping",
"shopType": "tianmao",
"shopName": "天猫超市-五粮液自营店",
"statusType": "wait_send",
"statusDesc": "预计明天送达",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"totalPrice": "",
"platformDiscount": "",
"storeDiscount": "",
"points": "",
"coupons": "",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/wuliangye.png",
"title": "五粮液 普五 第八代 浓香型白酒 52度 500ml*2瓶",
"specs": "500ml*2礼盒装浓香型",
"price": "",
"oriPrice": "",
"count": 1,
"tags": "正品保障 七天无理由退货"
}
],
"orderId": "",
"orderInfo": [
{
"label": "付款时间",
"key": "paymentTime",
"value": "",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "",
"type": "number"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据",
"type": "text"
},
{
"label": "支付方式",
"key": "paymentMethod",
"value": "支付宝支付",
"type": "text"
}
],
"statusDesc1": "承诺48小时内发货",
"statusDesc2": "预计明天发货"
},
"wait_recv": {
"id": "",
"orderType": "shopping",
"shopName": "Apple 官方旗舰店",
"statusType": "wait_recv",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"isSignFor": true,
"shopType": "taobao",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/iphone.png",
"title": "Apple iPhone 17 Pro Max",
"specs": "Apple/苹果 iPhone 17 Pro Max 1TB 星宇橙色",
"price": "10999.00",
"oriPrice": " ",
"count": 1,
"tags": "免费上门退换 七天无理由退货"
}
],
"platformDiscount": "",
"storeDiscount": "",
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "发货时间",
"key": "deliveryTime",
"value": "",
"type": "time"
},
{
"label": "付款时间",
"key": "paymentTime",
"value": "",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "",
"type": "number"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据",
"type": "text"
},
{
"label": "支付方式",
"key": "paymentMethod",
"value": "支付宝支付",
"type": "text"
}
],
"statusDesc1": "已签收",
"statusDesc2": "【上海市】 您已在上海市浦东新区汤臣一品完成取件",
"confirmReceiptCountdown": "9天7小时"
},
"success": {
"id": "202605110005",
"orderType": "shopping",
"shopName": "三只松鼠旗舰店",
"statusType": "success",
"shopType": "taobao",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"goodsList": [
{
"image": "",
"title": "三只松鼠 坚果大礼包 每日坚果 送礼佳品 1498g",
"specs": "颜色分类: 坚果礼盒1498g",
"price": "128.00",
"oriPrice": "158.00",
"count": 2,
"tags": "正品保障"
}
],
"totalPrice": "266.00",
"platformDiscount": "",
"storeDiscount": "",
"points": "10.00",
"coupons": "5.00",
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "成交时间",
"key": "deliveryTime",
"value": "",
"type": "time"
},
{
"label": "发货时间",
"key": "deliveryTime",
"value": "",
"type": "time"
},
{
"label": "付款时间",
"key": "paymentTime",
"value": "",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "",
"type": "number"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据",
"type": "text"
},
{
"label": "收货信息",
"key": "shippingInfo",
"value": "",
"type": "address"
},
{
"label": "支付方式",
"key": "paymentMethod",
"value": "支付宝支付",
"type": "text"
}
]
},
"closed": {
"id": "202605110006",
"orderType": "shopping",
"shopName": "Apple Store 官方旗舰店",
"statusType": "closed",
"shopType": "tianmao",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"goodsList": [
{
"image": "",
"title": "Apple iPhone 15 Pro (A3104) 256GB 原色钛金属 5G手机",
"specs": "颜色分类: 原色钛金属; 内存容量: 256GB",
"price": "8999.00",
"oriPrice": "9999.00",
"count": 1,
"tags": "正品保障"
}
],
"totalPrice": "8999.00",
"platformDiscount": "",
"storeDiscount": "",
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "成交时间",
"key": "deliveryTime",
"value": "",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "",
"type": "number"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据",
"type": "text"
},
{
"label": "收货信息",
"key": "shippingInfo",
"value": "",
"type": "address"
}
]
},
"refunding": {
"id": "202605110007",
"orderType": "shopping",
"shopName": "优衣库官方旗舰店",
"statusType": "refunding",
"statusDesc": "平台支持退款",
"shopType": "taobao",
"refundMoney": "199.00",
"refundIcon": 1,
"productImgUrl": "/static/image/shopping/taobao/detail/refund/product1.png",
"goodsList": [
{
"image": "",
"title": "UNIQLO 优衣库 男装/女装 摇粒绒拉链运动开衫(长袖) 463351",
"specs": "颜色分类: 藏青色; 尺码: L",
"price": "199.00",
"count": 1,
"tags": "正品保障",
"refundStatus": "退款成功"
}
],
"totalPrice": "199.00",
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "退款原因",
"key": "refundReason",
"value": "七天无理由退货",
"type": "text"
},
{
"label": "退款金额",
"key": "refunMoney",
"value": "",
"type": "digit"
},
{
"label": "退款完结",
"key": "refunTime",
"value": "",
"type": "time"
},
{
"label": "申请时间",
"key": "applyTime",
"value": "",
"type": "time"
},
{
"label": "退款编号",
"key": "refundId",
"value": "",
"type": "number"
}
],
"statusDesc1": "退回支付宝",
"statusDesc2": "您已享受全额保障5.56元"
}
},
// "购物随机产品列表"
"shoppingProductList": [
{
"shopType": "taobao",
"shopName": "京东数码自营旗舰店",
"totalPrice": "0",
"carriage": "0.00",
"discount": "0",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/xianka.png",
"name": "",
"title": "华硕 TUF 5090显卡",
"specs": "5090旗舰算力 水冷夜神OC",
"tags": "不支持7天无理由退货",
"price": "39849.00",
"count": "1"
}
]
},
{
"shopType": "tianmao",
"shopName": "Apple 产品京东自营旗舰店",
"totalPrice": "",
"platformDiscount": "10.00",
"storeDiscount": "20.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/iphone.png",
"name": "Apple iPhone 17 Pro",
"title": "Apple/苹果 iPhone 17 Pro Max 1TB 星宇橙色",
"specs": "星宇橙色全网通5G",
"tags": "免费上门退换 七天无理由退货",
"price": "12999.00",
"count": "1"
}
]
},
{
"shopType": "taobao",
"shopName": "路易威登京东官方旗舰店",
"totalPrice": "",
"platformDiscount": "50.00",
"storeDiscount": "8.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/lv.png",
"name": "LV",
"title": "路易威登 经典老花手提包",
"specs": "经典老花;手提包",
"tags": "次日达",
"price": "23979.25",
"count": "1"
}
]
},
{
"shopType": "tianmao",
"shopName": "索尼SONY数码京东官方旗舰店",
"totalPrice": "15499.00",
"platformDiscount": "1.32",
"storeDiscount": "2.3",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/sony.png",
"name": "Sony",
"title": "索尼SONYAlpha 7 IV 全画幅微单数码相机",
"specs": "单机身不含镜头约3300万有效像素",
"tags": "厂家发货",
"price": "15499.00",
"count": "1"
}
]
},
{
"shopType": "tianmao",
"shopName": "京东超市-五粮液自营店",
"totalPrice": "2198.00",
"platformDiscount": "100.00",
"storeDiscount": "200.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/wuliangye.png",
"name": "五粮液",
"title": "五粮液 普五 第八代 浓香型白酒 52度 500ml*2瓶",
"specs": "500ml*2礼盒装浓香型",
"tags": "211限时达",
"price": "1099.00",
"count": "2"
}
]
},
{
"shopType": "taobao",
"shopName": "戴森Dyson京东自营官方旗舰店",
"totalPrice": "3299.00",
"platformDiscount": "150.00",
"storeDiscount": "200.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/dyson_v12.png",
"name": "戴森",
"title": "戴森(Dyson) V12 Detect Slim 无绳吸尘器",
"specs": "轻量版;激光探测;轻量吸尘器",
"tags": "次日达",
"price": "3299.00",
"count": "1"
}
]
}
}
],
//
"defualtData": [
{
"id": "202605110001",
"orderType": "shopping",
"shopName": "路易威登京东官方旗舰店",
"statusType": "wait_pay",
"shopType": "taobao",
"statusDesc": "",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"totalPrice": "23979.25",
"platformDiscount": "150.00",
"storeDiscount": "200.00",
"points": "1.00",
"coupons": "1.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/lv.png",
"title": "【官方正品】路易威登 经典老花手提包",
"specs": "经典老花;手提包",
"price": "23979.25",
"oriPrice": "23979.25",
"count": 1,
"tags": "七天无理由退换"
}
],
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "创建时间",
"key": "createTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "2026031121001039760581201016"
},
{
"label": "天猫积分",
"key": "tianmaoIntegral",
"value": "获得19点积分"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据"
}
],
"statusDesc1": "承诺48小时内发货",
"statusDesc2": "预计明天发货",
"payCountdown": "11:48:50"
},
{
"id": "202605110002",
"orderType": "shopping",
"shopType": "tianmao",
"shopName": "天猫超市-五粮液自营店",
"statusType": "wait_send",
"statusDesc": "预计明天送达",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"totalPrice": "2198.00",
"platformDiscount": "50.00",
"storeDiscount": "50.00",
"points": "1.00",
"coupons": "1.00",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/wuliangye.png",
"title": "五粮液 普五 第八代 浓香型白酒 52度 500ml*2瓶",
"specs": "500ml*2礼盒装浓香型",
"price": "1099.00",
"count": 2,
"tags": "正品保障 七天无理由退货"
}
],
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "付款时间",
"key": "paymentTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "2026031121001039760581201016"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据"
},
{
"label": "支付方式",
"key": "paymentMethod",
"value": "支付宝支付"
}
],
"statusDesc1": "承诺48小时内发货",
"statusDesc2": "预计明天发货"
},
{
"id": "202605110003",
"orderType": "shopping",
"shopName": "Apple 官方旗舰店",
"statusType": "wait_recv",
"address": "上海市浦东新区汤臣一品",
"userName": "张三",
"phone": "13812345678",
"isSignFor": true,
"shopType": "taobao",
"goodsList": [
{
"image": "/static/image/shopping/jingdong/product/shopping/iphone.png",
"title": "Apple iPhone 17 Pro Max",
"specs": "Apple/苹果 iPhone 17 Pro Max 1TB 星宇橙色",
"price": "10999.00",
"oriPrice": "12999.00",
"count": 1,
"tags": "免费上门退换 七天无理由退货"
}
],
"totalPrice": "10999.00",
"platformDiscount": "200.00",
"orderId": "2026031121001039760581201016",
"orderInfo": [
{
"label": "发货时间",
"key": "deliveryTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "付款时间",
"key": "paymentTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "创建时间",
"key": "createTime",
"value": "2026-03-11 09:48:05",
"type": "time"
},
{
"label": "支付宝交易号",
"key": "alipayTransactionNum",
"value": "2026031121001039760581201016"
},
{
"label": "交易快照",
"key": "transactionSnapshot",
"value": "发生交易争执时,可作为判断依据"
},
{
"label": "支付方式",
"key": "paymentMethod",
"value": "支付宝支付"
}
],
"statusDesc1": "已签收",
"statusDesc2": "【上海市】 您已在上海市浦东新区汤臣一品完成取件",
"confirmReceiptCountdown": "9天7小时"
}
// {
// "id": "202605110008",
// "orderType": "waimai",
// "shopName": "美团外卖-麦当劳",
// "statusType": "success",
// "statusDesc": "订单已完成",
// "shopType": "taobao",
// "goodsList": [
// {
// "image": "",
// "title": "麦辣鸡腿堡套餐",
// "specs": "默认",
// "price": "32.00",
// "count": 1,
// "tags": "正品保障"
// }
// ],
// "totalPrice": "32.00"
// },
// {
// "id": "202605110009",
// "orderType": "waimai",
// "shopName": "饿了么-星巴克",
// "statusType": "wait_send",
// "statusDesc": "商家准备中",
// "shopType": "taobao",
// "goodsList": [
// {
// "image": "",
// "title": "拿铁咖啡",
// "specs": "大杯 / 热",
// "price": "28.00",
// "count": 1,
// "tags": "正品保障"
// }
// ],
// "totalPrice": "28.00"
// },
// {
// "id": "202605110010",
// "orderType": "waimai",
// "shopName": "淘鲜达-盒马鲜生",
// "statusType": "success",
// "statusDesc": "订单已完成",
// "shopType": "taobao",
// "goodsList": [
// {
// "image": "",
// "title": "进口智利车厘子 500g",
// "specs": "JJ级",
// "price": "59.00",
// "count": 1,
// "tags": "一小时送达"
// }
// ],
// "totalPrice": "59.00"
// }
]
}

View File

@ -32,6 +32,9 @@
</view>
</template>
</nav-bar>
<nav-bar v-else title="拼图" bgColor="#EFEFEF" noBack @back="closeImage" isRightButton
@right-click="confirmImage">
</nav-bar>
<view class="tab-list">
<view class="tab-item" v-for="(item, index) in tabList" :key="index"
:class="{ active: currentTab === index }" @click="switchTab(index)">
@ -75,213 +78,169 @@
<uni-icons type="right" size="14" color="#5E6367"></uni-icons>
</view>
</view>
<listCard :list="displayList" />
<listCard v-if="displayList.length > 0" :list="displayList" @click-item="goDetail"
@longpress="onItemLongPress" />
<view v-else class="null-data-box flex-center flex-column">
<image style="width: 254rpx;height: 200rpx;" src="/static/image/shopping/taobao/null.png"></image>
<text
style="font-size: 28rpx;color: #7C8495;line-height: 28rpx;margin-top: 16rpx;font-weight: 500;">您还没有相关的订单</text>
</view>
<view class="bottom-fixed" style="height: 1000rpx;">
<view v-if="!selectedImage" class="upload-screenshot-box" @touchstart="handleTouchStart"
@touchend="handleTouchEnd">
<view v-if="!screenshotImage" class="upload-screenshot-content">
<image class="upload-screenshot" src="/static/image/common/upload-screenshot.png"
mode="aspectFit">
</image>
<view class="upload-screenshot-text">长按替换截图</view>
</view>
<view v-else class="screenshot-preview-box">
<image class="screenshot-preview" :src="screenshotImage" mode="widthFix"></image>
</view>
<!-- <image v-else class="w100 h100" :src="screenshotImage" mode="widthFix"></image> -->
</view>
<view v-else class="upload-screenshot-box scroll-image-box">
<scroll-view class="image-box" style="width: 100%;height: 100%;" scroll-y :show-scrollbar="false"
@scroll="onImageScroll">
<image class="crop-image-target" style="width:100%;" :src="selectedImage" mode="widthFix">
</image>
</scroll-view>
<view class="dashed-line-box">
<view class="dashed-line-text">我是分割线</view>
</view>
</view>
<canvas canvas-id="crop-canvas"
style="position: fixed; left: -9999px; width: 750rpx; height: 100vh; pointer-events: none;"></canvas>
</view>
</scroll-view>
</view>
<!-- 自定义长按上下文菜单 -->
<view v-if="menuState.show" class="menu-mask" @click="menuState.show = false" @touchmove.stop.prevent>
<view class="menu-content" :style="{ top: menuState.y + 'px', left: menuState.x + 'px' }">
<view class="menu-item" @click.stop="handleMenuAction('edit')">
<uni-icons type="compose" size="18" color="#1A1A1A"></uni-icons>
<text>编辑</text>
</view>
<view class="menu-line"></view>
<view class="menu-item" @click.stop="handleMenuAction('delete')">
<uni-icons type="trash" size="18" color="#FF4D4F"></uni-icons>
<text style="color: #FF4D4F;">删除</text>
</view>
</view>
</view>
<!-- 水印 -->
<!-- <view v-if="$isVip()">
<watermark dark="light" source="uni_alipay_shopping_taobao" />
<liu-drag-button :canDocking="false" @clickBtn="$goRechargePage('watermark', 'uni_alipay_shopping_taobao')">
<c-lottie ref="cLottieRef" :src='$watermark()' width="94px" height='74px' :loop="true"></c-lottie>
</liu-drag-button>
</view> -->
<!-- 切换底部图片弹窗 -->
<uni-popup ref="bottomImgPopup" type="center">
<view class="bottom-img-popup-card">
<view class="p-header">选择底部商品图</view>
<view class="p-content">
<view class="option-item" @click="selectBottomImg(1)">
<image class="preview-img" src="/static/image/shopping/taobao/bottom-bg-1.png" mode="aspectFill">
</image>
<view class="info">
<text class="name">商品图片 1</text>
<text class="desc">默认背景布局</text>
</view>
<uni-icons type="right" size="16" color="#C7C7CC"></uni-icons>
</view>
<view class="option-item" @click="selectBottomImg(2)">
<image class="preview-img" src="/static/image/shopping/taobao/bottom-bg-2.png" mode="aspectFill">
</image>
<view class="info">
<text class="name">商品图片 2</text>
<text class="desc">备选商品排列</text>
</view>
<uni-icons type="right" size="16" color="#C7C7CC"></uni-icons>
</view>
<text
style="color: #949494;font-size: 24rpx;text-align: center;display: block;">*长按底部商品图片区域可上传自定义图片*</text>
</view>
<view class="p-footer" @click="bottomImgPopup.close()">取消</view>
</view>
</uni-popup>
</template>
<script setup>
import { ref, computed, onMounted, getCurrentInstance } from 'vue';
import { ref, computed, onMounted, getCurrentInstance, reactive } from 'vue';
import { onShow } from '@dcloudio/uni-app';
import { util } from '@/utils/common.js';
import listCard from './components/list-card/list-card.vue';
import { defualtData } from './json/order.json'
const mockList = ref([
{
orderType: "shopping",
shopName: '淘宝心选官方旗舰店',
statusType: 'wait_pay',
shopType: 'taobao',
statusDesc: '',
goodsList: [
{
image: '',
title: '【官方正品】全棉时代纯棉柔巾洗脸巾抽纸加厚擦脸巾100抽*6包',
specs: '颜色分类: 100抽*6包',
price: '69.00',
count: 1,
tags: ['七天无理由退换']
}
],
totalPrice: '69.00'
},
{
orderType: "shopping",
shopName: '小米官方旗舰店',
statusType: 'wait_send',
statusDesc: '预计明天送达',
shopType: 'taobao',
goodsList: [
{
image: '',
title: 'Xiaomi/小米 14 徕卡光学镜头 骁龙8Gen3 澎湃OS 小米手机',
specs: '颜色分类: 黑色; 内存容量: 16GB+512GB',
price: '4599.00',
count: 1,
tags: ['正品保障', '顺丰包邮']
}
],
totalPrice: '4599.00'
},
{
orderType: "shopping",
shopName: 'NIKE官方旗舰店',
statusType: 'wait_recv',
statusDesc: '您已在重庆九龙坡区哈哈哈完成取件,...',
isSignFor: true,
shopType: 'taobao',
goodsList: [
{
image: '',
title: 'Nike耐克官方AIR FORCE 1 07空军一号男鞋板鞋运动鞋CW2288',
specs: '颜色分类: 纯白; 尺码: 42.5',
price: '749.00',
count: 1,
tags: ['假一赔四']
}
],
totalPrice: '749.00'
},
{
orderType: "shopping",
shopName: 'NIKE官方旗舰店',
statusType: 'wait_recv',
isSignFor: false,
statusDesc: "平台支持退货",
shopType: 'taobao',
goodsList: [
{
image: '',
title: 'Nike耐克官方AIR FORCE 1 07空军一号男鞋板鞋运动鞋CW2288',
specs: '颜色分类: 纯白; 尺码: 42.5',
price: '749.00',
count: 1,
tags: ['假一赔四']
}
],
totalPrice: '749.00'
},
{
orderType: "shopping",
shopName: '三只松鼠旗舰店',
statusType: 'success',
shopType: 'taobao',
goodsList: [
{
image: '',
title: '三只松鼠 坚果大礼包 每日坚果 送礼佳品 1498g',
specs: '颜色分类: 坚果礼盒1498g',
price: '128.00',
count: 2,
tags: ['过敏包退']
}
],
totalPrice: '256.00'
},
{
orderType: "shopping",
shopName: 'Apple Store 官方旗舰店',
statusType: 'closed',
shopType: 'tianmao',
goodsList: [
{
image: '',
title: 'Apple iPhone 15 Pro (A3104) 256GB 原色钛金属 5G手机',
specs: '颜色分类: 原色钛金属; 内存容量: 256GB',
price: '8999.00',
count: 1,
tags: []
}
],
totalPrice: '8999.00'
},
{
orderType: "shopping",
shopName: '优衣库官方旗舰店',
statusType: 'refunding',
statusDesc: '平台支持退款',
shopType: 'taobao',
goodsList: [
{
image: '',
title: 'UNIQLO 优衣库 男装/女装 摇粒绒拉链运动开衫(长袖) 463351',
specs: '颜色分类: 藏青色; 尺码: L',
price: '199.00',
count: 1,
tags: ['极速退款'],
refundStatus: '退款成功'
}
],
totalPrice: '199.00'
},
{
orderType: "waimai",
shopName: '美团外卖-麦当劳',
statusType: 'success',
statusDesc: '订单已完成',
shopType: 'taobao',
goodsList: [
{
image: '',
title: '麦辣鸡腿堡套餐',
specs: '默认',
price: '32.00',
count: 1,
tags: []
}
],
totalPrice: '32.00'
},
{
orderType: "waimai",
shopName: '饿了么-星巴克',
statusType: 'wait_send',
statusDesc: '商家准备中',
shopType: 'taobao',
goodsList: [
{
image: '',
title: '拿铁咖啡',
specs: '大杯 / 热',
price: '28.00',
count: 1,
tags: []
}
],
totalPrice: '28.00'
},
{
orderType: "waimai",
shopName: '淘鲜达-盒马鲜生',
statusType: 'success',
statusDesc: '订单已完成',
shopType: 'taobao',
goodsList: [
{
image: '',
title: '进口智利车厘子 500g',
specs: 'JJ级',
price: '59.00',
count: 1,
tags: ['一小时送达']
}
],
totalPrice: '59.00'
const instance = getCurrentInstance();
const mockList = ref([]);
const menuState = reactive({
show: false,
x: 0,
y: 0,
target: null
});
const bottomImgPopup = ref(null);
const selectBottomImg = (type) => {
const path = `/static/image/shopping/taobao/bottom-bg-${type}.png`;
screenshotImage.value = path;
uni.setStorageSync('taobao_screenshot', path);
bottomImgPopup.value.close();
uni.showToast({
title: '切换成功',
icon: 'success'
});
};
onShow(() => {
//
let storageData = uni.getStorageSync('taobaoShopping');
//
if (!storageData || (Array.isArray(storageData) && storageData.length === 0)) {
console.log('检测到淘宝订单缓存为空,注入初始默认数据');
storageData = JSON.parse(JSON.stringify(defualtData));
uni.setStorageSync('taobaoShopping', storageData);
}
]);
mockList.value = storageData || [];
// ()
let savedScreenshot = uni.getStorageSync('taobao_screenshot');
if (!savedScreenshot) {
savedScreenshot = '/static/image/shopping/taobao/bottom-bg-1.png';
uni.setStorageSync('taobao_screenshot', savedScreenshot);
}
screenshotImage.value = savedScreenshot;
});
//
const buttonGroup = [
{
name: "新增购物订单",
click: () => {
uni.navigateTo({
url: '/pages/shopping/taobao/add-shopping-order/add-shopping-order'
});
}
}, {
name: "新增闪购订单",
click: () => {
uni.showToast({
title: '开发中,敬请期待',
icon: 'none'
});
}
}, {
name: "切换底部商品图片",
click: () => {
bottomImgPopup.value.open();
}
},
]
const displayList = computed(() => {
let list = mockList.value;
let list = JSON.parse(JSON.stringify(mockList.value));
// 1. Tab (orderType)
if (currentTab.value === 1) { //
@ -293,15 +252,14 @@ const displayList = computed(() => {
// 2. (currentFilter)
if (currentFilter.value > 0) {
const filterName = filterList.value[currentFilter.value]?.name;
//
const statusMap = {
'待付款': ['wait_pay'],
'待发货': ['wait_send'],
'待收货': ['wait_recv'],
'退款/售后': ['refunding'],
'已关闭': ['closed'],
'待评价': ['success'] // success
'评价': ['success'],
'已关闭': ['closed']
};
const targetStatus = statusMap[filterName];
@ -310,6 +268,19 @@ const displayList = computed(() => {
}
}
// 3. ( || )
list.sort((a, b) => {
const getTime = (order) => {
if (!order.orderInfo) return '';
const create = order.orderInfo.find(i => i.key === 'createTime')?.value;
const apply = order.orderInfo.find(i => i.key === 'applyTime')?.value;
return create || apply || '';
};
const timeA = getTime(a);
const timeB = getTime(b);
return timeB.localeCompare(timeA); //
});
return list;
});
@ -320,6 +291,7 @@ const filterList = ref([
{ name: '待发货' },
{ name: '待收货' },
{ name: '退款/售后' },
{ name: '评价' },
{ name: '已关闭' }
]);
@ -331,6 +303,170 @@ const tabList = ref([
{ name: '飞猪', icon: '/static/image/shopping/taobao/lvxing.png', disabled: true }
]);
//
const screenshotImage = ref('');
const selectedImage = ref('');
const scrollTop = ref(0);
let longPressTimer = null;
// -
const chooseImage = () => {
if (selectedImage.value) return;
uni.chooseImage({
count: 1,
sourceType: ['album'],
success: (res) => {
selectedImage.value = res.tempFilePaths[0];
}
});
};
//
const handleTouchStart = (e) => {
const systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === 'ios' && systemInfo.safeAreaInsets?.bottom) {
const clientY = e.touches[0].clientY;
const windowHeight = systemInfo.windowHeight;
if (clientY > windowHeight - systemInfo.safeAreaInsets.bottom) {
return;
}
}
longPressTimer = setTimeout(() => {
uni.vibrateShort();
chooseImage();
}, 1200);
};
const handleTouchEnd = () => {
if (longPressTimer) {
clearTimeout(longPressTimer);
longPressTimer = null;
}
};
//
const onImageScroll = (e) => {
scrollTop.value = e.detail.scrollTop;
};
//
const confirmImage = () => {
uni.showLoading({
title: '处理中...'
})
const query = uni.createSelectorQuery().in(instance)
//
query.select('.image-box').boundingClientRect()
query.select('.crop-image-target').boundingClientRect()
query.exec(res => {
if (!res[0] || !res[1]) {
uni.hideLoading()
return
}
console.log('rects', res)
const container = res[0] //
const image = res[1] //
// ( / /?)
// canvas
// canvas drawImage : img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight
//
uni.getImageInfo({
src: selectedImage.value,
success: (imgInfo) => {
const scale = imgInfo.width / image.width // 图片 原始宽 / 渲染宽
const sTop = scrollTop.value * scale // Y
const sHeight = container.height * scale //
// widthFix
const sWidth = imgInfo.width
// (使)
// canvasContext使 pixelRatio
// uni-app canvas-id (px)
// canvas
const canvasW = container.width
const canvasH = container.height
const ctx = uni.createCanvasContext('crop-canvas', instance)
//
ctx.clearRect(0, 0, canvasW, canvasH)
//
// drawImage(imageResource, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
ctx.drawImage(
imgInfo.path,
0, sTop, sWidth, sHeight, //
0, 0, canvasW, canvasH //
)
ctx.draw(false, () => {
uni.canvasToTempFilePath({
canvasId: 'crop-canvas',
width: canvasW,
height: canvasH,
destWidth: sWidth, // 使,
destHeight: sHeight, // 使,
success: (res) => {
console.log('crop success (temp)', res
.tempFilePath)
//
uni.saveFile({
tempFilePath: res.tempFilePath,
success: (saveRes) => {
console.log('save success (saved)', saveRes.savedFilePath)
screenshotImage.value = saveRes.savedFilePath
selectedImage.value = '' //
setTimeout(() => {
plus.navigator.setStatusBarStyle("light");
}, 200)
//
uni.setStorageSync('taobao_screenshot', screenshotImage.value)
uni.hideLoading()
},
fail: (err) => {
console.error('saveFile fail', err)
uni.hideLoading()
uni.showToast({
title: '保存失败',
icon: 'none'
})
}
})
},
fail: (err) => {
console.error(err)
uni.hideLoading()
uni.showToast({
title: '裁剪失败',
icon: 'none'
})
}
}, instance)
})
},
fail: () => {
uni.hideLoading()
uni.showToast({
title: '图片加载失败',
icon: 'none'
})
}
})
})
}
//
const closeImage = () => {
selectedImage.value = '';
};
/**
* 切换tab
* @param index
@ -352,10 +488,10 @@ const updateFilterList = () => {
// tab
switch (currentTab.value) {
case 0:
sourceList = ["全部", "待付款", "待发货", "待收货", "退款/售后", "已关闭"];
sourceList = ["全部", "待付款", "待发货", "待收货", "退款/售后", "评价", "已关闭"];
break;
case 1:
sourceList = ["全部", "待付款", "待发货", "待收货", "退款/售后", "已关闭"];
sourceList = ["全部", "待付款", "待发货", "待收货", "退款/售后", "评价", "已关闭"];
break;
case 2:
sourceList = ["全部", "待付款", "待发货", "待收货", "待评价", "已关闭"];
@ -383,6 +519,93 @@ const switchFilter = (index) => {
}
};
const goDetail = (item) => {
util.goPage(`/pages/shopping/taobao/shopping-order-detail/shopping-order-detail?id=${item.id}`)
}
/**
* 长按管理订单 - 记录坐标并显示自定义菜单
*/
const onItemLongPress = (data) => {
const { item, x, y } = data;
menuState.target = item;
// 60px 40px
//
const screenWidth = uni.getSystemInfoSync().windowWidth;
let posX = x - 40;
if (posX + 120 > screenWidth) {
posX = screenWidth - 130;
}
menuState.x = Math.max(10, posX);
menuState.y = y - 80;
menuState.show = true;
};
/**
* 处理菜单点击
*/
const handleMenuAction = (action) => {
const item = menuState.target;
menuState.show = false;
if (!item) return;
if (action === 'edit') {
uni.navigateTo({
url: `/pages/shopping/taobao/add-shopping-order/add-shopping-order?id=${item.id}&isEdit=true`
});
} else if (action === 'delete') {
uni.showModal({
title: '提示',
content: '确定要删除该订单吗?',
confirmColor: '#FF7824',
success: (modalRes) => {
if (modalRes.confirm) {
deleteOrder(item.id);
}
}
});
}
};
/**
* 从缓存执行删除
*/
const deleteOrder = (id) => {
let list = uni.getStorageSync('taobaoShopping') || [];
// 1.
const target = list.find(item => String(item.id) === String(id));
if (target) {
const imagesToClear = [];
if (target.goodsList?.[0]?.image) imagesToClear.push(target.goodsList[0].image);
if (target.productImgUrl) imagesToClear.push(target.productImgUrl);
imagesToClear.forEach(path => {
if (path && (path.includes('_doc') || path.includes('store_'))) {
uni.removeSavedFile({
filePath: path,
success: () => console.log('删除订单关联图片成功:', path),
fail: (err) => console.log('图片文件不存在或已删除:', path)
});
}
});
}
// 2.
list = list.filter(item => String(item.id) !== String(id));
//
uni.setStorageSync('taobaoShopping', list);
// UI
mockList.value = list;
uni.showToast({
title: '已删除',
icon: 'success'
});
};
</script>
@ -604,7 +827,252 @@ const switchFilter = (index) => {
}
}
}
.menu-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
background-color: transparent;
}
.menu-content {
position: absolute;
width: 240rpx;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 16rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);
border: 1px solid rgba(255, 255, 255, 0.2);
overflow: hidden;
animation: menu-show 0.15s ease-out;
}
.menu-item {
display: flex;
align-items: center;
padding: 24rpx 32rpx;
transition: background 0.2s;
&:active {
background-color: #f5f5f5;
}
text {
font-size: 28rpx;
color: #1A1A1A;
margin-left: 16rpx;
font-weight: 500;
}
}
.menu-line {
height: 1px;
background-color: #EEEEEE;
margin: 0 20rpx;
}
@keyframes menu-show {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
.null-data-box {
padding: 68rpx;
}
.bottom-fixed {
display: flex;
flex-direction: column;
.upload-screenshot-box {
width: 100%;
flex: 1;
min-height: 540rpx;
background-color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.upload-screenshot {
width: 92rpx;
height: 92rpx;
}
.upload-screenshot-content {
width: 100%;
height: 100%;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
.upload-screenshot-text {
font-size: 36rpx;
color: #1777FF;
line-height: 50rpx;
margin-top: 16rpx;
}
}
.screenshot-preview-box {
width: 100%;
height: 100%;
display: flex;
align-items: flex-start;
// flex-direction: column;
justify-content: center;
.screenshot-preview {
width: 100%;
height: 100%;
}
}
.scroll-image-box {
width: 100%;
min-height: 0; // flex
// overflow: hidden; // scroll-view
position: relative;
}
.dashed-line-box {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
border: 4rpx dashed #ffffff;
pointer-events: none;
.dashed-line-text {
height: 44rpx;
line-height: 44rpx;
width: 180rpx;
padding: 0 20rpx;
border-radius: 8rpx;
color: #1777FF;
font-size: 24rpx;
font-weight: 500;
background-color: #fff;
position: absolute;
top: 0;
left: 50%;
transform: translate(-50%, -50%);
}
}
.mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.8);
z-index: 999;
.mask-icon {
position: absolute;
top: 50%;
right: 52rpx;
transform: translateY(-25%);
width: 360rpx;
height: 360rpx;
}
}
}
}
.bottom-img-popup-card {
width: 600rpx;
background-color: #FFFFFF;
border-radius: 32rpx;
overflow: hidden;
box-shadow: 0 20rpx 40rpx rgba(0, 0, 0, 0.15);
.p-header {
padding: 40rpx 0 20rpx;
text-align: center;
font-size: 32rpx;
font-weight: 600;
color: #1A1A1A;
}
.p-content {
padding: 20rpx 30rpx;
.option-item {
display: flex;
align-items: center;
padding: 24rpx;
margin-bottom: 20rpx;
background-color: #F8F9FA;
border-radius: 20rpx;
transition: all 0.2s;
&:active {
background-color: #F0F2F5;
transform: scale(0.98);
}
.preview-img {
width: 100rpx;
height: 100rpx;
border-radius: 12rpx;
background-color: #EEE;
}
.info {
flex: 1;
margin: 0 24rpx;
display: flex;
flex-direction: column;
.name {
font-size: 28rpx;
font-weight: 500;
color: #1A1A1A;
}
.desc {
font-size: 22rpx;
color: #8E8E93;
margin-top: 4rpx;
}
}
}
}
.p-footer {
height: 100rpx;
line-height: 100rpx;
text-align: center;
border-top: 1rpx solid #F0F2F5;
font-size: 30rpx;
color: #8E8E93;
&:active {
background-color: #F8F9FA;
}
}
}
</style>
<style>
@import '@/common/main.css';
page {
background-color: #F1F5F8;
}
</style>

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 874 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB