完成首页

This commit is contained in:
TOP糯米 2022-11-02 16:41:23 +08:00
parent 313034a3c5
commit 031056a8a8
56 changed files with 1910 additions and 201 deletions

321
package-lock.json generated
View File

@ -3232,12 +3232,76 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"hash-sum": { "hash-sum": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
"integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
"dev": true "dev": true
}, },
"json5": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz",
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.3.tgz",
"integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ssri": { "ssri": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
@ -3246,6 +3310,28 @@
"requires": { "requires": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
} }
} }
}, },
@ -5275,6 +5361,14 @@
"keygrip": "~1.1.0" "keygrip": "~1.1.0"
} }
}, },
"copy-anything": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
"requires": {
"is-what": "^3.14.1"
}
},
"copy-concurrently": { "copy-concurrently": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
@ -8042,6 +8136,12 @@
"integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
"dev": true "dev": true
}, },
"image-size": {
"version": "0.5.5",
"resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
"optional": true
},
"immediate": { "immediate": {
"version": "3.0.6", "version": "3.0.6",
"resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
@ -8587,6 +8687,11 @@
"call-bind": "^1.0.2" "call-bind": "^1.0.2"
} }
}, },
"is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
},
"is-windows": { "is-windows": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz",
@ -10710,6 +10815,69 @@
"invert-kv": "^3.0.0" "invert-kv": "^3.0.0"
} }
}, },
"less": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
"requires": {
"copy-anything": "^2.0.1",
"errno": "^0.1.1",
"graceful-fs": "^4.1.2",
"image-size": "~0.5.0",
"make-dir": "^2.1.0",
"mime": "^1.4.1",
"needle": "^3.1.0",
"parse-node-version": "^1.0.1",
"source-map": "~0.6.0",
"tslib": "^2.3.0"
},
"dependencies": {
"make-dir": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"optional": true,
"requires": {
"pify": "^4.0.1",
"semver": "^5.6.0"
}
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"optional": true
},
"pify": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"optional": true
}
}
},
"less-loader": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-4.1.0.tgz",
"integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
"requires": {
"clone": "^2.1.1",
"loader-utils": "^1.1.0",
"pify": "^3.0.0"
},
"dependencies": {
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz",
"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="
}
}
},
"leven": { "leven": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz",
@ -11273,6 +11441,12 @@
"thenify-all": "^1.0.0" "thenify-all": "^1.0.0"
} }
}, },
"nan": {
"version": "2.17.0",
"resolved": "https://registry.npmmirror.com/nan/-/nan-2.17.0.tgz",
"integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
"optional": true
},
"nanoid": { "nanoid": {
"version": "3.3.4", "version": "3.3.4",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
@ -11302,6 +11476,37 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true "dev": true
}, },
"needle": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/needle/-/needle-3.1.0.tgz",
"integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==",
"optional": true,
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.6.3",
"sax": "^1.2.4"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"optional": true,
"requires": {
"ms": "^2.1.1"
}
},
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
}
}
},
"negotiator": { "negotiator": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
@ -11797,6 +12002,11 @@
"lines-and-columns": "^1.1.6" "lines-and-columns": "^1.1.6"
} }
}, },
"parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA=="
},
"parse5": { "parse5": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz", "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz",
@ -13400,8 +13610,7 @@
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
"dev": true
}, },
"saxes": { "saxes": {
"version": "3.1.11", "version": "3.1.11",
@ -14780,8 +14989,7 @@
"tslib": { "tslib": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
"dev": true
}, },
"tsscmp": { "tsscmp": {
"version": "1.0.6", "version": "1.0.6",
@ -15220,101 +15428,6 @@
"vue-style-loader": "^4.1.0" "vue-style-loader": "^4.1.0"
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"hash-sum": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
"integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz",
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.3.tgz",
"integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-style-loader": { "vue-style-loader": {
"version": "4.1.3", "version": "4.1.3",
"resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@ -15443,7 +15556,10 @@
"version": "1.2.13", "version": "1.2.13",
"resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"optional": true "optional": true,
"requires": {
"nan": "^2.12.1"
}
}, },
"glob-parent": { "glob-parent": {
"version": "3.1.0", "version": "3.1.0",
@ -15759,7 +15875,10 @@
"resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"dev": true, "dev": true,
"optional": true "optional": true,
"requires": {
"nan": "^2.12.1"
}
}, },
"glob-parent": { "glob-parent": {
"version": "3.1.0", "version": "3.1.0",

View File

@ -70,6 +70,8 @@
"@vue/shared": "^3.0.0", "@vue/shared": "^3.0.0",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"flyio": "^0.6.2", "flyio": "^0.6.2",
"less": "^4.1.3",
"less-loader": "^4.1.0",
"regenerator-runtime": "^0.12.1", "regenerator-runtime": "^0.12.1",
"vue": "^2.6.11", "vue": "^2.6.11",
"vuex": "^3.2.0" "vuex": "^3.2.0"

View File

@ -1,17 +1,45 @@
<script> <script>
export default { export default {
onLaunch: function() { onLaunch: function () {},
console.log('App Launch') onShow: function () {},
}, onHide: function () {},
onShow: function() { };
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script> </script>
<style> <style lang="less">
/*每个页面公共css */ .limit-line {
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
}
.clamp-1 {
-webkit-line-clamp: 1;
}
.clamp-2 {
-webkit-line-clamp: 2;
}
.clamp-3 {
-webkit-line-clamp: 3;
}
.clamp-4 {
-webkit-line-clamp: 4;
}
.clamp-5 {
-webkit-line-clamp: 5;
}
/* #ifdef H5 */
// tabBar
.uni-tabbar {
.uni-tabbar__bd {
height: @tabBarHeight !important;
.uni-tabbar__icon {
width: @tabBarIconWidth !important;
height: @tabBarIconHeight !important;
}
.uni-tabbar__label {
font-size: @tabBarFontSize !important;
}
}
}
/* #endif */
</style> </style>

View File

@ -1,5 +0,0 @@
const config = {
name: "熊熊安装",
}
export default config

View File

@ -1,10 +0,0 @@
const utils = {
demo() {
uni.showToast({
title: '测试tips',
icon: 'none'
})
}
}
export default utils

View File

@ -0,0 +1,105 @@
<template>
<view class="swiper-container">
<swiper
class="swiper"
circular
:indicator-dots="false"
:autoplay="autoplay"
:interval="interval"
:duration="duration"
@change="onChange"
>
<swiper-item v-for="(item, index) in list" :key="index">
<view class="swiper-item" @click="clickItem(item)">
<image class="banner-image" :src="item.image" mode="scaleToFill" />
</view>
</swiper-item>
</swiper>
<view class="swiper-dots" v-if="indicatorDots">
<view
class="swiper-dot-item"
v-for="(value, key) in list.length"
:key="key"
:class="{'active': key === currentIndex}"
></view>
</view>
</view>
</template>
<script>
export default {
name: "app-slide",
data() {
return {
currentIndex: 0,
};
},
props: {
indicatorDots: {
type: Boolean,
default: true,
},
autoplay: {
type: Boolean,
default: true,
},
interval: {
type: Number,
default: 5000,
},
duration: {
type: Number,
default: 1000,
},
list: {
type: Array,
default: [],
},
},
components: {},
created() {},
mounted() {},
methods: {
onChange(e) {
this.currentIndex = e.detail.current;
},
clickItem(item) {
this.$emit("onClickItem", item);
},
},
};
</script>
<style lang="less" scoped>
.swiper-container {
position: relative;
}
.swiper-container,
.swiper,
.swiper-item {
width: 100%;
height: 100%;
}
.swiper-dots {
position: absolute;
left: 0;
right: 0;
bottom: 10rpx;
text-align: center;
.swiper-dot-item {
display: inline-block;
margin: 0 6rpx;
width: 8rpx;
height: 8rpx;
border-radius: 50%;
background: #cacaca;
}
.swiper-dot-item.active {
background: #f9b05f;
}
}
.banner-image {
width: 100%;
height: 100%;
}
</style>

View File

@ -0,0 +1,172 @@
<template>
<view class="page-layout">
<view
class="page-header"
:class="[textColor]"
:style="{height: header.height + 'rpx', paddingTop: header.pt + 'rpx', backgroundColor: backgroundColor}"
>
<!-- 首页选择地址 -->
<block v-if="btnType === 'city'">
<view class="page-index-btn change-city" :style="{height: header.height + 'rpx'}" @click="changeCity">
<text class="iconfont icon-31dingwei"></text>
<text class="city">成都市</text>
</view>
</block>
<!-- 正常返回按钮 -->
<block v-if="btnType === 'back'">
<view class="page-index-btn back" :style="{height: header.height + 'rpx'}" @click="onClick">
<text class="iconfont icon-fanhui"></text>
</view>
</block>
<view class="page-title" :style="{lineHeight: header.height + 'rpx'}">
<text class="title-text">{{title}}</text>
</view>
</view>
<view class="page-body" :style="{paddingTop: header.bodyPt + 'rpx'}">
<slot></slot>
</view>
<view class="page-footer"></view>
</view>
</template>
<script>
export default {
name: "app-layout",
data() {
return {
header: {
height: 0,
pt: 0,
bodyPt: 0,
},
};
},
components: {},
props: {
customBtn: {
type: Boolean,
default: false,
},
btnType: {
type: String,
default: "back",
},
title: {
type: String,
default: "",
},
textColor: {
type: String,
default: "dark",
},
backgroundColor: {
type: String,
default: "unset",
},
},
mounted() {
// #ifndef H5
const { statusBarHeight } = uni.getSystemInfoSync();
const { height } = uni.getMenuButtonBoundingClientRect();
this.header.pt = statusBarHeight;
this.header.height = height;
// #endif
// #ifdef H5
this.header.pt = 0;
this.header.height = 40;
// #endif
this.header.bodyPt = this.header.pt + this.header.height;
// pxrpx
this.header.pt = this.header.pt * 2;
this.header.height = this.header.height * 2;
this.header.bodyPt = this.header.bodyPt * 2;
},
computed: {},
methods: {
onClick() {
if (this.customBtn) {
this.$emit("onClickBtn");
} else {
uni.navigateBack({ delta: 1 });
}
},
changeCity() {
console.log("修改城市");
},
},
};
</script>
<style scoped lang="less">
.page-layout {
max-width: 750px;
width: 750rpx;
margin: 0 auto;
/* #ifdef H5 */
// tabBar
padding-bottom: calc(@tabBarHeight - 50px);
/* #endif */
}
.page-header.dark {
.page-title,
.page-index-btn {
color: #2d2d2d;
}
}
.page-header.light {
.page-title,
.page-index-btn {
color: #ffffff;
}
}
.page-header {
z-index: 20;
position: fixed;
top: 0;
left: 0;
right: 0;
max-width: 750px;
width: 750rpx;
text-align: center;
margin: 0 auto;
.page-title {
width: 100%;
height: auto;
.title-text {
font-size: 30rpx;
font-weight: bold;
}
}
.page-index-btn {
position: absolute;
bottom: 0;
left: 0;
width: 180rpx;
display: flex;
align-items: center;
padding-left: 30rpx;
justify-content: flex-start;
}
.page-index-btn.change-city {
font-size: 24rpx;
.icon-31dingwei {
font-size: 40rpx;
}
.city {
margin-left: 5rpx;
}
}
.page-index-btn.back {
.icon-fanhui {
font-size: 40rpx;
font-weight: bold;
}
}
}
.page-body {
width: 100%;
}
.page-footer {
width: 100%;
}
</style>

View File

@ -0,0 +1,44 @@
<template>
<view class="login-box" v-if="showLoginModal">
<button open-type="getUserInfo" @click="getUserInfo">授权登录</button>
</view>
</template>
<script>
import { mapState } from "vuex";
export default {
name: "app-login",
data() {
return {};
},
props: {},
components: {},
computed: {
...mapState("user", {
showLoginModal: (state) => state.showLoginModal,
}),
},
created() {},
mounted() {},
methods: {
getUserInfo() {
this.$store.dispatch("user/userInfo");
setTimeout(() => {
this.$store.commit("user/showLoginModal", false);
}, 2000);
},
},
};
</script>
<style lang="less" scoped>
.login-box {
z-index: 25;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #e0e0e0;
}
</style>

View File

@ -1,32 +0,0 @@
<template>
<view class="page-layout">
<slot></slot>
</view>
</template>
<script>
export default {
name:"page-layout",
data() {
return {
};
},
props: {
title: {
type: String,
default: ""
}
},
mounted() {},
methods: {
changeTitle() {
}
}
}
</script>
<style scoped lang="less">
</style>

6
src/core/config.js Normal file
View File

@ -0,0 +1,6 @@
const config = {
name: "熊熊安装",
root: "http://127.0.0.1/api.php"
}
export default config

70
src/core/libs/event.js Normal file
View File

@ -0,0 +1,70 @@
function MyPromise(resolve) {
this.resolveFunc = function () {
};
this.rejectFunc = function () {
};
resolve(this.resolve.bind(this), this.reject.bind(this));
}
MyPromise.prototype.resolve = function (val) {
setTimeout(() => {
this.resolveFunc(val);
}, 0);
};
MyPromise.prototype.reject = function (val) {
setTimeout(() => {
this.rejectFunc(val);
}, 0);
};
MyPromise.prototype.then = function (resolve, reject) {
this.resolveFunc = resolve;
this.rejectFunc = reject;
return this;
};
module.exports = {
_resolveStorage: {},
_addResolve(eventName, resolve, removeEventAfterTrigger) {
if (!this._resolveStorage[eventName]) {
this._resolveStorage[eventName] = [];
}
this._resolveStorage[eventName].push({
resolve: resolve,
removeEventAfterTrigger: removeEventAfterTrigger,
});
},
/**
* 定义触发器
* @param eventName
* @param removeEventAfterTrigger
* @returns {Promise<any>}
*/
on(eventName, removeEventAfterTrigger) {
return new MyPromise(fn => {
if (typeof removeEventAfterTrigger === 'undefined') {
removeEventAfterTrigger = true;
}
this._addResolve(eventName, fn, removeEventAfterTrigger);
});
},
/**
* 触发事件
* @param eventName
* @param e 传入数据可选
*/
trigger(eventName, e) {
if (!this._resolveStorage[eventName] || !this._resolveStorage[eventName].length) {
return;
}
let saveEvens = [];
for (let i in this._resolveStorage[eventName]) {
this._resolveStorage[eventName][i].resolve(e);
if (!this._resolveStorage[eventName][i].removeEventAfterTrigger) {
saveEvens.push(this._resolveStorage[eventName][i]);
}
}
this._resolveStorage[eventName] = saveEvens;
},
};

17
src/core/libs/request.js Normal file
View File

@ -0,0 +1,17 @@
const request = async (args) => {
const header = {
'X-Requested-With': 'XMLHttpRequest',
'content-type': 'application/x-www-form-urlencoded',
};
const [error, response] = await uni.request({
url: args.url,
method: args.method || 'get',
data: args.data,
header: header
});
return Promise.resolve(response);
};
export default request

166
src/core/libs/test.js Normal file
View File

@ -0,0 +1,166 @@
function email(value) {
return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value);
}
function mobile(value) {
return /^1[23456789]\d{9}$/.test(value)
}
function url(value) {
return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
.test(value)
}
function date(value) {
return !/Invalid|NaN/.test(new Date(value.replace(/-/g, '/')).toString())
}
function dateISO(value) {
return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
}
function number(value) {
return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)
}
function digits(value) {
return /^\d+$/.test(value)
}
function idCard(value) {
return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value)
}
function carNo(value) {
// 新能源车牌
const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
// 旧车牌
const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
if (value.length === 7) {
return creg.test(value);
} else if (value.length === 8) {
return xreg.test(value);
} else {
return false;
}
}
function amount(value) {
//金额,只允许保留两位小数
return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
}
function chinese(value) {
let reg = /^[\u4e00-\u9fa5]+$/gi;
return reg.test(value);
}
function letter(value) {
return /^[a-zA-Z]*$/.test(value);
}
function enOrNum(value) {
//英文或者数字
let reg = /^[0-9a-zA-Z]*$/g;
return reg.test(value);
}
function contains(value, param) {
return value.indexOf(param) >= 0
}
function range(value, param) {
return value >= param[0] && value <= param[1]
}
function rangeLength(value, param) {
return value.length >= param[0] && value.length <= param[1]
}
function landline(value) {
let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
return reg.test(value);
}
function umobile(value){
let reg = /(^\d+$)|(^$)|(^([0-9]{3,4}-)?\d{7,8}$)|(^400[0-9]{7}$)|(^800[0-9]{7}$)|(^(400)-(\d{3})-(\d{4})(.)(\d{1,4})$)|(^(400)-(\d{3})-(\d{4}$))/;
return reg.test(value);
}
function empty(value) {
switch (typeof value) {
case 'undefined':
return true;
case 'string':
if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
break;
case 'boolean':
if (!value) return true;
break;
case 'number':
if (0 === value || isNaN(value)) return true;
break;
case 'object':
if (null === value || value.length === 0) return true;
for (var i in value) {
return false;
}
return true;
}
return false;
}
function jsonString(value) {
if (typeof value == 'string') {
try {
var obj = JSON.parse(value);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
return false;
}
function array(value) {
if (typeof Array.isArray === "function") {
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === "[object Array]";
}
}
function object(value) {
return Object.prototype.toString.call(value) === '[object Object]';
}
export default {
email,
mobile,
url,
date,
dateISO,
number,
digits,
idCard,
carNo,
amount,
chinese,
letter,
enOrNum,
contains,
range,
rangeLength,
empty,
isEmpty: empty,
jsonString,
landline,
object,
array,
umobile,
}

153
src/core/libs/utils.js Normal file
View File

@ -0,0 +1,153 @@
function time() {
return parseInt(Math.round(new Date() / 1000));
};
function datetime(format, timestamp) {
if (typeof format === 'undefined' || format === null) {
format = 'Y-m-d h:i:s';
}
if (typeof timestamp === 'undefined' || timestamp === null) {
timestamp = this.time();
}
const d = new Date();
d.setTime(timestamp * 1000);
const date = {
"Y": d.getFullYear(),
"m+": (d.getMonth() + 1) < 10 ? `0${d.getMonth() + 1}` : (d.getMonth() + 1),
"d+": d.getDate() < 10 ? `0${d.getDate()}` : d.getDate(),
"h+": d.getHours() < 10 ? `0${d.getHours()}` : d.getHours(),
"i+": d.getMinutes() < 10 ? `0${d.getMinutes()}` : d.getMinutes(),
"s+": d.getSeconds() < 10 ? `0${d.getSeconds()}` : d.getSeconds(),
"q+": Math.floor((d.getMonth() + 3) / 3),
"S+": d.getMilliseconds(),
};
for (let k in date) {
if (new RegExp("(" + k + ")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length === 1 ?
date[k] : ("00" + date[k]).substr(("" + date[k]).length));
}
}
return format;
};
function timeDifference(start_at, end_at) {
let times = parseInt((end_at - start_at) / 1000);
let day = 0,
hour = 0,
minute = 0,
second = 0;
if (times > 0) {
day = Math.floor(times / (60 * 60 * 24));
hour = Math.floor(times / (60 * 60)) - (day * 24);
minute = Math.floor(times / 60) - (day * 24 * 60) - (hour * 60);
second = Math.floor(times) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
} else {
return null;
}
return {
d: day,
h: hour < 10 ? ('0' + hour) : hour,
m: minute < 10 ? ('0' + minute) : minute,
s: second < 10 ? ('0' + second) : second,
};
};
function earthDistance(location1, location2) {
const lat1 = parseFloat(location1.lat);
const lng1 = parseFloat(location1.lng);
const lat2 = parseFloat(location2.lat);
const lng2 = parseFloat(location2.lng);
const EARTH_RADIUS = 6378137.0; //单位M
const PI = Math.PI;
function getRad(d) {
return d * PI / 180.0;
}
let f = getRad((lat1 + lat2) / 2);
let g = getRad((lat1 - lat2) / 2);
let l = getRad((lng1 - lng2) / 2);
let sg = Math.sin(g);
let sl = Math.sin(l);
let sf = Math.sin(f);
let s, c, w, r, d, h1, h2;
let a = EARTH_RADIUS;
let fl = 1 / 298.257;
sg = sg * sg;
sl = sl * sl;
sf = sf * sf;
s = sg * (1 - sl) + (1 - sf) * sl;
c = (1 - sg) * (1 - sl) + sf * sl;
w = Math.atan(Math.sqrt(s / c));
r = Math.sqrt(s * c) / w;
d = 2 * w * a;
h1 = (3 * r - 1) / 2 / c;
h2 = (3 * r + 1) / 2 / s;
return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));
};
function randomString(length) {
const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
};
let timer, flag;
function throttle(func, wait = 500, immediate = true) {
if (immediate) {
if (!flag) {
flag = true;
typeof func === 'function' && func();
timer = setTimeout(() => {
flag = false;
}, wait);
}
} else {
if (!flag) {
flag = true
timer = setTimeout(() => {
flag = false
typeof func === 'function' && func();
}, wait);
}
}
}
let timeout = null;
function debounce(func, wait = 500, immediate = false) {
if (timeout !== null) clearTimeout(timeout);
if (immediate) {
let callNow = !timeout;
timeout = setTimeout(function () {
timeout = null;
}, wait);
if (callNow) typeof func === 'function' && func();
} else {
timeout = setTimeout(function () {
typeof func === 'function' && func();
}, wait);
}
}
export {
time,
datetime,
timeDifference,
earthDistance,
randomString,
throttle,
debounce,
}

62
src/core/user.js Normal file
View File

@ -0,0 +1,62 @@
import Vue from 'vue'
export default {
/**
* 获取平台用户信息
*/
platformInfo() {
return new Promise((resolve, reject) => {
// 获取用户信息
uni.getUserProfile({
provider: 'weixin',
desc: "获取用户信息",
success: function (info) {
console.log(info);
uni.login({
provider: "weixin",
success: (result) => {
resolve({
code: result.code,
userInfo: {
avatarUrl: info.userInfo.avatarUrl,
city: info.userInfo.city,
country: info.userInfo.country,
gender: info.userInfo.gender,
language: info.userInfo.language,
nickName: info.userInfo.nickName,
province: info.userInfo.province
}
// encryptedData: info.encryptedData,
// iv: info.iv,
});
},
fail: e => {
reject(e);
},
});
},
fail: e => {
reject(e);
},
});
});
},
register() {
this.platformInfo().then(platfromUser => {
console.log(platfromUser);
}).catch(e => { });
},
login() {
uni.navigateTo({
url: '/pages/auth/login'
});
},
getInfo() {
return new Promise((resolve, reject) => {
resolve({
id: 123,
name: '李四'
});
});
}
}

View File

@ -2,13 +2,17 @@ import Vue from 'vue'
import App from './App' import App from './App'
import store from "./store/index" import store from "./store/index"
import request from './core/libs/request'
import utils from './common/utils' import event from './core/libs/event'
import config from './common/config' import utils from './core/libs/utils'
import apis from './common/apis' import config from './core/config'
import apis from './core/apis'
import './static/iconfont/iconfont.css'
Vue.use({ Vue.use({
install(Vue, options) { install(Vue, options) {
Vue.prototype.$request = request
Vue.prototype.$event = event
Vue.prototype.$utils = utils Vue.prototype.$utils = utils
Vue.prototype.$config = config Vue.prototype.$config = config
Vue.prototype.$apis = apis Vue.prototype.$apis = apis

View File

@ -54,11 +54,19 @@
}, },
"mp-weixin": { /* */ "mp-weixin": { /* */
"appid": "", "appid": "wx239055764f21ba10",
"setting": { "setting": {
"urlCheck": false "urlCheck": false,
"es6" : true,
"minified" : true,
"postcss" : true
}, },
"usingComponents": true "usingComponents": true,
"permission" : {
"scope.userLocation" : {
"desc" : "请求获取您的位置信息"
}
}
}, },
"mp-alipay" : { "mp-alipay" : {
"usingComponents" : true "usingComponents" : true

View File

@ -3,15 +3,85 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
"navigationBarTitleText": "熊熊安装" "navigationBarTitleText": "熊熊安装队",
"enablePullDownRefresh": true
}
},
{
"path": "pages/auth/auth",
"style": {
"navigationBarTitleText": "登录"
}
},
{
"path": "pages/member/member",
"style": {
"navigationBarTitleText": "我的"
}
},
{
"path": "pages/auth/pageA",
"style": {
"navigationBarTitleText": "我的"
}
},
{
"path": "pages/auth/pageB",
"style": {
"navigationBarTitleText": "我的"
} }
} }
], ],
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"navigationBarTitleText": "熊熊安装", "navigationBarTitleText": "熊熊安装",
"navigationBarBackgroundColor": "#F8F8F8", "navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8", "backgroundColor": "#F8F8F8",
"navigationStyle": "custom" "navigationStyle": "custom"
// #ifdef H5
,
"rpxCalcMaxDeviceWidth": 750,
"rpxCalcBaseDeviceWidth": 750,
"rpxCalcIncludeWidth": 750,
"maxWidth": 750
// #endif
},
"tabBar": {
"color": "#B5B5B5",
"selectedColor": "#7286F1",
"borderStyle": "white",
"backgroundColor": "#ffffff",
"list": [
{
"pagePath": "pages/index/index",
"iconPath": "static/temp/tabbar/1.png",
"selectedIconPath": "static/temp/tabbar/1a.png",
"text": "首页"
},
{
"pagePath": "pages/auth/auth",
"iconPath": "static/temp/tabbar/2.png",
"selectedIconPath": "static/temp/tabbar/2a.png",
"text": "分类"
},
{
"pagePath": "pages/auth/pageA",
"iconPath": "static/temp/tabbar/3.png",
"selectedIconPath": "static/temp/tabbar/3a.png",
"text": "联保"
},
{
"pagePath": "pages/auth/pageB",
"iconPath": "static/temp/tabbar/4.png",
"selectedIconPath": "static/temp/tabbar/4a.png",
"text": "订单"
},
{
"pagePath": "pages/member/member",
"iconPath": "static/temp/tabbar/5.png",
"selectedIconPath": "static/temp/tabbar/5a.png",
"text": "我的"
}
]
} }
} }

