li.shaoyi 2 年 前
コミット
def0307a22
82 ファイル変更1962 行追加1084 行削除
  1. 109 115
      package-lock.json
  2. 3 3
      package.json
  3. 6 2
      src/business/bank/index.ts
  4. 3 1
      src/business/login/index.ts
  5. 0 1
      src/components/base/modal/index.less
  6. 1 1
      src/mock/index.ts
  7. 400 48
      src/mock/router.ts
  8. 3 16
      src/packages/pc/App.vue
  9. BIN
      src/packages/pc/assets/images/login-bg.jpg
  10. BIN
      src/packages/pc/assets/logo-horizontal.png
  11. 153 39
      src/packages/pc/assets/themes/default/variable.less
  12. 46 19
      src/packages/pc/components/base/drawer/index.less
  13. 5 1
      src/packages/pc/components/base/drawer/index.vue
  14. 24 29
      src/packages/pc/components/base/table/index.less
  15. 9 12
      src/packages/pc/components/base/table/index.vue
  16. 3 0
      src/packages/pc/components/base/upload/index.less
  17. 174 0
      src/packages/pc/components/base/upload/index.vue
  18. 43 1
      src/packages/pc/components/layouts/footer/index.less
  19. 51 1
      src/packages/pc/components/layouts/footer/index.vue
  20. 1 1
      src/packages/pc/components/layouts/header/index.less
  21. 1 8
      src/packages/pc/components/layouts/header/index.vue
  22. 25 0
      src/packages/pc/components/layouts/main/index.less
  23. 41 0
      src/packages/pc/components/layouts/main/index.vue
  24. 16 16
      src/packages/pc/components/layouts/page/index.less
  25. 14 13
      src/packages/pc/components/layouts/page/index.vue
  26. 12 8
      src/packages/pc/components/layouts/sidebar/index.less
  27. 10 6
      src/packages/pc/components/layouts/sidebar/index.vue
  28. 15 16
      src/packages/pc/components/layouts/view/index.less
  29. 2 1
      src/packages/pc/components/modules/auth-component/index.vue
  30. 4 0
      src/packages/pc/router/dynamicRouter.ts
  31. 2 2
      src/packages/pc/router/index.ts
  32. 12 0
      src/packages/pc/views/account/sign/index.vue
  33. 37 35
      src/packages/pc/views/auth/components/layout/index.less
  34. 17 9
      src/packages/pc/views/auth/components/layout/index.vue
  35. 9 9
      src/packages/pc/views/auth/login/index.vue
  36. 12 0
      src/packages/pc/views/footer/capital/statement/index.vue
  37. 69 0
      src/packages/pc/views/footer/capital/summary/deposit/index.vue
  38. 37 0
      src/packages/pc/views/footer/capital/summary/index.vue
  39. 12 0
      src/packages/pc/views/footer/goods/delivery/index.vue
  40. 12 0
      src/packages/pc/views/footer/goods/order/index.vue
  41. 23 0
      src/packages/pc/views/footer/goods/position/index.vue
  42. 12 0
      src/packages/pc/views/footer/goods/trade/index.vue
  43. 11 0
      src/packages/pc/views/footer/index.vue
  44. 12 0
      src/packages/pc/views/footer/performance/list/index.vue
  45. 12 0
      src/packages/pc/views/footer/spot/order/index.vue
  46. 12 0
      src/packages/pc/views/footer/spot/pickup/index.vue
  47. 12 0
      src/packages/pc/views/footer/spot/position/index.vue
  48. 12 0
      src/packages/pc/views/footer/spot/trade/index.vue
  49. 82 0
      src/packages/pc/views/market/trade/goods/index.vue
  50. 54 0
      src/packages/pc/views/market/trade/spot/index.vue
  51. 0 7
      src/packages/pc/views/member/index.less
  52. 0 196
      src/packages/pc/views/member/index.vue
  53. 0 97
      src/packages/pc/views/profit/index.vue
  54. 0 52
      src/packages/pc/views/promotion/components/details/index.vue
  55. 0 44
      src/packages/pc/views/promotion/components/payment/index.vue
  56. 0 91
      src/packages/pc/views/promotion/index.vue
  57. 12 0
      src/packages/pc/views/query/capital/history/index.vue
  58. 8 0
      src/packages/pc/views/query/capital/index.vue
  59. 12 0
      src/packages/pc/views/query/capital/list/index.vue
  60. 72 0
      src/packages/pc/views/query/order/goods/history/index.vue
  61. 8 0
      src/packages/pc/views/query/order/goods/index.vue
  62. 43 0
      src/packages/pc/views/query/order/goods/list/index.vue
  63. 12 0
      src/packages/pc/views/query/order/spot/history/index.vue
  64. 8 0
      src/packages/pc/views/query/order/spot/index.vue
  65. 12 0
      src/packages/pc/views/query/order/spot/list/index.vue
  66. 12 0
      src/packages/pc/views/query/performance/buy/all/index.vue
  67. 8 0
      src/packages/pc/views/query/performance/buy/index.vue
  68. 12 0
      src/packages/pc/views/query/performance/buy/running/index.vue
  69. 12 0
      src/packages/pc/views/query/performance/sell/all/index.vue
  70. 8 0
      src/packages/pc/views/query/performance/sell/index.vue
  71. 12 0
      src/packages/pc/views/query/performance/sell/running/index.vue
  72. 12 0
      src/packages/pc/views/query/trade/goods/history/index.vue
  73. 8 0
      src/packages/pc/views/query/trade/goods/index.vue
  74. 12 0
      src/packages/pc/views/query/trade/goods/list/index.vue
  75. 12 0
      src/packages/pc/views/query/trade/spot/history/index.vue
  76. 8 0
      src/packages/pc/views/query/trade/spot/index.vue
  77. 12 0
      src/packages/pc/views/query/trade/spot/list/index.vue
  78. 0 53
      src/packages/pc/views/ratio/components/history/index.vue
  79. 0 38
      src/packages/pc/views/ratio/index.vue
  80. 0 89
      src/packages/pc/views/tradedata/index.vue
  81. 1 1
      src/shims-vue.d.ts
  82. 11 3
      src/stores/modules/account.ts

+ 109 - 115
package-lock.json

@@ -16,7 +16,7 @@
         "crypto-js": "^4.1.1",
         "default-passive-events": "^2.0.0",
         "echarts": "^5.3.2",
-        "element-plus": "^2.2.8",
+        "element-plus": "^2.3.7",
         "html5-qrcode": "^2.2.5",
         "long": "^5.2.0",
         "moment": "^2.29.3",
@@ -50,7 +50,7 @@
         "eslint-plugin-vue": "^8.0.3",
         "less": "^4.0.0",
         "less-loader": "^8.0.0",
-        "mockjs": "^1.1.0",
+        "mockjs-x": "^1.0.1-beta5",
         "postcss": "7.0.32",
         "postcss-px-to-viewport": "^1.1.1",
         "resize-observer-polyfill": "^1.5.1",
@@ -1770,16 +1770,16 @@
       }
     },
     "node_modules/@floating-ui/core": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz",
-      "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg=="
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.3.1.tgz",
+      "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g=="
     },
     "node_modules/@floating-ui/dom": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz",
-      "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==",
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.4.4.tgz",
+      "integrity": "sha512-21hhDEPOiWkGp0Ys4Wi6Neriah7HweToKra626CIK712B5m9qkdz54OP9gVldUg+URnBTpv/j/bi/skmGdstXQ==",
       "dependencies": {
-        "@floating-ui/core": "^0.7.3"
+        "@floating-ui/core": "^1.3.1"
       }
     },
     "node_modules/@hapi/hoek": {
@@ -2381,9 +2381,9 @@
       "dev": true
     },
     "node_modules/@types/web-bluetooth": {
-      "version": "0.0.14",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
-      "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A=="
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "node_modules/@types/webpack-env": {
       "version": "1.16.4",
@@ -4019,58 +4019,55 @@
       "dev": true
     },
     "node_modules/@vueuse/core": {
-      "version": "8.7.5",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.7.5.tgz",
-      "integrity": "sha512-tqgzeZGoZcXzoit4kOGLWJibDMLp0vdm6ZO41SSUQhkhtrPhAg6dbIEPiahhUu6sZAmSYvVrZgEr5aKD51nrLA==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
       "dependencies": {
-        "@types/web-bluetooth": "^0.0.14",
-        "@vueuse/metadata": "8.7.5",
-        "@vueuse/shared": "8.7.5",
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
         "vue-demi": "*"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz",
+      "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
+      "engines": {
+        "node": ">=12"
       },
       "peerDependencies": {
-        "@vue/composition-api": "^1.1.0",
-        "vue": "^2.6.0 || ^3.2.0"
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
       },
       "peerDependenciesMeta": {
         "@vue/composition-api": {
           "optional": true
-        },
-        "vue": {
-          "optional": true
         }
       }
     },
-    "node_modules/@vueuse/core/node_modules/@vueuse/shared": {
-      "version": "8.7.5",
-      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.7.5.tgz",
-      "integrity": "sha512-THXPvMBFmg6Gf6AwRn/EdTh2mhqwjGsB2Yfp374LNQSQVKRHtnJ0I42bsZTn7nuEliBxqUrGQm/lN6qUHmhJLw==",
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
       "dependencies": {
         "vue-demi": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.1.0",
-        "vue": "^2.6.0 || ^3.2.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        },
-        "vue": {
-          "optional": true
-        }
       }
     },
-    "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.13.2",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.2.tgz",
-      "integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ==",
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz",
+      "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
       "hasInstallScript": true,
       "bin": {
         "vue-demi-fix": "bin/vue-demi-fix.js",
@@ -4079,9 +4076,6 @@
       "engines": {
         "node": ">=12"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
       "peerDependencies": {
         "@vue/composition-api": "^1.0.0-rc.1",
         "vue": "^3.0.0-0 || ^2.6.0"
@@ -4092,14 +4086,6 @@
         }
       }
     },
-    "node_modules/@vueuse/metadata": {
-      "version": "8.7.5",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.7.5.tgz",
-      "integrity": "sha512-emJZKRQSaEnVqmlu39NpNp8iaW+bPC2kWykWoWOZMSlO/0QVEmO/rt8A5VhOEJTKLX3vwTevqbiRy9WJRwVOQg==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -6801,17 +6787,17 @@
       "dev": true
     },
     "node_modules/element-plus": {
-      "version": "2.2.8",
-      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.8.tgz",
-      "integrity": "sha512-+cubFh1rgeGcc2LeBm7hv/1BKFJre/LIIdRntm9OLaIhysCxigjEwcxk9gbVT4KsbcjmoqZUr4/mwhIhQV6mvw==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.3.7.tgz",
+      "integrity": "sha512-h6TxclbaLUJxg/Bv5j/ZKsK+K5yadQliw5+R30HWyE69pXlqXTX24oYx+yw3pA4Dy+lqEDi5501FQ0CORk3OSA==",
       "dependencies": {
         "@ctrl/tinycolor": "^3.4.1",
         "@element-plus/icons-vue": "^2.0.6",
-        "@floating-ui/dom": "^0.5.4",
+        "@floating-ui/dom": "^1.0.1",
         "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
         "@types/lodash": "^4.14.182",
         "@types/lodash-es": "^4.17.6",
-        "@vueuse/core": "^8.7.5",
+        "@vueuse/core": "^9.1.0",
         "async-validator": "^4.2.5",
         "dayjs": "^1.11.3",
         "escape-html": "^1.0.3",
@@ -6819,7 +6805,7 @@
         "lodash-es": "^4.17.21",
         "lodash-unified": "^1.0.2",
         "memoize-one": "^6.0.0",
-        "normalize-wheel-es": "^1.1.2"
+        "normalize-wheel-es": "^1.2.0"
       },
       "peerDependencies": {
         "vue": "^3.2.0"
@@ -9707,10 +9693,10 @@
         "mkdirp": "bin/cmd.js"
       }
     },
-    "node_modules/mockjs": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
-      "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+    "node_modules/mockjs-x": {
+      "version": "1.0.1-beta5",
+      "resolved": "https://registry.npmmirror.com/mockjs-x/-/mockjs-x-1.0.1-beta5.tgz",
+      "integrity": "sha512-entZrUc5lOJ+af4jcM+OM7QiKp0Usszi7DKYIKX2oIss6k+cUC94BxcsJ35oN1Vm4XqqomlVIAyNFWMHTeZ67g==",
       "dev": true,
       "dependencies": {
         "commander": "*"
@@ -9938,9 +9924,9 @@
       }
     },
     "node_modules/normalize-wheel-es": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.1.2.tgz",
-      "integrity": "sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png=="
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "node_modules/npm-run-path": {
       "version": "2.0.2",
@@ -14692,16 +14678,16 @@
       }
     },
     "@floating-ui/core": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz",
-      "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg=="
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.3.1.tgz",
+      "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g=="
     },
     "@floating-ui/dom": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz",
