修改国际版本

This commit is contained in:
2026-06-12 16:08:00 +08:00
parent af758a0ccc
commit 836cdaf2dc
38 changed files with 449 additions and 145 deletions
+1 -1
View File
@@ -18,7 +18,7 @@
lazy-load="true" lazy-load="true"
></image> ></image>
<view class="product-info"> <view class="product-info">
<view class="product-name">{{ order.productName || order.deviceName || '风电者2026新款' }}</view> <view class="product-name">{{ order.productName || order.deviceName || $t('goods.defaultProductNameShort') }}</view>
<view style="display: flex;justify-content: space-between;"> <view style="display: flex;justify-content: space-between;">
<view class="product-style">款式{{ order.optionName || order.style || order.deviceStyle || '标准' }}</view> <view class="product-style">款式{{ order.optionName || order.style || order.deviceStyle || '标准' }}</view>
<view class="product-price">¥ {{ totalAmount }}</view> <view class="product-price">¥ {{ totalAmount }}</view>
+2 -2
View File
@@ -1,7 +1,7 @@
// export const URL = "https://my.gxfs123.com/api" //正式服务器-弃用 // export const URL = "https://my.gxfs123.com/api" //正式服务器-弃用
// export const URL = "https://manager.fdzpower.com/api" //正式国内服务器 // export const URL = "https://manager.fdzpower.com/api" //正式国内服务器
// export const URL = "https://ina.fdzpower.com/api" //正式国外服务器 export const URL = "https://ina.fdzpower.com/api" //正式国外服务器
export const URL = "https://fansdev.gxfs123.com/api" //测试服务器 // export const URL = "https://fansdev.gxfs123.com/api" //测试服务器
// export const URL = "http://192.168.0.58:8080" //本地调试 // export const URL = "http://192.168.0.58:8080" //本地调试
// export const URL = "http://127.0.0.1:8080" //本地调试 // export const URL = "http://127.0.0.1:8080" //本地调试
+47 -10
View File
@@ -71,18 +71,18 @@ export default {
orders: 'Orders', orders: 'Orders',
settings: 'Settings', settings: 'Settings',
back: 'Back', back: 'Back',
title: 'FengDianZhe' title: 'Isidaya'
}, },
app: { app: {
name: 'FengDianZhe', name: 'Isidaya',
slogan: 'Fan & Power Bank Rental', slogan: 'Fan & Power Bank Rental',
fullName: 'FengDianZhe', fullName: 'Isidaya',
welcome: 'Welcome' welcome: 'Welcome to Isidaya'
}, },
home: { home: {
title: 'FengDianZhe', title: 'Isidaya',
nearbyDevices: 'Nearby', nearbyDevices: 'Nearby',
scanToUse: 'Scan', scanToUse: 'Scan',
personalCenter: 'Profile', personalCenter: 'Profile',
@@ -115,6 +115,38 @@ export default {
enableLocation: 'Enable Location' enableLocation: 'Enable Location'
}, },
scan: {
title: 'Scan to Use',
album: 'Album',
manualInput: 'Enter Manually',
manualInputTitle: 'Enter Device No.',
deviceNoPlaceholder: 'Enter the number on the device',
initializing: 'Initializing...',
startingCamera: 'Starting camera...',
alignQRCode: 'Align the QR code within the frame',
initFailed: 'Initialization failed',
browserNotSupportCamera: 'Your browser does not support camera access',
containerNotFound: 'Scanner container not found',
noCameraFound: 'No camera found',
ensureCameraExists: 'Please make sure your device has a camera',
cameraPermissionDenied: 'Camera permission denied',
cameraPermissionHint: 'Please allow camera access in browser settings',
cameraInUse: 'Camera is in use',
closeOtherCameraApps: 'Please close other apps using the camera',
browserNotSupported: 'Browser not supported',
useModernBrowser: 'Please use a modern browser',
cameraStartFailed: 'Failed to start camera',
tryRefreshOrAlternative: 'Try refreshing the page or use another method',
errorFallbackHint: 'You can:',
errorFallbackAlbum: 'Select a QR code image from album',
errorFallbackManual: 'Enter device number manually',
recognizing: 'Recognizing...',
qrNotFound: 'QR code not detected',
recognizeFailed: 'Recognition failed',
h5Only: 'This feature is only available on H5',
deviceNoRequired: 'Please enter device number'
},
guide: { guide: {
title: 'How to Use', title: 'How to Use',
step1Title: 'Scan QR Code', step1Title: 'Scan QR Code',
@@ -153,6 +185,8 @@ export default {
offline: 'Offline', offline: 'Offline',
pricingRules: 'Pricing Rules', pricingRules: 'Pricing Rules',
capLimit: ' Cap', capLimit: ' Cap',
detailBillingByUnit: 'Less than {unit} {minute} is billed as {unit} {minute}. Capped at ¥{cap}. Billing up to ¥{cap} counts as purchase.',
detailBillingIdr: 'Less than 1 {hour} is billed as 1 {hour}. Capped at {cap}. Billing up to {cap} counts as purchase.',
usageInstructions: 'Usage Instructions', usageInstructions: 'Usage Instructions',
checkBeforeUse: 'Please check if the device is in good condition before use', checkBeforeUse: 'Please check if the device is in good condition before use',
autoChargeOvertime: 'Overtime will be charged automatically by hour', autoChargeOvertime: 'Overtime will be charged automatically by hour',
@@ -180,6 +214,7 @@ export default {
noOrderRecord: 'No order records', noOrderRecord: 'No order records',
getOrderListFailed: 'Failed to get order list', getOrderListFailed: 'Failed to get order list',
confirmCancelContent: 'Are you sure to cancel this order?', confirmCancelContent: 'Are you sure to cancel this order?',
confirmDeleteContent: 'Are you sure you want to delete this order?',
orderDetail: 'Order Detail', orderDetail: 'Order Detail',
orderNo: 'Order No.', orderNo: 'Order No.',
orderStatus: 'Order Status', orderStatus: 'Order Status',
@@ -541,7 +576,7 @@ export default {
received: 'Received', received: 'Received',
detail: 'Detail', detail: 'Detail',
recipientInfo: 'Ship To', recipientInfo: 'Ship To',
recipientName: 'FengDianZhe 18163601305', recipientName: 'Isidaya 18163601305',
recipientAddress: 'Rm 623, Bldg A2, Xinchanghai Park, Luogu St, Yuelu, Changsha, Hunan', recipientAddress: 'Rm 623, Bldg A2, Xinchanghai Park, Luogu St, Yuelu, Changsha, Hunan',
copyAllInfo: 'Copy All', copyAllInfo: 'Copy All',
recipient: 'To', recipient: 'To',
@@ -621,7 +656,7 @@ export default {
termsOfService: 'Terms of Service', termsOfService: 'Terms of Service',
termsAndConditions: 'Terms & Conditions', termsAndConditions: 'Terms & Conditions',
lastUpdate: 'Last Update', lastUpdate: 'Last Update',
applicableToService: 'Applicable to "FengDianZhe" shared fan rental service', applicableToService: 'Applicable to "Isidaya" shared fan rental service',
footerNotice: 'If you have questions about this agreement, please go to "My-Customer Service"', footerNotice: 'If you have questions about this agreement, please go to "My-Customer Service"',
footerNoticePolicy: 'If you have questions about this policy, please go to "My-Customer Service"', footerNoticePolicy: 'If you have questions about this policy, please go to "My-Customer Service"',
@@ -657,7 +692,7 @@ export default {
}, },
share: { share: {
title: 'FengDianZhe - Shared Fan & Power Bank', title: 'Isidaya - Shared Fan & Power Bank',
path: '/pages/index/index' path: '/pages/index/index'
}, },
@@ -869,7 +904,9 @@ export default {
goods: { goods: {
title: 'Product Details', title: 'Product Details',
goodsTitle: 'Customize Details', goodsTitle: 'Customize Details',
productName: 'FengDianZhe Shared Fan + Power Bank + Hand Warmer Series - Cherry Blossom Pink', defaultProductNameShort: 'Isidaya 2026',
defaultProductNameFull: 'Isidaya 2026 Fan, Power Bank & Hand Warmer All-in-One',
productName: 'Isidaya Shared Fan + Power Bank + Hand Warmer Series - Cherry Blossom Pink',
perUnit: '/pc', perUnit: '/pc',
buyNow: 'Buy Now', buyNow: 'Buy Now',
productDetail: 'Customize Details', productDetail: 'Customize Details',
@@ -880,7 +917,7 @@ export default {
temp: 'Smart Temperature', temp: 'Smart Temperature',
charge: 'Fast Charging' charge: 'Fast Charging'
}, },
description: 'FengDianZhe shared fan, integrating fan, power bank, and hand warmer functions. Equipped with 8000mAh large capacity battery for long-lasting use. Efficient fan design with 3-speed adjustment. Smart temperature control hand warmer, warm in winter and cool in summer. Fast charging technology supports multiple device charging. Cherry blossom pink color, fashionable and beautiful, your best travel companion.', description: 'Isidaya shared fan, integrating fan, power bank, and hand warmer functions. Equipped with 8000mAh large capacity battery for long-lasting use. Efficient fan design with 3-speed adjustment. Smart temperature control hand warmer, warm in winter and cool in summer. Fast charging technology supports multiple device charging. Cherry blossom pink color, fashionable and beautiful, your best travel companion.',
confirmPurchase: 'Confirm Purchase', confirmPurchase: 'Confirm Purchase',
confirmPurchaseContent: 'Confirm to purchase this product for ¥{price}?', confirmPurchaseContent: 'Confirm to purchase this product for ¥{price}?',
purchaseSuccess: 'Purchase Successful', purchaseSuccess: 'Purchase Successful',
+47 -10
View File
@@ -71,18 +71,18 @@ export default {
orders: 'Pesanan', orders: 'Pesanan',
settings: 'Pengaturan', settings: 'Pengaturan',
back: 'Kembali', back: 'Kembali',
title: 'Kipas Angin & Power Bank Berbagi FengDianZhe' title: 'Kipas Angin & Power Bank Berbagi Isidaya'
}, },
app: { app: {
name: 'FengDianZhe', name: 'Isidaya',
slogan: 'Kipas Angin & Power Bank Berbagi', slogan: 'Kipas Angin & Power Bank Berbagi',
fullName: 'FengDianZhe - Kipas Angin & Power Bank Berbagi', fullName: 'Isidaya - Kipas Angin & Power Bank Berbagi',
welcome: 'Selamat datang menggunakan FengDianZhe' welcome: 'Selamat datang menggunakan Isidaya'
}, },
home: { home: {
title: 'Kipas Angin & Power Bank Berbagi FengDianZhe', title: 'Kipas Angin & Power Bank Berbagi Isidaya',
nearbyDevices: 'Perangkat Terdekat', nearbyDevices: 'Perangkat Terdekat',
scanToUse: 'Pindai untuk Menggunakan', scanToUse: 'Pindai untuk Menggunakan',
personalCenter: 'Pusat Pribadi', personalCenter: 'Pusat Pribadi',
@@ -115,6 +115,38 @@ export default {
enableLocation: 'Aktifkan Lokasi' enableLocation: 'Aktifkan Lokasi'
}, },
scan: {
title: 'Pindai untuk Menggunakan',
album: 'Album',
manualInput: 'Input Manual',
manualInputTitle: 'Masukkan Nomor Perangkat',
deviceNoPlaceholder: 'Masukkan nomor pada perangkat',
initializing: 'Menginisialisasi...',
startingCamera: 'Menghidupkan kamera...',
alignQRCode: 'Letakkan kode QR dalam bingkai',
initFailed: 'Inisialisasi gagal',
browserNotSupportCamera: 'Browser Anda tidak mendukung akses kamera',
containerNotFound: 'Kontainer pemindai tidak ditemukan',
noCameraFound: 'Kamera tidak ditemukan',
ensureCameraExists: 'Pastikan perangkat Anda memiliki kamera',
cameraPermissionDenied: 'Izin kamera ditolak',
cameraPermissionHint: 'Harap izinkan akses kamera di pengaturan browser',
cameraInUse: 'Kamera sedang digunakan',
closeOtherCameraApps: 'Harap tutup aplikasi lain yang menggunakan kamera',
browserNotSupported: 'Browser tidak didukung',
useModernBrowser: 'Harap gunakan browser modern',
cameraStartFailed: 'Gagal menghidupkan kamera',
tryRefreshOrAlternative: 'Coba segarkan halaman atau gunakan cara lain',
errorFallbackHint: 'Anda dapat:',
errorFallbackAlbum: 'Pilih gambar kode QR dari album',
errorFallbackManual: 'Masukkan nomor perangkat secara manual',
recognizing: 'Mengenali...',
qrNotFound: 'Kode QR tidak terdeteksi',
recognizeFailed: 'Pengenalan gagal',
h5Only: 'Fitur ini hanya tersedia di H5',
deviceNoRequired: 'Harap masukkan nomor perangkat'
},
guide: { guide: {
title: 'Panduan Penggunaan', title: 'Panduan Penggunaan',
step1Title: 'Pindai untuk Menggunakan', step1Title: 'Pindai untuk Menggunakan',
@@ -154,6 +186,8 @@ export default {
offline: 'Offline', offline: 'Offline',
pricingRules: 'Aturan Penagihan', pricingRules: 'Aturan Penagihan',
capLimit: 'Maksimum', capLimit: 'Maksimum',
detailBillingByUnit: 'Kurang dari {unit} {minute} ditagih sebagai {unit} {minute}. Maksimum ¥{cap}. Penagihan hingga ¥{cap} dianggap sebagai pembelian.',
detailBillingIdr: 'Kurang dari 1 {hour} ditagih sebagai 1 {hour}. Maksimum {cap}. Penagihan hingga {cap} dianggap sebagai pembelian.',
usageInstructions: 'Instruksi Penggunaan', usageInstructions: 'Instruksi Penggunaan',
checkBeforeUse: 'Harap periksa apakah perangkat dalam kondisi baik sebelum digunakan', checkBeforeUse: 'Harap periksa apakah perangkat dalam kondisi baik sebelum digunakan',
autoChargeOvertime: 'Melebihi waktu penggunaan akan dikenakan biaya per jam secara otomatis', autoChargeOvertime: 'Melebihi waktu penggunaan akan dikenakan biaya per jam secara otomatis',
@@ -181,6 +215,7 @@ export default {
noOrderRecord: 'Tidak ada catatan pesanan', noOrderRecord: 'Tidak ada catatan pesanan',
getOrderListFailed: 'Gagal mendapatkan daftar pesanan', getOrderListFailed: 'Gagal mendapatkan daftar pesanan',
confirmCancelContent: 'Apakah Anda yakin ingin membatalkan pesanan ini?', confirmCancelContent: 'Apakah Anda yakin ingin membatalkan pesanan ini?',
confirmDeleteContent: 'Apakah Anda yakin ingin menghapus pesanan ini?',
orderDetail: 'Detail Pesanan', orderDetail: 'Detail Pesanan',
orderNo: 'Nomor Pesanan', orderNo: 'Nomor Pesanan',
orderStatus: 'Status Pesanan', orderStatus: 'Status Pesanan',
@@ -540,7 +575,7 @@ export default {
received: 'Telah Diterima', received: 'Telah Diterima',
detail: 'Detail', detail: 'Detail',
recipientInfo: 'Informasi Penerima', recipientInfo: 'Informasi Penerima',
recipientName: 'FengDianZhe 18163601305', recipientName: 'Isidaya 18163601305',
recipientAddress: 'Gedung A2, Lantai 623, Taman Sains dan Teknologi Xinchanghaijian, Jalan Lugu, Distrik Yuelu, Changsha, Provinsi Hunan', recipientAddress: 'Gedung A2, Lantai 623, Taman Sains dan Teknologi Xinchanghaijian, Jalan Lugu, Distrik Yuelu, Changsha, Provinsi Hunan',
copyAllInfo: 'Salin Semua Informasi', copyAllInfo: 'Salin Semua Informasi',
recipient: 'Penerima', recipient: 'Penerima',
@@ -620,7 +655,7 @@ export default {
termsOfService: 'Ketentuan Layanan', termsOfService: 'Ketentuan Layanan',
termsAndConditions: 'Syarat & Ketentuan', termsAndConditions: 'Syarat & Ketentuan',
lastUpdate: 'Pembaruan Terakhir', lastUpdate: 'Pembaruan Terakhir',
applicableToService: 'Berlaku untuk layanan sewa kipas angin berbagi "FengDianZhe"', applicableToService: 'Berlaku untuk layanan sewa kipas angin berbagi "Isidaya"',
footerNotice: 'Jika ada pertanyaan tentang perjanjian ini, harap pergi ke "Saya-Layanan Pelanggan" untuk konsultasi', footerNotice: 'Jika ada pertanyaan tentang perjanjian ini, harap pergi ke "Saya-Layanan Pelanggan" untuk konsultasi',
footerNoticePolicy: 'Jika ada pertanyaan tentang kebijakan ini, harap pergi ke "Saya-Layanan Pelanggan" untuk konsultasi', footerNoticePolicy: 'Jika ada pertanyaan tentang kebijakan ini, harap pergi ke "Saya-Layanan Pelanggan" untuk konsultasi',
@@ -656,7 +691,7 @@ export default {
}, },
share: { share: {
title: 'FengDianZhe - Kipas Angin & Power Bank Berbagi', title: 'Isidaya - Kipas Angin & Power Bank Berbagi',
path: '/pages/index/index' path: '/pages/index/index'
}, },
@@ -868,7 +903,9 @@ export default {
goods: { goods: {
title: 'Detail Produk', title: 'Detail Produk',
goodsTitle: 'Detail Kustomisasi', goodsTitle: 'Detail Kustomisasi',
productName: 'FengDianZhe Kipas Angin Berbagi + Power Bank + Seri Hand Warmer - Pink Sakura', defaultProductNameShort: 'Isidaya 2026',
defaultProductNameFull: 'Isidaya 2026 Kipas Angin, Power Bank & Hand Warmer 3-in-1',
productName: 'Isidaya Kipas Angin Berbagi + Power Bank + Seri Hand Warmer - Pink Sakura',
perUnit: '/buah', perUnit: '/buah',
buyNow: 'Beli Sekarang', buyNow: 'Beli Sekarang',
productDetail: 'Detail Kustomisasi', productDetail: 'Detail Kustomisasi',
@@ -879,7 +916,7 @@ export default {
temp: 'Kontrol Suhu Pintar', temp: 'Kontrol Suhu Pintar',
charge: 'Pengisian Cepat' charge: 'Pengisian Cepat'
}, },
description: 'FengDianZhe kipas angin berbagi, mengintegrasikan tiga fungsi dalam satu: kipas angin, power bank, dan hand warmer. Menggunakan baterai kapasitas besar 8000mAh, daya tahan lama. Desain kipas angin efisien, tiga tingkat angin dapat disesuaikan. Hand warmer kontrol suhu pintar, hangat di musim dingin dan sejuk di musim panas. Teknologi pengisian cepat, mendukung pengisian multi-perangkat. Warna pink sakura, modis dan indah, adalah teman perjalanan terbaik Anda.', description: 'Isidaya kipas angin berbagi, mengintegrasikan tiga fungsi dalam satu: kipas angin, power bank, dan hand warmer. Menggunakan baterai kapasitas besar 8000mAh, daya tahan lama. Desain kipas angin efisien, tiga tingkat angin dapat disesuaikan. Hand warmer kontrol suhu pintar, hangat di musim dingin dan sejuk di musim panas. Teknologi pengisian cepat, mendukung pengisian multi-perangkat. Warna pink sakura, modis dan indah, adalah teman perjalanan terbaik Anda.',
confirmPurchase: 'Konfirmasi Pembelian', confirmPurchase: 'Konfirmasi Pembelian',
confirmPurchaseContent: 'Konfirmasi membeli produk ini, perlu membayar ¥{price}?', confirmPurchaseContent: 'Konfirmasi membeli produk ini, perlu membayar ¥{price}?',
purchaseSuccess: 'Pembelian berhasil', purchaseSuccess: 'Pembelian berhasil',
+47 -10
View File
@@ -70,18 +70,18 @@ export default {
orders: '订单', orders: '订单',
settings: '设置', settings: '设置',
back: '返回', back: '返回',
title: '风电者共享风扇&暖手充电宝' title: 'Isidaya共享风扇&暖手充电宝'
}, },
app: { app: {
name: '风电者', name: 'Isidaya',
slogan: '共享风扇暖手充电宝', slogan: '共享风扇暖手充电宝',
fullName: '风电者 - 共享风扇暖手充电宝', fullName: 'Isidaya - 共享风扇暖手充电宝',
welcome: '欢迎使用风电者' welcome: '欢迎使用Isidaya'
}, },
home: { home: {
title: '风电者共享风扇&暖手充电宝', title: 'Isidaya共享风扇&暖手充电宝',
nearbyDevices: '附近设备', nearbyDevices: '附近设备',
scanToUse: '扫码使用', scanToUse: '扫码使用',
personalCenter: '个人中心', personalCenter: '个人中心',
@@ -114,6 +114,38 @@ export default {
enableLocation: '开启定位' enableLocation: '开启定位'
}, },
scan: {
title: '扫码使用',
album: '相册',
manualInput: '手动输入',
manualInputTitle: '手动输入设备号',
deviceNoPlaceholder: '请输入设备上的编号',
initializing: '正在初始化...',
startingCamera: '正在启动摄像头...',
alignQRCode: '将二维码放入框内扫描',
initFailed: '初始化失败',
browserNotSupportCamera: '您的浏览器不支持摄像头访问',
containerNotFound: '扫码容器未找到',
noCameraFound: '未找到可用的摄像头',
ensureCameraExists: '请确保设备有摄像头',
cameraPermissionDenied: '摄像头权限被拒绝',
cameraPermissionHint: '请在浏览器设置中允许访问摄像头',
cameraInUse: '摄像头被占用',
closeOtherCameraApps: '请关闭其他使用摄像头的应用',
browserNotSupported: '浏览器不支持',
useModernBrowser: '请使用现代浏览器访问',
cameraStartFailed: '摄像头启动失败',
tryRefreshOrAlternative: '请尝试刷新页面或使用其他方式',
errorFallbackHint: '您可以:',
errorFallbackAlbum: '从相册选择二维码图片',
errorFallbackManual: '手动输入设备号',
recognizing: '正在识别...',
qrNotFound: '未识别到二维码',
recognizeFailed: '识别失败',
h5Only: '该功能仅在H5环境可用',
deviceNoRequired: '请输入设备号'
},
guide: { guide: {
title: '使用指南', title: '使用指南',
step1Title: '扫码使用', step1Title: '扫码使用',
@@ -152,6 +184,8 @@ export default {
offline: '离线', offline: '离线',
pricingRules: '计费规则', pricingRules: '计费规则',
capLimit: '元封顶', capLimit: '元封顶',
detailBillingByUnit: '不足{unit}{minute}按{unit}{minute}计费,封顶{cap}元,持续计费至{cap}元视为买断',
detailBillingIdr: '不足1{hour}按1{hour}计费,封顶{cap},持续计费至{cap}视为买断',
usageInstructions: '使用说明', usageInstructions: '使用说明',
checkBeforeUse: '请在使用前检查设备是否完好', checkBeforeUse: '请在使用前检查设备是否完好',
autoChargeOvertime: '超出使用时间将自动按小时计费', autoChargeOvertime: '超出使用时间将自动按小时计费',
@@ -179,6 +213,7 @@ export default {
noOrderRecord: '暂无订单记录', noOrderRecord: '暂无订单记录',
getOrderListFailed: '获取订单列表失败', getOrderListFailed: '获取订单列表失败',
confirmCancelContent: '确定要取消此订单吗?', confirmCancelContent: '确定要取消此订单吗?',
confirmDeleteContent: '确定要删除这个订单吗?',
orderDetail: '订单详情', orderDetail: '订单详情',
orderNo: '订单号', orderNo: '订单号',
orderStatus: '订单状态', orderStatus: '订单状态',
@@ -540,7 +575,7 @@ export default {
received: '已签收', received: '已签收',
detail: '详情', detail: '详情',
recipientInfo: '收件信息', recipientInfo: '收件信息',
recipientName: '风电者 18163601305', recipientName: 'Isidaya 18163601305',
recipientAddress: '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623', recipientAddress: '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623',
copyAllInfo: '一键复制全部信息', copyAllInfo: '一键复制全部信息',
recipient: '收件人', recipient: '收件人',
@@ -620,7 +655,7 @@ export default {
termsOfService: '服务条款', termsOfService: '服务条款',
termsAndConditions: '条款与细则', termsAndConditions: '条款与细则',
lastUpdate: '最后更新', lastUpdate: '最后更新',
applicableToService: '适用于"风电者"共享风扇租借服务', applicableToService: '适用于"Isidaya"共享风扇租借服务',
footerNotice: '如对本协议有疑问,请前往"我的-客服"咨询', footerNotice: '如对本协议有疑问,请前往"我的-客服"咨询',
footerNoticePolicy: '如对本政策有疑问,请前往"我的-客服"咨询', footerNoticePolicy: '如对本政策有疑问,请前往"我的-客服"咨询',
@@ -656,7 +691,7 @@ export default {
}, },
share: { share: {
title: '风电者 - 共享风扇暖手充电宝', title: 'Isidaya - 共享风扇暖手充电宝',
path: '/pages/index/index' path: '/pages/index/index'
}, },
@@ -868,7 +903,9 @@ export default {
goods: { goods: {
title: '商品详情', title: '商品详情',
goodsTitle: '定制详情', goodsTitle: '定制详情',
productName: '风电者共享风扇 + 充电宝 + 暖手宝系列-樱花粉', defaultProductNameShort: 'Isidaya 2026新款',
defaultProductNameFull: 'Isidaya 2026新款风扇、充电宝、暖手宝三合一',
productName: 'Isidaya共享风扇 + 充电宝 + 暖手宝系列-樱花粉',
perUnit: '/个', perUnit: '/个',
buyNow: '立即购买', buyNow: '立即购买',
productDetail: '定制详情', productDetail: '定制详情',
@@ -879,7 +916,7 @@ export default {
temp: '智能控温', temp: '智能控温',
charge: '快速充电' charge: '快速充电'
}, },
description: '风电者共享风扇,集风扇、充电宝、暖手宝三合一功能。采用8000mAh大容量电池,续航持久。高效风扇设计,三档风力可调。智能控温暖手宝,冬暖夏凉。快速充电技术,支持多设备充电。樱花粉配色,时尚美观,是您出行的最佳伴侣。', description: 'Isidaya共享风扇,集风扇、充电宝、暖手宝三合一功能。采用8000mAh大容量电池,续航持久。高效风扇设计,三档风力可调。智能控温暖手宝,冬暖夏凉。快速充电技术,支持多设备充电。樱花粉配色,时尚美观,是您出行的最佳伴侣。',
confirmPurchase: '确认购买', confirmPurchase: '确认购买',
confirmPurchaseContent: '确认购买该商品,需支付 ¥{price}?', confirmPurchaseContent: '确认购买该商品,需支付 ¥{price}?',
purchaseSuccess: '购买成功', purchaseSuccess: '购买成功',
+1 -1
View File
@@ -96,7 +96,7 @@
"mode" : "history", "mode" : "history",
"base" : "/" "base" : "/"
}, },
"title" : "FDZPower" "title" : "Isidaya"
}, },
"uniStatistics" : { "uniStatistics" : {
"enable" : false "enable" : false
+1 -1
View File
@@ -25,7 +25,7 @@
{ {
"path": "pages/scan/index", "path": "pages/scan/index",
"style": { "style": {
"navigationBarTitleText": "扫码使用", "navigationBarTitleText": "",
"navigationBarBackgroundColor": "#000000", "navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white" "navigationBarTextStyle": "white"
} }
+17 -16
View File
@@ -153,7 +153,8 @@
getUserPhoneNumber getUserPhoneNumber
} from '@/util/index.js' } from '@/util/index.js'
import { import {
useI18n useI18n,
showModalI18n
} from '@/utils/i18n.js' } from '@/utils/i18n.js'
import DeviceDetailSkeleton from '@/components/DeviceDetailSkeleton.vue' import DeviceDetailSkeleton from '@/components/DeviceDetailSkeleton.vue'
@@ -297,7 +298,7 @@
// 不立即抛出错误,而是记录问题并继续处理 // 不立即抛出错误,而是记录问题并继续处理
if (!res) { if (!res) {
console.error('API返回数据为空') console.error('API返回数据为空')
uni.showModal({ showModalI18n({
title: '数据异常', title: '数据异常',
content: 'API返回为空', content: 'API返回为空',
showCancel: false showCancel: false
@@ -320,7 +321,7 @@
} else { } else {
// 记录详细信息,不抛出错误 // 记录详细信息,不抛出错误
console.warn('获取手机号响应异常:', res.msg || '未知错误') console.warn('获取手机号响应异常:', res.msg || '未知错误')
uni.showModal({ showModalI18n({
title: t('auth.phoneError'), title: t('auth.phoneError'),
content: `${t('common.statusCode')}: ${res.code}, ${t('common.message')}: ${res.msg || t('common.none')}`, content: `${t('common.statusCode')}: ${res.code}, ${t('common.message')}: ${res.msg || t('common.none')}`,
showCancel: false showCancel: false
@@ -333,7 +334,7 @@
// 显示更详细的错误信息 // 显示更详细的错误信息
let errMsg = err.message || err.toString() let errMsg = err.message || err.toString()
uni.showModal({ showModalI18n({
title: t('auth.phoneGetFailed'), title: t('auth.phoneGetFailed'),
content: t('common.errorInfo') + ': ' + errMsg, content: t('common.errorInfo') + ': ' + errMsg,
showCancel: false showCancel: false
@@ -342,7 +343,7 @@
} catch (outerError) { } catch (outerError) {
// uni.hideLoading() // uni.hideLoading()
console.error('获取手机号外部错误:', outerError) console.error('获取手机号外部错误:', outerError)
uni.showModal({ showModalI18n({
title: t('common.unexpectedError'), title: t('common.unexpectedError'),
content: t('common.processException') + ': ' + (outerError.message || outerError), content: t('common.processException') + ': ' + (outerError.message || outerError),
showCancel: false showCancel: false
@@ -413,7 +414,7 @@
// 显示登录提示 // 显示登录提示
const showLoginTip = () => { const showLoginTip = () => {
uni.showModal({ showModalI18n({
title: t('common.tips'), title: t('common.tips'),
content: t('common.loginRequired'), content: t('common.loginRequired'),
confirmText: t('auth.goToLogin'), confirmText: t('auth.goToLogin'),
@@ -567,19 +568,19 @@
// 生成详细说明文本 // 生成详细说明文本
const getDetailInfoText = () => { const getDetailInfoText = () => {
if (isIdrCurrency.value) { if (isIdrCurrency.value) {
return `不足1${t('time.hour')}按1${t('time.hour')}计费,封顶${displayCurrencySymbol.value}${displayDepositCap.value},持续计费至${displayCurrencySymbol.value}${displayDepositCap.value}视为买断` const cap = `${displayCurrencySymbol.value}${displayDepositCap.value}`
return t('device.detailBillingIdr', {
hour: t('time.hour'),
cap
})
} }
const freeMinutes = getFreeMinutes()
const unitMinutes = getBillingUnitMinutes() const unitMinutes = getBillingUnitMinutes()
const depositAmount = deviceInfo.value.depositAmount || '99' const depositAmount = deviceInfo.value.depositAmount || '99'
return t('device.detailBillingByUnit', {
// 按分钟计费 unit: unitMinutes,
if (deviceInfo.value && deviceInfo.value.feeType === 'minute') { minute: t('time.minute'),
return `不足${unitMinutes}分钟按${unitMinutes}分钟计费,封顶${depositAmount}元,持续计费至${depositAmount}元视为买断` cap: depositAmount
} })
// 按小时计费
return `不足${unitMinutes}分钟按${unitMinutes}分钟计费,封顶${depositAmount}元,持续计费至${depositAmount}元视为买断`
} }
// 获取租借按钮文本 // 获取租借按钮文本
+3 -2
View File
@@ -205,7 +205,8 @@
import HomeMainH5 from '../../components/home/HomeMainH5.vue' import HomeMainH5 from '../../components/home/HomeMainH5.vue'
import LocationListSheet from '../../components/LocationListSheet.vue' import LocationListSheet from '../../components/LocationListSheet.vue'
import { import {
useI18n useI18n,
showModalI18n
} from '../../utils/i18n.js' } from '../../utils/i18n.js'
// 开启右上角分享菜单(仅 mp-weixin 有效) // 开启右上角分享菜单(仅 mp-weixin 有效)
@@ -1417,7 +1418,7 @@
const expected = expectedUserPhone.value const expected = expectedUserPhone.value
if (expected && normalizePhone(aliPhone) !== normalizePhone(expected)) { if (expected && normalizePhone(aliPhone) !== normalizePhone(expected)) {
uni.showModal({ showModalI18n({
title: t('common.tips'), title: t('common.tips'),
content: '当前支付宝授权手机号与账号绑定手机号不一致,无法扫码租借,请更换账号或联系管理员。', content: '当前支付宝授权手机号与账号绑定手机号不一致,无法扫码租借,请更换账号或联系管理员。',
showCancel: false showCancel: false
+3 -2
View File
@@ -262,7 +262,8 @@
URL URL
} from "@/config/url.js" } from "@/config/url.js"
import { import {
useI18n useI18n,
showModalI18n
} from '@/utils/i18n.js' } from '@/utils/i18n.js'
const { const {
@@ -1194,7 +1195,7 @@
// 取消订单 // 取消订单
const handleCancelOrder = () => { const handleCancelOrder = () => {
uni.showModal({ showModalI18n({
title: t('order.confirmCancel'), title: t('order.confirmCancel'),
content: t('order.confirmCancelContent'), content: t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
+45 -37
View File
@@ -24,36 +24,36 @@
<view class="action-item" @click.stop="chooseImage"> <view class="action-item" @click.stop="chooseImage">
<!-- <view class="action-icon">📷</view> --> <!-- <view class="action-icon">📷</view> -->
<uv-icon name="photo" size="24" color="#fff"></uv-icon> <uv-icon name="photo" size="24" color="#fff"></uv-icon>
<text>相册</text> <text>{{ $t('scan.album') }}</text>
</view> </view>
<view class="action-item" @click.stop="toggleInput"> <view class="action-item" @click.stop="toggleInput">
<!-- <view class="action-icon"></view> --> <!-- <view class="action-icon"></view> -->
<uv-icon name="edit-pen" size="24" color="#fff"></uv-icon> <uv-icon name="edit-pen" size="24" color="#fff"></uv-icon>
<text>手动输入</text> <text>{{ $t('scan.manualInput') }}</text>
</view> </view>
<view class="action-item" @click.stop="goBack"> <view class="action-item" @click.stop="goBack">
<!-- <view class="action-icon"></view> --> <!-- <view class="action-icon"></view> -->
<uv-icon name="arrow-left" size="24" color="#fff"></uv-icon> <uv-icon name="arrow-left" size="24" color="#fff"></uv-icon>
<text>返回</text> <text>{{ $t('common.back') }}</text>
</view> </view>
</view> </view>
<!-- 手动输入弹窗 --> <!-- 手动输入弹窗 -->
<uv-popup ref="inputPopup" mode="center" round="16" :closeOnClickOverlay="true"> <uv-popup ref="inputPopup" mode="center" round="16" :closeOnClickOverlay="true">
<view class="input-dialog"> <view class="input-dialog">
<view class="dialog-title">手动输入设备号</view> <view class="dialog-title">{{ $t('scan.manualInputTitle') }}</view>
<input <input
v-model="manualDeviceNo" v-model="manualDeviceNo"
placeholder="请输入设备上的编号" :placeholder="$t('scan.deviceNoPlaceholder')"
class="device-input" class="device-input"
type="text" type="text"
/> />
<view class="dialog-btns"> <view class="dialog-btns">
<button class="cancel-btn" @click="closeInput">取消</button> <button class="cancel-btn" @click="closeInput">{{ $t('common.cancel') }}</button>
<button class="confirm-btn" @click="confirmManualInput">确定</button> <button class="confirm-btn" @click="confirmManualInput">{{ $t('common.confirm') }}</button>
</view> </view>
</view> </view>
</uv-popup> </uv-popup>
@@ -64,10 +64,13 @@
import { ref, onMounted, onUnmounted } from 'vue'; import { ref, onMounted, onUnmounted } from 'vue';
import { getQueryString } from '../../util/index.js'; import { getQueryString } from '../../util/index.js';
import { Html5Qrcode, Html5QrcodeSupportedFormats } from 'html5-qrcode'; import { Html5Qrcode, Html5QrcodeSupportedFormats } from 'html5-qrcode';
import { useI18n, showModalI18n } from '@/utils/i18n.js';
const { t } = useI18n();
const inputPopup = ref(null); const inputPopup = ref(null);
const manualDeviceNo = ref(''); const manualDeviceNo = ref('');
const tipText = ref('正在初始化...'); const tipText = ref(t('scan.initializing'));
const scanning = ref(false); const scanning = ref(false);
const hasFlash = ref(false); const hasFlash = ref(false);
const flashOn = ref(false); const flashOn = ref(false);
@@ -93,12 +96,12 @@ const getScanConfig = () => ({
// 初始化扫码 // 初始化扫码
const initScan = async () => { const initScan = async () => {
try { try {
tipText.value = '正在初始化...'; tipText.value = t('scan.initializing');
console.log('=== 开始初始化扫码 ==='); console.log('=== 开始初始化扫码 ===');
// 检查浏览器支持 // 检查浏览器支持
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
throw new Error('您的浏览器不支持摄像头访问'); throw new Error(t('scan.browserNotSupportCamera'));
} }
// 等待 DOM 渲染 // 等待 DOM 渲染
@@ -107,7 +110,7 @@ const initScan = async () => {
// 检查容器元素 // 检查容器元素
const readerElement = document.getElementById('qr-reader'); const readerElement = document.getElementById('qr-reader');
if (!readerElement) { if (!readerElement) {
throw new Error('扫码容器元素未找到'); throw new Error(t('scan.containerNotFound'));
} }
console.log('✓ 扫码容器元素已找到'); console.log('✓ 扫码容器元素已找到');
@@ -130,10 +133,10 @@ const initScan = async () => {
const startScanning = async () => { const startScanning = async () => {
try { try {
if (!html5QrCode) { if (!html5QrCode) {
throw new Error('Html5Qrcode 实例不存在'); throw new Error(t('scan.initFailed'));
} }
tipText.value = '正在启动摄像头...'; tipText.value = t('scan.startingCamera');
console.log('=== 开始启动扫描 ==='); console.log('=== 开始启动扫描 ===');
console.log('html5QrCode 实例:', html5QrCode); console.log('html5QrCode 实例:', html5QrCode);
console.log('html5QrCode.start 方法:', typeof html5QrCode.start); console.log('html5QrCode.start 方法:', typeof html5QrCode.start);
@@ -155,7 +158,7 @@ const startScanning = async () => {
console.log('start() 调用结果:', startResult); console.log('start() 调用结果:', startResult);
scanning.value = true; scanning.value = true;
tipText.value = '将二维码放入框内扫描'; tipText.value = t('scan.alignQRCode');
console.log('✅ 扫描已成功启动'); console.log('✅ 扫描已成功启动');
// 延迟隐藏默认UI // 延迟隐藏默认UI
@@ -184,7 +187,7 @@ const startScanning = async () => {
); );
scanning.value = true; scanning.value = true;
tipText.value = '将二维码放入框内扫描'; tipText.value = t('scan.alignQRCode');
console.log('✅ 使用前置摄像头启动成功'); console.log('✅ 使用前置摄像头启动成功');
setTimeout(() => { setTimeout(() => {
@@ -215,14 +218,14 @@ const startScanning = async () => {
); );
scanning.value = true; scanning.value = true;
tipText.value = '将二维码放入框内扫描'; tipText.value = t('scan.alignQRCode');
console.log('✅ 使用默认摄像头启动成功'); console.log('✅ 使用默认摄像头启动成功');
setTimeout(() => { setTimeout(() => {
hideDefaultUI(); hideDefaultUI();
}, 200); }, 200);
} else { } else {
throw new Error('未找到可用的摄像头'); throw new Error(t('scan.noCameraFound'));
} }
} catch (err3) { } catch (err3) {
console.error('❌ 所有方式都失败:', err3); console.error('❌ 所有方式都失败:', err3);
@@ -324,43 +327,45 @@ const stopScan = async () => {
const handleInitError = (err) => { const handleInitError = (err) => {
console.error('处理初始化错误:', err); console.error('处理初始化错误:', err);
let errMsg = '初始化失败'; let errMsg = t('scan.initFailed');
let errDetail = ''; let errDetail = '';
if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') { if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') {
errMsg = '摄像头权限被拒绝'; errMsg = t('scan.cameraPermissionDenied');
errDetail = '请在浏览器设置中允许访问摄像头'; errDetail = t('scan.cameraPermissionHint');
} }
else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') { else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') {
errMsg = '未找到可用的摄像头'; errMsg = t('scan.noCameraFound');
errDetail = '请确保设备有摄像头'; errDetail = t('scan.ensureCameraExists');
} }
else if (err.name === 'NotReadableError' || err.name === 'TrackStartError') { else if (err.name === 'NotReadableError' || err.name === 'TrackStartError') {
errMsg = '摄像头被占用'; errMsg = t('scan.cameraInUse');
errDetail = '请关闭其他使用摄像头的应用'; errDetail = t('scan.closeOtherCameraApps');
} }
else if (err.name === 'NotSupportedError') { else if (err.name === 'NotSupportedError') {
errMsg = '浏览器不支持'; errMsg = t('scan.browserNotSupported');
errDetail = '请使用现代浏览器访问'; errDetail = t('scan.useModernBrowser');
} }
// else if (location.protocol !== 'https:' && location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') { // else if (location.protocol !== 'https:' && location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') {
// errMsg = '需要 HTTPS 环境'; // errMsg = '需要 HTTPS 环境';
// errDetail = '摄像头功能需要在安全环境下使用'; // errDetail = '摄像头功能需要在安全环境下使用';
// } // }
else { else {
errMsg = err.message || '摄像头启动失败'; errMsg = err.message || t('scan.cameraStartFailed');
errDetail = '请尝试刷新页面或使用其他方式'; errDetail = t('scan.tryRefreshOrAlternative');
} }
tipText.value = errMsg; tipText.value = errMsg;
const fallbackContent = `${errDetail}\n\n${t('scan.errorFallbackHint')}\n1. ${t('scan.errorFallbackAlbum')}\n2. ${t('scan.errorFallbackManual')}`;
// 显示错误提示,提供备选方案 // 显示错误提示,提供备选方案
uni.showModal({ showModalI18n({
title: errMsg, title: errMsg,
content: errDetail + '\n\n您可以:\n1. 从相册选择二维码图片\n2. 手动输入设备号', content: fallbackContent,
showCancel: true, showCancel: true,
cancelText: '返回', cancelText: t('common.back'),
confirmText: '手动输入', confirmText: t('scan.manualInput'),
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
toggleInput(); toggleInput();
@@ -383,7 +388,7 @@ const chooseImage = async () => {
return; return;
} }
uni.showLoading({ title: '正在识别...' }); uni.showLoading({ title: t('scan.recognizing') });
try { try {
// 先停止摄像头扫描 // 先停止摄像头扫描
@@ -422,7 +427,7 @@ const chooseImage = async () => {
// 不要立即返回,等待首页处理完成 // 不要立即返回,等待首页处理完成
console.log('图片识别结果已发送,等待首页处理...'); console.log('图片识别结果已发送,等待首页处理...');
} else { } else {
uni.showToast({ title: '未识别到二维码', icon: 'none' }); uni.showToast({ title: t('scan.qrNotFound'), icon: 'none' });
// 识别失败,重新启动摄像头扫描 // 识别失败,重新启动摄像头扫描
if (wasScanning) { if (wasScanning) {
setTimeout(async () => { setTimeout(async () => {
@@ -433,7 +438,7 @@ const chooseImage = async () => {
} catch (err) { } catch (err) {
console.error('图片识别失败:', err); console.error('图片识别失败:', err);
uni.hideLoading(); uni.hideLoading();
uni.showToast({ title: '识别失败', icon: 'none' }); uni.showToast({ title: t('scan.recognizeFailed'), icon: 'none' });
// 识别失败,重新启动摄像头扫描 // 识别失败,重新启动摄像头扫描
setTimeout(async () => { setTimeout(async () => {
try { try {
@@ -452,7 +457,7 @@ const chooseImage = async () => {
count: 1, count: 1,
sourceType: ['album'], sourceType: ['album'],
success: (res) => { success: (res) => {
uni.showToast({ title: '该功能仅在H5环境可用', icon: 'none' }); uni.showToast({ title: t('scan.h5Only'), icon: 'none' });
} }
}); });
// #endif // #endif
@@ -477,7 +482,7 @@ const confirmManualInput = () => {
const deviceNo = manualDeviceNo.value.trim(); const deviceNo = manualDeviceNo.value.trim();
if (!deviceNo) { if (!deviceNo) {
uni.showToast({ title: '请输入设备号', icon: 'none' }); uni.showToast({ title: t('scan.deviceNoRequired'), icon: 'none' });
return; return;
} }
@@ -508,6 +513,9 @@ const goBack = () => {
onMounted(() => { onMounted(() => {
console.log('扫码页面已挂载'); console.log('扫码页面已挂载');
uni.setNavigationBarTitle({
title: t('scan.title')
});
// 延迟初始化,确保 DOM 已渲染 // 延迟初始化,确保 DOM 已渲染
setTimeout(() => { setTimeout(() => {
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 91 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+2 -2
View File
@@ -143,7 +143,7 @@
<view class="popup-footer"> <view class="popup-footer">
<view class="confirm-btn" @click="confirmSku"> <view class="confirm-btn" @click="confirmSku">
<text>确定</text> <text>{{ $t('common.confirm') }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -304,7 +304,7 @@
<view class="popup-footer"> <view class="popup-footer">
<view class="confirm-btn" @click="confirmAliRegion"> <view class="confirm-btn" @click="confirmAliRegion">
<text>确定</text> <text>{{ $t('common.confirm') }}</text>
</view> </view>
</view> </view>
</view> </view>
+8 -8
View File
@@ -16,7 +16,7 @@
class="product-image" class="product-image"
></image> ></image>
<view class="product-info"> <view class="product-info">
<view class="product-name">{{ orderDetail.productName || orderDetail.deviceName || '风电者2026新款风扇、充电宝、暖手宝三合一' }}</view> <view class="product-name">{{ orderDetail.productName || orderDetail.deviceName || $t('goods.defaultProductNameFull') }}</view>
<view class="product-style">款式{{ orderDetail.optionName || orderDetail.style || '标准' }}</view> <view class="product-style">款式{{ orderDetail.optionName || orderDetail.style || '标准' }}</view>
<view class="product-price">¥{{ orderDetail.price || orderDetail.totalAmount }}</view> <view class="product-price">¥{{ orderDetail.price || orderDetail.totalAmount }}</view>
</view> </view>
@@ -143,7 +143,7 @@
createWxPayment createWxPayment
} from '../../config/api/order.js'; } from '../../config/api/order.js';
// import { getSystemParamByKey } from '../../config/api/system.js'; // import { getSystemParamByKey } from '../../config/api/system.js';
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -409,9 +409,9 @@
// 取消订单 // 取消订单
const onCancelOrder = () => { const onCancelOrder = () => {
uni.showModal({ showModalI18n({
title: '提示', title: t('common.tips'),
content: '确定要取消这个订单吗?', content: t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
if (res.confirm) { if (res.confirm) {
try { try {
@@ -450,9 +450,9 @@
// 删除订单 // 删除订单
const onDeleteOrder = () => { const onDeleteOrder = () => {
uni.showModal({ showModalI18n({
title: '提示', title: t('common.tips'),
content: '确定要删除这个订单吗?', content: t('order.confirmDeleteContent'),
success: async (res) => { success: async (res) => {
if (res.confirm) { if (res.confirm) {
try { try {
+5 -5
View File
@@ -60,7 +60,7 @@
import { import {
URL URL
} from '../../config/url.js'; } from '../../config/url.js';
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -494,7 +494,7 @@
// 取消订单 // 取消订单
const handleCancelOrder = async (order) => { const handleCancelOrder = async (order) => {
try { try {
uni.showModal({ showModalI18n({
title: t('order.confirmCancel'), title: t('order.confirmCancel'),
content: t('order.confirmCancelContent'), content: t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
@@ -540,9 +540,9 @@
// 处理删除订单 // 处理删除订单
const handleDeleteOrder = (order) => { const handleDeleteOrder = (order) => {
uni.showModal({ showModalI18n({
title: '提示', title: t('common.tips'),
content: '确定要删除这个订单吗?', content: t('order.confirmDeleteContent'),
success: async (res) => { success: async (res) => {
if (res.confirm) { if (res.confirm) {
try { try {
+2 -2
View File
@@ -52,7 +52,7 @@
import { import {
getDeviceInfo getDeviceInfo
} from '../../config/api/device.js'; } from '../../config/api/device.js';
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -359,7 +359,7 @@
// 取消订单 // 取消订单
const handleCancelOrder = async (order) => { const handleCancelOrder = async (order) => {
try { try {
uni.showModal({ showModalI18n({
title: t('order.confirmCancel'), title: t('order.confirmCancel'),
content: t('order.confirmCancelContent'), content: t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
+3 -2
View File
@@ -115,7 +115,8 @@
updateUserBalance updateUserBalance
} from '@/config/api/user.js' } from '@/config/api/user.js'
import { import {
useI18n useI18n,
showModalI18n
} from '@/utils/i18n.js' } from '@/utils/i18n.js'
const { const {
@@ -523,7 +524,7 @@
return; return;
} }
uni.showModal({ showModalI18n({
title: t('order.confirmCancel'), title: t('order.confirmCancel'),
content: t('order.confirmCancelContent'), content: t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
+3 -3
View File
@@ -44,7 +44,7 @@ import { onShow } from '@dcloudio/uni-app'
import { getUserInfo } from '@/util/index.js' import { getUserInfo } from '@/util/index.js'
import { withdrawDeposit } from '@/config/api/user.js' import { withdrawDeposit } from '@/config/api/user.js'
import { queryById } from '@/config/api/order.js' import { queryById } from '@/config/api/order.js'
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -102,7 +102,7 @@ const handleWithdraw = async () => {
return return
} }
uni.showModal({ showModalI18n({
title: t('deposit.confirmWithdraw'), title: t('deposit.confirmWithdraw'),
content: t('deposit.withdrawDesc'), content: t('deposit.withdrawDesc'),
success: async (res) => { success: async (res) => {
@@ -158,7 +158,7 @@ const handleWithdraw = async () => {
} }
} }
uni.showModal({ showModalI18n({
title: t('deposit.withdrawFailed'), title: t('deposit.withdrawFailed'),
content: errorMessage, content: errorMessage,
showCancel: false showCancel: false
+1 -1
View File
@@ -84,7 +84,7 @@
}) })
}) })
const brandName = 'WindPower' const brandName = 'Isidaya'
const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.' const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.'
const effectiveDate = '2025-10-13' const effectiveDate = '2025-10-13'
const disputeVenue = 'the location of the platform' const disputeVenue = 'the location of the platform'
+1 -1
View File
@@ -84,7 +84,7 @@
}) })
}) })
const brandName = '风电者' const brandName = 'Isidaya'
const companyName = '深圳乐慕智云科技有限公司' const companyName = '深圳乐慕智云科技有限公司'
const effectiveDate = '2025-10-13' const effectiveDate = '2025-10-13'
const disputeVenue = '平台所在地' const disputeVenue = '平台所在地'
+1 -1
View File
@@ -69,7 +69,7 @@
}) })
}) })
const brandName = 'WindPower' const brandName = 'Isidaya'
const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.' const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.'
const effectiveDate = '2025-10-13' const effectiveDate = '2025-10-13'
</script> </script>
+1 -1
View File
@@ -69,7 +69,7 @@
}) })
}) })
const brandName = '风电者' const brandName = 'Isidaya'
const companyName = '深圳乐慕智云科技有限公司' const companyName = '深圳乐慕智云科技有限公司'
const effectiveDate = '2025-10-13' const effectiveDate = '2025-10-13'
</script> </script>
+43
View File
@@ -0,0 +1,43 @@
# Terms & Conditions
**Last Update**: 2025-02-05
---
## Applicable Law
These Terms of Service are governed by the laws of the People's Republic of China. By using this service, you agree to be bound by Chinese law. Any disputes arising from this service shall first be resolved through friendly negotiation; if negotiation fails, either party may file a lawsuit with the People's Court having jurisdiction over the location of the service provider.
## Payment Methods
We support multiple payment methods, including but not limited to: WeChat Pay, Alipay, WeChat Pay Score deposit-free, etc. Users need to complete the payment process before using the service. After successful payment, the system will automatically unlock the device for user access. All payment transactions are conducted through secure encrypted channels to ensure user fund security.
## Refund Policy
1. **Deposit Refund**: After returning the device, the deposit will be automatically refunded to the original payment account after deducting the corresponding rental fee, expected to arrive within 0-7 business days.
2. **Order Cancellation**: Unused orders can be cancelled before use begins, and the deposit will be fully refunded.
3. **Exception Refund**: In case of special circumstances such as device failure, users can apply for a refund, which we will process within 3-5 business days after verification.
4. **Membership Cards/Coupons**: Purchased membership cards and coupons generally do not support refunds. Please contact customer service for special cases.
## Service Terms
When using this service, users should comply with the following regulations:
1. Take good care of the rented equipment and do not intentionally damage or privately occupy it;
2. Return the equipment on time to avoid additional charges;
3. Do not use the equipment for illegal purposes;
4. If equipment failure is found, contact customer service promptly.
Violation of the above regulations may result in service termination and liability.
## Liability Limitation
To the maximum extent permitted by law, we are not liable for any indirect, incidental, special, or consequential damages arising from the use or inability to use this service. Our total liability shall not exceed the fees paid by users for using this service. We are not responsible for service interruptions or delays caused by force majeure, network failures, third-party reasons, etc.
## Dispute Resolution
If users have any questions or disputes about the service, please first contact us through customer service channels. We will respond within 24 hours of receiving feedback and negotiate a resolution as soon as possible. If negotiation fails, both parties agree to submit the dispute to the People's Court with jurisdiction over the location of the service provider for resolution through litigation. During the dispute resolution period, both parties should continue to perform the undisputed terms of this agreement.
---
If you have questions about this agreement, please go to **My → Customer Service**.
+43
View File
@@ -0,0 +1,43 @@
# Syarat & Ketentuan
**Pembaruan Terakhir**: 2025-02-05
---
## Hukum yang Berlaku
Ketentuan Layanan ini diatur oleh hukum Republik Rakyat Tiongkok. Dengan menggunakan layanan ini, Anda setuju untuk terikat oleh hukum Tiongkok. Setiap perselisihan yang timbul dari layanan ini harus diselesaikan terlebih dahulu melalui negosiasi bersahabat; jika negosiasi gagal, salah satu pihak dapat mengajukan gugatan ke Pengadilan Rakyat yang memiliki yurisdiksi atas lokasi penyedia layanan.
## Metode Pembayaran
Kami mendukung berbagai metode pembayaran, termasuk namun tidak terbatas pada: WeChat Pay, Alipay, WeChat Pay Score tanpa deposit, dll. Pengguna perlu menyelesaikan proses pembayaran sebelum menggunakan layanan. Setelah pembayaran berhasil, sistem akan secara otomatis membuka kunci perangkat untuk akses pengguna. Semua transaksi pembayaran dilakukan melalui saluran terenkripsi yang aman untuk memastikan keamanan dana pengguna.
## Kebijakan Pengembalian Dana
1. **Pengembalian Deposit**: Setelah mengembalikan perangkat, deposit akan secara otomatis dikembalikan ke akun pembayaran asli setelah dikurangi biaya sewa yang sesuai, diperkirakan tiba dalam 0-7 hari kerja.
2. **Pembatalan Pesanan**: Pesanan yang tidak digunakan dapat dibatalkan sebelum penggunaan dimulai, dan deposit akan dikembalikan sepenuhnya.
3. **Pengembalian Dana Pengecualian**: Dalam kasus keadaan khusus seperti kegagalan perangkat, pengguna dapat mengajukan pengembalian dana, yang akan kami proses dalam 3-5 hari kerja setelah verifikasi.
4. **Kartu Keanggotaan/Kupon**: Kartu keanggotaan dan kupon yang dibeli umumnya tidak mendukung pengembalian dana. Silakan hubungi layanan pelanggan untuk kasus khusus.
## Ketentuan Layanan
Saat menggunakan layanan ini, pengguna harus mematuhi peraturan berikut:
1. Jaga peralatan yang disewa dengan baik dan jangan sengaja merusak atau memilikinya secara pribadi;
2. Kembalikan peralatan tepat waktu untuk menghindari biaya tambahan;
3. Jangan gunakan peralatan untuk tujuan ilegal;
4. Jika ditemukan kegagalan peralatan, hubungi layanan pelanggan segera.
Pelanggaran terhadap peraturan di atas dapat mengakibatkan penghentian layanan dan tanggung jawab.
## Batasan Tanggung Jawab
Sejauh diizinkan oleh hukum, kami tidak bertanggung jawab atas kerusakan tidak langsung, insidental, khusus, atau konsekuensial yang timbul dari penggunaan atau ketidakmampuan menggunakan layanan ini. Total tanggung jawab kami tidak akan melebihi biaya yang dibayarkan oleh pengguna untuk menggunakan layanan ini. Kami tidak bertanggung jawab atas gangguan atau penundaan layanan yang disebabkan oleh force majeure, kegagalan jaringan, alasan pihak ketiga, dll.
## Penyelesaian Sengketa
Jika pengguna memiliki pertanyaan atau perselisihan tentang layanan, silakan hubungi kami terlebih dahulu melalui saluran layanan pelanggan. Kami akan merespons dalam 24 jam setelah menerima umpan balik dan bernegosiasi untuk penyelesaian sesegera mungkin. Jika negosiasi gagal, kedua belah pihak setuju untuk menyerahkan perselisihan ke Pengadilan Rakyat dengan yurisdiksi atas lokasi penyedia layanan untuk penyelesaian melalui litigasi. Selama periode penyelesaian sengketa, kedua belah pihak harus terus melaksanakan ketentuan yang tidak dipersengketakan dari perjanjian ini.
---
Jika ada pertanyaan tentang perjanjian ini, harap pergi ke **Saya → Layanan Pelanggan** untuk konsultasi.
+43
View File
@@ -0,0 +1,43 @@
# 条款与细则
**最后更新**: 2025-02-05
---
## 适用法律
本服务条款受中华人民共和国法律管辖。用户使用本服务即表示同意接受中国法律的约束。任何因本服务引起的争议,应首先通过友好协商解决;协商不成的,任何一方均可向服务提供方所在地有管辖权的人民法院提起诉讼。
## 支付方式
我们支持多种支付方式,包括但不限于:微信支付、支付宝、微信支付分免押金等。用户在使用服务前需完成支付流程。支付成功后,系统将自动开启设备供用户使用。所有支付交易均通过安全加密通道进行,确保用户资金安全。
## 退款介绍
1. 押金退款:归还设备后,押金将在扣除相应租金后自动退还至原支付账户,预计0-7个工作日到账。
2. 订单取消:未使用的订单可在开始使用前取消,押金将全额退还。
3. 异常退款:如遇设备故障等特殊情况,用户可申请退款,我们将在核实后3-5个工作日内处理。
4. 会员卡/优惠券:已购买的会员卡和优惠券一般不支持退款,特殊情况请联系客服处理。
## 服务条款
用户在使用本服务时,应遵守以下规定:
1. 妥善保管租借的设备,不得故意损坏或私自占有;
2. 按时归还设备,避免产生额外费用;
3. 不得将设备用于非法用途;
4. 如发现设备故障,应及时联系客服处理。
违反上述规定的,我们有权终止服务并追究相应责任。
## 责任限制
在法律允许的最大范围内,我们对因使用或无法使用本服务而导致的任何间接、偶然、特殊或后果性损害不承担责任。我们的总责任不超过用户为使用本服务所支付的费用。对于因不可抗力、网络故障、第三方原因等导致的服务中断或延迟,我们不承担责任。
## 争议解决
如用户对服务有任何疑问或争议,请首先通过客服渠道联系我们,我们将在收到反馈后24小时内响应,并尽快协商解决。如协商不成,双方同意将争议提交至服务提供方所在地有管辖权的人民法院通过诉讼方式解决。在争议解决期间,双方应继续履行本协议中无争议的条款。
---
如对本协议有疑问,请前往「我的 - 客服」咨询。
@@ -60,7 +60,7 @@
getExpressReturnDetail, getExpressReturnDetail,
fillExpressTrackingNumber fillExpressTrackingNumber
} from '@/config/api/expressReturn.js' } from '@/config/api/expressReturn.js'
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -165,7 +165,7 @@
const rec = res.data const rec = res.data
if (rec.status === 0) { if (rec.status === 0) {
recordId.value = rec.id recordId.value = rec.id
uni.showModal({ showModalI18n({
title: t('common.tips'), title: t('common.tips'),
content: t('express.existingReturnNotice'), content: t('express.existingReturnNotice'),
confirmText: t('express.goToFill'), confirmText: t('express.goToFill'),
+2 -2
View File
@@ -89,7 +89,7 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { getExpressReturnDetail } from '@/config/api/expressReturn.js' import { getExpressReturnDetail } from '@/config/api/expressReturn.js'
import { getCustomerPhone } from '@/util/index.js' import { getCustomerPhone } from '@/util/index.js'
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -164,7 +164,7 @@ const handleCopyTracking = () => {
// 联系客服 // 联系客服
const handleContactService = () => { const handleContactService = () => {
const customerPhone = getCustomerPhone() const customerPhone = getCustomerPhone()
uni.showModal({ showModalI18n({
title: t('user.customerService'), title: t('user.customerService'),
content: `${t('help.phone')}${customerPhone}\n${t('help.workingHours')}${t('express.workingHours')}`, content: `${t('help.phone')}${customerPhone}\n${t('help.workingHours')}${t('express.workingHours')}`,
confirmText: t('express.call'), confirmText: t('express.call'),
+2 -3
View File
@@ -67,8 +67,7 @@ onMounted(() => {
loadList() loadList()
}) })
// 收件信息 // 收件信息(名称走多语言,地址暂为固定配置)
const recipientName = '风电者 18163601305'
const recipientAddress = '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623' const recipientAddress = '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623'
const loadList = async () => { const loadList = async () => {
@@ -131,7 +130,7 @@ const getStatusBadge = (status) => ({
// 一键复制全部信息 // 一键复制全部信息
const copyAllInfo = () => { const copyAllInfo = () => {
const allInfo = `${t('express.recipient')}${recipientName}\n${t('express.recipientAddressLabel')}${recipientAddress}` const allInfo = `${t('express.recipient')}${t('express.recipientName')}\n${t('express.recipientAddressLabel')}${recipientAddress}`
uni.setClipboardData({ uni.setClipboardData({
data: allInfo, data: allInfo,
success: () => { success: () => {
+3 -2
View File
@@ -152,6 +152,7 @@
import { import {
URL URL
} from "@/config/url.js" } from "@/config/url.js"
import { showModalI18n } from '@/utils/i18n.js'
export default { export default {
data() { data() {
@@ -411,7 +412,7 @@
this.clearExpressCountdown() this.clearExpressCountdown()
// 显示归还成功弹窗 // 显示归还成功弹窗
uni.showModal({ showModalI18n({
title: this.$t('order.returnSuccess'), title: this.$t('order.returnSuccess'),
content: this.$t('order.returnSuccessMessage'), content: this.$t('order.returnSuccessMessage'),
confirmText: this.$t('order.viewDetails'), confirmText: this.$t('order.viewDetails'),
@@ -793,7 +794,7 @@
// 取消订单 // 取消订单
handleCancelOrder() { handleCancelOrder() {
uni.showModal({ showModalI18n({
title: this.$t('order.confirmCancel'), title: this.$t('order.confirmCancel'),
content: this.$t('order.confirmCancelContent'), content: this.$t('order.confirmCancelContent'),
success: async (res) => { success: async (res) => {
+2 -4
View File
@@ -55,7 +55,7 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { onLoad } from '@dcloudio/uni-app' import { onLoad } from '@dcloudio/uni-app'
import { wxLogin, alipayLogin, getUserPhoneNumber, getUserInfo } from '@/util/index.js' import { wxLogin, alipayLogin, getUserPhoneNumber, getUserInfo } from '@/util/index.js'
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -95,11 +95,9 @@
} }
// 未勾选,弹窗提示 // 未勾选,弹窗提示
uni.showModal({ showModalI18n({
title: t('common.tips'), title: t('common.tips'),
content: t('auth.pleaseAgreeToTerms'), content: t('auth.pleaseAgreeToTerms'),
confirmText: t('common.confirm'),
cancelText: t('common.cancel'),
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
// 用户点击同意,自动勾选 // 用户点击同意,自动勾选
+2 -2
View File
@@ -137,8 +137,8 @@
<view class="auth-title">授权登录</view> <view class="auth-title">授权登录</view>
<view class="auth-desc">获取您的微信头像、昵称等公开信息</view> <view class="auth-desc">获取您的微信头像、昵称等公开信息</view>
<view class="auth-buttons"> <view class="auth-buttons">
<button class="cancel-btn" @click="closeAuthPopup">取消</button> <button class="cancel-btn" @click="closeAuthPopup">{{ $t('common.cancel') }}</button>
<button class="confirm-btn" @click="getUserProfile">确定</button> <button class="confirm-btn" @click="getUserProfile">{{ $t('common.confirm') }}</button>
</view> </view>
</view> </view>
</u-popup> </u-popup>
+2 -2
View File
@@ -35,7 +35,7 @@
<script setup> <script setup>
import { ref, computed, onMounted, getCurrentInstance } from 'vue' import { ref, computed, onMounted, getCurrentInstance } from 'vue'
import { userLogout } from '@/config/api/user.js' import { userLogout } from '@/config/api/user.js'
import { useI18n } from '@/utils/i18n.js' import { useI18n, showModalI18n } from '@/utils/i18n.js'
const { t } = useI18n() const { t } = useI18n()
@@ -112,7 +112,7 @@ const showLanguageSelector = () => {
} }
const handleLogout = async () => { const handleLogout = async () => {
uni.showModal({ showModalI18n({
title: t('common.tips'), title: t('common.tips'),
content: t('user.confirmLogout'), content: t('user.confirmLogout'),
success: async (res) => { success: async (res) => {
+2 -1
View File
@@ -51,6 +51,7 @@
import { import {
URL URL
} from '@/config/url' } from '@/config/url'
import { showModalI18n } from '@/utils/i18n.js'
export default { export default {
data() { data() {
@@ -107,7 +108,7 @@
}) })
}, },
handleLogout() { handleLogout() {
uni.showModal({ showModalI18n({
title: this.$t('common.tips'), title: this.$t('common.tips'),
content: this.$t('user.confirmLogout'), content: this.$t('user.confirmLogout'),
success: (res) => { success: (res) => {
+1 -4
View File
@@ -290,10 +290,7 @@ export const fetchAndCacheCustomerPhone = async () => {
try { try {
// 获取当前语言 // 获取当前语言
const locale = uni.getLocale ? uni.getLocale() : uni.getSystemInfoSync().language const locale = uni.getLocale ? uni.getLocale() : uni.getSystemInfoSync().language
const isEnglish = locale && (locale.toLowerCase().startsWith('en') || locale.toLowerCase().includes('en')) const brandName = 'Isidaya'
// 根据语言设置品牌名称
const brandName = isEnglish ? 'fdzpower' : '风电者'
console.log('获取客服电话,当前语言:', locale, '品牌名称:', brandName) console.log('获取客服电话,当前语言:', locale, '品牌名称:', brandName)
+54
View File
@@ -1,5 +1,59 @@
// i18n工具函数 - 用于在 Vue 3 setup 中安全获取 $t // i18n工具函数 - 用于在 Vue 3 setup 中安全获取 $t
import { getCurrentInstance } from 'vue' import { getCurrentInstance } from 'vue'
import zhCN from '../locale/zh-CN.js'
import enUS from '../locale/en-US.js'
import idID from '../locale/id-ID.js'
const MESSAGE_MAP = {
'zh-CN': zhCN,
'en-US': enUS,
'id-ID': idID
}
const LANGUAGE_STORAGE_KEY = 'language'
export function getAppLocale() {
try {
const lang = uni.getStorageSync(LANGUAGE_STORAGE_KEY)
if (lang && MESSAGE_MAP[lang]) return lang
} catch (_) {}
return 'zh-CN'
}
function lookupMessage(locale, key) {
const segments = String(key).split('.')
let node = MESSAGE_MAP[locale]
for (const seg of segments) {
if (node == null || typeof node !== 'object') return null
node = node[seg]
}
return typeof node === 'string' ? node : null
}
/** 非 Vue 组件场景下的文案翻译 */
export function translate(key, values) {
const locale = getAppLocale()
let text = lookupMessage(locale, key) ?? lookupMessage('zh-CN', key) ?? key
if (values && typeof values === 'object') {
Object.entries(values).forEach(([k, v]) => {
text = text.split(`{${k}}`).join(String(v))
})
}
return text
}
/** uni.showModal 封装:默认使用多语言取消/确认按钮 */
export function showModalI18n(options = {}) {
const { cancelText, confirmText, showCancel = true, ...rest } = options
const modalOptions = {
...rest,
showCancel,
confirmText: confirmText ?? translate('common.confirm')
}
if (showCancel !== false) {
modalOptions.cancelText = cancelText ?? translate('common.cancel')
}
return uni.showModal(modalOptions)
}
/** /**
* 在 setup 中使用 i18n * 在 setup 中使用 i18n
+1
View File
@@ -872,6 +872,7 @@ function getUserLocation() {
uni.showModal({ uni.showModal({
title: getPermissionText('locationTitle'), title: getPermissionText('locationTitle'),
content: getPermissionText('locationNeed'), content: getPermissionText('locationNeed'),
confirmText: getPermissionText('gotIt'),
showCancel: false showCancel: false
}); });
} }
+6 -5
View File
@@ -1,4 +1,5 @@
import { queryById } from '@/config/api/order.js' import { queryById } from '@/config/api/order.js'
import { showModalI18n, translate } from '@/utils/i18n.js'
/** /**
* 订单监控服务 * 订单监控服务
@@ -198,11 +199,11 @@ class OrderMonitor {
// 如果在订单详情页,页面自己会处理状态变化 // 如果在订单详情页,页面自己会处理状态变化
setTimeout(() => { setTimeout(() => {
if (this.currentPage !== 'detail') { if (this.currentPage !== 'detail') {
uni.showModal({ showModalI18n({
title: '归还成功', title: translate('order.returnSuccess'),
content: '风扇已归还成功,剩余押金将退还到您的账户', content: translate('order.returnSuccessMessage'),
confirmText: '查看详情', confirmText: translate('order.viewDetails'),
cancelText: '我知道了', cancelText: translate('permission.gotIt'),
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
// 跳转到订单详情页面查看详情 // 跳转到订单详情页面查看详情