25
src/pages/auth/auth.vue Normal file
View File

@ -0,0 +1,25 @@
<template>
<app-layout backgroundColor="#00418c" textColor="light">
<view class="body">登录</view>
</app-layout>
</template>
<script>
import AppLayout from "@/components/app-layout/app-layout";
export default {
name: "auth",
data() {
return {};
},
components: { AppLayout },
onLoad() {},
onShow() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: {},
};
</script>
<style lang="less" scoped>
</style>

20
src/pages/auth/pageA.vue Normal file
View File

@ -0,0 +1,20 @@
<template></template>
<script>
export default {
name: "pageA",
data() {
return {};
},
components: {},
onLoad() {},
onShow() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: {},
};
</script>
<style lang="less" scoped>
</style>

20
src/pages/auth/pageB.vue Normal file
View File

@ -0,0 +1,20 @@
<template></template>
<script>
export default {
name: "pageB",
data() {
return {};
},
components: {},
onLoad() {},
onShow() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: {},
};
</script>
<style lang="less" scoped>
</style>

View File

@ -1,37 +1,366 @@
<template> <template>
<page-layout> <app-layout backgroundColor="#4B65ED" textColor="light" btnType="city" title="熊熊安装队">
<button @click="changeState">登录{{isLogin}}</button> <view class="search">
</page-layout> <view class="input-box">
<view class="icon">
<text class="iconfont icon-sousuo"></text>
</view>
<input
class="input"
type="text"
:model="keywords"
placeholder="搜索您需要的服务"
placeholder-class="placeholder"
/>
</view>
</view>
<view class="banner">
<app-banner :list="bannerList" @onClickItem="clickBanner" />
</view>
<view class="notify">
<view class="icon">
<text class="iconfont icon-gonggao"></text>
</view>
<view class="slide-box">
<swiper
class="notify-swiper"
circular
:indicator-dots="false"
:autoplay="true"
:vertical="true"
interval="3000"
duration="1000"
>
<swiper-item v-for="(item, index) in notifyList" :key="index">
<view class="swiper-item notify-item">
<text class="limit-line clamp-1">{{item.title}}</text>
</view>
</swiper-item>
</swiper>
</view>
</view>
<view class="service-group">
<text class="section-title">建材安装服务</text>
<view class="group g1">
<view class="service-item" v-for="(item, index) in installServiceList" :key="index">
<image class="service-icon" :src="item.icon" mode="scaleToFill" />
<text class="service-name limit-line clamp-1">{{item.title}}</text>
</view>
</view>
</view>
<view class="service-group">
<text class="section-title">维修售后服务</text>
<view class="group g2">
<view class="service-item" v-for="(item, index) in aftermarketServiceList" :key="index">
<image class="service-icon" :src="item.icon" mode="scaleToFill" />
<text class="service-name limit-line clamp-1">{{item.title}}</text>
</view>
</view>
</view>
<view class="service-group">
<text class="section-title">工程企业服务</text>
<view class="group g3">
<view class="service-item" v-for="(item, index) in bussinessServiceList" :key="index">
<image class="service-icon" :src="item.icon" mode="scaleToFill" />
</view>
</view>
</view>
</app-layout>
</template> </template>
<script> <script>
import { mapState, mapGetters, mapActions } from "vuex"; import AppLayout from "@/components/app-layout/app-layout";
import PageLayout from "@/components/page-layout"; import AppBanner from "@/components/app-banner/app-banner";
export default { export default {
name: "index",
data() { data() {
return {}; return {
keywords: "",
bannerList: [
{
id: 1,
image: require("@/static/temp/banner.png"),
title: "",
page: "",
},
],
notifyList: [
{
id: 1,
title: "恭喜成都市王先生订购xxxxxx服务一套",
},
{
id: 2,
title: "恭喜成都市王先生订购xxxxxx服务一套",
},
{
id: 3,
title: "恭喜成都市王先生订购xxxxxx服务一套",
},
{
id: 4,
title: "恭喜成都市王先生订购xxxxxx服务一套",
},
{
id: 5,
title: "恭喜成都市王先生订购xxxxxx服务一套",
},
],
installServiceList: [
{
id: 1,
icon: require("@/static/temp/index/1.png"),
title: "电器安装",
page: "",
},
{
id: 2,
icon: require("@/static/temp/index/2.png"),
title: "卫浴吊顶安装",
page: "",
},
{
id: 3,
icon: require("@/static/temp/index/3.png"),
title: "水电安装",
page: "",
},
{
id: 4,
icon: require("@/static/temp/index/4.png"),
title: "烟道钻孔",
page: "",
},
{
id: 5,
icon: require("@/static/temp/index/5.png"),
title: "家具安装",
page: "",
},
{
id: 6,
icon: require("@/static/temp/index/6.png"),
title: "门窗五金安装",
page: "",
},
{
id: 7,
icon: require("@/static/temp/index/7.png"),
title: "地面墙体安装",
page: "",
},
{
id: 8,
icon: require("@/static/temp/index/8.png"),
title: "其他安装",
page: "",
},
],
aftermarketServiceList: [
{
id: 9,
icon: require("@/static/temp/index/a1.png"),
title: "电器维护",
page: "",
},
{
id: 10,
icon: require("@/static/temp/index/a2.png"),
title: "家电清洗",
page: "",
},
{
id: 11,
icon: require("@/static/temp/index/a3.png"),
title: "保洁家政",
page: "",
},
{
id: 12,
icon: require("@/static/temp/index/a4.png"),
title: "管道疏通",
page: "",
},
{
id: 13,
icon: require("@/static/temp/index/a5.png"),
title: "货物配送",
page: "",
},
],
bussinessServiceList: [
{
id: 14,
icon: require("@/static/temp/index/b1.png"),
title: "管道疏通",
page: "",
},
{
id: 15,
icon: require("@/static/temp/index/b2.png"),
title: "货物配送",
page: "",
},
],
};
}, },
components: { components: {
PageLayout, AppLayout,
}, AppBanner,
computed: {
...mapState({
isLogin: (state) => state.user.isLogin,
}),
}, },
onLoad() {}, onLoad() {},
onShow() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: { methods: {
changeState() { clickBanner(item) {
this.$store.commit("user/setLoginState", true); console.log(item);
uni.showToast({
title:'测试',
icon: 'none'
});
}, },
}, },
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.search {
</style> width: 100%;
height: 100rpx;
background-color: #4b65ed;
display: flex;
align-items: center;
justify-content: center;
.input-box {
width: 670rpx;
height: auto;
background-color: #fff;
border-radius: 10rpx;
display: flex;
justify-content: space-between;
line-height: 65rpx;
.icon,
.input,
.placeholder {
color: #bebebe;
}
.icon {
width: 85rpx;
height: 65rpx;
font-size: 30rpx;
text-align: center;
}
.input {
width: 585rpx;
height: 65rpx;
font-size: 28rpx;
}
}
}
.banner {
width: 100%;
height: 283rpx;
margin: 0 auto;
background-color: #4b65ed;
}
.notify {
width: 670rpx;
height: auto;
display: flex;
margin: 27rpx auto 0 auto;
line-height: 63rpx;
.icon {
width: 80rpx;
text-align: center;
font-size: 40rpx;
color: #f9b060;
}
.slide-box {
width: 590rpx;
.notify-swiper {
display: block;
width: 100%;
height: 100%;
}
.notify-item {
font-size: 24rpx;
color: #6a6a6a;
}
}
}
.service-group {
font-size: 0;
width: 670rpx;
margin: 40rpx auto 0 auto;
padding-bottom: 45rpx;
border-bottom: 4rpx solid #f8f8f8;
.section-title {
font-size: 30rpx;
font-weight: bold;
color: #333333;
display: flex;
align-items: center;
}
.section-title::before {
content: "";
display: inline-block;
width: 6rpx;
height: 30rpx;
background: #f9b162;
margin-right: 12rpx;
}
}
.group {
width: 100%;
.service-item {
display: inline-block;
text-align: center;
.service-name {
font-size: 24rpx;
color: #333333;
margin-top: 15rpx;
}
}
}
.group.g1 {
.service-item {
width: 145rpx;
margin-top: 40rpx;
margin-right: 30rpx;
.service-icon {
width: 100rpx;
height: 100rpx;
}
}
.service-item:nth-child(4n) {
margin-right: 0;
}
}
.group.g2 {
.service-item {
width: 100rpx;
margin-top: 40rpx;
margin-right: 42.5rpx;
.service-icon {
width: 100rpx;
height: 100rpx;
}
}
.service-item:nth-child(5n) {
margin-right: 0;
}
}
.group.g3 {
.service-item {
width: 320rpx;
height: auto;
margin-top: 40rpx;
margin-right: 30rpx;
.service-icon {
width: 320rpx;
height: 170rpx;
}
}
.service-item:nth-child(2n) {
margin-right: 0;
}
}
</style>

View File

@ -0,0 +1,29 @@
<template>
<app-layout backgroundColor="#f00" textColor="light">个人中心</app-layout>
</template>
<script>
import AppLayout from "@/components/app-layout/app-layout";
import { mapState } from "vuex";
export default {
name: "member",
data() {
return {};
},
components: { AppLayout },
computed: {
...mapState("user", {
userInfo: (state) => state.userInfo,
}),
},
onLoad() {},
onShow() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: {},
};
</script>
<style lang="less" scoped>
</style>

View File

@ -0,0 +1,282 @@
@font-face {
font-family: "iconfont"; /* Project id 3642656 */
src: url('@/static/iconfont/iconfont.woff2?t=1666835957947') format('woff2'),
url('@/static/iconfont/iconfont.woff?t=1666835957947') format('woff'),
url('@/static/iconfont/iconfont.ttf?t=1666835957947') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-guanbi:before {
content: "\e64d";
}
.icon-qingchu:before {
content: "\e633";
}
.icon-shezhi:before {
content: "\e6a9";
}
.icon-shuaxin:before {
content: "\e80b";
}
.icon-xiaoxizhongxin:before {
content: "\e8be";
}
.icon-dingdan:before {
content: "\e737";
}
.icon-guizeshezhi:before {
content: "\e6dc";
}
.icon-kefu1:before {
content: "\e644";
}
.icon-gonggao:before {
content: "\e647";
}
.icon-shenfenzhengzhengmian:before {
content: "\e68d";
}
.icon-shenfenzhengfanmian:before {
content: "\e68e";
}
.icon-icon-truck:before {
content: "\e60b";
}
.icon-cailiaogongcheng:before {
content: "\e61c";
}
.icon-kefufill:before {
content: "\e740";
}
.icon-shezhixitongshezhigongnengshezhishuxing:before {
content: "\e795";
}
.icon-tousu:before {
content: "\e632";
}
.icon-morentouxiang:before {
content: "\e630";
}
.icon-fl-ju:before {
content: "\e61f";
}
.icon-star:before {
content: "\e9a1";
}
.icon-jingdiananli_wujiaoxing_shoucanghou:before {
content: "\e64a";
}
.icon-fenxiang:before {
content: "\e8b0";
}
.icon-guanbishixin:before {
content: "\e8dc";
}
.icon-shuoming:before {
content: "\e63c";
}
.icon-huore:before {
content: "\1001d";
}
.icon-zy_peisong:before {
content: "\e60a";
}
.icon-shangchuantupian:before {
content: "\e628";
}
.icon-kefu:before {
content: "\e665";
}
.icon-bianji:before {
content: "\e609";
}
.icon-xiala:before {
content: "\e6b9";
}
.icon-24gf-telephone:before {
content: "\e96c";
}
.icon-shanchu:before {
content: "\e718";
}
.icon-kaiguan-kai:before {
content: "\e608";
}
.icon-kaiguan-guan:before {
content: "\e60f";
}
.icon-fenfabaoxian:before {
content: "\e607";
}
.icon-shijian:before {
content: "\e8c5";
}
.icon-dingwei:before {
content: "\e8c4";
}
.icon-xuanzeweixuanze:before {
content: "\e67b";
}
.icon-xuanzeyixuanze:before {
content: "\e67c";
}
.icon-tixing:before {
content: "\e64e";
}
.icon-fanhui:before {
content: "\e605";
}
.icon-jiahao-:before {
content: "\e606";
}
.icon-jianhao:before {
content: "\e617";
}
.icon-jiahao2fill:before {
content: "\e728";
}
.icon-31dingwei:before {
content: "\e604";
}
.icon-gouwuche:before {
content: "\e70b";
}
.icon-quanbudingdan:before {
content: "\e601";
}
.icon-31wode:before {
content: "\e602";
}
.icon-shouye:before {
content: "\e62e";
}
.icon-fenlei:before {
content: "\e62f";
}
.icon-qiye:before {
content: "\e637";
}
.icon-gongren:before {
content: "\e6db";
}
.icon-jinru:before {
content: "\e646";
}
.icon-weixiu:before {
content: "\e68c";
}
.icon-guandao1:before {
content: "\ec51";
}
.icon-jiazhengfuwu:before {
content: "\e661";
}
.icon-jiazheng:before {
content: "\e662";
}
.icon-jiayongdianqi:before {
content: "\e619";
}
.icon-dibandiaodinganzhuang:before {
content: "\e61a";
}
.icon-iconmoshiyugangreshuiqi:before {
content: "\e653";
}
.icon-jingshuiqianzhuang:before {
content: "\e61d";
}
.icon-menchuangmenchuangwujinanzhuang:before {
content: "\e61e";
}
.icon-shuidianmei:before {
content: "\e631";
}
.icon-anzhuangshigong:before {
content: "\e8d7";
}
.icon-guandao:before {
content: "\e603";
}
.icon-jiadiandianqi:before {
content: "\e60e";
}
.icon-classchuangjuanzhuang:before {
content: "\e7f8";
}
.icon-sousuo:before {
content: "\e600";
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
src/static/temp/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
src/static/temp/index/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
src/static/temp/index/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
src/static/temp/index/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
src/static/temp/index/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
src/static/temp/index/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/static/temp/index/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
src/static/temp/index/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
src/static/temp/index/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -1,24 +1,35 @@
import user from '@/core/user'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {
isLogin: false, showLoginModal: false,
userInfo: null,
}, },
getters: { getters: {
isLogin(state) { showLoginModal(state) {
return state.isLogin return state.showLoginModal;
} },
userInfo(state) {
return state.userInfo;
},
}, },
mutations: { mutations: {
setLoginState(state, loginState) { showLoginModal(state, data) {
state.isLogin = loginState state.showLoginModal = data;
},
userInfo(state, data) {
state.userInfo = data;
} }
}, },
actions: { actions: {
login(context) {
context.commit('setLoginState', true)
},
logout(context) { logout(context) {
context.commit('setLoginState', false) context.commit('userInfo', null);
},
userInfo(context) {
user.getInfo().then(info => {
context.commit('userInfo', info);
});
} }
} }
} }

14
vue.config.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
css: {
loaderOptions: {
less: {
globalVars: {
tabBarHeight: '115rpx',
tabBarIconWidth: '40rpx',
tabBarIconHeight: '40rpx',
tabBarFontSize: '22rpx'
}
}
}
}
}