-      "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==",
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.4.4.tgz",
+      "integrity": "sha512-21hhDEPOiWkGp0Ys4Wi6Neriah7HweToKra626CIK712B5m9qkdz54OP9gVldUg+URnBTpv/j/bi/skmGdstXQ==",
       "requires": {
-        "@floating-ui/core": "^0.7.3"
+        "@floating-ui/core": "^1.3.1"
       }
     },
     "@hapi/hoek": {
@@ -15241,9 +15227,9 @@
       "dev": true
     },
     "@types/web-bluetooth": {
-      "version": "0.0.14",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
-      "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A=="
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "@types/webpack-env": {
       "version": "1.16.4",
@@ -16399,36 +16385,44 @@
       "dev": true
     },
     "@vueuse/core": {
-      "version": "8.7.5",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.7.5.tgz",
-      "integrity": "sha512-tqgzeZGoZcXzoit4kOGLWJibDMLp0vdm6ZO41SSUQhkhtrPhAg6dbIEPiahhUu6sZAmSYvVrZgEr5aKD51nrLA==",
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
       "requires": {
-        "@types/web-bluetooth": "^0.0.14",
-        "@vueuse/metadata": "8.7.5",
-        "@vueuse/shared": "8.7.5",
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
         "vue-demi": "*"
       },
       "dependencies": {
-        "@vueuse/shared": {
-          "version": "8.7.5",
-          "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.7.5.tgz",
-          "integrity": "sha512-THXPvMBFmg6Gf6AwRn/EdTh2mhqwjGsB2Yfp374LNQSQVKRHtnJ0I42bsZTn7nuEliBxqUrGQm/lN6qUHmhJLw==",
-          "requires": {
-            "vue-demi": "*"
-          }
-        },
         "vue-demi": {
-          "version": "0.13.2",
-          "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.2.tgz",
-          "integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ==",
+          "version": "0.14.5",
+          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz",
+          "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
           "requires": {}
         }
       }
     },
     "@vueuse/metadata": {
-      "version": "8.7.5",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.7.5.tgz",
-      "integrity": "sha512-emJZKRQSaEnVqmlu39NpNp8iaW+bPC2kWykWoWOZMSlO/0QVEmO/rt8A5VhOEJTKLX3vwTevqbiRy9WJRwVOQg=="
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
+    },
+    "@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "requires": {
+        "vue-demi": "*"
+      },
+      "dependencies": {
+        "vue-demi": {
+          "version": "0.14.5",
+          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz",
+          "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
+          "requires": {}
+        }
+      }
     },
     "@webassemblyjs/ast": {
       "version": "1.11.1",
@@ -18428,17 +18422,17 @@
       "dev": true
     },
     "element-plus": {
-      "version": "2.2.8",
-      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.8.tgz",
-      "integrity": "sha512-+cubFh1rgeGcc2LeBm7hv/1BKFJre/LIIdRntm9OLaIhysCxigjEwcxk9gbVT4KsbcjmoqZUr4/mwhIhQV6mvw==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.3.7.tgz",
+      "integrity": "sha512-h6TxclbaLUJxg/Bv5j/ZKsK+K5yadQliw5+R30HWyE69pXlqXTX24oYx+yw3pA4Dy+lqEDi5501FQ0CORk3OSA==",
       "requires": {
         "@ctrl/tinycolor": "^3.4.1",
         "@element-plus/icons-vue": "^2.0.6",
-        "@floating-ui/dom": "^0.5.4",
+        "@floating-ui/dom": "^1.0.1",
         "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
         "@types/lodash": "^4.14.182",
         "@types/lodash-es": "^4.17.6",
-        "@vueuse/core": "^8.7.5",
+        "@vueuse/core": "^9.1.0",
         "async-validator": "^4.2.5",
         "dayjs": "^1.11.3",
         "escape-html": "^1.0.3",
@@ -18446,7 +18440,7 @@
         "lodash-es": "^4.17.21",
         "lodash-unified": "^1.0.2",
         "memoize-one": "^6.0.0",
-        "normalize-wheel-es": "^1.1.2"
+        "normalize-wheel-es": "^1.2.0"
       },
       "dependencies": {
         "@popperjs/core": {
@@ -20602,10 +20596,10 @@
         "minimist": "^1.2.6"
       }
     },
-    "mockjs": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
-      "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+    "mockjs-x": {
+      "version": "1.0.1-beta5",
+      "resolved": "https://registry.npmmirror.com/mockjs-x/-/mockjs-x-1.0.1-beta5.tgz",
+      "integrity": "sha512-entZrUc5lOJ+af4jcM+OM7QiKp0Usszi7DKYIKX2oIss6k+cUC94BxcsJ35oN1Vm4XqqomlVIAyNFWMHTeZ67g==",
       "dev": true,
       "requires": {
         "commander": "*"
@@ -20784,9 +20778,9 @@
       "dev": true
     },
     "normalize-wheel-es": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.1.2.tgz",
-      "integrity": "sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png=="
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "npm-run-path": {
       "version": "2.0.2",

+ 3 - 3
package.json

@@ -20,7 +20,7 @@
     "crypto-js": "^4.1.1",
     "default-passive-events": "^2.0.0",
     "echarts": "^5.3.2",
-    "element-plus": "^2.2.8",
+    "element-plus": "^2.3.7",
     "html5-qrcode": "^2.2.5",
     "long": "^5.2.0",
     "moment": "^2.29.3",
@@ -54,7 +54,7 @@
     "eslint-plugin-vue": "^8.0.3",
     "less": "^4.0.0",
     "less-loader": "^8.0.0",
-    "mockjs": "^1.1.0",
+    "mockjs-x": "^1.0.1-beta5",
     "postcss": "7.0.32",
     "postcss-px-to-viewport": "^1.1.1",
     "resize-observer-polyfill": "^1.5.1",
@@ -62,4 +62,4 @@
     "vconsole": "^3.14.6",
     "worker-loader": "^3.0.8"
   }
-}
+}

+ 6 - 2
src/business/bank/index.ts

@@ -65,7 +65,7 @@ export function useDoWithdraw() {
 }
 
 // 充值请求
