Compare commits
4979 Commits
master
...
4051b31101
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4051b31101 | ||
|
|
94b1788e8c | ||
|
|
7944a1a8e3 | ||
|
|
17b28025d8 | ||
|
|
0a6b77943f | ||
|
|
a599566b20 | ||
|
|
1a7031342f | ||
|
|
516a8edb5e | ||
|
|
f4e2100882 | ||
|
|
9f6998e042 | ||
|
|
f730850d93 | ||
|
|
0ef83a945f | ||
|
|
cbfd68f50c | ||
|
|
7762eb6d24 | ||
|
|
db1a323921 | ||
|
|
1a61475f57 | ||
|
|
356e6438e0 | ||
|
|
5fe82a68ef | ||
|
|
9b6e02810a | ||
|
|
f0a32ad868 | ||
|
|
ce64bfd54d | ||
|
|
a53d25fae2 | ||
|
|
08d5e0e4fd | ||
|
|
b23f8325f4 | ||
|
|
0adb2b1486 | ||
|
|
38082397a9 | ||
|
|
4d527dc8ec | ||
|
|
d90aca62e4 | ||
|
|
44f11be05c | ||
|
|
7a21ab3804 | ||
|
|
6bb4802f15 | ||
|
|
cfc8f3c8e0 | ||
|
|
3f26b8b6df | ||
|
|
350ca644cf | ||
|
|
99b507657f | ||
|
|
2e93f1465f | ||
|
|
07a4d0637f | ||
|
|
66a721c1eb | ||
|
|
5efd2a1d3f | ||
|
|
d0c447bb41 | ||
|
|
ebc143a052 | ||
|
|
70b77669ab | ||
|
|
7393bcbc6e | ||
|
|
2abdab1b20 | ||
|
|
d1a8800a9b | ||
|
|
ced505b585 | ||
|
|
25010984f9 | ||
|
|
75d5971e42 | ||
|
|
f5085b1cb3 | ||
|
|
baa5c3124a | ||
|
|
d1ae5ff2c7 | ||
|
|
962d2a4068 | ||
|
|
3adbb68466 | ||
|
|
7f086f8b83 | ||
|
|
95689baff9 | ||
|
|
d39650eca5 | ||
|
|
4f44f50db5 | ||
|
|
27a2052241 | ||
|
|
072390dc13 | ||
|
|
385447d3b4 | ||
|
|
532ceeb5e7 | ||
|
|
2275590461 | ||
|
|
d25b082eff | ||
|
|
6feaeb22bf | ||
|
|
dad169496c | ||
|
|
3eef1eeb3c | ||
|
|
f108a61293 | ||
|
|
e1231d408c | ||
|
|
c073c8d0bd | ||
|
|
437ae1425c | ||
|
|
b6dcddac6f | ||
|
|
e283d6a650 | ||
|
|
230f8c3b80 | ||
|
|
382be3d32f | ||
|
|
a7c3b22f87 | ||
|
|
3585cceca8 | ||
|
|
908e65f136 | ||
|
|
7828af24fd | ||
|
|
185630ad2c | ||
|
|
67c4c8032e | ||
|
|
39ce5404c1 | ||
|
|
9f02c2d011 | ||
|
|
9d369e9a0f | ||
|
|
19a9486f48 | ||
|
|
ab9ec446c7 | ||
|
|
0d3d8f23bb | ||
|
|
971742b392 | ||
|
|
63a425cf77 | ||
|
|
e11d504f18 | ||
|
|
0e35945d4a | ||
|
|
0762067bec | ||
|
|
290ecb6823 | ||
|
|
ee15427e88 | ||
|
|
06fa7b636e | ||
|
|
225c0088e1 | ||
|
|
ae83152271 | ||
|
|
b1c0beb8f6 | ||
|
|
4d96417661 | ||
|
|
711db33df3 | ||
|
|
b7c0350134 | ||
|
|
9ff89c19f3 | ||
|
|
4684952973 | ||
|
|
4ead05b251 | ||
|
|
cf62d2f508 | ||
|
|
a894db0144 | ||
|
|
a748a8b337 | ||
|
|
37a6cb3457 | ||
|
|
045449331f | ||
|
|
4c72bd2ac9 | ||
|
|
b3942f5822 | ||
|
|
0b6bc910c4 | ||
|
|
a4233d5f2c | ||
|
|
31c874e1ba | ||
|
|
d40830188d | ||
|
|
e789570a1b | ||
|
|
0de94d76ee | ||
|
|
536f579523 | ||
|
|
c8d75ab72a | ||
|
|
ad9676c040 | ||
|
|
29bd119ff4 | ||
|
|
b07cca9bcf | ||
|
|
1c2364574d | ||
|
|
528082fc6b | ||
|
|
823c327894 | ||
|
|
39f6275e31 | ||
|
|
44d971998a | ||
|
|
6d7769e61a | ||
|
|
afe1df98f3 | ||
|
|
97bd799b6d | ||
|
|
3316b73450 | ||
|
|
eee06c837d | ||
|
|
c4ae782195 | ||
|
|
2b22db2bf3 | ||
|
|
30cf69df04 | ||
|
|
54352ece58 | ||
|
|
daffd10bce | ||
|
|
a22b574614 | ||
|
|
e3c79f232d | ||
|
|
1ae371cb30 | ||
|
|
96d24a8b22 | ||
|
|
34eb7320fa | ||
|
|
9fa56ad890 | ||
|
|
263dd9ea37 | ||
|
|
85de031db2 | ||
|
|
a6f11e56a7 | ||
|
|
15f6dc6499 | ||
|
|
b64b102682 | ||
|
|
576553e962 | ||
|
|
ff5e2d4fe2 | ||
|
|
3f41df22a9 | ||
|
|
043aaf8399 | ||
|
|
a5e0f3a6c5 | ||
|
|
f9123942ca | ||
|
|
b67e30ce25 | ||
|
|
5a2762a7c6 | ||
|
|
c43a8992fd | ||
|
|
705a252618 | ||
|
|
e2e957880b | ||
|
|
104f5d1049 | ||
|
|
b3f11698f2 | ||
|
|
285e242e9e | ||
|
|
00b2dbb4a4 | ||
|
|
0b41291bf1 | ||
|
|
f35c272a19 | ||
|
|
3a5af5777c | ||
|
|
2cbddaeb4a | ||
|
|
e88658b1be | ||
|
|
8e73c39c47 | ||
|
|
119cd5bad9 | ||
|
|
ddfdbf161a | ||
|
|
0940462d70 | ||
|
|
80978d3794 | ||
|
|
134b78189d | ||
|
|
0c9b5d522e | ||
|
|
c663bd52fc | ||
|
|
573349f864 | ||
|
|
6a1d86b88a | ||
|
|
c1bca77b3f | ||
|
|
f962d9db1d | ||
|
|
78a3842e01 | ||
|
|
e69b66d2aa | ||
|
|
85c6d365b1 | ||
|
|
1131f98b27 | ||
|
|
0188289e05 | ||
|
|
1ae490f744 | ||
|
|
c842794d0d | ||
|
|
f888c81508 | ||
|
|
6118304302 | ||
|
|
6b2906fb53 | ||
|
|
4e33b3ae02 | ||
|
|
688834a86e | ||
|
|
df49e1f9dc | ||
|
|
4f36215dad | ||
|
|
5bc9f859f4 | ||
|
|
05d4acf5da | ||
|
|
755719e228 | ||
|
|
41d74a9d57 | ||
|
|
9ca1b4f161 | ||
|
|
0a5592594b | ||
|
|
2c39458e98 | ||
|
|
aefe08d35e | ||
|
|
6de9346d01 | ||
|
|
a02e0d575b | ||
|
|
358f77b13b | ||
|
|
494cc25c4d | ||
|
|
cd314f3da7 | ||
|
|
065306e511 | ||
|
|
8b724e52b3 | ||
|
|
155366d92e | ||
|
|
bcba8286cc | ||
|
|
f007dc84e7 | ||
|
|
cb4c7dd623 | ||
|
|
10b44698e1 | ||
|
|
83c782f3e6 | ||
|
|
f8c75eab5b | ||
|
|
d5b1190492 | ||
|
|
2bac43eeda | ||
|
|
77176e5bf5 | ||
|
|
891757c7eb | ||
|
|
47e31b127d | ||
|
|
6ad47f207a | ||
|
|
0ff3eaff97 | ||
|
|
7d4c79ce1a | ||
|
|
43e7f044f3 | ||
|
|
efd05d3298 | ||
|
|
e6c143881d | ||
|
|
5b2ccae4ae | ||
|
|
de86b003fa | ||
|
|
70f8685b07 | ||
|
|
df50f83ee2 | ||
|
|
8a2015da4c | ||
|
|
5ee3bfbc41 | ||
|
|
f7c2d03428 | ||
|
|
4889f8bc09 | ||
|
|
1ea55c9e13 | ||
|
|
438cbaa978 | ||
|
|
6a295b67d8 | ||
|
|
3f389d2f43 | ||
|
|
c3f46fcd50 | ||
|
|
daa79e7b1b | ||
|
|
074f77fac0 | ||
|
|
1c27e3e574 | ||
|
|
a4f430be3e | ||
|
|
c6672bc712 | ||
|
|
5897590973 | ||
|
|
846ac803df | ||
|
|
b066edd428 | ||
|
|
9015cd06c0 | ||
|
|
859a8198fe | ||
|
|
077cb2cad2 | ||
|
|
bc1504cce5 | ||
|
|
4c01b277d2 | ||
|
|
01cd905669 | ||
|
|
eac706bfcb | ||
|
|
be9aa08cd9 | ||
|
|
1cac8ab8e0 | ||
|
|
4385ba2354 | ||
|
|
8707b6d48d | ||
|
|
a10a09c979 | ||
|
|
4a563fbc78 | ||
|
|
4e790062c7 | ||
|
|
59a998ee70 | ||
|
|
ed809fe9f4 | ||
|
|
ec9bc40fe0 | ||
|
|
fb3ded6877 | ||
|
|
870bc38f1c | ||
|
|
2a882cb3ee | ||
|
|
80b6a03999 | ||
|
|
f1ba9f7409 | ||
|
|
740c6497f1 | ||
|
|
5cc073cb87 | ||
|
|
809ef180a9 | ||
|
|
3ebed172ac | ||
|
|
0220dc7f67 | ||
|
|
08cb8b1be8 | ||
|
|
9b7b1283a8 | ||
|
|
a6af330500 | ||
|
|
a9224b896b | ||
|
|
308c7f8ab0 | ||
|
|
916fae5c36 | ||
|
|
42aca4d540 | ||
|
|
af5c7fb279 | ||
|
|
01c9853f9e | ||
|
|
a52278552c | ||
|
|
1c9a736274 | ||
|
|
dbb986688c | ||
|
|
0fd8a0e1fa | ||
|
|
60a4d6a1c8 | ||
|
|
bad99f9383 | ||
|
|
dc1eacdc7f | ||
|
|
9ecde574bc | ||
|
|
a6362ee638 | ||
|
|
c1e1ac4b8b | ||
|
|
f8a7ffaca9 | ||
|
|
a362764dad | ||
|
|
fc468044c6 | ||
|
|
1e9fd39349 | ||
|
|
dd3e60ee2f | ||
|
|
ece1ef06c3 | ||
|
|
6683b51c2f | ||
|
|
ff2d0a8315 | ||
|
|
541d090fa7 | ||
|
|
1f5b213ddd | ||
|
|
165ae97634 | ||
|
|
f72c34e802 | ||
|
|
57db3819bb | ||
|
|
d3d8e4f397 | ||
|
|
29e4d1ec4b | ||
|
|
388274ace5 | ||
|
|
6fc848d164 | ||
|
|
01b4f3abb8 | ||
|
|
7c34462adc | ||
|
|
77664107fa | ||
|
|
9c5f594a58 | ||
|
|
8a704eae3e | ||
|
|
09f9795cd8 | ||
|
|
0f1df0b87d | ||
|
|
b5a07c699a | ||
|
|
61852f86ec | ||
|
|
e2d5d29d0c | ||
|
|
23bfdb7ac5 | ||
|
|
172213cdc2 | ||
|
|
1e65208a4b | ||
|
|
7aa17bd31c | ||
|
|
205f17b706 | ||
|
|
2164d0f348 | ||
|
|
72d69e5c8f | ||
|
|
91fd641845 | ||
|
|
ece292c45a | ||
|
|
6b59beba0d | ||
|
|
aba3e33e70 | ||
|
|
5fd3ed4542 | ||
|
|
c707186f48 | ||
|
|
ebc5e3aeef | ||
|
|
52cbc12d20 | ||
|
|
00105f6a7d | ||
|
|
53bf64712e | ||
|
|
5ddb198c0e | ||
|
|
15e9f9d760 | ||
|
|
236404c5ba | ||
|
|
9b8f05e764 | ||
|
|
2dc62004e1 | ||
|
|
a4c5517b09 | ||
|
|
e1b9633ba4 | ||
|
|
e73dd17908 | ||
|
|
54880a9562 | ||
|
|
2ff20d4fc5 | ||
|
|
f719b71628 | ||
|
|
3e3f3349b4 | ||
|
|
be8698382a | ||
|
|
463e545c19 | ||
|
|
210e410a26 | ||
|
|
4e051d9bee | ||
|
|
2796506449 | ||
|
|
f0f7f75bf3 | ||
|
|
587b988ade | ||
|
|
8279b89ff5 | ||
|
|
2143da5dce | ||
|
|
f095e344f5 | ||
|
|
d59aef8a15 | ||
|
|
ebf726afd5 | ||
|
|
c0667636a5 | ||
|
|
892979ef1a | ||
|
|
eca9fc8196 | ||
|
|
8566f8cd70 | ||
|
|
f7976b6022 | ||
|
|
d17ae463e8 | ||
|
|
927a091075 | ||
|
|
b4234e30d8 | ||
|
|
f2a513bd0e | ||
|
|
90e89cd60d | ||
|
|
cd4a5621bb | ||
|
|
5c29d7ca5d | ||
|
|
18dd1937ce | ||
|
|
c65f06acc0 | ||
|
|
e7991254fa | ||
|
|
46ea63390e | ||
|
|
17990fe640 | ||
|
|
615f83861e | ||
|
|
428eb3319f | ||
|
|
91f3956508 | ||
|
|
5fa3d83f3e | ||
|
|
d1c0c4a784 | ||
|
|
316e530943 | ||
|
|
692ffab0d9 | ||
|
|
a293259fb9 | ||
|
|
ea0ec60401 | ||
|
|
526af7828d | ||
|
|
3c9ac1b3d8 | ||
|
|
562a875219 | ||
|
|
d21a9ba075 | ||
|
|
777411294c | ||
|
|
4dd5d85607 | ||
|
|
4476215d1c | ||
|
|
fccdcf735f | ||
|
|
8c9db36978 | ||
|
|
aded396bd1 | ||
|
|
fa6553c4f6 | ||
|
|
180cc0778d | ||
|
|
840934372e | ||
|
|
ec09a998f7 | ||
|
|
426f081cbc | ||
|
|
890af51f30 | ||
|
|
18fa7ac43f | ||
|
|
6b54d60ae0 | ||
|
|
4753245f74 | ||
|
|
a1c2cef0d9 | ||
|
|
5423483f1c | ||
|
|
a20fcb413a | ||
|
|
f3e1580fef | ||
|
|
cd708b373c | ||
|
|
d025673c53 | ||
|
|
a85f7b201c | ||
|
|
6dbe6365e8 | ||
|
|
f909eae8c0 | ||
|
|
674ddb1fd6 | ||
|
|
7dfd1c8d6c | ||
|
|
7393eeb858 | ||
|
|
8f21db5ca3 | ||
|
|
7a0538dff0 | ||
|
|
fdfbaad6d8 | ||
| e72f7c5e9f | |||
| bc50d76366 | |||
| fe7c6a5cb8 | |||
|
|
372f52e655 | ||
|
|
5d2a66b861 | ||
|
|
b5523f5f40 | ||
|
|
a4d4e3cea5 | ||
|
|
f50bd497be | ||
|
|
de918d48dc | ||
|
|
d599972b7f | ||
|
|
dee681d246 | ||
|
|
8990e921ae | ||
|
|
67fb697136 | ||
|
|
f34d6bf108 | ||
|
|
570476b2aa | ||
|
|
0821d9b238 | ||
|
|
c557433324 | ||
|
|
78d2c0ee21 | ||
|
|
03cd857bf3 | ||
|
|
5273f300ea | ||
|
|
4c220621b5 | ||
|
|
e2c0e919d3 | ||
|
|
bffb6d14e0 | ||
|
|
10b43594ca | ||
|
|
c7b37d645d | ||
|
|
bc17e11c47 | ||
|
|
0731de6926 | ||
|
|
9710e0aa00 | ||
|
|
59b4151e15 | ||
|
|
d0a695e874 | ||
|
|
ec55f48a63 | ||
|
|
f69a6a75c8 | ||
|
|
6f688a058c | ||
|
|
9ea22ba66b | ||
|
|
dbf63a0952 | ||
|
|
2de8bc681b | ||
|
|
1ba2d12376 | ||
|
|
cb24b1560d | ||
|
|
5656d35d71 | ||
|
|
80734a0893 | ||
|
|
2335d43070 | ||
|
|
1a1ed43bd3 | ||
|
|
32500deaee | ||
|
|
5b56f03269 | ||
|
|
f5dcdd3755 | ||
|
|
68d4f8ac1b | ||
|
|
4442b2c578 | ||
|
|
66d0f0c8ab | ||
|
|
a65bb62369 | ||
|
|
da02013346 | ||
|
|
c30099b635 | ||
|
|
75f3efa38a | ||
|
|
f9e74f8362 | ||
|
|
13b779ff3e | ||
|
|
8a1fa07e9b | ||
|
|
44a486fba6 | ||
|
|
99030da813 | ||
|
|
592981cdf8 | ||
|
|
ca9e65f0cf | ||
|
|
e21be6d018 | ||
|
|
28439149b3 | ||
|
|
e259a3c411 | ||
|
|
124cb852aa | ||
|
|
d3fc263f4e | ||
|
|
f404055955 | ||
|
|
421d15e27e | ||
|
|
1994faf5b8 | ||
|
|
6cca359c2a | ||
|
|
304a64f65c | ||
|
|
717328223a | ||
|
|
f1ed3b9b54 | ||
|
|
7b5cbdf010 | ||
|
|
f1dd17b8f9 | ||
|
|
4e145e8435 | ||
|
|
066feca056 | ||
|
|
9414658842 | ||
|
|
c494281257 | ||
|
|
0c940de38d | ||
|
|
eaf7819d22 | ||
|
|
212413ae5f | ||
|
|
0e94cec311 | ||
|
|
9946553938 | ||
|
|
06eb7a30bf | ||
|
|
f9684bb0c4 | ||
|
|
bafa145712 | ||
|
|
1f884ac990 | ||
|
|
776539a32b | ||
|
|
f82d7f58e7 | ||
|
|
a42aa166d1 | ||
|
|
7232b894f7 | ||
|
|
4f3a5af06d | ||
|
|
ac3ea74b87 | ||
|
|
d18b879873 | ||
|
|
8d477fd6b5 | ||
|
|
4f446d5a09 | ||
|
|
f77d943ba6 | ||
|
|
23d845f828 | ||
|
|
f0c3ae6cd4 | ||
|
|
7ec939c54d | ||
|
|
619858e595 | ||
|
|
5e37673dba | ||
|
|
e45d794128 | ||
|
|
74f31b61d2 | ||
|
|
30f8f09645 | ||
|
|
40860776a0 | ||
|
|
ad0a91750c | ||
|
|
1aa2e264d7 | ||
|
|
7792ec186c | ||
|
|
60e9377f2e | ||
|
|
2f711f455a | ||
|
|
4943c4cd09 | ||
|
|
c399e1a522 | ||
|
|
6975bf7608 | ||
|
|
f01445678d | ||
|
|
059112abba | ||
|
|
eaba5f7be7 | ||
|
|
ffa8e336b6 | ||
|
|
10a67de2ba | ||
|
|
9316a8749e | ||
| b6f7aac2cd | |||
|
|
194c9e59df | ||
|
|
4fefcb8766 | ||
|
|
ee78546e7a | ||
|
|
35aedab466 | ||
|
|
4574738593 | ||
|
|
7a0577b1c3 | ||
|
|
94300ec85c | ||
|
|
0256669afb | ||
|
|
42673696b4 | ||
|
|
fdb5226b31 | ||
|
|
8f5b0a990e | ||
|
|
2e3671c1fa | ||
|
|
1819bdf1b9 | ||
|
|
37c81cb607 | ||
|
|
d0a7759428 | ||
|
|
cf6a8cf71f | ||
|
|
d8efdc369c | ||
|
|
d38355ba37 | ||
|
|
2603294bf9 | ||
|
|
b4a8363efe | ||
|
|
c84e0d288e | ||
|
|
6168d5d4b2 | ||
|
|
d7e8fa64fd | ||
|
|
8f6917b10f | ||
|
|
312c17d985 | ||
|
|
15f9f4f9d3 | ||
|
|
94d27be493 | ||
|
|
47c74b5d0a | ||
|
|
fb0b73be04 | ||
|
|
914fb11d48 | ||
|
|
950dd57d2d | ||
|
|
293737d8ac | ||
|
|
258bf54607 | ||
|
|
62a38d7d9e | ||
|
|
bcfd770fc2 | ||
|
|
07cff62073 | ||
|
|
1312af0d5c | ||
|
|
791af1c397 | ||
|
|
3be2c18960 | ||
|
|
aa4cdb88a2 | ||
|
|
4d45905531 | ||
|
|
4f4319150b | ||
|
|
7913e12144 | ||
|
|
a0113a6770 | ||
|
|
088d91bb95 | ||
|
|
bdd2e7f5ee | ||
|
|
81f9744633 | ||
|
|
5859210eb3 | ||
|
|
a784c2c9b4 | ||
|
|
688437a068 | ||
|
|
843476a24b | ||
|
|
df464eae89 | ||
|
|
22023aa887 | ||
|
|
5718b5bfa2 | ||
|
|
3ac80e3bbb | ||
|
|
ed6b0695f2 | ||
|
|
1370593dd0 | ||
|
|
acb6393f7d | ||
|
|
0aaa71aa29 | ||
|
|
0c3dab491f | ||
|
|
63d85b5c5b | ||
|
|
3473d09885 | ||
|
|
10ae557ad0 | ||
|
|
9307452a14 | ||
|
|
a2519d82a2 | ||
|
|
ec8da18298 | ||
|
|
91701965e9 | ||
|
|
86171587a0 | ||
|
|
6474d8d4a1 | ||
|
|
dc45b610cc | ||
|
|
a0afde54ff | ||
|
|
329aeecb34 | ||
|
|
1b4f7d95bf | ||
|
|
2221b11742 | ||
|
|
4e07ff289e | ||
|
|
542466d01a | ||
|
|
b64f63ef9b | ||
|
|
ff9491490c | ||
|
|
9e720dd808 | ||
|
|
985efd1a83 | ||
|
|
9251ab86e3 | ||
|
|
961950bf5e | ||
|
|
ed390fafc2 | ||
|
|
ddc099cffb | ||
|
|
c66b661779 | ||
|
|
407b3ba2ac | ||
|
|
d61c61d553 | ||
|
|
eaadc9ae9c | ||
|
|
667e2af2df | ||
|
|
059df5fddf | ||
|
|
2d74465cf7 | ||
|
|
8b0650641e | ||
|
|
c830b57f1f | ||
|
|
f4b0e31858 | ||
|
|
24b7be6b32 | ||
|
|
5620d9aeb9 | ||
|
|
3cc973c3be | ||
|
|
2546cadadd | ||
|
|
1dd3a81607 | ||
|
|
67f1d0c45c | ||
|
|
ba05fbda15 | ||
|
|
6ea2e37243 | ||
|
|
cd33176a79 | ||
|
|
8d19706bac | ||
|
|
ebb263cf2b | ||
|
|
00e02114cf | ||
|
|
5a64f7ac7d | ||
|
|
d5f959707a | ||
|
|
4ec643dd1a | ||
|
|
fd90613094 | ||
|
|
1420676c7c | ||
|
|
b37a7b0d04 | ||
|
|
8c07c9a6cb | ||
|
|
189e7621ad | ||
|
|
e55b5b8a8d | ||
|
|
b7b1431b20 | ||
|
|
f9b7833e47 | ||
|
|
82bd4af605 | ||
|
|
da422ec320 | ||
|
|
8df77fb17a | ||
|
|
522b197279 | ||
|
|
e49b4840e3 | ||
|
|
ca7ad35d97 | ||
|
|
4ba346e72a | ||
|
|
eed32e32a7 | ||
|
|
3ade163fbd | ||
|
|
ab92982e71 | ||
|
|
6b7ff8e58c | ||
|
|
7be1dfd235 | ||
|
|
76f8830a0e | ||
|
|
de994686f7 | ||
|
|
5b09630e62 | ||
|
|
c776c1d733 | ||
|
|
21ed9dc914 | ||
|
|
cec6ccc78a | ||
|
|
6f6dc79702 | ||
|
|
656b4be0c3 | ||
|
|
e129575479 | ||
|
|
1b2348ef73 | ||
|
|
3a9377fe4b | ||
|
|
d6d1b16a81 | ||
|
|
30b25883a8 | ||
|
|
872e7afdd3 | ||
|
|
4eeb00b093 | ||
|
|
dec9937830 | ||
|
|
c2a1ad2cd7 | ||
|
|
8dd48bc16c | ||
|
|
8aaf56e9e9 | ||
|
|
8224ebfb8a | ||
|
|
fa551fe618 | ||
|
|
03272542b9 | ||
|
|
1c69fc8366 | ||
|
|
50541832cc | ||
|
|
39a344b054 | ||
|
|
54d49f0d14 | ||
|
|
b235b5a3dc | ||
|
|
54b4c6f7c3 | ||
|
|
51aa329160 | ||
|
|
6c60c3439a | ||
|
|
e725476603 | ||
|
|
1604efdecc | ||
|
|
7e1bf238a2 | ||
|
|
c300e4072b | ||
|
|
c0199b7b27 | ||
|
|
068f041b1b | ||
|
|
2a35b7611d | ||
|
|
ec7048ac6b | ||
|
|
5a9a408bac | ||
|
|
449f315602 | ||
|
|
d217c3a7d9 | ||
|
|
12c3076fbf | ||
|
|
b2a6f5c09d | ||
|
|
aeb7a68940 | ||
|
|
adbf66aa00 | ||
|
|
20cd701073 | ||
|
|
8753f74791 | ||
|
|
39ad7e3a2f | ||
|
|
e619acafd0 | ||
|
|
9332c73979 | ||
|
|
de826faffd | ||
|
|
587b472194 | ||
|
|
7a67f0ebac | ||
|
|
74ddc88d00 | ||
|
|
87441df05d | ||
|
|
5b32a8d9f2 | ||
|
|
7075fed306 | ||
|
|
45083c459d | ||
|
|
390315d8fc | ||
|
|
e22bee323c | ||
|
|
f05e036bd0 | ||
|
|
27be7e63fc | ||
|
|
075beeb66b | ||
|
|
a06537df58 | ||
|
|
fc504404eb | ||
|
|
833b812a5f | ||
|
|
3dc9c0b86d | ||
|
|
f146d3de01 | ||
|
|
0d772dd5d8 | ||
|
|
a90f9be052 | ||
|
|
9038477862 | ||
|
|
468e05d75a | ||
|
|
673de90b92 | ||
|
|
4ce40daea1 | ||
|
|
21346a6798 | ||
|
|
fa6f4a6d96 | ||
|
|
71f3bce5c7 | ||
|
|
6ac9c8e569 | ||
|
|
cab95c1ae7 | ||
|
|
59b65f1745 | ||
|
|
d1bc5a27ce | ||
|
|
28bb272ea4 | ||
|
|
97755bf7f9 | ||
|
|
2146056299 | ||
|
|
69e586d62b | ||
|
|
be339c78ba | ||
|
|
c8c1e558b1 | ||
|
|
e03b0a203a | ||
|
|
6c88de497b | ||
|
|
b8838d2171 | ||
|
|
17249c16fa | ||
|
|
8e167df7e3 | ||
|
|
378f4eba0b | ||
|
|
ed4b58e215 | ||
|
|
c99a9a1332 | ||
|
|
f342e7d672 | ||
|
|
4f240ce79b | ||
|
|
3ef745acc6 | ||
|
|
d767bd4326 | ||
|
|
36768dd5ca | ||
|
|
0b024f86c2 | ||
|
|
144d8be0d2 | ||
|
|
ef371ae830 | ||
|
|
45a6e9f468 | ||
|
|
d05b98d6e1 | ||
|
|
14cbefd125 | ||
|
|
046f0bf729 | ||
|
|
6b1c753d63 | ||
|
|
356ce8a63c | ||
|
|
3a27e68a90 | ||
|
|
6f414822de | ||
|
|
783bd0c4a3 | ||
|
|
f140ef743d | ||
|
|
e87f7305af | ||
|
|
d076ac472c | ||
|
|
5949a8080b | ||
|
|
9a30b5aee0 | ||
|
|
b1959edcd3 | ||
|
|
681088cb8d | ||
|
|
18009fdcb1 | ||
|
|
12712f55c8 | ||
|
|
2394a51cc0 | ||
|
|
9582d09ab7 | ||
|
|
fce4725783 | ||
|
|
7d90a45cf6 | ||
|
|
e3c3058a14 | ||
|
|
8b37b1236e | ||
|
|
20361ebe31 | ||
|
|
d26ab93831 | ||
|
|
d031e5d8e1 | ||
|
|
87f046d128 | ||
|
|
60b14432b6 | ||
|
|
9e5c080c4d | ||
|
|
3824243527 | ||
|
|
408fcffb29 | ||
|
|
e416bd4b33 | ||
|
|
376cd60edd | ||
|
|
497db329be | ||
|
|
f375ede115 | ||
|
|
406be50c27 | ||
|
|
2840952a41 | ||
|
|
4d843a9917 | ||
|
|
853dfc5988 | ||
|
|
437b348d06 | ||
|
|
d143c6cc94 | ||
|
|
15ca20f906 | ||
|
|
0b2b613a7d | ||
|
|
8e0265232b | ||
|
|
0bc282c796 | ||
|
|
3acc7ef3d1 | ||
|
|
8f9d0d577f | ||
|
|
ccf1be34be | ||
|
|
22c77339d2 | ||
|
|
7c71eb3cb8 | ||
|
|
3501165a3a | ||
|
|
b42d1a0502 | ||
|
|
cc1026765f | ||
|
|
16052ff00c | ||
|
|
e983bd22a1 | ||
|
|
b09cfd62a5 | ||
|
|
42b77e095c | ||
|
|
a7e4c4528b | ||
|
|
852fa0346f | ||
|
|
295ff657e8 | ||
|
|
56b12271b8 | ||
|
|
80438a6ef2 | ||
|
|
a3f6cde2da | ||
|
|
0f1e9d4815 | ||
|
|
7cee782996 | ||
|
|
129ea08723 | ||
|
|
cf6b2ae087 | ||
|
|
cc6719a677 | ||
|
|
76523d1c9f | ||
|
|
545f796578 | ||
|
|
f2ff079d79 | ||
|
|
f51879a8af | ||
|
|
c6638f891d | ||
|
|
6c517b5f2f | ||
|
|
20d2cd8426 | ||
|
|
645b6c774f | ||
|
|
ac9b240a0f | ||
|
|
0164aaa924 | ||
|
|
9c0330561c | ||
|
|
2575c256c4 | ||
|
|
543636c180 | ||
|
|
23383c28de | ||
|
|
c616e57b4f | ||
|
|
4e5814b1a1 | ||
|
|
47779269b4 | ||
|
|
fe62caea78 | ||
|
|
0dd726ced9 | ||
|
|
5549773805 | ||
|
|
56688f75d8 | ||
|
|
e3a9f8032b | ||
|
|
06eaf1e59d | ||
|
|
5dba7c558f | ||
|
|
47a1f52cde | ||
|
|
38d79cc0e2 | ||
|
|
f697a86440 | ||
|
|
bcbdb81ad1 | ||
|
|
a1dfc6483c | ||
|
|
358ad78f13 | ||
|
|
164fe19a4a | ||
|
|
9c45f25e8d | ||
|
|
8af3b1b9fb | ||
|
|
5f92126be4 | ||
|
|
8af5ea6f45 | ||
|
|
cde4ef3ddf | ||
|
|
44b4685257 | ||
|
|
b89581c900 | ||
|
|
c18511ac01 | ||
|
|
6e1b0a0684 | ||
|
|
5b90115b80 | ||
|
|
f4c3ad72c4 | ||
|
|
4eb960b16b | ||
|
|
f2a7cafc76 | ||
|
|
96647bfa90 | ||
|
|
2d943d4399 | ||
|
|
fc0f92a7de | ||
|
|
00340f1d21 | ||
|
|
f59179e3bc | ||
|
|
27e6fe0eb2 | ||
|
|
107515e876 | ||
|
|
6a3cadf53d | ||
|
|
feea70120c | ||
|
|
549d747a8c | ||
|
|
201076e0fe | ||
|
|
75d33443f0 | ||
|
|
b5afda4cce | ||
|
|
7e40790569 | ||
|
|
507565de3d | ||
|
|
ad2e5bccab | ||
|
|
077fc80264 | ||
|
|
7e0bc1ef61 | ||
|
|
4392aed3f6 | ||
|
|
fe9b1cd542 | ||
|
|
99d9d36549 | ||
|
|
019e8262bb | ||
|
|
e89d9d8716 | ||
|
|
6a828ff68c | ||
|
|
31c18321ae | ||
|
|
1763582623 | ||
|
|
d0a194e41b | ||
|
|
a020f4c097 | ||
|
|
5d8ab39041 | ||
|
|
e78a89a112 | ||
|
|
3e440cfad9 | ||
|
|
0266acd77a | ||
|
|
97306a8dc0 | ||
|
|
2598239ccd | ||
|
|
9623b426b0 | ||
|
|
68d122e38d | ||
|
|
d93a658666 | ||
|
|
88a2955788 | ||
|
|
2cfa55841a | ||
|
|
8c77493f7a | ||
|
|
2eedf9e7fc | ||
|
|
cbda18f8e8 | ||
|
|
ce7db89626 | ||
|
|
be91cfe3b0 | ||
|
|
99368c5f86 | ||
|
|
38d5f9d753 | ||
|
|
4a6732d816 | ||
|
|
44ce4979d7 | ||
|
|
ccd8cdf9ba | ||
|
|
ba7987b7ff | ||
|
|
9af8a19922 | ||
|
|
f47a481076 | ||
|
|
84096c9bde | ||
|
|
73b7c5222b | ||
|
|
6d435d32d7 | ||
|
|
1fec63c027 | ||
|
|
383fcd00b0 | ||
|
|
5bd534c170 | ||
|
|
c71cb51e11 | ||
|
|
a8ac7b14d4 | ||
|
|
291d068c66 | ||
|
|
57c1037871 | ||
|
|
ca19697d1c | ||
|
|
6d037bbe8d | ||
|
|
c3f80c5fa6 | ||
|
|
8b320ece34 | ||
|
|
e6f2d1e599 | ||
|
|
fbf2ac5d12 | ||
|
|
ccdbbc8562 | ||
|
|
5181e9ec14 | ||
|
|
c90cdf7678 | ||
|
|
57120ca85f | ||
|
|
df27cbefec | ||
|
|
381eefb78f | ||
|
|
969785c47a | ||
|
|
02ae6b6280 | ||
|
|
568c560e61 | ||
|
|
c9d6b0dd14 | ||
|
|
4d0954fad5 | ||
|
|
6ff5e64613 | ||
|
|
4100f0744d | ||
|
|
81d4c7c174 | ||
|
|
66ee9806cf | ||
|
|
09b9b308ff | ||
|
|
1e6c7109f3 | ||
|
|
17dc4d48a4 | ||
|
|
3d927d8e8d | ||
|
|
66addd9ebe | ||
|
|
f92602a7c1 | ||
|
|
ef06d88bd4 | ||
|
|
399180d2cf | ||
|
|
3ec7a262d4 | ||
|
|
8acfa11f94 | ||
|
|
14bee51dbd | ||
|
|
1934cfaafc | ||
|
|
a20d1d893c | ||
|
|
a29f7b4aae | ||
|
|
c73dba2cf0 | ||
|
|
d15a9ee20e | ||
|
|
56e330588f | ||
|
|
c3ad840e0c | ||
|
|
46e5ac38dc | ||
|
|
d662e2dc75 | ||
|
|
3361aa300b | ||
|
|
6741eb17d4 | ||
|
|
44e2c25f5b | ||
|
|
e238a9e052 | ||
|
|
3087ca7ae9 | ||
|
|
64226da7cf | ||
|
|
0a5edffcf8 | ||
|
|
3e7ac24bd5 | ||
|
|
80d487a726 | ||
|
|
77cf1c1525 | ||
|
|
2248485801 | ||
|
|
ed46bece45 | ||
|
|
da858fbe35 | ||
|
|
f2f3d5c8a7 | ||
|
|
df160cbb2b | ||
|
|
6cd0602536 | ||
|
|
41a78266fe | ||
|
|
ef639ba1c1 | ||
|
|
56b3240de7 | ||
|
|
e80e0c61d9 | ||
|
|
4398d76a91 | ||
|
|
c5784e268e | ||
|
|
b6a55f5b9d | ||
|
|
7249809b09 | ||
|
|
892a308e0b | ||
|
|
0507cd9a89 | ||
|
|
60facb4d4d | ||
|
|
d7ccdb3897 | ||
|
|
49ddfe9404 | ||
|
|
e84f8b4c18 | ||
|
|
973ca20fb6 | ||
|
|
5b5fcd2a88 | ||
|
|
1f20801f2c | ||
|
|
fe1a7c6ced | ||
|
|
6d14c00acc | ||
|
|
f7cf905f93 | ||
|
|
de3e4ef259 | ||
|
|
079f85eab9 | ||
|
|
c241d613fe | ||
|
|
f346e8289f | ||
|
|
de018e95b5 | ||
|
|
f5b9baac75 | ||
|
|
8e501b0f7e | ||
|
|
597189adb1 | ||
|
|
6d28ab9d12 | ||
|
|
1090dc13f1 | ||
|
|
8ae50f3852 | ||
|
|
b098a4e294 | ||
|
|
89ffcc639a | ||
|
|
35105ddc05 | ||
|
|
de42648740 | ||
|
|
b1f62f868b | ||
|
|
d026b4aa14 | ||
|
|
9a3eeca0cf | ||
|
|
16418ba1f5 | ||
|
|
b5b530d1d7 | ||
|
|
9370e764bb | ||
|
|
4f4c4b1cb1 | ||
|
|
b77c5cc7ee | ||
|
|
927747e95d | ||
|
|
30b25e56b8 | ||
|
|
fff9891177 | ||
|
|
7086b7af99 | ||
|
|
bbdc9c3983 | ||
|
|
11ca29b3f6 | ||
|
|
b126053e09 | ||
|
|
4d7b5949c1 | ||
|
|
0f752889fd | ||
|
|
aca3b38dab | ||
|
|
9c37fa0414 | ||
|
|
1481bf7fa0 | ||
|
|
181a4018be | ||
|
|
3724b25e4c | ||
|
|
dfc9a1cb03 | ||
|
|
090d15dda1 | ||
|
|
c3fa9b8d79 | ||
|
|
4f9c4c8d27 | ||
|
|
a9959a8ed2 | ||
|
|
fa9f36bca9 | ||
|
|
4d8fd26ddd | ||
|
|
f5a65e98be | ||
|
|
5a4c1f9a61 | ||
|
|
605f8a33f6 | ||
|
|
090fceabbe | ||
|
|
53d9e5f558 | ||
|
|
fb3206a9ec | ||
|
|
3bf5efdd64 | ||
|
|
14fc3eff94 | ||
|
|
a1cb11b1d8 | ||
|
|
8beb2a3699 | ||
|
|
8b818e82b4 | ||
|
|
deb5ef82e1 | ||
|
|
1fc632f097 | ||
|
|
ada5ef8bfe | ||
|
|
7deff7e464 | ||
|
|
466192f7fd | ||
|
|
cc74131f44 | ||
|
|
4f217788ca | ||
|
|
a8557de4d6 | ||
|
|
69b2bd6b6f | ||
|
|
bd5698a781 | ||
|
|
7539d38294 | ||
|
|
32f819f16a | ||
|
|
cf19a1ee7b | ||
|
|
c0b9078a0b | ||
|
|
09a161686c | ||
|
|
c7a32d0319 | ||
|
|
5d42d5ad34 | ||
|
|
c0a513a1a7 | ||
|
|
d1fa008407 | ||
|
|
7d203cda5e | ||
|
|
1846715f47 | ||
|
|
7ee414725c | ||
|
|
d0361418cf | ||
|
|
b202caec7f | ||
|
|
4bed4bca66 | ||
|
|
61b11585b2 | ||
|
|
671d62d0cc | ||
|
|
33695de84f | ||
|
|
4b99f2768f | ||
|
|
6b4051b984 | ||
|
|
a2747e7182 | ||
|
|
b36a3661a0 | ||
|
|
8a7dc2e798 | ||
|
|
8c5e95859a | ||
|
|
908a11d268 | ||
|
|
2daeb761b1 | ||
|
|
bb67491c2d | ||
|
|
c5b3f6daa2 | ||
|
|
8eb675f4a4 | ||
|
|
6a9ca31b8f | ||
|
|
f76f662aac | ||
|
|
12c6feb238 | ||
|
|
de50f365af | ||
|
|
14575cbb33 | ||
|
|
4530440bd6 | ||
|
|
fdbe251c3e | ||
|
|
f4d7cebd8a | ||
|
|
113a7a174e | ||
|
|
693b85d0b0 | ||
|
|
9dd6790b2d | ||
|
|
ca810d2da1 | ||
|
|
da9b3b2add | ||
|
|
5b4443f41f | ||
|
|
4e54061671 | ||
|
|
e594478f16 | ||
|
|
6f7903b9ce | ||
|
|
ff55cd42ba | ||
|
|
36b34a190b | ||
|
|
18c0827f5a | ||
|
|
d49d93b19d | ||
|
|
7ec58be72d | ||
|
|
9bc648f5b8 | ||
|
|
6be6b2626a | ||
|
|
1320479c39 | ||
|
|
84f5c26cd3 | ||
|
|
a2fa56c2ad | ||
|
|
49c967885c | ||
|
|
40a62ead01 | ||
|
|
6b7e887ae8 | ||
|
|
fb01e4f84f | ||
|
|
6d200ea43b | ||
|
|
8be74f75fd | ||
|
|
785ba26120 | ||
|
|
a461c9add7 | ||
|
|
9ab6ed0f11 | ||
|
|
e553c9c758 | ||
|
|
42eff40f48 | ||
|
|
87ae42f7fe | ||
|
|
c37a19036a | ||
|
|
7d72023ad7 | ||
|
|
c72eb9c40e | ||
|
|
fd089d78ac | ||
|
|
5b49e3ef7c | ||
|
|
4d97436d14 | ||
|
|
442f0deccb | ||
|
|
483a4d585f | ||
|
|
1bd2bf44bb | ||
|
|
62c927746b | ||
|
|
1cb5b85483 | ||
|
|
ea60eb2938 | ||
|
|
032b077bdc | ||
|
|
27b91ad6fa | ||
|
|
1971f36547 | ||
|
|
14cdb8bd31 | ||
|
|
a3a847aff6 | ||
|
|
9084c6fd1b | ||
|
|
a698ef19cb | ||
|
|
2cdfa358eb | ||
|
|
ef91ed6254 | ||
|
|
c9b5dc63af | ||
|
|
f437e49ed2 | ||
|
|
1c64d0b827 | ||
|
|
b48e60ea69 | ||
|
|
7330da14eb | ||
|
|
3823968e95 | ||
|
|
a69319b9e4 | ||
|
|
895ca677cf | ||
|
|
481f3f13b3 | ||
|
|
c55de2e7ea | ||
|
|
9aa6d8f180 | ||
|
|
29b9e8fdd0 | ||
|
|
b106b798eb | ||
|
|
f361599dc5 | ||
|
|
e31ced26f9 | ||
|
|
416d4a3a45 | ||
|
|
930ce7bf70 | ||
|
|
d6dc17553d | ||
|
|
d64fab95f4 | ||
|
|
61d0e5b401 | ||
|
|
dcf5c019b9 | ||
|
|
b8dcf71057 | ||
|
|
25068e9f2d | ||
|
|
eab6649474 | ||
|
|
16178ecbac | ||
|
|
3a1e6a51cf | ||
|
|
c39e347b28 | ||
|
|
657f31b6bc | ||
|
|
6c2d460aa9 | ||
|
|
eb0f04ebd7 | ||
|
|
cf5e4e466e | ||
|
|
a1677cab63 | ||
|
|
021c696120 | ||
|
|
d5cd5e490b | ||
|
|
18d4919386 | ||
|
|
485a294fb4 | ||
|
|
acfac42957 | ||
|
|
46dbf2e570 | ||
|
|
c151ca3679 | ||
|
|
aebf16936c | ||
|
|
e420628475 | ||
|
|
df940bc035 | ||
|
|
c13334c38a | ||
|
|
4248e915b3 | ||
|
|
6cafe6f9c5 | ||
|
|
b7563eebc8 | ||
|
|
8288b7d26a | ||
|
|
46f49f4686 | ||
|
|
ec189139b6 | ||
|
|
4385d32cf6 | ||
|
|
0d309a158e | ||
|
|
89c406d802 | ||
|
|
75b7b01706 | ||
|
|
b377e98dbe | ||
|
|
ecda9aac4e | ||
|
|
7e545b7b99 | ||
|
|
9dbc8bccf3 | ||
|
|
5cfc275876 | ||
|
|
f0dfc59828 | ||
|
|
f3cf8360c2 | ||
|
|
5e7ef3d27a | ||
|
|
dd4ab4ec0d | ||
|
|
fdbe0c4c37 | ||
|
|
8b3f831bbd | ||
|
|
8309afbbd8 | ||
|
|
22e22185b5 | ||
|
|
ad4772ce98 | ||
|
|
5d8088ce8c | ||
|
|
cbde0e30f7 | ||
|
|
6c9d7f54d8 | ||
|
|
54f23228f8 | ||
|
|
1c557e3f63 | ||
|
|
70172e2a98 | ||
|
|
310a39cd3a | ||
|
|
27fe4304b6 | ||
|
|
4d15f1eb10 | ||
|
|
6c75e81cb7 | ||
|
|
f86132fbb1 | ||
|
|
a0c331fbd4 | ||
|
|
7422040057 | ||
|
|
3bbdc89d6b | ||
|
|
04caf5b569 | ||
|
|
5721938ea2 | ||
|
|
04a0f81129 | ||
|
|
1e7632abe7 | ||
|
|
bd167224cb | ||
|
|
068ae16f50 | ||
|
|
3d74da20e0 | ||
|
|
9533b4b1ba | ||
|
|
86e53ab31d | ||
|
|
1731e68364 | ||
|
|
f53c7b82ef | ||
|
|
08225b7e1f | ||
|
|
ebf1802374 | ||
|
|
c848ad8063 | ||
|
|
9e3fdd0922 | ||
|
|
d0ed795da2 | ||
|
|
c471549e0d | ||
|
|
42fb9cd0aa | ||
|
|
e29c00477b | ||
|
|
b6b5254c80 | ||
|
|
4e14121dbd | ||
|
|
06c5fc7af5 | ||
|
|
e653f84891 | ||
|
|
f497a3a658 | ||
|
|
ac0baae856 | ||
|
|
7a042222db | ||
|
|
5ed957b628 | ||
|
|
0dda0201ba | ||
|
|
da27eaee98 | ||
|
|
104e966604 | ||
|
|
7a7896b3f1 | ||
|
|
3da57e5351 | ||
|
|
acf90b3d7d | ||
|
|
d3b220ab50 | ||
|
|
8086251ef5 | ||
|
|
a703350639 | ||
|
|
e030c693b4 | ||
|
|
19f308ee52 | ||
|
|
2dadcfe4e6 | ||
|
|
3aeeed7951 | ||
|
|
39dacc0b20 | ||
|
|
3a01fa9011 | ||
|
|
ffaf9e8aae | ||
|
|
4c65ce4df4 | ||
|
|
d4f1c04f07 | ||
|
|
c02b19f3eb | ||
|
|
86bbb552c5 | ||
|
|
a19b770b9f | ||
|
|
e2e2e34f74 | ||
|
|
d2a2f5d702 | ||
|
|
9d1ebec018 | ||
|
|
ae868f6525 | ||
|
|
99480dc8d3 | ||
|
|
81dbd135e2 | ||
|
|
6633182efe | ||
|
|
2129a8ad8b | ||
|
|
24d16e65d3 | ||
|
|
8f2ac6ed81 | ||
|
|
b18e9ce7ae | ||
|
|
30dad1ee7d | ||
|
|
cda8a68794 | ||
|
|
33831736a9 | ||
|
|
a0170b974d | ||
|
|
a009c8379a | ||
|
|
d66ff0ede0 | ||
|
|
ce1d5ccb5d | ||
|
|
361a857ccd | ||
|
|
a024aa6931 | ||
|
|
20408bb71f | ||
|
|
b16d4a8af9 | ||
|
|
8f3dc49a76 | ||
|
|
024efa9bcb | ||
|
|
a6122f481d | ||
|
|
f1b4729b63 | ||
|
|
aebe3d75d7 | ||
|
|
05959f7e24 | ||
|
|
8614b5a369 | ||
|
|
7be3016bfa | ||
|
|
72d6e63edc | ||
|
|
7dca4813ed | ||
|
|
ab11967a8e | ||
|
|
189186c988 | ||
|
|
d1f6348ef3 | ||
|
|
328cff225d | ||
|
|
fe682e7a2b | ||
|
|
0631d8ea2e | ||
|
|
e995c30eea | ||
|
|
8d4fa0c81d | ||
|
|
3808155201 | ||
|
|
529e0ddccf | ||
|
|
106535fc01 | ||
|
|
f053a06231 | ||
|
|
00d90dc8b7 | ||
|
|
999f6190dc | ||
|
|
b4d4c3d46b | ||
|
|
a63bc61f4a | ||
|
|
d66760f9c2 | ||
|
|
76dfe48114 | ||
|
|
23fae77443 | ||
|
|
0e31e19472 | ||
|
|
8e09ea8efc | ||
|
|
0bd31e965d | ||
|
|
34e50b6406 | ||
|
|
fb97afe39a | ||
|
|
8ad3292630 | ||
|
|
812e085795 | ||
|
|
d0cafeea6d | ||
|
|
4a88944b9c | ||
|
|
f3570acc61 | ||
|
|
e210352339 | ||
|
|
da6bbc2a40 | ||
|
|
cada8f6972 | ||
|
|
663cb21eb2 | ||
|
|
8cd4546f9d | ||
|
|
4030225304 | ||
|
|
5b266397ee | ||
|
|
b5bfc24916 | ||
|
|
3e9090c6a4 | ||
|
|
2147a1dea8 | ||
|
|
a8f83afbf8 | ||
|
|
c16559ea1e | ||
|
|
7c6a898bf0 | ||
|
|
84689f602b | ||
|
|
e8d89279d6 | ||
|
|
789a5673e3 | ||
|
|
cef67555bf | ||
|
|
b30ce1c9a2 | ||
|
|
8615e4cb34 | ||
|
|
f2d0a09dc8 | ||
|
|
7a04aba3f9 | ||
|
|
bc2e68207f | ||
|
|
fd9260cc74 | ||
|
|
6f0fbde825 | ||
|
|
c8f6b546cb | ||
|
|
341643a87e | ||
|
|
452952670b | ||
|
|
54bcd5979a | ||
|
|
0770065a43 | ||
|
|
0b040a2192 | ||
|
|
cc748e1c99 | ||
|
|
97b1cc0f8d | ||
|
|
8aa991ae07 | ||
|
|
5a43d51436 | ||
|
|
590dfcc348 | ||
|
|
e2e347bd14 | ||
|
|
4e8a30948d | ||
|
|
d61ad0c909 | ||
|
|
87a038b0ed | ||
|
|
ebf652932a | ||
|
|
8bd754064e | ||
|
|
8bce4caa97 | ||
|
|
acd7915be4 | ||
|
|
5f6e420460 | ||
|
|
d8b1251dd8 | ||
|
|
495cea8064 | ||
|
|
89390fa3ff | ||
|
|
a887fb8adf | ||
|
|
ecd6a00c35 | ||
|
|
e75b6b8459 | ||
|
|
bc296e0cb9 | ||
|
|
c87cff02f7 | ||
|
|
413219ac7a | ||
|
|
b6189a2eda | ||
|
|
9c4423b8bc | ||
|
|
0ac5a99433 | ||
|
|
1b95c37826 | ||
|
|
cec0cf34e4 | ||
|
|
152defa377 | ||
|
|
499a57880f | ||
|
|
0dbf18c751 | ||
|
|
6a91ea51c9 | ||
|
|
421c7ee0a5 | ||
|
|
e08c522066 | ||
|
|
2d71a56011 | ||
|
|
50ab3b2edd | ||
|
|
230ce1822f | ||
|
|
df8ef12198 | ||
|
|
edfe9b2c2b | ||
|
|
448e057ae8 | ||
|
|
b042f60e41 | ||
|
|
08a91c64db | ||
|
|
f17509d6d7 | ||
|
|
021f60b7d7 | ||
|
|
6039674de8 | ||
|
|
a4476570bd | ||
|
|
7df0f128a3 | ||
|
|
74e78c8e59 | ||
|
|
36f401b165 | ||
|
|
892cae075f | ||
|
|
30f19c6431 | ||
|
|
c67611f204 | ||
|
|
0bed36e832 | ||
|
|
e45ebaa025 | ||
|
|
fcef2eb44b | ||
|
|
8ce27cbc55 | ||
|
|
d121bb6a73 | ||
|
|
e709e1e74f | ||
|
|
a10971e126 | ||
|
|
04c47c0387 | ||
|
|
6a9ce60c47 | ||
|
|
93efa0608a | ||
|
|
7c8a9a28d7 | ||
|
|
47f0099020 | ||
|
|
1fb3f7cb5e | ||
|
|
bf784f05ea | ||
|
|
8539bd5d75 | ||
|
|
ff8665fbc4 | ||
|
|
eee3818332 | ||
|
|
6be2744b49 | ||
|
|
46b9e57ed1 | ||
|
|
d62b0bafac | ||
|
|
bfef93c8a8 | ||
|
|
e7d30c38cd | ||
|
|
780b520878 | ||
|
|
c9f8b5939c | ||
|
|
2114486851 | ||
|
|
59061827f1 | ||
|
|
180e43924a | ||
|
|
c3674e7e5a | ||
|
|
1218923012 | ||
|
|
0f7842c5c2 | ||
|
|
b49521cf3a | ||
|
|
8a7e27b58f | ||
|
|
9493853fe4 | ||
|
|
f8e91898af | ||
|
|
7036ed9bc8 | ||
|
|
68bdd92126 | ||
|
|
5bac0e1183 | ||
|
|
d23eb73948 | ||
|
|
403dfeb725 | ||
|
|
be1b24568a | ||
|
|
38a6ace8d2 | ||
|
|
a1c7972f9d | ||
|
|
0222a26313 | ||
|
|
8564a6881e | ||
|
|
580fbf1366 | ||
|
|
567923139d | ||
|
|
3d7d4655f5 | ||
|
|
b9afe898b3 | ||
|
|
4234539e65 | ||
|
|
4214ccd49c | ||
|
|
dd0c6cf1ef | ||
|
|
8e293e0d9b | ||
| 01bb09da30 | |||
|
|
1e5085f4cc | ||
|
|
467a5d789b | ||
|
|
4c080b7b19 | ||
|
|
31e79f88a3 | ||
|
|
bc26d3af46 | ||
|
|
81dee66f6c | ||
|
|
0cc8626866 | ||
|
|
7652208a74 | ||
|
|
1344fa92fe | ||
|
|
11e3bc06f0 | ||
| b2fde1c419 | |||
| 0c65313b35 | |||
|
|
28856c980c | ||
|
|
249917b3d9 | ||
|
|
cea33b109f | ||
|
|
6302d125e8 | ||
|
|
0a0913d922 | ||
|
|
7aaf9cd6be | ||
|
|
093d46ee4e | ||
|
|
d433c503e4 | ||
|
|
841c67b51d | ||
|
|
993db9585e | ||
|
|
870d2b27bc | ||
|
|
d111a4b95c | ||
|
|
708a2193b0 | ||
|
|
670ceae73c | ||
|
|
a17182c918 | ||
|
|
f9e2fa0222 | ||
|
|
bb07c913aa | ||
|
|
7e5b68818f | ||
|
|
695b30855e | ||
|
|
29db1a13cc | ||
|
|
e977b079a8 | ||
|
|
ea04b618cd | ||
|
|
6c237e8f2f | ||
|
|
5f355e47f1 | ||
|
|
addb18b2ef | ||
|
|
4846762d37 | ||
|
|
dff66dca3e | ||
|
|
89a7eb3441 | ||
|
|
609b6edbba | ||
|
|
be3eca952d | ||
|
|
8fbf846ff9 | ||
|
|
ddee2e82b3 | ||
|
|
8d52238a6f | ||
|
|
ea5850fb70 | ||
|
|
6a58457c36 | ||
|
|
47596137ec | ||
|
|
124b588a66 | ||
|
|
4670ffee85 | ||
|
|
6a5078dbb7 | ||
|
|
2c89032a7e | ||
|
|
bf508e8cb8 | ||
|
|
d000c5f394 | ||
|
|
c2badb66e2 | ||
|
|
8d3a4ad6c2 | ||
|
|
081effb3b3 | ||
|
|
12331f8970 | ||
|
|
4333cfa0ab | ||
|
|
93b364f049 | ||
|
|
27f208561e | ||
|
|
37893bb106 | ||
|
|
6a79f09476 | ||
|
|
377e1b8f93 | ||
|
|
561d24bade | ||
|
|
23b1b47a7d | ||
|
|
fba1d515b2 | ||
|
|
35ad7b031d | ||
|
|
5f67f637d3 | ||
|
|
ff75533025 | ||
|
|
6ddadfe53c | ||
|
|
182015e843 | ||
|
|
3f97c9e17e | ||
|
|
5320115e13 | ||
|
|
f1f3e6fe5a | ||
|
|
7e5c3c78e6 | ||
|
|
0da7a3e74a | ||
|
|
996c5ab75a | ||
|
|
b1d8a3c1ca | ||
|
|
9c4d0868cf | ||
|
|
2f30da9156 | ||
|
|
e61cc019e8 | ||
|
|
0bed825f70 | ||
|
|
ffeb1b182d | ||
|
|
a6141078e0 | ||
|
|
c68babb4d0 | ||
|
|
77159304aa | ||
|
|
bddfa88823 | ||
|
|
5b41cd85e0 | ||
|
|
deb90a8574 | ||
|
|
a8547275bd | ||
|
|
a10ec22c99 | ||
|
|
be61bf2166 | ||
|
|
d5f31cbe97 | ||
|
|
470cb4d398 | ||
|
|
982612a1e7 | ||
|
|
3d84a3afe7 | ||
|
|
2c49e28a58 | ||
|
|
d5d7314af5 | ||
|
|
05453ed16d | ||
|
|
51185a43ee | ||
|
|
e45f6ee040 | ||
|
|
e3297fead4 | ||
|
|
543df34425 | ||
|
|
76ccc36824 | ||
|
|
d0965fddfe | ||
|
|
d4d662a201 | ||
|
|
40e2d71db4 | ||
|
|
cd2f56db4f | ||
|
|
443ec1b082 | ||
|
|
46c6bc67ec | ||
|
|
18af0281b1 | ||
|
|
b947d4236d | ||
|
|
1abd4c49b0 | ||
|
|
a7072daf4a | ||
|
|
22f3a52a14 | ||
|
|
cfcbef14c5 | ||
|
|
2193c950d9 | ||
|
|
5eeef42174 | ||
|
|
34e23beaeb | ||
|
|
e419339c10 | ||
|
|
ba6e3a0c95 | ||
|
|
a6401b44b2 | ||
|
|
81e3a86776 | ||
|
|
feb76e4d63 | ||
|
|
28ec0d0ef9 | ||
|
|
15fa0bfd38 | ||
|
|
ce36a373eb | ||
|
|
38bc07f0fd | ||
|
|
9793ac502f | ||
|
|
00ee02ccb9 | ||
|
|
4cd0fa249c | ||
|
|
66c4ed2b79 | ||
|
|
eda173a5a7 | ||
|
|
e7006873ca | ||
|
|
1d0f10ddca | ||
|
|
c81e461cb5 | ||
|
|
a1f9f71d31 | ||
|
|
79eb498a83 | ||
|
|
fb89cb1a8d | ||
|
|
90fa4f53f8 | ||
|
|
ba22e5f039 | ||
|
|
894f3b7952 | ||
|
|
5aff9d6bc2 | ||
|
|
565d053224 | ||
|
|
ee7f70734b | ||
|
|
7d3169b077 | ||
|
|
fd33eb238d | ||
|
|
22494d28d3 | ||
|
|
e95986c93a | ||
|
|
a63e704b1e | ||
|
|
5aa5438dd6 | ||
|
|
7cc92ee011 | ||
|
|
642276cbdc | ||
|
|
039cfb5673 | ||
|
|
a176ee54fa | ||
|
|
825c7210e2 | ||
|
|
14abc276c3 | ||
|
|
a6b5c47251 | ||
|
|
26ad1124bf | ||
|
|
b576a61551 | ||
|
|
275461a474 | ||
|
|
d9e4901336 | ||
|
|
66ad57066a | ||
|
|
af3ad4ff63 | ||
|
|
7850eb9bb9 | ||
|
|
feaa79e1b1 | ||
|
|
904d6f8c49 | ||
|
|
b6f0b27b9b | ||
|
|
9ca7094ee4 | ||
|
|
c6487873b8 | ||
|
|
a6e46660cc | ||
|
|
31f41cbff5 | ||
|
|
725c68ad18 | ||
|
|
2d62200297 | ||
|
|
29495c0ee3 | ||
|
|
554db4fe72 | ||
|
|
39707d88d5 | ||
|
|
c42f6006b8 | ||
|
|
b69b0e878a | ||
|
|
a37da5cfd0 | ||
|
|
83210f5501 | ||
|
|
81a7a77f2c | ||
|
|
17463ed691 | ||
|
|
793c384d58 | ||
|
|
5595f0295d | ||
|
|
8a478fa108 | ||
|
|
f14212d1a3 | ||
|
|
44e142d935 | ||
|
|
36a795c585 | ||
|
|
d2aa32ee18 | ||
|
|
890d263017 | ||
|
|
4ff8f5c9e1 | ||
|
|
377c48d4a0 | ||
|
|
c29791c904 | ||
|
|
489c36ac00 | ||
|
|
fef2f1d781 | ||
|
|
e3d316d374 | ||
|
|
f7fc731773 | ||
|
|
94a6972bda | ||
|
|
838f61b16e | ||
|
|
1a9be3bc1a | ||
|
|
36a1e17314 | ||
|
|
aa29336164 | ||
|
|
e19b9bcc4a | ||
|
|
8fe8b65535 | ||
|
|
3277618a05 | ||
|
|
2833cd589a | ||
|
|
02e4b80ba1 | ||
|
|
5e9f44e5c4 | ||
|
|
8a830a53d9 | ||
|
|
30a77df14e | ||
|
|
d707dea56b | ||
|
|
3aa20736a5 | ||
|
|
c61941e6ba | ||
|
|
8b2c78636e | ||
|
|
36a4e6a533 | ||
|
|
7f5cb892af | ||
|
|
e03f33a334 | ||
|
|
8379a5be40 | ||
|
|
79539038b7 | ||
|
|
7083bf34a6 | ||
|
|
992cf9a870 | ||
|
|
4db8bb7001 | ||
|
|
bab8ba857e | ||
|
|
8f89d2355f | ||
|
|
5848c05c9c | ||
|
|
07fbf08f78 | ||
|
|
4185ce15ae | ||
|
|
2235f5411c | ||
|
|
f47f9ad336 | ||
|
|
dc91f5b104 | ||
|
|
372d69ea85 | ||
|
|
b7647d87bc | ||
|
|
4d3f12785c | ||
|
|
fde725abb2 | ||
|
|
0e09eea6cf | ||
|
|
a6bad0cba2 | ||
|
|
a271861fb1 | ||
|
|
be0e713f5b | ||
|
|
3b5d99072a | ||
|
|
ae15375d55 | ||
|
|
d9082683cc | ||
|
|
4b31a9bbbc | ||
|
|
741460d55b | ||
|
|
9ca1f09fc5 | ||
|
|
e270cb25ee | ||
|
|
c8429cac20 | ||
|
|
7e51b443c2 | ||
|
|
09f9256f06 | ||
|
|
7f33c522ea | ||
|
|
da8c1bdaf2 | ||
|
|
0f122aad76 | ||
|
|
7c19380b22 | ||
|
|
599c04ab62 | ||
|
|
0bafb6ad26 | ||
|
|
dd764c99ff | ||
|
|
97fd249134 | ||
|
|
4a434b4009 | ||
|
|
cc3af06617 | ||
|
|
01c48a1cd6 | ||
|
|
f42b272636 | ||
|
|
bebb4bbf04 | ||
|
|
e8ff014598 | ||
|
|
240b1537da | ||
|
|
c561494d7b | ||
|
|
a4ce4af297 | ||
|
|
4d3c2ec149 | ||
|
|
3279bdb348 | ||
|
|
2d6094153e | ||
|
|
fed26bc925 | ||
|
|
5f715dedb2 | ||
|
|
0028854ea5 | ||
|
|
632ae0c86c | ||
|
|
fc017fcc5a | ||
|
|
8138515a4c | ||
|
|
c2a4261ac4 | ||
|
|
c17bdd2b2f | ||
|
|
66ec58a21e | ||
|
|
5f320d5a3b | ||
|
|
553b49eb13 | ||
|
|
d3c4d69781 | ||
|
|
9b4b16fc57 | ||
|
|
c91826f741 | ||
|
|
69e419d9cf | ||
|
|
e20a06fa4f | ||
|
|
a9ad0a47ae | ||
|
|
370f0093ff | ||
|
|
35ee47189f | ||
|
|
0314be9515 | ||
|
|
883ec09a0e | ||
|
|
d12c7b2c5e | ||
|
|
02a4b50fc0 | ||
|
|
5030e55f84 | ||
|
|
5e27020f77 | ||
|
|
dc13def187 | ||
|
|
4e9be55405 | ||
|
|
127c018d83 | ||
|
|
3835a9a470 | ||
|
|
28f52973f3 | ||
|
|
7a936f8a9f | ||
|
|
6b55a574d8 | ||
|
|
1182f5b3af | ||
|
|
6858e8eca6 | ||
|
|
fe3e06e654 | ||
|
|
78e9e20a5d | ||
|
|
394975f4d5 | ||
|
|
57107ae4ad | ||
|
|
b4ae677932 | ||
|
|
4ab84b7766 | ||
|
|
7f4607c3ba | ||
|
|
823e382748 | ||
|
|
b1ae10b570 | ||
|
|
82baab5401 | ||
| 8bf6c57668 | |||
|
|
5e4bd93238 | ||
|
|
5f4aa6034f | ||
|
|
101d67ad48 | ||
|
|
7d2fded062 | ||
|
|
a79a165d60 | ||
|
|
ddd4bfc033 | ||
|
|
ae1edfe384 | ||
|
|
44ffb4f607 | ||
|
|
060900ebc7 | ||
|
|
8673ab0197 | ||
|
|
bc30cc3e03 | ||
|
|
0de2f5ecf4 | ||
|
|
ee933c3460 | ||
|
|
243def0a2f | ||
|
|
991310f9b8 | ||
|
|
30b9a137c2 | ||
|
|
2320fcd462 | ||
|
|
288e652f93 | ||
|
|
9b845a04bf | ||
| 2362f194cf | |||
|
|
2bf45e799f | ||
|
|
d28e02d004 | ||
|
|
c7e7ab69ea | ||
|
|
fe1639c89d | ||
| d1219caea7 | |||
| bdbff3c9bd | |||
|
|
68a7c57e0b | ||
| e968059ecd | |||
|
|
c5f9f3f3b0 | ||
|
|
cc96fa6d65 | ||
|
|
4ac0d0b7d8 | ||
|
|
b4a5343ce6 | ||
|
|
a07cd5f295 | ||
|
|
e73c339a99 | ||
|
|
92b94b2289 | ||
|
|
d7c406b0e9 | ||
|
|
6f8b6a01a1 | ||
|
|
9e4bcaa6a4 | ||
|
|
df45607495 | ||
|
|
99fab7d22b | ||
|
|
c3d404dcbf | ||
|
|
9fc84a5ebf | ||
|
|
ffc48ff3fa | ||
|
|
dea5786a85 | ||
|
|
851e7a1bbb | ||
|
|
6542952597 | ||
|
|
c9cc263d52 | ||
|
|
2f54bd3054 | ||
|
|
34dd1da3f5 | ||
|
|
0cd43bc229 | ||
|
|
ce5e2a3330 | ||
|
|
5ca7516c5e | ||
|
|
d2961c2760 | ||
|
|
262897223b | ||
|
|
33034b6db2 | ||
|
|
bb192c6e68 | ||
|
|
654cc3e644 | ||
|
|
dc607c2c91 | ||
|
|
ec06d22c00 | ||
|
|
74f7f7a340 | ||
|
|
9bf9905bf7 | ||
|
|
31d7c5b75d | ||
|
|
874851f6ee | ||
|
|
eb8862ad1f | ||
|
|
ecd5c5c4bd | ||
|
|
43565daed4 | ||
|
|
50631a3e36 | ||
|
|
b2b85d4f2d | ||
|
|
e7d1bd2af0 | ||
|
|
35498105ec | ||
|
|
13e503cc55 | ||
|
|
29dba7eab7 | ||
|
|
d39f1d793b | ||
|
|
120e10d348 | ||
|
|
8e7a8488b3 | ||
|
|
8252fca39f | ||
|
|
32a02f04bd | ||
|
|
b20b9bd30c | ||
|
|
c48d86ee42 | ||
|
|
33107d6a6e | ||
|
|
9ce1c89d90 | ||
|
|
a4311f7acd | ||
|
|
48cbeefa39 | ||
|
|
97520a33ea | ||
|
|
265ec48919 | ||
|
|
c56e8127d7 | ||
|
|
8031358f60 | ||
|
|
10cea217bf | ||
|
|
4466f66584 | ||
|
|
2e9cd1c5a9 | ||
|
|
4b560896f6 | ||
|
|
6055ddb90f | ||
|
|
85ae4d8036 | ||
|
|
9383a41500 | ||
|
|
f016cd338c | ||
|
|
3af39ca6a9 | ||
|
|
5089b071dd | ||
|
|
07ce838056 | ||
|
|
7e00aa30a9 | ||
|
|
8fa66aeed5 | ||
|
|
791c3a72fd | ||
|
|
b09d4980c2 | ||
|
|
37d61417ad | ||
|
|
5f691befb0 | ||
|
|
33babd6b2f | ||
|
|
4e5c201cd2 | ||
|
|
309b1cdffa | ||
|
|
8bd0f97911 | ||
|
|
c4caac27f7 | ||
|
|
caa7c809ab | ||
|
|
fc40512a8e | ||
|
|
73980d8dde | ||
|
|
5f46e2f3d0 | ||
|
|
965a3552c8 | ||
|
|
d13d61a17d | ||
|
|
7f5fcdadb6 | ||
|
|
6021b64cd7 | ||
|
|
dfbc0ee705 | ||
|
|
b71845155e | ||
|
|
ad01c3f8f7 | ||
|
|
37dfaf7a6d | ||
|
|
c9ab9f853d | ||
|
|
062eb8eb5f | ||
|
|
7fb28c7fd4 | ||
|
|
e79d98d623 | ||
|
|
cb2d64f92a | ||
|
|
48dc4a3d33 | ||
|
|
f1534ffc71 | ||
|
|
7edeb5124e | ||
|
|
7b085f916b | ||
|
|
7aef39843a | ||
|
|
4098093a1c | ||
|
|
3f87bffd17 | ||
|
|
14cd66cf13 | ||
|
|
5acb635f6b | ||
|
|
7d111f90e4 | ||
|
|
cbc57959e3 | ||
|
|
c56e28081a | ||
|
|
5237a6edbb | ||
|
|
4f5963697b | ||
|
|
eae8459ca5 | ||
|
|
3efb7f43d2 | ||
|
|
ee8dda577b | ||
|
|
87e7fa45ce | ||
|
|
d6cdc715b5 | ||
|
|
d04559427e | ||
|
|
d11670366d | ||
|
|
3e393880b1 | ||
|
|
9c9146ca8c | ||
|
|
22174f431d | ||
|
|
ea5e35d8b4 | ||
|
|
e0b7c76b9a | ||
|
|
3284aaca02 | ||
|
|
c9db239b23 | ||
|
|
8806c1357f | ||
|
|
dbe55db84d | ||
|
|
9dbe2fde3f | ||
|
|
e7301e6cb9 | ||
|
|
a86f37ecfc | ||
|
|
531ab674f3 | ||
|
|
31cbb5d2bf | ||
|
|
96acf75571 | ||
|
|
f09c27abb2 | ||
|
|
ccea7494e6 | ||
|
|
856b27fd33 | ||
|
|
19b2ec07d9 | ||
|
|
19fde2b445 | ||
|
|
8c3c5f8876 | ||
|
|
042139091a | ||
|
|
1a318d4d2a | ||
|
|
225b2eb035 | ||
|
|
a477039f7c | ||
|
|
1b63596355 | ||
|
|
69f4fe5f36 | ||
|
|
056730c338 | ||
|
|
cb549dd492 | ||
|
|
0f8859cf3c | ||
|
|
1d4e69460a | ||
|
|
bdf6459fd6 | ||
|
|
6e5657e446 | ||
|
|
1f41eb6acc | ||
|
|
9e80281542 | ||
|
|
26d1fbf8be | ||
|
|
75e646832b | ||
|
|
a12ea7d641 | ||
|
|
aeb4fcd452 | ||
|
|
a62913ee6c | ||
|
|
b1a8a70bdd | ||
|
|
549ef25edf | ||
|
|
fd70858523 | ||
|
|
850dd34da9 | ||
|
|
ee67948bc0 | ||
|
|
7561f7af27 | ||
|
|
6813e9d75b | ||
|
|
ef51d99f66 | ||
|
|
b482e6d691 | ||
|
|
91cbb0928b | ||
|
|
1e9ac9d65a | ||
|
|
2757dcf19c | ||
|
|
f895172405 | ||
|
|
a9351c58d3 | ||
|
|
0d5ae1bf0c | ||
|
|
84605fd1e7 | ||
|
|
9209ac9fae | ||
|
|
e78cdbe81d | ||
|
|
f178667db8 | ||
|
|
fb0354221d | ||
|
|
bda2b10c7f | ||
|
|
719a45a4c2 | ||
|
|
69eead6c28 | ||
|
|
40a2cb39b8 | ||
|
|
657dcea2a1 | ||
|
|
5d6d98abc2 | ||
|
|
0d3d163aec | ||
|
|
a83b4746f9 | ||
|
|
458b41b5f6 | ||
|
|
3c04ca7c5a | ||
|
|
81d437399c | ||
|
|
cc3fc6a8bd | ||
|
|
bd41857962 | ||
|
|
ff4f83959a | ||
|
|
46d5a004d4 | ||
|
|
3f49a771c5 | ||
|
|
9fddbc5e6a | ||
|
|
d3036b3b89 | ||
|
|
1e59444e0e | ||
|
|
1fa3081b08 | ||
|
|
ec1860cece | ||
|
|
cc1dc9173d | ||
|
|
025eb8e865 | ||
|
|
3e5acf655e | ||
|
|
bf31cb10da | ||
|
|
ffcf343915 | ||
|
|
86e99e0c74 | ||
|
|
f0e20994a2 | ||
|
|
9739073178 | ||
|
|
07f27ac44c | ||
|
|
281acb69be | ||
|
|
6bf1d00455 | ||
|
|
290bb93b49 | ||
|
|
f7bf8f8f35 | ||
|
|
d93ae197e3 | ||
|
|
2dee5e3b37 | ||
|
|
5d95afe99d | ||
|
|
9bb702549e | ||
|
|
5360102236 | ||
|
|
e6cebd42b3 | ||
|
|
6f41acf447 | ||
|
|
c7c8f1d72e | ||
|
|
8f8e8afa83 | ||
|
|
6fae11838c | ||
|
|
6577e406a4 | ||
|
|
53aeb4c43a | ||
|
|
8c85768a4d | ||
|
|
f7de5fc391 | ||
|
|
c0d80e528e | ||
|
|
361012c80e | ||
|
|
8832a8365c | ||
|
|
fa2e1968bb | ||
|
|
91ac09a2e3 | ||
|
|
f1b35354dc | ||
|
|
34694492b9 | ||
|
|
b1b35b05cf | ||
|
|
1c8d53cec5 | ||
|
|
8efb289cc4 | ||
|
|
b2ddce303f | ||
|
|
ade9638c13 | ||
|
|
c762999f67 | ||
|
|
026fd37a22 | ||
|
|
7691c392e4 | ||
|
|
32f8cbf995 | ||
|
|
2894dac5d8 | ||
|
|
99f086a75a | ||
|
|
6eac863f34 | ||
|
|
e917c16c2c | ||
|
|
bb3015f626 | ||
|
|
a9e63cca54 | ||
|
|
f753f534a4 | ||
|
|
046715d4b6 | ||
|
|
cfb0177a45 | ||
|
|
12b3a48baa | ||
|
|
e710fc4604 | ||
|
|
edc371ed30 | ||
|
|
54f1356756 | ||
|
|
e02fcd6a08 | ||
|
|
2ac19ef81f | ||
|
|
10d9d5ee65 | ||
|
|
c8fd7fa5f2 | ||
|
|
f9f2812344 | ||
|
|
f9411b7278 | ||
|
|
2f01516cff | ||
|
|
1940a24a05 | ||
|
|
0a9ce48880 | ||
|
|
3bec4fc26d | ||
|
|
d9499cae4a | ||
|
|
a2207a781f | ||
|
|
c3d761d05f | ||
|
|
4fd7e4ee2a | ||
|
|
9f9eb7d23a | ||
|
|
ab3604d613 | ||
|
|
f210317222 | ||
|
|
5a56b3be3f | ||
|
|
7c1aedd461 | ||
|
|
2a7dec2811 | ||
|
|
0530e553eb | ||
|
|
2b33f221d6 | ||
|
|
6c1167a98a | ||
|
|
464a12ad1e | ||
|
|
f431ddb5f8 | ||
|
|
1295278175 | ||
|
|
fe87373cfb | ||
|
|
30078c1755 | ||
|
|
c11b74d689 | ||
|
|
ac5400fb6c | ||
|
|
919612648a | ||
|
|
c78b43c01c | ||
|
|
bfd0b7767b | ||
|
|
0067f9ecbc | ||
|
|
3ede04c0c3 | ||
|
|
36f979a67a | ||
|
|
2f42c353e4 | ||
|
|
28d958ecc9 | ||
|
|
880a144cc1 | ||
|
|
7857bfab40 | ||
|
|
0303017f2b | ||
|
|
ab4692b655 | ||
|
|
b26eb2e1dc | ||
|
|
88e9c450b5 | ||
|
|
08c8fe0366 | ||
|
|
0284997d6a | ||
|
|
b03ba3b988 | ||
|
|
298bae5301 | ||
|
|
39a4916939 | ||
|
|
77bd0c256f | ||
|
|
3ba14427a5 | ||
|
|
ac869994a7 | ||
|
|
3f30a1cbd1 | ||
|
|
2421df4995 | ||
|
|
71261b4a82 | ||
|
|
9df5e447eb | ||
|
|
9b25a8fa0e | ||
|
|
e898b55fa3 | ||
|
|
f740372e71 | ||
|
|
8f73ddb063 | ||
|
|
90fed1bae2 | ||
|
|
4d5b7f3664 | ||
|
|
cb7493c6c9 | ||
|
|
9c69aab95c | ||
|
|
c228aaa7af | ||
|
|
a8d4dede1d | ||
|
|
b07607a932 | ||
|
|
962ea61fa5 | ||
|
|
57e8a411c2 | ||
|
|
2a48e816f4 | ||
|
|
97611a8dc8 | ||
|
|
ce113372e8 | ||
|
|
f204f3fff3 | ||
|
|
aa9a3a92f1 | ||
|
|
edddb02dfe | ||
|
|
407c1a8db0 | ||
|
|
7d265446c4 | ||
|
|
575606766f | ||
|
|
4a0f4535d0 | ||
|
|
06e75084bb | ||
|
|
89a22c82c9 | ||
|
|
1bbb14bf5d | ||
|
|
b082164ff6 | ||
|
|
2a0b67be09 | ||
|
|
e437812fd5 | ||
|
|
fb0291ff99 | ||
|
|
fd90a48b9c | ||
|
|
ba1fdf332b | ||
|
|
c1ca2fa181 | ||
|
|
8549f68fbd | ||
|
|
b597eb5916 | ||
|
|
646902cc53 | ||
|
|
48535c313e | ||
|
|
368a490502 | ||
|
|
8f5cf47c75 | ||
|
|
3a4dabae4e | ||
|
|
e608ab6204 | ||
|
|
45b4c5ad24 | ||
|
|
a2d506a56d | ||
|
|
d97f650fb5 | ||
|
|
4c6142d0b6 | ||
|
|
5ed1532762 | ||
|
|
368ec56181 | ||
|
|
65455afb58 | ||
|
|
21d32a888d | ||
|
|
8da835bd0b | ||
|
|
843a5b83c5 | ||
|
|
a8347e622d | ||
|
|
ef3c99e086 | ||
|
|
0acae3b222 | ||
|
|
73442de46c | ||
|
|
8a73e9cb2c | ||
|
|
b13b8a0ded | ||
|
|
9c05b0d79c | ||
|
|
5dfa42880e | ||
|
|
9af93d42f7 | ||
|
|
58def567cd | ||
|
|
b944c0f25f | ||
|
|
5e2fcdea28 | ||
|
|
adee39f37f | ||
|
|
d00b876181 | ||
|
|
039d65c94d | ||
|
|
39849cea5a | ||
|
|
2e13f43057 | ||
|
|
aff79a6d5f | ||
|
|
f90c7c2c6f | ||
|
|
7c49db0a33 | ||
|
|
5992e78365 | ||
|
|
71e7bb68ab | ||
|
|
ff684ffe83 | ||
|
|
854fb197bb | ||
|
|
6716deb004 | ||
|
|
b631420500 | ||
|
|
43527038aa | ||
|
|
419469b52d | ||
|
|
b206dfa77f | ||
|
|
7ef87ef44f | ||
|
|
45432afb6f | ||
|
|
4daab388ab | ||
|
|
a50e13a8df | ||
|
|
dd662e8d22 | ||
|
|
ece325a45e | ||
|
|
f7de989f59 | ||
|
|
3be7075a08 | ||
|
|
2ca0518c98 | ||
|
|
60a8791e92 | ||
|
|
1f9295f1a7 | ||
|
|
769d69b8be | ||
|
|
6e12c5d4ce | ||
|
|
fcda3b5e8e | ||
|
|
d4692f883d | ||
|
|
a08f2525ee | ||
|
|
5ad966a025 | ||
|
|
b2f9169f9f | ||
|
|
54d4ebcd4d | ||
|
|
c661413585 | ||
|
|
87739cf75e | ||
|
|
3ef31d3631 | ||
|
|
398e0890ba | ||
|
|
b70bff5807 | ||
|
|
15f5d59794 | ||
|
|
25edd8b7df | ||
|
|
34ca42cfa3 | ||
|
|
efd31eaaa5 | ||
|
|
de4eccb8c8 | ||
|
|
7368889731 | ||
|
|
1c38847eff | ||
|
|
e68efdd6fe | ||
|
|
e0a0cea985 | ||
|
|
6d5eeb2174 | ||
|
|
4700c71a44 | ||
|
|
552c91eb23 | ||
|
|
cf582b359a | ||
|
|
1ec38cb03d | ||
|
|
05129aa200 | ||
|
|
57abf72ecd | ||
|
|
b0051271da | ||
|
|
f46198b63f | ||
|
|
d5246f6863 | ||
|
|
eff73b831b | ||
|
|
a804b82b06 | ||
|
|
e16c1d6c85 | ||
|
|
0fc014b17b | ||
|
|
05aad4b68e | ||
|
|
653e441f55 | ||
|
|
cf80182740 | ||
|
|
0c2ac4808a | ||
|
|
ebce8b7025 | ||
|
|
fc1e0812f5 | ||
|
|
81f3a4b35d | ||
|
|
3f1084a542 | ||
|
|
6f129181f3 | ||
|
|
f6ab2c9306 | ||
|
|
aed4f4bdc7 | ||
|
|
7a30018e52 | ||
|
|
95eb08e8c1 | ||
|
|
52d7c20639 | ||
|
|
9ea39b1386 | ||
|
|
3f713a8d15 | ||
|
|
6e98d28b88 | ||
|
|
36f4283374 | ||
|
|
a9ae034fcd | ||
|
|
ec379e6b72 | ||
|
|
cae010c2fc | ||
|
|
1b9c231a08 | ||
|
|
8883aaceb1 | ||
|
|
85caf086b7 | ||
|
|
db431af916 | ||
|
|
022a15cc9d | ||
|
|
6dfb287c9f | ||
|
|
afeb2ffbec | ||
|
|
1d6f9d4928 | ||
|
|
7b11e728ff | ||
|
|
5ed578faa0 | ||
|
|
2e2c38848a | ||
|
|
faffbaeafe | ||
|
|
617ef4b9c9 | ||
|
|
efc537a45b | ||
|
|
9cf8ffc5c1 | ||
|
|
1ae777d0d5 | ||
|
|
dd33829b39 | ||
|
|
e2acdacf1f | ||
|
|
db077cb9d5 | ||
|
|
8edddb8cda | ||
|
|
f68fef4012 | ||
|
|
5a287a627a | ||
|
|
0aa51096a3 | ||
|
|
37c6f38354 | ||
|
|
a863c70ea4 | ||
|
|
68b8c4f43d | ||
|
|
9f8f035b83 | ||
|
|
71bebd8048 | ||
|
|
4a75301322 | ||
|
|
ec24628e02 | ||
|
|
7f51812208 | ||
|
|
9f5b6e10a3 | ||
|
|
7e918cbf4a | ||
|
|
422b809a08 | ||
|
|
d34a69d143 | ||
|
|
3383deabd2 | ||
|
|
e8b49517e2 | ||
|
|
6c99807d85 | ||
|
|
b1d31708da | ||
|
|
6c44cf5a65 | ||
|
|
06f02e3435 | ||
|
|
564a4e57d8 | ||
|
|
dd8e0b8f5f | ||
|
|
f50166c297 | ||
|
|
aea4f4e5c0 | ||
|
|
28968f7cbb | ||
|
|
bc5408bfbc | ||
|
|
8a91728452 | ||
|
|
072c780824 | ||
|
|
c0cbb61731 | ||
|
|
73355a8f07 | ||
|
|
eef6c52ac5 | ||
|
|
70ddb69006 | ||
|
|
33a5d975ce | ||
|
|
72eae2fb4b | ||
|
|
ee91eeb7c5 | ||
|
|
e92613391f | ||
|
|
bef847e128 | ||
|
|
c85c6f85fa | ||
|
|
8f17c453e1 | ||
|
|
7b6640a42e | ||
|
|
4b2aee6d04 | ||
|
|
49426284fc | ||
|
|
2c7a536d28 | ||
|
|
6b9dd3d898 | ||
|
|
da7691db33 | ||
|
|
e4aa26de64 | ||
|
|
d6b806bd02 | ||
|
|
61afcd2d98 | ||
|
|
183885134d | ||
|
|
981c6cf3f8 | ||
|
|
6a847bd991 | ||
|
|
99ee6f83f9 | ||
|
|
9454c5a1de | ||
|
|
4130d0ceb4 | ||
|
|
be394a53c2 | ||
|
|
d037a7d938 | ||
|
|
bbdd34f0ec | ||
|
|
c09ead4515 | ||
|
|
90293be2fa | ||
|
|
3d58a98b38 | ||
|
|
fc395682d8 | ||
|
|
6ee02bb486 | ||
|
|
43a4d05d60 | ||
|
|
2760adc7b9 | ||
|
|
de8d58766c | ||
|
|
9a56c2ee8a | ||
|
|
945d538bad | ||
|
|
4a5e04c2be | ||
|
|
7a0d77770d | ||
|
|
623fc73640 | ||
|
|
ccf21dacb5 | ||
|
|
1744f27b75 | ||
|
|
e3d8559ff6 | ||
|
|
7137263693 | ||
|
|
05baf15363 | ||
|
|
2b50fdf5a4 | ||
|
|
b70e270475 | ||
|
|
80704876f0 | ||
|
|
57628dc429 | ||
|
|
ded1bbfcb9 | ||
|
|
ce1fd46b7e | ||
|
|
44ca30cbf3 | ||
|
|
3e69a37fa6 | ||
|
|
eaa57ebec8 | ||
|
|
dc4a9761e9 | ||
|
|
fc695b80f7 | ||
|
|
1938c91e05 | ||
|
|
d0ccae9c1a | ||
|
|
5bc00ec520 | ||
|
|
20b04d1789 | ||
|
|
5a9f0ae9d1 | ||
|
|
a75d96561c | ||
|
|
e86f473fc0 | ||
|
|
53aa333967 | ||
|
|
d2f611623b | ||
|
|
8fa7e9c083 | ||
|
|
ff973bf62f | ||
|
|
d3c8292035 | ||
|
|
c7718b024b | ||
|
|
7e52c337c3 | ||
|
|
e5591db83a | ||
|
|
3c37b1b4ad | ||
|
|
0538342491 | ||
|
|
af298ca17e | ||
|
|
883aca74e1 | ||
|
|
c112e7cde8 | ||
|
|
64d2edd2cd | ||
|
|
100d75fec0 | ||
|
|
d8fcd77b4f | ||
|
|
95d22d59f6 | ||
|
|
f4fe01797d | ||
|
|
f2b9834cb1 | ||
|
|
0d7c0a9671 | ||
|
|
ccc6455274 | ||
|
|
083c1ff068 | ||
|
|
36dc08d8ab | ||
|
|
be15c94417 | ||
|
|
b42d755e9b | ||
|
|
afa698cf72 | ||
|
|
8bebe9f661 | ||
|
|
e1bc2c9c2e | ||
|
|
831faf4a34 | ||
|
|
07c7c267aa | ||
|
|
2650c69ff7 | ||
|
|
d8db5ef7bb | ||
|
|
11d24d2f2c | ||
|
|
9de3f32d6c | ||
|
|
ae1c7ce5eb | ||
|
|
e8774de7d4 | ||
|
|
df89da46f1 | ||
|
|
35ac06a05b | ||
|
|
cef6c224ee | ||
|
|
6ac1f0a87a | ||
|
|
ec729eb1e9 | ||
|
|
7590a5bcb2 | ||
|
|
7bbdaee6d3 | ||
|
|
de190a9076 | ||
|
|
efdb76ff0c | ||
|
|
a0d348748c | ||
|
|
3c499a1f8d | ||
|
|
df498efd2f | ||
|
|
e445063afc | ||
|
|
6561f31e2d | ||
|
|
59542c73b3 | ||
|
|
f0edad2b97 | ||
|
|
37e37540f8 | ||
|
|
8312807917 | ||
|
|
b52c178051 | ||
|
|
8c0f9451b7 | ||
|
|
0a262cbb25 | ||
|
|
e7fb16bd70 | ||
|
|
4bb6e3be77 | ||
|
|
41810a8b80 | ||
|
|
88296e0f3e | ||
|
|
425cb93e8d | ||
|
|
53ee346ba0 | ||
|
|
fbfa584d55 | ||
|
|
f18a7fd85c | ||
|
|
e67a8c4ac2 | ||
|
|
dbbd384221 | ||
|
|
bca314e635 | ||
|
|
2d834a57d5 | ||
|
|
7b5841122e | ||
|
|
58ec778b3e | ||
|
|
a8041026a9 | ||
|
|
c04bcbf90e | ||
|
|
89b39916d7 | ||
|
|
b388d03536 | ||
|
|
e6c3c1c857 | ||
|
|
37df0942ff | ||
|
|
3f51798bc1 | ||
|
|
85e34eda3d | ||
|
|
329f7562db | ||
|
|
a80efb09c0 | ||
|
|
122d12fec0 | ||
|
|
17bc8ad651 | ||
|
|
587028883a | ||
|
|
79bfd71a8e | ||
|
|
8aae3b84a5 | ||
|
|
238a6807ac | ||
|
|
49bd61c376 | ||
|
|
097b434712 | ||
|
|
392ffee1ea | ||
|
|
5dac5a8829 | ||
|
|
35e612d35c | ||
|
|
21fcd206db | ||
|
|
dd81c894e0 | ||
|
|
3b7ee0c6cc | ||
|
|
bdc0f0861f | ||
|
|
a694d33a9c | ||
|
|
a92123566d | ||
|
|
8fbdee3a22 | ||
|
|
583b210687 | ||
|
|
378c634c4a | ||
|
|
3f9deb61f0 | ||
|
|
154506ec6e | ||
|
|
320f9b9948 | ||
|
|
8b1669ccfc | ||
|
|
5eaada7828 | ||
|
|
6c3686232c | ||
|
|
34672ebfda | ||
|
|
371ec0c8dd | ||
|
|
7e974c8de3 | ||
|
|
c153846191 | ||
|
|
13a56c373c | ||
|
|
91c4e94609 | ||
|
|
78d6d9d52d | ||
|
|
0df75a6dfa | ||
|
|
18d00de5fc | ||
|
|
1ff28c6969 | ||
|
|
f49e5cd8a7 | ||
|
|
8a0a805af1 | ||
|
|
a3da9bacb0 | ||
|
|
c0de94aca9 | ||
|
|
7500bf286e | ||
|
|
e3937d2ed6 | ||
|
|
f3b799c56f | ||
|
|
0e250bbaba | ||
|
|
69b9001a99 | ||
|
|
0682de1644 | ||
|
|
70e455b88d | ||
|
|
9a575cff69 | ||
|
|
d14371d7dc | ||
|
|
b0bd16a53b | ||
|
|
00796025a6 | ||
|
|
59804f5891 | ||
|
|
ac6d877af9 | ||
|
|
e3824895b8 | ||
|
|
ffe6dc3c8f | ||
|
|
492af31f57 | ||
|
|
302391894b | ||
|
|
16c4b2dfa7 | ||
|
|
baed2d91b7 | ||
|
|
f7964ebe60 | ||
|
|
960f5c4940 | ||
|
|
c4214725be | ||
|
|
0ee41d9046 | ||
|
|
dc9e2278cc | ||
|
|
c3f7b017f5 | ||
|
|
e2cae6f692 | ||
|
|
e9f63c464f | ||
|
|
ba2d83dd43 | ||
|
|
609eb457d8 | ||
|
|
9e85d12824 | ||
|
|
037547a1d4 | ||
|
|
f641de929f | ||
|
|
322cd677b2 | ||
|
|
83722c8b7d | ||
|
|
deed632085 | ||
|
|
ef00fa435c | ||
|
|
1e5b01a446 | ||
|
|
ad3e7b5f7e | ||
|
|
3fb0b4bec0 | ||
|
|
ebcb37cdf6 | ||
|
|
82063280f7 | ||
|
|
eddd56a0de | ||
|
|
84299df63e | ||
|
|
4e1cf8a814 | ||
|
|
fc7f522524 | ||
|
|
418cc69634 | ||
|
|
de53dfed54 | ||
|
|
40a73c2a34 | ||
|
|
040cef5028 | ||
|
|
a275e873fa | ||
|
|
cc06862696 | ||
|
|
2d76c3fee4 | ||
|
|
9961da1d25 | ||
|
|
7032ea6e4f | ||
|
|
ab2207b109 | ||
|
|
d7d6f12142 | ||
|
|
1f1dc5eec8 | ||
|
|
cf2de900f0 | ||
|
|
b0b3193457 | ||
|
|
6a39364b03 | ||
|
|
38d01b37fd | ||
|
|
98946c1e28 | ||
|
|
ffc5682a36 | ||
|
|
347bd16bb1 | ||
|
|
c3f6fbbffe | ||
|
|
d5b104fefd | ||
|
|
b879c1b0c4 | ||
|
|
23c5d65e0f | ||
|
|
bad3028a83 | ||
|
|
86dbba831f | ||
|
|
52d60210c7 | ||
|
|
15eb67168f | ||
|
|
c08514c60f | ||
|
|
1711b37750 | ||
|
|
d5c1bfe913 | ||
|
|
c4bee85e6f | ||
|
|
509379e704 | ||
|
|
84aa2f5f62 | ||
|
|
277029ad85 | ||
|
|
6861f7f754 | ||
|
|
5132d41b14 | ||
|
|
53f9434f53 | ||
|
|
cb57ac7b48 | ||
|
|
e404cc1417 | ||
|
|
bcec48bdbf | ||
|
|
188d0ed258 | ||
|
|
a9a466cca5 | ||
|
|
ff8120d1b5 | ||
|
|
e4707cb090 | ||
|
|
3d13fd5d54 | ||
|
|
54c79d94fb | ||
|
|
bcabbb8a6a | ||
|
|
98f732a7cf | ||
|
|
9c47fb9a16 | ||
|
|
5ba4df87fb | ||
|
|
6b173f2c29 | ||
|
|
55da7871ee | ||
|
|
bd67f05f91 | ||
|
|
f871cefbad | ||
|
|
83b7bdef8d | ||
|
|
46124ecf9c | ||
|
|
97181c4e8d | ||
|
|
bf1348fa63 | ||
|
|
c5b2b233b2 | ||
|
|
36e189f569 | ||
|
|
43976b674a | ||
|
|
c9c552bd4a | ||
|
|
7b0a7bf741 | ||
|
|
1c41f96f04 | ||
|
|
bd228bcd91 | ||
|
|
fbb9271966 | ||
|
|
6598c138c0 | ||
|
|
01a9997c86 | ||
|
|
605599efc4 | ||
|
|
25ca7f4027 | ||
|
|
f28e915c4a | ||
|
|
3d386d76e4 | ||
|
|
b001ef0bd5 | ||
|
|
73a26d8560 | ||
|
|
fa37a9cfc0 | ||
|
|
b33faf19f7 | ||
|
|
09d96a3c95 | ||
|
|
eb2d76de61 | ||
|
|
4f6d6b9e77 | ||
|
|
c0302ce05c | ||
|
|
c06d38bb5f | ||
|
|
9bd1f380be | ||
|
|
caeaccef37 | ||
|
|
9bd9a1375c | ||
|
|
e2c7e81482 | ||
|
|
c6f3552c56 | ||
|
|
215e13d19d | ||
|
|
5aead81caa | ||
|
|
37b470cc6c | ||
|
|
01fd644312 | ||
|
|
cb3f7da491 | ||
|
|
1ce37c38af | ||
|
|
f8dbd96dc2 | ||
|
|
61716196cd | ||
|
|
9bf8f4f754 | ||
|
|
8229258af4 | ||
|
|
a12a2b2d72 | ||
|
|
dc1075f865 | ||
|
|
fe14f74288 | ||
|
|
75f2349e76 | ||
|
|
c6a515554f | ||
|
|
4aa1d4259d | ||
|
|
5d9ea10cb0 | ||
|
|
d1b6b69807 | ||
|
|
068af5e40e | ||
|
|
067410f636 | ||
|
|
8a7867d6ea | ||
|
|
ab531d3b08 | ||
|
|
11ce529591 | ||
|
|
bc1a226039 | ||
|
|
8934545c00 | ||
|
|
a8056ae1ca | ||
|
|
c4ca30768b | ||
|
|
1f4081e2bb | ||
|
|
8d4d986332 | ||
|
|
55cbd9c60c | ||
|
|
697b561cac | ||
|
|
868149e480 | ||
|
|
488e2298de | ||
|
|
5c60f1ffb7 | ||
|
|
b957c92533 | ||
|
|
941b7c80d4 | ||
|
|
2ee8676c4e | ||
|
|
6b0852bbbc | ||
|
|
8eda688d37 | ||
|
|
6d90c17ed3 | ||
|
|
3b467c3e51 | ||
|
|
567bde994f | ||
|
|
efd7d00fa9 | ||
|
|
8d245eea07 | ||
|
|
8e9db3ddf8 | ||
|
|
1dacec1de0 | ||
|
|
f005576cb6 | ||
|
|
a01f1cb547 | ||
|
|
c9e74b7a8c | ||
|
|
3e03d087b2 | ||
|
|
3452420e52 | ||
|
|
f321fc8986 | ||
|
|
59a4be64b5 | ||
|
|
22b51bf673 | ||
|
|
31d641fdab | ||
|
|
81b309fa1c | ||
|
|
9816eca8a2 | ||
|
|
f75885415c | ||
|
|
2e90b6adf0 | ||
|
|
845db90a35 | ||
|
|
192277c870 | ||
|
|
53e318a27c | ||
|
|
4189b41a2f | ||
|
|
d32f771452 | ||
|
|
1ddb0a1149 | ||
|
|
02a30ee546 | ||
|
|
a1c0de83f0 | ||
|
|
875301eb1d | ||
|
|
8e352fa027 | ||
|
|
874e8fa677 | ||
|
|
ce6b11f384 | ||
|
|
ee64166f8c | ||
|
|
f1fc975d79 | ||
|
|
988c3b4c91 | ||
|
|
068c039d47 | ||
|
|
af109a9060 | ||
|
|
f11e892232 | ||
|
|
0c279f3d2e | ||
|
|
2d2da59305 | ||
|
|
f448d214b5 | ||
|
|
d918bbe8b3 | ||
|
|
edcd2c19f1 | ||
|
|
ef38382da9 | ||
|
|
e3b9eca251 | ||
|
|
41faad8172 | ||
|
|
8695290834 | ||
|
|
7d9ec29847 | ||
|
|
efc1a5a0b0 | ||
|
|
5008d89ee4 | ||
|
|
8b8e5885a0 | ||
|
|
f834d71ca5 | ||
|
|
a701d94402 | ||
|
|
1a262d8859 | ||
|
|
ef6009f0cc | ||
|
|
aca483c7a0 | ||
|
|
f1a289ca05 | ||
|
|
c5e68bed86 | ||
|
|
6c8071aa83 | ||
|
|
6ac0b993ba | ||
|
|
0d18199cdf | ||
|
|
b532e9ce90 | ||
|
|
2cb1dc69df | ||
|
|
be079b0615 | ||
|
|
d91e5ed550 | ||
|
|
20455c96d3 | ||
|
|
f595909d73 | ||
|
|
0d77f909b8 | ||
|
|
b87c13c233 | ||
|
|
11ff8c8405 | ||
|
|
791e4d829b | ||
|
|
201cc49865 | ||
|
|
ea622b0378 | ||
|
|
e66d26f195 | ||
|
|
ab23f91b7c | ||
|
|
31231817b6 | ||
|
|
61ba2521e4 | ||
|
|
d34889997b | ||
|
|
e96726b8de | ||
|
|
84c679941c | ||
|
|
f794bc6ab0 | ||
|
|
471d00b47c | ||
|
|
fe44893e15 | ||
|
|
b6cab0818c | ||
|
|
3bd3fb4950 | ||
|
|
e0e0329cfe | ||
|
|
4abe2b7bf5 | ||
|
|
ec70dc13bc | ||
|
|
19c20944e4 | ||
|
|
e5d1e8eb55 | ||
|
|
a1b4574bae | ||
|
|
720adb7e86 | ||
|
|
b8c7e03f29 | ||
|
|
2a8d1f17a5 | ||
|
|
9d0047e071 | ||
|
|
fb491446c7 | ||
|
|
3f4633677b | ||
|
|
d7f0b63eb9 | ||
|
|
32eaae40d7 | ||
|
|
36f516c037 | ||
|
|
663ddc8386 | ||
|
|
253d90b15a | ||
|
|
94b86e2a0b | ||
|
|
b3f0ed96e9 | ||
|
|
9e6532194f | ||
|
|
c5e2bef011 | ||
|
|
4b3e287a5f | ||
|
|
b89e7db2a2 | ||
|
|
0dcc74b567 | ||
|
|
5b128adddb | ||
|
|
17f59a1954 | ||
|
|
9b24504528 | ||
|
|
aafcec25fb | ||
|
|
8f1c25043d | ||
|
|
26f5483182 | ||
|
|
4cd600d285 | ||
|
|
ac1d17c216 | ||
|
|
4f62c5cb9d | ||
|
|
658a29853b | ||
|
|
a35a78ef00 | ||
|
|
6d3fe01c99 | ||
|
|
aa6579d040 | ||
|
|
d57890c0a9 | ||
|
|
cf99b2730a | ||
|
|
9997f732dc | ||
|
|
3329cd4bf1 | ||
|
|
f16f3457dd | ||
|
|
2282183509 | ||
|
|
5cb525d9a2 | ||
|
|
7f82c5b4cf | ||
|
|
f4d64555d0 | ||
|
|
7813ddb003 | ||
|
|
3eff2139dc | ||
|
|
b5c85e0031 | ||
|
|
8d727d4f39 | ||
|
|
b2002d5989 | ||
|
|
4f357b1dd4 | ||
|
|
d85ab06f68 | ||
|
|
f0099ecd92 | ||
|
|
d5a20de52b | ||
|
|
7101bdff2c | ||
|
|
2831c8b5af | ||
|
|
d896db5d4d | ||
|
|
59db5a1568 | ||
|
|
7dc3032824 | ||
|
|
28bba07f22 | ||
|
|
5da0f4b651 | ||
|
|
07fac1c94e | ||
|
|
f1f8b2bf93 | ||
|
|
f89deadcb2 | ||
|
|
bd3ef507cc | ||
|
|
12c6d325ce | ||
|
|
7063fd5cd9 | ||
|
|
e051460e31 | ||
|
|
4413821d1b | ||
|
|
0eb642a625 | ||
|
|
04beb515d0 | ||
|
|
5996377c2d | ||
|
|
74c47dcba0 | ||
|
|
db07381bbd | ||
|
|
a170cf7b1f | ||
|
|
156bdba217 | ||
|
|
34afcbf84e | ||
|
|
aae17797b7 | ||
|
|
65e49790e8 | ||
|
|
0ab2a0f5b7 | ||
|
|
d9e1f83d05 | ||
|
|
cf18beb6dc | ||
|
|
fe09fa4983 | ||
|
|
7a310007b1 | ||
|
|
f5abfa0084 | ||
|
|
d7b7de09f7 | ||
|
|
c1131c0b54 | ||
|
|
2f05a88e56 | ||
|
|
b804a7e5aa | ||
|
|
73080b55f8 | ||
|
|
5e5e0d9b57 | ||
|
|
552c6888e5 | ||
|
|
d650dedcb6 | ||
|
|
e85ef5ff6f | ||
|
|
2d53a8a31d | ||
|
|
12bb196de3 | ||
|
|
a29a934e95 | ||
|
|
8aee36e808 | ||
|
|
0fa2950bb7 | ||
|
|
68e26624be | ||
|
|
c29d493159 | ||
|
|
837c31abeb | ||
|
|
1836d989ca | ||
|
|
d1c92c569f | ||
|
|
d58b590200 | ||
|
|
b5a0522fb9 | ||
|
|
62f92569b3 | ||
|
|
6d50374606 | ||
|
|
4b67e33ae9 | ||
|
|
a5bc5689a3 | ||
|
|
bd410a9559 | ||
|
|
351667a8a0 | ||
|
|
1c40a78bae | ||
|
|
d388123410 | ||
|
|
2d307db6ce | ||
|
|
09974cb43b | ||
|
|
ed9a206ad6 | ||
|
|
8317137068 | ||
|
|
edda197051 | ||
|
|
5e91aee82e | ||
|
|
1bfe8afc8b | ||
|
|
a6cd4d2578 | ||
|
|
c6f7d4e449 | ||
|
|
ea4f22c2b9 | ||
|
|
a50c9ce240 | ||
|
|
0f03dc9d04 | ||
|
|
4b4baf4952 | ||
|
|
baccd4505b | ||
|
|
7ee49a5367 | ||
|
|
6522a101ea | ||
|
|
f114c9497a | ||
|
|
20c61297c6 | ||
|
|
2bf8c5d150 | ||
|
|
8b133291a4 | ||
|
|
980f8e1f5a | ||
|
|
0cec1b0a20 | ||
|
|
1e64e12d49 | ||
|
|
f529e4bb32 | ||
|
|
c8a3e74ae5 | ||
|
|
a2fa966ccd | ||
|
|
7d0fd6b907 | ||
|
|
6b1797e36d | ||
|
|
9764c831d7 | ||
|
|
53bf46fac5 | ||
|
|
fb8ea2a195 | ||
|
|
cebe4ce80f | ||
|
|
031faeff50 | ||
|
|
422dcdc6be | ||
|
|
7d63ea0c19 | ||
|
|
ad8f080643 | ||
|
|
44bd3c95c3 | ||
|
|
86451a245f | ||
|
|
d12705b4f6 | ||
|
|
0e96395d98 | ||
|
|
5c7e2e4098 | ||
|
|
b8401c34c9 | ||
|
|
92f8fd0af8 | ||
|
|
e3626ea7ba | ||
|
|
7c3620eea1 | ||
|
|
dd4b58312e | ||
|
|
d87c947ca1 | ||
|
|
83580d9ef3 | ||
|
|
8db4f1bb30 | ||
|
|
2c1430b88a | ||
|
|
7a0d0322da | ||
|
|
67b9c61eef | ||
|
|
37ea4d4db6 | ||
|
|
bcd90e0706 | ||
|
|
108c486240 | ||
|
|
489b39f9e6 | ||
|
|
6e3f72092c | ||
|
|
292b4720e3 | ||
|
|
eb408e0bfb | ||
|
|
83a30fda7d | ||
|
|
88ac20bbcd | ||
|
|
e73641d6de | ||
|
|
d57fd8a7a2 | ||
|
|
62752263c0 | ||
|
|
2f5aba907e | ||
|
|
2a924caacd | ||
|
|
8eb0c51937 | ||
|
|
9693df6e26 | ||
|
|
f8105d5422 | ||
|
|
2f351dbd68 | ||
|
|
7ee368e6db | ||
|
|
a75c2d254f | ||
|
|
86b1349a46 | ||
|
|
5219ca9a3f | ||
|
|
f67bdea66f | ||
|
|
7cf7d41c23 | ||
|
|
d046ca1dd6 | ||
|
|
e02aad528e | ||
|
|
b0f0e693aa | ||
|
|
59d0a80043 | ||
|
|
0d5a9fed10 | ||
|
|
3e87d2afca | ||
|
|
acb8bd9d1c | ||
|
|
52485cb63e | ||
|
|
8e31b662ce | ||
|
|
a632cefb3b | ||
|
|
96b7c8bbeb | ||
|
|
9c61fde48d | ||
|
|
065e474c86 | ||
|
|
9e0f38c0e3 | ||
|
|
7dd7e6483c | ||
|
|
0dc6a67f9f | ||
|
|
4a3063bd8c | ||
|
|
efb7ebeeee | ||
|
|
792d270446 | ||
|
|
59f8671e90 | ||
|
|
da929c20a2 | ||
|
|
4be5825cf1 | ||
|
|
e9d5e63a3e | ||
|
|
cd76b41ba7 | ||
|
|
53daf5309b | ||
|
|
0b0b15fd55 | ||
|
|
d8f13f09c5 | ||
|
|
fc7067cff3 | ||
|
|
0ec77d5a48 | ||
|
|
9d36bbbf06 | ||
|
|
6a09277e2b | ||
|
|
fa6ea7a9b3 | ||
|
|
1b55f8d643 | ||
|
|
4e3632e4b5 | ||
|
|
de03942d0e | ||
|
|
6bfc039364 | ||
|
|
21e1fa71b8 | ||
|
|
4db8628b87 | ||
|
|
b784d81020 | ||
|
|
62b5ff4458 | ||
|
|
324edf7569 | ||
|
|
c17cebfe2a | ||
|
|
33e38db789 | ||
|
|
1c2381c9b1 | ||
|
|
071bd9daf5 | ||
|
|
5d2c1279d8 | ||
|
|
bb7406c7c9 | ||
|
|
36ccc9ace2 | ||
|
|
d8c652762a | ||
|
|
10ded04b7d | ||
|
|
9587b1acfe | ||
|
|
a08aca7afe | ||
|
|
7a0ae3143b | ||
|
|
b29ddfc2fc | ||
|
|
555a888ab7 | ||
|
|
27afc15796 | ||
|
|
d601b1d4c2 | ||
|
|
844fad5301 | ||
|
|
1c9490427b | ||
|
|
f80c5a3b41 | ||
|
|
fbd7680927 | ||
|
|
392ba406bc | ||
|
|
0e15dca25b | ||
|
|
d53bc8fe20 | ||
|
|
3d1e68b29d | ||
|
|
2c00ad961c | ||
|
|
6ecad30626 | ||
|
|
9ccf4e2a3b | ||
|
|
6de41e883a | ||
|
|
584eec0e78 | ||
|
|
3624b48511 | ||
|
|
47ce4ba424 | ||
|
|
39f5bcbd5a | ||
|
|
d7568eb799 | ||
|
|
0f3276ceca | ||
|
|
ef6855c3a6 | ||
|
|
fdf441c8e8 | ||
|
|
d4bb5d2de0 | ||
|
|
bc1f9ba4cb | ||
|
|
024cb5831b | ||
|
|
84bf07717a | ||
|
|
cc211cd22b | ||
|
|
b117cf9d51 | ||
|
|
8341473672 | ||
|
|
d021781d75 | ||
|
|
059da71d6d | ||
|
|
52c62f7955 | ||
|
|
352ae43faa | ||
|
|
361792c48d | ||
|
|
2b248b0177 | ||
|
|
d923fd5420 | ||
|
|
92d5b99384 | ||
|
|
315d852eaf | ||
|
|
e1760adf4e | ||
|
|
f69550c015 | ||
|
|
393846b836 | ||
|
|
18e4ffa7a1 | ||
|
|
0056a31dcb | ||
|
|
40ebb8630a | ||
|
|
d51918b713 | ||
|
|
51d2b8eaf9 | ||
|
|
1605d280b8 | ||
|
|
7ae4e92a93 | ||
|
|
d5fe146cec | ||
|
|
f239508b87 | ||
|
|
a6924dac90 | ||
|
|
9ea41700c7 | ||
|
|
09cced8bc3 | ||
|
|
4b893b6c49 | ||
|
|
6eb7b5d13d | ||
|
|
781c0f1543 | ||
|
|
b9964d64b0 | ||
|
|
6896dfd197 | ||
|
|
e0221ae9ee | ||
|
|
d212d1ea1f | ||
|
|
513db9b4b9 | ||
|
|
4b93111ae0 | ||
|
|
bfa2985b2f | ||
|
|
0ac30e762e | ||
|
|
d5fadfc498 | ||
|
|
7b3fcef56e | ||
|
|
a9e4aae662 | ||
|
|
0a154f0c1f | ||
|
|
a59a96b092 | ||
|
|
ed30be74bc | ||
|
|
96aec2e69f | ||
|
|
6e5a1c3921 | ||
|
|
aa846b62a7 | ||
|
|
b5ae298ee9 | ||
|
|
a3cb513b57 | ||
|
|
54127cc668 | ||
|
|
3e466e01cb | ||
|
|
47b681c99d | ||
|
|
a1ca224a98 | ||
|
|
07bc1389c1 | ||
|
|
9292429c8c | ||
|
|
356758a184 | ||
|
|
d979943852 | ||
|
|
8a7d6f746f | ||
|
|
6deb734d94 | ||
|
|
e55e0fc2cc | ||
|
|
d8817261ca | ||
|
|
8e04ec040a | ||
|
|
05db88644c | ||
|
|
90ab2dec01 | ||
|
|
16128af70f | ||
|
|
1a3827e541 | ||
|
|
cc283155a1 | ||
|
|
a751e3e70b | ||
|
|
3b58dec324 | ||
|
|
503416902c | ||
|
|
1c54bac79c | ||
|
|
ff322874e2 | ||
|
|
03bd52194b | ||
|
|
17e2d3b12a | ||
|
|
834132fec2 | ||
|
|
e7e69d72e3 | ||
|
|
98762e996c | ||
|
|
11e8588e0d | ||
|
|
0ac92994bc | ||
|
|
3ac9250f38 | ||
|
|
340e40b6d1 | ||
|
|
87215e6352 | ||
|
|
d3aa3eef94 | ||
|
|
7db8828e0b | ||
|
|
25b4572ec8 | ||
|
|
5f208c4510 | ||
|
|
c378806112 | ||
|
|
dd9394b9eb | ||
|
|
169c3afc06 | ||
|
|
4567edbd5f | ||
|
|
387b25c678 | ||
|
|
918b88e5e2 | ||
|
|
b66d14f53e | ||
|
|
c7c72ddd26 | ||
|
|
c03be59b18 | ||
| 6b80930bc0 | |||
|
|
768304bf9d | ||
|
|
3e2a01339d | ||
|
|
7b70dafbaf | ||
|
|
62248f1ac6 | ||
|
|
ddc87afed2 | ||
|
|
531f1a55fd | ||
|
|
db71cb58d3 | ||
|
|
345f1c10b0 | ||
|
|
f95dc9adcc | ||
|
|
3dce3cd497 | ||
|
|
fb44d8888a | ||
|
|
ca38041eec | ||
|
|
2dbdc7a4c4 | ||
|
|
942078e3fd | ||
|
|
5bc5bf0672 | ||
|
|
307f835cec | ||
|
|
a5bfb77e2a | ||
|
|
fd755fa58a | ||
|
|
318b7d7748 | ||
|
|
ffd792acaa | ||
|
|
7f76715aeb | ||
|
|
c09236b06f | ||
|
|
00142f0935 | ||
|
|
190afb8d9d | ||
|
|
447a9703ac | ||
|
|
7235fd4834 | ||
|
|
dc44b85d69 | ||
|
|
db8b9b82da | ||
|
|
abc33595df | ||
|
|
bf29282de6 | ||
|
|
1b07cef1d5 | ||
|
|
dd8ba7e3ce | ||
|
|
d862c250fa | ||
|
|
8ebac73812 | ||
|
|
e941dda29c | ||
|
|
f74ca9402a | ||
|
|
08f8739a80 | ||
|
|
4066e61fba | ||
|
|
55be902080 | ||
|
|
2c2bc040ca | ||
|
|
a3f5bc03d0 | ||
|
|
2f1e902885 | ||
|
|
bf6d86bf4e | ||
|
|
95ac3d55ae | ||
|
|
733e873785 | ||
|
|
a0b90c4299 | ||
|
|
3ab05fc552 | ||
|
|
1c44c9e776 | ||
|
|
f34a0ac163 | ||
|
|
570256341d | ||
|
|
6e8b6b41df | ||
|
|
94ee820ace | ||
|
|
3080718d95 | ||
|
|
b35314bf83 | ||
|
|
1dbe9c1a2b | ||
|
|
241395d610 | ||
|
|
2062bc6160 | ||
|
|
41687a386b | ||
|
|
c1c046971e | ||
|
|
b25222b93e | ||
|
|
ea85e1c82b | ||
|
|
8fe7970b81 | ||
|
|
2a4d9b2b1c | ||
|
|
0736ea98d0 | ||
|
|
81a61c4ec4 | ||
|
|
c5d3b941dc | ||
|
|
9a2623232c | ||
|
|
96f565bbe4 | ||
|
|
231717f862 | ||
|
|
ca02cfc24e | ||
|
|
8e94580b56 | ||
|
|
3fdc528ffe | ||
|
|
35de4f51de | ||
|
|
3e5427633a | ||
|
|
05ff4c5a0e | ||
|
|
ff8491c0f3 | ||
|
|
fbb77ace5d | ||
|
|
438a24101d | ||
|
|
e6fe7b224b | ||
|
|
a407d007be | ||
|
|
d4534c7dca | ||
|
|
2b3925abf0 | ||
|
|
1fb21fdbd3 | ||
|
|
0a49f98892 | ||
|
|
a4348368e0 | ||
|
|
0dfe3125c7 | ||
|
|
c924ed7c71 | ||
|
|
ccb99b00c1 | ||
|
|
c67633eda5 | ||
|
|
55a7cd8624 | ||
|
|
b2600d0de5 | ||
|
|
f550ae832b | ||
|
|
6d338b8324 | ||
|
|
92645d9c17 | ||
|
|
6d75362672 | ||
|
|
d5ecc2579b | ||
|
|
6dab0e1f72 | ||
|
|
d24898b558 | ||
|
|
fc220c7868 | ||
|
|
33294ac8e7 | ||
|
|
07ca7dc8a7 | ||
|
|
3365fcb1ef | ||
|
|
fa7c5428c5 | ||
|
|
c9dc8940ed | ||
|
|
e20e479697 | ||
|
|
c752a1c92b | ||
|
|
05af474916 | ||
|
|
b4e54b8fdc | ||
|
|
0b89f4c0a1 | ||
|
|
70e1337980 | ||
|
|
4b04209e62 | ||
|
|
0d31afa0a5 | ||
|
|
893ec0efc9 | ||
|
|
47d44a94b8 | ||
|
|
a1ee74f4c8 | ||
|
|
61bacc2742 | ||
|
|
6c581378e8 | ||
|
|
d819783b21 | ||
|
|
a0cf4601b7 | ||
|
|
3a39248f9c | ||
|
|
f8f4c2ffec | ||
|
|
94331d6ba0 | ||
|
|
34dd2fcbcc | ||
|
|
53d0350259 | ||
|
|
d510da6e71 | ||
|
|
eda3252c95 | ||
|
|
c353a19fe5 | ||
|
|
15877d15f4 | ||
|
|
8ee4054eff | ||
|
|
94e27be64b | ||
|
|
10e658af76 | ||
|
|
c93c5b6c93 | ||
|
|
b7dfd189a0 | ||
|
|
58c3d89297 | ||
|
|
49aa0a6276 | ||
|
|
e71d1fcf12 | ||
|
|
a09048af63 | ||
|
|
f446104dda | ||
|
|
c17018ae9d | ||
|
|
69509c43f1 | ||
|
|
8a25040a26 | ||
|
|
aaf7631ef3 | ||
|
|
a134902bd6 | ||
|
|
768c0759ac | ||
|
|
442296a414 | ||
|
|
90ab577eb1 | ||
|
|
bf799bdd93 | ||
|
|
0debe23873 | ||
|
|
79e06e38ae | ||
|
|
d94fdb9f86 | ||
|
|
6d35edee98 | ||
|
|
45cde1e2e7 | ||
|
|
b63cd4b427 | ||
|
|
97d5c51a12 | ||
|
|
1ea7bf16f2 | ||
|
|
3a7506e0f6 | ||
|
|
09bc287157 | ||
|
|
99555c3924 | ||
|
|
82d93a1266 | ||
|
|
0913a70ac7 | ||
|
|
75d1f34b5d | ||
|
|
8424a06217 | ||
|
|
67d3ad9bca | ||
|
|
bcef93975e | ||
|
|
cf6610153f | ||
|
|
e46dc98f58 | ||
|
|
261a6c6ffa | ||
|
|
4eb47552b3 | ||
|
|
a4ac8060ba | ||
|
|
4d99866e39 | ||
|
|
f6d36a132d | ||
|
|
97c43de5ce | ||
|
|
4bcf08213f | ||
|
|
1643123b77 | ||
|
|
48a6abc8b0 | ||
|
|
ffcd58a34a | ||
|
|
7eb409548b | ||
|
|
81701253cd | ||
|
|
89bcc1c27b | ||
|
|
f39003c785 | ||
|
|
a2c7c4628d | ||
|
|
7b2a394d9c | ||
|
|
5916681635 | ||
|
|
b578e07243 | ||
|
|
a73749b450 | ||
|
|
c27a19a06b | ||
|
|
234b9f34d5 | ||
|
|
93f1523caa | ||
|
|
b22c153f3d | ||
|
|
2a416e8177 | ||
|
|
3bca9a4865 | ||
|
|
b0457b8161 | ||
|
|
16aaa2e95a | ||
|
|
be0c55de75 | ||
|
|
e0d1860aaa | ||
|
|
a73d93c1ca | ||
|
|
9ce09b38de | ||
|
|
ad856bfaae | ||
|
|
f17b80abba | ||
|
|
9b36b9de6d | ||
|
|
479163c50e | ||
|
|
305345a955 | ||
|
|
4414bd3416 | ||
|
|
c5d1030940 | ||
|
|
b0ea8c451b | ||
|
|
61217e07b8 | ||
|
|
79efa10aa1 | ||
|
|
63286e3f48 | ||
|
|
5f853d5ac3 | ||
|
|
6abe23d791 | ||
|
|
4e36387bb2 | ||
|
|
fd03bba979 | ||
|
|
a084961c0b | ||
|
|
150760f6ce | ||
|
|
59931236ba | ||
|
|
fd5f976dcf | ||
|
|
932733839f | ||
|
|
4fc53f7519 | ||
|
|
f71e163e0a | ||
|
|
18c7277d7b | ||
|
|
829e2f5ab8 | ||
|
|
79c6636fb2 | ||
|
|
5403db62fa | ||
|
|
425db08622 | ||
|
|
0e7f0b4d26 | ||
|
|
697b0a5eaf | ||
|
|
364f042e9b | ||
|
|
da259ebec6 | ||
|
|
dbca23bb6d | ||
|
|
64eafa988b | ||
|
|
355a0fe50e | ||
|
|
46c5474b4e | ||
|
|
23d677bc82 | ||
|
|
5eaf8f996a | ||
|
|
733871805a | ||
|
|
86dbce3da8 | ||
|
|
d4ab166fe0 | ||
|
|
0705687d12 | ||
|
|
246aaee5b1 | ||
|
|
ca4a465312 | ||
|
|
e4ce3d7c45 | ||
|
|
b90cc9065f | ||
|
|
69ea4af045 | ||
|
|
7e89712bd9 | ||
|
|
dfa29e1677 | ||
|
|
aef1ebc8c9 | ||
|
|
5d656a9e65 | ||
|
|
e04acbcf5b | ||
|
|
1f7e2b4d84 | ||
|
|
d6d2e7b909 | ||
|
|
7de09aa195 | ||
|
|
6835f1da50 | ||
|
|
2004368c90 | ||
|
|
ec41626868 | ||
|
|
d1acd1de71 | ||
|
|
f6d8a737df | ||
|
|
37e16f5795 | ||
|
|
d5d5fa6055 | ||
|
|
6ec577f14d | ||
|
|
9300dac087 | ||
|
|
3f25e3a753 | ||
|
|
5dc1ba2230 | ||
|
|
208b440c86 | ||
|
|
8bc6655ec7 | ||
|
|
d2bec8554d | ||
|
|
7453962f52 | ||
|
|
4b518445ef | ||
|
|
f9d5e51222 | ||
|
|
5b94b47e02 | ||
|
|
1464cfa2de | ||
|
|
e4d1e85156 | ||
|
|
8998e9a664 | ||
|
|
97d29d0d7e | ||
|
|
a4d48f643b | ||
|
|
5d4a8af8d7 | ||
|
|
0f221d2f9d | ||
|
|
322d0cb479 | ||
|
|
036ee91533 | ||
|
|
71049f7f65 | ||
|
|
f39746e303 | ||
|
|
c0d890a0a8 | ||
|
|
b4446a24a6 | ||
|
|
e8c8c1cba6 | ||
|
|
3dd57db73b | ||
|
|
a2925da21b | ||
|
|
c3d92c18d0 | ||
|
|
ae24b4d6b4 | ||
|
|
61de1da32d | ||
|
|
70557adefd | ||
|
|
7894fb68f8 | ||
|
|
409fcd6f44 | ||
|
|
61fed1f99f | ||
|
|
32aae8fe4f | ||
|
|
74e34e52e8 | ||
|
|
4b9bd8ffa8 | ||
|
|
018b926c6c | ||
|
|
1355ef7509 | ||
|
|
a076c7b331 | ||
|
|
195c6e3aa6 | ||
|
|
046b1d0c5a | ||
|
|
b6a686a021 | ||
|
|
bc8cc63d17 | ||
|
|
db406eb8fa | ||
|
|
c1010119aa | ||
|
|
a0cc85027c | ||
|
|
1db79c53a0 | ||
|
|
39f6cb1ff2 | ||
|
|
55e3ab0612 | ||
|
|
84954bcc84 | ||
|
|
a0c2bf8f67 | ||
|
|
bd2b066e9a | ||
|
|
7d99c2fb5f | ||
|
|
6d3984654c | ||
|
|
64202161dd | ||
|
|
6f14126a2e | ||
|
|
f757852ac4 | ||
|
|
f38eff6564 | ||
|
|
92516a7753 | ||
|
|
890cbaa0b9 | ||
|
|
376a4778b8 | ||
|
|
cc46a5a9c8 | ||
|
|
e8439fe40a | ||
|
|
3464798fd9 | ||
|
|
5a730afb99 | ||
|
|
46596b6d57 | ||
|
|
8a0141bf2d | ||
|
|
869d9a4635 | ||
|
|
6eb9dd2ee6 | ||
|
|
47024dde2a | ||
|
|
f764b37c8a | ||
|
|
85324959a0 | ||
|
|
6298eeaae3 | ||
|
|
c398a354b9 | ||
|
|
abe2f9892e | ||
|
|
cf4ae0bc58 | ||
|
|
4cb734cbe0 | ||
|
|
a4e7a9ff30 | ||
|
|
572f155bf5 | ||
|
|
99ef026ff0 | ||
|
|
86a1128d9a | ||
|
|
38f3ecc288 | ||
|
|
ec29f1dc11 | ||
|
|
c186b95ae7 | ||
|
|
d5fa92d90f | ||
|
|
6f5a918bd1 | ||
|
|
96ad4ac999 | ||
|
|
efc3252c1b | ||
|
|
197201d923 | ||
|
|
8baf806758 | ||
|
|
192af31223 | ||
|
|
dc2e2ff079 | ||
|
|
97759ee9d2 | ||
|
|
ea42e0e53a | ||
|
|
b85a5a9cfb | ||
|
|
001fc94d95 | ||
|
|
5f8fff9943 | ||
|
|
476dec8d17 | ||
|
|
0a815cbb35 | ||
|
|
74b98805a5 | ||
|
|
b5d7ee5c58 | ||
|
|
d970a443ce | ||
|
|
22cbb0c6bf | ||
|
|
a23dc0b0cd | ||
|
|
7bbeb88804 | ||
|
|
27f9d4740d | ||
|
|
c0c5cd79ee | ||
|
|
a6c9430a42 | ||
|
|
b468befe67 | ||
|
|
b6bcf204f5 | ||
|
|
7bc5f87471 | ||
|
|
bb46e123fe | ||
|
|
e99ea5b2de | ||
|
|
40dfa8686b | ||
|
|
731389d4a2 | ||
|
|
7c13051ce1 | ||
|
|
bfde95f6ca | ||
|
|
9861b4718e | ||
|
|
2f612a074c | ||
|
|
11eda3d90b | ||
|
|
c78a75718a | ||
|
|
ee93320cad | ||
|
|
35fcde4dca | ||
|
|
054f8b8a50 | ||
|
|
8f79d72950 | ||
|
|
3ba4c9089c | ||
|
|
471609f59c | ||
|
|
ffcd6f2943 | ||
|
|
abdeeef32f | ||
|
|
fa64373189 | ||
|
|
10cb930034 | ||
|
|
ab3e8ad93f | ||
|
|
a45e5a8844 | ||
|
|
91f8c77e34 | ||
|
|
98a228e644 | ||
|
|
bc9a255a3f | ||
|
|
5c3e626df1 | ||
|
|
4db2c45c4a | ||
|
|
c921eec601 | ||
|
|
ab146f9a69 | ||
|
|
48b3839eca | ||
|
|
7e19978d7a | ||
|
|
050f76c1be | ||
| f4873d924f | |||
| 6fedce8dac | |||
| 9f4c44d75d | |||
|
|
f0e3aaa3ab | ||
|
|
9521730bae | ||
|
|
ac99e83459 | ||
|
|
3ce7f47a6b | ||
|
|
c430bbf467 | ||
|
|
ea36a748c8 | ||
| 2c5542d985 | |||
| 722d861dfd | |||
| 5ea1728dbb | |||
|
|
53a4e5ea27 | ||
| 6a75a3470f | |||
| 8600eb20bc | |||
|
|
2074d29e55 | ||
|
|
9283c0c283 | ||
|
|
b25f4ff713 | ||
|
|
17c74dd956 | ||
| e0bb149e44 | |||
| f81e56feab | |||
|
|
4b994d76e9 | ||
| 426ce5f49a | |||
| 460a2b0ab7 | |||
|
|
9c0685e4ff | ||
| 3abcf75a3f | |||
| 01e1bc3d7a | |||
| 4d1df90887 | |||
| e687a6b572 | |||
|
|
53a185fec6 | ||
|
|
74adde5a40 | ||
|
|
03d990f8b5 | ||
| d52d2b352d | |||
| 41bc5e8750 | |||
| f796fbc536 | |||
| c6a9856689 | |||
| 6359ceecb3 | |||
| f2bcbffde4 | |||
| 8bdc53d7ca | |||
| d697c5213f | |||
| b7104acd58 | |||
| b84d3bec66 | |||
| d2264c90d1 | |||
| 1d0de7a9c5 | |||
|
|
cce3c47466 | ||
|
|
a01d79fe2f | ||
| 283fb8767d | |||
| 9baf7fe2ef | |||
| 4ff43d632e | |||
|
|
49dabf912c | ||
| 2fe01ec7cf | |||
| 7250ff3a45 | |||
| 832be3f1ec | |||
| 69347cde15 | |||
| f384b4c73d | |||
|
|
0c2b0c6733 | ||
|
|
a49fb6016b | ||
|
|
0370ea61d9 | ||
|
|
25bdc08ede | ||
|
|
e2583c25f9 | ||
|
|
d01a7b58fa | ||
|
|
d3cb80666e | ||
|
|
a52c3a1eca | ||
|
|
38fcdfdb70 | ||
|
|
2360db1924 | ||
|
|
9baf96b0c2 | ||
|
|
44e8683cd5 | ||
|
|
9efa58ad49 | ||
|
|
71631bf2ca | ||
|
|
22e7c83a74 | ||
|
|
2a6563a6c1 | ||
|
|
fe15dcdad9 | ||
|
|
bff298f5c9 | ||
|
|
53d7b3fc85 | ||
|
|
893a75c582 | ||
|
|
86c8722638 | ||
|
|
d1e3e69006 | ||
|
|
8719b9d851 | ||
|
|
7cc8b5be93 | ||
|
|
b095835e62 | ||
|
|
8cc46723f0 | ||
|
|
4f52add246 | ||
|
|
867ab92be8 | ||
|
|
e36ebca88c | ||
|
|
e854868514 | ||
|
|
4ec129a695 | ||
|
|
99e8432ea7 | ||
|
|
31b3e6c670 | ||
|
|
459485c83b | ||
|
|
5a14c5373b | ||
|
|
0c25c114d0 | ||
|
|
23edcd62d9 | ||
|
|
7db829566c | ||
|
|
7feea057bc | ||
|
|
52da9be2fc | ||
|
|
fb33d84784 | ||
|
|
506e4d5dac | ||
|
|
b16b5d5e6c | ||
|
|
96c2a69872 | ||
|
|
9bcbb2c851 | ||
|
|
d0b56ba0d1 | ||
|
|
a72cbd4811 | ||
|
|
0c69a922a5 | ||
|
|
285fc7aaa9 | ||
|
|
d04eb1a4a7 | ||
|
|
00a1adaf82 | ||
|
|
ec93e7cc0d | ||
|
|
f4f23b4814 | ||
|
|
8002d58294 | ||
|
|
222789a438 | ||
|
|
6ede9e8871 | ||
|
|
178d254bf8 | ||
|
|
8f01e046e0 | ||
|
|
99a9433c92 | ||
|
|
9ff75ba4b5 | ||
|
|
e90f40671d | ||
|
|
6ee61ae682 | ||
|
|
669b56c5f9 | ||
|
|
f42f6a165d | ||
|
|
586f3746ad | ||
|
|
f134ee8f26 | ||
|
|
e036ae13aa | ||
|
|
3d27008b40 | ||
|
|
2aa6092938 | ||
|
|
3e036b221f | ||
|
|
2d2865213e | ||
|
|
9497074b72 | ||
|
|
19a18e34a5 | ||
|
|
e72ffbf7d0 | ||
|
|
a0c547c510 | ||
|
|
761c93541b | ||
|
|
9d73267f8b | ||
|
|
a6a38ef099 | ||
|
|
c997a099dc | ||
|
|
46044e21fc | ||
|
|
04648a7ac6 | ||
|
|
babbb28d07 | ||
|
|
64a98b4712 | ||
|
|
6291f35dca | ||
|
|
fcf81210fe | ||
|
|
89271cd829 | ||
|
|
1f8810ad22 | ||
|
|
034961e472 | ||
|
|
831175383f | ||
|
|
17788948fd | ||
|
|
05a6149cd1 | ||
|
|
56c72397c1 | ||
|
|
48df62ac7b | ||
|
|
1da5d7aab5 | ||
|
|
143a3f1996 | ||
|
|
9857d683cf | ||
|
|
a184ca666e | ||
|
|
61b86011cc | ||
|
|
fac5ed82bb | ||
|
|
5e5d0b4308 | ||
|
|
67dab486e3 | ||
|
|
7ed3cc17a1 | ||
|
|
d94bdc362d | ||
|
|
67ba57b994 | ||
|
|
e326cf1f55 | ||
|
|
9410f2586a | ||
|
|
8a06fa7b2c | ||
|
|
d40905e60b | ||
|
|
5a850b066a | ||
|
|
dff04e7289 | ||
|
|
a053a01777 | ||
|
|
c90615b313 | ||
|
|
8134ef2516 | ||
|
|
b3b85f65fd | ||
|
|
c71a44d7f1 | ||
|
|
d671d5fc8b | ||
|
|
a6dfe82012 | ||
|
|
202ff931bd | ||
|
|
a8e6cb1710 | ||
|
|
4e8670dcfa | ||
|
|
8c3735fd6e | ||
|
|
f4f7963fff | ||
|
|
6e5de10982 | ||
|
|
427f890aa1 | ||
|
|
3607bc86e9 | ||
|
|
d7dc92ff4a | ||
|
|
19453c366a | ||
|
|
8779b59856 | ||
|
|
00afdc8f0a | ||
|
|
f84c90dbf7 | ||
|
|
f06cc9b112 | ||
|
|
eb1f4a4a4e | ||
|
|
72485b4ab9 | ||
|
|
9f3b8d7416 | ||
|
|
a6f4458327 | ||
|
|
492a64ffb4 | ||
|
|
58bf9d0050 | ||
|
|
3dbf097447 | ||
|
|
def72781e7 | ||
|
|
ae749f9b25 | ||
|
|
4a7a8b204f | ||
|
|
b29694352d | ||
|
|
15bdd4951d | ||
|
|
7b949beaac | ||
|
|
cf84815c54 | ||
|
|
698fd5f5f2 | ||
|
|
f0a3cf91ad | ||
|
|
f106c220e3 | ||
|
|
8502f94796 | ||
|
|
61e30c8dbe | ||
|
|
4a138c52a6 | ||
|
|
2ef7f2a91d | ||
|
|
4d16c8c2cc | ||
|
|
63649d631f | ||
|
|
87c0493629 | ||
|
|
09d107514b | ||
|
|
8cf11b7167 | ||
|
|
0c7c690af1 | ||
|
|
499dcfb026 | ||
|
|
cf2e255253 | ||
|
|
446facac7e | ||
|
|
bf8bd66b85 | ||
|
|
db814b24de | ||
|
|
5c309c0321 | ||
|
|
0e2c0cb3b5 | ||
|
|
5b1fc1317d | ||
|
|
dc1d009dad | ||
|
|
dcfa2eeada | ||
|
|
4b5d7459f4 | ||
|
|
5da70389cc | ||
|
|
c4b6b382ad | ||
|
|
f8b0290497 | ||
|
|
c4d579a301 | ||
|
|
f05c9703c5 | ||
|
|
966a94483a | ||
|
|
8f1ef4dc7e | ||
|
|
67d29e2a89 | ||
|
|
d9f873a399 | ||
|
|
55afb5b471 | ||
|
|
f8cfb45fa2 | ||
|
|
4875195a90 | ||
|
|
3d6b1c9b7c | ||
|
|
999e1c895e | ||
|
|
ecb6a02a46 | ||
|
|
a0c42b0053 | ||
|
|
c429617241 | ||
|
|
38de1f36f2 | ||
|
|
c46a1c7e26 | ||
|
|
7e63f5d911 | ||
|
|
67166d2b25 | ||
|
|
fa8967084c | ||
|
|
8ef80e4f0d | ||
|
|
645034f0af | ||
|
|
7bedfeca11 | ||
|
|
fd2bbcb344 | ||
|
|
8a31e47e7b | ||
|
|
f557e5222c | ||
|
|
5b2b5eb799 | ||
|
|
c1aa8bfa1d | ||
|
|
a5859f0077 | ||
|
|
b386c5d952 | ||
|
|
7c0874b7b3 | ||
|
|
821236713c | ||
|
|
d0ed71cf8f | ||
|
|
a02e127a42 | ||
|
|
43f1e688e1 | ||
|
|
ec853d63f1 | ||
|
|
43b3e253b6 | ||
|
|
abed0e85dd | ||
|
|
3398d39e11 | ||
|
|
510f9f14b1 | ||
|
|
3c8104554a | ||
|
|
ce55f3db03 | ||
|
|
5da77df064 | ||
|
|
f3c3b00367 | ||
|
|
32398ece08 | ||
|
|
bf3eda9a10 | ||
|
|
4de7b17f57 | ||
|
|
8165380828 | ||
|
|
11465a2190 | ||
|
|
dc27ac30e9 | ||
|
|
478b4025a7 | ||
|
|
037da98f84 | ||
|
|
5dadee4a3a | ||
|
|
aea786945f | ||
|
|
fb93f70776 | ||
|
|
d5acaec0ba | ||
|
|
cbd022aed3 | ||
|
|
80617aada2 | ||
|
|
bd62cf7b8b | ||
|
|
3241623df2 | ||
|
|
3b89905b0b | ||
|
|
b929880b7a | ||
|
|
f5ea57d30c | ||
|
|
42a386c38a | ||
|
|
faf2742b68 | ||
|
|
c227b0ec34 | ||
|
|
0a767cef46 | ||
|
|
e37efe0ce0 | ||
|
|
b5b797bab5 | ||
|
|
dbdb0601f3 | ||
|
|
fbd6a41acf | ||
|
|
21fe0d1b25 | ||
|
|
2bafd745b7 | ||
|
|
8eaef01fb7 | ||
|
|
58bbec13fe | ||
|
|
6bd1423e57 | ||
|
|
2e92a69c4d | ||
|
|
e67d711db3 | ||
|
|
9900189039 | ||
|
|
0a30b0b091 | ||
|
|
a480902ce6 | ||
|
|
7c413fa9b2 | ||
|
|
35e1dd482e | ||
|
|
4da06c2b26 | ||
|
|
9f0f41554b | ||
|
|
546e3dd993 | ||
|
|
4d1368ea62 | ||
|
|
f40382b6d1 | ||
|
|
b3ec72ac6c | ||
|
|
a9aa0c32e8 | ||
|
|
4780045b21 | ||
|
|
6294795ab5 | ||
|
|
8911edde23 | ||
|
|
b6b3266a3e | ||
|
|
2d75d69b1e | ||
|
|
3dad000a72 | ||
|
|
5e5fc139de | ||
|
|
6db56c17a7 | ||
|
|
f831af9f88 | ||
|
|
c181c821c1 | ||
|
|
8962d5c1ad | ||
|
|
71ca1ebd4b | ||
|
|
1bfcccaaec | ||
|
|
1ed3d03e5b | ||
|
|
b14c36ce16 | ||
|
|
fe10a5870c | ||
|
|
3c8988afe2 | ||
|
|
3e7057e189 | ||
|
|
b10bc5209c | ||
|
|
49a2d392ad | ||
|
|
8f4c2a21b9 | ||
|
|
ab3bece353 | ||
|
|
e84081c42c | ||
|
|
d50b295bc7 | ||
|
|
725b1eea0c | ||
|
|
2785af1829 | ||
|
|
723fbdce2a | ||
|
|
31a3290a7b | ||
|
|
27ab36b3ce | ||
|
|
94f5713f89 | ||
|
|
4675ebf883 | ||
|
|
5478611712 | ||
|
|
395bc26bb1 | ||
|
|
df0ac93042 | ||
|
|
1a616bc084 | ||
|
|
e6f0c7f004 | ||
|
|
10f1ffbe4e | ||
|
|
ae5f41df8c | ||
|
|
026cabbc16 | ||
|
|
e960e95e06 | ||
|
|
d80c3c6092 | ||
|
|
28d917645d | ||
|
|
f4c15159d1 | ||
|
|
826fb5f4dd | ||
|
|
6c338a5dd4 | ||
|
|
6aa4d5a6d8 | ||
|
|
abd55bd413 | ||
|
|
a1d439104e | ||
|
|
087165af50 | ||
|
|
d0daec7694 | ||
|
|
de2eff8ce6 | ||
|
|
195a1d460d | ||
|
|
a7f9c41667 | ||
|
|
eed93b27b4 | ||
|
|
92853d3f5e | ||
|
|
47c52e3ef7 | ||
|
|
4c4240e3c8 | ||
|
|
2d35cdc95a | ||
|
|
30f28a4941 | ||
|
|
b1d93bb65f | ||
|
|
8f0f4e7106 | ||
|
|
45a1f53627 | ||
|
|
f3e003dfd6 | ||
|
|
ace4a8314b | ||
|
|
780a912b57 | ||
|
|
ad0040260e | ||
|
|
34631c0668 | ||
|
|
d4ee80b802 | ||
|
|
efd0842832 | ||
|
|
78c9c2a40c | ||
|
|
746927e826 | ||
|
|
1089e784db | ||
|
|
bfd7c20187 | ||
|
|
c955e7016c | ||
|
|
0ead6bdffb | ||
|
|
352c573251 | ||
|
|
4b20cd2dee | ||
|
|
d7b59ba7e1 | ||
|
|
d79cb21929 | ||
|
|
4db6925d38 | ||
|
|
30047204e1 | ||
|
|
76154527ef | ||
|
|
8879a71b51 | ||
|
|
a3dac13b53 | ||
|
|
5c8e207a57 | ||
|
|
8aae62c071 | ||
|
|
84f60ce32f | ||
|
|
64c1ae7656 | ||
|
|
ca3fbd9a89 | ||
|
|
a54d30684d | ||
|
|
cd21fd3e73 | ||
|
|
2d4edcfc21 | ||
|
|
2611a72508 | ||
|
|
c4b597c409 | ||
|
|
92dfebc1d4 | ||
|
|
0eb5036b11 | ||
|
|
52c854661a | ||
|
|
f160760526 | ||
|
|
68d5b27194 | ||
|
|
e37950d54b | ||
|
|
8f0670265b | ||
|
|
a0e2cfc6cf | ||
|
|
b0b03d00d4 | ||
|
|
66826caf94 | ||
|
|
9281f18ecb | ||
|
|
82778173bb | ||
|
|
8fe222ba4b | ||
|
|
88775a9bdb | ||
|
|
c2b9333e29 | ||
|
|
29fdd4a222 | ||
|
|
8650c0dd09 | ||
|
|
c5c1645054 | ||
|
|
4ce4dd0a3c | ||
|
|
3503c2314d | ||
|
|
9e8e1788fb | ||
|
|
d484770b2f | ||
|
|
e6cb2bf706 | ||
|
|
110c909c50 | ||
|
|
ee58c2b938 | ||
|
|
5160f82b65 | ||
|
|
9f21513075 | ||
|
|
8505c995ed | ||
|
|
5712a7e111 | ||
|
|
374a6a1ddf | ||
|
|
208e6de3e4 | ||
|
|
87231fdb1f | ||
|
|
760db2bb82 | ||
|
|
b1ffe2afde | ||
|
|
7640fe085b | ||
|
|
dd901c005d | ||
|
|
7808526ee7 | ||
|
|
c94fe15ced | ||
|
|
ce5cb61eb4 | ||
|
|
cc87206dbc | ||
|
|
708342d09b | ||
|
|
464c5d5663 | ||
|
|
60bd0b1dff | ||
|
|
40efa96ba1 | ||
|
|
fe3a637255 | ||
|
|
a8db0542d7 | ||
|
|
c2d9aa6d06 | ||
|
|
476bc5c74d | ||
|
|
1ae5558c65 | ||
|
|
8abfcb0e55 | ||
|
|
06240d2b09 | ||
|
|
d9701c366d | ||
|
|
c33eb0e6f2 | ||
|
|
5f116d6984 | ||
|
|
d84400e89b | ||
|
|
0bbb816f3f | ||
|
|
3400df5fd4 | ||
|
|
9e44eddddf | ||
|
|
4dad5e1ab2 | ||
|
|
627b4e15cb | ||
|
|
ed9ac12226 | ||
|
|
195dca851c | ||
|
|
8589cbe29a | ||
|
|
ea63a41b47 | ||
|
|
76986d7803 | ||
|
|
cbdc4a8b65 | ||
|
|
3ca0ba0f11 | ||
|
|
3d805694bc | ||
|
|
26d3d1e7a7 | ||
|
|
6ce2044471 | ||
|
|
6f99497129 | ||
|
|
ba92b068d8 | ||
|
|
18a7fead0b | ||
|
|
111e10b434 | ||
|
|
934c2b0a78 | ||
|
|
c50141a411 | ||
|
|
5c339ccdfa | ||
|
|
54f71407ad | ||
|
|
3fe0c5ab05 | ||
|
|
b86cb09212 | ||
|
|
a77aff56aa | ||
|
|
fff005a6a1 | ||
|
|
e686914023 | ||
|
|
97ab7c1204 | ||
|
|
12873f180c | ||
|
|
941641f917 | ||
|
|
797342111f | ||
|
|
199a75971f | ||
|
|
3ea9d7e23e | ||
|
|
f478cb6606 | ||
|
|
99be5be77d | ||
|
|
0b0bd5729c | ||
|
|
9e10f2b77c | ||
|
|
18d2614b13 | ||
|
|
26177d03d4 | ||
|
|
af7e1c72a4 | ||
|
|
bd65a54b2c | ||
|
|
d4c11d65e6 | ||
|
|
6bbc40ef41 | ||
|
|
26f96dd6b1 | ||
|
|
d2f1b25b67 | ||
|
|
afe315af26 | ||
|
|
c84bb0fbdc | ||
|
|
f45692df45 | ||
|
|
7bcf923c64 | ||
|
|
1ddf31185c | ||
|
|
1b290214f6 | ||
|
|
07e4320b23 | ||
|
|
433ff4476f | ||
|
|
900ff5ce83 | ||
|
|
edbf34a2e3 | ||
|
|
f55b55e406 | ||
|
|
9282baa7fa | ||
|
|
30ecf5b154 | ||
|
|
25fddf63db | ||
|
|
59d1e952d5 | ||
|
|
a6dafbff38 | ||
|
|
b3b46e6724 | ||
|
|
7291113d2f | ||
|
|
d0bc1c1508 | ||
|
|
2c5026145d | ||
|
|
729d644e8b | ||
|
|
5364c2571a | ||
|
|
f0c1efb4b1 | ||
|
|
39ff23507b | ||
|
|
f4514c087b | ||
|
|
4f5cea34b3 | ||
|
|
19e3b730db | ||
|
|
d8e4916bbc | ||
|
|
9039ece985 | ||
|
|
7ef72ab71e | ||
|
|
01248798a7 | ||
|
|
16db054fb9 | ||
|
|
fd104efd54 | ||
|
|
9f2343075a | ||
|
|
ba709d089c | ||
|
|
f2c152a3fc | ||
|
|
872d05f47a | ||
|
|
b9159b8e15 | ||
|
|
e67e0fbb82 | ||
|
|
af65ba44ab | ||
|
|
a93b78de4f | ||
|
|
585b2fcf85 | ||
|
|
fa608965ba | ||
|
|
fee4c0c28f | ||
|
|
63ce994265 | ||
|
|
214ced7029 | ||
|
|
fffb87b45f | ||
|
|
8099941802 | ||
|
|
5f4b48eba7 | ||
|
|
92249196a4 | ||
|
|
458b03dd0c | ||
|
|
82bfdc6c3c | ||
|
|
8d354eee32 | ||
|
|
38c5ae5e25 | ||
|
|
77625d872f | ||
|
|
091a2761cf | ||
|
|
dff68edcbb | ||
|
|
2ffc1d06cf | ||
|
|
2fe8814dce | ||
|
|
9ee83ea972 | ||
|
|
7879070993 | ||
|
|
0af394b0ed | ||
|
|
53397bcdbf | ||
|
|
36bde01ed9 | ||
|
|
0df2fcbee3 | ||
|
|
721a351708 | ||
|
|
057c45869a | ||
|
|
fa6ccb5cde | ||
|
|
1384f7495c | ||
|
|
c3be9537bd | ||
|
|
c41730e9a4 | ||
|
|
cb2aa2c46a | ||
|
|
dcbe39d228 | ||
|
|
edf03dbb5d | ||
|
|
f2508c5823 | ||
|
|
66fad244d9 | ||
|
|
fcb6bbf956 | ||
|
|
41dc57f1ac | ||
|
|
0c484a0092 | ||
|
|
610631133a | ||
|
|
7f2d6942dc | ||
|
|
f1d34435e5 | ||
|
|
ecc1500d50 | ||
|
|
22fe4f6373 | ||
|
|
2f21766b4f | ||
|
|
6fe2cafabb | ||
|
|
975e4599d1 | ||
|
|
071666f0fe | ||
|
|
7940cffc3c | ||
|
|
93b1a3a69d | ||
|
|
4c8c8d5ab8 | ||
|
|
aa426ef1da | ||
|
|
0563fbe718 | ||
|
|
a61fd5656e | ||
|
|
4718b60941 | ||
|
|
61f8d7fea4 | ||
|
|
af674d4324 | ||
|
|
905db58f57 | ||
|
|
b16720420d | ||
|
|
74f84fe07b | ||
|
|
cdd570fae0 | ||
|
|
65b407e744 | ||
|
|
37f54ace01 | ||
|
|
77fbf07625 | ||
|
|
7bcc4469cc | ||
|
|
9f485e897a | ||
|
|
5274499468 | ||
|
|
99ac6ffbad | ||
|
|
192e143b5c | ||
|
|
6fc8928032 | ||
|
|
d06b22878c | ||
|
|
117153324f | ||
|
|
505b41fbd6 | ||
|
|
8c21b368bd | ||
|
|
961993ae2b | ||
|
|
047279fe16 | ||
|
|
ebce7fab92 | ||
|
|
8975cdf0f6 | ||
|
|
39170c953c | ||
|
|
b6e200f635 | ||
|
|
a183f874b4 | ||
|
|
f3be7e21c9 | ||
|
|
920847b105 | ||
|
|
e3aef2c7f2 | ||
|
|
2fb2334e1d | ||
|
|
31935a80b9 | ||
|
|
e303901262 | ||
|
|
5883f4123e | ||
|
|
38b46442aa | ||
|
|
93faabe2f5 | ||
|
|
f9b623b538 | ||
|
|
22113c33ed | ||
|
|
55a0e44d79 | ||
|
|
66093030c2 | ||
|
|
4d30281c5b | ||
|
|
b9d07f88c8 | ||
|
|
fcc4518cb1 | ||
|
|
8fee098a0a | ||
|
|
29c6d31eca | ||
|
|
914f1bc4fd | ||
|
|
22e6340ba9 | ||
|
|
1552fa3ba9 | ||
|
|
7dbc4146a5 | ||
|
|
dd4e0e1260 | ||
|
|
e4398f80df | ||
|
|
ac0ca2966a | ||
|
|
66fd58a69d | ||
|
|
9d3378bc93 | ||
|
|
ff72b0f104 | ||
|
|
813f299ad1 | ||
|
|
5ff593ee0a | ||
|
|
2237b065c3 | ||
|
|
7a667e6f2b | ||
|
|
04e043cf9d | ||
|
|
6ce01389c8 | ||
|
|
15555a9304 | ||
|
|
375574a901 | ||
|
|
7cc8089813 | ||
|
|
26aa5377c5 | ||
|
|
7a3e6ceb8f | ||
|
|
57ceab5d13 | ||
|
|
27445b1bba | ||
|
|
a0f8e79c85 | ||
|
|
e86d35858c | ||
|
|
3031392f89 | ||
|
|
c79fc16b0a | ||
|
|
252ead5945 | ||
|
|
0d7f0ad424 | ||
|
|
22d951a7b2 | ||
|
|
3feed4ee0f | ||
|
|
cbdbae2c57 | ||
|
|
c58c7140d0 | ||
|
|
f0aa42b8f3 | ||
|
|
05e92437c8 | ||
|
|
eda06af5c4 | ||
|
|
5d8cdf3bb6 | ||
|
|
e98d1babd2 | ||
|
|
7a87dd25d2 | ||
|
|
7bcee2b1b6 | ||
|
|
57a9d329ba | ||
|
|
8936a026df | ||
|
|
727d05f861 | ||
|
|
d6201819c1 | ||
|
|
e1a89b5d78 | ||
|
|
b15eca92a4 | ||
|
|
08a7208cc4 | ||
|
|
9c0019087b | ||
|
|
349a869311 | ||
|
|
02d6343d8e | ||
|
|
3880e8bc0f | ||
|
|
570c6cf82c | ||
|
|
1a7e06f480 | ||
|
|
70aa2ef31e | ||
|
|
a251149452 | ||
|
|
9d1e81b492 | ||
|
|
4ac2f5a134 | ||
|
|
c6b293d4bd | ||
|
|
2e7adce3db | ||
|
|
30965d9bdf | ||
|
|
19e82479e4 | ||
|
|
6d7492cebe | ||
|
|
6f5d6c6ee7 | ||
|
|
e887776b57 | ||
|
|
6f1b930a54 | ||
|
|
6618bc07cb | ||
|
|
9fefb8fe7e | ||
|
|
1b70874b25 | ||
|
|
54f35593d3 | ||
|
|
d2244a049c | ||
|
|
a64d93f2e6 | ||
|
|
1188f2532e | ||
|
|
f32f109095 | ||
|
|
f20a2d8146 | ||
|
|
d6ca31c7b1 | ||
|
|
adac56a1c1 | ||
|
|
f01a37a883 | ||
|
|
3c7983bf65 | ||
|
|
c0a7716606 | ||
|
|
04b2f02a13 | ||
|
|
47c22cb822 | ||
|
|
c01c66c8ca | ||
|
|
00bd53dd3a | ||
|
|
d9ba2bc1c5 | ||
|
|
8790f07496 | ||
|
|
7381b11f0f | ||
|
|
5b668855f3 | ||
|
|
7c187894b3 | ||
|
|
6818260611 | ||
|
|
0f96320a9b | ||
|
|
73bfdcb4c3 | ||
|
|
835502ba9f | ||
|
|
6f395305bf | ||
|
|
6a70b457de | ||
|
|
82d8c9a826 | ||
|
|
1c884e1b1b | ||
|
|
da306f69ea | ||
|
|
fd7897694c | ||
|
|
0eddd90703 | ||
|
|
0da9b78a13 | ||
|
|
3c44b2580d | ||
|
|
82b11cd362 | ||
|
|
0369ac26db | ||
|
|
1f17f126d0 | ||
|
|
cb60468d0e | ||
|
|
05d923b924 | ||
|
|
f52201095f | ||
|
|
cbc608e3dd | ||
|
|
845019c1c3 | ||
|
|
c5fa3901e1 | ||
|
|
769e12aac1 | ||
|
|
40f8cf4984 | ||
|
|
916129957e | ||
|
|
5086a196f8 | ||
|
|
28a466a5d4 | ||
|
|
4370c8d923 | ||
|
|
85b51faa89 | ||
|
|
f71db402d3 | ||
|
|
ce01784c46 | ||
|
|
502239ac2e | ||
|
|
397cde8383 | ||
|
|
164203adab | ||
|
|
829f03e68c | ||
|
|
c228161701 | ||
|
|
9fa1d90c15 | ||
|
|
9fa78fa280 | ||
|
|
864dca4525 | ||
|
|
0e9ef44843 | ||
|
|
86eaa9178e | ||
|
|
01a10159ff | ||
|
|
58e8f0fd71 | ||
|
|
016eb5a75c | ||
|
|
e78cc0cbe5 | ||
|
|
f1f928dd39 | ||
|
|
0c403ae92b | ||
|
|
6f66cc7503 | ||
|
|
1365cea288 | ||
|
|
be19bc7005 | ||
|
|
f47e6c9acb | ||
|
|
3982ed8b04 | ||
|
|
0a50030333 | ||
|
|
4ec69ad495 | ||
|
|
b3cd8f7a88 | ||
|
|
6b873efacf | ||
|
|
2c16718a9c | ||
|
|
01c843cde1 | ||
|
|
4922c3cb2b | ||
|
|
bb6a28867e | ||
|
|
741680265a | ||
|
|
efcec7ac90 | ||
|
|
aae44c489e | ||
|
|
70e733a7b5 | ||
|
|
39c459c04c | ||
|
|
94f7cb748d | ||
|
|
6803ec7670 | ||
|
|
815bee9dcc | ||
|
|
3884316d22 | ||
|
|
4106c48877 | ||
|
|
dfd9282d01 | ||
|
|
5c32b8e240 | ||
|
|
3cd4954d6c | ||
|
|
2503ee1947 | ||
|
|
09cf11a5fc | ||
|
|
e98949990a | ||
|
|
5f78476130 | ||
|
|
3c424b63ff | ||
|
|
745a22a8e2 | ||
|
|
6b96dfe939 | ||
|
|
fd76ce7ac1 | ||
|
|
d98b1ae982 | ||
|
|
8a9e591316 | ||
|
|
2a8c3cd45f | ||
|
|
8c400f9168 | ||
|
|
3dbc129e46 | ||
|
|
99fc7cf835 | ||
|
|
54e7daea44 | ||
|
|
aa39a450e4 | ||
|
|
89a564c2dd | ||
|
|
c80ef26ad5 | ||
|
|
512e30a84b | ||
|
|
2491c8e906 | ||
|
|
1df841804a | ||
|
|
fe66924093 | ||
|
|
3f9b98d32c | ||
|
|
aecc216dc1 | ||
|
|
165df7ee8a | ||
|
|
c6839f602a | ||
|
|
5fd231cf2f | ||
|
|
a634abfbef | ||
|
|
31a496e6b3 | ||
|
|
ea52e27e77 | ||
|
|
18edb3aebc | ||
|
|
cce0956e6e | ||
|
|
a41dac0467 | ||
|
|
4a8896a16c | ||
|
|
bec0762630 | ||
|
|
20a6f55368 | ||
|
|
71a0c5e638 | ||
|
|
df0324f904 | ||
|
|
b8e464e299 | ||
|
|
c8cb33b723 | ||
|
|
5acedc6aac | ||
|
|
40b6043eed | ||
|
|
724b52c538 | ||
|
|
8b89646069 | ||
|
|
57564bcc1c | ||
|
|
f7d5efd4ae | ||
|
|
f29d9e15c8 | ||
|
|
a4c6fc3175 | ||
|
|
41ca00537a | ||
|
|
b571982b11 | ||
|
|
7d31bbe3d0 | ||
|
|
76af1c2d14 | ||
|
|
9a68f2ec8a | ||
|
|
f1e49518e9 | ||
|
|
ae4e5e3e78 | ||
|
|
2cd8f476b6 | ||
|
|
badf483642 | ||
|
|
2af7808ccc | ||
|
|
cb6cf2e19f | ||
|
|
2ea4771df4 | ||
|
|
567a0ba434 | ||
|
|
5374862df7 | ||
|
|
6a5d923739 | ||
|
|
fb6fee0ae2 | ||
|
|
a90dfd3037 | ||
|
|
9654b024b2 | ||
|
|
14abe686a4 | ||
|
|
d1a7c2fd17 | ||
|
|
de30d29b53 | ||
|
|
2645898031 | ||
|
|
d6fc0e005f | ||
|
|
ebcb526f60 | ||
|
|
2900c27c70 | ||
|
|
7a85950d29 | ||
|
|
e98fd640fa | ||
|
|
0ad5cc6fd3 | ||
|
|
312f09a06e | ||
|
|
b007cd13df | ||
|
|
ab6624266c | ||
|
|
01bec4be03 | ||
|
|
69371730b2 | ||
|
|
f04f01bdba | ||
|
|
52f1b5d0ed | ||
|
|
7f44ee66fd | ||
|
|
407d8d4baa | ||
|
|
8440693bbd | ||
|
|
dc1bfcb1bb | ||
|
|
9c0f4324da | ||
|
|
22855cf70e | ||
|
|
bd5de25e4b | ||
|
|
e6d8b3c6c8 | ||
|
|
e91b292d8b | ||
|
|
a558bbdfe5 | ||
|
|
9781699c2b | ||
|
|
2e48b7c427 | ||
|
|
fe9df9d2c5 | ||
|
|
07569481f1 | ||
|
|
ac52cd0d59 | ||
|
|
c452f12eb9 | ||
|
|
571babf236 | ||
|
|
296de1c452 | ||
|
|
394917d3ff | ||
|
|
20fc23d183 | ||
|
|
af9f54b06a | ||
|
|
d66067c1f1 | ||
|
|
f8e1535a52 | ||
|
|
4f10fa559a | ||
|
|
eb769a93a1 | ||
|
|
b1cbf09a50 | ||
|
|
b7a1d77fc1 | ||
|
|
3f4a61090f | ||
|
|
c2d156cc16 | ||
|
|
6a472a0092 | ||
|
|
e71a1f5d69 | ||
|
|
13f0c0ba15 | ||
|
|
5b88c90de0 | ||
|
|
05e9e882f0 | ||
|
|
196c1b112e | ||
|
|
0568882c64 | ||
|
|
aff3830463 | ||
|
|
f701080b71 | ||
|
|
92c9a5c1c2 | ||
|
|
b26d8f71f6 | ||
|
|
bce382fcc1 | ||
|
|
e2ca682872 | ||
|
|
b148035c40 | ||
|
|
7a9acdb7c1 | ||
|
|
8d8bb29f13 | ||
|
|
602b4f06ef | ||
|
|
2d45ddf2be | ||
|
|
d37554d317 | ||
|
|
e95360fc81 | ||
|
|
be95736987 | ||
|
|
b4d98ab335 | ||
|
|
979128036c | ||
|
|
3dcf5d23c4 | ||
|
|
a74a7c7b1d | ||
|
|
d982651545 | ||
|
|
664c0e7751 | ||
|
|
18ad905525 | ||
|
|
769fa6b534 | ||
|
|
8a06bea864 | ||
|
|
0c55497fb3 | ||
|
|
636e396303 | ||
|
|
3c0a4c9372 | ||
|
|
e7b02865fc | ||
|
|
99b451ac8e | ||
|
|
145c1bb2d2 | ||
|
|
33d69091f8 | ||
|
|
48fa10a21b | ||
|
|
6e0c8efbf4 | ||
|
|
db27bfd8f2 | ||
|
|
2a43a20531 | ||
|
|
958c7107ce | ||
|
|
d734a5063c | ||
|
|
9ca98d43ee | ||
|
|
211d3f9ac7 | ||
|
|
b5e1cfb4fa | ||
|
|
72cff8560b | ||
|
|
1caf337e60 | ||
|
|
b279d2ef2b | ||
|
|
2fec5f513e | ||
|
|
65cca6165c | ||
|
|
75c1c0d478 | ||
|
|
9d4ef66fa5 | ||
|
|
80adcac8b8 | ||
|
|
69aca8781d | ||
|
|
4a8944cc83 | ||
|
|
0297cb2187 | ||
|
|
69131b57f7 | ||
|
|
9c700ae28f | ||
|
|
b90376286c | ||
|
|
b3992b98a9 | ||
|
|
4baae80558 | ||
|
|
fda3bf95f1 | ||
|
|
9e54a0e47e | ||
|
|
c14ad320e3 | ||
|
|
e544551627 | ||
|
|
ba6160f7e2 | ||
|
|
9e4ebbf29d | ||
|
|
5c02f3702b | ||
|
|
01ff6c00be | ||
|
|
b45557e366 | ||
|
|
8b5e387806 | ||
|
|
2296fe413b | ||
|
|
6135040b52 | ||
|
|
158e3ae50e | ||
|
|
5e29b75f20 | ||
|
|
c77259734a | ||
|
|
775eba0b0b | ||
|
|
de8c4a6fc7 | ||
|
|
a792483409 | ||
|
|
271b24ade6 | ||
|
|
185f4174d8 | ||
|
|
dc0d258b3f | ||
|
|
d6800add0c | ||
|
|
952e264949 | ||
|
|
0a832e3c4b | ||
|
|
15c1d01b29 | ||
|
|
555cd377ac | ||
|
|
b4178e1e49 | ||
|
|
31aba06df6 | ||
|
|
6e8e9dfe52 | ||
|
|
91441487ed | ||
|
|
faa7a42ed1 | ||
|
|
41c95db700 | ||
|
|
408eb40cc9 | ||
|
|
ac4811c507 | ||
|
|
a53adf001f | ||
|
|
23ae3efec1 | ||
|
|
25900aab78 | ||
|
|
58b712cda4 | ||
|
|
6a53c29da5 | ||
|
|
a7ab45c070 | ||
|
|
e7c90dbe7e | ||
|
|
cd8aef1c06 | ||
|
|
55b6b0c94a | ||
|
|
d74989f048 | ||
|
|
5b458e177d | ||
|
|
a03563f3ed | ||
|
|
32f80734fb | ||
|
|
4d62b19ebe | ||
|
|
7ddfd8d394 | ||
|
|
f1231284d6 | ||
|
|
f8d5828960 | ||
|
|
4bba3674f6 | ||
|
|
392411fbbc | ||
|
|
920484cbd6 | ||
|
|
0f3ca3bc4e | ||
|
|
c31eb17b14 | ||
|
|
252752e5d4 | ||
|
|
42e76152b6 | ||
|
|
f31c158bf3 | ||
|
|
5b10416a14 | ||
|
|
661c393ab3 | ||
|
|
a533a2c845 | ||
|
|
9b0130e3a7 | ||
|
|
18406063a9 | ||
|
|
04fe86fe28 | ||
|
|
143f583ea5 | ||
|
|
75bf4c48a2 | ||
|
|
6c09a8a464 | ||
|
|
85fefcb74b | ||
|
|
f56d427d0d | ||
|
|
5d6a962a36 | ||
|
|
9d4bd598f8 | ||
|
|
f557ad2d86 | ||
|
|
ff40e53f99 | ||
|
|
a084f65663 | ||
|
|
aa73246705 | ||
|
|
e40058b688 | ||
|
|
44f563d94e | ||
|
|
6da2c9de38 | ||
|
|
0ec0d2444c | ||
|
|
bd925ea426 | ||
|
|
8ea705ba54 | ||
|
|
b7327e5613 | ||
|
|
2dd0c6dfe1 | ||
|
|
11df20b022 | ||
|
|
2226b3733b | ||
|
|
ad69011405 | ||
|
|
f091321ac7 | ||
|
|
ca29a77dd2 | ||
|
|
bfbb21228e | ||
|
|
f18f98f3ea | ||
|
|
354db2f937 | ||
|
|
3a52cbb083 | ||
|
|
37ec666235 | ||
|
|
a8bad5b96f | ||
|
|
f01a900c3d | ||
|
|
cab34aa178 | ||
|
|
c685f3c081 | ||
|
|
75840e02a4 | ||
|
|
40412844ed | ||
|
|
565fb6fcb2 | ||
|
|
dde67c0626 | ||
|
|
ff312a5b1d | ||
|
|
afcfd6caa8 | ||
|
|
41e5b2665a | ||
|
|
7d8e50d5c8 | ||
|
|
327d38f356 | ||
|
|
e0e4385e35 | ||
|
|
ec9ef47eb6 | ||
|
|
b8e09562b1 | ||
|
|
8d0b8d17a0 | ||
|
|
befcbf25c8 | ||
|
|
b818df0599 | ||
|
|
ac37668cd6 | ||
|
|
bace1def3d | ||
|
|
9715c28362 | ||
|
|
0d2fb84436 | ||
|
|
2e729a3394 | ||
|
|
ac8957511b | ||
|
|
f4adb2fab0 | ||
|
|
97ae55bc1f | ||
|
|
9ab95599ab | ||
|
|
b967fbd71a | ||
|
|
eca0aeb263 | ||
|
|
7f56764456 | ||
|
|
bdfc9cf3c7 | ||
|
|
3f27a09ffa | ||
|
|
0de774d55e | ||
|
|
58eceb751a | ||
|
|
27e24ee0be | ||
|
|
65710e72bb | ||
|
|
b73b7e9c61 | ||
|
|
4b5e0d70b8 | ||
|
|
3ffcd119f7 | ||
|
|
12134cff51 | ||
|
|
55634c2b4d | ||
|
|
ca9913726e | ||
|
|
662527611f | ||
|
|
d0666073b6 | ||
|
|
decf828911 | ||
|
|
8903d4553a | ||
|
|
281af87870 | ||
|
|
bbf3cc1c6c | ||
|
|
22dc407215 | ||
|
|
a86910bc6e | ||
|
|
ad0161d8e7 | ||
|
|
ed9d612e23 | ||
|
|
fb6a398380 | ||
|
|
77c480cf89 | ||
|
|
c09b2a01d5 | ||
|
|
2aea462902 | ||
|
|
d4d686b9d1 | ||
|
|
74c4e9613b | ||
|
|
c3eb1db619 | ||
|
|
3e51259802 | ||
|
|
16622b5649 | ||
|
|
b82cf2a0e1 | ||
|
|
252ea72212 | ||
|
|
06839ecf21 | ||
|
|
446f80d5fd | ||
|
|
4f1f6fb229 | ||
|
|
6734034782 | ||
|
|
f18e443338 | ||
|
|
41857e98ac | ||
|
|
8f7cd4fbcc | ||
|
|
8a28963138 | ||
|
|
75b7d3d79a | ||
|
|
27ad71a856 | ||
|
|
b5e65c4086 | ||
|
|
a4e1dde375 | ||
|
|
a22e8fa0d5 | ||
|
|
6328209ffc | ||
|
|
4de93ae3b4 | ||
|
|
d3bc288558 | ||
|
|
742281f807 | ||
|
|
d6146ef600 | ||
|
|
a3b633f510 | ||
|
|
296fedb89d | ||
|
|
89cad98a82 | ||
|
|
4499445db6 | ||
|
|
76484f4b95 | ||
|
|
4cbe34c08c | ||
|
|
945a087f1b | ||
|
|
56e73bf7ad | ||
|
|
1013f2b29c | ||
|
|
1020513f13 | ||
|
|
2fee0695a1 | ||
|
|
5d2c90bbab | ||
|
|
4f5b1e65aa | ||
|
|
57b048cba0 | ||
|
|
454d77a0df | ||
|
|
309a75a7c8 | ||
|
|
a0a34eb431 | ||
|
|
1c60cc9403 | ||
|
|
f1ba40f33a | ||
|
|
1e406154d3 | ||
|
|
01b59534fe | ||
|
|
73be1b2646 | ||
|
|
34abb465d2 | ||
|
|
f22eb9a004 | ||
|
|
42255fa183 | ||
|
|
17ac94b44a | ||
|
|
a744f90b35 | ||
|
|
1f4bd475ef | ||
|
|
60bd2ad03d | ||
|
|
929408e1e5 | ||
|
|
dd7ba62505 | ||
|
|
cb9edd72d6 | ||
|
|
94dca3d6c4 | ||
|
|
f7add33031 | ||
|
|
b33e9f8b85 | ||
|
|
f2fd618255 | ||
|
|
f8d2ac641e | ||
|
|
9d8f35581c | ||
|
|
a6300e7163 | ||
|
|
bba329a41c | ||
|
|
0014d989a0 | ||
|
|
2765b66115 | ||
|
|
ae2b788a65 | ||
|
|
087bd470ec | ||
|
|
a8e0988970 | ||
|
|
18b60f9fa2 | ||
|
|
ef4c0d20e5 | ||
|
|
a9046bb89a | ||
|
|
1a611ae18e | ||
|
|
31df5592bf | ||
|
|
11150f2eea | ||
|
|
1d2510f465 | ||
|
|
53df0f957c | ||
|
|
d6c3c2b130 | ||
|
|
539311d192 | ||
|
|
52b742f503 | ||
|
|
83674cf6bb | ||
|
|
63dd7c0fd7 | ||
|
|
99f1cbd934 | ||
|
|
f29d742a49 | ||
|
|
41d5eba0bb | ||
|
|
390288d0f4 | ||
|
|
ee39c87bf7 | ||
|
|
bd4861e4c1 | ||
|
|
115cd0b4ae | ||
|
|
ce8be993fe | ||
|
|
c857a9af4d | ||
|
|
f692f1eca2 | ||
|
|
2fd57b9404 | ||
|
|
585d896cc3 | ||
|
|
2cd746f1d1 | ||
|
|
8b56199ce7 | ||
|
|
cd09934080 | ||
|
|
4a7895b0e2 | ||
|
|
4253d7eb8e | ||
|
|
cee0a1112f | ||
|
|
053467032d | ||
|
|
a7b261a734 | ||
|
|
816c6505d7 | ||
|
|
17d08ef94c | ||
|
|
009a1a98df | ||
|
|
abf728c500 | ||
|
|
9ec03075eb | ||
|
|
9b5a92d113 | ||
|
|
75b9400571 | ||
|
|
d141f4a908 | ||
|
|
5370e51f8a | ||
|
|
ef9f3c6517 | ||
|
|
8756b51ab8 | ||
|
|
b355aa642c | ||
|
|
27f4a48e92 | ||
|
|
18182ea5a1 | ||
|
|
6ec6c4a73e | ||
|
|
ac46ebb348 | ||
|
|
aa1f45e10a | ||
|
|
5e51bfaaa4 | ||
|
|
14578a575e | ||
|
|
298c5b9f8a | ||
|
|
e93f2d9d42 | ||
|
|
6e7d0dd8b2 | ||
|
|
b89ab13f2d | ||
|
|
196daf7860 | ||
|
|
c39483fb3e | ||
|
|
720a36c8de | ||
|
|
f48f191273 | ||
|
|
3b3a728b7d | ||
|
|
d42606f99a | ||
|
|
14da3b1a52 | ||
|
|
4a33e17110 | ||
|
|
bdee85e334 | ||
|
|
376034d4c4 | ||
|
|
d8a9b2df48 | ||
|
|
bba21ea9f4 | ||
|
|
0dc5f5d7b2 | ||
|
|
5ad75b217f | ||
|
|
4ae1b1ec2e | ||
|
|
72269da46f | ||
|
|
37cfd3fd46 | ||
|
|
5c8af74966 | ||
|
|
de1035eb08 | ||
|
|
563e15136c | ||
|
|
49bc304960 | ||
|
|
ca7d06b6a6 | ||
|
|
1553352c88 | ||
|
|
87deb83ed5 | ||
|
|
3bff647de9 | ||
|
|
d826f0b095 | ||
|
|
49f6fd00d8 | ||
|
|
a0c77542ea | ||
|
|
5d1211ba7a | ||
|
|
40dfe9e804 | ||
|
|
224caa595d | ||
|
|
16c8a24163 | ||
|
|
bc5c90ca47 | ||
|
|
c239b6aa04 | ||
|
|
c2dd5e8d29 | ||
|
|
302674273a | ||
|
|
f9cfba00bc | ||
|
|
1ed59569e6 | ||
|
|
a2208f04c3 | ||
|
|
242bc9a759 | ||
|
|
980b461d59 | ||
|
|
9a7399c2b9 | ||
|
|
def00addab | ||
|
|
b8767dfe76 | ||
|
|
543ed3d746 | ||
|
|
d4749cbe7a | ||
|
|
4f10eb59a9 | ||
|
|
cf3dc96e0b | ||
|
|
96072cf9b0 | ||
|
|
56ba5a5a89 | ||
|
|
0833e55c9d | ||
|
|
2f1896b7c4 | ||
|
|
b0021631b4 | ||
|
|
65779c1fec | ||
|
|
defaa13849 | ||
|
|
751679be2f | ||
|
|
f95d7e54f3 | ||
|
|
11a897c366 | ||
|
|
b711509609 | ||
|
|
a2be11dee6 | ||
|
|
7ee751973a | ||
|
|
dc8baff6d3 | ||
|
|
7204db7887 | ||
|
|
a2ba873ee0 | ||
|
|
178d7e77a2 | ||
|
|
24673e87ca | ||
|
|
48774e5853 | ||
|
|
704498ed13 | ||
|
|
75594e3e54 | ||
|
|
ffbe06071f | ||
|
|
2a23f72102 | ||
|
|
b75a945a7a | ||
|
|
ec5ab626d9 | ||
|
|
96eae682c0 | ||
|
|
a6d286d62d | ||
|
|
3964cc2769 | ||
|
|
543b247d72 | ||
|
|
92f5b6789e | ||
|
|
6e03eaebe4 | ||
|
|
b0b5796ece | ||
|
|
627d688c2d | ||
|
|
062af00b20 | ||
|
|
f59c178d65 | ||
|
|
aeab27e00c | ||
|
|
d9fed5e75f | ||
|
|
fd260eaefb | ||
|
|
6b1e4556d8 | ||
|
|
59c9757ca3 | ||
|
|
7a4fb1146e | ||
|
|
19e26af1a4 | ||
|
|
c760419680 | ||
|
|
0575dcadda | ||
|
|
ed55273d5a | ||
|
|
7c3f031e6e | ||
|
|
c83712640a | ||
|
|
2526a22e38 | ||
|
|
0dc777d02b | ||
|
|
47e0b485ab | ||
|
|
9dc6dbb4b7 | ||
|
|
c32e22ac80 | ||
|
|
931eca4fb3 | ||
|
|
ae5cc0e0a4 | ||
|
|
5fe29a09fb | ||
|
|
354750e04a | ||
|
|
b70dba7144 | ||
|
|
b1e80ec0ca | ||
|
|
0b6c9ed68b | ||
|
|
2a88c51405 | ||
|
|
fe582353bb | ||
|
|
32dfdc495c | ||
|
|
72e4300677 | ||
|
|
d21e874718 | ||
|
|
a0e5ca3656 | ||
|
|
63b12899f0 | ||
|
|
91c49e48d7 | ||
|
|
a2e9a4831a | ||
|
|
238f9e5538 | ||
|
|
35a2b6f11d | ||
|
|
947e07a1f3 | ||
|
|
5f0769868f | ||
|
|
c3650e0b9c | ||
|
|
7527cdc8c2 | ||
|
|
9d8cd07b8a | ||
|
|
dbf81a44e9 | ||
|
|
c30278f104 | ||
|
|
af0903a979 | ||
|
|
3188da1ad3 | ||
|
|
5134ae67f1 | ||
|
|
eb05a503ac | ||
|
|
6f0f5d40b0 | ||
|
|
79b0a142cf | ||
|
|
6892ecf6df | ||
|
|
fc76fd16fc | ||
|
|
0cb223e80b | ||
|
|
942a8c4106 | ||
|
|
2e10daef30 | ||
|
|
fee27b681b | ||
|
|
9e7c39103f | ||
|
|
7d15d4a1cb | ||
|
|
3ce4c2f542 | ||
|
|
f6ec0d0d96 | ||
|
|
0ed6cdb32e | ||
|
|
e39d41ec1a | ||
|
|
5464e830af | ||
|
|
e4af824c41 | ||
|
|
af161676dd | ||
|
|
62681fee0c | ||
|
|
45ae210236 | ||
|
|
0dbbbc40d3 | ||
|
|
a8dff862d2 |
4
.env.oms
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
VUE_APP_SCOPE=oms
|
||||||
|
VUE_APP_API=http://192.168.1.87:19897
|
||||||
|
VUE_APP_IS_SIMPLE_SERVER=1
|
||||||
|
VUE_APP_PORT=19897
|
||||||
5
.env.xumu
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
VUE_APP_SCOPE=xumu
|
||||||
|
VUE_APP_API=http://192.168.1.87:12413
|
||||||
|
VUE_APP_IS_SIMPLE_SERVER=1
|
||||||
|
VUE_APP_PORT=12413
|
||||||
|
VUE_APP_OMS_ID=2cd70a15-a3cf-4b4d-9a22-0f3b3a888b08 # oms定制方案的ID
|
||||||
33
.gitignore
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules
|
||||||
|
/dist
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
|
|
||||||
|
# Log files
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
/package-lock.json
|
||||||
|
/lib
|
||||||
|
.prettierrc
|
||||||
|
/oms/dist/
|
||||||
|
/project/*/index.js
|
||||||
|
/project/*/dist
|
||||||
|
/ui/package-lock.json
|
||||||
|
/examples/modules.json
|
||||||
|
/examples/router/apps.js
|
||||||
|
/src/apps/
|
||||||
|
/src/config.json
|
||||||
|
/src/utils/apps.js
|
||||||
14
.npmignore
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# 忽略目录
|
||||||
|
examples/
|
||||||
|
packages/
|
||||||
|
subPackages/
|
||||||
|
core/
|
||||||
|
public/
|
||||||
|
project/
|
||||||
|
.idea/
|
||||||
|
ui/lib/
|
||||||
|
|
||||||
|
# 忽略指定文件
|
||||||
|
vue.config.js
|
||||||
|
babel.config.js
|
||||||
|
*.map
|
||||||
4
.npmrc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
email=aixianling@sinoecare.com
|
||||||
|
package-lock=false
|
||||||
|
registry=http://registry.npmmirror.com
|
||||||
|
legacy-peer-deps=true
|
||||||
11
babel.config.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = {
|
||||||
|
presets: [
|
||||||
|
'@vue/app',
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
// 可选链插件, 其他babel插件也是一样的安装方式
|
||||||
|
"@babel/plugin-proposal-optional-chaining",
|
||||||
|
"@babel/plugin-proposal-nullish-coalescing-operator",
|
||||||
|
"@babel/plugin-proposal-logical-assignment-operators"
|
||||||
|
]
|
||||||
|
}
|
||||||
38
bin/appsSync.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
const axios = require("axios");
|
||||||
|
const {chalkTag, findApp, fs} = require("./tools");
|
||||||
|
const compiler = require('vue-template-compiler')
|
||||||
|
const saveApps = app => {
|
||||||
|
if (app.list.length > 0) {
|
||||||
|
return axios.post("http://192.168.1.87:12525/node/wechatapps/addOrUpdate", app, {timeout: 1000}).then(res => {
|
||||||
|
if (res.data.code == 0) chalkTag.done("产品库目录已同步至后台数据库...")
|
||||||
|
}).catch(() => 0)
|
||||||
|
} else return Promise.reject("没有应用")
|
||||||
|
}
|
||||||
|
const getAppInfo = (file, apps) => {
|
||||||
|
if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) {
|
||||||
|
const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'),
|
||||||
|
source = fs.readFileSync(file).toString(),
|
||||||
|
parsed = compiler.parseComponent(source),
|
||||||
|
script = parsed.script?.content || "",
|
||||||
|
label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1')
|
||||||
|
apps.push({
|
||||||
|
id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'),
|
||||||
|
label: label || name,
|
||||||
|
libPath: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`,
|
||||||
|
name,
|
||||||
|
type: 'web'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const sync = () => {
|
||||||
|
chalkTag.info("开始扫描库工程...")
|
||||||
|
const list = []
|
||||||
|
Promise.all([
|
||||||
|
findApp('packages', app => getAppInfo(app, list)),
|
||||||
|
findApp('project', app => getAppInfo(app, list)),
|
||||||
|
]).then(() => {
|
||||||
|
chalkTag.info("正在同步...")
|
||||||
|
saveApps({type: "web", list}).catch(() => 0).finally(() => chalkTag.done("同步成功!"))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
sync()
|
||||||
99
bin/build.js
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
const axios = require('axios')
|
||||||
|
const {fsExtra, copyFiles, findApp, chalkTag, fs} = require("./tools");
|
||||||
|
const compiler = require('vue-template-compiler')
|
||||||
|
const getBuildConfig = id => {
|
||||||
|
axios.post('http://192.168.1.87:12525/node/custom/detail', null, {params: {id}}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
const config = res.data.data
|
||||||
|
fsExtra.outputJson('src/config.json', config.extra)
|
||||||
|
createPages(config)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const getAppInfo = (file, apps) => {
|
||||||
|
if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) {
|
||||||
|
const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'),
|
||||||
|
source = fs.readFileSync(file).toString(),
|
||||||
|
parsed = compiler.parseComponent(source),
|
||||||
|
script = parsed.script?.content || "",
|
||||||
|
label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1')
|
||||||
|
const paths = file.split(/[\\\/]/)
|
||||||
|
apps.push({
|
||||||
|
id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'),
|
||||||
|
label: label || name,
|
||||||
|
path: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`,
|
||||||
|
workspace: paths.at(0),
|
||||||
|
esm: file.replace(/[\\\/]/g, '/').substring(4),
|
||||||
|
name
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据配置生成应用路由
|
||||||
|
* @param {Object} config - 配置对象,用于定制化路由生成过程
|
||||||
|
* @returns {Promise} - 返回一个Promise对象,表示路由生成完成
|
||||||
|
*/
|
||||||
|
const createRoutes = (config = {}) => {
|
||||||
|
// 初始化路由数组
|
||||||
|
const routes = []
|
||||||
|
// 获取签到页面的路径,如果未指定,则使用默认路径
|
||||||
|
let signPage = '../views/sign'
|
||||||
|
let {signPage: sign, homePage: home = "console"} = config.extra || {}
|
||||||
|
if (config.extra?.signPage) {
|
||||||
|
signPage = `../apps/custom/${sign}/${sign}`
|
||||||
|
}
|
||||||
|
let homePage = `../views/console`
|
||||||
|
if (config.extra?.homePage) {
|
||||||
|
homePage = `../apps/custom/${home}/${home}`
|
||||||
|
}
|
||||||
|
// 查找并处理所有应用,将它们的信息添加到路由中
|
||||||
|
return findApp("src/apps", app => getAppInfo(app, routes)).then(() => {
|
||||||
|
// 生成并输出apps.js文件,定义所有应用的路由
|
||||||
|
fsExtra.outputFile('src/utils/apps.js', `export default [
|
||||||
|
{path: "/login", name: "登录", component: () => import('${signPage}')},
|
||||||
|
{path: '/dv', name: '数据大屏入口', component: () => import('../views/dvIndex')},
|
||||||
|
{path: '/v', name: 'Home', component: () => import('../views/home'), children: [
|
||||||
|
{path:'/',name:'mainEntry', component:()=>import('../views/mainEntry'),children:[
|
||||||
|
{name: "${home}", path: "${home}", component: () => import('${homePage}')},
|
||||||
|
${routes.filter(e => ![sign, home].includes(e.name)).map(e => {
|
||||||
|
// 解构每个路由的属性,用于生成路由配置
|
||||||
|
const {name, label, esm} = e
|
||||||
|
// 生成单个路由配置的字符串表示
|
||||||
|
return `{name:"${name}",label:"${label}",path:"${name}",component:()=>import("../${esm}")}`
|
||||||
|
}).join(',\n')},
|
||||||
|
{path: '*',name: '404',component: ()=>import('../views/building')},
|
||||||
|
]}
|
||||||
|
]},
|
||||||
|
{path: '/', name: "init"},
|
||||||
|
|
||||||
|
]`)
|
||||||
|
// 扫描完毕,使用chalkTag标记任务完成
|
||||||
|
chalkTag.done("扫描完毕")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const createPages = (config = {}) => {
|
||||||
|
fsExtra.emptyDir("src/apps", err => {
|
||||||
|
if (!err) {
|
||||||
|
const {customPath, appList} = config
|
||||||
|
const stdApps = {}
|
||||||
|
appList.filter(e => !/project/.test(e.id))?.forEach(e => {
|
||||||
|
const paths = e.libPath.split('/').filter(Boolean) || []
|
||||||
|
paths.pop()
|
||||||
|
stdApps[paths.join("/")] = 1
|
||||||
|
})
|
||||||
|
Promise.all([
|
||||||
|
copyFiles("src/apps/core", "packages/core"),
|
||||||
|
copyFiles("src/apps/custom", `project/${customPath}`),
|
||||||
|
...Object.keys(stdApps).map(e => copyFiles(`src/apps/${e.replace(/^packages[\\\/]/, '')}`, e)),
|
||||||
|
]).then(() => createRoutes(config)).then(() => fsExtra.ensureFile("src/apps/actions.js"))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = () => {
|
||||||
|
const buildId = process.argv[2] || process.env.VUE_APP_OMS_ID || 'f670cc46-7cf7-4a0f-86ee-3077044c0b17'
|
||||||
|
getBuildConfig(buildId)
|
||||||
|
}
|
||||||
|
start()
|
||||||
37
bin/scanApps.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
const {chalkTag, findApp, fs, fsExtra} = require("./tools");
|
||||||
|
const compiler = require('vue-template-compiler')
|
||||||
|
const getAppInfo = (file, apps) => {
|
||||||
|
if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) {
|
||||||
|
const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'),
|
||||||
|
source = fs.readFileSync(file).toString(),
|
||||||
|
parsed = compiler.parseComponent(source),
|
||||||
|
script = parsed.script?.content || "",
|
||||||
|
label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1')
|
||||||
|
const paths = file.split(/[\\\/]/)
|
||||||
|
apps.push({
|
||||||
|
id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'),
|
||||||
|
label: label || name,
|
||||||
|
path: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`,
|
||||||
|
workspace: paths.at(0),
|
||||||
|
esm: file.replace(/[\\\/]/g, '/'),
|
||||||
|
name
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = () => {
|
||||||
|
chalkTag.info("开始扫描库工程...")
|
||||||
|
const {VUE_APP_SCOPE, VUE_APP_CORE} = process.env
|
||||||
|
const list = []
|
||||||
|
let scanScope = ['packages', 'project']
|
||||||
|
if (VUE_APP_SCOPE) scanScope = [`project/${VUE_APP_SCOPE}`]
|
||||||
|
if (VUE_APP_CORE) scanScope.push('packages/core')
|
||||||
|
Promise.all(scanScope.map(e => findApp(e, app => getAppInfo(app, list)))).then(() => {
|
||||||
|
fsExtra.outputFile('examples/router/apps.js', `export default [${list.map(e => {
|
||||||
|
const {name, label, path, esm} = e
|
||||||
|
return `{name:"${name}",label:"${label}",path:"${path}",component:()=>import("@${esm}")}`
|
||||||
|
}).join(',\n')}]`)
|
||||||
|
chalkTag.done("扫描完毕")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
start()
|
||||||
70
bin/tools.js
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
const fsExtra = require('fs-extra')
|
||||||
|
const path = require('path')
|
||||||
|
const chalk = require('chalk')
|
||||||
|
const fs = require('fs')
|
||||||
|
/**
|
||||||
|
* 将函数封装成promise
|
||||||
|
*/
|
||||||
|
const promisify = fn => {
|
||||||
|
return function () {
|
||||||
|
let args = arguments;
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
[].push.call(args, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
console.log(err)
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fn.apply(null, args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const readdir = promisify(fs.readdir)
|
||||||
|
const stat = promisify(fs.stat)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 封装打印工具
|
||||||
|
*/
|
||||||
|
const {log} = console
|
||||||
|
const chalkTag = {
|
||||||
|
info: msg => log([chalk.bgBlue.black(' INFO '), msg].join(' ')),
|
||||||
|
done: msg => log([chalk.bgGreen.black(' DONE '), msg].join(' ')),
|
||||||
|
warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')),
|
||||||
|
error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')),
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 遍历应用的方法
|
||||||
|
*/
|
||||||
|
const findApp = (dir, cb) => {
|
||||||
|
fsExtra.ensureDirSync(dir)
|
||||||
|
return readdir(dir).then(apps => {
|
||||||
|
return Promise.all(apps.map(e => {
|
||||||
|
let cPath = path.join(dir, e)
|
||||||
|
return stat(cPath).then(state => {
|
||||||
|
if (state.isDirectory()) {
|
||||||
|
return findApp(cPath, cb)
|
||||||
|
} else if (state.isFile()) {
|
||||||
|
cb && cb(cPath)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}) || [])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const copyFiles = (dir, source = 'src/mods') => {
|
||||||
|
chalkTag.info(`开始扫描${source}...`)
|
||||||
|
return new Promise(resolve => {
|
||||||
|
fsExtra.emptyDir(dir, err => {
|
||||||
|
if (!err) {
|
||||||
|
fsExtra.copy(source, dir).then(() => {
|
||||||
|
chalkTag.done(source + ' 扫描完毕')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
module.exports = {findApp, chalkTag, fsExtra, copyFiles, fs, path}
|
||||||
147
examples/App.vue
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<template>
|
||||||
|
<div id="app">
|
||||||
|
<header-nav v-if="showTools" title="web端产品库">
|
||||||
|
<template #right>
|
||||||
|
<mock/>
|
||||||
|
<div @click="showTools=false,dvDev=true">大屏开发</div>
|
||||||
|
<div @click="showTools=false">隐藏工具栏</div>
|
||||||
|
<div @click="handleLogin">点此登录</div>
|
||||||
|
</template>
|
||||||
|
</header-nav>
|
||||||
|
<ai-dv-wrapper class="fill" v-if="dvDev">
|
||||||
|
<router-view v-bind="commonAttrs"/>
|
||||||
|
</ai-dv-wrapper>
|
||||||
|
<el-row v-else-if="showTools" class="fill mar-t48" type="flex">
|
||||||
|
<slider-nav/>
|
||||||
|
<main-content class="fill" :commonAttrs="commonAttrs"/>
|
||||||
|
</el-row>
|
||||||
|
<router-view class="fill" v-else v-bind="commonAttrs"/>
|
||||||
|
<div v-if="dialog" class="sign-box">
|
||||||
|
<ai-sign style="margin: auto" :instance="$request" :action="{login}"
|
||||||
|
visible @login="getToken" :showScanLogin="false"/>
|
||||||
|
</div>
|
||||||
|
<el-button type="info" v-if="!showTools" class="fixedBtn" @click="showTools=true">显示工具栏</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import SliderNav from "./components/sliderNav";
|
||||||
|
import MainContent from "./components/mainContent";
|
||||||
|
import HeaderNav from "./components/headerNav";
|
||||||
|
import {mapActions, mapMutations, mapState} from "vuex";
|
||||||
|
import Mock from "./components/mock";
|
||||||
|
import AiDvWrapper from "dui/dv/layout/AiDvWrapper/AiDvWrapper.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'app',
|
||||||
|
components: {AiDvWrapper, Mock, HeaderNav, MainContent, SliderNav},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
login() {
|
||||||
|
let url = '/auth/oauth/token';
|
||||||
|
/project\/sass/g.test(location.pathname) && (url += "?corpId=ww596787bb70f08288")
|
||||||
|
return url
|
||||||
|
},
|
||||||
|
commonAttrs() {
|
||||||
|
return {
|
||||||
|
instance: this.$request,
|
||||||
|
dict: this.$dict,
|
||||||
|
permissions: this.$permissions
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
dialog: false,
|
||||||
|
showTools: true,
|
||||||
|
dvDev: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
showTools(v) {
|
||||||
|
v && (this.dvDev = false)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
...mapMutations(['setToken']),
|
||||||
|
...mapActions(['getUserInfo', 'getFinanceUser']),
|
||||||
|
getToken(params) {
|
||||||
|
if (params.access_token) {
|
||||||
|
this.setToken([params.token_type, params.access_token].join(' '))
|
||||||
|
this.dialog = false
|
||||||
|
this.$message.success("登录成功,正在刷新页面...")
|
||||||
|
location.reload()
|
||||||
|
} else this.$message.error(params.msg || "登录失败!")
|
||||||
|
|
||||||
|
},
|
||||||
|
handleLogin() {
|
||||||
|
this.$request.delete("/auth/token/logout").finally(() => {
|
||||||
|
this.dialog = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleMock() {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const {jWeixin} = window
|
||||||
|
window.wx = jWeixin
|
||||||
|
if (this.user.token) this.getUserInfo().finally(() => {
|
||||||
|
if (/^\/project\/xiushan/.test(location.pathname)) {
|
||||||
|
this.getFinanceUser()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
html, body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mar-t48 {
|
||||||
|
margin-top: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
color: #2c3e50;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.fixedBtn {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 60px;
|
||||||
|
opacity: 0;
|
||||||
|
z-index: 999;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sign-box {
|
||||||
|
z-index: 99;
|
||||||
|
margin: -10px;
|
||||||
|
display: flex;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
BIN
examples/assets/building.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
examples/assets/file.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
271
examples/components/headerNav.vue
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
<template>
|
||||||
|
<div class="headerNav navBg">
|
||||||
|
<div style="position: relative">
|
||||||
|
<ai-icon type="logo" :icon="'iconcunwei'"/>
|
||||||
|
<ai-icon type="logo" :icon="'iconcunwei'" class="textShadow"/>
|
||||||
|
</div>
|
||||||
|
<span class="headerTitle">{{ title }}<div class="textShadow" v-html="title"/></span>
|
||||||
|
<el-row type="flex" align="middle" class="toolbar">
|
||||||
|
<slot v-if="$slots.right" name="right"/>
|
||||||
|
</el-row>
|
||||||
|
<el-dropdown @visible-change="v=>isClick=v" @command="doMenu" class="rightDropdown">
|
||||||
|
<el-row type="flex" align="middle">
|
||||||
|
<el-avatar :src="user.info.avatar">
|
||||||
|
{{ defaultAvatar }}
|
||||||
|
</el-avatar>
|
||||||
|
<span v-text="defaultName"/>
|
||||||
|
<i :class="dropdownIcon"/>
|
||||||
|
</el-row>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item command="user">用户中心</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="signOut">退出</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'headerNav',
|
||||||
|
props: {
|
||||||
|
title: {default: ""}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isClick: false,
|
||||||
|
drawer: false,//抽屉
|
||||||
|
count: 0,
|
||||||
|
filesList: [],
|
||||||
|
fileName: '',
|
||||||
|
badgeNum: 0,
|
||||||
|
dvOptions: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
dropdownIcon: v => v.isClick ? 'el-icon-caret-top' : 'el-icon-caret-bottom',
|
||||||
|
defaultAvatar: v => v.user.info.name?.slice(-2) || "无名",
|
||||||
|
defaultName: v => [v.user.info.name, v.user.info.roleName].filter(Boolean)?.join(" - ") || "请先登录"
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 获取最新的安卓、ios下载二维码
|
||||||
|
doMenu(comm) {
|
||||||
|
switch (comm) {
|
||||||
|
case 'signOut':
|
||||||
|
//登出
|
||||||
|
this.$confirm("是否要登出?", {type: "warning"}).then(() => {
|
||||||
|
this.$store.commit("SignOut")
|
||||||
|
}).catch(() => {
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
case 'user':
|
||||||
|
this.$router.push({name: "个人中心"})
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.headerNav {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 100% 48px;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 99;
|
||||||
|
height: 48px;
|
||||||
|
padding-left: 24px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
top: 0;
|
||||||
|
color: white;
|
||||||
|
font-size: 14px;
|
||||||
|
|
||||||
|
.AiIcon {
|
||||||
|
font-size: 38px;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
background: linear-gradient(180deg, #FFFFFF 0%, #CCDBF6 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.headerTitle {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
font-size: 24px;
|
||||||
|
color: #FFF;
|
||||||
|
line-height: 28px;
|
||||||
|
background: linear-gradient(180deg, #FFFFFF 0%, #CCDBF6 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-left: 8px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.textShadow {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
text-shadow: 0 2px 0 #384DC3;
|
||||||
|
color: transparent;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.toolbar) {
|
||||||
|
gap: 12px;
|
||||||
|
margin-right: 32px;
|
||||||
|
|
||||||
|
& > div, .toolbarBtn {
|
||||||
|
color: #fff;
|
||||||
|
padding: 0 12px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
color: rgba(#fff, .8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dropdown {
|
||||||
|
height: 48px;
|
||||||
|
line-height: 48px;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0 12px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(46, 51, 68, .15);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-image {
|
||||||
|
margin: 12px 0 12px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.rightDropdown {
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 0 16px;
|
||||||
|
height: 48px;
|
||||||
|
background: rgba(#fff, .1);
|
||||||
|
|
||||||
|
.el-row {
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .downLoad_main ) {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.search_top {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infinite-list {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.infinite-list-item {
|
||||||
|
width: 100%;
|
||||||
|
padding: 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: rgba(255, 255, 255, 1);
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid rgba(208, 212, 220, 1);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 30px;
|
||||||
|
|
||||||
|
.svg {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.middle {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.fileName {
|
||||||
|
color: #333333;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:nth-child(2) {
|
||||||
|
color: #999999;
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span:nth-child(2) {
|
||||||
|
border-right: solid 1px #999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
span:nth-child(3) {
|
||||||
|
border-right: solid 1px #999999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 12px;
|
||||||
|
width: 90px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
display: block;
|
||||||
|
width: 50px;
|
||||||
|
color: #5088FF;
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 4px;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #8888;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
30
examples/components/mainContent.vue
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<section class="mainContent">
|
||||||
|
<ai-nav-tab :routes="$apps"/>
|
||||||
|
<div class="fill">
|
||||||
|
<router-view v-bind="$attrs.commonAttrs"/>
|
||||||
|
<ai-empty v-if="isHome">欢迎使用村微产品库</ai-empty>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AiNavTab from "dui/packages/basic/AiNavTab";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "mainContent",
|
||||||
|
components: {AiNavTab},
|
||||||
|
computed: {
|
||||||
|
isHome: v => v.$route.path == '/',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.mainContent {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
110
examples/components/mock.vue
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
<template>
|
||||||
|
<section class="mock">
|
||||||
|
<el-dropdown>
|
||||||
|
<div class="toolbarBtn" v-text="`生成随机数据`"/>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item>
|
||||||
|
<ai-dialog-btn dialogTitle="随机数据配置" :customFooter="false" @onConfirm="submit" appendToBody @open="getBeans" width="500px">
|
||||||
|
<div class="btn" slot="btn">生成数据</div>
|
||||||
|
<el-form size="small" label-width="60px">
|
||||||
|
<el-form-item label="接口">
|
||||||
|
<el-input v-model="action" placeholder="请输入接口" @change="handleAction"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<ai-dialog-btn dialogTitle="随机数据配置" :customFooter="false" @onConfirm="generateForm" appendToBody @open="getBeans" width="500px">
|
||||||
|
<div class="btn" slot="btn">页面数据</div>
|
||||||
|
<el-form size="small" label-width="60px">
|
||||||
|
<el-form-item label="接口">
|
||||||
|
<el-input v-model="action" placeholder="请输入接口" @change="handleAction"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Mock from "mockjs"
|
||||||
|
import instance from "../router/axios";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "mock",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
instance,
|
||||||
|
action: "",
|
||||||
|
config: "",
|
||||||
|
swagger: {},//swagger接口对象集合
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
url: v => /addOrUpdate/.test(v.action) ? v.action : `/${v.action}/addOrUpdate`
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleAction() {
|
||||||
|
let formName = this.swagger.paths[this.url]?.post.parameters.find(e => e.in == "body")?.name || ""
|
||||||
|
const {Random} = Mock
|
||||||
|
if (formName) {
|
||||||
|
formName = Random.capitalize(formName)
|
||||||
|
const props = this.swagger.definitions[formName]?.properties || {}
|
||||||
|
Object.keys(props).map(e => {
|
||||||
|
const item = props[e]
|
||||||
|
if (item.format == "date-time") {
|
||||||
|
props[e] = () => Random.datetime()
|
||||||
|
} else if (/[0-9a-zA-Z]/.test(item.description)) {
|
||||||
|
props[e] = () => Random.pick(item.description?.match(/\b[0-9a-zA-Z]+\b/g))
|
||||||
|
} else if (/address/i.test(e)) {
|
||||||
|
props[e] = () => Random.county(true)
|
||||||
|
} else if (/userName/i.test(e)) {
|
||||||
|
props[e] = () => Random.cname()
|
||||||
|
} else if (/lat/.test(e)) {
|
||||||
|
props[e] = () => Random.float(3, 53, 6, 8)
|
||||||
|
} else if (/lng/.test(e)) {
|
||||||
|
props[e] = () => Random.float(73, 135, 6, 8)
|
||||||
|
} else if (item.type == "number") {
|
||||||
|
props[e] = () => Random.float(0, 1000, 0, 2)
|
||||||
|
} else if (item.type == "integer") {
|
||||||
|
props[e] = () => Random.integer(0, 1000)
|
||||||
|
} else if (item.type == "string") {
|
||||||
|
props[e] = () => Random.ctitle()
|
||||||
|
} else props[e] = null
|
||||||
|
})
|
||||||
|
this.config = props
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getBeans() {
|
||||||
|
this.instance.get("/app/v2/api-docs", {withoutToken: true}).then(res => this.swagger = res)
|
||||||
|
},
|
||||||
|
generateForm() {
|
||||||
|
const {mock} = Mock
|
||||||
|
this.$vm.$emit("mock", mock(this.config))
|
||||||
|
},
|
||||||
|
submit() {
|
||||||
|
const {mock} = Mock
|
||||||
|
const data = mock({
|
||||||
|
'list|50-100': [this.config]
|
||||||
|
})
|
||||||
|
Promise.all(data.list.map(e => this.instance.post(this.url, e))).then(() => this.$message.success("随机数据生成,执行完毕!"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.mock {
|
||||||
|
.btn {
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
padding: 0 12px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: rgba(#fff, .8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
259
examples/components/sliderNav.vue
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
<template>
|
||||||
|
<section class="sliderNav">
|
||||||
|
<el-input class="searchApp" size="small" v-model="searchApp" placeholder="搜索应用" clearable
|
||||||
|
prefix-icon="iconfont iconSearch" @change="recordSearch"/>
|
||||||
|
<el-scrollbar class="ai-menu">
|
||||||
|
<div v-for="(item,i) in navs" :key="i">
|
||||||
|
<div class="rootMenu" :class="{isActive:menuPath.includes(item.name)}"
|
||||||
|
@click.stop="openKidMenu(item)">
|
||||||
|
<i class="prep-icon" :class="item.style||'iconfont iconloudongmoxing'"/>
|
||||||
|
<span class="menuName fill" v-text="item.label"/>
|
||||||
|
<el-badge type="warning" :hidden="!item.project" :value="item.project"/>
|
||||||
|
<i v-if="item.children" class="iconfont" :class="arrowIcon(item.showChildren)"/>
|
||||||
|
</div>
|
||||||
|
<div class="kidMenu" v-if="item.showChildren" @click.stop>
|
||||||
|
<div class="kidPane">
|
||||||
|
<div class="submenu wrap" flex v-for="menu in item.children" :key="menu.name">
|
||||||
|
<b v-text="menu.label" :class="{menuBtn:menu.type==1,current:menuPath.includes(menu.name)}"
|
||||||
|
@click="handleSelect(menu)"/>
|
||||||
|
<div class="menuBtn" v-for="kid in menu.children" :key="kid.name" v-text="kid.label"
|
||||||
|
@click="handleSelect(kid)"
|
||||||
|
:class="{current:menuPath.includes(kid.name)}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="divider"/>
|
||||||
|
</el-scrollbar>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "sliderNav",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
searchApp: "",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
navs() {
|
||||||
|
let reg = new RegExp(`.*${this.searchApp?.replace(/-/g,'')||''}.*`, 'gi')
|
||||||
|
return (this.$apps || []).filter(e => !this.searchApp || reg?.test(e.name) || reg?.test(e.label)).map(e => {
|
||||||
|
if (/\/project\//.test(e.path)) {
|
||||||
|
e.project = process.env.VUE_APP_SCOPE || e.path.replace(/.*project\/([^\/]+)\/.+/, '$1')
|
||||||
|
} else if (/\/core\//.test(e.path)) {
|
||||||
|
e.project = "core"
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
})
|
||||||
|
},
|
||||||
|
menuPath() {
|
||||||
|
let paths = [], current = this.$apps?.find(e => e.name == this.$route.name)
|
||||||
|
const findParent = name => {
|
||||||
|
let menu = this.$apps?.find(e => e.name == name)
|
||||||
|
if (menu) {
|
||||||
|
paths.push(menu.name)
|
||||||
|
if (!!menu.parentId) findParent(menu.parentId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current) {
|
||||||
|
findParent(current.name)
|
||||||
|
}
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
openKidMenu(parent) {
|
||||||
|
if (parent.children) {
|
||||||
|
parent.showChildren = !parent.showChildren
|
||||||
|
} else {
|
||||||
|
this.handleSelect(parent)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleSelect(item) {
|
||||||
|
if (!item.path) return
|
||||||
|
if (item.name == this.$route.name) {
|
||||||
|
//避免同一路由跳转的BUG vue-router官方BUG
|
||||||
|
} else {
|
||||||
|
let {name, path} = item
|
||||||
|
if (/\?app=/.test(path)) {
|
||||||
|
this.goto({name, query: {app: path.replace(/.+\?app=/, '')}})
|
||||||
|
} else if (/\?moduleId=/.test(path)) {
|
||||||
|
this.goto({name, query: {moduleId: path.replace(/.+\?moduleId=/, '')}})
|
||||||
|
} else {
|
||||||
|
this.goto({name})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
goto(item) {
|
||||||
|
this.$router.push(item)
|
||||||
|
},
|
||||||
|
subMenuIcon(flag) {
|
||||||
|
return flag ? 'iconfont iconArrow_Down' : "iconfont iconArrow_Right"
|
||||||
|
},
|
||||||
|
arrowIcon(v) {
|
||||||
|
return v ? "iconArrow_Down" : "iconArrow_Right"
|
||||||
|
},
|
||||||
|
recordSearch() {
|
||||||
|
localStorage.setItem("searchApp", this.searchApp)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.searchApp = localStorage.getItem("searchApp") || ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.sliderNav {
|
||||||
|
min-width: 200px;
|
||||||
|
height: 100%;
|
||||||
|
transition: width .1s;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-direction: column;
|
||||||
|
border-right: 1px solid #e5e5e5;
|
||||||
|
flex-shrink: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: #EFF1F4;
|
||||||
|
color: #222;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.kidMenu {
|
||||||
|
padding: 0 16px;
|
||||||
|
background: #EFF1F4;
|
||||||
|
|
||||||
|
.rootName {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #333;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kidPane {
|
||||||
|
font-size: 13px;
|
||||||
|
|
||||||
|
.submenu {
|
||||||
|
margin-top: 8px;
|
||||||
|
width: 100%;
|
||||||
|
color: #aaa;
|
||||||
|
|
||||||
|
& > b {
|
||||||
|
width: 100%;
|
||||||
|
line-height: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.menuBtn {
|
||||||
|
display: block;
|
||||||
|
width: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
line-height: 32px;
|
||||||
|
color: #333;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #26f;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
color: #26f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.rootMenu {
|
||||||
|
padding: 0 16px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 44px;
|
||||||
|
cursor: pointer;
|
||||||
|
box-shadow: 0px -1px 0px 0px #D8DCE3 inset, 0px 1px 0px 0px #FFF inset, -1px 0px 0px 0px #E5E5E5 inset;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 13px;
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
color: #89B;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.isActive {
|
||||||
|
color: #26f;
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
color: #26f !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #26f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ai-menu ) {
|
||||||
|
padding-left: 0;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
|
||||||
|
.el-scrollbar__wrap {
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .searchApp ) {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 44px;
|
||||||
|
padding: 0 16px;
|
||||||
|
box-shadow: 0px -1px 0px 0px #E5E5E5 inset;
|
||||||
|
|
||||||
|
.el-input__inner {
|
||||||
|
border: none;
|
||||||
|
background: inherit;
|
||||||
|
padding: 0 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__prefix {
|
||||||
|
left: 16px;
|
||||||
|
|
||||||
|
.iconSearch {
|
||||||
|
font-size: 20px;
|
||||||
|
width: fit-content;
|
||||||
|
color: #89B;
|
||||||
|
line-height: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
color: #aaa;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
position: relative;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 16px 16px 32px;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "到达底部";
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
padding: 0 16px;
|
||||||
|
background: #EFF1F4;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
35
examples/main.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
import App from './App.vue';
|
||||||
|
import ui from 'element-ui';
|
||||||
|
import router from './router';
|
||||||
|
import axios from './router/axios';
|
||||||
|
import utils from './utils';
|
||||||
|
import dui from 'dui/packages';
|
||||||
|
import store from './store';
|
||||||
|
import dataV from '@jiaminghi/data-view';
|
||||||
|
import dvui from 'dui/dv'
|
||||||
|
|
||||||
|
Vue.use(dataV)
|
||||||
|
Vue.use(ui);
|
||||||
|
Vue.use(dui);
|
||||||
|
Vue.use(dvui);
|
||||||
|
//富文本编辑器配置
|
||||||
|
Vue.config.productionTip = false;
|
||||||
|
Object.keys(utils).map((e) => (Vue.prototype[e] = utils[e]));
|
||||||
|
Vue.prototype.$request = axios
|
||||||
|
const app = new Vue({
|
||||||
|
router,
|
||||||
|
store,
|
||||||
|
render: h => h(App)
|
||||||
|
});
|
||||||
|
|
||||||
|
let theme = null
|
||||||
|
store.dispatch('getSystem').then(res => {
|
||||||
|
theme = JSON.parse(res?.colorScheme || null)
|
||||||
|
Vue.prototype.$theme = theme?.web || "blue"
|
||||||
|
return import(`dui/lib/styles/theme.${theme?.web}.scss`).catch(() => 0)
|
||||||
|
}).finally(() => {
|
||||||
|
Vue.prototype.$vm = app
|
||||||
|
import(`dui/lib/styles/common.scss`).finally(() => app.$mount('#app'))
|
||||||
|
})
|
||||||
|
|
||||||
18
examples/router/axios.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { Message } from 'element-ui'
|
||||||
|
import instance from 'dui/lib/js/request'
|
||||||
|
|
||||||
|
let baseURLs = {
|
||||||
|
production: "/",
|
||||||
|
development: '/lan'
|
||||||
|
}
|
||||||
|
instance.defaults.baseURL = baseURLs[process.env.NODE_ENV]
|
||||||
|
instance.interceptors.request.use(config => {
|
||||||
|
if (config.url.startsWith("/node")) {
|
||||||
|
config.url = "/ns" + config.url
|
||||||
|
}
|
||||||
|
if (process.env.VUE_APP_IS_SIMPLE_SERVER == 1) {
|
||||||
|
config.url = config.url.replace(/^\/(app|auth|admin)\//, "/api/")
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}, error => Message.error(error))
|
||||||
|
export default instance
|
||||||
18
examples/router/index.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import VueRouter from 'vue-router'
|
||||||
|
import apps from "./apps";
|
||||||
|
|
||||||
|
Vue.use(VueRouter)
|
||||||
|
Vue.prototype.$apps = apps
|
||||||
|
export default new VueRouter({
|
||||||
|
mode: 'history',
|
||||||
|
hashbang: false,
|
||||||
|
routes: apps,
|
||||||
|
scrollBehavior(to) {
|
||||||
|
if (to.hash) {
|
||||||
|
return {
|
||||||
|
selector: to.hash
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
12
examples/store/index.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
import preState from 'vuex-persistedstate'
|
||||||
|
import * as modules from "dui/lib/js/modules"
|
||||||
|
import xsActions from "../../project/xiushan/actions"
|
||||||
|
|
||||||
|
Vue.use(Vuex)
|
||||||
|
export default new Vuex.Store({
|
||||||
|
actions: {...xsActions},
|
||||||
|
modules,
|
||||||
|
plugins: [preState()]
|
||||||
|
})
|
||||||
102
examples/utils/index.js
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import {MessageBox} from 'element-ui'
|
||||||
|
import store from '../store'
|
||||||
|
import tools from 'dui/lib/js/utils'
|
||||||
|
|
||||||
|
const addChildParty = (parent, pending) => {
|
||||||
|
let doBeforeCount = pending.length
|
||||||
|
parent["children"] = parent["children"] || []
|
||||||
|
pending.map((e, index, arr) => {
|
||||||
|
if (e.partyOrgParentId == parent.partyOrgId) {
|
||||||
|
parent.children.push(e)
|
||||||
|
arr.splice(index, 1)
|
||||||
|
addChildParty(parent, arr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (parent.children.length == 0) {
|
||||||
|
delete parent.children
|
||||||
|
}
|
||||||
|
if (pending.length > 0 && doBeforeCount > pending.length) {
|
||||||
|
parent.children.map(c => addChildParty(c, pending))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 封装提示框
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
const $confirm = (content, options) => {
|
||||||
|
return MessageBox.confirm(content, {
|
||||||
|
type: "warning",
|
||||||
|
confirmButtonText: "确认",
|
||||||
|
closeOnClickModal: false,
|
||||||
|
center: true,
|
||||||
|
title: "提示",
|
||||||
|
dangerouslyUseHTMLString: true,
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 封装权限判断方法
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
const $permissions = flag => {
|
||||||
|
const buttons = store.state.user.info.buttons
|
||||||
|
if (buttons) return buttons.some(b => b.id == flag || b.permission == flag)
|
||||||
|
else return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const $decimalCalc = (...arr) => {
|
||||||
|
//确认提升精度
|
||||||
|
let decimalLengthes = arr.map(e => {
|
||||||
|
let index = ("" + e).indexOf(".")
|
||||||
|
return ("" + e).length - index
|
||||||
|
})
|
||||||
|
let maxDecimal = Math.max(...decimalLengthes), precision = Math.pow(10, maxDecimal)
|
||||||
|
//计算
|
||||||
|
let intArr = arr.map(e => (Number(e) || 0) * precision)
|
||||||
|
//返回计算值
|
||||||
|
return intArr.reduce((t, a) => t + a) / precision
|
||||||
|
}
|
||||||
|
export const waiting = {
|
||||||
|
init(ops, count) {
|
||||||
|
if (document.body) {
|
||||||
|
let div = document.createElement('div')
|
||||||
|
div.id = "ai-waiting"
|
||||||
|
div.className = "el-loading-mask is-fullscreen"
|
||||||
|
div.style.zIndex = '202204271710'
|
||||||
|
div.style.textAlign = 'center'
|
||||||
|
div.style.lineHeight = '100vh'
|
||||||
|
div.style.color = '#26f'
|
||||||
|
div.style.fontSize = '20px'
|
||||||
|
div.style.background = 'rgba(255,255,255,.6)'
|
||||||
|
div.style.backdropFilter = 'blur(6px)'
|
||||||
|
document.body.appendChild(div)
|
||||||
|
} else if (count < 10) {
|
||||||
|
setTimeout(() => this.init(ops, ++count), 500)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getDom() {
|
||||||
|
return document.querySelector('#ai-waiting')
|
||||||
|
},
|
||||||
|
setContent(html) {
|
||||||
|
let div = this.getDom()
|
||||||
|
div.innerHTML = html
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
let div = this.getDom()
|
||||||
|
div.parentElement.removeChild(div)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
...tools,
|
||||||
|
addChildParty,
|
||||||
|
$confirm,
|
||||||
|
$permissions,
|
||||||
|
$decimalCalc,
|
||||||
|
$waiting: waiting
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
88
package.json
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"name": "dvcp-web-apps",
|
||||||
|
"version": "4.0.0",
|
||||||
|
"private": false,
|
||||||
|
"author": "kubbo",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vue-cli-service serve examples/main.js",
|
||||||
|
"build": "vue-cli-service build",
|
||||||
|
"oms": "vue-cli-service serve examples/main.js --mode oms",
|
||||||
|
"xumu": "vue-cli-service serve examples/main.js --mode xumu",
|
||||||
|
"sync": "node bin/appsSync.js",
|
||||||
|
"preview": "node bin/build.js && vue-cli-service serve",
|
||||||
|
"predev": "node bin/scanApps.js",
|
||||||
|
"preoms": "dotenv -e .env.oms node bin/scanApps.js",
|
||||||
|
"prexumu": "dotenv -e .env.xumu node bin/scanApps.js",
|
||||||
|
"view:xumu": "vue-cli-service serve --mode xumu",
|
||||||
|
"preview:xumu": "dotenv -e .env.xumu node bin/build.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||||
|
"@ckeditor/ckeditor5-vue2": "^3.0.1",
|
||||||
|
"@jiaminghi/data-view": "^2.10.0",
|
||||||
|
"@logicflow/core": "^1.2.1",
|
||||||
|
"bin-ace-editor": "^3.2.0",
|
||||||
|
"crypto-js": "^4.2.0",
|
||||||
|
"dayjs": "^1.8.35",
|
||||||
|
"echarts": "^5.5.1",
|
||||||
|
"echarts-wordcloud": "^2.0.0",
|
||||||
|
"hash.js": "^1.1.7",
|
||||||
|
"html2canvas": "^1.4.1",
|
||||||
|
"jspdf": "^2.5.2",
|
||||||
|
"mp4box": "^0.4.1",
|
||||||
|
"print-js": "^1.0.63",
|
||||||
|
"serialize-javascript": "^6.0.0",
|
||||||
|
"sortablejs": "^1.12.0",
|
||||||
|
"vue-carousel": "^0.18.0",
|
||||||
|
"vue-cropper": "^0.6.5",
|
||||||
|
"vue-draggable-resizable": "^2.3.0",
|
||||||
|
"vue-qr": "^4.0.9",
|
||||||
|
"vue-ruler-tool": "^1.2.4",
|
||||||
|
"vue-style-loader": "^4.1.3",
|
||||||
|
"vuedraggable": "^2.24.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/plugin-proposal-logical-assignment-operators": "^7.10.4",
|
||||||
|
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
|
||||||
|
"@babel/plugin-proposal-optional-chaining": "^7.10.4",
|
||||||
|
"@vue/cli-plugin-babel": "^3.6.0",
|
||||||
|
"@vue/cli-plugin-eslint": "^3.6.0",
|
||||||
|
"@vue/cli-service": "^3.6.0",
|
||||||
|
"axios": "^0.19.2",
|
||||||
|
"babel-eslint": "^10.1.0",
|
||||||
|
"core-js": "^2.6.11",
|
||||||
|
"dotenv-cli": "^7.4.2",
|
||||||
|
"element-ui": "^2.15.9",
|
||||||
|
"eslint": "^5.16.0",
|
||||||
|
"eslint-plugin-vue": "^5.0.0",
|
||||||
|
"image-webpack-loader": "^6.0.0",
|
||||||
|
"inquirer": "^6.5.2",
|
||||||
|
"mockjs": "^1.1.0",
|
||||||
|
"node-ipc": "^9.2.1",
|
||||||
|
"readline": "^1.3.0",
|
||||||
|
"sass": "~1.32.6",
|
||||||
|
"sass-loader": "^7.3.1",
|
||||||
|
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||||
|
"vue": "^2.7.14",
|
||||||
|
"vue-router": "^3.3.4",
|
||||||
|
"vue-template-compiler": "^2.7.14",
|
||||||
|
"vuex": "^3.5.1",
|
||||||
|
"vuex-persistedstate": "^2.7.1"
|
||||||
|
},
|
||||||
|
"vetur": {
|
||||||
|
"attributes": "./attributes.json"
|
||||||
|
},
|
||||||
|
"postcss": {
|
||||||
|
"plugins": {
|
||||||
|
"autoprefixer": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
"> 1%",
|
||||||
|
"last 2 versions",
|
||||||
|
"not ie <= 8"
|
||||||
|
],
|
||||||
|
"resolutions": {
|
||||||
|
"sass": "1.32.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
289
packages/bigscreen/designer/Add.vue
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail>
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title :title="isEdit ? '编辑项目' : '添加项目'" isShowBack isShowBottomBorder @onBackClick="cancel"/>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<ai-card title="基本信息">
|
||||||
|
<template #content>
|
||||||
|
<div class="ai-form">
|
||||||
|
<el-form-item label="名称" prop="name"
|
||||||
|
:rules="[{ required: true, message: '请输入大屏项目名称', trigger: 'blur' }]">
|
||||||
|
<el-input size="small" :maxlength="30" placeholder="请输入大屏项目名称" v-model="form.name"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="描述" style="width: 100%;" prop="description">
|
||||||
|
<el-input size="small" :maxlength="200" :rows="5" type="textarea" style="width: 100%;"
|
||||||
|
placeholder="请输入描述"
|
||||||
|
v-model="form.description"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否开启" style="width: 100%;" prop="status">
|
||||||
|
<el-switch
|
||||||
|
v-model="form.status"
|
||||||
|
active-value="1"
|
||||||
|
inactive-value="0">
|
||||||
|
</el-switch>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="大屏" v-if="isEdit">
|
||||||
|
<template #right>
|
||||||
|
<el-button @click="gotoDesign()" type="primary">添加大屏</el-button>
|
||||||
|
<el-button @click="dialog=true" type="primary">定制大屏</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:border="true"
|
||||||
|
row-key="id"
|
||||||
|
:isShowPagination="false"
|
||||||
|
@getList="() => {}">
|
||||||
|
<el-table-column slot="options" label="状态" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<el-switch
|
||||||
|
v-model="row.status"
|
||||||
|
active-value="1"
|
||||||
|
@change="() => onStatusChange(row.id)">
|
||||||
|
</el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row, column, $index }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toEdit(row.id, row.isCustom, row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="toViewer(row.id)">预览</el-button>
|
||||||
|
<el-button type="text" @click="remove($index)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</el-form>
|
||||||
|
<ai-dialog :visible.sync="dialog" title="定制大屏" @closed="custom={}" @onConfirm="handleCustomizedDV">
|
||||||
|
<el-form ref="CustomDVFrom" size="small" :model="custom" :rules="rules" label-width="80px">
|
||||||
|
<el-form-item label="大屏标题" prop="title">
|
||||||
|
<el-input v-model="custom.title" clearable placeholder="请填写"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="选择大屏" prop="dv">
|
||||||
|
<ai-select v-model="custom.dv" :selectList="dict.getDict('customizedDVs')"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="静态数据">
|
||||||
|
<el-input type="textarea" rows="5" v-model="custom.meta"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="cancel">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirm">提交</el-button>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Layout from './viewport.vue'
|
||||||
|
import Sortable from 'sortablejs'
|
||||||
|
import {mapActions} from "vuex"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'Add',
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
urlPrefix: String
|
||||||
|
},
|
||||||
|
inject: {
|
||||||
|
home: {default: ''}
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
Layout
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
info: {},
|
||||||
|
department: [],
|
||||||
|
form: {
|
||||||
|
name: '',
|
||||||
|
relationLsIds: '',
|
||||||
|
relationLsNames: '',
|
||||||
|
status: '1',
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
screenId: '',
|
||||||
|
query: {},
|
||||||
|
total: 0,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'title', label: '标题'},
|
||||||
|
{prop: 'id', label: 'ID'}
|
||||||
|
],
|
||||||
|
tableData: [],
|
||||||
|
id: '',
|
||||||
|
dialog: false,
|
||||||
|
custom: {},
|
||||||
|
rules: {
|
||||||
|
dv: [{required: true, message: "请选择 定制大屏"}],
|
||||||
|
title: [{required: true, message: "请输入 大屏标题"}],
|
||||||
|
},
|
||||||
|
config: {
|
||||||
|
backgroundImage: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
isEdit: v => !!v.$route.query.id
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.dict.load('customizedDVs')
|
||||||
|
this.getInfo().then(() => this.$route.params?.id && this.onChange(this.$route.params))
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
...mapActions(['closePage']),
|
||||||
|
getInfo() {
|
||||||
|
let {id} = this.$route.query
|
||||||
|
if (!id) return Promise.reject()
|
||||||
|
return this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryLargeScreenProjectDetailById?id=${id}`).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.form = {
|
||||||
|
...res.data
|
||||||
|
}
|
||||||
|
if (res.data.relationLsIds) {
|
||||||
|
this.tableData = res.data.lsList.map(v => {
|
||||||
|
let conf = JSON.parse(v.config || '') || {}
|
||||||
|
return {
|
||||||
|
id: v.id,
|
||||||
|
title: v.title,
|
||||||
|
dv: conf.custom || '',
|
||||||
|
meta: JSON.stringify(conf.meta),
|
||||||
|
isCustom: !!conf.custom,
|
||||||
|
status: v.status
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.total = res.data.lsList.length
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.rowDrop()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onStatusChange(id) {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/enableLargeScreen?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$message.success('操作成功')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
rowDrop() {
|
||||||
|
const tbody = document.querySelector('.el-table__body-wrapper tbody')
|
||||||
|
const _this = this
|
||||||
|
Sortable.create(tbody, {
|
||||||
|
onEnd({newIndex, oldIndex}) {
|
||||||
|
const currRow = _this.tableData.splice(oldIndex, 1)[0]
|
||||||
|
_this.tableData.splice(newIndex, 0, currRow)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toViewer(id) {
|
||||||
|
this.$router.push({query: {id}, hash: "#preview"})
|
||||||
|
},
|
||||||
|
onChange(e) {
|
||||||
|
const ids = this.tableData.map(v => v.id)
|
||||||
|
if (ids.indexOf(e.id) < 0) {
|
||||||
|
this.tableData.push({
|
||||||
|
title: e.title,
|
||||||
|
id: e.id,
|
||||||
|
status: '1'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const index = this.tableData.findIndex(v => v.id === e.id)
|
||||||
|
this.$set(this.tableData[index], 'title', e.title)
|
||||||
|
}
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.$route.query.id) {
|
||||||
|
const ids = this.tableData.map(v => v.id).join(',')
|
||||||
|
const names = this.tableData.map(v => v.name).join(',')
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreenProject`, {
|
||||||
|
...this.form,
|
||||||
|
relationLsIds: ids,
|
||||||
|
relationLsNames: names
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
gotoDesign(did) {
|
||||||
|
const {id} = this.$route.query
|
||||||
|
this.$router.push({hash: "#design", query: {id, did, name: this.form.name}})
|
||||||
|
},
|
||||||
|
toEdit(id, isCustom, form) {
|
||||||
|
if (!isCustom) {
|
||||||
|
this.gotoDesign(id)
|
||||||
|
} else {
|
||||||
|
this.dialog = true
|
||||||
|
this.custom = form
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(index) {
|
||||||
|
this.tableData.splice(index, 1)
|
||||||
|
},
|
||||||
|
|
||||||
|
confirm() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
const ids = this.tableData.map(v => v.id).join(',')
|
||||||
|
const names = this.tableData.map(v => v.name).join(',')
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreenProject`, {
|
||||||
|
...this.form,
|
||||||
|
relationLsIds: ids,
|
||||||
|
relationLsNames: names
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('提交成功')
|
||||||
|
|
||||||
|
this.home && this.home.refreshDvOptions && this.home.refreshDvOptions()
|
||||||
|
setTimeout(() => {
|
||||||
|
this.cancel()
|
||||||
|
}, 600)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.closePage()
|
||||||
|
this.$router.push({})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleCustomizedDV() {
|
||||||
|
this.$refs.CustomDVFrom.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreen`, {
|
||||||
|
config: JSON.stringify({
|
||||||
|
custom: this.custom.dv,
|
||||||
|
meta: JSON.parse(this.custom.meta?.replace(/\\n/g, '') || null)
|
||||||
|
}),
|
||||||
|
status: 1,
|
||||||
|
id: this.custom.id,
|
||||||
|
title: this.custom.title,
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0 && res?.data) {
|
||||||
|
this.$message.success('保存成功')
|
||||||
|
this.onChange(res.data)
|
||||||
|
this.dialog = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
</style>
|
||||||
83
packages/bigscreen/designer/AppDesigner.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppDesigner">
|
||||||
|
<component :is="currentPage" v-bind="$props"/>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './List.vue'
|
||||||
|
import Add from './Add.vue'
|
||||||
|
import SourceData from './SourceData.vue'
|
||||||
|
import Preview from "./preview.vue";
|
||||||
|
import DesignDashboard from "./viewport.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppDesigner',
|
||||||
|
label: '大屏设计',
|
||||||
|
components: {DesignDashboard, Preview, List, Add, SourceData},
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function,
|
||||||
|
urlPrefix: {
|
||||||
|
type: String,
|
||||||
|
default: '/app'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
currentPage() {
|
||||||
|
const {hash} = this.$route
|
||||||
|
return hash == "#sourceData" ? SourceData :
|
||||||
|
hash == "#add" ? Add :
|
||||||
|
hash == "#preview" ? Preview :
|
||||||
|
hash == "#design" ? DesignDashboard : List
|
||||||
|
},
|
||||||
|
tabs() {
|
||||||
|
return [
|
||||||
|
{label: '大屏列表', name: 'FormList', comp: List, permission: ''}
|
||||||
|
].filter(() => {
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
currIndex: '0',
|
||||||
|
componentName: '',
|
||||||
|
params: {},
|
||||||
|
areaId: '',
|
||||||
|
isShowDetail: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange(data) {
|
||||||
|
if (data.type === 'list') {
|
||||||
|
this.componentName = 'List'
|
||||||
|
this.isShowDetail = false
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'add') {
|
||||||
|
this.componentName = 'Add'
|
||||||
|
this.isShowDetail = true
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'SourceData') {
|
||||||
|
this.componentName = 'SourceData'
|
||||||
|
this.isShowDetail = true
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppDesigner {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
167
packages/bigscreen/designer/List.vue
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list>
|
||||||
|
<ai-title slot="title" title="大屏列表" isShowBottomBorder/>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar>
|
||||||
|
<template #left>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.status"
|
||||||
|
@change="search.current = 1, getList()"
|
||||||
|
placeholder="发布状态"
|
||||||
|
:selectList="dict.getDict('cwpStatus')">
|
||||||
|
</ai-select>
|
||||||
|
<el-button type="primary" @click="toEdit('')">添加大屏</el-button>
|
||||||
|
<el-button type="primary" @click="toAddData">数据源管理</el-button>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input
|
||||||
|
v-model="search.name"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入模板名称或创建人"
|
||||||
|
clearable
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
@clear="search.current = 1, search.title = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
v-loading="loading"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList" :dict="dict">
|
||||||
|
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toEdit(row.id)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="copy(row.id)">复制</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="780px"
|
||||||
|
title="复制大屏"
|
||||||
|
@close="onClose"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<div class="ai-form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<el-form-item label="名称" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]">
|
||||||
|
<el-input size="small" placeholder="请输入名称" v-model="form.name"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'FormList',
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
areaId: String,
|
||||||
|
urlPrefix: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
status: '',
|
||||||
|
size: 10,
|
||||||
|
name: ''
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: ''
|
||||||
|
},
|
||||||
|
id: '',
|
||||||
|
isShowAdd: false,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'name', label: '模板名称'},
|
||||||
|
{prop: 'createUserName', align: 'center', label: '创建人'},
|
||||||
|
{prop: 'description', align: 'center', label: '描述'},
|
||||||
|
{prop: 'status', align: 'center', label: '状态', dict:"cwpStatus"},
|
||||||
|
{prop: 'createTime', align: 'center', label: '创建时间'}
|
||||||
|
],
|
||||||
|
tableData: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
|
||||||
|
this.dict.load('cwpStatus').then(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.loading = true
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
copy(id) {
|
||||||
|
this.id = id
|
||||||
|
this.isShowAdd = true
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.id = ''
|
||||||
|
this.form.name = ''
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/copyLargeScreenProject`, null, {
|
||||||
|
params: {
|
||||||
|
...this.form,
|
||||||
|
id: this.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$message.success('复制成功')
|
||||||
|
this.isShowAdd = false
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allLargeScreenProjectByPage`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
this.loading = false
|
||||||
|
} else {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toEdit(id) {
|
||||||
|
this.$router.push({hash: "#add", query: {id}})
|
||||||
|
},
|
||||||
|
toAddData() {
|
||||||
|
this.$router.push({hash: "#sourceData"})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
460
packages/bigscreen/designer/SourceData.vue
Normal file
@@ -0,0 +1,460 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail>
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="数据源" isShowBack isShowBottomBorder @onBackClick="cancel">
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-card title="数据源列表">
|
||||||
|
<template #right>
|
||||||
|
<el-button type="primary" @click="isShow = true">添加数据源</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-search-bar class="search-bar">
|
||||||
|
<template slot="right">
|
||||||
|
<el-input
|
||||||
|
v-model="search.name"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入名字"
|
||||||
|
clearable
|
||||||
|
@clear="search.current = 1, search.name = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:border="true"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toEdit(row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShow"
|
||||||
|
width="920px"
|
||||||
|
title="数据源"
|
||||||
|
@close="onClose"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<div class="ai-form">
|
||||||
|
<el-form-item label="数据源描述" style="width: 100%;" prop="description" :rules="[{ required: true, message: '请输入数据源描述', trigger: 'blur' }]">
|
||||||
|
<el-input
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入数据源描述"
|
||||||
|
v-model="form.description">
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="类型" style="width: 100%;" prop="dataRange" :rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]">
|
||||||
|
<el-radio-group v-model="form.type">
|
||||||
|
<el-radio label="0">村微应用</el-radio>
|
||||||
|
<el-radio label="1">SQL</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="form.type === '1'" label="sql语句" style="width: 100%;" prop="description"
|
||||||
|
:rules="[{ required: true, message: '请输入sql语句', trigger: 'blur' }]">
|
||||||
|
<el-input
|
||||||
|
:rows="8"
|
||||||
|
size="small"
|
||||||
|
type="textarea"
|
||||||
|
placeholder="请输入数据源描述"
|
||||||
|
v-model="form.sqlContent">
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="form.type === '0'" label="村微应用" style="width: 100%;" prop="appId"
|
||||||
|
:rules="[{ required: true, message: '请选择村微应用', trigger: 'change' }]">
|
||||||
|
<el-select size="small" style="width: 100%;" v-model="form.appId" placeholder="请选择村微应用" @change="onAppChange">
|
||||||
|
<el-option
|
||||||
|
v-for="item in appList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.appName"
|
||||||
|
:value="item.id">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="form.type === '0'" label="数据范围" style="width: 100%;" prop="dataRange"
|
||||||
|
:rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]">
|
||||||
|
<el-radio-group v-model="form.dataRange">
|
||||||
|
<el-radio label="0">全部</el-radio>
|
||||||
|
<el-radio label="1">自定义条数</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="数据条数" style="width: 100%;" v-if="form.dataRange === '1' && form.type === '0'" prop="count"
|
||||||
|
:rules="[{ required: true, message: '请输入数据条数', trigger: 'blur' }]">
|
||||||
|
<el-input
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入数据条数"
|
||||||
|
v-model="form.count">
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<div v-if="form.type === '0'">
|
||||||
|
<el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.statisticsConfigs" :key="'statisticsConfigs' + index">
|
||||||
|
<div class="form-flex">
|
||||||
|
<div>
|
||||||
|
<el-select size="small" style="width: 160px;" v-model="item.fieldName" @change="e => onChooseField('statisticsConfigs', e, index)"
|
||||||
|
placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in filedList"
|
||||||
|
:key="index"
|
||||||
|
:label="item.fieldCnName"
|
||||||
|
:value="item.fieldName">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-select size="small" style="margin: 0 10px; width: 160px;" v-model="item.calcType" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in dict.getDict('diyLargeScreenDatasourceCalcType2')"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.dictName"
|
||||||
|
:value="item.dictValue">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-input size="small" style="width: 165px;" placeholder="请输入别名" v-model="item.alias"></el-input>
|
||||||
|
</div>
|
||||||
|
<el-button type="danger" v-if="index > 0" @click="removeConfig('statisticsConfigs', index)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
||||||
|
<el-button type="primary" @click="add('statisticsConfigs')">添加统计项</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<div v-if="form.type === '0'">
|
||||||
|
<el-form-item :label="'分组' + index" style="width: 100%;" v-for="(item, index) in form.groupConfigs" :key="'groupConfigs' + item.fieldName">
|
||||||
|
<div class="form-flex">
|
||||||
|
<div>
|
||||||
|
<el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in filedList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.fieldCnName"
|
||||||
|
:value="item.fieldName">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<el-button type="danger" @click="removeConfig('groupConfigs', index)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
||||||
|
<el-button type="primary" @click="add('groupConfigs')">添加分组</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<div v-if="form.type === '0'">
|
||||||
|
<el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.orderConfigs" :key="'orderConfigs' + item.fieldName">
|
||||||
|
<div class="form-flex">
|
||||||
|
<div>
|
||||||
|
<el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in filedList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.fieldCnName"
|
||||||
|
:value="item.fieldName">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-select size="small" style="width: 160px; margin-left: 10px;" v-model="item.orderType" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="item in orderTypeDict"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<el-button type="danger" @click="removeConfig('orderConfigs', index)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
||||||
|
<el-button type="primary" @click="add('orderConfigs')">添加排序</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'SourceData',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
params: Object,
|
||||||
|
urlPrefix: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isShow: false,
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
name: ''
|
||||||
|
},
|
||||||
|
total: 0,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'appName', label: '应用名'},
|
||||||
|
{prop: 'appTableName', align: 'center', label: '表名'},
|
||||||
|
{prop: 'description', align: 'center', label: '描述'},
|
||||||
|
{prop: 'type', align: 'center', label: '类型', format: v => v === '0' ? '村微应用' : 'sql语句'},
|
||||||
|
{prop: 'createUserName', align: 'center', label: '创建人'},
|
||||||
|
{prop: 'createTime', align: 'center', label: '创建时间'}
|
||||||
|
],
|
||||||
|
tableData: [],
|
||||||
|
filedList: [],
|
||||||
|
appList: [],
|
||||||
|
form: {
|
||||||
|
orderType: 'asc',
|
||||||
|
dataRange: '0',
|
||||||
|
type: '0',
|
||||||
|
sqlContent: '',
|
||||||
|
appId: '',
|
||||||
|
description: '',
|
||||||
|
appName: '',
|
||||||
|
appTableName: '',
|
||||||
|
count: '100',
|
||||||
|
statisticsConfigs: [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}],
|
||||||
|
orderConfigs: [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}],
|
||||||
|
groupConfigs: [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
id: '',
|
||||||
|
orderTypeDict: [
|
||||||
|
{
|
||||||
|
value: 'asc',
|
||||||
|
label: '升序'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'desc',
|
||||||
|
label: '降序'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.dict.load(['diyLargeScreenDatasourceCalcType2']).then(() => {
|
||||||
|
this.getList()
|
||||||
|
this.getAppList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getInfo(id) {
|
||||||
|
this.instance.post(`${this.urlPrefix}/wxcp/wxuser/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.form = {
|
||||||
|
...res.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onChooseField(type, fieldName, index) {
|
||||||
|
const dictCode = this.filedList.filter(v => v.fieldName === fieldName)[0].dictCode
|
||||||
|
this.$set(this.form[type][index], 'dictCode', dictCode)
|
||||||
|
},
|
||||||
|
|
||||||
|
add(type) {
|
||||||
|
this.form[type].push({
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
removeConfig(type, index) {
|
||||||
|
this.form[type].splice(index, 1)
|
||||||
|
},
|
||||||
|
|
||||||
|
toEdit(e) {
|
||||||
|
this.id = e.id
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryDatasourceDetailById?id=${e.id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.form = {
|
||||||
|
...res.data
|
||||||
|
}
|
||||||
|
|
||||||
|
this.form.dataRange = this.form.dataRange === '0' ? '0' : '1'
|
||||||
|
this.form.count = res.data.dataRange
|
||||||
|
this.filedList = this.appList.filter(v => v.id === res.data.appId).length && this.appList.filter(v => v.id === res.data.appId)[0].fields.map(item => {
|
||||||
|
let value = []
|
||||||
|
res.data.configs.forEach(v => {
|
||||||
|
if (v.fieldName === item.fieldName) {
|
||||||
|
value.push(v.calcType)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.isShow = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appquestionnairetemplate/delete?id=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceByPage`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getAppList() {
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceApp`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.appList = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.id = ''
|
||||||
|
this.form.orderType = 'asc'
|
||||||
|
this.form.dataRange = 0
|
||||||
|
this.form.appId = ''
|
||||||
|
this.form.description = ''
|
||||||
|
this.form.appName = ''
|
||||||
|
this.form.appTableName = ''
|
||||||
|
this.form.count = 100
|
||||||
|
},
|
||||||
|
|
||||||
|
onAppChange(e) {
|
||||||
|
const value = this.appList.filter(v => v.id === e)[0]
|
||||||
|
this.form.appTableName = value.appTableName
|
||||||
|
this.form.appName = value.appName
|
||||||
|
this.form.statisticsConfigs = [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}]
|
||||||
|
this.form.orderConfigs = [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}]
|
||||||
|
this.form.groupConfigs = [{
|
||||||
|
alias: '',
|
||||||
|
calcType: '',
|
||||||
|
dictCode: '',
|
||||||
|
fieldCnName: '',
|
||||||
|
fieldName: ''
|
||||||
|
}]
|
||||||
|
this.filedList = value.fields.map(v => {
|
||||||
|
return {
|
||||||
|
...v,
|
||||||
|
value: ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
let configs = []
|
||||||
|
|
||||||
|
if (this.filedList.length) {
|
||||||
|
this.filedList.forEach(item => {
|
||||||
|
if (item.value.length) {
|
||||||
|
item.value.forEach(v => {
|
||||||
|
configs.push({
|
||||||
|
alias: item.fieldCnName,
|
||||||
|
calcType: v,
|
||||||
|
fieldCnName: item.fieldCnName,
|
||||||
|
fieldName: item.fieldName,
|
||||||
|
dictCode: item.dictCode,
|
||||||
|
orderType: this.orderType
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateDatasource`, {
|
||||||
|
...this.form,
|
||||||
|
configs,
|
||||||
|
id: this.id ? this.id : '',
|
||||||
|
dataRange: this.form.dataRange === '0' ? 0 : this.form.count
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$message.success(this.id ? '编辑成功' : '添加成功')
|
||||||
|
this.search.current = 1
|
||||||
|
this.isShow = false
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.$router.push({})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.form-flex {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
459
packages/bigscreen/designer/components/DataConfig.vue
Normal file
@@ -0,0 +1,459 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-config__group--wrapper">
|
||||||
|
<template v-if="options.type=='map'">
|
||||||
|
<ai-fold>
|
||||||
|
<div slot="title" class="flex w100">
|
||||||
|
<span class="layoutTitle fill">标记点设置</span>
|
||||||
|
<el-button type="text" icon="iconfont iconAdd" @click="handleMapMarker()">添加</el-button>
|
||||||
|
</div>
|
||||||
|
<config-item v-for="(item,i) in markers" :key="i" :label="item.label">
|
||||||
|
<el-input :value="[item.lat,item.lng].join(',')" readonly size="small"/>
|
||||||
|
<el-button type="text" icon="el-icon-edit" @click="handleMapMarker(item,i)"/>
|
||||||
|
<el-button type="text" icon="el-icon-delete" @click="removeMapMarker(i)"/>
|
||||||
|
</config-item>
|
||||||
|
</ai-fold>
|
||||||
|
<ai-fold title="标记点连线">
|
||||||
|
<ai-dialog-btn :modal="false" dialog-title="设置标记点连线" :customFooter="false" @confirm="savePolylines"
|
||||||
|
@open="handleMapPolylines">
|
||||||
|
<code-editor slot="btn" readonly :value="JSON.stringify(options.staticData.polylines, null, 2)" lang="json"
|
||||||
|
theme="github" width="100%" height="250" placeholder="测试默认值"/>
|
||||||
|
<el-button class="m-center" type="text" @click="handleMapPolylineDoc" :closable="false">
|
||||||
|
点击查看连线设置参考文档
|
||||||
|
</el-button>
|
||||||
|
<code-editor v-model="json" lang="json" theme="github" width="100%" height="440"/>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</ai-fold>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="isPlot">
|
||||||
|
<ai-fold v-for="(chart,i) in options.charts" :key="i">
|
||||||
|
<div slot="title" class="flex w100">
|
||||||
|
<span class="layoutTitle fill" v-text="chart.title"/>
|
||||||
|
<el-button type="text" icon="el-icon-delete" @click="options.charts.splice(i,1)"/>
|
||||||
|
</div>
|
||||||
|
<config-item label="图表名">
|
||||||
|
<el-input size="small" v-model="chart.title"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="图表模板">
|
||||||
|
<chart-picker v-model="chart.chart"/>
|
||||||
|
</config-item>
|
||||||
|
<datasource-picker v-model="chart.ds" :instance="instance" class="mar-b10"
|
||||||
|
@input="chart={...chart,...chart.ds},$emit('change',options)"/>
|
||||||
|
<config-item label="数据维度" v-if="chart.dataType !== 'staticData'">
|
||||||
|
<code-editor v-model="chart.djson" lang="json" theme="github" width="100%" height="100"
|
||||||
|
placeholder="参照echarts配置数据维度,为一个数组,数组的第一个值为维度值"
|
||||||
|
@change="v=>chart.dimensions=JSON.parse(v)"/>
|
||||||
|
</config-item>
|
||||||
|
</ai-fold>
|
||||||
|
<el-button type="text" icon="el-icon-plus" @click="options.charts.push({title:'新图表'})">添加图表</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="options.type=='monitorCarousel'">
|
||||||
|
<config-item label="监控列表">
|
||||||
|
<el-button type="text" icon="el-icon-plus" @click="options.list.push({})"/>
|
||||||
|
</config-item>
|
||||||
|
<el-table size="mini" :data="options.list" border :row-style="{backgroundColor:'transparent'}">
|
||||||
|
<el-table-column label="监控类型">
|
||||||
|
<template v-slot="{row}">
|
||||||
|
<ai-select size="mini" v-model="row.monitorType" :select-list="monitorTypes"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="监控地址">
|
||||||
|
<template v-slot="{row}">
|
||||||
|
<el-input v-if="['hik','dahua'].includes(row.monitorType)" size="mini" v-model="row.src" clearable/>
|
||||||
|
<div v-else-if="['cmcc','slw'].includes(row.monitorType)">
|
||||||
|
<el-input size="mini" v-model="row.api" clearable placeholder="请输入监控列表接口"/>
|
||||||
|
<ai-select v-model="row.did" :instance="instance" @change="handleMonitor(row)" size="mini"
|
||||||
|
:prop="{label:'name'}" :condition="e=>!!e.name&&!!e.id" class="mar-t8" :action="row.api"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="60px" label="操作">
|
||||||
|
<template v-slot="{row,i}">
|
||||||
|
<el-button type="text" @click="$confirm('是否删除该监控?').then(()=>options.list.splice(i,1))">删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</template>
|
||||||
|
<div class="layout-config__group" v-else-if="['hik','dahua'].includes(options.monitorType)">
|
||||||
|
<h2>基础设置</h2>
|
||||||
|
<config-item label="视频地址">
|
||||||
|
<el-input size="mini" v-model="options.src"/>
|
||||||
|
</config-item>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__group" v-else>
|
||||||
|
<h2>基础设置</h2>
|
||||||
|
<datasource-picker :options="options" :instance="instance" @input="$emit('change',options)"/>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__group" v-if="isTable">
|
||||||
|
<h2>表格设置</h2>
|
||||||
|
<code-editor v-model="json" theme="github" width="100%" height="440"
|
||||||
|
placeholder="参照dvScrollBoard设置表格"
|
||||||
|
@change="v=>options.tableConfig=JSON.parse(v)"/>
|
||||||
|
</div>
|
||||||
|
<div v-if="options.dataType!='staticData'&&options.type=='monitor'&&['cmcc','slw'].includes(options.monitorType)"
|
||||||
|
class="layout-config__group">
|
||||||
|
<h2>字段设置</h2>
|
||||||
|
<config-item label="监控视频">
|
||||||
|
<el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId">
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in monitorList"
|
||||||
|
:key="index"
|
||||||
|
:label="item.name"
|
||||||
|
:value="item.id">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
</div>
|
||||||
|
<div v-if="options.dataType!='staticData'&& keys.length &&!['table','monitor','map','plot'].includes(options.type)"
|
||||||
|
class="layout-config__group">
|
||||||
|
<h2>字段设置</h2>
|
||||||
|
<config-item label="X轴设置">
|
||||||
|
<el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange">
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in keys"
|
||||||
|
:key="index"
|
||||||
|
:label="item"
|
||||||
|
:value="item">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="Y轴设置">
|
||||||
|
<el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100"
|
||||||
|
v-model="options.dataY" collapse-tags placeholder="请选择Y轴"
|
||||||
|
@change="onChooseChange">
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in keys"
|
||||||
|
:key="index"
|
||||||
|
:label="item"
|
||||||
|
:value="item">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
</div>
|
||||||
|
<ai-dialog class="layout-config__edit" v-model="showMapEditor" title="设置地图标记点" append-to-body
|
||||||
|
@close="form={}" @confirm="saveMarker">
|
||||||
|
<el-form :model="form" size="small" ref="mapMarker" label-width="120px">
|
||||||
|
<el-form-item label="标记点名称" :rules="{required:true,message:'请填写标记点名称'}">
|
||||||
|
<el-input placeholder="用于地图上展示对标记点的文字标签" v-model="form.label" clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="标记点图标">
|
||||||
|
<el-input placeholder="用于地图上展示对标记点的显示图标" v-model="form.icon" clearable/>
|
||||||
|
</el-form-item>
|
||||||
|
<div flex>
|
||||||
|
<el-form-item class="fill" label="经度" :rules="{required:true,message:'请填写标记点经度'}">
|
||||||
|
<el-input v-model="form.lng" clearable placeholder="小数点位保留至少6位数"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item class="fill" label="纬度" :rules="{required:true,message:'请填写标记点纬度'}">
|
||||||
|
<el-input v-model="form.lat" clearable placeholder="小数点位保留至少6位数"/>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
<el-form-item label="弹窗内容">
|
||||||
|
<ai-editor v-model="form.infoWindowHtml" :instance="instance"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CodeEditor from 'bin-ace-editor'
|
||||||
|
import 'brace/mode/json'
|
||||||
|
import 'brace/snippets/json';
|
||||||
|
import 'brace/theme/github';
|
||||||
|
import 'brace/theme/monokai';
|
||||||
|
import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue";
|
||||||
|
import AiFold from "dui/packages/layout/AiFold.vue";
|
||||||
|
import ChartPicker from "./chartPicker.vue";
|
||||||
|
import {monitorTypes} from "../config";
|
||||||
|
import ConfigItem from "./configItem.vue";
|
||||||
|
import DatasourcePicker from "./datasourcePicker.vue";
|
||||||
|
import AiSelect from "dui/packages/basic/AiSelect.vue";
|
||||||
|
import {DvCompData} from "dui/dv";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'dataConfig',
|
||||||
|
model: {
|
||||||
|
prop: "options",
|
||||||
|
event: "change"
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
options: Object,
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})),
|
||||||
|
json: "",
|
||||||
|
keys: [],
|
||||||
|
monitorList: [],
|
||||||
|
list: [],
|
||||||
|
showMapEditor: false,
|
||||||
|
form: {},
|
||||||
|
datasource: {},
|
||||||
|
monitorTypes
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
markers: v => v.options.staticData?.markers || [],
|
||||||
|
isTable: v => v.options.type == 'table',
|
||||||
|
isPlot: v => v.options.type == 'plot'
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
AiSelect,
|
||||||
|
DatasourcePicker,
|
||||||
|
ConfigItem,
|
||||||
|
ChartPicker,
|
||||||
|
AiFold,
|
||||||
|
AiDialogBtn,
|
||||||
|
CodeEditor,
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
if (this.options.type == "map" && Array.isArray(this.options.staticData)) {//处理历史数据,并更新最新数据结构
|
||||||
|
const values = this.$copy(this.options)
|
||||||
|
values.staticData = {markers: this.$copy(this.options.staticData)}
|
||||||
|
this.$emit("change", values)
|
||||||
|
} else if (this.isTable) {
|
||||||
|
this.json = JSON.stringify(this.options.tableConfig)
|
||||||
|
} else if (this.options.type == "monitorCarousel") {
|
||||||
|
const {list = []} = this.options
|
||||||
|
this.$set(this.options, 'list', list)
|
||||||
|
} else if (this.isPlot) {
|
||||||
|
this.options.charts = this.options.charts.map(e => ({...e, ds: e}))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if ((this.options.dataY && this.options.dataY.length && this.options.dataX) || this.options.type === 'monitor') {
|
||||||
|
const api = this.options.dataType === 'apiData' ? this.options.api : `/app/appdiylargescreen/statisticsByLsid?id=${this.options.sourceDataId}`
|
||||||
|
this.instance.post(api).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
if (res.data.length && this.options.type !== 'monitor') {
|
||||||
|
this.list = res.data
|
||||||
|
this.keys = Object.keys(res.data[0])
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.onChooseChange()
|
||||||
|
})
|
||||||
|
} else if (this.options.type === 'monitor') {
|
||||||
|
this.monitorList = res.data
|
||||||
|
|
||||||
|
if (this.options.src) {
|
||||||
|
const obj = res.data.filter(v => this.options.title === v.name)
|
||||||
|
|
||||||
|
if (obj.length) {
|
||||||
|
this.options.src = obj[0].url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onMoniterId(e) {
|
||||||
|
this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${e}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.options.src = JSON.parse(res.data).url
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleMonitor(row) {
|
||||||
|
this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${row.did}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$set(row, 'src', JSON.parse(res.data).url)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onChooseChange() {
|
||||||
|
let arr = []
|
||||||
|
if (this.options.dataX && this.options.dataY.length) {
|
||||||
|
this.list.forEach(item => {
|
||||||
|
let obj = {}
|
||||||
|
this.options.dataY.forEach(v => {
|
||||||
|
obj[v] = item[v]
|
||||||
|
})
|
||||||
|
arr.push({
|
||||||
|
[this.options.dataX]: item[this.options.dataX],
|
||||||
|
...obj
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.options[this.options.dataType] = arr
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleMapMarker(v = {}, index) {
|
||||||
|
this.form = this.$copy({...v, index})
|
||||||
|
this.showMapEditor = true
|
||||||
|
},
|
||||||
|
saveMarker() {
|
||||||
|
this.$refs.mapMarker.validate().then(() => {
|
||||||
|
const i = this.$copy(this.form.index)
|
||||||
|
delete this.form.index
|
||||||
|
if (i > -1) {
|
||||||
|
this.options.staticData.markers.splice(i, 1, this.form)
|
||||||
|
} else this.options.staticData.markers.push(this.form)
|
||||||
|
this.showMapEditor = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
removeMapMarker(i) {
|
||||||
|
this.$confirm("是否要删除该标记点").then(() => {
|
||||||
|
this.options.staticData.markers.splice(i, 1)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
savePolylines() {
|
||||||
|
this.$set(this.options.staticData, 'polylines', JSON.parse(this.json))
|
||||||
|
},
|
||||||
|
handleMapPolylines() {
|
||||||
|
this.json = JSON.stringify(this.options.staticData.polylines || [{path: [[31.547706, 107.224325], [31.552456, 107.201185]]}])
|
||||||
|
},
|
||||||
|
handleMapPolylineDoc() {
|
||||||
|
window.open('https://lbs.amap.com/api/javascript-api-v2/documentation#polyline')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.el-dialog__body {
|
||||||
|
.jsoneditor-vue {
|
||||||
|
height: 480px;
|
||||||
|
|
||||||
|
.jsoneditor-poweredBy {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dialog__wrapper {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-config__group--wrapper {
|
||||||
|
|
||||||
|
:deep(.layout-config__group) {
|
||||||
|
padding: 10px 10px 20px;
|
||||||
|
border-bottom: 1px solid #000000;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layoutTitle {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.layout-config__item) {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 60px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select .el-tag {
|
||||||
|
color: #fff;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-switch__label {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background: #262C33;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #030411;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-collapse) {
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-icon-delete {
|
||||||
|
color: #f46;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-button--text + .el-button--text {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background: #262C33;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #030411;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-config__item--right {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
text-align: right;
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table {
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
tr {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__cell {
|
||||||
|
color: white;
|
||||||
|
background-color: #1D2127 !important;
|
||||||
|
|
||||||
|
input:disabled {
|
||||||
|
background-color: transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
color: white;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
border-left: 1px solid #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
91
packages/bigscreen/designer/components/chartPicker.vue
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<section class="chartPicker">
|
||||||
|
<ai-dialog-btn :modal="false" dialog-title="选择图表模板" :customFooter="false"
|
||||||
|
@confirm="handleConfirm" @open="handleOpenDialog">
|
||||||
|
<template #btn>
|
||||||
|
<img class="pointer thumb" v-if="current.thumb" :src="current.thumb"/>
|
||||||
|
<el-button v-else type="text">选择图表</el-button>
|
||||||
|
</template>
|
||||||
|
<div class="charts">
|
||||||
|
<div class="item pointer" v-for="(tpl,i) in tpls" :key="i" :class="{selected:selected==tpl.type}"
|
||||||
|
@click="selected=tpl.type">
|
||||||
|
<img :src="tpl.thumb"/>
|
||||||
|
<div v-text="tpl.label"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import AiDialogBtn from "dui/packages/layout/AiDialogBtn";
|
||||||
|
import {chartTpl} from "../config";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "chartPicker",
|
||||||
|
components: {AiDialogBtn},
|
||||||
|
model: {
|
||||||
|
prop: "value",
|
||||||
|
event: "input"
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: String,
|
||||||
|
tpls: {default: () => chartTpl.map(e => e.list).flat()}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selected: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
current: v => v.tpls.find(e => e.type == v.value) || {}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(v) {
|
||||||
|
v && this.$emit("config", this.$echartTpls[v])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleConfirm() {
|
||||||
|
this.$emit("input", this.selected)
|
||||||
|
},
|
||||||
|
handleOpenDialog() {
|
||||||
|
this.selected = this.$copy(this.value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.chartPicker {
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
.pointer {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumb {
|
||||||
|
width: 200px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
text-align: center;
|
||||||
|
padding: 2px;
|
||||||
|
border: 2px solid transparent;
|
||||||
|
|
||||||
|
& > img {
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected, &:hover {
|
||||||
|
border-color: #46f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
89
packages/bigscreen/designer/components/componentConfig.vue
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<template>
|
||||||
|
<section class="componentConfig">
|
||||||
|
<div class="layout-right__content--wrapper">
|
||||||
|
<div class="layout-config__group">
|
||||||
|
<h2>基础设置</h2>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>图表尺寸</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<el-input-number size="mini" :min="0" v-model="config.width" controls-position="right"/>
|
||||||
|
<el-input-number size="mini" :min="0" v-model="config.height" controls-position="right"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>图表位置</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<el-input-number size="mini" :min="0" v-model="config.left" controls-position="right"/>
|
||||||
|
<el-input-number size="mini" :min="0" v-model="config.top" controls-position="right"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<config-item label="內边距">
|
||||||
|
<el-input size="mini" v-model="config.padding" clearable placeholder="请输入符合css的padding合法值"/>
|
||||||
|
</config-item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-right__content--wrapper">
|
||||||
|
<div class="layout-config__group">
|
||||||
|
<h2>组件设置</h2>
|
||||||
|
<config-extra v-model="config"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-right__content--wrapper">
|
||||||
|
<div class="layout-config__group">
|
||||||
|
<h2>弹窗设置</h2>
|
||||||
|
<config-item label="标题">
|
||||||
|
<el-input size="mini" clearable placeholder="请输入弹窗标题" v-model="config.dialogTitle"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="内容" v-if="!['table','AiDvTable','AiDvMap','linkageMap'].includes(config.type)">
|
||||||
|
<ai-dialog-btn dialog-title="弹窗内容" text="打开编辑器" :modal="false">
|
||||||
|
<ai-editor clearable placeholder="请输入弹窗内容" v-model="config.dialogContent" :instance="instance"/>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</config-item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ConfigItem from "./configItem";
|
||||||
|
import ConfigExtra from "./configExtra.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'componentConfig',
|
||||||
|
components: {ConfigExtra, ConfigItem},
|
||||||
|
props: {
|
||||||
|
config: {default: () => ({})},
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.componentConfig {
|
||||||
|
.table-config {
|
||||||
|
& > div {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 232px;
|
||||||
|
|
||||||
|
:deep( .el-select ) {
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.el-input {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
:deep( input ) {
|
||||||
|
width: 80px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
239
packages/bigscreen/designer/components/configExtra.vue
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
<script>
|
||||||
|
import GroupItem from "./groupItem";
|
||||||
|
import ConfigItem from "./configItem";
|
||||||
|
import ChartPicker from "./chartPicker";
|
||||||
|
import JsonEditor from "./jsonEditor";
|
||||||
|
import {layers, monitorTypes} from "../config";
|
||||||
|
import AiDvSummary from "dui/dv/layout/AiDvSummary/AiDvSummary";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "configExtra",
|
||||||
|
components: {JsonEditor, ChartPicker, ConfigItem, GroupItem},
|
||||||
|
props: ['config'],
|
||||||
|
model: {
|
||||||
|
prop: 'config',
|
||||||
|
event: 'input'
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
borderList: ['border0', 'border1', 'border2', 'border3', 'border4', 'border5', 'border6', 'border7', 'border8', 'border9', 'border10',
|
||||||
|
'border11', 'border12', 'border13', 'border14', 'border15'],//边框待选项
|
||||||
|
layers, monitorTypes,
|
||||||
|
tableStatus: [
|
||||||
|
{label: '是', value: '1'},
|
||||||
|
{label: '否', value: '0'}
|
||||||
|
],
|
||||||
|
positionList: [
|
||||||
|
{label: "左上", id: "lt"},
|
||||||
|
{label: "右上", id: "rt"},
|
||||||
|
{label: "左下", id: "lb"},
|
||||||
|
{label: "右下", id: "rb"}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
summaryOps: () => Object.keys(AiDvSummary.components).map(e => ({label: e, id: e})),
|
||||||
|
values: v => v.config?.[v.config?.dataType] || v.config.data
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
values: {
|
||||||
|
immediate: true, deep: true,
|
||||||
|
handler() {
|
||||||
|
if (this.config.type === 'AiDvTable') {
|
||||||
|
this.config.config = this.values?.map((v, i) => {
|
||||||
|
return {
|
||||||
|
color: this.config.config?.[i]?.color || '',
|
||||||
|
width: this.config.config?.[i]?.width || '',
|
||||||
|
align: this.config.config?.[i]?.align || '',
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<section class="configExtra">
|
||||||
|
<config-item label="标题">
|
||||||
|
<el-input v-model="config.summaryTitle" size="mini" v-if="config.display === 'summary2'" placeholder="请输入标题"/>
|
||||||
|
<el-input v-else v-model="config.title" size="mini" placeholder="请输入标题"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="边框" v-if="config.type !== 'display'">
|
||||||
|
<el-select size="mini" v-model="config.border" placeholder="请选择边框" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in borderList"
|
||||||
|
:key="index"
|
||||||
|
:label="item"
|
||||||
|
:value="item">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="图表模板">
|
||||||
|
<chart-picker v-model="config.type" :tpls="layers" @input="v=>config.echartOps=$echartTpls[v]"/>
|
||||||
|
</config-item>
|
||||||
|
<template v-if="/(AiDvMap|linkageMap)/.test(config.type)">
|
||||||
|
<config-item label="地图数据(geoJSON)">
|
||||||
|
<el-input v-model="config.geoJson" size="mini" clearable placeholder="请输入geoJson的URL地址"/>
|
||||||
|
</config-item>
|
||||||
|
</template>
|
||||||
|
<template v-if="/linkageMap/.test(config.type)">
|
||||||
|
<config-item v-for="(item,i) in config.summaryConfigs" :key="i" :label="`统计${i+1}`">
|
||||||
|
<ai-select placeholder="请选择位置" v-model="item.pos" :select-list="positionList" size="mini"/>
|
||||||
|
<ai-select placeholder="请选择类型" v-model="item.display" :select-list="summaryOps" size="mini"/>
|
||||||
|
</config-item>
|
||||||
|
</template>
|
||||||
|
<template v-if="/tabs/.test(config.type)">
|
||||||
|
<group-item v-for="(tab,i) in values" :key="i" :label="i">
|
||||||
|
<group-item v-for="(comp,j) in tab" :key="j" :label="comp.name">
|
||||||
|
<config-extra v-model="tab[j]"/>
|
||||||
|
</group-item>
|
||||||
|
</group-item>
|
||||||
|
</template>
|
||||||
|
<template v-if="/Chart/.test(config.type)">
|
||||||
|
<config-item label="图表配置项" top-label>
|
||||||
|
<json-editor v-model="config.echartOps"/>
|
||||||
|
</config-item>
|
||||||
|
</template>
|
||||||
|
<config-item label="视频地址" v-if="config.type === 'video'">
|
||||||
|
<el-input v-model="config.src" size="mini"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="图片URL" v-if="config.type=='img'">
|
||||||
|
<el-input v-model="config.src" size="mini" clearable placeholder="请输入图片URL"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="视频类型" v-if="config.type === 'monitor'">
|
||||||
|
<ai-select size="mini" v-model="config.monitorType" :select-list="monitorTypes"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="样式" v-if="config.type === 'AiRanking'">
|
||||||
|
<el-select size="mini" v-model="config.subType" placeholder="请选择样式" clearable>
|
||||||
|
<el-option label="样式1" value="Ranking1"></el-option>
|
||||||
|
<el-option label="样式2" value="Ranking2"></el-option>
|
||||||
|
<el-option label="样式3" value="Ranking3"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<template v-if="config.type === 'table' || config.type === 'AiDvTable'">
|
||||||
|
<config-item label="显示排名">
|
||||||
|
<el-select size="mini" v-model="config.isShowIndex" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in tableStatus"
|
||||||
|
:key="index"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="斑马纹" v-if="config.type === 'AiDvTable'">
|
||||||
|
<el-select size="mini" v-model="config.stripe" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
label="是"
|
||||||
|
value="1">
|
||||||
|
</el-option>
|
||||||
|
<el-option
|
||||||
|
label="否"
|
||||||
|
value="0">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="简易样式" v-if="config.type === 'AiDvTable'">
|
||||||
|
<el-select size="mini" v-model="config.simple" placeholder="请选择" clearable>
|
||||||
|
<el-option
|
||||||
|
label="是"
|
||||||
|
value="1">
|
||||||
|
</el-option>
|
||||||
|
<el-option
|
||||||
|
label="否"
|
||||||
|
value="0">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="表格行数" v-if="config.type !== 'AiDvTable'">
|
||||||
|
<el-input-number size="mini" style="width: 232px" :min="0" v-model="config.rowNum" controls-position="right"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item v-if="config.type === 'AiDvTable'" v-for="(item, i) in config.config" :key="i" :label="`第${i+1}列`">
|
||||||
|
<el-select size="mini" style="width: 80px;" v-model="item.align" placeholder="请选择" clearable>
|
||||||
|
<el-option label="居中" value="center"></el-option>
|
||||||
|
<el-option label="居左" value="left"></el-option>
|
||||||
|
<el-option label="居右" value="right"></el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-color-picker v-model="item.color" class="mar-h10" size="mini"/>
|
||||||
|
<el-input-number v-model="item.width" label="描述文字" controls-position="right" size="mini"/>
|
||||||
|
</config-item>
|
||||||
|
</template>
|
||||||
|
<template v-if="config.type === 'map'">
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>遮罩层</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<el-select size="mini" v-model="config.mask" placeholder="请选择" clearable>
|
||||||
|
<el-option label="是" value="1"></el-option>
|
||||||
|
<el-option label="否" value="2"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>地图图层</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<el-select size="mini" v-model="config.layers" placeholder="请选择" clearable>
|
||||||
|
<el-option label="地图" value="vector"/>
|
||||||
|
<el-option label="卫星" value="satellite"/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>选择地区</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<AiAreaGet :instance="instance" :valueLevel="3" v-model="config.areaId" placeholder="地图展示的中心"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>限制地区</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.limitArea" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>显示标签</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.alwaysShow" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item">
|
||||||
|
<label>展示光轨</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.pulseLines" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item layout-config__item--input">
|
||||||
|
<label>地图样式</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<el-input size="mini" v-model="config.mapStyle" clearable placeholder="请输入地图样式ID,从UI处获取.."/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item layout-config__item--input">
|
||||||
|
<label>3D地图</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.is3d" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item layout-config__item--input" v-if="config.is3d==1">
|
||||||
|
<label>3D环绕</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.is3dAround" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-config__item layout-config__item--input">
|
||||||
|
<label>显示图例</label>
|
||||||
|
<div class="layout-config__item--right">
|
||||||
|
<ai-select v-model="config.showPingchangMapLegend" :selectList="dict.getDict('yesOrNo')"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<config-item label="数据汇总" v-if="config.type === 'summary'">
|
||||||
|
<ai-select size="mini" v-model="config.display" placeholder="请选择类型" :select-list="summaryOps"/>
|
||||||
|
</config-item>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
111
packages/bigscreen/designer/components/configItem.vue
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<template>
|
||||||
|
<section class="configItem" :class="{topLabel}">
|
||||||
|
<label :class="{bold}" v-text="label"/>
|
||||||
|
<div class="content fill">
|
||||||
|
<slot v-if="$slots.default"/>
|
||||||
|
<div v-else-if="value" v-html="value"/>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "configItem",
|
||||||
|
props: {
|
||||||
|
label: String,
|
||||||
|
value: {default: null},
|
||||||
|
topLabel: Boolean,
|
||||||
|
bold: Boolean
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.configItem {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > label {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 60px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: right;
|
||||||
|
|
||||||
|
&.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select .el-tag {
|
||||||
|
color: #fff;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-switch__label {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select, .ai-select {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background: #262C33;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #030411;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-collapse) {
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.content) {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
text-align: right;
|
||||||
|
margin-left: 27px;
|
||||||
|
|
||||||
|
input, textarea {
|
||||||
|
background: #262C33;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #030411;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.topLabel {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: normal;
|
||||||
|
|
||||||
|
& > label {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
119
packages/bigscreen/designer/components/datasourcePicker.vue
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<section class="datasourcePicker">
|
||||||
|
<config-item label="数据类型">
|
||||||
|
<ai-select v-model="source.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/>
|
||||||
|
</config-item>
|
||||||
|
<div class="codeEditor" v-if="['htmlData'].includes(source.dataType)">
|
||||||
|
<ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false"
|
||||||
|
@confirm="changeData(JSON.parse(content))" @open="content=contentstr">
|
||||||
|
<code-editor slot="btn" readonly :value="contentstr" :lang="dataLang" theme="github" width="100%" height="250"/>
|
||||||
|
<code-editor v-model="content" :lang="dataLang" theme="github" width="100%" height="440" wrap/>
|
||||||
|
</ai-dialog-btn>
|
||||||
|
</div>
|
||||||
|
<template v-else-if="source.dataType === 'staticData'">
|
||||||
|
<config-item label="设置数据" topLabel>
|
||||||
|
<json-editor v-model="options.staticData" mainMenuBar/>
|
||||||
|
</config-item>
|
||||||
|
</template>
|
||||||
|
<config-item v-else-if="source.dataType === 'dynamicData'" label="数据源">
|
||||||
|
<ai-select v-model="source.sourceDataId" placeholder="请选择数据源" :instance="instance"
|
||||||
|
:prop="{label:'description'}" @change="changeData"
|
||||||
|
action="/app/appdiylargescreen/allDatasourceByPage"/>
|
||||||
|
</config-item>
|
||||||
|
<config-item label="接口地址" v-else-if="source.dataType === 'apiData'">
|
||||||
|
<el-input size="small" v-model="source.api" @change="changeData" placeholder="请输入数据接口URL"/>
|
||||||
|
</config-item>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue";
|
||||||
|
import ConfigItem from "./configItem.vue";
|
||||||
|
import CodeEditor from 'bin-ace-editor'
|
||||||
|
import 'brace/mode/json'
|
||||||
|
import 'brace/snippets/json';
|
||||||
|
import 'brace/theme/github';
|
||||||
|
import 'brace/theme/monokai';
|
||||||
|
import JsonEditor from "./jsonEditor.vue";
|
||||||
|
import {DvCompData} from "dui/dv";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "datasourcePicker",
|
||||||
|
components: {JsonEditor, ConfigItem, AiDialogBtn, CodeEditor},
|
||||||
|
model: {
|
||||||
|
event: "input",
|
||||||
|
prop: "options"
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
options: Object,
|
||||||
|
instance: Function
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})),
|
||||||
|
content: "",
|
||||||
|
loading: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
contentstr: v => JSON.stringify(v.options.staticData),
|
||||||
|
dataLang: v => v.options.dataType == 'htmlData' ? 'html' : 'json',
|
||||||
|
source: {
|
||||||
|
set(v) {
|
||||||
|
this.$emit("input", v)
|
||||||
|
},
|
||||||
|
get() {
|
||||||
|
return this.options
|
||||||
|
}
|
||||||
|
},
|
||||||
|
staticDataOps() {
|
||||||
|
const columnProp = "name", ops = {colConfigs: [], tableData: []}
|
||||||
|
if (Array.isArray(this.options.staticData)) {
|
||||||
|
const columns = []
|
||||||
|
ops.colConfigs = []
|
||||||
|
this.options.staticData.map((row, i) => {
|
||||||
|
const prop = `c${i || ""}`
|
||||||
|
ops.colConfigs.push({label: row[columnProp] || row.key, prop})
|
||||||
|
Object.entries(row).map(([k, v]) => {
|
||||||
|
if (/^v/.test(k) && k != "value") {
|
||||||
|
const item = ops.tableData[k.substring(1) || 0] || {}
|
||||||
|
item[prop] = v
|
||||||
|
ops.tableData[k.substring(1) || 0] = item
|
||||||
|
} else if (![columnProp, 'key'].includes(k)) {
|
||||||
|
const index = columns.findIndex(e => k == e)
|
||||||
|
if (index > -1) {
|
||||||
|
const item = ops.tableData[index] || {}
|
||||||
|
item[prop] = v
|
||||||
|
ops.tableData[index] = item
|
||||||
|
} else {
|
||||||
|
columns.push(k)
|
||||||
|
const newIndex = columns.length - 1
|
||||||
|
const item = ops.tableData[newIndex] || {}
|
||||||
|
item[prop] = v
|
||||||
|
ops.tableData[newIndex] = item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
ops.tableData = ops.tableData.map(e => ({...e, $cellEdit: false}))
|
||||||
|
}
|
||||||
|
return ops
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
changeData(sdata) {
|
||||||
|
this.source.dataType == 'staticData' ? this.source.staticData = sdata :
|
||||||
|
new DvCompData(this.source, this.instance).getData().then(data => {
|
||||||
|
this.source[this.source.dataType] = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.datasourcePicker {
|
||||||
|
.codeEditor {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
32
packages/bigscreen/designer/components/groupItem.vue
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "groupItem",
|
||||||
|
props: ['label']
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<section class="groupItem">
|
||||||
|
<h2 v-if="label" v-text="label"/>
|
||||||
|
<slot/>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.groupItem {
|
||||||
|
padding: 10px 10px 20px;
|
||||||
|
border-bottom: 1px solid #000000;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
98
packages/bigscreen/designer/components/jsonEditor.vue
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "jsonEditor",
|
||||||
|
model: {
|
||||||
|
event: "input",
|
||||||
|
prop: "value"
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {default: () => ({})}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
editor: null,
|
||||||
|
fullscreen: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(v) {
|
||||||
|
const content = this.editor.get()
|
||||||
|
if (v && content && JSON.stringify(v) != JSON.stringify(content)) {
|
||||||
|
this.editor?.set(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
init() {
|
||||||
|
const {JSONEditor} = window
|
||||||
|
if (!this.editor && JSONEditor) {
|
||||||
|
const {mode, search, mainMenuBar, navigationBar} = this.$attrs
|
||||||
|
this.editor = new JSONEditor(this.$el, {
|
||||||
|
modes: ['code', 'form', 'tree'],
|
||||||
|
language: 'zh-CN', mode, search, mainMenuBar, navigationBar, statusBar: true,
|
||||||
|
onChange: () => {
|
||||||
|
this.$emit("input", this.editor.get())
|
||||||
|
},
|
||||||
|
}, this.value)
|
||||||
|
} else setTimeout(() => this.init(), 500)
|
||||||
|
const fullscreenBtn = this.$el.querySelector(".fullscreenBtn")
|
||||||
|
if (!fullscreenBtn) {
|
||||||
|
const btn = document.createElement("div")
|
||||||
|
btn.className = "fullscreenBtn el-icon-full-screen"
|
||||||
|
btn.onclick = evt => {
|
||||||
|
evt.stopPropagation()
|
||||||
|
this.fullscreen = !this.fullscreen
|
||||||
|
}
|
||||||
|
this.$el.appendChild(btn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.init()
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.editor?.destroy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<section class="jsoneditor" @contextmenu.stop :class="{fullscreen}"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.jsoneditor {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&.fullscreen {
|
||||||
|
position: fixed;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 80vw;
|
||||||
|
height: 80vh;
|
||||||
|
z-index: 202403221146;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ace-jsoneditor) {
|
||||||
|
font-size: 14px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.fullscreenBtn) {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 202403221132;
|
||||||
|
right: 6px;
|
||||||
|
top: 0;
|
||||||
|
height: 35px;
|
||||||
|
color: white;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: rgba(white, .6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
794
packages/bigscreen/designer/config.js
Normal file
@@ -0,0 +1,794 @@
|
|||||||
|
/**
|
||||||
|
* 大屏设计资产库,模板设置中心
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export const chartTpl = [{
|
||||||
|
label: '柱状图', type: 'bar', list: [{
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart1',
|
||||||
|
label: '柱状图1',
|
||||||
|
title: '柱状图',
|
||||||
|
border: 'border6',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar1.png',
|
||||||
|
width: 500,
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
dataX: '',
|
||||||
|
zIndex: 1,
|
||||||
|
dataY: [],
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart1',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart2',
|
||||||
|
label: '柱状图2',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
title: '柱状图2',
|
||||||
|
width: 500,
|
||||||
|
border: 'border6',
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar2.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
top: 0,
|
||||||
|
zIndex: 1,
|
||||||
|
left: 0,
|
||||||
|
dataType: 'staticData',
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart2',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart3',
|
||||||
|
label: '柱状图3',
|
||||||
|
title: '柱状图3',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar3.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
border: 'border6',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
zIndex: 1,
|
||||||
|
dataType: 'staticData',
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart3',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart5',
|
||||||
|
label: '柱状图4',
|
||||||
|
title: '柱状图4',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar5.png',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
border: 'border6',
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart5',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart7',
|
||||||
|
label: '柱状图5',
|
||||||
|
title: '柱状图5',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar7.png',
|
||||||
|
dataX: '',
|
||||||
|
zIndex: 1,
|
||||||
|
dataY: [],
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart7',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart8',
|
||||||
|
label: '柱状图6',
|
||||||
|
title: '柱状图6',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
sourceDataId: '',
|
||||||
|
border: 'border6',
|
||||||
|
height: 300,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar8.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart8',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'barChart9',
|
||||||
|
label: '柱状图7',
|
||||||
|
title: '柱状图7',
|
||||||
|
border: 'border6',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar9.png',
|
||||||
|
sourceDataId: '',
|
||||||
|
height: 300,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}],
|
||||||
|
config: 'barChart9',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
type: 'barChart10',
|
||||||
|
label: '柱状图8',
|
||||||
|
title: '柱状图8',
|
||||||
|
border: 'border13',
|
||||||
|
width: 500,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar10.png',
|
||||||
|
height: 300,
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}],
|
||||||
|
config: 'barChart10'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
label: '折线图', type: 'line', list: [{
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'lineChart1',
|
||||||
|
label: '折线图1',
|
||||||
|
title: '折线图1',
|
||||||
|
border: 'border6',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
zIndex: 1,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line1.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'lineChart1',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'lineChart2',
|
||||||
|
label: '折线图2',
|
||||||
|
title: '折线图2',
|
||||||
|
border: 'border6',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line2.png',
|
||||||
|
height: 300,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
zIndex: 1,
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'lineChart2',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'lineChart3',
|
||||||
|
label: '折线图3',
|
||||||
|
title: '折线图3',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
border: 'border6',
|
||||||
|
value: '',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line3.png',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'lineChart3',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'lineChart4',
|
||||||
|
label: '折线图4',
|
||||||
|
title: '折线图4',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
border: 'border6',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line4.png',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'lineChart4',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'lineChart5',
|
||||||
|
label: '折线图5',
|
||||||
|
title: '折线图5',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
border: 'border6',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line5.png',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'lineChart5',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '饼图', type: 'pie', list: [{
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'pieChart2',
|
||||||
|
config: 'pieChart2',
|
||||||
|
label: '饼图',
|
||||||
|
title: '饼图',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
border: 'border6',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'pieChart1',
|
||||||
|
label: '饼图',
|
||||||
|
title: '饼图',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
border: 'border6',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'pieChart1',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
code: 'widget-linechart',
|
||||||
|
type: 'pieChart3',
|
||||||
|
label: '饼图',
|
||||||
|
title: '饼图',
|
||||||
|
icon: 'icontext_box',
|
||||||
|
value: '',
|
||||||
|
border: 'border6',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}],
|
||||||
|
config: 'pieChart3',
|
||||||
|
sourceDataId: '',
|
||||||
|
dynamicData: []
|
||||||
|
}, {
|
||||||
|
type: 'summary',
|
||||||
|
label: '进度饼图',
|
||||||
|
title: '进度饼图',
|
||||||
|
border: 'border15',
|
||||||
|
display: 'processPie',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/processPieChart.png',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: {name: '综合调处率', label: "累计调解成功", v1: 23, totalLabel: "累计排查受理", total: 33},
|
||||||
|
},]
|
||||||
|
}, {
|
||||||
|
label: '关系图', type: 'graph', list: [{
|
||||||
|
type: "graphChart1",
|
||||||
|
label: "气泡图", title: "气泡图", border: 'border15',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/graphChart1.png',
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
const maps = [{
|
||||||
|
type: 'map',
|
||||||
|
label: '地图',
|
||||||
|
display: 'map',
|
||||||
|
width: 840,
|
||||||
|
height: 534,
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
mask: '2',
|
||||||
|
pulseLines: '1',
|
||||||
|
mapStyle: "e51987628aee5206d4c9ca8c6e98b4f7",
|
||||||
|
areaId: '',
|
||||||
|
zIndex: 1,
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
dynamicData: [],
|
||||||
|
staticData: [{
|
||||||
|
label: '中卫慧通', lng: 117.1339399, lat: 36.7190487,
|
||||||
|
}],
|
||||||
|
api: '',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/map.png',
|
||||||
|
is3dAround: '0',
|
||||||
|
limitArea: '0',
|
||||||
|
layers: 'vector'
|
||||||
|
}, {
|
||||||
|
type: 'AiDvMap',
|
||||||
|
label: 'echart地图',
|
||||||
|
display: 'map',
|
||||||
|
width: 840,
|
||||||
|
height: 534,
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
mask: '2',
|
||||||
|
pulseLines: '1',
|
||||||
|
mapStyle: "e51987628aee5206d4c9ca8c6e98b4f7",
|
||||||
|
areaId: '',
|
||||||
|
zIndex: 1,
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
dynamicData: [],
|
||||||
|
staticData: [{
|
||||||
|
label: '中卫慧通', lng: 117.1339399, lat: 36.7190487,
|
||||||
|
}],
|
||||||
|
api: '',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/map.png',
|
||||||
|
is3dAround: '0',
|
||||||
|
limitArea: '0',
|
||||||
|
}, {type: "linkageMap", label: "联动地图", width: 800, height: 964, top: 0, left: 560, thumb: "https://cdn.cunwuyun.cn/dvcp/dv/tpl/linkageMap.png", dataType: 'staticData'}]
|
||||||
|
const customHtml = {
|
||||||
|
label: "HTML块", type: "html", list: [{
|
||||||
|
type: 'html',
|
||||||
|
label: '自定义HTML',
|
||||||
|
title: '自定义HTML',
|
||||||
|
border: 'border0',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
||||||
|
html: `<div style="width: 100%;height: 100%;background: #fff;text-align: center;line-height: 300px;font-size: 20px;color: #000;">自定义HTML</div>`
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
const tables = [{
|
||||||
|
type: 'table',
|
||||||
|
label: '表格',
|
||||||
|
title: '表格',
|
||||||
|
border: 'border6',
|
||||||
|
width: 650,
|
||||||
|
height: 400,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
rowNum: 7,
|
||||||
|
isShowIndex: '1',
|
||||||
|
sourceDataId: '',
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
dynamicData: [],
|
||||||
|
staticData: [{name: '列1', v: 23, v2: 3}, {name: '列2', v: 12, v2: 4}, {name: '列2', v: 12, v2: 4}]
|
||||||
|
}, {
|
||||||
|
type: 'AiDvTable',
|
||||||
|
label: '新版表格',
|
||||||
|
title: '新版表格',
|
||||||
|
border: 'border6',
|
||||||
|
width: 650,
|
||||||
|
height: 400,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
rowNum: 7,
|
||||||
|
stripe: '1',
|
||||||
|
isShowIndex: '1',
|
||||||
|
sourceDataId: '',
|
||||||
|
api: '',
|
||||||
|
config: [{
|
||||||
|
width: '', color: '', align: ''
|
||||||
|
}, {
|
||||||
|
width: '', color: '', align: ''
|
||||||
|
}, {
|
||||||
|
width: '', color: '', align: ''
|
||||||
|
}],
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
dynamicData: [],
|
||||||
|
staticData: [{name: '列1', v: 23, v2: 3}, {name: '列2', v: 12, v2: 4}, {name: '列2', v: 12, v2: 4}]
|
||||||
|
}, {
|
||||||
|
type: 'AiRanking',
|
||||||
|
label: '排行榜',
|
||||||
|
title: '排行榜',
|
||||||
|
border: 'border6',
|
||||||
|
width: 523,
|
||||||
|
height: 400,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png',
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
rowNum: 7,
|
||||||
|
subType: 'Ranking1',
|
||||||
|
stripe: '1',
|
||||||
|
isShowIndex: '1',
|
||||||
|
sourceDataId: '',
|
||||||
|
api: '',
|
||||||
|
apiData: [],
|
||||||
|
dataType: 'staticData',
|
||||||
|
dynamicData: [],
|
||||||
|
staticData: [{name: '列1', value: 23}, {name: '列2', value: 12}, {name: '列2', value: 12}]
|
||||||
|
}]
|
||||||
|
const layouts = [
|
||||||
|
{
|
||||||
|
type: 'display',
|
||||||
|
label: '装饰',
|
||||||
|
display: 'display0',
|
||||||
|
width: 840,
|
||||||
|
height: 540,
|
||||||
|
isZoom: false,
|
||||||
|
zIndex: 1,
|
||||||
|
title: '标题',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/display.png',
|
||||||
|
sourceDataId: '',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{
|
||||||
|
label: '个人服务办理', value: 247
|
||||||
|
}, {
|
||||||
|
label: '同比上月', value: 247
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
type: 'panel',
|
||||||
|
label: '边框',
|
||||||
|
title: '边框',
|
||||||
|
border: 'border0',
|
||||||
|
width: 400,
|
||||||
|
height: 400,
|
||||||
|
isZoom: false,
|
||||||
|
zIndex: 1,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/border.png'
|
||||||
|
}, {
|
||||||
|
type: 'summary',
|
||||||
|
label: '数据统计',
|
||||||
|
display: 'summary0',
|
||||||
|
width: 480,
|
||||||
|
height: 240,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
summaryTitle: '',
|
||||||
|
border: 'border3',
|
||||||
|
sourceDataId: '',
|
||||||
|
title: '数据统计',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{
|
||||||
|
key: '个人服务办理', value: 247
|
||||||
|
}, {
|
||||||
|
key: '同比上月', value: 247
|
||||||
|
}],
|
||||||
|
dynamicData: [],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
const others = [
|
||||||
|
{
|
||||||
|
label: "图片", list: [
|
||||||
|
{
|
||||||
|
label: "普通图片",
|
||||||
|
type: "img",
|
||||||
|
width: 500,
|
||||||
|
height: 400,
|
||||||
|
thumb: "https://cdn.cunwuyun.cn/dvcp/dv/img/display0-bg.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '党组织', type: 'partyOrg', list: [{
|
||||||
|
type: 'partyOrg',
|
||||||
|
label: '党组织',
|
||||||
|
width: 840,
|
||||||
|
height: 800,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
dataX: '',
|
||||||
|
dataY: [],
|
||||||
|
title: '党组织',
|
||||||
|
border: 'border3',
|
||||||
|
sourceDataId: '',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{
|
||||||
|
key: '个人服务办理', value: 247
|
||||||
|
}, {
|
||||||
|
key: '同比上月', value: 247
|
||||||
|
}],
|
||||||
|
dynamicData: [],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: '轮播图', list: [{
|
||||||
|
type: 'swiper',
|
||||||
|
label: '轮播图',
|
||||||
|
width: 400,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
border: 'border2',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{
|
||||||
|
img: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', title: '湖羊', content: `歙县众城湖羊养殖专业合作社
|
||||||
|
徐晓红 - 18273645627
|
||||||
|
歙县郑村镇唐跃村碉墅`
|
||||||
|
}],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png'
|
||||||
|
}, {
|
||||||
|
type: 'swiper',
|
||||||
|
label: '轮播图(点指示器)',
|
||||||
|
width: 800,
|
||||||
|
height: 358,
|
||||||
|
zIndex: 1,
|
||||||
|
border: 'border14',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: [{
|
||||||
|
content: `歙县众城湖羊养殖专业合作社
|
||||||
|
徐晓红 - 18273645627
|
||||||
|
歙县郑村镇唐跃村碉墅`
|
||||||
|
}, {
|
||||||
|
content: `歙县众城湖羊养殖专业合作社
|
||||||
|
徐晓红 - 18273645627
|
||||||
|
歙县郑村镇唐跃村碉墅`
|
||||||
|
},],
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png',
|
||||||
|
dotIndicator: true
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: '视频播放器', type: 'video', list: [{
|
||||||
|
type: 'video',
|
||||||
|
label: '视频播放器',
|
||||||
|
width: 400,
|
||||||
|
height: 300,
|
||||||
|
zIndex: 1,
|
||||||
|
src: '',
|
||||||
|
border: 'border2',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png'
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: '视频监控', list: [
|
||||||
|
{
|
||||||
|
type: 'monitor',
|
||||||
|
label: '视频监控',
|
||||||
|
src: '',
|
||||||
|
width: 480,
|
||||||
|
height: 240,
|
||||||
|
zIndex: 1,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
title: '',
|
||||||
|
moniterId: '',
|
||||||
|
monitorType: 'cmcc',
|
||||||
|
api: '/app/appzyvideoequipment/list2',
|
||||||
|
border: 'border2',
|
||||||
|
sourceDataId: '',
|
||||||
|
dataType: 'staticData',
|
||||||
|
staticData: '',
|
||||||
|
dynamicData: '',
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/video.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "monitorCarousel",
|
||||||
|
label: "视频轮播",
|
||||||
|
width: 480,
|
||||||
|
height: 480,
|
||||||
|
zIndex: 1,
|
||||||
|
title: "视频轮播",
|
||||||
|
thumb: "https://cdn.cunwuyun.cn/dvcp/dv/tpl/video.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}, customHtml]
|
||||||
|
const components = [{
|
||||||
|
label: '图表', list: [...chartTpl, {
|
||||||
|
label: "多维图", type: "plot", list: [{
|
||||||
|
type: 'plot',
|
||||||
|
label: '多维图表',
|
||||||
|
title: '多维图表',
|
||||||
|
border: 'border0',
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
||||||
|
charts: [{
|
||||||
|
title: "饼状图统计",
|
||||||
|
chart: "pieChart2",
|
||||||
|
dataType: 'staticData',
|
||||||
|
data: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, {
|
||||||
|
name: '凡哥',
|
||||||
|
v1: 67,
|
||||||
|
v2: 25
|
||||||
|
}, {name: '党费', v1: 98, v2: 85}]
|
||||||
|
}],
|
||||||
|
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{label: '表格', list: tables},
|
||||||
|
{
|
||||||
|
label: "样式", list: [...layouts, {
|
||||||
|
type: "tabs", label: "TAB页签", border: "border13", width: 480,
|
||||||
|
height: 240, thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/tabs.png', top: 0, left: 0,
|
||||||
|
dataType: 'staticData', staticData: {}, title: "TAB页签"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{label: '地图', list: maps}, {
|
||||||
|
type: 'ai3d', label: "3D", list: [{
|
||||||
|
label: "3D楼栋", type: 'building', list: [{
|
||||||
|
type: 'building1',
|
||||||
|
label: "楼栋模型1",
|
||||||
|
width: 840,
|
||||||
|
height: 800,
|
||||||
|
zIndex: 1,
|
||||||
|
title: "楼栋模型1",
|
||||||
|
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: "AI", list: [{
|
||||||
|
type: "aiAssist",
|
||||||
|
label: "AI助手",
|
||||||
|
width: 134,
|
||||||
|
height: 140,
|
||||||
|
zIndex: 1,
|
||||||
|
title: "AI助手",
|
||||||
|
thumb: "https://cdn.cunwuyun.cn/dvcp/dv/aiIcon.png"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: '其他', list: others
|
||||||
|
}]
|
||||||
|
export const layers = [...chartTpl.map(e => e.list), maps, tables, layouts, ...others.map(e => e.list)].flat()
|
||||||
|
export {components}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监控类型
|
||||||
|
*/
|
||||||
|
export const monitorTypes = [
|
||||||
|
{dictName: "中国移动", dictValue: "cmcc"},
|
||||||
|
{dictName: "海康威视", dictValue: "hik"},
|
||||||
|
{dictName: "大华", dictValue: "dahua"},
|
||||||
|
{dictName: "视联网", dictValue: "slw"},
|
||||||
|
]
|
||||||
58
packages/bigscreen/designer/preview.vue
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<template>
|
||||||
|
<section class="preview">
|
||||||
|
<ai-dv-wrapper :views="[{label: '返回'}]" :theme="config.theme" @change="handleBack" v-if="screenId" :title="info.name" :background="bgImg" :titleSize="config.titleSize">
|
||||||
|
<ai-dv-viewer :urlPrefix="urlPrefix" :instance="instance" :dict="dict" :id="screenId"/>
|
||||||
|
</ai-dv-wrapper>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapActions} from "vuex"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "preview",
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function,
|
||||||
|
urlPrefix: {
|
||||||
|
type: String,
|
||||||
|
default: '/app'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
screenId: v => v.$route.query.id,
|
||||||
|
bgImg: v => v.config.theme == 1 ? 'https://cdn.cunwuyun.cn/dvcp/dv/img/dj_bg.png' : (v.config.backgroundImage?.[0]?.url || "")
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
info: {},
|
||||||
|
config: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
...mapActions(['closePage']),
|
||||||
|
getDvData() {
|
||||||
|
let {id} = this.$route.query
|
||||||
|
this.instance.post(`/app/appdiylargescreen/queryLargeScreenDetailById?id=${id}`).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.info = res.data
|
||||||
|
this.config = JSON.parse(res.data.config).dashboard
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleBack() {
|
||||||
|
this.$router.back()
|
||||||
|
this.closePage()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getDvData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.preview {
|
||||||
|
}
|
||||||
|
</style>
|
||||||
1119
packages/bigscreen/designer/viewport.vue
Normal file
133
packages/bigscreen/dv/AppCentralTaskDV.vue
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppCentralTaskDV">
|
||||||
|
<!-- <ai-dv-background :src="bgImage"/>-->
|
||||||
|
<div class="coreTask">
|
||||||
|
<div class="leftBox">
|
||||||
|
<div class="boxTitle">{{ coreTaskData.titleText }}</div>
|
||||||
|
<dv-scroll-board v-if="refresh" :config="coreTaskData"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {scrollBoard} from '@jiaminghi/data-view'
|
||||||
|
import bgImage from './assets/centralTask/bg.png'
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
Vue.use(scrollBoard)
|
||||||
|
export default {
|
||||||
|
name: "AppCentralTaskDV",
|
||||||
|
label: "数据大屏-重点工作",
|
||||||
|
props: {
|
||||||
|
nav: {default: () => ({})}
|
||||||
|
},
|
||||||
|
inject: {
|
||||||
|
dv: {default: ""}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
coreTaskData() {
|
||||||
|
return {
|
||||||
|
headerHeight: 52,
|
||||||
|
header: ['基层组织建设', "社区治理", "便民服务效能", "城市管理"],
|
||||||
|
headerBGC: 'rgba(0, 113, 255, 0.5)',
|
||||||
|
oddRowBGC: "rgba(5, 65, 139, 0.5)",
|
||||||
|
evenRowBGC: "rgba(5, 65, 139, 0.5)",
|
||||||
|
waitTime: 6000,
|
||||||
|
align: ["center", "start", "center", "center"],
|
||||||
|
rowNum: 5,
|
||||||
|
...this.nav.data,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {bgImage, refresh: true}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
nav: {
|
||||||
|
deep: true,
|
||||||
|
handler() {
|
||||||
|
this.refresh = false
|
||||||
|
this.$nextTick(() => this.refresh = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppCentralTaskDV {
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 0 60px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.coreTask {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 53px;
|
||||||
|
margin-top: 56px;
|
||||||
|
|
||||||
|
.leftBox {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-image: url("./assets/centralTask/box.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 40px 42px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxTitle {
|
||||||
|
height: 68px;
|
||||||
|
width: 534px;
|
||||||
|
background-image: url("./assets/centralTask/titleBox.png");
|
||||||
|
text-align: center;
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #71F8FF;
|
||||||
|
transform: translateY(-32px);
|
||||||
|
line-height: 68px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .dv-scroll-board ){
|
||||||
|
width: 100%;
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
border-radius: 6px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
color: #9FDBFB;
|
||||||
|
font-size: 20px;
|
||||||
|
|
||||||
|
.header-item {
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #054596;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row-item {
|
||||||
|
color: #68F0FC;
|
||||||
|
font-size: 18px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.ceil {
|
||||||
|
border: 1px solid #054596;
|
||||||
|
border-top: none;
|
||||||
|
position: relative;
|
||||||
|
line-height: 30px;
|
||||||
|
white-space: normal;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
479
packages/bigscreen/dv/AppGovInteractionDV.vue
Normal file
@@ -0,0 +1,479 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppGovInteractionDV">
|
||||||
|
<el-row type="flex" justify="space-between" align="bottom">
|
||||||
|
<div flex class="framePane column top">
|
||||||
|
<div class="titlePane" v-text="'事件内容'"/>
|
||||||
|
<div class="fill">
|
||||||
|
<dv-scroll-board :config="topLeftData"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="centerTopPane" id="centerTopPane">
|
||||||
|
<b class="title gradientFont">事件统计</b>
|
||||||
|
<el-row type="flex" justify="space-between" align="middle"
|
||||||
|
v-for="(row,i) in topCenterData" :key="i">
|
||||||
|
<div class="dataPane" v-for="(op,j) in row" :key="j">
|
||||||
|
<span class="gradientFont" v-text="op.label"/>
|
||||||
|
<dv-digital-flop class="gradientFont" :config="op.v1"/>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
<div flex class="framePane column top">
|
||||||
|
<div class="titlePane" v-text="'政务微信群'"/>
|
||||||
|
<div class="totalPane" flex>
|
||||||
|
<div class="dataPanel fill" flex v-for="(op,i) in rightTopData.total" :key="i">
|
||||||
|
<span v-text="op.label"/>
|
||||||
|
<b v-text="op.v1"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fill">
|
||||||
|
<ai-echart class="chart" :data="rightTopData.list" :ops="rightTopData.ops"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
<div flex class="gap fill">
|
||||||
|
<div flex class="framePane fill column" v-for="c in charts" :key="c.id">
|
||||||
|
<div class="titlePane" v-text="c.label"/>
|
||||||
|
<div class="fill">
|
||||||
|
<ai-echart class="chart" :data="chartData[c.id]" :ops="c.ops"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {digitalFlop, scrollBoard} from '@jiaminghi/data-view'
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
Vue.use(digitalFlop)
|
||||||
|
Vue.use(scrollBoard)
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "AppGovInteractionDV",
|
||||||
|
label: "数据大屏-政民互动",
|
||||||
|
props: {
|
||||||
|
instance: Function
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
topCenterData() {
|
||||||
|
let meta = [
|
||||||
|
[{label: "待受理", name: 'pending'}, {label: "累计上报", name: 'total_case'}],
|
||||||
|
[{label: "办理中", name: 'processing'}, {label: "累计受理", name: 'total_accepted'}],
|
||||||
|
[{label: "今日上报", name: "added_today"}, {label: "累计办结", name: 'total_solved'}],
|
||||||
|
[{label: "今日办结", name: 'solved_today'}, {label: "累计办结率", name: 'total_solved_percent'}],
|
||||||
|
]
|
||||||
|
return meta.map(e => e.map(s => {
|
||||||
|
let v1 = {
|
||||||
|
number: [this.meta.residentCategoryReport?.[s.name] || 0],
|
||||||
|
style: {
|
||||||
|
fontFamily: 'dineng',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
fontSize: 40,
|
||||||
|
gradientType: 'linear',
|
||||||
|
gradientColor: ['#fff', '#fff', '#6BC7FF'],
|
||||||
|
gradientParams: [0, 0, 0, 40],
|
||||||
|
gradientWith: 'fill',
|
||||||
|
gradientStops: [0, .18, 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (s.name == 'total_solved_percent') {
|
||||||
|
v1 = {
|
||||||
|
...v1,
|
||||||
|
number: [v1.number * 100], content: '{nt}%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {...s, v1}
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
topLeftData() {
|
||||||
|
let statusColor = {
|
||||||
|
0: 'doing',
|
||||||
|
1: 'done',
|
||||||
|
2: 'pending',
|
||||||
|
},
|
||||||
|
statusLabel = {
|
||||||
|
0: '处理中',
|
||||||
|
1: '已处理'
|
||||||
|
},
|
||||||
|
list = this.meta.residentOrderList?.map(e => {
|
||||||
|
let status = e.process_list.slice(-1)?.[0]?.status
|
||||||
|
return {
|
||||||
|
...e, status, statusLabel: statusLabel[status]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
oddRowBGC: 'transparent',
|
||||||
|
evenRowBGC: 'transparent',
|
||||||
|
rowNum: 10,
|
||||||
|
data: list?.map(e => [`
|
||||||
|
<div flex class="eventItem">
|
||||||
|
<span class="tag ${statusColor[e.status]}">${e.statusLabel}</span>
|
||||||
|
<div class="fill">${e.desc}</div>
|
||||||
|
</div>`]) || []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rightTopData() {
|
||||||
|
let obj = this.meta.groupMap?.list || {},
|
||||||
|
list = Object.keys(obj).map(e => {
|
||||||
|
let {total, increase, decrease} = obj?.[e],
|
||||||
|
time = this.$moment(e).format('MM-DD')
|
||||||
|
return {time, total, increase, decrease}
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
total: [
|
||||||
|
{label: '群聊总数', v1: this.meta.groupMap?.groupSum || 0},
|
||||||
|
{label: '群成员数', v1: this.meta.groupMap?.today?.total || 0},
|
||||||
|
],
|
||||||
|
ops: {
|
||||||
|
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)', 'rgba(255, 215, 109, 0.2)'],
|
||||||
|
legend: {
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 16,
|
||||||
|
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
||||||
|
icon: 'rect',
|
||||||
|
itemGap: 40
|
||||||
|
},
|
||||||
|
tooltip: {},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category', axisTick: false,
|
||||||
|
nameGap: 20,
|
||||||
|
axisLabel: {color: '#fff'},
|
||||||
|
axisLine: {lineStyle: {color: '#263763'}}
|
||||||
|
},
|
||||||
|
// 声明一个 Y 轴,数值轴。
|
||||||
|
yAxis: {
|
||||||
|
nameGap: 30, minInterval: 1,
|
||||||
|
splitLine: {lineStyle: {color: '#263763'}},
|
||||||
|
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'line', name: "群成员数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1},
|
||||||
|
itemStyle: {borderColor: '#36A5FF', borderWidth: 1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line', name: "新增人数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1},
|
||||||
|
itemStyle: {borderColor: '#1CD444', borderWidth: 1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line', name: "退群人数", symbol: 'none', lineStyle: {color: '#FFD76D', borderWidth: 1},
|
||||||
|
itemStyle: {borderColor: '#FFD76D', borderWidth: 1},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
grid: {left: 60, bottom: 58, right: 20}
|
||||||
|
},
|
||||||
|
list
|
||||||
|
}
|
||||||
|
},
|
||||||
|
chartData() {
|
||||||
|
return {
|
||||||
|
EventType: this.meta.residentCategoryReportList?.map(e => {
|
||||||
|
let {category_name: name, total_case, total_solved} = e
|
||||||
|
return {name, total_case, total_solved}
|
||||||
|
}) || [],
|
||||||
|
EventSource: this.meta.unitReportList?.map(e => {
|
||||||
|
let {grid_name: name, total_case, total_solved} = e
|
||||||
|
return {name, total_case, total_solved}
|
||||||
|
}) || []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
charts: [
|
||||||
|
{
|
||||||
|
label: "事件类型", id: "EventType", ops: {
|
||||||
|
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'],
|
||||||
|
legend: {
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 16,
|
||||||
|
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
||||||
|
icon: 'rect',
|
||||||
|
itemGap: 40
|
||||||
|
},
|
||||||
|
tooltip: {},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category', nameGap: 20, axisTick: false,
|
||||||
|
axisLabel: {color: '#fff'},
|
||||||
|
axisLine: {lineStyle: {color: '#263763'}}
|
||||||
|
},
|
||||||
|
// 声明一个 Y 轴,数值轴。
|
||||||
|
yAxis: {
|
||||||
|
nameGap: 23, minInterval: 1,
|
||||||
|
splitLine: {lineStyle: {color: '#263763'}},
|
||||||
|
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'bar',
|
||||||
|
name: "累计受理",
|
||||||
|
barWidth: 10,
|
||||||
|
barGap: '20%',
|
||||||
|
itemStyle: {borderColor: '#36A5FF', borderWidth: 1}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bar',
|
||||||
|
name: "累计办结",
|
||||||
|
barWidth: 10,
|
||||||
|
barGap: '20%',
|
||||||
|
itemStyle: {borderColor: '#1CD444', borderWidth: 1}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
grid: {left: 40, bottom: 58, right: 20}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "上报来源", id: "EventSource", ops: {
|
||||||
|
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'],
|
||||||
|
legend: {
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 16,
|
||||||
|
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
||||||
|
icon: 'rect',
|
||||||
|
itemGap: 40
|
||||||
|
},
|
||||||
|
tooltip: {},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category', axisTick: false,
|
||||||
|
nameGap: 20,
|
||||||
|
axisLabel: {color: '#fff'},
|
||||||
|
axisLine: {lineStyle: {color: '#263763'}}
|
||||||
|
},
|
||||||
|
// 声明一个 Y 轴,数值轴。
|
||||||
|
yAxis: {
|
||||||
|
nameGap: 30, minInterval: 1,
|
||||||
|
splitLine: {lineStyle: {color: '#263763'}},
|
||||||
|
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'line', name: "事件数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1},
|
||||||
|
itemStyle: {borderColor: '#36A5FF', borderWidth: 1, show: false},
|
||||||
|
areaStyle: {
|
||||||
|
color: {
|
||||||
|
type: 'linear', x2: 0, y2: 1, colorStops: [
|
||||||
|
{offset: 0, color: 'rgba(37, 161, 255, 0.5)'}, {offset: 1, color: 'rgba(37, 161, 255, 0)'}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line', name: "办理数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1},
|
||||||
|
itemStyle: {borderColor: '#1CD444', borderWidth: 1, show: false},
|
||||||
|
areaStyle: {
|
||||||
|
color: {
|
||||||
|
type: 'linear', x2: 0, y2: 1, colorStops: [
|
||||||
|
{offset: 0, color: 'rgba(37, 206, 55, 0.5)'}, {offset: 1, color: 'rgba(37, 206, 55, 0)'}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
grid: {left: 40, bottom: 58, right: 20}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
meta: {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getData() {
|
||||||
|
this.instance.post("/app/statistics/governmentPeople/queryResidentReport").then(res => {
|
||||||
|
if (res?.data) this.meta = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppGovInteractionDV {
|
||||||
|
height: 100%;
|
||||||
|
padding: 6px 0 10px;
|
||||||
|
gap: 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #82C5FF;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
|
||||||
|
:deep( .eventItem ){
|
||||||
|
width: 100%;
|
||||||
|
color: #82C5FF;
|
||||||
|
|
||||||
|
& > .fill {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .communityEvent ){
|
||||||
|
list-style-type: circle;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
padding-left: 1px;
|
||||||
|
color: #82C5FF;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .tag ){
|
||||||
|
padding: 0 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-right: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 28px;
|
||||||
|
color: #fff;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
&.doing {
|
||||||
|
background-image: radial-gradient(rgba(#1B1BD6, .4), #208FFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.pending {
|
||||||
|
background-image: radial-gradient(rgba(#FF9333, .4), #FFE959);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.done {
|
||||||
|
background-image: radial-gradient(rgba(#1BD622, .4), #2CFF7C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.centerTopPane {
|
||||||
|
background-image: url("./assets/govInteraction/globe_map.png");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
height: 540px;
|
||||||
|
width: 940px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
position: relative;
|
||||||
|
padding: 30px 50px 50px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 60px;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .gradientFont ){
|
||||||
|
background-image: linear-gradient(180deg, #FFFFFF 0%, #FFFFFF 18%, #6BC7FF 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-row {
|
||||||
|
&:first-of-type, &:last-of-type {
|
||||||
|
margin: 0 110px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .dataPane ){
|
||||||
|
width: 122px;
|
||||||
|
height: 114px;
|
||||||
|
background-image: url("./assets/govInteraction/kuaikuai.png");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 100% 80px;
|
||||||
|
background-position: bottom center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
& > b {
|
||||||
|
font-size: 50px;
|
||||||
|
line-height: 50px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.framePane {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(7, 11, 35, 0.4);
|
||||||
|
border: 1px solid #14345F;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
&.top {
|
||||||
|
width: 440px;
|
||||||
|
height: 520px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .fill {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.titlePane {
|
||||||
|
width: 100%;
|
||||||
|
background-image: url("./assets/govInteraction/title.png");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 309px 100%;
|
||||||
|
height: 60px;
|
||||||
|
padding-left: 30px;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.totalPane {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.dataPanel {
|
||||||
|
height: 60px;
|
||||||
|
background: linear-gradient(270deg, rgba(119, 169, 255, 0.1) 0%, rgba(66, 112, 255, 0.25) 100%);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 0 10px;
|
||||||
|
font-size: 16px;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-left: 20px;
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > b {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #fff;
|
||||||
|
font-family: Arial-BoldMT, Arial, serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
848
packages/bigscreen/dv/AppGridDV.vue
Normal file
@@ -0,0 +1,848 @@
|
|||||||
|
<template>
|
||||||
|
<div class="griddv">
|
||||||
|
<div class="left">
|
||||||
|
<div class="griddv-title">
|
||||||
|
<h2>网格列表</h2>
|
||||||
|
</div>
|
||||||
|
<div class="griddv-tree">
|
||||||
|
<el-tree
|
||||||
|
:data="treeList"
|
||||||
|
:props="defaultProps"
|
||||||
|
@node-click="handleNodeClick"
|
||||||
|
node-key="id"
|
||||||
|
ref="tree"
|
||||||
|
default-expand-all
|
||||||
|
:expand-on-click-node="false"
|
||||||
|
highlight-current>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="middle" :class="[girdLevel == '2' ? 'middle-active' : '']" ref="container" v-loading="isLoading"
|
||||||
|
element-loading-background="rgba(0, 0, 0, 0.5)">
|
||||||
|
<div
|
||||||
|
ref="middleTree"
|
||||||
|
id="tree"
|
||||||
|
class="tree"
|
||||||
|
:style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}">
|
||||||
|
<ai-okr-tree ref="VueOkrTree" v-if="chartData.length"
|
||||||
|
:data="chartData"
|
||||||
|
node-key="id"
|
||||||
|
show-collapsable
|
||||||
|
aniamte
|
||||||
|
animate-name="okr-fade-in-linear"
|
||||||
|
:render-content="renderContent"
|
||||||
|
default-expand-all/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div class="right-top">
|
||||||
|
<div class="griddv-title">
|
||||||
|
<h2>网格内人员情况</h2>
|
||||||
|
</div>
|
||||||
|
<div class="right-chart">
|
||||||
|
<ai-echart
|
||||||
|
style="height: 100%; width: 100%;"
|
||||||
|
:data="userInfo"
|
||||||
|
:ops="barChart1">
|
||||||
|
</ai-echart>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right-bottom">
|
||||||
|
<div class="griddv-title">
|
||||||
|
<h2>事件上报情况</h2>
|
||||||
|
</div>
|
||||||
|
<div class="right-chart">
|
||||||
|
<ai-echart
|
||||||
|
style="height: 100%; width: 100%;"
|
||||||
|
:data="eventInfo"
|
||||||
|
:ops="pieChart2">
|
||||||
|
</ai-echart>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-dialog :visible.sync="isShowInfo" width="640px" :close-on-click-modal="false" :modal-append-to-body="false">
|
||||||
|
<template slot="title">
|
||||||
|
<h2>家庭信息</h2>
|
||||||
|
<img src="./assets/grid/close.png" @click="isShowInfo = false">
|
||||||
|
</template>
|
||||||
|
<div class="grid-info">
|
||||||
|
<div class="grid-info__title">
|
||||||
|
<h2>家庭地址</h2>
|
||||||
|
<span>{{ residentInfo.currentAreaName }}</span>
|
||||||
|
</div>
|
||||||
|
<ai-table
|
||||||
|
style="width: 558px"
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
:isShowPagination="false"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="() => {}">
|
||||||
|
</ai-table>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {barChart1, pieChart2} from "./components/chartOps"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppGridDV',
|
||||||
|
label: '网格数据大屏',
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isLoading: false,
|
||||||
|
treeList: [],
|
||||||
|
search: {
|
||||||
|
size: 100,
|
||||||
|
current: 1
|
||||||
|
},
|
||||||
|
barChart1,
|
||||||
|
userInfo: [],
|
||||||
|
eventInfo: [],
|
||||||
|
pieChart2,
|
||||||
|
total: 0,
|
||||||
|
isShowInfo: false,
|
||||||
|
defaultProps: {
|
||||||
|
children: 'girdList',
|
||||||
|
label: 'girdName',
|
||||||
|
},
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'name', label: '姓名', align: 'center', width: 120},
|
||||||
|
{
|
||||||
|
prop: 'householdRelation',
|
||||||
|
label: '与户主关系',
|
||||||
|
align: 'center',
|
||||||
|
render: (h, {row}) => {
|
||||||
|
return h('span', {
|
||||||
|
style: {
|
||||||
|
color: row.householdName === '1' ? '#1DE94D' : '#A8D7F3'
|
||||||
|
}
|
||||||
|
}, row.householdName === '1' ? '户主' : (this.dict.getLabel('householdRelation', row.householdRelation) || '-'))
|
||||||
|
},
|
||||||
|
format: v => this.dict.getLabel('householdRelation', v)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'idNumber',
|
||||||
|
label: '身份证号',
|
||||||
|
align: 'center',
|
||||||
|
width: 220,
|
||||||
|
format: v => v ? v.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`) : '-'
|
||||||
|
},
|
||||||
|
{prop: 'phone', label: '联系方式', align: 'center'}
|
||||||
|
],
|
||||||
|
girdId: '',
|
||||||
|
residentInfo: {},
|
||||||
|
tableData: [],
|
||||||
|
chartData: [],
|
||||||
|
girdLevel: '0',
|
||||||
|
scale: 1,
|
||||||
|
x: '50%',
|
||||||
|
y: '50%',
|
||||||
|
offsetX: 0,
|
||||||
|
offsetY: 0,
|
||||||
|
defaultUrl: 'https://cdn.cunwuyun.cn/dvcp/dv/avatar.png'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.dict.load('householdRelation')
|
||||||
|
this.getTreeList()
|
||||||
|
this.getGirdInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.bindEvent()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed() {
|
||||||
|
document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel)
|
||||||
|
document.querySelector('body').removeEventListener('mouseup', this.onMouseUp)
|
||||||
|
document.querySelector('body').removeEventListener('mousedown', this.onMousedown)
|
||||||
|
document.querySelector('body').removeEventListener('mousemove', this.onMouseMove)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
bindEvent() {
|
||||||
|
document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true)
|
||||||
|
|
||||||
|
document.querySelector('body').addEventListener('mouseup', this.onMouseUp, true)
|
||||||
|
document.querySelector('body').addEventListener('mousedown', this.onMousedown, true)
|
||||||
|
document.querySelector('body').addEventListener('mousemove', this.onMouseMove, true)
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousewheel(event) {
|
||||||
|
if (!event) return false
|
||||||
|
const elClass = event.target.className
|
||||||
|
if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
||||||
|
var dir = event.deltaY > 0 ? 'Up' : 'Down'
|
||||||
|
if (dir === 'Up') {
|
||||||
|
this.scale = this.scale - 0.2 <= 0.1 ? 0.1 : this.scale - 0.2
|
||||||
|
} else {
|
||||||
|
this.scale = this.scale + 0.2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousedown(e) {
|
||||||
|
const elClass = e.target.className
|
||||||
|
if ((elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
||||||
|
const left = document.querySelector('#tree').offsetLeft
|
||||||
|
const top = document.querySelector('#tree').offsetTop
|
||||||
|
this.isMove = true
|
||||||
|
this.offsetX = e.clientX - left
|
||||||
|
this.offsetY = e.clientY - top
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseMove(e) {
|
||||||
|
if (!this.isMove) return
|
||||||
|
|
||||||
|
this.x = (e.clientX - this.offsetX) + 'px'
|
||||||
|
this.y = (e.clientY - this.offsetY) + 'px'
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseUp() {
|
||||||
|
this.isMove = false
|
||||||
|
},
|
||||||
|
|
||||||
|
debounce(func, wait = 1000) {
|
||||||
|
let timeout
|
||||||
|
return function (event) {
|
||||||
|
clearTimeout(timeout)
|
||||||
|
timeout = setTimeout(() => {
|
||||||
|
func.call(this, event)
|
||||||
|
}, wait)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleNodeClick(e) {
|
||||||
|
this.girdLevel = e.girdLevel
|
||||||
|
this.isLoading = true
|
||||||
|
this.getGirdInfo(e.id, e.girdLevel)
|
||||||
|
this.getStatisticsInfo(e.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
getStatisticsInfo(id) {
|
||||||
|
this.instance.post(`/app/appgirdmemberinfo/girdMemberAndResidentStatistic?girdId=${id}`).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.userInfo = [
|
||||||
|
{
|
||||||
|
'name': '网格长',
|
||||||
|
'人数': res.data['网格长'] || 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '网格员',
|
||||||
|
'人数': res.data['网格员'] || 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '责任家庭数',
|
||||||
|
'人数': res.data['责任家庭数'] || 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.instance.post(`/app/appclapeventinfo/clapEventStatistic?girdId=${id}`).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.eventInfo = Object.keys(res.data).map(v => {
|
||||||
|
return {
|
||||||
|
'事件类型': v,
|
||||||
|
v1: res.data[v]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
renderContent(h, node) {
|
||||||
|
return h('div', {
|
||||||
|
class: 'userlist-container'
|
||||||
|
}, [h('div', {
|
||||||
|
class: `userlist ${node.data.label === '子节点' ? 'last-level' : ''} ${node.data.girdLevel > 1 ? 'userlist-wrapper' : ''} userlist-${node.data.girdLevel}`
|
||||||
|
}, node.data.userList.map(v => {
|
||||||
|
return h('div', {
|
||||||
|
class: `user-item user-item-${v.girdLevel}`
|
||||||
|
}, [h('img', {
|
||||||
|
class: 'user-img',
|
||||||
|
attrs: {
|
||||||
|
src: v.photo || this.defaultUrl
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
dragstart: e => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}), h('p', {
|
||||||
|
class: 'user-p',
|
||||||
|
attrs: {
|
||||||
|
title: v.label,
|
||||||
|
'data-id': v.id
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
click: () => {
|
||||||
|
if (node.data.label === '子节点') {
|
||||||
|
this.getResidentInfo(v.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, v.label), h('span', {
|
||||||
|
class: 'user-span',
|
||||||
|
style: {
|
||||||
|
display: v.girdLevel === '2' ? 'block' : 'none',
|
||||||
|
fontSize: v.girdLevel === '2' ? '12px' : ''
|
||||||
|
}
|
||||||
|
}, v.checkType ? (v.checkType === '1' ? '网格员' : '网格长') : '-')])
|
||||||
|
})), h('div', {
|
||||||
|
class: 'user-gridName',
|
||||||
|
style: {
|
||||||
|
display: node.data.label === '子节点' ? 'none' : 'block',
|
||||||
|
color: 'rgba(255, 255, 255, 0.8)',
|
||||||
|
fontSize: '12px',
|
||||||
|
margin: '4px 0'
|
||||||
|
}
|
||||||
|
}, node.data.label)])
|
||||||
|
},
|
||||||
|
|
||||||
|
getResidentInfo(id) {
|
||||||
|
this.isLoading = true
|
||||||
|
this.instance.post(`/app/appresident/detail?id=${id}`).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.residentInfo.resident = res.data
|
||||||
|
this.tableData = res.data.family || []
|
||||||
|
this.isShowInfo = true
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
autoScale() {
|
||||||
|
const treeWidth = this.$refs.middleTree.offsetWidth
|
||||||
|
const containerWidth = this.$refs.container.offsetWidth
|
||||||
|
this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth
|
||||||
|
this.x = '50%'
|
||||||
|
this.y = '50%'
|
||||||
|
},
|
||||||
|
|
||||||
|
getGirdInfo(id) {
|
||||||
|
this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
const chartData = this.formatList([res.data])
|
||||||
|
this.chartData = chartData
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (id) {
|
||||||
|
this.getUserList(id, chartData[0].id)
|
||||||
|
} else {
|
||||||
|
this.isLoading = false
|
||||||
|
this.autoScale()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getUserList(id, parentId) {
|
||||||
|
this.instance.post(`/app/appgirdmemberresident/listByGirdMember`, null, {
|
||||||
|
params: {
|
||||||
|
size: 1000,
|
||||||
|
girdId: id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
const userList = res.data.records.map(v => {
|
||||||
|
return {
|
||||||
|
...v,
|
||||||
|
isLast: true,
|
||||||
|
label: v.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.isLoading = false
|
||||||
|
|
||||||
|
if (!userList.length) {
|
||||||
|
this.autoScale()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const node = this.$refs.VueOkrTree.getNode(parentId)
|
||||||
|
this.$refs.VueOkrTree.append({
|
||||||
|
id: new Date().getTime(),
|
||||||
|
label: '子节点',
|
||||||
|
userList: userList || []
|
||||||
|
}, node)
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.autoScale()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
formatList(list) {
|
||||||
|
return list.map(item => {
|
||||||
|
let userList = []
|
||||||
|
const girdMemberManageList = item.girdMemberManageList ? item.girdMemberManageList.map(v => {
|
||||||
|
return {
|
||||||
|
...v,
|
||||||
|
label: v.name,
|
||||||
|
id: v.id,
|
||||||
|
checkType: '2',
|
||||||
|
girdName: item.girdName,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
isUser: true
|
||||||
|
}
|
||||||
|
}) : []
|
||||||
|
const girdMemberList = item.girdMemberList ? item.girdMemberList.map(v => {
|
||||||
|
return {
|
||||||
|
...v,
|
||||||
|
label: v.name,
|
||||||
|
id: v.id,
|
||||||
|
checkType: '1',
|
||||||
|
girdName: item.girdName,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
isUser: true
|
||||||
|
}
|
||||||
|
}) : []
|
||||||
|
|
||||||
|
if (this.girdLevel === '2' && item.girdLevel === '2' && girdMemberList.length) {
|
||||||
|
userList = girdMemberManageList
|
||||||
|
item.girdList = [{
|
||||||
|
girdLevel: '2',
|
||||||
|
id: item.id,
|
||||||
|
isUser: false,
|
||||||
|
userList: girdMemberList,
|
||||||
|
label: item.girdName,
|
||||||
|
children: []
|
||||||
|
}]
|
||||||
|
} else {
|
||||||
|
userList = [...girdMemberManageList, ...girdMemberList]
|
||||||
|
}
|
||||||
|
if (!userList.length) {
|
||||||
|
userList = [{
|
||||||
|
label: '-',
|
||||||
|
id: item.id,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
girdName: item.girdName
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
const obj = {
|
||||||
|
label: item.girdName,
|
||||||
|
id: `${new Date().getTime()}-${item.id}`,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
isUser: false,
|
||||||
|
userList: userList,
|
||||||
|
children: item.girdList || []
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj.children && obj.children.length && this.girdLevel !== '2') {
|
||||||
|
obj.children = this.formatList(obj.children)
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getTreeList() {
|
||||||
|
this.instance.post('/app/appgirdinfo/listAll').then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.treeList = [...res.data]
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.tree.setCurrentKey(res.data[0].id)
|
||||||
|
this.getStatisticsInfo(res.data[0].id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.griddv {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
border-radius: 5px;
|
||||||
|
background: rgba(93, 163, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 5px;
|
||||||
|
background: rgba(173, 208, 255, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-info {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.grid-info__title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
h2, span {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-dialog__body ){
|
||||||
|
padding: 10px 40px 30px;
|
||||||
|
|
||||||
|
.el-table {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__body tr td:first-child .cell, .ai-table .el-table__header tr th:first-child .cell {
|
||||||
|
padding-left: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table th, .el-table tr {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
background-color: rgba(28, 39, 65, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__row--striped, .el-table--striped .el-table__body tr.el-table__row--striped td {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__header-wrapper {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table--enable-row-hover .el-table__body tr:hover > td, .el-table-filter {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-dialog ){
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin: 0 !important;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
background: rgba(2, 13, 43, 0.9);
|
||||||
|
box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.5), inset 0px 0px 10px 0px #2C7CFF;
|
||||||
|
border: 1px solid #2D65C9;
|
||||||
|
|
||||||
|
.el-dialog__header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__headerbtn {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .userlist-container ){
|
||||||
|
.userlist {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 10px;
|
||||||
|
background: rgba(76, 166, 255, 0.1);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
|
||||||
|
.user-item {
|
||||||
|
margin-right: 10px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 0;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 58px;
|
||||||
|
height: 80px;
|
||||||
|
object-fit: cover;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 120px;
|
||||||
|
margin: 4px 0 0 0;
|
||||||
|
font-size: 19px;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
max-width: 120px;
|
||||||
|
font-size: 17px;
|
||||||
|
color: #9DD3FF;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.user-item-0 {
|
||||||
|
img {
|
||||||
|
width: 86px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.user-item-2 {
|
||||||
|
p {
|
||||||
|
line-height: 14px;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
line-height: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 40px;
|
||||||
|
height: 56px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.userlist-2 {
|
||||||
|
justify-content: space-between;
|
||||||
|
max-width: 130px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding-bottom: 0;
|
||||||
|
width: fit-content;
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
.user-item {
|
||||||
|
width: 48px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.last-level {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
max-width: 690px;
|
||||||
|
font-size: 0;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
padding: 12px 12px 0 12px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.user-item {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
background: #0B477D;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.griddv-title {
|
||||||
|
display: flex;
|
||||||
|
width: 320px;
|
||||||
|
height: 62px;
|
||||||
|
background-image: url(assets/grid/title-bg.png);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
line-height: 50px;
|
||||||
|
padding-left: 24px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 20px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 440px;
|
||||||
|
margin-left: 20px;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
flex: 1;
|
||||||
|
width: 100%;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
background: rgba(7, 11, 35, 0.4);
|
||||||
|
border: 1px solid #2D50B5;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.right-chart {
|
||||||
|
height: calc(100% - 82px);
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.middle {
|
||||||
|
position: relative;
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 20px;
|
||||||
|
background: rgba(7, 11, 35, 0.4);
|
||||||
|
border: 1px solid #2D50B5;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
#tree {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
padding: 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
width: max-content;
|
||||||
|
height: 300%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .org-chart-container ){
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
.org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before,
|
||||||
|
.org-chart-node.is-leaf:before {
|
||||||
|
border-radius: 0;
|
||||||
|
border-color: #9CD7FF !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical .org-chart-node:after, .vertical .org-chart-node:before {
|
||||||
|
border-radius: 0;
|
||||||
|
border-color: #9CD7FF !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node-label-inner {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node-btn {
|
||||||
|
margin-left: 0;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node {
|
||||||
|
// max-width: 500px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .org-chart-node-children ){
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
width: 320px;
|
||||||
|
background: rgba(7, 11, 35, 0.4);
|
||||||
|
border: 1px solid #2D50B5;
|
||||||
|
|
||||||
|
.griddv-tree {
|
||||||
|
height: calc(100% - 62px);
|
||||||
|
overflow-y: auto;
|
||||||
|
margin: 0 8px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-tree ){
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
.el-tree-node__expand-icon {
|
||||||
|
color: #eaeff9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__expand-icon.is-leaf {
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
color: #eaeff9;
|
||||||
|
font-size: 14px;
|
||||||
|
user-select: none;
|
||||||
|
font-weight: normal !important;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-current > .el-tree-node__content, .el-tree-node__content:hover {
|
||||||
|
background: linear-gradient(270deg, #4895D9 0%, #2D52CA 100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
812
packages/bigscreen/dv/AppHouseMapDv.vue
Normal file
@@ -0,0 +1,812 @@
|
|||||||
|
<template>
|
||||||
|
<div style="height:100%;" class="AppHouseMapDv">
|
||||||
|
<div class="map">
|
||||||
|
<div id="map" ref="rootmap" @click="hidePopup"/>
|
||||||
|
<div class="community-info" v-show="isShowInfo">
|
||||||
|
<div class="community-info__close" title="关闭" @click="info = {}, isShowInfo = false,chooseBuildId=''">
|
||||||
|
<i class="iconClean iconfont"></i>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__header">
|
||||||
|
<h2 v-if="!info.name">{{ info.createAddress }}</h2>
|
||||||
|
<h2 v-if="info.name">{{ info.homesteadAddress }}</h2>
|
||||||
|
<div>{{ info.lng }},{{ info.lat }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__wrapper" v-if="info.name">
|
||||||
|
<h2>户主信息</h2>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>所属村</label>
|
||||||
|
<span>{{ info.areaName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>姓名</label>
|
||||||
|
<span style="color:#2266FF;">{{ info.name }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>联系电话</label>
|
||||||
|
<span style="color:#2266FF;">{{ info.phone }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>性别</label>
|
||||||
|
<span>{{ info.sex == 1 ? '男' : '女' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>年龄</label>
|
||||||
|
<span>{{ info.age }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__wrapper" v-if="info.name">
|
||||||
|
<h2>宅基地信息</h2>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>住宅建筑面积</label>
|
||||||
|
<span>{{ info.liveBuildingArea }}m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>建筑层数</label>
|
||||||
|
<span>{{ info.buildingFloorNumber }}层</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>建筑高度</label>
|
||||||
|
<span>{{ info.buildingHeight }}m</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__wrapper" v-if="!info.name">
|
||||||
|
<h2>房屋信息</h2>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>所属社区</label>
|
||||||
|
<span>{{ info.areaName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>所属小区</label>
|
||||||
|
<span>{{ info.communityName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>房屋类型</label>
|
||||||
|
<span>{{ dict.getLabel("communityBuildingType", info.buildingType) }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>楼长姓名</label>
|
||||||
|
<span>{{ info.managerName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>楼长电话</label>
|
||||||
|
<span>{{ info.managerPhone }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppHouseMapDv',
|
||||||
|
label: '房屋地图',
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
root: this
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
map: null,
|
||||||
|
mapLib: null,
|
||||||
|
community: '',
|
||||||
|
areaData: {},
|
||||||
|
isShowInfo: false,
|
||||||
|
areaId: '',
|
||||||
|
areaName: '',
|
||||||
|
list: [],
|
||||||
|
info: {},
|
||||||
|
resident: null,
|
||||||
|
satellite: null,
|
||||||
|
zoom: 11,
|
||||||
|
chooseBuildId: '',
|
||||||
|
buildList: [],
|
||||||
|
searchList: [],
|
||||||
|
house: null,
|
||||||
|
center: [],
|
||||||
|
type: '',
|
||||||
|
showStatistics: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user'])
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
community: {
|
||||||
|
deep: true,
|
||||||
|
handler() {
|
||||||
|
this.debounce(this.search, 500)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showStatistics: {
|
||||||
|
deep: true,
|
||||||
|
handler() {
|
||||||
|
this.debounce(this.getCorpLocation, 500)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.dict.load('householdRelation', 'communityBuildingType')
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.areaId = this.user.info.areaId
|
||||||
|
this.areaName = this.user.info.areaName
|
||||||
|
this.getCorpLocation()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getCorpLocation() {
|
||||||
|
if (this.showStatistics) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.initMap(res.data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
changeZoom(isAdd) {
|
||||||
|
const zoom = isAdd ? this.map.getZoom() + 1 : this.map.getZoom() - 1
|
||||||
|
this.map.setZoom(zoom, false, 600)
|
||||||
|
},
|
||||||
|
|
||||||
|
getBuildInfo(id, type) {
|
||||||
|
var url = `/app/apphomesteadinfo/queryDetailById?id=${id}`
|
||||||
|
if (type == 0) {
|
||||||
|
url = `/app/appcommunityhouseinfo/queryDetailByIdWithBuilding?buildId=${id}`
|
||||||
|
}
|
||||||
|
this.instance.post(url).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
if (type == 1) {
|
||||||
|
this.info = res.data
|
||||||
|
} else {
|
||||||
|
this.info = res.data.build
|
||||||
|
this.resident = null;
|
||||||
|
}
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isShowInfo = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseCommunity(item) {
|
||||||
|
if (item.name) { //宅基地
|
||||||
|
if (!item.lng || !item.lat) {
|
||||||
|
return this.$message.error('未获取到该房屋坐标信息')
|
||||||
|
} else {
|
||||||
|
this.map.setZoomAndCenter(18, [item.lng, item.lat], false, 600)
|
||||||
|
this.info = item
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isShowSearch = false
|
||||||
|
this.isShowInfo = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { //楼栋
|
||||||
|
this.instance.post(`/app/appcommunityhouseinfo/queryDetailByIdWithBuilding`, null, {
|
||||||
|
params: {
|
||||||
|
buildId: item.buildingId,
|
||||||
|
houseId: item.id,
|
||||||
|
residentId: item.residentId
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
if (!res.data.build?.lng || !res.data.build?.lat) {
|
||||||
|
this.isShowInfo = true
|
||||||
|
this.isShowSearch = false
|
||||||
|
this.info = res.data.build;
|
||||||
|
return this.$message.error('未获取到该房屋坐标信息')
|
||||||
|
} else {
|
||||||
|
this.chooseBuildId = res.data.build.id
|
||||||
|
this.house = res.data.house
|
||||||
|
this.resident = res.data.resident;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.map.setZoomAndCenter(18, [res.data.build?.lng, res.data.build?.lat], false, 600)
|
||||||
|
this.info = res.data.build
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isShowSearch = false
|
||||||
|
this.isShowInfo = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toCenter() {
|
||||||
|
this.map.setZoomAndCenter(this.zoom, this.center, false, 600)
|
||||||
|
},
|
||||||
|
|
||||||
|
renderClusterMarker(context) {
|
||||||
|
let el = `<div class="polymeric">
|
||||||
|
<div class="polymeric-container">
|
||||||
|
<p>${context.count}</p>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
let {mapLib: AMap} = this
|
||||||
|
let offset = new AMap.Pixel(-9, -9)
|
||||||
|
context.marker.setContent(el)
|
||||||
|
context.marker.setOffset(offset)
|
||||||
|
context.marker.lnglat = context.clusterData[0].lnglat
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.map.setZoomAndCenter(this.map.getZoom() + 2, e.target.lnglat, false, 500)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMarker(context) {
|
||||||
|
const buildId = context.data[0].id
|
||||||
|
let el = ''
|
||||||
|
var urlType = ''
|
||||||
|
if (context.data[0].communityName == context.data[0].buildingNumber) { //宅基地
|
||||||
|
urlType = 1
|
||||||
|
el = `<div id="buildId-${buildId}" class="mark ${buildId === this.chooseBuildId ? 'mark-active' : ''}">
|
||||||
|
<div class="mark-contaienr">
|
||||||
|
<span>${context.data[0].areaName}</span>
|
||||||
|
<span>${context.data[0].communityName}</span>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
} else {
|
||||||
|
urlType = 0
|
||||||
|
el = `<div id="buildId-${buildId}" class="mark ${buildId === this.chooseBuildId ? 'mark-active' : ''}">
|
||||||
|
<div class="mark-contaienr">
|
||||||
|
<span>${context.data[0].communityName}</span>
|
||||||
|
<span>${context.data[0].buildingNumber}栋</span>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
}
|
||||||
|
|
||||||
|
context.marker.setContent(el);
|
||||||
|
context.marker.setAnchor("center")
|
||||||
|
context.marker.id = `${buildId}`
|
||||||
|
context.marker.lnglat = context.data[0].lnglat
|
||||||
|
context.marker.urlType = urlType
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.chooseBuildId = e.target.id
|
||||||
|
this.getBuildInfo(e.target.id, e.target.urlType)
|
||||||
|
context.marker.setContent(el);
|
||||||
|
document.querySelectorAll('.mark').forEach(el => {
|
||||||
|
el.classList.remove('mark-active')
|
||||||
|
})
|
||||||
|
document.querySelector(`#buildId-${e.target.id}`).classList.add('mark-active')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
addMakert(points) {
|
||||||
|
let {mapLib: AMap} = this
|
||||||
|
new AMap.MarkerClusterer(this.map, points, {
|
||||||
|
gridSize: 60,
|
||||||
|
maxZoom: 15,
|
||||||
|
clusterByZoomChange: false,
|
||||||
|
renderClusterMarker: this.renderClusterMarker,
|
||||||
|
renderMarker: this.renderMarker
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getCommunityList() {
|
||||||
|
this.instance.post('/app/appcommunitybuildinginfo/listByBuilding', null, {
|
||||||
|
params: {
|
||||||
|
current: 1,
|
||||||
|
size: 1000000
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.buildList = res.data
|
||||||
|
const points = res.data.map(item => {
|
||||||
|
return {
|
||||||
|
lnglat: [item.lng, item.lat],
|
||||||
|
id: item.id,
|
||||||
|
corpId: item.corpId,
|
||||||
|
areaName: item.areaName,
|
||||||
|
buildingNumber: item.name || item.buildingNumber,
|
||||||
|
communityName: item.name || item.communityName,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.addMakert(points)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
hidePopup() {
|
||||||
|
this.isShowArea = false
|
||||||
|
this.isShowSearch = false
|
||||||
|
},
|
||||||
|
|
||||||
|
initMap({lng, lat}) {
|
||||||
|
this.center = [lng, lat];
|
||||||
|
AMapLoader.load({
|
||||||
|
key: '54a02a43d9828a8f9cd4f26fe281e74e',
|
||||||
|
version: '2.0',
|
||||||
|
plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'],
|
||||||
|
AMapUI: {
|
||||||
|
version: '1.1',
|
||||||
|
plugins: []
|
||||||
|
}
|
||||||
|
}).then((AMap) => {
|
||||||
|
this.mapLib = AMap
|
||||||
|
this.map = new AMap.Map('map', {
|
||||||
|
resizeEnable: true,
|
||||||
|
zooms: [6, 20],
|
||||||
|
center: [lng, lat],
|
||||||
|
zoom: this.zoom,
|
||||||
|
mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec'
|
||||||
|
})
|
||||||
|
this.satellite = new AMap.TileLayer.Satellite()
|
||||||
|
this.getCommunityList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.map {
|
||||||
|
:deep( .amap-logo), :deep( .amap-copyright ){
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .amap-icon ){
|
||||||
|
width: 40px !important;
|
||||||
|
height: 40px !important;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__star {
|
||||||
|
margin-top: 4px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
|
||||||
|
.community-info__star--content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 36px;
|
||||||
|
padding: 0 12px;
|
||||||
|
color: #666666;
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__star--tab {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 36px;
|
||||||
|
padding: 0 12px;
|
||||||
|
user-select: none;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
span {
|
||||||
|
height: 100%;
|
||||||
|
line-height: 36px;
|
||||||
|
color: #999999;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 700;
|
||||||
|
cursor: pointer;
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.star-active {
|
||||||
|
color: #2266FF;
|
||||||
|
border-bottom: 2px solid #2266FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__item--imgs {
|
||||||
|
display: block !important;
|
||||||
|
height: auto !important;
|
||||||
|
|
||||||
|
label {
|
||||||
|
height: 36px;
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__item--img {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 69px;
|
||||||
|
height: 69px;
|
||||||
|
margin-right: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:nth-of-type(4n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
:deep( .ol-zoom ){
|
||||||
|
display: none !important;
|
||||||
|
top: inherit !important;
|
||||||
|
bottom: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
height: 28px;
|
||||||
|
padding: 0 10px;
|
||||||
|
background: #0F8F64;
|
||||||
|
border-radius: 26px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.color1 {
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #2266FF !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.color2 {
|
||||||
|
background: #F46159;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #F46159 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border: 6px solid #0F8F64;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
overflow: hidden;
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
padding-right: 2px;
|
||||||
|
position: relative;
|
||||||
|
color: #ffc928;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .polymeric ){
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&.polymeric-active {
|
||||||
|
.polymeric-container {
|
||||||
|
background: #F46159;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
background-color: #F46159;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
z-index: -1;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
-webkit-animation: warn 1s ease-out 0s infinite;
|
||||||
|
animation: warn 1s ease-out 0s infinite;
|
||||||
|
background-color: rgba(15, 143, 100, 1);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.polymeric-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(15, 143, 100, 1);
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 58px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:first-child {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #fff;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .mark ){
|
||||||
|
user-select: none;
|
||||||
|
cursor: pointer;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 26px;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0 12px;
|
||||||
|
background: rgba(0,39,100,0.50);
|
||||||
|
border: 1px solid #36A5FF;
|
||||||
|
border-radius: 30px;
|
||||||
|
|
||||||
|
&.mark-active {
|
||||||
|
background: #004AC0;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
box-shadow: inset 0 0 8px 2px #33BBFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mark-contaienr {
|
||||||
|
color: white;
|
||||||
|
font-size: 14px;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrow {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
bottom: -21px;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border: 12px solid transparent;
|
||||||
|
border-top: 12px solid #0F8F64;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.8);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.4);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info {
|
||||||
|
position: absolute;
|
||||||
|
top: 58px;
|
||||||
|
right: 10px;
|
||||||
|
width: 400px;
|
||||||
|
height: calc(100% - 117px);
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
z-index: 111;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: rgba(0,15,38,0.30);
|
||||||
|
border: 1px solid #103588;
|
||||||
|
// filter: blur(5px);
|
||||||
|
|
||||||
|
.community-info__close {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
padding: 16px 12px 0 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 6px;
|
||||||
|
background: rgba(144, 147, 153, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__header {
|
||||||
|
padding: 12px 20px;
|
||||||
|
background-image: linear-gradient(270deg, rgba(11, 158, 255, 0.2) 0%, rgba(2, 81, 227, 0.2) 100%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
max-width: 360px;
|
||||||
|
line-height: 28px;
|
||||||
|
margin: 0;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: #D2E0FF;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
margin-top: 4px;
|
||||||
|
font-style: normal;
|
||||||
|
color: #82C5FF;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__wrapper {
|
||||||
|
h2 {
|
||||||
|
margin: 20px 0 20px 20px;
|
||||||
|
padding: 0 20px;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 600;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat;
|
||||||
|
background-size: 169px 30px;
|
||||||
|
background-position-y: -5px;
|
||||||
|
background-position-x: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 0 20px;
|
||||||
|
padding: 12px 12px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #fff;
|
||||||
|
background: rgba(63, 136, 255, 0.15);
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
max-width: 70%;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
flex-shrink: 1;
|
||||||
|
color: #82C5FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.community-info__wrapper--last {
|
||||||
|
.community-info__item {
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
&:nth-of-type(2n-1) {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-fff {
|
||||||
|
background-color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
887
packages/bigscreen/dv/AppMonitorMapDv.vue
Normal file
@@ -0,0 +1,887 @@
|
|||||||
|
<template>
|
||||||
|
<div class="map">
|
||||||
|
<div id="map" ref="rootmap" />
|
||||||
|
<div class="community-info" v-show="isShowInfo">
|
||||||
|
<div class="community-info__close" title="关闭" @click="closeInfo">
|
||||||
|
<i class="iconClean iconfont"></i>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__header">
|
||||||
|
<div class="user" :style="userStyle">
|
||||||
|
<span>{{ formatName(info.name) }}</span>
|
||||||
|
</div>
|
||||||
|
<h2>{{ info.name }}</h2>
|
||||||
|
<h3>{{ info.gpsDesc }}</h3>
|
||||||
|
<p>最后更新时间:{{ info.lastUpdateTime }}</p>
|
||||||
|
<div class="community-info__header--status">
|
||||||
|
<div :style="{color: info.onlineStatus === '1' ? '#2EA222' : '#F46' }">
|
||||||
|
<i class="iconfont iconzhuangtai"></i>
|
||||||
|
<span>设备{{ info.onlineStatus === '1' ? '在线' : '离线' }}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<i class="iconfont icondianliang"></i>
|
||||||
|
<span>剩余{{ info.electricQuantity }}%</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__header--info">
|
||||||
|
<div class="community-info__header--info-item" v-for="(item, index) in testItem" :key="item.name" v-if="index !== 0">
|
||||||
|
<div class="left">
|
||||||
|
<div :style="{backgroundColor: item.color}">
|
||||||
|
<i :class="item.icon" class="iconfont"></i>
|
||||||
|
</div>
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</div>
|
||||||
|
<i :style="{color: (testData[index] && testData[index].abnormalStatus === '1') ? '#F46' : ''}">{{ testData[index] ? testData[index].itemValue : '-' }}{{ index === '1' ? '℃' : '' }}</i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__wrapper">
|
||||||
|
<div class="community-info__title">
|
||||||
|
<h2>人员信息</h2>
|
||||||
|
<span :style="userStatusColor">{{ userStatus }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>姓名</label>
|
||||||
|
<span>{{ info.name}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>性别</label>
|
||||||
|
<span>{{ info.sex === '1' ? '男' : '女' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>年龄</label>
|
||||||
|
<span>{{ info.age }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>所属地区</label>
|
||||||
|
<span>{{ info.areaName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__item">
|
||||||
|
<label>联系电话</label>
|
||||||
|
<span>{{ info.phone }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppMonitorMapDv',
|
||||||
|
label: '监护地图',
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
root: this
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
map: null,
|
||||||
|
community: '',
|
||||||
|
isShowInfo: false,
|
||||||
|
info: {},
|
||||||
|
satellite: null,
|
||||||
|
zoom: 11,
|
||||||
|
choosedId: '',
|
||||||
|
testItem: [{
|
||||||
|
name: '体温',
|
||||||
|
icon: 'icontiwen',
|
||||||
|
color: '#6BA3DB'
|
||||||
|
}, {
|
||||||
|
name: '心率',
|
||||||
|
icon: 'iconxinlv',
|
||||||
|
color: '#72BB5C'
|
||||||
|
}, {
|
||||||
|
name: '血压',
|
||||||
|
icon: 'iconxueya',
|
||||||
|
color: '#7577CB'
|
||||||
|
}, {
|
||||||
|
name: '血氧',
|
||||||
|
icon: 'iconxueyang',
|
||||||
|
color: '#FF5656'
|
||||||
|
}],
|
||||||
|
testData: [],
|
||||||
|
center: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
userStatus () {
|
||||||
|
if (this.info.abnormalStatus === '2') {
|
||||||
|
return '求助'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.info.abnormalStatus === '1') {
|
||||||
|
return '异常'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.info.abnormalStatus === '0') {
|
||||||
|
return '正常'
|
||||||
|
}
|
||||||
|
|
||||||
|
return '-'
|
||||||
|
},
|
||||||
|
|
||||||
|
userStatusColor () {
|
||||||
|
if (this.info.abnormalStatus === '2') {
|
||||||
|
return {
|
||||||
|
color: '#FF69DD',
|
||||||
|
border: '1px solid #FF69DD'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.info.abnormalStatus === '1') {
|
||||||
|
return {
|
||||||
|
color: '#FF6969',
|
||||||
|
border: '1px solid #FF6969'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
color: '#22FF81',
|
||||||
|
border: '1px solid #22FF81'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
userStyle () {
|
||||||
|
if (this.info.abnormalStatus === '2') {
|
||||||
|
return {
|
||||||
|
background: 'rgba(96,8,102,0.80)',
|
||||||
|
border: '1px solid #FF69DD',
|
||||||
|
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.info.abnormalStatus === '1') {
|
||||||
|
return {
|
||||||
|
background: 'rgba(79,14,7,0.80)',
|
||||||
|
border: '1px solid #FF6969',
|
||||||
|
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
background: 'rgba(8,73,35,0.80)',
|
||||||
|
border: '1px solid #22FF81',
|
||||||
|
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.getCorpLocation()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getIdInfo (UUserCard, num) {
|
||||||
|
if (num == 1) {
|
||||||
|
var birth = UUserCard.substring(6, 10) + '-' + UUserCard.substring(10, 12) + '-' + UUserCard.substring(12, 14)
|
||||||
|
return birth
|
||||||
|
}
|
||||||
|
if (num == 2) {
|
||||||
|
if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) {
|
||||||
|
return '1'
|
||||||
|
} else {
|
||||||
|
return '0'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num == 3) {
|
||||||
|
var myDate = new Date()
|
||||||
|
var month = myDate.getMonth() + 1
|
||||||
|
var day = myDate.getDate()
|
||||||
|
var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1;
|
||||||
|
if (UUserCard.substring(10, 12) < month || UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day) {
|
||||||
|
age ++
|
||||||
|
}
|
||||||
|
|
||||||
|
return age
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getCorpLocation(){
|
||||||
|
this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res=>{
|
||||||
|
if(res.code==0){
|
||||||
|
this.initMap(res.data);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appintelligentguardianshipdevice/list`, null, {
|
||||||
|
params: {
|
||||||
|
size: 8000,
|
||||||
|
current: 1
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
const points = res.data.records.map(item => {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
lnglat: [item.lng, item.lat],
|
||||||
|
id: item.id,
|
||||||
|
corpId: item.corpId,
|
||||||
|
areaName:item.areaName,
|
||||||
|
name: item.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.addMakert(points)
|
||||||
|
|
||||||
|
if (this.$route.query.id) {
|
||||||
|
this.onTreeChange({
|
||||||
|
type: '1',
|
||||||
|
deviceId: this.$route.query.id,
|
||||||
|
lng: this.$route.query.lng,
|
||||||
|
lat: this.$route.query.lat
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
formatName (str) {
|
||||||
|
if (!str) return ''
|
||||||
|
|
||||||
|
return str.substr(str.length - 2)
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appintelligentguardianshipdevice/queryMonitorList?deviceId=${id}&type=1`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
let obj = {}
|
||||||
|
this.testData = res.data.records.forEach(item => {
|
||||||
|
obj[item.item] = item
|
||||||
|
})
|
||||||
|
|
||||||
|
this.testData = obj
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.instance.post(`/app/appintelligentguardianshipdevice/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.info = res.data
|
||||||
|
this.info.age = this.getIdInfo(res.data.idNumber, 3)
|
||||||
|
this.isShowInfo = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toCenter() {
|
||||||
|
this.map.setZoomAndCenter(this.zoom, this.center, false, 600)
|
||||||
|
},
|
||||||
|
|
||||||
|
renderClusterMarker(context) {
|
||||||
|
let el = `<div class="polymeric">
|
||||||
|
<div class="polymeric-container">
|
||||||
|
<p>${context.count}</p>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
let offset = new AMap.Pixel(-9, -9)
|
||||||
|
context.marker.setContent(el)
|
||||||
|
context.marker.setOffset(offset)
|
||||||
|
context.marker.lnglat = context.clusterData[0].lnglat
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.map.setZoomAndCenter(this.map.getZoom() + 3, e.target.lnglat, false, 500)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMarker(context) {
|
||||||
|
const buildId = context.data[0].id
|
||||||
|
|
||||||
|
let el = `<div class="mark mark${context.data[0].abnormalStatus}" id="buildId-${buildId}">
|
||||||
|
<div class="mark-contaienr">
|
||||||
|
<span>${context.data[0].name}</span>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
context.marker.setContent(el);
|
||||||
|
context.marker.setAnchor("center")
|
||||||
|
context.marker.id = `${buildId}`
|
||||||
|
context.marker.data = JSON.stringify(context.data[0])
|
||||||
|
context.marker.lnglat = context.data[0].lnglat
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.choosedId = e.target.id
|
||||||
|
this.getInfo(e.target.id)
|
||||||
|
context.marker.setContent(el);
|
||||||
|
document.querySelectorAll('.mark').forEach(el => {
|
||||||
|
el.classList.remove('mark-active')
|
||||||
|
})
|
||||||
|
document.querySelector(`#buildId-${e.target.id}`).add('mark-active')
|
||||||
|
this.map.setZoomAndCenter(this.map.getZoom() + 0.000000001, e.target.lnglat, false, 300)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
closeInfo () {
|
||||||
|
this.info = {}
|
||||||
|
this.isShowInfo = false
|
||||||
|
this.choosedId = ''
|
||||||
|
this.map.setZoom(this.map.getZoom() + 0.0001)
|
||||||
|
},
|
||||||
|
|
||||||
|
addMakert(points) {
|
||||||
|
new AMap.MarkerClusterer(this.map, points, {
|
||||||
|
gridSize: 60,
|
||||||
|
maxZoom: 15,
|
||||||
|
clusterByZoomChange: false,
|
||||||
|
renderClusterMarker: this.renderClusterMarker,
|
||||||
|
renderMarker: this.renderMarker
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
initMap({lng,lat}) {
|
||||||
|
this.center = [lng,lat];
|
||||||
|
AMapLoader.load({
|
||||||
|
key: '54a02a43d9828a8f9cd4f26fe281e74e',
|
||||||
|
version: '2.0',
|
||||||
|
plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'],
|
||||||
|
AMapUI: {
|
||||||
|
version: '1.1',
|
||||||
|
plugins: []
|
||||||
|
}
|
||||||
|
}).then((AMap) => {
|
||||||
|
this.map = new AMap.Map('map', {
|
||||||
|
resizeEnable: true,
|
||||||
|
zooms: [6, 20],
|
||||||
|
center: [lng, lat],
|
||||||
|
zoom: this.zoom,
|
||||||
|
mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec'
|
||||||
|
})
|
||||||
|
this.satellite = new AMap.TileLayer.Satellite()
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.map {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.community-info {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
width: 400px;
|
||||||
|
max-height: calc(100% - 20px);
|
||||||
|
overflow-y: overlay;
|
||||||
|
overflow-x: hidden;
|
||||||
|
z-index: 111;
|
||||||
|
background: rgba(7,11,35,0.50);
|
||||||
|
border: 1px solid #14345F;
|
||||||
|
|
||||||
|
.community-info__close {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
padding: 16px 12px 0 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #8899bb;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 6px;
|
||||||
|
background: rgba(144, 147, 153, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__header {
|
||||||
|
padding-top: 40px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.user {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
margin: 0 auto 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
line-height: 24px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-weight: Bold;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3, p {
|
||||||
|
width: 300px;
|
||||||
|
line-height: 22px;
|
||||||
|
margin: 0 auto 4px;
|
||||||
|
font-size: 13px;
|
||||||
|
color: #82C5FF;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > h3 {
|
||||||
|
line-height: 1.4;
|
||||||
|
color: #82C5FF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__header--info {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 0 20px;
|
||||||
|
|
||||||
|
.community-info__header--info-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 174px;
|
||||||
|
height: 56px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 0 12px;
|
||||||
|
background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%);
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:nth-of-type(2n - 1) {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > i {
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
font-style: normal;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 14px;
|
||||||
|
color: rgba(130, 197, 255, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 8px;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #6BA3DB;
|
||||||
|
|
||||||
|
i {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__header--status {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: #74FF66;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:first-child {
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
position: relative;
|
||||||
|
margin-right: 2px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:last-child {
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__wrapper {
|
||||||
|
padding: 0 20px 40px;
|
||||||
|
|
||||||
|
.community-info__title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
position: relative;
|
||||||
|
width: 169px;
|
||||||
|
padding: 0 20px;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat;
|
||||||
|
background-size: 169px 30px;
|
||||||
|
background-position-y: -5px;
|
||||||
|
background-position-x: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
width: 52px;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0 12px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
max-width: 70%;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
flex-shrink: 1;
|
||||||
|
color: rgba(130, 197, 255, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.community-info__wrapper--last {
|
||||||
|
.community-info__item {
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
background: #F3F6F9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ol-zoom ){
|
||||||
|
display: none !important;
|
||||||
|
top: inherit !important;
|
||||||
|
bottom: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .amap-logo), :deep( .amap-copyright ){
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .amap-icon ){
|
||||||
|
width: 40px !important;
|
||||||
|
height: 40px !important;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-more {
|
||||||
|
display: block;
|
||||||
|
height: 60px;
|
||||||
|
line-height: 60px;
|
||||||
|
margin-top: 2px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
height: 28px;
|
||||||
|
padding: 0 10px;
|
||||||
|
background: #0F8F64;
|
||||||
|
border-radius: 26px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.color1 {
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #2266FF !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.color2 {
|
||||||
|
background: #F46159;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #F46159 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border: 6px solid #0F8F64;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
overflow: hidden;
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
padding-right: 2px;
|
||||||
|
position: relative;
|
||||||
|
color: #ffc928;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .polymeric ){
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&.polymeric-active {
|
||||||
|
.polymeric-container {
|
||||||
|
background: #F46159;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
background-color: #F46159;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
z-index: -1;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
-webkit-animation: warn 1s ease-out 0s infinite;
|
||||||
|
animation: warn 1s ease-out 0s infinite;
|
||||||
|
background-color: rgba(15, 143, 100, 1);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.polymeric-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(15, 143, 100, 1);
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 58px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:first-child{
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #fff;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .mark){
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
user-select: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 56px;
|
||||||
|
height: 56px;
|
||||||
|
background: rgba(108,94,14,0.80);
|
||||||
|
border: 1px solid #FFDF54;
|
||||||
|
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #D1A818;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 0 2px 4px rgba(0,0,0,0.50);
|
||||||
|
|
||||||
|
&.mark0 {
|
||||||
|
background: rgba(8,73,35,0.80);
|
||||||
|
border: 1px solid #22FF81;
|
||||||
|
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mark1 {
|
||||||
|
background: rgba(79,14,7,0.80);
|
||||||
|
border: 1px solid #FF6969;
|
||||||
|
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mark2 {
|
||||||
|
background: rgba(96,8,102,0.80);
|
||||||
|
border: 1px solid #FF69DD;
|
||||||
|
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mark-contaienr {
|
||||||
|
width: 56px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
// &.mark1::after {
|
||||||
|
// position: absolute;
|
||||||
|
// z-index: -1;
|
||||||
|
// width: 100px;
|
||||||
|
// height: 100px;
|
||||||
|
// border-radius: 50%;
|
||||||
|
// -webkit-animation: warn 1s ease-out 0s infinite;
|
||||||
|
// animation: warn 1s ease-out 0s infinite;
|
||||||
|
// background-color: #FF6969;
|
||||||
|
// transform: translate(-50%, -50%);
|
||||||
|
// content: " ";
|
||||||
|
// }
|
||||||
|
|
||||||
|
// &.mark2::after {
|
||||||
|
// position: absolute;
|
||||||
|
// z-index: -1;
|
||||||
|
// width: 100px;
|
||||||
|
// height: 100px;
|
||||||
|
// border-radius: 50%;
|
||||||
|
// -webkit-animation: warn 1s ease-out 0s infinite;
|
||||||
|
// animation: warn 1s ease-out 0s infinite;
|
||||||
|
// background-color: #FF69DD;
|
||||||
|
// transform: translate(-50%, -50%);
|
||||||
|
// content: " ";
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.8);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.4);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
1271
packages/bigscreen/dv/AppPdDv.vue
Normal file
1257
packages/bigscreen/dv/AppPlyDv.vue
Normal file
1396
packages/bigscreen/dv/AppQxnDv.vue
Normal file
1735
packages/bigscreen/dv/AppQxnEventDv.vue
Normal file
505
packages/bigscreen/dv/AppResourceMapDv.vue
Normal file
@@ -0,0 +1,505 @@
|
|||||||
|
<template>
|
||||||
|
<div class="map">
|
||||||
|
<div id="map" ref="rootmap" />
|
||||||
|
<div class="community-info" v-show="isShowInfo">
|
||||||
|
<div class="community-info__close" title="关闭" @click="closeInfo">
|
||||||
|
<i class="iconClean iconfont"></i>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__header">
|
||||||
|
<h2>{{ info.resourceName }}</h2>
|
||||||
|
<el-tag type="success" size="small" style="margin: 6px 0;">{{ info.categoryName }}</el-tag>
|
||||||
|
<div>{{ info.areaName }}{{ info.address }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="community-info__wrapper">
|
||||||
|
<div class="community-info__title">
|
||||||
|
<h2>资源信息</h2>
|
||||||
|
</div>
|
||||||
|
<p>{{ info.information }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppResourceMapDv',
|
||||||
|
label: '资源地图',
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
root: this
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
map: null,
|
||||||
|
community: '',
|
||||||
|
isShowInfo: false,
|
||||||
|
info: {},
|
||||||
|
satellite: null,
|
||||||
|
zoom: 11,
|
||||||
|
choosedId: '',
|
||||||
|
center: [],
|
||||||
|
list: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user'])
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.getCorpLocation()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getCorpLocation(){
|
||||||
|
this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res=>{
|
||||||
|
if(res.code==0){
|
||||||
|
this.initMap(res.data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appresourceinfo/listAll`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
const points = res.data.map(item => {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
lnglat: [item.lng, item.lat],
|
||||||
|
id: item.id,
|
||||||
|
corpId: item.corpId,
|
||||||
|
areaName:item.areaName,
|
||||||
|
name: item.resourceName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.list = points
|
||||||
|
|
||||||
|
this.addMakert(points)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.info = this.list.filter(v => id === v.id)[0]
|
||||||
|
this.isShowInfo = true
|
||||||
|
},
|
||||||
|
|
||||||
|
renderClusterMarker(context) {
|
||||||
|
let el = `<div class="polymeric">
|
||||||
|
<div class="polymeric-container">
|
||||||
|
<p>${context.count}</p>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
let offset = new AMap.Pixel(-9, -9)
|
||||||
|
context.marker.setContent(el)
|
||||||
|
context.marker.setOffset(offset)
|
||||||
|
context.marker.lnglat = context.clusterData[0].lnglat
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.map.setZoomAndCenter(this.map.getZoom() + 3, e.target.lnglat, false, 500)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMarker(context) {
|
||||||
|
const buildId = context.data[0].id
|
||||||
|
|
||||||
|
let el = `<div id="buildId-${buildId}" class="mark ${buildId === this.choosedId ? 'mark-active' : ''}">
|
||||||
|
<img src="${context.data[0].categoryIcon || 'https://cdn.cunwuyun.cn/dvcp/ply/icon.png'}">
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
context.marker.setContent(el);
|
||||||
|
context.marker.setAnchor("center")
|
||||||
|
context.marker.id = `${buildId}`
|
||||||
|
context.marker.data = JSON.stringify(context.data[0])
|
||||||
|
context.marker.lnglat = context.data[0].lnglat
|
||||||
|
|
||||||
|
context.marker.on('click', e => {
|
||||||
|
this.choosedId = e.target.id
|
||||||
|
this.getInfo(e.target.id)
|
||||||
|
context.marker.setContent(el);
|
||||||
|
document.querySelectorAll('.mark').forEach(el => {
|
||||||
|
el.classList.remove('mark-active')
|
||||||
|
})
|
||||||
|
document.querySelector(`#buildId-${e.target.id}`).classList.add('mark-active')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
closeInfo () {
|
||||||
|
this.info = {}
|
||||||
|
this.isShowInfo = false
|
||||||
|
this.choosedId = ''
|
||||||
|
this.map.setZoom(this.map.getZoom() + 0.0001)
|
||||||
|
},
|
||||||
|
|
||||||
|
addMakert(points) {
|
||||||
|
new AMap.MarkerClusterer(this.map, points, {
|
||||||
|
gridSize: 60,
|
||||||
|
maxZoom: 15,
|
||||||
|
clusterByZoomChange: false,
|
||||||
|
renderClusterMarker: this.renderClusterMarker,
|
||||||
|
renderMarker: this.renderMarker
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
initMap({lng,lat}) {
|
||||||
|
this.center = [lng,lat];
|
||||||
|
AMapLoader.load({
|
||||||
|
key: '54a02a43d9828a8f9cd4f26fe281e74e',
|
||||||
|
version: '2.0',
|
||||||
|
plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'],
|
||||||
|
AMapUI: {
|
||||||
|
version: '1.1',
|
||||||
|
plugins: []
|
||||||
|
}
|
||||||
|
}).then((AMap) => {
|
||||||
|
this.map = new AMap.Map('map', {
|
||||||
|
resizeEnable: true,
|
||||||
|
zooms: [6, 20],
|
||||||
|
center: [lng, lat],
|
||||||
|
zoom: this.zoom,
|
||||||
|
mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec'
|
||||||
|
})
|
||||||
|
this.satellite = new AMap.TileLayer.Satellite()
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.map {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.community-info__header {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 12px 20px;
|
||||||
|
background-image: linear-gradient(270deg, rgba(11, 158, 255, 0.2) 0%, rgba(2, 81, 227, 0.2) 100%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
max-width: 360px;
|
||||||
|
line-height: 28px;
|
||||||
|
margin: 0;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: #D2E0FF;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
width: 400px;
|
||||||
|
max-height: calc(100% - 20px);
|
||||||
|
overflow-y: overlay;
|
||||||
|
overflow-x: hidden;
|
||||||
|
z-index: 111;
|
||||||
|
background: rgba(7,11,35,0.50);
|
||||||
|
border: 1px solid #14345F;
|
||||||
|
|
||||||
|
.community-info__close {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
padding: 16px 12px 0 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #8899bb;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 6px;
|
||||||
|
background: rgba(144, 147, 153, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.community-info__wrapper {
|
||||||
|
padding: 0 20px 40px;
|
||||||
|
|
||||||
|
.community-info__title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
position: relative;
|
||||||
|
width: 169px;
|
||||||
|
padding: 0 20px;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat;
|
||||||
|
background-size: 169px 30px;
|
||||||
|
background-position-y: -5px;
|
||||||
|
background-position-x: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
width: 52px;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #82C5FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ol-zoom ){
|
||||||
|
display: none !important;
|
||||||
|
top: inherit !important;
|
||||||
|
bottom: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .amap-logo), :deep( .amap-copyright ){
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .amap-icon ){
|
||||||
|
width: 40px !important;
|
||||||
|
height: 40px !important;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-more {
|
||||||
|
display: block;
|
||||||
|
height: 60px;
|
||||||
|
line-height: 60px;
|
||||||
|
margin-top: 2px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.community {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
height: 28px;
|
||||||
|
padding: 0 10px;
|
||||||
|
background: #0F8F64;
|
||||||
|
border-radius: 26px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.color1 {
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #2266FF !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.color2 {
|
||||||
|
background: #F46159;
|
||||||
|
|
||||||
|
em:after {
|
||||||
|
border-top-color: #F46159 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -6px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border: 6px solid #0F8F64;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
overflow: hidden;
|
||||||
|
content: ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
padding-right: 2px;
|
||||||
|
position: relative;
|
||||||
|
color: #ffc928;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .polymeric ){
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&.polymeric-active {
|
||||||
|
.polymeric-container {
|
||||||
|
background: #F46159;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
background-color: #F46159;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
z-index: -1;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
-webkit-animation: warn 1s ease-out 0s infinite;
|
||||||
|
animation: warn 1s ease-out 0s infinite;
|
||||||
|
background-color: rgba(15, 143, 100, 1);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.polymeric-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 62px;
|
||||||
|
height: 62px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(15, 143, 100, 1);
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 58px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:first-child{
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #fff;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .mark){
|
||||||
|
position: relative;
|
||||||
|
user-select: none;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mark-active {
|
||||||
|
transform: scale(1.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.8);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes warn {
|
||||||
|
0% {
|
||||||
|
transform: scale(.5);
|
||||||
|
opacity: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: .5
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1.4);
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
1232
packages/bigscreen/dv/AppSpecialPeopleDV.vue
Normal file
522
packages/bigscreen/dv/AppVideoMonitoringDV.vue
Normal file
@@ -0,0 +1,522 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppVideoMonitoringDV">
|
||||||
|
<el-row type="flex" justify="space-between" class="body">
|
||||||
|
<div class="left-wrap column" flex>
|
||||||
|
<div class="left-top fill">
|
||||||
|
<label class="label">设备统计</label>
|
||||||
|
<dv-scroll-board :header="config.header" :config="config" class="table"/>
|
||||||
|
</div>
|
||||||
|
<div class="left-bottom">
|
||||||
|
<label class="label">电子地图</label>
|
||||||
|
<ai-map :areaId="user.info.areaId"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="center-wrap column" flex>
|
||||||
|
<div flex style="width: 100%">
|
||||||
|
<div :span="6" class="card fill" v-for="(item,index) in cardList" :key="index">
|
||||||
|
<span>{{ item.label }}</span>
|
||||||
|
<span>{{ item.value }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="center-bottom fill">
|
||||||
|
<label class="label">视频监控</label>
|
||||||
|
<div class="video-wrap">
|
||||||
|
<div class="item" v-for="(item,index) in videoData.slice(0,2)"
|
||||||
|
:key="index">
|
||||||
|
<template v-if="flag">
|
||||||
|
<iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
|
||||||
|
allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="video"></div>
|
||||||
|
</template>
|
||||||
|
<div class="info">
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="video-wrap">
|
||||||
|
<div class="item" v-for="(item,index) in videoData.slice(2,4)"
|
||||||
|
:key="index">
|
||||||
|
<template v-if="flag">
|
||||||
|
<iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
|
||||||
|
allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="video"></div>
|
||||||
|
</template>
|
||||||
|
<div class="info">
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right-wrap column" flex>
|
||||||
|
<div class="right-top fill">
|
||||||
|
<label class="label">人员统计</label>
|
||||||
|
<label class="total">人员总数
|
||||||
|
<span>0</span>
|
||||||
|
<span>人</span>
|
||||||
|
</label>
|
||||||
|
<dv-scroll-board :config="config1" class="total-table"/>
|
||||||
|
</div>
|
||||||
|
<div class="right-middle">
|
||||||
|
<label class="label">动作告警统计</label>
|
||||||
|
<div class="tag">
|
||||||
|
<span></span>
|
||||||
|
</div>
|
||||||
|
<ai-echart :ops="getOpt()"/>
|
||||||
|
<div class="info">
|
||||||
|
今日
|
||||||
|
<span>0</span>
|
||||||
|
<span>次</span>
|
||||||
|
本月
|
||||||
|
<span>0</span>
|
||||||
|
<span>次</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right-bottom">
|
||||||
|
<label class="label">声音告警统计</label>
|
||||||
|
<div class="tag">
|
||||||
|
<span></span>
|
||||||
|
</div>
|
||||||
|
<ai-echart :ops="getOpt('1')"/>
|
||||||
|
<div class="info">
|
||||||
|
今日
|
||||||
|
<span style="color:#00FFDF">0</span>
|
||||||
|
<span>次</span>
|
||||||
|
本月
|
||||||
|
<span style="color:#00FFDF">0</span>
|
||||||
|
<span>次</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
import Vue from "vue";
|
||||||
|
import {scrollBoard} from "@jiaminghi/data-view";
|
||||||
|
|
||||||
|
Vue.use(scrollBoard)
|
||||||
|
export default {
|
||||||
|
name: "AppVideoMonitoringDV",
|
||||||
|
label: "数据大屏-平安小区",
|
||||||
|
inject: {
|
||||||
|
dv: {default: ""}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
instance: Function
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
cardList() {
|
||||||
|
return [
|
||||||
|
{label: "总设备数", value: "0"},
|
||||||
|
{label: "在线设备", value: "0"},
|
||||||
|
{label: "离线设备", value: "0"},
|
||||||
|
{label: "设备在线率", value: "0%"},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
meta: {},
|
||||||
|
config: {
|
||||||
|
data: [
|
||||||
|
],
|
||||||
|
columnWidth: [60, 140],
|
||||||
|
header: ["机构", "设备在线率"],
|
||||||
|
headerBGC: '',
|
||||||
|
headerHeight: 41,
|
||||||
|
oddRowBGC: "",
|
||||||
|
evenRowBGC: "",
|
||||||
|
align: ["center", "center", "center"],
|
||||||
|
rowNum: 10,
|
||||||
|
index: true,
|
||||||
|
indexHeader: "排名"
|
||||||
|
},
|
||||||
|
config1: {
|
||||||
|
data: [
|
||||||
|
['普通用户', '-'],
|
||||||
|
['村级管理员', '-'],
|
||||||
|
['超级管理员', '-'],
|
||||||
|
['测试', '-'],
|
||||||
|
],
|
||||||
|
headerHeight: 41,
|
||||||
|
oddRowBGC: "",
|
||||||
|
evenRowBGC: "",
|
||||||
|
align: ["left", "left", "right"],
|
||||||
|
index: true,
|
||||||
|
rowNum: 6,
|
||||||
|
columnWidth: [50]
|
||||||
|
},
|
||||||
|
start: 0,
|
||||||
|
end: 40,
|
||||||
|
start1: 0,
|
||||||
|
end1: 40,
|
||||||
|
interval: null,
|
||||||
|
videoData: [],
|
||||||
|
flag: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
jsonObj(val) {
|
||||||
|
return JSON.parse(val || "{}")?.url
|
||||||
|
},
|
||||||
|
getOpt(type = "0") {
|
||||||
|
let opt = {
|
||||||
|
"0": {
|
||||||
|
xData: ['2020/7/1', "2020/7/2", "2020/7/3", "2020/7/4", "2020/7/5", "2020/7/6", "2020/7/7", "2020/7/8", "2020/7/9", "2020/7/10", "2020/7/11"],
|
||||||
|
yData: Array(11).fill(0),
|
||||||
|
color: "#FFEA2F",
|
||||||
|
areaStyle: 'rgba(255,234,47,0.2)',
|
||||||
|
unit: '',
|
||||||
|
},
|
||||||
|
"1": {
|
||||||
|
xData: ["1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00"],
|
||||||
|
yData: Array(10).fill(0),
|
||||||
|
color: "#13B5B1",
|
||||||
|
areaStyle: 'rgba(255,234,47,0.2)',
|
||||||
|
unit: '次',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
grid: {
|
||||||
|
top: "5%",
|
||||||
|
left: "16%",
|
||||||
|
right: "3%",
|
||||||
|
bottom: "12%"
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
show: true,
|
||||||
|
boundaryGap: false,
|
||||||
|
type: 'category',
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
textStyle: {
|
||||||
|
color: "#5E9CEA",
|
||||||
|
fontSize: 12
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
data: opt[type]["xData"]
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
show: true,
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: ['#103066'],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
formatter: (val) => `${val}${opt[type]["unit"]}`,
|
||||||
|
textStyle: {
|
||||||
|
color: "#5E9CEA",
|
||||||
|
fontSize: 12
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
symbol: "none",
|
||||||
|
data: opt[type]["yData"],
|
||||||
|
type: 'line',
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
color: opt[type]["color"],
|
||||||
|
areaStyle: {
|
||||||
|
color: {
|
||||||
|
type: 'linear', x2: 0, y2: 1, colorStops: [
|
||||||
|
{offset: 0, color: opt[type]["areaStyle"]}, {offset: 1, color: '#000000'}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getWebSdkUrlForScreen() {
|
||||||
|
this.instance.post(`/app/appzyvideoequipment/getWebSdkUrlForTianQiaoScreen`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.videoData = res.data
|
||||||
|
this.flag = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.interval && clearInterval(this.interval);
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// this.getWebSdkUrlForScreen()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppVideoMonitoringDV {
|
||||||
|
height: 100%;
|
||||||
|
padding: 6px 0 10px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 24px;
|
||||||
|
|
||||||
|
.body {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.left-wrap {
|
||||||
|
width: 307px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.left-top {
|
||||||
|
width: 100%;
|
||||||
|
background-image: url("./assets/videoMonitor/box1.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.table {
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 63px 17px 17px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-bottom {
|
||||||
|
width: 100%;
|
||||||
|
height: 311px;
|
||||||
|
background-image: url("./assets/videoMonitor/box2.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
margin-top: 7px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.AiMap {
|
||||||
|
width: 274px;
|
||||||
|
height: 247px;
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-wrap {
|
||||||
|
width: 1183px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.card {
|
||||||
|
height: 93.3px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-image: url("./assets/videoMonitor/card.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
margin-right: 24px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:first-child {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:last-child {
|
||||||
|
font-size: 38px;
|
||||||
|
font-family: dineng, serif;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #00EDFF;
|
||||||
|
margin-left: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-bottom {
|
||||||
|
width: 100%;
|
||||||
|
height: 789px;
|
||||||
|
background-image: url("./assets/videoMonitor/middlebox.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
margin-top: 40px;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 61px;
|
||||||
|
|
||||||
|
.video-wrap {
|
||||||
|
width: 100%;
|
||||||
|
height: 344px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
.video {
|
||||||
|
width: 522px;
|
||||||
|
height: 296px;
|
||||||
|
object-fit: fill;
|
||||||
|
vertical-align: bottom;
|
||||||
|
border: 2px solid #122C7D;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
height: 48px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0 12px;
|
||||||
|
background-color: #071153;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-wrap {
|
||||||
|
width: 297px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.right-top {
|
||||||
|
width: 100%;
|
||||||
|
height: 333px;
|
||||||
|
background-image: url("./assets/videoMonitor/box3.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.total {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #979AB7;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 65px 0 16px 23px;
|
||||||
|
|
||||||
|
& > span:nth-child(1) {
|
||||||
|
font-size: 28px;
|
||||||
|
font-family: dineng, serif;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #01CAFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:nth-child(2) {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #01CAFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-table {
|
||||||
|
height: 200px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0 23px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-middle, .right-bottom {
|
||||||
|
width: 100%;
|
||||||
|
height: 276px;
|
||||||
|
background-image: url("./assets/videoMonitor/box4.png");
|
||||||
|
background-size: 100% 100%;
|
||||||
|
margin: 19px 0;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
margin: 28px 18px 0 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #5E9CEA;
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
display: inline-block;
|
||||||
|
width: 34px;
|
||||||
|
height: 17px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 18px;
|
||||||
|
margin-left: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .AiEchart ){
|
||||||
|
width: 251px;
|
||||||
|
height: 175px;
|
||||||
|
margin: 11px auto 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 24px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 15px 19px 0;
|
||||||
|
|
||||||
|
& > span:nth-child(2n+1) {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 24px;
|
||||||
|
color: #FFE930;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:nth-child(2n) {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #FFE930;
|
||||||
|
line-height: 24px;
|
||||||
|
margin: 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:nth-child(2) {
|
||||||
|
margin-right: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-bottom {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
position: absolute;
|
||||||
|
left: 24px;
|
||||||
|
top: 23px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .index ){
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .header ){
|
||||||
|
background: url("./assets/videoMonitor/titlebox.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .row-item div:nth-child(3) ){
|
||||||
|
font-size: 13px;
|
||||||
|
color: #00CDFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
1267
packages/bigscreen/dv/AppXyDv.vue
Normal file
1267
packages/bigscreen/dv/AppYyxDv.vue
Normal file
BIN
packages/bigscreen/dv/assets/centralTask/bg.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
BIN
packages/bigscreen/dv/assets/centralTask/box.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/bigscreen/dv/assets/centralTask/titleBox.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
packages/bigscreen/dv/assets/govInteraction/globe_map.png
Normal file
|
After Width: | Height: | Size: 693 KiB |
BIN
packages/bigscreen/dv/assets/govInteraction/kuaikuai.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/bigscreen/dv/assets/govInteraction/title.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
packages/bigscreen/dv/assets/grid/avatar.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/bigscreen/dv/assets/grid/close.png
Normal file
|
After Width: | Height: | Size: 445 B |
BIN
packages/bigscreen/dv/assets/grid/title-bg.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/bg.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/box1.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/box2.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/box3.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/box4.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/card.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/middlebox.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
packages/bigscreen/dv/assets/videoMonitor/titlebox.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
275
packages/bigscreen/dv/components/AiGrid.vue
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
<template>
|
||||||
|
<div class="AiGrid" ref="container">
|
||||||
|
<div
|
||||||
|
class="AiGrid-wrapper"
|
||||||
|
ref="tree"
|
||||||
|
id="tree"
|
||||||
|
:style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}">
|
||||||
|
<ai-okr-tree
|
||||||
|
:props="props"
|
||||||
|
node-key="id"
|
||||||
|
show-collapsable
|
||||||
|
show-node-num
|
||||||
|
current-lable-class-name="aigrid-active"
|
||||||
|
:default-expanded-keys="defaultExpandedKeys"
|
||||||
|
ref="VueOkrTree"
|
||||||
|
@node-click="onNodeClick"
|
||||||
|
:data="treeData">
|
||||||
|
</ai-okr-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'AiGrid',
|
||||||
|
props: ['instance'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
scale: 1,
|
||||||
|
x: '50%',
|
||||||
|
y: '50%',
|
||||||
|
defaultExpandedKeys: [],
|
||||||
|
treeData: [],
|
||||||
|
props: {
|
||||||
|
label: 'girdName',
|
||||||
|
children: 'children'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.bindEvent()
|
||||||
|
this.getPartyOrg()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed() {
|
||||||
|
document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel)
|
||||||
|
document.querySelector('body').removeEventListener('mouseup', this.onMouseUp)
|
||||||
|
document.querySelector('body').removeEventListener('mousedown', this.onMousedown)
|
||||||
|
document.querySelector('body').removeEventListener('mousemove', this.onMouseMove)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
bindEvent() {
|
||||||
|
document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true)
|
||||||
|
document.querySelector('body').addEventListener('mouseup', this.onMouseUp, true)
|
||||||
|
document.querySelector('body').addEventListener('mousedown', this.onMousedown, true)
|
||||||
|
document.querySelector('body').addEventListener('mousemove', this.onMouseMove, true)
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousewheel(event) {
|
||||||
|
if (!event) return false
|
||||||
|
const elClass = event.target.className
|
||||||
|
if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
||||||
|
var dir = event.deltaY > 0 ? 'Up' : 'Down'
|
||||||
|
if (dir === 'Up') {
|
||||||
|
this.scale = this.scale - 0.12 <= 0.1 ? 0.1 : this.scale - 0.12
|
||||||
|
} else {
|
||||||
|
this.scale = this.scale + 0.12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousedown(e) {
|
||||||
|
const elClass = e.target.className
|
||||||
|
if ((elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
||||||
|
const left = document.querySelector('#tree').offsetLeft
|
||||||
|
const top = document.querySelector('#tree').offsetTop
|
||||||
|
this.isMove = true
|
||||||
|
this.offsetX = e.clientX - left
|
||||||
|
this.offsetY = e.clientY - top
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseMove(e) {
|
||||||
|
if (!this.isMove) return
|
||||||
|
|
||||||
|
this.x = (e.clientX - this.offsetX) + 'px'
|
||||||
|
this.y = (e.clientY - this.offsetY) + 'px'
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseUp() {
|
||||||
|
this.isMove = false
|
||||||
|
},
|
||||||
|
|
||||||
|
onNodeClick(e) {
|
||||||
|
this.$emit('nodeClick', e)
|
||||||
|
},
|
||||||
|
|
||||||
|
getPartyOrg() {
|
||||||
|
this.instance.post('/app/appgirdinfo/listAll3').then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.treeData = res.data.filter(e => !e.parentGirdId)
|
||||||
|
const parentGirdId = this.treeData[0].id
|
||||||
|
|
||||||
|
this.treeData.map(p => this.addChild(p, res.data.map(v => {
|
||||||
|
if (v.id === parentGirdId) {
|
||||||
|
this.defaultExpandedKeys.push(v.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...v,
|
||||||
|
girdName: v.girdName.substr(0, 11)
|
||||||
|
}
|
||||||
|
}), {
|
||||||
|
parent: 'parentGirdId'
|
||||||
|
}))
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.autoScale()
|
||||||
|
this.$refs.VueOkrTree.setCurrentKey(parentGirdId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
autoScale() {
|
||||||
|
const treeWidth = this.$refs.tree.offsetWidth
|
||||||
|
const containerWidth = this.$refs.container.offsetWidth - 100
|
||||||
|
this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth
|
||||||
|
this.x = '50%'
|
||||||
|
this.y = '50%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AiGrid {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.AiGrid-wrapper {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
align-items: center;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
padding: 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
width: max-content;
|
||||||
|
height: 300%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aigrid-active {
|
||||||
|
background: linear-gradient(180deg, #42C6CE 0%, #307598 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .org-chart-container ){
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
.org-chart-node-children {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
float: initial !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node-btn {
|
||||||
|
border: 1px solid #23A0AC !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: #071030;
|
||||||
|
color: #FF9A02;
|
||||||
|
|
||||||
|
&:after, &::before {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.expanded::before {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 4px;
|
||||||
|
right: 4px;
|
||||||
|
height: 0;
|
||||||
|
border-top: 1px solid #FF9A02;
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node-btn-text {
|
||||||
|
background: transparent;
|
||||||
|
color: #FF9A02;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node {
|
||||||
|
// overflow: hidden;
|
||||||
|
|
||||||
|
.org-chart-node-label {
|
||||||
|
width: 40px;
|
||||||
|
height: 254px;
|
||||||
|
margin-right: 15px;
|
||||||
|
padding: 0 0;
|
||||||
|
|
||||||
|
.org-chart-node-label-inner {
|
||||||
|
width: 40px !important;
|
||||||
|
height: 254px !important;
|
||||||
|
border: 1px solid;
|
||||||
|
background: linear-gradient(180deg, rgba(69, 210, 218, 0.2500) 0%, rgba(69, 210, 218, 0.1000) 100%) !important;
|
||||||
|
border-image: linear-gradient(180deg, rgba(5, 185, 203, 1), rgba(73, 214, 207, 1)) 1 1 !important;
|
||||||
|
line-height: 1.3;
|
||||||
|
padding: 10px 8px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18px;
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
|
||||||
|
&.aigrid-active {
|
||||||
|
background: linear-gradient(180deg, #42C6CE 0%, #307598 100%) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-root-label {
|
||||||
|
width: auto !important;
|
||||||
|
min-width: 240px;
|
||||||
|
height: 40px !important;
|
||||||
|
line-height: 40px !important;
|
||||||
|
min-height: 40px !important;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.org-chart-node-label-inner {
|
||||||
|
padding: 0 30px !important;
|
||||||
|
color: #fff !important;
|
||||||
|
width: auto !important;
|
||||||
|
min-width: 240px;
|
||||||
|
height: 40px !important;
|
||||||
|
line-height: 40px !important;
|
||||||
|
min-height: 40px !important;
|
||||||
|
text-align: center;
|
||||||
|
background: linear-gradient(180deg, rgba(69, 210, 218, 0.2500) 0%, rgba(69, 210, 218, 0.1000) 100%) !important;
|
||||||
|
border-image: linear-gradient(180deg, rgba(5, 185, 203, 1), rgba(73, 214, 207, 1)) 1 1 !important;
|
||||||
|
|
||||||
|
&.aigrid-active {
|
||||||
|
background: linear-gradient(180deg, #42C6CE 0%, #307598 100%) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
.org-chart-node-label {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before,
|
||||||
|
.org-chart-node.is-leaf:before {
|
||||||
|
border-radius: 0;
|
||||||
|
border-color: #23A0AC !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical .org-chart-node:after, .vertical .org-chart-node:before {
|
||||||
|
border-radius: 0;
|
||||||
|
border-color: #23A0AC !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
133
packages/bigscreen/dv/components/DonutChart.vue
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<div class="DonutChart" :id="id">
|
||||||
|
<canvas :id="canvasId"></canvas>
|
||||||
|
<div class="DonutChart-text">
|
||||||
|
<span>{{ ratio || 0 }}%</span>
|
||||||
|
<i>{{ text }}</i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ['ratio', 'text'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
id: `DonutChart-${Math.ceil(Math.random() * 10000)}`,
|
||||||
|
canvasId: `DonutChartCanvas-${Math.ceil(Math.random() * 10000)}`,
|
||||||
|
canvasWidth: 90,
|
||||||
|
canvasHeight: 90
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.init()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
drawLine(ctx, options) {
|
||||||
|
const { beginX, beginY, endX, endY, lineColor, lineWidth } = options
|
||||||
|
ctx.lineWidth = lineWidth
|
||||||
|
ctx.strokeStyle = lineColor
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.moveTo(beginX, beginY)
|
||||||
|
ctx.lineTo(endX, endY)
|
||||||
|
ctx.closePath()
|
||||||
|
ctx.stroke()
|
||||||
|
},
|
||||||
|
|
||||||
|
angle (a, i, ox, oy, or) {
|
||||||
|
var hudu = (2 * Math.PI / 360) * a * i
|
||||||
|
var x = ox + Math.sin(hudu) * or
|
||||||
|
var y = oy - Math.cos(hudu) * or
|
||||||
|
return x + '_' + y
|
||||||
|
},
|
||||||
|
|
||||||
|
mapColor (value) {
|
||||||
|
if (value < 25) {
|
||||||
|
return '#FFC139'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 50) {
|
||||||
|
return '#21E03E'
|
||||||
|
}
|
||||||
|
|
||||||
|
return '#05C8FF'
|
||||||
|
},
|
||||||
|
|
||||||
|
init () {
|
||||||
|
const ctx = document.querySelector(`#${this.canvasId}`).getContext('2d')
|
||||||
|
const canvasWidth = document.querySelector(`#${this.id}`).offsetWidth
|
||||||
|
const canvasHeight = document.querySelector(`#${this.id}`).offsetHeight
|
||||||
|
const angle = this.ratio / 100 * 2
|
||||||
|
let radian = 0
|
||||||
|
|
||||||
|
ctx.width = canvasWidth
|
||||||
|
ctx.height = canvasHeight
|
||||||
|
const x = canvasWidth / 2
|
||||||
|
const y = canvasHeight / 2
|
||||||
|
ctx.lineWidth = 2
|
||||||
|
ctx.strokeStyle = '#383f56'
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, x - 3, 0, 2 * Math.PI)
|
||||||
|
ctx.stroke()
|
||||||
|
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.lineWidth = 4
|
||||||
|
ctx.strokeStyle = 'rgba(76, 202, 227, 1)'
|
||||||
|
|
||||||
|
if (this.ratio < 25) {
|
||||||
|
radian = 3 / 2 + angle
|
||||||
|
ctx.arc(x, y, x - 4, Math.PI + Math.PI / 2, Math.PI * radian, false)
|
||||||
|
} else if (this.ratio === 100) {
|
||||||
|
ctx.arc(x, y, x - 4, 0, Math.PI * 2)
|
||||||
|
} else {
|
||||||
|
radian = (this.ratio - 25) / 100 * 2
|
||||||
|
ctx.arc(x, y, x - 4, Math.PI + Math.PI / 2, Math.PI * radian, false)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.DonutChart {
|
||||||
|
position: relative;
|
||||||
|
width: 84px;
|
||||||
|
height: 84px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.DonutChart-text {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
line-height: 1;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
span {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
font-style: oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 12px;
|
||||||
|
font-style: normal;
|
||||||
|
color: rgba(42, 183, 209, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
190
packages/bigscreen/dv/components/DoughnutChart.vue
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
<template>
|
||||||
|
<div class="DoughnutChart-wrapper">
|
||||||
|
<div class="DoughnutChart" :id="id">
|
||||||
|
<canvas :id="canvasId"></canvas>
|
||||||
|
<div class="DonutChart-text">
|
||||||
|
<span>{{ ratio }}%</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="DoughnutChart-explain">
|
||||||
|
<div class="item" v-for="(item, index) in value" :key="index">
|
||||||
|
<i></i>
|
||||||
|
<span :style="labelStyle">{{ item.key }}</span>
|
||||||
|
<p>{{ item.value }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ['ratio', 'value', 'labelStyle'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
id: `DonutChart-${Math.ceil(Math.random() * 10000)}`,
|
||||||
|
canvasId: `DonutChartCanvas-${Math.ceil(Math.random() * 10000)}`,
|
||||||
|
canvasWidth: 90,
|
||||||
|
canvasHeight: 90
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
ratio () {
|
||||||
|
this.init()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.init()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
drawLine(ctx, options) {
|
||||||
|
const { beginX, beginY, endX, endY, lineColor, lineWidth } = options
|
||||||
|
ctx.lineWidth = lineWidth
|
||||||
|
ctx.strokeStyle = lineColor
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.moveTo(beginX, beginY)
|
||||||
|
ctx.lineTo(endX, endY)
|
||||||
|
ctx.closePath()
|
||||||
|
ctx.stroke()
|
||||||
|
},
|
||||||
|
|
||||||
|
angle (a, i, ox, oy, or) {
|
||||||
|
var hudu = (2 * Math.PI / 360) * a * i
|
||||||
|
var x = ox + Math.sin(hudu) * or
|
||||||
|
var y = oy - Math.cos(hudu) * or
|
||||||
|
return x + '_' + y
|
||||||
|
},
|
||||||
|
|
||||||
|
mapColor (value) {
|
||||||
|
if (value < 25) {
|
||||||
|
return '#FFC139'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 50) {
|
||||||
|
return '#21E03E'
|
||||||
|
}
|
||||||
|
|
||||||
|
return '#05C8FF'
|
||||||
|
},
|
||||||
|
|
||||||
|
init () {
|
||||||
|
const ctx = document.querySelector(`#${this.canvasId}`).getContext('2d')
|
||||||
|
const canvasWidth = document.querySelector(`#${this.id}`).offsetWidth
|
||||||
|
const canvasHeight = document.querySelector(`#${this.id}`).offsetHeight
|
||||||
|
const angle = this.ratio / 100 * 2
|
||||||
|
let radian = 0
|
||||||
|
|
||||||
|
ctx.width = canvasWidth
|
||||||
|
ctx.height = canvasHeight
|
||||||
|
const x = canvasWidth / 2
|
||||||
|
const y = canvasHeight / 2
|
||||||
|
ctx.lineWidth = 4
|
||||||
|
ctx.strokeStyle = 'rgba(102, 121, 138, 0.3)'
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, x - 8, 0, 2 * Math.PI)
|
||||||
|
ctx.stroke()
|
||||||
|
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.lineWidth = 4
|
||||||
|
var g = ctx.createLinearGradient(0, 0, 0, 80)
|
||||||
|
g.addColorStop(0, 'rgba(44, 150, 231, 0.8)')
|
||||||
|
g.addColorStop(1, 'rgba(92, 255, 243, 1)')
|
||||||
|
ctx.strokeStyle = g
|
||||||
|
|
||||||
|
if (this.ratio < 25) {
|
||||||
|
radian = 3 / 2 + angle
|
||||||
|
ctx.arc(x, y, x - 8, Math.PI + Math.PI / 2, Math.PI * radian, false)
|
||||||
|
} else if (this.ratio === 100) {
|
||||||
|
ctx.arc(x, y, x - 8, 0, Math.PI * 2)
|
||||||
|
} else {
|
||||||
|
radian = (this.ratio - 25) / 100 * 2
|
||||||
|
ctx.arc(x, y, x - 8, Math.PI + Math.PI / 2, Math.PI * radian, false)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
|
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.strokeStyle = 'rgba(102, 121, 138, 0.4)'
|
||||||
|
ctx.lineWidth = 1
|
||||||
|
ctx.arc(x, y, x - 15, 0, 2 * Math.PI)
|
||||||
|
ctx.stroke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.DoughnutChart-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 100%;
|
||||||
|
padding-top: 12px;
|
||||||
|
|
||||||
|
.DoughnutChart-explain {
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 10px;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
margin-right: 6px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #5AF9F0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
width: 78px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #9BB7D4;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child i {
|
||||||
|
background: rgba(102, 121, 138, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.DoughnutChart {
|
||||||
|
position: relative;
|
||||||
|
width: 90px;
|
||||||
|
height: 90px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.DonutChart-text {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
justify-content: center;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 1;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #02FEFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
386
packages/bigscreen/dv/components/DvMap.vue
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
<template>
|
||||||
|
<div class="AiDvMap">
|
||||||
|
<div class="chart-map" :class="v" style="width: 100%; height: 100%"></div>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="info" v-if="isShowInfo">
|
||||||
|
<div class="info-mask" @click="isShowInfo = false"></div>
|
||||||
|
<div class="info-content">
|
||||||
|
<div class="info-title">
|
||||||
|
<h2>{{ title }}</h2>
|
||||||
|
</div>
|
||||||
|
<img src="https://cdn.cunwuyun.cn/dvcp/dv/qxn/close.png" @click="isShowInfo = false" />
|
||||||
|
<div class="info-wrapper" v-if="type === '0'">
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>下属单位:</label>
|
||||||
|
<span>{{ info['派出所数量'] }}个派出所</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>居民群:</label>
|
||||||
|
<span>{{ info['群数量'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>成员人数:</label>
|
||||||
|
<span>{{ info['成员总数'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>群人数:</label>
|
||||||
|
<span>{{ info['群成员数量'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>激活比例:</label>
|
||||||
|
<span>{{ rate }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>好友人数:</label>
|
||||||
|
<span>{{ info['外部联系人数量'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>群主人数:</label>
|
||||||
|
<span>{{ info['群主人数'] }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper" v-else>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>负责人:</label>
|
||||||
|
<span>{{ info['负责人'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>下属警格数:</label>
|
||||||
|
<span>{{ info['下属警格数量'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>警格人数:</label>
|
||||||
|
<span>{{ info['外部联系人数量'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>事件处理率:</label>
|
||||||
|
<span>{{ rate }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>待处理:</label>
|
||||||
|
<span>{{ info['待受理'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>处理中:</label>
|
||||||
|
<span>{{ info['办理中'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>已办理:</label>
|
||||||
|
<span>{{ info['已办结'] }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-wrapper__item">
|
||||||
|
<label>事件总数:</label>
|
||||||
|
<span>{{ info['事件总数'] }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AiDvMap',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
info: {},
|
||||||
|
timer: null,
|
||||||
|
title: '',
|
||||||
|
v: `AiDvMap-${new Date().getTime()}`,
|
||||||
|
chart: null,
|
||||||
|
isShowInfo: false,
|
||||||
|
geoJSON: require('./geoJSon/qxnGeoJSON.json')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
rate () {
|
||||||
|
if (!this.info['事件总数']) {
|
||||||
|
return '0%'
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((this.info['事件总数'] - this.info['待受理']) / this.info['事件总数']).toFixed(4) * 100 + '%'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initChart()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
this.chart = echarts.init(document.querySelector(`.${this.v}`))
|
||||||
|
echarts.registerMap('黔西南', this.geoJSON)
|
||||||
|
|
||||||
|
let option = {
|
||||||
|
geo: [
|
||||||
|
{
|
||||||
|
map: "黔西南",
|
||||||
|
aspectScale: 1,
|
||||||
|
zoom: 0.65,
|
||||||
|
layoutCenter: ["50%", "50%"],
|
||||||
|
layoutSize: "180%",
|
||||||
|
show: true,
|
||||||
|
roam: false,
|
||||||
|
emphasis: {
|
||||||
|
show: true,
|
||||||
|
label: {
|
||||||
|
textStyle: {
|
||||||
|
color: "#FFFFFF"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
// areaColor: '#fff'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
normal: {
|
||||||
|
show: true,
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: '14'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
borderColor: "rgba(2, 254, 255, 0.7)",
|
||||||
|
borderWidth: 2,
|
||||||
|
shadowColor: "rgba(2, 254, 255, 0.1)",
|
||||||
|
shadowOffsetY: 10,
|
||||||
|
shadowBlur: 120,
|
||||||
|
areaColor: "#0f7295",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 重影
|
||||||
|
{
|
||||||
|
type: "map",
|
||||||
|
map: "黔西南",
|
||||||
|
zlevel: -1,
|
||||||
|
aspectScale: 1,
|
||||||
|
zoom: 0.65,
|
||||||
|
layoutCenter: ["50%", "51%"],
|
||||||
|
layoutSize: "180%",
|
||||||
|
roam: false,
|
||||||
|
silent: true,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
borderWidth: 1,
|
||||||
|
// borderColor:"rgba(17, 149, 216,0.6)",
|
||||||
|
borderColor: "rgba(2, 254, 255, 0.3)",
|
||||||
|
shadowColor: "rgba(2, 254, 255, 0.3)",
|
||||||
|
shadowOffsetY: 5,
|
||||||
|
shadowBlur: 15,
|
||||||
|
areaColor: "rgba(5,21,35,0.1)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "map",
|
||||||
|
map: "黔西南",
|
||||||
|
zlevel: -2,
|
||||||
|
aspectScale: 1,
|
||||||
|
zoom: 0.65,
|
||||||
|
layoutCenter: ["50%", "52%"],
|
||||||
|
layoutSize: "180%",
|
||||||
|
roam: false,
|
||||||
|
silent: true,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
borderWidth: 1,
|
||||||
|
// borderColor: "rgba(57, 132, 188,0.4)",
|
||||||
|
borderColor: "rgba(2, 254, 255, 0.2)",
|
||||||
|
shadowColor: "rgba(2, 254, 255, 0.24)",
|
||||||
|
shadowOffsetY: 5,
|
||||||
|
shadowBlur: 15,
|
||||||
|
areaColor: "transpercent",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "map",
|
||||||
|
map: "黔西南",
|
||||||
|
zlevel: -3,
|
||||||
|
aspectScale: 1,
|
||||||
|
zoom: 0.65,
|
||||||
|
layoutCenter: ["50%", "53%"],
|
||||||
|
layoutSize: "180%",
|
||||||
|
roam: false,
|
||||||
|
silent: true,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
borderWidth: 1,
|
||||||
|
// borderColor: "rgba(11, 43, 97,0.8)",
|
||||||
|
borderColor: "rgba(2, 254, 255, 0.1)",
|
||||||
|
shadowColor: "rgba(2, 254, 255, 0.1)",
|
||||||
|
shadowOffsetY: 15,
|
||||||
|
shadowBlur: 10,
|
||||||
|
areaColor: "transpercent",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'scatter',
|
||||||
|
map: "黔西南",
|
||||||
|
coordinateSystem: 'geo',
|
||||||
|
z: 3,
|
||||||
|
zlevel: 3,
|
||||||
|
// symbol: 'none',
|
||||||
|
symbolSize: 16,
|
||||||
|
rippleEffect: {
|
||||||
|
period: 2,
|
||||||
|
scale: 4,
|
||||||
|
brushType: 'fill'
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
roam: false,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
areaColor: '#000',
|
||||||
|
borderColor: '#a18a3a',
|
||||||
|
borderWidth: 1
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
show: false,
|
||||||
|
areaColor: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
this.chart.setOption(option)
|
||||||
|
this.chart.on('click', e => {
|
||||||
|
this.getInfo(e.name)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (name) {
|
||||||
|
this.title = `${name}公安局`
|
||||||
|
this.instance.post(`/api/wxgridinfo/comprehensiveOverviewMap`, null, {
|
||||||
|
params: {
|
||||||
|
gridName: `${name}公安局`,
|
||||||
|
corpId: 'wwb182f88f0327b37f'
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.info = res.data
|
||||||
|
this.isShowInfo = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AiDvMap {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.info {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 111;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.info-mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba($color: #000000, $alpha: 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-content {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 11;
|
||||||
|
width: 390px;
|
||||||
|
height: 262px;
|
||||||
|
padding: 15px 18px 0;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/qxn/info-bg.png);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
.info-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 40px;
|
||||||
|
|
||||||
|
.info-wrapper__item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 50%;
|
||||||
|
line-height: 1;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
width: 90px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: #fff;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
flex: 1;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #FF8533;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
position: absolute;
|
||||||
|
top: 30px;
|
||||||
|
right: 18px;
|
||||||
|
z-index: 1;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all ease 300ms;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
483
packages/bigscreen/dv/components/PdGrid.vue
Normal file
@@ -0,0 +1,483 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pdgrid">
|
||||||
|
<div class="pdgrid-title">
|
||||||
|
<h2>{{ currGird }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-grid__title" @click="isShowGrid2 = true">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body">
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid3 = true">
|
||||||
|
<h2>{{ girdNum3 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName3 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click.stop="isShowGrid4 = true">
|
||||||
|
<h2>{{ girdNum4 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName4 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid5 = true">
|
||||||
|
<h2>{{ girdNum5 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName5 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid2">
|
||||||
|
<div class="mask" @click="isShowGrid2 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex2 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList2"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid2Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid3">
|
||||||
|
<div class="mask" @click="isShowGrid3 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName3">{{ girdName3 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex3 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList3"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid3Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid4">
|
||||||
|
<div class="mask" @click="isShowGrid4 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName4">{{ girdName4 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex4 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList4"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid4Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid5">
|
||||||
|
<div class="mask" @click="isShowGrid5 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName5">{{ girdName5 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex5 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList5"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid5Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'pdgrid',
|
||||||
|
|
||||||
|
props: ['instance'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
isShowGrid2: false,
|
||||||
|
isShowGrid3: false,
|
||||||
|
isShowGrid4: false,
|
||||||
|
isShowGrid5: false,
|
||||||
|
currIndex2: 0,
|
||||||
|
currIndex3: 0,
|
||||||
|
currIndex4: 0,
|
||||||
|
currIndex5: 0,
|
||||||
|
girdInfoList2: [],
|
||||||
|
girdInfoList3: [],
|
||||||
|
girdInfoList4: [],
|
||||||
|
girdInfoList5: [],
|
||||||
|
girdName2: '',
|
||||||
|
girdName3: '',
|
||||||
|
girdName4: '',
|
||||||
|
girdName5: '',
|
||||||
|
girdNum3: 0,
|
||||||
|
girdNum4: 0,
|
||||||
|
girdNum5: 0,
|
||||||
|
currGird: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
document.addEventListener('keydown', this.onKeyDown)
|
||||||
|
})
|
||||||
|
this.getInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed () {
|
||||||
|
document.removeEventListener('keydown', this.onKeyDown)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onKeyDown (e) {
|
||||||
|
if (e.keyCode == 27) {
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid2Click (item, index) {
|
||||||
|
this.currIndex2 = index
|
||||||
|
this.girdName2 = item.girdName
|
||||||
|
this.currIndex3 = -1
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.girdInfoList3 = []
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.$emit('nodeClick', item.id)
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid3Click (item, index) {
|
||||||
|
this.currIndex3 = index
|
||||||
|
this.girdName3 = item.girdName
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum3 = 1
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.$emit('nodeClick', item.id)
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid4Click (item, index) {
|
||||||
|
this.currIndex4 = index
|
||||||
|
this.girdName4 = item.girdName
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum4 = 1
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.$emit('nodeClick', item.id)
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid5Click (item, index) {
|
||||||
|
this.currIndex5 = index
|
||||||
|
this.girdName5 = item.girdName
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
this.girdNum5 = 1
|
||||||
|
this.$emit('nodeClick', item.id)
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appgirdinfo/queryPdDetailByGirdId?id=${id || ''}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
res.data.girdInfoList2 && (this.girdInfoList2 = res.data.girdInfoList2)
|
||||||
|
res.data.girdInfoList3 && (this.girdInfoList3 = res.data.girdInfoList3)
|
||||||
|
res.data.girdInfoList4 && (this.girdInfoList4 = res.data.girdInfoList4)
|
||||||
|
res.data.girdInfoList5 && (this.girdInfoList5 = res.data.girdInfoList5)
|
||||||
|
|
||||||
|
res.data.girdName2 && (this.girdName2 = res.data.girdName2)
|
||||||
|
res.data.girdName3 && (this.girdName3 = res.data.girdName3)
|
||||||
|
res.data.girdName4 && (this.girdName4 = res.data.girdName4)
|
||||||
|
res.data.girdName5 && (this.girdName5 = res.data.girdName5)
|
||||||
|
|
||||||
|
res.data.girdNum3 != null && (this.girdNum3 = res.data.girdNum3)
|
||||||
|
res.data.girdNum4 != null && (this.girdNum4 = res.data.girdNum4)
|
||||||
|
res.data.girdNum5 != null && (this.girdNum5 = res.data.girdNum5)
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
this.currGird = res.data.girdName2
|
||||||
|
this.currIndex2 = res.data.girdInfoList2.findIndex(v => res.data.girdName2 === v.girdName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.pdgrid {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
|
||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .3s ease-in-out;
|
||||||
|
}
|
||||||
|
.fade-enter, .fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-grid__title {
|
||||||
|
position: absolute;
|
||||||
|
top: 40px;
|
||||||
|
left: 50%;
|
||||||
|
width: 271px;
|
||||||
|
height: 53px;
|
||||||
|
line-height: 53px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
width: 182px;
|
||||||
|
margin: 0 auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 21px;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-title {
|
||||||
|
position: absolute;
|
||||||
|
top: 200px;
|
||||||
|
left: 50%;
|
||||||
|
min-width: 640px;
|
||||||
|
height: 80px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 22px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-body {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
justify-content: space-between;
|
||||||
|
bottom: 200px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 112px;
|
||||||
|
|
||||||
|
.pdgrid-body__item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 200px;
|
||||||
|
height: 187px;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 71px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2) {
|
||||||
|
position: relative;
|
||||||
|
top: 67px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 36px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 164px;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
i {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: #FFCB42;
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: #FFCB42;
|
||||||
|
border-right-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-dialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 111;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
& > .mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
flex-direction: column;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
z-index: 2;
|
||||||
|
width: 640px;
|
||||||
|
height: 640px;
|
||||||
|
background: rgba(7,13,41,0.9);
|
||||||
|
border: 1px solid #144662;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
width: 100%;
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-list {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 27px;
|
||||||
|
cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: all ease 0.5s;
|
||||||
|
|
||||||
|
&.grid-active {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
334
packages/bigscreen/dv/components/PlyGird.vue
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
<template>
|
||||||
|
<div class="PlyGird">
|
||||||
|
<div class="pdgrid-title">
|
||||||
|
<h2>{{ currGird }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body">
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid2 = true">
|
||||||
|
<h2>{{ girdNum2 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName2 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid2">
|
||||||
|
<div class="mask" @click="isShowGrid2 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex2 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList2"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid2Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'pdgrid',
|
||||||
|
|
||||||
|
props: ['instance'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
isShowGrid2: false,
|
||||||
|
currIndex2: 0,
|
||||||
|
girdInfoList2: [],
|
||||||
|
girdName2: '',
|
||||||
|
girdNum2: 0,
|
||||||
|
currGird: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
document.addEventListener('keydown', this.onKeyDown)
|
||||||
|
})
|
||||||
|
this.getInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed () {
|
||||||
|
document.removeEventListener('keydown', this.onKeyDown)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onKeyDown (e) {
|
||||||
|
if (e.keyCode == 27) {
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid2Click (item, index) {
|
||||||
|
this.currIndex2 = index
|
||||||
|
this.girdName2 = item.girdName
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.$emit('nodeClick', item.id)
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appgirdinfo/queryPlyDetailByGirdId?id=${id || ''}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
res.data.girdInfoList2 && (this.girdInfoList2 = res.data.girdInfoList2)
|
||||||
|
res.data.girdName2 && (this.girdName2 = res.data.girdName2)
|
||||||
|
res.data.girdNum2 != null && (this.girdNum2 = res.data.girdNum2)
|
||||||
|
res.data.girdName1 && (this.currGird = res.data.girdName1)
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
this.currIndex2 = res.data.girdInfoList2.findIndex(v => res.data.girdName2 === v.girdName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.PlyGird {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
|
||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .3s ease-in-out;
|
||||||
|
}
|
||||||
|
.fade-enter, .fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-grid__title {
|
||||||
|
position: absolute;
|
||||||
|
top: 40px;
|
||||||
|
left: 50%;
|
||||||
|
width: 271px;
|
||||||
|
height: 53px;
|
||||||
|
line-height: 53px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
width: 182px;
|
||||||
|
margin: 0 auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 21px;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-title {
|
||||||
|
position: absolute;
|
||||||
|
top: 200px;
|
||||||
|
left: 50%;
|
||||||
|
min-width: 640px;
|
||||||
|
height: 80px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 22px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-body {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
justify-content: center;
|
||||||
|
bottom: 133px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 112px;
|
||||||
|
|
||||||
|
.pdgrid-body__item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 200px;
|
||||||
|
height: 187px;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 71px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 36px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 164px;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
i {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: #FFCB42;
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: #FFCB42;
|
||||||
|
border-right-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-dialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 111;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
& > .mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
flex-direction: column;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
z-index: 2;
|
||||||
|
width: 640px;
|
||||||
|
height: 640px;
|
||||||
|
background: rgba(7,13,41,0.9);
|
||||||
|
border: 1px solid #144662;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
width: 100%;
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-list {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 27px;
|
||||||
|
cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: all ease 0.5s;
|
||||||
|
|
||||||
|
&.grid-active {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
498
packages/bigscreen/dv/components/XyGrid.vue
Normal file
@@ -0,0 +1,498 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pdgrid">
|
||||||
|
<div class="pdgrid-title">
|
||||||
|
<h2>{{ currGird }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-grid__title" @click="isShowGrid2 = true">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body">
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid3 = true">
|
||||||
|
<h2>{{ girdNum3 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName3 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click.stop="isShowGrid4 = true">
|
||||||
|
<h2>{{ girdNum4 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName4 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid5 = true">
|
||||||
|
<h2>{{ girdNum5 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName5 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid2">
|
||||||
|
<div class="mask" @click="isShowGrid2 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div @click.stop="onGrid2Click(girdId1, girdName2)">{{ girdName2 }}</div>
|
||||||
|
<!-- <div
|
||||||
|
:class="[currIndex2 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList2"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid2Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid3">
|
||||||
|
<div class="mask" @click="isShowGrid3 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName3">{{ girdName3 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex3 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList3"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid3Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid4">
|
||||||
|
<div class="mask" @click="isShowGrid4 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName4">{{ girdName4 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex4 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList4"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid4Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid5">
|
||||||
|
<div class="mask" @click="isShowGrid5 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName5">{{ girdName5 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex5 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList5"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid5Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'XyGrid',
|
||||||
|
|
||||||
|
props: ['instance'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
isShowGrid2: false,
|
||||||
|
isShowGrid3: false,
|
||||||
|
isShowGrid4: false,
|
||||||
|
isShowGrid5: false,
|
||||||
|
currIndex2: 0,
|
||||||
|
girdId1: '',
|
||||||
|
currIndex3: 0,
|
||||||
|
currIndex4: 0,
|
||||||
|
currIndex5: 0,
|
||||||
|
girdInfoList2: [],
|
||||||
|
girdInfoList3: [],
|
||||||
|
girdInfoList4: [],
|
||||||
|
girdInfoList5: [],
|
||||||
|
girdName2: '',
|
||||||
|
girdName3: '',
|
||||||
|
girdName4: '',
|
||||||
|
girdName5: '',
|
||||||
|
girdNum3: 0,
|
||||||
|
girdNum4: 0,
|
||||||
|
girdNum5: 0,
|
||||||
|
currGird: '',
|
||||||
|
girdName1: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
document.addEventListener('keydown', this.onKeyDown)
|
||||||
|
})
|
||||||
|
this.getInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed () {
|
||||||
|
document.removeEventListener('keydown', this.onKeyDown)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onKeyDown (e) {
|
||||||
|
if (e.keyCode == 27) {
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid2Click (id, name) {
|
||||||
|
// this.currIndex2 = index
|
||||||
|
// this.girdName2 = item.girdName
|
||||||
|
this.currIndex3 = -1
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.girdInfoList3 = []
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.$emit('nodeClick', id)
|
||||||
|
|
||||||
|
this.currGird = name
|
||||||
|
this.getInfo(id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid3Click (item, index) {
|
||||||
|
this.currIndex3 = index
|
||||||
|
this.girdName3 = item.girdName
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum3 = 1
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 2
|
||||||
|
})
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid4Click (item, index) {
|
||||||
|
this.currIndex4 = index
|
||||||
|
this.girdName4 = item.girdName
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum4 = 1
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 3
|
||||||
|
})
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid5Click (item, index) {
|
||||||
|
this.currIndex5 = index
|
||||||
|
this.girdName5 = item.girdName
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
this.girdNum5 = 1
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 4
|
||||||
|
})
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/qxn_appgirdinfo/queryGirdInfo?id=${id || ''}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
res.data.girdInfoList2 && (this.girdInfoList3 = res.data.girdInfoList2)
|
||||||
|
res.data.girdInfoList3 && (this.girdInfoList4 = res.data.girdInfoList3)
|
||||||
|
res.data.girdInfoList4 && (this.girdInfoList5 = res.data.girdInfoList4)
|
||||||
|
|
||||||
|
res.data.girdName1 && (this.girdName2 = res.data.girdName1)
|
||||||
|
res.data.girdName2 && (this.girdName3 = res.data.girdName2)
|
||||||
|
res.data.girdName3 && (this.girdName4 = res.data.girdName3)
|
||||||
|
res.data.girdName4 && (this.girdName5 = res.data.girdName4)
|
||||||
|
|
||||||
|
if (this.girdId1) {
|
||||||
|
this.girdName2 = res.data.girdName1
|
||||||
|
this.girdId1 = res.data.girdId1
|
||||||
|
}
|
||||||
|
|
||||||
|
res.data.girdNum2 != null && (this.girdNum3 = res.data.girdNum2)
|
||||||
|
res.data.girdNum3 != null && (this.girdNum4 = res.data.girdNum3)
|
||||||
|
res.data.girdNum4 != null && (this.girdNum5 = res.data.girdNum4)
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
this.currGird = res.data.girdName1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.pdgrid {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
|
||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .3s ease-in-out;
|
||||||
|
}
|
||||||
|
.fade-enter, .fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-grid__title {
|
||||||
|
position: absolute;
|
||||||
|
top: 40px;
|
||||||
|
left: 50%;
|
||||||
|
width: 271px;
|
||||||
|
height: 53px;
|
||||||
|
line-height: 53px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
width: 182px;
|
||||||
|
margin: 0 auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 21px;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-title {
|
||||||
|
position: absolute;
|
||||||
|
top: 200px;
|
||||||
|
left: 50%;
|
||||||
|
min-width: 640px;
|
||||||
|
height: 80px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 22px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-body {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
justify-content: space-between;
|
||||||
|
bottom: 200px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 112px;
|
||||||
|
|
||||||
|
.pdgrid-body__item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 200px;
|
||||||
|
height: 187px;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 71px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2) {
|
||||||
|
position: relative;
|
||||||
|
top: 67px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 36px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 164px;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
i {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: #FFCB42;
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: #FFCB42;
|
||||||
|
border-right-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-dialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 111;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
& > .mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
flex-direction: column;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
z-index: 2;
|
||||||
|
width: 640px;
|
||||||
|
height: 640px;
|
||||||
|
background: rgba(7,13,41,0.9);
|
||||||
|
border: 1px solid #144662;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
width: 100%;
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-list {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 27px;
|
||||||
|
cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: all ease 0.5s;
|
||||||
|
|
||||||
|
&.grid-active {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
498
packages/bigscreen/dv/components/YyxGrid.vue
Normal file
@@ -0,0 +1,498 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pdgrid">
|
||||||
|
<div class="pdgrid-title">
|
||||||
|
<h2>{{ currGird }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-grid__title" @click="isShowGrid2 = true">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body">
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid3 = true">
|
||||||
|
<h2>{{ girdNum3 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName3 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click.stop="isShowGrid4 = true">
|
||||||
|
<h2>{{ girdNum4 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName4 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pdgrid-body__item" @click="isShowGrid5 = true">
|
||||||
|
<h2>{{ girdNum5 || 0 }}</h2>
|
||||||
|
<div class="bottom">
|
||||||
|
<i></i>
|
||||||
|
<p>{{ girdName5 }}</p>
|
||||||
|
<i class="right"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid2">
|
||||||
|
<div class="mask" @click="isShowGrid2 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName2">{{ girdName2 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div @click.stop="onGrid2Click(girdId1, girdName2)">{{ girdName2 }}</div>
|
||||||
|
<!-- <div
|
||||||
|
:class="[currIndex2 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList2"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid2Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid3">
|
||||||
|
<div class="mask" @click="isShowGrid3 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName3">{{ girdName3 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex3 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList3"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid3Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid4">
|
||||||
|
<div class="mask" @click="isShowGrid4 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName4">{{ girdName4 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex4 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList4"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid4Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition name="fade">
|
||||||
|
<div class="grid-dialog" v-show="isShowGrid5">
|
||||||
|
<div class="mask" @click="isShowGrid5 = false"></div>
|
||||||
|
<div class="grid-container">
|
||||||
|
<h2 :title="girdName5">{{ girdName5 }}</h2>
|
||||||
|
<div class="grid-list">
|
||||||
|
<div
|
||||||
|
:class="[currIndex5 === index ? 'grid-active' : '']"
|
||||||
|
v-for="(item, index) in girdInfoList5"
|
||||||
|
:key="index"
|
||||||
|
:title="item.girdName"
|
||||||
|
@click.stop="onGrid5Click(item, index)">
|
||||||
|
{{ item.girdName }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'XyGrid',
|
||||||
|
|
||||||
|
props: ['instance'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
isShowGrid2: false,
|
||||||
|
isShowGrid3: false,
|
||||||
|
isShowGrid4: false,
|
||||||
|
isShowGrid5: false,
|
||||||
|
currIndex2: 0,
|
||||||
|
girdId1: '',
|
||||||
|
currIndex3: 0,
|
||||||
|
currIndex4: 0,
|
||||||
|
currIndex5: 0,
|
||||||
|
girdInfoList2: [],
|
||||||
|
girdInfoList3: [],
|
||||||
|
girdInfoList4: [],
|
||||||
|
girdInfoList5: [],
|
||||||
|
girdName2: '',
|
||||||
|
girdName3: '',
|
||||||
|
girdName4: '',
|
||||||
|
girdName5: '',
|
||||||
|
girdNum3: 0,
|
||||||
|
girdNum4: 0,
|
||||||
|
girdNum5: 0,
|
||||||
|
currGird: '',
|
||||||
|
girdName1: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
document.addEventListener('keydown', this.onKeyDown)
|
||||||
|
})
|
||||||
|
this.getInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed () {
|
||||||
|
document.removeEventListener('keydown', this.onKeyDown)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onKeyDown (e) {
|
||||||
|
if (e.keyCode == 27) {
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid2Click (id, name) {
|
||||||
|
// this.currIndex2 = index
|
||||||
|
// this.girdName2 = item.girdName
|
||||||
|
this.currIndex3 = -1
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.isShowGrid2 = false
|
||||||
|
this.girdInfoList3 = []
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.$emit('nodeClick', id)
|
||||||
|
|
||||||
|
this.currGird = name
|
||||||
|
this.getInfo(id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid3Click (item, index) {
|
||||||
|
this.currIndex3 = index
|
||||||
|
this.girdName3 = item.girdName
|
||||||
|
this.currIndex4 = -1
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum3 = 1
|
||||||
|
this.isShowGrid3 = false
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 2
|
||||||
|
})
|
||||||
|
this.girdInfoList4 = []
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid4Click (item, index) {
|
||||||
|
this.currIndex4 = index
|
||||||
|
this.girdName4 = item.girdName
|
||||||
|
this.currIndex5 = -1
|
||||||
|
this.girdNum4 = 1
|
||||||
|
this.isShowGrid4 = false
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 3
|
||||||
|
})
|
||||||
|
this.girdInfoList5 = []
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
onGrid5Click (item, index) {
|
||||||
|
this.currIndex5 = index
|
||||||
|
this.girdName5 = item.girdName
|
||||||
|
this.isShowGrid5 = false
|
||||||
|
this.girdNum5 = 1
|
||||||
|
this.$emit('nodeClick', {
|
||||||
|
id: item.id,
|
||||||
|
level: 4
|
||||||
|
})
|
||||||
|
|
||||||
|
this.currGird = item.girdName
|
||||||
|
this.getInfo(item.id)
|
||||||
|
},
|
||||||
|
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/yyx_appgirdinfo/queryGirdInfo?id=${id || ''}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
res.data.girdInfoList2 && (this.girdInfoList3 = res.data.girdInfoList2)
|
||||||
|
res.data.girdInfoList3 && (this.girdInfoList4 = res.data.girdInfoList3)
|
||||||
|
res.data.girdInfoList4 && (this.girdInfoList5 = res.data.girdInfoList4)
|
||||||
|
|
||||||
|
res.data.girdName1 && (this.girdName2 = res.data.girdName1)
|
||||||
|
res.data.girdName2 && (this.girdName3 = res.data.girdName2)
|
||||||
|
res.data.girdName3 && (this.girdName4 = res.data.girdName3)
|
||||||
|
res.data.girdName4 && (this.girdName5 = res.data.girdName4)
|
||||||
|
|
||||||
|
if (this.girdId1) {
|
||||||
|
this.girdName2 = res.data.girdName1
|
||||||
|
this.girdId1 = res.data.girdId1
|
||||||
|
}
|
||||||
|
|
||||||
|
res.data.girdNum2 != null && (this.girdNum3 = res.data.girdNum2)
|
||||||
|
res.data.girdNum3 != null && (this.girdNum4 = res.data.girdNum3)
|
||||||
|
res.data.girdNum4 != null && (this.girdNum5 = res.data.girdNum4)
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
this.currGird = res.data.girdName1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.pdgrid {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
|
||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .3s ease-in-out;
|
||||||
|
}
|
||||||
|
.fade-enter, .fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-grid__title {
|
||||||
|
position: absolute;
|
||||||
|
top: 40px;
|
||||||
|
left: 50%;
|
||||||
|
width: 271px;
|
||||||
|
height: 53px;
|
||||||
|
line-height: 53px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
width: 182px;
|
||||||
|
margin: 0 auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 21px;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-title {
|
||||||
|
position: absolute;
|
||||||
|
top: 200px;
|
||||||
|
left: 50%;
|
||||||
|
min-width: 640px;
|
||||||
|
height: 80px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 22px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdgrid-body {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
justify-content: space-between;
|
||||||
|
bottom: 200px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 112px;
|
||||||
|
|
||||||
|
.pdgrid-body__item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 200px;
|
||||||
|
height: 187px;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 71px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
transition: opacity ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2) {
|
||||||
|
position: relative;
|
||||||
|
top: 67px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 36px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 164px;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: #fff;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
i {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: #FFCB42;
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-color: transparent;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
border-left-color: #FFCB42;
|
||||||
|
border-right-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-dialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 111;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
& > .mask {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
flex-direction: column;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
z-index: 2;
|
||||||
|
width: 640px;
|
||||||
|
height: 640px;
|
||||||
|
background: rgba(7,13,41,0.9);
|
||||||
|
border: 1px solid #144662;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
& > h2 {
|
||||||
|
width: 100%;
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-shadow: 0px 0px 13px rgb(59 182 255 / 80%);
|
||||||
|
background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-list {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
height: 67px;
|
||||||
|
line-height: 67px;
|
||||||
|
padding: 0 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 27px;
|
||||||
|
cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: all ease 0.5s;
|
||||||
|
|
||||||
|
&.grid-active {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%);
|
||||||
|
box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1);
|
||||||
|
text-shadow: 0px 3px 5px rgba(0,0,0,0.5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
187
packages/bigscreen/dv/components/chartOps.js
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
export const pieChart2 = {
|
||||||
|
legend: {
|
||||||
|
bottom: 0,
|
||||||
|
itemGap: 14,
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 5,
|
||||||
|
textStyle: {color: "#fff", fontSize: 14}
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
height: 260
|
||||||
|
},
|
||||||
|
xAxis: {show: false},
|
||||||
|
yAxis: {show: false},
|
||||||
|
tooltip: {
|
||||||
|
backgroundColor: "rgba(14, 51, 111, 0.9)",
|
||||||
|
borderColor: "#1A6ABC",
|
||||||
|
textStyle: {color: "#fff"}
|
||||||
|
},
|
||||||
|
series: {
|
||||||
|
type: "pie",
|
||||||
|
minShowLabelAngle: 10,
|
||||||
|
radius: [70, 81],
|
||||||
|
itemStyle: {
|
||||||
|
borderColor: "#fff",
|
||||||
|
borderWidth: 2
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
color: "#A8D7F3",
|
||||||
|
fontSize: 14,
|
||||||
|
formatter: "{name|{b}}\n{v|{d}%}",
|
||||||
|
minMargin: 5,
|
||||||
|
edgeDistance: 10,
|
||||||
|
lineHeight: 22,
|
||||||
|
rich: {
|
||||||
|
v: {
|
||||||
|
color: "#fff"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
labelLine: {},
|
||||||
|
labelLayout: function (params) {
|
||||||
|
let points = params.labelLinePoints,
|
||||||
|
isLeft = points[2][0] < points[1][0]
|
||||||
|
points[2][0] =
|
||||||
|
points[2][0] + (params.labelRect.width + 4) * (isLeft ? -1 : 1)
|
||||||
|
return {
|
||||||
|
labelLinePoints: points
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render: (h, params) => {
|
||||||
|
const formatNum = num => {
|
||||||
|
if (num >= 10000000) {
|
||||||
|
return num / 10000000 + "千万"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num >= 10000) {
|
||||||
|
return num / 10000 + "万"
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseFloat(num.toFixed(2))
|
||||||
|
}
|
||||||
|
|
||||||
|
let total = params.data.reduce((t, e) => {
|
||||||
|
return t + Number(Object.values(e)?.[1] || 0)
|
||||||
|
}, 0)
|
||||||
|
return h(
|
||||||
|
"div",
|
||||||
|
{
|
||||||
|
style: {
|
||||||
|
height: "162px",
|
||||||
|
width: "162px",
|
||||||
|
color: "#8BCCFF",
|
||||||
|
left: "50%",
|
||||||
|
top: "50%",
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
flexDirection: "column",
|
||||||
|
position: "absolute",
|
||||||
|
transform: "translate(-50%,-50%)",
|
||||||
|
backgroundImage: `url('https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie2Circle.png')`,
|
||||||
|
backgroundPosition: "center"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
h(
|
||||||
|
"span",
|
||||||
|
{style: {fontSize: "28px", color: "#fff", fontFamily: "DIN"}},
|
||||||
|
formatNum(total)
|
||||||
|
),
|
||||||
|
h("span", null, "总量")
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const barChart1 = {
|
||||||
|
legend: {
|
||||||
|
right: 0,
|
||||||
|
itemHeight: 5,
|
||||||
|
itemWidth: 16,
|
||||||
|
textStyle: { color: '#fff' }
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
nameGap: 23,
|
||||||
|
minInterval: 1,
|
||||||
|
splitLine: { lineStyle: { color: 'rgba(255,255,255,.2)', type: 'dashed' } },
|
||||||
|
axisLabel: { color: '#fff' },
|
||||||
|
axisPointer: { show: false }
|
||||||
|
},
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
triggerTooltip: false,
|
||||||
|
shadowStyle: { color: 'rgba(46, 153, 255, .2)' }
|
||||||
|
},
|
||||||
|
color: [
|
||||||
|
{
|
||||||
|
type: 'linear',
|
||||||
|
x: 0,
|
||||||
|
x2: 0,
|
||||||
|
y: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: 'rgba(66, 187, 255, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(37, 143, 255, 0.2)' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'linear',
|
||||||
|
x: 0,
|
||||||
|
x2: 0,
|
||||||
|
y: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: 'rgba(66, 255, 254, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(37, 255, 246, 0.2)' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'linear',
|
||||||
|
x: 0,
|
||||||
|
x2: 0,
|
||||||
|
y: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: 'rgba(97, 253, 185, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(97, 253, 185, 0.2)' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'linear',
|
||||||
|
x: 0,
|
||||||
|
x2: 0,
|
||||||
|
y: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: 'rgba(253, 108, 57, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(253, 108, 57, 0.2)' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'linear',
|
||||||
|
x: 0,
|
||||||
|
x2: 0,
|
||||||
|
y: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: 'rgba(248, 187, 25, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(55, 39, 5, 1)' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
daemon: {
|
||||||
|
type: 'bar',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'top',
|
||||||
|
color: '#fff',
|
||||||
|
formatter: e => {
|
||||||
|
return e.data[e.seriesName] || ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
barWidth: 16,
|
||||||
|
barCategoryGap: 40,
|
||||||
|
itemStyle: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/bigscreen/dv/components/geoJSon/qxnGeoJSON.json
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<template>
|
||||||
|
<div class="doc-circulation ailist-wrapper">
|
||||||
|
<keep-alive :include="['List']">
|
||||||
|
<component ref="component" :is="component" @change="onChange" :params="params" :instance="instance" :dict="dict"></component>
|
||||||
|
</keep-alive>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './components/List'
|
||||||
|
import Add from './components/Add'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppConvenienceAddressBook',
|
||||||
|
label: '便民通讯录',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
component: 'List',
|
||||||
|
params: {},
|
||||||
|
include: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
components: {
|
||||||
|
Add,
|
||||||
|
List
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange (data) {
|
||||||
|
if (data.type === 'Add') {
|
||||||
|
this.component = 'Add'
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'list') {
|
||||||
|
this.component = 'List'
|
||||||
|
this.params = data.params
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (data.isRefresh) {
|
||||||
|
this.$refs.component.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.doc-circulation {
|
||||||
|
height: 100%;
|
||||||
|
background: #F3F6F9;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
132
packages/conv/AppConvenienceAddressBook/components/Add.vue
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail>
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title :title="params.id ? '编辑通讯录' : '添加通讯录'" isShowBack isShowBottomBorder @onBackClick="cancel(false)">
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-card title="基本信息">
|
||||||
|
<template #content>
|
||||||
|
<el-form ref="CBookForm" class="ai-form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<el-form-item label="地区" style="width: 100%;" prop="codeName">
|
||||||
|
<span style="color: #666;">{{ form.areaName }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 100%" label="名称" prop="name" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]">
|
||||||
|
<el-input size="small" placeholder="请输入名称" show-word-limit v-model="form.name" :maxlength="30"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 100%" label="类型" prop="type" :rules="[{ required: true, message: '请输入类型', trigger: 'change' }]">
|
||||||
|
<el-input size="small" placeholder="请输入类型" v-model="form.type"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 100%" label="电话" prop="phone" :rules="[{required: true, validator: regPhone, trigger: 'blur' }]">
|
||||||
|
<el-input size="small" placeholder="请输入电话" show-word-limit maxlength="11" v-model="form.phone"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 100%;" label="是否公开" prop="isPublic" :rules="[{ required: true, message: '请选择是否公开', trigger: 'change' }]">
|
||||||
|
<el-radio-group v-model="form.isPublic">
|
||||||
|
<el-radio label="1">是</el-radio>
|
||||||
|
<el-radio label="0">否</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="cancel">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirm">提交</el-button>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'Add',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
params: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
var regPhone = (rule, value, callback) => {
|
||||||
|
if (!value) {
|
||||||
|
return callback(new Error('请输入电话'))
|
||||||
|
} else {
|
||||||
|
const reg = /^[0-9]{3,11}$/
|
||||||
|
if (reg.test(value)) {
|
||||||
|
callback()
|
||||||
|
} else {
|
||||||
|
return callback(new Error('请输入正确的电话号码'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
info: {},
|
||||||
|
form: {
|
||||||
|
areaId: '',
|
||||||
|
name: '',
|
||||||
|
areaName: '',
|
||||||
|
phone: '',
|
||||||
|
isPublic: '1',
|
||||||
|
type: '',
|
||||||
|
},
|
||||||
|
id: '',
|
||||||
|
regPhone,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
if (this.params && this.params.areaId && !this.params.id) {
|
||||||
|
this.form.areaId = this.params.areaId
|
||||||
|
this.form.areaName = this.params.areaName
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.params && this.params.id) {
|
||||||
|
this.id = this.params.id
|
||||||
|
this.getInfo(this.params.id)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appconvenientaddressbook/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.form = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose () {
|
||||||
|
this.form.explain = ''
|
||||||
|
},
|
||||||
|
|
||||||
|
confirm () {
|
||||||
|
this.$refs.CBookForm.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.instance.post(`/app/appconvenientaddressbook/addOrUpdate`, {
|
||||||
|
...this.form,
|
||||||
|
id: this.params.id || ''
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('提交成功')
|
||||||
|
setTimeout(() => {
|
||||||
|
this.cancel(true)
|
||||||
|
}, 600)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel (isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
</style>
|
||||||
438
packages/conv/AppConvenienceAddressBook/components/List.vue
Normal file
@@ -0,0 +1,438 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="villagecode">
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="便民通讯录" isShowBottomBorder></ai-title>
|
||||||
|
</template>
|
||||||
|
<template #left>
|
||||||
|
<div class="villagecode-left">
|
||||||
|
<div class="villagecode-left__title">
|
||||||
|
<h2>地区</h2>
|
||||||
|
</div>
|
||||||
|
<div class="addressBook-left__list">
|
||||||
|
<div class="addressBook-left__list--title">
|
||||||
|
<el-input
|
||||||
|
class="addressBook-left__list--search"
|
||||||
|
size="mini"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入地区名称"
|
||||||
|
v-model="unitName"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</div>
|
||||||
|
<el-tree
|
||||||
|
:filter-node-method="filterNode"
|
||||||
|
ref="tree"
|
||||||
|
:props="defaultProps"
|
||||||
|
node-key="id"
|
||||||
|
:data="areaTree"
|
||||||
|
highlight-current
|
||||||
|
:current-node-key="search.areaId"
|
||||||
|
:default-expanded-keys="defaultExpanded"
|
||||||
|
:default-checked-keys="defaultChecked"
|
||||||
|
@current-change="onTreeChange">
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar class="search-bar">
|
||||||
|
<template #left>
|
||||||
|
<el-button size="small" type="primary" :disabled="isShowAdd" icon="iconfont iconAdd" @click="toAdd('')">添加
|
||||||
|
</el-button>
|
||||||
|
<ai-import :instance="instance" :dict="dict" type="appconvenientaddressbook" name="便民通讯录"
|
||||||
|
@success="getList()">
|
||||||
|
<el-button icon="iconfont iconImport">导入</el-button>
|
||||||
|
</ai-import>
|
||||||
|
<ai-download :instance="instance" url="/app/appconvenientaddressbook/export" :params="search" fileName="便民通讯录"
|
||||||
|
:disabled="tableData.length == 0">
|
||||||
|
<el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button>
|
||||||
|
</ai-download>
|
||||||
|
</template>
|
||||||
|
<template slot="right">
|
||||||
|
<el-input
|
||||||
|
v-model="search.name"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入名称/电话/类型"
|
||||||
|
clearable
|
||||||
|
@clear="search.current = 1, search.name = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="isPublic" label="是否公开" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<el-switch
|
||||||
|
v-model="row.isPublic"
|
||||||
|
active-value="1"
|
||||||
|
@change="e => onChange(row.id, e)"
|
||||||
|
inactive-value="0">
|
||||||
|
</el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" width="120px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toAdd(row.id)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
name: '',
|
||||||
|
areaId: ''
|
||||||
|
},
|
||||||
|
defaultExpanded: [],
|
||||||
|
defaultChecked: [],
|
||||||
|
areaTree: [],
|
||||||
|
defaultProps: {
|
||||||
|
children: 'children',
|
||||||
|
label: 'name'
|
||||||
|
},
|
||||||
|
currIndex: -1,
|
||||||
|
total: 10,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'name', label: '名称', align: 'left'},
|
||||||
|
{prop: 'type', label: '类型', align: 'center'},
|
||||||
|
{prop: 'phone', label: '电话', align: 'center'},
|
||||||
|
{prop: 'createTime', align: 'center', label: '创建时间'},
|
||||||
|
{slot: 'isPublic', label: '是否公开', align: 'center'}
|
||||||
|
],
|
||||||
|
areaName: '',
|
||||||
|
unitName: '',
|
||||||
|
tableData: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
isShowAdd() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
unitName(val) {
|
||||||
|
this.$refs.tree.filter(val)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.search.areaId = this.user.info.areaId
|
||||||
|
this.areaName = this.user.info.areaName
|
||||||
|
this.getTree()
|
||||||
|
this.getList()
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/appconvenientaddressbook/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onChange(id) {
|
||||||
|
this.instance.post(`/app/appconvenientaddressbook/enable?id=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('修改成功')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNode(value, data) {
|
||||||
|
if (!value) return true
|
||||||
|
return data.name.indexOf(value) !== -1
|
||||||
|
},
|
||||||
|
|
||||||
|
onTreeChange(e) {
|
||||||
|
this.search.areaId = e.id
|
||||||
|
this.areaName = e.name
|
||||||
|
this.search.current = 1
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getTree() {
|
||||||
|
this.instance.post(`/admin/area/queryAllArea?id=${this.user.info.areaId}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
let parent = res.data.map(v => {
|
||||||
|
v.label = v.name
|
||||||
|
v.children = []
|
||||||
|
|
||||||
|
return v
|
||||||
|
}).filter(e => !e.parentid)[0]
|
||||||
|
this.defaultExpanded = [parent.id]
|
||||||
|
this.defaultChecked = [parent.id]
|
||||||
|
this.search.areaId = parent.id
|
||||||
|
this.addChild(parent, res.data)
|
||||||
|
this.areaTree = [parent]
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.tree.setCurrentKey(parent.id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
addChild(parent, list) {
|
||||||
|
for (let i = 0; i < list.length; i++) {
|
||||||
|
if (list[i].parentId === parent.id) {
|
||||||
|
parent.children.push(list[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list.length > 0) {
|
||||||
|
parent['children'].map(v => this.addChild(v, list))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appconvenientaddressbook/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toAdd(id) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Add',
|
||||||
|
params: {
|
||||||
|
areaName: this.areaName,
|
||||||
|
id: id || '',
|
||||||
|
areaId: this.search.areaId
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.villagecode {
|
||||||
|
.table-tags {
|
||||||
|
.el-tag {
|
||||||
|
margin-right: 8px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.addressBook-left__list {
|
||||||
|
height: calc(100% - 40px);
|
||||||
|
padding: 8px 8px;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
.addressBook-left__tags--item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0 8px 0 16px;
|
||||||
|
color: #222222;
|
||||||
|
|
||||||
|
&.addressBook-left__tags--item-active, &:hover {
|
||||||
|
background: #E8EFFF;
|
||||||
|
color: #2266FF;
|
||||||
|
|
||||||
|
i, span {
|
||||||
|
color: #2266FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #8e9ebf;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.addressBook-left__list--title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
|
||||||
|
.addressBook-left__list--search {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
:deep( input ){
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-button {
|
||||||
|
width: 84px;
|
||||||
|
flex-shrink: 1;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #222222;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-tree ){
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
.el-tree-node__expand-icon.is-leaf {
|
||||||
|
color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content > .el-tree-node__expand-icon {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree__empty-text {
|
||||||
|
color: #222;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__children .el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content:hover {
|
||||||
|
background: #E8EFFF;
|
||||||
|
color: #222222;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-current > .el-tree-node__content {
|
||||||
|
&:hover {
|
||||||
|
background: #2266FF;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ai-list__content--left ){
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.villagecode-left {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
background: #FAFAFB;
|
||||||
|
|
||||||
|
.villagecode-left__title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0 16px;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #222;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.villagecode-left__list {
|
||||||
|
height: calc(100% - 40px);
|
||||||
|
padding: 8px 0;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
padding: 0 24px;
|
||||||
|
color: #222222;
|
||||||
|
font-size: 14px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-right: 2px solid transparent;
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #2266FF;
|
||||||
|
background: #E8EFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.left-active {
|
||||||
|
color: #2266FF;
|
||||||
|
border-color: #2266FF;
|
||||||
|
background: #E8EFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ai-list__content--right ){
|
||||||
|
|
||||||
|
.ai-list__content--right-wrapper {
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-info__img {
|
||||||
|
font-size: 0;
|
||||||
|
width: 144px;
|
||||||
|
height: 144px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
87
packages/conv/AppDeviceConfig/AppDeviceConfig.vue
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="AppDeviceConfig">
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="设备配置" :isShowBottomBorder="false" :fullname.sync="areaName" v-model="areaId" :instance="instance" @change="onAreaChange"></ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="tabs">
|
||||||
|
<el-tabs v-model="currIndex">
|
||||||
|
<el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label">
|
||||||
|
<component :areaId="areaId" :ref="String(i)" v-if="currIndex == i" :is="tab.comp" @change="onChange" lazy :instance="instance" :dict="dict" :permissions="permissions"/>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import eyeList from './components/eyeList.vue'
|
||||||
|
import videoList from './components/videoList.vue'
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppDeviceConfig',
|
||||||
|
label: '设备配置',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
eyeList,
|
||||||
|
videoList,
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
tabs () {
|
||||||
|
const tabList = [
|
||||||
|
{label: '千里眼', name: 'eyeList', comp: eyeList, permission: ''},
|
||||||
|
{label: '视联网', name: 'videoList', comp: videoList, permission: ''}
|
||||||
|
]
|
||||||
|
|
||||||
|
return tabList
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
currIndex: '0',
|
||||||
|
component: 'eyeList',
|
||||||
|
params: {},
|
||||||
|
areaId: '',
|
||||||
|
areaName: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.areaId = this.user.info.areaId
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange (data) {
|
||||||
|
this.component = data.type
|
||||||
|
this.params = data.params
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (data.isRefresh) {
|
||||||
|
this.$refs.component.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
onAreaChange () {
|
||||||
|
this.$refs[this.currIndex][0].changeArea()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppDeviceConfig {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
237
packages/conv/AppDeviceConfig/components/eyeList.vue
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="eyeList" isTabs>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar bottomBorder>
|
||||||
|
<template #left>
|
||||||
|
<el-button type="primary" icon="iconfont iconAdd" size="small" @click="add('添加设备配置', {})">添加</el-button>
|
||||||
|
<el-button icon="el-icon-delete" class="delete-btn del-btn-list" :disabled="!ids.length" @click="remove(ids)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
<template slot="right">
|
||||||
|
<el-input
|
||||||
|
v-model="search.condition"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入CorpId"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.condition = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
v-loading="loading"
|
||||||
|
style="margin-top: 16px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList"
|
||||||
|
@selection-change="v=>ids=v.map(e=>e.id)">
|
||||||
|
<el-table-column slot="options" width="140px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="add('编辑设备配置', row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="refresh(row)">刷新</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="flag" align="center" label="状态" width="100">
|
||||||
|
<template v-slot="{ row }">
|
||||||
|
<el-switch v-model="row.flag" @change="onChange(row)" active-value="1" inactive-value="0"
|
||||||
|
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog :title="dialogTitle" :visible.sync="dialog" width="800px" @onConfirm="addForm" @closed="dialogForm={}">
|
||||||
|
<el-form ref="addForm" :model="dialogForm" :rules="rules" size="small" label-width="160px">
|
||||||
|
<el-form-item label="CorpId" prop="corpId">
|
||||||
|
<el-input v-model.trim="dialogForm.corpId" placeholder="请输入..." clearable :maxLength="50"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item required label="状态">
|
||||||
|
<el-radio-group v-model="dialogForm.flag">
|
||||||
|
<el-radio :label="0">关闭</el-radio>
|
||||||
|
<el-radio :label="1">开启</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="AppId">
|
||||||
|
<el-input v-model.trim="dialogForm.appId" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="RSA">
|
||||||
|
<el-input v-model.trim="dialogForm.rsa" placeholder="请输入..." clearable :maxLength="5000" type="textarea" :rows="5"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="SECRET">
|
||||||
|
<el-input v-model.trim="dialogForm.secret" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="TOKEN">
|
||||||
|
<el-input v-model.trim="dialogForm.token" placeholder="请输入..." clearable :maxLength="200" type="textarea" :rows="2"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结点ids">
|
||||||
|
<el-input v-model.trim="dialogForm.orgIds" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="版本号">
|
||||||
|
<el-input v-model.trim="dialogForm.version" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭账号">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbName" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭密码">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbPwd" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭Token">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbToken" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'eyeList',
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
areaId: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
condition: '',
|
||||||
|
size: 10,
|
||||||
|
},
|
||||||
|
ids: [],
|
||||||
|
tableData: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
dialog: false,
|
||||||
|
dialogTitle: '',
|
||||||
|
dialogForm: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
param () {
|
||||||
|
return this.search
|
||||||
|
},
|
||||||
|
rules() {
|
||||||
|
return {
|
||||||
|
corpId: [{required: true, message: "请输入CorpId"}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{type: "selection"},
|
||||||
|
{ prop: 'corpId', label: 'CorpId', fixed: 'left', width: 220 },
|
||||||
|
{ slot: 'flag', align: 'center', label: '状态', fixed: 'left', width: 120 },
|
||||||
|
{ prop: 'appId', align: 'center', label: 'AppId', width: 240 },
|
||||||
|
{ prop: 'rsa', align: 'center', label: 'RSA', width: 240 },
|
||||||
|
{ prop: 'secret', align: 'center', label: 'SECRET', width: 180 },
|
||||||
|
{ prop: 'token', align: 'center', label: 'TOKEN', width: 120 },
|
||||||
|
{ prop: 'orgIds', align: 'center', label: '结点ids', width: 120 },
|
||||||
|
{ prop: 'version', align: 'center', label: '版本号', width: 120 },
|
||||||
|
{ prop: 'dlbName', align: 'center', label: '大喇叭账号', width: 140 },
|
||||||
|
{ prop: 'dlbPwd', align: 'center', label: '大喇叭密码', width: 140 },
|
||||||
|
{ prop: 'dlbToken', align: 'center', label: '大喇叭Token', width: 180 },
|
||||||
|
{ prop: 'createTime', align: 'center', label: '创建时间', fixed: 'right', width: 180 },
|
||||||
|
{ slot: 'options'},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getListInit() {
|
||||||
|
this.search.current = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search,
|
||||||
|
type: 0
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
this.loading = false
|
||||||
|
} else {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
add(title, item) {
|
||||||
|
this.dialog = true
|
||||||
|
this.dialogTitle = title
|
||||||
|
this.dialogForm = item
|
||||||
|
if(title == '添加设备配置') {
|
||||||
|
this.dialogForm.flag = 1
|
||||||
|
this.dialogForm.version = '1.0.0'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addForm() {
|
||||||
|
this.$refs.addForm.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.dialogForm.type = 0
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/addOrUpdate`, this.dialogForm).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(`${this.dialogForm.id ? '编辑成功' : '添加成功'}`)
|
||||||
|
this.getListInit()
|
||||||
|
this.dialog = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
refresh(row) {
|
||||||
|
this.$confirm('确定刷新该数据token?').then(() => {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/initQlyToken?id=${row.id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('刷新成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onChange(row) {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/setFlag`, null, {
|
||||||
|
params: {
|
||||||
|
id: row.id,
|
||||||
|
flag: row.flag
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(+row.flag ? '已启用' : '已禁用');
|
||||||
|
this.getList();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
224
packages/conv/AppDeviceConfig/components/videoList.vue
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="videoList" isTabs>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar bottomBorder>
|
||||||
|
<template #left>
|
||||||
|
<el-button type="primary" icon="iconfont iconAdd" size="small" @click="add('添加设备配置', {})">添加</el-button>
|
||||||
|
<el-button icon="el-icon-delete" class="delete-btn del-btn-list" :disabled="!Boolean(ids.length)" @click="remove(ids)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input
|
||||||
|
v-model="search.condition"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入CorpId"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.condition = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
v-loading="loading"
|
||||||
|
style="margin-top: 16px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList"
|
||||||
|
@selection-change="v=>ids=v.map(e=>e.id)">
|
||||||
|
<el-table-column slot="options" width="140px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="add('编辑设备配置', row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="refresh(row)">刷新</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="flag" align="center" label="状态" width="100">
|
||||||
|
<template v-slot="{ row }">
|
||||||
|
<el-switch v-model="row.flag" @change="onChange(row)" active-value="1" inactive-value="0"
|
||||||
|
active-color="#5088FF" inactive-color="#D0D4DC"></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog :title="dialogTitle" :visible.sync="dialog" width="800px" @onConfirm="addForm" @closed="dialogForm={}">
|
||||||
|
<el-form ref="addForm" :model="dialogForm" :rules="rules" size="small" label-width="160px">
|
||||||
|
<el-form-item label="CorpId" prop="corpId">
|
||||||
|
<el-input v-model.trim="dialogForm.corpId" placeholder="请输入..." clearable :maxLength="50"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item required label="状态">
|
||||||
|
<el-radio-group v-model="dialogForm.flag">
|
||||||
|
<el-radio :label="0">关闭</el-radio>
|
||||||
|
<el-radio :label="1">开启</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="用户ID">
|
||||||
|
<el-input v-model.trim="dialogForm.slwUserId" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="地区编码">
|
||||||
|
<el-input v-model.trim="dialogForm.slwAreaId" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="TOKEN">
|
||||||
|
<el-input v-model.trim="dialogForm.slwToken" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭账号">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbName" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭密码">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbPwd" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="大喇叭Token">
|
||||||
|
<el-input v-model.trim="dialogForm.dlbToken" placeholder="请输入..." clearable :maxLength="50" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'eyeList',
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
areaId: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
condition: '',
|
||||||
|
size: 10,
|
||||||
|
},
|
||||||
|
ids: [],
|
||||||
|
tableData: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
dialog: false,
|
||||||
|
dialogTitle: '',
|
||||||
|
dialogForm: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
param () {
|
||||||
|
return this.search
|
||||||
|
},
|
||||||
|
rules() {
|
||||||
|
return {
|
||||||
|
corpId: [{required: true, message: "请输入CorpId"}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{type: "selection"},
|
||||||
|
{ prop: 'corpId', label: 'CorpId', fixed: 'left', width: 220 },
|
||||||
|
{ slot: 'flag', align: 'center', label: '状态', fixed: 'left', width: 120 },
|
||||||
|
{ prop: 'slwUserId', align: 'center', label: '用户ID', width: 180 },
|
||||||
|
{ prop: 'slwAreaId', align: 'center', label: '地区编码', width: 180 },
|
||||||
|
{ prop: 'slwToken', align: 'center', label: 'TOKEN', width: 220 },
|
||||||
|
{ prop: 'dlbName', align: 'center', label: '大喇叭账号', width: 140 },
|
||||||
|
{ prop: 'dlbPwd', align: 'center', label: '大喇叭密码', width: 140 },
|
||||||
|
{ prop: 'dlbToken', align: 'center', label: '大喇叭Token', width: 180 },
|
||||||
|
{ prop: 'createTime', align: 'center', label: '创建时间', width: 180 },
|
||||||
|
{ slot: 'options'},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getListInit() {
|
||||||
|
this.search.current = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search,
|
||||||
|
type: 1
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
this.loading = false
|
||||||
|
} else {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
add(title, item) {
|
||||||
|
this.dialog = true
|
||||||
|
this.dialogTitle = title
|
||||||
|
this.dialogForm = item
|
||||||
|
if(title == '添加设备配置') {
|
||||||
|
this.dialogForm.flag = 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addForm() {
|
||||||
|
this.$refs.addForm.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.dialogForm.type = 1
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/addOrUpdate`, this.dialogForm).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(`${this.dialogForm.id ? '编辑成功' : '添加成功'}`)
|
||||||
|
this.getListInit()
|
||||||
|
this.dialog = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
refresh(row) {
|
||||||
|
this.$confirm('确定刷新该数据token?').then(() => {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/initSlwToken?id=${row.id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('刷新成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onChange(row) {
|
||||||
|
this.instance.post(`/app/appzyaccountconfig/setFlag`, null, {
|
||||||
|
params: {
|
||||||
|
id: row.id,
|
||||||
|
flag: row.flag
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(+row.flag ? '已启用' : '已禁用');
|
||||||
|
this.getList();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
55
packages/conv/AppEventReporting/AppEventReporting.vue
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppEventReporting">
|
||||||
|
<component ref="component" :is="currentPage" @change="onChange" :params="params" :instance="instance" :dict="dict" :menuName="menuName" />
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './components/List'
|
||||||
|
import Detail from './components/Detail'
|
||||||
|
import Setting from './components/Setting'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppEventReporting',
|
||||||
|
label: '巡查上报',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
menuName: {default: '巡查上报'}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
component: 'List',
|
||||||
|
params: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
currentPage() {
|
||||||
|
let {hash, query: {id}} = this.$route
|
||||||
|
return hash == "#Setting" ? Setting :
|
||||||
|
!!id ? Detail : List
|
||||||
|
}
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
List,
|
||||||
|
Detail,
|
||||||
|
Setting
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange(data) {
|
||||||
|
this.$router.push({query: data.params, hash: data.type == "Setting" ? "#Setting" : ""})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.AppEventReporting {
|
||||||
|
height: 100%;
|
||||||
|
background: #F3F6F9;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
592
packages/conv/AppEventReporting/components/Detail.vue
Normal file
@@ -0,0 +1,592 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail class="reportAtWillDetail" v-loading="isLoading">
|
||||||
|
<template #title>
|
||||||
|
<ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)">
|
||||||
|
<template #rightBtn>
|
||||||
|
<div class="title-btns">
|
||||||
|
<el-button type="primary" icon="iconfont iconPerson_Transfered" @click="isShowForward = true" v-if="detail.powerTransmit">指派事件</el-button>
|
||||||
|
<el-button type="primary" icon="iconfont iconRegister" @click="isShowAdd = true" v-if="detail.powerHandle">处理事件</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<div class="detail-content__wrapper">
|
||||||
|
<div class="detail-content__wrapper--left">
|
||||||
|
<ai-card title="基础信息">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper>
|
||||||
|
<ai-info-item label="上报人员" :value="detail.name"></ai-info-item>
|
||||||
|
<ai-info-item label="当前状态" :value="dict.getLabel('clapEventStatus', detail.eventStatus)"></ai-info-item>
|
||||||
|
<ai-info-item label="联系方式">{{ detail.phone }}</ai-info-item>
|
||||||
|
<ai-info-item label="上报时间">{{ detail.createTime }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件来源">{{ dict.getLabel('residentEventSource', detail.eventSource) }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件类型">{{ detail.groupName }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件描述" isLine>{{ detail.content }}</ai-info-item>
|
||||||
|
<ai-info-item label="现场照片" isLine>
|
||||||
|
<ai-uploader :instance="instance" disabled v-model="detail.files"></ai-uploader>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="所属网格">{{ detail.girdName }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件位置" isLine>
|
||||||
|
<div id="map" style="width: 500px; height: 280px;"></div>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-evaluation v-if="!!detail.id" :bid="detail.id" :info.sync="evaluation"/>
|
||||||
|
</div>
|
||||||
|
<div class="rightZone">
|
||||||
|
<ai-card title="办理进度">
|
||||||
|
<template #content>
|
||||||
|
<el-steps direction="vertical" :active="1">
|
||||||
|
<el-step
|
||||||
|
v-for="(item, i) in process"
|
||||||
|
:key="i"
|
||||||
|
:title="item.systemExplain"
|
||||||
|
:description="item.doTime">
|
||||||
|
<template #title>
|
||||||
|
<h2 class="step-title" style="font-weight: 500; font-size: 14px;">
|
||||||
|
{{ item.systemExplain }}
|
||||||
|
</h2>
|
||||||
|
</template>
|
||||||
|
<template #description>
|
||||||
|
<p style="color: #888; margin: 0 4px 10px 0; font-size: 14px;">{{ item.doTime }}</p>
|
||||||
|
<div style="color: #444;margin-bottom: 10px;" v-if="item.doExplain">{{ item.doExplain }}</div>
|
||||||
|
<ai-uploader :instance="instance" disabled v-model="item.files"></ai-uploader>
|
||||||
|
</template>
|
||||||
|
</el-step>
|
||||||
|
</el-steps>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="800px"
|
||||||
|
title="事件处理"
|
||||||
|
@closed="onClose"
|
||||||
|
@onConfirm="handleEvent">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="form" ref="form">
|
||||||
|
<el-form-item label="事件分类" prop="groupId" style="width: 100%;" :rules="[{ required: true, message: '请选择事件分类' }]">
|
||||||
|
<ai-select
|
||||||
|
v-model="form.groupId"
|
||||||
|
placeholder="请选择事件分类"
|
||||||
|
:selectList="dictList">
|
||||||
|
</ai-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理结果" prop="eventStatus" style="width: 100%;" :rules="[{ required: true, message: '请选择处理结果' }]">
|
||||||
|
<el-radio-group v-model="form.eventStatus">
|
||||||
|
<el-radio label="1">已办结</el-radio>
|
||||||
|
<el-radio label="0">已拒绝</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入处理意见' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入处理意见" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="图片" prop="files" style="width: 100%;">
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
isShowTip
|
||||||
|
v-model="form.files"
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowForward"
|
||||||
|
width="800px"
|
||||||
|
@close="onClose"
|
||||||
|
title="事件指派"
|
||||||
|
@onConfirm="onForwardConfirm">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="forwardForm" ref="forwardForm">
|
||||||
|
<el-form-item label="转交" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请选择网格员或网格' }]">
|
||||||
|
<el-input disabled size="small" v-model="forwardForm.name" clearable placeholder="请选择网格员或网格">
|
||||||
|
<template slot="append">
|
||||||
|
<el-button @click="getGirdList().then(()=>isShowUser=true )">选择</el-button>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="办理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入办理意见' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="forwardForm.content" clearable placeholder="请输入办理意见" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="图片" prop="files" style="width: 100%;">
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
v-model="forwardForm.files"
|
||||||
|
isShowTip
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowUser"
|
||||||
|
width="800px"
|
||||||
|
title="选择网格员"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<div class="grid-wrapper">
|
||||||
|
<el-input
|
||||||
|
style="margin-bottom: 10px;"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入网格名称/网格员姓名/网格员电话"
|
||||||
|
v-model="name" @change="$refs.tree.filter(name)"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
<el-tree
|
||||||
|
:filter-node-method="filterNode"
|
||||||
|
ref="tree"
|
||||||
|
:props="defaultProps"
|
||||||
|
node-key="id"
|
||||||
|
:data="tree"
|
||||||
|
highlight-current
|
||||||
|
@current-change="onTreeChange">
|
||||||
|
<div class="tree-container" slot-scope="{ data }">
|
||||||
|
<div class="tree-container__user">
|
||||||
|
<div class="tree-user__item">
|
||||||
|
<span v-if="!data.isUser">{{ data.girdName }}</span>
|
||||||
|
<span v-else>{{data.name}}<span v-if="data.phone">-{{data.phone}}</span></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'Detail',
|
||||||
|
props: ['dict', 'instance'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
forwardForm: {
|
||||||
|
content: '',
|
||||||
|
girdId: '',
|
||||||
|
girdName: '',
|
||||||
|
girdMemberId: '',
|
||||||
|
girdMemberName: '',
|
||||||
|
name: ''
|
||||||
|
},
|
||||||
|
isLoading: true,
|
||||||
|
name: '',
|
||||||
|
detail: {},
|
||||||
|
isShowUser: false,
|
||||||
|
eventList: [],
|
||||||
|
isShowAdd: false,
|
||||||
|
userList: [],
|
||||||
|
processList: [],
|
||||||
|
dictList: [],
|
||||||
|
defaultProps: {
|
||||||
|
label: 'girdName'
|
||||||
|
},
|
||||||
|
isShowForward: false,
|
||||||
|
tree: [],
|
||||||
|
gridInfo: {},
|
||||||
|
form: {
|
||||||
|
files: [],
|
||||||
|
groupId: '',
|
||||||
|
groupName: '',
|
||||||
|
content: [],
|
||||||
|
eventStatus: '1'
|
||||||
|
},
|
||||||
|
evaluation: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
process: v => [v.evaluation.id ? {
|
||||||
|
systemExplain: `${v.evaluation.createUserName}完成评价 (${v.evaluation.score}星评价)`,
|
||||||
|
doTime: v.evaluation.createTime,
|
||||||
|
doExplain: v.evaluation.rateText,
|
||||||
|
} : null, v.processList].flat().filter(Boolean)
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.getDict()
|
||||||
|
this.dict.load('clapEventStatus', 'residentEventSource').then(() => {
|
||||||
|
this.getDetail()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getDetail() {
|
||||||
|
this.instance.post('/app/apppatrolreportinfov2/queryDetailById', null, {
|
||||||
|
params: {id: this.$route.query.id}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.detail = res.data
|
||||||
|
this.processList = res.data.processList
|
||||||
|
this.form.groupId = res.data.groupId
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initMap()
|
||||||
|
})
|
||||||
|
this.isLoading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.isLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getGirdList() {
|
||||||
|
return this.instance.post(`/app/apppatrolreportinfov2/listGirdInfoByTransfer?id=${this.$route.query.id}`).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
// return this.tree = this.formatList([res.data])
|
||||||
|
this.tree = res.data
|
||||||
|
this.tree.map((item) => {
|
||||||
|
item.children = [item.girdMemberList?.map(e => ({
|
||||||
|
...e, isUser: true, girdName: item.girdName
|
||||||
|
})) || []].flat()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.form.files = []
|
||||||
|
this.form.groupId = ''
|
||||||
|
this.form.groupName = ''
|
||||||
|
this.form.content = ''
|
||||||
|
this.form.eventStatus = ''
|
||||||
|
this.forwardForm.content = ''
|
||||||
|
this.forwardForm.girdId = ''
|
||||||
|
this.forwardForm.girdName = ''
|
||||||
|
this.forwardForm.girdMemberId = ''
|
||||||
|
this.forwardForm.girdMemberName = ''
|
||||||
|
this.forwardForm.name = ''
|
||||||
|
this.forwardForm.files = []
|
||||||
|
},
|
||||||
|
|
||||||
|
formatList(list) {
|
||||||
|
for (let item of list) {
|
||||||
|
item.children = [item.girdList, item.girdMemberList?.map(e => ({
|
||||||
|
...e, isUser: true, girdName: item.girdName,
|
||||||
|
girdId: item.id
|
||||||
|
})) || []].flat()
|
||||||
|
if (item.girdList?.length > 0) {
|
||||||
|
this.formatList(item.girdList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNode(value, data) {
|
||||||
|
if (!value) return true
|
||||||
|
|
||||||
|
return (data.girdName && data.girdName.indexOf(value) !== -1) || (data.name && data.name.indexOf(value) !== -1) || (data.name && data.phone.indexOf(value) !== -1)
|
||||||
|
},
|
||||||
|
|
||||||
|
onTreeChange(e) {
|
||||||
|
this.gridInfo = e
|
||||||
|
},
|
||||||
|
|
||||||
|
onForwardConfirm() {
|
||||||
|
this.$refs.forwardForm.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/apppatrolreportinfov2/transfer', {
|
||||||
|
...this.forwardForm,
|
||||||
|
id: this.$route.query.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShowForward = false
|
||||||
|
this.onClose()
|
||||||
|
this.getDetail()
|
||||||
|
this.$message.success('转交成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
// if (this.gridInfo.userId) {
|
||||||
|
// this.forwardForm.girdId = this.gridInfo.girdId
|
||||||
|
// this.forwardForm.girdName = this.gridInfo.girdName
|
||||||
|
// this.forwardForm.girdMemberId = this.gridInfo.id
|
||||||
|
// this.forwardForm.girdMemberName = this.gridInfo.name
|
||||||
|
// } else {
|
||||||
|
// this.forwardForm.girdId = this.gridInfo.id
|
||||||
|
// }
|
||||||
|
// this.forwardForm.girdName = this.gridInfo.girdName
|
||||||
|
// this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}`
|
||||||
|
// this.isShowUser = false
|
||||||
|
if(!this.gridInfo.userId) {
|
||||||
|
return this.$message.error('请选择网格员!')
|
||||||
|
}
|
||||||
|
this.forwardForm.girdId = this.gridInfo.girdId
|
||||||
|
this.forwardForm.girdName = this.gridInfo.girdName
|
||||||
|
this.forwardForm.girdMemberId = this.gridInfo.id
|
||||||
|
this.forwardForm.girdMemberName = this.gridInfo.name
|
||||||
|
this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}`
|
||||||
|
this.isShowUser = false
|
||||||
|
},
|
||||||
|
getDict() {
|
||||||
|
this.instance.post(`/app/apppatrolreportgroupv2/list?current=1&size=100000`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.dictList = res.data.records.map(v => {
|
||||||
|
return {
|
||||||
|
dictValue: v.id,
|
||||||
|
dictName: v.groupName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.$confirm('确定关闭该事件?').then(() => {
|
||||||
|
this.instance.post(`/app/apppatrolreportinfov2/delete?ids=${this.$route.query.id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel(isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
initMap() {
|
||||||
|
let {lng, lat} = this.detail
|
||||||
|
let center = [lng, lat]
|
||||||
|
AMapLoader.load({
|
||||||
|
key: 'b553334ba34f7ac3cd09df9bc8b539dc',
|
||||||
|
version: '2.0'
|
||||||
|
}).then(AMap => {
|
||||||
|
let map = new AMap.Map('map', {
|
||||||
|
center,
|
||||||
|
zoom: 14
|
||||||
|
})
|
||||||
|
let marker = new AMap.Marker({
|
||||||
|
position: new AMap.LngLat(lng, lat),
|
||||||
|
title: this.detail.address
|
||||||
|
})
|
||||||
|
map.add(marker)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleEvent() {
|
||||||
|
this.$refs.form.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/apppatrolreportinfov2/finish', {
|
||||||
|
...this.form,
|
||||||
|
groupName: this.dictList.filter(v => v.dictValue === this.form.groupId)[0].dictName,
|
||||||
|
id: this.$route.query.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShowAdd = false
|
||||||
|
this.getDetail()
|
||||||
|
this.$message.success('处理成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.reportAtWillDetail {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.grid-wrapper {
|
||||||
|
min-height: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-btns {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-tree ) {
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
.el-tree-node__expand-icon.is-leaf {
|
||||||
|
color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content > .el-tree-node__expand-icon {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree__empty-text {
|
||||||
|
color: #222;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__children .el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content:hover {
|
||||||
|
background: #E8EFFF;
|
||||||
|
color: #222222;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-current > .el-tree-node__content {
|
||||||
|
&:hover {
|
||||||
|
background: #2266FF;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-steps {
|
||||||
|
:deep( .el-step__icon ) {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #555555;
|
||||||
|
border-color: #d0d4dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__head.is-finish ) {
|
||||||
|
.el-step__icon.is-text {
|
||||||
|
border: none;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
background: #2266ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__line ) {
|
||||||
|
background-color: #d0d4dc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imgs {
|
||||||
|
font-size: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 108px;
|
||||||
|
height: 108px;
|
||||||
|
margin-right: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .report-dialog ) {
|
||||||
|
.el-select {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__head.is-process ) {
|
||||||
|
color: #555;
|
||||||
|
border-color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .is-finish h2 ) {
|
||||||
|
color: #2266ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-title {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-content__wrapper {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.detail-content__wrapper--left {
|
||||||
|
flex: 1;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ai-detail__content ) {
|
||||||
|
background: #f3f6f9;
|
||||||
|
|
||||||
|
.ai-detail__content--wrapper {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
& > .el-card {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rightZone {
|
||||||
|
width: 400px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-card ) {
|
||||||
|
.el-card__header {
|
||||||
|
padding: 12px 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-card__body {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#amap {
|
||||||
|
width: 466px;
|
||||||
|
height: 232px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-steps {
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imgFormItem > .el-form-item__content {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-image__inner {
|
||||||
|
width: 82px;
|
||||||
|
height: 82px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
249
packages/conv/AppEventReporting/components/List.vue
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list>
|
||||||
|
<template #title>
|
||||||
|
<ai-title :title="menuName" isShowBottomBorder>
|
||||||
|
<el-button type="primary" slot="rightBtn" @click="toSetting">事件类型设置</el-button>
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-search-bar>
|
||||||
|
<template #left>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.eventStatus"
|
||||||
|
clearable
|
||||||
|
placeholder="处理状态"
|
||||||
|
:selectList="dict.getDict('clapEventStatus')"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.eventSource"
|
||||||
|
clearable
|
||||||
|
placeholder="事件来源"
|
||||||
|
:selectList="dict.getDict('residentEventSource')"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.groupId"
|
||||||
|
clearable
|
||||||
|
placeholder="事件类型"
|
||||||
|
:selectList="typeList"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<el-cascader ref="cascader1" v-model="girdArr" :options="girdOptions" placeholder="所属网格" size="small"
|
||||||
|
:props="defaultProps" :show-all-levels="false" @change="gridChange" clearable></el-cascader>
|
||||||
|
<el-date-picker size="small" v-model="searchDotime" type="daterange" range-separator="至" @change="timeChange"
|
||||||
|
start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<ai-download :instance="instance" url="/app/apppatrolreportinfov2/export" :params="search" fileName="巡查上报"
|
||||||
|
:disabled="tableData.length == 0">
|
||||||
|
<el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button>
|
||||||
|
</ai-download>
|
||||||
|
<el-input
|
||||||
|
v-model="search.content"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入内容描述/上报人员/联系方式"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.content = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table :tableData="tableData" :colConfigs="colConfigs" :total="total" :current.sync="search.current" :size.sync="search.size" @getList="getList">
|
||||||
|
<el-table-column slot="options" label="操作" fixed="right" width="120" align="center">
|
||||||
|
<div class="table-options" slot-scope="{row}">
|
||||||
|
<el-button type="text" title="详情" @click="toDetail(row.id)">详情</el-button>
|
||||||
|
<el-button type="text" title="删除" @click="handleDelete(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
label: "巡查上报",
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
menuName: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userList: [],
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
eventStatus: '',
|
||||||
|
content: '',
|
||||||
|
eventSource: '',
|
||||||
|
groupId: '',
|
||||||
|
createTimeStart: '',
|
||||||
|
createTimeEnd: '',
|
||||||
|
girdId: ''
|
||||||
|
},
|
||||||
|
total: 0,
|
||||||
|
tableData: [],
|
||||||
|
content: '',
|
||||||
|
id: '',
|
||||||
|
girdId: '',
|
||||||
|
girdArr: [],
|
||||||
|
girdOptions: [],
|
||||||
|
defaultProps: {
|
||||||
|
label: 'girdName',
|
||||||
|
value: 'id',
|
||||||
|
children: 'children',
|
||||||
|
checkStrictly: true,
|
||||||
|
},
|
||||||
|
searchDotime: [],
|
||||||
|
typeList: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{prop: 'content', label: '内容描述', width: '300px'},
|
||||||
|
{prop: 'eventSource', label: '事件来源', align: 'center', dict: 'residentEventSource'},
|
||||||
|
{prop: 'groupName', label: '事件类型', align: 'center'},
|
||||||
|
{prop: 'girdName', label: '所属网格', align: 'center'},
|
||||||
|
{prop: 'createTime', label: '上报时间', align: 'center'},
|
||||||
|
{prop: 'name', label: '上报人员', align: 'center'},
|
||||||
|
{prop: 'phone', label: '联系方式', align: 'center'},
|
||||||
|
{prop: 'eventStatus', label: '处理状态', align: 'center', format: v => this.dict.getLabel('clapEventStatus', v)},
|
||||||
|
{prop: 'processTime', label: '处理时长', align: 'center'},
|
||||||
|
{slot: 'options'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
handleStatusOps() {
|
||||||
|
return this.dict.getDict("reportAtWillHandleStatus").map(e => ({label: e.dictName, value: e.dictValue}))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.dict.load('clapEventStatus', 'residentEventSource').then(() => {
|
||||||
|
this.getList()
|
||||||
|
this.getGridList()
|
||||||
|
this.getTypeList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
timeChange() {
|
||||||
|
if (this.searchDotime) {
|
||||||
|
this.search.createTimeStart = this.searchDotime[0]
|
||||||
|
this.search.createTimeEnd = this.searchDotime[1]
|
||||||
|
} else {
|
||||||
|
this.search.createTimeStart = null
|
||||||
|
this.search.createTimeEnd = null
|
||||||
|
}
|
||||||
|
this.search.current = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
// 所有网格
|
||||||
|
getGridList() {
|
||||||
|
this.instance.post(`/app/appgirdinfo/listAll3`).then((res) => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.girdOptions = this.toTree(res.data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 转树形结构
|
||||||
|
toTree(data) {
|
||||||
|
let result = [];
|
||||||
|
if (!Array.isArray(data)) {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
let map = {};
|
||||||
|
data.forEach(item => {
|
||||||
|
map[item.id] = item;
|
||||||
|
});
|
||||||
|
data.forEach(item => {
|
||||||
|
let parent = map[item.parentGirdId];
|
||||||
|
if (parent) {
|
||||||
|
(parent.children || (parent.children = [])).push(item);
|
||||||
|
} else {
|
||||||
|
result.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
gridChange(val) {
|
||||||
|
this.girdArr = val
|
||||||
|
this.search.girdId = val?.[val.length - 1]
|
||||||
|
this.$refs.cascader1.dropDownVisible = false;
|
||||||
|
this.search.current = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/apppatrolreportinfov2/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toDetail(id) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Detail',
|
||||||
|
params: {
|
||||||
|
id: id || ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toSetting() {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Setting',
|
||||||
|
params: {
|
||||||
|
id: ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleDelete(ids) {
|
||||||
|
this.$confirm("是否要进行删除?").then(() => {
|
||||||
|
this.instance.post("/app/apppatrolreportinfov2/delete", null, {
|
||||||
|
params: {ids}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("删除成功!")
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).catch(() => 0)
|
||||||
|
},
|
||||||
|
getTypeList() {
|
||||||
|
this.instance.post(`/app/apppatrolreportgroupv2/list?size=10000`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
res.data.records.map((item) => {
|
||||||
|
item.dictName = item.groupName
|
||||||
|
item.dictValue = item.id
|
||||||
|
})
|
||||||
|
this.typeList = res.data.records
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
178
packages/conv/AppEventReporting/components/Setting.vue
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="notice">
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title isShowBack isShowBottomBorder title="事件类型" @onBackClick="cancel(false)"></ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar class="search-bar">
|
||||||
|
<template #left>
|
||||||
|
<el-button size="small" type="primary" icon="iconfont iconAdd" @click="isShowAdd = true">添加事件类型</el-button>
|
||||||
|
</template>
|
||||||
|
<template slot="right">
|
||||||
|
<el-input
|
||||||
|
v-model="search.groupName"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入事件类型名称"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.groupName = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="tags" label="标签">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-tags">
|
||||||
|
<el-tag type="info" v-for="(item, index) in row.tags" size="small" :key="index">{{ item }}</el-tag>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" width="120px" fixed="right" label="操作" align="center">
|
||||||
|
<div class="table-options" slot-scope="{ row }">
|
||||||
|
<el-button type="text" @click="edit(row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="780px"
|
||||||
|
height="580px"
|
||||||
|
:title="id ? '编辑事件类型' : '添加事件类型'"
|
||||||
|
@close="onClose"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<el-form-item label="事件类型" prop="groupName" style="width: 100%;" :rules="[{ required: true, message: '请输入事件类型名称', trigger: 'blur' }]">
|
||||||
|
<el-input size="small" :maxlength="10" show-word-limit placeholder="请输入事件类型名称" v-model="form.groupName"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="排序" prop="showIndex" style="width: 100%;" :rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]">
|
||||||
|
<el-input-number size="small" v-model="form.showIndex" :min="1" :max="100" label="请输入排序"></el-input-number>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
groupName: ''
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
groupName: '',
|
||||||
|
showIndex: ''
|
||||||
|
},
|
||||||
|
id: '',
|
||||||
|
isShowAdd: false,
|
||||||
|
total: 0,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'groupName', label: '事件类型', align: 'left'},
|
||||||
|
{prop: 'showIndex', label: '排序', align: 'center'},
|
||||||
|
{slot: 'options', label: '操作'}
|
||||||
|
],
|
||||||
|
tableData: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user'])
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/apppatrolreportgroupv2/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
edit (e) {
|
||||||
|
this.id = e.id
|
||||||
|
this.form.groupName = e.groupName
|
||||||
|
this.form.showIndex = ''
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isShowAdd = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose () {
|
||||||
|
this.id = ''
|
||||||
|
this.form.showIndex = ''
|
||||||
|
this.form.groupName = ''
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm () {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.instance.post(`/app/apppatrolreportgroupv2/addOrUpdate`, {
|
||||||
|
...this.form,
|
||||||
|
id: this.id || null
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$message.success('添加成功')
|
||||||
|
this.isShowAdd = false
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel (isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/apppatrolreportgroupv2/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
62
packages/conv/AppHealthReport/AppHealthReport.vue
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<template>
|
||||||
|
<div class="AppHealthReport">
|
||||||
|
<keep-alive :include="['List']">
|
||||||
|
<component ref="component" :is="component" @change="onChange" :params="params" :instance="instance" :dict="dict"></component>
|
||||||
|
</keep-alive>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './components/List.vue'
|
||||||
|
import Detail from './components/Detail.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppHealthReport',
|
||||||
|
label: '健康上报',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
List,
|
||||||
|
Detail
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
component: 'List',
|
||||||
|
params: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange (data) {
|
||||||
|
if (data.type === 'Detail') {
|
||||||
|
this.component = 'Detail'
|
||||||
|
this.isShowDetail = true
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'list') {
|
||||||
|
this.component = 'List'
|
||||||
|
this.params = data.params
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (data.isRefresh) {
|
||||||
|
this.$refs.component.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppHealthReport {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
316
packages/conv/AppHealthReport/components/Detail.vue
Normal file
@@ -0,0 +1,316 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail isHasSidebar>
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(true)">
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<AiSidebar :tabTitle="tabList" v-model="currIndex"></AiSidebar>
|
||||||
|
<div v-show="currIndex === 0">
|
||||||
|
<ai-card title="基本信息" v-show="currIndex === 0">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="姓名" :value="info.name"></ai-info-item>
|
||||||
|
<ai-info-item label="上报时间" :value="info.createTime"></ai-info-item>
|
||||||
|
<ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item>
|
||||||
|
<ai-info-item label="所属地区" :value="info.areaName"></ai-info-item>
|
||||||
|
<ai-info-item label="详细地址" isLine :value="info.address"></ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</div>
|
||||||
|
<ai-card title="每日上报" v-show="currIndex === 1">
|
||||||
|
<template #content>
|
||||||
|
<ai-table
|
||||||
|
class="detail-table__table"
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="options" width="140px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toDetail(row.id)">详情</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShow"
|
||||||
|
width="890px"
|
||||||
|
customFooter
|
||||||
|
title="上报详情">
|
||||||
|
<ai-bar title="健康状况"></ai-bar>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="当前体温">
|
||||||
|
<span :style="{color: reportInfo.temperature > 37.3 ? '#FF4466' : '#42D784'}">{{ reportInfo.temperature }}℃</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="14天内是否接触新冠确诊或疑似患者">
|
||||||
|
<span :style="{color: reportInfo.touchInFourteen === '0' ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicTouchInFourteen', reportInfo.touchInFourteen) }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="当前健康状况" isLine>
|
||||||
|
<span :style="{color: !reportInfo.isHealth ? '#42D784' : '#FF4466'}">{{ reportInfo.healthName }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
<ai-bar title="核酸检测信息"></ai-bar>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="检测日期">
|
||||||
|
<span>{{ reportInfo.checkTime && reportInfo.checkTime.split(' ')[0] }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="检测结果">
|
||||||
|
<span :style="{color: reportInfo.checkResult === '0' ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicRecentTestResult', reportInfo.checkResult) }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="健康码状态">
|
||||||
|
<span :style="{color: (reportInfo.healthCode === '0' || reportInfo.healthCode === '1') ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicHealthCode', reportInfo.healthCode) }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="已接种疫苗次数">
|
||||||
|
<span>{{ $dict.getLabel('epidemicVaccineTime', reportInfo.vaccine) }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="本人健康码截图" isLine>
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
v-model="reportInfo.checkPhoto"
|
||||||
|
disabled
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
<div class="dialog-footer" slot="footer">
|
||||||
|
<el-button @click="isShow = false">关闭</el-button>
|
||||||
|
</div>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<div v-show="currIndex === 2">
|
||||||
|
<ai-card title="异常处理">
|
||||||
|
<template #right>
|
||||||
|
<el-button type="primary" v-if="info.status === '0'" @click="release">解除异常</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="姓名" :value="info.name"></ai-info-item>
|
||||||
|
<ai-info-item label="填报时间" :value="info.createTime"></ai-info-item>
|
||||||
|
<ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item>
|
||||||
|
<ai-info-item label="手机号码" :value="info.phone"></ai-info-item>
|
||||||
|
<ai-info-item label="异常状况" isLine>
|
||||||
|
<span :style="{color: info.unusual ? 'red' : '#333'}">{{ info.unusual || '-' }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="异常解除人" v-if="info.releaseName && info.status === '1'" :value="info.releaseName"></ai-info-item>
|
||||||
|
<ai-info-item label="异常解除时间" v-if="info.releaseTime && info.status === '1'" :value="info.releaseTime"></ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="异常情况记录">
|
||||||
|
<template #right>
|
||||||
|
<el-button type="primary" v-if="info.status === '0'" @click="isShowAdd = true">添加记录</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-table
|
||||||
|
:tableData="recordList"
|
||||||
|
:col-configs="recordConfigs"
|
||||||
|
:total="recordTotal"
|
||||||
|
:current.sync="recordSerch.current"
|
||||||
|
:size.sync="recordSerch.size"
|
||||||
|
@getList="getRecordList">
|
||||||
|
<el-table-column slot="options" width="120px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="800px"
|
||||||
|
@close="form.content = ''"
|
||||||
|
title="添加异常记录"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="form" ref="form">
|
||||||
|
<el-form-item label="异常记录" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入异常记录' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入异常记录" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'Detail',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
params: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
total: 0,
|
||||||
|
info: {},
|
||||||
|
id: '',
|
||||||
|
isShowAdd: false,
|
||||||
|
recordTotal: 0,
|
||||||
|
recordSerch: {
|
||||||
|
current: 1,
|
||||||
|
size: 10
|
||||||
|
},
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
content: ''
|
||||||
|
},
|
||||||
|
recordConfigs: [
|
||||||
|
{prop: 'content', label: '异常记录', align: 'center' },
|
||||||
|
{prop: 'createTime', label: '创建时间', align: 'center'},
|
||||||
|
{prop: 'createUserName', label: '记录人', align: 'center' }
|
||||||
|
],
|
||||||
|
reportInfo: {},
|
||||||
|
isShow: false,
|
||||||
|
currIndex: 0,
|
||||||
|
tableData: [],
|
||||||
|
recordList: [],
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'createTime', label: '上报日期', align: 'center', dateFormat: 'YYYY-MM-DD'},
|
||||||
|
{prop: 'status', label: '健康状态', align: 'center', format: v => v === '0' ? '异常' : '正常' }
|
||||||
|
],
|
||||||
|
tabList: ['基本信息', '每日上报', '异常处理']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
if (this.params && this.params.id) {
|
||||||
|
this.id = this.params.id
|
||||||
|
this.dict.load(['epidemicRecentHealth', 'epidemicRecentTravel', 'epidemicTouchInFourteen', 'epidemicMemberType', 'epidemicRecentTestResult']).then(() => {
|
||||||
|
this.getInfo(this.params.id)
|
||||||
|
this.getList()
|
||||||
|
this.getRecordList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appepidemicreportmember/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.info = res.data
|
||||||
|
this.currIndex = 0
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getRecordList () {
|
||||||
|
this.instance.post(`/app/appepidemicunusuallog/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search,
|
||||||
|
recordId: this.params.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.recordList = res.data.records
|
||||||
|
this.recordTotal = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
this.$refs.form.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/appepidemicunusuallog/addOrUpdate', {
|
||||||
|
...this.form,
|
||||||
|
recordId: this.params.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShowAdd = false
|
||||||
|
this.getRecordList(this.params.id)
|
||||||
|
this.$message.success('添加成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
release () {
|
||||||
|
this.$confirm('确定解除异常?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicreportmember/release`, {
|
||||||
|
id: this.params.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('解除异常成功!')
|
||||||
|
this.currIndex = 0
|
||||||
|
this.getInfo(this.params.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicunusuallog/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getRecordList(this.params.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toDetail (id) {
|
||||||
|
this.instance.post(`/app/appepidemichealthreport/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.reportInfo = res.data
|
||||||
|
this.reportInfo.checkPhoto = JSON.parse(res.data.checkPhoto)
|
||||||
|
let healthName = ''
|
||||||
|
this.reportInfo.isHealth = false
|
||||||
|
res.data.health.split(',').forEach(v => {
|
||||||
|
if (v > 0) {
|
||||||
|
this.reportInfo.isHealth = true
|
||||||
|
}
|
||||||
|
healthName = healthName + this.dict.getLabel('epidemicRecentHealth', v)
|
||||||
|
})
|
||||||
|
this.reportInfo.healthName = healthName
|
||||||
|
|
||||||
|
this.isShow = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appepidemichealthreport/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search,
|
||||||
|
memberId: this.params.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel (isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
</style>
|
||||||
293
packages/conv/AppHealthReport/components/List.vue
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="list">
|
||||||
|
<ai-title slot="title" title="健康上报" v-if="search.areaId" isShowBottomBorder :instance="instance" :disabledLevel="disabledLevel" isShowArea v-model="search.areaId" @change="changeArea"></ai-title>
|
||||||
|
<template slot="content">
|
||||||
|
<div class="statistics-top">
|
||||||
|
<div class="statistics-top__item">
|
||||||
|
<span>上报人数</span>
|
||||||
|
<h2 style="color: #2266FF;">{{ info.total }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="statistics-top__item">
|
||||||
|
<span>今日上报</span>
|
||||||
|
<h2 style="color: #22AA99;">{{ info.today }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="statistics-top__item">
|
||||||
|
<span>今日未报</span>
|
||||||
|
<h2 style="color: #F8B425">{{ info.unReport }}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="statistics-top__item">
|
||||||
|
<span>今日异常</span>
|
||||||
|
<h2 style="color: red">{{ info.unusual }}</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<ai-search-bar bottomBorder>
|
||||||
|
<template #left>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.checkResult"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择检查结果"
|
||||||
|
:selectList="dict.getDict('epidemicRecentTestResult')"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.today"
|
||||||
|
clearable
|
||||||
|
placeholder="今日是否上报"
|
||||||
|
:selectList="dictList"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<ai-download :instance="instance" url="/app/appepidemicreportmember/export" :params="search" fileName="健康上报" :disabled="tableData.length == 0">
|
||||||
|
<el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button>
|
||||||
|
</ai-download>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input
|
||||||
|
v-model="search.name"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入姓名"
|
||||||
|
clearable
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
@clear="search.current = 1, search.name = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
v-loading="loading"
|
||||||
|
style="margin-top: 16px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="healthCode" align="center" label="健康码">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<ai-uploader
|
||||||
|
v-if="row.healthCode"
|
||||||
|
:instance="instance"
|
||||||
|
:value="JSON.parse(row.healthCode)"
|
||||||
|
disabled
|
||||||
|
:limit="1">
|
||||||
|
</ai-uploader>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" width="140px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toDetail(row.id)">详情</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
name: '',
|
||||||
|
checkResult: '',
|
||||||
|
areaId: '',
|
||||||
|
today: ''
|
||||||
|
},
|
||||||
|
dictList: [{
|
||||||
|
dictName: '否',
|
||||||
|
dictValue: '0'
|
||||||
|
}, {
|
||||||
|
dictName: '是',
|
||||||
|
dictValue: '1'
|
||||||
|
}],
|
||||||
|
info: {},
|
||||||
|
colConfigs: [
|
||||||
|
{ prop: 'name', label: '姓名' },
|
||||||
|
{ prop: 'phone', align: 'center', label: '手机号码' },
|
||||||
|
{ prop: 'areaName', align: 'center', label: '所属地区', width: '200px' },
|
||||||
|
{ prop: 'reportTime', align: 'center', label: '上报时间', width: '200px' },
|
||||||
|
{
|
||||||
|
prop: 'vaccine',
|
||||||
|
align: 'center',
|
||||||
|
label: '已接种情况',
|
||||||
|
render: (h, {row}) => {
|
||||||
|
return h('span', {
|
||||||
|
style: {
|
||||||
|
}
|
||||||
|
}, row.today === '0' ? '-' : (row.vaccine || 0 + '次'))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ prop: 'healthCode', align: 'center', label: '健康码', format: v => v ? this.dict.getLabel('epidemicHealthCode', v) : '-' },
|
||||||
|
{ prop: 'checkTime', align: 'center', label: '核酸日期', format: v => v ? v.split(' ')[0] : '-' },
|
||||||
|
{ prop: 'checkResult', align: 'center', label: '检测结果', format: v => v ? this.dict.getLabel('epidemicRecentTestResult', v) : '-' },
|
||||||
|
{
|
||||||
|
prop: 'status',
|
||||||
|
align: 'center',
|
||||||
|
label: '健康状态',
|
||||||
|
render: (h, {row}) => {
|
||||||
|
return h('span', {
|
||||||
|
style: {
|
||||||
|
color: row.status === '0' ? 'red' : '#333'
|
||||||
|
}
|
||||||
|
}, row.today === '0' ? '-' : (row.status === '0' ? '异常' : '正常'))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ prop: 'today', align: 'center', label: '今日上报', format: v => v === '0' ? '未上报' : '已上报' },
|
||||||
|
],
|
||||||
|
tableData: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
disabledLevel: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
param () {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.disabledLevel = this.user.info.areaList.length - 1
|
||||||
|
this.search.areaId = this.user.info.areaId
|
||||||
|
this.loading = true
|
||||||
|
this.dict.load(['epidemicTouchInFourteen', 'epidemicRecentHealth', 'epidemicRecentTestResult', 'epidemicHealthCode', 'epidemicVaccineTime']).then(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appepidemicreportmember/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
this.loading = false
|
||||||
|
} else {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
|
||||||
|
this.getTotalInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicreportmember/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getTotalInfo()
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toDetail (id) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Detail',
|
||||||
|
params: {
|
||||||
|
id: id || ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
changeArea () {
|
||||||
|
this.search.current = 1
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.getList()
|
||||||
|
this.getTotalInfo()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getTotalInfo () {
|
||||||
|
this.instance.post(`/app/appepidemicreportmember/statistic`, null, {
|
||||||
|
params: {
|
||||||
|
areaId: this.search.areaId
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.info = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.list {
|
||||||
|
:deep( .ai-list__content ){
|
||||||
|
padding: 0!important;
|
||||||
|
|
||||||
|
.ai-list__content--right-wrapper {
|
||||||
|
background: transparent!important;
|
||||||
|
box-shadow: none!important;
|
||||||
|
margin: 0!important;
|
||||||
|
padding: 12px 16px 12px!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.statistics-top {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
& > div {
|
||||||
|
flex: 1;
|
||||||
|
height: 96px;
|
||||||
|
line-height: 1;
|
||||||
|
margin-right: 20px;
|
||||||
|
padding: 16px 24px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15);
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: #888888;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 16px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
397
packages/conv/AppPatrolReportSet/AppPatrolReportSet.vue
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail class="AppPatrolReportSet">
|
||||||
|
<ai-title slot="title" title="巡查上报设置" isShowBottomBorder>
|
||||||
|
<el-button size="small" type="primary" icon="iconfont iconAdd" slot="rightBtn" @click="add">添加节点</el-button>
|
||||||
|
</ai-title>
|
||||||
|
<template slot="content">
|
||||||
|
<div class="list" v-if="list.length">
|
||||||
|
<div class="item" v-for="(item, index) in list" :key="index">
|
||||||
|
<div class="btn">
|
||||||
|
<el-button type="text" @click="edit(index)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="del(index)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="index">{{index < 9 ? `0${index+1}` : `${index+1}`}}</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">节点类型</div>
|
||||||
|
<div class="value">{{item.nodeType == 0 ? '首节点' : $dict.getLabel('prfcNodeType', item.nodeType)}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">上级节点网络</div>
|
||||||
|
<div class="value">{{item.girdName}}<span class="span" v-if="item.nodeType == 2 && item.onlyCoordination == '1'">仅协同部门</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex">
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">生效功能</div>
|
||||||
|
<div class="value">
|
||||||
|
<span v-if="item.functionAdd == 1">添加</span>
|
||||||
|
<span v-if="item.functionHandle == 1">办理</span>
|
||||||
|
<span v-if="item.functionTransmit == 1">转交</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">生效身份</div>
|
||||||
|
<div class="value">
|
||||||
|
<span v-if="item.roleMember == 1">网格员</span>
|
||||||
|
<span v-if="item.roleAdmin == 1">网格长</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="item.nodeType == 3">
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">同级节点网络</div>
|
||||||
|
<div class="value">{{item.girdName2}}<span class="span" v-if="item.nodeType == 3 && item.onlyCoordination == '1'">仅协同部门</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex">
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">生效功能</div>
|
||||||
|
<div class="value">
|
||||||
|
<span v-if="item.functionAdd2 == 1">添加</span>
|
||||||
|
<span v-if="item.functionHandle2 == 1">办理</span>
|
||||||
|
<span v-if="item.functionTransmit2 == 1">转交</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="label">生效身份</div>
|
||||||
|
<div class="value">
|
||||||
|
<span v-if="item.roleMember2 == 1">网格员</span>
|
||||||
|
<span v-if="item.roleAdmin2 == 1">网格长</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="info">
|
||||||
|
<div class="label">条件约束</div>
|
||||||
|
<div class="value">名称约束</div>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ai-empty v-else>暂无数据</ai-empty>
|
||||||
|
|
||||||
|
<ai-dialog :visible.sync="dialog" :title="dialogTitle" @closed="$refs.form.resetFields()" @onConfirm="onConfirm" width="70%">
|
||||||
|
<el-form ref="form" :rules="rules" size="small" :model="form" label-width="110px">
|
||||||
|
<el-form-item label="节点类型" prop="nodeType" v-if="form.nodeType === '0'">
|
||||||
|
<ai-select disabled
|
||||||
|
v-model="form.nodeType"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择..."
|
||||||
|
:selectList="nodeTypeDictList">
|
||||||
|
</ai-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="节点类型" prop="nodeType" v-else>
|
||||||
|
<ai-select :disabled="getGirdList.length == 1 && form.nodeType == '1'"
|
||||||
|
v-model="form.nodeType"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择..."
|
||||||
|
:selectList="dict.getDict('prfcNodeType')" @change="changeNodeType">
|
||||||
|
</ai-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="选择节点网格" prop="girdId" >
|
||||||
|
<ai-picker v-if="form.nodeType === '0'"
|
||||||
|
:ops="{label: 'girdName'}"
|
||||||
|
dialogTitle="选择节点网格"
|
||||||
|
action="/app/appgirdinfo/girdList"
|
||||||
|
:instance="instance"
|
||||||
|
@pick="onGirdChange"
|
||||||
|
v-model="form.girdIdList">
|
||||||
|
<div class="userSelcet">
|
||||||
|
<span style="color: #606266;" v-if="form.girdIdList.length">{{ form.girdName }}</span>
|
||||||
|
<span v-else>选择节点网格</span>
|
||||||
|
<i class="el-icon-arrow-down"></i>
|
||||||
|
</div>
|
||||||
|
</ai-picker>
|
||||||
|
<el-input placeholder="节点网格" v-model="form.girdName" disabled v-else></el-input>
|
||||||
|
<el-checkbox v-model="sameLevelUsed" disabled>当前选中网格层级生效</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.onlyCoordination" v-if="form.nodeType == '2'" true-label="1" false-label="0">仅协同部门</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="生效功能">
|
||||||
|
<el-checkbox v-model="form.functionAdd" true-label="1" false-label="0">添加</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.functionHandle" true-label="1" false-label="0">办理</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.functionTransmit" true-label="1" false-label="0">转交</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="生效身份">
|
||||||
|
<el-checkbox v-model="form.roleMember" true-label="1" false-label="0">网格员</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.roleAdmin" true-label="1" false-label="0">网格长</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<div v-if="form.nodeType == 3">
|
||||||
|
<el-form-item label="同级节点网格" prop="girdId2">
|
||||||
|
<el-input placeholder="节点网格" v-model="form.girdName2" disabled></el-input>
|
||||||
|
<el-checkbox v-model="sameLevelUsed" disabled>当前选中网格层级生效</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.onlyCoordination" v-if="form.nodeType == '3'" true-label="1" false-label="0">仅协同部门</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="生效功能">
|
||||||
|
<el-checkbox v-model="form.functionAdd2" true-label="1" false-label="0">添加</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.functionHandle2" true-label="1" false-label="0">办理</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.functionTransmit2" true-label="1" false-label="0">转交</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="生效身份">
|
||||||
|
<el-checkbox v-model="form.roleMember2" true-label="1" false-label="0">网格员</el-checkbox>
|
||||||
|
<el-checkbox v-model="form.roleAdmin2" true-label="1" false-label="0">网格长</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
<template slot="footer">
|
||||||
|
<el-button @click="getList">返回</el-button>
|
||||||
|
<el-button type="primary" @click="confirm">提交</el-button>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'AppPatrolReportSet',
|
||||||
|
label: '巡查上报设置',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
dialog: false,
|
||||||
|
dialogTitle: '',
|
||||||
|
form: {
|
||||||
|
nodeType: '', //0:首节点、1:上级、2:同级、3:混合
|
||||||
|
girdIdList: [],
|
||||||
|
girdId: '',
|
||||||
|
girdCode: '',
|
||||||
|
girdLevel: '',
|
||||||
|
girdName: '',
|
||||||
|
functionAdd: '1',
|
||||||
|
functionHandle: '1',
|
||||||
|
functionTransmit: '1',
|
||||||
|
roleAdmin: '1',
|
||||||
|
roleMember: '1',
|
||||||
|
girdId2: '',
|
||||||
|
girdCode2: '',
|
||||||
|
girdLevel2: '',
|
||||||
|
girdName2: '',
|
||||||
|
functionAdd2: '1',
|
||||||
|
functionHandle2: '1',
|
||||||
|
functionTransmit2: '1',
|
||||||
|
roleAdmin2: '1',
|
||||||
|
roleMember2: '1',
|
||||||
|
onlyCoordination: '1'
|
||||||
|
},
|
||||||
|
list: [],
|
||||||
|
nodeTypeDictList: [{dictName: '首节点', dictValue: '0'}],
|
||||||
|
sameLevelUsed: true,
|
||||||
|
getGirdList: [],
|
||||||
|
editIndex: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
rules() {
|
||||||
|
return {
|
||||||
|
nodeType: [{ required: true, message: '请选择节点类型', trigger: 'change'}],
|
||||||
|
girdId: [{ required: true, message: '请选择节点网络', trigger: 'change'}],
|
||||||
|
girdId2: [{ required: true, message: '请选择同级节点网格', trigger: 'change'}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.dict.load('prfcNodeType').then(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
this.form = {
|
||||||
|
nodeType: '', //0:首节点、1:上级、2:同级、3:混合
|
||||||
|
girdIdList: [],
|
||||||
|
girdId: '',
|
||||||
|
girdCode: '',
|
||||||
|
girdLevel: '',
|
||||||
|
girdName: '',
|
||||||
|
functionAdd: '1',
|
||||||
|
functionHandle: '1',
|
||||||
|
functionTransmit: '1',
|
||||||
|
roleAdmin: '1',
|
||||||
|
roleMember: '1',
|
||||||
|
girdId2: '',
|
||||||
|
girdCode2: '',
|
||||||
|
girdLevel2: '',
|
||||||
|
girdName2: '',
|
||||||
|
functionAdd2: '1',
|
||||||
|
functionHandle2: '1',
|
||||||
|
functionTransmit2: '1',
|
||||||
|
roleAdmin2: '1',
|
||||||
|
roleMember2: '1',
|
||||||
|
onlyCoordination: '1'
|
||||||
|
}
|
||||||
|
if(this.list.length > 0) {
|
||||||
|
this.getGird(this.list.length-1)
|
||||||
|
}else { //首节点
|
||||||
|
this.form.nodeType = '0'
|
||||||
|
}
|
||||||
|
this.dialogTitle = '添加节点'
|
||||||
|
this.dialog = true
|
||||||
|
this.$refs.form.resetFields()
|
||||||
|
},
|
||||||
|
del(index) {
|
||||||
|
this.$confirm('确定删除该节点?').then(() => {
|
||||||
|
this.list.splice(index, 1)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
edit(index) {
|
||||||
|
this.editIndex = index
|
||||||
|
this.form = {...this.list[index]}
|
||||||
|
if(this.form.nodeType != '0') {
|
||||||
|
this.getGird(index-1)
|
||||||
|
}
|
||||||
|
this.dialogTitle = '编辑节点'
|
||||||
|
this.dialog = true
|
||||||
|
},
|
||||||
|
onConfirm() {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
if(this.dialogTitle == '添加节点') {
|
||||||
|
this.list.push(this.form)
|
||||||
|
}else {
|
||||||
|
this.list.splice(this.editIndex, 1, this.form)
|
||||||
|
}
|
||||||
|
this.dialog = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/apppatrolreportflowconfigv2/queryNew`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.list = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onGirdChange(e) {
|
||||||
|
this.form.girdId = e[0].id
|
||||||
|
this.form.girdCode = e[0].girdCode
|
||||||
|
this.form.girdLevel = e[0].girdLevel
|
||||||
|
this.form.girdName = e[0].girdName
|
||||||
|
},
|
||||||
|
changeNodeType(e) { //1 上下级节点取数组0;2同级节点选择数组1; 3混合节点主取数组0,同级选择数组1
|
||||||
|
console.log(e)
|
||||||
|
var arr = []
|
||||||
|
if(e == 1) {
|
||||||
|
arr.push(this.getGirdList[0])
|
||||||
|
}
|
||||||
|
if(e == 2) {
|
||||||
|
arr.push(this.getGirdList[1])
|
||||||
|
}
|
||||||
|
if(e == 3) {
|
||||||
|
arr.push(this.getGirdList[0])
|
||||||
|
this.form.girdId2 = this.getGirdList[1].id
|
||||||
|
this.form.girdCode2 = this.getGirdList[1].girdCode
|
||||||
|
this.form.girdLevel2 = this.getGirdList[1].girdLevel
|
||||||
|
this.form.girdName2 = this.getGirdList[1].girdName
|
||||||
|
}
|
||||||
|
this.onGirdChange(arr)
|
||||||
|
},
|
||||||
|
getGird(index) {
|
||||||
|
var girdCode = this.list[index].girdCode
|
||||||
|
this.instance.post(`app/apppatrolreportflowconfigv2/choiseGird?previousGirdCode=${girdCode}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.getGirdList = res.data
|
||||||
|
if(res.data.length == 1 && this.dialogTitle == '添加节点') { //返回数据一条表示nodeType 1 上下级节点;混合节点主去数组0,同级选择数组1;同级节点选择数组1
|
||||||
|
this.form.nodeType = '1'
|
||||||
|
this.onGirdChange(res.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
confirm() {
|
||||||
|
this.instance.post(`/app/apppatrolreportflowconfigv2/addOrUpdate`, this.list).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('提交成功')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppPatrolReportSet {
|
||||||
|
height: 100%;
|
||||||
|
.list {
|
||||||
|
padding: 0 16px 16px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
padding: 16px 0 4px 26px;
|
||||||
|
position: relative;
|
||||||
|
border-bottom: 1px solid #F2F2F2;
|
||||||
|
.info {
|
||||||
|
height: 22px;
|
||||||
|
font-family: MicrosoftYaHei;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #888;
|
||||||
|
line-height: 22px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
.label {
|
||||||
|
display: inline-block;
|
||||||
|
width: 112px;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
.value {
|
||||||
|
display: inline-block;
|
||||||
|
width: calc(100% - 112px);
|
||||||
|
color: #222;
|
||||||
|
span {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 24px;
|
||||||
|
}
|
||||||
|
.span {
|
||||||
|
margin-left: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.index {
|
||||||
|
position: absolute;
|
||||||
|
top: 16px;
|
||||||
|
left: 0;
|
||||||
|
height: 21px;
|
||||||
|
font-family: DINAlternate-Bold;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 18px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 16px;
|
||||||
|
}
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
.info {
|
||||||
|
width: 33.3%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
:deep(.ai-select),
|
||||||
|
:deep(.el-input) {
|
||||||
|
display: inline-block;
|
||||||
|
width: 50%;
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
:deep(.AiPicker) {
|
||||||
|
display: inline-block;
|
||||||
|
width: 50%;
|
||||||
|
margin-right: 16px;
|
||||||
|
border: 1px solid #d0d4dc;
|
||||||
|
padding-left: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border-radius: 4px;
|
||||||
|
position: relative;
|
||||||
|
.el-icon-arrow-down {
|
||||||
|
position: absolute;
|
||||||
|
top: 8px;
|
||||||
|
right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
55
packages/conv/AppReportAiWill/AppReportAtWill.vue
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<template>
|
||||||
|
<section class="AppReportAtWill">
|
||||||
|
<component ref="component" :is="currentPage" @change="onChange" :params="params" :instance="instance" :dict="dict" :menuName="menuName" />
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './components/List'
|
||||||
|
import Detail from './components/Detail'
|
||||||
|
import Setting from './components/Setting'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppReportAtWill',
|
||||||
|
label: '随手拍',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
menuName: {default: '随手拍'}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
component: 'List',
|
||||||
|
params: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
currentPage() {
|
||||||
|
let {hash, query: {id}} = this.$route
|
||||||
|
return hash == "#Setting" ? Setting :
|
||||||
|
!!id ? Detail : List
|
||||||
|
}
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
List,
|
||||||
|
Detail,
|
||||||
|
Setting
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange(data) {
|
||||||
|
this.$router.push({query: data.params, hash: data.type == "Setting" ? "#Setting" : ""})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.AppReportAtWill {
|
||||||
|
height: 100%;
|
||||||
|
background: #F3F6F9;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
581
packages/conv/AppReportAiWill/components/Detail.vue
Normal file
@@ -0,0 +1,581 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail class="reportAtWillDetail" v-loading="isLoading">
|
||||||
|
<template #title>
|
||||||
|
<ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)">
|
||||||
|
<template #rightBtn>
|
||||||
|
<div class="title-btns">
|
||||||
|
<el-button type="primary" icon="iconfont iconPerson_Transfered" @click="isShowForward = true" v-if="detail.eventStatus < 2">指派事件</el-button>
|
||||||
|
<el-button type="primary" icon="iconfont iconRegister" @click="isShowAdd = true" v-if="detail.eventStatus < 2">处理事件</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<div class="detail-content__wrapper">
|
||||||
|
<div class="detail-content__wrapper--left">
|
||||||
|
<ai-card title="基础信息">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper>
|
||||||
|
<ai-info-item label="上报人员" :value="detail.name"></ai-info-item>
|
||||||
|
<ai-info-item label="当前状态" :value="dict.getLabel('clapEventStatus', detail.eventStatus)"></ai-info-item>
|
||||||
|
<ai-info-item label="联系方式">{{ detail.phone }}</ai-info-item>
|
||||||
|
<ai-info-item label="上报时间">{{ detail.createTime }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件类型">{{ detail.groupName }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件描述" isLine>{{ detail.content }}</ai-info-item>
|
||||||
|
<ai-info-item label="现场照片" isLine>
|
||||||
|
<ai-uploader :instance="instance" disabled v-model="detail.files"></ai-uploader>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="所属网格">{{ detail.girdName }}</ai-info-item>
|
||||||
|
<ai-info-item label="事件位置" isLine>
|
||||||
|
<div id="map" style="width: 500px; height: 280px;"></div>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-evaluation v-if="!!detail.id" :bid="detail.id" :info.sync="evaluation"/>
|
||||||
|
</div>
|
||||||
|
<div class="rightZone">
|
||||||
|
<ai-card title="办理进度">
|
||||||
|
<template #content>
|
||||||
|
<el-steps direction="vertical" :active="1">
|
||||||
|
<el-step
|
||||||
|
v-for="(item, i) in process"
|
||||||
|
:key="i"
|
||||||
|
:title="item.systemExplain"
|
||||||
|
:description="item.doTime">
|
||||||
|
<template #title>
|
||||||
|
<h2 class="step-title" style="font-weight: 500; font-size: 14px;">
|
||||||
|
{{ item.systemExplain }}
|
||||||
|
</h2>
|
||||||
|
</template>
|
||||||
|
<template #description>
|
||||||
|
<p style="color: #888; margin: 0 4px 10px 0; font-size: 14px;">{{ item.doTime }}</p>
|
||||||
|
<div style="color: #444;margin-bottom: 10px;" v-if="item.doExplain">{{ item.doExplain }}</div>
|
||||||
|
<ai-uploader :instance="instance" disabled v-model="item.files"></ai-uploader>
|
||||||
|
</template>
|
||||||
|
</el-step>
|
||||||
|
</el-steps>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="800px"
|
||||||
|
title="事件处理"
|
||||||
|
@closed="onClose"
|
||||||
|
@onConfirm="handleEvent">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="form" ref="form">
|
||||||
|
<el-form-item label="事件分类" prop="groupId" style="width: 100%;" :rules="[{ required: true, message: '请选择事件分类' }]">
|
||||||
|
<ai-select
|
||||||
|
v-model="form.groupId"
|
||||||
|
placeholder="请选择事件分类"
|
||||||
|
:selectList="dictList">
|
||||||
|
</ai-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理结果" prop="eventStatus" style="width: 100%;" :rules="[{ required: true, message: '请选择处理结果' }]">
|
||||||
|
<el-radio-group v-model="form.eventStatus">
|
||||||
|
<el-radio label="2">已办结</el-radio>
|
||||||
|
<el-radio label="3">已拒绝</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入处理意见' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入处理意见" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="图片" prop="files" style="width: 100%;">
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
isShowTip
|
||||||
|
v-model="form.files"
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowForward"
|
||||||
|
width="800px"
|
||||||
|
@close="onClose"
|
||||||
|
title="事件指派"
|
||||||
|
@onConfirm="onForwardConfirm">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="forwardForm" ref="forwardForm">
|
||||||
|
<el-form-item label="转交" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请选择网格员或网格' }]">
|
||||||
|
<el-input disabled size="small" v-model="forwardForm.name" clearable placeholder="请选择网格员或网格">
|
||||||
|
<template slot="append">
|
||||||
|
<el-button @click="getGirdList().then(()=>isShowUser=true )">选择</el-button>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="办理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入办理意见' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="forwardForm.content" clearable placeholder="请输入办理意见" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="图片" prop="files" style="width: 100%;">
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
v-model="forwardForm.files"
|
||||||
|
isShowTip
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowUser"
|
||||||
|
width="800px"
|
||||||
|
title="选择网格或网格员"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<div class="grid-wrapper">
|
||||||
|
<el-input
|
||||||
|
style="margin-bottom: 10px;"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入网格名称/网格员姓名/网格员电话"
|
||||||
|
v-model="name" @change="$refs.tree.filter(name)"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
<el-tree
|
||||||
|
:filter-node-method="filterNode"
|
||||||
|
ref="tree"
|
||||||
|
:props="defaultProps"
|
||||||
|
node-key="id"
|
||||||
|
:data="tree"
|
||||||
|
highlight-current
|
||||||
|
@current-change="onTreeChange">
|
||||||
|
<div class="tree-container" slot-scope="{ data }">
|
||||||
|
<div class="tree-container__user">
|
||||||
|
<div class="tree-user__item">
|
||||||
|
<span>{{ data.isUser ? `${data.name}-${data.phone}` : data.girdName }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AMapLoader from '@amap/amap-jsapi-loader'
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'Detail',
|
||||||
|
props: ['dict', 'instance'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
forwardForm: {
|
||||||
|
content: '',
|
||||||
|
girdId: '',
|
||||||
|
girdName: '',
|
||||||
|
girdMemberId: '',
|
||||||
|
girdMemberName: '',
|
||||||
|
name: ''
|
||||||
|
},
|
||||||
|
isLoading: true,
|
||||||
|
name: '',
|
||||||
|
detail: {},
|
||||||
|
isShowUser: false,
|
||||||
|
eventList: [],
|
||||||
|
isShowAdd: false,
|
||||||
|
userList: [],
|
||||||
|
processList: [],
|
||||||
|
dictList: [],
|
||||||
|
defaultProps: {
|
||||||
|
label: 'girdName'
|
||||||
|
},
|
||||||
|
isShowForward: false,
|
||||||
|
tree: [],
|
||||||
|
gridInfo: {},
|
||||||
|
form: {
|
||||||
|
files: [],
|
||||||
|
groupId: '',
|
||||||
|
groupName: '',
|
||||||
|
content: [],
|
||||||
|
eventStatus: '2'
|
||||||
|
},
|
||||||
|
evaluation: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
process: v => [v.evaluation.id ? {
|
||||||
|
systemExplain: `${v.evaluation.createUserName}完成评价 (${v.evaluation.score}星评价)`,
|
||||||
|
doTime: v.evaluation.createTime,
|
||||||
|
doExplain: v.evaluation.rateText
|
||||||
|
} : null, v.processList].flat().filter(Boolean)
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.getDict()
|
||||||
|
this.dict.load('clapEventStatus').then(() => {
|
||||||
|
this.getDetail()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getDetail() {
|
||||||
|
this.instance.post('/app/appclapeventinfo/queryDetailById', null, {
|
||||||
|
params: {id: this.$route.query.id}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
this.detail = res.data
|
||||||
|
this.processList = res.data.processList
|
||||||
|
this.form.groupId = res.data.groupId
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initMap()
|
||||||
|
})
|
||||||
|
this.isLoading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.isLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getGirdList() {
|
||||||
|
return this.instance.post(`/app/appgirdinfo/listAllByTop`).then(res => {
|
||||||
|
if (res?.data) {
|
||||||
|
return this.tree = this.formatList([res.data])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.form.files = []
|
||||||
|
this.form.groupId = ''
|
||||||
|
this.form.groupName = ''
|
||||||
|
this.form.content = ''
|
||||||
|
this.form.eventStatus = ''
|
||||||
|
this.forwardForm.content = ''
|
||||||
|
this.forwardForm.girdId = ''
|
||||||
|
this.forwardForm.girdName = ''
|
||||||
|
this.forwardForm.girdMemberId = ''
|
||||||
|
this.forwardForm.girdMemberName = ''
|
||||||
|
this.forwardForm.name = ''
|
||||||
|
},
|
||||||
|
|
||||||
|
formatList(list) {
|
||||||
|
for (let item of list) {
|
||||||
|
item.children = [item.girdList, item.girdMemberList?.map(e => ({
|
||||||
|
...e, isUser: true, girdName: item.girdName,
|
||||||
|
girdId: item.id
|
||||||
|
})) || []].flat()
|
||||||
|
if (item.girdList?.length > 0) {
|
||||||
|
this.formatList(item.girdList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNode(value, data = {}) {
|
||||||
|
if (!value) return true
|
||||||
|
return ["girdName", "name", "phone"].some(e => data[e]?.includes(value))
|
||||||
|
},
|
||||||
|
|
||||||
|
onTreeChange(e) {
|
||||||
|
this.gridInfo = e
|
||||||
|
},
|
||||||
|
|
||||||
|
onForwardConfirm() {
|
||||||
|
this.$refs.forwardForm.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/appclapeventinfo/transferByManager', {
|
||||||
|
...this.forwardForm,
|
||||||
|
id: this.$route.query.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShowForward = false
|
||||||
|
this.getDetail()
|
||||||
|
this.$message.success('转交成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
if (this.gridInfo.userId) {
|
||||||
|
this.forwardForm.girdId = this.gridInfo.girdId
|
||||||
|
this.forwardForm.girdName = this.gridInfo.girdName
|
||||||
|
this.forwardForm.girdMemberId = this.gridInfo.id
|
||||||
|
this.forwardForm.girdMemberName = this.gridInfo.name
|
||||||
|
} else {
|
||||||
|
this.forwardForm.girdId = this.gridInfo.id
|
||||||
|
}
|
||||||
|
this.forwardForm.girdName = this.gridInfo.girdName
|
||||||
|
this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}`
|
||||||
|
this.isShowUser = false
|
||||||
|
},
|
||||||
|
getDict() {
|
||||||
|
this.instance.post(`/app/appclapeventgroup/list?current=1&size=100000`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.dictList = res.data.records.map(v => {
|
||||||
|
return {
|
||||||
|
dictValue: v.id,
|
||||||
|
dictName: v.groupName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.$confirm('确定关闭该事件?').then(() => {
|
||||||
|
this.instance.post(`/app/appmininotice/delete?ids=${this.$route.query.id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel(isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onChange(e) {
|
||||||
|
this.instance.post(`/app/appvillagerintegralrule/list?size=1000&classification=${e}&ruleStatus=1`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.form.ruleId = ''
|
||||||
|
this.eventList = res.data.records
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
initMap() {
|
||||||
|
let {lng, lat} = this.detail
|
||||||
|
let center = [lng, lat]
|
||||||
|
AMapLoader.load({
|
||||||
|
key: 'b553334ba34f7ac3cd09df9bc8b539dc',
|
||||||
|
version: '2.0'
|
||||||
|
}).then(AMap => {
|
||||||
|
let map = new AMap.Map('map', {
|
||||||
|
center,
|
||||||
|
zoom: 14
|
||||||
|
})
|
||||||
|
let marker = new AMap.Marker({
|
||||||
|
position: new AMap.LngLat(lng, lat),
|
||||||
|
title: this.detail.address
|
||||||
|
})
|
||||||
|
map.add(marker)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleEvent() {
|
||||||
|
this.$refs.form.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/appclapeventinfo/finishByManager', {
|
||||||
|
...this.form,
|
||||||
|
groupName: this.dictList.filter(v => v.dictValue === this.form.groupId)[0].dictName,
|
||||||
|
id: this.$route.query.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShowAdd = false
|
||||||
|
this.getDetail()
|
||||||
|
this.$message.success('处理成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.reportAtWillDetail {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.grid-wrapper {
|
||||||
|
min-height: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-btns {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-tree ) {
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
.el-tree-node__expand-icon.is-leaf {
|
||||||
|
color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content > .el-tree-node__expand-icon {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree__empty-text {
|
||||||
|
color: #222;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__children .el-tree-node__content {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tree-node__content:hover {
|
||||||
|
background: #E8EFFF;
|
||||||
|
color: #222222;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-current > .el-tree-node__content {
|
||||||
|
&:hover {
|
||||||
|
background: #2266FF;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
background: #2266FF;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-steps {
|
||||||
|
:deep( .el-step__icon ) {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #555555;
|
||||||
|
border-color: #d0d4dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__head.is-finish ) {
|
||||||
|
.el-step__icon.is-text {
|
||||||
|
border: none;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
background: #2266ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__line ) {
|
||||||
|
background-color: #d0d4dc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imgs {
|
||||||
|
font-size: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 108px;
|
||||||
|
height: 108px;
|
||||||
|
margin-right: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-of-type(2n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .report-dialog ) {
|
||||||
|
.el-select {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-step__head.is-process ) {
|
||||||
|
color: #555;
|
||||||
|
border-color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .is-finish h2 ) {
|
||||||
|
color: #2266ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-title {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-content__wrapper {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.detail-content__wrapper--left {
|
||||||
|
flex: 1;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .ai-detail__content ) {
|
||||||
|
background: #f3f6f9;
|
||||||
|
|
||||||
|
.ai-detail__content--wrapper {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
& > .el-card {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rightZone {
|
||||||
|
width: 400px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep( .el-card ) {
|
||||||
|
.el-card__header {
|
||||||
|
padding: 12px 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-card__body {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#amap {
|
||||||
|
width: 466px;
|
||||||
|
height: 232px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-steps {
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imgFormItem > .el-form-item__content {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-image__inner {
|
||||||
|
width: 82px;
|
||||||
|
height: 82px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
150
packages/conv/AppReportAiWill/components/List.vue
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list>
|
||||||
|
<template #title>
|
||||||
|
<ai-title :title="menuName" isShowBottomBorder>
|
||||||
|
<el-button type="primary" slot="rightBtn" @click="toSetting">设置</el-button>
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-search-bar>
|
||||||
|
<template #left>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.eventStatus"
|
||||||
|
clearable
|
||||||
|
placeholder="处理状态"
|
||||||
|
:selectList="dict.getDict('clapEventStatus')"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input
|
||||||
|
v-model="search.content"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入内容描述/上报居民/联系方式"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.content = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table :tableData="tableData" :colConfigs="colConfigs" :total="total" :current.sync="search.current" :size.sync="search.size" @getList="getList">
|
||||||
|
<el-table-column slot="options" label="操作" fixed="right" width="120" align="center">
|
||||||
|
<div class="table-options" slot-scope="{row}">
|
||||||
|
<el-button type="text" title="详情" @click="toDetail(row.id)">详情</el-button>
|
||||||
|
<el-button type="text" title="删除" @click="handleDelete(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
label: "随手拍",
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
menuName: String
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userList: [],
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
eventStatus: '',
|
||||||
|
content: ''
|
||||||
|
},
|
||||||
|
total: 0,
|
||||||
|
tableData: [],
|
||||||
|
content: '',
|
||||||
|
id: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{prop: 'content', label: '内容描述', width: '300px'},
|
||||||
|
{prop: 'groupName', label: '事件类型', align: 'center'},
|
||||||
|
{prop: 'girdName', label: '所属网格', align: 'center'},
|
||||||
|
{prop: 'createTime', label: '上报时间', align: 'center'},
|
||||||
|
{prop: 'name', label: '上报居民', align: 'center'},
|
||||||
|
{prop: 'phone', label: '联系方式', align: 'center'},
|
||||||
|
{prop: 'eventStatus', label: '处理状态', align: 'center', format: v => this.dict.getLabel('clapEventStatus', v)},
|
||||||
|
{prop: 'processTime', label: '处理时长', align: 'center'},
|
||||||
|
{slot: 'options'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
handleStatusOps() {
|
||||||
|
return this.dict.getDict("reportAtWillHandleStatus").map(e => ({label: e.dictName, value: e.dictValue}))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.dict.load('clapEventStatus').then(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/appclapeventinfo/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toDetail(id) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Detail',
|
||||||
|
params: {
|
||||||
|
id: id || ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
toSetting() {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Setting',
|
||||||
|
params: {
|
||||||
|
id: ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleDelete(ids) {
|
||||||
|
this.$confirm("是否要进行删除?").then(() => {
|
||||||
|
this.instance.post("/app/appclapeventinfo/delete", null, {
|
||||||
|
params: {ids}
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("删除成功!")
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).catch(() => 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
178
packages/conv/AppReportAiWill/components/Setting.vue
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="notice">
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title isShowBack isShowBottomBorder title="事件类型" @onBackClick="cancel(false)"></ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar class="search-bar">
|
||||||
|
<template #left>
|
||||||
|
<el-button size="small" type="primary" icon="iconfont iconAdd" @click="isShowAdd = true">添加事件类型</el-button>
|
||||||
|
</template>
|
||||||
|
<template slot="right">
|
||||||
|
<el-input
|
||||||
|
v-model="search.groupName"
|
||||||
|
class="search-input"
|
||||||
|
size="small"
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
placeholder="请输入事件类型名称"
|
||||||
|
clearable
|
||||||
|
@change="getList"
|
||||||
|
@clear="search.current = 1, search.groupName = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
style="margin-top: 6px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="tags" label="标签">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-tags">
|
||||||
|
<el-tag type="info" v-for="(item, index) in row.tags" size="small" :key="index">{{ item }}</el-tag>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column slot="options" width="120px" fixed="right" label="操作" align="center">
|
||||||
|
<div class="table-options" slot-scope="{ row }">
|
||||||
|
<el-button type="text" @click="edit(row)">编辑</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShowAdd"
|
||||||
|
width="780px"
|
||||||
|
height="580px"
|
||||||
|
:title="id ? '编辑事件类型' : '添加事件类型'"
|
||||||
|
@close="onClose"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right">
|
||||||
|
<el-form-item label="事件类型" prop="groupName" style="width: 100%;" :rules="[{ required: true, message: '请输入事件类型名称', trigger: 'blur' }]">
|
||||||
|
<el-input size="small" :maxlength="10" show-word-limit placeholder="请输入事件类型名称" v-model="form.groupName"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="排序" prop="showIndex" style="width: 100%;" :rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]">
|
||||||
|
<el-input-number size="small" v-model="form.showIndex" :min="1" :max="100" label="请输入排序"></el-input-number>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'List',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
groupName: ''
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
groupName: '',
|
||||||
|
showIndex: ''
|
||||||
|
},
|
||||||
|
id: '',
|
||||||
|
isShowAdd: false,
|
||||||
|
total: 0,
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'groupName', label: '事件类型', align: 'left'},
|
||||||
|
{prop: 'showIndex', label: '排序', align: 'center'},
|
||||||
|
{slot: 'options', label: '操作'}
|
||||||
|
],
|
||||||
|
tableData: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user'])
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.instance.post(`/app/appclapeventgroup/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
edit (e) {
|
||||||
|
this.id = e.id
|
||||||
|
this.form.groupName = e.groupName
|
||||||
|
this.form.showIndex = ''
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isShowAdd = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose () {
|
||||||
|
this.id = ''
|
||||||
|
this.form.showIndex = ''
|
||||||
|
this.form.groupName = ''
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm () {
|
||||||
|
this.$refs.form.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.instance.post(`/app/appclapeventgroup/addOrUpdate`, {
|
||||||
|
...this.form,
|
||||||
|
id: this.id || null
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$message.success('添加成功')
|
||||||
|
this.isShowAdd = false
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel (isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: !!isRefresh
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appclapeventgroup/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
105
packages/conv/AppReturnHomeRegister/AppReturnHomeRegister.vue
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list class="AppReturnHomeRegister" v-if="!isShowDetail">
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="返乡登记" :isShowBottomBorder="false" :fullname.sync="areaName" v-model="areaId" :instance="instance" @change="onAreaChange"></ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="tabs">
|
||||||
|
<el-tabs v-model="currIndex">
|
||||||
|
<el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label">
|
||||||
|
<component :areaId="areaId" :ref="String(i)" v-if="currIndex == i" :is="tab.comp" @change="onChange" lazy :instance="instance" :dict="dict" :permissions="permissions"/>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
<Detail v-else-if="component === 'Detail'" :params="params" :instance="instance" :dict="dict" :permissions="permissions" @change="onChange"></Detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import List from './components/List.vue'
|
||||||
|
import Detail from './components/Detail.vue'
|
||||||
|
import AbnormalList from './components/AbnormalList.vue'
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppReturnHomeRegister',
|
||||||
|
label: '返乡登记',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
List,
|
||||||
|
Detail,
|
||||||
|
AbnormalList
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
permissions: Function
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
tabs () {
|
||||||
|
const tabList = [
|
||||||
|
{label: '返乡登记', name: 'List', comp: List, permission: ''},
|
||||||
|
// {label: '历史异常人员', name: 'AbnormalList', comp: AbnormalList, permission: ''}
|
||||||
|
]
|
||||||
|
|
||||||
|
return tabList
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
activeName: 'JoinEvent',
|
||||||
|
currIndex: '0',
|
||||||
|
component: 'List',
|
||||||
|
params: {},
|
||||||
|
areaId: '',
|
||||||
|
isShowDetail: false,
|
||||||
|
areaName: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.areaId = this.user.info.areaId
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onChange (data) {
|
||||||
|
if (data.type === 'Detail') {
|
||||||
|
this.component = 'Detail'
|
||||||
|
this.isShowDetail = true
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
if (data.type === 'AbnormalList') {
|
||||||
|
this.component = 'AbnormalList'
|
||||||
|
this.isShowDetail = false
|
||||||
|
this.params = data.params
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === 'List') {
|
||||||
|
this.component = 'List'
|
||||||
|
this.isShowDetail = false
|
||||||
|
this.params = data.params
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (data.isRefresh) {
|
||||||
|
this.$refs.component.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onAreaChange () {
|
||||||
|
this.$refs[this.currIndex][0].changeArea()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.AppReturnHomeRegister {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
200
packages/conv/AppReturnHomeRegister/components/AbnormalList.vue
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
<template>
|
||||||
|
<ai-list isTabs>
|
||||||
|
<template slot="content">
|
||||||
|
<ai-search-bar bottomBorder>
|
||||||
|
<template #left>
|
||||||
|
<ai-select
|
||||||
|
v-model="search.status"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择健康状态"
|
||||||
|
:selectList="dictList"
|
||||||
|
@change="search.current = 1, getList()">
|
||||||
|
</ai-select>
|
||||||
|
<ai-download :instance="instance" url="/app/appepidemicbackhomerecord/export" :params="param" fileName="返乡登记" :disabled="tableData.length == 0">
|
||||||
|
<el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button>
|
||||||
|
</ai-download>
|
||||||
|
</template>
|
||||||
|
<template #right>
|
||||||
|
<el-input
|
||||||
|
v-model="search.name"
|
||||||
|
size="small"
|
||||||
|
placeholder="请输入姓名"
|
||||||
|
clearable
|
||||||
|
v-throttle="() => {search.current = 1, getList()}"
|
||||||
|
@clear="search.current = 1, search.name = '', getList()"
|
||||||
|
suffix-icon="iconfont iconSearch">
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</ai-search-bar>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
v-loading="loading"
|
||||||
|
style="margin-top: 16px;"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="options" width="140px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="toDetail(row.id)">详情</el-button>
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
|
export default {
|
||||||
|
name: 'AbnormalList',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10,
|
||||||
|
name: '',
|
||||||
|
arriveAreaId: '',
|
||||||
|
status: ''
|
||||||
|
},
|
||||||
|
dictList: [{
|
||||||
|
dictName: '异常',
|
||||||
|
dictValue: '0'
|
||||||
|
}, {
|
||||||
|
dictName: '正常',
|
||||||
|
dictValue: '1'
|
||||||
|
}],
|
||||||
|
info: {},
|
||||||
|
colConfigs: [
|
||||||
|
{ prop: 'name', label: '姓名' },
|
||||||
|
{ prop: 'phone', align: 'center', label: '手机号码' },
|
||||||
|
{ prop: 'startTime', align: 'center', label: '出发时间', format: v => v.substr(0, v.length - 3) },
|
||||||
|
{
|
||||||
|
prop: 'startAreaName',
|
||||||
|
align: 'center',
|
||||||
|
label: '出发地区'
|
||||||
|
},
|
||||||
|
{ prop: 'arriveTime', align: 'center', label: '到达时间', format: v => v.substr(0, v.length - 3) },
|
||||||
|
{
|
||||||
|
prop: 'arriveAreaName',
|
||||||
|
align: 'center',
|
||||||
|
label: '到达地区'
|
||||||
|
},
|
||||||
|
{ prop: 'checkTime', align: 'center', label: '核酸日期', format: v => v.split(' ')[0] },
|
||||||
|
{
|
||||||
|
prop: 'status',
|
||||||
|
align: 'center',
|
||||||
|
label: '健康状态',
|
||||||
|
render: (h, {row}) => {
|
||||||
|
return h('span', {
|
||||||
|
style: {
|
||||||
|
color: row.status === '0' ? 'red' : '#333'
|
||||||
|
}
|
||||||
|
}, row.status === '0' ? '异常' : '正常')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
ids: [],
|
||||||
|
tableData: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
disabledLevel: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState(['user']),
|
||||||
|
|
||||||
|
param () {
|
||||||
|
return this.search
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
this.disabledLevel = this.user.info.areaList.length - 1
|
||||||
|
this.search.arriveAreaId = this.user.info.areaId
|
||||||
|
this.loading = true
|
||||||
|
this.dict.load(['marriageType', 'marriagePersonType', 'modeType']).then(() => {
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appepidemicbackhomerecord/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
this.loading = false
|
||||||
|
} else {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
|
||||||
|
this.getTotalInfo()
|
||||||
|
},
|
||||||
|
|
||||||
|
toDetail (id) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'Detail',
|
||||||
|
params: {
|
||||||
|
id: id || ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
changeArea () {
|
||||||
|
this.search.current = 1
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.getList()
|
||||||
|
this.getTotalInfo()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicbackhomerecord/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getTotalInfo()
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
getTotalInfo () {
|
||||||
|
this.instance.post(`/app/appepidemicbackhomerecord/statistic`, null, {
|
||||||
|
params: {
|
||||||
|
areaId: this.search.arriveAreaId
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.info = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
</style>
|
||||||
279
packages/conv/AppReturnHomeRegister/components/Detail.vue
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
<template>
|
||||||
|
<ai-detail isHasSidebar>
|
||||||
|
<template slot="title">
|
||||||
|
<ai-title title="返乡登记详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)">
|
||||||
|
</ai-title>
|
||||||
|
</template>
|
||||||
|
<template slot="content">
|
||||||
|
<AiSidebar :tabTitle="tabList" v-model="currIndex"></AiSidebar>
|
||||||
|
<div v-show="currIndex === 0">
|
||||||
|
<ai-card title="基本信息" v-show="currIndex === 0">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="姓名" :value="info.name"></ai-info-item>
|
||||||
|
<ai-info-item label="填报时间" :value="info.createTime"></ai-info-item>
|
||||||
|
<ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item>
|
||||||
|
<ai-info-item label="手机号码" :value="info.phone"></ai-info-item>
|
||||||
|
<ai-info-item label="人员类别" isLine>
|
||||||
|
<span :style="(info.type == 0 || info.type == 3 || info.type ==6 || info.type == 9)? 'color:#42D784;' : 'color:#f46;'">{{dict.getLabel('epidemicRecentPersonType', info.type)}}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="行程信息">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="出发时间" :value="info.startTime"></ai-info-item>
|
||||||
|
<ai-info-item label="出发地区" >
|
||||||
|
<span :style="{color: info.denger == 1 ? '#FF4466' : '#333'}">{{info.startAreaName}} </span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="出发地址" isLine :value="info.startAddress"></ai-info-item>
|
||||||
|
<ai-info-item label="出行方式" :value="dict.getLabel('epidemicRecentTravel', info.travelType)"></ai-info-item>
|
||||||
|
<ai-info-item label="行程描述" isLine :value="info.description"></ai-info-item>
|
||||||
|
<ai-info-item label="到达时间" :value="info.arriveTime"></ai-info-item>
|
||||||
|
<ai-info-item label="到达地区" :value="info.arriveAreaName"></ai-info-item>
|
||||||
|
<ai-info-item label="返乡地址" isLine :value="info.arriveAddress"></ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="健康状况">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="当前体温">
|
||||||
|
<span :style="info.temperature >= 37.3 ? 'color:#f46;' : ''">{{ info.temperature + '℃' }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="14天内是否接触新冠确诊或疑似患者">
|
||||||
|
<span :class="'color-'+info.touchInFourteen">{{$dict.getLabel('epidemicTouchInFourteen', info.touchInFourteen)}}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="当前健康状况">
|
||||||
|
<span></span>
|
||||||
|
<span v-for="(item, index) in info.health" :key="index" :style="item != 0 ? 'color:#FF4466;' : ''"><span v-if="index>0">;</span>{{$dict.getLabel('epidemicRecentHealth', item)}}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="核酸检测">
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="检测日期" :value="info.checkTime && info.checkTime.split(' ')[0]"></ai-info-item>
|
||||||
|
<ai-info-item label="检测结果">
|
||||||
|
<span :style="info.checkResult == 1 ? 'color:#f46;' : 'color:#42D784;'">{{$dict.getLabel('epidemicRecentTestResult', info.checkResult)}}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="本人健康码截图" isLine>
|
||||||
|
<ai-uploader
|
||||||
|
:instance="instance"
|
||||||
|
v-model="info.checkPhoto"
|
||||||
|
disabled
|
||||||
|
:limit="9">
|
||||||
|
</ai-uploader>
|
||||||
|
</ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
</div>
|
||||||
|
<div v-show="currIndex === 1">
|
||||||
|
<ai-card title="异常处理">
|
||||||
|
<template #right>
|
||||||
|
<el-button type="primary" v-if="info.status === '0'" @click="release">解除异常</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-wrapper
|
||||||
|
label-width="120px">
|
||||||
|
<ai-info-item label="姓名" :value="info.name"></ai-info-item>
|
||||||
|
<ai-info-item label="填报时间" :value="info.createTime"></ai-info-item>
|
||||||
|
<ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item>
|
||||||
|
<ai-info-item label="手机号码" :value="info.phone"></ai-info-item>
|
||||||
|
<ai-info-item label="人员类别" isLine :value="dict.getLabel('epidemicRecentPersonType', info.type)"></ai-info-item>
|
||||||
|
<ai-info-item label="异常状况" isLine>
|
||||||
|
<span :style="{color: info.unusual ? 'red' : '#333'}">{{ info.unusual || '-' }}</span>
|
||||||
|
</ai-info-item>
|
||||||
|
<ai-info-item label="异常解除人" v-if="info.releaseName && info.status === '1'" :value="info.releaseName"></ai-info-item>
|
||||||
|
<ai-info-item label="异常解除时间" v-if="info.releaseTime && info.status === '1'" :value="info.releaseTime"></ai-info-item>
|
||||||
|
</ai-wrapper>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-card title="异常情况记录">
|
||||||
|
<template #right>
|
||||||
|
<el-button type="primary" v-if="info.status === '0'" @click="isShow = true">添加记录</el-button>
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<ai-table
|
||||||
|
:tableData="tableData"
|
||||||
|
:col-configs="colConfigs"
|
||||||
|
:total="total"
|
||||||
|
:current.sync="search.current"
|
||||||
|
:size.sync="search.size"
|
||||||
|
@getList="getList">
|
||||||
|
<el-table-column slot="options" width="120px" fixed="right" label="操作" align="center">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<div class="table-options">
|
||||||
|
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</ai-table>
|
||||||
|
</template>
|
||||||
|
</ai-card>
|
||||||
|
<ai-dialog
|
||||||
|
:visible.sync="isShow"
|
||||||
|
width="800px"
|
||||||
|
@close="form.content = ''"
|
||||||
|
title="添加异常记录"
|
||||||
|
@onConfirm="onConfirm">
|
||||||
|
<el-form class="ai-form" label-width="120px" :model="form" ref="form">
|
||||||
|
<el-form-item label="异常记录" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入异常记录' }]">
|
||||||
|
<el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入异常记录" show-word-limit></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ai-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ai-detail>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'Detail',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
instance: Function,
|
||||||
|
dict: Object,
|
||||||
|
params: Object
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
total: 0,
|
||||||
|
info: {},
|
||||||
|
id: '',
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
content: ''
|
||||||
|
},
|
||||||
|
isShow: false,
|
||||||
|
currIndex: 0,
|
||||||
|
tableData: [],
|
||||||
|
colConfigs: [
|
||||||
|
{prop: 'content', label: '异常记录', align: 'center' },
|
||||||
|
{prop: 'createTime', label: '创建时间', align: 'center'},
|
||||||
|
{prop: 'createUserName', label: '记录人', align: 'center' }
|
||||||
|
],
|
||||||
|
tabList: ['基本信息', '异常处理']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created () {
|
||||||
|
if (this.params && this.params.id) {
|
||||||
|
this.id = this.params.id
|
||||||
|
this.$dict.load(['epidemicRecentHealth', 'epidemicRecentTravel', 'epidemicTouchInFourteen', 'epidemicRecentPersonType', 'epidemicRecentTestResult']).then(() => {
|
||||||
|
this.getInfo(this.params.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getInfo (id) {
|
||||||
|
this.instance.post(`/app/appepidemicbackhomerecord/queryDetailById?id=${id}`).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.info = res.data
|
||||||
|
this.info.checkPhoto = res.data.checkPhoto ? JSON.parse(res.data.checkPhoto) : []
|
||||||
|
let healthName = ''
|
||||||
|
this.info.isHealth = false
|
||||||
|
res.data.health.split(',').forEach(v => {
|
||||||
|
if (v > 0) {
|
||||||
|
this.info.isHealth = true
|
||||||
|
}
|
||||||
|
healthName = healthName + this.$dict.getLabel('epidemicRecentHealth', v)
|
||||||
|
})
|
||||||
|
this.info.healthName = healthName
|
||||||
|
this.info.health = this.info.health.split(',')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
release () {
|
||||||
|
this.$confirm('确定解除异常?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicbackhomerecord/release?recordId=${this.params.id}`, {
|
||||||
|
id: this.params.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('解除异常成功!')
|
||||||
|
this.currIndex = 0
|
||||||
|
this.getInfo(this.params.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
remove(id) {
|
||||||
|
this.$confirm('确定删除该数据?').then(() => {
|
||||||
|
this.instance.post(`/app/appepidemicunusuallog/delete?ids=${id}`).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success('删除成功!')
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
onConfirm() {
|
||||||
|
this.$refs.form.validate(v => {
|
||||||
|
if (v) {
|
||||||
|
this.instance.post('/app/appepidemicunusuallog/addOrUpdate', {
|
||||||
|
...this.form,
|
||||||
|
recordId: this.params.id
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.isShow = false
|
||||||
|
this.getList()
|
||||||
|
this.$message.success('添加成功!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
getList () {
|
||||||
|
this.instance.post(`/app/appepidemicunusuallog/list`, null, {
|
||||||
|
params: {
|
||||||
|
...this.search,
|
||||||
|
recordId: this.params.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.tableData = res.data.records
|
||||||
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel () {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'List',
|
||||||
|
isRefresh: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.color-0{
|
||||||
|
color: #42D784;
|
||||||
|
}
|
||||||
|
.color-1{
|
||||||
|
color: #f46;
|
||||||
|
}
|
||||||
|
.color-2{
|
||||||
|
color: #1365DD;
|
||||||
|
}
|
||||||
|
</style>
|
||||||