diff --git a/components/DeviceOrderItemCard.vue b/components/DeviceOrderItemCard.vue index 5a37377..3ccd5b0 100644 --- a/components/DeviceOrderItemCard.vue +++ b/components/DeviceOrderItemCard.vue @@ -18,7 +18,7 @@ lazy-load="true" > - {{ order.productName || order.deviceName || '风电者2026新款' }} + {{ order.productName || order.deviceName || $t('goods.defaultProductNameShort') }} 款式:{{ order.optionName || order.style || order.deviceStyle || '标准' }} ¥ {{ totalAmount }} diff --git a/config/url.js b/config/url.js index ca0792e..cbd2bfe 100644 --- a/config/url.js +++ b/config/url.js @@ -1,7 +1,7 @@ // export const URL = "https://my.gxfs123.com/api" //正式服务器-弃用 // export const URL = "https://manager.fdzpower.com/api" //正式国内服务器 -// export const URL = "https://ina.fdzpower.com/api" //正式国外服务器 -export const URL = "https://fansdev.gxfs123.com/api" //测试服务器 +export const URL = "https://ina.fdzpower.com/api" //正式国外服务器 +// export const URL = "https://fansdev.gxfs123.com/api" //测试服务器 // export const URL = "http://192.168.0.58:8080" //本地调试 // export const URL = "http://127.0.0.1:8080" //本地调试 diff --git a/locale/en-US.js b/locale/en-US.js index 5b76ed0..4c09a17 100644 --- a/locale/en-US.js +++ b/locale/en-US.js @@ -71,18 +71,18 @@ export default { orders: 'Orders', settings: 'Settings', back: 'Back', - title: 'FengDianZhe' + title: 'Isidaya' }, app: { - name: 'FengDianZhe', + name: 'Isidaya', slogan: 'Fan & Power Bank Rental', - fullName: 'FengDianZhe', - welcome: 'Welcome' + fullName: 'Isidaya', + welcome: 'Welcome to Isidaya' }, home: { - title: 'FengDianZhe', + title: 'Isidaya', nearbyDevices: 'Nearby', scanToUse: 'Scan', personalCenter: 'Profile', @@ -115,6 +115,38 @@ export default { 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: { title: 'How to Use', step1Title: 'Scan QR Code', @@ -153,6 +185,8 @@ export default { offline: 'Offline', pricingRules: 'Pricing Rules', 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', checkBeforeUse: 'Please check if the device is in good condition before use', autoChargeOvertime: 'Overtime will be charged automatically by hour', @@ -180,6 +214,7 @@ export default { noOrderRecord: 'No order records', getOrderListFailed: 'Failed to get order list', confirmCancelContent: 'Are you sure to cancel this order?', + confirmDeleteContent: 'Are you sure you want to delete this order?', orderDetail: 'Order Detail', orderNo: 'Order No.', orderStatus: 'Order Status', @@ -541,7 +576,7 @@ export default { received: 'Received', detail: 'Detail', recipientInfo: 'Ship To', - recipientName: 'FengDianZhe 18163601305', + recipientName: 'Isidaya 18163601305', recipientAddress: 'Rm 623, Bldg A2, Xinchanghai Park, Luogu St, Yuelu, Changsha, Hunan', copyAllInfo: 'Copy All', recipient: 'To', @@ -621,7 +656,7 @@ export default { termsOfService: 'Terms of Service', termsAndConditions: 'Terms & Conditions', 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"', footerNoticePolicy: 'If you have questions about this policy, please go to "My-Customer Service"', @@ -657,7 +692,7 @@ export default { }, share: { - title: 'FengDianZhe - Shared Fan & Power Bank', + title: 'Isidaya - Shared Fan & Power Bank', path: '/pages/index/index' }, @@ -869,7 +904,9 @@ export default { goods: { title: 'Product 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', buyNow: 'Buy Now', productDetail: 'Customize Details', @@ -880,7 +917,7 @@ export default { temp: 'Smart Temperature', 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', confirmPurchaseContent: 'Confirm to purchase this product for ¥{price}?', purchaseSuccess: 'Purchase Successful', diff --git a/locale/id-ID.js b/locale/id-ID.js index ee15a8f..913e697 100644 --- a/locale/id-ID.js +++ b/locale/id-ID.js @@ -71,18 +71,18 @@ export default { orders: 'Pesanan', settings: 'Pengaturan', back: 'Kembali', - title: 'Kipas Angin & Power Bank Berbagi FengDianZhe' + title: 'Kipas Angin & Power Bank Berbagi Isidaya' }, app: { - name: 'FengDianZhe', + name: 'Isidaya', slogan: 'Kipas Angin & Power Bank Berbagi', - fullName: 'FengDianZhe - Kipas Angin & Power Bank Berbagi', - welcome: 'Selamat datang menggunakan FengDianZhe' + fullName: 'Isidaya - Kipas Angin & Power Bank Berbagi', + welcome: 'Selamat datang menggunakan Isidaya' }, home: { - title: 'Kipas Angin & Power Bank Berbagi FengDianZhe', + title: 'Kipas Angin & Power Bank Berbagi Isidaya', nearbyDevices: 'Perangkat Terdekat', scanToUse: 'Pindai untuk Menggunakan', personalCenter: 'Pusat Pribadi', @@ -115,6 +115,38 @@ export default { 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: { title: 'Panduan Penggunaan', step1Title: 'Pindai untuk Menggunakan', @@ -154,6 +186,8 @@ export default { offline: 'Offline', pricingRules: 'Aturan Penagihan', 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', checkBeforeUse: 'Harap periksa apakah perangkat dalam kondisi baik sebelum digunakan', autoChargeOvertime: 'Melebihi waktu penggunaan akan dikenakan biaya per jam secara otomatis', @@ -181,6 +215,7 @@ export default { noOrderRecord: 'Tidak ada catatan pesanan', getOrderListFailed: 'Gagal mendapatkan daftar pesanan', confirmCancelContent: 'Apakah Anda yakin ingin membatalkan pesanan ini?', + confirmDeleteContent: 'Apakah Anda yakin ingin menghapus pesanan ini?', orderDetail: 'Detail Pesanan', orderNo: 'Nomor Pesanan', orderStatus: 'Status Pesanan', @@ -540,7 +575,7 @@ export default { received: 'Telah Diterima', detail: 'Detail', 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', copyAllInfo: 'Salin Semua Informasi', recipient: 'Penerima', @@ -620,7 +655,7 @@ export default { termsOfService: 'Ketentuan Layanan', termsAndConditions: 'Syarat & Ketentuan', 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', footerNoticePolicy: 'Jika ada pertanyaan tentang kebijakan ini, harap pergi ke "Saya-Layanan Pelanggan" untuk konsultasi', @@ -656,7 +691,7 @@ export default { }, share: { - title: 'FengDianZhe - Kipas Angin & Power Bank Berbagi', + title: 'Isidaya - Kipas Angin & Power Bank Berbagi', path: '/pages/index/index' }, @@ -868,7 +903,9 @@ export default { goods: { title: 'Detail Produk', 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', buyNow: 'Beli Sekarang', productDetail: 'Detail Kustomisasi', @@ -879,7 +916,7 @@ export default { temp: 'Kontrol Suhu Pintar', 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', confirmPurchaseContent: 'Konfirmasi membeli produk ini, perlu membayar ¥{price}?', purchaseSuccess: 'Pembelian berhasil', diff --git a/locale/zh-CN.js b/locale/zh-CN.js index 989a764..5244317 100644 --- a/locale/zh-CN.js +++ b/locale/zh-CN.js @@ -70,18 +70,18 @@ export default { orders: '订单', settings: '设置', back: '返回', - title: '风电者共享风扇&暖手充电宝' + title: 'Isidaya共享风扇&暖手充电宝' }, app: { - name: '风电者', + name: 'Isidaya', slogan: '共享风扇暖手充电宝', - fullName: '风电者 - 共享风扇暖手充电宝', - welcome: '欢迎使用风电者' + fullName: 'Isidaya - 共享风扇暖手充电宝', + welcome: '欢迎使用Isidaya' }, home: { - title: '风电者共享风扇&暖手充电宝', + title: 'Isidaya共享风扇&暖手充电宝', nearbyDevices: '附近设备', scanToUse: '扫码使用', personalCenter: '个人中心', @@ -114,6 +114,38 @@ export default { 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: { title: '使用指南', step1Title: '扫码使用', @@ -152,6 +184,8 @@ export default { offline: '离线', pricingRules: '计费规则', capLimit: '元封顶', + detailBillingByUnit: '不足{unit}{minute}按{unit}{minute}计费,封顶{cap}元,持续计费至{cap}元视为买断', + detailBillingIdr: '不足1{hour}按1{hour}计费,封顶{cap},持续计费至{cap}视为买断', usageInstructions: '使用说明', checkBeforeUse: '请在使用前检查设备是否完好', autoChargeOvertime: '超出使用时间将自动按小时计费', @@ -179,6 +213,7 @@ export default { noOrderRecord: '暂无订单记录', getOrderListFailed: '获取订单列表失败', confirmCancelContent: '确定要取消此订单吗?', + confirmDeleteContent: '确定要删除这个订单吗?', orderDetail: '订单详情', orderNo: '订单号', orderStatus: '订单状态', @@ -540,7 +575,7 @@ export default { received: '已签收', detail: '详情', recipientInfo: '收件信息', - recipientName: '风电者 18163601305', + recipientName: 'Isidaya 18163601305', recipientAddress: '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623', copyAllInfo: '一键复制全部信息', recipient: '收件人', @@ -620,7 +655,7 @@ export default { termsOfService: '服务条款', termsAndConditions: '条款与细则', lastUpdate: '最后更新', - applicableToService: '适用于"风电者"共享风扇租借服务', + applicableToService: '适用于"Isidaya"共享风扇租借服务', footerNotice: '如对本协议有疑问,请前往"我的-客服"咨询', footerNoticePolicy: '如对本政策有疑问,请前往"我的-客服"咨询', @@ -656,7 +691,7 @@ export default { }, share: { - title: '风电者 - 共享风扇暖手充电宝', + title: 'Isidaya - 共享风扇暖手充电宝', path: '/pages/index/index' }, @@ -868,7 +903,9 @@ export default { goods: { title: '商品详情', goodsTitle: '定制详情', - productName: '风电者共享风扇 + 充电宝 + 暖手宝系列-樱花粉', + defaultProductNameShort: 'Isidaya 2026新款', + defaultProductNameFull: 'Isidaya 2026新款风扇、充电宝、暖手宝三合一', + productName: 'Isidaya共享风扇 + 充电宝 + 暖手宝系列-樱花粉', perUnit: '/个', buyNow: '立即购买', productDetail: '定制详情', @@ -879,7 +916,7 @@ export default { temp: '智能控温', charge: '快速充电' }, - description: '风电者共享风扇,集风扇、充电宝、暖手宝三合一功能。采用8000mAh大容量电池,续航持久。高效风扇设计,三档风力可调。智能控温暖手宝,冬暖夏凉。快速充电技术,支持多设备充电。樱花粉配色,时尚美观,是您出行的最佳伴侣。', + description: 'Isidaya共享风扇,集风扇、充电宝、暖手宝三合一功能。采用8000mAh大容量电池,续航持久。高效风扇设计,三档风力可调。智能控温暖手宝,冬暖夏凉。快速充电技术,支持多设备充电。樱花粉配色,时尚美观,是您出行的最佳伴侣。', confirmPurchase: '确认购买', confirmPurchaseContent: '确认购买该商品,需支付 ¥{price}?', purchaseSuccess: '购买成功', diff --git a/manifest.json b/manifest.json index 8f6086c..3ff8067 100644 --- a/manifest.json +++ b/manifest.json @@ -96,7 +96,7 @@ "mode" : "history", "base" : "/" }, - "title" : "FDZPower" + "title" : "Isidaya" }, "uniStatistics" : { "enable" : false diff --git a/pages.json b/pages.json index b460bcb..1419d16 100644 --- a/pages.json +++ b/pages.json @@ -25,7 +25,7 @@ { "path": "pages/scan/index", "style": { - "navigationBarTitleText": "扫码使用", + "navigationBarTitleText": "", "navigationBarBackgroundColor": "#000000", "navigationBarTextStyle": "white" } diff --git a/pages/device/detail.vue b/pages/device/detail.vue index 9193fc9..6ad7242 100644 --- a/pages/device/detail.vue +++ b/pages/device/detail.vue @@ -153,7 +153,8 @@ getUserPhoneNumber } from '@/util/index.js' import { - useI18n + useI18n, + showModalI18n } from '@/utils/i18n.js' import DeviceDetailSkeleton from '@/components/DeviceDetailSkeleton.vue' @@ -297,7 +298,7 @@ // 不立即抛出错误,而是记录问题并继续处理 if (!res) { console.error('API返回数据为空') - uni.showModal({ + showModalI18n({ title: '数据异常', content: 'API返回为空', showCancel: false @@ -320,7 +321,7 @@ } else { // 记录详细信息,不抛出错误 console.warn('获取手机号响应异常:', res.msg || '未知错误') - uni.showModal({ + showModalI18n({ title: t('auth.phoneError'), content: `${t('common.statusCode')}: ${res.code}, ${t('common.message')}: ${res.msg || t('common.none')}`, showCancel: false @@ -333,7 +334,7 @@ // 显示更详细的错误信息 let errMsg = err.message || err.toString() - uni.showModal({ + showModalI18n({ title: t('auth.phoneGetFailed'), content: t('common.errorInfo') + ': ' + errMsg, showCancel: false @@ -342,7 +343,7 @@ } catch (outerError) { // uni.hideLoading() console.error('获取手机号外部错误:', outerError) - uni.showModal({ + showModalI18n({ title: t('common.unexpectedError'), content: t('common.processException') + ': ' + (outerError.message || outerError), showCancel: false @@ -413,7 +414,7 @@ // 显示登录提示 const showLoginTip = () => { - uni.showModal({ + showModalI18n({ title: t('common.tips'), content: t('common.loginRequired'), confirmText: t('auth.goToLogin'), @@ -567,19 +568,19 @@ // 生成详细说明文本 const getDetailInfoText = () => { 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 depositAmount = deviceInfo.value.depositAmount || '99' - - // 按分钟计费 - if (deviceInfo.value && deviceInfo.value.feeType === 'minute') { - return `不足${unitMinutes}分钟按${unitMinutes}分钟计费,封顶${depositAmount}元,持续计费至${depositAmount}元视为买断` - } - - // 按小时计费 - return `不足${unitMinutes}分钟按${unitMinutes}分钟计费,封顶${depositAmount}元,持续计费至${depositAmount}元视为买断` + return t('device.detailBillingByUnit', { + unit: unitMinutes, + minute: t('time.minute'), + cap: depositAmount + }) } // 获取租借按钮文本 diff --git a/pages/index/index.vue b/pages/index/index.vue index 18ccd2f..00419fa 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -205,7 +205,8 @@ import HomeMainH5 from '../../components/home/HomeMainH5.vue' import LocationListSheet from '../../components/LocationListSheet.vue' import { - useI18n + useI18n, + showModalI18n } from '../../utils/i18n.js' // 开启右上角分享菜单(仅 mp-weixin 有效) @@ -1417,7 +1418,7 @@ const expected = expectedUserPhone.value if (expected && normalizePhone(aliPhone) !== normalizePhone(expected)) { - uni.showModal({ + showModalI18n({ title: t('common.tips'), content: '当前支付宝授权手机号与账号绑定手机号不一致,无法扫码租借,请更换账号或联系管理员。', showCancel: false diff --git a/pages/order/detail.vue b/pages/order/detail.vue index 4e47e0b..d8d7bd6 100644 --- a/pages/order/detail.vue +++ b/pages/order/detail.vue @@ -262,7 +262,8 @@ URL } from "@/config/url.js" import { - useI18n + useI18n, + showModalI18n } from '@/utils/i18n.js' const { @@ -1194,7 +1195,7 @@ // 取消订单 const handleCancelOrder = () => { - uni.showModal({ + showModalI18n({ title: t('order.confirmCancel'), content: t('order.confirmCancelContent'), success: async (res) => { diff --git a/pages/scan/index.vue b/pages/scan/index.vue index 649e3dc..b277c73 100644 --- a/pages/scan/index.vue +++ b/pages/scan/index.vue @@ -24,36 +24,36 @@ - 相册 + {{ $t('scan.album') }} - 手动输入 + {{ $t('scan.manualInput') }} - 返回 + {{ $t('common.back') }} - 手动输入设备号 + {{ $t('scan.manualInputTitle') }} - - + + @@ -64,10 +64,13 @@ import { ref, onMounted, onUnmounted } from 'vue'; import { getQueryString } from '../../util/index.js'; import { Html5Qrcode, Html5QrcodeSupportedFormats } from 'html5-qrcode'; +import { useI18n, showModalI18n } from '@/utils/i18n.js'; + +const { t } = useI18n(); const inputPopup = ref(null); const manualDeviceNo = ref(''); -const tipText = ref('正在初始化...'); +const tipText = ref(t('scan.initializing')); const scanning = ref(false); const hasFlash = ref(false); const flashOn = ref(false); @@ -93,12 +96,12 @@ const getScanConfig = () => ({ // 初始化扫码 const initScan = async () => { try { - tipText.value = '正在初始化...'; + tipText.value = t('scan.initializing'); console.log('=== 开始初始化扫码 ==='); // 检查浏览器支持 if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { - throw new Error('您的浏览器不支持摄像头访问'); + throw new Error(t('scan.browserNotSupportCamera')); } // 等待 DOM 渲染 @@ -107,7 +110,7 @@ const initScan = async () => { // 检查容器元素 const readerElement = document.getElementById('qr-reader'); if (!readerElement) { - throw new Error('扫码容器元素未找到'); + throw new Error(t('scan.containerNotFound')); } console.log('✓ 扫码容器元素已找到'); @@ -130,10 +133,10 @@ const initScan = async () => { const startScanning = async () => { try { if (!html5QrCode) { - throw new Error('Html5Qrcode 实例不存在'); + throw new Error(t('scan.initFailed')); } - tipText.value = '正在启动摄像头...'; + tipText.value = t('scan.startingCamera'); console.log('=== 开始启动扫描 ==='); console.log('html5QrCode 实例:', html5QrCode); console.log('html5QrCode.start 方法:', typeof html5QrCode.start); @@ -155,7 +158,7 @@ const startScanning = async () => { console.log('start() 调用结果:', startResult); scanning.value = true; - tipText.value = '将二维码放入框内扫描'; + tipText.value = t('scan.alignQRCode'); console.log('✅ 扫描已成功启动'); // 延迟隐藏默认UI @@ -184,7 +187,7 @@ const startScanning = async () => { ); scanning.value = true; - tipText.value = '将二维码放入框内扫描'; + tipText.value = t('scan.alignQRCode'); console.log('✅ 使用前置摄像头启动成功'); setTimeout(() => { @@ -215,14 +218,14 @@ const startScanning = async () => { ); scanning.value = true; - tipText.value = '将二维码放入框内扫描'; + tipText.value = t('scan.alignQRCode'); console.log('✅ 使用默认摄像头启动成功'); setTimeout(() => { hideDefaultUI(); }, 200); } else { - throw new Error('未找到可用的摄像头'); + throw new Error(t('scan.noCameraFound')); } } catch (err3) { console.error('❌ 所有方式都失败:', err3); @@ -324,43 +327,45 @@ const stopScan = async () => { const handleInitError = (err) => { console.error('处理初始化错误:', err); - let errMsg = '初始化失败'; + let errMsg = t('scan.initFailed'); let errDetail = ''; if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') { - errMsg = '摄像头权限被拒绝'; - errDetail = '请在浏览器设置中允许访问摄像头'; + errMsg = t('scan.cameraPermissionDenied'); + errDetail = t('scan.cameraPermissionHint'); } else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') { - errMsg = '未找到可用的摄像头'; - errDetail = '请确保设备有摄像头'; + errMsg = t('scan.noCameraFound'); + errDetail = t('scan.ensureCameraExists'); } else if (err.name === 'NotReadableError' || err.name === 'TrackStartError') { - errMsg = '摄像头被占用'; - errDetail = '请关闭其他使用摄像头的应用'; + errMsg = t('scan.cameraInUse'); + errDetail = t('scan.closeOtherCameraApps'); } else if (err.name === 'NotSupportedError') { - errMsg = '浏览器不支持'; - errDetail = '请使用现代浏览器访问'; + errMsg = t('scan.browserNotSupported'); + errDetail = t('scan.useModernBrowser'); } // else if (location.protocol !== 'https:' && location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') { // errMsg = '需要 HTTPS 环境'; // errDetail = '摄像头功能需要在安全环境下使用'; // } else { - errMsg = err.message || '摄像头启动失败'; - errDetail = '请尝试刷新页面或使用其他方式'; + errMsg = err.message || t('scan.cameraStartFailed'); + errDetail = t('scan.tryRefreshOrAlternative'); } tipText.value = errMsg; + const fallbackContent = `${errDetail}\n\n${t('scan.errorFallbackHint')}\n1. ${t('scan.errorFallbackAlbum')}\n2. ${t('scan.errorFallbackManual')}`; + // 显示错误提示,提供备选方案 - uni.showModal({ + showModalI18n({ title: errMsg, - content: errDetail + '\n\n您可以:\n1. 从相册选择二维码图片\n2. 手动输入设备号', + content: fallbackContent, showCancel: true, - cancelText: '返回', - confirmText: '手动输入', + cancelText: t('common.back'), + confirmText: t('scan.manualInput'), success: (res) => { if (res.confirm) { toggleInput(); @@ -383,7 +388,7 @@ const chooseImage = async () => { return; } - uni.showLoading({ title: '正在识别...' }); + uni.showLoading({ title: t('scan.recognizing') }); try { // 先停止摄像头扫描 @@ -422,7 +427,7 @@ const chooseImage = async () => { // 不要立即返回,等待首页处理完成 console.log('图片识别结果已发送,等待首页处理...'); } else { - uni.showToast({ title: '未识别到二维码', icon: 'none' }); + uni.showToast({ title: t('scan.qrNotFound'), icon: 'none' }); // 识别失败,重新启动摄像头扫描 if (wasScanning) { setTimeout(async () => { @@ -433,7 +438,7 @@ const chooseImage = async () => { } catch (err) { console.error('图片识别失败:', err); uni.hideLoading(); - uni.showToast({ title: '识别失败', icon: 'none' }); + uni.showToast({ title: t('scan.recognizeFailed'), icon: 'none' }); // 识别失败,重新启动摄像头扫描 setTimeout(async () => { try { @@ -452,7 +457,7 @@ const chooseImage = async () => { count: 1, sourceType: ['album'], success: (res) => { - uni.showToast({ title: '该功能仅在H5环境可用', icon: 'none' }); + uni.showToast({ title: t('scan.h5Only'), icon: 'none' }); } }); // #endif @@ -477,7 +482,7 @@ const confirmManualInput = () => { const deviceNo = manualDeviceNo.value.trim(); if (!deviceNo) { - uni.showToast({ title: '请输入设备号', icon: 'none' }); + uni.showToast({ title: t('scan.deviceNoRequired'), icon: 'none' }); return; } @@ -508,6 +513,9 @@ const goBack = () => { onMounted(() => { console.log('扫码页面已挂载'); + uni.setNavigationBarTitle({ + title: t('scan.title') + }); // 延迟初始化,确保 DOM 已渲染 setTimeout(() => { diff --git a/static/logo.png b/static/logo.png index d007a8d..ffe5c0a 100644 Binary files a/static/logo.png and b/static/logo.png differ diff --git a/static/logo1.png b/static/logo1.png new file mode 100644 index 0000000..d007a8d Binary files /dev/null and b/static/logo1.png differ diff --git a/subPackages/business/device-goods.vue b/subPackages/business/device-goods.vue index dc0bec9..566571a 100644 --- a/subPackages/business/device-goods.vue +++ b/subPackages/business/device-goods.vue @@ -143,7 +143,7 @@ - 确定 + {{ $t('common.confirm') }} @@ -304,7 +304,7 @@ - 确定 + {{ $t('common.confirm') }} diff --git a/subPackages/business/device-orderDetail.vue b/subPackages/business/device-orderDetail.vue index 37bde52..71a9f75 100644 --- a/subPackages/business/device-orderDetail.vue +++ b/subPackages/business/device-orderDetail.vue @@ -16,7 +16,7 @@ class="product-image" > - {{ orderDetail.productName || orderDetail.deviceName || '风电者2026新款风扇、充电宝、暖手宝三合一' }} + {{ orderDetail.productName || orderDetail.deviceName || $t('goods.defaultProductNameFull') }} 款式:{{ orderDetail.optionName || orderDetail.style || '标准' }} ¥{{ orderDetail.price || orderDetail.totalAmount }} @@ -143,7 +143,7 @@ createWxPayment } from '../../config/api/order.js'; // import { getSystemParamByKey } from '../../config/api/system.js'; - import { useI18n } from '@/utils/i18n.js' + import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -409,9 +409,9 @@ // 取消订单 const onCancelOrder = () => { - uni.showModal({ - title: '提示', - content: '确定要取消这个订单吗?', + showModalI18n({ + title: t('common.tips'), + content: t('order.confirmCancelContent'), success: async (res) => { if (res.confirm) { try { @@ -450,9 +450,9 @@ // 删除订单 const onDeleteOrder = () => { - uni.showModal({ - title: '提示', - content: '确定要删除这个订单吗?', + showModalI18n({ + title: t('common.tips'), + content: t('order.confirmDeleteContent'), success: async (res) => { if (res.confirm) { try { diff --git a/subPackages/business/device-orderList.vue b/subPackages/business/device-orderList.vue index b813e0f..c860ac9 100644 --- a/subPackages/business/device-orderList.vue +++ b/subPackages/business/device-orderList.vue @@ -60,7 +60,7 @@ import { URL } from '../../config/url.js'; - import { useI18n } from '@/utils/i18n.js' + import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -494,7 +494,7 @@ // 取消订单 const handleCancelOrder = async (order) => { try { - uni.showModal({ + showModalI18n({ title: t('order.confirmCancel'), content: t('order.confirmCancelContent'), success: async (res) => { @@ -540,9 +540,9 @@ // 处理删除订单 const handleDeleteOrder = (order) => { - uni.showModal({ - title: '提示', - content: '确定要删除这个订单吗?', + showModalI18n({ + title: t('common.tips'), + content: t('order.confirmDeleteContent'), success: async (res) => { if (res.confirm) { try { diff --git a/subPackages/order/index.vue b/subPackages/order/index.vue index d136d90..6d6ab9a 100644 --- a/subPackages/order/index.vue +++ b/subPackages/order/index.vue @@ -52,7 +52,7 @@ import { getDeviceInfo } from '../../config/api/device.js'; - import { useI18n } from '@/utils/i18n.js' + import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -359,7 +359,7 @@ // 取消订单 const handleCancelOrder = async (order) => { try { - uni.showModal({ + showModalI18n({ title: t('order.confirmCancel'), content: t('order.confirmCancelContent'), success: async (res) => { diff --git a/subPackages/order/payment.vue b/subPackages/order/payment.vue index 0b278ed..9c4aa4b 100644 --- a/subPackages/order/payment.vue +++ b/subPackages/order/payment.vue @@ -115,7 +115,8 @@ updateUserBalance } from '@/config/api/user.js' import { - useI18n + useI18n, + showModalI18n } from '@/utils/i18n.js' const { @@ -523,7 +524,7 @@ return; } - uni.showModal({ + showModalI18n({ title: t('order.confirmCancel'), content: t('order.confirmCancelContent'), success: async (res) => { diff --git a/subPackages/other/deposit/index.vue b/subPackages/other/deposit/index.vue index aeb6a69..812c6a6 100644 --- a/subPackages/other/deposit/index.vue +++ b/subPackages/other/deposit/index.vue @@ -44,7 +44,7 @@ import { onShow } from '@dcloudio/uni-app' import { getUserInfo } from '@/util/index.js' import { withdrawDeposit } from '@/config/api/user.js' import { queryById } from '@/config/api/order.js' -import { useI18n } from '@/utils/i18n.js' +import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -102,7 +102,7 @@ const handleWithdraw = async () => { return } - uni.showModal({ + showModalI18n({ title: t('deposit.confirmWithdraw'), content: t('deposit.withdrawDesc'), success: async (res) => { @@ -158,7 +158,7 @@ const handleWithdraw = async () => { } } - uni.showModal({ + showModalI18n({ title: t('deposit.withdrawFailed'), content: errorMessage, showCancel: false diff --git a/subPackages/other/legal/agreement-en.vue b/subPackages/other/legal/agreement-en.vue index 6f04523..c848216 100644 --- a/subPackages/other/legal/agreement-en.vue +++ b/subPackages/other/legal/agreement-en.vue @@ -84,7 +84,7 @@ }) }) - const brandName = 'WindPower' + const brandName = 'Isidaya' const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.' const effectiveDate = '2025-10-13' const disputeVenue = 'the location of the platform' diff --git a/subPackages/other/legal/agreement-zh.vue b/subPackages/other/legal/agreement-zh.vue index ba6167c..e122de1 100644 --- a/subPackages/other/legal/agreement-zh.vue +++ b/subPackages/other/legal/agreement-zh.vue @@ -84,7 +84,7 @@ }) }) - const brandName = '风电者' + const brandName = 'Isidaya' const companyName = '深圳乐慕智云科技有限公司' const effectiveDate = '2025-10-13' const disputeVenue = '平台所在地' diff --git a/subPackages/other/legal/privacy-en.vue b/subPackages/other/legal/privacy-en.vue index a789de1..63ccb9b 100644 --- a/subPackages/other/legal/privacy-en.vue +++ b/subPackages/other/legal/privacy-en.vue @@ -69,7 +69,7 @@ }) }) - const brandName = 'WindPower' + const brandName = 'Isidaya' const companyName = 'Shenzhen Lemu Zhiyun Technology Co., Ltd.' const effectiveDate = '2025-10-13' diff --git a/subPackages/other/legal/privacy-zh.vue b/subPackages/other/legal/privacy-zh.vue index 39ba6ed..7d73b47 100644 --- a/subPackages/other/legal/privacy-zh.vue +++ b/subPackages/other/legal/privacy-zh.vue @@ -69,7 +69,7 @@ }) }) - const brandName = '风电者' + const brandName = 'Isidaya' const companyName = '深圳乐慕智云科技有限公司' const effectiveDate = '2025-10-13' diff --git a/subPackages/other/legal/terms-en-US.md b/subPackages/other/legal/terms-en-US.md new file mode 100644 index 0000000..b9ca65c --- /dev/null +++ b/subPackages/other/legal/terms-en-US.md @@ -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**. diff --git a/subPackages/other/legal/terms-id-ID.md b/subPackages/other/legal/terms-id-ID.md new file mode 100644 index 0000000..3bc2738 --- /dev/null +++ b/subPackages/other/legal/terms-id-ID.md @@ -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. diff --git a/subPackages/other/legal/terms-zh-CN.md b/subPackages/other/legal/terms-zh-CN.md new file mode 100644 index 0000000..7479c42 --- /dev/null +++ b/subPackages/other/legal/terms-zh-CN.md @@ -0,0 +1,43 @@ +# 条款与细则 + +**最后更新**: 2025-02-05 + +--- + +## 适用法律 + +本服务条款受中华人民共和国法律管辖。用户使用本服务即表示同意接受中国法律的约束。任何因本服务引起的争议,应首先通过友好协商解决;协商不成的,任何一方均可向服务提供方所在地有管辖权的人民法院提起诉讼。 + +## 支付方式 + +我们支持多种支付方式,包括但不限于:微信支付、支付宝、微信支付分免押金等。用户在使用服务前需完成支付流程。支付成功后,系统将自动开启设备供用户使用。所有支付交易均通过安全加密通道进行,确保用户资金安全。 + +## 退款介绍 + +1. 押金退款:归还设备后,押金将在扣除相应租金后自动退还至原支付账户,预计0-7个工作日到账。 +2. 订单取消:未使用的订单可在开始使用前取消,押金将全额退还。 +3. 异常退款:如遇设备故障等特殊情况,用户可申请退款,我们将在核实后3-5个工作日内处理。 +4. 会员卡/优惠券:已购买的会员卡和优惠券一般不支持退款,特殊情况请联系客服处理。 + +## 服务条款 + +用户在使用本服务时,应遵守以下规定: + +1. 妥善保管租借的设备,不得故意损坏或私自占有; +2. 按时归还设备,避免产生额外费用; +3. 不得将设备用于非法用途; +4. 如发现设备故障,应及时联系客服处理。 + +违反上述规定的,我们有权终止服务并追究相应责任。 + +## 责任限制 + +在法律允许的最大范围内,我们对因使用或无法使用本服务而导致的任何间接、偶然、特殊或后果性损害不承担责任。我们的总责任不超过用户为使用本服务所支付的费用。对于因不可抗力、网络故障、第三方原因等导致的服务中断或延迟,我们不承担责任。 + +## 争议解决 + +如用户对服务有任何疑问或争议,请首先通过客服渠道联系我们,我们将在收到反馈后24小时内响应,并尽快协商解决。如协商不成,双方同意将争议提交至服务提供方所在地有管辖权的人民法院通过诉讼方式解决。在争议解决期间,双方应继续履行本协议中无争议的条款。 + +--- + +如对本协议有疑问,请前往「我的 - 客服」咨询。 diff --git a/subPackages/service/expressReturn/addExpressReturn.vue b/subPackages/service/expressReturn/addExpressReturn.vue index fe37557..9eeb9e8 100644 --- a/subPackages/service/expressReturn/addExpressReturn.vue +++ b/subPackages/service/expressReturn/addExpressReturn.vue @@ -60,7 +60,7 @@ getExpressReturnDetail, fillExpressTrackingNumber } from '@/config/api/expressReturn.js' - import { useI18n } from '@/utils/i18n.js' + import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -165,7 +165,7 @@ const rec = res.data if (rec.status === 0) { recordId.value = rec.id - uni.showModal({ + showModalI18n({ title: t('common.tips'), content: t('express.existingReturnNotice'), confirmText: t('express.goToFill'), diff --git a/subPackages/service/expressReturn/detail.vue b/subPackages/service/expressReturn/detail.vue index fa12904..e4051be 100644 --- a/subPackages/service/expressReturn/detail.vue +++ b/subPackages/service/expressReturn/detail.vue @@ -89,7 +89,7 @@ import { ref, onMounted } from 'vue' import { getExpressReturnDetail } from '@/config/api/expressReturn.js' import { getCustomerPhone } from '@/util/index.js' -import { useI18n } from '@/utils/i18n.js' +import { useI18n, showModalI18n } from '@/utils/i18n.js' const { t } = useI18n() @@ -164,7 +164,7 @@ const handleCopyTracking = () => { // 联系客服 const handleContactService = () => { const customerPhone = getCustomerPhone() - uni.showModal({ + showModalI18n({ title: t('user.customerService'), content: `${t('help.phone')}:${customerPhone}\n${t('help.workingHours')}:${t('express.workingHours')}`, confirmText: t('express.call'), diff --git a/subPackages/service/expressReturn/index.vue b/subPackages/service/expressReturn/index.vue index f18c75e..f9b0c73 100644 --- a/subPackages/service/expressReturn/index.vue +++ b/subPackages/service/expressReturn/index.vue @@ -67,8 +67,7 @@ onMounted(() => { loadList() }) -// 收件信息 -const recipientName = '风电者 18163601305' +// 收件信息(名称走多语言,地址暂为固定配置) const recipientAddress = '湖南省长沙市岳麓区麓谷街道新长海尖科技园A2栋623' const loadList = async () => { @@ -131,7 +130,7 @@ const getStatusBadge = (status) => ({ // 一键复制全部信息 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({ data: allInfo, success: () => { diff --git a/subPackages/service/return/index.vue b/subPackages/service/return/index.vue index 273eb7a..760e5ab 100644 --- a/subPackages/service/return/index.vue +++ b/subPackages/service/return/index.vue @@ -152,6 +152,7 @@ import { URL } from "@/config/url.js" + import { showModalI18n } from '@/utils/i18n.js' export default { data() { @@ -411,7 +412,7 @@ this.clearExpressCountdown() // 显示归还成功弹窗 - uni.showModal({ + showModalI18n({ title: this.$t('order.returnSuccess'), content: this.$t('order.returnSuccessMessage'), confirmText: this.$t('order.viewDetails'), @@ -793,7 +794,7 @@ // 取消订单 handleCancelOrder() { - uni.showModal({ + showModalI18n({ title: this.$t('order.confirmCancel'), content: this.$t('order.confirmCancelContent'), success: async (res) => { diff --git a/subPackages/user/login/index.vue b/subPackages/user/login/index.vue index 857b522..95d422e 100644 --- a/subPackages/user/login/index.vue +++ b/subPackages/user/login/index.vue @@ -55,7 +55,7 @@ import { ref, onMounted } from 'vue' import { onLoad } from '@dcloudio/uni-app' 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() @@ -95,11 +95,9 @@ } // 未勾选,弹窗提示 - uni.showModal({ + showModalI18n({ title: t('common.tips'), content: t('auth.pleaseAgreeToTerms'), - confirmText: t('common.confirm'), - cancelText: t('common.cancel'), success: (res) => { if (res.confirm) { // 用户点击同意,自动勾选 diff --git a/subPackages/user/my/index.vue b/subPackages/user/my/index.vue index 743dafa..42ed003 100644 --- a/subPackages/user/my/index.vue +++ b/subPackages/user/my/index.vue @@ -137,8 +137,8 @@ 授权登录 获取您的微信头像、昵称等公开信息 - - + + diff --git a/subPackages/user/setting/index.vue b/subPackages/user/setting/index.vue index 3c3ec22..105808e 100644 --- a/subPackages/user/setting/index.vue +++ b/subPackages/user/setting/index.vue @@ -35,7 +35,7 @@