-export function useDoDeposit() {
+export function useDoDeposit(userid?: number) {
     const loading = shallowRef(false)
     /// 获取当前是否已签约
     const sign = shallowRef<Model.BankAccountSignRsp[]>([])
@@ -74,7 +74,11 @@ export function useDoDeposit() {
     /// formData
     const formData = reactive<Partial<Proto.t2bBankDepositReq>>({})
 
-    const request = queryBankAccountSign().then((res) => {
+    const request = queryBankAccountSign({
+        data: {
+            userid
+        }
+    }).then((res) => {
         if (res.data.length) {
             sign.value = res.data
             const data = res.data[0]

+ 3 - 1
src/business/login/index.ts

@@ -1,4 +1,4 @@
-import { reactive } from 'vue'
+import { shallowRef, reactive } from 'vue'
 import { timerTask } from '@/utils/timer'
 import { login } from '@/services/api/account'
 import { useLoginStore, useEnumStore, useErrorInfoStore, useUserStore, useFuturesStore, useAccountStore } from '@/stores'
@@ -24,6 +24,7 @@ export function useLogin(persist = false) {
 
     const { logining, token, clientType } = loginStore.$toRefs()
 
+    const remember = shallowRef(true) // 记住账号
     const formData = reactive<Model.LoginReq>({
         userName: localStorage.getItem('muchinfo_loginId') ?? '',
         password: '',
@@ -107,6 +108,7 @@ export function useLogin(persist = false) {
 
     return {
         logining,
+        remember,
         formData,
         initBaseData,
         userLogin,

+ 0 - 1
src/components/base/modal/index.less

@@ -31,7 +31,6 @@
     &__container {
         max-width: 100vw;
         max-height: 100vh;
-        background-color: #fff;
         padding-bottom: constant(safe-area-inset-bottom);
         /* 兼容 iOS<11.2 */
         padding-bottom: env(safe-area-inset-bottom);

+ 1 - 1
src/mock/index.ts

@@ -1,4 +1,4 @@
-import Mock from 'mockjs'
+import Mock from 'mockjs-x'
 
 Mock.setup({
     timeout: '100-200'

+ 400 - 48
src/mock/router.ts

@@ -7,74 +7,426 @@ const appmenu = {
         total: 0,
         data: [
             {
-                authType: 1,
-                sort: 1,
-                title: '好友查询',
-                code: 'Member',
-                url: '/member',
-                urlType: 1,
-                component: 'views/member/index.vue',
-                icon: 'UserFilled',
+                authType: 2,
+                sort: 0,
+                title: '底部单据菜单',
+                code: 'bottom',
+                children: [
+                    {
+                        authType: 2,
+                        sort: 1,
+                        title: '资金信息',
+                        code: 'bottom_capital',
+                        component: 'views/footer/index.vue',
+                        children: [
+                            {
+                                authType: 2,
+                                sort: 1,
+                                title: '资金汇总',
+                                code: 'bottom_capital_summary',
+                                component: 'views/footer/capital/summary/index.vue',
+                                children: [
+                                    {
+                                        authType: 3,
+                                        title: '充值',
+                                        code: 'bottom_capital_summary_deposit',
+                                        component: 'views/footer/capital/summary/deposit/index.vue',
+                                    },
+                                    {
+                                        authType: 3,
+                                        title: '提现',
+                                        code: 'bottom_capital_summary_withdraw',
+                                        component: 'views/footer/capital/summary/withdraw/index.vue',
+                                    },
+                                ]
+                            },
+                            {
+                                authType: 2,
+                                sort: 2,
+                                title: '资金流水',
+                                code: 'bottom_capital_statement',
+                                component: 'views/footer/capital/statement/index.vue',
+                            }
+                        ]
+                    },
+                    {
+                        authType: 2,
+                        sort: 2,
+                        title: '商品订单',
+                        code: 'bottom_goods',
+                        component: 'views/footer/index.vue',
+                        children: [
+                            {
+                                authType: 2,
+                                sort: 1,
+                                title: '合约汇总',
+                                code: 'bottom_goods_position',
+                                component: 'views/footer/goods/position/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 2,
+                                title: '委托',
+                                code: 'bottom_goods_order',
+                                component: 'views/footer/goods/order/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 3,
+                                title: '成交',
+                                code: 'bottom_goods_trade',
+                                component: 'views/footer/goods/trade/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 4,
+                                title: '交收',
+                                code: 'bottom_goods_delivery',
+                                component: 'views/footer/goods/delivery/index.vue',
+                            }
+                        ]
+                    },
+                    {
+                        authType: 2,
+                        sort: 3,
+                        title: '现货仓单',
+                        code: 'bottom_spot',
+                        component: 'views/footer/index.vue',
+                        children: [
+                            {
+                                authType: 2,
+                                sort: 1,
+                                title: '现货明细',
+                                code: 'bottom_spot_position',
+                                component: 'views/footer/spot/position/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 2,
+                                title: '挂单',
+                                code: 'bottom_spot_order',
+                                component: 'views/footer/spot/order/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 3,
+                                title: '成交',
+                                code: 'bottom_spot_trade',
+                                component: 'views/footer/spot/trade/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 4,
+                                title: '提货',
+                                code: 'bottom_spot_pickup',
+                                component: 'views/footer/spot/pickup/index.vue',
+                            }
+                        ]
+                    },
+                    {
+                        authType: 2,
+                        sort: 4,
+                        title: '履约信息',
+                        code: 'bottom_performance',
+                        component: 'views/footer/index.vue',
+                        children: [
+                            {
+                                authType: 2,
+                                sort: 1,
+                                title: '买履约',
+                                code: 'bottom_performance_buy',
+                                component: 'views/footer/performance/list/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 2,
+                                title: '卖履约',
+                                code: 'bottom_performance_sell',
+                                component: 'views/footer/performance/list/index.vue',
+                            }
+                        ]
+                    },
+                ]
             },
             {
                 authType: 1,
-                sort: 2,
-                title: '收益查询',
-                code: 'Profit',
-                url: '/profit',
+                sort: 1,
+                title: '交易市场',
+                code: 'market',
+                url: '/market',
                 urlType: 1,
-                component: 'views/profit/index.vue',
+                component: 'Page',
                 icon: 'TrendCharts',
-            },
-            {
-                authType: 1,
-                sort: 3,
-                title: '比例查询',
-                code: 'Ratio',
-                url: '/ratio',
-                urlType: 1,
-                component: 'views/ratio/index.vue',
-                icon: 'Histogram',
                 children: [
                     {
-                        authType: 3,
-                        title: '流水',
-                        code: 'RatioHistory',
-                        component: 'views/ratio/components/history/index.vue',
+                        authType: 1,
+                        sort: 1,
+                        title: '交易市场',
+                        code: 'market_trade',
+                        url: 'trade',
+                        urlType: 1,
+                        component: 'Main',
+                        children: [
+                            {
+                                authType: 1,
+                                sort: 1,
+                                title: '订单交易',
+                                code: 'market_trade_goods',
+                                url: 'goods',
+                                urlType: 1,
+                                component: 'views/market/trade/goods/index.vue',
+                            },
+                            {
+                                authType: 1,
+                                sort: 2,
+                                title: '仓单交易',
+                                code: 'market_trade_spot',
+                                url: 'spot',
+                                urlType: 1,
+                                component: 'views/market/trade/spot/index.vue',
+                            }
+                        ],
                     },
                 ]
             },
             {
                 authType: 1,
-                sort: 4,
-                title: '交易数据',
-                code: 'Tradedata',
-                url: '/tradedata',
+                sort: 2,
+                title: '查询',
+                code: 'query',
+                url: '/query',
                 urlType: 1,
-                component: 'views/tradedata/index.vue',
+                component: 'Page',
                 icon: 'TrendCharts',
+                children: [
+                    {
+                        authType: 1,
+                        sort: 1,
+                        title: '委托记录',
+                        code: 'query_order',
+                        url: 'order',
+                        urlType: 1,
+                        component: 'Main',
+                        children: [
+                            {
+                                authType: 1,
+                                sort: 1,
+                                title: '商品合约',
+                                code: 'query_order_goods',
+                                url: 'goods',
+                                urlType: 1,
+                                component: 'views/query/order/goods/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '当前记录',
+                                        code: 'query_order_goods_list',
+                                        component: 'views/query/order/goods/list/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '历史记录',
+                                        code: 'query_order_goods_history',
+                                        component: 'views/query/order/goods/history/index.vue',
+                                    }
+                                ]
+                            },
+                            {
+                                authType: 1,
+                                sort: 2,
+                                title: '现货仓单',
+                                code: 'query_order_spot',
+                                url: 'spot',
+                                urlType: 1,
+                                component: 'views/query/order/spot/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '当前记录',
+                                        code: 'query_order_spot_list',
+                                        component: 'views/query/order/spot/list/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '历史记录',
+                                        code: 'query_order_spot_history',
+                                        component: 'views/query/order/spot/history/index.vue',
+                                    }
+                                ]
+                            }
+                        ],
+                    },
+                    {
+                        authType: 1,
+                        sort: 2,
+                        title: '成交记录',
+                        code: 'query_trade',
+                        url: 'trade',
+                        urlType: 1,
+                        component: 'Main',
+                        children: [
+                            {
+                                authType: 1,
+                                sort: 1,
+                                title: '商品合约',
+                                code: 'query_trade_goods',
+                                url: 'goods',
+                                urlType: 1,
+                                component: 'views/query/trade/goods/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '当前记录',
+                                        code: 'query_trade_goods_list',
+                                        component: 'views/query/trade/goods/list/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '历史记录',
+                                        code: 'query_trade_goods_history',
+                                        component: 'views/query/trade/goods/history/index.vue',
+                                    }
+                                ]
+                            },
+                            {
+                                authType: 1,
+                                sort: 2,
+                                title: '现货仓单',
+                                code: 'query_trade_spot',
+                                url: 'spot',
+                                urlType: 1,
+                                component: 'views/query/trade/spot/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '当前记录',
+                                        code: 'query_trade_spot_list',
+                                        component: 'views/query/trade/spot/list/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '历史记录',
+                                        code: 'query_trade_spot_history',
+                                        component: 'views/query/trade/spot/history/index.vue',
+                                    }
+                                ]
+                            }
+                        ],
+                    },
+                    {
+                        authType: 1,
+                        sort: 3,
+                        title: '资金流水',
+                        code: 'query_capital',
+                        url: 'capital',
+                        urlType: 1,
+                        component: 'views/query/capital/index.vue',
+                        children: [
+                            {
+                                authType: 2,
+                                sort: 1,
+                                title: '当前记录',
+                                code: 'query_capital_list',
+                                component: 'views/query/capital/list/index.vue',
+                            },
+                            {
+                                authType: 2,
+                                sort: 2,
+                                title: '历史记录',
+                                code: 'query_capital_history',
+                                component: 'views/query/capital/history/index.vue',
+                            }
+                        ]
+                    },
+                    {
+                        authType: 1,
+                        sort: 4,
+                        title: '履约查询',
+                        code: 'query_performance',
+                        url: 'performance',
+                        urlType: 1,
+                        component: 'Main',
+                        children: [
+                            {
+                                authType: 1,
+                                sort: 1,
+                                title: '买履约',
+                                code: 'query_performance_buy',
+                                url: 'buy',
+                                urlType: 1,
+                                component: 'views/query/performance/buy/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '执行中',
+                                        code: 'query_performance_buy_running',
+                                        component: 'views/query/performance/buy/running/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '全部',
+                                        code: 'query_performance_buy_all',
+                                        component: 'views/query/performance/buy/all/index.vue',
+                                    }
+                                ]
+                            },
+                            {
+                                authType: 1,
+                                sort: 2,
+                                title: '卖履约',
+                                code: 'query_performance_sell',
+                                url: 'sell',
+                                urlType: 1,
+                                component: 'views/query/performance/sell/index.vue',
+                                children: [
+                                    {
+                                        authType: 2,
+                                        sort: 1,
+                                        title: '执行中',
+                                        code: 'query_performance_sell_running',
+                                        component: 'views/query/performance/sell/running/index.vue',
+                                    },
+                                    {
+                                        authType: 2,
+                                        sort: 2,
+                                        title: '全部',
+                                        code: 'query_performance_sell_all',
+                                        component: 'views/query/performance/sell/all/index.vue',
+                                    }
+                                ]
+                            }
+                        ],
+                    },
+                ]
             },
             {
                 authType: 1,
-                sort: 5,
-                title: '推广收益',
-                code: 'Promotion',
-                url: '/promotion',
+                sort: 3,
+                title: '账户管理',
+                code: 'account',
+                url: '/account',
                 urlType: 1,
-                component: 'views/promotion/index.vue',
-                icon: 'Histogram',
+                component: 'Page',
+                icon: 'TrendCharts',
                 children: [
                     {
-                        authType: 3,
-                        title: '明细',
-                        code: 'PromotionDetails',
-                        component: 'views/promotion/components/details/index.vue',
-                    },
-                    {
-                        authType: 3,
-                        title: '支取',
-                        code: 'PromotionPayment',
-                        component: 'views/promotion/components/payment/index.vue',
+                        authType: 1,
+                        sort: 1,
+                        title: '签约账号管理',
+                        code: 'account_sign',
+                        url: 'sign',
+                        urlType: 1,
+                        component: 'views/account/sign/index.vue',
                     },
                 ]
             },

+ 3 - 16
src/packages/pc/App.vue

@@ -1,7 +1,7 @@
 <template>
   <el-config-provider :locale="zhCn">
-    <app-page v-if="hasLogin" />
-    <router-view v-else />
+    <!-- 一级路由 -->
+    <router-view />
   </el-config-provider>
 </template>
 
@@ -12,19 +12,14 @@ export default {
 </script>-->
 
 <script lang="ts" setup>
-import { ref, watch } from 'vue'
-import { useRouter, useRoute } from 'vue-router'
+import { useRouter } from 'vue-router'
 import { ElMessageBox } from 'element-plus'
 import { useLogin } from '@/business/login'
-import { useLoginStore } from '@/stores'
 import zhCn from 'element-plus/lib/locale/lang/zh-cn'
 import eventBus from '@/services/bus'
 
 const { userLogout } = useLogin()
-const loginStore = useLoginStore()
-const route = useRoute()
 const router = useRouter()
-const hasLogin = ref(false)
 
 // 接收用户登出通知
 eventBus.$on('LogoutNotify', (msg) => {
@@ -35,12 +30,4 @@ eventBus.$on('LogoutNotify', (msg) => {
     router.replace({ name: 'login' })
   })
 })
-
-watch(() => route.name, (routeName) => {
-  if (routeName === 'boot' || routeName === 'login' || !loginStore.token) {
-    hasLogin.value = false
-  } else {
-    hasLogin.value = true
-  }
-})
 </script>

BIN
src/packages/pc/assets/images/login-bg.jpg


BIN
src/packages/pc/assets/logo-horizontal.png


+ 153 - 39
src/packages/pc/assets/themes/default/variable.less

@@ -1,59 +1,173 @@
 [theme='default'] {
     /* 字体大小规范 */
-    --font-x-large            : 18px;
-    --font-large              : 16px;
-    --font-medium             : 14px;
-    --font-small              : 12px;
-    --font-x-small            : 10px;
+    --font-x-large: 18px;
+    --font-large: 16px;
+    --font-medium: 14px;
+    --font-small: 12px;
+    --font-x-small: 10px;
     /* 颜色规范 */
-    --color-default           : #384048;
-    --color-primary           : #409EFF;
-    --color-secondary         : #04c786;
-    --color-info              : #999;
-    --color-border            : #eee;
+    --color-default: #e5e5e5;
+    --color-primary: #1890ff;
+    --color-secondary: #88a0ae;
+    --color-info: #394753;
+    --color-border: #161a1c;
+    --bg-color-default: #0e0e0f;
+    --bg-color-primary: #181e22;
     /* 间距规范 */
-    --space-medium            : 20px;
+    --space-medium: 20px;
     /* 状态栏 */
-    --statusbar-height        : 56px;
+    --statusbar-height: 32px;
     /* 标签栏 */
-    --tabbar-active           : #374758;
-    --tabbar-hover            : #eee;
-    --tabbar-close-hover      : red;
+    --tabbar-active: #374758;
+    --tabbar-hover: #eee;
+    --tabbar-close-hover: red;
     /* 侧边栏 */
-    --sidebar-width           : 220px;
-    --sidebar-background      : #2b3a4a;
-    --sidebar-header-height   : 56px;
-    --sidebar-header-border   : 1px solid #374758;
-    --sidebar-menu-inline     : #263442;
-    --sidebar-menu-item       : #8699ad;
-    --sidebar-menu-item-hover : #374758;
-    --sidebar-menu-item-active: #278eff;
+    --sidebar-width: 180px;
+    --sidebar-background: #1d2327;
+    --sidebar-header-height: 56px;
+    --sidebar-header-border: 1px solid #374758;
+    --sidebar-menu-inline: #000c17;
+    --sidebar-menu-item: #8699ad;
+    --sidebar-menu-item-hover: #3a87f7;
+    --sidebar-menu-item-active: #3a87f7;
+
+    .el-select {
+        --el-select-border-color-hover: #45535e;
+        --el-select-input-focus-border-color: var(--el-select-border-color-hover);
+    }
+
+    .el-form {
+        &--vertical {
+            .el-input {
+                --el-input-bg-color: #252d34;
+                --el-input-border-color: var(--el-input-bg-color);
+                --el-input-hover-border-color: #45535e;
+                --el-input-focus-border-color: var(--el-input-hover-border-color);
+                --el-input-text-color: var(--color-default);
+                --el-text-color-placeholder: #4f5f6c;
+            }
+        }
+
+        &--horizontal {
+            --el-text-color-regular: var(--color-secondary);
+
+            display: flex;
+            flex-wrap: wrap;
+
+            .el-form-item {
+                width: 50%;
+
+                &__label {
+                    padding: 0 12px;
+                }
+
+                &__content {
+                    align-items: flex-start;
+                    padding-right: 80px;
+                }
+
+                &--row {
+                    width: 100%;
+                }
+
+                &--col {
+                    display: flex;
+                    width: 100%;
+                    gap: 10px;
+                }
+            }
+
+            .el-input {
+                --el-input-bg-color: #15202b;
+                --el-input-border-color: #2b3f52;
+                --el-input-hover-border-color: var(--el-color-primary);
+                --el-input-text-color: var(--color-default);
+                --el-text-color-placeholder: #4f5f6c;
+            }
+
+            .el-select {
+                width: 100%;
+            }
+        }
+    }
 
     .app-tabs {
-        &--info {
-            .tabs {
-                flex-wrap: wrap;
-
-                &-item {
-                    display         : flex;
-                    justify-content : center;
-                    align-items     : center;
-                    color           : #626675;
-                    cursor          : pointer;
-                    border-radius   : 4px;
-                    background-color: #f0f0f1;
-                    padding         : 8px 16px;
+        &--primary {
+            height: 100%;
+
+            &.app-tabs--top>.app-tabs__navbar {
+                background-color: #181e22;
+                border-bottom: 1px solid #3a87f7;
+                padding: 2px;
+                padding-bottom: 0;
+
+                .tabs-item {
+                    height: 32px;
+                    line-height: 32px;
+                    min-width: 120px;
+                    color: #88a0ae;
+                    text-align: center;
+                    cursor: pointer;
+                    border-radius: 5px 5px 0px 0px;
+                    background: linear-gradient(0deg, #262e35 0%, #283139 100%);
+                    padding: 0 12px;
+
+                    &:not(:first-child) {
+                        margin-left: 3px;
+                    }
+
+                    &.is-active {
+                        color: #fff;
+                        background: linear-gradient(0deg, #26487c 0%, #29538c 100%);
+                    }
+                }
+            }
+
+            &.app-tabs--bottom>.app-tabs__navbar {
+                padding: 2px;
+
+                .tabs-item {
+                    height: 26px;
+                    line-height: 26px;
+                    min-width: 120px;
+                    color: #88a0ae;
+                    text-align: center;
+                    cursor: pointer;
+                    background: linear-gradient(0deg, #262e35 0%, #283139 100%);
+                    padding: 0 12px;
 
                     &:not(:first-child) {
-                        margin-left: 10px;
+                        margin-left: 3px;
                     }
 
                     &.is-active {
-                        color      : #222;
-                        font-weight: bold;
+                        color: #fff;
+                        background: linear-gradient(0deg, #26487c 0%, #29538c 100%);
                     }
                 }
             }
         }
+
+        &--info {
+            .tabs-item {
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                color: #626675;
+                cursor: pointer;
+                border-radius: 4px;
+                background-color: #f0f0f1;
+                padding: 8px 16px;
+
+                &:not(:first-child) {
+                    margin-left: 10px;
+                }
+
+                &.is-active {
+                    color: #222;
+                    font-weight: bold;
+                }
+            }
+        }
     }
 }

+ 46 - 19
src/packages/pc/components/base/drawer/index.less

@@ -1,37 +1,42 @@
 .app-drawer {
     &__wrapper {
-        display         : flex;
-        flex-direction  : column;
-        max-height      : 100vh;
-        min-width       : 360px;
-        border-radius   : 4px;
-        background-color: #fff;
-        box-shadow      : 0 0 20px 0 rgba(0, 0, 0, .15);
-        overflow        : hidden;
+        display: flex;
+        flex-direction: column;
+        max-height: 100vh;
+        min-width: 360px;
+        color: #fff;
+        border-radius: 4px;
+        background: linear-gradient(#084258 0, #102e45 38px, #102e45 100%);
+        box-shadow: 0 0 20px 0 rgba(0, 0, 0, .15);
+        overflow: hidden;
     }
 
     &__header {
-        display        : flex;
-        justify-content: space-between;
-        align-items    : center;
-        border-bottom  : 1px solid #f2f2f2;
-        padding        : 16px 24px;
+        position: relative;
+        height: 38px;
+        line-height: 38px;
+        text-align: center;
 
         h1 {
             font-size: 16px;
         }
 
         .el-icon {
+            position: absolute;
+            top: 50%;
+            right: 24px;
+            transform: translate3d(0, -50%, 0);
             font-size: 16px;
-            cursor   : pointer;
+            cursor: pointer;
         }
     }
 
     &__body {
-        flex       : 1;
-        overflow-y : auto;
-        line-height: normal;
-        padding    : 24px 48px 0 48px;
+        flex: 1;
+        overflow-y: auto;
+        background-color: #0f1a25;
+        padding: 24px;
+        padding-bottom: 0;
 
         &:last-child {
             padding-bottom: 24px;
@@ -40,6 +45,28 @@
 
     &__footer {
         text-align: center;
-        padding   : 32px 48px;
+        background-color: #0f1a25;
+        padding: 24px;
+    }
+
+    &.border &__wrapper {
+        padding: 8px;
+        padding-top: 0;
+    }
+
+    &.border &__header {
+        .el-icon {
+            left: 10px;
+            right: auto;
+        }
+    }
+
+    &.border &__body {
+        padding: 20px;
+    }
+
+    &.border &__footer {
+        padding: 20px;
+        padding-top: 0;
     }
 }

+ 5 - 1
src/packages/pc/components/base/drawer/index.vue

@@ -1,6 +1,6 @@
 <!-- 抽屉弹框组件 -->
 <template>
-  <app-modal class="app-drawer" :show="show" :close-on-click-mask="false" @mask="close">
+  <app-modal :class="['app-drawer', border && 'border']" :show="show" :close-on-click-mask="false" @mask="close">
     <div class="app-drawer__wrapper" v-loading="loading">
       <div class="app-drawer__header">
         <slot name="header">
@@ -34,6 +34,10 @@ defineProps({
     type: String,
     default: '',
   },
+  border: {
+    type: Boolean,
+    default: false,
+  },
   loading: {
     type: Boolean,
     default: false,

+ 24 - 29
src/packages/pc/components/base/table/index.less

@@ -1,20 +1,21 @@
 .app-table {
-    width: 100%;
-    line-height: normal;
-
-    &:not(:first-child) {
-        margin-top: 20px;
-    }
+    display: flex;
+    flex-direction: column;
+    height: 100%;
 
     &__header {
         display: flex;
         align-items: center;
+        padding: 6px;
+
+        &:empty {
+            display: none;
+        }
 
         >.block {
             display: inline-flex;
             align-items: center;
             gap: 10px;
-            margin-bottom: 10px;
 
             &:empty {
                 display: none;
@@ -26,6 +27,11 @@
         }
     }
 
+    &__container {
+        flex: 1;
+        overflow: hidden;
+    }
+
     &__footer {
         margin-top: 20px;
 
@@ -36,47 +42,36 @@
 
     .el-table {
         --el-table-bg-color: transparent; //表格背景颜色
-        --el-table-text-color: #000; //表格文字颜色
-        --el-table-border-color: #ebeef5; // 表格边框颜色
+        --el-table-text-color: #e5e5e5; //表格文字颜色
+        --el-table-border-color: #161a1c; // 表格边框颜色
         --el-table-border: 1px solid var(--el-table-border-color); // 表格边框
-        --el-table-header-bg-color: #f1f5f9; // 表头背景颜色
+        --el-table-header-bg-color: #212629; // 表头背景颜色
         --el-table-header-text-color: #556772; // 表头文字颜色
         --el-table-tr-bg-color: var(--el-table-bg-color); // 表格行背景颜色
-        --el-table-row-hover-bg-color: #f5f7fa; // 表格行鼠标经过背景色
+        --el-table-row-hover-bg-color: #172b56; // 表格行鼠标经过背景色
         --el-table-expanded-cell-bg-color: var(--el-table-bg-color); // 展开行背景颜色
-        --el-table-current-row-bg-color: #f5f7fa; // 当前行高亮颜色
+        --el-table-current-row-bg-color: #172b56; // 当前行高亮颜色
 
         width: 100%;
 
         th.el-table__cell {
+            height: 30px;
             font-weight: normal;
-            padding: 8px 0;
+            padding: 4px 0;
         }
 
         td.el-table__cell {
-            padding: 8px 0;
-
-            &.radio .el-radio__label {
-                display: none;
-            }
+            padding: 4px 0;
 
             .el-table__placeholder:empty {
                 display: none;
             }
         }
 
-        &-column {
-            &--selection {
-                &.single {
-                    .el-checkbox {
-                        display: none;
-                    }
-                }
-            }
-        }
-
         &__expanded-cell {
-            .app-action-menu {
+            padding: 4px !important;
+
+            .app-auth {
                 position: sticky;
                 right: 5px;
                 display: table;

+ 9 - 12
src/packages/pc/components/base/table/index.vue

@@ -1,7 +1,7 @@
 <template>
-  <div class="app-table" v-loading="loading">
+  <div class="app-table" v-loading="loading" element-loading-background="rgba(0, 0, 0, .5)">
     <div class="app-table__header">
-      <div class="block block--left">
+      <div class="block block--left" v-if="$slots.header">
         <slot name="header"></slot>
       </div>
       <div class="block block--right" v-if="showToolbar">
@@ -14,8 +14,8 @@
       </div>
     </div>
     <div class="app-table__container">
-      <el-table ref="tableRef" :header-cell-class-name="selectionType" v-bind="$attrs" highlight-current-row
-        scrollbar-always-on @row-click="onRowClick" @select="onSelect">
+      <el-table ref="tableRef" height="100%" :header-cell-class-name="selectionType" v-bind="$attrs" highlight-current-row
+        scrollbar-always-on @row-click="onRowClick" @select="onSelect" border>
         <!-- 展开行 -->
         <el-table-column type="expand" v-if="$slots.expand">
           <template #default="{ row, $index }">
@@ -24,6 +24,8 @@
         </el-table-column>
         <!-- 选择列 -->
         <el-table-column type="selection" width="55" align="center" fixed v-if="selectionType" />
+        <!-- 序号 -->
+        <el-table-column type="index" label="序号" align="center" :width="80" v-if="showIndex" />
         <!-- 数据列 -->
         <template v-for="(item, index) in columns" :key="index">
           <el-table-column :class-name="item.className" :align="item.align ?? 'center'" :min-width="120"
@@ -63,14 +65,9 @@ export default defineComponent({
       default: () => ([])
     },
     // 是否显示头部工具栏
-    showToolbar: {
-      type: Boolean,
-      default: false
-    },
-    loading: {
-      type: Boolean,
-      default: false
-    },
+    showToolbar: Boolean,
+    loading: Boolean,
+    showIndex: Boolean,
     // 选择列类型
     selectionType: {
       type: String as PropType<'single' | 'multiple'>,

+ 3 - 0
src/packages/pc/components/base/upload/index.less

@@ -0,0 +1,3 @@
+.app-upload {
+    line-height: normal;
+}

+ 174 - 0
src/packages/pc/components/base/upload/index.vue

@@ -0,0 +1,174 @@
+<template>
+    <div class="app-upload">
+        <el-upload ref="uploadRef" :accept="acceptTypes.join(',')" :file-list="fileList" :limit="limit"
+            :multiple="limit > 1" :action="uploadUrl" :before-upload="onBeforeUpload" @success="onSuccess"
+            @remove="onRemove" @preview="onPreview" @exceed="onExceed">
+            <template #tip>
+                <div class="el-upload__tip">
+                    <slot name="tip"></slot>
+                </div>
+            </template>
+            <slot>
+                <el-button type="primary">上传</el-button>
+            </slot>
+        </el-upload>
+        <el-image-viewer :url-list="imageList.map((e)=>e.filePath)" :initial-index="imageIndex" @close="onViewerClose"
+            v-if="showViewer" teleported />
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, shallowReactive, computed, PropType, toRaw, onMounted } from 'vue'
+import { ElMessage, UploadProps, UploadUserFile, UploadRawFile, UploadFile, UploadFiles, UploadInstance, genFileId } from 'element-plus'
+import { getFileUrl } from '@/filters'
+import service from '@/services'
+
+const props = defineProps({
+    fileTypes: {
+        type: Array as PropType<readonly ('image' | 'pdf' | 'word' | 'excel')[]>,
+        default: () => ([])
+    },
+    limit: {
+        type: Number,
+        default: 1
+    },
+    maxSize: {
+        type: Number,
+        default: 0
+    },
+    typeMessage: {
+        type: String,
+        default: '请选择正确的文件类型'
+    }
+})
+
+const emit = defineEmits(['change'])
+
+const { uploadUrl } = service.config
+const uploadRef = shallowRef<UploadInstance>()
+const showViewer = shallowRef(false)
+const fileList = shallowRef<UploadUserFile[]>([])
+const acceptTypes = shallowReactive<string[]>([]) // 接受上传的文件类型
+const uploadTypes = shallowReactive<string[]>([]) // 允许上传的文件类型
+const imageIndex = shallowRef(0)
+const imageTypes = ['image/png', 'image/jpeg']
+
+// 预览图列表
+const imageList = computed(() => {
+    const result: { uid: number, filePath: string }[] = []
+    fileList.value.forEach(({ raw, uid, response }) => {
+        if (raw && uid && response) {
+            // 判断是否图片类型
+            if (imageTypes.includes(raw.type)) {
+                (response as { filePath: string }[]).forEach((e) => {
+                    result.push({
+                        uid,
+                        filePath: getFileUrl(e.filePath)
+                    })
+                })
+            }
+        }
+    })
+    return result
+})
+
+const onChange = () => {
+    const files = fileList.value.reduce((res, { response }) => {
+        const list = (response ?? []) as unknown[]
+        list.forEach((e) => {
+            res.push(toRaw(e))
+        })
+        return res
+    }, [] as unknown[])
+    emit('change', props.limit > 1 ? files : files[0] ?? {})
+}
+
+// 当超出限制时的回调
+const onExceed = (files: File[]) => {
+    if (props.limit === 1) {
+        const el = uploadRef.value
+        if (el) {
+            const rawFile = files[0] as UploadRawFile
+            if (uploadTypes.includes(rawFile.type)) {
+                rawFile.uid = genFileId()
+                el.clearFiles()
+                el.handleStart(rawFile)
+                el.submit()
+            } else {
+                ElMessage.warning(props.typeMessage)
+            }
+        }
+    } else {
+        ElMessage.warning(`最多只能上传${props.limit}个文件`)
+    }
+}
+
+// 上传之前判断文件类型
+const onBeforeUpload = (rawFile: UploadRawFile) => {
+    if (uploadTypes.includes(rawFile.type)) {
+        return true
+    }
+    ElMessage.warning(props.typeMessage)
+    return false
+}
+
+// 上传成功的回调
+const onSuccess = (response: unknown, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
+    fileList.value = uploadFiles
+    onChange()
+}
+
+const onRemove = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {
+    fileList.value = uploadFiles
+    onChange()
+}
+
+// 打开预览图
+const onPreview: UploadProps['onPreview'] = ({ uid, raw }: UploadFile) => {
+    if (imageList.value.length) {
+        // 判断是否图片类型
+        if (imageTypes.includes(raw?.type ?? '')) {
+            const index = imageList.value.findIndex((e) => e.uid === uid)
+            if (index > -1) {
+                imageIndex.value = index
+                showViewer.value = true
+            }
+        }
+    }
+}
+
+const onViewerClose = () => {
+    showViewer.value = false
+}
+
+onMounted(() => {
+    props.fileTypes.forEach((value) => {
+        switch (value) {
+            case 'image': {
+                acceptTypes.push('.jpg', '.jpeg', '.png')
+                uploadTypes.push(...imageTypes)
+                break
+            }
+            case 'pdf': {
+                acceptTypes.push('.pdf')
+                uploadTypes.push('application/pdf')
+                break
+            }
+            case 'word': {
+                acceptTypes.push('.doc', '.docx')
+                uploadTypes.push('application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
+                break
+            }
+            case 'excel': {
+                acceptTypes.push('.xls', '.xlsx')
+                uploadTypes.push('application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
+                break
+            }
+        }
+    })
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 43 - 1
src/packages/pc/components/layouts/footer/index.less

@@ -1 +1,43 @@
-.app-footer {}
+.app-footer {
+    display: flex;
+    height: 280px;
+    color: #fff;
+    background-color: #0e0e0f;
+    border-top: 1px solid #363f45;
+
+    &__info {
+        background-color: #272f36;
+
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            text-align: left;
+
+            tbody {
+                td {
+                    border: 1px solid #343D45;
+                    padding: 8px;
+
+                    &:first-child {
+                        color: #7A8A94;
+                        border-left: 0;
+                    }
+
+                    &:last-child {
+                        text-align: right;
+                        border-right: 0;
+                    }
+                }
+            }
+        }
+    }
+
+    &__main {
+        flex: 1;
+        overflow: hidden;
+
+        .app-table {
+            background-color: #181e22;
+        }
+    }
+}

+ 51 - 1
src/packages/pc/components/layouts/footer/index.vue

@@ -1,8 +1,58 @@
 <template>
-    <div class="app-footer"></div>
+    <div class="app-footer" v-if="accountList.length">
+        <div class="app-footer__info">
+            <div>{{ accountInfo.accountid }}</div>
+            <table>
+                <colgroup>
+                    <col width="64px" />
+                    <col width="auto" />
+                </colgroup>
+                <tbody>
+                    <tr>
+                        <td>权益</td>
+                        <td>0</td>
+                    </tr>
+                    <tr>
+                        <td>余额</td>
+                        <td>{{ accountInfo.currentbalance }}</td>
+                    </tr>
+                    <tr>
+                        <td>可用</td>
+                        <td>0</td>
+                    </tr>
+                    <tr>
+                        <td>占用</td>
+                        <td>{{ accountInfo.usedmargin }}</td>
+                    </tr>
+                    <!-- <tr>
+                        <td>浮盈</td>
+                        <td :class="handlePriceColor(accountInfo.totalProfitLoss, 0)">{{ accountInfo.totalProfitLoss }}
+                        </td>
+                    </tr> -->
+                </tbody>
+            </table>
+        </div>
+        <div class="app-footer__main">
+            <app-auth-component code="bottom">
+                <el-select placeholder="请选择资金账户" :disabled="loading" v-model="accountId" @change="onAccountChange">
+                    <el-option :label="item.accountid" :value="item.accountid" v-for="(item, index) in accountList"
+                        :key="index" />
+                </el-select>
+            </app-auth-component>
+        </div>
+    </div>
 </template>
 
 <script lang="ts" setup>
+import { useAccountStore } from '@/stores'
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+
+const { accountList, accountInfo, accountId, loading, getAccountPositionList } = useAccountStore()
+
+// 切换资金账户
+const onAccountChange = () => {
+    getAccountPositionList()
+}
 </script>
 
 <style lang="less">

+ 1 - 1
src/packages/pc/components/layouts/header/index.less

@@ -3,7 +3,7 @@
     justify-content: space-between;
     align-items: center;
     min-height: var(--statusbar-height);
-    color: #525b65;
+    color: #7a8a94;
     padding: 0 20px;
 
     &__left {

+ 1 - 8
src/packages/pc/components/layouts/header/index.vue

@@ -2,14 +2,7 @@
     <div class="app-header">
         <div class="app-header__left">
             <slot name="left"></slot>
-            <el-breadcrumb :separator-icon="ArrowRight" v-show="!globalStore.isMobile">
-                <template v-for="(item, index) in $route.matched" :key="index">
-                    <el-breadcrumb-item :to="{ path: item.path }">
-                        <!--<i :class="item.meta.icon" v-if="item.meta.icon"></i>-->
-                        <span>{{ item.meta.title ?? 'item.name' }}</span>
-                    </el-breadcrumb-item>
-                </template>
-            </el-breadcrumb>
+            <span>多元世纪</span>
         </div>
         <div class="app-header__right">
             <slot name="right"></slot>

+ 25 - 0
src/packages/pc/components/layouts/main/index.less

@@ -0,0 +1,25 @@
+.app-main {
+    &__container {
+        height: 100%;
+    }
+
+    &__teleport {
+        position  : absolute;
+        z-index   : 9;
+        left      : 0;
+        top       : 0;
+        width     : 100%;
+        height    : 100%;
+        overflow-y: auto;
+
+        /* teleport 为空时隐藏元素 */
+        &:empty {
+            display: none;
+        }
+
+        /* teleport 非空时隐藏兄弟元素 */
+        &:not(:empty)+.el-scrollbar {
+            opacity: 0;
+        }
+    }
+}

+ 41 - 0
src/packages/pc/components/layouts/main/index.vue

@@ -0,0 +1,41 @@
+<template>
+    <app-tabs class="app-main app-tabs--primary" prop-label="title" :data-list="threeMenus" v-model:data-index="dataIndex"
+        @change="onTabChange">
+        <div id="appMainTeleport" class="app-main__teleport"></div>
+        <el-scrollbar view-class="app-main__container" always>
+            <!-- 三级路由 -->
+            <router-view v-slot="{ Component, route }">
+                <component :is="Component" :key="route.fullPath" />
+            </router-view>
+        </el-scrollbar>
+    </app-tabs>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { useMenu } from '@/hooks/menu'
+import AppTabs from '@/components/base/tabs/index.vue'
+
+const { route, router, getChildrenMenus } = useMenu()
+const parentRoute = route.matched[route.matched.length - 2] // 父级路由信息
+const threeMenus = shallowRef<Model.UserRoutes[]>([]) // 三级菜单
+const dataIndex = shallowRef(0) // 选中的标签
+
+if (parentRoute) {
+    const menus = getChildrenMenus(parentRoute.name?.toString())
+    const index = menus.findIndex((e) => e.code === route.name)
+    threeMenus.value = menus
+    if (index > -1) {
+        dataIndex.value = index
+    }
+}
+
+// 切换标签
+const onTabChange = (index: number, { code }: Model.UserRoutes) => {
+    router.push({ name: code })
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 16 - 16
src/packages/pc/components/layouts/page/index.less

@@ -1,23 +1,10 @@
 .app-page {
     display: flex;
+    flex-direction: column;
     height: 100%;
 
-    &__sidebar {
-        height: 100%;
-        overflow-y: auto;
-        -webkit-overflow-scrolling: touch;
-    }
-
-    &__wrapper {
-        flex: 1;
-        display: flex;
-        flex-direction: column;
-        background-color: #e7ebed;
-        overflow: hidden;
-    }
-
-    &__wrapper &__header {
-        background-color: #fff;
+    &__header {
+        background-color: #364048;
 
         .icon-fold-expand {
             margin-right: 10px;
@@ -37,6 +24,19 @@
         }
     }
 
+    &__wrapper {
+        flex: 1;
+        display: flex;
+        background-color: #0e0e0f;
+        overflow: hidden;
+    }
+
+    &__wrapper &__sidebar {
+        height: 100%;
+        overflow-y: auto;
+        -webkit-overflow-scrolling: touch;
+    }
+
     &__wrapper &__main {
         flex: 1;
         display: flex;

+ 14 - 13
src/packages/pc/components/layouts/page/index.vue

@@ -1,17 +1,17 @@
 <template>
   <div class="app-page">
-    <div class="app-page__sidebar">
-      <app-sidebar v-model:collapse="isCollapse" />
+    <div class="app-page__header">
+      <app-header>
+        <template #left>
+          <i class="icon-fold-expand" title="折叠/展开" @click="isCollapse = !isCollapse">
+            <span :class="isCollapse ? 'g-icon--expand' : 'g-icon--fold'"></span>
+          </i>
+        </template>
+      </app-header>
     </div>
     <div class="app-page__wrapper">
-      <div class="app-page__header">
-        <app-header>
-          <template #left>
-            <i class="icon-fold-expand" title="折叠/展开" @click="isCollapse = !isCollapse">
-              <span :class="isCollapse ? 'g-icon--expand' : 'g-icon--fold'"></span>
-            </i>
-          </template>
-        </app-header>
+      <div class="app-page__sidebar">
+        <app-sidebar v-model:collapse="isCollapse" />
       </div>
       <div class="app-page__main">
         <div class="app-page__navbar" v-if="false">
@@ -19,14 +19,15 @@
         </div>
         <div id="appPageTeleport" class="app-page__container app-page__teleport"></div>
         <div class="app-page__container">
+          <!-- 二级路由 -->
           <router-view v-slot="{ Component, route }">
             <component :is="handleComponent(Component, route)" :key="route.fullPath" />
           </router-view>
         </div>
       </div>
-      <div class="app-page__footer">
-        <app-footer />
-      </div>
+    </div>
+    <div class="app-page__footer">
+      <app-footer />
     </div>
   </div>
 </template>

+ 12 - 8
src/packages/pc/components/layouts/sidebar/index.less

@@ -1,4 +1,6 @@
 .app-sidebar {
+    border-right: 1px solid #0e0e0f;
+
     &__view {
         display: flex;
         flex-direction: column;
@@ -26,6 +28,7 @@
         align-items: center;
         padding: 0 20px;
         border-bottom: var(--sidebar-header-border);
+        display: none !important;
 
         &:not(.is-hide) {
             width: var(--sidebar-width);
@@ -67,7 +70,7 @@
     }
 
     &__menu {
-        --el-menu-item-height: 48px;
+        --el-menu-sub-item-height: 32px;
 
         .el-menu {
             border: 0;
@@ -79,6 +82,7 @@
 
             &--inline {
                 background-color: var(--sidebar-menu-inline);
+                padding: 5px 0;
             }
 
             &--collapse {
@@ -98,7 +102,7 @@
 
                     &.is-active {
                         .el-sub-menu__title {
-                            box-shadow: inset 2px 0 0 0 var(--sidebar-menu-item-active);
+                            background-color: var(--sidebar-menu-item-active);
                         }
 
                         .menu-icon {
@@ -115,13 +119,13 @@
 
                 &:hover {
                     color: #fff;
-                    background-color: var(--sidebar-menu-item-hover);
+                    background-color: transparent;
                 }
+            }
 
-                &.is-active {
-                    color: #fff;
-                    background-color: var(--sidebar-menu-item-active);
-                }
+            .el-sub-menu__title {
+                height: 48px;
+                line-height: 48px;
             }
 
             .el-sub-menu {
@@ -141,7 +145,7 @@
 
                     .el-menu-item.is-active {
                         color: #fff;
-                        box-shadow: inset 2px 0 0 0 var(--sidebar-menu-item-active);
+                        background-color: var(--sidebar-menu-item-active);
                     }
                 }
             }

+ 10 - 6
src/packages/pc/components/layouts/sidebar/index.vue

@@ -6,9 +6,7 @@
     <div class="app-sidebar__menu">
       <app-sidemenu :collapse="globalStore.isMobile ? false : collapse" @select="routerTo" />
     </div>
-    <div :class="['app-sidebar__copyright', globalStore.isMobile ? 'is-show' : collapse && 'is-hide']">
-      <span>&copy;{{ year }} Muchinfo</span>
-    </div>
+    <div :class="['app-sidebar__copyright', globalStore.isMobile ? 'is-show' : collapse && 'is-hide']"></div>
     <div :class="['app-sidebar__mask', collapse && 'is-hide']" @click="hideSidebar()" v-if="globalStore.isMobile"></div>
   </el-scrollbar>
 </template>
@@ -16,6 +14,7 @@
 <script lang="ts" setup>
 import { watch } from 'vue'
 import { useRouter } from 'vue-router'
+import { useMenu } from '@/hooks/menu'
 import { useGlobalStore } from '@/stores'
 import AppSidemenu from '../sidemenu/index.vue'
 
@@ -26,9 +25,8 @@ defineProps({
   collapse: Boolean,
 })
 
+const { router, getChildrenMenus } = useMenu()
 const globalStore = useGlobalStore()
-const router = useRouter()
-const year = new Date().getFullYear()
 
 const hideSidebar = () => {
   emit('update:collapse', globalStore.isMobile)
@@ -37,7 +35,13 @@ const hideSidebar = () => {
 // 菜单跳转
 const routerTo = (active: string) => {
   hideSidebar();
-  router.push({ name: active })
+  const submenus = getChildrenMenus(active)
+  // 判断是否存在子菜单
+  if (submenus.length) {
+    router.push({ name: submenus[0].code })
+  } else {
+    router.push({ name: active })
+  }
 }
 
 // 监听设备变化

+ 15 - 16
src/packages/pc/components/layouts/view/index.less

@@ -1,19 +1,19 @@
 .app-view {
-    flex                      : 1;
-    overflow                  : auto;
+    flex: 1;
+    overflow: auto;
     -webkit-overflow-scrolling: touch;
 
     &:after {
-        content    : '';
+        content: '';
         flex-shrink: 0;
-        display    : block;
-        height     : 20px;
+        display: block;
+        height: 20px;
     }
 
     &__header,
     &__footer,
     &__main {
-        padding   : 0 20px;
+        padding: 0 20px;
         margin-top: 15px;
     }
 
@@ -22,15 +22,14 @@
     }
 
     &__header &__container {
-        display  : flex;
+        display: flex;
         flex-wrap: wrap;
-        gap      : 12px;
+        gap: 12px;
     }
 
     &__container {
-        border-radius   : 4px;
-        background-color: #fff;
-        padding         : 20px;
+        border-radius: 4px;
+        padding: 20px;
 
         &:empty {
             display: none;
@@ -38,19 +37,19 @@
     }
 
     &--flex {
-        display       : flex;
+        display: flex;
         flex-direction: column;
-        height        : 100%;
+        height: 100%;
     }
 
     &--flex &__main {
-        flex    : 1;
+        flex: 1;
         overflow: hidden;
     }
 
     &--flex &__main &__container {
-        height                    : 100%;
-        overflow                  : auto;
+        height: 100%;
+        overflow: auto;
         -webkit-overflow-scrolling: touch;
     }
 }

+ 2 - 1
src/packages/pc/components/modules/auth-component/index.vue

@@ -1,6 +1,7 @@
 <!-- 动态组件 -->
 <template>
-    <app-tabs :data-list="dataList" v-model:data-index="dataIndex" prop-label="title" @change="onTabChange">
+    <app-tabs class="app-tabs--primary" :data-list="dataList" v-model:data-index="dataIndex" prop-label="title"
+        @change="onTabChange">
         <template #navbar>
             <slot></slot>
         </template>

+ 4 - 0
src/packages/pc/router/dynamicRouter.ts

@@ -32,6 +32,10 @@ export default new (class {
                         component = () => import('../components/layouts/page/index.vue');
                         break;
                     }
+                    case 'Main': {
+                        component = () => import('../components/layouts/main/index.vue');
+                        break;
+                    }
                     default: {
                         const componentString = item.component.replace(/^\/+/, ''); // 过滤字符串前面所有 '/' 字符
                         const componentPath = componentString.replace(/\.\w+$/, ''); // 过滤后缀名,为了让 import 加入 .vue ,不然会有警告提示...

+ 2 - 2
src/packages/pc/router/index.ts

@@ -9,7 +9,7 @@ const loginStore = useLoginStore()
 const routes: Array<RouteRecordRaw> = [
     {
         path: '/',
-        redirect: () => loginStore.token ? '/member' : '/login', // 重定向到默认页面
+        redirect: () => loginStore.token ? '/market/trade/goods' : '/login', // 重定向到默认页面
     },
     {
         path: '/login',
@@ -40,7 +40,7 @@ const router = historyRouter.create({
 router.beforeEach((to, from, next) => {
     const isLoginOrRegister = to.name === 'login' || to.name === 'register'
     const title = to.meta.title
-    document.title = title ? `推广查询系统 - ${title}` : '推广查询系统'
+    document.title = title ? `多元世纪 - ${title}` : '多元世纪'
 
     // 判断服务是否加载完成
     if (service.isReady) {

+ 12 - 0
src/packages/pc/views/account/sign/index.vue

@@ -0,0 +1,12 @@
+<!-- 签约账号管理 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 37 - 35
src/packages/pc/views/auth/components/layout/index.less

@@ -1,61 +1,63 @@
 .sign-layout {
     display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
     height: 100%;
+    background: url("~@pc/assets/images/login-bg.jpg") no-repeat center center;
+    background-size: cover;
 
-    &__left {
-        flex: 1;
-        background: url("~@pc/assets/images/login-bg.jpg") no-repeat center center;
-        background-size: cover;
-    }
-
-    &__right {
+    &__wrapper {
         display: flex;
-        flex-direction: column;
-        align-items: center;
-        width: 600px;
-        background-color: #fff;
-        padding: 0 110px;
-
-        .login {
-            flex: 1;
+
+        .left {
+            display: flex;
+            flex-direction: column;
+            line-height: normal;
+            color: #fff;
+            font-size: 36px;
+            padding: 60px 80px;
+            background-color: rgba(0, 87, 124, .35);
+            backdrop-filter: blur(5px);
+        }
+
+        .right {
             display: flex;
             flex-direction: column;
-            justify-content: center;
-            padding: 0 55px;
+            background-color: #fff;
+            padding: 60px 80px;
 
             &-logo {
-                text-align: center;
-                padding: 150px 0 55px 0;
+                margin-bottom: 50px;
 
                 img {
-                    width: 72px;
-                    height: 72px;
+                    width: 200px;
                 }
             }
 
+            &-title {
+                width: 100%;
+                font-size: 26px;
+                font-weight: bold;
+                margin-bottom: 20px;
+            }
+
             &-container {
                 flex: 1;
                 width: 260px;
 
-                &__title {
-                    font-size: 26px;
-                    font-weight: bold;
-                    margin-bottom: 20px;
-                }
-
                 .el-button.submit {
                     width: 100%;
                     height: 40px;
                 }
             }
-
-            &-footer {
-                display: flex;
-                flex-direction: column;
-                font-size: 12px;
-                text-align: center;
-                padding: 20px 0;
-            }
         }
     }
+
+    &__footer {
+        position: absolute;
+        bottom: 10px;
+        font-size: 12px;
+        color: rgba(255, 255, 255, .75);
+    }
 }

+ 17 - 9
src/packages/pc/views/auth/components/layout/index.vue

@@ -1,17 +1,23 @@
 <template>
   <div class="sign-layout">
-    <div class="sign-layout__left" />
-    <div class="sign-layout__right">
-      <div class="login-logo">
-        <img src="@pc/assets/logo.svg" title="logo" />
+    <div class="sign-layout__wrapper">
+      <div class="left">
+        <span>国际化交易平台</span>
+        <span>现代化综合服务</span>
       </div>
-      <div class="login-container">
-        <div class="login-container__title">{{ title }}</div>
-        <slot></slot>
-      </div>
-      <div class="login-footer">
+      <div class="right">
+        <div class="right-logo">
+          <img src="@pc/assets/logo-horizontal.png" title="广州钻石交易中心" />
+        </div>
+        <div class="right-title">{{ title }}</div>
+        <div class="right-container">
+          <slot></slot>
+        </div>
       </div>
     </div>
+    <div class="sign-layout__footer">
+      <span>Copyright ©{{ year }} 深圳市多元世纪信息技术股份有限公司 版权所有 粤ICP备00000000号</span>
+    </div>
   </div>
 </template>
 
@@ -22,6 +28,8 @@ defineProps({
     required: true,
   },
 })
+
+const year = new Date().getFullYear()
 </script>
 
 <style lang="less">

+ 9 - 9
src/packages/pc/views/auth/login/index.vue

@@ -1,16 +1,16 @@
 <template>
-  <sign-layout class="user-login" title="账号登录">
+  <sign-layout class="user-login" title="登录">
     <el-form ref="formRef" :model="formData" :rules="formRules">
-      <el-form-item prop="LoginID">
+      <el-form-item prop="userName">
         <el-input placeholder="用户名/账号/手机号" v-model="formData.userName"></el-input>
       </el-form-item>
-      <el-form-item prop="LoginPWD">
+      <el-form-item prop="password">
         <el-input type="password" placeholder="请输入您的登录密码" v-model="formData.password">
         </el-input>
       </el-form-item>
-      <!-- <el-form-item>
-        <el-checkbox label="记住账号" v-model="remember"></el-checkbox>
-      </el-form-item> -->
+      <el-form-item>
+        <el-checkbox label="false" v-model="remember">记住账号</el-checkbox>
+      </el-form-item>
       <el-form-item>
         <el-button class="submit" type="primary" :loading="loading" @click="formSubmit">
           <span v-if="loading">正在登录</span>
@@ -32,7 +32,7 @@ import { useLogin } from '@/business/login'
 import { useMenuStore } from '@/stores'
 import SignLayout from '../components/layout/index.vue'
 
-const { formData, userLogin } = useLogin()
+const { formData, remember, userLogin } = useLogin()
 const route = useRoute()
 const router = useRouter()
 const menuStore = useMenuStore()
@@ -41,10 +41,10 @@ const loading = shallowRef(false)
 //const remember = shallowRef(false) // 记住账号
 
 const formRules: FormRules = {
-  LoginID: [
+  userName: [
     { required: true, max: 20, message: '请输入登录账号', trigger: 'blur' }
   ],
-  LoginPWD: [
+  password: [
     { required: true, max: 16, message: '请输入登录密码', trigger: 'blur' }
   ]
 }

+ 12 - 0
src/packages/pc/views/footer/capital/statement/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金信息-资金流水 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 69 - 0
src/packages/pc/views/footer/capital/summary/deposit/index.vue

@@ -0,0 +1,69 @@
+<!-- 资金信息-资金汇总-充值 -->
+<template>
+    <app-drawer title="充值" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--vertical" label-width="100px" label-position="left" :model="formData"
+            :rules="formRules">
+            <el-form-item prop="Amount" label="充值金额">
+                <el-input-number placeholder="请输入" v-model="formData.Amount" />
+            </el-form-item>
+            <el-form-item label="凭证">
+                <app-upload :file-types="['image']" type-message="请选择正确的图片类型" @change="onUploadChange" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="primary" @click="formSubmit">提交</el-button>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, PropType } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { useDoDeposit } from '@/business/bank'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppUpload from '@pc/components/base/upload/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.TaAccountsRsp>,
+        required: true
+    }
+})
+
+const { formData, onSubmit, extendInfo, loading } = useDoDeposit(props.selectedRow.userid)
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+
+const formRules: FormRules = {
+    Amount: [{ required: true, message: '请输入充值金额' }],
+}
+
+const onUploadChange = (file: { filePath: string }) => {
+    console.log(file.filePath)
+    extendInfo.certificate_photo_url = file.filePath
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const formSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            if (formData.CusBankID) {
+                onSubmit().then(() => {
+                    ElMessage.success('提交成功')
+                    onCancel(true)
+                }).catch((err) => {
+                    ElMessage.error('提交失败:' + err)
+                })
+            } else {
+                ElMessage.error('未签约')
+            }
+        }
+    })
+}
+</script>

+ 37 - 0
src/packages/pc/views/footer/capital/summary/index.vue

@@ -0,0 +1,37 @@
+<!-- 资金信息-资金汇总 -->
+<template>
+    <app-table :data="accountList" v-model:columns="tableColumns" :row-key="rowKey" :expand-row-keys="expandKeys"
+        @row-click="rowClick">
+        <!-- 展开行 -->
+        <template #expand="{ row }">
+            <app-auth-operation v-bind="{ code, options: { selectedRow: row } }" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { useAccountStore } from '@/stores'
+import { useComposeTable } from '@pc/components/base/table'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
+
+defineProps({
+    code: String
+})
+
+const accountStore = useAccountStore()
+const { accountList } = accountStore.$toRefs()
+const { rowKey, expandKeys, rowClick } = useComposeTable<Model.TaAccountsRsp>({ rowKey: 'accountid' })
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'accountid', label: '资金账号' },
+    { prop: 'unknown', label: '净值' },
+    { prop: 'unknown', label: '持仓市值' },
+    { prop: 'unknown', label: '余额' },
+    { prop: 'unknown', label: '可用资金' },
+    { prop: 'unknown', label: '冻结资金' },
+    { prop: 'unknown', label: '占用资金' },
+    { prop: 'unknown', label: '状态' },
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/goods/delivery/index.vue

@@ -0,0 +1,12 @@
+<!-- 商品订单-成交 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/goods/order/index.vue

@@ -0,0 +1,12 @@
+<!-- 商品订单-交收 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 23 - 0
src/packages/pc/views/footer/goods/position/index.vue

@@ -0,0 +1,23 @@
+<!-- 商品订单-合约汇总 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'unknown', label: '订单合约' },
+    { prop: 'unknown', label: '方向' },
+    { prop: 'unknown', label: '持有数量' },
+    { prop: 'unknown', label: '可用数量' },
+    { prop: 'unknown', label: '冻结数量' },
+    { prop: 'unknown', label: '均价' },
+    { prop: 'unknown', label: '现价' },
+    { prop: 'unknown', label: '持仓金额' },
+    { prop: 'unknown', label: '占用保证金' },
+    { prop: 'unknown', label: '市值' },
+    { prop: 'unknown', label: '浮动盈亏' },
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/goods/trade/index.vue

@@ -0,0 +1,12 @@
+<!-- 商品订单-交收 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 11 - 0
src/packages/pc/views/footer/index.vue

@@ -0,0 +1,11 @@
+<template>
+    <app-auth-component :code="code" direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+
+defineProps({
+    code: String
+})
+</script>

+ 12 - 0
src/packages/pc/views/footer/performance/list/index.vue

@@ -0,0 +1,12 @@
+<!-- 履约信息 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/spot/order/index.vue

@@ -0,0 +1,12 @@
+<!-- 现货仓单-挂单 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/spot/pickup/index.vue

@@ -0,0 +1,12 @@
+<!-- 现货仓单-提货 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/spot/position/index.vue

@@ -0,0 +1,12 @@
+<!-- 现货仓单-现货明细 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/footer/spot/trade/index.vue

@@ -0,0 +1,12 @@
+<!-- 现货仓单-成交 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 82 - 0
src/packages/pc/views/market/trade/goods/index.vue

@@ -0,0 +1,82 @@
+<!-- 交易市场-订单交易 -->
+<template>
+    <app-table :data="tableList" v-model:columns="tableColumns" :loading="loading" showIndex />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, onUnmounted } from 'vue'
+import { parsePercent, handleNumberValue } from '@/filters'
+import { useRequest } from '@/hooks/request'
+import { queryQuoteGoodsList } from '@/services/api/swap'
+import { useFuturesStore, useUserStore } from '@/stores'
+import quoteSocket from '@/services/websocket/quote'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const futuresStore = useFuturesStore()
+const userStore = useUserStore()
+const subscribe = quoteSocket.createSubscribe()
+
+const { dataList, loading } = useRequest(queryQuoteGoodsList, {
+    params: {
+        usertype: userStore.userType ?? 0,
+        marketids: '50101'
+    },
+    onSuccess: (res) => {
+        const goodsCodes = res.data.map((e) => e.goodscode)
+        if (goodsCodes.length) {
+            subscribe.start(...goodsCodes)
+        }
+    }
+})
+
+const tableList = computed(() => {
+    return dataList.value.map((item) => {
+        const quote = futuresStore.getQuoteInfo(item.goodscode)
+        const { bid, bidColor, bidvolume, ask, askColor, askvolume, limitdown, limitup, lastColor, openedColor, lowestColor, highestColor, last, presettle, rise, change, amplitude, highest, lowest, opened } = quote.value ?? {}
+        return {
+            ...item,
+            lastColor,
+            openedColor,
+            lowestColor,
+            highestColor,
+            askColor,
+            bidColor,
+            bid: handleNumberValue(bid),
+            bidvolume: handleNumberValue(bidvolume),
+            ask: handleNumberValue(ask),
+            askvolume: handleNumberValue(askvolume),
+            last: handleNumberValue(last),
+            rise: rise?.toFixed(item.decimalplace),
+            change: parsePercent(change),
+            opened: handleNumberValue(opened),
+            presettle: handleNumberValue(presettle),
+            lowest: handleNumberValue(lowest),
+            highest: handleNumberValue(highest),
+            amplitude: parsePercent(amplitude),
+            limitdown: handleNumberValue(limitdown),
+            limitup: handleNumberValue(limitup),
+        }
+    })
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'goodscode', label: '代码' },
+    { prop: 'goodsname', label: '名称' },
+    { prop: 'bid', label: '买价' },
+    { prop: 'bidvolume', label: '买量' },
+    { prop: 'ask', label: '卖价' },
+    { prop: 'askvolume', label: '卖量' },
+    { prop: 'last', label: '当前价' },
+    { prop: 'rise', label: '涨跌' },
+    { prop: 'change', label: '涨跌幅' },
+    { prop: 'opened', label: '开盘' },
+    { prop: 'presettle', label: '昨结' },
+    { prop: 'highest', label: '最高' },
+    { prop: 'lowest', label: '最低' },
+    { prop: 'amplitude', label: '振幅' },
+    { prop: 'limitup', label: '涨停价' },
+    { prop: 'limitdown', label: '跌停价' },
+])
+
+onUnmounted(() => subscribe.stop())
+</script>

+ 54 - 0
src/packages/pc/views/market/trade/spot/index.vue

@@ -0,0 +1,54 @@
+<!-- 交易市场-仓单交易 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading" showIndex>
+        <template #header>
+            <app-filter :options="filterOptons" :loading="loading" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { useDataFilter } from '@/hooks/datatable'
+import { useRequest } from '@/hooks/request'
+import { queryOrderQuote } from '@/services/api/goods'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const { filterOptons, getQueryParams } = useDataFilter<Model.OrderQuoteReq>()
+
+const { dataList, loading, run } = useRequest(queryOrderQuote, {
+    params: {
+        marketid: 17201,
+        wrpricetype: 1,
+    },
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'deliverygoodsname', label: '品种' },
+    { prop: 'wrgoodsname', label: '商品' },
+    { prop: 'warehousename', label: '仓库' },
+    { prop: 'sellprice', label: '卖价' },
+    { prop: 'sellqty', label: '卖量' },
+    { prop: 'buyprice', label: '买价' },
+    { prop: 'buyqty', label: '买量' },
+])
+
+filterOptons.selectList = [
+    {
+        key: 'marketid',
+        options: [],
+    },
+]
+
+filterOptons.buttonList = [
+    { lable: '重置', onClick: () => onSearch(true) },
+    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
+]
+
+const onSearch = (clear = false) => {
+    getQueryParams((qs) => {
+        run(qs)
+    }, clear)
+}
+</script>

+ 0 - 7
src/packages/pc/views/member/index.less

@@ -1,7 +0,0 @@
-.member {
-    height: 100%;
-
-    .el-main {
-        padding: 0;
-    }
-}

+ 0 - 196
src/packages/pc/views/member/index.vue

@@ -1,196 +0,0 @@
-<!-- 好友查询 -->
-<template>
-    <el-container class="member">
-        <el-aside>
-            <el-scrollbar>
-                <app-view>
-                    <template #header>
-                        <el-input v-model="filterText" placeholder="请输入好友" />
-                    </template>
-                    <el-tree ref="treeRef" :data="treeList" :filter-node-method="filterNode" :expand-on-click-node="false"
-                        highlight-current default-expand-all @node-click="onNodeClick" />
-                </app-view>
-            </el-scrollbar>
-        </el-aside>
-        <el-main>
-            <el-scrollbar>
-                <app-view>
-                    <template #header>
-                        <app-filter :options="filterOptons" :loading="loading" />
-                    </template>
-                    <!-- 表格数据 -->
-                    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-                        <!-- 手机号 -->
-                        <template #mobile="{ value }">
-                            {{ getPhoneNumber(value) }}
-                        </template>
-                        <!-- 是否已实名 -->
-                        <template #hasauth="{ value }">
-                            {{ getAuthStatusName(value) }}
-                        </template>
-                        <!-- 开户时间 -->
-                        <template #createtime="{ value }">
-                            {{ formatDate(value) }}
-                        </template>
-                        <template #footer>
-                            <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                                @change="onRefresh" />
-                        </template>
-                    </app-table>
-                </app-view>
-            </el-scrollbar>
-        </el-main>
-    </el-container>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, reactive, watch } from 'vue'
-import { ElMessage, ElTree } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { useDataFilter } from '@/hooks/datatable'
-import { queryTHJFriends, queryInvestorLevelGroup } from '@/services/api/common'
-import { useLoginStore, useUserStore } from '@/stores'
-import { decryptAES } from '@/services/websocket/package/crypto'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppFilter from '@pc/components/base/table-filter/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-interface TreeData {
-    label: string;
-    userid: number;
-    children?: TreeData[];
-}
-
-const { filterOptons, getQueryParams } = useDataFilter<Model.THJFriendsReq>()
-const loginStore = useLoginStore()
-const userStore = useUserStore()
-const treeRef = shallowRef<InstanceType<typeof ElTree>>()
-const filterText = shallowRef('')
-const selectedId = shallowRef(loginStore.userId) // 当前选中用户ID
-
-const treeList = reactive<TreeData[]>([{
-    label: userStore.accountName ?? '登录用户',
-    userid: selectedId.value,
-    children: []
-}])
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'customername', label: '好友名称' },
-    { prop: 'mobile', label: '手机号' },
-    { prop: 'groupname', label: '客户等级' },
-    { prop: 'hasauth', label: '是否已实名' },
-    { prop: 'accoutstatus', label: '状态' },
-    { prop: 'createtime', label: '开户时间' },
-])
-
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJFriends, {
-    params: {
-        pagesize: 20,
-        userid: selectedId.value,
-    },
-    onSuccess: (res) => {
-        if (treeList[0].children?.length === 0) {
-            treeList[0].children = res.data.map((e) => ({
-                label: e.customername,
-                userid: e.frienduserid,
-            }))
-        }
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-filterOptons.selectList = [
-    {
-        label: '等级',
-        key: 'levelgroupid',
-        options: [],
-    },
-]
-
-filterOptons.inputList = [
-    { label: '名称', keys: ['customername'] },
-]
-
-filterOptons.buttonList = [
-    { lable: '重置', onClick: () => onSearch(true) },
-    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
-]
-
-// 获取实名状态
-const getAuthStatusName = (status: number) => {
-    switch (status) {
-        case 1: {
-            return '已认证'
-        }
-        case 2: {
-            return '已提交'
-        }
-        case 3: {
-            return '已拒绝'
-        }
-        default: {
-            return '未认证'
-        }
-    }
-}
-
-// 获取手机号码
-const getPhoneNumber = (value: string) => {
-    const phoneNumber = decryptAES(value)
-    if (selectedId.value == loginStore.userId) {
-        return phoneNumber
-    }
-    const reg = /^(\d{3})\d{4}(\d{4})$/
-    return phoneNumber?.replace(reg, '$1****$2')
-}
-
-// 当节点被点击的时候触发
-const onNodeClick = ({ userid }: TreeData) => {
-    if (selectedId.value !== userid) {
-        selectedId.value = userid
-        onSearch()
-    }
-}
-
-// 过滤树节点
-const filterNode = (value: string, data: TreeData) => {
-    if (value) {
-        return data.label.includes(value)
-    }
-    return true
-}
-
-const onSearch = (clear = false) => {
-    getQueryParams((qs) => {
-        pageIndex.value = 1
-        qs.userid = selectedId.value
-        run(qs)
-    }, clear)
-}
-
-const onRefresh = () => {
-    getQueryParams((qs) => {
-        qs.userid = selectedId.value
-        run(qs)
-    })
-}
-
-queryInvestorLevelGroup().then((res) => {
-    const [levelGroups] = filterOptons.selectList
-    levelGroups.options = res.data.map((e) => ({
-        label: e.groupname,
-        value: e.levelgroupid
-    }))
-})
-
-watch(filterText, (val) => {
-    treeRef.value?.filter(val)
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 97
src/packages/pc/views/profit/index.vue

@@ -1,97 +0,0 @@
-<!-- 收益查询 -->
-<template>
-    <app-view>
-        <template #header>
-            <app-filter :options="filterOptons" :loading="loading" />
-        </template>
-        <!-- 表格数据 -->
-        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-            <!-- 成交时间 -->
-            <template #tradetimedisplay="{ value }">
-                {{ formatDate(value) }}
-            </template>
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                    @change="onRefresh" />
-            </template>
-        </app-table>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { getTHJMarketList } from '@/constants/market'
-import { getTHJProfitRoleTypeName } from '@/constants/account'
-import { useDataFilter } from '@/hooks/datatable'
-import { queryTHJProfits } from '@/services/api/common'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppFilter from '@pc/components/base/table-filter/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-const { filterOptons, getQueryParams } = useDataFilter<Model.THJProfitsReq>()
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJProfits, {
-    params: {
-        pagesize: 20,
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'marketname', label: '市场' },
-    { prop: 'firend', label: '下单好友' },
-    { prop: 'buyorselldisplay', label: '方向' },
-    { prop: 'wrstandardname', label: '商品', width: 140 },
-    { prop: 'tradeqty', label: '成交数量' },
-    { prop: 'chargeamount', label: '手续费总额' },
-    { prop: 'profitamount', label: '分润金额' },
-    { prop: 'profitroletypedisplay', label: '分润角色' },
-    { prop: 'brokerrate', label: '会员比例' },
-    { prop: 'brokerprofitrate', label: '会员释出比例' },
-    { prop: 'levelonevalue', label: '一级比例' },
-    { prop: 'leveltwovalue', label: '二级比例' },
-    { prop: 'tradeid', label: '成交单号', width: 200 },
-    { prop: 'tradetimedisplay', label: '成交时间', width: 180 },
-])
-
-filterOptons.selectList = [
-    {
-        label: '市场',
-        key: 'marketid',
-        options: getTHJMarketList(),
-    },
-    {
-        label: '角色',
-        key: 'profitroletype',
-        options: [
-            { label: getTHJProfitRoleTypeName(3), value: 3 },
-            { label: getTHJProfitRoleTypeName(4), value: 4 }
-        ],
-    },
-]
-
-filterOptons.inputList = [
-    { label: '好友', keys: ['accountname'] },
-    { label: '商品', keys: ['goods'] },
-]
-
-filterOptons.buttonList = [
-    { lable: '重置', onClick: () => onSearch(true) },
-    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
-]
-
-const onSearch = (clear = false) => {
-    getQueryParams((qs) => {
-        pageIndex.value = 1
-        run(qs)
-    }, clear)
-}
-
-const onRefresh = () => {
-    getQueryParams((qs) => run(qs))
-}
-</script>

+ 0 - 52
src/packages/pc/views/promotion/components/details/index.vue

@@ -1,52 +0,0 @@
-<!-- 推广收益-明细 -->
-<template>
-    <app-drawer title="收益明细" :width="960" v-model:show="show">
-        <app-table :data="dataList" :columns="tableColumns" :loading="loading" border>
-            <!-- 时间 -->
-            <template #tradetime="{ value }">
-                {{ formatDate(value) }}
-            </template>
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
-            </template>
-        </app-table>
-    </app-drawer>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { queryTHJPromotionIncomeDetail } from '@/services/api/order'
-import AppDrawer from '@pc/components/base/drawer/index.vue'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-const props = defineProps({
-    selectedRow: {
-        type: Object as PropType<Model.THJPromotionIncomeRsp>,
-        required: true
-    },
-})
-
-const show = shallowRef(true)
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJPromotionIncomeDetail, {
-    params: {
-        pagesize: 10,
-        mouth: props.selectedRow.profitmonth,
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'tradetime', label: '时间', width: 180 },
-    { prop: 'wrstandardname', label: '商品' },
-    { prop: 'market', label: '市场' },
-    { prop: 'buyorsell', label: '方向' },
-    { prop: 'profitroletype', label: '级别' },
-    { prop: 'profitamount', label: '金额' },
-])
-</script>

+ 0 - 44
src/packages/pc/views/promotion/components/payment/index.vue

@@ -1,44 +0,0 @@
-<!-- 挂牌大厅-我的求购-撤销 -->
-<template>
-    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
-        <div style="font-size:16px;text-align:center">确定要申请支取吗?</div>
-        <template #footer>
-            <el-button @click="onCancel(false)" plain>取消</el-button>
-            <el-button type="primary" @click="formSubmit">确认</el-button>
-        </template>
-    </app-drawer>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useTHJProfitDrawApplyReq } from '@/business/trade'
-import AppDrawer from '@pc/components/base/drawer/index.vue'
-
-const props = defineProps({
-    selectedRow: {
-        type: Object as PropType<Model.THJPromotionIncomeRsp>,
-        required: true
-    }
-})
-
-const { loading, onSubmit } = useTHJProfitDrawApplyReq()
-const show = shallowRef(true)
-const refresh = shallowRef(false)
-
-const onCancel = (isRefresh = false) => {
-    show.value = false
-    refresh.value = isRefresh
-}
-
-const formSubmit = () => {
-    const { profitmonth, sumamount } = props.selectedRow
-    onSubmit(formatDate(profitmonth, 'YYYYMM'), sumamount).then(() => {
-        ElMessage.success('提交成功')
-        onCancel(true)
-    }).catch((err) => {
-        ElMessage.error('提交失败:' + err)
-    })
-}
-</script>

+ 0 - 91
src/packages/pc/views/promotion/index.vue

@@ -1,91 +0,0 @@
-<!-- 推广收益 -->
-<template>
-    <app-view>
-        <template #header>
-            <app-filter :options="filterOptons" :loading="loading" />
-        </template>
-        <!-- 表格数据 -->
-        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-            <!-- 日期 -->
-            <template #reckondate="{ value }">
-                {{ formatDate(value, 'YYYYMM') }}
-            </template>
-            <!-- 操作 -->
-            <template #operate="{ row }">
-                <app-auth-operation :menus="handleOperateButtons(row)" :options="{ selectedRow: row }"
-                    @closed="onRefresh" />
-            </template>
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                    @change="onRefresh" />
-            </template>
-        </app-table>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useDataFilter } from '@/hooks/datatable'
-import { useRequest } from '@/hooks/request'
-import { queryTHJPromotionIncome } from '@/services/api/order'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppFilter from '@pc/components/base/table-filter/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
-
-const { filterOptons, getQueryParams } = useDataFilter<Model.THJPromotionIncomeReq>()
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJPromotionIncome, {
-    params: {
-        pagesize: 20,
-        profitstatus: 1,
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'profitmonth', label: '时间' },
-    { prop: 'sumamount', label: '金额' },
-    { prop: 'operate', label: '操作' },
-])
-
-filterOptons.selectList = [
-    {
-        label: '支付状态',
-        key: 'profitstatus',
-        locked: true,
-        selectedValue: 1,
-        options: [
-            { label: '未支付', value: 1 },
-            { label: '支取中', value: 3 },
-            { label: '已支付', value: 2 }
-        ],
-    },
-]
-
-filterOptons.buttonList = [
-    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
-]
-
-// 3:委托成功 7:部成 -  状态有撤销
-const handleOperateButtons = (row: Model.THJPromotionIncomeRsp) => {
-    if (row.profitstatus === 1) {
-        return ['PromotionDetails', 'PromotionPayment']
-    }
-    return ['PromotionDetails']
-}
-
-const onSearch = (clear = false) => {
-    getQueryParams((qs) => {
-        pageIndex.value = 1
-        run(qs)
-    }, clear)
-}
-
-const onRefresh = () => {
-    getQueryParams((qs) => run(qs))
-}
-</script>

+ 12 - 0
src/packages/pc/views/query/capital/history/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-历史记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/capital/index.vue

@@ -0,0 +1,8 @@
+<!-- 资金流水 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/capital/list/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-当前记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 72 - 0
src/packages/pc/views/query/order/goods/history/index.vue

@@ -0,0 +1,72 @@
+<!-- 委托记录-商品合约-历史记录 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+        <template #header>
+            <app-filter :options="filterOptons" :loading="loading">
+                <template #before>
+                    <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
+                        v-model="filterDate" />
+                </template>
+            </app-filter>
+        </template>
+        <!-- 类型 -->
+        <template #buildtype="{ value }">
+            {{ getBuildTypeName(value) }}
+        </template>
+        <!-- 委托时间 -->
+        <template #ordertime="{ value }">
+            {{ formatDate(value) }}
+        </template>
+        <!-- 状态 -->
+        <template #orderstatus="{ value }">
+            {{ getWRTradeOrderStatusName(value) }}
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { formatDate } from '@/filters'
+import { useDataFilter } from '@/hooks/datatable'
+import { useRequest } from '@/hooks/request'
+import { queryHisTradeOrderDetail } from '@/services/api/order'
+import { getBuildTypeName, getWRTradeOrderStatusName } from '@/constants/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const { filterOptons, getQueryParams } = useDataFilter<Model.HisTradeOrderDetailReq>()
+const filterDate = shallowRef<string[]>([])
+
+const { loading, dataList, run } = useRequest(queryHisTradeOrderDetail, {
+    params: {
+        tradeMode: '50'
+    },
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'goodscode', label: '订单合约' },
+    { prop: 'buildtype', label: '类型' },
+    { prop: 'orderprice', label: '委托价' },
+    { prop: 'orderqty', label: '委托数量' },
+    { prop: 'tradeqty', label: '成交数量' },
+    { prop: 'orderid', label: '委托单号' },
+    { prop: 'ordertime', label: '委托时间' },
+    { prop: 'orderstatus', label: '状态' },
+])
+
+filterOptons.buttonList = [
+    { lable: '重置', onClick: () => onSearch(true) },
+    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
+]
+
+const onSearch = (clear = false) => {
+    if (clear) {
+        filterDate.value = []
+    }
+    getQueryParams((qs) => {
+        qs.startDate = filterDate.value[0]
+        qs.endDate = filterDate.value[1]
+        run(qs)
+    }, clear)
+}
+</script>

+ 8 - 0
src/packages/pc/views/query/order/goods/index.vue

@@ -0,0 +1,8 @@
+<!-- 委托记录-商品合约 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 43 - 0
src/packages/pc/views/query/order/goods/list/index.vue

@@ -0,0 +1,43 @@
+<!-- 委托记录-商品合约-当前记录 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+        <!-- 类型 -->
+        <template #buildtype="{ value }">
+            {{ getBuildTypeName(value) }}
+        </template>
+        <!-- 委托时间 -->
+        <template #ordertime="{ value }">
+            {{ formatDate(value) }}
+        </template>
+        <!-- 状态 -->
+        <template #orderstatus="{ value }">
+            {{ getWRTradeOrderStatusName(value) }}
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { formatDate } from '@/filters'
+import { useRequest } from '@/hooks/request'
+import { queryTradeOrderDetail } from '@/services/api/order'
+import { getBuildTypeName, getWRTradeOrderStatusName } from '@/constants/order'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const { loading, dataList } = useRequest(queryTradeOrderDetail, {
+    params: {
+        tradeMode: '50'
+    },
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'goodscode', label: '订单合约' },
+    { prop: 'buildtype', label: '类型' },
+    { prop: 'orderprice', label: '委托价' },
+    { prop: 'orderqty', label: '委托数量' },
+    { prop: 'tradeqty', label: '成交数量' },
+    { prop: 'orderid', label: '委托单号' },
+    { prop: 'ordertime', label: '委托时间' },
+    { prop: 'orderstatus', label: '状态' },
+])
+</script>

+ 12 - 0
src/packages/pc/views/query/order/spot/history/index.vue

@@ -0,0 +1,12 @@
+<!-- 委托记录-现货仓单-历史记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/order/spot/index.vue

@@ -0,0 +1,8 @@
+<!-- 委托记录-现货仓单 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/order/spot/list/index.vue

@@ -0,0 +1,12 @@
+<!-- 委托记录-现货仓单-当前记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/query/performance/buy/all/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-买履约-全部 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/performance/buy/index.vue

@@ -0,0 +1,8 @@
+<!-- 资金流水-买履约 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/performance/buy/running/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-买履约-执行中 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/query/performance/sell/all/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-卖履约-全部 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/performance/sell/index.vue

@@ -0,0 +1,8 @@
+<!-- 资金流水-卖履约 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/performance/sell/running/index.vue

@@ -0,0 +1,12 @@
+<!-- 资金流水-卖履约-执行中 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/query/trade/goods/history/index.vue

@@ -0,0 +1,12 @@
+<!-- 成交记录-商品合约-历史记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/trade/goods/index.vue

@@ -0,0 +1,8 @@
+<!-- 成交记录-商品合约 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/trade/goods/list/index.vue

@@ -0,0 +1,12 @@
+<!-- 成交记录-商品合约-当前记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 12 - 0
src/packages/pc/views/query/trade/spot/history/index.vue

@@ -0,0 +1,12 @@
+<!-- 成交记录-现货仓单-历史记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 8 - 0
src/packages/pc/views/query/trade/spot/index.vue

@@ -0,0 +1,8 @@
+<!-- 成交记录-现货仓单 -->
+<template>
+    <app-auth-component direction="bottom" />
+</template>
+
+<script lang="ts" setup>
+import AppAuthComponent from '@pc/components/modules/auth-component/index.vue'
+</script>

+ 12 - 0
src/packages/pc/views/query/trade/spot/list/index.vue

@@ -0,0 +1,12 @@
+<!-- 成交记录-现货仓单-当前记录 -->
+<template>
+    <app-table :data="[]" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+])
+</script>

+ 0 - 53
src/packages/pc/views/ratio/components/history/index.vue

@@ -1,53 +0,0 @@
-<template>
-    <app-drawer title="比例流水" :width="960" v-model:show="show">
-        <app-table :data="dataList" :columns="tableColumns" :loading="loading" border>
-            <!-- 变更时间 -->
-            <template #updatetime="{ value }">
-                {{ formatDate(value) }}
-            </template>
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
-            </template>
-        </app-table>
-    </app-drawer>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { queryTHJInvesotrDepositLog } from '@/services/api/common'
-import AppDrawer from '@pc/components/base/drawer/index.vue'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-const props = defineProps({
-    selectedRow: {
-        type: Object as PropType<Model.MyDepositRsp>,
-        required: true
-    },
-})
-
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJInvesotrDepositLog, {
-    params: {
-        pagesize: 10,
-        userid: props.selectedRow.userid,
-        depositrate: props.selectedRow.depositrate,
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const show = shallowRef(true)
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'updatetime', label: '变更时间', width: 180 },
-    { prop: 'oridepositqty', label: '变更前' },
-    { prop: 'changeqty', label: '变更值' },
-    { prop: 'curdepositqty', label: '变更后' },
-    { prop: 'accountname', label: '采购人' },
-    { prop: 'wrtradedetailid', label: '采购单号', width: 200 },
-])
-</script>

+ 0 - 38
src/packages/pc/views/ratio/index.vue

@@ -1,38 +0,0 @@
-<!-- 比例查询 -->
-<template>
-    <app-view>
-        <!-- 表格数据 -->
-        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-            <!-- 比例 -->
-            <template #depositrate="{ value }">
-                {{ parsePercent(value) }}
-            </template>
-            <!-- 操作 -->
-            <template #operate="{ row }">
-                <app-auth-operation :options="{ selectedRow: row }" />
-            </template>
-        </app-table>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { ElMessage } from 'element-plus'
-import { parsePercent } from '@/filters'
-import { useRequest } from '@/hooks/request'
-import { queryMyDeposit } from '@/services/api/common'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
-
-const { loading, dataList } = useRequest(queryMyDeposit, {
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'depositrate', label: '比例' },
-    { prop: 'depositqty', label: '剩余量' },
-    { prop: 'operate', label: '操作', width: 160, fixed: 'right' }
-])
-</script>

+ 0 - 89
src/packages/pc/views/tradedata/index.vue

@@ -1,89 +0,0 @@
-<!-- 交易数据 -->
-<template>
-    <app-view>
-        <template #header>
-            <app-filter :options="filterOptons" :loading="loading" />
-        </template>
-        <!-- 表格数据 -->
-        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-            <!-- 日期 -->
-            <template #reckondate="{ value }">
-                {{ formatDate(value, 'YYYY-MM-DD') }}
-            </template>
-            <!-- 市场 -->
-            <template #marketid="{ value }">
-                {{ getTHJMarketName(value) }}
-            </template>
-            <!-- 吨数 -->
-            <template #tradeqty="{ row }">
-                {{ `${row.buytradeqty}/${row.selltradeqty}` }}
-            </template>
-            <!-- 笔数 -->
-            <template #tradelot="{ row }">
-                {{ `${row.buytradelot}/${row.selltradelot}` }}
-            </template>
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                    @change="onRefresh" />
-            </template>
-        </app-table>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { ElMessage } from 'element-plus'
-import { formatDate } from '@/filters'
-import { getTHJMarketList, getTHJMarketName } from '@/constants/market'
-import { useDataFilter } from '@/hooks/datatable'
-import { useRequest } from '@/hooks/request'
-import { queryTHJTradeData } from '@/services/api/goods'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppFilter from '@pc/components/base/table-filter/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-const { filterOptons, getQueryParams } = useDataFilter<Model.THJTradeDataReq>()
-const { loading, dataList, total, pageIndex, pageSize, run } = useRequest(queryTHJTradeData, {
-    params: {
-        pagesize: 20,
-        marketid: 64201,
-    },
-    onError: (err) => {
-        ElMessage.error(err)
-    }
-})
-
-const tableColumns = shallowRef<Model.TableColumn[]>([
-    { prop: 'reckondate', label: '日期' },
-    { prop: 'marketid', label: '市场' },
-    { prop: 'wrstandardname', label: '商品' },
-    { prop: 'accountname', label: '下单好友' },
-    { prop: 'tradeqty', label: '吨数(买/卖)' },
-    { prop: 'tradelot', label: '笔数(买/卖)' },
-])
-
-filterOptons.selectList = [
-    {
-        label: '市场',
-        key: 'marketid',
-        locked: true,
-        selectedValue: 64201,
-        options: getTHJMarketList(),
-    },
-]
-
-filterOptons.buttonList = [
-    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
-]
-
-const onSearch = (clear = false) => {
-    getQueryParams((qs) => {
-        pageIndex.value = 1
-        run(qs)
-    }, clear)
-}
-
-const onRefresh = () => {
-    getQueryParams((qs) => run(qs))
-}
-</script>

+ 1 - 1
src/shims-vue.d.ts

@@ -17,5 +17,5 @@ declare module 'worker-loader!*' {
   export default WebpackWorker;
 }
 
-declare module 'mockjs'
+declare module 'mockjs-x'
 declare module 'protobufjs'

+ 11 - 3
src/stores/modules/account.ts

@@ -19,18 +19,20 @@ export const useAccountStore = defineStore(() => {
 
     // 当前资金账户信息
     const accountInfo = computed(() => {
-        return state.accountList.find((e) => e.accountid === state.accountId)
+        return {
+            ...state.accountList.find((e) => e.accountid === state.accountId)
+        }
     })
 
     // 冻结资金
     const freezeMargin = computed(() => {
-        const { freezecharge = 0, freezemargin = 0, otherfreezemargin = 0, outamountfreeze = 0 } = accountInfo.value ?? {}
+        const { freezecharge = 0, freezemargin = 0, otherfreezemargin = 0, outamountfreeze = 0 } = accountInfo.value
         return freezecharge + freezemargin + otherfreezemargin + outamountfreeze
     })
 
     // 可用资金
     const avaiableMoney = computed(() => {
-        const { currentbalance = 0 } = accountInfo.value ?? {}
+        const { currentbalance = 0 } = accountInfo.value
         return currentbalance - freezeMargin.value
     })
 
@@ -55,6 +57,11 @@ export const useAccountStore = defineStore(() => {
         }
     }
 
+    /** 获取资金账户持仓列表 */
+    const getAccountPositionList = () => {
+        throw '获取资金账户持仓列表'
+    }
+
     // 接收资金变动通知
     const moneyChangedNotify = eventBus.$on('MoneyChangedNotify', () => getAccountList())
 
@@ -65,5 +72,6 @@ export const useAccountStore = defineStore(() => {
         avaiableMoney,
         moneyChangedNotify,
         getAccountList,
+        getAccountPositionList,
     }
 })