From df1992a1c3ca982b1432aaf41668bb8437d02a2d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 11 八月 2025 17:52:11 +0800
Subject: [PATCH] 登录页联调开发,首页开发,销售台账开发,添加依赖

---
 src/pages/index.vue                            |  707 +++++++++++++++++++++-
 src/api/salesManagement/invoiceLedger.js       |   92 ++
 src/pages.json                                 |   14 
 src/pages/sales/salesAccount/index.vue         |  392 ++++++++++++
 pnpm-lock.yaml                                 |   60 +
 src/pages/login.vue                            |    5 
 src/api/salesManagement/salesLedger.js         |  111 +++
 src/pages/sales/salesAccount/detail.vue        |  279 +++++++++
 src/main.js                                    |    3 
 package.json                                   |    1 
 src/api/salesManagement/invoiceRegistration.js |   54 +
 src/App.vue                                    |    2 
 src/api/salesManagement/receiptPayment.js      |   84 ++
 13 files changed, 1,730 insertions(+), 74 deletions(-)

diff --git a/package.json b/package.json
index 4941835..c976fd4 100644
--- a/package.json
+++ b/package.json
@@ -78,6 +78,7 @@
     "pinia": "2.2.2",
     "tslib": "^2.7.0",
     "uview-plus": "^3.4.62",
+    "vant": "^4.9.21",
     "vue": "3.4.21",
     "vue-i18n": "^9.14.2"
   },
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dc01d28..b41ce8c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -84,8 +84,11 @@
         specifier: ^2.7.0
         version: 2.7.0
       uview-plus:
-        specifier: ^3.3.32
-        version: 3.3.36
+        specifier: ^3.4.62
+        version: 3.4.84
+      vant:
+        specifier: ^4.9.21
+        version: 4.9.21(vue@3.4.21(typescript@5.6.3))
       vue:
         specifier: 3.4.21
         version: 3.4.21(typescript@5.6.3)
@@ -1313,35 +1316,30 @@
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm64-glibc@2.4.1':
     resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm64-musl@2.4.1':
     resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-linux-x64-glibc@2.4.1':
     resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-x64-musl@2.4.1':
     resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-win32-arm64@2.4.1':
     resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==}
@@ -1401,55 +1399,46 @@
     resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.24.0':
     resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
     cpu: [arm]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.24.0':
     resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.24.0':
     resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
     resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
     cpu: [ppc64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.24.0':
     resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
     cpu: [riscv64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-s390x-gnu@4.24.0':
     resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
     cpu: [s390x]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.24.0':
     resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.24.0':
     resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.24.0':
     resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
@@ -1520,6 +1509,14 @@
 
   '@uview-plus/types@3.2.5':
     resolution: {integrity: sha512-Zblby3WEN5d+NqS/UGs+1W5T55rs5zJw5eGKLUYoU5lKFm1arrlobbjA9/U481q68gBb7xA2775KKfk0FU5nnA==}
+
+  '@vant/popperjs@1.3.0':
+    resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==}
+
+  '@vant/use@1.6.0':
+    resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==}
+    peerDependencies:
+      vue: ^3.0.0
 
   '@vitejs/plugin-legacy@5.3.2':
     resolution: {integrity: sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==}
@@ -1634,6 +1631,9 @@
 
   '@vue/shared@3.5.12':
     resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
+
+  '@vue/shared@3.5.18':
+    resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==}
 
   '@vue/tsconfig@0.5.1':
     resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==}
@@ -3834,13 +3834,18 @@
     resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
     engines: {node: '>= 0.4.0'}
 
-  uview-plus@3.3.36:
-    resolution: {integrity: sha512-yiIIt3OkCDkBzflrr6by8qvYibvCzsFZ/Mn+Fdx9TDaTQAltWFBj7UNVN/wOeb3lou2T5S1QFy2rxw3OcAYi5g==}
-    engines: {HBuilderX: ^3.1.0}
+  uview-plus@3.4.84:
+    resolution: {integrity: sha512-JIDgO3sIj3XmmbOAK1GefJt2NZHqDTYO8We/aNcyAml3QYXAq8HRIOdO66Vg+fjLwAkeH65X1IgKkYzwxM2xKQ==}
+    engines: {HBuilderX: ^3.1.0, uni-app: ^4.66, uni-app-x: ''}
 
   v8-to-istanbul@8.1.1:
     resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==}
     engines: {node: '>=10.12.0'}
+
+  vant@4.9.21:
+    resolution: {integrity: sha512-hXUoZMrLLjykimFRLDlGNd+K2iYSRh9YwLMKnsVdVZ+9inUKxpqnjhOqlZwocbnYkvJlS+febf9u9aJpDol4Pw==}
+    peerDependencies:
+      vue: ^3.0.0
 
   vary@1.1.2:
     resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
@@ -6225,6 +6230,12 @@
 
   '@uview-plus/types@3.2.5': {}
 
+  '@vant/popperjs@1.3.0': {}
+
+  '@vant/use@1.6.0(vue@3.4.21(typescript@5.6.3))':
+    dependencies:
+      vue: 3.4.21(typescript@5.6.3)
+
   '@vitejs/plugin-legacy@5.3.2(terser@5.34.1)(vite@5.2.8(@types/node@22.7.5)(less@4.2.0)(sass@1.79.5)(terser@5.34.1))':
     dependencies:
       '@babel/core': 7.25.8
@@ -6412,6 +6423,8 @@
   '@vue/shared@3.4.21': {}
 
   '@vue/shared@3.5.12': {}
+
+  '@vue/shared@3.5.18': {}
 
   '@vue/tsconfig@0.5.1': {}
 
@@ -8882,7 +8895,7 @@
 
   utils-merge@1.0.1: {}
 
-  uview-plus@3.3.36:
+  uview-plus@3.4.84:
     dependencies:
       clipboard: 2.0.11
       dayjs: 1.11.13
@@ -8893,6 +8906,13 @@
       convert-source-map: 1.9.0
       source-map: 0.7.4
 
+  vant@4.9.21(vue@3.4.21(typescript@5.6.3)):
+    dependencies:
+      '@vant/popperjs': 1.3.0
+      '@vant/use': 1.6.0(vue@3.4.21(typescript@5.6.3))
+      '@vue/shared': 3.5.18
+      vue: 3.4.21(typescript@5.6.3)
+
   vary@1.1.2: {}
 
   vite@5.2.8(@types/node@22.7.5)(less@4.2.0)(sass@1.79.5)(terser@5.34.1):
diff --git a/src/App.vue b/src/App.vue
index fdd16e8..f664715 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,6 +1,6 @@
 <template>
   <Splash v-if="showSplash" />
-  <div v-else>
+	<div v-else>
     <router-view />
   </div>
 </template>
