diff --git a/common/utils/format.js b/common/utils/format.js
new file mode 100644
index 0000000..47b6d71
--- /dev/null
+++ b/common/utils/format.js
@@ -0,0 +1,11 @@
+ formatMoney(val) {
+ if (val === null || val === undefined || isNaN(val)) return '—';
+
+ val = Number(val);
+
+ if (val >= 10000) {
+ return '¥' + (val / 10000).toFixed(2) + '万';
+ }
+
+ return '¥' + val.toFixed(2);
+ }
\ No newline at end of file
diff --git a/pages/center/center.vue b/pages/center/center.vue
index 45ccb60..fe34ac2 100644
--- a/pages/center/center.vue
+++ b/pages/center/center.vue
@@ -141,115 +141,120 @@
diff --git a/pages/unpaid/unpaid.vue b/pages/unpaid/unpaid.vue
index ad7a12c..e801ccd 100644
--- a/pages/unpaid/unpaid.vue
+++ b/pages/unpaid/unpaid.vue
@@ -19,12 +19,12 @@
>
-
+
{{ item.feeName }}
缴费截止:{{ item.dueDate }}
@@ -34,12 +34,11 @@
{{ formatMoney(item.amount) }}
- 去支付
+ >去支付
+
@@ -51,13 +50,16 @@
-
-
- 已选 {{ selectedBills.length }} 项
-
- 批量缴费
-
-
+
+
+ 已选 {{ selectedBills.length }} 项
+
+ {{ formatMoney(sumAmount) }}
+
+
+
@@ -68,12 +70,15 @@ export default {
bills: [],
isRefreshing: false,
loadStatus: 'more',
+ sumAmount: 0,
selectedBills: [], // 勾选的账单集合
};
},
onLoad() {
this.loadBills();
},
+ onShow(){
+ },
methods: {
loadBills() {
this.bills = [
@@ -81,7 +86,7 @@ export default {
id: 'p101',
feeName: '第一期租金(2024.12.01-2024.12.31)',
dueDate: '2024-12-15',
- amount: 3000,
+ amount: 300000,
checked: false,
},
{
@@ -92,9 +97,8 @@ export default {
checked: false,
},
];
- this.updateSelected();
+ this.updateSelected();
},
-
refresh() {
this.isRefreshing = true;
setTimeout(() => {
@@ -107,16 +111,33 @@ export default {
this.loadStatus = 'noMore';
},
- formatMoney(val) {
- if (!val && val !== 0) return '—';
- return '¥' + Number(val).toFixed(2);
- },
-
- updateSelected() {
- this.selectedBills = [];
- this.selectedBills = this.bills.filter((item) => item.checked);
- console.log(this.selectedBill.length)
- },
+ formatMoney(val) {
+ if (val === null || val === undefined || isNaN(val)) return '—';
+
+ val = Number(val);
+
+ if (val >= 10000) {
+ return '¥' + (val / 10000).toFixed(2) + '万';
+ }
+
+ return '¥' + val.toFixed(2);
+ },
+ toggleCheck(item) {
+ item.checked = !item.checked;
+ if(item.checked && !this.selectedBills.some(b => b.id === item.id)) {
+ this.selectedBills.push(item);
+ }else{
+ // 取消勾选时从已选数组移除
+ this.selectedBills = this.selectedBills.filter(b => b.id !== item.id);
+ }
+ let sumFee = 0;
+ this.selectedBills.forEach(b => sumFee += b.amount);
+ this.sumAmount = sumFee;
+ },
+ updateSelected() {
+ if (!Array.isArray(this.bills)) return;
+ this.selectedBills = this.bills.filter(b => b.checked);
+ },
goPayTest(billList) {
if (!billList || billList.length === 0) return;
@@ -191,31 +212,7 @@ export default {
uni.showToast({ title: '支付请求失败', icon: 'none' });
}
},
- },
-computed: {
- /** ✅ 已勾选账单列表 */
- selectedBills() {
- return this.bills.filter(item => item.checked);
- },
-
- /** ✅ 已勾选数量 */
- selectedCount() {
- return this.selectedBills.length;
- },
-
- /** ✅ 全选状态(双向绑定) */
- allSelected: {
- get() {
- return this.bills.length > 0 && this.selectedBills.length === this.bills.length;
- },
- set(val) {
- // 用 this.$set 保证响应式更新
- this.bills.forEach((item, index) => {
- this.$set(this.bills, index, { ...item, checked: val });
- });
- }
}
-}
};
@@ -248,7 +245,6 @@ computed: {
.bill-info {
display: flex;
flex-direction: column;
- margin-left: 12rpx;
.bill-name {
font-size: 28rpx;
@@ -265,26 +261,31 @@ computed: {
}
.bill-right {
- display: flex;
flex-direction: column;
align-items: flex-end;
-
+ width: 30%;
.amount {
+ text-align: center;
font-size: 28rpx;
- color: #333;
+ height: 28rpx;
+ line-height: 28rpx;
+ color: #ff7f00;
}
.pay-btn {
margin-top: 12rpx;
- padding: 0 24rpx;
+ padding: 0 40rpx;
height: 60rpx;
line-height: 60rpx;
border-radius: 30rpx; // 圆角
font-size: 28rpx;
color: #fff;
- background-color: #007aff; // 蓝色主色
+ background: linear-gradient(90deg, #007aff, #00aaff);
text-align: center;
}
+ .btn-text{
+ padding-top: 13rpx;
+ }
}
.batch-pay-bar {
@@ -292,24 +293,41 @@ computed: {
bottom: 0;
left: 0;
right: 0;
- background: #fff;
- height: 80rpx;
- padding: 0 20rpx;
+ height: 170rpx;
+ padding: 0 30rpx;
+ background-color: #fff;
display: flex;
align-items: center;
justify-content: space-between;
- box-shadow: 0 -2rpx 6rpx rgba(0, 0, 0, 0.08);
+ box-shadow: 0 -4rpx 10rpx rgba(0, 0, 0, 0.08);
z-index: 999;
-
- u-button {
- height: 60rpx;
- line-height: 60rpx;
- padding: 0 30rpx;
- border-radius: 30rpx;
- font-size: 28rpx;
- text-align: center;
+ .batch-pay-bar-left{
+ font-size: 28rpx;
+ color: #333;
+ }
+
+ .batch-pay-bar-right{
+ flex-direction: column;
+ align-items: flex-end;
+ .sumAmount{
+ font-size: 28rpx;
+ color: #ff7f00;
+ }
+ .bottomPayBtn {
+ margin-top: 12rpx;
+ height: 60rpx;
+ line-height: 60rpx;
+ padding: 0 40rpx;
+ border-radius: 30rpx;
+ font-size: 28rpx;
+ font-weight: bold;
+ text-align: center;
+ background: linear-gradient(90deg, #007aff, #00aaff);
+ }
}
}
+
+
.empty {
margin-top: 200rpx;
text-align: center;
diff --git a/pages/wae/wae.vue b/pages/wae/wae.vue
index ddfaa5a..9420fe9 100644
--- a/pages/wae/wae.vue
+++ b/pages/wae/wae.vue
@@ -1,61 +1,65 @@
-
-
-
+
+
+
-
-
+
-
-
-
-
-
-
- {{ item.feeName }}
- 缴费截止:{{ item.dueDate }}
-
-
-
-
- ¥{{ item.amount }}
-
+
+
+
+
+ {{ item.feeName }}
+ 缴费截止:{{ item.dueDate }}
-
-
+
+
+ {{ formatMoney(item.amount) }}
+
+
+
-
+
+
+
-
-
-
- 已选择 {{ selectedIds.length }} 项
-
-
-
+
+
+ 已选 {{ selectedBills.length }} 项
+
+ {{ formatMoney(sumAmount) }}
+
+
+
@@ -63,198 +67,270 @@
export default {
data() {
return {
- records: [],
- selectedIds: [],
+ bills: [],
isRefreshing: false,
- loadStatus: 'loadmore',
- page: 1,
- pageSize: 10,
+ loadStatus: 'more',
+ sumAmount: 0,
+ selectedBills: [], // 勾选的账单集合
};
},
onLoad() {
- this.loadRecords();
+ this.loadBills();
+ },
+ onShow(){
},
methods: {
- // 模拟加载账单
- loadRecords() {
- this.records = [
- {
- id: 1,
- feeName: '电费(2025.10)',
- dueDate: '2025-11-20',
- amount: 120.5,
- },
- {
- id: 2,
- feeName: '水费(2025.10)',
- dueDate: '2025-11-22',
- amount: 60.2,
- },
+ loadBills() {
+ this.bills = [
+ {
+ id: 1,
+ feeName: '电费(2025.10)',
+ dueDate: '2025-11-20',
+ amount: 120.5,
+ checked: false
+ },
+ {
+ id: 2,
+ feeName: '水费(2025.10)',
+ dueDate: '2025-11-22',
+ amount: 60.2,
+ checked: false
+ }
];
+ this.updateSelected();
},
refresh() {
this.isRefreshing = true;
setTimeout(() => {
- this.loadRecords();
+ this.loadBills();
this.isRefreshing = false;
}, 1000);
},
- loadMore() {
- this.loadStatus = 'nomore';
- },
- toggleSelect(id) {
- const idx = this.selectedIds.indexOf(id);
- if (idx > -1) {
- this.selectedIds.splice(idx, 1);
- } else {
- this.selectedIds.push(id);
- }
- },
- paySingle(item) {
- uni.showModal({
- title: '确认支付',
- content: `确认支付 ¥${item.amount} 吗?`,
- success: (res) => {
- if (res.confirm) {
- this.createOrder([item.id]);
- }
- },
- });
- },
- batchPay() {
- uni.showModal({
- title: '批量缴费',
- content: `确认支付 ${this.selectedIds.length} 项账单?`,
- success: (res) => {
- if (res.confirm) {
- this.createOrder(this.selectedIds);
- }
- },
- });
- },
- // 模拟调用后端生成支付订单
- createOrder(ids) {
- console.log('创建支付订单:', ids);
- uni.showToast({
- title: '生成支付订单中...',
- icon: 'loading',
- });
- // 模拟延迟 + 支付调用
- setTimeout(() => {
- uni.showToast({
- title: '支付成功',
- icon: 'success',
- });
- // 清空选择
- this.selectedIds = [];
- }, 1200);
+ loadMore() {
+ this.loadStatus = 'noMore';
},
- },
+
+ formatMoney(val) {
+ if (val === null || val === undefined || isNaN(val)) return '—';
+
+ val = Number(val);
+
+ if (val >= 10000) {
+ return '¥' + (val / 10000).toFixed(2) + '万';
+ }
+
+ return '¥' + val.toFixed(2);
+ },
+ toggleCheck(item) {
+ item.checked = !item.checked;
+ if(item.checked && !this.selectedBills.some(b => b.id === item.id)) {
+ this.selectedBills.push(item);
+ }else{
+ // 取消勾选时从已选数组移除
+ this.selectedBills = this.selectedBills.filter(b => b.id !== item.id);
+ }
+ let sumFee = 0;
+ this.selectedBills.forEach(b => sumFee += b.amount);
+ this.sumAmount = sumFee;
+ },
+ updateSelected() {
+ if (!Array.isArray(this.bills)) return;
+ this.selectedBills = this.bills.filter(b => b.checked);
+ },
+ goPayTest(billList) {
+ if (!billList || billList.length === 0) return;
+
+ // 模拟后台生成订单返回
+ const order = {
+ timeStamp: String(Date.now()), // 时间戳
+ nonceStr: Math.random().toString(36).substr(2, 15), // 随机字符串
+ package: 'prepay_id=TEST1234567890', // 模拟预支付ID
+ signType: 'MD5',
+ paySign: 'TEST_SIGN', // 模拟签名
+ };
+
+ // 调用微信支付接口(测试)
+ uni.requestPayment({
+ ...order,
+ success: () => {
+ uni.showToast({ title: '支付成功(测试)', icon: 'success' });
+ // 清空勾选状态
+ billList.forEach(b => b.checked = false);
+ this.updateSelected();
+ // 刷新列表(可选)
+ this.loadBills();
+ },
+ fail: () => {
+ uni.showToast({ title: '支付失败(测试)', icon: 'none' });
+ }
+ });
+ },
+ async goPay(billList) {
+ if (!billList || billList.length === 0) return;
+
+ try {
+ // 1. 请求后台生成订单
+ const res = await uni.request({
+ url: 'https://api.example.com/payments/create',
+ method: 'POST',
+ data: {
+ userId: this.userId,
+ bills: billList.map(b => b.id),
+ }
+ });
+
+ if (res[1].data.code !== 0) {
+ uni.showToast({ title: res[1].data.msg, icon: 'none' });
+ return;
+ }
+
+ const order = res[1].data.data; // 后台返回的支付参数
+
+ // 2. 调用微信支付
+ uni.requestPayment({
+ timeStamp: order.timeStamp,
+ nonceStr: order.nonceStr,
+ package: order.package,
+ signType: order.signType,
+ paySign: order.paySign,
+ success: () => {
+ uni.showToast({ title: '支付成功', icon: 'success' });
+ // 更新勾选状态
+ billList.forEach(b => b.checked = false);
+ this.updateSelected();
+ // 刷新列表
+ this.loadBills();
+ },
+ fail: () => {
+ uni.showToast({ title: '支付失败', icon: 'none' });
+ }
+ });
+
+ } catch (error) {
+ console.error('支付请求失败', error);
+ uni.showToast({ title: '支付请求失败', icon: 'none' });
+ }
+},
+ }
};
diff --git a/static/login.mp4 b/static/login.mp4
new file mode 100644
index 0000000..6daad34
Binary files /dev/null and b/static/login.mp4 differ
diff --git a/static/loginbg1.jpg b/static/loginbg1.jpg
new file mode 100644
index 0000000..474021f
Binary files /dev/null and b/static/loginbg1.jpg differ
diff --git a/static/loginbg2.jpg b/static/loginbg2.jpg
new file mode 100644
index 0000000..c99c793
Binary files /dev/null and b/static/loginbg2.jpg differ