统一排行榜对齐星雀UI,页面资源后台配置实时刷新
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
730
miniprogram/pages/dsddxq/dsddxq.js
Normal file
730
miniprogram/pages/dsddxq/dsddxq.js
Normal file
@@ -0,0 +1,730 @@
|
||||
// pages/dsddxq/dsddxq.js - 【最终版:提交前公告弹窗 + 修改图片至少保留一张】
|
||||
const app = getApp()
|
||||
import request from '../../utils/request.js'
|
||||
const COS = require('../../utils/cos-wx-sdk-v5.js')
|
||||
import connectionManager from '../../utils/xiaoxilj.js'
|
||||
|
||||
Page({
|
||||
data: {
|
||||
jibenShuju: {
|
||||
dingdan_id: '',
|
||||
tupian: '',
|
||||
jieshao: '',
|
||||
create_time: '',
|
||||
jine: '',
|
||||
nicheng: '',
|
||||
beizhu: '',
|
||||
zhuangtai: 0,
|
||||
fadanpingtai: 0,
|
||||
is_cross: 0
|
||||
},
|
||||
xiangxiShuju: {
|
||||
shangjia_id: '',
|
||||
shangjia_nicheng: '',
|
||||
shangjia_liuyan: '',
|
||||
tuikuan_liyou: '',
|
||||
chufa_liyou: '',
|
||||
chufa_zhuangtai: 0,
|
||||
chufa_jieguo: '',
|
||||
bohui_liyou: '',
|
||||
dashou_jiaofu: [],
|
||||
dashou_liuyan: '',
|
||||
laoban_id: ''
|
||||
},
|
||||
zhuangtaiYanseMap: {
|
||||
1: '#E8F5E9', 2: '#E3F2FD', 3: '#F3E5F5', 4: '#FFF3E0',
|
||||
5: '#FFEBEE', 6: '#EFEBE9', 7: '#E0F7FA', 8: '#FFF8E1'
|
||||
},
|
||||
zhuangtaiWenziMap: {
|
||||
1: '已下单', 2: '进行中', 3: '已完成', 4: '退款中',
|
||||
5: '已退款', 6: '退款失败', 7: '指定中', 8: '结算中'
|
||||
},
|
||||
isLoading: true,
|
||||
isSubmitting: false,
|
||||
liuyan: '',
|
||||
xuanzhongTupian: [],
|
||||
shangchuanJindu: 0,
|
||||
shangchuanZongshu: 0,
|
||||
jinduWidth: '0%',
|
||||
showWanzhengJieshao: false,
|
||||
wanzhengJieshao: '',
|
||||
showWanzhengBeizhu: false,
|
||||
wanzhengBeizhu: '',
|
||||
ossImageUrl: '',
|
||||
morentouxiang: '',
|
||||
showRefundInfo: false,
|
||||
|
||||
// 修改功能所需字段
|
||||
isModifying: false,
|
||||
originalDashouJiaofu: [],
|
||||
originalDashouLiuyan: '',
|
||||
remainingOriginals: [],
|
||||
modifiedLiuyan: '',
|
||||
deletedImages: [],
|
||||
newImages: [],
|
||||
isConfirming: false,
|
||||
modifyUploadProgress: { total: 0, current: 0, width: '0%' }
|
||||
},
|
||||
|
||||
onLoad(options) {
|
||||
wx.setNavigationBarTitle({ title: '订单详情' })
|
||||
this.initGlobalData()
|
||||
this.jiexiTiaozhuanCanshu(options)
|
||||
},
|
||||
onHide() {
|
||||
const popupComp = this.selectComponent('#popupNotice');
|
||||
if (popupComp && popupComp.cleanup) {
|
||||
popupComp.cleanup();
|
||||
}
|
||||
},
|
||||
|
||||
onShow() {
|
||||
this.registerNotificationComponent();
|
||||
},
|
||||
|
||||
registerNotificationComponent() {
|
||||
const app = getApp();
|
||||
const notificationComp = this.selectComponent('#global-notification');
|
||||
if (notificationComp && notificationComp.showNotification) {
|
||||
app.globalData.globalNotification = {
|
||||
show: (data) => notificationComp.showNotification(data),
|
||||
hide: () => notificationComp.hideNotification()
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
initGlobalData() {
|
||||
const app = getApp()
|
||||
const ossImageUrl = app.globalData.ossImageUrl || 'https://your-oss-domain.com/'
|
||||
const morentouxiang = app.globalData.morentouxiang || '/images/default-avatar.png'
|
||||
this.setData({ ossImageUrl, morentouxiang })
|
||||
},
|
||||
|
||||
jiexiTiaozhuanCanshu(options) {
|
||||
try {
|
||||
const dingdanDataStr = options.dingdanData || ''
|
||||
if (!dingdanDataStr) {
|
||||
wx.showToast({ title: '订单数据错误', icon: 'none' })
|
||||
setTimeout(() => wx.navigateBack(), 1500)
|
||||
return
|
||||
}
|
||||
const dingdanData = JSON.parse(decodeURIComponent(dingdanDataStr))
|
||||
let tupianUrl = dingdanData.tupian || ''
|
||||
if (!tupianUrl) tupianUrl = this.getTupianUrl()
|
||||
let jine = parseFloat(dingdanData.jine || 0)
|
||||
if (isNaN(jine)) jine = 0
|
||||
const formattedJine = jine.toFixed(2)
|
||||
this.setData({
|
||||
'jibenShuju.dingdan_id': dingdanData.dingdan_id || '',
|
||||
'jibenShuju.tupian': tupianUrl,
|
||||
'jibenShuju.jieshao': dingdanData.jieshao || '',
|
||||
'jibenShuju.create_time': dingdanData.create_time || '',
|
||||
'jibenShuju.jine': formattedJine,
|
||||
'jibenShuju.nicheng': dingdanData.nicheng || '',
|
||||
'jibenShuju.beizhu': dingdanData.beizhu || '',
|
||||
'jibenShuju.zhuangtai': dingdanData.zhuangtai || 0,
|
||||
'jibenShuju.fadanpingtai': dingdanData.fadanpingtai || 0,
|
||||
isLoading: false
|
||||
})
|
||||
this.jiazaiXiangxiShuju(dingdanData.dingdan_id)
|
||||
} catch (error) {
|
||||
console.error('解析订单数据失败:', error)
|
||||
wx.showToast({ title: '数据解析失败', icon: 'none' })
|
||||
setTimeout(() => wx.navigateBack(), 1500)
|
||||
}
|
||||
},
|
||||
|
||||
getTupianUrl() {
|
||||
const cacheTouxiang = wx.getStorageSync('touxiang') || ''
|
||||
let tupianPath = cacheTouxiang || app.globalData.morentouxiang || ''
|
||||
const ossImageUrl = app.globalData.ossImageUrl || ''
|
||||
if (tupianPath && ossImageUrl) {
|
||||
if (tupianPath.startsWith('/')) tupianPath = tupianPath.substring(1)
|
||||
return ossImageUrl + tupianPath
|
||||
}
|
||||
return ''
|
||||
},
|
||||
|
||||
async jiazaiXiangxiShuju(dingdanId) {
|
||||
if (!dingdanId) return
|
||||
wx.showLoading({ title: '加载中...', mask: true })
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/dingdan/dsddxq',
|
||||
method: 'POST',
|
||||
data: { dingdan_id: dingdanId },
|
||||
header: { 'content-type': 'application/json' }
|
||||
})
|
||||
wx.hideLoading()
|
||||
if (res && res.data.code === 0 && res.data.data) {
|
||||
const data = res.data.data
|
||||
let dashouJiaofuList = data.dashou_jiaofu || []
|
||||
dashouJiaofuList = dashouJiaofuList.map(imgUrl => {
|
||||
if (imgUrl && !imgUrl.startsWith('http')) {
|
||||
const ossImageUrl = app.globalData.ossImageUrl || ''
|
||||
if (imgUrl.startsWith('/')) imgUrl = imgUrl.substring(1)
|
||||
return ossImageUrl + imgUrl
|
||||
}
|
||||
return imgUrl
|
||||
})
|
||||
this.setData({
|
||||
'xiangxiShuju.shangjia_id': data.shangjia_id || '',
|
||||
'xiangxiShuju.shangjia_nicheng': data.shangjia_nicheng || '',
|
||||
'xiangxiShuju.shangjia_liuyan': data.shangjia_liuyan || '',
|
||||
'xiangxiShuju.tuikuan_liyou': data.tuikuan_liyou || '',
|
||||
'xiangxiShuju.chufa_liyou': data.chufa_liyou || '',
|
||||
'xiangxiShuju.chufa_zhuangtai': data.chufa_zhuangtai || 0,
|
||||
'xiangxiShuju.chufa_jieguo': data.chufa_jieguo || '',
|
||||
'xiangxiShuju.bohui_liyou': data.bohui_liyou || '',
|
||||
'xiangxiShuju.dashou_jiaofu': dashouJiaofuList,
|
||||
'xiangxiShuju.dashou_liuyan': data.dashou_liuyan || '',
|
||||
'xiangxiShuju.laoban_id': data.laoban_id || '',
|
||||
'jibenShuju.zhuangtai': data.zhuangtai || 0,
|
||||
'jibenShuju.beizhu': data.beizhu || '',
|
||||
'liuyan': data.dashou_liuyan || '',
|
||||
'jibenShuju.fadanpingtai': data.fadanpingtai || 0,
|
||||
'jibenShuju.is_cross': data.is_cross || 0,
|
||||
})
|
||||
const currentStatus = data.zhuangtai || 0
|
||||
const showRefund = [4,5,6].includes(currentStatus)
|
||||
this.setData({ showRefundInfo: showRefund })
|
||||
} else {
|
||||
const errorMsg = res?.data?.msg || '获取订单详情失败'
|
||||
wx.showToast({ title: errorMsg, icon: 'none', duration: 2000 })
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载详细数据失败:', error)
|
||||
wx.hideLoading()
|
||||
wx.showToast({ title: '加载数据失败,请重试', icon: 'none', duration: 2000 })
|
||||
}
|
||||
},
|
||||
|
||||
// ========== 原有提交功能(部分修改) ==========
|
||||
xuanzeTupian() {
|
||||
if (this.data.isSubmitting) return
|
||||
const shengyu = 9 - this.data.xuanzhongTupian.length
|
||||
if (shengyu <= 0) {
|
||||
wx.showToast({ title: '最多只能选择9张图片', icon: 'none' })
|
||||
return
|
||||
}
|
||||
wx.chooseImage({
|
||||
count: shengyu,
|
||||
sizeType: ['compressed'],
|
||||
sourceType: ['album', 'camera'],
|
||||
success: (res) => {
|
||||
const newTupian = [...this.data.xuanzhongTupian, ...res.tempFilePaths]
|
||||
this.setData({ xuanzhongTupian: newTupian.slice(0, 9) })
|
||||
}
|
||||
})
|
||||
},
|
||||
shanchuTupian(e) {
|
||||
const index = e.currentTarget.dataset.index
|
||||
const newTupian = [...this.data.xuanzhongTupian]
|
||||
newTupian.splice(index, 1)
|
||||
this.setData({ xuanzhongTupian: newTupian })
|
||||
},
|
||||
yulanTupian(e) {
|
||||
const currentUrl = e.currentTarget.dataset.url
|
||||
const urls = e.currentTarget.dataset.urls || []
|
||||
if (!currentUrl) return
|
||||
wx.previewImage({ current: currentUrl, urls: urls.length > 0 ? urls : [currentUrl] })
|
||||
},
|
||||
getFileExtension(filePath) {
|
||||
const lastDotIndex = filePath.lastIndexOf('.')
|
||||
if (lastDotIndex === -1) return '.jpg'
|
||||
const ext = filePath.substring(lastDotIndex).toLowerCase()
|
||||
const allowedExts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
|
||||
return allowedExts.includes(ext) ? ext : '.jpg'
|
||||
},
|
||||
shuruLiuyan(e) {
|
||||
const liuyan = e.detail.value.slice(0, 50)
|
||||
this.setData({ liuyan })
|
||||
},
|
||||
chakanWanzhengJieshao() {
|
||||
this.setData({ showWanzhengJieshao: true, wanzhengJieshao: this.data.jibenShuju.jieshao || '无' })
|
||||
},
|
||||
guanbiWanzhengJieshao() { this.setData({ showWanzhengJieshao: false }) },
|
||||
chakanWanzhengBeizhu() {
|
||||
this.setData({ showWanzhengBeizhu: true, wanzhengBeizhu: this.data.jibenShuju.beizhu || '无' })
|
||||
},
|
||||
guanbiWanzhengBeizhu() { this.setData({ showWanzhengBeizhu: false }) },
|
||||
async fuzhiWenben(e) {
|
||||
const text = e.currentTarget.dataset.text
|
||||
if (!text) return
|
||||
try {
|
||||
await wx.setClipboardData({ data: text })
|
||||
wx.showToast({ title: '复制成功', icon: 'success', duration: 1500 })
|
||||
} catch (error) {
|
||||
console.error('复制失败:', error)
|
||||
wx.showToast({ title: '复制失败', icon: 'none' })
|
||||
}
|
||||
},
|
||||
goToKefu() {
|
||||
const kefuLink = app.globalData.kefuConfig?.link || '';
|
||||
const corpId = app.globalData.kefuConfig?.enterpriseId || '';
|
||||
|
||||
if (!kefuLink || !corpId) {
|
||||
wx.showToast({
|
||||
title: '客服配置未加载',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
wx.openCustomerServiceChat({
|
||||
extInfo: { url: kefuLink },
|
||||
corpId: corpId,
|
||||
success: (res) => {
|
||||
console.log('跳转客服成功', res);
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('跳转客服失败', err);
|
||||
wx.showToast({
|
||||
title: '暂时无法连接客服',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// ===== 联系老板按钮(改为跳转订单群聊) =====
|
||||
// ===== 联系老板按钮(智能查找订单群聊) =====
|
||||
// ===== 联系老板按钮(智能查找订单群聊) =====
|
||||
goToChatWithBoss() {
|
||||
const uid = wx.getStorageSync('uid')
|
||||
if (!uid) return
|
||||
|
||||
const orderId = this.data.jibenShuju.dingdan_id
|
||||
if (!orderId) {
|
||||
wx.showToast({ title: '订单ID缺失', icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
const identityType = 'dashou'
|
||||
const userId = 'Ds' + uid
|
||||
|
||||
const fadanPingtai = this.data.jibenShuju.fadanpingtai || 0
|
||||
const partnerUid = fadanPingtai === 2
|
||||
? (this.data.xiangxiShuju.shangjia_id || '')
|
||||
: (this.data.xiangxiShuju.laoban_id || '')
|
||||
|
||||
connectionManager.connectToGroupChat({
|
||||
identityType,
|
||||
userId,
|
||||
orderId,
|
||||
partnerUid,
|
||||
fadanPingtai,
|
||||
groupName: this.data.jibenShuju.nicheng + '的订单群',
|
||||
isCross: this.data.jibenShuju.is_cross || 0
|
||||
}).catch(err => {
|
||||
console.error('跳转群聊失败', err)
|
||||
})
|
||||
},
|
||||
|
||||
async getCOSZhengshu() {
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/dingdan/dsscpz',
|
||||
method: 'POST',
|
||||
data: { dingdan_id: this.data.jibenShuju.dingdan_id }
|
||||
})
|
||||
if (res && res.data.code === 0 && res.data.data) return res.data.data
|
||||
else throw new Error(res?.data?.msg || '获取上传凭证失败')
|
||||
} catch (error) {
|
||||
console.error('获取COS凭证失败:', error)
|
||||
throw error
|
||||
}
|
||||
},
|
||||
|
||||
initCOSClient(tokenData) {
|
||||
const credentials = tokenData.credentials || tokenData
|
||||
const bucket = tokenData.bucket || 'julebu-1361527063'
|
||||
const region = tokenData.region || 'ap-shanghai'
|
||||
const cos = new COS({
|
||||
SimpleUploadMethod: 'putObject',
|
||||
getAuthorization: async (options, callback) => {
|
||||
const authParams = {
|
||||
TmpSecretId: credentials.tmpSecretId,
|
||||
TmpSecretKey: credentials.tmpSecretKey,
|
||||
SecurityToken: credentials.sessionToken || '',
|
||||
StartTime: tokenData.startTime || Math.floor(Date.now() / 1000),
|
||||
ExpiredTime: tokenData.expiredTime || (Math.floor(Date.now() / 1000) + 7200)
|
||||
}
|
||||
callback(authParams)
|
||||
}
|
||||
})
|
||||
return { cos, bucket, region }
|
||||
},
|
||||
|
||||
async shangchuanDanZhangTupian(filePath, cosKey, index, cosInstance, bucket, region) {
|
||||
return new Promise((resolve) => {
|
||||
const timeoutId = setTimeout(() => resolve({ status: 'optimistic_success', key: cosKey }), 2000)
|
||||
cosInstance.uploadFile({
|
||||
Bucket: bucket,
|
||||
Region: region,
|
||||
Key: cosKey,
|
||||
FilePath: filePath,
|
||||
onProgress: (progressInfo) => {
|
||||
const percent = Math.round(progressInfo.percent * 100)
|
||||
if (percent === 100) {
|
||||
clearTimeout(timeoutId)
|
||||
resolve({ status: 'optimistic_success', key: cosKey })
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async piliangShangchuanTupian() {
|
||||
const total = this.data.xuanzhongTupian.length
|
||||
this.setData({ shangchuanZongshu: total, shangchuanJindu: 0, jinduWidth: '0%' })
|
||||
wx.showLoading({ title: '正在准备...', mask: true })
|
||||
const preGeneratedUrls = []
|
||||
for (let i = 0; i < total; i++) {
|
||||
const timestamp = Date.now() + i
|
||||
const random = Math.floor(Math.random() * 10000)
|
||||
const fileExt = this.getFileExtension(this.data.xuanzhongTupian[i])
|
||||
const fileName = `${timestamp}_${random}${fileExt}`
|
||||
const cosKey = `order/${this.data.jibenShuju.dingdan_id}/${fileName}`
|
||||
preGeneratedUrls.push(cosKey)
|
||||
}
|
||||
let cosClient, bucket, region
|
||||
try {
|
||||
const tokenData = await this.getCOSZhengshu()
|
||||
const { cos, bucket: cosBucket, region: cosRegion } = this.initCOSClient(tokenData)
|
||||
cosClient = cos
|
||||
bucket = cosBucket
|
||||
region = cosRegion
|
||||
} catch (error) {
|
||||
wx.hideLoading()
|
||||
wx.showToast({ title: '上传初始化失败', icon: 'none' })
|
||||
return []
|
||||
}
|
||||
const uploadTasks = []
|
||||
for (let i = 0; i < total; i++) {
|
||||
const task = this.shangchuanDanZhangTupian(
|
||||
this.data.xuanzhongTupian[i],
|
||||
preGeneratedUrls[i],
|
||||
i,
|
||||
cosClient,
|
||||
bucket,
|
||||
region
|
||||
).then((result) => {
|
||||
const currentDone = i + 1
|
||||
const jinduPercent = ((currentDone / total) * 100).toFixed(0)
|
||||
this.setData({ shangchuanJindu: currentDone, jinduWidth: `${jinduPercent}%` })
|
||||
return result
|
||||
})
|
||||
uploadTasks.push(task)
|
||||
}
|
||||
wx.showLoading({ title: `上传中...`, mask: true })
|
||||
await Promise.all(uploadTasks)
|
||||
wx.hideLoading()
|
||||
return preGeneratedUrls
|
||||
},
|
||||
|
||||
tijiaoDingdan() {
|
||||
this.showAnnouncementAndConfirm()
|
||||
},
|
||||
|
||||
async showAnnouncementAndConfirm() {
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/peizhi/tanchuang',
|
||||
method: 'POST',
|
||||
data: { pageKey: 'dsddxq' }
|
||||
})
|
||||
if (res.statusCode !== 200 || res.data.code !== 0) {
|
||||
this.showOriginalConfirmAndSubmit()
|
||||
return
|
||||
}
|
||||
const { popups = [], serverTime } = res.data.data
|
||||
if (!popups.length) {
|
||||
this.showOriginalConfirmAndSubmit()
|
||||
return
|
||||
}
|
||||
const popup = popups[0]
|
||||
const popupComp = this.selectComponent('#popupNotice')
|
||||
if (!popupComp) {
|
||||
console.error('未找到弹窗组件 #popupNotice')
|
||||
this.showOriginalConfirmAndSubmit()
|
||||
return
|
||||
}
|
||||
const showData = {
|
||||
popupId: popup.popup_id,
|
||||
title: popup.title || '',
|
||||
duration: popup.duration || 0,
|
||||
images: popup.images || [],
|
||||
showMuteCheckbox: false,
|
||||
serverTime: serverTime
|
||||
}
|
||||
popupComp.show(showData, (result) => {
|
||||
this.showOriginalConfirmAndSubmit()
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取公告配置失败', error)
|
||||
this.showOriginalConfirmAndSubmit()
|
||||
}
|
||||
},
|
||||
|
||||
showOriginalConfirmAndSubmit() {
|
||||
if (this.data.isSubmitting) {
|
||||
wx.showToast({ title: '正在提交中', icon: 'none' })
|
||||
return
|
||||
}
|
||||
if (this.data.jibenShuju.zhuangtai !== 2) {
|
||||
wx.showToast({ title: '订单状态不可提交', icon: 'none' })
|
||||
return
|
||||
}
|
||||
if (this.data.xuanzhongTupian.length === 0) {
|
||||
wx.showToast({ title: '请至少上传一张图片', icon: 'none' })
|
||||
return
|
||||
}
|
||||
wx.showModal({
|
||||
title: '⚠️ 提交确认',
|
||||
content: '在提交订单之前,请确保您已在打手端页面认真阅读打手规则。如有漏交图片,订单被退款,概不申诉。',
|
||||
confirmText: '我已阅读',
|
||||
cancelText: '我再想想',
|
||||
success: (res) => {
|
||||
if (res.confirm) this._doSubmit()
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('弹窗失败', err)
|
||||
wx.showToast({ title: '系统异常,请重试', icon: 'none' })
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async _doSubmit() {
|
||||
this.setData({ isSubmitting: true })
|
||||
wx.showLoading({ title: '开始提交...', mask: true })
|
||||
try {
|
||||
const tupianUrls = await this.piliangShangchuanTupian()
|
||||
if (!tupianUrls || tupianUrls.length === 0) throw new Error('无法生成上传路径')
|
||||
wx.showLoading({ title: '提交订单数据...', mask: true })
|
||||
const res = await request({
|
||||
url: '/dingdan/dstijiao',
|
||||
method: 'POST',
|
||||
data: {
|
||||
dingdan_id: this.data.jibenShuju.dingdan_id,
|
||||
liuyan: this.data.liuyan || '',
|
||||
jiaofu_tupian_urls: tupianUrls
|
||||
},
|
||||
header: { 'content-type': 'application/json' }
|
||||
})
|
||||
wx.hideLoading()
|
||||
this.setData({ isSubmitting: false })
|
||||
if (res && res.data.code === 0) {
|
||||
const ossImageUrl = app.globalData.ossImageUrl || ''
|
||||
const fullUrls = tupianUrls.map(url => {
|
||||
if (url && !url.startsWith('http')) {
|
||||
if (url.startsWith('/')) url = url.substring(1)
|
||||
return ossImageUrl + url
|
||||
}
|
||||
return url
|
||||
})
|
||||
this.setData({
|
||||
'jibenShuju.zhuangtai': 8,
|
||||
'xiangxiShuju.dashou_liuyan': this.data.liuyan || '',
|
||||
'xiangxiShuju.dashou_jiaofu': fullUrls,
|
||||
xuanzhongTupian: [],
|
||||
liuyan: '',
|
||||
shangchuanJindu: 0,
|
||||
shangchuanZongshu: 0,
|
||||
jinduWidth: '0%',
|
||||
})
|
||||
if (app.globalData.dashouzhuangtai != 1) app.globalData.dashouzhuangtai = 1
|
||||
wx.showToast({ title: '提交成功!', icon: 'success', duration: 2000 })
|
||||
setTimeout(() => wx.navigateBack(), 1500)
|
||||
} else {
|
||||
const errorMsg = res?.data?.msg || '提交失败'
|
||||
wx.showToast({ title: errorMsg, icon: 'none' })
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('提交失败:', error)
|
||||
wx.hideLoading()
|
||||
this.setData({ isSubmitting: false })
|
||||
wx.showToast({ title: error.message || '提交失败', icon: 'none' })
|
||||
}
|
||||
},
|
||||
|
||||
// ========== 修改功能(增加最少一张图片校验) ==========
|
||||
extractRelativePath(fullUrl) {
|
||||
const ossImageUrl = this.data.ossImageUrl
|
||||
if (fullUrl.startsWith(ossImageUrl)) return fullUrl.substring(ossImageUrl.length)
|
||||
return fullUrl
|
||||
},
|
||||
enterModify() {
|
||||
const { dashou_jiaofu, dashou_liuyan } = this.data.xiangxiShuju
|
||||
this.setData({
|
||||
isModifying: true,
|
||||
originalDashouJiaofu: dashou_jiaofu.slice(),
|
||||
remainingOriginals: dashou_jiaofu.slice(),
|
||||
originalDashouLiuyan: dashou_liuyan || '',
|
||||
modifiedLiuyan: dashou_liuyan || '',
|
||||
deletedImages: [],
|
||||
newImages: []
|
||||
})
|
||||
},
|
||||
cancelModify() {
|
||||
this.setData({
|
||||
isModifying: false,
|
||||
originalDashouJiaofu: [],
|
||||
remainingOriginals: [],
|
||||
originalDashouLiuyan: '',
|
||||
modifiedLiuyan: '',
|
||||
deletedImages: [],
|
||||
newImages: []
|
||||
})
|
||||
},
|
||||
handleDeleteImage(e) {
|
||||
const fullUrl = e.currentTarget.dataset.url
|
||||
const { originalDashouJiaofu, remainingOriginals, deletedImages, newImages } = this.data
|
||||
if (originalDashouJiaofu.includes(fullUrl)) {
|
||||
const newRemaining = remainingOriginals.filter(url => url !== fullUrl)
|
||||
this.setData({
|
||||
remainingOriginals: newRemaining,
|
||||
deletedImages: [...deletedImages, fullUrl]
|
||||
})
|
||||
} else {
|
||||
const index = newImages.indexOf(fullUrl)
|
||||
if (index > -1) {
|
||||
const newImagesCopy = [...newImages]
|
||||
newImagesCopy.splice(index, 1)
|
||||
this.setData({ newImages: newImagesCopy })
|
||||
}
|
||||
}
|
||||
},
|
||||
handleAddImage() {
|
||||
if (this.data.isConfirming) return
|
||||
const currentCount = this.getCurrentImageCount()
|
||||
const maxCount = 9 - currentCount
|
||||
if (maxCount <= 0) {
|
||||
wx.showToast({ title: '最多9张图片', icon: 'none' })
|
||||
return
|
||||
}
|
||||
wx.chooseImage({
|
||||
count: maxCount,
|
||||
sizeType: ['compressed'],
|
||||
sourceType: ['album', 'camera'],
|
||||
success: (res) => {
|
||||
const newImages = [...this.data.newImages, ...res.tempFilePaths]
|
||||
this.setData({ newImages: newImages.slice(0, 9) })
|
||||
}
|
||||
})
|
||||
},
|
||||
getCurrentImageCount() {
|
||||
const { remainingOriginals, newImages } = this.data
|
||||
return remainingOriginals.length + newImages.length
|
||||
},
|
||||
onModifyLiuyanInput(e) {
|
||||
this.setData({ modifiedLiuyan: e.detail.value.slice(0, 50) })
|
||||
},
|
||||
|
||||
async confirmModify() {
|
||||
if (this.data.isConfirming) return
|
||||
const { dingdan_id } = this.data.jibenShuju
|
||||
const { remainingOriginals, deletedImages, newImages, modifiedLiuyan, originalDashouLiuyan } = this.data
|
||||
const hasLiuyanChange = modifiedLiuyan !== originalDashouLiuyan
|
||||
const hasDelete = deletedImages.length > 0
|
||||
const hasAdd = newImages.length > 0
|
||||
|
||||
if (!hasLiuyanChange && !hasDelete && !hasAdd) {
|
||||
wx.showToast({ title: '没有修改内容', icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
const finalImageCount = remainingOriginals.length + newImages.length
|
||||
if (finalImageCount === 0) {
|
||||
wx.showToast({ title: '至少保留一张图片', icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
this.setData({ isConfirming: true })
|
||||
wx.showLoading({ title: '提交修改...', mask: true })
|
||||
try {
|
||||
const tokenData = await this.getCOSZhengshu()
|
||||
const { cos, bucket, region } = this.initCOSClient(tokenData)
|
||||
|
||||
let newImageRelativePaths = []
|
||||
if (hasAdd) {
|
||||
const total = newImages.length
|
||||
this.setData({ 'modifyUploadProgress.total': total, 'modifyUploadProgress.current': 0, 'modifyUploadProgress.width': '0%' })
|
||||
const preGeneratedKeys = []
|
||||
for (let i = 0; i < total; i++) {
|
||||
const timestamp = Date.now() + i
|
||||
const random = Math.floor(Math.random() * 10000)
|
||||
const fileExt = this.getFileExtension(newImages[i])
|
||||
const fileName = `${timestamp}_${random}${fileExt}`
|
||||
const cosKey = `order/${this.data.jibenShuju.dingdan_id}/${fileName}`
|
||||
preGeneratedKeys.push(cosKey)
|
||||
}
|
||||
const uploadTasks = []
|
||||
for (let i = 0; i < total; i++) {
|
||||
const task = this.shangchuanDanZhangTupian(
|
||||
newImages[i],
|
||||
preGeneratedKeys[i],
|
||||
i,
|
||||
cos,
|
||||
bucket,
|
||||
region
|
||||
).then((result) => {
|
||||
const currentDone = i + 1
|
||||
const jinduPercent = ((currentDone / total) * 100).toFixed(0)
|
||||
this.setData({
|
||||
'modifyUploadProgress.current': currentDone,
|
||||
'modifyUploadProgress.width': `${jinduPercent}%`
|
||||
})
|
||||
return result.key
|
||||
})
|
||||
uploadTasks.push(task)
|
||||
}
|
||||
wx.showLoading({ title: `上传中...`, mask: true })
|
||||
newImageRelativePaths = await Promise.all(uploadTasks)
|
||||
wx.hideLoading()
|
||||
this.setData({ 'modifyUploadProgress.total': 0, 'modifyUploadProgress.current': 0, 'modifyUploadProgress.width': '0%' })
|
||||
}
|
||||
|
||||
const deletedRelativePaths = deletedImages.map(fullUrl => this.extractRelativePath(fullUrl))
|
||||
|
||||
const res = await request({
|
||||
url: '/dingdan/dsxiugaidd',
|
||||
method: 'POST',
|
||||
data: {
|
||||
dingdan_id,
|
||||
liuyan: modifiedLiuyan,
|
||||
deleted_images: deletedRelativePaths,
|
||||
new_images: newImageRelativePaths
|
||||
},
|
||||
header: { 'content-type': 'application/json' }
|
||||
})
|
||||
wx.hideLoading()
|
||||
this.setData({ isConfirming: false })
|
||||
if (res && res.data.code === 0) {
|
||||
const ossImageUrl = this.data.ossImageUrl
|
||||
const newFullUrls = newImageRelativePaths.map(rel => ossImageUrl + rel)
|
||||
const newDashouJiaofu = [...remainingOriginals, ...newFullUrls]
|
||||
this.setData({
|
||||
'xiangxiShuju.dashou_jiaofu': newDashouJiaofu,
|
||||
'xiangxiShuju.dashou_liuyan': modifiedLiuyan,
|
||||
isModifying: false,
|
||||
originalDashouJiaofu: [],
|
||||
remainingOriginals: [],
|
||||
originalDashouLiuyan: '',
|
||||
deletedImages: [],
|
||||
newImages: [],
|
||||
modifiedLiuyan: ''
|
||||
})
|
||||
wx.showToast({ title: '修改成功', icon: 'success' })
|
||||
} else {
|
||||
const errorMsg = res?.data?.msg || '修改失败'
|
||||
wx.showToast({ title: errorMsg, icon: 'none' })
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('修改失败:', error)
|
||||
wx.hideLoading()
|
||||
this.setData({ isConfirming: false })
|
||||
wx.showToast({ title: error.message || '修改失败', icon: 'none' })
|
||||
}
|
||||
}
|
||||
})
|
||||
5
miniprogram/pages/dsddxq/dsddxq.json
Normal file
5
miniprogram/pages/dsddxq/dsddxq.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"usingComponents": {
|
||||
"global-notification": "/components/global-notification/global-notification"
|
||||
}
|
||||
}
|
||||
478
miniprogram/pages/dsddxq/dsddxq.wxml
Normal file
478
miniprogram/pages/dsddxq/dsddxq.wxml
Normal file
@@ -0,0 +1,478 @@
|
||||
<view class="dsddxq-page">
|
||||
|
||||
<!-- 加载中状态 -->
|
||||
<view class="loading-container" wx:if="{{isLoading}}">
|
||||
<view class="loading-spinner"></view>
|
||||
<text class="loading-text">加载订单详情...</text>
|
||||
</view>
|
||||
|
||||
<!-- 内容区域 -->
|
||||
<view class="content-container" wx:if="{{!isLoading}}">
|
||||
|
||||
<!-- 商品图片和介绍区域 -->
|
||||
<view class="shangpin-area">
|
||||
<view class="shangpin-image-container">
|
||||
<image
|
||||
class="shangpin-image"
|
||||
src="{{jibenShuju.tupian}}"
|
||||
mode="aspectFill"
|
||||
></image>
|
||||
</view>
|
||||
<view class="shangpin-jieshao">
|
||||
<view class="jieshao-text" bindtap="chakanWanzhengJieshao">
|
||||
{{jibenShuju.jieshao || '暂无描述'}}
|
||||
</view>
|
||||
<view class="chakan-wanzheng" wx:if="{{jibenShuju.jieshao && jibenShuju.jieshao.length > 30}}">
|
||||
<text>点击上面字体查看完整介绍</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 订单信息区域 -->
|
||||
<view
|
||||
class="dingdan-info-area"
|
||||
style="background-color: {{zhuangtaiYanseMap[jibenShuju.zhuangtai] || '#F5F5F5'}}"
|
||||
>
|
||||
<view class="info-title">订单信息</view>
|
||||
|
||||
<!-- 游戏昵称 -->
|
||||
<view class="info-item-row" wx:if="{{jibenShuju.nicheng}}">
|
||||
<text class="item-label">游戏昵称:</text>
|
||||
<text class="item-value">{{jibenShuju.nicheng}}</text>
|
||||
<view
|
||||
class="copy-btn"
|
||||
bindtap="fuzhiWenben"
|
||||
data-text="{{jibenShuju.nicheng}}"
|
||||
hover-class="copy-btn-hover"
|
||||
>
|
||||
<text class="copy-icon">📋</text>
|
||||
<text class="copy-text">复制</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 备注信息 -->
|
||||
<view class="info-item-row" wx:if="{{jibenShuju.beizhu}}">
|
||||
<text class="item-label">备注信息:</text>
|
||||
<view class="item-right-area">
|
||||
<text class="item-value">{{jibenShuju.beizhu.length > 20 ? jibenShuju.beizhu.substring(0, 20) + '...' : jibenShuju.beizhu}}</text>
|
||||
<view
|
||||
class="chakan-btn"
|
||||
bindtap="chakanWanzhengBeizhu"
|
||||
wx:if="{{jibenShuju.beizhu && jibenShuju.beizhu.length > 20}}"
|
||||
>
|
||||
<text>查看完整</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 订单ID(可复制) -->
|
||||
<view class="info-item-row">
|
||||
<text class="item-label">订单ID:</text>
|
||||
<view class="item-right-area">
|
||||
<text class="item-value">{{jibenShuju.dingdan_id}}</text>
|
||||
<view
|
||||
class="copy-btn"
|
||||
bindtap="fuzhiWenben"
|
||||
data-text="{{jibenShuju.dingdan_id}}"
|
||||
hover-class="copy-btn-hover"
|
||||
>
|
||||
<text class="copy-icon">📋</text>
|
||||
<text class="copy-text">复制</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 创建时间 -->
|
||||
<view class="info-item-row">
|
||||
<text class="item-label">创建时间:</text>
|
||||
<text class="item-value">{{jibenShuju.create_time}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 订单价格(绿色) -->
|
||||
<view class="info-item-row">
|
||||
<text class="item-label">订单价格:</text>
|
||||
<text class="item-value jine-green">¥{{jibenShuju.jine}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 订单状态 -->
|
||||
<view class="info-item-row">
|
||||
<text class="item-label">订单状态:</text>
|
||||
<text class="item-value zhuangtai-text">{{zhuangtaiWenziMap[jibenShuju.zhuangtai] || '未知状态'}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 发单平台信息 -->
|
||||
<view class="info-item-row" wx:if="{{jibenShuju.fadanpingtai !== undefined && jibenShuju.fadanpingtai !== null}}">
|
||||
<text class="item-label">发单平台:</text>
|
||||
<text class="item-value">
|
||||
{{jibenShuju.fadanpingtai == 1 ? '平台发单' : (jibenShuju.fadanpingtai == 2 ? '商家发单' : '未知')}}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 商家信息区域 -->
|
||||
<view
|
||||
class="shangjia-area"
|
||||
wx:if="{{xiangxiShuju.shangjia_id || xiangxiShuju.shangjia_nicheng || xiangxiShuju.shangjia_liuyan}}"
|
||||
>
|
||||
<view class="info-title">商家信息</view>
|
||||
|
||||
<!-- 商家ID -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.shangjia_id}}">
|
||||
<text class="item-label">商家ID:</text>
|
||||
<view class="item-right-area">
|
||||
<text class="item-value">{{xiangxiShuju.shangjia_id}}</text>
|
||||
<view
|
||||
class="copy-btn"
|
||||
bindtap="fuzhiWenben"
|
||||
data-text="{{xiangxiShuju.shangjia_id}}"
|
||||
hover-class="copy-btn-hover"
|
||||
>
|
||||
<text class="copy-icon">📋</text>
|
||||
<text class="copy-text">复制</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 商家昵称 -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.shangjia_nicheng}}">
|
||||
<text class="item-label">商家昵称:</text>
|
||||
<text class="item-value">{{xiangxiShuju.shangjia_nicheng}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 商家留言 -->
|
||||
<view class="shangjia-liuyan-container" wx:if="{{xiangxiShuju.shangjia_liuyan}}">
|
||||
<text class="section-subtitle">商家留言</text>
|
||||
<view class="liuyan-content">
|
||||
{{xiangxiShuju.shangjia_liuyan}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 退款信息区域 -->
|
||||
<view
|
||||
class="tuikuan-area"
|
||||
wx:if="{{showRefundInfo && xiangxiShuju.tuikuan_liyou}}"
|
||||
>
|
||||
<view class="info-title">退款信息</view>
|
||||
|
||||
<view class="info-item-row">
|
||||
<text class="item-label">退款理由:</text>
|
||||
<text class="item-value">{{xiangxiShuju.tuikuan_liyou}}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 处罚申请信息区域 -->
|
||||
<view
|
||||
class="chufa-area"
|
||||
wx:if="{{xiangxiShuju.chufa_liyou || xiangxiShuju.chufa_zhuangtai || xiangxiShuju.chufa_jieguo || xiangxiShuju.bohui_liyou}}"
|
||||
>
|
||||
<view class="info-title">处罚申请</view>
|
||||
|
||||
<!-- 申请原因 -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.chufa_liyou}}">
|
||||
<text class="item-label">申请原因:</text>
|
||||
<text class="item-value">{{xiangxiShuju.chufa_liyou}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 申请状态 -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.chufa_zhuangtai !== undefined}}">
|
||||
<text class="item-label">申请状态:</text>
|
||||
<text
|
||||
class="item-value"
|
||||
style="color: {{xiangxiShuju.chufa_zhuangtai == 0 ? '#FF9800' : (xiangxiShuju.chufa_zhuangtai == 1 ? '#4CAF50' : '#FF4444')}}"
|
||||
>
|
||||
{{xiangxiShuju.chufa_zhuangtai == 0 ? '审核中' : (xiangxiShuju.chufa_zhuangtai == 1 ? '处罚成功' : '处罚驳回')}}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<!-- 处罚结果 -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.chufa_jieguo}}">
|
||||
<text class="item-label">处罚结果:</text>
|
||||
<text class="item-value">{{xiangxiShuju.chufa_jieguo}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 驳回理由 -->
|
||||
<view class="info-item-row" wx:if="{{xiangxiShuju.bohui_liyou}}">
|
||||
<text class="item-label">驳回理由:</text>
|
||||
<text class="item-value">{{xiangxiShuju.bohui_liyou}}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 打手交付历史(只读模式) -->
|
||||
<view class="dashou-jiaofu-area" wx:if="{{!isModifying && xiangxiShuju.dashou_jiaofu.length > 0}}">
|
||||
<view class="info-title">我的交付</view>
|
||||
|
||||
<!-- 打手交付图片 -->
|
||||
<view class="dashou-jiaofu-container">
|
||||
<text class="section-subtitle">交付图片</text>
|
||||
<view class="jiaofu-grid">
|
||||
<block wx:for="{{xiangxiShuju.dashou_jiaofu}}" wx:key="index">
|
||||
<view
|
||||
class="jiaofu-image-item"
|
||||
bindtap="yulanTupian"
|
||||
data-url="{{item}}"
|
||||
data-urls="{{xiangxiShuju.dashou_jiaofu}}"
|
||||
>
|
||||
<image
|
||||
class="jiaofu-image"
|
||||
src="{{item}}"
|
||||
mode="aspectFill"
|
||||
></image>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 打手留言 -->
|
||||
<view class="dashou-liuyan-container" wx:if="{{xiangxiShuju.dashou_liuyan}}">
|
||||
<text class="section-subtitle">我的留言</text>
|
||||
<view class="liuyan-content">
|
||||
{{xiangxiShuju.dashou_liuyan}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 🆕 修改模式下的可编辑区域(当 isModifying 为 true 时显示) -->
|
||||
<view class="dashou-jiaofu-area" wx:if="{{isModifying}}">
|
||||
<view class="info-title">修改交付</view>
|
||||
|
||||
<!-- 图片编辑区域 -->
|
||||
<view class="xuanze-tupian-container">
|
||||
<text class="section-subtitle">交付图片(点击叉号删除)</text>
|
||||
|
||||
<!-- 显示原图(使用 remainingOriginals 实时更新) -->
|
||||
<view class="yixuan-tupian-grid">
|
||||
<!-- 原图部分(从 remainingOriginals 循环) -->
|
||||
<block wx:for="{{remainingOriginals}}" wx:key="index">
|
||||
<view class="yixuan-tupian-item">
|
||||
<image class="yixuan-tupian" src="{{item}}" mode="aspectFill"></image>
|
||||
<view
|
||||
class="shanchu-btn"
|
||||
bindtap="handleDeleteImage"
|
||||
data-url="{{item}}"
|
||||
>
|
||||
<text>×</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
<!-- 新添加的本地图片 -->
|
||||
<block wx:for="{{newImages}}" wx:key="index">
|
||||
<view class="yixuan-tupian-item">
|
||||
<image class="yixuan-tupian" src="{{item}}" mode="aspectFill"></image>
|
||||
<view
|
||||
class="shanchu-btn"
|
||||
bindtap="handleDeleteImage"
|
||||
data-url="{{item}}"
|
||||
>
|
||||
<text>×</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
<!-- 添加按钮(基于 remainingOriginals.length + newImages.length 计算剩余容量) -->
|
||||
<view
|
||||
class="tianjia-btn"
|
||||
bindtap="handleAddImage"
|
||||
wx:if="{{remainingOriginals.length + newImages.length < 9}}"
|
||||
>
|
||||
<text class="tianjia-icon">+</text>
|
||||
<text class="tianjia-text">添加图片</text>
|
||||
<text class="tianjia-tip">({{9 - (remainingOriginals.length + newImages.length)}}/9)</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 留言编辑 -->
|
||||
<view class="liuyan-input-container">
|
||||
<text class="section-subtitle">留言(可选,最多50字)</text>
|
||||
<textarea
|
||||
class="liuyan-textarea"
|
||||
value="{{modifiedLiuyan}}"
|
||||
placeholder="请输入留言..."
|
||||
maxlength="50"
|
||||
bindinput="onModifyLiuyanInput"
|
||||
></textarea>
|
||||
<text class="zi-shu">
|
||||
已输入 {{modifiedLiuyan.length}}/50 字
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 提交订单区域(仅状态=2时显示,保持不变) -->
|
||||
<view class="tijiao-area" wx:if="{{jibenShuju.zhuangtai == 2}}">
|
||||
<view class="info-title">提交订单</view>
|
||||
|
||||
<!-- 选择图片 -->
|
||||
<view class="xuanze-tupian-container">
|
||||
<text class="section-subtitle">选择交付图片(最多9张)</text>
|
||||
|
||||
<!-- 已选图片预览 -->
|
||||
<view class="yixuan-tupian-grid">
|
||||
<block wx:for="{{xuanzhongTupian}}" wx:key="index">
|
||||
<view class="yixuan-tupian-item">
|
||||
<image
|
||||
class="yixuan-tupian"
|
||||
src="{{item}}"
|
||||
mode="aspectFill"
|
||||
></image>
|
||||
<view
|
||||
class="shanchu-btn"
|
||||
bindtap="shanchuTupian"
|
||||
data-index="{{index}}"
|
||||
>
|
||||
<text>×</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
<!-- 添加按钮 -->
|
||||
<view
|
||||
class="tianjia-btn"
|
||||
bindtap="xuanzeTupian"
|
||||
wx:if="{{xuanzhongTupian.length < 9}}"
|
||||
>
|
||||
<text class="tianjia-icon">+</text>
|
||||
<text class="tianjia-text">添加图片</text>
|
||||
<text class="tianjia-tip">({{9 - xuanzhongTupian.length}}/9)</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 上传进度 -->
|
||||
<view class="shangchuan-jindu-container" wx:if="{{shangchuanZongshu > 0}}">
|
||||
<view class="jindu-bar">
|
||||
<view class="jindu-fill" style="width: {{jinduWidth}}"></view>
|
||||
</view>
|
||||
<text class="jindu-text">上传中: {{shangchuanJindu}}/{{shangchuanZongshu}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 留言输入 -->
|
||||
<view class="liuyan-input-container">
|
||||
<text class="section-subtitle">留言(可选,最多50字)</text>
|
||||
<textarea
|
||||
class="liuyan-textarea"
|
||||
value="{{liuyan}}"
|
||||
placeholder="请输入留言..."
|
||||
maxlength="50"
|
||||
bindinput="shuruLiuyan"
|
||||
></textarea>
|
||||
<text class="zi-shu">
|
||||
已输入 {{liuyan.length}}/50 字
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- ========== 底部按钮区域 ========== -->
|
||||
<view class="bottom-btns-container" wx:if="{{!isLoading}}">
|
||||
|
||||
<!-- 🆕 修改模式下的按钮(取消/确认) -->
|
||||
<block wx:if="{{isModifying}}">
|
||||
<view class="btn-row">
|
||||
<view
|
||||
class="bottom-btn cancel-modify-btn"
|
||||
bindtap="cancelModify"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">取消修改</text>
|
||||
</view>
|
||||
<view
|
||||
class="bottom-btn confirm-modify-btn"
|
||||
bindtap="confirmModify"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">{{isConfirming ? '提交中...' : '确认修改'}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
<!-- 非修改模式下的按钮 -->
|
||||
<block wx:else>
|
||||
<!-- 第一行:联系客服 + 联系老板(当状态不为1且不为7时显示老板按钮) -->
|
||||
<view class="btn-row" wx:if="{{jibenShuju.zhuangtai != 1 && jibenShuju.zhuangtai != 7}}">
|
||||
<view
|
||||
class="bottom-btn contact-btn"
|
||||
bindtap="goToKefu"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">联系客服</text>
|
||||
</view>
|
||||
<view
|
||||
class="bottom-btn boss-btn"
|
||||
bindtap="goToChatWithBoss"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">联系老板</text>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 如果没有老板按钮,只显示联系客服占一行 -->
|
||||
<view class="btn-row" wx:else>
|
||||
<view
|
||||
class="bottom-btn contact-btn full-width"
|
||||
bindtap="goToKefu"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">联系客服</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 🆕 新增:修改按钮(仅当状态为4或8时显示) -->
|
||||
<view class="btn-row" wx:if="{{jibenShuju.zhuangtai == 4 || jibenShuju.zhuangtai == 8}}">
|
||||
<view
|
||||
class="bottom-btn modify-btn full-width"
|
||||
bindtap="enterModify"
|
||||
hover-class="btn-hover"
|
||||
>
|
||||
<text class="btn-text">修改交付</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 提交按钮(仅状态=2时显示) -->
|
||||
<view
|
||||
class="bottom-btn submit-btn"
|
||||
wx:if="{{jibenShuju.zhuangtai == 2}}"
|
||||
bindtap="tijiaoDingdan"
|
||||
>
|
||||
<text class="btn-text">{{isSubmitting ? '提交中...' : '立即提交'}}</text>
|
||||
<view class="btn-shine"></view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
</view>
|
||||
|
||||
<!-- 完整介绍弹窗 -->
|
||||
<view class="modal-container" wx:if="{{showWanzhengJieshao}}">
|
||||
<view class="modal-mask" bindtap="guanbiWanzhengJieshao"></view>
|
||||
<view class="modal-content">
|
||||
<view class="modal-header">
|
||||
<text class="modal-title">订单介绍</text>
|
||||
<view class="modal-close" bindtap="guanbiWanzhengJieshao">×</view>
|
||||
</view>
|
||||
<view class="modal-body">
|
||||
<scroll-view class="modal-scroll" scroll-y="true">
|
||||
<text class="modal-content-text">{{wanzhengJieshao}}</text>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 完整备注弹窗 -->
|
||||
<view class="modal-container" wx:if="{{showWanzhengBeizhu}}">
|
||||
<view class="modal-mask" bindtap="guanbiWanzhengBeizhu"></view>
|
||||
<view class="modal-content">
|
||||
<view class="modal-header">
|
||||
<text class="modal-title">订单备注</text>
|
||||
<view class="modal-close" bindtap="guanbiWanzhengBeizhu">×</view>
|
||||
</view>
|
||||
<view class="modal-body">
|
||||
<scroll-view class="modal-scroll" scroll-y="true">
|
||||
<text class="modal-content-text">{{wanzhengBeizhu}}</text>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<global-notification id="global-notification" />
|
||||
<popup-notice id="popupNotice" />
|
||||
</view>
|
||||
589
miniprogram/pages/dsddxq/dsddxq.wxss
Normal file
589
miniprogram/pages/dsddxq/dsddxq.wxss
Normal file
@@ -0,0 +1,589 @@
|
||||
/* pages/dsddxq/dsddxq.wxss */
|
||||
|
||||
/* 页面基础样式 */
|
||||
.dsddxq-page {
|
||||
min-height: 100vh;
|
||||
background-color: #f8f9fa;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* 加载中状态 */
|
||||
.loading-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 60vh;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
width: 80rpx;
|
||||
height: 80rpx;
|
||||
border: 8rpx solid #e0e0e0;
|
||||
border-top-color: #2196f3;
|
||||
border-radius: 50%;
|
||||
animation: spin 1.2s linear infinite;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
font-size: 30rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
/* 内容区域 */
|
||||
.content-container {
|
||||
padding: 25rpx 25rpx 220rpx; /* 减少底部内边距,避免过多空白 */
|
||||
}
|
||||
|
||||
/* 商品图片和介绍区域 */
|
||||
.shangpin-area {
|
||||
display: flex;
|
||||
background-color: #ffffff;
|
||||
border-radius: 20rpx;
|
||||
padding: 25rpx;
|
||||
margin-bottom: 25rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.shangpin-image-container {
|
||||
flex-shrink: 0;
|
||||
width: 180rpx;
|
||||
height: 180rpx;
|
||||
margin-right: 25rpx;
|
||||
}
|
||||
|
||||
.shangpin-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 12rpx;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.shangpin-jieshao {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.jieshao-text {
|
||||
font-size: 28rpx;
|
||||
line-height: 42rpx;
|
||||
color: #333333;
|
||||
font-weight: 400;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 4;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.chakan-wanzheng {
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
|
||||
.chakan-wanzheng text {
|
||||
font-size: 24rpx;
|
||||
color: #2196f3;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 通用区域样式 */
|
||||
.info-title {
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
margin-bottom: 20rpx;
|
||||
padding-bottom: 12rpx;
|
||||
border-bottom: 2rpx solid rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.section-subtitle {
|
||||
font-size: 28rpx;
|
||||
color: #555555;
|
||||
font-weight: 500;
|
||||
display: block;
|
||||
margin: 15rpx 0 10rpx;
|
||||
}
|
||||
|
||||
/* 订单信息区域 */
|
||||
.dingdan-info-area,
|
||||
.shangjia-area,
|
||||
.tuikuan-area,
|
||||
.chufa-area,
|
||||
.dashou-jiaofu-area,
|
||||
.tijiao-area {
|
||||
background-color: #ffffff;
|
||||
border-radius: 20rpx;
|
||||
padding: 25rpx;
|
||||
margin-bottom: 25rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.info-item-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 18rpx;
|
||||
padding: 12rpx 0;
|
||||
}
|
||||
|
||||
.info-item-row:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
font-weight: 400;
|
||||
flex-shrink: 0;
|
||||
min-width: 150rpx;
|
||||
}
|
||||
|
||||
/* 右侧区域容器 */
|
||||
.item-right-area {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.item-value {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
font-weight: 500;
|
||||
word-break: break-all;
|
||||
text-align: right;
|
||||
margin-right: 15rpx;
|
||||
}
|
||||
|
||||
/* 特殊样式 */
|
||||
.jine-green {
|
||||
color: #4caf50 !important;
|
||||
font-weight: 600 !important;
|
||||
font-size: 32rpx !important;
|
||||
}
|
||||
|
||||
.zhuangtai-text {
|
||||
font-weight: 600 !important;
|
||||
font-size: 30rpx !important;
|
||||
color: #333333 !important;
|
||||
}
|
||||
|
||||
/* 按钮样式(复制、查看) */
|
||||
.copy-btn,
|
||||
.chakan-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 24rpx;
|
||||
color: #4caf50;
|
||||
background-color: #e8f5e9;
|
||||
padding: 6rpx 16rpx;
|
||||
border-radius: 20rpx;
|
||||
border: 1rpx solid #4caf50;
|
||||
transition: all 0.2s ease;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.chakan-btn {
|
||||
color: #2196f3;
|
||||
background-color: #e3f2fd;
|
||||
border-color: #2196f3;
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
|
||||
.copy-btn-hover,
|
||||
.chakan-btn:active {
|
||||
background-color: #c8e6c9;
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
.copy-icon {
|
||||
font-size: 20rpx;
|
||||
margin-right: 6rpx;
|
||||
}
|
||||
|
||||
.copy-text {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 打手交付图片网格 */
|
||||
.jiaofu-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: -5rpx;
|
||||
}
|
||||
|
||||
.jiaofu-image-item {
|
||||
width: calc(33.333% - 10rpx);
|
||||
margin: 5rpx;
|
||||
aspect-ratio: 1/1;
|
||||
}
|
||||
|
||||
.jiaofu-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 12rpx;
|
||||
background-color: #f5f5f5;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
.jiaofu-image:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
/* 留言内容样式 */
|
||||
.liuyan-content {
|
||||
font-size: 26rpx;
|
||||
line-height: 40rpx;
|
||||
color: #555555;
|
||||
padding: 15rpx;
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 12rpx;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
|
||||
/* 选择图片区域 */
|
||||
.yixuan-tupian-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: -8rpx;
|
||||
}
|
||||
|
||||
.yixuan-tupian-item {
|
||||
width: calc(33.333% - 16rpx);
|
||||
margin: 8rpx;
|
||||
aspect-ratio: 1/1;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.yixuan-tupian {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 12rpx;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.shanchu-btn {
|
||||
position: absolute;
|
||||
top: -10rpx;
|
||||
right: -10rpx;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
background-color: #ff4444;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 24rpx;
|
||||
font-weight: bold;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.tianjia-btn {
|
||||
width: calc(33.333% - 16rpx);
|
||||
margin: 8rpx;
|
||||
aspect-ratio: 1/1;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 12rpx;
|
||||
border: 2rpx dashed #cccccc;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.tianjia-icon {
|
||||
font-size: 48rpx;
|
||||
font-weight: 300;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.tianjia-text {
|
||||
font-size: 24rpx;
|
||||
margin-bottom: 4rpx;
|
||||
}
|
||||
|
||||
.tianjia-tip {
|
||||
font-size: 20rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
/* 上传进度 */
|
||||
.shangchuan-jindu-container {
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.jindu-bar {
|
||||
width: 100%;
|
||||
height: 20rpx;
|
||||
background-color: #f0f0f0;
|
||||
border-radius: 10rpx;
|
||||
overflow: hidden;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.jindu-fill {
|
||||
height: 100%;
|
||||
background-color: #4caf50;
|
||||
border-radius: 10rpx;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
.jindu-text {
|
||||
font-size: 24rpx;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* 留言输入 */
|
||||
.liuyan-textarea {
|
||||
width: 100%;
|
||||
min-height: 120rpx;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 12rpx;
|
||||
padding: 20rpx;
|
||||
margin-top: 10rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.zi-shu {
|
||||
display: block;
|
||||
text-align: right;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
|
||||
/* ==================== 底部按钮区域 ==================== */
|
||||
.bottom-btns-container {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: #ffffff;
|
||||
padding: 20rpx 30rpx;
|
||||
border-top: 1rpx solid #f0f0f0;
|
||||
box-shadow: 0 -2rpx 20rpx rgba(0, 0, 0, 0.08);
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10rpx; /* 减小按钮间距 */
|
||||
}
|
||||
|
||||
/* 🆕 新增:按钮行布局(用于并排两个按钮) */
|
||||
.btn-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 🆕 当有两个按钮时,各占一半(减去gap的一半) */
|
||||
.btn-row .bottom-btn {
|
||||
width: calc(50% - 10rpx);
|
||||
}
|
||||
|
||||
/* 🆕 当只有一个按钮时,占满 */
|
||||
.btn-row .full-width {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 统一底部按钮样式 */
|
||||
.bottom-btn {
|
||||
width: 100%;
|
||||
height: 88rpx; /* 统一高度 */
|
||||
border-radius: 44rpx; /* 圆角 */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.btn-hover {
|
||||
opacity: 0.9;
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
/* 联系客服按钮 */
|
||||
.contact-btn {
|
||||
background-color: #2196F3;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(33, 150, 243, 0.3);
|
||||
}
|
||||
|
||||
/* 🆕 新增:联系老板按钮 */
|
||||
.boss-btn {
|
||||
background-color: #ff9800;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(255, 152, 0, 0.3);
|
||||
}
|
||||
|
||||
/* 🆕 新增:修改按钮(黑色) */
|
||||
.modify-btn {
|
||||
background-color: #333333;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(51, 51, 51, 0.3);
|
||||
}
|
||||
|
||||
/* 🆕 新增:取消修改按钮 */
|
||||
.cancel-modify-btn {
|
||||
background-color: #9e9e9e;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(158, 158, 158, 0.3);
|
||||
}
|
||||
|
||||
/* 🆕 新增:确认修改按钮 */
|
||||
.confirm-modify-btn {
|
||||
background-color: #4caf50;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(76, 175, 80, 0.3);
|
||||
}
|
||||
|
||||
/* 提交按钮 */
|
||||
.submit-btn {
|
||||
background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%);
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4rpx 15rpx rgba(76, 175, 80, 0.3);
|
||||
}
|
||||
|
||||
/* 提交按钮闪光特效 */
|
||||
.submit-btn::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
|
||||
animation: flash 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes flash {
|
||||
0% { left: -100%; }
|
||||
100% { left: 100%; }
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* ==================== 弹窗样式 ==================== */
|
||||
.modal-container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 1000;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.modal-mask {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
position: relative;
|
||||
width: 600rpx;
|
||||
max-height: 70vh;
|
||||
background-color: #ffffff;
|
||||
border-radius: 20rpx;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.15);
|
||||
z-index: 1001;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 30rpx;
|
||||
border-bottom: 1rpx solid #f0f0f0;
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
font-size: 34rpx;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.modal-close {
|
||||
font-size: 40rpx;
|
||||
color: #999999;
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding: 30rpx;
|
||||
max-height: 50vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.modal-scroll {
|
||||
height: 100%;
|
||||
max-height: 50vh;
|
||||
}
|
||||
|
||||
.modal-content-text {
|
||||
font-size: 28rpx;
|
||||
line-height: 44rpx;
|
||||
color: #333333;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* 响应式调整 */
|
||||
@media (max-width: 375px) {
|
||||
.shangpin-image-container {
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
}
|
||||
|
||||
.bottom-btn {
|
||||
height: 80rpx;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
min-width: 140rpx;
|
||||
font-size: 26rpx;
|
||||
}
|
||||
|
||||
.item-value {
|
||||
font-size: 26rpx;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
width: 560rpx;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user