diff --git a/src/api/salesManagement/invoiceLedger.js b/src/api/salesManagement/invoiceLedger.js
new file mode 100644
index 0000000..6a54493
--- /dev/null
+++ b/src/api/salesManagement/invoiceLedger.js
@@ -0,0 +1,92 @@
+// 寮�绁ㄥ彴璐﹂〉闈㈡帴鍙�
+import request from '@/utils/request'
+
+// 鍒嗛〉鏌ヨ
+export function invoiceLedgerList(query) {
+    return request({
+        url: '/invoiceLedger/page',
+        method: 'get',
+        params: query
+    })
+}
+
+// 鏂板
+export function invoiceLedgerSaveOrUpdate(query) {
+    return request({
+        url: '/invoiceLedger/saveOrUpdate',
+        method: 'post',
+        data: query
+    })
+}
+
+// 寮�绁ㄥ彴璐﹀垹闄�
+export function invoiceLedgerDel(query) {
+    return request({
+        url: '/invoiceLedger/del',
+        method: 'delete',
+        data: query
+    })
+}
+
+// 璇︽儏鏌ヨ
+export function invoiceLedgerDetail(query) {
+    return request({
+        url: '/invoiceLedger/info',
+        method: 'get',
+        params: query
+    })
+}
+
+// 闄勪欢鎻愪氦
+export function commitFile(query) {
+    return request({
+        url: '/invoiceLedger/commitFile',
+        method: 'post',
+        data: query
+    })
+}
+
+// 寮�绁ㄥ彴璐﹂儴鍒嗕篃鏌ヨ
+export function invoiceLedgerListNoPage(query) {
+    return request({
+        url: '/invoiceLedger/list',
+        method: 'get',
+        data: query
+    })
+}
+
+// 鍒嗛〉鏌ヨ
+export function invoiceLedgerSalesAccount(query) {
+    return request({
+        url: '/invoiceLedger/salesAccount',
+        method: 'get',
+        params: query
+    })
+}
+
+// 浜у搧寮�绁ㄨ褰曞垎椤垫煡璇�
+export function registrationProductPage(query) {
+    return request({
+        url: '/invoiceLedger/registrationProductPage',
+        method: 'get',
+        params: query
+    })
+}
+
+// 浜у搧寮�绁ㄨ鎯呮煡璇�
+export function invoiceLedgerProductInfo(query) {
+    return request({
+        url: '/invoiceLedger/invoiceLedgerProductInfo',
+        method: 'get',
+        params: query
+    })
+}
+
+export function delInvoiceLedgerByRegProductId(invoiceRegistrationProductId) {
+    return request({
+        url: '/invoiceLedger/delInvoiceLedger/'+ invoiceRegistrationProductId,
+        method: 'delete'
+    })
+}
+
+
diff --git a/src/api/salesManagement/invoiceRegistration.js b/src/api/salesManagement/invoiceRegistration.js
new file mode 100644
index 0000000..4bc33ce
--- /dev/null
+++ b/src/api/salesManagement/invoiceRegistration.js
@@ -0,0 +1,54 @@
+// 閿�鍞彴璐﹂〉闈㈡帴鍙�
+import request from '@/utils/request'
+
+// 鍒嗛〉鏌ヨ
+export function invoiceRegistrationList(query) {
+    return request({
+        url: '/invoiceRegistration/listPage',
+        method: 'get',
+        params: query
+    })
+}
+// 寮�绁ㄧ櫥璁版柊澧�
+export function invoiceRegistrationSave(query) {
+    return request({
+        url: '/invoiceRegistration/save',
+        method: 'post',
+        data: query
+    })
+}
+// 寮�绁ㄧ櫥璁板垹闄�
+export function invoiceRegistrationDel(query) {
+    return request({
+        url: '/invoiceRegistration/del',
+        method: 'delete',
+        data: query
+    })
+}
+// 瀛愯〃鏍兼煡璇�
+export function productList(query) {
+    return request({
+        url: '/invoiceRegistration/productList',
+        method: 'get',
+        params: query
+    })
+}
+
+// 寮�绁ㄧ櫥璁拌鎯�
+export function invoiceRegistrationDetail(query) {
+    return request({
+        url: '/invoiceRegistration/detail',
+        method: 'get',
+        params: query
+    })
+}
+
+// 瀵煎嚭寮�绁ㄧ櫥璁�
+export function invoiceRegistrationExport(query) {
+    return request({
+        url: '/invoiceRegistration/export',
+        method: 'get',
+        params: query,
+        responseType: 'blob'
+    })
+}
diff --git a/src/api/salesManagement/receiptPayment.js b/src/api/salesManagement/receiptPayment.js
new file mode 100644
index 0000000..b5d0cf5
--- /dev/null
+++ b/src/api/salesManagement/receiptPayment.js
@@ -0,0 +1,84 @@
+// 寮�绁ㄧ櫥璁伴〉闈㈡帴鍙�
+import request from '@/utils/request'
+
+// 鏂板/淇敼
+export function receiptPaymentSaveOrUpdate(query) {
+    return request({
+        url: '/receiptPayment/saveOrUpdate',
+        method: 'post',
+        data: query
+    })
+}
+
+// 瀹㈡埛寰�鏉ヨ褰曟煡璇�
+export function customerInteractions(query) {
+    return request({
+        url: '/receiptPayment/customerInteractions',
+        method: 'get',
+        params: query
+    })
+}
+
+// 璇︽儏
+export function receiptPaymentInfo(query) {
+    return request({
+        url: '/receiptPayment/info',
+        method: 'get',
+        params: query
+    })
+}
+
+// 鍒犻櫎
+export function receiptPaymentDel(query) {
+    return request({
+        url: '/receiptPayment/del',
+        method: 'delete',
+        data: query
+    })
+}
+
+// 鏌ヨ宸茬粡缁戝畾鍙戠エ鐨勫紑绁ㄥ彴璐�
+export function bindInvoiceNoRegPage(query) {
+    return request({
+        url: '/receiptPayment/bindInvoiceNoRegPage',
+        method: 'get',
+        params: query
+    })
+}
+
+// 寮�绁ㄥ彴璐﹁鎯�
+export function invoiceInfo(query) {
+    return request({
+        url: '/receiptPayment/invoiceInfo',
+        method: 'get',
+        params: query
+    })
+}
+
+// 璇㈠洖娆捐褰�
+export function receiptPaymentHistoryList(query) {
+    return request({
+        url: '/receiptPayment/receiptPaymentHistoryList',
+        method: 'get',
+        params: query
+    })
+}
+
+/**
+ * 鏌ヨ鍥炴璁板綍鍒嗛〉鏌ヨ
+ */
+export function receiptPaymentHistoryListPage(query) {
+    return request({
+        url: '/receiptPayment/receiptPaymentHistoryListPage',
+        method: 'get',
+        params: query
+    })
+}
+
+export function receiptPaymentHistoryListNoPage(query) {
+    return request({
+        url: '/receiptPayment/receiptPaymentHistoryListNoPage',
+        method: 'get',
+        params: query
+    })
+}
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
new file mode 100644
index 0000000..3a2fa22
--- /dev/null
+++ b/src/api/salesManagement/salesLedger.js
@@ -0,0 +1,111 @@
+// 閿�鍞彴璐﹂〉闈㈡帴鍙�
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function ledgerList(query) {
+  return request({
+    url: "/sales/ledger/list",
+    method: "get",
+    params: query,
+  });
+}
+// 瀛愯〃鏍兼煡璇�
+export function productList(query) {
+  return request({
+    url: "/sales/product/list",
+    method: "get",
+    params: query,
+  });
+}
+// 鏌ヨ瀹㈡埛鍚嶇О鍒楄〃
+export function customerList(query) {
+  return request({
+    url: "/basic/customer/customerList",
+    method: "get",
+    params: query,
+  });
+}
+// 鏂板銆佷慨鏀归攢鍞彴璐�
+export function addOrUpdateSalesLedger(query) {
+  return request({
+    url: "/sales/ledger/addOrUpdateSalesLedger",
+    method: "post",
+    data: query,
+  });
+}
+// 鍒犻櫎閿�鍞彴璐�
+export function delLedger(query) {
+  return request({
+    url: "/sales/ledger/delLedger",
+    method: "delete",
+    data: query,
+  });
+}
+// 鏌ヨ閿�鍞彴璐﹁鎯�
+export function getSalesLedgerWithProducts(query) {
+  return request({
+    url: "/sales/ledger/getSalesLedgerWithProducts",
+    method: "get",
+    params: query,
+  });
+}
+// 瀹炴椂淇敼浜у搧淇℃伅
+export function addOrUpdateSalesLedgerProduct(query) {
+  return request({
+    url: "/sales/product/addOrUpdateSalesLedgerProduct",
+    method: "post",
+    data: query,
+  });
+}
+// 鍒犻櫎浜у搧
+export function delProduct(query) {
+  return request({
+    url: "/sales/product/delProduct",
+    method: "delete",
+    data: query,
+  });
+}
+// 涓婁紶闄勪欢
+export function upload(query) {
+  return request({
+    url: "/file/upload",
+    method: "post",
+    data: query,
+    responseType: "blob",
+  });
+}
+// 缂栬緫鏃跺垹闄ら檮浠�
+export function delLedgerFile(query) {
+  return request({
+    url: "/sales/ledger/delLedgerFile",
+    method: "delete",
+    data: query,
+  });
+}
+
+// 閿�鍞笉鍒嗛〉鏌ヨ
+export function ledgerListNoPage(query) {
+  return request({
+    url: "/sales/ledger/listNoPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍒嗛〉鏌ヨ
+export function ledgerListPage(query) {
+  return request({
+    url: "/sales/ledger/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏍规嵁閿�鍞悎鍚屽彿鏌ヤ骇鍝佷俊鎭�
+export function getProductInfoByContractNo(query) {
+  return request({
+    url: "/purchase/ledger/getProductBySalesNo",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/main.js b/src/main.js
index 021ac8f..fc8d022 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,6 +2,8 @@
 import plugins from './plugins'
 import store from './store'
 import uviewPlus from 'uview-plus'
+import Vant from 'vant';
+import 'vant/lib/index.css';
 
 
 import { createSSRApp } from 'vue'
@@ -17,6 +19,7 @@
   app.use(store)
   app.use(uviewPlus)
   app.use(plugins)
+  app.use(Vant)
 
   // #ifndef MP-WEIXIN
   // 寰俊灏忕▼搴忎腑涓嶆敮鎸佽嚜瀹氫箟鎸囦护
diff --git a/src/pages.json b/src/pages.json
index 7a30555..ef5ee74 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -50,6 +50,20 @@
       }
     },
     {
+      "path": "pages/sales/salesAccount/index",
+      "style": {
+        "navigationBarTitleText": "閿�鍞彴璐�",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/sales/salesAccount/detail",
+      "style": {
+        "navigationBarTitleText": "鍙拌处璇︽儏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
       "path": "pages/common/webview/index",
       "style": {
         "navigationBarTitleText": "娴忚缃戦〉"
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 3cad7a1..e35f5e3 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -1,43 +1,155 @@
 <template>
   <view class="content">
-		<view>
+		<view class="header-section">
 			<view class="currentFactory">
-				<up-text type="primary" :text="userStore.currentFactoryName" @click="show = true"
+				<up-text type="primary" :text="userStore.currentFactoryName" @click="show = true" size="18"
 								 class="factoryName" suffixIcon="arrow-right" :iconStyle="iconStyle"></up-text>
 			</view>
 			<up-picker :show="show" :columns="factoryList" @confirm="changeFactory"></up-picker>
-			<view>
-				<view class="bg-img"></view>
-			</view>
+		</view>
+		
+		<view class="hero-section">
 			<view class="bg-img">
+				<view class="hero-content">
+					<text class="hero-title">浜у搧搴撳瓨绠$悊绯荤粺</text>
+				</view>
+			</view>
+		</view>
+		
+		<view class="notice-section">
+			<view class="notice">
+				<view class="notice-content">
+					<view class="notice-left">
+						<text class="notice-status">馃搳 瀹炴椂鐩戞帶</text>
+					</view>
+					<view class="notice-separator"></view>
+					<view class="notice-right">
+						<text class="notice-label">{{currentStatus}}</text>
+						<text class="notice-text">褰撴棩閿�鍞澶囨暟:<text class="notice-number">{{number}}<text class="notice-unit">涓�</text></text></text>
+					</view>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 钀ラ攢绠$悊妯″潡 -->
+		<view class="common-module marketing-module">
+			<view class="module-header">
+				<view class="module-title-container">
+					<text class="module-title">钀ラ攢绠$悊</text>
+				</view>
+			</view>
+			<view class="module-content">
 				<up-grid
 					:border="false"
 					col="4"
 				>
 					<up-grid-item
-						v-for="(listItem,listIndex) in list"
-						:key="listIndex"
+						v-for="(item, index) in marketingItems"
+						:key="index"
+						@click="handleCommonItemClick(item)"
 					>
-						<up-icon
-							:customStyle="{paddingTop:20+'rpx'}"
-							:name="listItem.name"
-							:size="22"
-						></up-icon>
-						<text class="grid-text">{{listItem.title}}</text>
+						<view class="icon-container" :style="{ background: item.bgColor }">
+							<up-icon
+								:name="item.icon"
+								:size="26"
+								color="#ffffff"
+							></up-icon>
+						</view>
+						<text class="item-label">{{item.label}}</text>
 					</up-grid-item>
 				</up-grid>
 			</view>
 		</view>
-<!--		<view class="select-container">-->
-<!--			<up-picker-data-->
-<!--				class="picker"-->
-<!--				v-model="currentFatoryId"-->
-<!--				title="璇烽�夋嫨鍏徃"-->
-<!--				:options="factoryList"-->
-<!--				valueKey="id"-->
-<!--				labelKey="name">-->
-<!--			</up-picker-data>-->
-<!--		</view>-->
+		
+		<!-- 閲囪喘绠$悊妯″潡 -->
+		<view class="common-module purchase-module">
+			<view class="module-header">
+				<view class="module-title-container">
+					<text class="module-title">閲囪喘绠$悊</text>
+				</view>
+			</view>
+			<view class="module-content">
+				<up-grid
+					:border="false"
+					col="4"
+				>
+					<up-grid-item
+						v-for="(item, index) in purchaseItems"
+						:key="index"
+						@click="handleCommonItemClick(item)"
+					>
+						<view class="icon-container" :style="{ background: item.bgColor }">
+							<up-icon
+								:name="item.icon"
+								:size="26"
+								color="#ffffff"
+							></up-icon>
+						</view>
+						<text class="item-label">{{item.label}}</text>
+					</up-grid-item>
+				</up-grid>
+			</view>
+		</view>
+		
+		<!-- 鍗忓悓鍔炲叕妯″潡 -->
+		<view class="common-module collaboration-module">
+			<view class="module-header">
+				<view class="module-title-container">
+					<text class="module-title">鍗忓悓鍔炲叕</text>
+				</view>
+			</view>
+			<view class="module-content">
+				<up-grid
+					:border="false"
+					col="4"
+				>
+					<up-grid-item
+						v-for="(item, index) in collaborationItems"
+						:key="index"
+						@click="handleCommonItemClick(item)"
+					>
+						<view class="icon-container" :style="{ background: item.bgColor }">
+							<up-icon
+								:name="item.icon"
+								:size="26"
+								color="#ffffff"
+							></up-icon>
+						</view>
+						<text class="item-label">{{item.label}}</text>
+					</up-grid-item>
+				</up-grid>
+			</view>
+		</view>
+		
+		<!-- 璁惧绠$悊妯″潡 -->
+		<view class="common-module equipment-module">
+			<view class="module-header">
+				<view class="module-title-container">
+					<text class="module-title">璁惧绠$悊</text>
+				</view>
+			</view>
+			<view class="module-content">
+				<up-grid
+					:border="false"
+					col="4"
+				>
+					<up-grid-item
+						v-for="(item, index) in equipmentItems"
+						:key="index"
+						@click="handleCommonItemClick(item)"
+					>
+						<view class="icon-container" :style="{ background: item.bgColor }">
+							<up-icon
+								:name="item.icon"
+								:size="26"
+								color="#ffffff"
+							></up-icon>
+						</view>
+						<text class="item-label">{{item.label}}</text>
+					</up-grid-item>
+				</up-grid>
+			</view>
+		</view>
   </view>
 </template>
 
@@ -53,36 +165,142 @@
 const factoryList = ref([]);
 const factoryListTem = ref([]);
 const iconStyle = {
-	fontSize: '14px',
-	color: '#165DFF'
+	fontSize: '18px',
+	color: '#2979ff'
 }
-// 鍒涘缓鍝嶅簲寮忔暟鎹�
-const list = reactive([
+
+// 閫氱煡鐘舵�佸垏鎹�
+const statusList = ['閿�鍞�', '閲囪喘']
+let statusIndex = 0
+const currentStatus = ref(statusList[0])
+const number = ref(7643)
+
+// 瀹氭椂鍣ㄥ垏鎹㈤�氱煡鐘舵��
+const startStatusTimer = () => {
+	setInterval(() => {
+		statusIndex = (statusIndex + 1) % statusList.length
+		currentStatus.value = statusList[statusIndex]
+	}, 3000)
+}
+
+// 钀ラ攢绠$悊鍔熻兘鏁版嵁
+const marketingItems = reactive([
 	{
-		name: 'photo',
-		title: '鍥剧墖'
+		icon: 'account',
+		label: '閿�鍞彴璐�',
+		bgColor: '#2979ff'
 	},
 	{
-		name: 'lock',
-		title: '閿佸ご'
+		icon: 'home',
+		label: '寮�绁ㄧ櫥璁�',
+		bgColor: '#1976d2'
 	},
 	{
-		name: 'star',
-		title: '鏄熸槦'
+		icon: 'file-text',
+		label: '寮�绁ㄥ彴璐�',
+		bgColor: '#42a5f5'
 	},
 	{
-		name: 'hourglass',
-		title: '娌欐紡'
+		icon: 'shopping-cart',
+		label: '鍥炴鐧昏',
+		bgColor: '#64b5f6'
 	},
 	{
-		name: 'home',
-		title: '棣栭〉'
+		icon: 'chat',
+		label: '鍥炴娴佹按',
+		bgColor: '#90caf9'
 	},
 	{
-		name: 'volume', // 娉ㄦ剰锛氳繖閲屼慨鏀逛簡 name 浠� 'star' 鏀逛负 'volume'锛屼互閬垮厤鍒楄〃涓袱涓厓绱犲叿鏈夌浉鍚岀殑 name
-		title: '闊抽噺'
+		icon: 'chat',
+		label: '瀹㈡埛寰�鏉�',
+		bgColor: '#90caf9'
+	}
+]);
+
+// 閲囪喘绠$悊鍔熻兘鏁版嵁
+const purchaseItems = reactive([
+	{
+		icon: 'order',
+		label: '閲囪喘鍙拌处',
+		bgColor: '#bbdefb'
+	},
+	{
+		icon: 'truck',
+		label: '鏉ョエ鐧昏',
+		bgColor: '#e3f2fd'
+	},
+	{
+		icon: 'box',
+		label: '鏉ョエ鍙拌处',
+		bgColor: '#f3e5f5'
+	},
+	{
+		icon: 'chart-line',
+		label: '浠樻鐧昏',
+		bgColor: '#e8eaf6'
+	},
+	{
+		icon: 'settings',
+		label: '浠樻娴佹按',
+		bgColor: '#f1f8e9'
+	},
+	{
+		icon: 'settings',
+		label: '渚涘簲鍟嗗線鏉�',
+		bgColor: '#f1f8e9'
 	},
 ]);
+
+// 鍗忓悓鍔炲叕鍔熻兘鏁版嵁
+const collaborationItems = reactive([
+	{
+		icon: 'checkmark-circle',
+		label: '鍗忓悓瀹℃壒',
+		bgColor: '#4caf50'
+	},
+	{
+		icon: 'map-pin',
+		label: '瀹㈡埛鎷滆',
+		bgColor: '#ff9800'
+	}
+]);
+
+// 璁惧绠$悊鍔熻兘鏁版嵁
+const equipmentItems = reactive([
+	{
+		icon: 'list',
+		label: '璁惧鍙拌处',
+		bgColor: '#9c27b0'
+	},
+	{
+		icon: 'wrench',
+		label: '璁惧鎶ヤ慨',
+		bgColor: '#f44336'
+	},
+	{
+		icon: 'shield-check',
+		label: '璁惧淇濆吇',
+		bgColor: '#00bcd4'
+	}
+]);
+
+// 澶勭悊甯哥敤鍔熻兘鐐瑰嚮
+const handleCommonItemClick = (item) => {
+	// 鏍规嵁涓嶅悓鐨勫姛鑳介」杩涜璺宠浆
+	switch (item.label) {
+		case '閿�鍞彴璐�':
+			uni.navigateTo({
+				url: '/pages/sales/salesAccount/index'
+			});
+			break;
+		default:
+			uni.showToast({
+				title: `鐐瑰嚮浜�${item.label}`,
+				icon: 'none'
+			});
+	}
+};
+
 // 鍒涘缓瀵瑰瓙缁勪欢鐨勫紩鐢�
 const uToastRef = ref(null);
 
@@ -140,34 +358,421 @@
 	// 璁剧疆鐢ㄦ埛淇℃伅
 	userStore.getInfo()
 	getUserLoginFacotryList()
+	// 鍚姩閫氱煡鐘舵�佸畾鏃跺櫒
+	startStatusTimer()
 });
 </script>
 
 <style scoped lang="scss">
 .content {
-	background-color: transparent !important;
-	padding: 14px;
+	background: linear-gradient(135deg, #f8f9fa 0%, #e3f2fd 100%);
+	min-height: 100vh;
+	padding: 20px;
+	padding-top: env(safe-area-inset-top);
+	position: relative;
+	
+	&::before {
+		content: '';
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="dots" width="20" height="20" patternUnits="userSpaceOnUse"><circle cx="10" cy="10" r="1" fill="rgba(41, 121, 255, 0.03)"/></pattern></defs><rect width="100" height="100" fill="url(%23dots)"/></svg>');
+		pointer-events: none;
+		z-index: -1;
+	}
+	
+	&::after {
+		content: '';
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: radial-gradient(circle at 20% 80%, rgba(41, 121, 255, 0.02) 0%, transparent 50%),
+					radial-gradient(circle at 80% 20%, rgba(156, 39, 176, 0.02) 0%, transparent 50%);
+		pointer-events: none;
+		z-index: -1;
+	}
 }
+
+/* 鏈〉涓嶅啀瀹氫箟 .safe-area-top锛屽凡绉昏嚦鍏ㄥ眬鏍峰紡 */
+
+.header-section {
+	margin-bottom: 16px;
+	animation: fadeInDown 0.6s ease-out;
+}
+
 .currentFactory {
-	margin-top: 12px;
-	margin-left: 6px;
-	font-weight: 400;
-	font-size: 14px;
+	margin-top: 8px;
+	margin-left: 4px;
+	font-weight: 500;
 	display: flex;
 }
+
 .factoryName {
 	width: auto;
 }
+
 :deep(.u-text) {
-	align-items: flex-end;
+	align-items: center;
 }
+
+.hero-section {
+	margin-bottom: 16px;
+	animation: fadeInUp 0.6s ease-out 0.1s both;
+}
+
 .bg-img {
-	margin-top: 12px;
 	width: 100%;
-	height: 145px;
-	background-color: #ffffff;
-	border-radius: 10px 10px 10px 10px;
+	height: 120px;
+	background: linear-gradient(135deg, #2979ff 0%, #1565c0 100%);
+	border-radius: 12px;
+	position: relative;
+	overflow: hidden;
+	box-shadow: 0 4px 20px rgba(41, 121, 255, 0.15);
+	
+	&::before {
+		content: '';
+		position: absolute;
+		top: -50%;
+		left: -50%;
+		width: 200%;
+		height: 200%;
+		background: conic-gradient(from 0deg, transparent, rgba(255,255,255,0.1), transparent, rgba(255,255,255,0.05), transparent);
+		animation: rotate 20s linear infinite;
+	}
+	
+	&::after {
+		content: '';
+		position: absolute;
+		top: 0;
+		right: 0;
+		width: 120px;
+		height: 120px;
+		background: radial-gradient(circle, rgba(255,255,255,0.15) 0%, transparent 70%);
+		border-radius: 50%;
+		transform: translate(40px, -40px);
+	}
 }
+
+.hero-content {
+	position: relative;
+	z-index: 1;
+	padding: 20px;
+	height: 100%;
+	display: flex;
+	align-items: center;
+}
+
+.hero-title {
+	color: #ffffff;
+	font-size: 24px;
+	font-weight: 600;
+}
+
+
+
+.notice-section {
+	margin-bottom: 16px;
+	animation: fadeInUp 0.6s ease-out 0.2s both;
+}
+
+.notice {
+	width: 100%;
+	background: linear-gradient(135deg, #EAF2FF 0%, #BBDEFB 100%);
+	border: 1px solid #e3f2fd;
+	border-radius: 12px;
+	padding: 16px;
+	box-shadow: 0 4px 20px rgba(41, 121, 255, 0.08);
+	position: relative;
+	overflow: hidden;
+	
+	&::before {
+		content: '';
+		position: absolute;
+		top: -50%;
+		left: -50%;
+		width: 200%;
+		height: 200%;
+		background: linear-gradient(45deg, transparent, rgba(255,255,255,0.6), transparent);
+		animation: shine 4s infinite;
+	}
+	
+	&::after {
+		content: '';
+		position: absolute;
+		top: 0;
+		right: 0;
+		width: 80px;
+		height: 80px;
+		background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 70%);
+		border-radius: 50%;
+		transform: translate(30px, -30px);
+	}
+}
+
+
+
+@keyframes shine {
+	0% { 
+		transform: translateX(-100%) translateY(-100%) rotate(45deg); 
+	}
+	100% { 
+		transform: translateX(100%) translateY(100%) rotate(45deg); 
+	}
+}
+
+@keyframes fadeInDown {
+	from {
+		opacity: 0;
+		transform: translateY(-20px);
+	}
+	to {
+		opacity: 1;
+		transform: translateY(0);
+	}
+}
+
+@keyframes fadeInUp {
+	from {
+		opacity: 0;
+		transform: translateY(20px);
+	}
+	to {
+		opacity: 1;
+		transform: translateY(0);
+	}
+}
+
+@keyframes rotate {
+	from {
+		transform: rotate(0deg);
+	}
+	to {
+		transform: rotate(360deg);
+	}
+}
+
+.notice-content {
+	display: flex;
+	align-items: center;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+
+.notice-left {
+	margin-right: 16px;
+}
+
+.notice-status {
+	font-weight: 600;
+	font-size: 16px;
+	color: #1976d2;
+}
+
+.notice-separator {
+	width: 1px;
+	height: 24px;
+	background: #e0e0e0;
+	margin-right: 16px;
+}
+
+.notice-right {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	flex: 1;
+}
+
+.notice-label {
+	color: #1976d2;
+	font-size: 14px;
+	font-weight: 500;
+	margin-right: 12px;
+}
+
+.notice-text {
+	font-weight: 400;
+	font-size: 14px;
+	color: #666666;
+}
+
+.notice-number {
+	font-weight: 600;
+	font-size: 16px;
+	color: #1976d2;
+	margin-left: 4px;
+}
+
+.notice-unit {
+	color: #666666;
+	font-size: 14px;
+	margin-left: 2px;
+}
+
+/* 鍔熻兘妯″潡鏍峰紡 */
+.common-module {
+	margin-bottom: 24px;
+	background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
+	border-radius: 16px;
+	padding: 16px;
+	box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
+	border: none;
+	position: relative;
+	overflow: hidden;
+	transition: all 0.3s ease;
+	
+	&::after {
+		content: '';
+		position: absolute;
+		top: 0;
+		right: 0;
+		width: 60px;
+		height: 60px;
+		background: radial-gradient(circle, rgba(0,0,0,0.02) 0%, transparent 70%);
+		border-radius: 50%;
+		transform: translate(30px, -30px);
+	}
+	
+	&:hover {
+		transform: translateY(-2px);
+		box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1);
+		
+		&::after {
+			background: radial-gradient(circle, rgba(0,0,0,0.04) 0%, transparent 70%);
+		}
+	}
+}
+
+.marketing-module {
+	--module-color: #2979ff;
+}
+
+.purchase-module {
+	--module-color: #1976d2;
+}
+
+.collaboration-module {
+	--module-color: #4caf50;
+}
+
+.equipment-module {
+	--module-color: #9c27b0;
+}
+
+.module-header {
+	margin-bottom: 24px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.module-title-container {
+	display: flex;
+	align-items: center;
+}
+
+.module-title {
+	color: #333333;
+	font-size: 18px;
+	font-weight: 600;
+	position: relative;
+	
+	&::after {
+		content: '';
+		position: absolute;
+		bottom: -4px;
+		left: 0;
+		width: 100%;
+		height: 2px;
+		background: linear-gradient(90deg, var(--module-color), rgba(255,255,255,0.9));
+		border-radius: 1px;
+		transition: all 0.3s ease;
+		box-shadow: 0 0 8px rgba(0,0,0,0.1);
+	}
+	
+	&:hover::after {
+		width: 30px;
+		box-shadow: 0 0 12px rgba(0,0,0,0.15);
+	}
+}
+
+.module-subtitle {
+	color: #666666;
+	font-size: 12px;
+	font-weight: 400;
+	margin-left: 8px;
+}
+
+.module-content {
+	width: 100%;
+	display: grid;
+	gap: 16px;
+}
+
+.icon-container {
+	width: 52px;
+	height: 52px;
+	border-radius: 12px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-bottom: 6px;
+	box-shadow: 0 3px 12px rgba(0, 0, 0, 0.12);
+	transition: all 0.3s ease;
+	position: relative;
+	overflow: hidden;
+	
+	&::before {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 50%, rgba(255,255,255,0.05) 100%);
+		opacity: 0;
+		transition: opacity 0.3s ease;
+	}
+	
+	&::after {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		border-radius: 12px;
+		background: linear-gradient(45deg, transparent, rgba(255,255,255,0.2), transparent);
+		opacity: 0;
+		transition: opacity 0.3s ease;
+	}
+	
+	&:hover {
+		transform: translateY(-3px) scale(1.02);
+		box-shadow: 0 8px 25px rgba(0, 0, 0, 0.18);
+		
+		&::before,
+		&::after {
+			opacity: 1;
+		}
+	}
+}
+
+.item-label {
+	font-size: 13px;
+	color: #555555;
+	text-align: center;
+	display: block;
+	line-height: 1.4;
+	font-weight: 500;
+	margin-top: 4px;
+	margin-bottom: 10px;
+}
+
 .grid-text {
 	font-size: 14px;
 	color: #909399;
@@ -176,4 +781,6 @@
 	box-sizing: border-box;
 	/* #endif */
 }
+
+
 </style>
diff --git a/src/pages/login.vue b/src/pages/login.vue
index a2e0d33..d970266 100644
--- a/src/pages/login.vue
+++ b/src/pages/login.vue
@@ -1,8 +1,6 @@
 <template>
   <view class="normal-login-container">
     <view class="logo-content">
-<!--      <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">-->
-<!--      </image>-->
       <text>璐﹀彿瀵嗙爜鐧诲綍</text>
     </view>
     <view class="login-form-content">
@@ -171,9 +169,10 @@
 
 .normal-login-container {
   width: 100%;
+	height: 100vh;
 
   .logo-content {
-    width: 100%;
+    width: 90%;
 		font-weight: 400;
 		font-size: 30px;
 		color: #333333;
diff --git a/src/pages/sales/salesAccount/detail.vue b/src/pages/sales/salesAccount/detail.vue
new file mode 100644
index 0000000..098c609
--- /dev/null
+++ b/src/pages/sales/salesAccount/detail.vue
@@ -0,0 +1,279 @@
+<template>
+  <view class="account-detail">
+    <!-- 椤堕儴鏍囬鏍� -->
+    <view class="header">
+      <up-icon name="arrow-left" size="20" color="#333" @click="goBack" />
+      <text class="title">鍙拌处璇︽儏</text>
+    </view>
+
+    <!-- 琛ㄥ崟鍖哄煙 -->
+    <view class="form-section">
+      <van-form ref="formRef" :modelValue="form" :rules="rules" label-width="100px" input-align="right">
+        <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+        </van-field>
+				<van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+				</van-field>
+				<van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+				</van-field>
+				<van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+				</van-field>
+				<van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+				</van-field>
+				<van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿">
+				</van-field>
+				<van-field label="褰曞叆浜�" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏�" readonly>
+				</van-field>
+				<van-field label="褰曞叆鏃ユ湡" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏�" readonly>
+				</van-field>
+      </van-form>
+    </view>
+
+    <!-- 浜у搧淇℃伅 -->
+    <view class="product-section">
+      <view class="section-header">
+        <text class="section-title">浜у搧淇℃伅</text>
+        <button class="add-btn" @click="addProduct">鏂板</button>
+      </view>
+      <view class="product-card" v-for="(product, idx) in products" :key="idx">
+        <view class="product-row">
+          <text class="product-label">浜у搧绫�</text>
+          <uni-easyinput v-model="product.type" placeholder="璇疯緭鍏ヤ骇鍝佺被" />
+        </view>
+        <view class="product-row">
+          <text class="product-label">鍗曚綅</text>
+          <uni-easyinput v-model="product.unit" placeholder="璇疯緭鍏ュ崟浣�" />
+          <text class="product-label">鏁伴噺</text>
+          <uni-easyinput v-model="product.amount" placeholder="璇疯緭鍏ユ暟閲�" type="number" />
+        </view>
+        <view class="product-row">
+          <text class="product-label">绋庣巼</text>
+          <uni-easyinput v-model="product.taxRate" placeholder="璇疯緭鍏ョ◣鐜�" />
+          <text class="product-label">鍚◣鍗曚环</text>
+          <uni-easyinput v-model="product.taxPrice" placeholder="璇疯緭鍏ュ惈绋庡崟浠�" />
+        </view>
+        <view class="product-row">
+          <text class="product-label">鍚◣鎬讳环</text>
+          <uni-easyinput v-model="product.taxTotal" placeholder="璇疯緭鍏ュ惈绋庢�讳环" />
+          <text class="product-label">鍚堝悓閲戦</text>
+          <uni-easyinput v-model="product.contractAmount" placeholder="璇疯緭鍏ュ悎鍚岄噾棰�" />
+        </view>
+        <view class="product-row">
+          <text class="product-label">鎿嶄綔</text>
+          <uni-easyinput v-model="product.operateDate" placeholder="璇疯緭鍏ユ搷浣滄椂闂�" />
+        </view>
+        <view class="product-row">
+          <text class="product-label">澶囨敞</text>
+          <uni-easyinput v-model="product.remark" placeholder="璇疯緭鍏ュ娉�" />
+        </view>
+        <view class="product-row del-row">
+          <button class="del-btn" @click="removeProduct(idx)">鍒犻櫎</button>
+        </view>
+      </view>
+    </view>
+
+    <!-- 搴曢儴鎸夐挳 -->
+    <view class="footer-btns">
+      <van-button class="cancel-btn" @click="goBack">鍙栨秷</van-button>
+      <van-button class="save-btn" @click="submitForm">淇濆瓨</van-button>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+const goBack = () => {
+  uni.navigateBack();
+};
+const formRef = ref();
+const paymentMethods = ['瀵瑰叕杞处', '鐜伴噾', '鍏朵粬'];
+const form = ref({
+  salesContractNo: '',
+  customerContract: '',
+  projectName: '',
+  contractAmount: '',
+  executionDate: '',
+  paymentMethod: '',
+});
+const rules = {
+  salesContractNo: {
+    rules: [{ required: true, errorMessage: '閿�鍞悎鍚屽彿涓嶈兘涓虹┖' }]
+  },
+  customerContract: {
+    rules: [{ required: true, errorMessage: '瀹㈡埛鍚堝悓涓嶈兘涓虹┖' }]
+  },
+  projectName: {
+    rules: [{ required: true, errorMessage: '椤圭洰鍚嶇О涓嶈兘涓虹┖' }]
+  },
+  contractAmount: {
+    rules: [{ required: true, errorMessage: '鍚堝悓閲戦涓嶈兘涓虹┖' }]
+  },
+  executionDate: {
+    rules: [{ required: true, errorMessage: '绛捐鏃ユ湡涓嶈兘涓虹┖' }]
+  },
+  paymentMethod: {
+    rules: [{ required: true, errorMessage: '璇烽�夋嫨浠樻鏂瑰紡' }]
+  }
+};
+const products = ref([
+  {
+    type: 'LS-29911',
+    unit: '鍛ㄥ簞闀�',
+    amount: '86590905972612',
+    taxRate: '杩欓噷鏄」鐩悕绉�',
+    taxPrice: '杩欓噷鏄」鐩悕绉�',
+    taxTotal: '杩欓噷鏄」鐩悕绉�',
+    contractAmount: '32011鍏�',
+    operateDate: '2022-02-22 11:30:50',
+    remark: '',
+  },
+  {
+    type: 'LS-29911',
+    unit: '鍛ㄥ簞闀�',
+    amount: '86590905972612',
+    taxRate: '杩欓噷鏄」鐩悕绉�',
+    taxPrice: '杩欓噷鏄」鐩悕绉�',
+    taxTotal: '杩欓噷鏄」鐩悕绉�',
+    contractAmount: '32011鍏�',
+    operateDate: '2022-02-22 11:30:50',
+    remark: '',
+  },
+]);
+const addProduct = () => {
+  products.value.push({
+    type: '',
+    unit: '',
+    amount: '',
+    taxRate: '',
+    taxPrice: '',
+    taxTotal: '',
+    contractAmount: '',
+    operateDate: '',
+    remark: '',
+  });
+};
+const removeProduct = (idx) => {
+  products.value.splice(idx, 1);
+};
+const submitForm = () => {
+  formRef.value.validate().then(() => {
+    uni.showToast({ title: '淇濆瓨鎴愬姛', icon: 'success' });
+  });
+};
+</script>
+
+<style scoped lang="scss">
+.account-detail {
+  min-height: 100vh;
+  background: #f8f9fa;
+  padding-bottom: 80px;
+}
+.header {
+  display: flex;
+  align-items: center;
+  background: #fff;
+  padding: 16px 20px;
+  border-bottom: 1px solid #f0f0f0;
+  position: sticky;
+  top: 0;
+  z-index: 100;
+}
+.title {
+  flex: 1;
+  text-align: center;
+  font-size: 18px;
+  font-weight: 600;
+  color: #333;
+}
+.form-section {
+	margin-top: 16px;
+}
+.van-field {
+	height: 56px;
+	line-height: 36px;
+}
+.product-section {
+  background: #fff;
+  margin: 16px;
+  border-radius: 16px;
+  padding: 20px 16px 8px 16px;
+  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
+}
+.section-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 12px;
+}
+.section-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #333;
+}
+.add-btn {
+  background: #2979ff;
+  color: #fff;
+  border-radius: 8px;
+  padding: 4px 16px;
+  font-size: 14px;
+}
+.product-card {
+  background: #f8f9fa;
+  border-radius: 12px;
+  padding: 12px;
+  margin-bottom: 16px;
+  box-shadow: 0 1px 4px rgba(41,121,255,0.06);
+  position: relative;
+}
+.product-row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 8px;
+}
+.product-label {
+  min-width: 60px;
+  color: #888;
+  font-size: 13px;
+}
+.del-row {
+  justify-content: flex-end;
+}
+.del-btn {
+  background: #ff4d4f;
+  color: #fff;
+  border-radius: 8px;
+  padding: 4px 16px;
+  font-size: 13px;
+  margin-top: 4px;
+}
+.footer-btns {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  padding: 12px 0;
+  box-shadow: 0 -2px 8px rgba(0,0,0,0.05);
+  z-index: 1000;
+}
+.cancel-btn {
+	font-weight: 400;
+	font-size: 16px;
+	color: #FFFFFF;
+	width: 102px;
+	background: #C7C9CC;
+	box-shadow: 0px 4px 10px 0px rgba(3,88,185,0.2);
+	border-radius: 40px 40px 40px 40px;
+}
+.save-btn {
+	font-weight: 400;
+	font-size: 16px;
+	color: #FFFFFF;
+	width: 224px;
+	background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%);
+	box-shadow: 0px 4px 10px 0px rgba(3,88,185,0.2);
+	border-radius: 40px 40px 40px 40px;
+}
+</style>
diff --git a/src/pages/sales/salesAccount/index.vue b/src/pages/sales/salesAccount/index.vue
new file mode 100644
index 0000000..e2e0b65
--- /dev/null
+++ b/src/pages/sales/salesAccount/index.vue
@@ -0,0 +1,392 @@
+<template>
+	<view class="sales-account">
+		<!-- 椤甸潰澶撮儴 -->
+		<view class="page-header">
+			<view class="header-left">
+				<up-icon name="arrow-left" size="20" color="#333" @click="goBack"></up-icon>
+			</view>
+			<view class="header-center">
+				<text class="page-title">閿�鍞彴璐�</text>
+			</view>
+		</view>
+		
+		<!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
+		<view class="search-filter-section">
+			<view class="search-bar">
+				<view class="search-input">
+					<input
+						class="search-text"
+						placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿/瀹㈡埛鍚嶇О"
+						v-model="searchKeyword"
+					/>
+				</view>
+				<view class="filter-button" @click="getList">
+					<up-icon name="search" size="24" color="#999"></up-icon>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 閿�鍞彴璐︾�戝竷娴� -->
+		<view class="ledger-list" v-if="total > 0">
+			<view v-for="(item, index) in ledgerList" :key="index">
+				<view class="ledger-item" @click="handleItemClick(item)">
+					<view class="item-header">
+						<view class="item-left">
+							<view class="document-icon">
+								<up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+							</view>
+							<text class="item-id">{{ item.salesContractNo }}</text>
+						</view>
+						<!--							<view class="item-tag">-->
+						<!--								<text class="tag-text">{{ item.recorder }}</text>-->
+						<!--							</view>-->
+					</view>
+					<up-divider></up-divider>
+					
+					<view class="item-details">
+						<view class="detail-row">
+							<text class="detail-label">瀹㈡埛鍚嶇О</text>
+							<text class="detail-value">{{ item.customerName }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">瀹㈡埛鍚堝悓鍙�</text>
+							<text class="detail-value highlight">{{ item.customerContractNo }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">涓氬姟鍛�</text>
+							<text class="detail-value">{{ item.salesman }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">椤圭洰鍚嶇О</text>
+							<text class="detail-value">{{ item.projectName }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">浠樻鏂瑰紡</text>
+							<text class="detail-value">{{ item.paymentMethod }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">鍚堝悓閲戦(鍏�)</text>
+							<text class="detail-value highlight">{{ item.contractAmount }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">绛捐鏃ユ湡</text>
+							<text class="detail-value">{{ item.executionDate }}</text>
+						</view>
+						<up-divider></up-divider>
+						<view class="detail-info">
+							<view class="detail-row">
+								<text class="detail-label">褰曞叆浜�</text>
+								<text class="detail-value">{{ item.entryPersonName }}</text>
+							</view>
+							<view class="detail-row">
+								<text class="detail-label">褰曞叆鏃ユ湡</text>
+								<text class="detail-value">{{ item.entryDate }}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-else class="no-data">
+			<text>鏆傛棤閿�鍞彴璐︽暟鎹�</text>
+		</view>
+		
+		<!-- 娴姩鎿嶄綔鎸夐挳 -->
+		<view class="fab-button" @click="handleAdd">
+			<up-icon name="plus" size="24" color="#ffffff"></up-icon>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted } from 'vue';
+import {ledgerListPage} from "@/api/salesManagement/salesLedger";
+
+// 鎼滅储鍏抽敭璇�
+const searchKeyword = ref('');
+
+// 閿�鍞彴璐︽暟鎹�
+const ledgerList = ref([]);
+const total = ref(0);
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+	uni.navigateBack();
+};
+// 鏌ヨ鍒楄〃
+const getList = () => {
+	const page = {
+		current: -1,
+		size: -1
+	}
+	ledgerListPage({...page}).then((res) => {
+		ledgerList.value = res.records;
+		total.value = res.total;
+	}).catch(() => {
+			// tableLoading.value = false;
+	});
+};
+// 鏄剧ず绛涢�夐�夐」
+const showFilterOptions = () => {
+	uni.showActionSheet({
+		itemList: ['鎸夋棩鏈熺瓫閫�', '鎸夌姸鎬佺瓫閫�', '鎸夐噾棰濈瓫閫�'],
+		success: (res) => {
+			console.log('閫夋嫨浜嗙瓫閫夐�夐」:', res.tapIndex);
+		}
+	});
+};
+
+// 鐐瑰嚮鍒楄〃椤�
+const handleItemClick = (item) => {
+	uni.showToast({
+		title: `鏌ョ湅鍚堝悓: ${item.contractId}`,
+		icon: 'none'
+	});
+};
+
+// 娣诲姞鏂拌褰�
+const handleAdd = () => {
+  uni.navigateTo({
+    url: '/pages/sales/salesAccount/detail'
+  });
+};
+
+onMounted(() => {
+	// 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栭�昏緫
+	getList()
+});
+</script>
+
+<style scoped lang="scss">
+.u-divider {
+	margin: 0 !important;
+}
+.sales-account {
+	min-height: 100vh;
+	background: #f8f9fa;
+	position: relative;
+}
+
+.page-header {
+	background: #ffffff;
+  padding: 16px 20px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1px solid #f0f0f0;
+	position: sticky;
+  /* 鍏煎 iOS 鍒樻捣/鐏靛姩宀涘畨鍏ㄥ尯 */
+  padding-top: env(safe-area-inset-top);
+  top: 0;
+	z-index: 100;
+}
+
+.header-left {
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.nav-icon {
+	width: 24px;
+	height: 24px;
+	background: #2979ff;
+	border-radius: 4px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.nav-text {
+	font-size: 14px;
+	color: #2979ff;
+	font-weight: 500;
+}
+
+.header-center {
+	flex: 1;
+	text-align: center;
+}
+
+.page-title {
+	font-size: 18px;
+	font-weight: 600;
+	color: #333;
+}
+
+.header-right {
+	display: flex;
+	align-items: center;
+}
+
+.status-bar {
+	display: flex;
+	align-items: center;
+	gap: 4px;
+}
+
+.signal, .wifi, .battery {
+	width: 16px;
+	height: 8px;
+	background: #333;
+	border-radius: 2px;
+}
+
+.search-filter-section {
+	padding: 10px 20px;
+	background: #ffffff;
+}
+
+.search-bar {
+	display: flex;
+	align-items: center;
+	gap: 12px;
+}
+
+.search-input {
+	flex: 1;
+	background: #f5f5f5;
+	border-radius: 24px;
+	padding: 10px 16px;
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.search-text {
+	flex: 1;
+	font-size: 14px;
+	color: #333;
+	background: transparent;
+	border: none;
+	outline: none;
+}
+
+.search-text::placeholder {
+	color: #999;
+}
+
+.filter-button {
+	width: 40px;
+	height: 40px;
+	border-radius: 8px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.ledger-list {
+	padding: 20px;
+}
+
+.ledger-item {
+	background: #ffffff;
+	border-radius: 12px;
+	margin-bottom: 16px;
+	overflow: hidden;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+	padding: 0 16px;
+}
+
+.item-header {
+	padding: 16px 0;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.item-left {
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.document-icon {
+	width: 24px;
+	height: 24px;
+	background: #2979ff;
+	border-radius: 4px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.item-id {
+	font-size: 14px;
+	color: #333;
+	font-weight: 500;
+}
+
+.item-tag {
+	background: #4caf50;
+	border-radius: 4px;
+	padding: 2px 4px;
+}
+
+.tag-text {
+	font-size: 11px;
+	color: #ffffff;
+	font-weight: 500;
+}
+
+.item-details {
+	padding: 16px 0;
+}
+
+.detail-row {
+	display: flex;
+	align-items: flex-end;
+	justify-content: space-between;
+	margin-bottom: 8px;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+.detail-info {
+	margin-top: 10px;
+	display: flex;
+	align-items: flex-start;
+	justify-content: space-between;
+}
+
+.detail-label {
+	font-size: 12px;
+	color: #777777;
+	min-width: 60px;
+}
+
+.detail-value {
+	font-size: 12px;
+	color: #000000;
+	text-align: right;
+	flex: 1;
+	margin-left: 16px;
+}
+
+.detail-value.highlight {
+	color: #2979ff;
+	font-weight: 500;
+}
+
+.no-data {
+	padding: 40px 0;
+	text-align: center;
+	color: #999;
+}
+
+.fab-button {
+	position: fixed;
+	bottom: 30px;
+	right: 30px;
+	width: 56px;
+	height: 56px;
+	background: #2979ff;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
+	z-index: 1000;
+}
+</style>

--
Gitblit v1.9.3