diff --git a/components/shopping/jingdong/shopping-card.vue b/components/shopping/jingdong/shopping-card.vue index 113efae..1ff0168 100644 --- a/components/shopping/jingdong/shopping-card.vue +++ b/components/shopping/jingdong/shopping-card.vue @@ -97,7 +97,7 @@ (item.totalPrice ? Number(item.totalPrice).toFixed(2) : '0.00') : safeFormatPrice(item) - }} + }} 共{{ @@ -131,7 +131,7 @@ @@ -190,8 +198,12 @@ billData.merchantOption.serviceDetailInfo.text }} - + :focus="data.focusState.serviceDetail" + v-model="billData.merchantOption.serviceDetailInfo.text" + @blur="data.focusState.serviceDetail = false" /> + + - + :focus="data.focusState.recommendService" + v-model="billData.merchantOption.recommendServiceInfo.text" + @blur="data.focusState.recommendService = false" /> + 去看看 @@ -227,12 +242,34 @@ billData.merchantOption.serviceRecommendInfo.text }} - + :focus="data.focusState.serviceRecommend" + v-model="billData.merchantOption.serviceRecommendInfo.text" + @blur="data.focusState.serviceRecommend = false" /> + + + + + + + {{ + billData.merchantOption.billAnalysisInfo.text }} + + + + + + + @@ -310,6 +347,41 @@ const timepopup = ref(null) // 账单管理弹窗 const billManagementPopupRef = ref(null) +// 输入框引用定义 +const nameInputRef = ref(null) +const moneyInputRef = ref(null) +const balanceInputRef = ref(null) +const serviceDetailInputRef = ref(null) +const recommendServiceInputRef = ref(null) +const serviceRecommendInputRef = ref(null) +const billAnalysisInputRef = ref(null) + +/** + * 通用聚焦函数 + * @param {Object} inputRef 目标输入框的 ref + */ +const onFocusShortcut = (inputRef) => { + if (!inputRef) return + nextTick(() => { + // uni-app 中 input 组件聚焦通常需要通过设置 focus 属性,但直接调用 focus() 在部分平台更直接 + // 我们主要通过 ref 操作或设置数据层状态实现 + if (inputRef.value && typeof inputRef.value.focus === 'function') { + inputRef.value.focus() + } + }) +} + +/** + * 触发指定输入框聚焦(响应式变量方式) + * @param {String} key focusState 中的键名 + */ +const triggerFocus = (key) => { + data.focusState[key] = false + nextTick(() => { + data.focusState[key] = true + }) +} + const { addBill, getBillList, @@ -411,6 +483,13 @@ const switchOptions = [{ "isSwitch": true, showTypeIds: [1, 2, 3], key: 'isShowBarcode', +}, +{ + "id": 10, + "name": "账单分析", + "isSwitch": true, + showTypeIds: [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], + key: 'isShowBillAnalysis', } ] @@ -484,6 +563,10 @@ const data = reactive({ note: { isImage: false, text: '' + }, + isShowBillAnalysis: false, + billAnalysisInfo: { + text: '本笔登上月收入榜,看看分析吧' } } }, @@ -495,7 +578,17 @@ const data = reactive({ tagInputValue: "", showTagInput: false, // switch选项 - switchOptions: switchOptions + switchOptions: switchOptions, + // 输入框聚焦状态 + focusState: { + name: false, + money: false, + balance: false, + serviceDetail: false, + recommendService: false, + serviceRecommend: false, + billAnalysis: false + } }) let { @@ -967,7 +1060,7 @@ const uploadImage = () => { */ const saveAndDisplayImage = (file) => { // #ifdef H5 - return Promise.resolve(file) + // return Promise.resolve(file) // #endif // #ifndef H5 @@ -1496,4 +1589,20 @@ page { } + +.bill-analysis-box { + border-top: 0.5px solid #E4E4E4; + padding: 14rpx 22rpx; + + .bill-analysis-text-box { + color: #B7971B; + font-size: 26rpx; + background-color: #FBF8F1; + height: 76rpx; + display: flex; + align-items: center; + border-radius: 16rpx; + padding: 0 24rpx; + } +} \ No newline at end of file diff --git a/pages/bill/bill-detail/bill-detail.vue b/pages/bill/bill-detail/bill-detail.vue index 05c6db2..6f15f68 100644 --- a/pages/bill/bill-detail/bill-detail.vue +++ b/pages/bill/bill-detail/bill-detail.vue @@ -172,8 +172,9 @@ 账单管理 - - 本笔登上月收入榜,看看分析吧 + + {{ + billData.merchantOption.billAnalysisInfo.text || '本笔登上月收入榜,看看分析吧' }} diff --git a/pages/bill/bill-list/bill-list.vue b/pages/bill/bill-list/bill-list.vue index 1dcc103..6c2e44f 100644 --- a/pages/bill/bill-list/bill-list.vue +++ b/pages/bill/bill-list/bill-list.vue @@ -284,7 +284,7 @@ const getBillDataList = () => { const createTimeItem = item.itemInfoList.find(info => info.key == 'createTime') const createTime = createTimeItem ? createTimeItem.value : new Date() - const date = new Date(createTime) + const date = dateUtil.parseSafe(createTime) const year = date.getFullYear() + '' const month = (date.getMonth() + 1) + '' @@ -342,7 +342,7 @@ const getBillDataList = () => { //每个月内的账单按时间倒序 groupList.forEach(group => { - group.list.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) + group.list.sort((a, b) => dateUtil.parseSafe(b.timestamp) - dateUtil.parseSafe(a.timestamp)) }) data.billList = groupList @@ -624,6 +624,13 @@ page { overflow: hidden; overflow-x: scroll; + &::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + color: transparent; + } + .filter-item { background-color: #ffffff; color: var(--text-primary); diff --git a/pages/common/recharge/index.vue b/pages/common/recharge/index.vue index 290f58f..9a3e018 100644 --- a/pages/common/recharge/index.vue +++ b/pages/common/recharge/index.vue @@ -4,7 +4,7 @@ - + @@ -463,7 +463,8 @@ const data = reactive({ isProcessingClick: false, banner: '/static/image/recharge/banner1.png', isCombo: false, - source: "uni_alipay_other" + source: "uni_alipay_other", + tradeCoupon: false }) let { @@ -493,6 +494,7 @@ onLoad(async (option) => { } const config = uni.getStorageSync('config').config const themeConfig = config?.['client.uniapp.theme'] + data.tradeCoupon = config?.['client.trade_coupon'] === true ? true : false if (themeConfig?.enable) { if (themeConfig?.theme == '0214') { data.banner = '/static/image/recharge/214/bannar.png' diff --git a/pages/shopping/index.vue b/pages/shopping/index.vue index c8530d3..79806b2 100644 --- a/pages/shopping/index.vue +++ b/pages/shopping/index.vue @@ -16,10 +16,13 @@ \ No newline at end of file diff --git a/static/image/shopping/jingdong/cainixihuan.png b/static/image/shopping/jingdong/cainixihuan.png new file mode 100644 index 0000000..6e05085 Binary files /dev/null and b/static/image/shopping/jingdong/cainixihuan.png differ diff --git a/static/image/shopping/jingdong/detail/kuaidiyuan.png b/static/image/shopping/jingdong/detail/kuaidiyuan.png new file mode 100644 index 0000000..4b759e4 Binary files /dev/null and b/static/image/shopping/jingdong/detail/kuaidiyuan.png differ diff --git a/static/image/shopping/jingdong/product/shopping/dyson_v12.png b/static/image/shopping/jingdong/product/shopping/dyson_v12.png new file mode 100644 index 0000000..1531a87 Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/dyson_v12.png differ diff --git a/static/image/shopping/jingdong/product/shopping/iphone.png b/static/image/shopping/jingdong/product/shopping/iphone.png new file mode 100644 index 0000000..1cb39fe Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/iphone.png differ diff --git a/static/image/shopping/jingdong/product/shopping/lv.png b/static/image/shopping/jingdong/product/shopping/lv.png new file mode 100644 index 0000000..aad81f6 Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/lv.png differ diff --git a/static/image/shopping/jingdong/product/shopping/sony.png b/static/image/shopping/jingdong/product/shopping/sony.png new file mode 100644 index 0000000..9c54530 Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/sony.png differ diff --git a/static/image/shopping/jingdong/product/shopping/wuliangye.png b/static/image/shopping/jingdong/product/shopping/wuliangye.png new file mode 100644 index 0000000..d40f815 Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/wuliangye.png differ diff --git a/static/image/shopping/jingdong/product/shopping/xianka.png b/static/image/shopping/jingdong/product/shopping/xianka.png new file mode 100644 index 0000000..a212131 Binary files /dev/null and b/static/image/shopping/jingdong/product/shopping/xianka.png differ diff --git a/static/image/shopping/jingdong/product/waimai/haidilao.png b/static/image/shopping/jingdong/product/waimai/haidilao.png new file mode 100644 index 0000000..3459fe3 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/haidilao.png differ diff --git a/static/image/shopping/jingdong/product/waimai/huajiaoji.png b/static/image/shopping/jingdong/product/waimai/huajiaoji.png new file mode 100644 index 0000000..f7b9276 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/huajiaoji.png differ diff --git a/static/image/shopping/jingdong/product/waimai/kfc.png b/static/image/shopping/jingdong/product/waimai/kfc.png new file mode 100644 index 0000000..40ac4b7 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/kfc.png differ diff --git a/static/image/shopping/jingdong/product/waimai/shala.png b/static/image/shopping/jingdong/product/waimai/shala.png new file mode 100644 index 0000000..6b32fd8 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/shala.png differ diff --git a/static/image/shopping/jingdong/product/waimai/xicha1.png b/static/image/shopping/jingdong/product/waimai/xicha1.png new file mode 100644 index 0000000..4969705 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/xicha1.png differ diff --git a/static/image/shopping/jingdong/product/waimai/xingbake.png b/static/image/shopping/jingdong/product/waimai/xingbake.png new file mode 100644 index 0000000..b5bbcd0 Binary files /dev/null and b/static/image/shopping/jingdong/product/waimai/xingbake.png differ diff --git a/static/image/shopping/taobao/back.png b/static/image/shopping/taobao/back.png new file mode 100644 index 0000000..f1aa73e Binary files /dev/null and b/static/image/shopping/taobao/back.png differ diff --git a/static/image/shopping/taobao/guanli.png b/static/image/shopping/taobao/guanli.png new file mode 100644 index 0000000..527039f Binary files /dev/null and b/static/image/shopping/taobao/guanli.png differ diff --git a/static/image/shopping/taobao/shaixuan.png b/static/image/shopping/taobao/shaixuan.png new file mode 100644 index 0000000..7f453ac Binary files /dev/null and b/static/image/shopping/taobao/shaixuan.png differ diff --git a/static/image/shopping/taobao/xiaoxi.png b/static/image/shopping/taobao/xiaoxi.png new file mode 100644 index 0000000..be4de11 Binary files /dev/null and b/static/image/shopping/taobao/xiaoxi.png differ diff --git a/utils/common.js b/utils/common.js index b91db10..7c94ad0 100644 --- a/utils/common.js +++ b/utils/common.js @@ -4,6 +4,22 @@ * 日期处理相关方法 */ export const dateUtil = { + /** + * 安全解析日期,兼容 iOS + * @param {Date|string|number} date + * @returns {Date} + */ + parseSafe(date) { + if (!date) return new Date(); + if (date instanceof Date) return date; + if (typeof date === 'string') { + // 兼容 iOS 的 YYYY-MM-DD 解析,并处理可能的空格/T问题 + const normalizedDate = date.replace(/-/g, '/'); + return new Date(normalizedDate); + } + return new Date(date); + }, + /** * 格式化日期 * @param {Date|string|number} date - 日期对象或时间戳 @@ -13,9 +29,7 @@ export const dateUtil = { format(date, format = 'YYYY-MM-DD HH:mm:ss') { if (!date) return ''; - if (typeof date === 'string' || typeof date === 'number') { - date = new Date(date); - } + date = this.parseSafe(date); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); @@ -50,9 +64,7 @@ export const dateUtil = { relative(date) { if (!date) return ''; - if (typeof date === 'string' || typeof date === 'number') { - date = new Date(date); - } + date = this.parseSafe(date); const now = new Date(); const diff = now - date; @@ -80,9 +92,7 @@ export const dateUtil = { smart(date) { if (!date) return ''; - if (typeof date === 'string' || typeof date === 'number') { - date = new Date(date); - } + date = this.parseSafe(date); const now = new Date(); const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); @@ -120,13 +130,7 @@ export const dateUtil = { formatMessageTime(date, hideCurrentYear = false, format = 'YYYY/M/D') { if (!date) return ''; - if (typeof date === 'string' || typeof date === 'number') { - // 兼容 iOS 的 YYYY-MM-DD 解析 - if (typeof date === 'string') { - date = date.replace(/-/g, '/'); - } - date = new Date(date); - } + date = this.parseSafe(date); const now = new Date(); // 将时分秒抹零,只取日期部分进行比对 @@ -464,7 +468,7 @@ export const util = { * @param {string} backgroundColor - 颜色值 * @returns {void} */ - setAndroidSystemBarColor(backgroundColor, frontColor = "#000000") { + setAndroidSystemBarColor(backgroundColor) { // 使用同步方式判断或直接通过编译宏/plus判断 const isAndroid = uni.getSystemInfoSync().platform === 'android'; if (isAndroid) { @@ -555,14 +559,14 @@ export const randomUtil = { randomTime(startTime, endTime, format = 'YYYY-MM-DD HH:mm:ss') { let end; if (endTime) { - end = new Date(endTime).getTime(); + end = dateUtil.parseSafe(endTime).getTime(); } else { end = Date.now(); } let start; if (startTime) { - start = new Date(startTime).getTime(); + start = dateUtil.parseSafe(startTime).getTime(); } else { // 默认为结束时间往前推3个月 const date = new Date(end);