Commit 5e52ed7c5ad424be24981bc9cd312a067f1c582f

Authored by 刘淇
1 parent 4eb9c766

个人中心

build/utils.js
... ... @@ -59,7 +59,11 @@ exports.cssLoaders = function (options) {
59 59 return {
60 60 css: generateLoaders(),
61 61 postcss: generateLoaders(),
62   - less: generateLoaders('less'),
  62 + less: generateLoaders('less', {
  63 + modifyVars: {
  64 + 'hack': `true; @import "${path.join(__dirname, '../src/assets/css/resetVantUi.less')}";`
  65 + }
  66 + }),
63 67 sass: generateLoaders('sass', { indentedSyntax: true }),
64 68 scss: generateLoaders('sass').concat(
65 69 {
... ...
package-lock.json
... ... @@ -4,6 +4,21 @@
4 4 "lockfileVersion": 1,
5 5 "requires": true,
6 6 "dependencies": {
  7 + "@babel/runtime": {
  8 + "version": "7.22.5",
  9 + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.5.tgz",
  10 + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==",
  11 + "requires": {
  12 + "regenerator-runtime": "^0.13.11"
  13 + },
  14 + "dependencies": {
  15 + "regenerator-runtime": {
  16 + "version": "0.13.11",
  17 + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
  18 + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
  19 + }
  20 + }
  21 + },
7 22 "@nodelib/fs.scandir": {
8 23 "version": "2.1.5",
9 24 "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
... ... @@ -41,6 +56,21 @@
41 56 "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=",
42 57 "dev": true
43 58 },
  59 + "@vant/icons": {
  60 + "version": "1.8.0",
  61 + "resolved": "https://registry.npmmirror.com/@vant/icons/-/icons-1.8.0.tgz",
  62 + "integrity": "sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg=="
  63 + },
  64 + "@vant/popperjs": {
  65 + "version": "1.3.0",
  66 + "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz",
  67 + "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="
  68 + },
  69 + "@vue/babel-helper-vue-jsx-merge-props": {
  70 + "version": "1.4.0",
  71 + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
  72 + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA=="
  73 + },
44 74 "abbrev": {
45 75 "version": "1.1.1",
46 76 "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz",
... ... @@ -1815,8 +1845,9 @@
1815 1845 },
1816 1846 "clone": {
1817 1847 "version": "2.1.2",
1818   - "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz",
1819   - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
  1848 + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
  1849 + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
  1850 + "dev": true
1820 1851 },
1821 1852 "clone-deep": {
1822 1853 "version": "4.0.1",
... ... @@ -2018,6 +2049,15 @@
2018 2049 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
2019 2050 "dev": true
2020 2051 },
  2052 + "copy-anything": {
  2053 + "version": "2.0.6",
  2054 + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
  2055 + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
  2056 + "dev": true,
  2057 + "requires": {
  2058 + "is-what": "^3.14.1"
  2059 + }
  2060 + },
2021 2061 "copy-concurrently": {
2022 2062 "version": "1.0.5",
2023 2063 "resolved": "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz",
... ... @@ -4821,6 +4861,13 @@
4821 4861 "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
4822 4862 "dev": true
4823 4863 },
  4864 + "image-size": {
  4865 + "version": "0.5.5",
  4866 + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
  4867 + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
  4868 + "dev": true,
  4869 + "optional": true
  4870 + },
4824 4871 "import-cwd": {
4825 4872 "version": "2.1.0",
4826 4873 "resolved": "https://registry.nlark.com/import-cwd/download/import-cwd-2.1.0.tgz",
... ... @@ -5179,6 +5226,12 @@
5179 5226 "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz",
5180 5227 "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
5181 5228 },
  5229 + "is-what": {
  5230 + "version": "3.14.1",
  5231 + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
  5232 + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
  5233 + "dev": true
  5234 + },
5182 5235 "is-windows": {
5183 5236 "version": "1.0.2",
5184 5237 "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz",
... ... @@ -5340,10 +5393,49 @@
5340 5393 "invert-kv": "^1.0.0"
5341 5394 }
5342 5395 },
  5396 + "less": {
  5397 + "version": "4.1.3",
  5398 + "resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz",
  5399 + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
  5400 + "dev": true,
  5401 + "requires": {
  5402 + "copy-anything": "^2.0.1",
  5403 + "errno": "^0.1.1",
  5404 + "graceful-fs": "^4.1.2",
  5405 + "image-size": "~0.5.0",
  5406 + "make-dir": "^2.1.0",
  5407 + "mime": "^1.4.1",
  5408 + "needle": "^3.1.0",
  5409 + "parse-node-version": "^1.0.1",
  5410 + "source-map": "~0.6.0",
  5411 + "tslib": "^2.3.0"
  5412 + },
  5413 + "dependencies": {
  5414 + "make-dir": {
  5415 + "version": "2.1.0",
  5416 + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
  5417 + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
  5418 + "dev": true,
  5419 + "optional": true,
  5420 + "requires": {
  5421 + "pify": "^4.0.1",
  5422 + "semver": "^5.6.0"
  5423 + }
  5424 + },
  5425 + "pify": {
  5426 + "version": "4.0.1",
  5427 + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
  5428 + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
  5429 + "dev": true,
  5430 + "optional": true
  5431 + }
  5432 + }
  5433 + },
5343 5434 "less-loader": {
5344 5435 "version": "4.1.0",
5345   - "resolved": "https://registry.npmmirror.com/less-loader/download/less-loader-4.1.0.tgz",
5346   - "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=",
  5436 + "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-4.1.0.tgz",
  5437 + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
  5438 + "dev": true,
5347 5439 "requires": {
5348 5440 "clone": "^2.1.1",
5349 5441 "loader-utils": "^1.1.0",
... ... @@ -6014,6 +6106,47 @@
6014 6106 }
6015 6107 }
6016 6108 },
  6109 + "needle": {
  6110 + "version": "3.2.0",
  6111 + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz",
  6112 + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
  6113 + "dev": true,
  6114 + "optional": true,
  6115 + "requires": {
  6116 + "debug": "^3.2.6",
  6117 + "iconv-lite": "^0.6.3",
  6118 + "sax": "^1.2.4"
  6119 + },
  6120 + "dependencies": {
  6121 + "debug": {
  6122 + "version": "3.2.7",
  6123 + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
  6124 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
  6125 + "dev": true,
  6126 + "optional": true,
  6127 + "requires": {
  6128 + "ms": "^2.1.1"
  6129 + }
  6130 + },
  6131 + "iconv-lite": {
  6132 + "version": "0.6.3",
  6133 + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
  6134 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
  6135 + "dev": true,
  6136 + "optional": true,
  6137 + "requires": {
  6138 + "safer-buffer": ">= 2.1.2 < 3.0.0"
  6139 + }
  6140 + },
  6141 + "ms": {
  6142 + "version": "2.1.3",
  6143 + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
  6144 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
  6145 + "dev": true,
  6146 + "optional": true
  6147 + }
  6148 + }
  6149 + },
6017 6150 "negotiator": {
6018 6151 "version": "0.6.2",
6019 6152 "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
... ... @@ -6603,6 +6736,12 @@
6603 6736 "json-parse-better-errors": "^1.0.1"
6604 6737 }
6605 6738 },
  6739 + "parse-node-version": {
  6740 + "version": "1.0.1",
  6741 + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
  6742 + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
  6743 + "dev": true
  6744 + },
6606 6745 "parseurl": {
6607 6746 "version": "1.3.3",
6608 6747 "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
... ... @@ -6697,7 +6836,8 @@
6697 6836 "pify": {
6698 6837 "version": "3.0.0",
6699 6838 "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
6700   - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
  6839 + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
  6840 + "dev": true
6701 6841 },
6702 6842 "pinkie": {
6703 6843 "version": "2.0.4",
... ... @@ -9293,6 +9433,12 @@
9293 9433 "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
9294 9434 "dev": true
9295 9435 },
  9436 + "tslib": {
  9437 + "version": "2.5.3",
  9438 + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.5.3.tgz",
  9439 + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==",
  9440 + "dev": true
  9441 + },
9296 9442 "tty-browserify": {
9297 9443 "version": "0.0.0",
9298 9444 "resolved": "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
... ... @@ -9684,6 +9830,25 @@
9684 9830 "spdx-expression-parse": "^3.0.0"
9685 9831 }
9686 9832 },
  9833 + "vant": {
  9834 + "version": "2.12.54",
  9835 + "resolved": "https://registry.npmmirror.com/vant/-/vant-2.12.54.tgz",
  9836 + "integrity": "sha512-t7DCiLxNosDrg0Jm5EY9p0A5cAMo5OadmizbYtPEc0ru+OJKEa3kcfxtKIK5on7ZPqoOkyYJt8e6BQ1VDMPsrg==",
  9837 + "requires": {
  9838 + "@babel/runtime": "7.x",
  9839 + "@vant/icons": "^1.7.1",
  9840 + "@vant/popperjs": "^1.1.0",
  9841 + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
  9842 + "vue-lazyload": "1.2.3"
  9843 + },
  9844 + "dependencies": {
  9845 + "vue-lazyload": {
  9846 + "version": "1.2.3",
  9847 + "resolved": "https://registry.npmmirror.com/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
  9848 + "integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g=="
  9849 + }
  9850 + }
  9851 + },
9687 9852 "vary": {
9688 9853 "version": "1.1.2",
9689 9854 "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
... ...
package.json
... ... @@ -13,11 +13,11 @@
13 13 "axios": "^0.21.1",
14 14 "css-loader": "^3.6.0",
15 15 "js-base64": "^3.6.0",
16   - "less-loader": "^4.1.0",
17 16 "mint-ui": "^2.2.13",
18 17 "moment": "^2.29.1",
19 18 "node-sass": "^4.14.1",
20 19 "sass-loader": "^7.3.1",
  20 + "vant": "^2.12.54",
21 21 "vue": "^2.5.2",
22 22 "vue-baidu-map": "^0.21.22",
23 23 "vue-h5-popup": "^1.0.2",
... ... @@ -41,6 +41,8 @@
41 41 "file-loader": "^1.1.4",
42 42 "friendly-errors-webpack-plugin": "^1.6.1",
43 43 "html-webpack-plugin": "^2.30.1",
  44 + "less": "^4.1.3",
  45 + "less-loader": "^4.1.0",
44 46 "node-notifier": "^5.1.2",
45 47 "optimize-css-assets-webpack-plugin": "^3.2.0",
46 48 "ora": "^1.2.0",
... ...
src/api/getUserIfo.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function getTokenByOpenId(params) { // 获取用户token和手机号
  4 + return request({
  5 + url: 'wxPublicUser/getTokenByOpenId',
  6 + method: 'post',
  7 + data: params
  8 + })
  9 +}
  10 +
  11 +
  12 +export function saveFeedbackAndSuggest(params) { // 提交建议反馈
  13 + return request({
  14 + url: 'suggest/saveFeedbackAndSuggest',
  15 + method: 'post',
  16 + data: params
  17 + })
  18 +}
  19 +
  20 +
  21 +export function getFeedbackType(params) { // 获取建议反馈类型
  22 + return request({
  23 + url: 'suggest/getFeedbackType',
  24 + method: 'post',
  25 + data: params
  26 + })
  27 +}
  28 +
  29 +
... ...
src/assets/css/reset.css
... ... @@ -61,3 +61,7 @@ body,html,#app
61 61 .leftRightPadding{
62 62 padding: 0 10px;
63 63 }
  64 +
  65 +.commonPagePadding{
  66 + padding: 0 10px;
  67 +}
... ...
src/assets/css/resetVantUi.less 0 → 100644
  1 +
  2 +
  3 + // Color Palette
  4 +@black: #000;
  5 +@white: #fff;
  6 +@gray-1: #f7f8fa;
  7 +@gray-2: #f2f3f5;
  8 +@gray-3: #ebedf0;
  9 +@gray-4: #dcdee0;
  10 +@gray-5: #c8c9cc;
  11 +@gray-6: #969799;
  12 +@gray-7: #646566;
  13 +@gray-8: #323233;
  14 +@red: #ee0a24;
  15 +@blue: #1989fa;
  16 + //1989fa
  17 +@orange: #ff976a;
  18 +@orange-dark: #ed6a0c;
  19 +@orange-light: #fffbe8;
  20 +@green: #07c160;
  21 +
  22 +// Gradient Colors
  23 +@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);
  24 +@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);
  25 +@gradient-blue: linear-gradient(180deg, #2282C5 0%, #4B8EF1 58%, #63BEFD 100%);
  26 +
  27 +// Component Colors
  28 +@text-color: @gray-8;
  29 +@active-color: @gray-2;
  30 +@active-opacity: 0.7;
  31 +@disabled-opacity: 0.5;
  32 +@background-color: @gray-1;
  33 +@background-color-light: #fafafa;
  34 +@text-link-color: #576b95;
  35 +
  36 +// Padding
  37 +@padding-base: 4px;
  38 +@padding-xs: @padding-base * 2;
  39 +@padding-sm: @padding-base * 3;
  40 +@padding-md: @padding-base * 4;
  41 +@padding-lg: @padding-base * 6;
  42 +@padding-xl: @padding-base * 8;
  43 +
  44 +// Font
  45 +@font-size-xs: 10px;
  46 +@font-size-sm: 12px;
  47 +@font-size-md: 14px;
  48 +@font-size-lg: 16px;
  49 +@font-weight-bold: 500;
  50 +@line-height-xs: 14px;
  51 +@line-height-sm: 18px;
  52 +@line-height-md: 20px;
  53 +@line-height-lg: 22px;
  54 +@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',
  55 +Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',
  56 +'Microsoft Yahei', sans-serif;
  57 +@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial,
  58 +sans-serif;
  59 +
  60 +// Animation
  61 +@animation-duration-base: 0.3s;
  62 +@animation-duration-fast: 0.2s;
  63 +@animation-timing-function-enter: ease-out;
  64 +@animation-timing-function-leave: ease-in;
  65 +
  66 +// Border
  67 +@border-color: @gray-3;
  68 +@border-width-base: 1px;
  69 +@border-radius-sm: 2px;
  70 +@border-radius-md: 4px;
  71 +@border-radius-lg: 8px;
  72 +@border-radius-max: 999px;
  73 +
  74 +// ActionSheet
  75 +@action-sheet-max-height: 80%;
  76 +@action-sheet-header-height: 48px;
  77 +@action-sheet-header-font-size: @font-size-lg;
  78 +@action-sheet-description-color: @gray-6;
  79 +@action-sheet-description-font-size: @font-size-md;
  80 +@action-sheet-description-line-height: @line-height-md;
  81 +@action-sheet-item-background: @white;
  82 +@action-sheet-item-font-size: @font-size-lg;
  83 +@action-sheet-item-line-height: @line-height-lg;
  84 +@action-sheet-item-text-color: @text-color;
  85 +@action-sheet-item-disabled-text-color: @gray-5;
  86 +@action-sheet-subname-color: @gray-6;
  87 +@action-sheet-subname-font-size: @font-size-sm;
  88 +@action-sheet-subname-line-height: @line-height-sm;
  89 +@action-sheet-close-icon-size: 22px;
  90 +@action-sheet-close-icon-color: @gray-5;
  91 +@action-sheet-close-icon-active-color: @gray-6;
  92 +@action-sheet-close-icon-padding: 0 @padding-md;
  93 +@action-sheet-cancel-text-color: @gray-7;
  94 +@action-sheet-cancel-padding-top: @padding-xs;
  95 +@action-sheet-cancel-padding-color: @background-color;
  96 +@action-sheet-loading-icon-size: 22px;
  97 +
  98 +// AddressEdit
  99 +@address-edit-padding: @padding-sm;
  100 +@address-edit-buttons-padding: @padding-xl @padding-base;
  101 +@address-edit-button-margin-bottom: @padding-sm;
  102 +@address-edit-detail-finish-color: @blue;
  103 +@address-edit-detail-finish-font-size: @font-size-sm;
  104 +
  105 +// AddressList
  106 +@address-list-padding: @padding-sm @padding-sm 80px;
  107 +@address-list-disabled-text-color: @gray-6;
  108 +@address-list-disabled-text-padding: @padding-base * 5 0 @padding-md;
  109 +@address-list-disabled-text-font-size: @font-size-md;
  110 +@address-list-disabled-text-line-height: @line-height-md;
  111 +@address-list-add-button-z-index: 999;
  112 +@address-list-item-padding: @padding-sm;
  113 +@address-list-item-text-color: @text-color;
  114 +@address-list-item-disabled-text-color: @gray-5;
  115 +@address-list-item-font-size: 13px;
  116 +@address-list-item-line-height: @line-height-sm;
  117 +@address-list-item-radio-icon-color: @red;
  118 +@address-list-edit-icon-size: 20px;
  119 +
  120 +// Badge
  121 +@badge-size: 16px;
  122 +@badge-color: @white;
  123 +@badge-padding: 0 3px;
  124 +@badge-font-size: @font-size-sm;
  125 +@badge-font-weight: @font-weight-bold;
  126 +@badge-border-width: @border-width-base;
  127 +@badge-background-color: @red;
  128 +@badge-dot-color: @red;
  129 +@badge-dot-size: 8px;
  130 +@badge-font-family: -apple-system-font, Helvetica Neue, Arial, sans-serif;
  131 +
  132 +// Button
  133 +@button-mini-height: 24px;
  134 +@button-mini-font-size: @font-size-xs;
  135 +@button-small-height: 32px;
  136 +@button-small-font-size: @font-size-sm;
  137 +@button-normal-font-size: @font-size-md;
  138 +@button-large-height: 50px;
  139 +@button-default-height: 44px;
  140 +@button-default-line-height: 1.2;
  141 +@button-default-font-size: @font-size-lg;
  142 +@button-default-color: @text-color;
  143 +@button-default-background-color: @white;
  144 +@button-default-border-color: @border-color;
  145 +@button-primary-color: @white;
  146 +@button-primary-background-color: @green;
  147 +@button-primary-border-color: @green;
  148 +@button-info-color: @white;
  149 +@button-info-background-color: @gradient-blue;
  150 +@button-info-border-color: @gradient-blue;
  151 +@button-danger-color: @white;
  152 +@button-danger-background-color: @red;
  153 +@button-danger-border-color: @red;
  154 +@button-warning-color: @white;
  155 +@button-warning-background-color: @orange;
  156 +@button-warning-border-color: @orange;
  157 +@button-border-width: @border-width-base;
  158 +@button-border-radius: @border-radius-sm;
  159 +@button-round-border-radius: @border-radius-max;
  160 +@button-plain-background-color: @white;
  161 +@button-disabled-opacity: @disabled-opacity;
  162 +
  163 +// Calendar
  164 +@calendar-background-color: @white;
  165 +@calendar-popup-height: 80%;
  166 +@calendar-header-box-shadow: 0 2px 10px rgba(125, 126, 128, 0.16);
  167 +@calendar-header-title-height: 44px;
  168 +@calendar-header-title-font-size: @font-size-lg;
  169 +@calendar-header-subtitle-font-size: @font-size-md;
  170 +@calendar-weekdays-height: 30px;
  171 +@calendar-weekdays-font-size: @font-size-sm;
  172 +@calendar-month-title-font-size: @font-size-md;
  173 +@calendar-month-mark-color: fade(@gray-2, 80%);
  174 +@calendar-month-mark-font-size: 160px;
  175 +@calendar-day-height: 64px;
  176 +@calendar-day-font-size: @font-size-lg;
  177 +@calendar-range-edge-color: @white;
  178 +@calendar-range-edge-background-color: @red;
  179 +@calendar-range-middle-color: @red;
  180 +@calendar-range-middle-background-opacity: 0.1;
  181 +@calendar-selected-day-size: 54px;
  182 +@calendar-selected-day-color: @white;
  183 +@calendar-info-font-size: @font-size-xs;
  184 +@calendar-info-line-height: @line-height-xs;
  185 +@calendar-selected-day-background-color: @red;
  186 +@calendar-day-disabled-color: @gray-5;
  187 +@calendar-confirm-button-height: 36px;
  188 +@calendar-confirm-button-margin: 7px 0;
  189 +
  190 +// Card
  191 +@card-padding: @padding-xs @padding-md;
  192 +@card-font-size: @font-size-sm;
  193 +@card-text-color: @text-color;
  194 +@card-background-color: @background-color-light;
  195 +@card-thumb-size: 88px;
  196 +@card-thumb-border-radius: @border-radius-lg;
  197 +@card-title-line-height: 16px;
  198 +@card-desc-color: @gray-7;
  199 +@card-desc-line-height: @line-height-md;
  200 +@card-price-color: @gray-8;
  201 +@card-origin-price-color: @gray-6;
  202 +@card-num-color: @gray-6;
  203 +@card-origin-price-font-size: @font-size-xs;
  204 +@card-price-font-size: @font-size-sm;
  205 +@card-price-integer-font-size: @font-size-lg;
  206 +@card-price-font-family: @price-integer-font-family;
  207 +
  208 +// Cascader
  209 +@cascader-header-height: 48px;
  210 +@cascader-title-font-size: @font-size-lg;
  211 +@cascader-title-line-height: 20px;
  212 +@cascader-close-icon-size: 22px;
  213 +@cascader-close-icon-color: @gray-5;
  214 +@cascader-close-icon-active-color: @gray-6;
  215 +@cascader-selected-icon-size: 18px;
  216 +@cascader-tabs-height: 48px;
  217 +@cascader-active-color: @red;
  218 +@cascader-options-height: 384px;
  219 +@cascader-tab-color: @text-color;
  220 +@cascader-unselected-tab-color: @gray-6;
  221 +
  222 +// Cell
  223 +@cell-font-size: @font-size-md;
  224 +@cell-line-height: 24px;
  225 +@cell-vertical-padding: 10px;
  226 +@cell-horizontal-padding: @padding-md;
  227 +@cell-text-color: @text-color;
  228 +@cell-background-color: @white;
  229 +@cell-border-color: @border-color;
  230 +@cell-active-color: @active-color;
  231 +@cell-required-color: @red;
  232 +@cell-label-color: @gray-6;
  233 +@cell-label-font-size: @font-size-sm;
  234 +@cell-label-line-height: @line-height-sm;
  235 +@cell-label-margin-top: @padding-base;
  236 +@cell-value-color: @gray-6;
  237 +@cell-icon-size: 16px;
  238 +@cell-right-icon-color: @gray-6;
  239 +@cell-large-vertical-padding: @padding-sm;
  240 +@cell-large-title-font-size: @font-size-lg;
  241 +@cell-large-label-font-size: @font-size-md;
  242 +
  243 +// CellGroup
  244 +@cell-group-background-color: @white;
  245 +@cell-group-title-color: @gray-6;
  246 +@cell-group-title-padding: @padding-md @padding-md @padding-xs;
  247 +@cell-group-title-font-size: @font-size-md;
  248 +@cell-group-title-line-height: 16px;
  249 +@cell-group-inset-padding: 0 @padding-md;
  250 +@cell-group-inset-border-radius: @border-radius-lg;
  251 +@cell-group-inset-title-padding: @padding-md @padding-md @padding-xs @padding-xl;
  252 +
  253 +// Checkbox
  254 +@checkbox-size: 20px;
  255 +@checkbox-border-color: @gray-5;
  256 +@checkbox-transition-duration: @animation-duration-fast;
  257 +@checkbox-label-margin: @padding-xs;
  258 +@checkbox-label-color: @text-color;
  259 +@checkbox-checked-icon-color: @blue;
  260 +@checkbox-disabled-icon-color: @gray-5;
  261 +@checkbox-disabled-label-color: @gray-5;
  262 +@checkbox-disabled-background-color: @border-color;
  263 +
  264 +// Circle
  265 +@circle-size: 100px;
  266 +@circle-color: @blue;
  267 +@circle-layer-color: @white;
  268 +@circle-text-color: @text-color;
  269 +@circle-text-font-weight: @font-weight-bold;
  270 +@circle-text-font-size: @font-size-md;
  271 +@circle-text-line-height: @line-height-md;
  272 +
  273 +// Collapse
  274 +@collapse-item-transition-duration: @animation-duration-base;
  275 +@collapse-item-content-padding: @padding-sm @padding-md;
  276 +@collapse-item-content-font-size: @font-size-md;
  277 +@collapse-item-content-line-height: 1.5;
  278 +@collapse-item-content-text-color: @gray-6;
  279 +@collapse-item-content-background-color: @white;
  280 +@collapse-item-title-disabled-color: @gray-5;
  281 +
  282 +// ContactCard
  283 +@contact-card-padding: @padding-md;
  284 +@contact-card-add-icon-size: 40px;
  285 +@contact-card-add-icon-color: @blue;
  286 +@contact-card-value-line-height: @line-height-md;
  287 +
  288 +// ContactEdit
  289 +@contact-edit-padding: @padding-md;
  290 +@contact-edit-fields-radius: @border-radius-md;
  291 +@contact-edit-buttons-padding: @padding-xl 0;
  292 +@contact-edit-button-margin-bottom: @padding-sm;
  293 +@contact-edit-button-font-size: 16px;
  294 +@contact-edit-field-label-width: 4.1em;
  295 +
  296 +// ContactList
  297 +@contact-list-edit-icon-size: 16px;
  298 +@contact-list-add-button-z-index: 999;
  299 +@contact-list-item-padding: @padding-md;
  300 +
  301 +// CountDown
  302 +@count-down-text-color: @text-color;
  303 +@count-down-font-size: @font-size-md;
  304 +@count-down-line-height: @line-height-md;
  305 +
  306 +// Coupon
  307 +@coupon-margin: 0 @padding-sm @padding-sm;
  308 +@coupon-content-height: 84px;
  309 +@coupon-content-padding: 14px 0;
  310 +@coupon-background-color: @white;
  311 +@coupon-active-background-color: @active-color;
  312 +@coupon-border-radius: @border-radius-lg;
  313 +@coupon-box-shadow: 0 0 4px rgba(0, 0, 0, 0.1);
  314 +@coupon-head-width: 96px;
  315 +@coupon-amount-color: @red;
  316 +@coupon-amount-font-size: 30px;
  317 +@coupon-currency-font-size: 40%;
  318 +@coupon-name-font-size: @font-size-md;
  319 +@coupon-disabled-text-color: @gray-6;
  320 +@coupon-description-padding: @padding-xs @padding-md;
  321 +@coupon-description-border-color: @border-color;
  322 +
  323 +// CouponCell
  324 +@coupon-cell-selected-text-color: @text-color;
  325 +
  326 +// CouponList
  327 +@coupon-list-background-color: @background-color;
  328 +@coupon-list-field-padding: 5px 0 5px @padding-md;
  329 +@coupon-list-exchange-button-height: 32px;
  330 +@coupon-list-close-button-height: 40px;
  331 +@coupon-list-empty-image-size: 200px;
  332 +@coupon-list-empty-tip-color: @gray-6;
  333 +@coupon-list-empty-tip-font-size: @font-size-md;
  334 +@coupon-list-empty-tip-line-height: @line-height-md;
  335 +
  336 +// Dialog
  337 +@dialog-width: 320px;
  338 +@dialog-small-screen-width: 90%;
  339 +@dialog-font-size: @font-size-lg;
  340 +@dialog-transition: @animation-duration-base;
  341 +@dialog-border-radius: 16px;
  342 +@dialog-background-color: @white;
  343 +@dialog-header-font-weight: @font-weight-bold;
  344 +@dialog-header-line-height: 24px;
  345 +@dialog-header-padding-top: 26px;
  346 +@dialog-header-isolated-padding: @padding-lg 0;
  347 +@dialog-message-padding: @padding-lg;
  348 +@dialog-message-font-size: @font-size-md;
  349 +@dialog-message-line-height: @line-height-md;
  350 +@dialog-message-max-height: 60vh;
  351 +@dialog-has-title-message-text-color: @gray-7;
  352 +@dialog-has-title-message-padding-top: @padding-xs;
  353 +@dialog-button-height: 48px;
  354 +@dialog-round-button-height: 36px;
  355 +@dialog-confirm-button-text-color: @red;
  356 +
  357 +// Divider
  358 +@divider-margin: @padding-md 0;
  359 +@divider-text-color: @gray-6;
  360 +@divider-font-size: @font-size-md;
  361 +@divider-line-height: 24px;
  362 +@divider-border-color: @border-color;
  363 +@divider-content-padding: @padding-md;
  364 +@divider-content-left-width: 10%;
  365 +@divider-content-right-width: 10%;
  366 +
  367 +// DropdownMenu
  368 +@dropdown-menu-height: 48px;
  369 +@dropdown-menu-background-color: @white;
  370 +@dropdown-menu-box-shadow: 0 2px 12px fade(@gray-7, 12);
  371 +@dropdown-menu-title-font-size: 15px;
  372 +@dropdown-menu-title-text-color: @text-color;
  373 +@dropdown-menu-title-active-text-color: @red;
  374 +@dropdown-menu-title-disabled-text-color: @gray-6;
  375 +@dropdown-menu-title-padding: 0 @padding-xs;
  376 +@dropdown-menu-title-line-height: @line-height-lg;
  377 +@dropdown-menu-option-active-color: @red;
  378 +@dropdown-menu-content-max-height: 80%;
  379 +@dropdown-item-z-index: 10;
  380 +
  381 +// Empty
  382 +@empty-padding: @padding-xl 0;
  383 +@empty-image-size: 160px;
  384 +@empty-description-margin-top: @padding-md;
  385 +@empty-description-padding: 0 60px;
  386 +@empty-description-color: @gray-6;
  387 +@empty-description-font-size: @font-size-md;
  388 +@empty-description-line-height: @line-height-md;
  389 +@empty-bottom-margin-top: 24px;
  390 +
  391 +// Field
  392 +@field-label-width: 6.2em;
  393 +@field-label-color: @gray-7;
  394 +@field-label-margin-right: @padding-sm;
  395 +@field-input-text-color: @text-color;
  396 +@field-input-error-text-color: @red;
  397 +@field-input-disabled-text-color: @gray-5;
  398 +@field-placeholder-text-color: @gray-5;
  399 +@field-icon-size: 16px;
  400 +@field-clear-icon-size: 16px;
  401 +@field-clear-icon-color: @gray-5;
  402 +@field-right-icon-color: @gray-6;
  403 +@field-error-message-color: @red;
  404 +@field-error-message-font-size: 12px;
  405 +@field-text-area-min-height: 60px;
  406 +@field-word-limit-color: @gray-7;
  407 +@field-word-limit-font-size: @font-size-sm;
  408 +@field-word-limit-line-height: 16px;
  409 +@field-disabled-text-color: @gray-5;
  410 +
  411 +// GridItem
  412 +@grid-item-content-padding: @padding-md @padding-xs;
  413 +@grid-item-content-background-color: @white;
  414 +@grid-item-content-active-color: @active-color;
  415 +@grid-item-icon-size: 28px;
  416 +@grid-item-text-color: @gray-7;
  417 +@grid-item-text-font-size: @font-size-sm;
  418 +
  419 +// GoodsAction
  420 +@goods-action-background-color: @white;
  421 +@goods-action-height: 50px;
  422 +@goods-action-icon-width: 48px;
  423 +@goods-action-icon-height: 100%;
  424 +@goods-action-icon-color: @text-color;
  425 +@goods-action-icon-size: 18px;
  426 +@goods-action-icon-font-size: @font-size-xs;
  427 +@goods-action-icon-active-color: @active-color;
  428 +@goods-action-icon-text-color: @gray-7;
  429 +@goods-action-button-height: 40px;
  430 +@goods-action-button-warning-color: @gradient-orange;
  431 +@goods-action-button-danger-color: @gradient-red;
  432 +
  433 +// IndexAnchor
  434 +@index-anchor-z-index: 1;
  435 +@index-anchor-padding: 0 @padding-md;
  436 +@index-anchor-text-color: @text-color;
  437 +@index-anchor-font-weight: @font-weight-bold;
  438 +@index-anchor-font-size: @font-size-md;
  439 +@index-anchor-line-height: 32px;
  440 +@index-anchor-background-color: transparent;
  441 +@index-anchor-sticky-text-color: @red;
  442 +@index-anchor-sticky-background-color: @white;
  443 +
  444 +// IndexBar
  445 +@index-bar-sidebar-z-index: 2;
  446 +@index-bar-index-font-size: @font-size-xs;
  447 +@index-bar-index-line-height: @line-height-xs;
  448 +@index-bar-index-active-color: @red;
  449 +
  450 +// Info
  451 +@info-size: 16px;
  452 +@info-color: @white;
  453 +@info-padding: 0 3px;
  454 +@info-font-size: @font-size-sm;
  455 +@info-font-weight: @font-weight-bold;
  456 +@info-border-width: @border-width-base;
  457 +@info-background-color: @red;
  458 +@info-dot-color: @red;
  459 +@info-dot-size: 8px;
  460 +@info-font-family: -apple-system-font, Helvetica Neue, Arial, sans-serif;
  461 +
  462 +// Image
  463 +@image-placeholder-text-color: @gray-6;
  464 +@image-placeholder-font-size: @font-size-md;
  465 +@image-placeholder-background-color: @background-color;
  466 +@image-loading-icon-size: 32px;
  467 +@image-loading-icon-color: @gray-4;
  468 +@image-error-icon-size: 32px;
  469 +@image-error-icon-color: @gray-4;
  470 +
  471 +// ImagePreview
  472 +@image-preview-index-text-color: @white;
  473 +@image-preview-index-font-size: @font-size-md;
  474 +@image-preview-index-line-height: @line-height-md;
  475 +@image-preview-index-text-shadow: 0 1px 1px @gray-8;
  476 +@image-preview-overlay-background-color: rgba(0, 0, 0, 0.9);
  477 +@image-preview-close-icon-size: 22px;
  478 +@image-preview-close-icon-color: @gray-5;
  479 +@image-preview-close-icon-active-color: @gray-6;
  480 +@image-preview-close-icon-margin: @padding-md;
  481 +@image-preview-close-icon-z-index: 1;
  482 +
  483 +// List
  484 +@list-text-color: @gray-6;
  485 +@list-text-font-size: @font-size-md;
  486 +@list-text-line-height: 50px;
  487 +
  488 +// Loading
  489 +@loading-text-color: @gray-6;
  490 +@loading-text-font-size: @font-size-md;
  491 +@loading-spinner-color: @gray-5;
  492 +@loading-spinner-size: 30px;
  493 +@loading-spinner-animation-duration: 0.8s;
  494 +
  495 +// NavBar
  496 +@nav-bar-height: 46px;
  497 +@nav-bar-background-color: @white;
  498 +@nav-bar-arrow-size: 16px;
  499 +@nav-bar-icon-color: @blue;
  500 +@nav-bar-text-color: @blue;
  501 +@nav-bar-title-font-size: @font-size-lg;
  502 +@nav-bar-title-text-color: @text-color;
  503 +@nav-bar-z-index: 1;
  504 +
  505 +// NoticeBar
  506 +@notice-bar-height: 40px;
  507 +@notice-bar-padding: 0 @padding-md;
  508 +@notice-bar-wrapable-padding: @padding-xs @padding-md;
  509 +@notice-bar-text-color: @orange-dark;
  510 +@notice-bar-font-size: @font-size-md;
  511 +@notice-bar-line-height: 24px;
  512 +@notice-bar-background-color: @orange-light;
  513 +@notice-bar-icon-size: 16px;
  514 +@notice-bar-icon-min-width: 24px;
  515 +
  516 +// Notify
  517 +@notify-text-color: @white;
  518 +@notify-padding: @padding-xs @padding-md;
  519 +@notify-font-size: @font-size-md;
  520 +@notify-line-height: @line-height-md;
  521 +@notify-primary-background-color: @blue;
  522 +@notify-success-background-color: @green;
  523 +@notify-danger-background-color: @red;
  524 +@notify-warning-background-color: @orange;
  525 +
  526 +// NumberKeyboard
  527 +@number-keyboard-background-color: @gray-2;
  528 +@number-keyboard-key-height: 48px;
  529 +@number-keyboard-key-font-size: 28px;
  530 +@number-keyboard-key-active-color: @gray-3;
  531 +@number-keyboard-delete-font-size: @font-size-lg;
  532 +@number-keyboard-title-color: @gray-7;
  533 +@number-keyboard-title-height: 34px;
  534 +@number-keyboard-title-font-size: @font-size-lg;
  535 +@number-keyboard-close-padding: 0 @padding-md;
  536 +@number-keyboard-close-color: @text-link-color;
  537 +@number-keyboard-close-font-size: @font-size-md;
  538 +@number-keyboard-button-text-color: @white;
  539 +@number-keyboard-button-background-color: @blue;
  540 +@number-keyboard-cursor-color: @text-color;
  541 +@number-keyboard-cursor-width: 1px;
  542 +@number-keyboard-cursor-height: 40%;
  543 +@number-keyboard-cursor-animation-duration: 1s;
  544 +@number-keyboard-z-index: 100;
  545 +
  546 +// Overlay
  547 +@overlay-z-index: 1;
  548 +@overlay-background-color: rgba(0, 0, 0, 0.7);
  549 +
  550 +// Pagination
  551 +@pagination-height: 40px;
  552 +@pagination-font-size: @font-size-md;
  553 +@pagination-item-width: 36px;
  554 +@pagination-item-default-color: @blue;
  555 +@pagination-item-disabled-color: @gray-7;
  556 +@pagination-item-disabled-background-color: @background-color;
  557 +@pagination-background-color: @white;
  558 +@pagination-desc-color: @gray-7;
  559 +@pagination-disabled-opacity: @disabled-opacity;
  560 +
  561 +// Panel
  562 +@panel-background-color: @white;
  563 +@panel-header-value-color: @red;
  564 +@panel-footer-padding: @padding-xs @padding-md;
  565 +
  566 +// PasswordInput
  567 +@password-input-height: 50px;
  568 +@password-input-margin: 0 @padding-md;
  569 +@password-input-font-size: 20px;
  570 +@password-input-border-radius: 6px;
  571 +@password-input-background-color: @white;
  572 +@password-input-info-color: @gray-6;
  573 +@password-input-info-font-size: @font-size-md;
  574 +@password-input-error-info-color: @red;
  575 +@password-input-dot-size: 10px;
  576 +@password-input-dot-color: @black;
  577 +
  578 +// Picker
  579 +@picker-background-color: @white;
  580 +@picker-toolbar-height: 44px;
  581 +@picker-title-font-size: @font-size-lg;
  582 +@picker-title-line-height: @line-height-md;
  583 +@picker-action-padding: 0 @padding-md;
  584 +@picker-action-font-size: @font-size-md;
  585 +@picker-confirm-action-color: @text-link-color;
  586 +@picker-cancel-action-color: @gray-6;
  587 +@picker-option-font-size: @font-size-lg;
  588 +@picker-option-text-color: @black;
  589 +@picker-option-disabled-opacity: 0.3;
  590 +@picker-loading-icon-color: @blue;
  591 +@picker-loading-mask-color: rgba(255, 255, 255, 0.9);
  592 +
  593 +// Popover
  594 +@popover-arrow-size: 6px;
  595 +@popover-border-radius: @border-radius-lg;
  596 +@popover-action-width: 128px;
  597 +@popover-action-height: 44px;
  598 +@popover-action-font-size: @font-size-md;
  599 +@popover-action-line-height: @line-height-md;
  600 +@popover-action-icon-size: 20px;
  601 +@popover-light-text-color: @text-color;
  602 +@popover-light-background-color: @white;
  603 +@popover-light-action-disabled-text-color: @gray-5;
  604 +@popover-dark-text-color: @white;
  605 +@popover-dark-background-color: #4a4a4a;
  606 +@popover-dark-action-disabled-text-color: @gray-6;
  607 +
  608 +// Popup
  609 +@popup-background-color: @white;
  610 +@popup-transition: transform @animation-duration-base;
  611 +@popup-round-border-radius: 16px;
  612 +@popup-close-icon-size: 22px;
  613 +@popup-close-icon-color: @gray-5;
  614 +@popup-close-icon-active-color: @gray-6;
  615 +@popup-close-icon-margin: 16px;
  616 +@popup-close-icon-z-index: 1;
  617 +
  618 +// Progress
  619 +@progress-height: 4px;
  620 +@progress-color: @blue;
  621 +@progress-background-color: @gray-3;
  622 +@progress-pivot-padding: 0 5px;
  623 +@progress-pivot-text-color: @white;
  624 +@progress-pivot-font-size: @font-size-xs;
  625 +@progress-pivot-line-height: 1.6;
  626 +@progress-pivot-background-color: @blue;
  627 +
  628 +// PullRefresh
  629 +@pull-refresh-head-height: 50px;
  630 +@pull-refresh-head-font-size: @font-size-md;
  631 +@pull-refresh-head-text-color: @gray-6;
  632 +
  633 +// Radio
  634 +@radio-size: 20px;
  635 +@radio-border-color: @gray-5;
  636 +@radio-transition-duration: @animation-duration-fast;
  637 +@radio-label-margin: @padding-xs;
  638 +@radio-label-color: @text-color;
  639 +@radio-checked-icon-color: @blue;
  640 +@radio-disabled-icon-color: @gray-5;
  641 +@radio-disabled-label-color: @gray-5;
  642 +@radio-disabled-background-color: @border-color;
  643 +
  644 +// Rate
  645 +@rate-icon-size: 20px;
  646 +@rate-icon-gutter: @padding-base;
  647 +@rate-icon-void-color: @gray-5;
  648 +@rate-icon-full-color: @red;
  649 +@rate-icon-disabled-color: @gray-5;
  650 +
  651 +// ShareSheet
  652 +@share-sheet-header-padding: @padding-sm @padding-md @padding-base;
  653 +@share-sheet-title-color: @text-color;
  654 +@share-sheet-title-font-size: @font-size-md;
  655 +@share-sheet-title-line-height: @line-height-md;
  656 +@share-sheet-description-color: @gray-6;
  657 +@share-sheet-description-font-size: @font-size-sm;
  658 +@share-sheet-description-line-height: 16px;
  659 +@share-sheet-icon-size: 48px;
  660 +@share-sheet-option-name-color: @gray-7;
  661 +@share-sheet-option-name-font-size: @font-size-sm;
  662 +@share-sheet-option-description-color: @gray-5;
  663 +@share-sheet-option-description-font-size: @font-size-sm;
  664 +@share-sheet-cancel-button-font-size: @font-size-lg;
  665 +@share-sheet-cancel-button-height: 48px;
  666 +@share-sheet-cancel-button-background: @white;
  667 +
  668 +// Search
  669 +@search-padding: 10px @padding-sm;
  670 +@search-background-color: @white;
  671 +@search-content-background-color: @gray-1;
  672 +@search-input-height: 34px;
  673 +@search-label-padding: 0 5px;
  674 +@search-label-color: @text-color;
  675 +@search-label-font-size: @font-size-md;
  676 +@search-left-icon-color: @gray-6;
  677 +@search-action-padding: 0 @padding-xs;
  678 +@search-action-text-color: @text-color;
  679 +@search-action-font-size: @font-size-md;
  680 +
  681 +// Sidebar
  682 +@sidebar-width: 80px;
  683 +@sidebar-font-size: @font-size-md;
  684 +@sidebar-line-height: @line-height-md;
  685 +@sidebar-text-color: @text-color;
  686 +@sidebar-disabled-text-color: @gray-5;
  687 +@sidebar-padding: 20px @padding-sm;
  688 +@sidebar-active-color: @active-color;
  689 +@sidebar-background-color: @background-color;
  690 +@sidebar-selected-font-weight: @font-weight-bold;
  691 +@sidebar-selected-text-color: @text-color;
  692 +@sidebar-selected-border-width: 4px;
  693 +@sidebar-selected-border-height: 16px;
  694 +@sidebar-selected-border-color: @red;
  695 +@sidebar-selected-background-color: @white;
  696 +
  697 +// Skeleton
  698 +@skeleton-row-height: 16px;
  699 +@skeleton-row-background-color: @active-color;
  700 +@skeleton-row-margin-top: @padding-sm;
  701 +@skeleton-title-width: 40%;
  702 +@skeleton-avatar-size: 32px;
  703 +@skeleton-avatar-background-color: @active-color;
  704 +@skeleton-animation-duration: 1.2s;
  705 +
  706 +// Slider
  707 +@slider-active-background-color: @blue;
  708 +@slider-inactive-background-color: @gray-3;
  709 +@slider-disabled-opacity: @disabled-opacity;
  710 +@slider-bar-height: 2px;
  711 +@slider-button-width: 24px;
  712 +@slider-button-height: 24px;
  713 +@slider-button-border-radius: 50%;
  714 +@slider-button-background-color: @white;
  715 +@slider-button-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
  716 +
  717 +// Step
  718 +@step-text-color: @gray-6;
  719 +@step-active-color: @green;
  720 +@step-process-text-color: @text-color;
  721 +@step-font-size: @font-size-md;
  722 +@step-line-color: @border-color;
  723 +@step-finish-line-color: @green;
  724 +@step-finish-text-color: @text-color;
  725 +@step-icon-size: 12px;
  726 +@step-circle-size: 5px;
  727 +@step-circle-color: @gray-6;
  728 +@step-horizontal-title-font-size: @font-size-sm;
  729 +
  730 +// Steps
  731 +@steps-background-color: @white;
  732 +
  733 +// Sticky
  734 +@sticky-z-index: 99;
  735 +
  736 +// Stepper
  737 +@stepper-active-color: #e8e8e8;
  738 +@stepper-background-color: @active-color;
  739 +@stepper-button-icon-color: @text-color;
  740 +@stepper-button-disabled-color: @background-color;
  741 +@stepper-button-disabled-icon-color: @gray-5;
  742 +@stepper-button-round-theme-color: @blue;
  743 +@stepper-input-width: 32px;
  744 +@stepper-input-height: 28px;
  745 +@stepper-input-font-size: @font-size-md;
  746 +@stepper-input-line-height: normal;
  747 +@stepper-input-text-color: @text-color;
  748 +@stepper-input-disabled-text-color: @gray-5;
  749 +@stepper-input-disabled-background-color: @active-color;
  750 +@stepper-border-radius: @border-radius-md;
  751 +
  752 +// SubmitBar
  753 +@submit-bar-height: 50px;
  754 +@submit-bar-z-index: 100;
  755 +@submit-bar-background-color: @white;
  756 +@submit-bar-button-width: 110px;
  757 +@submit-bar-price-color: @red;
  758 +@submit-bar-price-font-size: @font-size-md;
  759 +@submit-bar-currency-font-size: @font-size-md;
  760 +@submit-bar-text-color: @text-color;
  761 +@submit-bar-text-font-size: @font-size-md;
  762 +@submit-bar-tip-padding: @padding-xs @padding-sm;
  763 +@submit-bar-tip-font-size: @font-size-sm;
  764 +@submit-bar-tip-line-height: 1.5;
  765 +@submit-bar-tip-color: #f56723;
  766 +@submit-bar-tip-background-color: #fff7cc;
  767 +@submit-bar-tip-icon-size: 12px;
  768 +@submit-bar-button-height: 40px;
  769 +@submit-bar-padding: 0 @padding-md;
  770 +@submit-bar-price-integer-font-size: 20px;
  771 +@submit-bar-price-font-family: @price-integer-font-family;
  772 +
  773 +// Swipe
  774 +@swipe-indicator-size: 6px;
  775 +@swipe-indicator-margin: @padding-sm;
  776 +@swipe-indicator-active-opacity: 1;
  777 +@swipe-indicator-inactive-opacity: 0.3;
  778 +@swipe-indicator-active-background-color: @blue;
  779 +@swipe-indicator-inactive-background-color: @border-color;
  780 +
  781 +// Switch
  782 +@switch-size: 30px;
  783 +@switch-width: 2em;
  784 +@switch-height: 1em;
  785 +@switch-node-size: 1em;
  786 +@switch-node-background-color: @white;
  787 +@switch-node-box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05),
  788 +0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
  789 +@switch-background-color: @white;
  790 +@switch-on-background-color: @blue;
  791 +@switch-transition-duration: @animation-duration-base;
  792 +@switch-disabled-opacity: @disabled-opacity;
  793 +@switch-border: @border-width-base solid rgba(0, 0, 0, 0.1);
  794 +
  795 +// SwitchCell
  796 +@switch-cell-padding-top: @cell-vertical-padding - 1px;
  797 +@switch-cell-padding-bottom: @cell-vertical-padding - 1px;
  798 +@switch-cell-large-padding-top: @cell-large-vertical-padding - 1px;
  799 +@switch-cell-large-padding-bottom: @cell-large-vertical-padding - 1px;
  800 +
  801 +// Tabbar
  802 +@tabbar-height: 50px;
  803 +@tabbar-z-index: 1;
  804 +@tabbar-background-color: @white;
  805 +
  806 +// TabbarItem
  807 +@tabbar-item-font-size: @font-size-sm;
  808 +@tabbar-item-text-color: @gray-7;
  809 +@tabbar-item-active-color: @blue;
  810 +@tabbar-item-active-background-color: @tabbar-background-color;
  811 +@tabbar-item-line-height: 1;
  812 +@tabbar-item-icon-size: 22px;
  813 +@tabbar-item-margin-bottom: 4px;
  814 +
  815 +// Tab
  816 +@tab-text-color: @gray-7;
  817 +@tab-active-text-color: @text-color;
  818 +@tab-disabled-text-color: @gray-5;
  819 +@tab-font-size: @font-size-md;
  820 +@tab-line-height: @line-height-md;
  821 +
  822 +// Tabs
  823 +@tabs-default-color: @red;
  824 +@tabs-line-height: 44px;
  825 +@tabs-card-height: 30px;
  826 +@tabs-nav-background-color: @white;
  827 +@tabs-bottom-bar-width: 40px;
  828 +@tabs-bottom-bar-height: 3px;
  829 +@tabs-bottom-bar-color: @tabs-default-color;
  830 +
  831 +// Tag
  832 +@tag-padding: 0 @padding-base;
  833 +@tag-text-color: @white;
  834 +@tag-font-size: @font-size-sm;
  835 +@tag-border-radius: 2px;
  836 +@tag-line-height: 16px;
  837 +@tag-medium-padding: 2px 6px;
  838 +@tag-large-padding: @padding-base @padding-xs;
  839 +@tag-large-border-radius: @border-radius-md;
  840 +@tag-large-font-size: @font-size-md;
  841 +@tag-round-border-radius: @border-radius-max;
  842 +@tag-danger-color: @red;
  843 +@tag-primary-color: @blue;
  844 +@tag-success-color: @green;
  845 +@tag-warning-color: @orange;
  846 +@tag-default-color: @gray-6;
  847 +@tag-plain-background-color: @white;
  848 +
  849 +// Toast
  850 +@toast-max-width: 70%;
  851 +@toast-font-size: @font-size-md;
  852 +@toast-text-color: @white;
  853 +@toast-loading-icon-color: @white;
  854 +@toast-line-height: @line-height-md;
  855 +@toast-border-radius: @border-radius-lg;
  856 +@toast-background-color: fade(@black, 70%);
  857 +@toast-icon-size: 36px;
  858 +@toast-text-min-width: 96px;
  859 +@toast-text-padding: @padding-xs @padding-sm;
  860 +@toast-default-padding: @padding-md;
  861 +@toast-default-width: 88px;
  862 +@toast-default-min-height: 88px;
  863 +@toast-position-top-distance: 20%;
  864 +@toast-position-bottom-distance: 20%;
  865 +
  866 +// TreeSelect
  867 +@tree-select-font-size: @font-size-md;
  868 +@tree-select-nav-background-color: @background-color;
  869 +@tree-select-content-background-color: @white;
  870 +@tree-select-nav-item-padding: 14px @padding-sm;
  871 +@tree-select-item-height: 48px;
  872 +@tree-select-item-active-color: @red;
  873 +@tree-select-item-disabled-color: @gray-5;
  874 +@tree-select-item-selected-size: 16px;
  875 +
  876 +// Uploader
  877 +@uploader-size: 80px;
  878 +@uploader-icon-size: 24px;
  879 +@uploader-icon-color: @gray-4;
  880 +@uploader-text-color: @gray-6;
  881 +@uploader-text-font-size: @font-size-sm;
  882 +@uploader-upload-background-color: @gray-1;
  883 +@uploader-upload-active-color: @active-color;
  884 +@uploader-delete-color: @white;
  885 +@uploader-delete-icon-size: 14px;
  886 +@uploader-delete-background-color: rgba(0, 0, 0, 0.7);
  887 +@uploader-file-background-color: @background-color;
  888 +@uploader-file-icon-size: 20px;
  889 +@uploader-file-icon-color: @gray-7;
  890 +@uploader-file-name-padding: 0 @padding-base;
  891 +@uploader-file-name-margin-top: @padding-xs;
  892 +@uploader-file-name-font-size: @font-size-sm;
  893 +@uploader-file-name-text-color: @gray-7;
  894 +@uploader-mask-background-color: fade(@gray-8, 88%);
  895 +@uploader-mask-icon-size: 22px;
  896 +@uploader-mask-message-font-size: @font-size-sm;
  897 +@uploader-mask-message-line-height: @line-height-xs;
  898 +@uploader-loading-icon-size: 22px;
  899 +@uploader-loading-icon-color: @white;
  900 +@uploader-disabled-opacity: @disabled-opacity;
  901 +
  902 +// Sku
  903 +@sku-item-background-color: @background-color;
  904 +@sku-icon-gray-color: @gray-4;
  905 +@sku-upload-mask-color: rgba(50, 50, 51, 0.8);
... ...
src/assets/images/cards/novipcard.png 0 → 100644

21.7 KB

src/assets/images/cards/vipcardbg.png 0 → 100644

16.5 KB

src/assets/images/cards/vipcardbg1.png 0 → 100644

3.98 KB

src/assets/images/myCars/addBtn.png 0 → 100644

577 Bytes

src/assets/images/myCars/addBtnBg.png 0 → 100644

575 Bytes

src/assets/images/myCars/carNumBg.png 0 → 100644

1.01 KB

src/assets/images/myCars/fornt.png 0 → 100644

4.03 KB

src/components/vant-number-plate/vnp-input-box.vue 0 → 100644
  1 +<template>
  2 + <div class="vnp-input-box">
  3 + <ul>
  4 + <li
  5 + v-for="(item, index) in val"
  6 + :key="index"
  7 + :class="{ active: activeIndex === index }"
  8 + @click="handleClickItem(index)"
  9 + >
  10 + <span>{{ item }}</span>
  11 + </li>
  12 + </ul>
  13 + </div>
  14 +</template>
  15 +
  16 +<script>
  17 +export default {
  18 + props: {
  19 + value: {
  20 + type: String,
  21 + default: "",
  22 + },
  23 + editable: {
  24 + type: Boolean,
  25 + default: false,
  26 + },
  27 + },
  28 + data() {
  29 + return {
  30 + val: ["", "", "", "", "", "", "", ""],
  31 + activeIndex: this.editable ? 0 : undefined,
  32 + };
  33 + },
  34 + watch: {
  35 + activeIndex() {
  36 + this.$emit("activeChange", this.activeIndex);
  37 + },
  38 + value: {
  39 + immediate: true,
  40 + handler() {
  41 + if (this.val.join("") === this.value) {
  42 + return;
  43 + }
  44 + const val = this.value.split("");
  45 + if (this.editable) {
  46 + this.activeIndex = val.length;
  47 + }
  48 + while (val.length < 8) {
  49 + val.push("");
  50 + }
  51 + this.val = val;
  52 + },
  53 + },
  54 + val() {
  55 + this.$emit("input", this.val.join(""));
  56 + },
  57 + },
  58 + methods: {
  59 + handleClickItem(index) {
  60 + if (!this.editable) {
  61 + return;
  62 + }
  63 + this.activeIndex = index;
  64 + },
  65 + setValue(val) {
  66 + this.$set(this.val, this.activeIndex, val);
  67 + if (this.activeIndex < 7) {
  68 + this.activeIndex += 1;
  69 + }
  70 + },
  71 + del() {
  72 + this.$set(this.val, this.activeIndex, "");
  73 + if (this.activeIndex > 0) {
  74 + this.activeIndex -= 1;
  75 + }
  76 + },
  77 + },
  78 +}
  79 +</script>
  80 +
  81 +<style lang="less" scoped>
  82 + .vnp-input-box {
  83 + padding: 10px 0;
  84 + border: 1px solid #d8d8d8;
  85 + border-radius: 2px;
  86 + color: #8d8d8d;
  87 + font-size: 15px;
  88 + text-align: center;
  89 +
  90 + ul {
  91 + display: flex;
  92 + }
  93 + li {
  94 + flex: 1;
  95 + border-right: 1px solid #eaeaea;
  96 + height: 28px;
  97 + line-height: 28px;
  98 +
  99 + &:first-child {
  100 + border-color: #a6a6a6;
  101 + flex: 1.3;
  102 + }
  103 + &:last-child {
  104 + border: none;
  105 + }
  106 + &.active {
  107 + color: #1989fa;
  108 +
  109 + > span {
  110 + height: 100%;
  111 + width: 20px;
  112 + display: inline-block;
  113 + border-bottom: 1px solid #1989fa;
  114 + }
  115 + }
  116 + }
  117 + }
  118 +</style>
... ...
src/components/vant-number-plate/vnp-input.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <vnp-input-box
  4 + :value="val"
  5 + @click.native="show = true"
  6 + ></vnp-input-box>
  7 + <vnp-keyboard
  8 + :show.sync="show"
  9 + v-model="val"
  10 + ></vnp-keyboard>
  11 + </div>
  12 +</template>
  13 +
  14 +<script>
  15 +import Box from "./vnp-input-box";
  16 +import Keyboard from "./vnp-keyboard";
  17 +
  18 +export default {
  19 + props: {
  20 + value: {
  21 + type: String,
  22 + default: "",
  23 + },
  24 + },
  25 + components: {
  26 + 'vnp-input-box': Box,
  27 + 'vnp-keyboard': Keyboard
  28 + },
  29 + data() {
  30 + return {
  31 + show: false,
  32 + };
  33 + },
  34 + computed: {
  35 + val: {
  36 + set(v) {
  37 + this.$emit("input", v);
  38 + },
  39 + get() {
  40 + return this.value;
  41 + },
  42 + },
  43 + },
  44 +};
  45 +</script>
... ...
src/components/vant-number-plate/vnp-keyboard.vue 0 → 100644
  1 +<template>
  2 + <van-action-sheet v-model="visible" get-container="body">
  3 + <div class="vnp-header">
  4 + <button type="button" class="vnp-btn-finish" @click="finish">完成</button>
  5 + </div>
  6 +
  7 + <div class="vnp-input-box-outer">
  8 + <vnp-input-box ref="inputBox" v-model="val" editable @activeChange="handleActiveChange"></vnp-input-box>
  9 + </div>
  10 +
  11 + <div class="vnp-keys">
  12 + <div class="vnp-keys-row" v-for="(item, index) in list" :key="index">
  13 + <div
  14 + class="vnp-btn-key-wrapper"
  15 + v-for="(val, index) in item"
  16 + :key="index"
  17 + :class="{
  18 + 'vnp-del-wrapper': val === 'del',
  19 + 'vnp-type-wrapper': val === 'type'
  20 + }"
  21 + >
  22 + <van-button v-if="val === 'type'" class="vnp-btn-key" @click="handleChangeType">
  23 + <span v-if="type === 'cn'">中/<span class="vnp-smaller">英</span></span>
  24 + <span v-else><span class="vnp-smaller">中</span>/英</span>
  25 + </van-button>
  26 +
  27 + <van-button v-else-if="val === 'del'" class="vnp-btn-key" @click="handleDel">
  28 + <svg
  29 + viewBox="0 0 32 22"
  30 + xmlns="http://www.w3.org/2000/svg"
  31 + class="vnp-delete-icon"
  32 + >
  33 + <path
  34 + d="M28.016 0A3.991 3.991 0 0132 3.987v14.026c0 2.2-1.787 3.987-3.98 3.987H10.382c-.509 0-.996-.206-1.374-.585L.89 13.09C.33 12.62 0 11.84 0 11.006c0-.86.325-1.62.887-2.08L9.01.585A1.936 1.936 0 0110.383 0zm0 1.947H10.368L2.24 10.28c-.224.226-.312.432-.312.73 0 .287.094.51.312.729l8.128 8.333h17.648a2.041 2.041 0 002.037-2.04V3.987c0-1.127-.915-2.04-2.037-2.04zM23.028 6a.96.96 0 01.678.292.95.95 0 01-.003 1.377l-3.342 3.348 3.326 3.333c.189.188.292.43.292.679 0 .248-.103.49-.292.679a.96.96 0 01-.678.292.959.959 0 01-.677-.292L18.99 12.36l-3.343 3.345a.96.96 0 01-.677.292.96.96 0 01-.678-.292.962.962 0 01-.292-.68c0-.248.104-.49.292-.679l3.342-3.348-3.342-3.348A.963.963 0 0114 6.971c0-.248.104-.49.292-.679A.96.96 0 0114.97 6a.96.96 0 01.677.292l3.358 3.348 3.345-3.348A.96.96 0 0123.028 6z"
  35 + fill="currentColor"
  36 + ></path>
  37 + </svg>
  38 + </van-button>
  39 +
  40 + <van-button v-else class="vnp-btn-key" :class="{'vnp-btn-empty': !val}" @click="handleClickKey(val)">
  41 + {{ val }}
  42 + </van-button
  43 + >
  44 + </div>
  45 + </div>
  46 + </div>
  47 + </van-action-sheet>
  48 +</template>
  49 +
  50 +<script>
  51 +import Box from './vnp-input-box'
  52 +
  53 +export default {
  54 + components: {
  55 + 'vnp-input-box': Box
  56 + },
  57 + props: {
  58 + show: {
  59 + type: Boolean,
  60 + default: false
  61 + },
  62 + value: {
  63 + type: String,
  64 + default: ""
  65 + },
  66 + },
  67 + data() {
  68 + return {
  69 + val: this.value,
  70 + type: "cn",
  71 + cn: [
  72 + ["京", "津", "沪", "渝", "冀", "豫", "云", "辽", "黑", "湘"],
  73 + ["皖", "鲁", "新", "苏", "浙", "赣", "鄂", "桂", "甘", "晋"],
  74 + ["蒙", "陕", "吉", "闽", "贵", "粤", "青", "藏", "川", "宁"],
  75 + ["type", "琼", "使", "领", "学", "", "", "", "del"]
  76 + ],
  77 + en: [
  78 + ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
  79 + ["Q", "W", "E", "R", "T", "Y", "U", "O", "P"],
  80 + ["A", "S", "D", "F", "G", "H", "J", "K", "L"],
  81 + ["type", "Z", "X", "C", "V", "B", "N", "M", "del"]
  82 + ],
  83 + }
  84 + },
  85 + computed: {
  86 + visible: {
  87 + set(val) {
  88 + this.$emit("update:show", val);
  89 + },
  90 + get() {
  91 + return this.show;
  92 + }
  93 + },
  94 + list() {
  95 + return this.type === "en" ? this.en : this.cn;
  96 + }
  97 + },
  98 + watch: {
  99 + show() {
  100 + if (this.show) {
  101 + this.val = this.value;
  102 + }
  103 + }
  104 + },
  105 + methods: {
  106 + handleChangeType() {
  107 + this.type = this.type === "en" ? "cn" : "en";
  108 + },
  109 + handleClickKey(val) {
  110 + if (val) {
  111 + this.$refs.inputBox.setValue(val);
  112 + }
  113 + },
  114 + handleActiveChange(activeIndex) {
  115 + if (activeIndex === 0) {
  116 + this.type = "cn";
  117 + } else {
  118 + this.type = "en";
  119 + }
  120 + },
  121 + handleDel() {
  122 + this.$refs.inputBox.del();
  123 + },
  124 + finish() {
  125 + this.$emit("input", this.val);
  126 + this.visible = false;
  127 + }
  128 + }
  129 +}
  130 +</script>
  131 +
  132 +<style lang="less" scoped>
  133 + .vnp-header {
  134 + height: 40px;
  135 + padding-top: 6px;
  136 + position: relative;
  137 +
  138 + .vnp-btn-finish {
  139 + position: absolute;
  140 + right: 0;
  141 + height: 100%;
  142 + padding: 0 16px;
  143 + color: #576b95;
  144 + font-size: 14px;
  145 + background-color: transparent;
  146 + border: none;
  147 + cursor: pointer;
  148 + }
  149 + }
  150 +
  151 + .vnp-input-box-outer {
  152 + width: 82%;
  153 + max-width: 600px;
  154 + margin: 0 auto;
  155 + padding: 10px;
  156 + }
  157 +
  158 + .vnp-keys {
  159 + padding: 3px;
  160 + background: #f2f3f5;
  161 + padding-bottom: 22px;
  162 +
  163 + .vnp-keys-row {
  164 + display: flex;
  165 + justify-content: center;
  166 + }
  167 + .vnp-btn-key-wrapper {
  168 + flex: 0 1 calc((100% - 6px * 10) / 10);
  169 + padding: 3px;
  170 + box-sizing: content-box;
  171 +
  172 + &.vnp-del-wrapper,
  173 + &.vnp-type-wrapper {
  174 + flex: 1;
  175 + }
  176 + &.vnp-type-wrapper {
  177 + .vnp-smaller {
  178 + color: #999;
  179 + font-size: 12px;
  180 + }
  181 + }
  182 +
  183 + .vnp-btn-key {
  184 + padding: 0;
  185 + width: 100%;
  186 + border-radius: 4px;
  187 + }
  188 + .vnp-btn-empty {
  189 + background: transparent;
  190 + border: none;
  191 + }
  192 + .vnp-delete-icon {
  193 + width: 18px;
  194 + vertical-align: middle;
  195 + }
  196 + }
  197 + }
  198 +</style>>
