Compare commits
623 Commits
master
...
gaohao2.0.
| Author | SHA1 | Date |
|---|---|---|
|
|
acc3930f48 | |
|
|
8a8de80321 | |
|
|
07d072ce4c | |
|
|
315b3e536d | |
|
|
e0822677ff | |
|
|
8318b9ed80 | |
|
|
f393b91c2d | |
|
|
db7c64fa8b | |
|
|
638ed75b4d | |
|
|
910fd4b9ad | |
|
|
3d287016c0 | |
|
|
ef16e62702 | |
|
|
094a8fc102 | |
|
|
3045b3f9a5 | |
|
|
85c5b86050 | |
|
|
460e3b7201 | |
|
|
95713b5df1 | |
|
|
4aa57227ea | |
|
|
7836222460 | |
|
|
e9bd9cc2d8 | |
|
|
528344d6ce | |
|
|
b836d1a0b4 | |
|
|
76774a4ec5 | |
|
|
519b28f746 | |
|
|
cb00d913d0 | |
|
|
7275bc66e9 | |
|
|
13c473a234 | |
|
|
802a8f6ce4 | |
|
|
266674272d | |
|
|
e795c49b32 | |
|
|
fabe5e3060 | |
|
|
a425baad52 | |
|
|
d14ba5e812 | |
|
|
aacb9d966a | |
|
|
93854290fe | |
|
|
f931cc882d | |
|
|
7752ce1b8a | |
|
|
b7da2d0a7b | |
|
|
f3df88236f | |
|
|
42c2d6891d | |
|
|
251353d48e | |
|
|
ee9405c5a6 | |
|
|
5b0b69bf97 | |
|
|
d8eba6ea2e | |
|
|
2a27c5394b | |
|
|
0a081f21ca | |
|
|
e5ba63d8aa | |
|
|
0d37da0a58 | |
|
|
8f8cbae221 | |
|
|
1df34b598f | |
|
|
fea219ee42 | |
|
|
bbbe6275ee | |
|
|
964b5a2316 | |
|
|
0210e61816 | |
|
|
b75318c146 | |
|
|
22ae339e30 | |
|
|
176fc55a5c | |
|
|
a8f01db5e3 | |
|
|
c79049443a | |
|
|
f5368fcf4f | |
|
|
af90b029df | |
|
|
835809910a | |
|
|
4f6fbf376a | |
|
|
43df2b637b | |
|
|
0a470c3d7d | |
|
|
28fdcd9e5c | |
|
|
a9a4efabe9 | |
|
|
4acb025bb9 | |
|
|
883a6ffa1a | |
|
|
a8c1440a02 | |
|
|
958229f63d | |
|
|
3ad1407173 | |
|
|
8528341101 | |
|
|
ef8cd6da3a | |
|
|
a9691e5891 | |
|
|
da1812f78b | |
|
|
dfe65e0ae6 | |
|
|
67a892ac01 | |
|
|
7d8673e6cf | |
|
|
649f9bd13f | |
|
|
63ef70ab6a | |
|
|
f95ae26298 | |
|
|
a9736e69f1 | |
|
|
f4467b6a2e | |
|
|
8ab8fa3a9a | |
|
|
c9d2e3c80f | |
|
|
1b0747ca91 | |
|
|
13b4a82ce6 | |
|
|
933d70445e | |
|
|
51f3a382c8 | |
|
|
438c11c324 | |
|
|
8acea02448 | |
|
|
da693c2fa2 | |
|
|
281a4d200a | |
|
|
367cb7c2d7 | |
|
|
1067da51c4 | |
|
|
b0fd39fa87 | |
|
|
8c99f49700 | |
|
|
964877f763 | |
|
|
9621b5bb86 | |
|
|
9bf1dda6dc | |
|
|
924f296ad1 | |
|
|
55ebdf9283 | |
|
|
96730712f3 | |
|
|
8403afd685 | |
|
|
20df5c3ca4 | |
|
|
515b12f09a | |
|
|
b0d37275f6 | |
|
|
a841858316 | |
|
|
df10beaaec | |
|
|
4af25b2b80 | |
|
|
58ed04ea71 | |
|
|
63a6305d46 | |
|
|
461150f9ba | |
|
|
29283c3487 | |
|
|
f68cf9fab0 | |
|
|
c103e026e5 | |
|
|
909760e9bf | |
|
|
f4b0414856 | |
|
|
c0c3eeeb44 | |
|
|
30d4be1560 | |
|
|
4caaa3770f | |
|
|
99da7fcf5a | |
|
|
c3cd0e704e | |
|
|
7ea49cbab8 | |
|
|
a2d21b3776 | |
|
|
a67e109744 | |
|
|
7445cfda26 | |
|
|
516ce90284 | |
|
|
c6fed2af32 | |
|
|
df9a49813a | |
|
|
863630b4c2 | |
|
|
d87b37fcea | |
|
|
435008fbd3 | |
|
|
146e6a617c | |
|
|
c384188256 | |
|
|
41648aa4c5 | |
|
|
ca827999b8 | |
|
|
4d6635e9be | |
|
|
869da7f0f0 | |
|
|
709036c050 | |
|
|
6f63576428 | |
|
|
64794aa8b8 | |
|
|
486733b788 | |
|
|
01eeccaecf | |
|
|
5a8a45143b | |
|
|
bf20edf7ef | |
|
|
7acc762d59 | |
|
|
88db7a720d | |
|
|
82cc068206 | |
|
|
af54cb73ad | |
|
|
647912fa1f | |
|
|
01003c84ab | |
|
|
e1fb69f424 | |
|
|
163757f27b | |
|
|
f585e2f020 | |
|
|
c473f30a37 | |
|
|
57ef84aae1 | |
|
|
2261b0520a | |
|
|
abac233027 | |
|
|
b2e27c0035 | |
|
|
3fb8a7b748 | |
|
|
76e5b89fb7 | |
|
|
5ea24d76c8 | |
|
|
e5aec2e236 | |
|
|
09716e7492 | |
|
|
8a7a97c9ca | |
|
|
54d4f468c1 | |
|
|
ea8df2a3b3 | |
|
|
ab1f5bd199 | |
|
|
12e66e8866 | |
|
|
9c2ce903b2 | |
|
|
36d667326e | |
|
|
9593d8f906 | |
|
|
bc3929a32e | |
|
|
998874db87 | |
|
|
f15c2c0135 | |
|
|
727d79a253 | |
|
|
f93b07e798 | |
|
|
ec7db7612b | |
|
|
ae82be372d | |
|
|
c017e9d318 | |
|
|
c86a85473b | |
|
|
9fbacf0398 | |
|
|
f442efd357 | |
|
|
0fd7264309 | |
|
|
8cc30448ca | |
|
|
0c7637f507 | |
|
|
460bbc6e18 | |
|
|
401e9fc8d3 | |
|
|
d21d4f490d | |
|
|
49b1eae1fa | |
|
|
dfcc643e8f | |
|
|
9b144138e9 | |
|
|
b52ed29d11 | |
|
|
a9aad48ef3 | |
|
|
511d266f72 | |
|
|
527714c16f | |
|
|
453955ca76 | |
|
|
d40a7b1856 | |
|
|
c224469c35 | |
|
|
489baa80d8 | |
|
|
eee6b3c9fa | |
|
|
2c54a2a1d1 | |
|
|
c75ff0ee68 | |
|
|
585c26fd4d | |
|
|
904c6be6ba | |
|
|
90573dac96 | |
|
|
c625d9a886 | |
|
|
21197e6258 | |
|
|
b2a3854f2b | |
|
|
9cf170e289 | |
|
|
fa28b9d8ac | |
|
|
866c395558 | |
|
|
d3bfab8010 | |
|
|
0c289d21a4 | |
|
|
9f2af5cf76 | |
|
|
b9709d9fd4 | |
|
|
411b434b26 | |
|
|
c5816b1d85 | |
|
|
b3ea406b6e | |
|
|
2acc46e811 | |
|
|
9513f7a3ec | |
|
|
acf055ee72 | |
|
|
a3e6c066a3 | |
|
|
b391a7da80 | |
|
|
e1a8f59bbf | |
|
|
0069fb7185 | |
|
|
9e269a690c | |
|
|
ef53332726 | |
|
|
2b6a4f9a83 | |
|
|
f1a599881c | |
|
|
3ebbfb6324 | |
|
|
2c7042e6e2 | |
|
|
f623106dce | |
|
|
327e8ef17c | |
|
|
0e7f5885e0 | |
|
|
79e27f0098 | |
|
|
fec143eb44 | |
|
|
893ec1bec4 | |
|
|
49a458de76 | |
|
|
8f7aaf87d5 | |
|
|
9c561ff725 | |
|
|
5608d7569b | |
|
|
9d42cda990 | |
|
|
7bad259789 | |
|
|
7a065c64cc | |
|
|
a21199d217 | |
|
|
23782f0f82 | |
|
|
9785038621 | |
|
|
6882f41786 | |
|
|
c52422d4f6 | |
|
|
0e030b29c1 | |
|
|
eb11c3a082 | |
|
|
ca496bf0db | |
|
|
8d8def8e52 | |
|
|
43d619f7bd | |
|
|
5c10f30eae | |
|
|
6fb458b824 | |
|
|
fb355a1913 | |
|
|
64b4ebb88a | |
|
|
abd6385f02 | |
|
|
275cf34424 | |
|
|
f6324f0cfe | |
|
|
089a92bcac | |
|
|
f619a448b3 | |
|
|
510039789a | |
|
|
e8634dc187 | |
|
|
bd97ca779d | |
|
|
d703e77ce7 | |
|
|
f3554b2b4a | |
|
|
63f8aca317 | |
|
|
940ceee222 | |
|
|
44c2f6c3dd | |
|
|
976aecb7bf | |
|
|
477906d4c5 | |
|
|
b432b8b3b9 | |
|
|
ab42e8d9f9 | |
|
|
df3546c378 | |
|
|
544038bb36 | |
|
|
89d5974fd2 | |
|
|
4056eae94f | |
|
|
e6e0ecced6 | |
|
|
a6b3d7c065 | |
|
|
b8e5751f30 | |
|
|
87f0b1131b | |
|
|
d1b2739fc7 | |
|
|
3ab87c6c29 | |
|
|
41fa886d23 | |
|
|
8562f2243a | |
|
|
1acf00daab | |
|
|
89da9cc1fc | |
|
|
f0bca6e0d1 | |
|
|
bac738d80c | |
|
|
60bc61d40f | |
|
|
fe6e6c2553 | |
|
|
5dc46dd622 | |
|
|
9215757381 | |
|
|
e70518c81c | |
|
|
a7083b85ab | |
|
|
a210389439 | |
|
|
66e15de9eb | |
|
|
6f952970d6 | |
|
|
da70ad3aa6 | |
|
|
483d183a09 | |
|
|
2e1f6b133a | |
|
|
34fc9c4ee1 | |
|
|
41b5156605 | |
|
|
2da14d86c2 | |
|
|
0420158601 | |
|
|
5c8786a5c0 | |
|
|
dc758120c4 | |
|
|
e5eeb7c1ce | |
|
|
d1893abd05 | |
|
|
bb42d4cd59 | |
|
|
1de4816ecc | |
|
|
19be296326 | |
|
|
5c47408c96 | |
|
|
c48b9f4ab3 | |
|
|
264ac9bcc2 | |
|
|
148ac92e80 | |
|
|
fc9b1dfda3 | |
|
|
632ecda8e4 | |
|
|
3d75bbaaae | |
|
|
5db9cc69a3 | |
|
|
4d00346766 | |
|
|
6afa9a3c48 | |
|
|
899fd4b93d | |
|
|
a979d390a3 | |
|
|
673afeb5f3 | |
|
|
e4e99585d4 | |
|
|
ce9799b290 | |
|
|
14395401db | |
|
|
d6836d240c | |
|
|
5f1688173f | |
|
|
4fd8d61756 | |
|
|
69d758ab68 | |
|
|
f83fc9da7e | |
|
|
56ad19d992 | |
|
|
7dbaf46d52 | |
|
|
f2fdf03511 | |
|
|
353ead73f5 | |
|
|
76de94ee7c | |
|
|
0f39d2cde1 | |
|
|
f767d12f4a | |
|
|
b92b439028 | |
|
|
5a51ab4ed5 | |
|
|
31979af1ea | |
|
|
5e7f7faa1b | |
|
|
cf36010926 | |
|
|
61156edf85 | |
|
|
d61c0cbb22 | |
|
|
f5df624f3e | |
|
|
3df43ddbaa | |
|
|
c95c630a75 | |
|
|
24d6a192b1 | |
|
|
6795f2ccd3 | |
|
|
e59919c6f1 | |
|
|
3cc53ec6e1 | |
|
|
a81c8b8352 | |
|
|
e6d421dfb1 | |
|
|
10ae05ce75 | |
|
|
5f8cecfa90 | |
|
|
97530fa0cf | |
|
|
f30f6332c9 | |
|
|
050b13e2eb | |
|
|
d7b5a1329e | |
|
|
fe90fd7fc2 | |
|
|
b8a08eea4f | |
|
|
ac11e23df5 | |
|
|
5c3028a2d2 | |
|
|
d88276f366 | |
|
|
2a1422d281 | |
|
|
433fa38c55 | |
|
|
89a4ab2c72 | |
|
|
24a044427b | |
|
|
178a06f2d7 | |
|
|
37c1c9fa2b | |
|
|
1cfec880ca | |
|
|
8ae5c20714 | |
|
|
299a38f3f9 | |
|
|
4fc08ca05a | |
|
|
24db020363 | |
|
|
7c777b72df | |
|
|
3805882787 | |
|
|
0e50ec6998 | |
|
|
7a1122ece6 | |
|
|
234f070977 | |
|
|
7db7f0c463 | |
|
|
b9e41d220a | |
|
|
422a44ca15 | |
|
|
e2aa28b9d8 | |
|
|
d99fb079c0 | |
|
|
d538252399 | |
|
|
d1317f9c7f | |
|
|
c45f8a5f6a | |
|
|
3070a5a6b4 | |
|
|
6def1406bb | |
|
|
f53f9b0f07 | |
|
|
38f8bd1ea9 | |
|
|
4748ea46e3 | |
|
|
16b49e08d2 | |
|
|
d889b9b1ad | |
|
|
eb7522c222 | |
|
|
d5dd4d0915 | |
|
|
773af51758 | |
|
|
016bc3fc0c | |
|
|
2e154dd749 | |
|
|
aee738ca00 | |
|
|
ae6dcc295a | |
|
|
06e4292de8 | |
|
|
36b307fbbe | |
|
|
891ab22903 | |
|
|
5292956f59 | |
|
|
5b95ce2d56 | |
|
|
97680afa8e | |
|
|
d9c9e6ac9c | |
|
|
c887f48035 | |
|
|
9aaeb7f0d6 | |
|
|
7d3251f1d6 | |
|
|
18b6509b26 | |
|
|
dfdfac7ca7 | |
|
|
a9ba6579fc | |
|
|
7876ed1c11 | |
|
|
83d0c54717 | |
|
|
1516b84c42 | |
|
|
a0cad20d31 | |
|
|
f5b36c5f0e | |
|
|
1d1dabf492 | |
|
|
445a2caab8 | |
|
|
f05c49232a | |
|
|
98aee65db7 | |
|
|
f66d4655d1 | |
|
|
aa8d1b76e4 | |
|
|
c5ec0da61c | |
|
|
483ff5d234 | |
|
|
da29e0b249 | |
|
|
c70a6b2f68 | |
|
|
07a3c8e5f4 | |
|
|
9d8e1e1bf2 | |
|
|
770c369ebd | |
|
|
711bd0ca77 | |
|
|
7542134ac7 | |
|
|
71b6d1929b | |
|
|
30656b3005 | |
|
|
2fe66b28a8 | |
|
|
5e14f29ecb | |
|
|
f2c73eca9a | |
|
|
ec75feddce | |
|
|
423ad16727 | |
|
|
963c1c81ba | |
|
|
ab7c61231b | |
|
|
4c2d88ed99 | |
|
|
d275c5ea3c | |
|
|
eaaf7f5c60 | |
|
|
335d604f5f | |
|
|
34f18e0e07 | |
|
|
d0f567209b | |
|
|
f5b364b0f3 | |
|
|
ccd66bd2be | |
|
|
82624d49b5 | |
|
|
d64555e905 | |
|
|
052d06bb75 | |
|
|
b0811452a4 | |
|
|
dfc9667c90 | |
|
|
5d1961d772 | |
|
|
a14a9877c2 | |
|
|
dba71a0f11 | |
|
|
9e4eaf1ebc | |
|
|
f07b6ec29b | |
|
|
3f8a41f694 | |
|
|
0b3084a3f9 | |
|
|
0a36882c8b | |
|
|
18c2c68c9f | |
|
|
1bc4cf134c | |
|
|
8a84a99272 | |
|
|
37f7e51f69 | |
|
|
555d0ebaa0 | |
|
|
baa60b0021 | |
|
|
c563f646cc | |
|
|
39ec8a57cb | |
|
|
1fde054290 | |
|
|
977b2e5cd7 | |
|
|
5575b4be9d | |
|
|
c39792a0f6 | |
|
|
28750b0a2d | |
|
|
bcd5458db3 | |
|
|
0ae2fbe11b | |
|
|
c51d5cd064 | |
|
|
daa8de48b3 | |
|
|
51e410a4be | |
|
|
e0be30bd02 | |
|
|
4977dcb76b | |
|
|
13df97b949 | |
|
|
44e15448d9 | |
|
|
21a9548e45 | |
|
|
ce546e09b2 | |
|
|
b3a48a68af | |
|
|
611194b587 | |
|
|
0bccf5db8a | |
|
|
3b7dbe50a2 | |
|
|
1e52030f5e | |
|
|
b1bf21ccad | |
|
|
681d1c2c07 | |
|
|
7733dcf4e9 | |
|
|
5fc9443a4b | |
|
|
2292bd6b82 | |
|
|
25b348ee12 | |
|
|
14462f98ab | |
|
|
b6b80c3d43 | |
|
|
c4b734ce12 | |
|
|
69b19bfade | |
|
|
8c0ca8869a | |
|
|
4ab685fac3 | |
|
|
87d2f8a7bb | |
|
|
81f5c68fa7 | |
|
|
9a55093516 | |
|
|
3b12a2ba06 | |
|
|
7f54c59092 | |
|
|
5377a76365 | |
|
|
d0cc82fdf5 | |
|
|
d1ef6fefa0 | |
|
|
6c4e992283 | |
|
|
0971b67010 | |
|
|
1d39576b34 | |
|
|
e38545be2d | |
|
|
79e1282c68 | |
|
|
e67e3525e4 | |
|
|
7427e2d913 | |
|
|
01c4c17d30 | |
|
|
671159277c | |
|
|
b495926968 | |
|
|
6830529769 | |
|
|
4a6c0ca71d | |
|
|
07551be485 | |
|
|
64d321508e | |
|
|
d8cac655a4 | |
|
|
9a75cb474e | |
|
|
744632324b | |
|
|
0a1af58fcd | |
|
|
5bc744872b | |
|
|
2acf054b86 | |
|
|
7de5f566b0 | |
|
|
4818e2e927 | |
|
|
5d3fdd5acf | |
|
|
c505674e36 | |
|
|
20ed539215 | |
|
|
9317ec1dfa | |
|
|
d8b9d01aa7 | |
|
|
77f75bbbeb | |
|
|
bf0da42707 | |
|
|
f6a37259bb | |
|
|
8d5a54fe6f | |
|
|
432ba32b4e | |
|
|
0ce365bbe8 | |
|
|
502a18d5a3 | |
|
|
b88ae01878 | |
|
|
617dd317d3 | |
|
|
b08e7edfa2 | |
|
|
fa84f836ed | |
|
|
ee5178ccfe | |
|
|
a7c2194ec2 | |
|
|
3ea8aeab34 | |
|
|
79a0a2c1a2 | |
|
|
6aea8a9c8e | |
|
|
0122589289 | |
|
|
51c9c9e15c | |
|
|
016ebf7b62 | |
|
|
dbe8167822 | |
|
|
a6d3d4afbe | |
|
|
54d06b72fe | |
|
|
347f58828d | |
|
|
72778ed68b | |
|
|
3532d8dbf4 | |
|
|
c1beec0efc | |
|
|
3ae0d7991b | |
|
|
496389f8bc | |
|
|
aa7a672e87 | |
|
|
dcb2eb36ea | |
|
|
04d23793d1 | |
|
|
6cbf407b88 | |
|
|
a6d90bf36e | |
|
|
7b679fb415 | |
|
|
6f15f226ee | |
|
|
1ca47334f6 | |
|
|
52ed7edf08 | |
|
|
2be2df7bc4 | |
|
|
e335d634da | |
|
|
fa27401152 | |
|
|
29affe432a | |
|
|
9479f1c987 | |
|
|
30b309dcf3 | |
|
|
3ea683b7bd | |
|
|
aaea042bca | |
|
|
4bffe64149 | |
|
|
9de4251981 | |
|
|
33e2e7b761 | |
|
|
dd7f4c32ac | |
|
|
ecf800bf76 | |
|
|
a059e97a45 | |
|
|
000def6dc2 | |
|
|
a53c688513 | |
|
|
949a310c71 | |
|
|
fb63eabb33 | |
|
|
a427cfff76 | |
|
|
f3faa70c59 | |
|
|
015ca6ae4e | |
|
|
bb2e166af2 | |
|
|
97685234d4 | |
|
|
914a6389e7 | |
|
|
1a4eb34824 | |
|
|
3888b95248 | |
|
|
fcae02fe4a | |
|
|
63effa002d | |
|
|
f13dbd580a | |
|
|
58bf05d7c4 | |
|
|
cc32bc79a3 | |
|
|
e7ff989d03 | |
|
|
2f0006571f | |
|
|
5d0bbba194 | |
|
|
7cadb25712 | |
|
|
cfa32e18ba | |
|
|
abe786d155 |
|
|
@ -6,6 +6,9 @@ ENV = 'development'
|
|||
# VUE_APP_BASE_API = 'http://192.168.2.133:8000'
|
||||
# 测试
|
||||
VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
|
||||
#预发布
|
||||
# VUE_APP_BASE_API = 'https://pre-cashieradmin.sxczgkj.cn'
|
||||
|
||||
# 生产
|
||||
# VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn'
|
||||
# VUE_APP_BASE_API = 'http://192.168.2.96:8000'
|
||||
|
|
@ -13,4 +16,5 @@ VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
|
|||
# VUE_APP_BASE_API = 'http://192.168.2.147:8000/'
|
||||
VUE_APP_WS_API = 'ws://192.168.2.128:8000'
|
||||
|
||||
VUE_APP_PHP_API = 'https://kysh.sxczgkj.cn'
|
||||
# 是否启用 babel-plugin-dynamic-import-node插
|
||||
|
|
@ -3,9 +3,16 @@ ENV = 'production'
|
|||
# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
|
||||
# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
|
||||
# 测试
|
||||
VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
|
||||
# VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
|
||||
|
||||
# 生产
|
||||
# VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn'
|
||||
|
||||
# 预发布接口
|
||||
VUE_APP_BASE_API = 'https://pre-cashieradmin.sxczgkj.cn'
|
||||
|
||||
# VUE_APP_BASE_API = 'http://192.168.2.98:8000'
|
||||
# 如果接口是 http 形式, wss 需要改为 ws
|
||||
VUE_APP_WS_API = 'wss://123.56.110.252
|
||||
VUE_APP_WS_API = 'wss://123.56.110.252'
|
||||
|
||||
VUE_APP_PHP_API = 'https://kysh.sxczgkj.cn/source'
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@riophae/vue-treeselect": "^0.4.0",
|
||||
"ali-oss": "^6.21.0",
|
||||
"axios": "^0.21.1",
|
||||
"clipboard": "2.0.4",
|
||||
"codemirror": "^5.49.2",
|
||||
|
|
@ -39,6 +40,7 @@
|
|||
"js-md5": "^0.8.3",
|
||||
"jsencrypt": "^3.0.0-rc.1",
|
||||
"jszip": "^3.7.1",
|
||||
"lodash": "^4.17.21",
|
||||
"material-components-vue": "^1.2.0",
|
||||
"mavon-editor": "^2.9.1",
|
||||
"normalize.css": "7.0.0",
|
||||
|
|
|
|||
10
src/App.vue
|
|
@ -131,4 +131,14 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.image-slot {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #efefef;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 18px;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -124,3 +124,50 @@ export function countRecord(data) {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 广告列表
|
||||
* @returns
|
||||
*/
|
||||
export function adget(params) {
|
||||
return request({
|
||||
url: "/api/ad",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 广告新增单位
|
||||
* @returns
|
||||
*/
|
||||
export function adpost(data) {
|
||||
return request({
|
||||
url: `/api/ad`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 广告编辑详情
|
||||
* @returns
|
||||
*/
|
||||
export function adput(data) {
|
||||
return request({
|
||||
url: '/api/ad',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 广告删除商品
|
||||
* @returns
|
||||
*/
|
||||
export function addelete(params) {
|
||||
return request({
|
||||
url: "/api/ad/" + params,
|
||||
method: "DELETE",
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
import request from '@/utils/request'
|
||||
export function get(params) {
|
||||
return request({
|
||||
url: '/freeDine',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export function add(data) {
|
||||
return request({
|
||||
url: 'api/botUser',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function del(ids) {
|
||||
return request({
|
||||
url: 'api/botUser/',
|
||||
method: 'delete',
|
||||
data: ids
|
||||
})
|
||||
}
|
||||
|
||||
export function edit(data) {
|
||||
return request({
|
||||
url: '/freeDine',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
export default { add, edit, del, get }
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
class API {
|
||||
constructor(url, req) {
|
||||
const map = {
|
||||
add: 'POST',
|
||||
del: 'DELETE',
|
||||
update: 'PUT',
|
||||
get: 'GET'
|
||||
}
|
||||
this.url = url
|
||||
for (let key in map) {
|
||||
this[key] = function (data) {
|
||||
data = Array.isArray(data) ? data : {
|
||||
...data, shopId: localStorage.getItem("shopId"),
|
||||
}
|
||||
if (key === 'del') {
|
||||
delete data.shopId
|
||||
}
|
||||
const par={ url, method: map[key] }
|
||||
if(key==='get'){
|
||||
par.params=data
|
||||
}else{
|
||||
par.data=data
|
||||
}
|
||||
return request(par)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default API
|
||||
|
|
@ -5,11 +5,11 @@ import request from "@/utils/request";
|
|||
* @returns
|
||||
*/
|
||||
export function gettbConsType(params) {
|
||||
return request({
|
||||
url: '/api/tbConsType',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsType",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -17,66 +17,67 @@ export function gettbConsType(params) {
|
|||
* @returns
|
||||
*/
|
||||
export function posttbConsType(data) {
|
||||
return request({
|
||||
url: '/api/tbConsType',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsType",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 修改耗材类型
|
||||
* @returns
|
||||
*/
|
||||
export function puttbConsType(data) {
|
||||
return request({
|
||||
url: '/api/tbConsType',
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsType",
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 查询耗材信息
|
||||
* @returns
|
||||
*/
|
||||
export function gettbConsInfo(params) {
|
||||
return request({
|
||||
url: '/api/tbConsInfo',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
export function gettbConsInfo(data) {
|
||||
return request({
|
||||
url: "/api/tbConsInfo/allAndPro",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 耗材入库
|
||||
* @returns
|
||||
*/
|
||||
export function posttbConsInfostockIn(data) {
|
||||
return request({
|
||||
url: '/api/tbConsInfo/stockIn',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsInfo/stockIn",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 修改单位耗材值耗材
|
||||
* @returns
|
||||
*/
|
||||
export function postapitbConsInfo(data) {
|
||||
return request({
|
||||
url: '/api/tbConsInfo',
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsInfo",
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 新增耗材信息
|
||||
* @returns
|
||||
*/
|
||||
export function posttbConsInfo(data) {
|
||||
return request({
|
||||
url: '/api/tbConsInfo',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbConsInfo",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -84,55 +85,55 @@ export function posttbConsInfo(data) {
|
|||
* @returns
|
||||
*/
|
||||
export function getviewConSku(params) {
|
||||
return request({
|
||||
url: '/api/viewConSku',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
return request({
|
||||
url: "/api/viewConSku",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 查询查询商品规格
|
||||
* @returns
|
||||
*/
|
||||
export function gettbProductSpec(params) {
|
||||
return request({
|
||||
url: '/api/viewProductSkuShop',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
return request({
|
||||
url: "/api/viewProductSkuShop",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 新增商品规格耗材信息
|
||||
* @returns
|
||||
*/
|
||||
export function posttbProskuCon(data) {
|
||||
return request({
|
||||
url: '/api/tbProskuCon',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbProskuCon",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 新增商品规格耗材信息-修改后
|
||||
* @returns
|
||||
*/
|
||||
export function posttbProskuCons(data) {
|
||||
return request({
|
||||
url: '/api/tbProskuCon',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbProskuCon",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 修改商品规格耗材信息状态
|
||||
* @returns
|
||||
*/
|
||||
export function puttbProskuCon(data) {
|
||||
return request({
|
||||
url: '/api/tbProskuCon',
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbProskuCon",
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 编辑单位耗材值
|
||||
// export function puttbProskuCon(data) {
|
||||
|
|
@ -147,20 +148,83 @@ export function puttbProskuCon(data) {
|
|||
* @returns
|
||||
*/
|
||||
export function deletetbProskuCon(data) {
|
||||
return request({
|
||||
url: '/api/tbProskuCon',
|
||||
method: "delete",
|
||||
data
|
||||
});
|
||||
return request({
|
||||
url: "/api/tbProskuCon",
|
||||
method: "delete",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询耗材单位列表
|
||||
*/
|
||||
export function queryTbConUnitInfo(data) {
|
||||
return request({
|
||||
url: "/api/tbConUnit/queryTbConUnitInfo",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增耗材单位
|
||||
*/
|
||||
export function addtbConUnit(data) {
|
||||
return request({
|
||||
url: "/api/tbConUnit",
|
||||
method: "post",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改耗材单位
|
||||
*/
|
||||
export function edittbConUnit(data) {
|
||||
return request({
|
||||
url: "/api/tbConUnit",
|
||||
method: "put",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定关系
|
||||
*/
|
||||
export function tbProskuConV2(data) {
|
||||
return request({
|
||||
url: "/api/tbProskuCon/V2",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 查询耗材流水信息
|
||||
* @returns
|
||||
* 耗材库存统计
|
||||
*/
|
||||
export function gettbConsInfoFlow(params) {
|
||||
return request({
|
||||
url: '/api/tbConsInfoFlow',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
export function tbConsInfoFlowcount(data) {
|
||||
return request({
|
||||
url: "/api/tbConsInfoFlow/count",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 耗材库存记录列表
|
||||
*/
|
||||
export function tbConsInfoFlowstock(data) {
|
||||
return request({
|
||||
url: "/api/tbConsInfoFlow/stock",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 获取优惠券列表
|
||||
* @returns
|
||||
*/
|
||||
export function getTbShopCoupon(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon',
|
||||
method: 'get',
|
||||
params: {
|
||||
...params
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取优惠券详情
|
||||
* @returns
|
||||
*/
|
||||
export function getTbShopCouponInfo(id) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon/' + id,
|
||||
method: 'get',
|
||||
params: {}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加优惠券
|
||||
* @returns
|
||||
*/
|
||||
export function addTbShopCoupon(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon',
|
||||
method: 'post',
|
||||
data: {
|
||||
...params
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除优惠券
|
||||
* @returns
|
||||
*/
|
||||
export function delTbShopCoupon(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon',
|
||||
method: 'delete',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取领取列表
|
||||
* @returns
|
||||
*/
|
||||
export function queryReceive(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon/queryReceive',
|
||||
method: 'post',
|
||||
data: {
|
||||
...params
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取领取列表
|
||||
* @returns
|
||||
*/
|
||||
export function delReceive(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon/receive',
|
||||
method: 'delete',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 增加打印机
|
||||
|
||||
* @returns
|
||||
*/
|
||||
export function tbPrintMachine(data, method = 'post') {
|
||||
|
|
@ -14,19 +14,58 @@ export function tbPrintMachine(data, method = 'post') {
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 打印机切换
|
||||
export function switchtbPrintMachine(data, method = 'post') {
|
||||
return request({
|
||||
url: '/api/shop-config/printer/update-status',
|
||||
method: method,
|
||||
data: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
...data
|
||||
}
|
||||
})
|
||||
}
|
||||
// 打印机部分
|
||||
export function tbShopCategory(params) {
|
||||
return request({
|
||||
url: '/api/tbShopCategory',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 打印机列表
|
||||
* @returns
|
||||
*/
|
||||
export function tbPrintMachineGet(params) {
|
||||
return request({
|
||||
url: '/api/tbPrintMachine',
|
||||
url: '/api/shop-config/printer/list',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
sort: '',
|
||||
...params
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
// 删除
|
||||
export function delTableHandle(id) {
|
||||
return request({
|
||||
url: '/api/shop-config/printer/' + id,
|
||||
method: 'DELETE',
|
||||
})
|
||||
}
|
||||
// * 打印机详情
|
||||
export function printerd(id) {
|
||||
return request({
|
||||
url: '/api/shop-config/printer/' + id,
|
||||
method: 'get',
|
||||
|
||||
})
|
||||
}
|
||||
// 编辑 新增打印机
|
||||
export function configprinter(data, method = "post") {
|
||||
return request({
|
||||
url: `/api/shop-config/printer`,
|
||||
method: method,
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
import request from "@/utils/request";
|
||||
import editor from "mavon-editor";
|
||||
|
||||
/**
|
||||
* 列表
|
||||
* @returns
|
||||
*/
|
||||
export function tbShopExtend(params) {
|
||||
return request({
|
||||
url: "/tbShopExtend",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增单位
|
||||
* @returns
|
||||
*/
|
||||
export function addtbShopExtend(data) {
|
||||
return request({
|
||||
url: `/tbShopExtend`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 编辑详情
|
||||
* @returns
|
||||
*/
|
||||
export function edittbShopExtend(data) {
|
||||
return request({
|
||||
url: '/tbShopExtend',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 查询详情
|
||||
* @returns
|
||||
*/
|
||||
export function querytbShopExtend(params) {
|
||||
return request({
|
||||
url: `/tbShopExtend/` + params,
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 删除商品
|
||||
* @returns
|
||||
*/
|
||||
export function deletetbShopExtend(params) {
|
||||
return request({
|
||||
url: "/tbShopExtend",
|
||||
method: "delete",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
import request from "@/utils/request";
|
||||
|
||||
/**
|
||||
* 列表
|
||||
* @returns
|
||||
*/
|
||||
export function miniAppPagesget(params) {
|
||||
return request({
|
||||
url: "/api/miniAppPages",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增单位
|
||||
* @returns
|
||||
*/
|
||||
export function miniAppPagespost(data) {
|
||||
return request({
|
||||
url: `/api/miniAppPages`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 编辑详情
|
||||
* @returns
|
||||
*/
|
||||
export function miniAppPagesput(data) {
|
||||
return request({
|
||||
url: '/api/miniAppPages',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除商品
|
||||
* @returns
|
||||
*/
|
||||
export function miniAppPagesdelete(params) {
|
||||
return request({
|
||||
url: "/api/miniAppPages/" + params,
|
||||
method: "delete",
|
||||
});
|
||||
}
|
||||
163
src/api/home.js
|
|
@ -1,17 +1,17 @@
|
|||
import request from '@/utils/request'
|
||||
import request from "@/utils/request";
|
||||
|
||||
/**
|
||||
* 汇总数据
|
||||
* @returns
|
||||
*/
|
||||
export function summaryGet() {
|
||||
return request({
|
||||
url: '/api/summary',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId')
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId")
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -19,13 +19,13 @@ export function summaryGet() {
|
|||
* @returns
|
||||
*/
|
||||
export function summaryTodayGet() {
|
||||
return request({
|
||||
url: '/api/summary/today',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId')
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/today",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId")
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -33,14 +33,14 @@ export function summaryTodayGet() {
|
|||
* @returns
|
||||
*/
|
||||
export function summaryDateGet(day) {
|
||||
return request({
|
||||
url: '/api/summary/date',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
day: day
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/date",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
day: day
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -48,14 +48,14 @@ export function summaryDateGet(day) {
|
|||
* @returns
|
||||
*/
|
||||
export function dateAmount(day) {
|
||||
return request({
|
||||
url: '/api/summary/dateAmount',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
day: day
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/dateAmount",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
day: day
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -63,16 +63,17 @@ export function dateAmount(day) {
|
|||
* @returns
|
||||
*/
|
||||
export function dateProduct(day, page, size) {
|
||||
return request({
|
||||
url: '/api/summary/dateProduct',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
day: day,
|
||||
page: page,
|
||||
size: size
|
||||
}
|
||||
})
|
||||
return request({
|
||||
// url: "/api/summary/dateProduct",
|
||||
url: "/api/summary/productSaleDate",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
day: day,
|
||||
page: page,
|
||||
size: size
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -80,14 +81,14 @@ export function dateProduct(day, page, size) {
|
|||
* @returns
|
||||
*/
|
||||
export function datePayType(day) {
|
||||
return request({
|
||||
url: '/api/summary/datePayType',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
day: day
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/datePayType",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
day: day
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -95,15 +96,15 @@ export function datePayType(day) {
|
|||
* @returns
|
||||
*/
|
||||
export function daydownload(data) {
|
||||
return request({
|
||||
url: '/api/summary/day/download',
|
||||
method: 'post',
|
||||
data: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
...data
|
||||
},
|
||||
responseType: 'blob'
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/day/download",
|
||||
method: "post",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
},
|
||||
responseType: "blob"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -111,14 +112,14 @@ export function daydownload(data) {
|
|||
* @returns
|
||||
*/
|
||||
export function daycount(params) {
|
||||
return request({
|
||||
url: '/api/summary/day/count',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
...params
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/day/count",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -126,13 +127,27 @@ export function daycount(params) {
|
|||
* @returns
|
||||
*/
|
||||
export function summaryday(params) {
|
||||
return request({
|
||||
url: '/api/summary/day',
|
||||
method: 'get',
|
||||
params: {
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
...params
|
||||
}
|
||||
})
|
||||
return request({
|
||||
url: "/api/summary/day",
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 营业板块
|
||||
* @returns
|
||||
*/
|
||||
export function summarytrade(data) {
|
||||
return request({
|
||||
url: "/api/summary/trade",
|
||||
method: "post",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 查询交班记录
|
||||
* @returns
|
||||
*/
|
||||
export function tbHandoverGet(leng) {
|
||||
return request({
|
||||
url: leng,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
import request from "@/utils/requestPhp";
|
||||
|
||||
// 获取图片分类
|
||||
export function getcommonCategor(data) {
|
||||
return request({
|
||||
url: `/sourcematerial/getcommon-category`,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
// 获取图片
|
||||
export function getcommonpicture(data) {
|
||||
return request({
|
||||
url: "/sourcematerial/getcommon-picture",
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
export function storeAddcategory(data) {
|
||||
return request({
|
||||
url: '/sourcematerial/store-addcategory',
|
||||
method: 'post',
|
||||
data: {
|
||||
...data
|
||||
},
|
||||
})
|
||||
}
|
||||
export function addImg(data) {
|
||||
return request({
|
||||
url: '/sourcematerial/add-img',
|
||||
method: 'post',
|
||||
data: {
|
||||
...data
|
||||
},
|
||||
})
|
||||
}
|
||||
// 删除图片
|
||||
export function delimg(data) {
|
||||
return request({
|
||||
url: '/sourcematerial/delimg',
|
||||
method: 'post',
|
||||
data: {
|
||||
...data
|
||||
},
|
||||
})
|
||||
}
|
||||
// 删除类型
|
||||
export function delcate(data) {
|
||||
return request({
|
||||
url: '/sourcematerial/delcate',
|
||||
method: 'post',
|
||||
data: {
|
||||
...data
|
||||
},
|
||||
})
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import request from "@/utils/request";
|
||||
|
||||
/**
|
||||
* 获取店铺设置
|
||||
* @returns
|
||||
*/
|
||||
export function byShopId() {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/tbShopShare/byShopId`,
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: shopId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 分享-新增/编辑
|
||||
* @returns
|
||||
*/
|
||||
export function tbShopShare(data) {
|
||||
return request({
|
||||
url: "/tbShopShare",
|
||||
method: data.id ? "put" : "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 邀请记录
|
||||
* @returns
|
||||
*/
|
||||
export function byShare(data) {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/tbShopShare/byShare`,
|
||||
method: "post",
|
||||
data: {
|
||||
shopId: shopId,
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -71,7 +71,7 @@ export function tbProductStockDetailSum(params) {
|
|||
*/
|
||||
export function tbShopPurveyorGet(params) {
|
||||
return request({
|
||||
url: `/api/tbShopPurveyor`,
|
||||
url: `/api/tbShopPurveyorTransact`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
|
|
@ -173,7 +173,14 @@ export function tbProductStockOperateOutAndOn(data) {
|
|||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 副单位
|
||||
export function unittbConsInfo(params) {
|
||||
return request({
|
||||
url: `/api/tbConsInfo`,
|
||||
method: "put",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 库存列表
|
||||
* @returns
|
||||
|
|
@ -241,6 +248,16 @@ export function stockStateChange(params) {
|
|||
}
|
||||
});
|
||||
}
|
||||
// 下架
|
||||
export function stockStateChangess(params) {
|
||||
return request({
|
||||
url: `/api/stock/grounding`,
|
||||
method: "put",
|
||||
params: {
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
// 警戒设置
|
||||
export function stockStatewarnLine(params) {
|
||||
return request({
|
||||
|
|
@ -394,3 +411,15 @@ export function tbConsInfoinputStock(file) {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 供应商出入库记录
|
||||
* @returns
|
||||
*/
|
||||
export function tbProductStockOperatepage(data) {
|
||||
return request({
|
||||
url: `/api/tbProductStockOperate/page`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
@ -1,35 +1,43 @@
|
|||
import request from '@/utils/request'
|
||||
import request from "@/utils/request";
|
||||
|
||||
export function login(username, password, code, uuid) {
|
||||
export function login(data) {
|
||||
return request({
|
||||
url: 'auth/login',
|
||||
method: 'post',
|
||||
data: {
|
||||
username,
|
||||
password,
|
||||
code,
|
||||
uuid
|
||||
}
|
||||
})
|
||||
url: "auth/login",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function getInfo() {
|
||||
return request({
|
||||
url: 'auth/info',
|
||||
method: 'get'
|
||||
})
|
||||
url: "auth/info",
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
export function getCodeImg(header) {
|
||||
return request({
|
||||
url: 'auth/code',
|
||||
method: 'get'
|
||||
})
|
||||
url: "auth/code",
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
return request({
|
||||
url: 'auth/logout',
|
||||
method: 'delete'
|
||||
})
|
||||
url: "auth/logout",
|
||||
method: "delete"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 个人中心 修改密码
|
||||
* @param {*} data
|
||||
* @returns
|
||||
*/
|
||||
export function updatePass(data) {
|
||||
return request({
|
||||
url: "/api/users/updatePass",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,51 @@
|
|||
import request from "@/utils/request";
|
||||
|
||||
|
||||
// 推送店铺消息开关
|
||||
export function shopState(data) {
|
||||
return request({
|
||||
url: "/api/msg/shopState",
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function msgall(params) {
|
||||
return request({
|
||||
url: "/api/msg/all",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
export function msginfo(data) {
|
||||
return request({
|
||||
url: '/api/msg/info',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
export function state(params) {
|
||||
return request({
|
||||
url: "/api/msg/state",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
export function delmsg(ids) {
|
||||
return request({
|
||||
url: '/api/msg',
|
||||
method: 'delete',
|
||||
data: ids
|
||||
})
|
||||
}
|
||||
|
||||
//获取订阅二维码
|
||||
export function subQrCode(params) {
|
||||
return request({
|
||||
url: '/api/msg/subQrCode',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
import request from "@/utils/request";
|
||||
|
||||
/**
|
||||
* Pad商品版式布局列表
|
||||
* @returns
|
||||
*/
|
||||
export function layoutlist(params) {
|
||||
return request({
|
||||
url: "/api/pad/layout/list",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新建
|
||||
* @returns
|
||||
*/
|
||||
export function productGroup(data) {
|
||||
return request({
|
||||
url: "/api/pad/productCategory",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad点餐列表
|
||||
* @returns
|
||||
*/
|
||||
export function productGrouppage(params) {
|
||||
return request({
|
||||
url: "/api/pad/productCategory/page",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取详情
|
||||
* @returns
|
||||
*/
|
||||
export function productCategoryDetail(id) {
|
||||
return request({
|
||||
url: `/api/pad/productCategory/${id}`,
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @returns
|
||||
*/
|
||||
export function productCategoryDelete(id) {
|
||||
return request({
|
||||
url: `/api/pad/productCategory/${id}`,
|
||||
method: "DELETE"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改
|
||||
* @returns
|
||||
*/
|
||||
export function productGroupPut(data) {
|
||||
return request({
|
||||
url: "/api/pad/productCategory",
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 拖动排序
|
||||
* @returns
|
||||
*/
|
||||
export function productCategorySort(data) {
|
||||
return request({
|
||||
url: "/api/pad/productCategory/sort",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
import request from "@/utils/request";
|
||||
// 会员积分
|
||||
|
||||
/**
|
||||
* 基本设置-获取店铺设置
|
||||
* @returns
|
||||
*/
|
||||
export function basicSettingGet() {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/api/points/basic-setting/${shopId}`,
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 基本设置-保存
|
||||
* @returns
|
||||
*/
|
||||
export function basicSettingPost(data) {
|
||||
return request({
|
||||
url: "/api/points/basic-setting",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品设置-新增/编辑
|
||||
* @returns
|
||||
*/
|
||||
export function goodsSettingAdd(data) {
|
||||
return request({
|
||||
url: "/api/points/goods-setting",
|
||||
method: data.id ? "put" : "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品设置-删除
|
||||
* @returns
|
||||
*/
|
||||
export function goodsDelete(id) {
|
||||
return request({
|
||||
url: `/api/points/goods-setting/${id}`,
|
||||
method: "DELETE"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品设置-列表
|
||||
* @returns
|
||||
*/
|
||||
export function goodsSettingPage(params) {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/api/points/goods-setting/page`,
|
||||
method: "get",
|
||||
params: {
|
||||
...params,
|
||||
shopId: shopId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 兑换记录-列表
|
||||
* @returns
|
||||
*/
|
||||
export function exchangeRecordPage(params) {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/api/points/exchange-record/page`,
|
||||
method: "get",
|
||||
params: {
|
||||
...params,
|
||||
shopId: shopId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 兑换记录-统计
|
||||
* @returns
|
||||
*/
|
||||
export function exchangeRecordTotal(params) {
|
||||
let shopId = localStorage.getItem("shopId");
|
||||
return request({
|
||||
url: `/api/points/exchange-record/total`,
|
||||
method: "get",
|
||||
params: {
|
||||
...params,
|
||||
shopId: shopId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 兑换记录-核销
|
||||
* @returns
|
||||
*/
|
||||
export function recordCheckout(data) {
|
||||
return request({
|
||||
url: "/api/points/exchange-record/checkout",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
@ -18,3 +18,11 @@ export function modfiyUserInfo(data) {
|
|||
data,
|
||||
});
|
||||
}
|
||||
// 校验安全密码
|
||||
export function tbShopInfoPUT(data) {
|
||||
return request({
|
||||
url: "/api/tbShopInfo",
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
|
|
|||
280
src/api/shop.js
|
|
@ -417,6 +417,17 @@ export function modityActivate(data) {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增、修改活动 新的!
|
||||
* @returns
|
||||
*/
|
||||
export function storageupActivate(data) {
|
||||
return request({
|
||||
url: `/shop/storage/upActivate`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 活动列表
|
||||
* @returns
|
||||
|
|
@ -428,7 +439,14 @@ export function findActivate(params) {
|
|||
params
|
||||
});
|
||||
}
|
||||
|
||||
// 获取店铺会员二维码
|
||||
export function getwxacode(data) {
|
||||
return request({
|
||||
url: `/shop/storage/getwxacode`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 商家用户列表
|
||||
* @returns
|
||||
|
|
@ -458,7 +476,6 @@ export function queryAllShopInfo(params) {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 修改商品排序
|
||||
* @returns
|
||||
|
|
@ -495,7 +512,6 @@ export function upCategorySort(data) {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询店铺充值记录
|
||||
* @returns
|
||||
|
|
@ -519,10 +535,266 @@ export function downloadTableRecharge(data) {
|
|||
return request({
|
||||
url: `/api/tbShopUser/recharge/download`,
|
||||
method: "post",
|
||||
data:{
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
},
|
||||
responseType: "blob"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 员工列表
|
||||
* @returns
|
||||
*/
|
||||
export function tbPlussShopStaffGet(params) {
|
||||
return request({
|
||||
url: `/api/tbPlussShopStaff`,
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色列表
|
||||
* @returns
|
||||
*/
|
||||
export function rolesGet() {
|
||||
return request({
|
||||
url: `/api/roles`,
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加员工
|
||||
* @returns
|
||||
*/
|
||||
export function tbPlussShopStaff(data) {
|
||||
return request({
|
||||
url: `/api/tbPlussShopStaff`,
|
||||
method: data.id ? "put" : "post",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function tbShopPermissionlist(params) {
|
||||
return request({
|
||||
url: `/api/tbShopPermission/list`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
export function getHasPermission(params) {
|
||||
return request({
|
||||
url: `/api/tbShopPermission/hasPermission`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过id获取员工信息
|
||||
* @returns
|
||||
*/
|
||||
export function tbPlussShopStaffDetail(id) {
|
||||
return request({
|
||||
url: `/api/tbPlussShopStaff/${id}`,
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 更改员工状态
|
||||
* @returns
|
||||
*/
|
||||
export function updateStatus(data) {
|
||||
return request({
|
||||
url: `/api/tbPlussShopStaff/updateStatus`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 叫号记录
|
||||
export function callRecord(params) {
|
||||
return request({
|
||||
url: `/callTable/callRecord`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
export function callTablecall(data) {
|
||||
return request({
|
||||
url: `/callTable/call`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 删除桌型
|
||||
export function callTabledelete(data) {
|
||||
return request({
|
||||
url: `/callTable`,
|
||||
method: "delete",
|
||||
data
|
||||
});
|
||||
}
|
||||
export function callTablepost(data) {
|
||||
return request({
|
||||
url: "/callTable",
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 桌型列表
|
||||
export function callTable(params) {
|
||||
return request({
|
||||
url: `/callTable`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
// 修改桌号
|
||||
export function callTabledataput(data) {
|
||||
return request({
|
||||
url: `/callTable`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 叫号列表
|
||||
export function callTablequeue(params) {
|
||||
return request({
|
||||
url: "/callTable/queue",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
// 取消叫号
|
||||
export function callTableput(data) {
|
||||
return request({
|
||||
url: `/callTable/updateState`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
export function callTabletakeNumber(data) {
|
||||
return request({
|
||||
url: "/callTable/takeNumber",
|
||||
method: "post",
|
||||
data: {
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 叫号配置获取
|
||||
export function callTableconfig(params) {
|
||||
return request({
|
||||
url: "/callTable/config",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
// 叫号配置修改
|
||||
export function callTableconfigput(data) {
|
||||
return request({
|
||||
url: `/callTable/config`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 员工删除
|
||||
* @returns
|
||||
*/
|
||||
export function shopStaffDelete(data) {
|
||||
return request({
|
||||
url: `/api/tbPlussShopStaff`,
|
||||
method: "delete",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
//增减余额
|
||||
export function midfiyAccount(data) {
|
||||
return request({
|
||||
url: `/api/tbShopUser/midfiyAccount`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 编辑用户
|
||||
export function tbShopUseredit(data) {
|
||||
return request({
|
||||
url: `/api/tbShopUser`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
// 通过活动id获取赠送商品列表
|
||||
export function activate(id) {
|
||||
return request({
|
||||
url: `shop/storage/activate/${id}`,
|
||||
method: "get"
|
||||
});
|
||||
}
|
||||
|
||||
// 通过活动id获取赠送商品列表
|
||||
export function queryShopUserFlow(params) {
|
||||
return request({
|
||||
url: `/api/tbShopUser/queryShopUserFlow`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
// 商品列表 V2
|
||||
export function tbProductListV2(data) {
|
||||
return request({
|
||||
url: `/api/tbProduct/list/v2`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 修改商品相关(快捷接口)
|
||||
export function updateProductData(data) {
|
||||
return request({
|
||||
url: `/api/stock/updateProductData`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 商品库存统计列表 统计
|
||||
export function tbProductStockDetailStockCount(data) {
|
||||
return request({
|
||||
url: `/api/tbProductStockDetail/stock/count`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 商品库存记录列表
|
||||
export function tbProductStockDetailStock(data) {
|
||||
return request({
|
||||
url: `/api/tbProductStockDetail/stock`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 商品库存记录列表
|
||||
export function stockWarnLine(data) {
|
||||
return request({
|
||||
url: `/api/stock/warnLine`,
|
||||
method: "PUT",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
|
|
|||
404
src/api/table.js
|
|
@ -1,6 +1,11 @@
|
|||
// 桌台管理
|
||||
import request from "@/utils/request";
|
||||
|
||||
//就餐形式,默认堂食后付费
|
||||
const useType='dine-in-after'
|
||||
function getUseType(){
|
||||
const type=localStorage.getItem("useType")
|
||||
return type?type:useType
|
||||
}
|
||||
/**
|
||||
* 台桌列表
|
||||
* @returns
|
||||
|
|
@ -9,7 +14,10 @@ export function tbShopTableGet(params) {
|
|||
return request({
|
||||
url: `/api/tbShopTable`,
|
||||
method: "get",
|
||||
params
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -118,3 +126,395 @@ export function summaryTableDownload(data) {
|
|||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取当前台桌订单信息
|
||||
* @returns
|
||||
*/
|
||||
export function getCart(params) {
|
||||
return request({
|
||||
url: `/api/place/cart`,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 已上架商品列表
|
||||
* @returns
|
||||
*/
|
||||
export function getGoodsLists(params) {
|
||||
return request({
|
||||
url: `/api/place/activate`,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...params
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 点单
|
||||
* @returns
|
||||
*/
|
||||
export function addCart(data) {
|
||||
return request({
|
||||
url: `/api/place/addCart`,
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空购物车/支付订单
|
||||
* @returns
|
||||
*/
|
||||
export function $clearCart(data) {
|
||||
return request({
|
||||
url: `/api/place/clearCart`,
|
||||
method: "delete",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除购物车某个商品
|
||||
* @returns
|
||||
*/
|
||||
export function $removeCart(data) {
|
||||
return request({
|
||||
url: `/api/place/removeCart`,
|
||||
method: "delete",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 更新规格
|
||||
* @returns
|
||||
*/
|
||||
export function $updateCart(data) {
|
||||
return request({
|
||||
url: `/api/place/updateCart`,
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 批量打包
|
||||
* @returns
|
||||
*/
|
||||
export function $allPack(data) {
|
||||
return request({
|
||||
url: `/api/place/pack`,
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 获取取餐号
|
||||
* @returns
|
||||
*/
|
||||
export function $getMasterId(data) {
|
||||
return request({
|
||||
url: `/api/place/masterId`,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 支付方式获取
|
||||
* @returns
|
||||
*/
|
||||
export function $getPayType(data) {
|
||||
return request({
|
||||
url: `/api/place/payType`,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 创建订单
|
||||
* @returns
|
||||
*/
|
||||
export function $createOrder(data) {
|
||||
return request({
|
||||
url: `/api/place/order`,
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 挂起订单
|
||||
* @returns
|
||||
*/
|
||||
export function $cacheOrder(data) {
|
||||
return request({
|
||||
url: `/api/place/pending`,
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取已挂起订单
|
||||
* @returns
|
||||
*/
|
||||
export function $getCacheOrder(data) {
|
||||
return request({
|
||||
url: `/api/place/pending/cart`,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 会员点单/取消会员点单
|
||||
export function $setUser(data) {
|
||||
return request({
|
||||
url: `/api/place/updateVip`,
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 删除订单
|
||||
export function $delOrder(data) {
|
||||
return request({
|
||||
url: `/api/place/order`,
|
||||
method: "delete",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 支付订单
|
||||
export function $payOrder(data) {
|
||||
return request({
|
||||
url: '/api/place/pay',
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//退单
|
||||
|
||||
export function $returnCart(data) {
|
||||
return request({
|
||||
url: '/api/place/returnCart',
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 选择台桌
|
||||
export function $choseTable(data) {
|
||||
return request({
|
||||
url: '/api/place/choseTable',
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 用餐人数
|
||||
|
||||
export function $choseCount(data) {
|
||||
return request({
|
||||
url: '/api/place/choseCount',
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
useType: getUseType(),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 批量生成台桌
|
||||
export function $fastCreateTable(data) {
|
||||
return request({
|
||||
url: '/api/tbShopTable/generate',
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//打印当前台桌订单
|
||||
export function $printOrder(data) {
|
||||
return request({
|
||||
url: '/api/place/printOrder',
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//打印当前台桌菜品
|
||||
|
||||
export function $printDishes(data) {
|
||||
return request({
|
||||
url: '/api/place/printDishes',
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 就餐模式切换
|
||||
export function $changeUseType(data) {
|
||||
return request({
|
||||
url: '/api/place/choseModel',
|
||||
method: "put",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//店铺订单支付获取链接
|
||||
export function $getOrderPayUrl(data) {
|
||||
return request({
|
||||
url: '/api/shopPayApi/getOrderPayUrl',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//退款
|
||||
export function $returnOrder(data) {
|
||||
return request({
|
||||
url: '/api/place/returnOrder',
|
||||
method: "post",
|
||||
data:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//获取台桌详情状态
|
||||
export function $returnTableDetail(data) {
|
||||
return request({
|
||||
url: '/api/tbShopTable/state',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//获取订单可用优惠券
|
||||
export function $activateByOrderId(data) {
|
||||
return request({
|
||||
url: '/api/tbShopCoupon/activateByOrderId',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//会员积分列表
|
||||
export function $returnMemberPointsList(data) {
|
||||
return request({
|
||||
url: '/api/points/member-points/page',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 会员积分账户信息
|
||||
export function $returnMemberPoints(memberId) {
|
||||
return request({
|
||||
url: '/api/points/member-points/'+memberId,
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
//002-获取订单可用积分及抵扣金额(支付页面使用)
|
||||
export function $calcUsablePoints(data) {
|
||||
return request({
|
||||
url: '/api/points/member-points/calc-usable-points',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
// 003-根据积分计算可抵扣金额
|
||||
export function $calcDeDuctionPoints(data) {
|
||||
return request({
|
||||
url: '/api/points/member-points/calc-deduction-amount',
|
||||
method: "get",
|
||||
params:{
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
import $api from './class-api'
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const $version = new $api('/api/tbVersion')
|
||||
/**
|
||||
* 修改当前选中 版本
|
||||
* @returns
|
||||
*/
|
||||
export function $upSel(data) {
|
||||
return request({
|
||||
url: 'api/tbVersion/upSel',
|
||||
method: "put",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传版本文件
|
||||
* @returns
|
||||
*/
|
||||
export function $uploadVersionFile(file, par) {
|
||||
var data = new FormData()
|
||||
data.append('file', file)
|
||||
for(let i in par){
|
||||
if(i!=='file'){
|
||||
data.append(i, par[i])
|
||||
}
|
||||
}
|
||||
return request({
|
||||
url: 'api/qiNiuContent/uploadVersionFile',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 修改当前选中 版本
|
||||
* @returns
|
||||
*/
|
||||
export function $getCredentials(data) {
|
||||
return request({
|
||||
url: 'api/qiNiuContent/getCredentials',
|
||||
method: "get",
|
||||
data: {
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...data
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 919 B |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 877 B |
|
After Width: | Height: | Size: 412 B |
|
After Width: | Height: | Size: 99 KiB |
|
|
@ -6,7 +6,7 @@
|
|||
/* theme color */
|
||||
$--color-primary: #1890ff;
|
||||
$--color-success: #13ce66;
|
||||
$--color-warning: #FFBA00;
|
||||
$--color-warning: #ffba00;
|
||||
$--color-danger: #ff4949;
|
||||
// $--color-info: #1E1E1E;
|
||||
|
||||
|
|
@ -17,10 +17,10 @@ $--button-font-weight: 400;
|
|||
$--border-color-light: #dfe4ed;
|
||||
$--border-color-lighter: #e6ebf5;
|
||||
|
||||
$--table-border:1px solid#dfe6ec;
|
||||
$--table-border: 1px solid#dfe6ec;
|
||||
|
||||
/* icon font path, required */
|
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
||||
$--font-path: "~element-ui/lib/theme-chalk/fonts";
|
||||
|
||||
@import "../../../node_modules/element-ui/packages/theme-chalk/src/index";
|
||||
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@
|
|||
height: 100%;
|
||||
position: fixed;
|
||||
font-size: 0;
|
||||
top: 0;
|
||||
top: 60px;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1001;
|
||||
|
|
@ -159,7 +159,7 @@
|
|||
height: 100%;
|
||||
}
|
||||
#app .sidebar-container.has-logo .el-scrollbar {
|
||||
height: calc(100% - 50px);
|
||||
height: calc(100% - 110px);
|
||||
}
|
||||
#app .sidebar-container .is-horizontal {
|
||||
display: none;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
height: 100%;
|
||||
position: fixed;
|
||||
font-size: 0;
|
||||
top: 0;
|
||||
top: 60px;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1001;
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
&.has-logo {
|
||||
.el-scrollbar {
|
||||
height: calc(100% - 50px);
|
||||
height: calc(100% - 110px);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,384 @@
|
|||
.u-relative,
|
||||
.u-rela,
|
||||
.relative {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.u-absolute,
|
||||
.u-abso,
|
||||
.absolute {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.u-fixed,
|
||||
.u-fix {
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
// nvue不能用标签命名样式,不能放在微信组件中,否则微信开发工具会报警告,无法使用标签名当做选择器
|
||||
/* #ifndef APP-NVUE */
|
||||
image {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
// 在weex,也即nvue中,所有元素默认为border-box
|
||||
view,
|
||||
text {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* #endif */
|
||||
|
||||
.u-font-xs {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.u-font-sm {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.u-font-md {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.u-font-lg {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.u-font-xl {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.u-flex {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.u-flex-wrap {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.u-flex-nowrap {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.free-price {
|
||||
text-decoration: line-through;
|
||||
color: #999;
|
||||
}
|
||||
.cur-pointer{
|
||||
cursor: pointer;
|
||||
}
|
||||
.u-col-center {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.u-col-top {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.u-col-bottom {
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
.u-row-center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.u-row-left {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.u-row-right {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.u-row-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.u-row-around {
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.u-text-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.u-text-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.u-text-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.u-flex-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
// 定义flex等分
|
||||
@for $i from 0 through 12 {
|
||||
.u-flex-#{$i} {
|
||||
flex: $i;
|
||||
}
|
||||
}
|
||||
|
||||
// 定义字体(px)单位,小于20都为px单位字体
|
||||
@for $i from 9 to 20 {
|
||||
.u-font-#{$i} {
|
||||
font-size: $i + px;
|
||||
}
|
||||
}
|
||||
|
||||
// 定义字体(rpx)单位,大于或等于20的都为rpx单位字体
|
||||
@for $i from 20 through 40 {
|
||||
.u-font-#{$i} {
|
||||
font-size: $i + px;
|
||||
}
|
||||
}
|
||||
|
||||
// 定义内外边距,历遍1-80
|
||||
@for $i from 0 through 80 {
|
||||
|
||||
// 只要双数和能被5除尽的数
|
||||
@if $i % 2==0 or $i % 5==0 {
|
||||
|
||||
// 得出:u-margin-30或者u-m-30
|
||||
.u-margin-#{$i},
|
||||
.u-m-#{$i} {
|
||||
margin: $i + px !important;
|
||||
}
|
||||
|
||||
// 得出:u-padding-30或者u-p-30
|
||||
.u-padding-#{$i},
|
||||
.u-p-#{$i} {
|
||||
padding: $i + px !important;
|
||||
}
|
||||
|
||||
@each $short, $long in l left, t top, r right, b bottom {
|
||||
|
||||
// 缩写版,结果如: u-m-l-30
|
||||
// 定义外边距
|
||||
.u-m-#{$short}-#{$i} {
|
||||
margin-#{$long}: $i + px !important;
|
||||
}
|
||||
|
||||
// 定义内边距
|
||||
.u-p-#{$short}-#{$i} {
|
||||
padding-#{$long}: $i + px !important;
|
||||
}
|
||||
|
||||
// 完整版,结果如:u-margin-left-30
|
||||
// 定义外边距
|
||||
.u-margin-#{$long}-#{$i} {
|
||||
margin-#{$long}: $i + px !important;
|
||||
}
|
||||
|
||||
// 定义内边距
|
||||
.u-padding-#{$long}-#{$i} {
|
||||
padding-#{$long}: $i + px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 重置nvue的默认关于flex的样式
|
||||
.u-reset-nvue {
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* start--文本行数限制--start */
|
||||
.u-line-1 {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.u-line-2 {
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
|
||||
.u-line-3 {
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
|
||||
.u-line-4 {
|
||||
-webkit-line-clamp: 4;
|
||||
}
|
||||
|
||||
.u-line-5 {
|
||||
-webkit-line-clamp: 5;
|
||||
}
|
||||
|
||||
.u-line-2,
|
||||
.u-line-3,
|
||||
.u-line-4,
|
||||
.u-line-5 {
|
||||
overflow: hidden;
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box; // 弹性伸缩盒
|
||||
-webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式
|
||||
}
|
||||
|
||||
/* end--文本行数限制--end */
|
||||
|
||||
|
||||
/* start--不同颜色文字--start */
|
||||
.color-333 {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.color-666 {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.color-999 {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.color-red {
|
||||
color: rgb(250, 85, 85);
|
||||
}
|
||||
|
||||
|
||||
/* end--不同颜色文字--end */
|
||||
|
||||
.tranistion {
|
||||
transition: all .3s ease-in-out;
|
||||
}
|
||||
|
||||
.tranistion-1 {
|
||||
transition: all .1s ease-in-out;
|
||||
}
|
||||
|
||||
.tranistion-2 {
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
.font-bold {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.font-600 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.bg-gray {
|
||||
background-color: #F9F9F9;
|
||||
}
|
||||
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.gap-10 {
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.gap-20 {
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.color-aaa {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.color-000 {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.color-fff {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.bg-fff {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.bg-gray {
|
||||
background-color: #F9F9F9;
|
||||
}
|
||||
|
||||
.overflow-hide {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.no-wrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.border-r-12 {
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.border-r-18 {
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.border-top {
|
||||
border-top: 1px solid #E5E5E5;
|
||||
}
|
||||
|
||||
.border-bottom {
|
||||
border-bottom: 1px solid #E5E5E5;
|
||||
}
|
||||
|
||||
.scale7 {
|
||||
transform: scale(0.7);
|
||||
}
|
||||
|
||||
.position-all {
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.lh16 {
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.default-box-padding {
|
||||
padding: 16px 14px;
|
||||
}
|
||||
|
||||
.zIndex-999 {
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.icon-default-size {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
.filter-gray {
|
||||
filter: grayscale(1);
|
||||
}
|
||||
.youhui-tips.el-tooltip__popper {
|
||||
background: #fff;
|
||||
min-width: 150px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ebeef5 !important;
|
||||
padding: 12px;
|
||||
color: #606266;
|
||||
line-height: 1.4;
|
||||
text-align: justify;
|
||||
font-size: 14px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
word-break: break-all;
|
||||
}
|
||||
.youhui-tips.el-tooltip__popper[x-placement^="top"] .popper__arrow:after,
|
||||
.youhui-tips.el-tooltip__popper[x-placement^="top"] .popper__arrow {
|
||||
border-top-color: #fff;
|
||||
}
|
||||
|
|
@ -9,15 +9,15 @@ $yellow: #fec171;
|
|||
$panGreen: #30b08f;
|
||||
|
||||
// sidebar
|
||||
$menuText: #bfcbd9;
|
||||
$menuText: #999;
|
||||
$menuActiveText: #409eff;
|
||||
$subMenuActiveText: #f4f4f5; // https://github.com/ElemeFE/element/issues/12951
|
||||
$subMenuActiveText: #555; // https://github.com/ElemeFE/element/issues/12951
|
||||
|
||||
$menuBg: #333;
|
||||
$menuHover: #444;
|
||||
$menuBg: #fff;
|
||||
$menuHover: rgba(121, 145, 188, 0.18);
|
||||
|
||||
$subMenuBg: #444;
|
||||
$subMenuHover: #555;
|
||||
$subMenuBg: #fff;
|
||||
$subMenuHover: rgba(121, 145, 188, 0.18);
|
||||
|
||||
$sideBarWidth: 205px;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
<template>
|
||||
<el-breadcrumb class="app-breadcrumb" separator="/">
|
||||
<transition-group name="breadcrumb">
|
||||
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
|
||||
<span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
|
||||
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
|
||||
<span v-if="item.redirect === 'noredirect' || index == levelList.length - 1" class="no-redirect">{{
|
||||
item.meta.title
|
||||
}}</span>
|
||||
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
|
||||
</el-breadcrumb-item>
|
||||
</transition-group>
|
||||
|
|
@ -37,7 +39,7 @@ export default {
|
|||
const first = matched[0]
|
||||
|
||||
if (!this.isDashboard(first)) {
|
||||
matched = [{ path: '/dashboard', meta: { title: '首页' }}].concat(matched)
|
||||
matched = [{ path: '/', meta: { title: '首页' } }].concat(matched)
|
||||
}
|
||||
|
||||
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
|
||||
|
|
@ -73,6 +75,7 @@ export default {
|
|||
font-size: 14px;
|
||||
line-height: 50px;
|
||||
margin-left: 8px;
|
||||
|
||||
.no-redirect {
|
||||
color: #97a8be;
|
||||
cursor: text;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,175 @@
|
|||
<template>
|
||||
<el-dialog title="选择优惠劵" top="5vh" :visible.sync="dialogVisible">
|
||||
<div class="head-container">
|
||||
<el-table ref="table" :data="tableData.list" height="500" v-loading="tableData.loading">
|
||||
<!-- <el-table-column type="selection" width="55" align="center" v-if="!radio"></el-table-column> -->
|
||||
<el-table-column label="名称" prop="title" />
|
||||
<el-table-column label="使用门槛">
|
||||
<template v-slot="scope">
|
||||
{{ `满${scope.row.fullAmount}${scope.row.discountAmount ? '减' + scope.row.discountAmount + '元' :
|
||||
''}` }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="总发放数量" prop="number" />
|
||||
<el-table-column label="已使用" prop="useNumber" />
|
||||
<el-table-column label="剩余" prop="leftNumber" />
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="primary" @click="selectHandle(scope.row)">选择</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
|
||||
@current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
<span slot="footer" class="dialog-footer" v-if="!radio">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="confirmHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getTbShopCoupon, delTbShopCoupon } from '@/api/coupon'
|
||||
export default {
|
||||
props: {
|
||||
// 是否为单选
|
||||
radio: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
searhForm: {
|
||||
name: '',
|
||||
category: ''
|
||||
},
|
||||
categoryList: [],
|
||||
tableData: {
|
||||
page: 0,
|
||||
size: 10,
|
||||
total: 0,
|
||||
loading: false,
|
||||
list: []
|
||||
},
|
||||
goods: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 单选商品
|
||||
selectHandle(row) {
|
||||
this.$emit('success', [{ ...row }])
|
||||
this.close()
|
||||
},
|
||||
// 确定选商品
|
||||
confirmHandle() {
|
||||
let res = this.$refs.table.selection
|
||||
this.$emit('success', res)
|
||||
this.close()
|
||||
},
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.searhForm.name = ''
|
||||
this.searhForm.category = ''
|
||||
this.tableData.page = 0
|
||||
this.tableData.size = 10
|
||||
this.tableData.list = []
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e - 1
|
||||
this.getTableData()
|
||||
},
|
||||
// 商品列表
|
||||
async getTableData() {
|
||||
this.tableData.loading = true
|
||||
try {
|
||||
const res = await getTbShopCoupon({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
name: this.searhForm.name,
|
||||
categoryId: this.searhForm.category,
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
sort: 'id',
|
||||
})
|
||||
this.tableData.list = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
|
||||
if (this.goods.length) {
|
||||
this.$nextTick(() => {
|
||||
this.selection()
|
||||
})
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.tableData.loading = false
|
||||
}, 500);
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
// 商品分类
|
||||
async tbShopCategoryGet() {
|
||||
try {
|
||||
const res = await getTbShopCoupon({
|
||||
page: 0,
|
||||
size: 100,
|
||||
sort: 'id',
|
||||
shopId: localStorage.getItem('shopId')
|
||||
})
|
||||
this.categoryList = res.content
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
async show(goods, categoryId) {
|
||||
this.dialogVisible = true
|
||||
if (goods && goods.length) {
|
||||
this.goods = goods
|
||||
} else {
|
||||
this.goods = []
|
||||
}
|
||||
this.resetHandle()
|
||||
|
||||
console.log(categoryId);
|
||||
|
||||
if (categoryId) {
|
||||
this.searhForm.category = categoryId
|
||||
}
|
||||
|
||||
console.log(this.searhForm);
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
selection() {
|
||||
this.goods.forEach(row => {
|
||||
this.tableData.list.forEach((item, index) => {
|
||||
if (row.id == item.id) {
|
||||
this.$refs.table.toggleRowSelection(this.tableData.list[index]);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.shop_info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
span {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
<template>
|
||||
<el-dialog title="选择商品" :visible.sync="dialogVisible" @open="resetHandle()">
|
||||
<el-dialog title="选择商品" top="5vh" :visible.sync="dialogVisible">
|
||||
<el-form :model="searhForm" inline>
|
||||
<el-form-item>
|
||||
<el-input v-model="searhForm.name" placeholder="商品名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="searhForm.category" placeholder="商品分类">
|
||||
<el-select v-model="searhForm.category" placeholder="商品分类" :disabled="disableCategory">
|
||||
<el-option :label="item.name" :value="item.id" v-for="item in categoryList"
|
||||
:key="item.id"></el-option>
|
||||
</el-select>
|
||||
|
|
@ -16,8 +16,8 @@
|
|||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="head-container">
|
||||
<el-table ref="table" :data="tableData.list" v-loading="tableData.loading">
|
||||
<el-table-column type="selection" width="55" align="center"></el-table-column>
|
||||
<el-table ref="table" :data="tableData.list" height="500" v-loading="tableData.loading">
|
||||
<el-table-column type="selection" width="55" align="center" v-if="!radio"></el-table-column>
|
||||
<el-table-column label="商品信息">
|
||||
<template v-slot="scope">
|
||||
<div class="shop_info">
|
||||
|
|
@ -36,11 +36,11 @@
|
|||
</template>
|
||||
</el-table-column> <el-table-column label="是否售罄">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.isPauseSale == 1?'是':'否' }}
|
||||
{{ scope.row.isPauseSale == 1 ? '是' : '否' }}
|
||||
</template>
|
||||
</el-table-column> <el-table-column label="是否分销">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.isDistribute == 1?'是':'否' }}
|
||||
{{ scope.row.isDistribute == 1 ? '是' : '否' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="售价">
|
||||
|
|
@ -54,12 +54,17 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="分类名称" prop="categoryName"></el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="primary" @click="selectHandle(scope.row)">选择</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
|
||||
@current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<span slot="footer" class="dialog-footer" v-if="!radio">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="confirmHandle">确 定</el-button>
|
||||
</span>
|
||||
|
|
@ -69,6 +74,18 @@
|
|||
<script>
|
||||
import { tbShopCategoryGet, tbProduct } from "@/api/shop";
|
||||
export default {
|
||||
props: {
|
||||
// 是否禁用分类
|
||||
disableCategory: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 是否为单选
|
||||
radio: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
|
|
@ -88,6 +105,11 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
// 单选商品
|
||||
selectHandle(row) {
|
||||
this.$emit('success', [{ ...row }])
|
||||
this.close()
|
||||
},
|
||||
// 确定选商品
|
||||
confirmHandle() {
|
||||
let res = this.$refs.table.selection
|
||||
|
|
@ -154,7 +176,7 @@ export default {
|
|||
console.log(error)
|
||||
}
|
||||
},
|
||||
show(goods) {
|
||||
async show(goods, categoryId) {
|
||||
this.dialogVisible = true
|
||||
if (goods && goods.length) {
|
||||
this.goods = goods
|
||||
|
|
@ -162,8 +184,18 @@ export default {
|
|||
this.goods = []
|
||||
}
|
||||
this.resetHandle()
|
||||
this.tbShopCategoryGet()
|
||||
this.getTableData()
|
||||
|
||||
console.log(categoryId);
|
||||
|
||||
if (categoryId) {
|
||||
this.searhForm.category = categoryId
|
||||
}
|
||||
|
||||
console.log(this.searhForm);
|
||||
|
||||
|
||||
await this.tbShopCategoryGet()
|
||||
await this.getTableData()
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export default {
|
|||
dialogImageUrl: '',
|
||||
dialogVisible: false,
|
||||
fileList: [],
|
||||
files: [],
|
||||
// files: [],
|
||||
headers: {
|
||||
'Authorization': getToken()
|
||||
}
|
||||
|
|
@ -45,7 +45,13 @@ export default {
|
|||
methods: {
|
||||
handleSuccess(response, file, fileList) {
|
||||
// console.log('上传成功', response)
|
||||
this.files = response.data
|
||||
setTimeout(() => {
|
||||
this.fileList.push({
|
||||
url: response.data[0],
|
||||
id: response.data.id
|
||||
})
|
||||
}, 100);
|
||||
// this.files = response.data
|
||||
this.$emit('success', response.data)
|
||||
},
|
||||
// 监听上传失败
|
||||
|
|
@ -69,6 +75,9 @@ export default {
|
|||
},
|
||||
handleRemove(file, fileList) {
|
||||
let arr = fileList.map(item => item.url)
|
||||
// 删除数据
|
||||
let index = this.fileList.findIndex(ele => ele.url == file.url)
|
||||
this.fileList.splice(index, 1);
|
||||
this.$emit('remove', arr)
|
||||
},
|
||||
clearFiles() {
|
||||
|
|
@ -76,4 +85,11 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
<style>
|
||||
.el-upload-list__item {
|
||||
|
||||
transition: none;
|
||||
|
||||
}
|
||||
</style>
|
||||
|
|
@ -38,7 +38,7 @@ export default {
|
|||
}
|
||||
|
||||
.fixed-header+.app-main {
|
||||
padding-top: 50px;
|
||||
padding-top: 140px;
|
||||
}
|
||||
|
||||
.hasTagsView {
|
||||
|
|
@ -48,7 +48,7 @@ export default {
|
|||
}
|
||||
|
||||
.fixed-header+.app-main {
|
||||
padding-top: 84px;
|
||||
padding-top: 140px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -16,31 +16,62 @@
|
|||
<size-select id="size-select" class="right-menu-item hover-effect" />
|
||||
</el-tooltip>
|
||||
</template> -->
|
||||
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
|
||||
<!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
|
||||
<div class="avatar-wrapper">
|
||||
<img :src="logo || Avatar" class="user-avatar">
|
||||
<!-- <i class="el-icon-caret-bottom" /> -->
|
||||
<i class="el-icon-caret-bottom" />
|
||||
<span class="shop_name">{{ shopName }}</span>
|
||||
</div>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<!-- <span style="display:block;" @click="show = true">
|
||||
<span style="display:block;" @click="show = true">
|
||||
<el-dropdown-item>
|
||||
布局设置
|
||||
</el-dropdown-item>
|
||||
</span> -->
|
||||
</span>
|
||||
<router-link to="/shop/shop/shop_configuration">
|
||||
<el-dropdown-item>
|
||||
个人中心
|
||||
</el-dropdown-item>
|
||||
</router-link>
|
||||
<span @click="dialogVisible = true">
|
||||
<el-dropdown-item>
|
||||
修改密码
|
||||
</el-dropdown-item>
|
||||
</span>
|
||||
<span style="display:block;" @click="open">
|
||||
<el-dropdown-item divided>
|
||||
退出登录
|
||||
</el-dropdown-item>
|
||||
</span>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</el-dropdown> -->
|
||||
</div>
|
||||
<el-dialog title="修改密码" modal-append-to-body append-to-body :visible.sync="dialogVisible" width="400px">
|
||||
<el-form ref="form" :model="form" :rules="rules">
|
||||
<el-form-item label="旧密码" prop="oldPass">
|
||||
<el-input :type="ip1Type" v-model="form.oldPass" placeholder="请输入旧密码">
|
||||
<i slot="suffix" :class="`el-input__icon ${ip1Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip1Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" prop="newPass">
|
||||
<el-input :type="ip2Type" v-model="form.newPass" placeholder="请输入新密码">
|
||||
<i slot="suffix" :class="`el-input__icon ${ip2Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip2Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认新密码" prop="rnewPass">
|
||||
<el-input :type="ip3Type" v-model="form.rnewPass" placeholder="请再次输入新密码">
|
||||
<i slot="suffix" :class="`el-input__icon ${ip3Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip3Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="formLoading" @click="submitHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
@ -53,6 +84,8 @@ import Screenfull from '@/components/Screenfull'
|
|||
import SizeSelect from '@/components/SizeSelect'
|
||||
import Search from '@/components/HeaderSearch'
|
||||
import Avatar from '@/assets/images/avatar.png'
|
||||
import { updatePass } from '@/api/login.js'
|
||||
import { encrypt } from '@/utils/rsaEncrypt'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
|
@ -64,11 +97,61 @@ export default {
|
|||
Doc
|
||||
},
|
||||
data() {
|
||||
const validateNewPass = (rule, value, callback) => {
|
||||
if (!this.form.newPass) {
|
||||
callback(new Error(' '))
|
||||
} else if (this.form.newPass === this.form.oldPass) {
|
||||
callback(new Error('请输入与旧密码不同的新密码'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const validateRnewPass = (rule, value, callback) => {
|
||||
if (!this.form.rnewPass) {
|
||||
callback(new Error(' '))
|
||||
} else if (this.form.rnewPass !== this.form.newPass) {
|
||||
callback(new Error('两次密码输入不一致'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
Avatar: Avatar,
|
||||
dialogVisible: false,
|
||||
logo: localStorage.getItem('logo'),
|
||||
shopName: localStorage.getItem('shopName')
|
||||
shopName: localStorage.getItem('shopName'),
|
||||
ip1Type: 'password',
|
||||
ip2Type: 'password',
|
||||
ip3Type: 'password',
|
||||
formLoading: false,
|
||||
form: {
|
||||
oldPass: '',
|
||||
newPass: '',
|
||||
rnewPass: ''
|
||||
},
|
||||
rules: {
|
||||
oldPass: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
newPass: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateNewPass,
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
rnewPass: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateRnewPass,
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -91,6 +174,36 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
// 修改密码框类型
|
||||
changeInputType(key) {
|
||||
if (this[key] == 'text') {
|
||||
this[key] = 'password'
|
||||
} else {
|
||||
this[key] = 'text'
|
||||
}
|
||||
},
|
||||
// 提交修改密码
|
||||
submitHandle() {
|
||||
this.$refs.form.validate(async vaild => {
|
||||
if (vaild) {
|
||||
try {
|
||||
this.formLoading = true
|
||||
const res = await updatePass({
|
||||
loginType: localStorage.getItem('loginType'),
|
||||
oldPass: encrypt(this.form.oldPass),
|
||||
newPass: this.form.newPass
|
||||
})
|
||||
this.$notify.success('修改成功,请重新登陆')
|
||||
setTimeout(() => {
|
||||
this.logout()
|
||||
}, 1000)
|
||||
} catch (error) {
|
||||
this.formLoading = false
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
toggleSideBar() {
|
||||
this.$store.dispatch('app/toggleSideBar')
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,20 +1,22 @@
|
|||
<template>
|
||||
<div class="sidebar-logo-container" :class="{'collapse':collapse}">
|
||||
<div class="sidebar-logo-container" :class="{ 'collapse': collapse }">
|
||||
<transition name="sidebarLogoFade">
|
||||
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
|
||||
<img v-if="logo" :src="logo" class="sidebar-logo">
|
||||
<h1 v-else class="sidebar-title">{{ title }} </h1>
|
||||
</router-link>
|
||||
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
|
||||
<img v-if="logo" :src="logo" class="sidebar-logo">
|
||||
<h1 class="sidebar-title">{{ title }} </h1>
|
||||
</router-link>
|
||||
<div v-if="collapse" key="collapse" class="sidebar-logo-link">
|
||||
<img v-if="logo" :src="logo || Avatar" class="sidebar-logo">
|
||||
<h1 v-else class="sidebar-title">{{ shopName }} </h1>
|
||||
<i class="el-icon-arrow-down icon"></i>
|
||||
</div>
|
||||
<div v-else key="expand" class="sidebar-logo-link">
|
||||
<img v-if="logo" :src="logo || Avatar" class="sidebar-logo">
|
||||
<h1 class="sidebar-title">{{ shopName }} </h1>
|
||||
<i class="el-icon-arrow-down icon"></i>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Logo from '@/assets/images/logo.png'
|
||||
import Avatar from '@/assets/images/avatar.png'
|
||||
export default {
|
||||
name: 'SidebarLogo',
|
||||
props: {
|
||||
|
|
@ -25,8 +27,9 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
title: '收银机管理端',
|
||||
logo: Logo
|
||||
shopName: localStorage.getItem('shopName'),
|
||||
Avatar,
|
||||
logo: localStorage.getItem('logo'),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -42,6 +45,13 @@ export default {
|
|||
opacity: 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
width: 100px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sidebar-logo-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
|
@ -53,23 +63,25 @@ export default {
|
|||
& .sidebar-logo-link {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
.icon {
|
||||
font-size: 14px;
|
||||
margin-left: 6px;
|
||||
}
|
||||
|
||||
& .sidebar-logo {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
vertical-align: middle;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 50%;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
& .sidebar-title {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
line-height: 50px;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -77,6 +89,11 @@ export default {
|
|||
.sidebar-logo {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.sidebar-logo {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1,24 +1,17 @@
|
|||
<template>
|
||||
<div id="tags-view-container" class="tags-view-container">
|
||||
<scroll-pane ref="scrollPane" class="tags-view-wrapper">
|
||||
<router-link
|
||||
v-for="tag in visitedViews"
|
||||
ref="tag"
|
||||
:key="tag.path"
|
||||
:class="isActive(tag)?'active':''"
|
||||
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
|
||||
tag="span"
|
||||
class="tags-view-item"
|
||||
@click.middle.native="closeSelectedTag(tag)"
|
||||
@contextmenu.prevent.native="openMenu(tag,$event)"
|
||||
>
|
||||
<router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''"
|
||||
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
|
||||
@click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
|
||||
@contextmenu.prevent.native="openMenu(tag, $event)">
|
||||
{{ tag.title }}
|
||||
<span v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
|
||||
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
|
||||
</router-link>
|
||||
</scroll-pane>
|
||||
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
|
||||
<ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
|
||||
<li @click="refreshSelectedTag(selectedTag)">刷新</li>
|
||||
<li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">关闭</li>
|
||||
<li v-if="!(selectedTag.meta && selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">关闭</li>
|
||||
<li @click="closeOthersTags">关闭其他</li>
|
||||
<li @click="closeAllTags(selectedTag)">关闭全部</li>
|
||||
</ul>
|
||||
|
|
@ -66,6 +59,9 @@ export default {
|
|||
this.addTags()
|
||||
},
|
||||
methods: {
|
||||
isAffix(tag) {
|
||||
return tag.meta && tag.meta.affix
|
||||
},
|
||||
isActive(route) {
|
||||
return route.path === this.$route.path
|
||||
},
|
||||
|
|
@ -168,6 +164,7 @@ export default {
|
|||
}
|
||||
},
|
||||
openMenu(tag, e) {
|
||||
console.log(11111)
|
||||
const menuMinWidth = 105
|
||||
const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
|
||||
const offsetWidth = this.$el.offsetWidth // container width
|
||||
|
|
@ -198,6 +195,7 @@ export default {
|
|||
background: #fff;
|
||||
border-bottom: 1px solid #d8dce5;
|
||||
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
|
||||
|
||||
.tags-view-wrapper {
|
||||
.tags-view-item {
|
||||
display: inline-block;
|
||||
|
|
@ -212,29 +210,34 @@ export default {
|
|||
font-size: 12px;
|
||||
margin-left: 5px;
|
||||
margin-top: 4px;
|
||||
|
||||
&:first-of-type {
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
&:last-of-type {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: #42b983;
|
||||
background: #7991BC;
|
||||
color: #fff;
|
||||
border-color: #42b983;
|
||||
&::before {
|
||||
content: '';
|
||||
background: #fff;
|
||||
display: inline-block;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
// &::before {
|
||||
// content: '';
|
||||
// background: #fff;
|
||||
// display: inline-block;
|
||||
// width: 8px;
|
||||
// height: 8px;
|
||||
// border-radius: 50%;
|
||||
// position: relative;
|
||||
// margin-right: 2px;
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.contextmenu {
|
||||
margin: 0;
|
||||
background: #fff;
|
||||
|
|
@ -247,10 +250,12 @@ export default {
|
|||
font-weight: 400;
|
||||
color: #333;
|
||||
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
|
||||
|
||||
li {
|
||||
margin: 0;
|
||||
padding: 7px 16px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: #eee;
|
||||
}
|
||||
|
|
@ -271,11 +276,13 @@ export default {
|
|||
text-align: center;
|
||||
transition: all .3s cubic-bezier(.645, .045, .355, 1);
|
||||
transform-origin: 100% 50%;
|
||||
|
||||
&:before {
|
||||
transform: scale(.6);
|
||||
display: inline-block;
|
||||
vertical-align: -3px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #b4bccc;
|
||||
color: #fff;
|
||||
|
|
|
|||
|
|
@ -1,19 +1,109 @@
|
|||
<template>
|
||||
<div :class="classObj" class="app-wrapper">
|
||||
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
|
||||
<sidebar class="sidebar-container" />
|
||||
<div :class="{hasTagsView:needTagsView}" class="main-container">
|
||||
<div :class="{'fixed-header':fixedHeader}">
|
||||
<navbar />
|
||||
<tags-view v-if="needTagsView" />
|
||||
<div class="top_container">
|
||||
<div class="content">
|
||||
<div class="logo">
|
||||
<img class="img" src="@/assets/images/default_logo.png" />
|
||||
</div>
|
||||
<div class="right-menu">
|
||||
<template v-if="device !== 'mobile'">
|
||||
<!-- <search id="header-search" class="right-menu-item" />
|
||||
<el-tooltip content="项目文档" effect="dark" placement="bottom">
|
||||
<Doc class="right-menu-item hover-effect" />
|
||||
</el-tooltip>
|
||||
<el-tooltip content="全屏缩放" effect="dark" placement="bottom">
|
||||
<screenfull id="screenfull" class="right-menu-item hover-effect" />
|
||||
</el-tooltip>
|
||||
<el-tooltip content="布局设置" effect="dark" placement="bottom">
|
||||
<size-select id="size-select" class="right-menu-item hover-effect" />
|
||||
</el-tooltip> -->
|
||||
|
||||
<i class="left_icon el-icon-search" />
|
||||
<i class="left_icon el-icon-warning-outline" />
|
||||
<i class="left_icon el-icon-bell" />
|
||||
</template>
|
||||
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
|
||||
<div class="avatar-wrapper">
|
||||
<img :src="logo || Avatar" class="user-avatar">
|
||||
<span class="shop_name">{{ shopName }}</span>
|
||||
<i class="el-icon-caret-bottom" />
|
||||
</div>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<!-- <span style="display:block;" @click="show = true">
|
||||
<el-dropdown-item>
|
||||
布局设置
|
||||
</el-dropdown-item>
|
||||
</span> -->
|
||||
<router-link to="/shop/shop/shop_configuration">
|
||||
<el-dropdown-item>
|
||||
店铺配置
|
||||
</el-dropdown-item>
|
||||
</router-link>
|
||||
<span @click="dialogVisible = true">
|
||||
<el-dropdown-item>
|
||||
修改密码
|
||||
</el-dropdown-item>
|
||||
</span>
|
||||
<span style="display:block;" @click="open">
|
||||
<el-dropdown-item divided>
|
||||
退出登录
|
||||
</el-dropdown-item>
|
||||
</span>
|
||||
<!-- <span style="display:block;" @click="goFullScreen">
|
||||
<el-dropdown-item divided>
|
||||
全屏
|
||||
</el-dropdown-item>
|
||||
</span> -->
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</div>
|
||||
</div>
|
||||
<app-main />
|
||||
<right-panel v-if="showSettings">
|
||||
<settings />
|
||||
</right-panel>
|
||||
<el-dialog title="修改密码" modal-append-to-body append-to-body :visible.sync="dialogVisible" width="400px">
|
||||
<el-form ref="form" :model="form" :rules="rules">
|
||||
<el-form-item label="旧密码" prop="oldPass">
|
||||
<el-input :type="ip1Type" v-model="form.oldPass" placeholder="请输入旧密码">
|
||||
<i slot="suffix"
|
||||
:class="`el-input__icon ${ip1Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip1Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" prop="newPass">
|
||||
<el-input :type="ip2Type" v-model="form.newPass" placeholder="请输入新密码">
|
||||
<i slot="suffix"
|
||||
:class="`el-input__icon ${ip2Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip2Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认新密码" prop="rnewPass">
|
||||
<el-input :type="ip3Type" v-model="form.rnewPass" placeholder="请再次输入新密码">
|
||||
<i slot="suffix"
|
||||
:class="`el-input__icon ${ip3Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
|
||||
@click.stop="changeInputType('ip3Type')"></i>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="formLoading" @click="submitHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
<div>
|
||||
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
|
||||
<sidebar class="sidebar-container" />
|
||||
<div :class="{ hasTagsView: needTagsView }" class="main-container">
|
||||
<div :class="{ 'fixed-header': fixedHeader }">
|
||||
<navbar />
|
||||
<tags-view v-if="needTagsView" />
|
||||
</div>
|
||||
<app-main />
|
||||
<right-panel v-if="showSettings">
|
||||
<settings />
|
||||
</right-panel>
|
||||
</div>
|
||||
<!-- 防止刷新后主题丢失 -->
|
||||
<Theme v-show="false" ref="theme" />
|
||||
</div>
|
||||
<!-- 防止刷新后主题丢失 -->
|
||||
<Theme v-show="false" ref="theme" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
@ -21,9 +111,12 @@
|
|||
import RightPanel from '@/components/RightPanel'
|
||||
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
|
||||
import ResizeMixin from './mixin/ResizeHandler'
|
||||
import { mapState } from 'vuex'
|
||||
import { mapState, mapGetters } from 'vuex'
|
||||
import Theme from '@/components/ThemePicker'
|
||||
import Cookies from 'js-cookie'
|
||||
import Avatar from '@/assets/images/avatar.png'
|
||||
import { updatePass } from '@/api/login.js'
|
||||
import { encrypt } from '@/utils/rsaEncrypt'
|
||||
export default {
|
||||
name: 'Layout',
|
||||
components: {
|
||||
|
|
@ -36,6 +129,64 @@ export default {
|
|||
Theme
|
||||
},
|
||||
mixins: [ResizeMixin],
|
||||
data() {
|
||||
const validateNewPass = (rule, value, callback) => {
|
||||
if (!this.form.newPass) {
|
||||
callback(new Error(' '))
|
||||
} else if (this.form.newPass === this.form.oldPass) {
|
||||
callback(new Error('请输入与旧密码不同的新密码'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const validateRnewPass = (rule, value, callback) => {
|
||||
if (!this.form.rnewPass) {
|
||||
callback(new Error(' '))
|
||||
} else if (this.form.rnewPass !== this.form.newPass) {
|
||||
callback(new Error('两次密码输入不一致'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
dialogVisible: false,
|
||||
Avatar: Avatar,
|
||||
logo: localStorage.getItem('logo'),
|
||||
shopName: localStorage.getItem('shopName'),
|
||||
ip1Type: 'password',
|
||||
ip2Type: 'password',
|
||||
ip3Type: 'password',
|
||||
formLoading: false,
|
||||
form: {
|
||||
oldPass: '',
|
||||
newPass: '',
|
||||
rnewPass: ''
|
||||
},
|
||||
rules: {
|
||||
oldPass: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
newPass: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateNewPass,
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
rnewPass: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateRnewPass,
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
sidebar: state => state.app.sidebar,
|
||||
|
|
@ -44,6 +195,12 @@ export default {
|
|||
needTagsView: state => state.settings.tagsView,
|
||||
fixedHeader: state => state.settings.fixedHeader
|
||||
}),
|
||||
...mapGetters([
|
||||
'sidebar',
|
||||
'device',
|
||||
'user',
|
||||
'baseApi'
|
||||
]),
|
||||
classObj() {
|
||||
return {
|
||||
hideSidebar: !this.sidebar.opened,
|
||||
|
|
@ -63,54 +220,199 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
// 修改密码框类型
|
||||
changeInputType(key) {
|
||||
if (this[key] == 'text') {
|
||||
this[key] = 'password'
|
||||
} else {
|
||||
this[key] = 'text'
|
||||
}
|
||||
},
|
||||
handleClickOutside() {
|
||||
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
|
||||
},
|
||||
// 提交修改密码
|
||||
submitHandle() {
|
||||
this.$refs.form.validate(async vaild => {
|
||||
if (vaild) {
|
||||
try {
|
||||
this.formLoading = true
|
||||
const res = await updatePass({
|
||||
loginType: localStorage.getItem('loginType'),
|
||||
oldPass: encrypt(this.form.oldPass),
|
||||
newPass: this.form.newPass
|
||||
})
|
||||
this.$notify.success('修改成功,请重新登陆')
|
||||
setTimeout(() => {
|
||||
this.logout()
|
||||
}, 1000)
|
||||
} catch (error) {
|
||||
this.formLoading = false
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
goFullScreen() {
|
||||
if (document.documentElement.requestFullscreen) {
|
||||
document.documentElement.requestFullscreen();
|
||||
} else if (document.documentElement.mozRequestFullScreen) { /* Firefox */
|
||||
document.documentElement.mozRequestFullScreen();
|
||||
} else if (document.documentElement.webkitRequestFullscreen) { /* Chrome, Safari & Opera */
|
||||
document.documentElement.webkitRequestFullscreen();
|
||||
} else if (document.documentElement.msRequestFullscreen) { /* IE/Edge */
|
||||
document.documentElement.msRequestFullscreen();
|
||||
}
|
||||
},
|
||||
open() {
|
||||
this.$confirm('确定注销并退出系统吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
localStorage.setItem('logoutHandle', true)
|
||||
this.logout()
|
||||
})
|
||||
},
|
||||
logout() {
|
||||
this.$store.dispatch('LogOut').then(() => {
|
||||
location.reload()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/styles/mixin.scss";
|
||||
@import "~@/assets/styles/variables.scss";
|
||||
@import "~@/assets/styles/mixin.scss";
|
||||
@import "~@/assets/styles/variables.scss";
|
||||
$top-c-h: 60px;
|
||||
|
||||
.app-wrapper {
|
||||
@include clearfix;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
.top_container {
|
||||
height: $top-c-h;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
background-color: #F5F5F5;
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: $top-c-h - 10px;
|
||||
background-color: #fff;
|
||||
padding: 0 20px;
|
||||
|
||||
&.mobile.openSidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
.logo {
|
||||
.img {
|
||||
display: block;
|
||||
width: 123px;
|
||||
height: auto
|
||||
}
|
||||
}
|
||||
|
||||
.right-menu {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.left_icon {
|
||||
font-size: 18px;
|
||||
margin-right: 30px;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.right-menu-item {
|
||||
display: inline-block;
|
||||
padding: 0 8px;
|
||||
height: 100%;
|
||||
font-size: 18px;
|
||||
color: #5a5e66;
|
||||
vertical-align: text-bottom;
|
||||
|
||||
&.hover-effect {
|
||||
cursor: pointer;
|
||||
transition: background .3s;
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, .025)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.avatar-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.avatar-wrapper {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.user-avatar {
|
||||
cursor: pointer;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.el-icon-caret-bottom {
|
||||
font-size: 12px;
|
||||
margin-left: 6px;
|
||||
}
|
||||
|
||||
.shop_name {
|
||||
font-size: 16px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.drawer-bg {
|
||||
background: #000;
|
||||
opacity: 0.3;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
z-index: 999;
|
||||
}
|
||||
.app-wrapper {
|
||||
@include clearfix;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
|
||||
.fixed-header {
|
||||
&.mobile.openSidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 9;
|
||||
width: calc(100% - #{$sideBarWidth});
|
||||
transition: width 0.28s;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.hideSidebar .fixed-header {
|
||||
width: calc(100% - 54px)
|
||||
}
|
||||
.drawer-bg {
|
||||
background: #000;
|
||||
opacity: 0.3;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.mobile .fixed-header {
|
||||
width: 100%;
|
||||
}
|
||||
.fixed-header {
|
||||
position: fixed;
|
||||
top: $top-c-h;
|
||||
right: 0;
|
||||
z-index: 9;
|
||||
width: calc(100% - #{$sideBarWidth});
|
||||
transition: width 0.28s;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.hideSidebar .fixed-header {
|
||||
width: calc(100% - 54px)
|
||||
}
|
||||
|
||||
.mobile .fixed-header {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,11 @@ import "normalize.css/normalize.css";
|
|||
|
||||
import Element from "element-ui";
|
||||
|
||||
// 图片选择器
|
||||
// import VueSelectImage from 'vue-select-image'
|
||||
// import "vue-select-image/dist/vue-select-image.css";
|
||||
// Vue.use(VueSelectImage)
|
||||
|
||||
// 数据字典
|
||||
import dict from "./components/Dict";
|
||||
import Editor from "@/components/Editor";
|
||||
|
|
@ -17,6 +22,7 @@ import "./assets/styles/element-variables.scss";
|
|||
|
||||
// global css
|
||||
import "./assets/styles/index.scss";
|
||||
import "./assets/styles/util.scss";
|
||||
|
||||
import App from "./App";
|
||||
import store from "./store";
|
||||
|
|
|
|||
|
|
@ -51,13 +51,19 @@ export const constantRouterMap = [
|
|||
path: 'data_forms',
|
||||
component: (resolve) => require(['@/views/home/data_forms'], resolve),
|
||||
name: 'data_forms',
|
||||
meta: { title: '数据报表' }
|
||||
meta: { title: '销量统计' }
|
||||
},
|
||||
{
|
||||
path: 'data_tables',
|
||||
component: (resolve) => require(['@/views/home/data_tables'], resolve),
|
||||
name: 'data_tables',
|
||||
meta: { title: '桌台统计' }
|
||||
},
|
||||
{
|
||||
path: 'data_record',
|
||||
component: (resolve) => require(['@/views/home/data_record'], resolve),
|
||||
name: 'data_record',
|
||||
meta: { title: '交班记录' }
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ module.exports = {
|
|||
/**
|
||||
* @description 网站标题
|
||||
*/
|
||||
title: '管理后台',
|
||||
title: "管理后台",
|
||||
/**
|
||||
* @description 是否显示 tagsView
|
||||
*/
|
||||
|
|
@ -22,7 +22,7 @@ module.exports = {
|
|||
/**
|
||||
* @description token key
|
||||
*/
|
||||
TokenKey: 'ELADMIN-TOEKN',
|
||||
TokenKey: "ELADMIN-TOEKN",
|
||||
/**
|
||||
* @description 请求超时时间,毫秒(默认2分钟)
|
||||
*/
|
||||
|
|
@ -38,36 +38,37 @@ module.exports = {
|
|||
/**
|
||||
* 底部文字,支持html语法
|
||||
*/
|
||||
footerTxt: '© 2018-2024 超掌柜科技 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License 2.0</a>',
|
||||
footerTxt:
|
||||
'© 2018-2024 超掌柜科技 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License 2.0</a>',
|
||||
/**
|
||||
* 备案号
|
||||
*/
|
||||
caseNumber: '陕ICP备2022008069号',
|
||||
caseNumber: "陕ICP备2022008069号",
|
||||
typeEnum: [
|
||||
{
|
||||
label: '计量商品',
|
||||
intro: '单价购买',
|
||||
typeEnum: 'normal'
|
||||
label: "单规格",
|
||||
intro: "单价购买",
|
||||
typeEnum: "normal"
|
||||
},
|
||||
{
|
||||
label: '多规格',
|
||||
intro: '多种不同规格',
|
||||
typeEnum: 'sku'
|
||||
},
|
||||
{
|
||||
label: '套餐商品',
|
||||
intro: '选职多种组合',
|
||||
typeEnum: 'group'
|
||||
},
|
||||
{
|
||||
label: '称重商品',
|
||||
intro: '按重量售卖',
|
||||
typeEnum: 'weight'
|
||||
},
|
||||
{
|
||||
label: '时价商品',
|
||||
intro: '收银端可更改价格',
|
||||
typeEnum: 'currentPrice'
|
||||
label: "多规格",
|
||||
intro: "多种不同规格",
|
||||
typeEnum: "sku"
|
||||
}
|
||||
// {
|
||||
// label: '套餐商品',
|
||||
// intro: '选职多种组合',
|
||||
// typeEnum: 'group'
|
||||
// },
|
||||
// {
|
||||
// label: '称重商品',
|
||||
// intro: '按重量售卖',
|
||||
// typeEnum: 'weight'
|
||||
// },
|
||||
// {
|
||||
// label: '时价商品',
|
||||
// intro: '收银端可更改价格',
|
||||
// typeEnum: 'currentPrice'
|
||||
// }
|
||||
]
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ const getters = {
|
|||
fileUploadApi: state => state.api.fileUploadApi,
|
||||
updateAvatarApi: state => state.api.updateAvatarApi,
|
||||
qiNiuUploadApi: state => state.api.qiNiuUploadApi,
|
||||
versionUploadApi: state => state.api.versonUploadApi,
|
||||
sqlApi: state => state.api.sqlApi,
|
||||
swaggerApi: state => state.api.swaggerApi,
|
||||
sidebarRouters: state => state.permission.sidebarRouters
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ const api = {
|
|||
swaggerApi: baseUrl + '/doc.html',
|
||||
// 文件上传
|
||||
fileUploadApi: baseUrl + '/api/localStorage',
|
||||
// 上传版本文件
|
||||
versonUploadApi: baseUrl + '/api/qiNiuContent/uploadVersionFile',
|
||||
// baseUrl,
|
||||
baseApi: baseUrl
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { login, getInfo, logout } from '@/api/login'
|
||||
import { getToken, setToken, removeToken } from '@/utils/auth'
|
||||
import { login, getInfo, logout } from "@/api/login";
|
||||
import { getToken, setToken, removeToken } from "@/utils/auth";
|
||||
|
||||
const user = {
|
||||
state: {
|
||||
|
|
@ -13,91 +13,99 @@ const user = {
|
|||
mutations: {
|
||||
// 是否为手动退出登录
|
||||
SD_LOGOUT: (state, f) => {
|
||||
state.sdLogout = f
|
||||
state.sdLogout = f;
|
||||
},
|
||||
SET_TOKEN: (state, token) => {
|
||||
state.token = token
|
||||
state.token = token;
|
||||
},
|
||||
SET_USER: (state, user) => {
|
||||
state.user = user
|
||||
state.user = user;
|
||||
},
|
||||
SET_ROLES: (state, roles) => {
|
||||
state.roles = roles
|
||||
state.roles = roles;
|
||||
},
|
||||
SET_LOAD_MENUS: (state, loadMenus) => {
|
||||
state.loadMenus = loadMenus
|
||||
state.loadMenus = loadMenus;
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
// 登录
|
||||
Login({ commit }, userInfo) {
|
||||
const rememberMe = userInfo.rememberMe
|
||||
const rememberMe = userInfo.rememberMe;
|
||||
return new Promise((resolve, reject) => {
|
||||
login(userInfo.username, userInfo.password, userInfo.code, userInfo.uuid).then(res => {
|
||||
// console.log('登录成功后返回===', res)
|
||||
localStorage.setItem('logoutHandle', false)
|
||||
localStorage.setItem('shopId', res.shopId)
|
||||
localStorage.setItem('shopName', res.shopName)
|
||||
localStorage.setItem('logo', res.logo)
|
||||
setToken(res.token, rememberMe)
|
||||
commit('SET_TOKEN', res.token)
|
||||
setUserInfo(res.user, commit)
|
||||
// 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
|
||||
commit('SET_LOAD_MENUS', true)
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
login(userInfo)
|
||||
.then(res => {
|
||||
// console.log('登录成功后返回===', res)
|
||||
localStorage.setItem("logoutHandle", false);
|
||||
localStorage.setItem("shopId", res.shopId);
|
||||
localStorage.setItem("shopName", res.shopName);
|
||||
localStorage.setItem("logo", res.logo);
|
||||
localStorage.setItem("loginType", res.loginType);
|
||||
localStorage.setItem("userInfo", JSON.stringify(res.user.user));
|
||||
setToken(res.token, rememberMe);
|
||||
commit("SET_TOKEN", res.token);
|
||||
setUserInfo(res.user, commit);
|
||||
// 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
|
||||
commit("SET_LOAD_MENUS", true);
|
||||
resolve();
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 获取用户信息
|
||||
GetInfo({ commit }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
getInfo().then(res => {
|
||||
setUserInfo(res, commit)
|
||||
resolve(res)
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
getInfo()
|
||||
.then(res => {
|
||||
setUserInfo(res, commit);
|
||||
resolve(res);
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
},
|
||||
// 登出
|
||||
LogOut({ commit }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
logout().then(res => {
|
||||
logOut(commit)
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
logOut(commit)
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
logout()
|
||||
.then(res => {
|
||||
logOut(commit);
|
||||
resolve();
|
||||
})
|
||||
.catch(error => {
|
||||
logOut(commit);
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
updateLoadMenus({ commit }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
commit('SET_LOAD_MENUS', false)
|
||||
})
|
||||
commit("SET_LOAD_MENUS", false);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const logOut = (commit) => {
|
||||
commit('SET_TOKEN', '')
|
||||
commit('SET_ROLES', [])
|
||||
removeToken()
|
||||
}
|
||||
export const logOut = commit => {
|
||||
commit("SET_TOKEN", "");
|
||||
commit("SET_ROLES", []);
|
||||
removeToken();
|
||||
};
|
||||
|
||||
export const setUserInfo = (res, commit) => {
|
||||
// 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
|
||||
if (res.roles.length === 0) {
|
||||
commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])
|
||||
commit("SET_ROLES", ["ROLE_SYSTEM_DEFAULT"]);
|
||||
} else {
|
||||
commit('SET_ROLES', res.roles)
|
||||
commit("SET_ROLES", res.roles);
|
||||
}
|
||||
commit('SET_USER', res.user)
|
||||
}
|
||||
commit("SET_USER", res.user);
|
||||
};
|
||||
|
||||
export default user
|
||||
export default user;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* 格式化价格函数,将价格限定在指定的最小值和最大值范围内,并保留两位小数。
|
||||
*
|
||||
* @param {number} price - 需要格式化的价格。
|
||||
* @param {number} min - 价格的最小值。
|
||||
* @param {number} max - 价格的最大值,默认为100000000。
|
||||
* @param {Boolean} returnIsArea - 是否返回值符合范围区间,默认为false。
|
||||
* @returns {number} - 返回格式化后的价格,如果超出范围则返回最小值或最大值。
|
||||
*/
|
||||
export const formatPrice = (price,min=-Infinity, max = 100000000,returnIsArea=false ) => {
|
||||
if(price === undefined || price === null||price===''){
|
||||
return 0
|
||||
}
|
||||
// 将价格转换为浮点数并保留两位小数
|
||||
const newval = parseFloat((Math.floor(price * 100) / 100).toFixed(2))
|
||||
// 如果价格大于最大值,返回最大值
|
||||
if (newval > max) {
|
||||
return returnIsArea?{value:max,error:true}:max
|
||||
}
|
||||
// 如果价格小于最小值,返回最小值
|
||||
if (newval < min) {
|
||||
return returnIsArea?{value:min,error:true}:min
|
||||
}
|
||||
// 如果价格小于最小值,返回最小值
|
||||
if (newval < min) {
|
||||
return min
|
||||
}
|
||||
// 返回格式化后的价格
|
||||
return newval
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// 最新的一个请求
|
||||
let cancel = null
|
||||
|
||||
// 所有请求
|
||||
let cancelTokenList = []
|
||||
|
||||
function setToken(cancelToken) {
|
||||
cancel = cancelToken
|
||||
cancelTokenList.push(cancelToken)
|
||||
}
|
||||
|
||||
function cancelToken() {
|
||||
cancel && cancel()
|
||||
cancelTokenList.pop()
|
||||
}
|
||||
|
||||
function clearAllToken() {
|
||||
while (cancelTokenList.length > 0) {
|
||||
let cancel = cancelTokenList.pop()
|
||||
console.log(cancel, 'cancel')
|
||||
cancel && cancel()
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
setToken,
|
||||
cancelToken,
|
||||
clearAllToken,
|
||||
}
|
||||
|
|
@ -423,7 +423,7 @@ export function isPcBowser() {
|
|||
* decimal你保留的几位,默认保留小数后两位
|
||||
* isInt 是否保留0
|
||||
*/
|
||||
export function formatDecimal(num, decimal = 2, isInt = false) {
|
||||
export function formatDecimal(num = 0, decimal = 2, isInt = false) {
|
||||
num = num.toFixed(3).toString();
|
||||
const index = num.indexOf(".");
|
||||
if (index !== -1) {
|
||||
|
|
@ -438,3 +438,15 @@ export function formatDecimal(num, decimal = 2, isInt = false) {
|
|||
return parseFloat(num).toFixed(decimal);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 传入数组,以及要交换位置的2个元素的下标
|
||||
* @param {*} arr
|
||||
* @param {*} i1
|
||||
* @param {*} i2
|
||||
* @returns
|
||||
*/
|
||||
export function swapArrayEle(arr, i1, i2) {
|
||||
arr[i1] = arr.splice(i2, 1, arr[i1])[0];
|
||||
return arr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,153 @@
|
|||
import { getHasPermission } from "@/api/shop";
|
||||
import { Notification } from 'element-ui'
|
||||
|
||||
const userInfo = JSON.parse(localStorage.getItem("userInfo"));
|
||||
const $PermissionObj = {
|
||||
data: [{
|
||||
key: 'yun_xu_cha_kan_jing_ying_shu_ju',
|
||||
text: '允许查看经营数据'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_cha_kan_suo_you_jiao_ban_ji_lu',
|
||||
text: '允许查看所有交班记录'
|
||||
}
|
||||
],
|
||||
default: [{
|
||||
key: 'yun_xu_xia_dan',
|
||||
text: '允许下单'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_shou_kuan',
|
||||
text: '允许收款'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_tui_kuan',
|
||||
text: '允许退款'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_jiao_ban',
|
||||
text: '允许交班'
|
||||
}
|
||||
],
|
||||
goods: [{
|
||||
key: 'yun_xu_xiu_gai_shang_pin',
|
||||
text: '允许修改商品'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_shang_xia_jia_shang_pin',
|
||||
text: '允许上下架商品'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_xiu_gai_fen_lei',
|
||||
text: '允许修改分类'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_xiu_gai_fen_zu',
|
||||
text: '允许修改分组'
|
||||
}
|
||||
],
|
||||
discount:[
|
||||
{
|
||||
key: 'yun_xu_da_zhe',
|
||||
text: '允许打折'
|
||||
}
|
||||
],
|
||||
vip:[
|
||||
{
|
||||
key: 'yun_xu_guan_li_hui_yuan_xin_xi',
|
||||
text: '允许管理会员信息'
|
||||
},
|
||||
{
|
||||
key: 'yun_xu_xiu_gai_hui_yuan_yu_e',
|
||||
text: '允许修改会员余额'
|
||||
}
|
||||
],
|
||||
stock:[
|
||||
{
|
||||
text: '允许提交报损',
|
||||
key: 'yun_xu_ti_jiao_bao_sun'
|
||||
},
|
||||
{
|
||||
text: '允许沽清',
|
||||
key: 'yun_xu_gu_qing'
|
||||
},
|
||||
{
|
||||
text: '允许售罄商品',
|
||||
key: 'yun_xu_shou_qing_shang_pin'
|
||||
},
|
||||
{
|
||||
text:'允许修改商品库存',
|
||||
key:'yun_xu_xiu_gai_shang_pin_ku_cun'
|
||||
},
|
||||
{
|
||||
text: '允许耗材入库',
|
||||
key: 'yun_xu_hao_cai_ru_ku'
|
||||
},
|
||||
{
|
||||
text: '允许耗材出库',
|
||||
key: 'yun_xu_hao_cai_chu_ku'
|
||||
},
|
||||
{
|
||||
text: '允许耗材盘点',
|
||||
key: 'yun_xu_hao_cai_pan_dian'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
export async function hasPermission (params) {
|
||||
//如果是商户默认拥有全部权限
|
||||
const loginType = localStorage.getItem('loginType')
|
||||
if(loginType=='merchant'){
|
||||
return true
|
||||
}
|
||||
params = returnFormatParams(params)
|
||||
if (!params) {
|
||||
return Notification.error('未找到相关权限,请检查代码或在权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
|
||||
}
|
||||
const option = Object.assign({
|
||||
tips: true,
|
||||
key: '',
|
||||
text: ''
|
||||
}, params)
|
||||
const res = await getHasPermission({
|
||||
userId : userInfo.id,
|
||||
|
||||
code: params.key
|
||||
})
|
||||
if (!res && option.tips) {
|
||||
Notification.error({
|
||||
title: '您没有' + params.text + '权限!',
|
||||
duration: 5000
|
||||
})
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
export function isObjectButNotArray(value) {
|
||||
return typeof value === 'object' && Array.isArray(value) === false;
|
||||
}
|
||||
|
||||
export function findPermissionObj(str) {
|
||||
for (let i in $PermissionObj) {
|
||||
const obj = $PermissionObj[i].find(v => v.key == str || v.text == str)
|
||||
if (obj) {
|
||||
return obj
|
||||
break
|
||||
}
|
||||
}
|
||||
console.error('未找到相关权限配置,请检查权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
|
||||
return false
|
||||
}
|
||||
|
||||
export function returnFormatParams(params) {
|
||||
if (typeof params === 'string') {
|
||||
return findPermissionObj(params)
|
||||
} else {
|
||||
if (isObjectButNotArray(params)) {
|
||||
const obj=findPermissionObj(params.key || params.text)
|
||||
return {...params,...obj}
|
||||
} else {
|
||||
console.error('参数只能是字符串或者对象,不能是数组')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
import OSS from "ali-oss";
|
||||
import { $getCredentials } from "@/api/version";
|
||||
|
||||
const $headers = {
|
||||
"Access-Control-Allow-Origin": "*"
|
||||
};
|
||||
const $config = {
|
||||
region: "oss-cn-beijing",
|
||||
accessKeyId: "",
|
||||
accessKeySecret: "",
|
||||
bucket: "cashier-oss"
|
||||
}
|
||||
import { Notification } from 'element-ui'
|
||||
function urlConversion(path) {
|
||||
let reg = /^(https?:\/\/)([0-9a-z.]+)(:[0-9]+)?([/0-9a-z.]+)?(\?[0-9a-z&=]+)?(#[0-9-a-z]+)?/i
|
||||
path = path.replace(reg, "https://$2$3$4$5$6");
|
||||
return path
|
||||
}
|
||||
|
||||
async function uploadAndDownloadFile(name, file, headers) {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
ossClient.put(name, file, { ...$headers, ...headers }).then((res) => {
|
||||
console.log(res);
|
||||
resolve(res);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
class ossClient {
|
||||
constructor(config) {
|
||||
this.ossClient = new OSS({
|
||||
...$config, ...config, refreshSTSToken: async () => {
|
||||
// 向您搭建的STS服务获取临时访问凭证。
|
||||
const res = await $getCredentials()
|
||||
return {
|
||||
accessKeyId: res.accessKeyId, // 自己账户的accessKeyId或临时秘钥
|
||||
accessKeySecret: res.accessKeySecret, // 自己账户的accessKeySecret或临时秘钥
|
||||
stsToken: res.securityToken, // 从STS服务获取的安全令牌(SecurityToken)。
|
||||
}
|
||||
},
|
||||
// 刷新临时访问凭证的时间间隔,单位为毫秒。
|
||||
refreshSTSTokenInterval: 3600 * 1000
|
||||
});
|
||||
}
|
||||
async upload(name, file, progressCallback) {
|
||||
try {
|
||||
let options = {
|
||||
// 获取分片上传进度、断点和返回值。
|
||||
progress: progressCallback,
|
||||
headers: $headers
|
||||
}
|
||||
const {
|
||||
res: resp
|
||||
} = await this.ossClient.put(name, file, options).catch(error => {
|
||||
reject(error);
|
||||
})
|
||||
return resp.requestUrls
|
||||
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
reject(error);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 分片上传
|
||||
* @param {Object} client oss客户端
|
||||
* @param {Object} file 上传的文件
|
||||
* @param {Object} dir 上传oss的文件夹
|
||||
* @param {Object} progressCallback 分片进度回调
|
||||
*/
|
||||
async partUpload(name, file, progressCallback) {
|
||||
try {
|
||||
let options = {
|
||||
// 获取分片上传进度、断点和返回值。
|
||||
progress: progressCallback,
|
||||
|
||||
// 设置并发上传的分片数量。
|
||||
parallel: 8,
|
||||
// 设置分片大小。默认值为1 MB,最小值为100 KB。
|
||||
partSize: 100 * 1024,
|
||||
mime: file.type
|
||||
}
|
||||
const {
|
||||
res: resp
|
||||
} = await this.ossClient.multipartUpload(name ? name : file.name, file, options)
|
||||
// return resp.requestUrls
|
||||
console.log('------resp---');
|
||||
console.log(resp)
|
||||
return urlConversion( `${resp.requestUrls[0]}`.split('?')[0])
|
||||
} catch (e) {
|
||||
console.log('------e---');
|
||||
console.log(e);
|
||||
if (e.name == 'cancel') {
|
||||
Notification.error({
|
||||
title: '上传已取消',
|
||||
duration: 3000
|
||||
})
|
||||
return e
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束上传并删除碎片
|
||||
* @param {Object} client
|
||||
* @param {Object} uploadId
|
||||
* @param {Object} name
|
||||
*/
|
||||
async abortUpload(uploadId, name) {
|
||||
try {
|
||||
const res=await this.ossClient.abortMultipartUpload(name, uploadId)
|
||||
return res
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return error
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
export default ossClient;
|
||||
|
|
@ -5,7 +5,7 @@ import store from '../store'
|
|||
import { getToken } from '@/utils/auth'
|
||||
import Config from '@/settings'
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
import { setToken } from '@/utils/globalCancelToken.js'
|
||||
// 创建axios实例
|
||||
const service = axios.create({
|
||||
// baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '/',
|
||||
|
|
@ -23,6 +23,8 @@ service.interceptors.request.use(
|
|||
config.headers['loginName'] = 'admin'
|
||||
config.headers['token'] = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyVHlwZSI6Ik1HIiwiZXhwIjoxNjkwMTgwNzE2LCJ1c2VySWQiOiIyNDQiLCJpYXQiOjE2ODg3MDk0ODcsImxvZ2luTmFtZSI6ImFkbWluIn0.lqxxvv2-FcecQngMBorz4MpkB3mIJQDG-IUULQyV-KQ'
|
||||
config.headers["userId"] = '244'
|
||||
// 添加可取消请求配置
|
||||
config.cancelToken = new axios.CancelToken(c => setToken(c))
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
|
|
@ -37,6 +39,15 @@ service.interceptors.response.use(
|
|||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
if (axios.isCancel(error)) {
|
||||
console.log('请求已取消')
|
||||
Notification.error({
|
||||
title: '请求已取消',
|
||||
duration: 5000
|
||||
})
|
||||
return Promise.reject('请求已取消')
|
||||
}
|
||||
|
||||
// 兼容blob下载出错json提示
|
||||
if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) {
|
||||
const reader = new FileReader()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
import axios from 'axios'
|
||||
import router from '@/router/routers'
|
||||
import { Notification } from 'element-ui'
|
||||
import store from '../store'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import Config from '@/settings'
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
// 创建axios实例
|
||||
const service = axios.create({
|
||||
baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_PHP_API: '/source',
|
||||
// baseURL: process.env.VUE_APP_PHP_API, // api 的 base_url
|
||||
timeout: Config.timeout // 请求超时时间
|
||||
})
|
||||
|
||||
// request拦截器
|
||||
service.interceptors.request.use(
|
||||
config => {
|
||||
// if (getToken()) {
|
||||
// config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
|
||||
// }
|
||||
config.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
||||
// config.headers['loginName'] = 'admin'
|
||||
// config.headers['token'] = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyVHlwZSI6Ik1HIiwiZXhwIjoxNjkwMTgwNzE2LCJ1c2VySWQiOiIyNDQiLCJpYXQiOjE2ODg3MDk0ODcsImxvZ2luTmFtZSI6ImFkbWluIn0.lqxxvv2-FcecQngMBorz4MpkB3mIJQDG-IUULQyV-KQ'
|
||||
// config.headers["userId"] = '244'
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// response 拦截器
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
return response.data
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
// 兼容blob下载出错json提示
|
||||
if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) {
|
||||
const reader = new FileReader()
|
||||
reader.readAsText(error.response.data, 'utf-8')
|
||||
reader.onload = function (e) {
|
||||
const errorMsg = JSON.parse(reader.result).message
|
||||
Notification.error({
|
||||
title: errorMsg,
|
||||
duration: 5000
|
||||
})
|
||||
}
|
||||
} else {
|
||||
let code = 0
|
||||
try {
|
||||
code = error.response.data.status
|
||||
} catch (e) {
|
||||
if (error.toString().indexOf('Error: timeout') !== -1) {
|
||||
Notification.error({
|
||||
title: '网络请求超时',
|
||||
duration: 5000
|
||||
})
|
||||
return Promise.reject(error)
|
||||
}
|
||||
}
|
||||
console.log(code)
|
||||
if (code) {
|
||||
if (code === 401) {
|
||||
store.dispatch('LogOut').then(() => {
|
||||
// 用户登录界面提示
|
||||
Cookies.set('point', 401)
|
||||
location.reload()
|
||||
})
|
||||
} else if (code === 403) {
|
||||
router.push({ path: '/401' })
|
||||
} else {
|
||||
const errorMsg = error.response.data.message
|
||||
if (errorMsg !== undefined) {
|
||||
Notification.error({
|
||||
title: errorMsg,
|
||||
duration: 5000
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Notification.error({
|
||||
title: '接口请求失败',
|
||||
duration: 5000
|
||||
})
|
||||
}
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
export default service
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
export const $status= {
|
||||
pending: {
|
||||
label: "挂单中",
|
||||
type: "#E6A23C",
|
||||
},
|
||||
using: {
|
||||
label: "开台中",
|
||||
type: "#fa5555",
|
||||
},
|
||||
paying: {
|
||||
label: "结算中",
|
||||
type: "#E6A23C",
|
||||
},
|
||||
idle: {
|
||||
label: "空闲",
|
||||
type: "#3F9EFF",
|
||||
},
|
||||
subscribe: {
|
||||
label: "预定",
|
||||
type: "rgb(34, 191, 100)",
|
||||
},
|
||||
closed: {
|
||||
label: "关台",
|
||||
type: "rgb(221,221,221)",
|
||||
},
|
||||
// opening: {
|
||||
// label: "开台中",
|
||||
// type: "#67C23A",
|
||||
// },
|
||||
cleaning: {
|
||||
label: "待清台",
|
||||
type: "#FAAD14",
|
||||
},
|
||||
unbind:{
|
||||
label: "未绑定",
|
||||
type: "rgb(221,221,221)",
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,257 @@
|
|||
<template>
|
||||
<div style="padding: 20px;">
|
||||
<el-form ref="query" style="display: flex;" :model="query" label-width="80px">
|
||||
<el-form-item label="展示位置">
|
||||
<el-select clearable v-model="query.showPosition" placeholder="请选择">
|
||||
<el-option label="首页" value="home" />
|
||||
<el-option label="点餐页" value="make_order" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-select clearable v-model="query.status" placeholder="请选择">
|
||||
<el-option label="可见" value="1" />
|
||||
<el-option label="不可见" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList">查询</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = true; title = '新增'">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!--表格渲染-->
|
||||
<el-table ref="table" :data="tableData" style="width: 100%;">
|
||||
<el-table-column label="弹窗广告">
|
||||
<template v-slot="scope">
|
||||
<img :src="scope.row.imgUrl" style="width: 100px;height: 100px;">
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="showPosition" label="弹窗位置">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.showPosition == 'home' ? '首页' : "点餐页" }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="showPosition" label="是否可见">
|
||||
<template v-slot="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
|
||||
@change="showChange(scope.row)"></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" label="弹窗频率">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.frequency | frequencyFilter }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="创建日期" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text" @click="edit(scope.row)">编辑</el-button>
|
||||
<el-popconfirm title="确定删除吗?" @confirm="delHandle(scope.row.id)">
|
||||
<el-button type="text" round slot="reference">
|
||||
删除
|
||||
</el-button>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- <div class="">
|
||||
<el-pagination :total="tableData.length" layout="total, prev, pager, next, jumper"></el-pagination>
|
||||
</div> -->
|
||||
<!-- 增减余额弹窗 -->
|
||||
<el-dialog :title="title + '广告'" :visible.sync="dialogVisible" width="60%">
|
||||
<el-form ref="form" :model="form" label-width="120px">
|
||||
<el-form-item label="上传弹窗广告">
|
||||
<!-- <el-upload
|
||||
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="handleRemove">
|
||||
<i class="el-icon-plus"></i>
|
||||
</el-upload> -->
|
||||
|
||||
|
||||
<el-upload class="upload-demo" :action="qiNiuUploadApi" list-type="picture-card" :headers="headers"
|
||||
:limit="1" :on-remove="removeEvent" :on-success="successEvent" :file-list="fileList">
|
||||
<i class="el-icon-plus"></i>
|
||||
</el-upload>
|
||||
<div slot="tip" class="el-upload__tip">建议尺寸:520px*680px</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="圆角设置">
|
||||
<el-slider v-model="form.borderRadius" :max="20"></el-slider>
|
||||
</el-form-item>
|
||||
<el-form-item label="弹窗位置">
|
||||
<el-radio-group v-model="form.showPosition">
|
||||
<el-radio label="home">首页</el-radio>
|
||||
<el-radio label="make_order">点餐页</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="弹窗频率">
|
||||
<el-radio-group v-model="form.frequency">
|
||||
<el-radio label="only_one">仅首次打开显示</el-radio>
|
||||
<el-radio label="every_show">每次打开显示一次</el-radio>
|
||||
<el-radio label="thirty_day">每30天显示一次</el-radio>
|
||||
<el-radio label="seven_day">每7天显示一次</el-radio>
|
||||
<el-radio label="three_day">每3天显示一次</el-radio>
|
||||
<el-radio label="every_day">每1天显示一次</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="跳转页面">
|
||||
<el-select clearable v-model="form.linkPath" placeholder="请选择">
|
||||
<el-option v-for="item in tourl" :key="item.id" :label="item.name" :value="item.path">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="sumbit">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { miniAppPagesget } from '@/api/goxcx'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import { adget, adpost, adput, addelete } from '@/api/application'
|
||||
import { mapGetters } from 'vuex'
|
||||
export default {
|
||||
computed: {
|
||||
...mapGetters(['qiNiuUploadApi'])
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
},
|
||||
tourl: [],
|
||||
query: {
|
||||
showPosition: "", status: ""
|
||||
},
|
||||
form: {
|
||||
sort: "",
|
||||
path: "",
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
showPosition: 'home',
|
||||
frequency: "only_one"
|
||||
},
|
||||
title: '新增',
|
||||
dialogVisible: false,
|
||||
tableData: [],
|
||||
fileList: [],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getList()
|
||||
// 获取跳转页面
|
||||
this.getto()
|
||||
},
|
||||
filters: {
|
||||
frequencyFilter(key) {
|
||||
let str = ""
|
||||
switch (key) {
|
||||
case 'only_one':
|
||||
str = '仅首次展示'
|
||||
break;
|
||||
case 'every_show':
|
||||
str = '每次打开都展示'
|
||||
break;
|
||||
case 'every_day':
|
||||
str = '每天展示一次'
|
||||
break;
|
||||
case 'three_day':
|
||||
str = '每三天展示一次'
|
||||
break;
|
||||
case 'seven_day':
|
||||
str = '每七天展示一次'
|
||||
break;
|
||||
case 'thirty_day':
|
||||
str = '每30天展示一次'
|
||||
break;
|
||||
}
|
||||
return str
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
successEvent(file) {
|
||||
this.fileList = [{ url: file.data[0], name: '图片' }]
|
||||
},
|
||||
removeEvent(file) {
|
||||
// 删除数据
|
||||
let index = this.fileList.findIndex(ele => ele.url == file.response.data[0])
|
||||
this.fileList.splice(index, 1);
|
||||
},
|
||||
async showChange(d) {
|
||||
if (!d.imgUrl) {
|
||||
this.form.imgUrl = this.fileList
|
||||
}
|
||||
await adput({
|
||||
imgUrl:d.imgUrl,
|
||||
id: d.id,
|
||||
shopId: this.form.shopId,
|
||||
status: d.status,
|
||||
})
|
||||
this.$message({
|
||||
message: '成功',
|
||||
type: 'success'
|
||||
})
|
||||
this.getList()
|
||||
},
|
||||
async getto() {
|
||||
let res = await miniAppPagesget()
|
||||
this.tourl = res
|
||||
},
|
||||
async sumbit() {
|
||||
this.form.imgUrl = this.fileList[0].url
|
||||
this.dialogVisible = false
|
||||
if (this.title == '新增') {
|
||||
await adpost(this.form)
|
||||
this.$message({
|
||||
message: '添加成功',
|
||||
type: 'success'
|
||||
})
|
||||
} else {
|
||||
await adput(this.form)
|
||||
this.$message({
|
||||
message: '编辑成功',
|
||||
type: 'success'
|
||||
})
|
||||
}
|
||||
this.form = {
|
||||
sort: "",
|
||||
path: "",
|
||||
status: 1,
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
showPosition: 'home',
|
||||
frequency: "only_one"
|
||||
}
|
||||
this.fileList = []
|
||||
this.getList()
|
||||
},
|
||||
// 编辑
|
||||
async edit(item) {
|
||||
this.title = '编辑'
|
||||
this.dialogVisible = true
|
||||
this.form = item
|
||||
console.log(item.imgUrl, '调试1')
|
||||
this.fileList = [{ url: item.imgUrl, name: '图片' }]
|
||||
},
|
||||
// 删除
|
||||
async delHandle(adId) {
|
||||
let res = await addelete(adId)
|
||||
this.$message({
|
||||
message: '删除成功',
|
||||
type: 'success'
|
||||
})
|
||||
this.getList()
|
||||
},
|
||||
async getList() {
|
||||
let res = await adget({
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
...this.query
|
||||
})
|
||||
this.tableData = res
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<div class="container">
|
||||
<el-form ref="form" :model="form" label-width="140px" label-position="left">
|
||||
<el-form-item label="功能启用">
|
||||
<el-switch v-model="form.enable"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="充值设置">
|
||||
<template>
|
||||
<div class="labelbox">
|
||||
用户消费结账时,成功充值消费
|
||||
<el-input style="width: 80px;margin: 0 15px;" v-model="form.rechargeTimes"></el-input>
|
||||
倍的金额,本单即可享受免单
|
||||
</div>
|
||||
</template>
|
||||
</el-form-item>
|
||||
<el-form-item label="充值门槛">
|
||||
<template>
|
||||
<div class="labelbox">
|
||||
订单支付金额需满
|
||||
<el-input style="width: 80px;margin: 0 15px;" v-model="form.rechargeThreshold"></el-input>
|
||||
元才能使用
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="适用门店">
|
||||
<el-radio-group v-model="form.resource">
|
||||
<el-radio label="全部门店"></el-radio>
|
||||
<el-radio label="指定门店"></el-radio>
|
||||
<el-radio label="仅本店使用"></el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item> -->
|
||||
<!-- <el-form-item label="使用方式">
|
||||
<el-checkbox-group v-model="form.useTypeList">
|
||||
<el-checkbox label="堂食" name="dine-in" value="dine-in"></el-checkbox>
|
||||
<el-checkbox label="自取" name="takeout" value="takeout"></el-checkbox>
|
||||
<el-checkbox label="配送" name="takeaway" value="takeaway"></el-checkbox>
|
||||
<el-checkbox label="快递" name="post" value="post"></el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否与优惠券共享">
|
||||
<el-switch v-model="form.withCoupon"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否与积分共享">
|
||||
<el-switch v-model="form.withPoints"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="不参与集章">
|
||||
<el-switch v-model="form.childShopIdList"></el-switch>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="充值说明">
|
||||
<el-input type="textarea" v-model="form.rechargeDesc"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="editlist">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { get, edit } from "@/api/bwc";
|
||||
export default {
|
||||
name: 'bwc',
|
||||
data() {
|
||||
return {
|
||||
form: {
|
||||
id: '',
|
||||
enable: '',
|
||||
rechargeTimes: '',
|
||||
rechargeThreshold: '',
|
||||
withCoupon: '',
|
||||
withPoints: '',
|
||||
rechargeDesc: '',
|
||||
useTypeList: [],
|
||||
childShopIdList: '',
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getlist()
|
||||
},
|
||||
methods: {
|
||||
async getlist() {
|
||||
let res = await get({
|
||||
shopId: localStorage.getItem("shopId")
|
||||
})
|
||||
this.form = res
|
||||
},
|
||||
async editlist() {
|
||||
this.form.shopId = localStorage.getItem("shopId")
|
||||
let res = await edit(this.form)
|
||||
this.$message({
|
||||
message: '保存成功',
|
||||
type: 'success'
|
||||
});
|
||||
this.form = res
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.app-container {
|
||||
padding: 12px 20px;
|
||||
height: auto;
|
||||
background-color: #f4f9ff;
|
||||
|
||||
.container {
|
||||
padding: 30px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #FFFFFF;
|
||||
|
||||
.labelbox {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
font-family: Source Han Sans CN, Source Han Sans CN;
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
color: #666666;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
<!-- 添加优惠券 -->
|
||||
<template>
|
||||
<el-dialog :title="type == 1 ? '编辑优惠券' : '添加优惠券'" :visible.sync="dialogVisible" @close="reset">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="券名称" prop="couponId">
|
||||
<el-select v-model="form.couponId" placeholder="请选择优惠券">
|
||||
<el-option :label="item.title" :value="item.id" v-for="item in coupons" :key="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="数量">
|
||||
<el-input-number v-model="form.couponNum" :min="1"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getTbShopCoupon } from '@/api/coupon.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
coupons: [],
|
||||
type: 1,
|
||||
form: {
|
||||
couponId: '',
|
||||
couponName: '',
|
||||
couponNum: ''
|
||||
},
|
||||
resetForm: {},
|
||||
rules: {
|
||||
couponId: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择优惠券',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form }
|
||||
this.getTbShopCoupon()
|
||||
},
|
||||
methods: {
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.form.couponName = this.coupons.find(item => item.id == this.form.couponId).title
|
||||
this.$emit('success', { ...this.form })
|
||||
this.close()
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取优惠券列表
|
||||
async getTbShopCoupon() {
|
||||
try {
|
||||
const res = await getTbShopCoupon({
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
type: 1,
|
||||
page: 1,
|
||||
size: 100
|
||||
})
|
||||
this.coupons = res.content
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
reset() {
|
||||
this.form = { ...this.resetForm }
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
show(row) {
|
||||
if (row && row.couponId) {
|
||||
this.type = 1
|
||||
this.form = { ...row }
|
||||
} else {
|
||||
this.type = 2
|
||||
}
|
||||
this.dialogVisible = true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,263 @@
|
|||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<el-form-item>
|
||||
<el-input placeholder="邀请人名称/被邀请人/昵称/手机号" v-model="query.search" style="width: 240px;" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="query.status" placeholder="状态" style="width: 140px;">
|
||||
<el-option :label="item.label" :value="item.value" v-for="item in statusList"
|
||||
:key="item.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item>
|
||||
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss">
|
||||
</el-date-picker>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="queryHandle">查询</el-button>
|
||||
<el-button @click="resetHandle">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.list" v-loading="tableData.loading">
|
||||
<el-table-column label="邀请人" prop="invitedName">
|
||||
<template v-slot="scope">
|
||||
<div class="goods_info">
|
||||
<el-image :src="scope.row.invitedHeadImg" style="width:40px;height:40px;flex-shrink: 0;"
|
||||
:preview-src-list="avatarUrlList1">
|
||||
<div slot="error" class="image-slot">
|
||||
<i class="el-icon-folder-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<span>{{ scope.row.invitedName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="被邀请人" prop="beInvitedName">
|
||||
<template v-slot="scope">
|
||||
<div class="goods_info">
|
||||
<el-image :src="scope.row.beInvitedHeadImg" style="width:40px;height:40px;flex-shrink: 0;"
|
||||
:preview-src-list="avatarUrlList2">
|
||||
<div slot="error" class="image-slot">
|
||||
<i class="el-icon-folder-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<span>{{ scope.row.beInvitedName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="邀请状态" prop="status">
|
||||
<template v-slot="scope">
|
||||
<template v-if="scope.row.method == 'get' && scope.row.status == 2">
|
||||
<el-tag type="success" disable-transitions>已邀请成功</el-tag>
|
||||
</template>
|
||||
<template v-else-if="scope.row.method == 'use' && scope.row.status == 3">
|
||||
<el-tag type="success" disable-transitions>已邀请成功</el-tag>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-tag type="danger" disable-transitions>未邀请成功</el-tag>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="邀请时间" prop="createTime"></el-table-column>
|
||||
<el-table-column label="生效时间" prop="updateTime">
|
||||
<template v-slot="scope">
|
||||
<template v-if="scope.row.method == 'get'">{{ scope.row.updateTime }}</template>
|
||||
<template v-if="scope.row.method == 'use'">{{ scope.row.rewardTime }}</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
|
||||
:page-size="tableData.size" @current-change="paginationChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { byShare, byShopId } from '@/api/inviteFirend.js'
|
||||
const statusList = [
|
||||
{
|
||||
value: 0,
|
||||
label: '非新用户'
|
||||
},
|
||||
{
|
||||
value: 1,
|
||||
label: '未领取'
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: '已领取'
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
label: '已使用'
|
||||
},
|
||||
]
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
statusList,
|
||||
avatarUrlList1: [],
|
||||
avatarUrlList2: [],
|
||||
shareId: '',
|
||||
query: {
|
||||
search: '',
|
||||
status: ''
|
||||
},
|
||||
resetQuery: '',
|
||||
tableData: {
|
||||
list: [],
|
||||
page: 1,
|
||||
size: 30,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
statusFilter(t) {
|
||||
return statusList.find(item => item.value == t).label
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetQuery = { ...this.query }
|
||||
this.byShopId()
|
||||
},
|
||||
methods: {
|
||||
// 查询
|
||||
queryHandle() {
|
||||
this.getTableData()
|
||||
},
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.query = { ...this.resetQuery }
|
||||
this.page = 1
|
||||
this.size = 30
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
handleSizeChange(val) {
|
||||
this.tableData.size = val
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取邀请设置
|
||||
async byShopId() {
|
||||
try {
|
||||
const res = await byShopId()
|
||||
this.shareId = res.id
|
||||
this.getTableData()
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 获取表格数据
|
||||
async getTableData() {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
const res = await byShare({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
search: this.query.search,
|
||||
status: this.query.status,
|
||||
shareId: this.shareId
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.list = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
// 头像预览图集合
|
||||
this.avatarUrlList1 = res.content.map(item => item.invitedHeadImg)
|
||||
this.avatarUrlList2 = res.content.map(item => item.beInvitedHeadImg)
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.goods_info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.collect_wrap {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
|
||||
.item {
|
||||
width: 200px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #f5f5f5;
|
||||
padding: 20px;
|
||||
|
||||
.icon_wrap {
|
||||
$size: 34px;
|
||||
$border: 6px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--bg-color);
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
width: $size + $border;
|
||||
height: $size + $border;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: var(--bg-color);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 10px;
|
||||
|
||||
.m {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.t {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
padding-top: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,377 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
|
||||
<el-form-item label="开启">
|
||||
<el-switch v-model.trim="form.status" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
<template v-if="form.status">
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="form.title" style="width: 500px;" placeholder="例如:邀请1人可得,双方各得10元优惠券"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="分享封面图" prop="shareImg">
|
||||
<div class="img_list">
|
||||
<div class="item" v-if="form.shareImg">
|
||||
<el-image :src="form.shareImg" style="width: 100%;height: 100%"
|
||||
:preview-src-list="urlList" />
|
||||
<div class="del" @click.stop="form.shareImg = ''">删除</div>
|
||||
</div>
|
||||
<div class="item upload" @click="formImgKey = 'shareImg'; $refs.addImg.show()" v-else>
|
||||
<i class="icon el-icon-plus"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tips">建议尺寸:750*622</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="邀请顶部图" prop="invitedImg">
|
||||
<div class="img_list">
|
||||
<div class="item" v-if="form.invitedImg">
|
||||
<el-image :src="form.invitedImg" style="width: 100%;height: 100%"
|
||||
:preview-src-list="urlList" />
|
||||
<div class="del" @click.stop="form.invitedImg = ''">删除</div>
|
||||
</div>
|
||||
<div class="item upload" @click="formImgKey = 'invitedImg'; $refs.addImg.show()" v-else>
|
||||
<i class="icon el-icon-plus"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tips">建议尺寸:750*622</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="被邀顶部图" prop="beInvitedImg">
|
||||
<div class="img_list">
|
||||
<div class="item" v-if="form.beInvitedImg">
|
||||
<el-image :src="form.beInvitedImg" style="width: 100%;height: 100%"
|
||||
:preview-src-list="urlList" />
|
||||
<div class="del" @click.stop="form.beInvitedImg = ''">删除</div>
|
||||
</div>
|
||||
<div class="item upload" @click="formImgKey = 'beInvitedImg'; $refs.addImg.show()" v-else>
|
||||
<i class="icon el-icon-plus"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tips">建议尺寸:750*622</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="活动日期" prop="startTime">
|
||||
<el-date-picker v-model="createdAt" type="daterange" range-separator="至" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss" @change="timeChange">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="新用户获得券" prop="newCoupons">
|
||||
<div>
|
||||
<el-button type="primary" @click="addRewardHandle('newCoupons')">添加券</el-button>
|
||||
<div class="tips">新用户的定义:没领过该活动券的都属于新用户,不管有没有下过单和是否第一次登录小程序。</div>
|
||||
</div>
|
||||
<el-table :data="form.newCoupons" border style="width: 600px;">
|
||||
<el-table-column label="券ID" prop="couponId"></el-table-column>
|
||||
<el-table-column label="名称" prop="couponName"></el-table-column>
|
||||
<el-table-column label="数量" prop="couponNum"></el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text"
|
||||
@click="addRewardHandle('newCoupons', 2, scope.row, scope.$index)">编辑</el-button>
|
||||
<el-button type="text" @click="form.newCoupons.splice(scope.$index, 1)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
<el-form-item label="奖励券" prop="invitedNum">
|
||||
<el-input v-model="form.invitedNum" style="width: 350px;"
|
||||
@input="inputFilterInt($event, 'invitedNum')">
|
||||
<template slot="prepend">用户每邀请</template>
|
||||
<template slot="append">人,可获得奖励券</template>
|
||||
</el-input>
|
||||
<el-button type="primary" @click="addRewardHandle('rewardCoupons')">添加券</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item prop="rewardCoupons">
|
||||
<div>
|
||||
<div class="tips">奖励券不受优惠券发放数量影响</div>
|
||||
</div>
|
||||
<el-table :data="form.rewardCoupons" border style="width: 600px;">
|
||||
<el-table-column label="券ID" prop="couponId"></el-table-column>
|
||||
<el-table-column label="名称" prop="couponName"></el-table-column>
|
||||
<el-table-column label="数量" prop="couponNum"></el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text"
|
||||
@click="addRewardHandle('rewardCoupons', 2, scope.row, scope.$index)">编辑</el-button>
|
||||
<el-button type="text"
|
||||
@click="form.rewardCoupons.splice(scope.$index, 1)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
<el-form-item label="奖励获得方法">
|
||||
<el-radio-group v-model="form.getMethod">
|
||||
<el-radio label="get">新用户领取获得</el-radio>
|
||||
<el-radio label="use">仅新用户使用获得会员</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<addImg ref="addImg" @successEvent="e => form[formImgKey] = e[0].url" />
|
||||
<AddCoupon ref="AddCoupon" @success="addCouponSuccess" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { byShopId, tbShopShare } from '@/api/inviteFirend.js'
|
||||
import addImg from "@/views/product/components/addImages.vue";
|
||||
import AddCoupon from './addCoupon.vue'
|
||||
export default {
|
||||
components: { addImg, AddCoupon },
|
||||
data() {
|
||||
const imgValidate1 = (rule, value, callback) => {
|
||||
if (!this.form.shareImg) {
|
||||
callback(new Error("请上传分享封面图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const imgValidate2 = (rule, value, callback) => {
|
||||
if (!this.form.invitedImg) {
|
||||
callback(new Error("请上传邀请顶部图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const imgValidate3 = (rule, value, callback) => {
|
||||
if (!this.form.beInvitedImg) {
|
||||
callback(new Error("请上传被邀顶部图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const startTimeValidate = (rule, value, callback) => {
|
||||
if (!this.form.startTime) {
|
||||
callback(new Error("请选择活动日期"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const newCouponsValidate = (rule, value, callback) => {
|
||||
if (!this.form.newCoupons.length) {
|
||||
callback(new Error("请添加新用户获得券"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const rewardCouponsValidate = (rule, value, callback) => {
|
||||
if (!this.form.rewardCoupons.length) {
|
||||
callback(new Error("请添加奖励券"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
loading: false,
|
||||
createdAt: [],
|
||||
formImgKey: '',
|
||||
couponKey: '',
|
||||
tableType: '1', // 1添加 2编辑
|
||||
tableEditorIndex: 0, // 编辑时的index
|
||||
form: {
|
||||
status: 1,
|
||||
title: '',
|
||||
shareImg: '',
|
||||
invitedImg: '',
|
||||
beInvitedImg: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
newCoupons: [],
|
||||
invitedNum: '1',
|
||||
rewardCoupons: [],
|
||||
getMethod: 'get'
|
||||
},
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入标题',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
shareImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate1,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
invitedImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate2,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
beInvitedImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate3,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
startTime: [
|
||||
{
|
||||
required: true,
|
||||
validator: startTimeValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
newCoupons: [
|
||||
{
|
||||
required: true,
|
||||
validator: newCouponsValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
invitedNum: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入邀请人数',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
rewardCoupons: [
|
||||
{
|
||||
required: true,
|
||||
validator: rewardCouponsValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
},
|
||||
urlList: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.byShopId()
|
||||
},
|
||||
methods: {
|
||||
// 添加完成优惠券
|
||||
addCouponSuccess(e) {
|
||||
if (this.tableType == 1) {
|
||||
this.form[this.couponKey].push({ ...e })
|
||||
} else {
|
||||
// this.form[this.couponKey][this.tableEditorIndex] = { ...e }
|
||||
this.$set(this.form[this.couponKey], this.tableEditorIndex, { ...e })
|
||||
}
|
||||
},
|
||||
// 添加奖励券
|
||||
addRewardHandle(key, type = 1, row = {}, index = 0) {
|
||||
this.tableEditorIndex = index
|
||||
this.tableType = type
|
||||
this.couponKey = key
|
||||
if (key == 'rewardCoupons' && !this.form.invitedNum) {
|
||||
this.$refs.form.validateField('invitedNum')
|
||||
return
|
||||
}
|
||||
this.$refs.AddCoupon.show(row)
|
||||
},
|
||||
// 日期回调
|
||||
timeChange(e) {
|
||||
this.form.startTime = e[0]
|
||||
this.form.endTime = e[1]
|
||||
},
|
||||
// 过滤input只能输入整数
|
||||
inputFilterInt(e, key) {
|
||||
if (!e) return
|
||||
setTimeout(() => {
|
||||
this.form[key] = e.replace(/[^\d]/g, '')
|
||||
}, 50)
|
||||
},
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
this.form.shopId = localStorage.getItem('shopId')
|
||||
await tbShopShare(this.form)
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `保存成功`,
|
||||
type: 'success'
|
||||
});
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取店铺设置
|
||||
async byShopId() {
|
||||
try {
|
||||
const res = await byShopId()
|
||||
if (res.id) {
|
||||
this.form = res
|
||||
this.createdAt = [res.startTime, res.endTime]
|
||||
this.urlList = [res.shareImg, res.invitedImg, res.beInvitedImg]
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.img_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
|
||||
.item {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #F5F7FA;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&.upload {
|
||||
border: 1px dashed #ddd;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.del {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.del {
|
||||
width: 100%;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(255, 0, 0, 0.6);
|
||||
backdrop-filter: blur(3px);
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
transform: translateY(100%);
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 20px;
|
||||
color: #ddd;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,447 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
|
||||
<el-form-item label="分享标题" prop="title">
|
||||
<el-input v-model="form.title" style="width: 500px;" placeholder="例如:邀请1人可得,双方各得10元优惠券"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="分享封面" prop="shareImg">
|
||||
<div class="img_list">
|
||||
<div class="item" v-if="form.shareImg">
|
||||
<el-image :src="form.shareImg" style="width: 100%;height: 100%" :preview-src-list="urlList" />
|
||||
<div class="del" @click.stop="form.shareImg = ''">删除</div>
|
||||
</div>
|
||||
<div class="item upload" @click="formImgKey = 'shareImg'; $refs.addImg.show()" v-else>
|
||||
<i class="icon el-icon-plus"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tips">建议尺寸:630*504</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="演示">
|
||||
<div class="preview_wrap">
|
||||
<div class="message_wrap">
|
||||
<div class="msg">
|
||||
<div class="content">
|
||||
<div class="name">
|
||||
<img class="logo" :src="shopInfo.logo">
|
||||
<span class="t">{{ shopInfo.name }}</span>
|
||||
</div>
|
||||
<div class="title">{{ form.title }}</div>
|
||||
<el-image :src="form.shareImg" style="width: 100%;height: 110px;" fit="cover">
|
||||
<div slot="error" class="image-slot">
|
||||
<i class="el-icon-folder-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<div class="btm">
|
||||
<i class="icon el-icon-link"></i>
|
||||
小程序
|
||||
</div>
|
||||
</div>
|
||||
<img class="avatar" src="@/assets/images/avatar.png">
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<i class="icon el-icon-microphone"></i>
|
||||
<div class="ipt"></div>
|
||||
<i class="icon el-icon-picture-outline-round"></i>
|
||||
<i class="icon el-icon-circle-plus-outline"></i>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<addImg ref="addImg" @successEvent="e => form[formImgKey] = e[0].url" />
|
||||
<AddCoupon ref="AddCoupon" @success="addCouponSuccess" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { byShopId, tbShopShare } from '@/api/inviteFirend.js'
|
||||
import addImg from "@/views/product/components/addImages.vue";
|
||||
import AddCoupon from './addCoupon.vue'
|
||||
export default {
|
||||
components: { addImg, AddCoupon },
|
||||
data() {
|
||||
const imgValidate1 = (rule, value, callback) => {
|
||||
if (!this.form.shareImg) {
|
||||
callback(new Error("请上传分享封面图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const imgValidate2 = (rule, value, callback) => {
|
||||
if (!this.form.invitedImg) {
|
||||
callback(new Error("请上传邀请顶部图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const imgValidate3 = (rule, value, callback) => {
|
||||
if (!this.form.beInvitedImg) {
|
||||
callback(new Error("请上传被邀顶部图"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const startTimeValidate = (rule, value, callback) => {
|
||||
if (!this.form.startTime) {
|
||||
callback(new Error("请选择活动日期"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const newCouponsValidate = (rule, value, callback) => {
|
||||
if (!this.form.newCoupons.length) {
|
||||
callback(new Error("请添加新用户获得券"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const rewardCouponsValidate = (rule, value, callback) => {
|
||||
if (!this.form.rewardCoupons.length) {
|
||||
callback(new Error("请添加奖励券"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
loading: false,
|
||||
createdAt: [],
|
||||
formImgKey: '',
|
||||
couponKey: '',
|
||||
tableType: '1', // 1添加 2编辑
|
||||
tableEditorIndex: 0, // 编辑时的index
|
||||
shopInfo: {
|
||||
name: localStorage.getItem('shopName'),
|
||||
logo: localStorage.getItem('logo')
|
||||
},
|
||||
form: {
|
||||
status: 1,
|
||||
title: '',
|
||||
shareImg: '',
|
||||
invitedImg: '',
|
||||
beInvitedImg: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
newCoupons: [],
|
||||
invitedNum: '1',
|
||||
rewardCoupons: [],
|
||||
getMethod: 'get'
|
||||
},
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入标题',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
shareImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate1,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
invitedImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate2,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
beInvitedImg: [
|
||||
{
|
||||
required: true,
|
||||
validator: imgValidate3,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
startTime: [
|
||||
{
|
||||
required: true,
|
||||
validator: startTimeValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
newCoupons: [
|
||||
{
|
||||
required: true,
|
||||
validator: newCouponsValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
invitedNum: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入邀请人数',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
rewardCoupons: [
|
||||
{
|
||||
required: true,
|
||||
validator: rewardCouponsValidate,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
},
|
||||
urlList: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.byShopId()
|
||||
},
|
||||
methods: {
|
||||
// 添加完成优惠券
|
||||
addCouponSuccess(e) {
|
||||
if (this.tableType == 1) {
|
||||
this.form[this.couponKey].push({ ...e })
|
||||
} else {
|
||||
// this.form[this.couponKey][this.tableEditorIndex] = { ...e }
|
||||
this.$set(this.form[this.couponKey], this.tableEditorIndex, { ...e })
|
||||
}
|
||||
},
|
||||
// 添加奖励券
|
||||
addRewardHandle(key, type = 1, row = {}, index = 0) {
|
||||
this.tableEditorIndex = index
|
||||
this.tableType = type
|
||||
this.couponKey = key
|
||||
if (key == 'rewardCoupons' && !this.form.invitedNum) {
|
||||
this.$refs.form.validateField('invitedNum')
|
||||
return
|
||||
}
|
||||
this.$refs.AddCoupon.show(row)
|
||||
},
|
||||
// 日期回调
|
||||
timeChange(e) {
|
||||
this.form.startTime = e[0]
|
||||
this.form.endTime = e[1]
|
||||
},
|
||||
// 过滤input只能输入整数
|
||||
inputFilterInt(e, key) {
|
||||
if (!e) return
|
||||
setTimeout(() => {
|
||||
this.form[key] = e.replace(/[^\d]/g, '')
|
||||
}, 50)
|
||||
},
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
this.form.shopId = localStorage.getItem('shopId')
|
||||
await tbShopShare(this.form)
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `保存成功`,
|
||||
type: 'success'
|
||||
});
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取店铺设置
|
||||
async byShopId() {
|
||||
try {
|
||||
const res = await byShopId()
|
||||
if (res.id) {
|
||||
this.form = res
|
||||
this.createdAt = [res.startTime, res.endTime]
|
||||
this.urlList = [res.shareImg, res.invitedImg, res.beInvitedImg]
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.img_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
|
||||
.item {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #F5F7FA;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&.upload {
|
||||
border: 1px dashed #ddd;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.del {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.del {
|
||||
width: 100%;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(255, 0, 0, 0.6);
|
||||
backdrop-filter: blur(3px);
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
transform: translateY(100%);
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 20px;
|
||||
color: #ddd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.preview_wrap {
|
||||
width: 300px;
|
||||
height: 368px;
|
||||
background-color: #EDEDED;
|
||||
position: relative;
|
||||
padding: 20px 10px;
|
||||
|
||||
.message_wrap {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
|
||||
.msg {
|
||||
display: flex;
|
||||
|
||||
.content {
|
||||
width: 180px;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
padding: 10px 10px 6px;
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
$size: 8px;
|
||||
content: "";
|
||||
width: $size;
|
||||
height: $size;
|
||||
border-radius: 1px;
|
||||
background-color: #fff;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: $size / 2 * -1;
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
.name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 10px;
|
||||
|
||||
.logo {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.t {
|
||||
font-size: 10px;
|
||||
color: #999;
|
||||
margin-left: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
padding: 6px 0;
|
||||
}
|
||||
|
||||
.btm {
|
||||
font-size: 10px;
|
||||
color: #999;
|
||||
line-height: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-top: 1px solid #ececec;
|
||||
padding-top: 6px;
|
||||
|
||||
.icon {
|
||||
font-size: 14px;
|
||||
color: rgb(87, 87, 253);
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
background-color: #F6F6F6;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 10px;
|
||||
gap: 10px;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 40px;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
width: 100px;
|
||||
height: 4px;
|
||||
border-radius: 4px;
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
left: 50%;
|
||||
margin-left: -50px;
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
.ipt {
|
||||
flex: 1;
|
||||
height: 30px;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 22px;
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,349 @@
|
|||
<!-- 兑换记录 -->
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<el-form-item>
|
||||
<el-input placeholder="订单编号/核销码" v-model="query.keywords" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="query.pickupMethod" placeholder="领取方式" style="width: 140px;">
|
||||
<el-option label="自取" value="self"></el-option>
|
||||
<el-option label="邮寄" value="post"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="query.status" placeholder="状态" style="width: 140px;">
|
||||
<el-option :label="item.label" :value="item.value" v-for="item in statusList"
|
||||
:key="item.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至"
|
||||
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="queryHandle">查询</el-button>
|
||||
<el-button @click="resetHandle">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<div class="collect_wrap">
|
||||
<div class="item">
|
||||
<div class="icon_wrap" style="--bg-color:#ADDBBC">
|
||||
<i class="icon el-icon-s-goods"></i>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="m">{{ countData.count }}</div>
|
||||
<div class="t">总订单数</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="icon_wrap" style="--bg-color:#8CC4FC">
|
||||
<i class="icon el-icon-s-goods"></i>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="m">¥{{ countData.totalAmount }}</div>
|
||||
<div class="t">已支付金额</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.list" v-loading="tableData.loading">
|
||||
<el-table-column label="订单编号" prop="orderNo" width="200"></el-table-column>
|
||||
<el-table-column label="用户名" prop="memberName" width="200">
|
||||
<template v-slot="scope">
|
||||
<div class="goods_info">
|
||||
<el-image :src="scope.row.avatarUrl" style="width:40px;height:40px;flex-shrink: 0;"
|
||||
:preview-src-list="avatarUrlList">
|
||||
<div slot="error" class="image-slot">
|
||||
<i class="el-icon-folder-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<span>{{ scope.row.memberName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="商品" prop="pointsGoodsName" width="200">
|
||||
<template v-slot="scope">
|
||||
<div class="goods_info">
|
||||
<el-image :src="scope.row.goodsImageUrl" style="width:40px;height:40px;flex-shrink: 0;"
|
||||
:preview-src-list="srcList">
|
||||
<div slot="error" class="image-slot">
|
||||
<i class="el-icon-folder-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<span>{{ scope.row.pointsGoodsName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="使用积分" prop="spendPoints"></el-table-column>
|
||||
<el-table-column label="支付金额" prop="extraPaymentAmount"></el-table-column>
|
||||
<el-table-column label="支付方式" prop="payMethod"></el-table-column>
|
||||
<el-table-column label="实际支付时间" prop="payTime" width="200"></el-table-column>
|
||||
<el-table-column label="下单时间" prop="createTime" width="200"></el-table-column>
|
||||
<el-table-column label="领取方式" prop="pickupMethod">
|
||||
<template v-slot="scope">
|
||||
<el-tag type="success" effect="plain" disable-transitions
|
||||
v-if="scope.row.pickupMethod == 'self'">自取</el-tag>
|
||||
<el-tag type="info" effect="plain" disable-transitions
|
||||
v-if="scope.row.pickupMethod == 'post'">邮寄
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" prop="status">
|
||||
<template v-slot="scope">
|
||||
<el-tag type="warning" disable-transitions v-if="scope.row.status == 'waiting'">待自取</el-tag>
|
||||
<el-tag type="success" disable-transitions v-if="scope.row.status == 'done'">已完成</el-tag>
|
||||
<el-tag type="warning" disable-transitions v-if="scope.row.status == 'unpaid'">待支付</el-tag>
|
||||
<el-tag type="info" disable-transitions v-if="scope.row.status == 'cancel'">已取消</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="取消/退款" prop="cancelOrRefundTime" width="200">
|
||||
<template v-slot="scope">
|
||||
<template v-if="scope.row.status == 'cancel'">
|
||||
<div>{{ scope.row.cancelOrRefundTime }}</div>
|
||||
<div>{{ scope.row.cancelOrRefundReason }}</div>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template v-slot="scope">
|
||||
<template v-if="scope.row.status == 'waiting'">
|
||||
<el-popconfirm title="确定核销吗?" @confirm="confirmOrder(scope.row.couponCode)">
|
||||
<el-button type="text" icon="el-icon-finished" slot="reference">待核销</el-button>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
<el-button type="text" icon="el-icon-finished" disabled v-else>{{
|
||||
scope.row.status | statusFilter }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
|
||||
:page-size="tableData.size" @current-change="paginationChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { exchangeRecordPage, exchangeRecordTotal, recordCheckout } from '@/api/points.js'
|
||||
const statusList = [
|
||||
{
|
||||
value: 'unpaid',
|
||||
label: '待支付'
|
||||
},
|
||||
{
|
||||
value: 'waiting',
|
||||
label: '待自取'
|
||||
},
|
||||
{
|
||||
value: 'done',
|
||||
label: '已完成'
|
||||
},
|
||||
{
|
||||
value: 'cancel',
|
||||
label: '已取消'
|
||||
},
|
||||
]
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
statusList,
|
||||
srcList: [],
|
||||
avatarUrlList: [],
|
||||
countData: {
|
||||
count: 0,
|
||||
totalAmount: 0
|
||||
},
|
||||
query: {
|
||||
keywords: '',
|
||||
beginDate: '',
|
||||
endDate: '',
|
||||
status: '',
|
||||
pickupMethod: '',
|
||||
createdAt: []
|
||||
},
|
||||
resetQuery: '',
|
||||
tableData: {
|
||||
list: [],
|
||||
page: 1,
|
||||
size: 30,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
statusFilter(t) {
|
||||
return statusList.find(item => item.value == t).label
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetQuery = { ...this.query }
|
||||
this.getTableData()
|
||||
this.exchangeRecordTotal()
|
||||
},
|
||||
methods: {
|
||||
// 核销
|
||||
async confirmOrder(couponCode) {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
await recordCheckout({ couponCode: couponCode })
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: '核销成功',
|
||||
type: 'success'
|
||||
})
|
||||
this.getTableData()
|
||||
} catch (error) {
|
||||
this.tableData.loading = false
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 统计
|
||||
async exchangeRecordTotal() {
|
||||
try {
|
||||
const { count, totalAmount } = await exchangeRecordTotal({
|
||||
keywords: this.query.keywords,
|
||||
beginDate: this.query.createdAt[0] || '',
|
||||
endDate: this.query.createdAt[1] || '',
|
||||
status: this.query.status,
|
||||
pickupMethod: this.query.pickupMethod
|
||||
})
|
||||
this.countData.count = count
|
||||
this.countData.totalAmount = totalAmount
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 查询
|
||||
queryHandle() {
|
||||
this.getTableData()
|
||||
this.exchangeRecordTotal()
|
||||
},
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.query = { ...this.resetQuery }
|
||||
this.page = 1
|
||||
this.size = 30
|
||||
this.getTableData()
|
||||
this.exchangeRecordTotal()
|
||||
},
|
||||
// 分页大小改变
|
||||
handleSizeChange(val) {
|
||||
this.tableData.size = val
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取表格数据
|
||||
async getTableData() {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
const res = await exchangeRecordPage({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
keywords: this.query.keywords,
|
||||
beginDate: this.query.createdAt[0] || '',
|
||||
endDate: this.query.createdAt[1] || '',
|
||||
status: this.query.status,
|
||||
pickupMethod: this.query.pickupMethod
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.list = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
// 预览图集合
|
||||
this.srcList = res.content.map(item => item.goodsImageUrl)
|
||||
// 头像预览图集合
|
||||
this.avatarUrlList = res.content.map(item => item.avatarUrl)
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.goods_info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.collect_wrap {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
|
||||
.item {
|
||||
width: 200px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #f5f5f5;
|
||||
padding: 20px;
|
||||
|
||||
.icon_wrap {
|
||||
$size: 34px;
|
||||
$border: 6px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--bg-color);
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
width: $size + $border;
|
||||
height: $size + $border;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: var(--bg-color);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 10px;
|
||||
|
||||
.m {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.t {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
padding-top: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,306 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
|
||||
<el-form-item label="是否消费赠送积分">
|
||||
<el-switch v-model.trim="form.enableRewards" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
<template v-if="form.enableRewards">
|
||||
<el-form-item label="适用群体">
|
||||
<el-radio-group v-model="form.rewardsGroup">
|
||||
<el-radio label="all">全部</el-radio>
|
||||
<el-radio label="vip">仅会员</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="消费赠送积分" prop="consumeAmount">
|
||||
<el-input v-model="form.consumeAmount" style="width: 250px;"
|
||||
@input="inputFilterInt($event, 'consumeAmount')">
|
||||
<template slot="prepend">每消费</template>
|
||||
<template slot="append">元赠送1积分</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item label="开启下单积分抵扣" style="margin-top: 50px;">
|
||||
<el-switch v-model.trim="form.enableDeduction" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
<template v-if="form.enableDeduction">
|
||||
<el-form-item label="适用群体">
|
||||
<el-radio-group v-model="form.deductionGroup">
|
||||
<el-radio label="all">全部</el-radio>
|
||||
<el-radio label="vip">仅会员</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="下单实付抵扣门槛" prop="minPaymentAmount">
|
||||
<el-input v-model="form.minPaymentAmount" style="width: 150px;"
|
||||
@input="inputFilterInt($event, 'minPaymentAmount')">
|
||||
<template slot="append">元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="下单最高抵扣比例" prop="maxDeductionRatio">
|
||||
<el-input v-model="form.maxDeductionRatio" style="width: 150px;"
|
||||
@input="inputFilterInt($event, 'maxDeductionRatio')">
|
||||
<template slot="append">%</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="下单抵扣积分比例" prop="equivalentPoints">
|
||||
<el-input v-model="form.equivalentPoints" style="width: 220px;"
|
||||
@input="inputFilterInt($event, 'equivalentPoints')">
|
||||
<template slot="prepend">1元等于</template>
|
||||
<template slot="append">积分</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item label="开启积分商城" style="margin-top: 50px;">
|
||||
<el-switch v-model.trim="form.enablePointsMall" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="显示样式" v-if="form.enablePointsMall">
|
||||
<div class="style_wrap">
|
||||
<div class="item style1" :class="{ active: form.browseMode == 'list' }"
|
||||
@click="form.browseMode = 'list'">
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="info">
|
||||
<div class="line"></div>
|
||||
<div class="line"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="info">
|
||||
<div class="line"></div>
|
||||
<div class="line"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item style2" :class="{ active: form.browseMode == 'grid' }"
|
||||
@click="form.browseMode = 'grid'">
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="cover"></div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { basicSettingGet, basicSettingPost } from '@/api/points.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
form: {
|
||||
id: '',
|
||||
rewardsGroup: 'all',
|
||||
deductionGroup: 'all',
|
||||
enableRewards: 1,
|
||||
consumeAmount: "",
|
||||
enableDeduction: 1,
|
||||
minPaymentAmount: "",
|
||||
maxDeductionRatio: "",
|
||||
equivalentPoints: "",
|
||||
enablePointsMall: 1,
|
||||
browseMode: 'list'
|
||||
},
|
||||
rules: {
|
||||
consumeAmount: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
minPaymentAmount: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
maxDeductionRatio: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
equivalentPoints: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.basicSettingGet()
|
||||
},
|
||||
methods: {
|
||||
// 过滤input只能输入整数
|
||||
inputFilterInt(e, key) {
|
||||
if (!e) return
|
||||
setTimeout(() => {
|
||||
this.form[key] = e.replace(/[^\d]/g, '')
|
||||
}, 50)
|
||||
},
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
this.form.shopId = localStorage.getItem('shopId')
|
||||
await basicSettingPost(this.form)
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `保存成功`,
|
||||
type: 'success'
|
||||
});
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取店铺设置
|
||||
async basicSettingGet() {
|
||||
try {
|
||||
const res = await basicSettingGet()
|
||||
if (res.id) {
|
||||
this.form = res
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.style_wrap {
|
||||
display: flex;
|
||||
width: 350px;
|
||||
gap: 50px;
|
||||
|
||||
.item {
|
||||
flex: 1;
|
||||
padding: 10px;
|
||||
border: 1px solid #ddd;
|
||||
$color: #3F9EFF;
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&.active {
|
||||
border-color: $color;
|
||||
}
|
||||
|
||||
.cover {
|
||||
background-color: $color;
|
||||
}
|
||||
|
||||
.line {
|
||||
background-color: #D9D9D9;
|
||||
}
|
||||
|
||||
&.style1 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
|
||||
.row {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
|
||||
.cover {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
padding-left: 10px;
|
||||
|
||||
.line {
|
||||
flex: 1;
|
||||
|
||||
&:nth-child(1) {
|
||||
width: 80%;
|
||||
flex: 2;
|
||||
}
|
||||
|
||||
&:nth-child(3) {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.style2 {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
grid-template-rows: repeat(2, 1fr);
|
||||
grid-column-gap: 10px;
|
||||
grid-row-gap: 10px;
|
||||
|
||||
.row:nth-child(1) {
|
||||
grid-area: 1 / 1 / 2 / 2;
|
||||
}
|
||||
|
||||
.row:nth-child(2) {
|
||||
grid-area: 1 / 2 / 2 / 3;
|
||||
}
|
||||
|
||||
.row:nth-child(3) {
|
||||
grid-area: 2 / 1 / 3 / 2;
|
||||
}
|
||||
|
||||
.row:nth-child(4) {
|
||||
grid-area: 2 / 2 / 3 / 3;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.cover {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.line {
|
||||
height: 4px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
<!-- 添加积分商品/优惠券 -->
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog :title="form.id ? '编辑商品' : '添加商品'" :visible.sync="dialogVisible" @close="reset">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="奖品类型">
|
||||
<el-radio-group v-model="form.goodsCategory">
|
||||
<el-radio label="physical">实物商品</el-radio>
|
||||
<!-- <el-radio label="coupon">优惠券</el-radio> -->
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="商品图片" prop="goodsImageUrl">
|
||||
<div class="img_list">
|
||||
<div class="item" v-if="form.goodsImageUrl" @click="form.goodsImageUrl = ''">
|
||||
<el-image :src="form.goodsImageUrl" style="width: 100%;height: 100%" />
|
||||
<div class="del">删除</div>
|
||||
</div>
|
||||
<div class="item upload" @click="$refs.addImg.show()" v-else>
|
||||
<i class="icon el-icon-plus"></i>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="商品名称" prop="goodsName">
|
||||
<el-input v-model="form.goodsName" placeholder="请输入商品名称" style="width: 300px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="所需积分" prop="requiredPoints">
|
||||
<el-input v-model="form.requiredPoints" style="width: 130px;"
|
||||
@input="inputFilterInt($event, 'requiredPoints')">
|
||||
<template slot="append">积分</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="额外价格" prop="extraPrice">
|
||||
<el-input v-model="form.extraPrice" style="width: 130px;"
|
||||
@input="inputFilterFloat($event, 'extraPrice')">
|
||||
<template slot="append">元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="数量">
|
||||
<el-input-number v-model="form.quantity" :min="1"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序">
|
||||
<el-input-number v-model="form.sort" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否上架">
|
||||
<el-switch v-model.trim="form.status" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
<addImg ref="addImg" @successEvent="e => form.goodsImageUrl = e[0].url" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { goodsSettingAdd } from '@/api/points.js'
|
||||
import addImg from "@/views/product/components/addImages.vue";
|
||||
export default {
|
||||
components: {
|
||||
addImg
|
||||
},
|
||||
data() {
|
||||
const validateCoverImg = (rule, value, callback) => {
|
||||
if (!this.form.goodsImageUrl) {
|
||||
callback(new Error("请上传商品图片"));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
form: {
|
||||
goodsCategory: 'physical',
|
||||
goodsName: '',
|
||||
goodsImageUrl: '',
|
||||
requiredPoints: '',
|
||||
extraPrice: 0,
|
||||
quantity: '',
|
||||
status: 1,
|
||||
sort: 0,
|
||||
goodsDescription: ''
|
||||
},
|
||||
resetForm: '',
|
||||
rules: {
|
||||
goodsName: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
goodsImageUrl: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateCoverImg,
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
requiredPoints: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
extraPrice: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form }
|
||||
},
|
||||
methods: {
|
||||
// 过滤input只能输入整数
|
||||
inputFilterInt(e, key) {
|
||||
if (!e) return
|
||||
setTimeout(() => {
|
||||
this.form[key] = e.replace(/[^\d]/g, '')
|
||||
}, 50)
|
||||
},
|
||||
// 过滤input只能输入数字,并且最多输入两位小数
|
||||
inputFilterFloat(value, key) {
|
||||
if (!value) return
|
||||
// 去除首位小数点
|
||||
if (value.startsWith('.')) {
|
||||
value = value.slice(1);
|
||||
}
|
||||
// 清除非数字和小数点(除了第一个小数点)
|
||||
value = value.replace(/[^\d.]/g, '');
|
||||
// 确保最多只有一个小数点
|
||||
if (value.split('.').length > 2) {
|
||||
value = value.split('.').slice(0, 2).join('.');
|
||||
}
|
||||
// 限制小数位数为两位
|
||||
if (value.split('.')[1] && value.split('.')[1].length > 2) {
|
||||
value = value.split('.')[0] + '.' + value.split('.')[1].slice(0, 2);
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.form[key] = value
|
||||
}, 50)
|
||||
},
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
this.form.shopId = localStorage.getItem('shopId')
|
||||
await goodsSettingAdd(this.form)
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `${this.form.id ? '编辑' : '添加'}成功`,
|
||||
type: 'success'
|
||||
});
|
||||
this.$emit('success')
|
||||
this.close()
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
reset() {
|
||||
this.form = { ...this.resetForm }
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
show(row) {
|
||||
if (row && row.id) {
|
||||
this.form = { ...row }
|
||||
}
|
||||
this.dialogVisible = true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.img_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
|
||||
.item {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #F5F7FA;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&.upload {
|
||||
border: 1px dashed #ddd;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.del {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.del {
|
||||
width: 100%;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(3px);
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
transform: translateY(100%);
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 20px;
|
||||
color: #ddd;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
<template>
|
||||
<div>
|
||||
<div><el-button type="primary" @click="$refs.ShopAdd.show()">添加商品</el-button></div>
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.list" v-loading="tableData.loading">
|
||||
<el-table-column label="商品" prop="goodsName">
|
||||
<template v-slot="scope">
|
||||
<div class="goods_info">
|
||||
<el-image :src="scope.row.goodsImageUrl" style="width:40px;height:40px;flex-shrink: 0;"
|
||||
:preview-src-list="srcList" />
|
||||
<span>{{ scope.row.goodsName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="所需积分" prop="requiredPoints"></el-table-column>
|
||||
<el-table-column label="额外价格「元」" prop="extraPrice"></el-table-column>
|
||||
<el-table-column label="累计兑换次数" prop="totalExchangeCount"></el-table-column>
|
||||
<el-table-column label="库存" prop="quantity"></el-table-column>
|
||||
<el-table-column label="状态" prop="status">
|
||||
<template v-slot="scope">
|
||||
<el-tag type="success" disable-transitions v-if="scope.row.status == 1">上架</el-tag>
|
||||
<el-tag type="danger" disable-transitions v-if="scope.row.status == 0">下架</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text" icon="el-icon-edit" @click="editorHandle(scope.row)">编辑</el-button>
|
||||
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle(scope.row.id)">
|
||||
<el-button type="text" icon="el-icon-delete" slot="reference">删除</el-button>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
|
||||
:page-size="tableData.size" @current-change="paginationChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
<!-- 添加积分商品/积分 -->
|
||||
<ShopAdd ref="ShopAdd" @success="resetTable" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ShopAdd from './shop_add.vue'
|
||||
import { goodsSettingPage, goodsDelete } from '@/api/points.js'
|
||||
export default {
|
||||
components: { ShopAdd },
|
||||
data() {
|
||||
return {
|
||||
srcList: [],
|
||||
tableData: {
|
||||
sort: 'createdAt,desc',
|
||||
list: [],
|
||||
page: 1,
|
||||
size: 30,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getTableData()
|
||||
},
|
||||
methods: {
|
||||
// 编辑 预览
|
||||
editorHandle(row) {
|
||||
this.$refs.ShopAdd.show(row)
|
||||
},
|
||||
// 删除
|
||||
async delTableHandle(id) {
|
||||
try {
|
||||
await goodsDelete(id)
|
||||
this.$message.success('已删除')
|
||||
this.getTableData()
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
resetTable() {
|
||||
this.tableData.page = 1
|
||||
this.tableData.size = 30
|
||||
this.getTableData()
|
||||
},
|
||||
handleSizeChange(val) {
|
||||
this.tableData.size = val
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取积分商品列表
|
||||
async getTableData() {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
const res = await goodsSettingPage({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
goodsName: '',
|
||||
goodsCategory: 'physical',
|
||||
status: ''
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.list = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
// 预览图集合
|
||||
this.srcList = res.content.map(item => item.goodsImageUrl)
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.head-container {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.goods_info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs v-model="activeName" type="card">
|
||||
<el-tab-pane label="基本设置" name="1"></el-tab-pane>
|
||||
<el-tab-pane label="分享设置" name="2"></el-tab-pane>
|
||||
<el-tab-pane label="邀请记录" name="3"></el-tab-pane>
|
||||
</el-tabs>
|
||||
<Setting v-if="activeName == 1" />
|
||||
<Share v-if="activeName == 2" />
|
||||
<Record v-if="activeName == 3" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Setting from './components/invite_friend/setting.vue'
|
||||
import Share from './components/invite_friend/share.vue'
|
||||
import Record from './components/invite_friend/record.vue'
|
||||
export default {
|
||||
name: 'invite_friend',
|
||||
components: {
|
||||
Setting,
|
||||
Share,
|
||||
Record
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
activeName: '1'
|
||||
}
|
||||
},
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tabs) {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs v-model="activeName" type="card">
|
||||
<el-tab-pane label="基本设置" name="1"></el-tab-pane>
|
||||
<el-tab-pane label="商品设置" name="2"></el-tab-pane>
|
||||
<el-tab-pane label="兑换记录" name="3"></el-tab-pane>
|
||||
</el-tabs>
|
||||
<Setting v-if="activeName == 1" />
|
||||
<ShopList v-if="activeName == 2" />
|
||||
<Record v-if="activeName == 3" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Setting from './components/member_points/setting.vue'
|
||||
import ShopList from './components/member_points/shop_list.vue'
|
||||
import Record from './components/member_points/record.vue'
|
||||
export default {
|
||||
name: "member_points",
|
||||
components: {
|
||||
Setting,
|
||||
ShopList,
|
||||
Record
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
activeName: '1'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tabs) {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,501 @@
|
|||
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<div class="tab">
|
||||
<div v-for="(item,index) in tabList" v-if="(form.id&&form.type == item.type)||!form.id" :key="index" class="tab_item" :class="{active: form.type == item.type}" @click="tabClick(item)"> {{ item.name }} <span class="bor" /></div>
|
||||
</div>
|
||||
<!-- 优惠券 -->
|
||||
<div v-if="form.type == 1" class="content">
|
||||
<el-form ref="form" :inline="true" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="优惠券券名" prop="title" style="width: 100%;">
|
||||
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.type == 1" label="使用门槛" prop="fullAmount">
|
||||
<el-input v-model="form.fullAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 180px;margin-right: 66px;">
|
||||
<template slot="prepend">满</template>
|
||||
<template slot="append">元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.type == 1" label="" prop="discountAmount">
|
||||
<el-input v-model="form.discountAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 180px;">
|
||||
<template slot="prepend">减</template>
|
||||
<template slot="append">元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="有效期类型" style="width: 100%;">
|
||||
<el-radio-group v-model="form.validityType">
|
||||
<el-radio v-for="item in couponEnum.validityType" :key="item.value" :label="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.validityType == 'fixed'" label="有效期(天)" prop="validDays" style="width: 100%;">
|
||||
<el-input v-model="form.validDays" placeholder="" style="width: 200px;">
|
||||
<template slot="append">天</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.validityType == 'custom'" label="有效时间" prop="validEndTime" style="width: 100%;">
|
||||
<el-date-picker
|
||||
v-model="validityTime"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['06:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
@change="validityChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="使用门槛" prop="daysToTakeEffect" style="width: 100%;">
|
||||
<el-input v-model="form.daysToTakeEffect" placeholder="" style="width: 200px;">
|
||||
<template slot="prepend">隔</template>
|
||||
<template slot="append">天生效</template>
|
||||
</el-input>
|
||||
<el-tooltip class="item" effect="dark" content="领取后0天后0点0分" placement="top-start">
|
||||
<i class="el-icon-question" />
|
||||
</el-tooltip>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="可用周期" prop="userDays" style="width: 100%;">
|
||||
<el-checkbox-group v-model="form.userDays">
|
||||
<el-checkbox v-for="(city,index) in couponEnum.cycle" :key="index" :label="city.label" @change="userDayChagne">{{ city.label }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="指定时间段" style="width: 100%;">
|
||||
<el-radio-group v-model="form.useTimeType">
|
||||
<el-radio v-for="item in couponEnum.useTimeType" :key="item.value" :label="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.useTimeType == 'custom'" label="指定时间段" prop="useEndTime" style="width: 100%;">
|
||||
<el-time-picker
|
||||
v-model="useTime"
|
||||
is-range
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
value-format="HH:mm"
|
||||
@change="useTimeChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发放数量" prop="number" style="width: 100%;">
|
||||
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 200px;" />
|
||||
<!-- <el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时,集草等活动仍会赠送)" placement="top-start">
|
||||
<i class="el-icon-question" />
|
||||
</el-tooltip> -->
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<!-- <el-button @click="dialogVisible = false">取 消</el-button> -->
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</span>
|
||||
</div>
|
||||
<div v-if="form.type == 2">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="优惠券券名" prop="title" style="width: 100%;">
|
||||
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="使用门槛" prop="fullAmount">
|
||||
金额满<el-input v-model="form.fullAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 100px;margin: 0 23px;"><template slot="suffix">元</template></el-input>可用
|
||||
</el-form-item>
|
||||
<el-form-item label="有效期类型" style="width: 100%;">
|
||||
<el-radio-group v-model="form.validityType">
|
||||
<el-radio v-for="item in couponEnum.validityType" :key="item.value" :label="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.validityType == 'fixed'" label="有效期(天)" prop="validDays" style="width: 100%;">
|
||||
<el-input v-model="form.validDays" placeholder="" style="width: 200px;">
|
||||
<template slot="append">天</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.validityType == 'custom'" label="有效时间" prop="validEndTime" style="width: 100%;">
|
||||
<el-date-picker
|
||||
v-model="validityTime"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['06:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
@change="validityChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="使用门槛" prop="daysToTakeEffect" style="width: 100%;">
|
||||
<el-input v-model="form.daysToTakeEffect" placeholder="" style="width: 200px;">
|
||||
<template slot="prepend">隔</template>
|
||||
<template slot="append">天生效</template>
|
||||
</el-input>
|
||||
<el-tooltip class="item" effect="dark" content="领取后0天后0点0分" placement="top-start">
|
||||
<i class="el-icon-question" />
|
||||
</el-tooltip>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="可用周期" prop="userDays" style="width: 100%;">
|
||||
<el-checkbox-group v-model="form.userDays">
|
||||
<el-checkbox v-for="(city,index) in couponEnum.cycle" :key="index" :label="city.label" @change="userDayChagne">{{ city.label }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="指定时间段" style="width: 100%;">
|
||||
<el-radio-group v-model="form.useTimeType">
|
||||
<el-radio v-for="item in couponEnum.useTimeType" :key="item.value" :label="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.useTimeType == 'custom'" label="指定时间段" prop="useEndTime" style="width: 100%;">
|
||||
<el-time-picker
|
||||
v-model="useTime"
|
||||
is-range
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
value-format="HH:mm"
|
||||
@change="useTimeChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发放数量" prop="number" style="width: 100%;">
|
||||
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 200px;" />
|
||||
<!-- <el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时,集草等活动仍会赠送)" placement="top-start">
|
||||
<i class="el-icon-question" />
|
||||
</el-tooltip> -->
|
||||
</el-form-item>
|
||||
<el-form-item label="赠送商品" prop="products">
|
||||
<div>
|
||||
<el-button type="primary" icon="el-icon-plus" @click="$refs.shopListRef.show([...form.products])">
|
||||
添加 </el-button>
|
||||
</div>
|
||||
<div class="shop_list">
|
||||
<div
|
||||
v-for="(item, index) in form.products"
|
||||
:key="item.id"
|
||||
class="item_wrap"
|
||||
>
|
||||
<div class="name">{{ item.name }}</div>
|
||||
<el-input v-model="item.num" placeholder="请填写数量" style="width: 100px;" />
|
||||
<div class="del" @click="form.products.splice(index, 1)">删除</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<!-- <el-button @click="dialogVisible = false">取 消</el-button> -->
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</span>
|
||||
</div>
|
||||
<shopList ref="shopListRef" @success="slectShop" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import couponEnum from './couponEnum'
|
||||
import shopList from '@/components/shopList'
|
||||
import { addTbShopCoupon, getTbShopCouponInfo } from '@/api/coupon'
|
||||
export default {
|
||||
components: { shopList },
|
||||
data() {
|
||||
const validateProduct = (rule, value, callback) => {
|
||||
if (!this.form.products.length) {
|
||||
callback(new Error('请选择商品'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
tabList: [
|
||||
{ name: '新增优惠券', type: 1 },
|
||||
{ name: '新增商品券', type: 2 }
|
||||
],
|
||||
tabActive: 1,
|
||||
couponEnum,
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
validityTime: [],
|
||||
useTime: ['06:00:00', '23:59:59'],
|
||||
form: {
|
||||
id: '',
|
||||
shopId: '',
|
||||
type: '1',
|
||||
title: '',
|
||||
fullAmount: null,
|
||||
discountAmount: null,
|
||||
validityType: 'fixed',
|
||||
validStartTime: '',
|
||||
validEndTime: '',
|
||||
userDays: [],
|
||||
validDays: '',
|
||||
useTimeType: 'all',
|
||||
useStartTime: '',
|
||||
useEndTime: '',
|
||||
products: [],
|
||||
number: ''
|
||||
},
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写券名',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
fullAmount: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写满减金额',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
discountAmount: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写满减金额',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
number: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写发放数量',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
validDays: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写有效天数',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
daysToTakeEffect: [
|
||||
{
|
||||
required: true,
|
||||
message: '填写生效天数',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
userDays: [
|
||||
{
|
||||
required: true,
|
||||
message: '选择可用周期',
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
validEndTime: [
|
||||
{
|
||||
required: true,
|
||||
message: '选择有效时间段',
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
useEndTime: [
|
||||
{
|
||||
required: true,
|
||||
message: '选择指定时间段',
|
||||
trigger: 'change'
|
||||
}
|
||||
],
|
||||
products: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateProduct,
|
||||
trigger: 'change'
|
||||
}
|
||||
]
|
||||
},
|
||||
resetForm: ''
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form }
|
||||
this.form.type = this.$route.query.type
|
||||
this.form.useStartTime = this.useTime[0]
|
||||
this.form.useEndTime = this.useTime[1]
|
||||
if (this.$route.query.id) { this.form.id = this.$route.query.id; this.getCouponInfo(this.$route.query.id) }
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 切换类型
|
||||
* @param item
|
||||
*/
|
||||
tabClick(item) {
|
||||
console.log(this.form)
|
||||
this.form = this.resetForm
|
||||
this.form.number = ''
|
||||
this.form.type = item.type
|
||||
this.$refs.form.resetFields()
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取优惠券详情
|
||||
*/
|
||||
async getCouponInfo(id) {
|
||||
const resInfo = await getTbShopCouponInfo(id)
|
||||
this.form = resInfo
|
||||
if (resInfo.validityType === 'custom') {
|
||||
this.validityTime = [resInfo.validStartTime, resInfo.validEndTime]
|
||||
}
|
||||
if (resInfo.useTimeType === 'custom') {
|
||||
this.useTime = [resInfo.useStartTime, resInfo.useEndTime]
|
||||
}
|
||||
this.form.userDays = this.form.userDays.split(',')
|
||||
},
|
||||
|
||||
/**
|
||||
* 选择可用周期
|
||||
*/
|
||||
userDayChagne(e) {
|
||||
console.log(this.form.userDays)
|
||||
},
|
||||
|
||||
/**
|
||||
* 有效期选择
|
||||
* @param e
|
||||
*/
|
||||
validityChange(e) {
|
||||
this.form.validStartTime = e[0]
|
||||
this.form.validEndTime = e[1]
|
||||
},
|
||||
|
||||
/**
|
||||
* 指定时间段选择
|
||||
* @param e
|
||||
*/
|
||||
useTimeChange(e) {
|
||||
this.form.useStartTime = e[0]
|
||||
this.form.useEndTime = e[1]
|
||||
},
|
||||
|
||||
/**
|
||||
* 选择商品
|
||||
* @param res
|
||||
*/
|
||||
slectShop(res) {
|
||||
if (res.length <= 0) {
|
||||
return
|
||||
}
|
||||
this.form.products = []
|
||||
if (this.form.products.length) {
|
||||
res.map(async item => {
|
||||
if (!await this.checkShop(item.id)) {
|
||||
this.form.products.push({
|
||||
productId: item.id,
|
||||
name: item.name,
|
||||
num: null
|
||||
})
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.form.products.push({
|
||||
productId: res[0].id,
|
||||
name: res[0].name,
|
||||
num: null
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 判断是否存在重复商品
|
||||
* @param id
|
||||
*/
|
||||
checkShop(id) {
|
||||
let falg = false
|
||||
this.form.products.map(item => {
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (item.id == id) {
|
||||
falg = true
|
||||
}
|
||||
})
|
||||
return falg
|
||||
},
|
||||
|
||||
/**
|
||||
* 提交
|
||||
*/
|
||||
onSubmitHandle() {
|
||||
console.log(this.form)
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
if (!this.form.shopId) { this.form.shopId = localStorage.getItem('shopId') }
|
||||
this.form.userDays = this.form.userDays.toString()
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const res = await addTbShopCoupon(this.form)
|
||||
this.$store.dispatch('tagsView/delView', this.$route) // 关闭当前页
|
||||
this.$router.replace({ name: 'coupon_list' }) // 要打开的页面
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `${this.form.id ? '编辑' : '添加'}成功`,
|
||||
type: 'success'
|
||||
})
|
||||
this.loading = false
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.tab{
|
||||
display: flex;
|
||||
margin-bottom: 30px;
|
||||
padding-top: 40px;
|
||||
padding-left: 10px;
|
||||
.tab_item{
|
||||
margin-right: 64px;
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
color: #666666;
|
||||
cursor: pointer;
|
||||
.bor{
|
||||
display: block;
|
||||
width: 56px;
|
||||
height: 6px;
|
||||
background-color: transparent;
|
||||
border-radius: 3px 3px 3px 3px;
|
||||
margin: 5px auto 0;
|
||||
}
|
||||
}
|
||||
.active{
|
||||
color: #3F9EFF;
|
||||
.bor{
|
||||
background-color: #3F9EFF;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.content{
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
color: #666666;
|
||||
}
|
||||
.shop_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 15px;
|
||||
.item_wrap {
|
||||
$size: 80px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.name {
|
||||
width: $size;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.del{
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
color: #3F9EFF;
|
||||
margin-left: 11px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,277 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-dialog title="添加优惠券" :visible.sync="dialogVisible" @close="reset">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="优惠卷名称" prop="title">
|
||||
<el-input v-model="form.title" placeholder="请输入优惠卷名称" style="width: 200px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="类型">
|
||||
<el-radio-group v-model="form.classType">
|
||||
<el-radio :label="item.value" v-for="item in couponEnum.classType" :key="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="选择商品" v-if="form.classType == 'product'" prop="classType">
|
||||
<div>
|
||||
<el-button type="primary" icon="el-icon-plus" @click="$refs.shopListRef.show([...productIds])">
|
||||
添加商品
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="shop_list">
|
||||
<div class="item_wrap" v-for="(item, index) in productIds" :key="item.id"
|
||||
@click="productIds.splice(index, 1)">
|
||||
<div class="item" :data-index="index + 1">
|
||||
<el-image :src="item.coverImg" style="width: 100%;height: 100%;"></el-image>
|
||||
</div>
|
||||
<div class="name">{{ item.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="优惠类型">
|
||||
<el-radio-group v-model="form.type">
|
||||
<el-radio :label="item.value" v-for="item in couponEnum.type" :key="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="满减限制" v-if="form.type == '0'">
|
||||
<el-input-number v-model="form.limitAmount" controls-position="right" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="折扣" v-if="form.type == '1'">
|
||||
<el-input-number v-model="form.ratio" controls-position="right" :min="1"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="优惠券面额">
|
||||
<el-input-number v-model="form.amount" controls-position="right" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="发放数量">
|
||||
<el-input-number v-model="form.number" controls-position="right" :min="1"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="限领数量">
|
||||
<el-input-number v-model="form.limitNumber" controls-position="right" :min="1"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="有效期">
|
||||
<el-radio-group v-model="form.effectType">
|
||||
<el-radio :label="item.value" v-for="item in couponEnum.effectType" :key="item.value">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="有效时间" v-if="form.effectType == 1">
|
||||
<el-date-picker v-model="selectTime" type="daterange" range-separator="至" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-switch v-model="form.status" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
<shopList ref="shopListRef" @success="slectShop" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import couponEnum from './../couponEnum'
|
||||
import shopList from '@/components/shopList'
|
||||
import { tbMerchantCoupon } from '@/api/shop'
|
||||
export default {
|
||||
components: { shopList },
|
||||
data() {
|
||||
const validateProduct = (rule, value, callback) => {
|
||||
if (!this.productIds.length) {
|
||||
callback(new Error('请选择商品'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
couponEnum,
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
selectTime: [],
|
||||
form: {
|
||||
id: '',
|
||||
title: '',
|
||||
classType: 'product',
|
||||
type: '0',
|
||||
limitAmount: '',
|
||||
ratio: '1',
|
||||
amount: '',
|
||||
number: '1',
|
||||
limitNumber: '1',
|
||||
effectType: '0',
|
||||
fromTime: '',
|
||||
toTime: '',
|
||||
relationIds: '',
|
||||
status: 1
|
||||
},
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: ' ',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
classType: [
|
||||
{
|
||||
required: true,
|
||||
validator: validateProduct,
|
||||
trigger: 'change'
|
||||
}
|
||||
]
|
||||
},
|
||||
resetForm: '',
|
||||
productIds: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form }
|
||||
},
|
||||
methods: {
|
||||
// 选择商品
|
||||
slectShop(res) {
|
||||
if (this.productIds.length) {
|
||||
res.map(async item => {
|
||||
if (!await this.checkShop(item.id)) {
|
||||
this.productIds.push({ ...item })
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.productIds = res
|
||||
}
|
||||
},
|
||||
// 判断是否存在重复商品
|
||||
checkShop(id) {
|
||||
let falg = false
|
||||
this.productIds.map(item => {
|
||||
if (item.id == id) {
|
||||
falg = true
|
||||
}
|
||||
})
|
||||
return falg
|
||||
},
|
||||
// 提交
|
||||
onSubmitHandle() {
|
||||
console.log(this.form)
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true
|
||||
this.form.shopId = localStorage.getItem('shopId')
|
||||
this.form.fromTime = this.selectTime[0] || ''
|
||||
this.form.toTime = this.selectTime[1] || ''
|
||||
|
||||
let arr = []
|
||||
if (this.form.classType == 'product') {
|
||||
arr = this.productIds.map(item => item.id)
|
||||
}
|
||||
|
||||
this.form.relationIds = arr.join(',')
|
||||
|
||||
let res = await tbMerchantCoupon(this.form, this.form.id ? 'put' : 'post')
|
||||
this.$emit('success', res)
|
||||
this.close()
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
message: `${this.form.id ? '编辑' : '添加'}成功`,
|
||||
type: 'success'
|
||||
});
|
||||
this.loading = false
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
show(obj) {
|
||||
this.dialogVisible = true
|
||||
if (obj && obj.id) {
|
||||
this.form = { ...obj }
|
||||
}
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
reset() {
|
||||
this.form = { ...this.resetForm }
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.shop_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.item_wrap {
|
||||
$size: 80px;
|
||||
|
||||
.item {
|
||||
$radius: 4px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
border-radius: $radius;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
margin-right: 10px;
|
||||
margin-top: 10px;
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: attr(data-index);
|
||||
font-size: 12px;
|
||||
height: 20px;
|
||||
display: flex;
|
||||
padding: 0 10px;
|
||||
border-radius: 0 0 $radius 0;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: '删除';
|
||||
font-size: 12px;
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
display: flex;
|
||||
padding: 0 10px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
transition: all .1s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
.name {
|
||||
width: $size;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,312 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-dialog title="领取详情" :visible.sync="dialogVisible" width="70%" @close="reset">
|
||||
<div class="search">
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<el-form-item>
|
||||
<el-input v-model="query.value" placeholder="用户ID/用户昵称/用户手机" style="width: 180px;" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="query.status" placeholder="选择状态" style="width: 154px;">
|
||||
<el-option
|
||||
v-for="item in stateList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item />
|
||||
<el-form-item label="领取时间">
|
||||
<el-date-picker
|
||||
v-model="queryTime"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
@change="queryTimeChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getTableData">查询</el-button>
|
||||
<!-- <el-button v-loading="downloadLoading" icon="el-icon-download" @click="downloadHandle">
|
||||
<span v-if="!downloadLoading">导出</span>
|
||||
<span v-else>下载中...</span>
|
||||
</el-button> -->
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table v-loading="loading" :data="tableData.data">
|
||||
|
||||
<el-table-column label="用户ID" prop="id" />
|
||||
<el-table-column label="用户名" prpo="name">
|
||||
<template v-slot="scope">
|
||||
<div>{{ scope.row.name ? scope.row.name : '-' }}</div>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="领取时间" prop="receiveTime" />
|
||||
<el-table-column label="使用时间" prpo="useTime">
|
||||
<template v-slot="scope">
|
||||
<div>{{ scope.row.useTime ? scope.row.useTime : '-' }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="获得来源" prpo="source">
|
||||
<template v-slot="scope">
|
||||
<div>{{ scope.row.source == 'activate' ? '充值活动' :
|
||||
scope.row.source == 'invited' ? '好友分享' : '' }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="status">
|
||||
<template v-slot="scope">
|
||||
<div style="display: flex;align-items: center;">
|
||||
<div v-if="scope.row.overNum == scope.row.num" style="color: #FAAD14;">未使用</div>
|
||||
<div v-if="scope.row.num!=0&&scope.row.overNum != scope.row.num">{{ scope.row.overNum }}/{{ scope.row.num }}</div>
|
||||
<div v-if="scope.row.overNum == 0" style="color: #52C41A;">已使用</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="使用门店" prpo="useTime">
|
||||
<template v-slot="scope">
|
||||
<div>{{ scope.row.tableName ? scope.row.tableName : '-' }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150">
|
||||
<template v-slot="scope">
|
||||
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
|
||||
<el-button
|
||||
slot="reference"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
style="color: #FF4D4F;"
|
||||
>删除</el-button>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination
|
||||
:total="tableData.total"
|
||||
:current-page="tableData.page"
|
||||
:page-size="tableData.size"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
@current-change="paginationChange"
|
||||
@size-change="sizeChange"
|
||||
/>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { queryReceive, delReceive } from '@/api/coupon'
|
||||
|
||||
export default {
|
||||
// eslint-disable-next-line vue/require-prop-types
|
||||
props: ['couponId'],
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
downloadLoading: false,
|
||||
loading: false,
|
||||
stateList: [
|
||||
{ label: '未使用', value: 0 },
|
||||
{ label: '已使用', value: 1 }
|
||||
],
|
||||
queryTime: [],
|
||||
query: {
|
||||
couponId: '',
|
||||
value: '',
|
||||
status: 0,
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
page: 1,
|
||||
size: 10
|
||||
},
|
||||
resetQuery: null,
|
||||
tableData: {
|
||||
data: [],
|
||||
page: 1,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetQuery = { ...this.query }
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 查询
|
||||
*/
|
||||
async getTableData() {
|
||||
// eslint-disable-next-line no-unused-vars, prefer-const
|
||||
// console.log(this.couponId)
|
||||
|
||||
// eslint-disable-next-line no-unused-vars, prefer-const
|
||||
let res = await queryReceive({
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
couponId: this.query.couponId,
|
||||
value: this.query.value,
|
||||
status: this.query.status,
|
||||
startTime: this.query.startTime,
|
||||
endTime: this.query.endTime,
|
||||
page: this.query.page,
|
||||
size: this.query.size
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.data = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
},
|
||||
|
||||
/**
|
||||
* 时间选择监听
|
||||
*/
|
||||
queryTimeChange(e) {
|
||||
if (e) {
|
||||
this.query.startTime = e[0]
|
||||
this.query.endTime = e[1]
|
||||
} else {
|
||||
this.query.startTime = ''
|
||||
this.query.endTime = ''
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除优惠券
|
||||
* @param id
|
||||
*/
|
||||
async delTableHandle(id) {
|
||||
// eslint-disable-next-line no-undef
|
||||
const delRes = await delReceive(id)
|
||||
console.log(delRes)
|
||||
this.getTableData()
|
||||
},
|
||||
|
||||
/**
|
||||
* 打开详情
|
||||
* @param obj
|
||||
*/
|
||||
show(obj) {
|
||||
console.log(obj)
|
||||
this.dialogVisible = true
|
||||
this.query.couponId = obj.id
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e
|
||||
this.query.page = e
|
||||
this.getTableData()
|
||||
},
|
||||
/**
|
||||
* 关闭详情
|
||||
*/
|
||||
close() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
|
||||
/**
|
||||
* 导出Excel
|
||||
*/
|
||||
async downloadHandle() {
|
||||
try {
|
||||
this.downloadLoading = true
|
||||
// eslint-disable-next-line no-undef
|
||||
const file = await summaryTableDownload({
|
||||
startTime: this.query.createdAt[0],
|
||||
endTime: this.query.createdAt[1]
|
||||
})
|
||||
// eslint-disable-next-line no-undef
|
||||
downloadFile(file, '数据', 'xlsx')
|
||||
this.downloadLoading = false
|
||||
} catch (error) {
|
||||
this.downloadLoading = false
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
reset() {
|
||||
this.query = { ...this.resetQuery }
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.shop_list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.item_wrap {
|
||||
$size: 80px;
|
||||
|
||||
.item {
|
||||
$radius: 4px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
border-radius: $radius;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
margin-right: 10px;
|
||||
margin-top: 10px;
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: attr(data-index);
|
||||
font-size: 12px;
|
||||
height: 20px;
|
||||
display: flex;
|
||||
padding: 0 10px;
|
||||
border-radius: 0 0 $radius 0;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: '删除';
|
||||
font-size: 12px;
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
display: flex;
|
||||
padding: 0 10px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
transition: all .1s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
.name {
|
||||
width: $size;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,32 +1,51 @@
|
|||
export default {
|
||||
classType: [
|
||||
{
|
||||
value: 'product',
|
||||
label: '商品券'
|
||||
},
|
||||
{
|
||||
value: 'common',
|
||||
label: '通用券'
|
||||
}
|
||||
],
|
||||
type: [
|
||||
{
|
||||
value: '0',
|
||||
label: '满减'
|
||||
},
|
||||
{
|
||||
value: '1',
|
||||
label: '折扣'
|
||||
}
|
||||
],
|
||||
effectType: [
|
||||
{
|
||||
value: '0',
|
||||
label: '一直有效'
|
||||
},
|
||||
{
|
||||
value: '1',
|
||||
label: '时限有效'
|
||||
}
|
||||
]
|
||||
}
|
||||
classType: [
|
||||
{
|
||||
value: 'product',
|
||||
label: '商品券'
|
||||
},
|
||||
{
|
||||
value: 'common',
|
||||
label: '通用券'
|
||||
}
|
||||
],
|
||||
type: [
|
||||
{
|
||||
value: '0',
|
||||
label: '满减'
|
||||
},
|
||||
{
|
||||
value: '1',
|
||||
label: '折扣'
|
||||
}
|
||||
],
|
||||
cycle: [
|
||||
{ label: '周一' },
|
||||
{ label: '周二' },
|
||||
{ label: '周三' },
|
||||
{ label: '周四' },
|
||||
{ label: '周五' },
|
||||
{ label: '周六' },
|
||||
{ label: '周七' }
|
||||
],
|
||||
validityType: [
|
||||
{
|
||||
value: 'fixed',
|
||||
label: '领券后有效期内可用'
|
||||
},
|
||||
{
|
||||
value: 'custom',
|
||||
label: '固定有效期范围内可用'
|
||||
}
|
||||
],
|
||||
useTimeType: [
|
||||
{
|
||||
value: 'all',
|
||||
label: '全时段可用'
|
||||
},
|
||||
{
|
||||
value: 'custom',
|
||||
label: '指定时间段'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,118 +1,163 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<div class="head-container">
|
||||
<el-button type="primary" icon="el-icon-plus" @click="$refs.addCoupon.show()">
|
||||
添加优惠券
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.data" v-loading="tableData.loading">
|
||||
<el-table-column label="优惠券名称" prop="title"></el-table-column>
|
||||
<el-table-column label="类型" prop="classType">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.classType | classTypeFilter }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="优惠类型" prop="type">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.type | typeFilter }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="折扣" prop="ratio"></el-table-column>
|
||||
<el-table-column label="面额" prop="amount"></el-table-column>
|
||||
<el-table-column label="满减限制" prop="limitAmount"></el-table-column>
|
||||
<el-table-column label="发放数量" prop="number"></el-table-column>
|
||||
<el-table-column label="限领数量" prop="limitNumber"></el-table-column>
|
||||
<el-table-column label="剩余数量" prop="leftNumber"></el-table-column>
|
||||
<el-table-column label="有效期" prop="effectType">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.effectType | effectTypeFilter }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间" prop="fromTime"></el-table-column>
|
||||
<el-table-column label="到期时间" prop="toTime"></el-table-column>
|
||||
<el-table-column label="商品列表" prop="relationIds" width="200">
|
||||
<template v-slot="scope">
|
||||
<div style="display: flex;" v-if="scope.row.classType == 'product'">
|
||||
<el-image :src="scope.row.coverImg" style="width: 30px;height: 30px;"></el-image>
|
||||
<span style="margin-left: 10px;">{{ scope.row.name }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
|
||||
@current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
<addCoupon ref="addCoupon" @success="resetHandle" />
|
||||
<div class="app-container">
|
||||
<div class="head-container">
|
||||
<!-- <el-button type="primary" icon="el-icon-plus" @click="$refs.addCoupon.show()">
|
||||
添加优惠券
|
||||
</el-button> -->
|
||||
<el-button type="primary" icon="el-icon-plus" @click="$router.push({name: 'add_coupon', query: {type:1}})">
|
||||
添加优惠券
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table v-loading="tableData.loading" :data="tableData.data">
|
||||
<el-table-column label="ID" prop="id" />
|
||||
<el-table-column label="名称" prop="title" />
|
||||
<el-table-column label="使用门槛">
|
||||
<template v-slot="scope">
|
||||
{{ `满${scope.row.fullAmount}${scope.row.discountAmount?'减'+scope.row.discountAmount+'元':''}` }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="有效期">
|
||||
<template v-slot="scope">
|
||||
{{ `领券后${scope.row.validDays}天过期` }}
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- <el-table-column label="用户领取方式" prpo="source">
|
||||
<template v-slot="scope">
|
||||
<div>{{ scope.row.source == 'activate' ? '充值活动' :
|
||||
scope.row.source == 'invited' ? '好友分享' : '' }}</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="总发放数量" prop="number" />
|
||||
<el-table-column label="已领取" align="center">
|
||||
<template v-slot="scope">
|
||||
<div style="display: flex;align-items: center;justify-content: center;">
|
||||
<div style="width: 30px;">{{ scope.row.number-scope.row.leftNumber }}</div>
|
||||
<div style="margin: 0 10px;">|</div>
|
||||
<div style="color: #3F9EFF;cursor: pointer;flex-shrink: 0;" @click="couponDetailsOpen(scope.row)">详情</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已使用" prop="useNumber" />
|
||||
<el-table-column label="剩余" prop="leftNumber" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text" icon="el-icon-edit" @click="$router.push({name: 'add_coupon', query: {type:scope.row.type ,id: scope.row.id}} )">编辑</el-button>
|
||||
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
|
||||
<el-button
|
||||
slot="reference"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
style="margin-left: 20px !important;"
|
||||
>删除</el-button>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination
|
||||
:total="tableData.total"
|
||||
:current-page="tableData.page"
|
||||
:page-size="tableData.size"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
@current-change="paginationChange"
|
||||
@size-change="sizeChange"
|
||||
/>
|
||||
</div>
|
||||
<couponDetails ref="couponDetails" @success="resetHandle" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import couponEnum from './couponEnum'
|
||||
import addCoupon from './components/addCoupon.vue'
|
||||
import { tbMerchantCouponGet } from '@/api/shop'
|
||||
import couponDetails from './components/coupon_details.vue'
|
||||
import { getTbShopCoupon, delTbShopCoupon } from '@/api/coupon'
|
||||
export default {
|
||||
components: { addCoupon },
|
||||
data() {
|
||||
return {
|
||||
tableData: {
|
||||
data: [],
|
||||
page: 0,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0
|
||||
}
|
||||
}
|
||||
// eslint-disable-next-line vue/no-unused-components
|
||||
components: { couponDetails },
|
||||
filters: {
|
||||
|
||||
typeFilter(value) {
|
||||
// eslint-disable-next-line eqeqeq
|
||||
return couponEnum.type.find(item => item.value == value).label
|
||||
},
|
||||
filters: {
|
||||
classTypeFilter(value) {
|
||||
return couponEnum.classType.find(item => item.value == value).label
|
||||
},
|
||||
typeFilter(value) {
|
||||
return couponEnum.type.find(item => item.value == value).label
|
||||
},
|
||||
effectTypeFilter(value) {
|
||||
return couponEnum.effectType.find(item => item.value == value).label
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getTableData()
|
||||
},
|
||||
methods: {
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.page = 0
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e - 1
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取商品列表
|
||||
async getTableData() {
|
||||
this.tableData.loading = true
|
||||
try {
|
||||
const res = await tbMerchantCouponGet({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
shopId: localStorage.getItem('shopId')
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.data = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
effectTypeFilter(value) {
|
||||
// eslint-disable-next-line eqeqeq
|
||||
return couponEnum.effectType.find(item => item.value == value).label
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tableData: {
|
||||
data: [],
|
||||
page: 1,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
couponId: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getTableData()
|
||||
},
|
||||
methods: {
|
||||
// 是否允许修改商品
|
||||
toPath(path, row) {
|
||||
this.$router.push({ path: path, query: row })
|
||||
},
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.page = 1
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
console.log(e)
|
||||
this.tableData.page = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取优惠券列表
|
||||
async getTableData() {
|
||||
this.tableData.loading = true
|
||||
try {
|
||||
const res = await getTbShopCoupon({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
shopId: localStorage.getItem('shopId')
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.data = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
console.log(this.tableData)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 查看领取详情
|
||||
*/
|
||||
couponDetailsOpen(row) {
|
||||
this.$refs.couponDetails.show(row)
|
||||
this.couponId = row.id
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除优惠券
|
||||
* @param id
|
||||
*/
|
||||
async delTableHandle(id) {
|
||||
const delRes = await delTbShopCoupon(id)
|
||||
console.log(delRes)
|
||||
this.getTableData()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,217 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="forms">
|
||||
<el-form-item label="打印机品牌">
|
||||
<el-select v-model="forms.contentType" placeholder="请选择打印机品牌">
|
||||
<el-option label="云想印" value="yxyPrinter"></el-option>
|
||||
<el-option label="飞鹅" value="fePrinter"></el-option>
|
||||
<!-- <el-option label="本地" value="local"></el-option> -->
|
||||
<!-- <el-option label="USB" value="printer"></el-option> -->
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="小票打印">
|
||||
<el-select v-model="forms.subType" placeholder="请选择小票打印">
|
||||
<el-option label="标签" value="label"></el-option>
|
||||
<el-option label="出品" value="kitchen"></el-option>
|
||||
<el-option label="小票" value="cash"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="打印机名称">
|
||||
<el-input v-model="forms.name" style="width: 280px;" placeholder="请输入打印机名称"></el-input>
|
||||
</el-form-item>
|
||||
<!-- <template v-if="forms.contentType == 'network'"> -->
|
||||
<el-form-item label="打印机编号">
|
||||
<el-input v-model="forms.address" style="width: 280px;" placeholder="请输入打印机编号"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="打印机秘钥">
|
||||
<el-input v-model="forms.port" style="width: 280px;" placeholder="请输入打印机秘钥"></el-input><br />
|
||||
<div style="margin-left: 80px;color: #FF4D4F;">* 可在打印机设备底部查看打印机编号和秘钥(key)</div>
|
||||
</el-form-item>
|
||||
<!-- </template> -->
|
||||
<!-- <template v-if="forms.contentType == 'local'"> <el-form-item label="IP地址">
|
||||
<el-input v-model="forms.address" style="width: 280px;" placeholder="请输入打印机编号"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="端口">
|
||||
<el-input v-model="forms.port" style="width: 280px;" placeholder="请输入打印机秘钥"></el-input><br />
|
||||
<div style="margin-left: 80px;color: #FF4D4F;">* 可在打印机设备底部查看打印机编号和秘钥(key)</div>
|
||||
</el-form-item>
|
||||
</template> -->
|
||||
|
||||
<el-form-item label="小票尺寸">
|
||||
<el-radio-group v-model="forms.receiptSize">
|
||||
<el-radio label="58mm"></el-radio>
|
||||
<el-radio label="80mm"></el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="分类打印">
|
||||
<el-radio-group v-model="forms.classifyPrint">
|
||||
<el-radio label="0">打印所有</el-radio>
|
||||
<el-radio label="1">部分分类(仅打印制作单[厨房])</el-radio>
|
||||
<!-- <el-radio label="2">部分商品</el-radio> -->
|
||||
</el-radio-group>
|
||||
<!-- <div v-if="forms.classifyPrint == 1" style="color: rgb(255, 77, 79);margin-left: 80px;"></div> -->
|
||||
<div v-if="forms.classifyPrint == 1" style="margin-left:70px">
|
||||
<!-- <el-tree :data="partList" show-checkbox node-key="id" ref="tree" :default-checked-keys="this.forms.categoryIds"
|
||||
:props="{ children: 'childrenList', label: 'name' }">
|
||||
</el-tree> -->
|
||||
<el-checkbox-group v-model="forms.selectcheckbox">
|
||||
<el-checkbox v-for="item in partList" :key="item.id" :label="item.name"></el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item label="桌台打印">
|
||||
<el-radio-group v-model="forms.tablePrint">
|
||||
<el-radio label="0">打印所有</el-radio>
|
||||
<el-radio label="1">打印部分桌台</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="打印数量">
|
||||
<el-radio-group v-model="forms.printQty">
|
||||
<el-radio label="c1m1^2">顾客联+商家联「2张」</el-radio>
|
||||
<el-radio label="m1^1">只打印商家联「1张」</el-radio>
|
||||
<el-radio label="c1^1">只打印顾客联「1张」</el-radio>
|
||||
<el-radio label="c2m1^3">2张顾客联+1张商家联「3张」</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="打印方式">
|
||||
<el-radio-group v-model="forms.printMethod">
|
||||
<el-radio label="all">打印全部</el-radio>
|
||||
<el-radio label="normal">仅打印结账单[前台]</el-radio>
|
||||
<el-radio label="one">仅打印制作单[厨房]</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="打印类型">
|
||||
<el-checkbox-group v-model="forms.printType">
|
||||
<el-checkbox label="refund">确认退款单</el-checkbox>
|
||||
<el-checkbox label="handover">交班单</el-checkbox>
|
||||
<el-checkbox label="queue">排队取号</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="打印单据">
|
||||
<el-radio-group v-model="forms.printReceipt">
|
||||
<el-radio label="0">全部打印</el-radio>
|
||||
<el-radio label="1">仅厨房</el-radio>
|
||||
<el-radio label="2">仅前台</el-radio>
|
||||
</el-radio-group>
|
||||
<div style="margin-left: 80px;color: #FF4D4F;">如果你的店只使用一台小票机,建议选择“全部打印”</div>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="打印机状态">
|
||||
<el-switch v-model="forms.status" :active-value="1" :inactive-value="0"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label-width="80px">
|
||||
<el-button type="primary" @click="$router.go(-1)">返回</el-button>
|
||||
<el-button type="primary" @click="onSubmit">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { configprinter, printerd, tbShopCategory } from '@/api/devices'
|
||||
export default {
|
||||
components: {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
forms: {
|
||||
sort: "0",
|
||||
status: 1,
|
||||
connectionType: "network",
|
||||
selectcheckbox: [],
|
||||
|
||||
receiptSize: '58mm',
|
||||
classifyPrint: '0',
|
||||
printQty: 'm1^1',
|
||||
printType: ["refund", 'handover', 'queue'],
|
||||
printMethod: "all",
|
||||
},
|
||||
partList: []
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
},
|
||||
mounted() {
|
||||
|
||||
this.getpartList()
|
||||
|
||||
},
|
||||
methods: {
|
||||
async onSubmit() {
|
||||
|
||||
// 删除时间字段
|
||||
if (this.$route.query.id) {
|
||||
delete this.forms.createdAt
|
||||
delete this.forms.updatedAt
|
||||
}
|
||||
// 处理打印部分分类
|
||||
if (this.forms.classifyPrint == 1) {
|
||||
let idstr = ''
|
||||
let arr = []
|
||||
this.forms.selectcheckbox.forEach(element => {
|
||||
let prts = this.partList.filter(ele => ele.name == element)[0]
|
||||
idstr = idstr + prts.id + ','
|
||||
arr.push(prts)
|
||||
})
|
||||
this.forms.categoryIds = idstr.substring(0, idstr.length - 1)
|
||||
this.forms.categoryList = JSON.stringify(arr)
|
||||
|
||||
}
|
||||
const res = await configprinter({
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
...this.forms,
|
||||
},
|
||||
this.$route.query.id ? 'put' : 'post'
|
||||
)
|
||||
this.$router.go(-1)
|
||||
},
|
||||
async getpartList() {
|
||||
const res = await tbShopCategory({
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
sort: "sort,desc",
|
||||
page: 0,
|
||||
size: 500
|
||||
})
|
||||
let arr = []
|
||||
res.content.forEach(ele => {
|
||||
arr.push({
|
||||
id: ele.id,
|
||||
name: ele.name
|
||||
})
|
||||
if (ele.childrenList.length > 0) {
|
||||
ele.childrenList.forEach(element => {
|
||||
arr.push({
|
||||
id: element.id,
|
||||
name: element.name
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
this.partList = arr
|
||||
if (this.$route.query.id) {
|
||||
this.getList(this.$route.query.id)
|
||||
}
|
||||
},
|
||||
async getList(id) {
|
||||
const res = await printerd(id)
|
||||
this.forms = res
|
||||
if (res.categoryIds) {
|
||||
let ids = res.categoryIds.split(',')
|
||||
let arr = []
|
||||
ids.forEach(element => {
|
||||
let prts = this.partList.filter(ele => ele.id == element)[0]
|
||||
arr.push(prts.name)
|
||||
})
|
||||
this.$set(this.forms, 'selectcheckbox', arr)
|
||||
} else {
|
||||
this.$set(this.forms, 'selectcheckbox', [])
|
||||
}
|
||||
if (res.printType) {
|
||||
this.forms.printType = JSON.parse(res.printType)
|
||||
} else {
|
||||
this.forms.printType = []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,15 +1,15 @@
|
|||
export const devices = [
|
||||
{
|
||||
value: 'printer',
|
||||
value: 'local',
|
||||
name: '本地'
|
||||
},
|
||||
{
|
||||
value: 'yxyPrinter',
|
||||
value: 'network',
|
||||
name: '云想印'
|
||||
},
|
||||
{
|
||||
value: 'fePrinter',
|
||||
name: '飞鹅'
|
||||
value: 'USB',
|
||||
name: 'USB打印机'
|
||||
}
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
</el-form>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-button type="primary" icon="el-icon-plus" @click="$refs.addDevice.show()">
|
||||
<el-button type="primary" icon="el-icon-plus" @click="toUrl">
|
||||
添加云打印机
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -30,11 +30,11 @@
|
|||
{{ scope.row.contentType | devicesName }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="出品模式" prop="config.model">
|
||||
<!-- <el-table-column label="出品模式" prop="config.model">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.config.model | modelsName }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="打印类型" prop="subType">
|
||||
<template v-slot="scope">
|
||||
{{ scope.row.subType | subTypesName }}
|
||||
|
|
@ -45,7 +45,7 @@
|
|||
{{ scope.row.createdAt | timeFilter }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="排序" sortable prop="sort"></el-table-column>
|
||||
<!-- <el-table-column label="排序" sortable prop="sort"></el-table-column> -->
|
||||
<el-table-column label="状态" prop="status">
|
||||
<template v-slot="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
|
||||
|
|
@ -54,9 +54,8 @@
|
|||
</el-table-column>
|
||||
<el-table-column label="操作" width="200">
|
||||
<template v-slot="scope">
|
||||
<el-button type="text" icon="el-icon-edit"
|
||||
@click="$refs.addDevice.show(scope.row)">编辑</el-button>
|
||||
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
|
||||
<el-button v-if="scope.row.connectionType == 'network'" type="text" icon="el-icon-edit" @click="toUrl(scope.row)">编辑</el-button>
|
||||
<el-popconfirm v-if="scope.row.connectionType == 'network'" title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
|
||||
<el-button type="text" icon="el-icon-delete" style="margin-left: 20px !important;"
|
||||
slot="reference">删除</el-button>
|
||||
</el-popconfirm>
|
||||
|
|
@ -75,7 +74,7 @@
|
|||
<script>
|
||||
import { devices, models, subTypes } from './devices'
|
||||
import addDevice from './components/addDevice'
|
||||
import { tbPrintMachineGet, tbPrintMachine } from '@/api/devices'
|
||||
import { tbPrintMachineGet, switchtbPrintMachine, delTableHandle } from '@/api/devices'
|
||||
import dayjs from 'dayjs'
|
||||
export default {
|
||||
components: {
|
||||
|
|
@ -99,13 +98,20 @@ export default {
|
|||
},
|
||||
filters: {
|
||||
devicesName(value) {
|
||||
return devices.find(item => item.value == value).name
|
||||
if (value == 'yxyPrinter') {
|
||||
return '云想印'
|
||||
} else if (value == 'fePrinter') '飞鹅'
|
||||
// const item=devices.find(item => item.value == value)
|
||||
// return item?item.name:''
|
||||
},
|
||||
modelsName(value) {
|
||||
return models.find(item => item.value == value).name
|
||||
const item = models.find(item => item.value == value)
|
||||
return item ? item.name : ''
|
||||
},
|
||||
subTypesName(value) {
|
||||
return subTypes.find(item => item.value == value).name
|
||||
if (value == "label") return '标签'
|
||||
else if (value == 'kitchen') return '出品'
|
||||
else if (value == 'cash') return '小票'
|
||||
},
|
||||
timeFilter(s) {
|
||||
return dayjs(s).format('YYYY-MM-DD HH:mm:ss')
|
||||
|
|
@ -115,13 +121,20 @@ export default {
|
|||
this.getTableData()
|
||||
},
|
||||
methods: {
|
||||
toUrl(item) {
|
||||
this.$router.push({ path: '/devices/details', query: { id: item.id } })
|
||||
},
|
||||
// 切换状态
|
||||
async statusChange(e, row) {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
const data = { ...row }
|
||||
data.status = e
|
||||
await tbPrintMachine(data, 'put')
|
||||
if (data.id) {
|
||||
delete data.createdAt
|
||||
delete data.updatedAt
|
||||
}
|
||||
await switchtbPrintMachine(data)
|
||||
this.getTableData()
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
|
|
@ -139,13 +152,20 @@ export default {
|
|||
this.tableData.page = e - 1
|
||||
this.getTableData()
|
||||
},
|
||||
// 删除
|
||||
async delTableHandle(item) {
|
||||
const res = await delTableHandle(item)
|
||||
this.getTableData()
|
||||
},
|
||||
// 获取商品列表
|
||||
async getTableData() {
|
||||
this.tableData.loading = true
|
||||
try {
|
||||
const res = await tbPrintMachineGet({
|
||||
name: this.query.name,
|
||||
contentType: this.query.type
|
||||
shopId: localStorage.getItem('shopId'),
|
||||
contentType: this.query.type,
|
||||
sort: '',
|
||||
})
|
||||
this.tableData.loading = false
|
||||
this.tableData.data = res
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs v-model="orderType" @tab-click="getTableData">
|
||||
<!-- <el-tabs v-model="orderType" @tab-click="getTableData">
|
||||
<el-tab-pane label="收款" name="1"></el-tab-pane>
|
||||
<el-tab-pane label="销量" name="2"></el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-tabs> -->
|
||||
<div class="head-container">
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<template v-if="orderType == 2">
|
||||
|
|
@ -109,17 +109,17 @@
|
|||
</el-table-column>
|
||||
</el-table>
|
||||
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2">
|
||||
<el-table-column label="商品名称" prop="productName"></el-table-column>
|
||||
<el-table-column label="商品分类" prop="cateName"></el-table-column>
|
||||
<!-- <el-table-column label="商品分类" prop="cateName"></el-table-column>
|
||||
<el-table-column label="商品描述" prop="productSkuName"></el-table-column>
|
||||
<el-table-column label="单价" prop="price"></el-table-column>
|
||||
<el-table-column label="单价" prop="price"></el-table-column> -->
|
||||
<el-table-column label="商品名称" prop="name"></el-table-column>
|
||||
<el-table-column label="销量" prop="salesNum"></el-table-column>
|
||||
<el-table-column label="退单量" prop="refNum"></el-table-column>
|
||||
<el-table-column label="销售金额" prop="salesAmount">
|
||||
<template v-slot="scope">
|
||||
¥{{ scope.row.salesAmount }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="退单量" prop="refNum"></el-table-column>
|
||||
<el-table-column label="退款金额" prop="refAmount">
|
||||
<template v-slot="scope">
|
||||
¥{{ scope.row.refAmount }}
|
||||
|
|
@ -146,7 +146,7 @@ export default {
|
|||
return {
|
||||
timeValue: "",
|
||||
resetQuery: null,
|
||||
orderType: "1",
|
||||
orderType: "2",
|
||||
categorys: [],
|
||||
query: {
|
||||
createdAt: [],
|
||||
|
|
@ -169,7 +169,7 @@ export default {
|
|||
timeFilter(time) {
|
||||
return dayjs(time).format("YYYY-MM-DD HH:mm:ss");
|
||||
},
|
||||
totalfilter(item,d) {
|
||||
totalfilter(item, d) {
|
||||
let num = item + d
|
||||
return num.toFixed(2)
|
||||
}
|
||||
|
|
@ -214,7 +214,11 @@ export default {
|
|||
try {
|
||||
const res = await daycount({
|
||||
startTime: this.query.createdAt[0],
|
||||
endTime: this.query.createdAt[1]
|
||||
endTime: this.query.createdAt[1],
|
||||
cateId: this.query.cateId,
|
||||
proName: this.query.proName,
|
||||
|
||||
type: this.orderType,
|
||||
});
|
||||
this.payCountList = res;
|
||||
} catch (error) {
|
||||
|
|
@ -358,9 +362,27 @@ export default {
|
|||
.collect_wrap {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
justify-content: space-between;
|
||||
|
||||
.item:nth-child(1) {
|
||||
background-image: url(../../assets/images/home/data_forms4.png);
|
||||
}
|
||||
|
||||
.item:nth-child(2) {
|
||||
background-image: url(../../assets/images/home/data_forms3.png);
|
||||
}
|
||||
|
||||
.item:nth-child(3) {
|
||||
background-image: url(../../assets/images/home/data_forms2.png);
|
||||
}
|
||||
|
||||
.item:nth-child(4) {
|
||||
background-image: url(../../assets/images/home/data_forms1.png);
|
||||
}
|
||||
|
||||
.item {
|
||||
flex: 1;
|
||||
background-size: 100% 100%;
|
||||
width: 255px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #f5f5f5;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,387 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<div class="head-container">
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<el-radio-group v-model="timeValue" @change="timeChange">
|
||||
<el-radio-button label="">全部</el-radio-button>
|
||||
<el-radio-button label="0">今天</el-radio-button>
|
||||
<el-radio-button label="-1">昨天</el-radio-button>
|
||||
<el-radio-button label="-7">最近7天</el-radio-button>
|
||||
<el-radio-button label="-30">最近30天</el-radio-button>
|
||||
<el-radio-button label="week">本周</el-radio-button>
|
||||
<el-radio-button label="month">本月</el-radio-button>
|
||||
<el-radio-button label="custom">自定义</el-radio-button>
|
||||
</el-radio-group>
|
||||
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" :clearable="false" :default-time="['00:00:00', '23:59:59']"
|
||||
value-format="yyyyMMdd">
|
||||
</el-date-picker>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getTableData">查询</el-button>
|
||||
<el-button @click="resetHandle">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1">
|
||||
|
||||
<el-table-column type="index" width="50">
|
||||
</el-table-column>
|
||||
<el-table-column label="商户名称" prop="merchantName"> </el-table-column>
|
||||
<el-table-column label="职员名称" prop="staffName"></el-table-column>
|
||||
<el-table-column label="订单数量" prop="orderNum"></el-table-column>
|
||||
<el-table-column label="应交金额" prop="payable"></el-table-column>
|
||||
<!-- <el-table-column label="上交金额" prop="handIn"></el-table-column> -->
|
||||
<el-table-column label="快捷收款金额" prop="quickAmount"></el-table-column>
|
||||
<el-table-column label="退款金额" prop="returnAmount"></el-table-column>
|
||||
<el-table-column label="总收入" prop="totalAmount"></el-table-column>
|
||||
<!-- <el-table-column label="备用金" prop="imprest"></el-table-column> -->
|
||||
<el-table-column label="开始时间" prop="startTime">
|
||||
<template v-slot="scope">
|
||||
<div>
|
||||
{{ scope.row.startTime }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="交班时间" prop="endTime">
|
||||
<template v-slot="scope">
|
||||
<div>
|
||||
{{ scope.row.endTime }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="" width='120px'>
|
||||
<template v-slot="scope">
|
||||
<el-button type="text" @click="clicksee(scope.row)">查看</el-button>
|
||||
<el-button type="text" @click="clickexport(scope.row)">导出</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
|
||||
@current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
<el-dialog title="商品销量" :visible.sync="dialogshow">
|
||||
<el-table :data="tableDatainfo.data" style="width: 100%;height: 500px;overflow: auto;">
|
||||
<el-table-column prop="productName" label="商品名称" />
|
||||
<el-table-column prop="num" label="数量" />
|
||||
<el-table-column prop="amount" label="金额" />
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { tbHandoverGet } from '@/api/homes/record.js'
|
||||
import { hasPermission } from '@/utils/limits.js'
|
||||
import XLSX from 'xlsx';
|
||||
import dayjs from "dayjs";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
timeValue: "",
|
||||
resetQuery: null,
|
||||
orderType: "1",
|
||||
categorys: [],
|
||||
query: {
|
||||
createdAt: [],
|
||||
proName: '',
|
||||
cateId: '',
|
||||
sort: 'id,desc'
|
||||
},
|
||||
tableData: {
|
||||
data: [],
|
||||
page: 0,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
tableDatainfo: {
|
||||
data: [],
|
||||
page: 0,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0
|
||||
},
|
||||
payCountList: "",
|
||||
payCountTotal: 0,
|
||||
dialogshow: false, //弹框显示
|
||||
|
||||
};
|
||||
},
|
||||
filters: {
|
||||
timeFilter(s) {
|
||||
return dayjs(s).format("YYYY-MM-DD");
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.resetQuery = { ...this.query };
|
||||
this.getTableData();
|
||||
},
|
||||
methods: {
|
||||
//携带table id跳转到订单列表页面
|
||||
toTableOrderList(data) {
|
||||
this.$router.push({
|
||||
path: '/order_manage/order_list',
|
||||
query: {
|
||||
tableName: data.tableName
|
||||
}
|
||||
})
|
||||
},
|
||||
// 重置查询
|
||||
resetHandle() {
|
||||
this.timeValue = "";
|
||||
this.query = { ...this.resetQuery };
|
||||
this.page = 0;
|
||||
this.getTableData();
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e;
|
||||
this.getTableData();
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e - 1;
|
||||
this.getTableData();
|
||||
},
|
||||
async getTableData() {
|
||||
let res = await hasPermission('允许查看所有交班记录');
|
||||
if ( !res) { return; }
|
||||
this.tableData.loading = true;
|
||||
try {
|
||||
let urlData = null
|
||||
if (this.query.createdAt.length == 0) { // 为什么这么写 因为后端让我有时候传key值有时候不传 为啥不按照框架走后端处理起来太麻烦 前端处理 -- 魏文政 2024.7.30 15:50
|
||||
urlData = `/api/tbHandover?page=${this.tableData.page}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}&sort=${this.query.sort}`
|
||||
} else {
|
||||
urlData = `/api/tbHandover?page=${this.tableData.page}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}&tradeDay=${this.query.createdAt[0] ? this.query.createdAt[0] : ''}&tradeDay=${this.query.createdAt[1] ? this.query.createdAt[1] : ''}&sort=${this.query.sort}`
|
||||
}
|
||||
const res = await tbHandoverGet(urlData);
|
||||
this.tableData.loading = false;
|
||||
this.tableData.data = res.content;
|
||||
console.log(this.tableData.productInfos)
|
||||
this.tableData.total = res.totalElements;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 切换时间
|
||||
timeChange(e) {
|
||||
// const format = ["YYYY-MM-DD 00:00:00", "YYYY-MM-DD 23:59:59"];
|
||||
const format = ["YYYYMMDD", "YYYYMMDD"];
|
||||
switch (e) {
|
||||
case "":
|
||||
// 全部
|
||||
this.query.createdAt = [];
|
||||
break;
|
||||
case "0":
|
||||
// 今天
|
||||
this.query.createdAt = [
|
||||
dayjs().format(format[0]),
|
||||
dayjs().format(format[1])
|
||||
];
|
||||
break;
|
||||
case "-1":
|
||||
// 昨天
|
||||
this.query.createdAt = [
|
||||
dayjs()
|
||||
.add(-1, "d")
|
||||
.format(format[0]),
|
||||
dayjs()
|
||||
.add(-1, "d")
|
||||
.format(format[1])
|
||||
];
|
||||
break;
|
||||
case "-7":
|
||||
// 最近7天
|
||||
this.query.createdAt = [
|
||||
dayjs()
|
||||
.add(-7, "d")
|
||||
.format(format[0]),
|
||||
dayjs().format(format[1])
|
||||
];
|
||||
break;
|
||||
case "-30":
|
||||
// 最近7天
|
||||
this.query.createdAt = [
|
||||
dayjs()
|
||||
.add(-30, "d")
|
||||
.format(format[0]),
|
||||
dayjs().format(format[1])
|
||||
];
|
||||
break;
|
||||
case "week":
|
||||
// 本周
|
||||
this.query.createdAt = [
|
||||
dayjs()
|
||||
.startOf("week")
|
||||
.format(format[0]),
|
||||
dayjs()
|
||||
.endOf("week")
|
||||
.format(format[1])
|
||||
];
|
||||
break;
|
||||
case "month":
|
||||
// 本周
|
||||
this.query.createdAt = [
|
||||
dayjs()
|
||||
.startOf("month")
|
||||
.format(format[0]),
|
||||
dayjs()
|
||||
.endOf("month")
|
||||
.format(format[1])
|
||||
];
|
||||
break;
|
||||
case "custom":
|
||||
// 自定义
|
||||
this.query.createdAt = [];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
},
|
||||
// 查看
|
||||
clicksee(e) {
|
||||
this.dialogshow = true
|
||||
// console.log(JSON.parse(e.productInfos))
|
||||
this.tableDatainfo.data = JSON.parse(e.productInfos)
|
||||
},
|
||||
|
||||
clickexport(e) {
|
||||
const arr = JSON.parse(e.productInfos)
|
||||
let data = [
|
||||
['商品名称', '数量', '金额'],
|
||||
]
|
||||
arr.forEach(element => {
|
||||
data.push([element.productName, element.num, element.amount])
|
||||
});
|
||||
|
||||
const ws = XLSX.utils.aoa_to_sheet(data);
|
||||
const wb = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
|
||||
XLSX.writeFile(wb, 'data.xlsx');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.cursor-pointer {
|
||||
cursor: pointer;
|
||||
color: #1890ff;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.cursor-pointer:hover {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.collect_wrap {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
|
||||
.item {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #f5f5f5;
|
||||
padding: 20px;
|
||||
|
||||
.icon_wrap {
|
||||
$size: 34px;
|
||||
$border: 6px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: var(--bg-color);
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
width: $size + $border;
|
||||
height: $size + $border;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: var(--bg-color);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 10px;
|
||||
|
||||
.m {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.t {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
padding-top: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.refund {
|
||||
color: #ff9731;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.table_order_info {
|
||||
.order_no {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.type {
|
||||
color: #e6a23c;
|
||||
}
|
||||
}
|
||||
|
||||
.goods_info {
|
||||
.row {
|
||||
display: flex;
|
||||
|
||||
&:not(:first-child) {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.cover {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 10px;
|
||||
|
||||
.sku {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -6,20 +6,19 @@
|
|||
</el-tabs> -->
|
||||
<div class="head-container">
|
||||
<el-form :model="query" inline label-position="left">
|
||||
<el-radio-group v-model="timeValue" @change="timeChange">
|
||||
<el-radio-button label="">全部</el-radio-button>
|
||||
<el-radio-button label="0">今天</el-radio-button>
|
||||
<el-radio-button label="-1">昨天</el-radio-button>
|
||||
<el-radio-button label="-7">最近7天</el-radio-button>
|
||||
<el-radio-button label="-30">最近30天</el-radio-button>
|
||||
<el-radio-button label="week">本周</el-radio-button>
|
||||
<el-radio-button label="month">本月</el-radio-button>
|
||||
<el-radio-button label="custom">自定义</el-radio-button>
|
||||
</el-radio-group>
|
||||
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd HH:mm:ss"
|
||||
>
|
||||
</el-date-picker>
|
||||
<el-radio-group v-model="timeValue" @change="timeChange">
|
||||
<el-radio-button label="">全部</el-radio-button>
|
||||
<el-radio-button label="0">今天</el-radio-button>
|
||||
<el-radio-button label="-1">昨天</el-radio-button>
|
||||
<el-radio-button label="-7">最近7天</el-radio-button>
|
||||
<el-radio-button label="-30">最近30天</el-radio-button>
|
||||
<el-radio-button label="week">本周</el-radio-button>
|
||||
<el-radio-button label="month">本月</el-radio-button>
|
||||
<el-radio-button label="custom">自定义</el-radio-button>
|
||||
</el-radio-group>
|
||||
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd HH:mm:ss">
|
||||
</el-date-picker>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getTableData">查询</el-button>
|
||||
<el-button @click="resetHandle">重置</el-button>
|
||||
|
|
@ -39,19 +38,17 @@
|
|||
<div class="info">
|
||||
<div class="m">
|
||||
<template v-if="item.isAmount == 1">¥</template>
|
||||
{{ item.payAmount }}
|
||||
</div>
|
||||
<div class="t">{{ item.payType }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
{{ item.payAmount }}
|
||||
</div>
|
||||
<div class="t">{{ item.payType }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="head-container">
|
||||
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1">
|
||||
|
||||
<el-table-column
|
||||
type="index"
|
||||
width="50">
|
||||
|
||||
<el-table-column type="index" width="50">
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="序号" prop="id"></el-table-column> -->
|
||||
<!-- <el-table-column label="区域id" prop="areaId"></el-table-column> -->
|
||||
|
|
@ -67,7 +64,7 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="订单金额" prop="orderAmount"></el-table-column>
|
||||
|
||||
|
||||
</el-table>
|
||||
<!-- <el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2">
|
||||
<el-table-column label="商品名称" prop="productName"></el-table-column>
|
||||
|
|
@ -87,16 +84,16 @@
|
|||
</el-table-column>
|
||||
</el-table> -->
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<!-- <div class="head-container">
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
|
||||
@current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { summaryTable,summaryTableDownload } from '@/api/table'
|
||||
import { summaryTable, summaryTableDownload } from '@/api/table'
|
||||
import dayjs from "dayjs";
|
||||
import { downloadFile } from "@/utils/index";
|
||||
|
||||
|
|
@ -135,14 +132,15 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
//携带table id跳转到订单列表页面
|
||||
toTableOrderList(data){
|
||||
console.log(data)
|
||||
toTableOrderList(data) {
|
||||
// console.log(data)
|
||||
this.$router.push({
|
||||
path:'/order_manage/order_list',
|
||||
query:{
|
||||
tableName: data.tableName
|
||||
path: '/order_manage/order_list',
|
||||
query: {
|
||||
tableName: data.tableName,
|
||||
timeValue: this.timeValue
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
// 导出Excel
|
||||
async downloadHandle() {
|
||||
|
|
@ -180,10 +178,10 @@ export default {
|
|||
this.tableData.loading = true;
|
||||
try {
|
||||
const res = await summaryTable({
|
||||
page: this.tableData.page+1,
|
||||
size: this.tableData.size,
|
||||
startTime:this.query.createdAt[0],
|
||||
endTime:this.query.createdAt[1]
|
||||
page: this.tableData.page + 1,
|
||||
size: this.tableData.size,
|
||||
startTime: this.query.createdAt[0],
|
||||
endTime: this.query.createdAt[1]
|
||||
});
|
||||
this.tableData.loading = false;
|
||||
this.tableData.data = res;
|
||||
|
|
@ -271,12 +269,13 @@ export default {
|
|||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.cursor-pointer{
|
||||
.cursor-pointer {
|
||||
cursor: pointer;
|
||||
color: #1890ff;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.cursor-pointer:hover{
|
||||
|
||||
.cursor-pointer:hover {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,899 @@
|
|||
<template>
|
||||
<div class="app-container" style="padding-bottom: 100px;">
|
||||
<div class="card_wrap">
|
||||
<div class="card">
|
||||
<div class="header">
|
||||
<div class="card_title">总销售额</div>
|
||||
<el-tooltip effect="dark" content="订单支付金额" placement="top">
|
||||
<i class="icon el-icon-warning-outline"></i>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div class="number">{{ topData.totalSales || 0 }}</div>
|
||||
<div class="row">平均每单{{ topData.averageSales || 0 }}</div>
|
||||
<div class="row">今日销售额{{ topData.totalSalesToday || 0 }}</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="header">
|
||||
<div class="card_title">支付笔数</div>
|
||||
</div>
|
||||
<div class="number">{{ topData.paymentsNumber }}</div>
|
||||
<div class="row" ref="cardPayChart" style="padding-bottom: 2px;"></div>
|
||||
<div class="row">
|
||||
今日支付笔数{{ topData.paymentsNumberToday || 0 }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="header">
|
||||
<div class="card_title">访问量</div>
|
||||
</div>
|
||||
<div class="number">{{ topData.totalVisits }}</div>
|
||||
<div class="row" ref="cardCountChart" style="padding-bottom: 2px;"></div>
|
||||
<div class="row">
|
||||
<div class="dot"></div>
|
||||
今日访问 {{ topData.totalVisitsToday || 0 }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="header">
|
||||
<div class="card_title">用户数</div>
|
||||
</div>
|
||||
<div class="number">{{ topData.totalUser }}</div>
|
||||
<div class="row" ref="cardUserChart" style="padding-bottom: 2px;"></div>
|
||||
<div class="row">
|
||||
今日新增 {{ topData.userToday || 0 }}
|
||||
<i class="icon el-icon-caret-top"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 销售额 -->
|
||||
<div class="chart_wrap">
|
||||
<div class="item">
|
||||
<div class="header">
|
||||
<div class="tab_wrap">
|
||||
<div class="item active">销售额</div>
|
||||
</div>
|
||||
<el-radio-group v-model="saleActive" @change="dateAmount">
|
||||
<el-radio-button label="7">近7天</el-radio-button>
|
||||
<el-radio-button label="30">30天</el-radio-button>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<div
|
||||
class="chart"
|
||||
ref="saleChart"
|
||||
v-loading="saleLoading"
|
||||
style="height: 400px;"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chart_wrap" style="display: flex;">
|
||||
<!-- 商品销售排行 -->
|
||||
<div class="item">
|
||||
<div class="header">
|
||||
<div class="tab_wrap">
|
||||
<div class="item active">商品销售排行</div>
|
||||
</div>
|
||||
<el-radio-group v-model="saleTableActive" @change="rankChange">
|
||||
<el-radio-button label="1">今天</el-radio-button>
|
||||
<el-radio-button label="7">近7天</el-radio-button>
|
||||
<el-radio-button label="30">30天</el-radio-button>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<div class="sale_data">
|
||||
<div class="card">
|
||||
<div class="sale_data_header">
|
||||
<div class="card_title">销售数量</div>
|
||||
</div>
|
||||
<div class="number">{{ productCount }}</div>
|
||||
<div class="product_chart_wrap" ref="productCountChart"></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="sale_data_header">
|
||||
<div class="card_title">销售金额</div>
|
||||
</div>
|
||||
<div class="number">¥{{ productSum }}</div>
|
||||
<div class="product_chart_wrap" ref="productSumChart"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table">
|
||||
<el-table :data="saleTable" v-loading="saleTableLoading">
|
||||
<el-table-column label="排名" prop="productId"></el-table-column>
|
||||
<el-table-column
|
||||
label="商品名称"
|
||||
prop="productName"
|
||||
></el-table-column>
|
||||
<el-table-column label="数量" prop="productNum"></el-table-column>
|
||||
<el-table-column label="金额" prop="amount"></el-table-column>
|
||||
</el-table>
|
||||
<div
|
||||
class="head-container"
|
||||
style="padding-top: 20px;display: flex;justify-content: flex-end;"
|
||||
>
|
||||
<el-pagination
|
||||
:total="saleTableTotal"
|
||||
:page-size="saleTableSize"
|
||||
:current-page="saleTablePage"
|
||||
@current-change="paginationChange"
|
||||
layout="total, prev, pager, next, jumper"
|
||||
></el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 支付类型占比 -->
|
||||
<div class="item" style="margin-left: 20px;">
|
||||
<div class="header">
|
||||
<div class="tab_wrap">
|
||||
<div class="item active">支付占比类型</div>
|
||||
</div>
|
||||
<el-radio-group v-model="payChartDay" @change="datePayType">
|
||||
<el-radio-button label="7">近7天</el-radio-button>
|
||||
<el-radio-button label="30">30天</el-radio-button>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<div
|
||||
style="height: 400px;margin-top: 30px;"
|
||||
ref="payChart"
|
||||
v-loading="payChartLoading"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
summaryGet,
|
||||
summaryTodayGet,
|
||||
dateProduct,
|
||||
dateAmount,
|
||||
datePayType,
|
||||
summaryDateGet
|
||||
} from "@/api/home";
|
||||
import echarts from "echarts";
|
||||
import { debounce } from "@/utils";
|
||||
export default {
|
||||
name: "home",
|
||||
data() {
|
||||
return {
|
||||
topData: "",
|
||||
saleTab: "sale",
|
||||
saleActive: "7",
|
||||
cardPayChart: null,
|
||||
cardCountChart: null,
|
||||
cardUserChart: null,
|
||||
saleLoading: false,
|
||||
saleChart: null,
|
||||
payChartDay: "7",
|
||||
payChartLoading: false,
|
||||
payChart: null,
|
||||
chartType: 1,
|
||||
productCount: 0,
|
||||
productSum: 0,
|
||||
saleTableActive: "1",
|
||||
saleTable: [],
|
||||
saleTableLoading: false,
|
||||
saleTablePage: 1,
|
||||
saleTableTotal: 0,
|
||||
saleTableSize: 5,
|
||||
__resizeHandler: null,
|
||||
productCountChart: null,
|
||||
productSumChart: null
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.summaryGet();
|
||||
this.dateAmount();
|
||||
this.dateProduct();
|
||||
this.datePayType();
|
||||
this.summaryDateGet();
|
||||
|
||||
this.__resizeHandler = debounce(() => {
|
||||
if (this.saleChart) {
|
||||
this.saleChart.resize();
|
||||
}
|
||||
if (this.payChart) {
|
||||
this.payChart.resize();
|
||||
}
|
||||
if (this.cardPayChart) {
|
||||
this.cardPayChart.resize();
|
||||
}
|
||||
if (this.cardUserChart) {
|
||||
this.cardUserChart.resize();
|
||||
}
|
||||
if (this.productCountChart) {
|
||||
this.productCountChart.resize();
|
||||
}
|
||||
if (this.productSumChart) {
|
||||
this.productSumChart.resize();
|
||||
}
|
||||
}, 100);
|
||||
window.addEventListener("resize", this.__resizeHandler);
|
||||
this.initCardUserChart();
|
||||
},
|
||||
methods: {
|
||||
// 初始化支付笔数柱状图
|
||||
initCardPayChart(time = [], data = []) {
|
||||
this.cardPayChart = echarts.init(this.$refs.cardPayChart);
|
||||
this.cardPayChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
grid: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 0
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: time,
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: "bar",
|
||||
barWidth: "30%"
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 初始化访问量柱状图
|
||||
initCardCountChart(time = [], data = []) {
|
||||
this.cardCountChart = echarts.init(this.$refs.cardCountChart);
|
||||
this.cardCountChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
grid: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 0
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: time,
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: "bar",
|
||||
barWidth: "30%"
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 初始化用户数折线图
|
||||
initCardUserChart(time = [], data = []) {
|
||||
this.cardUserChart = echarts.init(this.$refs.cardUserChart);
|
||||
this.cardUserChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
grid: {
|
||||
x: 0,
|
||||
y: 10,
|
||||
x2: 0,
|
||||
y2: 2
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: time,
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: "line",
|
||||
symbol: "none"
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 初始化销售额图标
|
||||
initSaleChart(time, data) {
|
||||
this.saleChart = null;
|
||||
this.saleChart = echarts.init(this.$refs.saleChart);
|
||||
this.saleChart.setOption({
|
||||
title: {
|
||||
text: "销售趋势",
|
||||
x: "center"
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: time,
|
||||
axisTick: {
|
||||
alignWithLabel: true
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#999"
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
rotate: time.length <= 7 ? 0 : 45,
|
||||
interval: 0,
|
||||
textStyle: {
|
||||
fontSize: "9"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#999"
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: "dashed",
|
||||
color: "#ececec"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: "bar",
|
||||
barWidth: time.length <= 7 ? "50%" : "30%"
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 初始化销售额图表
|
||||
initPayChart(data) {
|
||||
this.payChart = echarts.init(this.$refs.payChart);
|
||||
this.payChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "item"
|
||||
},
|
||||
legend: {
|
||||
top: "5%",
|
||||
left: "center"
|
||||
},
|
||||
color: [
|
||||
"#409eff",
|
||||
"#91cc75",
|
||||
"#fac858",
|
||||
"#ee6666",
|
||||
"#73c0de",
|
||||
"#3ba272",
|
||||
"#fc8452",
|
||||
"#9a60b4",
|
||||
"#ea7ccc"
|
||||
],
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: ["40%", "70%"],
|
||||
avoidLabelOverlap: false,
|
||||
label: {
|
||||
show: false,
|
||||
position: "center"
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 20
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
data: data
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 获取销售额柱状图数据
|
||||
async dateAmount() {
|
||||
try {
|
||||
this.saleLoading = true;
|
||||
const res = await dateAmount(this.saleActive);
|
||||
const data = res.total.map(item => item.amount);
|
||||
const time = res.total.map(item => item.tradeDay);
|
||||
this.initSaleChart(time, data);
|
||||
setTimeout(() => {
|
||||
this.saleLoading = false;
|
||||
}, 300);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
paginationChange(e) {
|
||||
this.saleTablePage = e;
|
||||
this.dateProduct();
|
||||
},
|
||||
// 获取销售额排行表格数据
|
||||
async dateProduct() {
|
||||
try {
|
||||
this.saleTableLoading = true;
|
||||
const res = await dateProduct(
|
||||
this.saleTableActive,
|
||||
this.saleTablePage,
|
||||
this.saleTableSize
|
||||
);
|
||||
this.saleTable = res.totalProduct;
|
||||
this.saleTableTotal = res.total;
|
||||
this.productCount = res.productCount;
|
||||
this.productSum = res.productSum;
|
||||
setTimeout(() => {
|
||||
this.saleTableLoading = false;
|
||||
}, 300);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 支付类型占比 饼图
|
||||
async datePayType() {
|
||||
try {
|
||||
this.payChartLoading = true;
|
||||
const res = await datePayType(this.payChartDay);
|
||||
const data = res.countPayType.map(item => {
|
||||
return {
|
||||
value: item.count,
|
||||
name: item.payType
|
||||
};
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.payChartLoading = false;
|
||||
}, 300);
|
||||
this.initPayChart(data);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
// 汇总数据
|
||||
async summaryGet() {
|
||||
try {
|
||||
const res1 = await summaryGet();
|
||||
const res2 = await summaryTodayGet();
|
||||
this.topData = {
|
||||
...res1,
|
||||
...res2
|
||||
};
|
||||
let payTime = res1.countDateList.map(item => item.tradeDay);
|
||||
let payData = res1.countDateList.map(item => item.count);
|
||||
|
||||
let countTime = res1.visitsCountList.map(item => item.tradeDay);
|
||||
let countData = res1.visitsCountList.map(item => item.count);
|
||||
|
||||
this.initCardPayChart(payTime, payData);
|
||||
this.initCardCountChart(countTime, countData);
|
||||
console.log(this.topData);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
rankChange() {
|
||||
this.dateProduct();
|
||||
this.summaryDateGet();
|
||||
},
|
||||
// 初始化销售图标
|
||||
initProduceChart(p1, p2) {
|
||||
this.productCountChart = echarts.init(this.$refs.productCountChart);
|
||||
this.productSumChart = echarts.init(this.$refs.productSumChart);
|
||||
|
||||
this.productCountChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
grid: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 0
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
boundaryGap: false,
|
||||
type: "category",
|
||||
data: p1[0],
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: p1[1],
|
||||
type: "line",
|
||||
symbol: "none",
|
||||
smooth: true,
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#409eff" // 渐变颜色
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#409eff" // 渐变颜色
|
||||
}
|
||||
])
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
this.productSumChart.setOption({
|
||||
tooltip: {
|
||||
trigger: "axis"
|
||||
},
|
||||
grid: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 0
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
boundaryGap: false,
|
||||
type: "category",
|
||||
data: p2[0],
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
color: "#409eff",
|
||||
yAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
|
||||
axisTick: {
|
||||
show: false // 不显示坐标轴刻度线
|
||||
},
|
||||
axisLine: {
|
||||
show: false // 不显示坐标轴线
|
||||
},
|
||||
axisLabel: {
|
||||
show: false // 不显示坐标轴上的文字
|
||||
},
|
||||
splitLine: {
|
||||
show: false // 不显示网格线
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
data: p2[1],
|
||||
type: "line",
|
||||
symbol: "none",
|
||||
smooth: true,
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#409eff" // 渐变颜色
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#409eff" // 渐变颜色
|
||||
}
|
||||
])
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
},
|
||||
// 日期汇总数据
|
||||
async summaryDateGet() {
|
||||
try {
|
||||
const res = await summaryDateGet(this.saleTableActive);
|
||||
let p1 = [
|
||||
res.numList.map(item => item.tradeDay),
|
||||
res.numList.map(item => item.count)
|
||||
];
|
||||
let p2 = [
|
||||
res.amountList.map(item => item.tradeDay),
|
||||
res.amountList.map(item => item.count)
|
||||
];
|
||||
this.initProduceChart(p1, p2);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.app-container {
|
||||
padding: 20px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.card_wrap {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
|
||||
.card {
|
||||
flex: 1;
|
||||
background-color: #fff;
|
||||
border-radius: 2px;
|
||||
padding: 0 20px;
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
color: #999;
|
||||
padding-top: 20px;
|
||||
|
||||
.card_title {
|
||||
font-size: 14px;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.number {
|
||||
padding: 20px 0 10px 0;
|
||||
font-size: 24px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.row {
|
||||
height: 50px;
|
||||
color: #555;
|
||||
font-size: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
&:not(:last-child) {
|
||||
border-bottom: 1px solid #ececec;
|
||||
}
|
||||
|
||||
.icon {
|
||||
color: rgb(255, 85, 85);
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.dot {
|
||||
$size: 6px;
|
||||
width: $size;
|
||||
height: $size;
|
||||
border-radius: 50%;
|
||||
background-color: #1890ff;
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.chart_wrap {
|
||||
margin-top: 20px;
|
||||
|
||||
.sale_data {
|
||||
display: flex;
|
||||
|
||||
.card {
|
||||
flex: 1;
|
||||
background-color: #fff;
|
||||
border-radius: 2px;
|
||||
padding: 0 20px;
|
||||
|
||||
.sale_data_header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
color: #999;
|
||||
padding-top: 20px;
|
||||
|
||||
.card_title {
|
||||
font-size: 14px;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.number {
|
||||
padding-top: 10px;
|
||||
font-size: 24px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.product_chart_wrap {
|
||||
height: 50px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.item {
|
||||
flex: 1;
|
||||
background-color: #fff;
|
||||
border-radius: 2px;
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1px solid #ececec;
|
||||
padding: 0 20px;
|
||||
|
||||
.tab_wrap {
|
||||
display: flex;
|
||||
$color: #1890ff;
|
||||
|
||||
.item {
|
||||
padding: 0 10px;
|
||||
height: 60px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
color: $color;
|
||||
|
||||
&.active {
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
width: 100%;
|
||||
border-bottom: 2px solid $color;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.chart {
|
||||
padding: 20px 0;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.table {
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,68 +1,36 @@
|
|||
<!-- 新增耗材盘点 -->
|
||||
<!-- 耗材列表的新增耗材盘点 -->
|
||||
<template>
|
||||
<el-dialog
|
||||
title="耗材盘点"
|
||||
:visible.sync="dialogVisible"
|
||||
width="80%"
|
||||
@open="form.note = ''"
|
||||
>
|
||||
<el-form
|
||||
ref="form"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-position="left"
|
||||
inline
|
||||
>
|
||||
<el-form-item label="账存数量">
|
||||
<el-input :value="detail.num" readonly style="width: 180px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="实际数量">
|
||||
<el-input-number
|
||||
v-model="form.lpNum"
|
||||
:min="0"
|
||||
:step="1"
|
||||
step-strictly
|
||||
style="width: 180px;"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="盈亏数量">
|
||||
<el-input
|
||||
:value="profitNumber"
|
||||
readonly
|
||||
:class="{ lose: profitNumber < 0 }"
|
||||
style="width: 180px;"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="单价">
|
||||
<el-input v-model="detail.price" readonly></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="盈亏金额">
|
||||
<el-input
|
||||
:value="profitPrice"
|
||||
readonly
|
||||
:class="{ lose: profitNumber < 0 }"
|
||||
style="width: 180px;"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="备注">
|
||||
<el-input v-model="form.note" placeholder="请输入备注" style="width: 300px;"></el-input>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle"
|
||||
>确 定</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="head-container">
|
||||
<el-table
|
||||
ref="table"
|
||||
:data="tableData.list"
|
||||
v-loading="tableData.loading"
|
||||
border
|
||||
stripe
|
||||
>
|
||||
<!-- <el-table-column label="商品信息" width="150px">
|
||||
<el-dialog title="耗材盘点" :visible.sync="dialogVisible" width="80%">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-position="left" inline>
|
||||
<el-form-item label="账存数量">
|
||||
<el-input v-model="form.balance" readonly style="width: 180px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="实际数量">
|
||||
<el-input-number v-model="form.stockNumber" :min="0" :step="1" step-strictly
|
||||
style="width: 180px;"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="盈亏数量">
|
||||
<el-input v-model="profitNumber" readonly :class="{ lose: profitNumber < 0 }"
|
||||
style="width: 180px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="单价">
|
||||
<el-input v-model="form.price" readonly></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="盈亏金额">
|
||||
<el-input v-model="profitPrice" readonly :class="{ lose: profitNumber < 0 }"
|
||||
style="width: 180px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" style="width: 300px;"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="head-container">
|
||||
<el-table ref="table" :data="tableData.list" v-loading="tableData.loading" border stripe>
|
||||
<el-table-column label="商品信息" width="150px">
|
||||
<template v-slot="scope">
|
||||
<div class="shop_info">
|
||||
<el-image :src="scope.row.coverImg" style="width: 30px;height: 30px;">
|
||||
|
|
@ -70,188 +38,186 @@
|
|||
<i class="icon el-icon-document-delete"></i>
|
||||
</div>
|
||||
</el-image>
|
||||
<span>{{ scope.row.name }}</span>
|
||||
<span>{{ scope.row.conName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="售价" prop="price">
|
||||
<template v-slot="scope">
|
||||
¥{{ formatDecimal(scope.row.price) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="帐存库存" prop="stockNumber"></el-table-column>
|
||||
<el-table-column label="盈亏数量" prop="lpNum"></el-table-column>
|
||||
<el-table-column label="盈亏金额" prop="lpAmount">
|
||||
<template v-slot="scope">
|
||||
¥{{ formatDecimal(scope.row.lpAmount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="实际库存"
|
||||
prop="acStockNumber"
|
||||
></el-table-column>
|
||||
<el-table-column label="盘点时间" prop="createTime"></el-table-column>
|
||||
<!-- <el-table-column label="盘点备注" prop="note"></el-table-column> -->
|
||||
</el-table>
|
||||
</div>
|
||||
<el-pagination
|
||||
:total="tableData.total"
|
||||
:current-page="tableData.page + 1"
|
||||
:page-sizes="[5, 10, 30, 50]"
|
||||
:page-size="tableData.size"
|
||||
@current-change="paginationChange"
|
||||
@size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
></el-pagination>
|
||||
</el-dialog>
|
||||
</el-table-column>
|
||||
<el-table-column label="售价" prop="price">
|
||||
<template v-slot="scope">
|
||||
¥{{ scope.row.price }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="账存数量" prop="stockNumber"></el-table-column>
|
||||
<el-table-column label="盈亏数量" prop="lpNum"></el-table-column>
|
||||
<el-table-column label="盈亏金额" prop="lpAmount">
|
||||
<template v-slot="scope">
|
||||
¥{{ scope.row.lpAmount }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="实际库存" prop="acStockNumber"></el-table-column>
|
||||
<el-table-column label="盘点时间" prop="createTime"></el-table-column>
|
||||
<el-table-column label="盘点备注" prop="remark"></el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-sizes="[5, 10, 30, 50]"
|
||||
:page-size="tableData.size" @current-change="paginationChange" @size-change="sizeChange"
|
||||
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { formatDecimal } from "@/utils";
|
||||
import { tbConCheck, tbConCheckGet } from "@/api/invoicing";
|
||||
import { formatDecimal } from '@/utils'
|
||||
import { tbConCheck, tbConCheckGet } from '@/api/invoicing'
|
||||
import { hasPermission } from '@/utils/limits.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
formatDecimal,
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
detail: "",
|
||||
form: {
|
||||
conInfoId: "",
|
||||
lpNum: 0
|
||||
},
|
||||
rules: {
|
||||
stocktakinNum: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入盘点数量",
|
||||
trigger: "blur"
|
||||
}
|
||||
]
|
||||
},
|
||||
resetForm: "",
|
||||
searhForm: {
|
||||
name: "",
|
||||
skuId: "",
|
||||
productId: ""
|
||||
},
|
||||
tableData: {
|
||||
page: 0,
|
||||
size: 5,
|
||||
total: 0,
|
||||
loading: false,
|
||||
list: []
|
||||
}
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form };
|
||||
},
|
||||
computed: {
|
||||
profitNumber() {
|
||||
return formatDecimal(this.form.lpNum - this.detail.num, 2, true);
|
||||
},
|
||||
profitPrice() {
|
||||
return formatDecimal(
|
||||
(this.form.lpNum - this.detail.num) * this.detail.price
|
||||
);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.loading = true;
|
||||
let res = await tbConCheck({
|
||||
conInfoId: this.form.conInfoId,
|
||||
lpNum: this.profitNumber
|
||||
});
|
||||
this.detail.num = this.form.lpNum;
|
||||
this.form.lpNum = 0;
|
||||
this.form.lpNum = this.detail.num;
|
||||
|
||||
this.$emit("success", res);
|
||||
this.loading = false;
|
||||
this.$message({
|
||||
title: "注意",
|
||||
message: `添加成功`,
|
||||
type: "success"
|
||||
});
|
||||
this.getTableData();
|
||||
} catch (error) {
|
||||
this.loading = false;
|
||||
console.log(error);
|
||||
}
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
form: {
|
||||
skuId: '', // sku商品必传
|
||||
productId: '', // 必传
|
||||
stocktakinNum: '', // 必传
|
||||
price: '', // 商品价格 非必传 为空盘点价格为商品价格
|
||||
remark: "", // 盘点备注 非必传
|
||||
stockNumber: 0
|
||||
},
|
||||
rules: {
|
||||
stocktakinNum: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入盘点数量',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
},
|
||||
resetForm: '',
|
||||
searhForm: {
|
||||
name: '',
|
||||
skuId: '',
|
||||
productId: ''
|
||||
},
|
||||
tableData: {
|
||||
page: 0,
|
||||
size: 5,
|
||||
total: 0,
|
||||
loading: false,
|
||||
list: []
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
show(obj) {
|
||||
// console.log(obj);
|
||||
this.detail = { ...obj };
|
||||
this.detail.num = formatDecimal(
|
||||
obj.stockNumber - obj.stockConsume,
|
||||
2,
|
||||
false
|
||||
);
|
||||
this.dialogVisible = true;
|
||||
this.form.conInfoId = obj.id;
|
||||
this.form.lpNum = this.detail.num;
|
||||
mounted() {
|
||||
this.resetForm = { ...this.form }
|
||||
},
|
||||
computed: {
|
||||
profitNumber() {
|
||||
console.log(this.form, '盈亏数量')
|
||||
if (this.form.balance == undefined) {
|
||||
return this.form.stockNumber - 0
|
||||
} else {
|
||||
return this.form.stockNumber - this.form.balance
|
||||
}
|
||||
},
|
||||
profitPrice() {
|
||||
console.log(this.form, '盈亏金额')
|
||||
return formatDecimal((this.form.stockNumber - this.form.balance) * this.form.price)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
this.searhForm.skuId = obj.productId;
|
||||
this.searhForm.productId = obj.proId;
|
||||
onSubmitHandle() {
|
||||
this.$refs.form.validate(async valid => {
|
||||
if (valid) {
|
||||
try {
|
||||
this.form.lpNum = this.profitNumber
|
||||
this.form.balance = this.form.stockNumber
|
||||
this.loading = true
|
||||
this.form.conInfoId = this.form.id
|
||||
delete this.form['id'];
|
||||
console.log(this.form)
|
||||
let res = await tbConCheck(this.form)
|
||||
console.log(this.form);
|
||||
this.$emit('success', res)
|
||||
this.dialogVisible = false
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: '注意',
|
||||
message: `添加成功`,
|
||||
type: 'success'
|
||||
});
|
||||
this.getTableData()
|
||||
} catch (error) {
|
||||
this.loading = false
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
async show(obj) {
|
||||
let res = await hasPermission('允许耗材盘点');
|
||||
if (!res) { return; }
|
||||
this.form.remark = ''
|
||||
this.form.stocktakinNum = 0
|
||||
this.form.lpNum = 0
|
||||
// this.form.stockNumber = 0
|
||||
|
||||
this.tableData.page = 0;
|
||||
this.tableData.total = 0;
|
||||
this.tableData.list = [];
|
||||
this.getTableData();
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e;
|
||||
this.getTableData();
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e - 1;
|
||||
this.getTableData();
|
||||
},
|
||||
// 商品列表
|
||||
async getTableData() {
|
||||
try {
|
||||
this.tableData.loading = true;
|
||||
const res = await tbConCheckGet({
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
conInfoId: this.form.conInfoId,
|
||||
sort: "id,desc"
|
||||
});
|
||||
this.tableData.list = res.content;
|
||||
this.tableData.total = res.totalElements;
|
||||
setTimeout(() => {
|
||||
this.tableData.loading = false;
|
||||
}, 500);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
this.form = Object.assign(this.form, obj)
|
||||
this.dialogVisible = true
|
||||
this.form.conInfoId = obj.consId
|
||||
this.form.stockNumber = obj.stockNumber
|
||||
this.form.balance = obj.stockNumber
|
||||
this.form.price == null ? 0 : this.form.price
|
||||
this.searhForm.productId = obj.id
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页大小改变
|
||||
sizeChange(e) {
|
||||
this.tableData.size = e
|
||||
this.getTableData()
|
||||
},
|
||||
// 分页回调
|
||||
paginationChange(e) {
|
||||
this.tableData.page = e - 1
|
||||
this.getTableData()
|
||||
},
|
||||
// 商品列表
|
||||
async getTableData() {
|
||||
try {
|
||||
this.tableData.loading = true
|
||||
const res = await tbConCheckGet({
|
||||
|
||||
page: this.tableData.page,
|
||||
size: this.tableData.size,
|
||||
conInfoId: this.searhForm.productId,
|
||||
sort: 'id,desc',
|
||||
})
|
||||
this.tableData.list = res.content
|
||||
this.tableData.total = res.totalElements
|
||||
setTimeout(() => {
|
||||
this.tableData.loading = false
|
||||
}, 500);
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.lose {
|
||||
&::v-deep .el-input__inner {
|
||||
color: rgb(238, 29, 29);
|
||||
}
|
||||
&::v-deep .el-input__inner {
|
||||
color: rgb(238, 29, 29);
|
||||
}
|
||||
}
|
||||
|
||||
.shop_info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
span {
|
||||
margin-left: 10px;
|
||||
}
|
||||
span {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
|
@ -110,9 +110,11 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
profitNumber() {
|
||||
// 盈亏数量
|
||||
return this.form.stocktakinNum - this.detail.stockNumber
|
||||
},
|
||||
profitPrice() {
|
||||
// 盈亏金额
|
||||
return formatDecimal((this.form.stocktakinNum - this.detail.stockNumber) * this.detail.salePrice)
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,174 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-dialog width="60%" :visible.sync="dialogVisible" :title="query.conName">
|
||||
<div class="app-container">
|
||||
<!-- <div class="head-container">
|
||||
<el-form :model="query" inline>
|
||||
<el-form-item>
|
||||
<el-input v-model="query.conName" placeholder="耗材信息名称" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getTableData">查询</el-button>
|
||||
<el-button @click="resetHandle">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div> -->
|
||||
<div class="head-container">
|
||||
<el-table
|
||||
ref="table"
|
||||
:data="clickseetableData.data"
|
||||
v-loading="clickseetableData.loading"
|
||||
row-key="id"
|
||||
height="50vh"
|
||||
>
|
||||
<el-table-column label="耗材名称" prop="conName" />
|
||||
<el-table-column label="变动库存" prop="amount">
|
||||
<template v-slot="scope">
|
||||
<span :class="{ red: scope.row.bizType == '-' }"
|
||||
>{{ scope.row.bizType }}{{ scope.row.amount }}</span
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="现有库存" prop="balance" />
|
||||
<!-- <el-table-column label="业务编码" prop="bizCode" /> -->
|
||||
<el-table-column label="业务说明" prop="bizName" />
|
||||
<el-table-column label="商品名称" prop="productName" />
|
||||
<el-table-column label="订单编号" >
|
||||
<template v-slot="scope">
|
||||
<a class="cursor-pointer" @click="toOrderList(scope.row)">{{ scope.row.orderNo||'' }}</a>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="正负号标识" prop="bizType" /> -->
|
||||
<!-- <el-table-column label="耗材id" prop="consId" /> -->
|
||||
<el-table-column
|
||||
label="创建时间"
|
||||
prop="createTime"
|
||||
></el-table-column>
|
||||
<!-- <el-table-column label="更新时间" prop="updateTime">
|
||||
<template v-slot="scope">
|
||||
{{ dayjs(scope.row.createdAt).format('YYYY-MM-DD HH:mm:ss') }}
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-pagination
|
||||
:total="clickseetableData.total"
|
||||
:current-page="clickseetableData.page + 1"
|
||||
:page-size="clickseetableData.size"
|
||||
layout="total, sizes, prev, pager, next, jumper"
|
||||
@current-change="paginationChangetype"
|
||||
@size-change="
|
||||
(e) => {
|
||||
clickseetableData.size = e;
|
||||
clickseetableData.page = 0;
|
||||
getTableData();
|
||||
}
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
|
||||
<order-detail ref="orderDetail"></order-detail>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { gettbConsInfo } from "@/api/consumable";
|
||||
import orderDetail from "@/views/order_manage/components/orderDetail";
|
||||
export default {
|
||||
components:{
|
||||
orderDetail
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
query: {
|
||||
conName: "",
|
||||
consId:''
|
||||
},
|
||||
dialogVisible:false,
|
||||
clickseetableData: {
|
||||
data: [],
|
||||
page: 0,
|
||||
size: 10,
|
||||
loading: false,
|
||||
total: 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
toOrderList(data){
|
||||
console.log(data)
|
||||
// if(data.orderId){
|
||||
// this.$refs.orderDetail.show({id:data.orderId})
|
||||
// }
|
||||
this.$router.push({
|
||||
path:'/order_manage/order_list',
|
||||
query:{
|
||||
orderNo: data.orderNo
|
||||
}
|
||||
})
|
||||
},
|
||||
open(query){
|
||||
this.dialogVisible = true;
|
||||
this.query=query
|
||||
console.log(query)
|
||||
this.getTableData();
|
||||
},
|
||||
close(){
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
lookDetail(row) {
|
||||
console.log(row);
|
||||
},
|
||||
resetHandle() {
|
||||
this.clickseetableData.page = 0;
|
||||
this.clickseetableData.size = 30;
|
||||
this.query.conName = "";
|
||||
this.query.consId = "";
|
||||
this.getTableData();
|
||||
},
|
||||
pageSizeChange(e) {
|
||||
this.clickseetableData.size = e;
|
||||
this.getTableData();
|
||||
},
|
||||
paginationChangetype(e) {
|
||||
this.clickseetableData.page = e - 1;
|
||||
this.getTableData();
|
||||
},
|
||||
// 查看查询耗材流水信息
|
||||
async getTableData() {
|
||||
try {
|
||||
this.clickseetableData.loading = true;
|
||||
const res = await gettbConsInfo({
|
||||
page: this.clickseetableData.page,
|
||||
size: this.clickseetableData.size,
|
||||
...this.query,
|
||||
shopId: localStorage.getItem("shopId"),
|
||||
});
|
||||
this.clickseetableData.loading = false;
|
||||
this.clickseetableData.data = res.content;
|
||||
this.clickseetableData.total = res.totalElements;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.cursor-pointer{
|
||||
cursor: pointer;
|
||||
color: #1890ff;
|
||||
font-size: 12px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.cursor-pointer:hover{
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
</style>
|
||||