From 638508638d9d31c5baa493797df82c1d25de8387 Mon Sep 17 00:00:00 2001
From: aaron <>
Date: Wed, 12 Mar 2025 00:54:41 +0800
Subject: [PATCH] update
---
Dockerfile | 4 +-
src/api/finance.js | 8 ++
src/layouts/AdminLayout.vue | 11 +-
src/router/index.js | 6 +
src/utils/format.js | 71 ++++++++++
src/views/AccountDetails.vue | 245 +++++++++++++++++++++++++++++++++++
src/views/Finance.vue | 46 +++++--
7 files changed, 374 insertions(+), 17 deletions(-)
create mode 100644 src/utils/format.js
create mode 100644 src/views/AccountDetails.vue
diff --git a/Dockerfile b/Dockerfile
index 180081e..fd360ac 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -29,8 +29,8 @@ WORKDIR /app
# 复制 package.json 和 yarn.lock
COPY package.json yarn.lock* ./
-# 安装依赖,确保 dotenv 被正确安装
-RUN yarn install --frozen-lockfile && \
+# 安装所有依赖,包括开发依赖
+RUN yarn install --frozen-lockfile --production=false && \
yarn add dotenv@16.3.1 --exact
# 复制项目文件
diff --git a/src/api/finance.js b/src/api/finance.js
index 873f964..f294835 100644
--- a/src/api/finance.js
+++ b/src/api/finance.js
@@ -79,4 +79,12 @@ export function cancelWithdraw(withdrawId) {
url: `/api/withdraw/${withdrawId}/cancel`,
method: 'post'
});
+}
+
+export function getAccountDetails(params) {
+ return request({
+ url: '/api/account/details',
+ method: 'get',
+ params
+ });
}
\ No newline at end of file
diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue
index 880f799..86e5308 100644
--- a/src/layouts/AdminLayout.vue
+++ b/src/layouts/AdminLayout.vue
@@ -31,6 +31,11 @@
银行卡管理
+
+ $router.push('/finance/account-details')">
+
+ 账户明细
+
$router.push('/user/auth')">
@@ -101,7 +106,8 @@ import {
DollarOutlined,
CreditCardOutlined,
WalletOutlined,
- UserOutlined
+ UserOutlined,
+ ProfileOutlined
} from '@ant-design/icons-vue';
export default {
@@ -112,7 +118,8 @@ export default {
DollarOutlined,
CreditCardOutlined,
WalletOutlined,
- UserOutlined
+ UserOutlined,
+ ProfileOutlined
},
setup() {
const store = useStore();
diff --git a/src/router/index.js b/src/router/index.js
index 4cf9515..1adc4ea 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -40,6 +40,12 @@ const routes = [
component: () => import('../views/BankCard.vue'),
meta: { title: '银行卡管理', parentTitle: '财务管理', icon: 'credit-card' }
},
+ {
+ path: 'finance/account-details',
+ name: 'FinanceAccountDetails',
+ component: () => import('../views/AccountDetails.vue'),
+ meta: { title: '账户明细', parentTitle: '财务管理', icon: 'profile' }
+ },
{
path: 'bank-card',
name: 'BankCard',
diff --git a/src/utils/format.js b/src/utils/format.js
new file mode 100644
index 0000000..7ecb0be
--- /dev/null
+++ b/src/utils/format.js
@@ -0,0 +1,71 @@
+/**
+ * 格式化日期时间
+ * @param {string|Date} date - 日期对象或日期字符串
+ * @param {string} format - 格式化模式,默认为 'YYYY-MM-DD HH:mm:ss'
+ * @returns {string} - 格式化后的日期字符串
+ */
+export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
+ if (!date) return '-';
+
+ const d = typeof date === 'string' ? new Date(date) : date;
+
+ // 检查日期是否有效
+ if (isNaN(d.getTime())) {
+ return '-';
+ }
+
+ const year = d.getFullYear();
+ const month = String(d.getMonth() + 1).padStart(2, '0');
+ const day = String(d.getDate()).padStart(2, '0');
+ const hours = String(d.getHours()).padStart(2, '0');
+ const minutes = String(d.getMinutes()).padStart(2, '0');
+ const seconds = String(d.getSeconds()).padStart(2, '0');
+
+ return format
+ .replace('YYYY', year)
+ .replace('MM', month)
+ .replace('DD', day)
+ .replace('HH', hours)
+ .replace('mm', minutes)
+ .replace('ss', seconds);
+}
+
+/**
+ * 格式化金额,保留两位小数
+ * @param {number|string} amount - 金额
+ * @param {number} decimals - 小数位数,默认为2
+ * @param {string} prefix - 前缀,默认为空
+ * @returns {string} - 格式化后的金额字符串
+ */
+export function formatAmount(amount, decimals = 2, prefix = '') {
+ if (amount === undefined || amount === null) return `${prefix}0.00`;
+
+ const num = parseFloat(amount);
+ if (isNaN(num)) return `${prefix}0.00`;
+
+ return `${prefix}${num.toFixed(decimals)}`;
+}
+
+/**
+ * 格式化手机号码,中间四位显示为星号
+ * @param {string} phone - 手机号码
+ * @returns {string} - 格式化后的手机号码
+ */
+export function formatPhone(phone) {
+ if (!phone || phone.length < 11) return phone;
+
+ return `${phone.substring(0, 3)}****${phone.substring(7)}`;
+}
+
+/**
+ * 格式化银行卡号,仅显示后四位
+ * @param {string} cardNumber - 银行卡号
+ * @returns {string} - 格式化后的银行卡号
+ */
+export function formatBankCard(cardNumber) {
+ if (!cardNumber) return '';
+
+ if (cardNumber.length <= 4) return cardNumber;
+
+ return `**** **** **** ${cardNumber.slice(-4)}`;
+}
\ No newline at end of file
diff --git a/src/views/AccountDetails.vue b/src/views/AccountDetails.vue
new file mode 100644
index 0000000..87c8d2e
--- /dev/null
+++ b/src/views/AccountDetails.vue
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+
+
+
+
+
+ 收入
+ 支出
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+ {{ record.type === 'INCOME' ? '+' : '-' }}{{ record.amount.toFixed(2) }}
+
+
+
+
+
+
+ {{ record.type === 'INCOME' ? '收入' : '支出' }}
+
+
+
+
+
+ {{ record.transaction_id }}
+ -
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/Finance.vue b/src/views/Finance.vue
index 8efe6f5..46cf671 100644
--- a/src/views/Finance.vue
+++ b/src/views/Finance.vue
@@ -15,6 +15,9 @@
¥
{{ accountInfo.total_balance || '0.00' }}
+
@@ -177,8 +180,8 @@