... ...
src/main.js
... ... @@ -8,17 +8,27 @@ import &#39;./assets/css/reset.css&#39; // 引入公共样式
8 8  
9 9 import './assets/iconfont/iconfont.css'
10 10  
11   -import h5Popup from 'vue-h5-popup' // 引入弹窗
12   -Vue.use(h5Popup)
13   -
14   -
15   -import BaiduMap from 'vue-baidu-map'
16   -
17   -Vue.use(BaiduMap, {
18   - // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
19   - ak: 'cuMSxNl5LOY6sf1M3nDGtG6tGXl5a0Bb'
  11 +// 路由守卫
  12 +router.beforeEach((to,from ,next)=>{
  13 + if(to.meta.title) {
  14 + document.title=to.meta.title;
  15 + }else {
  16 + document.title='宣化微信公众号';
  17 + }
  18 + next()
20 19 })
21 20  
  21 +// import h5Popup from 'vue-h5-popup' // 引入弹窗
  22 +// Vue.use(h5Popup)
  23 +//
  24 +//
  25 +// import BaiduMap from 'vue-baidu-map'
  26 +//
  27 +// Vue.use(BaiduMap, {
  28 +// // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
  29 +// ak: 'cuMSxNl5LOY6sf1M3nDGtG6tGXl5a0Bb'
  30 +// })
  31 +//
22 32  
23 33 import 'mint-ui/lib/style.css'
24 34 import { MessageBox } from 'mint-ui'
... ... @@ -32,6 +42,15 @@ import { Field } from &#39;mint-ui&#39;;
32 42  
33 43 Vue.component(Field.name, Field);
34 44  
  45 +
  46 +
  47 +
  48 +
  49 +
  50 +
  51 +
  52 +
  53 +
35 54 //全局设置的基本样式
36 55 import './assets/css/base.scss'
37 56  
... ... @@ -45,13 +64,21 @@ Vue.prototype.$moment = moment
45 64 import utils from './utils/utils' // 工具类
46 65 Vue.prototype.$utils = utils
47 66 //
48   -// import Mint from 'mint-ui';
49   -// import 'mint-ui/lib/style.css'
50   -// Vue.use(Mint);
  67 +import Mint from 'mint-ui';
  68 +import 'mint-ui/lib/style.css'
  69 +Vue.use(Mint);
  70 +
  71 +
  72 +// 在main.js中
  73 +
  74 +import Vant from 'vant';
  75 +
  76 +import 'vant/lib/index.css';
  77 +import 'vant/lib/index.less';
  78 +
  79 +Vue.use(Vant);
51 80  
52 81  
53   -import 'swiper/dist/css/swiper.min.css' // 轮播
54   -import 'swiper/dist/js/swiper.min'
55 82  
56 83 import vueFilter from './utils/filters' // 公共filter
57 84 for (let key in vueFilter){
... ...
src/router/index.js
... ... @@ -67,50 +67,99 @@ export default new Router({
67 67  
68 68  
69 69  
70   - // //---------------- 个人页面导航
71   - // {
72   - // path: '/selfNav',
73   - // name: 'selfNav',
74   - // component: () => import("@/views/mySelf/selfNav.vue")
75   - // },
76   - //
77   - // // ------------------------建议反馈
78   - // {
79   - // path: '/suggestionBack',
80   - // name: 'suggestionBack',
81   - // component: () => import("@/views/mySelf/feedback/suggestionBack.vue")
82   - // },
83   - //
84   - // // ------------------------停车记录
85   - // {
86   - // path: '/parkNotes',
87   - // name: 'parkNotes',
88   - // component: () => import("@/views/mySelf/parkNotes/parkNotes.vue")
89   - // },
90   - //
91   - //
92   - // // ------------------------停车记录
93   - // {
94   - // path: '/binDing',
95   - // name: 'binDing',
96   - // component: () => import("@/views/binding/binDing.vue")
97   - // },
98   - //
99   - //
100   - // // ------------------------购买会员卡提示
101   - // {
102   - // path: '/cardPoint',
103   - // name: 'cardPoint',
104   - // component: () => import("@/views/cards/cardPoint.vue")
105   - // },
106   - //
107   - //
108   - // // ------------------------购买会员卡
109   - // {
110   - // path: '/buyCard',
111   - // name: 'buyCard',
112   - // component: () => import("@/views/cards/buyCard.vue")
113   - // },
  70 + //---------------- 个人页面导航
  71 + {
  72 + path: '/selfNav',
  73 + name: 'selfNav',
  74 + component: () => import("@/views/mySelf/selfNav.vue"),
  75 + meta: {title: "个人中心"}
  76 + },
  77 +
  78 + // ------------------------建议反馈
  79 + {
  80 + path: '/suggestionBack',
  81 + name: 'suggestionBack',
  82 + component: () => import("@/views/mySelf/feedback/suggestionBack.vue"),
  83 + meta: {title: "建议反馈"}
  84 + },
  85 +
  86 + // ------------------------停车记录
  87 + {
  88 + path: '/parkNotes',
  89 + name: 'parkNotes',
  90 + component: () => import("@/views/mySelf/parkNotes/parkNotes.vue")
  91 + },
  92 +
  93 +
  94 + // ------------------------登录
  95 + {
  96 + path: '/binDing',
  97 + name: 'binDing',
  98 + component: () => import("@/views/binding/binDing.vue"),
  99 + meta: {title: "绑定手机号"}
  100 + },
  101 + {
  102 + path: '/myCars',
  103 + name: 'myCars',
  104 + component: () => import("@/views//mySelf/myCars/myCars.vue"),
  105 + meta: {title: "我的车牌"}
  106 + },
  107 +
  108 + {
  109 + path: '/addCarNum',
  110 + name: 'addCarNum',
  111 + component: () => import("@/views//mySelf/myCars/addCarNum.vue"),
  112 + meta: {title: "添加车牌"}
  113 + },
  114 + {
  115 + path: '/rzCarNumber',
  116 + name: 'rzCarNumber',
  117 + component: () => import("@/views//mySelf/myCars/rzCarNumber.vue"),
  118 + meta: {title: "认证车牌"}
  119 + },
  120 +
  121 +
  122 + {
  123 + path: '/cardList',
  124 + name: 'cardList',
  125 + component: () => import("@/views//cards/cardList.vue"),
  126 + meta: {title: "会员卡列表"}
  127 + },
  128 +
  129 +
  130 + {
  131 + path: '/buyCardDetail',
  132 + name: 'buyCardDetail',
  133 + component: () => import("@/views//cards/buyCardDetail.vue"),
  134 + meta: {title: "购买会员卡"}
  135 + },
  136 +
  137 + {
  138 + path: '/buyVipCard',
  139 + name: 'buyVipCard',
  140 + component: () => import("@/views//cards/buyVipCard.vue"),
  141 + meta: {title: "购买会员卡"}
  142 + },
  143 +
  144 +
  145 +
  146 +
  147 +
  148 + // ------------------------购买会员卡提示
  149 + {
  150 + path: '/cardPoint',
  151 + name: 'cardPoint',
  152 + component: () => import("@/views/cards/cardPoint.vue")
  153 + },
  154 +
  155 +
  156 + // ------------------------购买会员卡
  157 + {
  158 + path: '/buyCard',
  159 + name: 'buyCard',
  160 + component: () => import("@/views/cards/buyCard.vue"),
  161 + meta: {title: "购买会员卡"}
  162 + },
114 163  
115 164  
116 165  
... ...
src/utils/utils.js
1   -import md5 from './md5.min.js';
  1 +import md5 from "./md5.min.js";
  2 +var myCommonSalt = function(val) { // 获取盐值
  3 + let len = parseInt(val);
  4 + let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  5 + let maxPos = $chars.length;
  6 + var pwd = "";
  7 + for (var i = 0; i < len; i++) {
  8 + pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  9 + }
  10 + console.log(pwd);
  11 + return pwd;
  12 +};
2 13 export default {
3   - myCommonSalt: function (val) { // 获取盐值
4   - let len = parseInt(val);
5   - let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
6   - let maxPos = $chars.length;
7   - var pwd = '';
8   - for (var i = 0; i < len; i++) {
9   - pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  14 + myCommonSalt,
  15 + formatDate: function(secs, type = 0) { //type是可选参数,因为json中时间的格式是year-month-date,不能识别XX年XX月XX日
  16 + var t = new Date(secs);
  17 + var year = t.getFullYear();
  18 + var month = t.getMonth() + 1;
  19 + if (month < 10) {
  20 + month = "0" + month;
  21 + }
  22 + var date = t.getDate();
  23 + if (date < 10) {
  24 + date = "0" + date;
  25 + }
  26 + var hour = t.getHours();
  27 + if (hour < 10) {
  28 + hour = "0" + hour;
  29 + }
  30 + var minute = t.getMinutes();
  31 + if (minute < 10) {
  32 + minute = "0" + minute;
  33 + }
  34 + var second = t.getSeconds();
  35 + if (second < 10) {
  36 + second = "0" + second;
  37 + }
  38 + if (type == 0) {
  39 + return year + "年" + month + "月" + date + "日";
  40 + } else {
  41 + return year + "-" + month + "-" + date;
10 42 }
11   - console.log(pwd);
12   - return pwd;
13 43 },
14   -
15   - formatDate: function(secs, type=0){ //type是可选参数,因为json中时间的格式是year-month-date,不能识别XX年XX月XX日
16   - var t = new Date(secs)
17   - var year = t.getFullYear()
18   - var month = t.getMonth() + 1
19   - if(month < 10){ month = '0' + month }
20   - var date = t.getDate()
21   - if(date < 10){ date = '0' + date }
22   - var hour = t.getHours()
23   - if(hour < 10){ hour = '0' + hour }
24   - var minute = t.getMinutes()
25   - if(minute < 10){ minute = '0' + minute }
26   - var second = t.getSeconds()
27   - if(second < 10){ second = '0' + second }
28   - if(type==0){
29   - return year + '年' + month + '月' + date + '日'
30   - }else{
31   - return year + '-'+month+'-'+date
32   - }},
33   -
34   - timestampToTime: function (timestamp) {
  44 + timestampToTime: function(timestamp) {
35 45 var d = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
36   - var youWant=d.getFullYear() + '-' + this.completedString(d.getMonth() + 1) + '-' + this.completedString(d.getDate()) ;
37   - return youWant
  46 + var youWant = d.getFullYear() + "-" + this.completedString(d.getMonth() + 1) + "-" + this.completedString(d.getDate());
  47 + return youWant;
38 48 },
39   - completedString:function(s) {
40   - return s < 10 ? '0' + s : s
  49 + completedString: function(s) {
  50 + return s < 10 ? "0" + s : s;
41 51 },
42   -
43   -
44   -
45   - dateFormat: function (msd) { // 时间转换
46   - var time = msd
47   -
  52 + dateFormat: function(msd) { // 时间转换
  53 + var time = msd;
48 54 if (null != time && "" != time) {
49   -
50 55 if (time > 60 && time < 60 * 60) {
51   -
52 56 time = parseInt(time / 60.0) + "分钟" + parseInt((parseFloat(time / 60.0) -
53   -
54 57 parseInt(time / 60.0)) * 60) + "秒";
55   -
56 58 }
57   -
58 59 else if (time >= 60 * 60 && time < 60 * 60 * 24) {
59   -
60 60 time = parseInt(time / 3600.0) + "小时" + parseInt((parseFloat(time / 3600.0) -
61   -
62 61 parseInt(time / 3600.0)) * 60) + "分钟" +
63   -
64 62 parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
65   -
66 63 parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60) + "秒";
67   -
68 64 } else if (time >= 60 * 60 * 24) {
69   -
70 65 time = parseInt(time / 3600.0 / 24) + "天" + parseInt((parseFloat(time / 3600.0 / 24) -
71   -
72 66 parseInt(time / 3600.0 / 24)) * 24) + "小时" + parseInt((parseFloat(time / 3600.0) -
73   -
74 67 parseInt(time / 3600.0)) * 60) + "分钟" +
75   -
76 68 parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
77   -
78 69 parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60) + "秒";
79   -
80 70 }
81   -
82 71 else {
83   -
84 72 time = parseInt(time) + "秒";
85   -
86 73 }
87   -
88 74 }
89   -
90 75 return time;
91 76 },
92   -
93   - signObject: function (jsonObj){ //签名字段
94   - let sort = []
95   - for(let k in jsonObj){
  77 + // myVxAppId: 'wx1489e48e6a547023',
  78 + signObject: function(jsonObj) { //签名字段
  79 + jsonObj.sign_type = "md5";
  80 + jsonObj.app_id = "ud8yq5tv0inxupc05xfeau39jywlqoj2";
  81 + jsonObj.deviceInfo = "BC0703A4-AFB0-4B51-9089-9B7487C0CC6E";
  82 + jsonObj.salt = myCommonSalt(32);
  83 + jsonObj.token = "99ecd32eed1b4ebea71bc73b0aabbb99";
  84 + let sort = [];
  85 + for (let k in jsonObj) {
96 86 sort.push({
97 87 keyname: k,
98 88 value: jsonObj[k]
99   - })
  89 + });
100 90 }
101   - return this.myGetSign(sort)
  91 + return this.myGetSign(sort);
102 92 },
103   -
104   - clientBrowser: function () { // 判断客户端
  93 + clientBrowser: function() { // 判断客户端
105 94 if (/MicroMessenger/.test(window.navigator.userAgent)) {
106 95 console.log("微信客户端");
107   - return '微信'
  96 + return "微信";
108 97 } else if (/AlipayClient/.test(window.navigator.userAgent)) {
109 98 console.log("支付宝客户端");
110   - return '支付宝'
  99 + return "支付宝";
111 100 } else if (/BankabciPhone/.test(window.navigator.userAgent)) {
112 101 console.log("农行客户端");
113   - return '立即'
114   - }else if (/BankabcAndroid/.test(window.navigator.userAgent)) {
  102 + return "立即";
  103 + } else if (/BankabcAndroid/.test(window.navigator.userAgent)) {
115 104 console.log("农行客户端");
116   - return '立即'
117   - }else {
  105 + return "立即";
  106 + } else {
118 107 console.log("其他浏览器");
119   - return '支付宝'
  108 + return "支付宝";
120 109 }
121 110 },
122   -
123 111 // 1:支付宝 2:微信 3:银联 10:H5 4微信公众号 34 农行
124   - clientBrowsePayType: function () { // 判断客户端
  112 + clientBrowsePayType: function() { // 判断客户端
125 113 if (/MicroMessenger/.test(window.navigator.userAgent)) {
126 114 console.log("微信客户端");
127   - return '4'
  115 + return "4";
128 116 } else if (/AlipayClient/.test(window.navigator.userAgent)) {
129 117 console.log("支付宝客户端");
130   - return '1'
  118 + return "1";
131 119 } else if (/BankabciPhone/.test(window.navigator.userAgent)) {
132 120 console.log("农行客户端");
133   - return '34'
134   - }else if (/BankabcAndroid/.test(window.navigator.userAgent)) {
  121 + return "34";
  122 + } else if (/BankabcAndroid/.test(window.navigator.userAgent)) {
135 123 console.log("农行客户端");
136   - return '34'
137   - }else {
  124 + return "34";
  125 + } else {
138 126 console.log("其他浏览器");
139   - return '1'
  127 + return "1";
140 128 }
141 129 },
142   - // 0eca8f5373ca4866aec2f8e9d9367104 老的id
143   - // 14318527b13840c2a4af63fef52c2d6e 老的签名
144   -
145   - // ud8yq5tv0inxupc05xfeau39jywlqoj2 新的id
146   - // ny1u72b6k374sg379z0kqjgfxe2ycnpw 新的签名
147   -
148   - myVarAppid:'ud8yq5tv0inxupc05xfeau39jywlqoj2',// 公共请求Appid
149   -
150   - myDeviceInfo: 'BC0703A4-AFB0-4B51-9089-9B7487C0CC6E', // 公共请求设备信息
151   -
152   - myVxAppId: 'wx1489e48e6a547023',
153   - // 测试环境 微信赤峰 appid wxff4cebaedbf4f886
154   - // 微信赤峰 appid wx2af2bab90d433c86
155   - // 黄石 appid wxa1a66cc7d263afe6
156   -
157   - myOrgId: '10120', // 归属地 赤峰id 10003 黄石 10079
158   -
159   - myGetSign: function (objb) { // 获取签名
160   - var compare = function (obj1, obj2) {
  130 + myVarAppid: "ud8yq5tv0inxupc05xfeau39jywlqoj2",// 公共请求Appid
  131 + myDeviceInfo: "BC0703A4-AFB0-4B51-9089-9B7487C0CC6E", // 公共请求设备信息
  132 + myVxAppId: "wx1489e48e6a547023",
  133 + openId: "oWw3o5rY_bFsiT_nFd2CEQWGZfhs",
  134 + myOrgId: "10120", // 归属地 赤峰id 10003 黄石 10079
  135 + myGetSign: function(objb) { // 获取签名
  136 + var compare = function(obj1, obj2) {
161 137 var val1 = obj1.keyname;
162 138 var val2 = obj2.keyname;
163 139 if (val1 < val2) {
... ... @@ -167,19 +143,18 @@ export default {
167 143 } else {
168 144 return 0;
169 145 }
170   - }
  146 + };
171 147 objb.sort(compare);
172   - var strmd5 = 'ny1u72b6k374sg379z0kqjgfxe2ycnpw';
173   - for(var i=0;i<objb.length;i++){
174   - if(objb[i].value != null&&objb[i].value != ''){
175   - strmd5 += objb[i].keyname+objb[i].value;
  148 + var strmd5 = "ny1u72b6k374sg379z0kqjgfxe2ycnpw";
  149 + for (var i = 0; i < objb.length; i++) {
  150 + if (objb[i].value != null && objb[i].value != "") {
  151 + strmd5 += objb[i].keyname + objb[i].value;
176 152 }
177 153 }
178   - strmd5 += 'ny1u72b6k374sg379z0kqjgfxe2ycnpw';
  154 + strmd5 += "ny1u72b6k374sg379z0kqjgfxe2ycnpw";
179 155 // console.log('strmd5-------->'+strmd5);
180 156 strmd5 = md5(strmd5);
181   - strmd5=strmd5.toUpperCase();
  157 + strmd5 = strmd5.toUpperCase();
182 158 return strmd5;
183   - },
184   -
185   -}
  159 + }
  160 +};
... ...
src/views/binding/binDing.vue
... ... @@ -8,7 +8,7 @@
8 8 </mt-field>
9 9  
10 10 <div style="margin-top: 34px" class="leftRightPadding">
11   - <mt-button type="danger" size="large">绑定</mt-button>
  11 + <van-button type="info" block>绑定</van-button>
12 12 </div>
13 13 </div>
14 14 </template>
... ...
src/views/cards/buyCardDetail.vue 0 → 100644
  1 +<template>
  2 + <section class="">
  3 + <div class="vipCardBg">
  4 + <ul class="cardTypeList">
  5 + <li>年卡</li>
  6 + <li>月卡</li>
  7 + <li>半年卡</li>
  8 + </ul>
  9 +
  10 + <div class="van-ellipsis" style="padding: 20px 0 10px 20px">万达停车场plName</div>
  11 + <div class="van-ellipsis" style="padding: 0 0 0 20px">万达停车场plAddress</div>
  12 + </div>
  13 +
  14 +
  15 +
  16 + <van-cell-group inset style="margin-bottom: 10px;" @click="LinkBuyCard">
  17 + <van-cell >
  18 + <template #title>
  19 + <span style="font-size: 20px;font-weight: 600;">年卡</span>
  20 + </template>
  21 + </van-cell>
  22 + <van-cell title="万达月卡cardName" center value="立即购买" label="单价:¥1800.00" is-link>
  23 + </van-cell>
  24 + </van-cell-group>
  25 +
  26 + <van-cell-group inset style="margin-bottom: 10px;">
  27 + <van-cell >
  28 + <template #title>
  29 + <span style="font-size: 20px;font-weight: 600;">年卡</span>
  30 + </template>
  31 + </van-cell>
  32 + <van-cell title="万达月卡cardName" center value="立即购买" label="单价:¥1800.00" is-link>
  33 + </van-cell>
  34 + </van-cell-group>
  35 + </section>
  36 +
  37 +</template>
  38 +
  39 +<script>
  40 +export default {
  41 + name: "buyCardDetail",
  42 +
  43 + methods:{
  44 + LinkBuyCard(){
  45 + this.$router.push({
  46 + name: "buyVipCard"
  47 + }
  48 + );
  49 + }
  50 + }
  51 +};
  52 +</script>
  53 +
  54 +<style scoped lang="less">
  55 + .vipCardBg {
  56 + margin-top: 14px;
  57 + margin-left: 10px;
  58 + margin-right: 10px;
  59 + margin-bottom: 10px;
  60 + /* width: 100%; */
  61 + height: 150px;
  62 + background-image: url('../../assets/images/cards/vipcardbg.png');
  63 + background-repeat: no-repeat;
  64 + /* background-position: center center; */
  65 + background-size: 100% 100%;
  66 + -moz-background-size: 100% 100%;
  67 + font-size: 16px;
  68 + color: #fff;
  69 + }
  70 +
  71 + .cardTypeList {
  72 + padding: 20px 0 10px 20px;
  73 + overflow: hidden;
  74 + > li {
  75 + float: left;
  76 + margin-right: 10px;
  77 + padding: 2px 20px;
  78 + border-radius: 10px;
  79 + background: rgba(255, 255, 255, .3);
  80 + }
  81 + }
  82 +</style>
... ...
src/views/cards/buyVipCard.vue 0 → 100644
  1 +<template>
  2 + <section style="width: 100%;height: 100%;background: #fff">
  3 + <van-cell-group style="border-bottom: 10px solid #fafafa">
  4 + <van-cell title="车牌号" is-link>
  5 + <template>
  6 + <p @click="show = true" style="color: #1989fa">{{carNum}}</p>
  7 + <van-action-sheet v-model="show" :actions="actions" @select="onSelect"/>
  8 + </template>
  9 + </van-cell>
  10 + <van-cell title="适用停车场" value="万达停车场"/>
  11 + <van-cell title="卡类别" value="小型车月卡"/>
  12 + <van-cell title="卡名称" value="万达月卡"/>
  13 + <van-cell title="生效时间" is-link>
  14 + <template>
  15 + <p @click="showDate = true" style="color: #1989fa"> {{valueStart}}</p>
  16 + </template>
  17 + </van-cell>
  18 + <van-cell title="失效时间" value="2023-10-20"/>
  19 +
  20 + <van-cell title="购买数量">
  21 + <template>
  22 + <van-stepper v-model.number="cardNum" theme="round" button-size="22" disable-input/>
  23 + </template>
  24 + </van-cell>
  25 + </van-cell-group>
  26 +
  27 +
  28 + <van-popup v-model="showDate" position="bottom" :style="{ height: '30%' }">
  29 + <van-datetime-picker
  30 + v-show="showDate"
  31 + v-model="currentDate"
  32 + type="date"
  33 + title="选择生效日期"
  34 + :min-date="minDate"
  35 + :max-date="maxDate"
  36 + @confirm="confirmDate"
  37 + @cancel="cancelDate"
  38 + />
  39 + </van-popup>
  40 +
  41 +
  42 + <van-cell-group style="border-bottom: 10px solid #fafafa">
  43 + <van-cell title="单价">
  44 + <template>
  45 + <p style="font-size: 16px;font-weight: 600;color: #000;">3420.00元</p>
  46 + </template>
  47 + </van-cell>
  48 +
  49 +
  50 + <van-cell title="单价">
  51 + <template>
  52 + <p style="font-size: 16px;font-weight: 600;color: #f00;">20.00元</p>
  53 + </template>
  54 + </van-cell>
  55 +
  56 +
  57 + <van-cell title="支付金额">
  58 + <template>
  59 + <p style="font-size: 16px;font-weight: 600;color: #000;">3420.00元</p>
  60 + </template>
  61 + </van-cell>
  62 +
  63 + </van-cell-group>
  64 +
  65 +
  66 + <div class="leftRightPadding" style="margin-top: 34px">
  67 + <!--<mt-button type="danger" size="large"></mt-button>-->
  68 + <van-button type="info" block>购买</van-button>
  69 + </div>
  70 +
  71 + </section>
  72 +</template>
  73 +
  74 +<script>
  75 +import { Toast } from "vant";
  76 +export default {
  77 + name: "buyVipCard",
  78 + data() {
  79 + return {
  80 + carNum: "京A1231",
  81 + show: false,
  82 + actions: [{ name: "选项一" }, { name: "选项二" }, { name: "选项三" }],
  83 + minDate: new Date(2020, 1, 1),
  84 + maxDate: new Date(2025, 10, 11),
  85 + currentDate: new Date(2023, 10, 11),
  86 + valueStart: "2023-10-01",
  87 + showDate: false,
  88 + cardNum: 1
  89 + };
  90 + },
  91 + methods: {
  92 + onSelect(item) {
  93 + // 默认情况下点击选项时不会自动收起
  94 + // 可以通过 close-on-click-action 属性开启自动收起
  95 + this.show = false;
  96 + this.carNum = item.name;
  97 + Toast(item.name);
  98 + },
  99 + confirmDate(val) {
  100 + console.log(val);
  101 + this.valueStart = val;
  102 + this.showDate = false;
  103 + },
  104 + cancelDate() {
  105 + this.showDate = false;
  106 + }
  107 + }
  108 +};
  109 +</script>
  110 +
  111 +<style scoped>
  112 + .order-line-bold {
  113 + background: #fafafa;
  114 + height: 12px;
  115 + margin-top: 12px;
  116 + padding: 0px;
  117 + overflow: hidden;
  118 + }
  119 +</style>
... ...
src/views/cards/cardList.vue 0 → 100644
  1 +<template>
  2 +
  3 + <section style="padding: 0 10px">
  4 +
  5 + <van-row>
  6 + <van-col span="18">
  7 + <van-search
  8 + v-model="value"
  9 + placeholder="请输入搜索关键词"
  10 + @search="onSearch"
  11 + />
  12 + </van-col>
  13 + <van-col span="6" style="margin-top: 5px;">
  14 + <van-button type="info" round block>续费</van-button>
  15 + </van-col>
  16 + </van-row>
  17 +
  18 + <ul>
  19 + <li class="cardListWrap" @click="toBuyCardPage">
  20 + <div class="van-ellipsis" style="padding: 20px 0 10px 10px">万达停车场plName</div>
  21 + <div class="van-ellipsis" style="padding: 10px 0 20px 10px">万达停车场plAddress</div>
  22 + </li>
  23 + <li class="cardListWrap">
  24 + <div class="van-ellipsis" style="padding: 20px 0 10px 10px">万达停车场plName</div>
  25 + <div class="van-ellipsis" style="padding: 10px 0 20px 10px">万达停车场plAddress</div>
  26 + </li>
  27 + </ul>
  28 +
  29 +
  30 + <section style="text-align: center;padding-top: 20px">
  31 + <van-image :src="require('../../assets/images/cards/novipcard.png')" />
  32 + <p>为找到会员卡</p>
  33 + </section>
  34 +
  35 +
  36 + </section>
  37 +
  38 +</template>
  39 +
  40 +<script>
  41 +import { Toast } from 'vant';
  42 +export default {
  43 + name: "cardList",
  44 + data() {
  45 + return {
  46 + value: '',
  47 + };
  48 + },
  49 + methods: {
  50 + onSearch(val) {
  51 + Toast(val);
  52 + },
  53 + onCancel() {
  54 + Toast('取消');
  55 + },
  56 + toBuyCardPage(){
  57 + this.$router.push({
  58 + name: "buyCardDetail"
  59 + }
  60 + );
  61 + }
  62 + },
  63 +};
  64 +</script>
  65 +
  66 +<style scoped>
  67 + .cardListWrap{
  68 + margin-top: 15px;
  69 + margin-left: 0px;
  70 + margin-right: 0px;
  71 + width: 100%;
  72 + height: 106px;
  73 + background: url("../../assets/images/cards/vipcardbg1.png") no-repeat;
  74 + background-size: 100% 100%;
  75 + font-size: 16px;
  76 + }
  77 +
  78 +</style>
... ...
src/views/mySelf/feedback/suggestionBack.vue
... ... @@ -5,44 +5,80 @@
5 5 <li
6 6 @click="chooseHandle(index)"
7 7 v-for="(i, index) in suggestionList"
8   - :key="i.id"
  8 + :key="i.code"
9 9 :class="{choosedActive: currentIndex==index}"
10 10 >
11   - {{i.text}}
  11 + {{i.name}}
12 12 </li>
13 13 </ul>
14 14  
15   - <div class="clear"></div>
16 15  
17   - <mt-field label="" placeholder="请详细描述反馈问题,或提出改进建议。(300字以内)" type="textarea" rows="4" v-model="introduction" :attr="{ maxlength: 2 }"></mt-field>
  16 +
  17 + <!--<mt-field label="" placeholder="请详细描述反馈问题,或提出改进建议。(300字以内)" type="textarea" rows="4" v-model="introduction" ></mt-field>-->
  18 +
  19 + <van-field
  20 + v-model="introduction"
  21 + rows="2"
  22 + autosize
  23 + type="textarea"
  24 + maxlength="300"
  25 + placeholder="请详细描述反馈问题,或提出改进建议。(300字以内)"
  26 + show-word-limit
  27 + />
18 28  
19 29 <div style="margin-top: 34px">
20   - <mt-button type="danger" size="large">提交</mt-button>
  30 + <van-button type="info" block @click="submitCon">提交</van-button>
21 31 </div>
22 32 </div>
23 33 </template>
24 34  
25 35 <script>
  36 +
  37 +import { saveFeedbackAndSuggest, getFeedbackType } from '@/api/getUserIfo'
26 38 export default {
27 39 name: 'suggestionBack',
28 40 data() {
29 41 return {
30   - suggestionList: [
31   - { id: 1, text: 'APP问题' },
32   - { id: 2, text: '支付问题' },
33   - { id: 3, text: '停车场问题' },
34   - { id: 4, text: '服务投诉' },
35   - { id: 5, text: '改进建议' },
36   - { id: 6, text: '其他问题' },
37   - ],
  42 + suggestionList: [],
38 43 currentIndex: 0,
39 44 introduction: '',
40 45 }
41 46 },
  47 + created(){
  48 + this.getFeedbackType()
  49 + },
42 50 methods: {
  51 + getFeedbackType(){
  52 + let jsondata = {}
  53 + jsondata.sign = this.$utils.signObject(jsondata)
  54 + getFeedbackType(jsondata).then(response => {
  55 + console.log(response)
  56 + this.suggestionList = response.data
  57 + })
  58 + },
43 59 chooseHandle: function (i) {
44 60 console.log(i)
45 61 this.currentIndex = i
  62 + },
  63 + submitCon(){
  64 + if(this.introduction){
  65 + let jsondata = {
  66 + feedbackCode:this.suggestionList[this.currentIndex].code,
  67 + suggestDesc:this.introduction,
  68 + // token:'99ecd32eed1b4ebea71bc73b0aabbb99'
  69 + }
  70 + jsondata.sign = this.$utils.signObject(jsondata)
  71 + saveFeedbackAndSuggest(jsondata).then(response => {
  72 + console.log(response)
  73 + if(response.code==0){
  74 + this.$toast("提交成功");
  75 + }
  76 + // this.phoneNum = response.data.phoneNum
  77 + })
  78 +
  79 + }else{
  80 + this.$toast("请填写建议反馈内容");
  81 + }
46 82 }
47 83 }
48 84 }
... ... @@ -55,24 +91,27 @@ export default {
55 91 }
56 92  
57 93 .suggestionList {
  94 + overflow: hidden;
58 95  
59 96 li {
60 97 float: left;
61 98 width: calc((100% - 19px) / 2);
62   - height: 33px;
63   - line-height: 33px;
  99 + height: 45px;
  100 + line-height: 45px;
64 101 margin-bottom: 16px;
65   - border: 1px solid #B18181;
  102 + border: 1px solid #2282C5;
66 103 text-align: center;
67   - font-size: 13px;
  104 + font-size: 16px;
  105 + border-radius: 4px;
  106 + color: #2282C5;
68 107 &:nth-child(odd) {
69 108 margin-right: 19px;
70 109 }
71 110 }
72 111 .choosedActive {
73   - background: #F75959;
74   - border: 1px solid #A51E1E;
  112 + background: linear-gradient(180deg, #2282C5 0%, #4B8EF1 58%, #63BEFD 100%);
75 113 color: #fff;
  114 + border: 0;
76 115 }
77 116  
78 117 }
... ...
src/views/mySelf/myCars/addCarNum.vue 0 → 100644
  1 +<template>
  2 + <div style="padding: 20px 15px;">
  3 + <h3>请输入车牌号码</h3>
  4 + <div class="demo-two-box">
  5 + <vnp-input v-model="value"></vnp-input>
  6 + </div>
  7 +
  8 + <van-button type="info" round block style="margin-top: 40px;" @click="toMyCarsPage">立即添加</van-button>
  9 + </div>
  10 +</template>
  11 +
  12 +<script>
  13 +import VnpInput from "@/components/vant-number-plate/vnp-input";
  14 +export default {
  15 + name: "addCarNum",
  16 + components: {
  17 + "vnp-input": VnpInput
  18 + },
  19 + data() {
  20 + return {
  21 + show: false,
  22 + value: "冀"
  23 + };
  24 + },
  25 + methods: {
  26 + toMyCarsPage() {
  27 + console.log(this.value)
  28 + console.log(this.value.length)
  29 + this.$router.push({
  30 + name: "myCars"
  31 + }
  32 + );
  33 + }
  34 + }
  35 +};
  36 +</script>
  37 +
  38 +<style lang="less" scoped>
  39 + h3 {
  40 + text-align: center;
  41 + padding-bottom: 20px;
  42 + }
  43 +</style>
... ...
src/views/mySelf/myCars/myCars.vue 0 → 100644
  1 +<template>
  2 + <section style="padding: 20px 15px;">
  3 + <p style="color: #343434;font-size: 30px;font-weight: 600;padding-bottom: 15px;">我的车辆</p>
  4 + <div>
  5 + <van-row>
  6 + <van-col span="3" style="text-align: center">
  7 + <van-image style="margin-top: 18px;" :src="require('../../../assets/images/myCars/carNumBg.png')"/>
  8 + </van-col>
  9 + <van-col span="14" style="font-size: 16px;">
  10 + 京A1231231
  11 + </van-col>
  12 + <van-col span="5">
  13 + <!--<p style="color: #FF555D">立即认证</p>-->
  14 + <p style="color: #1aad19">通过认证</p>
  15 + </van-col>
  16 + <van-col span="2">
  17 + <p>
  18 + <van-icon name="cross" color="#D1D1D6"/>
  19 + </p>
  20 + </van-col>
  21 + </van-row>
  22 +
  23 + <van-row>
  24 + <van-col span="3" style="text-align: center">
  25 + <van-image style="margin-top: 18px;" :src="require('../../../assets/images/myCars/carNumBg.png')"/>
  26 + </van-col>
  27 + <van-col span="14" style="font-size: 16px;">
  28 + 京A1231231
  29 + </van-col>
  30 + <van-col span="5">
  31 + <p style="color: #FF555D" @click="toRzcarNumber">立即认证</p>
  32 + </van-col>
  33 + <van-col span="2">
  34 + <p>
  35 + <van-icon name="cross" color="#D1D1D6"/>
  36 + </p>
  37 + </van-col>
  38 + </van-row>
  39 +
  40 + <van-row>
  41 + <van-col span="3" style="text-align: center">
  42 + <van-image style="margin-top: 18px;" :src="require('../../../assets/images/myCars/carNumBg.png')"/>
  43 + </van-col>
  44 + <van-col span="14" style="font-size: 16px;">
  45 + 京A1231231
  46 + </van-col>
  47 + <van-col span="5">
  48 + <p style="color: #2282C5">审核中</p>
  49 + </van-col>
  50 + <van-col span="2">
  51 + <p>
  52 + <van-icon name="cross" color="#D1D1D6"/>
  53 + </p>
  54 + </van-col>
  55 + </van-row>
  56 +
  57 + <section class="addBtnBg" @click="toAddCarPage">
  58 + <van-image style="margin-top: 10px" :src="require('../../../assets/images/myCars/addBtn.png')"/>
  59 + 添加车辆
  60 + </section>
  61 +
  62 +
  63 + <section style="margin-top: 20px;">
  64 + 宣化停车友情提示:
  65 + </section>
  66 +
  67 + <section>
  68 + 1、每个车牌同一时间只能被一个用户绑定,如需被其他账户绑定,需先解绑;
  69 + </section>
  70 +
  71 + <section>
  72 + 2、车牌号非本人绑定时,可以拔打客服电话反馈进行解绑;
  73 + </section>
  74 +
  75 + <section>
  76 + 3、车牌绑定后可以提交行驶证进行真实性验证,48小时内反馈审核结果;如自行解绑车牌后,再次重新绑定需重新审核认证;
  77 + </section>
  78 +
  79 + <section>
  80 + 4、未认证的车牌只支持支付当前停车费和历史欠费记录;
  81 + </section>
  82 +
  83 + <section>
  84 + 5、认证的车牌支持查看历史停车记录;
  85 + </section>
  86 +
  87 + <section>
  88 + 6、一个账号最多允许绑定三个车牌号,该账号可为三辆车购买会员卡(购买会员卡仅限一车牌绑定使用)。
  89 + </section>
  90 +
  91 +
  92 + </div>
  93 +
  94 + </section>
  95 +
  96 +</template>
  97 +
  98 +<script>
  99 +export default {
  100 + name: "myCars",
  101 + methods: {
  102 + toAddCarPage() {
  103 + this.$router.push({
  104 + name: "addCarNum"
  105 + }
  106 + );
  107 + },
  108 + toRzcarNumber(){
  109 + this.$router.push({
  110 + name: "rzCarNumber"
  111 + }
  112 + );
  113 + }
  114 + }
  115 +};
  116 +</script>
  117 +
  118 +<style scoped>
  119 + .van-row {
  120 + margin-bottom: 20px;
  121 + height: 60px;
  122 + line-height: 60px;
  123 + background: #FFFFFF;
  124 + box-shadow: 0px 2px 6px 0px rgba(114, 124, 143, 0.2);
  125 + border-radius: 8px;
  126 + }
  127 +
  128 + .addBtnBg {
  129 + margin-top: 40px;
  130 + height: 45px;
  131 + line-height: 45px;
  132 + background: url("../../../assets/images/myCars/addBtnBg.png") no-repeat;
  133 + background-size: 100% 100%;
  134 + color: #2282C5;
  135 + font-size: 14px;
  136 + font-weight: 600;
  137 + text-align: center;
  138 + }
  139 +</style>
... ...
src/views/mySelf/myCars/rzCarNumber.vue 0 → 100644
  1 +<template>
  2 + <div style="background: #fff;width: 100%;height: 100%">
  3 + <h3 style="padding: 10px 10px;border-bottom: 5px solid #f5f5f5">
  4 + 车牌号码:
  5 + <b style="color:#2282C5">京A12321</b>
  6 + </h3>
  7 +
  8 + <div style="padding: 10px 10px">
  9 +
  10 + <van-uploader style="width: 100%" :after-read="afterRead" v-model="fileList" :max-count="1" preview-size="200">
  11 +
  12 + <!--&lt;!&ndash;<div class="uploadBg"></div>&ndash;&gt;-->
  13 + <!--<van-image style="width: 100%;height: 200px;"-->
  14 + <!--:src="require('../../../assets/images/myCars/fornt.png')" />-->
  15 + </van-uploader>
  16 +
  17 + <!--<div class="uploadBg">-->
  18 + <!---->
  19 + <!--</div>-->
  20 +
  21 +
  22 + <h4>
  23 + 照片须符合如下条件:
  24 + </h4>
  25 + <h6>
  26 + 1、行驶证正面
  27 + </h6>
  28 + <h6>
  29 + 2、信息清晰显示真实有效
  30 + </h6>
  31 +
  32 + <van-button type="info" round block style="margin-top: 40px;" @click="toMyCarsPage">立即验证</van-button>
  33 +
  34 +
  35 +
  36 + </div>
  37 +
  38 +
  39 +
  40 +
  41 + </div>
  42 +
  43 +</template>
  44 +
  45 +<script>
  46 +export default {
  47 + name: "rzCarNumber",
  48 + data() {
  49 + return {
  50 + fileList: [],
  51 + };
  52 + },
  53 + methods:{
  54 + afterRead(file) {
  55 + // 此时可以自行将文件上传至服务器
  56 + console.log(file);
  57 + },
  58 + toMyCarsPage() {
  59 + console.log(this.fileList)
  60 + console.log(this.fileList.length)
  61 + this.$router.push({
  62 + name: "myCars"
  63 + }
  64 + );
  65 + }
  66 + }
  67 +};
  68 +</script>
  69 +
  70 +<style scoped>
  71 +.uploadBg{
  72 + width: 100%;
  73 + height: 200px;
  74 + background:#eee url("../../../assets/images/myCars/fornt.png") no-repeat;
  75 + background-size: 100% 100%;
  76 +
  77 +}
  78 +</style>
... ...
src/views/mySelf/selfNav.vue
... ... @@ -4,32 +4,112 @@
4 4 <div class="person-ifo">
5 5 <div class="person-pic"></div>
6 6 <ul class="person-con">
7   - <li>15911111111</li>
8   - <li>账户余额: <span>¥100.00</span></li>
9   - <li>我的卡券:<span>20张</span></li>
  7 + <li></li>
  8 + <li style="padding-top: 20px;font-size: 20px;">{{phoneNum}}</li>
  9 + <!--<li>账户余额: <span>¥100.00</span></li>-->
  10 + <!--<li>我的卡券:<span>20张</span></li>-->
10 11 </ul>
11 12 </div>
12 13 </div>
13 14  
14   - <mt-cell title="会员卡" is-link :to="{ name: 'Toast' }"></mt-cell>
  15 + <!--<mt-cell title="会员卡" is-link :to="{ name: 'cardList' }"></mt-cell>-->
15 16  
16   - <mt-cell title="车辆管理" is-link :to="{ name: 'Toast' }"></mt-cell>
  17 + <!--<mt-cell title="车辆管理" is-link :to="{ name: 'myCars' }"></mt-cell>-->
17 18  
18   - <mt-cell title="停车记录" is-link :to="{ name: 'parkNotes' }"></mt-cell>
  19 + <!--<mt-cell title="车辆管理" is-link :to="{ name: 'parkNotes' }"></mt-cell>-->
19 20  
20   - <mt-cell title="建议反馈" is-link :to="{ name: 'suggestionBack' }"></mt-cell>
  21 + <!--<mt-cell title="建议反馈" is-link :to="{ name: 'suggestionBack' }"></mt-cell>-->
21 22  
22   - <div class="leftRightPadding" style="margin-top: 34px">
23   - <mt-button type="danger" size="large">退出账户</mt-button>
  23 + <van-cell-group>
  24 + <van-cell v-for="i in navList" :key="i.title" :title="i.title" size="large" is-link @click="toNextPage(i.path)"/>
  25 + </van-cell-group>
  26 +
  27 +
  28 + <div class="leftRightPadding" style="margin-top: 34px" v-if="openId">
  29 + <!--<mt-button type="danger" size="large"></mt-button>-->
  30 + <van-button type="info" block>退出账户</van-button>
  31 + </div>
  32 + <div class="leftRightPadding" style="margin-top: 34px" v-else>
  33 + <van-button type="info" block @click="toBindingPage">登录绑定</van-button>
24 34 </div>
25 35  
26 36 </div>
27 37 </template>
28 38  
29 39 <script>
  40 +
  41 +import { getTokenByOpenId } from '@/api/getUserIfo'
30 42 export default {
31   - name: 'selfNav'
32   -}
  43 + name: "selfNav",
  44 + data() {
  45 + return {
  46 + navList: [
  47 + {
  48 + title: "会员卡", path: "cardList"
  49 + },
  50 + {
  51 + title: "车辆管理", path: "myCars"
  52 + },
  53 + {
  54 + title: "停车记录", path: "parkNotes"
  55 + },
  56 + {
  57 + title: "建议反馈", path: "suggestionBack"
  58 + }
  59 + ],
  60 + openId: "",
  61 + phoneNum:'',//手机号
  62 + };
  63 + },
  64 + mounted() {
  65 + this.openId = this.$utils.openId;
  66 + if(this.openId){
  67 + this.getTokenAndphoneNum()
  68 + }
  69 + console.log(this.openId);
  70 + },
  71 + created() {
  72 + // this.carNumber = this.$route.query.carNumber // 获取车牌号
  73 + // this.carColor = this.$route.query.carNumberColor // 获取颜色 0:蓝牌;1:黄牌;2:白牌;3:黑牌;4:绿色
  74 + // this.currentTabActive = this.$route.query.parkFlag ? this.$route.query.parkFlag : 0 // 0在停 1历史
  75 + // console.log(this.carNumber)
  76 + // this.parkRecordList(this.carNumber)
  77 + },
  78 + methods: {
  79 + toNextPage(path) {
  80 + if (this.openId) {
  81 + this.$router.push({
  82 + name: path
  83 + }
  84 + );
  85 + } else {
  86 + this.$toast("请先登录");
  87 + this.$router.push({
  88 + name: "binDing"
  89 + }
  90 + );
  91 + }
  92 + },
  93 + toBindingPage() {
  94 + this.$router.push({
  95 + name: "binDing"
  96 + }
  97 + );
  98 + },
  99 + getTokenAndphoneNum(){
  100 + let jsondata = {
  101 + openid: this.$utils.openId,
  102 + }
  103 + jsondata.sign = this.$utils.signObject(jsondata)
  104 + console.log('停车记录传参 ' + JSON.stringify(jsondata));
  105 + getTokenByOpenId(jsondata).then(response => {
  106 + console.log(response)
  107 + this.phoneNum = response.data.phoneNum
  108 + console.log(response.data.token)
  109 + })
  110 + }
  111 + }
  112 +};
33 113 </script>
34 114  
35 115 <style scoped lang="scss">
... ... @@ -44,21 +124,20 @@ export default {
44 124 padding-top: 45px;
45 125 display: flex;
46 126 color: #ffbfbf;
47   - .person-pic{
  127 + .person-pic {
48 128 width: 64px;
49 129 height: 64px;
50 130 margin-right: 15px;
51 131 background: url("../../assets/images/mySelf/photoBG.png") no-repeat;
52 132 }
53 133 }
54   - .person-con{
55   - span{
  134 +
  135 + .person-con {
  136 + span {
56 137 font-size: 16px;
57 138 font-weight: bold;
58 139 }
59 140 }
60 141  
61   - .mint-cell{
62   - border-bottom: 1px solid #EFEDED;
63   - }
  142 +
64 143 </style>
... ...
vue.config.js 0 → 100644
  1 +const path = require('path')
  2 +module.exports = {
  3 + css:{
  4 + loaderOptions:{
  5 + less:{
  6 + modifyVars:{
  7 + //通过本地less文件覆盖变量
  8 + // true; @import "your-less-file-path.less";
  9 + modifyVars: {
  10 + hack: `true; @import "${path.resolve(__dirname, './src/assets/css/resetVantUi.less')}";`
  11 + }
  12 + }
  13 + }
  14 + }
  15 + }
  16 +}
  17 +
  18 +}
... ...