Compare commits
395 Commits
temp0516
...
dev/dev_sh
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e28d579d1 | ||
|
|
1c96522447 | ||
| ea0332851d | |||
| a25a7dc023 | |||
|
|
b4fe1ca199 | ||
|
|
b315ae5644 | ||
|
|
8d6e3e9644 | ||
|
|
be1119be6f | ||
|
|
b836e7fd67 | ||
| a237b4041d | |||
| ea4cd29723 | |||
| 13397fa1f7 | |||
| 2fab472150 | |||
| 8c71b4845a | |||
| b70f909a32 | |||
|
|
9f064609e7 | ||
|
|
fd10d4dbc4 | ||
|
|
fadb5faf0d | ||
| e5e514b522 | |||
| 74e6d5a1da | |||
| 3cf0570912 | |||
|
|
8da51a0a82 | ||
|
|
37ff7fbb91 | ||
|
|
8c20b51e13 | ||
| 391a28d659 | |||
| 4535fb7dfb | |||
| 546d1b4c44 | |||
| 5fe605c130 | |||
| 4408c0ecc6 | |||
| 49f08d1191 | |||
| 903bafb245 | |||
| 59b02b3f28 | |||
| 4a23e33080 | |||
| 1e1b06fc48 | |||
| 7c56d2bf4e | |||
| 4add0a806c | |||
| c9bb7fe502 | |||
| a8a7a129c9 | |||
| c3c5532cb5 | |||
| 78bfc16287 | |||
|
|
6c6162df74 | ||
|
|
a837aff0fb | ||
|
|
f673afc7fc | ||
|
|
0ea96c728c | ||
|
|
77e71e3296 | ||
|
|
ce870b9acf | ||
|
|
7f889b54e0 | ||
|
|
ebd596d0d2 | ||
| 04ce95caa4 | |||
| 29bf172187 | |||
|
|
41619febb9 | ||
|
|
0f4b769d49 | ||
| 66cd8217b9 | |||
| e684c4e547 | |||
| c439f41d69 | |||
| 823e96b014 | |||
| 0cca24ee30 | |||
| 66cccd0867 | |||
| 463ddf3cb2 | |||
|
|
f0e0987f31 | ||
|
|
16bea58ab5 | ||
|
|
f2bbbaaeb6 | ||
|
|
5098f6f4a1 | ||
|
|
bc1815ae1b | ||
| 6256c90958 | |||
| f0bfe249e0 | |||
| 7bbfd7c506 | |||
| 3c7cbe28a1 | |||
| c834aacf3a | |||
| 90b0ef41e3 | |||
|
|
2aeeec4468 | ||
| a7c5723e10 | |||
|
|
ba595b9d2c | ||
|
|
d9118aaf93 | ||
| 1bdc71998b | |||
| a597f7a67a | |||
| 195964ef5a | |||
|
|
c27ca77717 | ||
|
|
7d0d460e5c | ||
| 5ac9df3056 | |||
| b8d64f1f28 | |||
| c8dd9664be | |||
| 8899a3a6bb | |||
|
|
67f56f9b84 | ||
|
|
fd12b9e571 | ||
| fb329c94aa | |||
| 16d06582ee | |||
|
|
6f98f111dd | ||
|
|
51a1c1d8e1 | ||
|
|
8445c23984 | ||
| 961f8f874e | |||
| 283b6244b1 | |||
| f19a15dbe8 | |||
| 791d44df02 | |||
|
|
28e67db78d | ||
|
|
63a120c652 | ||
|
|
f60cabbbc0 | ||
| 06db759749 | |||
|
|
373608d989 | ||
|
|
45e3dde03f | ||
|
|
3625180a6e | ||
| aae1442a6f | |||
| 08dcd03468 | |||
|
|
deda511e32 | ||
|
|
9bcf615b4b | ||
|
|
70912c4c43 | ||
|
|
fa013c1974 | ||
| 11fbeb1ed0 | |||
| f432b8cce6 | |||
|
|
05ddd33bcd | ||
|
|
9f5c901502 | ||
| 33d5d3a2ea | |||
| 2668dd3c47 | |||
| 2bc5fef175 | |||
| ea92e1f20d | |||
| 9f1cf1d90e | |||
| b43f9baead | |||
|
|
41ffe335fc | ||
|
|
56d0dcd25f | ||
|
|
4304acbe6f | ||
| 2f1b22d423 | |||
| 3eb8626831 | |||
| 5a86f2e649 | |||
| 93e9c61943 | |||
|
|
c5e9941adb | ||
| 56679808e9 | |||
|
|
40f5705e7a | ||
|
|
32975d9900 | ||
|
|
72db49e7f5 | ||
|
|
472f5e65b4 | ||
| e2f8fb082c | |||
| a47e53b19e | |||
| c01acec9e6 | |||
| 969d7586fc | |||
| 31a40ff7ca | |||
| afb9c99228 | |||
| 8ee6a529a0 | |||
| cebc05d132 | |||
| d23ac82b1b | |||
| e86b576050 | |||
| 8a774aa328 | |||
| c5da68dc47 | |||
| 28df672a7d | |||
| 203c88dd70 | |||
| fa86a2af45 | |||
| ac28ba233c | |||
|
|
47dc2bfc6e | ||
| 085dac0630 | |||
| 7b27b1362d | |||
| 704e3c25bf | |||
| 7e5b10aab3 | |||
| 3ccbd8f905 | |||
| 89a234e77d | |||
| 388dd54bfa | |||
| 035c4412f1 | |||
| d4eb7c846b | |||
| fef50d7a37 | |||
| e5a95972a5 | |||
|
|
36a796b38b | ||
| 94927ae0a4 | |||
| 4d7153661c | |||
| 76062136d6 | |||
| ea4ba74989 | |||
|
|
5a09d7a195 | ||
|
|
e0332b9ddf | ||
|
|
685ba09f7d | ||
|
|
7aa1fc0342 | ||
|
|
653264151a | ||
|
|
fada00c738 | ||
| a10d30337a | |||
| 85ffed114b | |||
| 1093ac68b6 | |||
| 71e6abd816 | |||
| 00c948116e | |||
| b6efd598bd | |||
| bfe7ad4aa6 | |||
| 018ccef46a | |||
| feb836f849 | |||
| 0106f21b86 | |||
| 1b5f64785d | |||
| 77a4aee88e | |||
|
|
ce1e2f3eab | ||
|
|
75fbd2844b | ||
|
|
832f331603 | ||
| 9a2d58d922 | |||
|
|
34c4cd47ef | ||
| c46f65600f | |||
| 56ebcfbce2 | |||
| aa1eb7411e | |||
| 4626ea3c55 | |||
| 5858f7dcf1 | |||
| 440dfdcceb | |||
| 36e41ecd89 | |||
| e1b08a9979 | |||
| b9041d9c09 | |||
| 037a0d12ff | |||
| 956b72729f | |||
| 9b185e6919 | |||
|
|
f77de3a1f4 | ||
| f03d32030d | |||
|
|
6a098ffa13 | ||
|
|
12c10167f1 | ||
|
|
679b213b6f | ||
|
|
6fa6c38398 | ||
| 925da9fa03 | |||
| 8f0d45adf9 | |||
| 505288fdb7 | |||
| 44e045ece3 | |||
| 429fdad2b7 | |||
| 46fbbd747e | |||
| 803bdfd291 | |||
|
|
6cbc4882fa | ||
|
|
54f8d4b5e0 | ||
|
|
314ad7a4f8 | ||
|
|
a56510c35a | ||
|
|
c2e2140ce6 | ||
| 83915d332f | |||
| 751aeb785d | |||
| 7cadab9345 | |||
|
|
8a7b64dd65 | ||
|
|
4c598200e5 | ||
|
|
d052918725 | ||
|
|
8fd6a3462e | ||
|
|
11eb6595dd | ||
|
|
0adfcb745d | ||
|
|
779e1e8be3 | ||
|
|
5297880c3b | ||
|
|
6028ef8cdd | ||
|
|
c7de1779bd | ||
|
|
95bfb00a9d | ||
|
|
5fc50f2d96 | ||
|
|
22d7395e11 | ||
|
|
3d4ea89516 | ||
|
|
2ed63cafd0 | ||
|
|
701652c6b2 | ||
|
|
df66b51e5c | ||
|
|
0c6187a759 | ||
|
|
2d6867b729 | ||
|
|
0b8d0a1843 | ||
| 64c7b8c1fd | |||
|
|
42f1d47f82 | ||
|
|
9ca0cd7c43 | ||
|
|
4c187d1fbd | ||
|
|
733de89883 | ||
|
|
0e1a5a70df | ||
| 5ecebd5117 | |||
| c6626b230a | |||
|
|
1cab7332f9 | ||
|
|
c1d88943a9 | ||
| bc85e561d2 | |||
|
|
be8968605b | ||
| 569c2e719f | |||
|
|
5fa7e36dc2 | ||
|
|
4a533b3cf0 | ||
| d2129459fe | |||
|
|
9784d07680 | ||
|
|
a71fa4df51 | ||
|
|
ce384dbba9 | ||
|
|
dd8f5696a2 | ||
|
|
4211bce256 | ||
|
|
bc240cd2ee | ||
|
|
f869f8eb10 | ||
|
|
9b438c78a3 | ||
| a5b435b80f | |||
| a64d4e30de | |||
| 0759452381 | |||
|
|
58a78a5366 | ||
|
|
9bd695a24d | ||
| e614e3a07a | |||
|
|
8c65592394 | ||
|
|
e093d694fd | ||
|
|
a5bfc4e41d | ||
| be001477ce | |||
| 3e150b2067 | |||
| 8ea06c05e9 | |||
|
|
9b589eece6 | ||
|
|
ba4388b87d | ||
|
|
5b3a668ce7 | ||
| aacbe92cdc | |||
| 57ab6c64ef | |||
| ffaef2ff6c | |||
| 5113cb0606 | |||
| 30d5466805 | |||
| 8457a61ded | |||
| e7f9b77fe5 | |||
|
|
6c0f65b801 | ||
|
|
ad1fa0e4c2 | ||
| 227c742f0d | |||
| c317942447 | |||
|
|
a6f02bf22f | ||
| 4f12aa92b6 | |||
| e6a2ce2b69 | |||
|
|
1f0439c7f9 | ||
|
|
676ef74bdc | ||
|
|
b2bc47da99 | ||
|
|
02787db0a1 | ||
| 19524520f4 | |||
| 2a2c4b1d39 | |||
| 257c99698e | |||
| 8ff8a7480f | |||
| 5e1ff16052 | |||
| dbd89798d5 | |||
| b5b6f737aa | |||
| 1d60a6a129 | |||
| 0017568cc7 | |||
|
|
375f717721 | ||
|
|
18914bea7e | ||
| fc48d8931f | |||
| 619d33b412 | |||
| 1a48527c70 | |||
|
|
ee68a5d782 | ||
|
|
3a29d25060 | ||
| 77f514a03b | |||
| 954f6207ec | |||
| 891f6fb15f | |||
| 49b086ad10 | |||
| 86e7119cfb | |||
|
|
775ae3266c | ||
| 1aea8e93f2 | |||
| 804dc9b1b4 | |||
| bd543e56d5 | |||
|
|
3dc7866fba | ||
|
|
ffd371e5b4 | ||
|
|
40aad9d1a3 | ||
| 709393a9a6 | |||
| fb8de15eca | |||
| f4e9a3474a | |||
|
|
890389843f | ||
| db04267591 | |||
| 5ff2bf11d7 | |||
| 76618de386 | |||
| eda92b3f0b | |||
|
|
b1b4b4147c | ||
|
|
4ba5f63a62 | ||
|
|
8b274b2822 | ||
| 54cbaf4b80 | |||
| c688af01f2 | |||
|
|
37de7d9276 | ||
|
|
02b3a407a9 | ||
| 5ebf0669f5 | |||
|
|
031d71bf99 | ||
|
|
205f0d54c5 | ||
|
|
50e46fed02 | ||
|
|
1303b1805a | ||
|
|
2845c2c8b9 | ||
|
|
cd817dbf57 | ||
| f9ce559915 | |||
| e40401f61f | |||
|
|
6e64eb741a | ||
|
|
c4a37f5d73 | ||
|
|
8f5a86db0b | ||
|
|
14c99f6c6b | ||
|
|
bf072e35f5 | ||
|
|
b8048704ba | ||
|
|
b6704c3caf | ||
|
|
6b07c84c80 | ||
|
|
980e1547cd | ||
|
|
ae2191f369 | ||
|
|
4b1a58c036 | ||
|
|
4dbd5a1fad | ||
|
|
b063cad764 | ||
|
|
f1eb48ae74 | ||
|
|
7233540ab4 | ||
|
|
e634481113 | ||
|
|
b3591f879d | ||
|
|
12c447d6b0 | ||
|
|
c73876e8b0 | ||
|
|
a726ceca59 | ||
|
|
51db8b4ec2 | ||
|
|
9f4dbda152 | ||
|
|
8e1766eed0 | ||
|
|
f1d67f2f7d | ||
|
|
ebb6577e98 | ||
| 5318e5d32a | |||
| 2aabb2347b | |||
| 3790b8ee72 | |||
| f4766d4ab4 | |||
| d1fab003d2 | |||
| 718198bcfe | |||
|
|
7b83f42ed8 | ||
| f23f4133d0 | |||
|
|
fb29310ba1 | ||
|
|
b86f168fe8 | ||
|
|
a54f7e7c30 | ||
|
|
de865b918f | ||
|
|
d2e917e3ce | ||
|
|
e70580c388 | ||
|
|
7454e16076 | ||
|
|
c3ae729466 | ||
|
|
faeb59bae5 | ||
|
|
5a69a770ac | ||
|
|
d1772be737 | ||
|
|
95aee1daae | ||
|
|
9bae02406c | ||
|
|
fda2a3120b |
9
files/COD-public-key.txt
Normal file
9
files/COD-public-key.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymkBAWixxUi9IAeMWgsq
|
||||||
|
K92AzFbe0qzzYPdkoh15ymL2A5MkYH7asnhFwclgdiFmd9a0TbZP+t/SzWW8UUzN
|
||||||
|
1pXoEp48R+eguGTt5xkJwb10+H6quVXF/Ezzid5yzVW3dcYRp8qUlFr0XBpvkK9l
|
||||||
|
FpPzh2+mwVEAsgBMXq/K50ZiX2dlkPZ7ffkVPWaK2ESIo3YgfM6dmiiza0hPWJ35
|
||||||
|
UgTH5rwJ7vN3IdOJTlkQOvrIrj2ocPcrudeEwqybIbCGhgRBwQSBsXQOO4U//rE4
|
||||||
|
VU+0LF/3uQgXkvVY1+a1JLiTncZYKGEQ/NtxM+dGtYWV2gPhQRyJ7Z77OX0XCbcn
|
||||||
|
zwIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1XpZ0+EIoJvQk
|
|
||||||
GHAdpcpr35S+UnxNdOE+1sZsIDWuyzXG0d6vOudITmYFTqVzJRaAArhwp+NQ/R9y
|
|
||||||
onsuUsEc0x2qTntySYMedHfI2TSl6qTsqpHykSLr6u0E4TuYUiGs/nf3t0A/rEvm
|
|
||||||
KK6OP4vNgUlANhOKDwiCAdmJkiOBEHJwLsN1xlcnBkUR0Wr+uauVo+A0opkM7HrB
|
|
||||||
aXXTcy+gpold+uCgCbRzFCiDr0uKsLJgb3Ce1aXTwa8k2dDg6mzhE0U65yhsNzjC
|
|
||||||
Cqg+g8tfEVha9Nrsmd6hG2iFHnk4rCqRXhjuI1V10GiZUppMWJtGD2tj7ZK0XXKh
|
|
||||||
5sAclu9RAgMBAAECggEBAKSQy8IclKKsHbA2wFwWV6Ijv2olnAYH/G0xId9wJmWQ
|
|
||||||
mx3oxb6Hmt3fzPAZ2UOuLkk+rq4Bl9+fnQ494bk5e2G1KWCjT512mFNk6F9EvmGh
|
|
||||||
k73uUvkeueoIQsG/wHxIYaf/SUlqbBCaPE/9L82AWVDBc36g0n/dfiHAnesWv8JV
|
|
||||||
agiTF/SIWDPtzRaVh8VObFOusHdqnRuLqV7n0FSVJePSNBFSSOz5XTttOtM4whg8
|
|
||||||
kw3jlCHbVMVKtPYcebxGf0vkDapyGJiZ6wc1rD4MXJTciG+WQNfNE+Af2UB606VC
|
|
||||||
Nlq/CRkXr2Ix9ASSMeE4TcH+0EoxeITpP2NV+3hAzgECgYEA7mWSd6HgPXMdwO33
|
|
||||||
efmx0qky+I/4bhicG9Go6021fRY+jUhRcj6VtDWBzuZwblgTSiDH4t2TbfB+hvQD
|
|
||||||
GVTJNc21+hXEVNu0ajqLuMiCgqaZCeNeJYYYowbLSbYd4t/nQh1vCZ/44aRWqG8G
|
|
||||||
eWEGruMaqSlGyFG7kyaoQaY1X6ECgYEAwsMGiupkNZ/JU3PZd2X2X+37b8BXcIt7
|
|
||||||
itL413GDiLwCNII5pArD7GHYFQzN4GaUCt/VjrRXbTY1xYCk2RA0FyBMsxAGa+eH
|
|
||||||
9iTSLQvDJpxV/44UY3L9ZFcz4t0WjRcsdqPt30yUBNWiAIGcjtae2tMvtfxKICLQ
|
|
||||||
sYXAS+ciMbECgYEA4tnerV5pfq/7QSpw0y4Ky5ZcPXDqiwF6E3LH1dlleTlgnpqR
|
|
||||||
fjAVzp0X/+UCWc4P1PsqmjQU5YnzLMIn7MPkkAFHSEnMQJ+sp2U8rcKHhoG3oVQt
|
|
||||||
s3FOIlwFuAfHmqtLaXuOvM7wSu9R0weLVpdAf8z2AsCXbWlxH86qT4Y0xeECgYBM
|
|
||||||
NJkbw8i//qx8vciqYjf7oxeNy1mrTLhjQldhnSXVW5MVTpsVJ60vkb1Fx0PK+PgW
|
|
||||||
JSzfcIsAzYROqh5WXHO1VMsOCUgp8mcNlayzOXX7ZpJzsvkhTH3/Q+umadGIFTgt
|
|
||||||
l8jcZY9JMPn5br1+WlW/04BImdW7K0QzId1zFZYYkQKBgQDqswTLEpbBDOE/3uk4
|
|
||||||
laZ9kTLJMP/hVmDJ0/jbETMdCkzIORnr3xFxmZIHG17E2In9PVumD0ESCh7qbCDE
|
|
||||||
isbfLSgfJR6ItdOM6W2R0GAsXQ3e0byBpR7qm0j9J3zYRhQwfVbZtkX0uywB9a/4
|
|
||||||
q2bz4491ESrbryx16FZKUJeX8g==
|
|
||||||
-----END PRIVATE KEY-----
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
-----BEGIN PUBLIC KEY-----
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtV6WdPhCKCb0JBhwHaXK
|
|
||||||
a9+UvlJ8TXThPtbGbCA1rss1xtHerzrnSE5mBU6lcyUWgAK4cKfjUP0fcqJ7LlLB
|
|
||||||
HNMdqk57ckmDHnR3yNk0peqk7KqR8pEi6+rtBOE7mFIhrP5397dAP6xL5iiujj+L
|
|
||||||
zYFJQDYTig8IggHZiZIjgRBycC7DdcZXJwZFEdFq/rmrlaPgNKKZDOx6wWl103Mv
|
|
||||||
oKaJXfrgoAm0cxQog69LirCyYG9wntWl08GvJNnQ4Ops4RNFOucobDc4wgqoPoPL
|
|
||||||
XxFYWvTa7JneoRtohR55OKwqkV4Y7iNVddBomVKaTFibRg9rY+2StF1yoebAHJbv
|
|
||||||
UQIDAQAB
|
|
||||||
-----END PUBLIC KEY-----
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD+NUduhLJcb2Z
|
||||||
|
ryLwtIHdmjfh6Wn73E9umHmdPf6yF7IbDoTDBmIAfaPU/oiLgrka3fKGCkn/yHvW
|
||||||
|
QcL+Ry96/Uu+iIN9SbG5vPVvLtLfx+5++IE8p3RxcSDQggqFuJ+osebXeVIrOcTZ
|
||||||
|
s7nXCqGenTcagv2eJESiq712fcBvY1wVgilT6ERVQy+zdvwAOiS6wXF/51AueP+E
|
||||||
|
rNDHuPLkGH6JhLtO4LffeYgM/Th7eCl/WWLkiVMSoeJt7vWFe4bYV/IYW1qI2aQX
|
||||||
|
H1DYmvwgDfDv8jRORD9D191YBqq1l3Tw7VSjFrpydFvSK46dbXKBj3oA5ZiJ+Ttj
|
||||||
|
ZCtBRiOdAgMBAAECggEAUKl4Fs9C8lV1o+85Y3f4yBy1CbCIZhltPGlYDUe6MNWe
|
||||||
|
ApL8REW5Sthr+bx2uW2qAQv/yfosMTL0/eB9gSoNugLODXOlI4mUtI25O/U66M8j
|
||||||
|
NHHWx/9o51SYHBqaeCXg2Y+4I1KVZqNVigH26TNACMhPKQNnnpLxCT/FMSNbdLzo
|
||||||
|
wfFMyjN7R3Hc8ZB1C2zx+fLJm1DNZeOJOHAkW1LprlotRv6eq3lOwZaDDUTB5xhT
|
||||||
|
0Erev3djC/R08Fne1y09ukar8z0tX3Fm9SzHJDFVoh1HOYPWayCiAxOhip+JnFct
|
||||||
|
rtK5jjuB8DAP4Q1k12yOWUFwb6NOG9Hf/G6XExRPBQKBgQD1P2SnKD1IlNSrvVJn
|
||||||
|
2HzKnBVllVo50fbv7SpnP8H1B5vt2Qo/mgOGtzbeXyK4mcLFaWg9++BrsjTXwZFi
|
||||||
|
wmKeJgNI822DPhF5qQhK7Cc+WMwesufGrTnmRUOEFYehz9ffZBvMa1s/ObIEyLcr
|
||||||
|
tYitT74+nFdRPtr+8PN06QMEcwKBgQDMkGFWhSO7p7VMuV0H0uC1fj3GGtVvM+Ps
|
||||||
|
a9ASs0HBhQaOpberkKY9vgry6HoJ8CGvbrxlmc3JoYPRwKN3oQRYLvGSF96HAg9i
|
||||||
|
643FmVAWiVzHpjYX9fMJyCzXiOw6Qet8Zp3Ewaw9BBG0200Fj6/zGc8XEqNjIv5Q
|
||||||
|
DQ9MosRDrwKBgQCU5i5IRugeXy5YLxQPNKNfqDBdgrZLEK2qsgXithUencYQPIw6
|
||||||
|
XVnyut43WO+NwN0+WmcN6xUwjfwDWuTYX0jc2Bt6eUFuQ4r8oKIGSybwdZ1IrjqG
|
||||||
|
p7nVkwwQ77lvhu98FB3EmRHHa1IoEW0Uvp0DDL1m6ikhjNYNn2FRA//u/QKBgGbY
|
||||||
|
a+eo1ldBMPha9Te6wLjeuEYCNa5L41p4tcrBDt0xeSN8k4QRHFNMWYrYcIrQjM77
|
||||||
|
mIJoOjsWFgT9mfHKJToEl/VAROORmJS+Iq/mrYo3E0tY+DdBsygG2Oyf7Uw42iDY
|
||||||
|
IpfKW0Lt6c0IuIeEPwy0vBY4i6aK8Frkxf1ck9oHAoGBAKFQg/c36J6tjnttpmes
|
||||||
|
R/zijp1ROE+z+dMmm3icDhCDvvR6MnHa2Y9ittNWdEUosZk9FsFn62YNtJJV2SIN
|
||||||
|
DDn0ASLtBkeCd8yad5uzUb7Umci9V7TP5c0NE3DK95FmciLGOuRbFyq1Z8edHnaS
|
||||||
|
zgLnf4yb25eCMLEG0Z2ugN3C
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
9
files/Code-Create Limited.merchant.aqs.public.key.pem
Normal file
9
files/Code-Create Limited.merchant.aqs.public.key.pem
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/jVHboSyXG9ma8i8LSB
|
||||||
|
3Zo34elp+9xPbph5nT3+sheyGw6EwwZiAH2j1P6Ii4K5Gt3yhgpJ/8h71kHC/kcv
|
||||||
|
ev1LvoiDfUmxubz1by7S38fufviBPKd0cXEg0IIKhbifqLHm13lSKznE2bO51wqh
|
||||||
|
np03GoL9niREoqu9dn3Ab2NcFYIpU+hEVUMvs3b8ADokusFxf+dQLnj/hKzQx7jy
|
||||||
|
5Bh+iYS7TuC333mIDP04e3gpf1li5IlTEqHibe71hXuG2FfyGFtaiNmkFx9Q2Jr8
|
||||||
|
IA3w7/I0TkQ/Q9fdWAaqtZd08O1Uoxa6cnRb0iuOnW1ygY96AOWYifk7Y2QrQUYj
|
||||||
|
nQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
83
pom.xml
83
pom.xml
@@ -28,7 +28,19 @@
|
|||||||
<jaxb-core>4.0.0</jaxb-core>
|
<jaxb-core>4.0.0</jaxb-core>
|
||||||
<activation>1.1.1</activation>
|
<activation>1.1.1</activation>
|
||||||
<easy-captcha>1.6.2</easy-captcha>
|
<easy-captcha>1.6.2</easy-captcha>
|
||||||
|
<aws.java.sdk.version>2.20.43</aws.java.sdk.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>bom</artifactId>
|
||||||
|
<version>${aws.java.sdk.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
@@ -202,6 +214,13 @@
|
|||||||
<version>20230618</version>
|
<version>20230618</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>2.17.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi</artifactId>
|
<artifactId>poi</artifactId>
|
||||||
@@ -226,6 +245,70 @@
|
|||||||
<version>2.17.1</version>
|
<version>2.17.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.stripe</groupId>
|
||||||
|
<artifactId>stripe-java</artifactId>
|
||||||
|
<version>26.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- aws s3 -->
|
||||||
|
<!-- S3 dependency -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>s3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>s3-transfer-manager</artifactId>
|
||||||
|
<version>2.17.103-PREVIEW</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>kms</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
|
<artifactId>s3control</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.10.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.itextpdf</groupId>
|
||||||
|
<artifactId>itextpdf</artifactId>
|
||||||
|
<version>5.5.13.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.auth</groupId>
|
||||||
|
<artifactId>google-auth-library-oauth2-http</artifactId>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.api-client</groupId>
|
||||||
|
<artifactId>google-api-client</artifactId>
|
||||||
|
<version>1.32.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.oauth-client</groupId>
|
||||||
|
<artifactId>google-oauth-client</artifactId>
|
||||||
|
<version>1.32.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.http-client</groupId>
|
||||||
|
<artifactId>google-http-client-jackson2</artifactId>
|
||||||
|
<version>1.41.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import org.apache.tomcat.jni.Time;
|
|||||||
import org.springframework.amqp.core.Message;
|
import org.springframework.amqp.core.Message;
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -30,6 +31,9 @@ public class GenerateConsumer {
|
|||||||
@Resource
|
@Resource
|
||||||
private GenerateService generateService;
|
private GenerateService generateService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RabbitMQProperties rabbitMQProperties;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
@@ -44,6 +48,10 @@ public class GenerateConsumer {
|
|||||||
|
|
||||||
@Value("${redis.key.generateResult}")
|
@Value("${redis.key.generateResult}")
|
||||||
private String generateResultKey;
|
private String generateResultKey;
|
||||||
|
@Value("${redis.key.toProductImageResultKey}")
|
||||||
|
private String toProductImageResultKey;
|
||||||
|
@Value("${redis.key.relightResultKey}")
|
||||||
|
private String relightResultKey;
|
||||||
|
|
||||||
public void generate(Message msg, Channel channel, String consumerName) {
|
public void generate(Message msg, Channel channel, String consumerName) {
|
||||||
log.info("============start listening==========");
|
log.info("============start listening==========");
|
||||||
@@ -63,23 +71,14 @@ public class GenerateConsumer {
|
|||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
log.error("手动确认,不返回队列重新消费");
|
log.error("手动确认,不返回队列重新消费");
|
||||||
}
|
}
|
||||||
// 2.2 将该消息从取消列表中删除
|
|
||||||
// redisUtil.removeFromSet(cancelSetKey, uniqueId);
|
|
||||||
} else {
|
} else {
|
||||||
// GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO);
|
|
||||||
generateService.generateThroughImageText(generateThroughImageTextDTO);
|
generateService.generateThroughImageText(generateThroughImageTextDTO);
|
||||||
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
|
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
|
||||||
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
|
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
|
||||||
/*if (!Objects.isNull(generateCollectionVO)) {
|
|
||||||
HashMap<String, String> generateResult = new HashMap<>();
|
|
||||||
generateResult.put(uniqueId, JSONObject.toJSONString(generateCollectionVO));
|
|
||||||
// 将结果存在redis中 ,为空时不要存
|
|
||||||
redisUtil.addToMap(resultMapKey, generateResult);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (BusinessException e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMsg());
|
log.error(e.getMessage());
|
||||||
// channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue
|
// channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue
|
||||||
try {
|
try {
|
||||||
// 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。
|
// 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。
|
||||||
@@ -94,7 +93,7 @@ public class GenerateConsumer {
|
|||||||
}
|
}
|
||||||
// 将入参和错误信息存入数据库
|
// 将入参和错误信息存入数据库
|
||||||
String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) +
|
String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) +
|
||||||
" Exception message : " + e.getMsg();
|
" Exception message : " + e.getMessage();
|
||||||
HashMap<String, String> exceptionInfo = new HashMap<>();
|
HashMap<String, String> exceptionInfo = new HashMap<>();
|
||||||
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
|
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
|
||||||
// 存redis
|
// 存redis
|
||||||
@@ -154,63 +153,169 @@ public class GenerateConsumer {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
public void processToProductImageResult(Message msg, Channel channel) {
|
||||||
|
log.info("============processToProductImageResult listening==========");
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
|
||||||
|
log.info("toProductImage response : {}", generateResult);
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
|
||||||
|
if (generateResult.get("status").equals("SUCCESS")) {
|
||||||
|
String url = generateResult.get("image_url");
|
||||||
|
String taskId = generateResult.get("tasks_id");
|
||||||
|
String category = generateResult.get("category");
|
||||||
|
generateService.processToProductImageResult(taskId, url, category);
|
||||||
|
} else {
|
||||||
|
// 修改redis中的数据状态为exception
|
||||||
|
String key = toProductImageResultKey + ":" + generateResult.get("tasks_id");
|
||||||
|
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||||
|
// 将异常信息存到exception中
|
||||||
|
HashMap<String, String> exceptionInfo = new HashMap<>();
|
||||||
|
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
|
||||||
|
// 存redis
|
||||||
|
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
try {
|
||||||
|
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
|
||||||
|
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
|
||||||
|
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
|
||||||
|
} catch (IOException exception) {
|
||||||
|
log.error("手动确认,取消返回队列,不再重新消费");
|
||||||
|
}
|
||||||
|
// 将入参和错误信息存入数据库
|
||||||
|
String exceptionMessage = JSONObject.toJSONString(generateResult) +
|
||||||
|
" Exception message : " + e.getMessage();
|
||||||
|
HashMap<String, String> exceptionInfo = new HashMap<>();
|
||||||
|
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
|
||||||
|
// 存redis
|
||||||
|
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
|
||||||
|
log.info("============ProcessToProductImageResult End listening==========");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processRelightResult(Message msg, Channel channel) {
|
||||||
|
log.info("============processRelightResult listening==========");
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
|
||||||
|
log.info("toProductImage response : {}", generateResult);
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
|
||||||
|
if (generateResult.get("status").equals("SUCCESS")) {
|
||||||
|
String url = generateResult.get("image_url");
|
||||||
|
String taskId = generateResult.get("tasks_id");
|
||||||
|
String category = generateResult.get("category");
|
||||||
|
generateService.processRelightResult(taskId, url, category);
|
||||||
|
} else {
|
||||||
|
// 修改redis中的数据状态为exception
|
||||||
|
String key = relightResultKey + ":" + generateResult.get("tasks_id");
|
||||||
|
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||||
|
// 将异常信息存到exception中
|
||||||
|
HashMap<String, String> exceptionInfo = new HashMap<>();
|
||||||
|
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
|
||||||
|
// 存redis
|
||||||
|
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
try {
|
||||||
|
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
|
||||||
|
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
|
||||||
|
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
|
||||||
|
} catch (IOException exception) {
|
||||||
|
log.error("手动确认,取消返回队列,不再重新消费");
|
||||||
|
}
|
||||||
|
// 将入参和错误信息存入数据库
|
||||||
|
String exceptionMessage = JSONObject.toJSONString(generateResult) +
|
||||||
|
" Exception message : " + e.getMessage();
|
||||||
|
HashMap<String, String> exceptionInfo = new HashMap<>();
|
||||||
|
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
|
||||||
|
// 存redis
|
||||||
|
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
|
||||||
|
log.info("============ProcessRelightResult End listening==========");
|
||||||
|
}
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer1(Message msg, Channel channel) {
|
public void generateConsumer1(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 1");
|
generate(msg, channel, "consumer 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer2(Message msg, Channel channel) {
|
public void generateConsumer2(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 2");
|
generate(msg, channel, "consumer 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer3(Message msg, Channel channel) {
|
public void generateConsumer3(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 3");
|
generate(msg, channel, "consumer 3");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer4(Message msg, Channel channel) {
|
public void generateConsumer4(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 4");
|
generate(msg, channel, "consumer 4");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer5(Message msg, Channel channel) {
|
public void generateConsumer5(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 5");
|
generate(msg, channel, "consumer 5");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer6(Message msg, Channel channel) {
|
public void generateConsumer6(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 6");
|
generate(msg, channel, "consumer 6");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer7(Message msg, Channel channel) {
|
public void generateConsumer7(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 7");
|
generate(msg, channel, "consumer 7");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer8(Message msg, Channel channel) {
|
public void generateConsumer8(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 8");
|
generate(msg, channel, "consumer 8");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer9(Message msg, Channel channel) {
|
public void generateConsumer9(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 9");
|
generate(msg, channel, "consumer 9");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.generateResult}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void getGenerateResult(Message msg, Channel channel) {
|
public void getGenerateResult(Message msg, Channel channel) {
|
||||||
processGenerateResult(msg, channel);
|
processGenerateResult(msg, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageResult}")
|
||||||
|
@RabbitHandler
|
||||||
|
public void getToProductImageResult(Message msg, Channel channel) {
|
||||||
|
processToProductImageResult(msg, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.relightResult}")
|
||||||
|
@RabbitHandler
|
||||||
|
public void getRelightResult(Message msg, Channel channel) {
|
||||||
|
processRelightResult(msg, channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,60 +1,43 @@
|
|||||||
package com.ai.da.common.RabbitMQ;
|
package com.ai.da.common.RabbitMQ;
|
||||||
|
|
||||||
import org.springframework.amqp.core.Queue;
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MQConfig {
|
public class MQConfig {
|
||||||
|
|
||||||
public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange";
|
@Autowired
|
||||||
// public static final String GENERATE_QUEUE = "generate-queue-prod";
|
private RabbitMQProperties rabbitMQProperties;
|
||||||
// public static final String GENERATE_QUEUE = "generate-queue-test";
|
|
||||||
// ==================================================================
|
|
||||||
// public static final String GENERATE_QUEUE = "generate-queue-local";
|
|
||||||
public static final String GENERATE_QUEUE = "generate-queue-dev";
|
|
||||||
|
|
||||||
// public static final String SR_QUEUE = "SR-queue-local";
|
|
||||||
public static final String SR_QUEUE = "SR-queue-dev";
|
|
||||||
|
|
||||||
// public static final String SR_RESULT_QUEUE = "SuperResolution-local";
|
|
||||||
public static final String SR_RESULT_QUEUE = "SuperResolution-dev";
|
|
||||||
|
|
||||||
// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local";
|
|
||||||
public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev";
|
|
||||||
|
|
||||||
public MQConfig() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Bean
|
|
||||||
// FanoutExchange fanoutRasaExchange() {
|
|
||||||
// return new FanoutExchange(GENERATE_EXCHANGE_FANOUT);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建队列,使用工作模式,不用定义交换机
|
|
||||||
*/
|
|
||||||
@Bean
|
@Bean
|
||||||
public Queue generateQueue() {
|
public Queue generateQueue() {
|
||||||
return new Queue(GENERATE_QUEUE);
|
return new Queue(rabbitMQProperties.getQueues().getGenerate());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public Queue SRQueue() {
|
public Queue SRQueue() {
|
||||||
return new Queue(SR_QUEUE);
|
return new Queue(rabbitMQProperties.getQueues().getSr());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public Queue SRResultQueue() {
|
public Queue SRResultQueue() {
|
||||||
return new Queue(SR_RESULT_QUEUE);
|
return new Queue(rabbitMQProperties.getQueues().getSrResult());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Bean
|
||||||
* 将队列绑定到交换机上【队列订阅交换机】
|
public Queue generateResultQueue() {
|
||||||
*/
|
return new Queue(rabbitMQProperties.getQueues().getGenerateResult());
|
||||||
// @Bean
|
}
|
||||||
// Binding bindingExchangeRasa() {
|
|
||||||
// return BindingBuilder.bind(queueRasa()).to(fanoutRasaExchange());
|
@Bean
|
||||||
// }
|
public Queue toProductImageResultQueue() {
|
||||||
|
return new Queue(rabbitMQProperties.getQueues().getToProductImageResult());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue relightResultQueue() {
|
||||||
|
return new Queue(rabbitMQProperties.getQueues().getRelightResult());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.ai.da.common.RabbitMQ;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.amqp.core.AmqpTemplate;
|
import org.springframework.amqp.core.AmqpTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
@@ -10,19 +11,19 @@ import javax.annotation.Resource;
|
|||||||
@Component
|
@Component
|
||||||
public class MQPublisher {
|
public class MQPublisher {
|
||||||
|
|
||||||
// private final String url = "http://localhost:15672/api/queues/%2f/generate-queue";
|
@Autowired
|
||||||
|
private RabbitMQProperties rabbitMQProperties;
|
||||||
|
|
||||||
@Resource
|
@Autowired
|
||||||
private AmqpTemplate amqpTemplate;
|
private AmqpTemplate amqpTemplate;
|
||||||
|
|
||||||
public void sendGenerateMessage(String mm) {
|
public void sendGenerateMessage(String mm) {
|
||||||
log.info("send message: " + mm);
|
log.info("send message: " + mm);
|
||||||
amqpTemplate.convertAndSend(MQConfig.GENERATE_QUEUE, mm);
|
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerate(), mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendSRMessage(String mm) {
|
public void sendSRMessage(String mm) {
|
||||||
log.info("send message: " + mm);
|
log.info("send message: " + mm);
|
||||||
amqpTemplate.convertAndSend(MQConfig.SR_QUEUE, mm);
|
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.ai.da.common.RabbitMQ;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "rabbitmq")
|
||||||
|
@Data
|
||||||
|
public class RabbitMQProperties {
|
||||||
|
|
||||||
|
private Queues queues;
|
||||||
|
private Exchange exchange;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Queues {
|
||||||
|
private String generate;
|
||||||
|
private String sr;
|
||||||
|
private String srResult;
|
||||||
|
private String generateResult;
|
||||||
|
private String toProductImageResult;
|
||||||
|
private String relightResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Exchange {
|
||||||
|
private String generate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.amqp.core.Message;
|
import org.springframework.amqp.core.Message;
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -27,6 +28,9 @@ import java.util.HashMap;
|
|||||||
@Component
|
@Component
|
||||||
public class SRConsumer {
|
public class SRConsumer {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RabbitMQProperties rabbitMQProperties;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
@@ -218,14 +222,13 @@ public class SRConsumer {
|
|||||||
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null);
|
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = MQConfig.SR_QUEUE)
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.sr}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void SRConsumer1(Message msg, Channel channel) {
|
public void SRConsumer1(Message msg, Channel channel) {
|
||||||
superResolution(msg, channel, "consumer 1");
|
superResolution(msg, channel, "consumer 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{rabbitMQProperties.queues.srResult}")
|
||||||
@RabbitListener(queues = MQConfig.SR_RESULT_QUEUE)
|
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void SRResultConsumer1(Message msg, Channel channel) {
|
public void SRResultConsumer1(Message msg, Channel channel) {
|
||||||
getSRResult(msg, channel, "consumer 1");
|
getSRResult(msg, channel, "consumer 1");
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.ai.da.common.config;
|
package com.ai.da.common.config;
|
||||||
|
|
||||||
|
import com.ai.da.common.utils.ExcelReader;
|
||||||
|
import com.ai.da.common.utils.MinioUtil;
|
||||||
import com.ai.da.common.utils.SendEmailUtil;
|
import com.ai.da.common.utils.SendEmailUtil;
|
||||||
import com.ai.da.mapper.primary.AccountMapper;
|
import com.ai.da.mapper.primary.*;
|
||||||
import com.ai.da.mapper.primary.TrialOrderMapper;
|
import com.ai.da.mapper.primary.entity.*;
|
||||||
import com.ai.da.mapper.primary.entity.Account;
|
import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
|
||||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
import com.ai.da.model.enums.StyleEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
@@ -17,15 +21,28 @@ import javax.annotation.PostConstruct;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class MyTaskScheduler {
|
public class MyTaskScheduler {
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void test() {
|
||||||
|
// clearMinio();
|
||||||
|
// addSystemFileStyle();
|
||||||
|
}
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private AccountMapper accountMapper;
|
private AccountMapper accountMapper;
|
||||||
|
|
||||||
@@ -34,7 +51,7 @@ public class MyTaskScheduler {
|
|||||||
|
|
||||||
// 定时任务,每十五天执行一次
|
// 定时任务,每十五天执行一次
|
||||||
// @Scheduled(cron = "0 0 0 ? * MON")
|
// @Scheduled(cron = "0 0 0 ? * MON")
|
||||||
@Scheduled(cron = "0 0 0 */15 * ?")
|
// @Scheduled(cron = "0 0 0 */15 * ?")
|
||||||
public void checkExpiry() {
|
public void checkExpiry() {
|
||||||
// 检测正式用户是否快要过期
|
// 检测正式用户是否快要过期
|
||||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||||
@@ -68,7 +85,7 @@ public class MyTaskScheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Scheduled(cron = "0 0 8 * * ?")
|
// @Scheduled(cron = "0 0 9 * * ?")
|
||||||
public void sendTrialOrderExcelToManagements() {
|
public void sendTrialOrderExcelToManagements() {
|
||||||
// 获取前一天日期
|
// 获取前一天日期
|
||||||
LocalDate yesterday = LocalDate.now().minusDays(1);
|
LocalDate yesterday = LocalDate.now().minusDays(1);
|
||||||
@@ -127,6 +144,242 @@ public class MyTaskScheduler {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
SendEmailUtil.sendNoExcelEmail("1023316923@qq.com", null);
|
||||||
|
SendEmailUtil.sendNoExcelEmail("calvinwong@aidlab.hk", null);
|
||||||
|
SendEmailUtil.sendNoExcelEmail("kaicpang.pang@connect.polyu.hk", null);
|
||||||
|
SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private UserLikeGroupMapper userLikeGroupMapper;
|
||||||
|
@Resource
|
||||||
|
private UserLikeMapper userLikeMapper;
|
||||||
|
@Resource
|
||||||
|
private TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||||
|
@Resource
|
||||||
|
private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
|
||||||
|
@Resource
|
||||||
|
private DesignItemMapper designItemMapper;
|
||||||
|
@Resource
|
||||||
|
private DesignItemDetailMapper designItemDetailMapper;
|
||||||
|
@Resource
|
||||||
|
private MinioUtil minioUtil;
|
||||||
|
public void clearMinio() {
|
||||||
|
// 获取当前所有history
|
||||||
|
QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
|
||||||
|
List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
|
||||||
|
List<Long> userLikeGroupIdList = userLikeGroupList.stream().map(UserLikeGroup::getId).collect(Collectors.toList());
|
||||||
|
QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
|
||||||
|
userLikeQueryWrapper.lambda().in(UserLike::getUserLikeGroupId, userLikeGroupIdList);
|
||||||
|
// 所有喜欢的图片
|
||||||
|
List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
|
||||||
|
List<Long> designOutfitIdList = userLikes.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList());
|
||||||
|
QueryWrapper<TDesignPythonOutfit> designPythonOutfitQueryWrapper = new QueryWrapper<>();
|
||||||
|
designPythonOutfitQueryWrapper.lambda().notIn(TDesignPythonOutfit::getId, designOutfitIdList);
|
||||||
|
List<TDesignPythonOutfit> tDesignPythonOutfits = designPythonOutfitMapper.selectList(designPythonOutfitQueryWrapper);
|
||||||
|
// int i = 0;
|
||||||
|
// for (TDesignPythonOutfit tDesignPythonOutfit : tDesignPythonOutfits) {
|
||||||
|
// String designUrl = tDesignPythonOutfit.getDesignUrl();
|
||||||
|
// if (StringUtils.isNotBlank(designUrl)) {
|
||||||
|
// minioUtil.deleteObject(designUrl);
|
||||||
|
// i ++;
|
||||||
|
// }
|
||||||
|
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
|
||||||
|
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
|
||||||
|
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
|
||||||
|
// if (!tDesignPythonOutfitDetail.getImageCategory().equals("body")) {
|
||||||
|
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getImageUrl())) {
|
||||||
|
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getImageUrl());
|
||||||
|
// i ++;
|
||||||
|
// }
|
||||||
|
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getMaskUrl())) {
|
||||||
|
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getMaskUrl());
|
||||||
|
// i ++;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
System.out.println("i");
|
||||||
|
// List<Long> designItemIdList = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
|
||||||
|
// QueryWrapper<DesignItem> designItemQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designItemQueryWrapper.lambda().in(DesignItem::getId,designItemIdList);
|
||||||
|
// List<DesignItem> designItems = designItemMapper.selectList(designItemQueryWrapper);
|
||||||
|
// for (DesignItem designItem : designItems) {
|
||||||
|
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
|
||||||
|
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
|
||||||
|
// for (DesignItemDetail designItemDetail : designItemDetails) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AttributeRetrievalMapper attributeRetrievalMapper;
|
||||||
|
|
||||||
|
public void addSystemFileStyle() {
|
||||||
|
// ExecutorService executorService = Executors.newFixedThreadPool(5);
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// String[] filePaths = {
|
||||||
|
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
|
||||||
|
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
|
||||||
|
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
|
||||||
|
//// "/workspace/shb/Mens_bottom_style_output.xlsx",
|
||||||
|
//// "/workspace/shb/Mens_outer_style_output.xlsx",
|
||||||
|
//// "/workspace/shb/Mens_top_style_output.xlsx"
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// for (String filePath : filePaths) {
|
||||||
|
//// executorService.submit(() -> processExcelFile(filePath));
|
||||||
|
// processExcelFile(filePath);
|
||||||
|
// }
|
||||||
|
// }catch (Exception e) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// } finally {
|
||||||
|
// executorService.shutdown();
|
||||||
|
// try {
|
||||||
|
// if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
|
||||||
|
// executorService.shutdownNow();
|
||||||
|
// }
|
||||||
|
// } catch (InterruptedException e) {
|
||||||
|
// executorService.shutdownNow();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
String[] filePaths = {
|
||||||
|
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
|
||||||
|
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
|
||||||
|
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
|
||||||
|
// "/workspace/shb/Mens_bottom_style_output.xlsx",
|
||||||
|
// "/workspace/shb/Mens_outer_style_output.xlsx",
|
||||||
|
// "/workspace/shb/Mens_top_style_output.xlsx"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String filePath : filePaths) {
|
||||||
|
// executorService.submit(() -> processExcelFile(filePath));
|
||||||
|
processExcelFile(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processExcelFile(String filePath) {
|
||||||
|
System.out.println("线程开始");
|
||||||
|
try {
|
||||||
|
List<List<String>> excelData = ExcelReader.readExcel(filePath);
|
||||||
|
String tableName = getTableNameFromFilePath(filePath);
|
||||||
|
String prefix = getPrefixFromFilePath(filePath);
|
||||||
|
|
||||||
|
for (List<String> columnData : excelData) {
|
||||||
|
String style = columnData.get(0);
|
||||||
|
for (int i = 1; i < columnData.size(); i++) {
|
||||||
|
String fileName = columnData.get(i);
|
||||||
|
if (StringUtils.isBlank(fileName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ("X".equals(style)) {
|
||||||
|
attributeRetrievalMapper.updateStyleByFileName("X", prefix + fileName, tableName);
|
||||||
|
System.out.println(fileName);
|
||||||
|
} else {
|
||||||
|
// if (style.equals("Y2K 风")) {
|
||||||
|
// StyleEnum.COUNTRY_STYLE
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }else if (style.equals("")) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
attributeRetrievalMapper.updateStyleByFileName(style, prefix + fileName, tableName);
|
||||||
|
System.out.println(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTableNameFromFilePath(String filePath) {
|
||||||
|
if (filePath.contains("Blouse")) {
|
||||||
|
return "female_top";
|
||||||
|
} else if (filePath.contains("Dress")) {
|
||||||
|
return "female_dress";
|
||||||
|
} else if (filePath.contains("Outerwear")) {
|
||||||
|
return "female_outwear";
|
||||||
|
} else if (filePath.contains("Skirt")) {
|
||||||
|
return "female_skirt";
|
||||||
|
} else if (filePath.contains("Trousers")) {
|
||||||
|
return "female_pants";
|
||||||
|
} else if (filePath.contains("bottom")) {
|
||||||
|
return "male_bottom";
|
||||||
|
} else if (filePath.contains("outer")) {
|
||||||
|
return "male_outwear";
|
||||||
|
} else if (filePath.contains("top")) {
|
||||||
|
return "male_top";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPrefixFromFilePath(String filePath) {
|
||||||
|
if (filePath.contains("Blouse")) {
|
||||||
|
return "blouse/";
|
||||||
|
} else if (filePath.contains("Dress")) {
|
||||||
|
return "dress/";
|
||||||
|
} else if (filePath.contains("Outerwear")) {
|
||||||
|
return "outwear/";
|
||||||
|
} else if (filePath.contains("Skirt")) {
|
||||||
|
return "skirt/";
|
||||||
|
} else if (filePath.contains("Trousers")) {
|
||||||
|
return "trousers/";
|
||||||
|
} else if (filePath.contains("bottom")) {
|
||||||
|
return "bottom/";
|
||||||
|
} else if (filePath.contains("outer")) {
|
||||||
|
return "outer/";
|
||||||
|
} else if (filePath.contains("top")) {
|
||||||
|
return "top/";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static List<String> getFileNames(String directoryPath) {
|
||||||
|
// List<String> fileNames = new ArrayList<>();
|
||||||
|
// Path path = Paths.get(directoryPath);
|
||||||
|
//
|
||||||
|
// try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
|
||||||
|
// for (Path entry : stream) {
|
||||||
|
// if (Files.isRegularFile(entry)) {
|
||||||
|
// fileNames.add(entry.getFileName().toString());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// System.err.println("Error reading directory: " + e.getMessage());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return fileNames;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,17 +3,12 @@ package com.ai.da.common.config;
|
|||||||
import com.paypal.core.PayPalEnvironment;
|
import com.paypal.core.PayPalEnvironment;
|
||||||
import com.paypal.core.PayPalHttpClient;
|
import com.paypal.core.PayPalHttpClient;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@PropertySource("classpath:paypal-sandbox.properties")
|
@PropertySource("classpath:payment.properties")
|
||||||
public class PayPalClient {
|
public class PayPalClient {
|
||||||
|
|
||||||
public PayPalHttpClient client(String mode, String clientId, String clientSecret) {
|
public PayPalHttpClient client(String mode, String clientId, String clientSecret) {
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.ai.da.common.constant;
|
||||||
|
|
||||||
|
public class AlipayHKConstant {
|
||||||
|
|
||||||
|
// 服务名
|
||||||
|
public static final String CREATE_ORDER = "create_order";
|
||||||
|
public static final String ORDER_DETAILS = "order_details";
|
||||||
|
public static final String TRANSACTION_DETAILS = "transaction_details";
|
||||||
|
public static final String GET_FILE = "get_file";
|
||||||
|
public static final String CREATE_AUTO_DEBIT = "create_auto_debit";
|
||||||
|
public static final String REFRESH_TRANSACTION_STATUS = "refresh_transaction_status";
|
||||||
|
public static final String REFUND_TRANSACTION = "refund_transaction";
|
||||||
|
|
||||||
|
// 订单状态
|
||||||
|
public static final String STATUS_NEW = "new";
|
||||||
|
public static final String STATUS_WAIT = "wait";
|
||||||
|
public static final String STATUS_PAID = "paid";
|
||||||
|
public static final String STATUS_EXPIRED = "expired";
|
||||||
|
public static final String STATUS_LIQUIDATED = "liquidated";
|
||||||
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.ai.da.common.constant;
|
package com.ai.da.common.constant;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class CommonConstant {
|
public class CommonConstant {
|
||||||
// 单位 秒 10分钟过期
|
// 单位 秒 10分钟过期
|
||||||
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
|
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
|
||||||
@@ -11,4 +14,66 @@ public class CommonConstant {
|
|||||||
// 单位 秒 一天过期 in redis
|
// 单位 秒 一天过期 in redis
|
||||||
public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L;
|
public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L;
|
||||||
|
|
||||||
|
public static class Numbers{
|
||||||
|
public static final Integer NUMBER_10 = 10;
|
||||||
|
public static final Integer NUMBER_1000 = 1000;
|
||||||
|
public static final Integer NUMBER_10080 = 10080;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String GENERATE_PATH = "/api/generate_image";
|
||||||
|
|
||||||
|
public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo";
|
||||||
|
|
||||||
|
public static final String GENERATE_SLOGAN = "/api/slogan";
|
||||||
|
|
||||||
|
public static final String GENERATE_CANCEL = "/api/generate_cancel/";
|
||||||
|
|
||||||
|
public static final String GENERATE_LOGO_SINGLE_CANCEL = "/api/generate_single_logo_cancel/";
|
||||||
|
|
||||||
|
public static final String PYTHON_PORT_9996 = "9996";
|
||||||
|
|
||||||
|
public static final String PYTHON_PORT_9997 = "9997";
|
||||||
|
|
||||||
|
public static final List<String> AGES_EN = Arrays.asList("Below 20", "20-30", "30-40", "40+");
|
||||||
|
|
||||||
|
public static final List<String> AGES_CN = Arrays.asList("20岁以下", "20-30岁", "30-40岁", "40+岁");
|
||||||
|
public static final List<String> IF_HELPFUL_EN = Arrays.asList("Easy to learn and use", "Easy to get trend information",
|
||||||
|
"Lots of creative design proposals","The AIGC functions for moodboard is helpful","The AIGC functions for design sketches is helpful",
|
||||||
|
"Easy to select the right color","The Chatbot function is helpful","The print position function is helpful",
|
||||||
|
"The drawing function is helpful","The export function is useful","Easy to edit the design","Others");
|
||||||
|
|
||||||
|
public static final List<String> IF_HELPFUL_CN = Arrays.asList("易于学习和使用", "容易获取趋势信息",
|
||||||
|
"提供大量创意设计方案","AIGC功能对灵感板有帮助","AIGC功能对设计草图有帮助",
|
||||||
|
"容易选择合适的颜色","聊天机器人功能有帮助","打印位置功能有帮助",
|
||||||
|
"绘图功能有帮助","导出功能有用","设计编辑简单","其他");
|
||||||
|
|
||||||
|
public static final List<String> IF_IMPROVE_EN = Arrays.asList("Proposed designs are boring, need more interesting designs",
|
||||||
|
"Difficult to make changes on design","Only 2D output, no 3D results","Difficult to apply keywords for AIGC generation",
|
||||||
|
"Clothing is not in the right proportion","Not compatible with pattern making solutions","Improved user interface for better navigation",
|
||||||
|
"Lack of responsive customer support","Insufficient tutorial or guidance for new users","Limited personalization options for designs","Others");
|
||||||
|
|
||||||
|
public static final List<String> IF_IMPROVE_CN = Arrays.asList("提供的设计很无聊,需要更多有趣的设计",
|
||||||
|
"设计修改困难","只有2D输出,没有3D结果","难以选择合适的关键词应用于AIGC生成",
|
||||||
|
"服装比例不正确","与打版解决方案不兼容","改进用户界面以便更好导航",
|
||||||
|
"客户支持响应不及时","对新用户的教程或指导不足","设计个性化选项有限","其他");
|
||||||
|
|
||||||
|
public static final List<String> IS_SUBSCRIBE = Arrays.asList("yes", "no");
|
||||||
|
|
||||||
|
// public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.jpg";
|
||||||
|
public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.png";
|
||||||
|
|
||||||
|
/* 截止至2024/08/26,在Code-Create DB中pmr_users表中最大的用户id */
|
||||||
|
public static final Long MAXIMUM_USER_ID = 704L;
|
||||||
|
// public static final Long MAXIMUM_USER_ID = 225L;
|
||||||
|
|
||||||
|
// 激活更改邮箱 链接有效期 毫秒 3天
|
||||||
|
public static final Long CHANGE_MAILBOX_LINK_VALIDITY = 259200000L;
|
||||||
|
|
||||||
|
public static final String RCA_WORKSHOP_TAG = "#RCAworkshop_2024";
|
||||||
|
|
||||||
|
public static final String PORTFOLIO_DELETED_EN = "Portfolio has been deleted";
|
||||||
|
|
||||||
|
public static final String PORTFOLIO_DELETED_CN = "作品已删除";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,11 @@ public enum AuthenticationOperationTypeEnum {
|
|||||||
/**
|
/**
|
||||||
* 忘记密码
|
* 忘记密码
|
||||||
*/
|
*/
|
||||||
FORGET_PWD;
|
FORGET_PWD,
|
||||||
|
/**
|
||||||
|
* 更改邮箱
|
||||||
|
*/
|
||||||
|
CHANGE_MAILBOX;
|
||||||
|
|
||||||
public static AuthenticationOperationTypeEnum of(String name) {
|
public static AuthenticationOperationTypeEnum of(String name) {
|
||||||
return Stream.of(AuthenticationOperationTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
|
return Stream.of(AuthenticationOperationTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.ai.da.common.enums;
|
package com.ai.da.common.enums;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +38,18 @@ public enum CollectionLevel2TypeEnum {
|
|||||||
* 男装下装
|
* 男装下装
|
||||||
*/
|
*/
|
||||||
BOTTOMS("Bottoms"),
|
BOTTOMS("Bottoms"),
|
||||||
;
|
/**
|
||||||
|
* 印花-logo
|
||||||
|
*/
|
||||||
|
LOGO("Logo"),
|
||||||
|
/**
|
||||||
|
* 印花-slogan
|
||||||
|
*/
|
||||||
|
SLOGAN("Slogan"),
|
||||||
|
/**
|
||||||
|
* 印花-图案
|
||||||
|
*/
|
||||||
|
Pattern("Pattern");
|
||||||
|
|
||||||
private String realName;
|
private String realName;
|
||||||
|
|
||||||
@@ -51,4 +64,8 @@ public enum CollectionLevel2TypeEnum {
|
|||||||
public static CollectionLevel2TypeEnum of(String realName) {
|
public static CollectionLevel2TypeEnum of(String realName) {
|
||||||
return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
|
return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<String> printType() {
|
||||||
|
return Arrays.asList(LOGO.getRealName(), SLOGAN.getRealName(), Pattern.getRealName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,19 +8,32 @@ import lombok.Getter;
|
|||||||
public enum CreditsEventsEnum {
|
public enum CreditsEventsEnum {
|
||||||
|
|
||||||
PRICE("price","6"),
|
PRICE("price","6"),
|
||||||
|
// PRICE("price","0.1"),
|
||||||
|
|
||||||
BUY_CREDITS("Buy Credits","600"),
|
BUY_CREDITS("Buy Credits","60"),
|
||||||
|
|
||||||
INIT("init", "500"),
|
REFUND("Refund","60"),
|
||||||
|
// BUY_CREDITS("Buy Credits","10"),
|
||||||
|
|
||||||
DAILY_CHECKIN("Daily Check-In", "20"),
|
// 每月更新
|
||||||
|
INIT_YEARLY("init_yearly", "6000"),
|
||||||
|
INIT_MONTHLY("init_monthly", "5000"),
|
||||||
|
INIT_TRIAL("init_trial", "100"),
|
||||||
|
INIT_WEEKLY("init_weekly","6000"),
|
||||||
|
|
||||||
SOCIAL_MEDIA_SHARING("Social Media Sharing","20"),
|
// SUPER_RESOLUTION("Super Resolution","30"),
|
||||||
|
SUPER_RESOLUTION("Super Resolution","10"),
|
||||||
|
SLOGAN("Slogan","10"),
|
||||||
|
LOGO("Logo","5"),
|
||||||
|
PATTERN("Pattern","5"),
|
||||||
|
MOOD_BOARD("MoodBoard","5"),
|
||||||
|
SKETCH_BOARD("SketchBoard","5"),
|
||||||
|
TO_PRODUCT_IMAGE("ToProductImage","5"),
|
||||||
|
RELIGHT("Relight","5"),
|
||||||
|
QUESTIONNAIRE("Questionnaire","100"),
|
||||||
|
IMAGE_TO_SKETCH("ImageToSketch","5"),
|
||||||
|
|
||||||
// SUPER_RESOLUTION("Super Resolution","300"),
|
OTHER("Other","5");
|
||||||
SUPER_RESOLUTION("Super Resolution","5"),
|
|
||||||
|
|
||||||
OTHER("Other","10");
|
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ public enum LibraryLevel1TypeEnum {
|
|||||||
/**
|
/**
|
||||||
* 模特
|
* 模特
|
||||||
*/
|
*/
|
||||||
MODELS("Models");
|
MODELS("Models"),
|
||||||
|
DESIGN_ELEMENTS("DesignElements");
|
||||||
|
|
||||||
private String realName;
|
private String realName;
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,17 @@ public enum PayTypeEnum {
|
|||||||
/**
|
/**
|
||||||
* PayPal
|
* PayPal
|
||||||
*/
|
*/
|
||||||
PAYPAL("PayPal");
|
PAYPAL("PayPal"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 香港支付宝
|
||||||
|
*/
|
||||||
|
ALIPAY_HK("Alipay-HK"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stripe
|
||||||
|
*/
|
||||||
|
STRIPE("Stripe");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型
|
* 类型
|
||||||
|
|||||||
@@ -46,17 +46,19 @@ public class AuthenticationFilter extends OncePerRequestFilter {
|
|||||||
"/webjars/", "/swagger-resources", "/v2/api-docs", "api/account/resetPwd",
|
"/webjars/", "/swagger-resources", "/v2/api-docs", "api/account/resetPwd",
|
||||||
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
|
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
|
||||||
"/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile",
|
"/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile",
|
||||||
"/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew",
|
"/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew","/api/third/party/updateNoLoginRequiredNew",
|
||||||
"/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl",
|
"/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl",
|
||||||
// "/api/python/chatStream",
|
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify",
|
||||||
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back"
|
"/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
|
||||||
|
"/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify",
|
||||||
|
"/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential","/api/third/party/receiveDesignResults","/api/third/party/parseWeChatCode"
|
||||||
);
|
);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
|
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
|
||||||
String requestURI = httpServletRequest.getRequestURI();
|
String requestURI = httpServletRequest.getRequestURI();
|
||||||
|
|
||||||
if (calculateUrl(requestURI)) {
|
if (calculateUrl(requestURI) || hasAuthorizationToken(httpServletRequest)) {
|
||||||
StopWatch stopWatch = new StopWatch();
|
StopWatch stopWatch = new StopWatch();
|
||||||
HttpServletRequest wrappedRequest = httpServletRequest;
|
HttpServletRequest wrappedRequest = httpServletRequest;
|
||||||
HttpServletResponse wrappedResponse = httpServletResponse;
|
HttpServletResponse wrappedResponse = httpServletResponse;
|
||||||
@@ -87,9 +89,14 @@ public class AuthenticationFilter extends OncePerRequestFilter {
|
|||||||
return null == filterUrl ? Boolean.TRUE : Boolean.FALSE;
|
return null == filterUrl ? Boolean.TRUE : Boolean.FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasAuthorizationToken(HttpServletRequest request) {
|
||||||
|
String authorizationHeader = request.getHeader("Authorization");
|
||||||
|
return authorizationHeader != null && authorizationHeader.startsWith("Bearer");
|
||||||
|
}
|
||||||
|
|
||||||
private void extracted(HttpServletRequest request) throws AuthenticationException {
|
private void extracted(HttpServletRequest request) throws AuthenticationException {
|
||||||
String jwtToken = request.getHeader(properties.getJwtTokenHeader());
|
String jwtToken = request.getHeader(properties.getJwtTokenHeader());
|
||||||
log.debug("后台检查令牌:{}", jwtToken);
|
// log.debug("后台检查令牌:{}", jwtToken);
|
||||||
|
|
||||||
if (StrUtil.isBlank(jwtToken)) {
|
if (StrUtil.isBlank(jwtToken)) {
|
||||||
String ipAddress = RequestInfoUtil.getIpAddress(request);
|
String ipAddress = RequestInfoUtil.getIpAddress(request);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.ai.da.common.security.jwt;
|
|||||||
|
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.ai.da.common.constant.CommonConstant;
|
||||||
import com.ai.da.common.security.config.SecurityProperties;
|
import com.ai.da.common.security.config.SecurityProperties;
|
||||||
import com.ai.da.model.vo.AuthPrincipalVo;
|
import com.ai.da.model.vo.AuthPrincipalVo;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
@@ -30,6 +31,7 @@ public class JWTTokenHelper {
|
|||||||
|
|
||||||
private static final String ISSUER = "DWJ";
|
private static final String ISSUER = "DWJ";
|
||||||
private static final String AUTHORITIES = "authorities";
|
private static final String AUTHORITIES = "authorities";
|
||||||
|
private static final String CHANGE_MAILBOX = "changeMailbox";
|
||||||
|
|
||||||
public String createToken(AuthPrincipalVo principal) {
|
public String createToken(AuthPrincipalVo principal) {
|
||||||
String token = Jwts.builder()
|
String token = Jwts.builder()
|
||||||
@@ -65,4 +67,21 @@ public class JWTTokenHelper {
|
|||||||
token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
|
token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
|
||||||
return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody();
|
return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String createToken(Long userId, String userEmail){
|
||||||
|
String token = Jwts.builder()
|
||||||
|
.setId(String.valueOf(userId))
|
||||||
|
.setSubject(userEmail + "_" + userId)
|
||||||
|
.setIssuedAt(new Date())
|
||||||
|
.setIssuer(ISSUER)
|
||||||
|
.claim(CHANGE_MAILBOX, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
|
||||||
|
.setExpiration(new Date(System.currentTimeMillis() + CommonConstant.CHANGE_MAILBOX_LINK_VALIDITY))
|
||||||
|
.signWith(SignatureAlgorithm.HS256, securityProperties.getJwtSecret())
|
||||||
|
.compact();
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String parseToEmailAndId(String token) {
|
||||||
|
return parser(token).getSubject();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
70
src/main/java/com/ai/da/common/task/AccountTask.java
Normal file
70
src/main/java/com/ai/da/common/task/AccountTask.java
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package com.ai.da.common.task;
|
||||||
|
|
||||||
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
|
import com.ai.da.service.AccountService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class AccountTask {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AccountService accountService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每周日晚上刷新 年付用户、月付用户的积分
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "59 59 23 ? * SUN")
|
||||||
|
// @Scheduled(cron = "59 59 23 * * ?")
|
||||||
|
public void refreshCreditsMonthly() {
|
||||||
|
log.info("每周日晚11:59:59刷新付费用户积分为 6000");
|
||||||
|
accountService.refreshCreditsWeekly();
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||||
|
public void getPaidUser() {
|
||||||
|
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
|
||||||
|
accountService.extendValidityForCC();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 每天凌晨0点执行一次
|
||||||
|
// @Scheduled(cron = "0 0 0 * * ?")
|
||||||
|
public void cancelActivityBenefits() {
|
||||||
|
// 1、查询当前所有参与了活动且过期的用户
|
||||||
|
List<Account> accountList = accountService.getExpiredUserBySystemUser(4);
|
||||||
|
|
||||||
|
// 2、将到期用户置为游客
|
||||||
|
for (Account account : accountList) {
|
||||||
|
log.info("参与活动的用户{} : {} 于 {} 账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
|
||||||
|
accountService.toVisitor(account);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 每天检测正式用户到期情况,每天凌晨0点执行
|
||||||
|
// @Scheduled(cron = "0 0 0 * * ?")
|
||||||
|
public void paidUserToVisitor() {
|
||||||
|
// 1、查询当前已过期正式用户或试用用户
|
||||||
|
List<Account> accountList = accountService.getExpiredUserBySystemUser(1);
|
||||||
|
accountList.addAll(accountService.getExpiredUserBySystemUser(2));
|
||||||
|
accountList.addAll(accountService.getExpiredUserBySystemUser(3));
|
||||||
|
|
||||||
|
// 2、将到期用户置为游客
|
||||||
|
for (Account account : accountList) {
|
||||||
|
log.info("用户{} : {} 于 {}账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
|
||||||
|
accountService.toVisitor(account);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将Code-Create上注册的用户添加为AiDA的游客
|
||||||
|
*/
|
||||||
|
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||||
|
public void registerUserToVisitor() {
|
||||||
|
accountService.registerUserToVisitor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,7 +27,7 @@ public class AliPayTask {
|
|||||||
// @Scheduled(cron = "0/30 * * * * ?")
|
// @Scheduled(cron = "0/30 * * * * ?")
|
||||||
public void orderConfirm(){
|
public void orderConfirm(){
|
||||||
|
|
||||||
log.info("Alipay orderConfirm 被执行......");
|
// log.info("Alipay orderConfirm 被执行......");
|
||||||
|
|
||||||
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());
|
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class GenerateTask {
|
public class GenerateTask {
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 */1 * * ?")
|
// @Scheduled(cron = "0 0 */1 * * ?")
|
||||||
public void generateScheduled(){
|
public void generateScheduled(){
|
||||||
log.info("测试定时器:generate");
|
log.info("测试定时器:generate");
|
||||||
|
|
||||||
|
|||||||
216
src/main/java/com/ai/da/common/task/MoveDataScheduler.java
Normal file
216
src/main/java/com/ai/da/common/task/MoveDataScheduler.java
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
//package com.ai.da.common.task;
|
||||||
|
//
|
||||||
|
//import com.ai.da.common.utils.CopyUtil;
|
||||||
|
//import com.ai.da.common.utils.ExcelReader;
|
||||||
|
//import com.ai.da.common.utils.MinioUtil;
|
||||||
|
//import com.ai.da.common.utils.SendEmailUtil;
|
||||||
|
//import com.ai.da.mapper.primary.*;
|
||||||
|
//import com.ai.da.mapper.primary.entity.*;
|
||||||
|
//import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
|
||||||
|
//import com.ai.da.mapper.third.*;
|
||||||
|
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
//import org.apache.commons.lang3.StringUtils;
|
||||||
|
//import org.apache.poi.ss.usermodel.Row;
|
||||||
|
//import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
//import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//import org.springframework.util.CollectionUtils;
|
||||||
|
//
|
||||||
|
//import javax.annotation.PostConstruct;
|
||||||
|
//import javax.annotation.Resource;
|
||||||
|
//import java.io.FileOutputStream;
|
||||||
|
//import java.io.IOException;
|
||||||
|
//import java.nio.file.Files;
|
||||||
|
//import java.nio.file.Paths;
|
||||||
|
//import java.time.LocalDate;
|
||||||
|
//import java.time.format.DateTimeFormatter;
|
||||||
|
//import java.util.List;
|
||||||
|
//import java.util.concurrent.ExecutorService;
|
||||||
|
//import java.util.concurrent.Executors;
|
||||||
|
//import java.util.concurrent.TimeUnit;
|
||||||
|
//import java.util.stream.Collectors;
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
//public class MoveDataScheduler {
|
||||||
|
//
|
||||||
|
// @PostConstruct
|
||||||
|
// public void test() {
|
||||||
|
// moveData();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private UserLikeGroupMapper userLikeGroupMapper;
|
||||||
|
// @Resource
|
||||||
|
// private UserLikeGroupZSMapper userLikeGroupZSMapper;
|
||||||
|
// @Resource
|
||||||
|
// private UserLikeMapper userLikeMapper;
|
||||||
|
// @Resource
|
||||||
|
// private UserLikeZSMapper userLikeZSMapper;
|
||||||
|
// @Resource
|
||||||
|
// private CollectionElementMapper collectionElementMapper;
|
||||||
|
// @Resource
|
||||||
|
// private CollectionElementZSMapper collectionElementZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private CollectionMapper collectionMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private CollectionZSMapper collectionZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignMapper designMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignZSMapper designZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemMapper designItemMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemZSMapper designItemZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private TDesignPythonOutfitZSMapper designPythonOutfitZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private TDesignPythonOutfitDetailZSMapper designPythonOutfitDetailZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemDetailMapper designItemDetailMapper;
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemZSDetailMapper designItemDetailZSMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemDetailPrintMapper designItemDetailPrintMapper;
|
||||||
|
//
|
||||||
|
// @Resource
|
||||||
|
// private DesignItemDetailPrintZSMapper designItemDetailPrintZSMapper;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// private void moveData() {
|
||||||
|
// // 查询用户所有history记录
|
||||||
|
// QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
|
||||||
|
// userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getAccountId, 11411);
|
||||||
|
// List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
|
||||||
|
//
|
||||||
|
// for (UserLikeGroup userLikeGroup : userLikeGroupList) {
|
||||||
|
//
|
||||||
|
// com.ai.da.mapper.third.entity.UserLikeGroup userLikeGroupZS = CopyUtil.copyObject(userLikeGroup, com.ai.da.mapper.third.entity.UserLikeGroup.class);
|
||||||
|
// userLikeGroupZS.setAccountId(11420L);
|
||||||
|
// userLikeGroupZS.setId(null);
|
||||||
|
// Collection collection = collectionMapper.selectById(userLikeGroup.getCollectionId());
|
||||||
|
// com.ai.da.mapper.third.entity.Collection collectionZS = CopyUtil.copyObject(collection, com.ai.da.mapper.third.entity.Collection.class);
|
||||||
|
// collectionZS.setAccountId(11420L);
|
||||||
|
// collectionZS.setId(null);
|
||||||
|
//
|
||||||
|
// if (collection.getMoodTemplateId() != null) {
|
||||||
|
// CollectionElement element = collectionElementMapper.selectById(collection.getMoodTemplateId());
|
||||||
|
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(element, com.ai.da.mapper.third.entity.CollectionElement.class);
|
||||||
|
// collectionElementZS.setAccountId(11420L);
|
||||||
|
// collectionElementZS.setId(null);
|
||||||
|
// collectionElementZSMapper.insert(collectionElementZS);
|
||||||
|
// collectionZS.setMoodTemplateId(String.valueOf(collectionElementZS.getId()));
|
||||||
|
// }
|
||||||
|
// collectionZSMapper.insert(collectionZS);
|
||||||
|
// userLikeGroupZS.setCollectionId(collectionZS.getId());
|
||||||
|
// userLikeGroupZSMapper.insert(userLikeGroupZS);
|
||||||
|
//
|
||||||
|
// // 生成元素
|
||||||
|
// QueryWrapper<CollectionElement> collectionElementQueryWrapper = new QueryWrapper<>();
|
||||||
|
// collectionElementQueryWrapper.lambda().eq(CollectionElement::getCollectionId, userLikeGroup.getCollectionId());
|
||||||
|
// List<CollectionElement> collectionElements = collectionElementMapper.selectList(collectionElementQueryWrapper);
|
||||||
|
//
|
||||||
|
// for (CollectionElement collectionElement : collectionElements) {
|
||||||
|
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(collectionElement, com.ai.da.mapper.third.entity.CollectionElement.class);
|
||||||
|
// collectionElementZS.setId(null);
|
||||||
|
// collectionElementZS.setAccountId(11420L);
|
||||||
|
// collectionElementZS.setCollectionId(collectionZS.getId());
|
||||||
|
// collectionElementZSMapper.insert(collectionElementZS);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 查询记录关联
|
||||||
|
// QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
|
||||||
|
// userLikeQueryWrapper.lambda().eq(UserLike::getUserLikeGroupId, userLikeGroup.getId());
|
||||||
|
// List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
|
||||||
|
// for (UserLike userLike : userLikes) {
|
||||||
|
// Design design = designMapper.selectById(userLike.getDesignId());
|
||||||
|
// com.ai.da.mapper.third.entity.Design designZS = CopyUtil.copyObject(design, com.ai.da.mapper.third.entity.Design.class);
|
||||||
|
// designZS.setId(null);
|
||||||
|
// designZS.setAccountId(11420L);
|
||||||
|
// designZS.setCollectionId(collectionZS.getId());
|
||||||
|
// designZSMapper.insert(designZS);
|
||||||
|
//
|
||||||
|
// com.ai.da.mapper.third.entity.UserLike userLikeZS = CopyUtil.copyObject(userLike, com.ai.da.mapper.third.entity.UserLike.class);
|
||||||
|
//// Design design = designMapper.selectById(userLike.getDesignId());
|
||||||
|
// userLikeZS.setId(null);
|
||||||
|
// DesignItem designItem = designItemMapper.selectById(userLike.getDesignItemId());
|
||||||
|
// com.ai.da.mapper.third.entity.DesignItem designItemZS = CopyUtil.copyObject(designItem, com.ai.da.mapper.third.entity.DesignItem.class);
|
||||||
|
// designItemZS.setId(null);
|
||||||
|
// designItemZS.setAccountId(11420L);
|
||||||
|
// designItemZS.setDesignId(designZS.getId());
|
||||||
|
// designItemZSMapper.insert(designItemZS);
|
||||||
|
//
|
||||||
|
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
|
||||||
|
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
|
||||||
|
// for (DesignItemDetail designItemDetail : designItemDetails) {
|
||||||
|
// com.ai.da.mapper.third.entity.DesignItemDetail designItemDetailZS = CopyUtil.copyObject(designItemDetail, com.ai.da.mapper.third.entity.DesignItemDetail.class);
|
||||||
|
// designItemDetailZS.setId(null);
|
||||||
|
// designItemDetailZS.setDesignItemId(designItemZS.getId());
|
||||||
|
// designItemDetailZS.setAccountId(11420L);
|
||||||
|
// designItemDetailZS.setDesignId(designZS.getId());
|
||||||
|
// designItemDetailZSMapper.insert(designItemDetailZS);
|
||||||
|
//
|
||||||
|
// QueryWrapper<DesignItemDetailPrint> designItemDetailPrintQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetail.getId());
|
||||||
|
// List<DesignItemDetailPrint> designItemDetailPrintList = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper);
|
||||||
|
// if (!CollectionUtils.isEmpty(designItemDetailPrintList)) {
|
||||||
|
// for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrintList) {
|
||||||
|
// com.ai.da.mapper.third.entity.DesignItemDetailPrint designItemDetailPrintZS = CopyUtil.copyObject(designItemDetailPrint, com.ai.da.mapper.third.entity.DesignItemDetailPrint.class);
|
||||||
|
// designItemDetailPrintZS.setId(null);
|
||||||
|
// designItemDetailPrintZS.setDesignItemDetailId(designItemDetailZS.getId());
|
||||||
|
// designItemDetailPrintZSMapper.insert(designItemDetailPrintZS);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// userLikeZS.setDesignItemId(designItemZS.getId());
|
||||||
|
// TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(userLike.getDesignOutfitId());
|
||||||
|
// com.ai.da.mapper.third.entity.TDesignPythonOutfit tDesignPythonOutfitZS = CopyUtil.copyObject(tDesignPythonOutfit, com.ai.da.mapper.third.entity.TDesignPythonOutfit.class);
|
||||||
|
// tDesignPythonOutfitZS.setId(null);
|
||||||
|
// tDesignPythonOutfitZS.setDesignItemId(designItemZS.getId());
|
||||||
|
// tDesignPythonOutfitZS.setCollectionId(collectionZS.getId());
|
||||||
|
// tDesignPythonOutfitZS.setUserId(11420L);
|
||||||
|
// tDesignPythonOutfitZS.setDesignId(designZS.getId());
|
||||||
|
// designPythonOutfitZSMapper.insert(tDesignPythonOutfitZS);
|
||||||
|
//
|
||||||
|
// userLikeZS.setUserLikeGroupId(userLikeGroupZS.getId());
|
||||||
|
// userLikeZS.setDesignId(designZS.getId());
|
||||||
|
// userLikeZS.setDesignOutfitId(tDesignPythonOutfitZS.getId());
|
||||||
|
// userLikeZSMapper.insert(userLikeZS);
|
||||||
|
//
|
||||||
|
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
|
||||||
|
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
|
||||||
|
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
|
||||||
|
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
|
||||||
|
// com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail tDesignPythonOutfitDetailZS = CopyUtil.copyObject(tDesignPythonOutfitDetail, com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail.class);
|
||||||
|
// tDesignPythonOutfitDetailZS.setDesignPythonOutfitId(tDesignPythonOutfitZS.getId());
|
||||||
|
// tDesignPythonOutfitDetailZS.setId(null);
|
||||||
|
// tDesignPythonOutfitDetailZS.setDesignId(designZS.getId());
|
||||||
|
// designPythonOutfitDetailZSMapper.insert(tDesignPythonOutfitDetailZS);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//}
|
||||||
@@ -23,12 +23,12 @@ public class PaypalTask {
|
|||||||
@Resource
|
@Resource
|
||||||
private PayPalCheckoutService payPalCheckoutService;
|
private PayPalCheckoutService payPalCheckoutService;
|
||||||
|
|
||||||
@Scheduled(cron = "0/30 * * * * ?")
|
// @Scheduled(cron = "0/30 * * * * ?")
|
||||||
public void orderConfirm() throws SerializeException {
|
public void orderConfirm() throws SerializeException {
|
||||||
|
|
||||||
log.info("PayPal orderConfirm 被执行......");
|
// log.info("PayPal orderConfirm 被执行......");
|
||||||
|
|
||||||
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.PAYPAL.getType());
|
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.PAYPAL.getType());
|
||||||
|
|
||||||
for (OrderInfo orderInfo : orderInfoList) {
|
for (OrderInfo orderInfo : orderInfoList) {
|
||||||
String orderNo = orderInfo.getOrderNo();
|
String orderNo = orderInfo.getOrderNo();
|
||||||
|
|||||||
40
src/main/java/com/ai/da/common/task/StripeTask.java
Normal file
40
src/main/java/com/ai/da/common/task/StripeTask.java
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package com.ai.da.common.task;
|
||||||
|
|
||||||
|
import com.ai.da.common.enums.PayTypeEnum;
|
||||||
|
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||||
|
import com.ai.da.service.OrderInfoService;
|
||||||
|
import com.ai.da.service.StripeService;
|
||||||
|
import com.paypal.http.exceptions.SerializeException;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class StripeTask {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private OrderInfoService orderInfoService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StripeService stripeService;
|
||||||
|
|
||||||
|
// @Scheduled(cron = "0/30 * * * * ?")
|
||||||
|
public void orderConfirm() throws SerializeException {
|
||||||
|
|
||||||
|
// 查看超过30分钟以上仍未支付的订单 置为超时订单
|
||||||
|
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.STRIPE.getType());
|
||||||
|
|
||||||
|
for (OrderInfo orderInfo : orderInfoList) {
|
||||||
|
String orderNo = orderInfo.getOrderNo();
|
||||||
|
log.warn("超时订单 ===> {}", orderNo);
|
||||||
|
|
||||||
|
//核实订单状态:调用支付宝查单接口
|
||||||
|
stripeService.checkOrderStatus(orderNo);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,23 @@
|
|||||||
package com.ai.da.common.utils;
|
package com.ai.da.common.utils;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.resource.ClassPathResource;
|
||||||
import com.ai.da.model.dto.AlipayHKParametersDTO;
|
import com.ai.da.model.dto.AlipayHKParametersDTO;
|
||||||
import com.ai.da.model.dto.AlipayHKRequestDTO;
|
import com.ai.da.model.dto.AlipayHKRequestDTO;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
|
||||||
|
import org.bouncycastle.crypto.digests.SHA256Digest;
|
||||||
|
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
|
||||||
|
import org.bouncycastle.crypto.signers.RSADigestSigner;
|
||||||
|
import org.bouncycastle.crypto.util.PublicKeyFactory;
|
||||||
|
import org.bouncycastle.openssl.PEMParser;
|
||||||
import org.bouncycastle.util.io.pem.PemObject;
|
import org.bouncycastle.util.io.pem.PemObject;
|
||||||
import org.bouncycastle.util.io.pem.PemReader;
|
import org.bouncycastle.util.io.pem.PemReader;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.crypto.*;
|
import javax.crypto.*;
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
@@ -25,22 +34,27 @@ import java.util.HashMap;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Component
|
||||||
public class AlipayHKEncryptionUtil {
|
public class AlipayHKEncryptionUtil {
|
||||||
|
|
||||||
@Value("${alipay.hk.merchant-id}")
|
@Value("${alipayHK.merchantId}")
|
||||||
private static String merchantId;
|
private String merchantId;
|
||||||
|
|
||||||
@Value("${alipay.hk.segment-id}")
|
@Value("${alipayHK.segmentId}")
|
||||||
private static String segmentId;
|
private String segmentId;
|
||||||
|
|
||||||
@Value("${alipay.hk.AESKey}")
|
@Value("${alipayHK.AESKey}")
|
||||||
private static String aesKey;
|
private String aesKey;
|
||||||
|
|
||||||
@Value("${alipay.hk.rsaPrivateKey}")
|
@Value("${alipayHK.rsaPrivateKey}")
|
||||||
private static String privateKeyPath;
|
private String privateKeyPath;
|
||||||
|
|
||||||
|
@Value("${alipayHK.rsaPublicKey}")
|
||||||
|
private String publicKeyPath;
|
||||||
|
|
||||||
|
@Value("${alipayHK.CODPublicKey}")
|
||||||
|
private String CODPublicKeyPath;
|
||||||
|
|
||||||
@Value("${alipay.hk.rsaPublicKey}")
|
|
||||||
private static String publicKeyPath;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加密
|
* 加密
|
||||||
@@ -55,13 +69,14 @@ public class AlipayHKEncryptionUtil {
|
|||||||
* @throws BadPaddingException
|
* @throws BadPaddingException
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static AlipayHKRequestDTO AESCBCWithRSA(HashMap<String, Object> param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
|
public AlipayHKRequestDTO AESCBCWithRSA(HashMap<String, Object> param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
|
||||||
// Pre-shared secret key, DO NOT hardcode this key
|
// Pre-shared secret key, DO NOT hardcode this key
|
||||||
String key = aesKey;
|
String key = aesKey;
|
||||||
// The path to the rsa private key file, DO NOT save this key to a publicly accessible location
|
// The path to the rsa private key file, DO NOT save this key to a publicly accessible location
|
||||||
// 使用私钥创建数字签名
|
// 使用私钥创建数字签名
|
||||||
// Mode, aes-128-cbc for 128bit key
|
// Mode, aes-128-cbc for 128bit key
|
||||||
String mode = "aes-128-cbc";
|
// String mode = "aes-128-cbc";
|
||||||
|
String mode = "aes-256-cbc";
|
||||||
// Padding mode
|
// Padding mode
|
||||||
String padding = "pkcs7";
|
String padding = "pkcs7";
|
||||||
// signature alogrithm
|
// signature alogrithm
|
||||||
@@ -75,18 +90,11 @@ public class AlipayHKEncryptionUtil {
|
|||||||
requestMessage.setRequest_uuid(UUID.randomUUID().toString());
|
requestMessage.setRequest_uuid(UUID.randomUUID().toString());
|
||||||
// HashMap<String, Object> param = new HashMap<>();
|
// HashMap<String, Object> param = new HashMap<>();
|
||||||
requestMessage.setParameters(param);
|
requestMessage.setParameters(param);
|
||||||
/*String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
|
||||||
param.put("order_ref", orderRef);
|
|
||||||
param.put("amount", 208.12);
|
|
||||||
param.put("subject", "四月帳單 April Bill");
|
|
||||||
param.put("wallet", "ALIPAYHK");
|
|
||||||
param.put("segment_id", segmentId);
|
|
||||||
param.put("payment_solution", "WAP");*/
|
|
||||||
|
|
||||||
|
|
||||||
// Serialize message body
|
// Serialize message body
|
||||||
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
|
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
|
||||||
String content = gson.toJson(requestMessage);
|
String content = gson.toJson(requestMessage);
|
||||||
|
log.info("alipay-hk request 加密前:{}", content);
|
||||||
|
|
||||||
// Secure random iv 获取随机种子
|
// Secure random iv 获取随机种子
|
||||||
SecureRandom secureRandom = new SecureRandom();
|
SecureRandom secureRandom = new SecureRandom();
|
||||||
@@ -144,7 +152,7 @@ public class AlipayHKEncryptionUtil {
|
|||||||
|
|
||||||
// Encode to json
|
// Encode to json
|
||||||
String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO);
|
String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO);
|
||||||
log.info(jsonEncoded);
|
log.info("alipay-hk request 加密加签后:{}",jsonEncoded);
|
||||||
|
|
||||||
// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO);
|
// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO);
|
||||||
// log.info(info);
|
// log.info(info);
|
||||||
@@ -159,7 +167,23 @@ public class AlipayHKEncryptionUtil {
|
|||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception {
|
private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(filePath));
|
ClassPathResource classPathResource = new ClassPathResource(filePath);
|
||||||
|
InputStream inputstream = classPathResource.getStream();
|
||||||
|
String privateKeyContent = getString(inputstream);
|
||||||
|
|
||||||
|
// 进行 Base64 解码
|
||||||
|
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent);
|
||||||
|
|
||||||
|
// 根据 PKCS8 格式的私钥字节数组构造私钥对象
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
||||||
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
|
||||||
|
return keyFactory.generatePrivate(keySpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static String getString(InputStream inputstream) throws IOException {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
|
||||||
|
// BufferedReader reader = new BufferedReader(new FileReader(filePath));
|
||||||
StringBuilder keyBuffer = new StringBuilder();
|
StringBuilder keyBuffer = new StringBuilder();
|
||||||
String line;
|
String line;
|
||||||
|
|
||||||
@@ -174,20 +198,13 @@ public class AlipayHKEncryptionUtil {
|
|||||||
.replace("-----BEGIN PRIVATE KEY-----", "")
|
.replace("-----BEGIN PRIVATE KEY-----", "")
|
||||||
.replace("-----END PRIVATE KEY-----", "")
|
.replace("-----END PRIVATE KEY-----", "")
|
||||||
.replaceAll("\\s+", ""); // 去除空格、换行等字符
|
.replaceAll("\\s+", ""); // 去除空格、换行等字符
|
||||||
|
return privateKeyContent;
|
||||||
// 进行 Base64 解码
|
|
||||||
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent);
|
|
||||||
|
|
||||||
// 根据 PKCS8 格式的私钥字节数组构造私钥对象
|
|
||||||
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
|
||||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
|
|
||||||
return keyFactory.generatePrivate(keySpec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用 AES 密钥和随机向量进行解密
|
* 使用 AES 密钥和随机向量进行解密
|
||||||
*/
|
*/
|
||||||
public static String decryptAES(String encryptedText, String iv) throws Exception {
|
public String decryptAES(String encryptedText, String iv) throws Exception {
|
||||||
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
|
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
|
||||||
byte[] ivBytes = Base64.getDecoder().decode(iv);
|
byte[] ivBytes = Base64.getDecoder().decode(iv);
|
||||||
|
|
||||||
@@ -201,7 +218,7 @@ public class AlipayHKEncryptionUtil {
|
|||||||
return new String(decryptedBytes, StandardCharsets.UTF_8);
|
return new String(decryptedBytes, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void test() throws Exception {
|
public void test() throws Exception {
|
||||||
// 加密数据
|
// 加密数据
|
||||||
AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO();
|
AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO();
|
||||||
requestMessage.setService("create_order");
|
requestMessage.setService("create_order");
|
||||||
@@ -227,7 +244,7 @@ public class AlipayHKEncryptionUtil {
|
|||||||
|
|
||||||
// 使用 RSA 公钥加密 AES 密钥
|
// 使用 RSA 公钥加密 AES 密钥
|
||||||
String rsaPublicKeyPath = publicKeyPath;
|
String rsaPublicKeyPath = publicKeyPath;
|
||||||
PublicKey publicKey = readPublicKey(new File(rsaPublicKeyPath));
|
PublicKey publicKey = readPublicKey(rsaPublicKeyPath);
|
||||||
|
|
||||||
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
@@ -307,11 +324,14 @@ public class AlipayHKEncryptionUtil {
|
|||||||
System.out.println("数字签名验证结果:" + signatureValid);
|
System.out.println("数字签名验证结果:" + signatureValid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PublicKey readPublicKey(File file) throws Exception {
|
// public static PublicKey readPublicKey(File file) throws Exception {
|
||||||
|
public static PublicKey readPublicKey(String fileName) throws Exception {
|
||||||
KeyFactory factory = KeyFactory.getInstance("RSA");
|
KeyFactory factory = KeyFactory.getInstance("RSA");
|
||||||
|
|
||||||
try (FileReader keyReader = new FileReader(file);
|
ClassPathResource classPathResource = new ClassPathResource(fileName);
|
||||||
PemReader pemReader = new PemReader(keyReader)) {
|
InputStream inputStream = classPathResource.getStream();
|
||||||
|
BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
try (PemReader pemReader = new PemReader(fileReader)) {
|
||||||
|
|
||||||
PemObject pemObject = pemReader.readPemObject();
|
PemObject pemObject = pemReader.readPemObject();
|
||||||
byte[] content = pemObject.getContent();
|
byte[] content = pemObject.getContent();
|
||||||
@@ -326,4 +346,38 @@ public class AlipayHKEncryptionUtil {
|
|||||||
random.nextBytes(iv);
|
random.nextBytes(iv);
|
||||||
return iv;
|
return iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean signatureVerification(String data, String signatureBase64){
|
||||||
|
|
||||||
|
Base64.Decoder decoder = Base64.getDecoder();
|
||||||
|
// Verify key
|
||||||
|
try {
|
||||||
|
ClassPathResource classPathResource = new ClassPathResource(CODPublicKeyPath);
|
||||||
|
InputStream inputstream = classPathResource.getStream();
|
||||||
|
// 从指定的路径读取公钥文件
|
||||||
|
InputStreamReader isrPub = new InputStreamReader(inputstream);
|
||||||
|
PEMParser pemParserPub = new PEMParser(isrPub);
|
||||||
|
// 使用 PEMParser 解析公钥文件
|
||||||
|
SubjectPublicKeyInfo pubInfo = (SubjectPublicKeyInfo) pemParserPub.readObject();
|
||||||
|
// 从 SubjectPublicKeyInfo 创建 AsymmetricKeyParameter 对象
|
||||||
|
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(pubInfo);
|
||||||
|
// Verifying; 创建 RSADigestSigner 对象并使用 SHA-256 作为摘要算法
|
||||||
|
RSADigestSigner verifier = new RSADigestSigner(new SHA256Digest());
|
||||||
|
// 初始化 RSADigestSigner,设置为验证模式并提供公钥参数
|
||||||
|
verifier.init(false, pubKey);
|
||||||
|
// 将要验证的数据转换为字节数组
|
||||||
|
byte[] signMessageForVerifying = data.getBytes();
|
||||||
|
// 将 Base64 编码的签名转换为字节数组
|
||||||
|
byte[] signatureBase64ForVerifying = decoder.decode(signatureBase64);
|
||||||
|
// 使用签名器更新要验证的数据
|
||||||
|
verifier.update(signMessageForVerifying, 0, signMessageForVerifying.length);
|
||||||
|
// 验证签名并返回结果
|
||||||
|
Boolean verifyResult = verifier.verifySignature(signatureBase64ForVerifying);
|
||||||
|
return verifyResult;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ import java.time.Instant;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Component
|
||||||
public class AlipayHKRequestUtil {
|
public class AlipayHKRequestUtil {
|
||||||
|
|
||||||
public static String createOrder(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException {
|
public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) {
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
.connectTimeout(30, TimeUnit.SECONDS)
|
.connectTimeout(30, TimeUnit.SECONDS)
|
||||||
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
|
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
|
||||||
@@ -27,27 +29,34 @@ public class AlipayHKRequestUtil {
|
|||||||
log.info("Alipay-HK send request unix timestamp: {}", epochMilli);
|
log.info("Alipay-HK send request unix timestamp: {}", epochMilli);
|
||||||
|
|
||||||
String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue);
|
String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue);
|
||||||
log.info(jsonString);
|
// log.info(jsonString);
|
||||||
|
|
||||||
RequestBody body = RequestBody.create(mediaType, jsonString);
|
RequestBody body = RequestBody.create(mediaType, jsonString);
|
||||||
|
|
||||||
Request request = new Request.Builder()
|
Request request = new Request.Builder()
|
||||||
// .url("https://aqs-api.sandbox-codpayment.com")
|
// .url("https://aqs-api.sandbox-codpayment.com/v1/service")
|
||||||
.url("https://aqs-api.sandbox-codpayment.com/v1/service")
|
.url("https://aqs-api.codpayment.com/v1/service")
|
||||||
.method("POST", body)
|
.method("POST", body)
|
||||||
.addHeader("Content-Type", "application/json;charset=utf-8")
|
.addHeader("Content-Type", "application/json;charset=utf-8")
|
||||||
.build();
|
.build();
|
||||||
Response response = null;
|
Response response;
|
||||||
String bodyString;
|
String bodyString;
|
||||||
try {
|
try {
|
||||||
// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue));
|
|
||||||
response = client.newCall(request).execute();
|
response = client.newCall(request).execute();
|
||||||
|
assert response.body() != null;
|
||||||
|
bodyString = response.body().string();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException));
|
|
||||||
// throw new BusinessException("generate.interface.error");
|
|
||||||
throw new BusinessException(e.getMessage());
|
throw new BusinessException(e.getMessage());
|
||||||
}
|
}
|
||||||
return response.body().string();
|
JSONObject jsonObject = JSONObject.parseObject(bodyString);
|
||||||
|
boolean success = (boolean) jsonObject.get("success");
|
||||||
|
if (success){
|
||||||
|
return bodyString;
|
||||||
|
} else {
|
||||||
|
String message = jsonObject.get("error_code").toString() + ":" + jsonObject.get("error");
|
||||||
|
log.error("Alipay return message : {}", message);
|
||||||
|
throw new BusinessException("Alipay return message : " + message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
53
src/main/java/com/ai/da/common/utils/ExcelReader.java
Normal file
53
src/main/java/com/ai/da/common/utils/ExcelReader.java
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package com.ai.da.common.utils;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ExcelReader {
|
||||||
|
public static List<List<String>> readExcel(String filePath) throws IOException {
|
||||||
|
List<List<String>> data = new ArrayList<>();
|
||||||
|
try (FileInputStream fis = new FileInputStream(filePath);
|
||||||
|
Workbook workbook = new XSSFWorkbook(fis)) {
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
int numberOfColumns = sheet.getRow(0).getLastCellNum();
|
||||||
|
|
||||||
|
for (int i = 0; i < numberOfColumns; i++) {
|
||||||
|
List<String> columnData = new ArrayList<>();
|
||||||
|
for (Row row : sheet) {
|
||||||
|
Cell cell = row.getCell(i);
|
||||||
|
if (cell != null) {
|
||||||
|
switch (cell.getCellType()) {
|
||||||
|
case STRING:
|
||||||
|
columnData.add(cell.getStringCellValue());
|
||||||
|
break;
|
||||||
|
case NUMERIC:
|
||||||
|
columnData.add(String.valueOf(cell.getNumericCellValue()));
|
||||||
|
break;
|
||||||
|
case BOOLEAN:
|
||||||
|
columnData.add(String.valueOf(cell.getBooleanCellValue()));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// 跳过空单元格或其他类型(比如错误类型)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 只有当这一列有数据时,才添加到结果列表中
|
||||||
|
if (!columnData.isEmpty()) {
|
||||||
|
data.add(columnData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,8 @@ import io.minio.http.Method;
|
|||||||
import io.minio.messages.DeleteError;
|
import io.minio.messages.DeleteError;
|
||||||
import io.minio.messages.DeleteObject;
|
import io.minio.messages.DeleteObject;
|
||||||
import io.minio.messages.Item;
|
import io.minio.messages.Item;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
@@ -16,6 +18,7 @@ import java.io.*;
|
|||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -25,6 +28,7 @@ import java.util.stream.Collectors;
|
|||||||
* @description: minio工具类
|
* @description: minio工具类
|
||||||
* @version:3.0
|
* @version:3.0
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class MinioUtil {
|
public class MinioUtil {
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -126,6 +130,26 @@ public class MinioUtil {
|
|||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String uploadImageFromBase64(String bucketName, String base64Image, String imageType) {
|
||||||
|
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
|
||||||
|
String fileName = UUID.randomUUID().toString() + "." + imageType; // or any other image format
|
||||||
|
|
||||||
|
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
|
||||||
|
minioClient.putObject(PutObjectArgs.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.object(fileName)
|
||||||
|
.stream(in, in.available(), -1)
|
||||||
|
.contentType("image/png") // Set the content type according to your image format
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
return bucketName + "/" + fileName;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null; // or throw an exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* description: 上传文件
|
* description: 上传文件
|
||||||
*
|
*
|
||||||
@@ -349,7 +373,7 @@ public class MinioUtil {
|
|||||||
* @param expiry 过期时间(单位:分)
|
* @param expiry 过期时间(单位:分)
|
||||||
* @return 文件的临时URL,如果出现异常则返回null
|
* @return 文件的临时URL,如果出现异常则返回null
|
||||||
*/
|
*/
|
||||||
public String getPresignedUrl(String bucketName, String fileName, int expiry) {
|
public String getPreSignedUrl(String bucketName, String fileName, int expiry) {
|
||||||
try {
|
try {
|
||||||
return minioClient.getPresignedObjectUrl(
|
return minioClient.getPresignedObjectUrl(
|
||||||
GetPresignedObjectUrlArgs.builder()
|
GetPresignedObjectUrlArgs.builder()
|
||||||
@@ -365,7 +389,7 @@ public class MinioUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPresignedUrl(String path, int expiry) {
|
public String getPreSignedUrl(String path, int expiry) {
|
||||||
if (LocalCacheUtils.getPresignedUrlCache(path) != null) {
|
if (LocalCacheUtils.getPresignedUrlCache(path) != null) {
|
||||||
return LocalCacheUtils.getPresignedUrlCache(path);
|
return LocalCacheUtils.getPresignedUrlCache(path);
|
||||||
} else {
|
} else {
|
||||||
@@ -375,12 +399,28 @@ public class MinioUtil {
|
|||||||
int index = path.indexOf("/");
|
int index = path.indexOf("/");
|
||||||
String bucketName = path.substring(0, index);
|
String bucketName = path.substring(0, index);
|
||||||
String fileName = path.substring(index + 1);
|
String fileName = path.substring(index + 1);
|
||||||
String presignedUrl = getPresignedUrl(bucketName, fileName, expiry);
|
String presignedUrl = getPreSignedUrl(bucketName, fileName, expiry);
|
||||||
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
|
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
|
||||||
return presignedUrl;
|
return presignedUrl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPreSignedUrl(String path, int expiry, boolean resetCache) {
|
||||||
|
if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("The path is error!");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String fileName = path.substring(index + 1);
|
||||||
|
String presignedUrl = getPreSignedUrl(bucketName, fileName, expiry);
|
||||||
|
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
|
||||||
|
return presignedUrl;
|
||||||
|
} else {
|
||||||
|
return LocalCacheUtils.getPresignedUrlCache(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将桶名、文件名从url中分离出来
|
* 将桶名、文件名从url中分离出来
|
||||||
*
|
*
|
||||||
@@ -398,7 +438,7 @@ public class MinioUtil {
|
|||||||
fileName.append("/");
|
fileName.append("/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return getPresignedUrl(bucketName, String.valueOf(fileName), expiry);
|
return getPreSignedUrl(bucketName, String.valueOf(fileName), expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean doesObjectExist(String bucketName, String objectName) {
|
public boolean doesObjectExist(String bucketName, String objectName) {
|
||||||
@@ -415,6 +455,86 @@ public class MinioUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String base64UploadToPath(String base64, String bucketName, String path){
|
||||||
|
String[] parts = base64.split(",");
|
||||||
|
String imageType = parts[0].split("/")[1].split(";")[0];
|
||||||
|
String base64Data = parts[1];
|
||||||
|
|
||||||
|
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
|
||||||
|
String fileName;
|
||||||
|
if (!StringUtil.isNullOrEmpty(path)){
|
||||||
|
fileName = path + "." + imageType; // or any other image format
|
||||||
|
}else {
|
||||||
|
fileName = UUID.randomUUID() + "." + imageType;
|
||||||
|
}
|
||||||
|
|
||||||
|
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
|
||||||
|
minioClient.putObject(PutObjectArgs.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.object(fileName)
|
||||||
|
.stream(in, in.available(), -1)
|
||||||
|
.contentType("image/" + imageType) // Set the content type according to your image format
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
return bucketName + "/" + fileName;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
return null; // or throw an exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从 MinIO 下载对象到本地路径
|
||||||
|
*
|
||||||
|
* @param bucketName 存储桶名称
|
||||||
|
* @param objectName MinIO 上对象的名称
|
||||||
|
* @param localFilePath 本地文件路径
|
||||||
|
*/
|
||||||
|
public void downloadMinioObjectToLocal(String bucketName, String objectName, String localFilePath) {
|
||||||
|
File localFile = new File(localFilePath);
|
||||||
|
File parentDir = localFile.getParentFile();
|
||||||
|
if (parentDir != null) {
|
||||||
|
parentDir.mkdirs(); // 创建文件夹,确保路径结构与 MinIO 一致
|
||||||
|
}
|
||||||
|
|
||||||
|
try (InputStream stream = minioClient.getObject(
|
||||||
|
GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
|
||||||
|
FileOutputStream out = new FileOutputStream(localFile)) {
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = stream.read(buffer)) != -1) {
|
||||||
|
out.write(buffer, 0, bytesRead);
|
||||||
|
}
|
||||||
|
log.info("Downloaded object {} to {}", objectName, localFilePath);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error while downloading object {}: {}", objectName, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从路径中提取存储桶名称
|
||||||
|
*
|
||||||
|
* @param path MinIO 路径
|
||||||
|
* @return 存储桶名称
|
||||||
|
*/
|
||||||
|
public String getBucketNameFromPath(String path) {
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
return path.substring(0, index); // 获取第一级路径作为 bucket 名称
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从路径中提取对象名称
|
||||||
|
*
|
||||||
|
* @param path MinIO 路径
|
||||||
|
* @return 对象名称
|
||||||
|
*/
|
||||||
|
public String getObjectNameFromPath(String path) {
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
return path.substring(index + 1); // 获取路径的其余部分作为对象名称
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
package com.ai.da.common.utils;
|
package com.ai.da.common.utils;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.data.redis.core.HashOperations;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.data.redis.core.ZSetOperations;
|
import org.springframework.data.redis.core.ZSetOperations;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@@ -152,6 +152,8 @@ public class RedisUtil {
|
|||||||
return redisTemplate.keys(key);
|
return redisTemplate.keys(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getSize(String key){return redisTemplate.opsForSet().size(key);}
|
||||||
|
|
||||||
public List<String> getMultiValue(Set<String> keys){
|
public List<String> getMultiValue(Set<String> keys){
|
||||||
return redisTemplate.opsForValue().multiGet(keys);
|
return redisTemplate.opsForValue().multiGet(keys);
|
||||||
}
|
}
|
||||||
@@ -164,4 +166,116 @@ public class RedisUtil {
|
|||||||
redisTemplate.delete(key);
|
redisTemplate.delete(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final static String PORTFOLIO_LIKE_KEY = "portfolio:like:";
|
||||||
|
|
||||||
|
public void likePost(Long portfolioId, Long userId) {
|
||||||
|
redisTemplate.opsForSet().add(PORTFOLIO_LIKE_KEY + portfolioId, String.valueOf(userId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getLikeCount(Long portfolioId) {
|
||||||
|
String key = PORTFOLIO_LIKE_KEY + portfolioId;
|
||||||
|
return redisTemplate.opsForSet().size(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Long> getLikedPortfolios(Long userId) {
|
||||||
|
// 获取所有包含PORTFOLIO_LIKE_KEY的键
|
||||||
|
Set<String> likedPortfolios = redisTemplate.keys(PORTFOLIO_LIKE_KEY + "*");
|
||||||
|
|
||||||
|
// 如果没有喜欢的,返回空列表
|
||||||
|
if (likedPortfolios == null || likedPortfolios.isEmpty()) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 过滤出包含指定用户ID的键,并提取投资组合ID
|
||||||
|
return likedPortfolios.stream()
|
||||||
|
.filter(key -> redisTemplate.opsForSet().isMember(key, String.valueOf(userId)))
|
||||||
|
.map(key -> Long.valueOf(key.replace(PORTFOLIO_LIKE_KEY, "")))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unLikePost(Long portfolioId, Long userId) {
|
||||||
|
redisTemplate.opsForSet().remove(PORTFOLIO_LIKE_KEY + portfolioId, userId.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查用户是否喜欢某个作品
|
||||||
|
public boolean isPostLikedByUser(Long portfolioId, Long userId) {
|
||||||
|
String key = PORTFOLIO_LIKE_KEY + portfolioId;
|
||||||
|
Boolean isMember = redisTemplate.opsForSet().isMember(key, userId.toString());
|
||||||
|
return isMember != null && isMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static String PORTFOLIO_VIEW_KEY = "portfolio:view:";
|
||||||
|
|
||||||
|
public void increaseViewCount(Long portfolioId) {
|
||||||
|
String key = PORTFOLIO_VIEW_KEY + portfolioId;
|
||||||
|
redisTemplate.opsForValue().increment(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getViewCount(Long portfolioId) {
|
||||||
|
String key = PORTFOLIO_VIEW_KEY + portfolioId;
|
||||||
|
return redisTemplate.opsForValue().increment(key, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getViewCount(String key) {
|
||||||
|
Object value = redisTemplate.opsForValue().get(key);
|
||||||
|
if (value instanceof Integer) {
|
||||||
|
return Long.valueOf((Integer) value);
|
||||||
|
} else if (value instanceof Long) {
|
||||||
|
return (Long) value;
|
||||||
|
} else if (value instanceof String) {
|
||||||
|
return Long.valueOf((String) value);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Unexpected value type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static String PERSONAL_HOMEPAGE_VIEW_KEY = "PersonalHomepage:view:";
|
||||||
|
|
||||||
|
public void increasePersonalHomepageViewCount(Long accountId) {
|
||||||
|
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
|
||||||
|
redisTemplate.opsForValue().increment(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getPersonalHomepageViewCount(Long accountId) {
|
||||||
|
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
|
||||||
|
return redisTemplate.opsForValue().increment(key, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static String MOODBOARD_POSITION_KEY = "moodboard:position:";
|
||||||
|
|
||||||
|
public void saveMoodboardPosition(Long id, String moodboardPosition) {
|
||||||
|
addToString(MOODBOARD_POSITION_KEY + id, moodboardPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMoodboardPosition(Long id) {
|
||||||
|
return getFromString(MOODBOARD_POSITION_KEY + id);
|
||||||
|
}
|
||||||
|
public final static String NICKNAME_MODIFY_TIMES = "NicknameModifyTimes:";
|
||||||
|
public void increaseCount(String key) {
|
||||||
|
redisTemplate.opsForValue().increment(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIncrementCount(String key) {
|
||||||
|
return redisTemplate.opsForValue().increment(key, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKeyExpire(String key, Long expire) {
|
||||||
|
redisTemplate.expire(key, expire, TimeUnit.DAYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static String CHANGE_MAILBOX = "ChangeMailbox:";
|
||||||
|
|
||||||
|
// 每天允许通知3次
|
||||||
|
public final static String UPLOAD_TIMEOUT_REMINDER_COUNTER = "UploadTimeoutReminderCounter";
|
||||||
|
|
||||||
|
public void addProcessId(String processId, int progress) {
|
||||||
|
// Redis 中的键,可以通过 processId 来唯一标识
|
||||||
|
String redisKey = "process:progress:" + processId;
|
||||||
|
|
||||||
|
// 将当前进度存储到 Redis
|
||||||
|
redisTemplate.opsForValue().set(redisKey, String.valueOf(progress));
|
||||||
|
|
||||||
|
// 设置过期时间为 5 分钟(300 秒)
|
||||||
|
redisTemplate.expire(redisKey, 5, TimeUnit.MINUTES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
380
src/main/java/com/ai/da/common/utils/S3Util.java
Normal file
380
src/main/java/com/ai/da/common/utils/S3Util.java
Normal file
@@ -0,0 +1,380 @@
|
|||||||
|
package com.ai.da.common.utils;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.exception.BusinessException;
|
||||||
|
import com.ai.da.common.constant.CommonConstant;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
|
||||||
|
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
|
||||||
|
import software.amazon.awssdk.core.ResponseBytes;
|
||||||
|
import software.amazon.awssdk.core.sync.RequestBody;
|
||||||
|
import software.amazon.awssdk.regions.Region;
|
||||||
|
import software.amazon.awssdk.services.s3.S3Client;
|
||||||
|
import software.amazon.awssdk.services.s3.S3Configuration;
|
||||||
|
import software.amazon.awssdk.services.s3.model.*;
|
||||||
|
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
|
||||||
|
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
|
||||||
|
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.io.*;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class S3Util {
|
||||||
|
|
||||||
|
@Value("${aws.s3.accessKeyId}")
|
||||||
|
private String accessKeyId;
|
||||||
|
|
||||||
|
@Value("${aws.s3.secretKey}")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@Value("${aws.s3.regionName}")
|
||||||
|
private String region;
|
||||||
|
|
||||||
|
public static String S3_ACCESS_KEY_ID = null;
|
||||||
|
|
||||||
|
public static String S3_SECRET_KEY = null;
|
||||||
|
|
||||||
|
public static String S3_REGION = null;
|
||||||
|
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
S3_ACCESS_KEY_ID = accessKeyId;
|
||||||
|
S3_SECRET_KEY = secretKey;
|
||||||
|
S3_REGION = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static S3Client s3Client;
|
||||||
|
|
||||||
|
private static S3Presigner s3Presigner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return software.amazon.awssdk.services.s3.S3Client
|
||||||
|
* @description: 获取S3客户端对象
|
||||||
|
*/
|
||||||
|
public synchronized S3Client getS3Client() {
|
||||||
|
if (null == s3Client) {
|
||||||
|
s3Client = S3Client.builder()
|
||||||
|
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
|
||||||
|
// .endpointOverride(URI.create(S3_URI))
|
||||||
|
.serviceConfiguration(item -> item.pathStyleAccessEnabled(true).checksumValidationEnabled(false))
|
||||||
|
.region(Region.of(S3_REGION))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
return s3Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return software.amazon.awssdk.services.s3.presigner.S3Presigner
|
||||||
|
* @description: 获取预签名对象
|
||||||
|
*/
|
||||||
|
public synchronized S3Presigner getS3PreSigner() {
|
||||||
|
if (null == s3Presigner) {
|
||||||
|
s3Presigner = S3Presigner.builder()
|
||||||
|
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
|
||||||
|
// .endpointOverride(URI.create(S3_URI))
|
||||||
|
.serviceConfiguration(S3Configuration.builder()
|
||||||
|
.checksumValidationEnabled(false)
|
||||||
|
.pathStyleAccessEnabled(true)
|
||||||
|
.build())
|
||||||
|
.region(Region.of(S3_REGION))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
return s3Presigner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String uploadImageFromBase64(String bucketName, String base64Image, String imageType) {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
|
||||||
|
String fileName = UUID.randomUUID() + "." + imageType; // or any other image format
|
||||||
|
|
||||||
|
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
|
||||||
|
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.contentType("image/png")
|
||||||
|
.contentLength((long) in.available())
|
||||||
|
.key(fileName)
|
||||||
|
.acl(ObjectCannedACL.PUBLIC_READ)
|
||||||
|
.build();
|
||||||
|
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available()));
|
||||||
|
|
||||||
|
log.info("uploadImageFromBase64 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
|
||||||
|
return bucketName + "/" + fileName;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null; // or throw an exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String upload(String bucketName, String path, MultipartFile file) {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
try {
|
||||||
|
String fileName = file.getOriginalFilename();
|
||||||
|
assert fileName != null;
|
||||||
|
String[] split = fileName.split("\\.");
|
||||||
|
if (split.length > 1) {
|
||||||
|
fileName = path + "/" + UUID.randomUUID() + "." + split[split.length - 1];
|
||||||
|
} else {
|
||||||
|
fileName = path + "/" + UUID.randomUUID();
|
||||||
|
}
|
||||||
|
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.contentType(file.getContentType())
|
||||||
|
.contentLength(file.getSize())
|
||||||
|
.key(fileName)
|
||||||
|
.acl(ObjectCannedACL.PUBLIC_READ)
|
||||||
|
.build();
|
||||||
|
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize()));
|
||||||
|
|
||||||
|
log.info("upload 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
|
||||||
|
return bucketName + "/" + fileName;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("上传文件到S3失败 异常:{}", e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo
|
||||||
|
public String upload(String bucketName, String path, MultipartFile file, String copy) {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
InputStream in = null;
|
||||||
|
try {
|
||||||
|
in = file.getInputStream();
|
||||||
|
|
||||||
|
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.contentType(file.getContentType())
|
||||||
|
.contentLength(file.getSize())
|
||||||
|
.key(path)
|
||||||
|
.acl(ObjectCannedACL.PUBLIC_READ)
|
||||||
|
.build();
|
||||||
|
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize()));
|
||||||
|
log.info("upload-copy 上传的位置:桶 - {},路径 - {}", bucketName, path);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (in != null) {
|
||||||
|
try {
|
||||||
|
in.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bucketName + "/" + path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream download(String path) {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("the.path.is.error");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String objectName = path.substring(index + 1);
|
||||||
|
return download(bucketName, objectName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream download(String bucketName, String objectName) {
|
||||||
|
try {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
GetObjectRequest objectRequest = GetObjectRequest
|
||||||
|
.builder()
|
||||||
|
.key(objectName)
|
||||||
|
.bucket(bucketName)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
|
||||||
|
ResponseBytes<GetObjectResponse> objectAsBytes = s3Client.getObjectAsBytes(objectRequest);
|
||||||
|
byte[] data = objectAsBytes.asByteArray();
|
||||||
|
log.info("download 下载图片位置:桶 - {},路径 - {}", bucketName, objectName);
|
||||||
|
return new ByteArrayInputStream(data);
|
||||||
|
|
||||||
|
/*// Write the data to a local file.
|
||||||
|
File myFile = new File("files/images.png");
|
||||||
|
OutputStream os = new FileOutputStream(myFile);
|
||||||
|
os.write(data);
|
||||||
|
System.out.println("Successfully obtained bytes from an S3 object");
|
||||||
|
os.close();
|
||||||
|
return null;*/
|
||||||
|
// return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("");
|
||||||
|
throw new BusinessException("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteObject(String path) {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("The path is error!");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String objectName = path.substring(index + 1);
|
||||||
|
deleteObject(bucketName, objectName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteObject(String bucketName, String objectName) {
|
||||||
|
try {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest
|
||||||
|
.builder()
|
||||||
|
.key(objectName)
|
||||||
|
.bucket(bucketName)
|
||||||
|
.build();
|
||||||
|
s3Client.deleteObject(deleteObjectRequest);
|
||||||
|
log.info("Object " + objectName + " successfully removed from bucket " + bucketName);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
log.info("Error while removing object " + objectName + " from bucket " + bucketName + ": " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPreSignedUrl(String path, int expiry) {
|
||||||
|
if (LocalCacheUtils.getPresignedUrlCache(path) != null) {
|
||||||
|
return LocalCacheUtils.getPresignedUrlCache(path);
|
||||||
|
} else {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("The path is error!");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String fileName = path.substring(index + 1);
|
||||||
|
String preSignedUrl = getPreSignatureUrl(bucketName, fileName, expiry);
|
||||||
|
LocalCacheUtils.setPresignedUrlCache(path, preSignedUrl);
|
||||||
|
return preSignedUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPreSignedUrl(String path, int expiry, boolean resetCache) {
|
||||||
|
if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("The path is error!");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String fileName = path.substring(index + 1);
|
||||||
|
String presignedUrl = getPreSignatureUrl(bucketName, fileName, expiry);
|
||||||
|
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
|
||||||
|
return presignedUrl;
|
||||||
|
} else {
|
||||||
|
return LocalCacheUtils.getPresignedUrlCache(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param keyName key名称: test/2022/06/123.pdf
|
||||||
|
* @param signatureDurationTime 有效期 单位:秒
|
||||||
|
* @return java.lang.String
|
||||||
|
* @description: 生成预签名URL
|
||||||
|
*/
|
||||||
|
public String getPreSignatureUrl(String bucket, String keyName, Integer signatureDurationTime) {
|
||||||
|
String preSignatureUrl = "";
|
||||||
|
try {
|
||||||
|
S3Presigner s3PreSigner = getS3PreSigner();
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
setObjectAcl(s3Client, bucket, keyName, ObjectCannedACL.PUBLIC_READ);
|
||||||
|
|
||||||
|
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
|
||||||
|
.bucket(bucket)
|
||||||
|
.key(keyName)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
//设置预签名URL可访问时间
|
||||||
|
signatureDurationTime = Optional.ofNullable(signatureDurationTime)
|
||||||
|
.map(item -> {
|
||||||
|
if (item.intValue() > CommonConstant.Numbers.NUMBER_10080) {
|
||||||
|
item = CommonConstant.Numbers.NUMBER_10080;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
})
|
||||||
|
.orElse(CommonConstant.Numbers.NUMBER_10);
|
||||||
|
GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder()
|
||||||
|
.signatureDuration(Duration.ofMinutes(signatureDurationTime))
|
||||||
|
.getObjectRequest(getObjectRequest)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
PresignedGetObjectRequest presignedGetObjectRequest =
|
||||||
|
s3PreSigner.presignGetObject(getObjectPresignRequest);
|
||||||
|
|
||||||
|
preSignatureUrl = String.valueOf(presignedGetObjectRequest.url());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成预签名URL失败,异常:{}", e.getMessage());
|
||||||
|
}
|
||||||
|
return preSignatureUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setObjectAcl(S3Client s3, String bucketName, String keyName, ObjectCannedACL acl) {
|
||||||
|
PutObjectAclRequest aclRequest = PutObjectAclRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.key(keyName)
|
||||||
|
.acl(acl)
|
||||||
|
.build();
|
||||||
|
s3.putObjectAcl(aclRequest);
|
||||||
|
}
|
||||||
|
public boolean doesObjectExist(String bucketName, String objectName) {
|
||||||
|
try {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.key(objectName)
|
||||||
|
.build();
|
||||||
|
HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.info("指定文件 {}/{} 不存在", bucketName, objectName);
|
||||||
|
// 如果发生异常,说明文件不存在或者出现了其他错误
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String base64UploadToPath(String base64, String bucketName, String path) {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
String[] parts = base64.split(",");
|
||||||
|
String imageType = parts[0].split("/")[1].split(";")[0];
|
||||||
|
String base64Data = parts[1];
|
||||||
|
|
||||||
|
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
|
||||||
|
String fileName;
|
||||||
|
if (!StringUtil.isNullOrEmpty(path)) {
|
||||||
|
fileName = path + "." + imageType; // or any other image format
|
||||||
|
} else {
|
||||||
|
fileName = UUID.randomUUID() + "." + imageType;
|
||||||
|
}
|
||||||
|
|
||||||
|
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
|
||||||
|
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
|
||||||
|
.bucket(bucketName)
|
||||||
|
.contentType("image/" + imageType)
|
||||||
|
.contentLength((long) in.available())
|
||||||
|
.key(fileName)
|
||||||
|
.acl(ObjectCannedACL.PUBLIC_READ)
|
||||||
|
.build();
|
||||||
|
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available()));
|
||||||
|
|
||||||
|
log.info("base64UploadToPath 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
|
||||||
|
return bucketName + "/" + fileName;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null; // or throw an exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<String> listAllBucket() {
|
||||||
|
S3Client s3Client = getS3Client();
|
||||||
|
ListBucketsResponse listBucketsResponse = s3Client.listBuckets();
|
||||||
|
List<Bucket> buckets = listBucketsResponse.buckets();
|
||||||
|
return buckets.stream().map(Bucket::name).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -53,10 +53,12 @@ public class SendEmailUtil {
|
|||||||
* 绑定邮箱
|
* 绑定邮箱
|
||||||
*/
|
*/
|
||||||
public static String BIND_MAILBOX_SUBJECT = "绑定邮箱";
|
public static String BIND_MAILBOX_SUBJECT = "绑定邮箱";
|
||||||
|
public static String CHANGE_MAILBOX_SUBJECT = "Change Mailbox";
|
||||||
/**
|
/**
|
||||||
* 登入模板id
|
* 登入模板id
|
||||||
*/
|
*/
|
||||||
public static Long LOGIN_TEMPLATE_ID = 58020L;
|
public static Long LOGIN_TEMPLATE_ID = 58020L;
|
||||||
|
public static Long PORTFOLIO_REGISTER_ID = 124847L;
|
||||||
/**
|
/**
|
||||||
* 修改密码模板id
|
* 修改密码模板id
|
||||||
*/
|
*/
|
||||||
@@ -70,6 +72,8 @@ public class SendEmailUtil {
|
|||||||
*/
|
*/
|
||||||
public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L;
|
public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L;
|
||||||
|
|
||||||
|
public static Long CHANGE_MAILBOX_TEMPLATE_ID = 128210L;
|
||||||
|
|
||||||
|
|
||||||
public static Boolean send(String receiverAddress, String ip, Long templateId, String verifyCode) {
|
public static Boolean send(String receiverAddress, String ip, Long templateId, String verifyCode) {
|
||||||
try {
|
try {
|
||||||
@@ -91,7 +95,8 @@ public class SendEmailUtil {
|
|||||||
req.setDestination(new String[]{receiverAddress});
|
req.setDestination(new String[]{receiverAddress});
|
||||||
String subject = templateId == LOGIN_TEMPLATE_ID ? LOGIN_SUBJECT :
|
String subject = templateId == LOGIN_TEMPLATE_ID ? LOGIN_SUBJECT :
|
||||||
templateId == UPDATE_PWD_TEMPLATE_ID ? FORGET_PWD_SUBJECT :
|
templateId == UPDATE_PWD_TEMPLATE_ID ? FORGET_PWD_SUBJECT :
|
||||||
templateId == EXCEPTION_ID_TEMPLATE_ID ? EXCEPTION_ID_SUBJECT : BIND_MAILBOX_SUBJECT;
|
templateId == EXCEPTION_ID_TEMPLATE_ID ? EXCEPTION_ID_SUBJECT :
|
||||||
|
templateId == CHANGE_MAILBOX_TEMPLATE_ID ? CHANGE_MAILBOX_SUBJECT : BIND_MAILBOX_SUBJECT;
|
||||||
req.setSubject(subject);
|
req.setSubject(subject);
|
||||||
req.setTemplate(contractTemplate(templateId, verifyCode, ip));
|
req.setTemplate(contractTemplate(templateId, verifyCode, ip));
|
||||||
|
|
||||||
@@ -134,7 +139,9 @@ public class SendEmailUtil {
|
|||||||
private final static Long NOTIFICATION_TEMPLATE_ID = 117216L;
|
private final static Long NOTIFICATION_TEMPLATE_ID = 117216L;
|
||||||
private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L;
|
private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L;
|
||||||
private final static Long TRIAL_ORDER_LIST_ID = 122273L;
|
private final static Long TRIAL_ORDER_LIST_ID = 122273L;
|
||||||
public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) {
|
private final static Long NO_TRIAL_ORDER_LIST_ID = 122591L;
|
||||||
|
|
||||||
|
public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country, boolean link) {
|
||||||
try {
|
try {
|
||||||
// 实例化一个认证对象
|
// 实例化一个认证对象
|
||||||
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
@@ -171,7 +178,7 @@ public class SendEmailUtil {
|
|||||||
}else {
|
}else {
|
||||||
template.setTemplateID(NOTIFICATION_TEMPLATE_ID);
|
template.setTemplateID(NOTIFICATION_TEMPLATE_ID);
|
||||||
}
|
}
|
||||||
template.setTemplateData(buildNotificationData(trialOrder));
|
template.setTemplateData(buildNotificationData(trialOrder, link));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -227,6 +234,40 @@ public class SendEmailUtil {
|
|||||||
throw new BusinessException("failed.to.send.mail");
|
throw new BusinessException("failed.to.send.mail");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void sendNoExcelEmail(String receiverAddress, String senderAddress) {
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
if (StringUtils.isEmpty(senderAddress)) {
|
||||||
|
senderAddress = SEND_ADDRESS;
|
||||||
|
}
|
||||||
|
req.setFromEmailAddress(senderAddress);
|
||||||
|
req.setDestination(new String[]{receiverAddress});
|
||||||
|
|
||||||
|
// 根据邮件类型设置不同的主题和模板
|
||||||
|
String subject = "";
|
||||||
|
Template template = new Template();
|
||||||
|
subject = "昨日试用订单数据";
|
||||||
|
template.setTemplateID(NO_TRIAL_ORDER_LIST_ID);
|
||||||
|
|
||||||
|
req.setSubject(subject);
|
||||||
|
req.setTemplate(template);
|
||||||
|
// 发送邮件
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L;
|
private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L;
|
||||||
public static void sendWillBeExpiredEmail(Account account, String senderAddress) {
|
public static void sendWillBeExpiredEmail(Account account, String senderAddress) {
|
||||||
try {
|
try {
|
||||||
@@ -309,7 +350,7 @@ public class SendEmailUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 构建试用订单通过通知数据
|
// 构建试用订单通过通知数据
|
||||||
private static String buildNotificationData(TrialOrder trialOrder) {
|
private static String buildNotificationData(TrialOrder trialOrder, boolean link) {
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
// 设置试用订单通过通知相关数据
|
// 设置试用订单通过通知相关数据
|
||||||
jsonObject.put("title", trialOrder.getTitle());
|
jsonObject.put("title", trialOrder.getTitle());
|
||||||
@@ -317,11 +358,19 @@ public class SendEmailUtil {
|
|||||||
jsonObject.put("givenName", trialOrder.getGivenName());
|
jsonObject.put("givenName", trialOrder.getGivenName());
|
||||||
jsonObject.put("userName", trialOrder.getUserName());
|
jsonObject.put("userName", trialOrder.getUserName());
|
||||||
jsonObject.put("email", trialOrder.getEmail());
|
jsonObject.put("email", trialOrder.getEmail());
|
||||||
|
if (link) {
|
||||||
|
jsonObject.put("days", 14);
|
||||||
|
}else {
|
||||||
|
jsonObject.put("days", 5);
|
||||||
|
}
|
||||||
return jsonObject.toJSONString();
|
return jsonObject.toJSONString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static Long UPGRADE_NOTIFICATION_ID = 118855L;
|
private final static Long UPGRADE_NOTIFICATION_ID = 118855L;
|
||||||
public static void sendUpgradeNotification(Account account, String senderAddress) {
|
private final static Long UPGRADE_SUCCESS_NOTIFICATION_ID = 118856L;
|
||||||
|
private final static Long UPGRADE_NOTIFICATION_ID_CHINESE = 122898L;
|
||||||
|
private final static Long UPGRADE_SUCCESS_NOTIFICATION_ID_CHINESE = 122899L;
|
||||||
|
public static void sendUpgradeNotification(Account account, String senderAddress, Integer type) {
|
||||||
try {
|
try {
|
||||||
// 实例化一个认证对象
|
// 实例化一个认证对象
|
||||||
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
@@ -340,8 +389,20 @@ public class SendEmailUtil {
|
|||||||
// 根据邮件类型设置不同的主题和模板
|
// 根据邮件类型设置不同的主题和模板
|
||||||
String subject = "";
|
String subject = "";
|
||||||
Template template = new Template();
|
Template template = new Template();
|
||||||
subject = "Upcoming AiDA 3.0 Launch and Scheduled Maintenance";
|
// if (type == 1) {
|
||||||
template.setTemplateID(UPGRADE_NOTIFICATION_ID);
|
// subject = "Upcoming System Upgrade for AiDA 3.0";
|
||||||
|
// template.setTemplateID(UPGRADE_NOTIFICATION_ID);
|
||||||
|
// }else {
|
||||||
|
// subject = "即将到来的AiDA 3.0系统升级";
|
||||||
|
// template.setTemplateID(UPGRADE_NOTIFICATION_ID_CHINESE);
|
||||||
|
// }
|
||||||
|
if (type == 1) {
|
||||||
|
subject = "Successful System Upgrade and New Features in AiDA 3.1";
|
||||||
|
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID);
|
||||||
|
}else {
|
||||||
|
subject = "系统升级成功和AiDA 3.1新功能";
|
||||||
|
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID_CHINESE);
|
||||||
|
}
|
||||||
template.setTemplateData(buildAccountData(account));
|
template.setTemplateData(buildAccountData(account));
|
||||||
|
|
||||||
req.setSubject(subject);
|
req.setSubject(subject);
|
||||||
@@ -394,7 +455,357 @@ public class SendEmailUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final static Long QUESTIONNAIRE_FEEDBACK_EN_ID = 124151L;
|
||||||
|
private final static Long QUESTIONNAIRE_FEEDBACK_CN_ID = 124156L;
|
||||||
|
public static void questionnaireRelatedNotify(String userName, String email, String language){
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{email});
|
||||||
|
|
||||||
|
// 根据邮件类型设置不同的主题和模板
|
||||||
|
Template template = new Template();
|
||||||
|
String subject = "Thank You for Completing the AiDA System Survey";
|
||||||
|
template.setTemplateID(QUESTIONNAIRE_FEEDBACK_EN_ID);
|
||||||
|
if (language.equals("CN")) {
|
||||||
|
subject = "感谢您完成AiDA系统问卷调查";
|
||||||
|
template.setTemplateID(QUESTIONNAIRE_FEEDBACK_CN_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject parameter = new JSONObject();
|
||||||
|
parameter.put("userName", userName);
|
||||||
|
|
||||||
|
template.setTemplateData(parameter.toJSONString());
|
||||||
|
|
||||||
|
req.setSubject(subject);
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 发送邮件
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final static Long NEW_USER_PAYMENT_NOTIFICATION_EN = 124889L;
|
||||||
|
private final static Long NEW_USER_PAYMENT_NOTIFICATION_CN = 124888L;
|
||||||
|
private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_EN = 124892L;
|
||||||
|
private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_CN = 124891L;
|
||||||
|
|
||||||
|
public static void notificationForPaidUser(String receiverAddress, int emailType, String country, String userName, String date){
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{receiverAddress});
|
||||||
|
|
||||||
|
// 根据邮件类型设置不同的主题和模板
|
||||||
|
String subject = "";
|
||||||
|
Template template = new Template();
|
||||||
|
JSONObject parameter = new JSONObject();
|
||||||
|
switch (emailType) {
|
||||||
|
// 新用户
|
||||||
|
case 1:
|
||||||
|
subject = "Welcome to AiDA!";
|
||||||
|
if (country.equals("China")) {
|
||||||
|
template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_CN);
|
||||||
|
}else {
|
||||||
|
template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_EN);
|
||||||
|
}
|
||||||
|
parameter.put("userName", userName);
|
||||||
|
parameter.put("email", receiverAddress);
|
||||||
|
break;
|
||||||
|
// 续费用户
|
||||||
|
case 2:
|
||||||
|
subject = "Account renewal notification";
|
||||||
|
if (country.equals("China")) {
|
||||||
|
template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_CN);
|
||||||
|
}else {
|
||||||
|
template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_EN);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
parameter.put("userName", userName);
|
||||||
|
parameter.put("date", date);
|
||||||
|
template.setTemplateData(parameter.toJSONString());
|
||||||
|
|
||||||
|
req.setSubject(subject);
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 发送邮件
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Boolean designWorksRegister(String userEmail, String randomVerifyCode) {
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
|
||||||
|
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
|
||||||
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{userEmail});
|
||||||
|
String subject = "Tourist registration";
|
||||||
|
req.setSubject(subject);
|
||||||
|
|
||||||
|
req.setTemplate(contractTemplate(PORTFOLIO_REGISTER_ID, randomVerifyCode, null));
|
||||||
|
|
||||||
|
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
// 输出json格式的字符串回包
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
return Boolean.TRUE;
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Long NEW_USER_REGISTER_NOTIFICATION_EN = 126919L;
|
||||||
|
|
||||||
|
public static void notificationForRegisterUser(String receiverAddress){
|
||||||
|
try{
|
||||||
|
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
|
||||||
|
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
|
||||||
|
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{receiverAddress});
|
||||||
|
|
||||||
|
req.setSubject("Welcome to AiDa");
|
||||||
|
Template template = new Template();
|
||||||
|
template.setTemplateID(NEW_USER_REGISTER_NOTIFICATION_EN);
|
||||||
|
template.setTemplateData("{\"email\":\" " + receiverAddress + "\"}");
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Long CHANGE_MAILBOX_CONFIRM_CN = 128278L;
|
||||||
|
private final static Long CHANGE_MAILBOX_CONFIRM_EN = 128277L;
|
||||||
|
|
||||||
|
public static void changeMailboxConfirm(String receiverAddress, String language, String name, String link){
|
||||||
|
try{
|
||||||
|
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
|
||||||
|
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
|
||||||
|
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{receiverAddress});
|
||||||
|
Template template = new Template();
|
||||||
|
if (language.equals("ENGLISH")){
|
||||||
|
req.setSubject("Change the email address bound to the AiDA account");
|
||||||
|
template.setTemplateID(CHANGE_MAILBOX_CONFIRM_EN);
|
||||||
|
}else {
|
||||||
|
req.setSubject("更换AiDA账号绑定的邮箱地址");
|
||||||
|
template.setTemplateID(CHANGE_MAILBOX_CONFIRM_CN);
|
||||||
|
}
|
||||||
|
JSONObject param = new JSONObject();
|
||||||
|
param.put("userName", name);
|
||||||
|
param.put("link", link);
|
||||||
|
|
||||||
|
template.setTemplateData(param.toJSONString());
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Long UPLOAD_TIMEOUT_REMINDER = 128324L;
|
||||||
|
|
||||||
|
public static void uploadTimeoutReminder(String userName, String time){
|
||||||
|
String xp = "xupei3360@163.com";
|
||||||
|
String shb = "shahaibodd99@gmail.com";
|
||||||
|
String wxd = "X1627315083@163.com";
|
||||||
|
String pkc = "kaicpang.pang@connect.polyu.hk";
|
||||||
|
try{
|
||||||
|
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
|
||||||
|
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
|
||||||
|
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
|
req.setDestination(new String[]{shb, xp, wxd, pkc});
|
||||||
|
Template template = new Template();
|
||||||
|
req.setSubject("上传图片超时提醒");
|
||||||
|
template.setTemplateID(UPLOAD_TIMEOUT_REMINDER);
|
||||||
|
JSONObject param = new JSONObject();
|
||||||
|
param.put("userName", userName);
|
||||||
|
param.put("time", time);
|
||||||
|
|
||||||
|
template.setTemplateData(param.toJSONString());
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Long HALFPRICEPROMOTION_CN_ID = 128582L;
|
||||||
|
private final static Long HALFPRICEPROMOTION_EN_ID = 128583L;
|
||||||
|
public static void halfPricePromotion(Account account, String senderAddress, int type) {
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
if (StringUtils.isEmpty(senderAddress)) {
|
||||||
|
senderAddress = CODE_CREATE_SEND_ADDRESS;
|
||||||
|
}
|
||||||
|
req.setFromEmailAddress(senderAddress);
|
||||||
|
req.setDestination(new String[]{account.getUserEmail()});
|
||||||
|
|
||||||
|
// 根据邮件类型设置不同的主题和模板
|
||||||
|
String subject = "";
|
||||||
|
Template template = new Template();
|
||||||
|
// if (type == 1) {
|
||||||
|
// subject = "Upcoming System Upgrade for AiDA 3.0";
|
||||||
|
// template.setTemplateID(UPGRADE_NOTIFICATION_ID);
|
||||||
|
// }else {
|
||||||
|
// subject = "即将到来的AiDA 3.0系统升级";
|
||||||
|
// template.setTemplateID(UPGRADE_NOTIFICATION_ID_CHINESE);
|
||||||
|
// }
|
||||||
|
if (type == 1) {
|
||||||
|
subject = "AiDA workshop - Win a trip to Hong Kong!";
|
||||||
|
template.setTemplateID(HALFPRICEPROMOTION_EN_ID);
|
||||||
|
}else {
|
||||||
|
subject = "AiDA workshop - 赢取香港之旅";
|
||||||
|
template.setTemplateID(HALFPRICEPROMOTION_CN_ID);
|
||||||
|
}
|
||||||
|
template.setTemplateData(buildAccountData(account));
|
||||||
|
|
||||||
|
req.setSubject(subject);
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 发送邮件
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private final static Long SYSTEM_UPGRADE_CN_ID = 131743L;
|
||||||
|
private final static Long SYSTEM_UPGRADE_EN_ID = 131744L;
|
||||||
|
public static void temporaryUpgrade(Account account, String senderAddress, int type) {
|
||||||
|
try {
|
||||||
|
// 实例化一个认证对象
|
||||||
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
|
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||||
|
ClientProfile clientProfile = new ClientProfile();
|
||||||
|
clientProfile.setHttpProfile(httpProfile);
|
||||||
|
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||||
|
SendEmailRequest req = new SendEmailRequest();
|
||||||
|
if (StringUtils.isEmpty(senderAddress)) {
|
||||||
|
senderAddress = CODE_CREATE_SEND_ADDRESS;
|
||||||
|
}
|
||||||
|
req.setFromEmailAddress(senderAddress);
|
||||||
|
req.setDestination(new String[]{account.getUserEmail()});
|
||||||
|
|
||||||
|
// 根据邮件类型设置不同的主题和模板
|
||||||
|
String subject = "";
|
||||||
|
Template template = new Template();
|
||||||
|
if (type == 1) {
|
||||||
|
subject = "AiDA system upgrade completed";
|
||||||
|
template.setTemplateID(SYSTEM_UPGRADE_EN_ID);
|
||||||
|
}else {
|
||||||
|
subject = "AiDA系统升级完成";
|
||||||
|
template.setTemplateID(SYSTEM_UPGRADE_CN_ID);
|
||||||
|
}
|
||||||
|
template.setTemplateData(buildAccountData(account));
|
||||||
|
|
||||||
|
req.setSubject(subject);
|
||||||
|
req.setTemplate(template);
|
||||||
|
|
||||||
|
// 发送邮件
|
||||||
|
SendEmailResponse resp = client.SendEmail(req);
|
||||||
|
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
log.info("邮件发送失败###{}", e.toString());
|
||||||
|
throw new BusinessException("failed.to.send.mail");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,115 @@
|
|||||||
|
package com.ai.da.common.websocket;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
import javax.websocket.*;
|
||||||
|
import javax.websocket.server.PathParam;
|
||||||
|
import javax.websocket.server.ServerEndpoint;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
|
||||||
|
@ServerEndpoint(value = "/notification/{id}")
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class NotificationConnection {
|
||||||
|
|
||||||
|
//连接超时
|
||||||
|
public static final long MAX_TIME_OUT = 3 * 60 * 1000;
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
private Long userId;
|
||||||
|
// 这里用ConcurrentHashMap 因为他是一个线程安全的Map
|
||||||
|
private static ConcurrentHashMap<Long, NotificationConnection> websockets = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@OnOpen
|
||||||
|
public void onOpen(Session session, @PathParam("id") String id) { // 接收到前端传来的用户ID
|
||||||
|
this.session = session;
|
||||||
|
this.userId = Long.valueOf(id);
|
||||||
|
this.session.setMaxIdleTimeout(MAX_TIME_OUT);
|
||||||
|
websockets.put(Long.parseLong(id), this); //将ID作为key,当前的对象作为Value
|
||||||
|
log.info("【建立连接】 用户为:{}", this.session);
|
||||||
|
log.info("【建立连接】 用户Id为:{}", id);
|
||||||
|
log.info("【当前连接总数】 为:{}", websockets.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClose
|
||||||
|
public void onClose(CloseReason reason) {
|
||||||
|
log.info("【连接断开】 用户为:{}, sessionId: {}, 原因为{}", this.userId, this.session.getId(), reason);
|
||||||
|
log.info("【当前连接总数】 为:{}", websockets.size());
|
||||||
|
websockets.remove(this.userId); // 将当前的对象从集合中删除
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误时调用
|
||||||
|
* @param throwable 异常
|
||||||
|
*/
|
||||||
|
@OnError
|
||||||
|
public void onError(Throwable throwable) {
|
||||||
|
log.info("【连接异常】 用户为:{} , sessionId: {}", this.userId, this.session.getId(), throwable);
|
||||||
|
websockets.remove(this.userId); // 将当前的对象从集合中删除
|
||||||
|
log.info("【当前连接总数】 为:{}", websockets.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
//收到了客户端消息执行的操作
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(@RequestParam String text){
|
||||||
|
Map<String, String> textMap = JSONObject.parseObject(text, Map.class);
|
||||||
|
log.info("收到了一条来自 {} 的消息:{}, sessionId:{}", this.userId, textMap.get("text"), this.session.getId());
|
||||||
|
// return "已收到你的消息";
|
||||||
|
if (textMap.get("text").equals("PING")){
|
||||||
|
sendMsg(JSON.toJSONString("PONG"), this.userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMsg(String message, Long userId) {
|
||||||
|
if (userId == null) { // 如果等于null则证明是群发
|
||||||
|
// 获取当前Map的一个迭代器,遍历Map的方式有很多种,看着来
|
||||||
|
// 这个就是遍历这个集合的过程....
|
||||||
|
for (Map.Entry<Long, NotificationConnection> entry : websockets.entrySet()) {
|
||||||
|
// 获取每一个Entry实例
|
||||||
|
// 获取每一个Value,而这个Value就是WebSocket的实例
|
||||||
|
NotificationConnection webSocket = entry.getValue();
|
||||||
|
// 接下来就是遍历群发
|
||||||
|
log.info("广播消息 【给用户】 :{}发送消息【{}】", webSocket, message);
|
||||||
|
try {
|
||||||
|
webSocket.session.getBasicRemote().sendText(message); // 发送!!!!!!!!!
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Failed to send message to session {}: {}", webSocket.session.getId(), e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // 如果不是群发,则判断ID,其余步骤一致
|
||||||
|
// 获取当前Map的一个迭代器,遍历Map的方式有很多种,看着来
|
||||||
|
// 这个就是遍历这个集合的过程....
|
||||||
|
for (Map.Entry<Long, NotificationConnection> entry : websockets.entrySet()) {
|
||||||
|
// 获取每一个Entry实例
|
||||||
|
// 获取每一个Value,而这个Value就是WebSocket的实例
|
||||||
|
NotificationConnection webSocket = entry.getValue();
|
||||||
|
// 获取每一个Key,这个Key就是用户ID
|
||||||
|
Long key = entry.getKey();
|
||||||
|
// 判断用户ID与当前的Key相等
|
||||||
|
if (userId.equals(key)) {
|
||||||
|
log.info("私发消息 【给用户】 :{}发送消息【{}】", key, message); // 打印
|
||||||
|
if (webSocket.session.isOpen()){
|
||||||
|
// 避免因为网络问题或其他原因导致连接突然关闭而报错
|
||||||
|
try {
|
||||||
|
webSocket.session.getBasicRemote().sendText(message); // 则发送给当前的用户即可
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Failed to send message to session {}: {}", webSocket.session.getId(), e.getMessage());
|
||||||
|
// 这里可以选择移除关闭的 session
|
||||||
|
websockets.remove(entry.getKey());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
log.info("连接已关闭,sessionId:{}, userId:{}", webSocket.session.getId(), key);
|
||||||
|
websockets.remove(entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.ai.da.common.websocket.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration of WebSocket
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfig {
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,22 @@
|
|||||||
package com.ai.da.controller;
|
package com.ai.da.controller;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.exception.BusinessException;
|
||||||
import com.ai.da.common.response.PageBaseResponse;
|
import com.ai.da.common.response.PageBaseResponse;
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||||
import com.ai.da.model.dto.*;
|
import com.ai.da.model.dto.*;
|
||||||
import com.ai.da.model.vo.AccountLoginVO;
|
import com.ai.da.model.vo.AccountLoginVO;
|
||||||
import com.ai.da.model.vo.AccountPreLoginVO;
|
import com.ai.da.model.vo.AccountPreLoginVO;
|
||||||
|
import com.ai.da.model.vo.PersonalHomepageVO;
|
||||||
import com.ai.da.service.AccountService;
|
import com.ai.da.service.AccountService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@@ -153,4 +158,156 @@ public class AccountController {
|
|||||||
accountService.upgradeNotification();
|
accountService.upgradeNotification();
|
||||||
return Response.success(true);
|
return Response.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@ApiOperation(value = "广场用户注册")
|
||||||
|
@PostMapping("/designWorksRegister")
|
||||||
|
public Response<Boolean> designWorksRegister(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) {
|
||||||
|
return Response.success(accountService.designWorksRegister(accountDesignWorksRegisterDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@ApiOperation(value = "广场用户注册")
|
||||||
|
@PostMapping("/designWorksRegisterCode")
|
||||||
|
public Response<AccountLoginVO> designWorksRegisterCode(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) {
|
||||||
|
return Response.success(accountService.designWorksRegisterCode(accountDesignWorksRegisterDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 填写调查问卷
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@ApiOperation(value = "填写调查问卷")
|
||||||
|
@PostMapping("/questionnaire")
|
||||||
|
public Response<Boolean> questionnaire(@Valid @RequestBody String questionnaireInfo){
|
||||||
|
return Response.success(accountService.collectQuestionnaires(questionnaireInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参与活动 获取福利
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@ApiOperation(value = "参与活动 获取福利")
|
||||||
|
@GetMapping("/activity")
|
||||||
|
public Response<String> getActivityBenefits(){
|
||||||
|
return Response.success(accountService.getActivityBenefits());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "将用户账号过期时间设置为过期当天的23:59:59")
|
||||||
|
@GetMapping("/setUserValidToDayEnd")
|
||||||
|
public Response<List<Long>> setUserValidToDayEnd(){
|
||||||
|
return Response.success(accountService.setUserValidToDayEnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户上传头像
|
||||||
|
@ApiOperation(value = "上传头像")
|
||||||
|
@PostMapping(path = "/uploadAvatar")
|
||||||
|
public Response<String> uploadAvatar(@RequestParam("file") MultipartFile file) {
|
||||||
|
if (null == file || StringUtils.isEmpty(file.getOriginalFilename())) {
|
||||||
|
throw new BusinessException("file.cannot.be.empty");
|
||||||
|
}
|
||||||
|
return Response.success(accountService.uploadAvatar(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "个人主页浏览量增加")
|
||||||
|
@GetMapping("/viewsIncrease")
|
||||||
|
public Response<Boolean> viewsGet(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(accountService.viewsIncrease(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取个人主页信息")
|
||||||
|
@GetMapping("/personalHomepage")
|
||||||
|
public Response<PersonalHomepageVO> getPersonalHomepage(@RequestParam("id") Long id){
|
||||||
|
return Response.success(accountService.getPersonalHomepage(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "getUsernameModifyTimes")
|
||||||
|
@GetMapping("/getNicknameModifyTimes")
|
||||||
|
public Response<Map<String, Long>> getNicknameModifyTimes(){
|
||||||
|
return Response.success(accountService.getNicknameModifyTimes());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "editUserName")
|
||||||
|
@GetMapping("/editUserName")
|
||||||
|
public Response<String> editUserName(@RequestParam("newUserName") String newUserName){
|
||||||
|
accountService.editUserName(newUserName);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "verifyUserEmail")
|
||||||
|
@GetMapping("/verifyUserEmail")
|
||||||
|
public Response<String> verifyUserEmail(@RequestParam("verifyCode") String verifyCode){
|
||||||
|
accountService.verifyUserEmail(verifyCode);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "changeUserEmail")
|
||||||
|
@GetMapping("/changeUserEmail")
|
||||||
|
public Response<String> changeUserEmail(@RequestParam("newMailbox") String newMailbox){
|
||||||
|
accountService.changeUserEmail(newMailbox);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "activateNewEmail")
|
||||||
|
@GetMapping("/activateNewEmail")
|
||||||
|
public Response<String> activateNewEmail(@RequestParam("token") String token){
|
||||||
|
accountService.activateNewEmail(token);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("halfPricePromotion")
|
||||||
|
@ApiOperation(value = "十月半价活动")
|
||||||
|
public Response<Boolean> halfPricePromotion() {
|
||||||
|
accountService.halfPricePromotion();
|
||||||
|
return Response.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("temporaryUpgrade")
|
||||||
|
@ApiOperation(value = "临时升级")
|
||||||
|
public Response<Boolean> temporaryUpgrade() {
|
||||||
|
accountService.temporaryUpgrade();
|
||||||
|
return Response.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("enterpriseLogin")
|
||||||
|
@ApiOperation(value = "企业登录")
|
||||||
|
public Response<AccountLoginVO> enterpriseLogin(@Valid @RequestBody AccountLoginDTO accountDTO) {
|
||||||
|
return Response.success(accountService.enterpriseLogin(accountDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("schoolLogin")
|
||||||
|
@ApiOperation(value = "学校登录")
|
||||||
|
public Response<AccountLoginVO> schoolLogin(@Valid @RequestBody AccountLoginDTO accountDTO) {
|
||||||
|
return Response.success(accountService.schoolLogin(accountDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("addOrUpdateSubAccount")
|
||||||
|
@ApiOperation(value = "子账号新增")
|
||||||
|
public Response<Boolean> addSubAccount(@Valid @RequestBody AddSubAccountDTO addSubAccountDTO) {
|
||||||
|
return Response.success(accountService.addSubAccount(addSubAccountDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("deleteSubAccount")
|
||||||
|
@ApiOperation(value = "子账号删除")
|
||||||
|
public Response<Boolean> deleteSubAccount(@Valid @RequestBody AddSubAccountDTO addSubAccountDTO) {
|
||||||
|
return Response.success(accountService.deleteSubAccount(addSubAccountDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("subAccountList")
|
||||||
|
@ApiOperation(value = "子账号查询")
|
||||||
|
public Response<PageBaseResponse<Account>> subAccountList(@Valid @RequestBody SubAccountPageDTO subAccountPageDTO) {
|
||||||
|
return Response.success(accountService.subAccountList(subAccountPageDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("accountDetail")
|
||||||
|
@ApiOperation(value = "账号详情")
|
||||||
|
public Response<Account> accountDetail(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(accountService.accountDetail(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("getAccountDetail")
|
||||||
|
@ApiOperation(value = "获取账户信息")
|
||||||
|
public Response<AccountLoginVO> getAccountDetail() {
|
||||||
|
return Response.success(accountService.getAccountDetail());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,45 @@
|
|||||||
package com.ai.da.controller;
|
package com.ai.da.controller;
|
||||||
|
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.service.AlipayHKService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
@CrossOrigin
|
@CrossOrigin
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/ali-pay-hk")
|
@RequestMapping("/api/alipay-hk")
|
||||||
@Api(tags = "网站支付 香港支付宝")
|
@Api(tags = "网站支付 香港支付宝")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AlipayHKController {
|
public class AlipayHKController {
|
||||||
|
|
||||||
public Response<String> createOrder(){
|
@Resource
|
||||||
return Response.success();
|
private AlipayHKService alipayHKService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "创建订单")
|
||||||
|
@PostMapping(value = "/createOrder/{wallet}/{amount}")
|
||||||
|
public Response<String> createOrder(@PathVariable Integer amount, @PathVariable String wallet) {
|
||||||
|
String order = alipayHKService.createOrder(amount, wallet);
|
||||||
|
return Response.success(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("支付通知")
|
||||||
|
@PostMapping("/trade/notify")
|
||||||
|
public String callback(@RequestBody String paramString){
|
||||||
|
log.info("alipay-hk callback parameter : {}", paramString);
|
||||||
|
return alipayHKService.callback(paramString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("订单查询")
|
||||||
|
@PostMapping("/trade/query/{orderRef}")
|
||||||
|
public Response<String> queryOrder(@PathVariable String orderRef){
|
||||||
|
String s = alipayHKService.queryDetail(orderRef);
|
||||||
|
return Response.success(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,39 +4,46 @@ package com.ai.da.controller;
|
|||||||
import com.ai.da.common.context.UserContext;
|
import com.ai.da.common.context.UserContext;
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
import com.ai.da.mapper.primary.DesignMapper;
|
import com.ai.da.mapper.primary.DesignMapper;
|
||||||
import com.ai.da.mapper.primary.TrialOrderMapper;
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||||
|
import com.ai.da.model.dto.AccountAddDTO;
|
||||||
import com.ai.da.model.dto.UserDesignStatisticDTO;
|
import com.ai.da.model.dto.UserDesignStatisticDTO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireFeedbackVO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireVO;
|
||||||
|
import com.ai.da.model.vo.QueryUserConditionsVO;
|
||||||
|
import com.ai.da.service.ConvenientInquiryService;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import io.swagger.annotations.ApiParam;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Api(tags = "便利查询")
|
@Api(tags = "便利查询")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/inquiry")
|
@RequestMapping("/api/inquiry")
|
||||||
public class ConvenientInquiryController {
|
public class ConvenientInquiryController {
|
||||||
|
|
||||||
@Resource
|
|
||||||
private TrialOrderMapper trialOrderMapper;
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private DesignMapper designMapper;
|
private DesignMapper designMapper;
|
||||||
|
@Resource
|
||||||
|
private ConvenientInquiryService convenientInquiryService;
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("获取当前所有试用用户")
|
@ApiOperation("获取当前所有试用用户")
|
||||||
@GetMapping("/getTrial")
|
@PostMapping("/getTrial")
|
||||||
public Response<List<TrialOrder>> getTrial(){
|
public Response<IPage<TrialOrder>> getTrial(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
|
||||||
Long accountId = UserContext.getUserHolder().getId();
|
Long accountId = UserContext.getUserHolder().getId();
|
||||||
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
|
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
|
||||||
List<TrialOrder> trialOrders = trialOrderMapper.selectList(null);
|
return Response.success(convenientInquiryService.getTrial(queryUserConditionsVO));
|
||||||
return Response.success(trialOrders);
|
|
||||||
} else {
|
} else {
|
||||||
return Response.fail("Sorry, you don't have permission");
|
return Response.fail("Sorry, you don't have permission");
|
||||||
}
|
}
|
||||||
@@ -44,7 +51,8 @@ public class ConvenientInquiryController {
|
|||||||
|
|
||||||
@ApiOperation("获取指定时间区间内所有用户design的使用情况")
|
@ApiOperation("获取指定时间区间内所有用户design的使用情况")
|
||||||
@GetMapping("/getDesignStatistic")
|
@GetMapping("/getDesignStatistic")
|
||||||
public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime,@RequestParam String endTime){
|
public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime, @RequestParam String endTime,
|
||||||
|
@RequestParam(required = false) List<Long> ids, @RequestParam(required = false) String email) {
|
||||||
Long accountId = UserContext.getUserHolder().getId();
|
Long accountId = UserContext.getUserHolder().getId();
|
||||||
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
|
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
|
||||||
if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00";
|
if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00";
|
||||||
@@ -53,11 +61,110 @@ public class ConvenientInquiryController {
|
|||||||
Date date = new Date();
|
Date date = new Date();
|
||||||
endTime = simpleDateFormat.format(date);
|
endTime = simpleDateFormat.format(date);
|
||||||
}
|
}
|
||||||
List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime);
|
if (!StringUtil.isNullOrEmpty(email)){
|
||||||
|
email = email.trim();
|
||||||
|
}
|
||||||
|
List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime, ids, email);
|
||||||
return Response.success(designStatistic);
|
return Response.success(designStatistic);
|
||||||
} else {
|
} else {
|
||||||
return Response.fail("Sorry, you don't have permission");
|
return Response.fail("Sorry, you don't have permission");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//调查问卷
|
||||||
|
@ApiOperation("获取调查问卷统计详情")
|
||||||
|
@GetMapping("/getQuestionnaireStatistic")
|
||||||
|
public Response<QuestionnaireFeedbackVO> getQuestionnaire() {
|
||||||
|
return Response.success(convenientInquiryService.getQuestionnaireInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取所有调查问卷")
|
||||||
|
@GetMapping("/getAllQuestionnaire")
|
||||||
|
public Response<List<QuestionnaireVO>> getAllQuestionnaire() {
|
||||||
|
return Response.success(convenientInquiryService.getAllQuestionnaire());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取近期新用户")
|
||||||
|
@PostMapping("/recentNewUser")
|
||||||
|
public Response<IPage<Account>> recentNewUser(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
|
||||||
|
return Response.success(convenientInquiryService.recentNewUser(queryUserConditionsVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取近期新用户图表数据")
|
||||||
|
@GetMapping("/recentNewUserChart")
|
||||||
|
public Response<Map<String, Object>> recentNewUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
|
||||||
|
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
|
||||||
|
@ApiParam("userType") @RequestParam Integer userType) {
|
||||||
|
return Response.success(convenientInquiryService.recentNewUserChart(startTime, endTime, userType));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取近期活跃用户")
|
||||||
|
@PostMapping("/recentActiveUser")
|
||||||
|
public Response<IPage<Account>> recentActiveUser(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
|
||||||
|
return Response.success(convenientInquiryService.recentActiveUser(queryUserConditionsVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取近期活跃用户图表数据")
|
||||||
|
@GetMapping("/recentActiveUserChart")
|
||||||
|
public Response<Integer> recentActiveUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
|
||||||
|
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime) {
|
||||||
|
return Response.success(convenientInquiryService.recentActiveUserChart(startTime, endTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取用户的各模块功能使用详情")
|
||||||
|
@GetMapping("/getActiveUserFunc")
|
||||||
|
public Response<Map<String, List<Object>>> getActiveUserFunc(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
|
||||||
|
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
|
||||||
|
@ApiParam("userIdList") @RequestParam @Nullable List<Long> userIdList) {
|
||||||
|
return Response.success(convenientInquiryService.getActiveUserFunc(startTime, endTime, userIdList));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("试用用户到正式用户的转化率")
|
||||||
|
@GetMapping("/conversionRate")
|
||||||
|
public Response<Map<String, Object>> conversionRate(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime,
|
||||||
|
@ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) {
|
||||||
|
return Response.success(convenientInquiryService.conversionRate(startTime, endTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("试用用户国家/城市分布")
|
||||||
|
@GetMapping("/trialUserCountry")
|
||||||
|
public Response<Map<String, List<Object>>> trialUserCountry(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime,
|
||||||
|
@ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) {
|
||||||
|
return Response.success(convenientInquiryService.trialUserCountry(startTime, endTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("添加用户")
|
||||||
|
@PostMapping("/addUser")
|
||||||
|
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
|
||||||
|
return Response.success(convenientInquiryService.addUser(accountAddDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("修改用户信息")
|
||||||
|
@PostMapping("/modifyUser")
|
||||||
|
public Response<Boolean> modifyUser(@ApiParam(value = "用户id") @RequestParam @Nullable Long accountId,
|
||||||
|
@ApiParam(value = "有效期截止时间的毫秒级unix格式") @RequestParam @Nullable Long validEndTime,
|
||||||
|
@ApiParam(value = "用户类型 1/2/3/0 -> yearly/monthly/trial/visitor") @RequestParam @Nullable Integer systemUser,
|
||||||
|
@ApiParam("积分") @RequestParam @Nullable Long credits) {
|
||||||
|
return Response.success(convenientInquiryService.modifyUser(accountId, validEndTime, systemUser, credits));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取用户信息")
|
||||||
|
@PostMapping("/getUserInfo")
|
||||||
|
public Response<IPage<Account>> getUserInfo(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
|
||||||
|
Long accountId = UserContext.getUserHolder().getId();
|
||||||
|
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
|
||||||
|
return Response.success(convenientInquiryService.getUserInfo(queryUserConditionsVO));
|
||||||
|
} else {
|
||||||
|
return Response.fail("Sorry, you don't have permission");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取所有用户id")
|
||||||
|
@GetMapping("/getAllUserId")
|
||||||
|
public Response<List<Map<String, Object>>> getAllUsrIdList() {
|
||||||
|
return Response.success(convenientInquiryService.getAllUserIdList());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class DesignController {
|
|||||||
@ApiOperation(value = "设计 Conllection")
|
@ApiOperation(value = "设计 Conllection")
|
||||||
@PostMapping("/designCollection")
|
@PostMapping("/designCollection")
|
||||||
@CrossOrigin
|
@CrossOrigin
|
||||||
public Response<DesignCollectionVO> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
|
public Response<String> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
|
||||||
return Response.success(designService.designCollection(designDTO));
|
return Response.success(designService.designCollection(designDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ public class DesignController {
|
|||||||
|
|
||||||
@ApiOperation(value = "重新设计 Collection")
|
@ApiOperation(value = "重新设计 Collection")
|
||||||
@PostMapping("/reDesignCollection")
|
@PostMapping("/reDesignCollection")
|
||||||
public Response<DesignCollectionVO> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
|
public Response<String> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
|
||||||
return Response.success(designService.reDesignCollection(reDesignDTO));
|
return Response.success(designService.reDesignCollection(reDesignDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,8 +73,8 @@ public class DesignController {
|
|||||||
|
|
||||||
@ApiOperation(value = "sketchBoard upload generate design前裁剪")
|
@ApiOperation(value = "sketchBoard upload generate design前裁剪")
|
||||||
@PostMapping("/sketchBoardsBoundingBox")
|
@PostMapping("/sketchBoardsBoundingBox")
|
||||||
public Response<List<CollectionSketchVO>> sketchesBoundingBox(@Valid @RequestBody SketchesBoundingBoxDTO sketchesBoundingBoxDTO) {
|
public Response<List<CollectionSketchVO>> sketchesBoundingBox(@Valid @RequestBody ReDesignCollectionDTO reDesignCollectionDTO) {
|
||||||
return Response.success(designService.sketchesBoundingBox(sketchesBoundingBoxDTO));
|
return Response.success(designService.sketchesBoundingBox(reDesignCollectionDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "通过designItemId获取模特图")
|
@ApiOperation(value = "通过designItemId获取模特图")
|
||||||
@@ -83,4 +83,16 @@ public class DesignController {
|
|||||||
return Response.success(designService.getModel(designItemIdList));
|
return Response.success(designService.getModel(designItemIdList));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取design结果")
|
||||||
|
@GetMapping("/getDesignResult")
|
||||||
|
public Response<DesignCollectionVO> getDesignResult(@RequestParam("requestId") String requestId, @RequestParam("objectSignList") List<String> objectSignList){
|
||||||
|
return Response.success(designService.getDesignResult(requestId, objectSignList));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "云生成")
|
||||||
|
@PostMapping("/designCloud")
|
||||||
|
@CrossOrigin
|
||||||
|
public Response<String> designCloud(@Valid @RequestBody DesignCollectionDTO designDTO) {
|
||||||
|
return Response.success(designService.designCloud(designDTO));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.ai.da.model.dto.*;
|
|||||||
import com.ai.da.model.vo.*;
|
import com.ai.da.model.vo.*;
|
||||||
import com.ai.da.service.DesignItemService;
|
import com.ai.da.service.DesignItemService;
|
||||||
import com.ai.da.service.DesignService;
|
import com.ai.da.service.DesignService;
|
||||||
|
import com.ai.da.service.UserLikeService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
import io.swagger.annotations.ApiParam;
|
||||||
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
@Api(tags = "design Detail模块")
|
@Api(tags = "design Detail模块")
|
||||||
@@ -77,4 +80,18 @@ public class DesignDetailController {
|
|||||||
public Response<ComposeLayersVO> editPositionAndScale(@Valid @RequestBody EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException {
|
public Response<ComposeLayersVO> editPositionAndScale(@Valid @RequestBody EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException {
|
||||||
return Response.success(designItemService.editLayersPositionAndScale(positionAndScaleVO));
|
return Response.success(designItemService.editLayersPositionAndScale(positionAndScaleVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "mask数据兼容")
|
||||||
|
@GetMapping("/convertWithoutGradient")
|
||||||
|
public Response<String> convertHistoryMaskWithoutGradient(){
|
||||||
|
designItemService.convertHistoryMaskWithoutGradient();
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "mask数据库路径更新")
|
||||||
|
@GetMapping("/updateMaskUrl")
|
||||||
|
public Response<String> updateMaskUrl(){
|
||||||
|
designItemService.updateMaskUrl();
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package com.ai.da.controller;
|
|||||||
|
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
import com.ai.da.model.dto.GenerateLikeDTO;
|
import com.ai.da.model.dto.GenerateLikeDTO;
|
||||||
|
import com.ai.da.model.dto.GenerateModifyDTO;
|
||||||
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
|
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
|
||||||
|
import com.ai.da.model.dto.ImageToSketchDTO;
|
||||||
import com.ai.da.model.vo.*;
|
import com.ai.da.model.vo.*;
|
||||||
import com.ai.da.service.GenerateService;
|
import com.ai.da.service.GenerateService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@@ -27,11 +29,11 @@ public class GenerateController {
|
|||||||
@Resource
|
@Resource
|
||||||
private GenerateService generateService;
|
private GenerateService generateService;
|
||||||
|
|
||||||
@ApiOperation("自动识别sketch的caption 暂时未上")
|
/*@ApiOperation("自动识别sketch的caption 暂时未上")
|
||||||
@PostMapping("/caption")
|
@PostMapping("/caption")
|
||||||
public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) {
|
public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) {
|
||||||
return Response.success(generateService.generateCaption(sketchElementId));
|
return Response.success(generateService.generateCaption(sketchElementId));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/*@ApiOperation("通过文字、图片生成图片")
|
/*@ApiOperation("通过文字、图片生成图片")
|
||||||
@PostMapping("/sketchAndPrint")
|
@PostMapping("/sketchAndPrint")
|
||||||
@@ -63,8 +65,9 @@ public class GenerateController {
|
|||||||
@GetMapping("/stopWaiting")
|
@GetMapping("/stopWaiting")
|
||||||
public Response<String> stopWaiting(@RequestParam("userId") Long userId,
|
public Response<String> stopWaiting(@RequestParam("userId") Long userId,
|
||||||
@RequestParam("uniqueId") List<String> uniqueId,
|
@RequestParam("uniqueId") List<String> uniqueId,
|
||||||
@RequestParam("timeZone") String timeZone) {
|
@RequestParam("timeZone") String timeZone,
|
||||||
generateService.cancelGenerate(userId, uniqueId, timeZone);
|
@RequestParam("type") String type) {
|
||||||
|
generateService.cancelGenerate(userId, uniqueId, timeZone, type);
|
||||||
return Response.success("stop waiting successfully");
|
return Response.success("stop waiting successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,5 +85,17 @@ public class GenerateController {
|
|||||||
return Response.success(generateResult);
|
return Response.success(generateResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "imageToSketch")
|
||||||
|
@PostMapping("/imageToSketch")
|
||||||
|
public Response<GenerateResultVO> imageToSketch(@Valid @RequestBody ImageToSketchDTO imageToSketchDTO) {
|
||||||
|
return Response.success(generateService.imageToSketch(imageToSketchDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
// modifySketch
|
||||||
|
@ApiOperation(value = "modifySketch")
|
||||||
|
@PostMapping("/modifySketch")
|
||||||
|
public Response<GenerateResultVO> modifySketch(@Valid @RequestBody GenerateModifyDTO generateModifyDTO) {
|
||||||
|
return Response.success(generateService.modifySketch(generateModifyDTO));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ public class LibraryController {
|
|||||||
Response<String> response = new Response();
|
Response<String> response = new Response();
|
||||||
log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO));
|
log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO));
|
||||||
String url = libraryModelPointService.modelsDot(modelsDotDTO);
|
String url = libraryModelPointService.modelsDot(modelsDotDTO);
|
||||||
response.setData(minioUtil.getPresignedUrl(url, 24 * 60));
|
response.setData(minioUtil.getPreSignedUrl(url, 24 * 60));
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.ai.da.controller;
|
||||||
|
|
||||||
|
import com.ai.da.common.response.PageBaseResponse;
|
||||||
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.model.dto.GetNotificationDTO;
|
||||||
|
import com.ai.da.model.vo.NotificationVO;
|
||||||
|
import com.ai.da.model.dto.PublishSysNotificationDTO;
|
||||||
|
import com.ai.da.service.MessageCenterService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Api(tags = "消息中心模块")
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/message")
|
||||||
|
public class MessageCenterController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MessageCenterService messageCenterService;
|
||||||
|
|
||||||
|
// 获取未读消息总数
|
||||||
|
@ApiOperation(value = "获取未读消息数")
|
||||||
|
@GetMapping("/getUnreadCount")
|
||||||
|
public Response<Map<String, Long>> getUnreadMessage(){
|
||||||
|
return Response.success(messageCenterService.getAllTypeMessageUnreadCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取历史消息
|
||||||
|
@ApiOperation(value = "获取历史消息")
|
||||||
|
@PostMapping("/getHistoryNotification")
|
||||||
|
public Response<PageBaseResponse<NotificationVO>> getHistoryNotification(@Valid @RequestBody GetNotificationDTO getNotificationDTO) {
|
||||||
|
return Response.success(messageCenterService.getHistoryNotification(getNotificationDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 已读消息
|
||||||
|
@ApiOperation(value = "设置消息状态为已读")
|
||||||
|
@PostMapping("/setReadStatus")
|
||||||
|
public Response<Boolean> setReadStatus(@RequestParam("notificationIdList") List<Long> notificationIdList, @RequestParam("type") String type) {
|
||||||
|
return Response.success(messageCenterService.setReadStatus(notificationIdList, type));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发布系统消息
|
||||||
|
@ApiOperation(value = "发布系统消息")
|
||||||
|
@PostMapping("/publishSysMessage")
|
||||||
|
public Response<String> publishSysMessage(@Valid @RequestBody PublishSysNotificationDTO message) {
|
||||||
|
messageCenterService.publishSystemNotification(message);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "一键已读")
|
||||||
|
@PostMapping("/oneClickRead")
|
||||||
|
public Response<String> setReadAll(@RequestParam("type") String type) {
|
||||||
|
messageCenterService.setReadAll(type);
|
||||||
|
return Response.success("success");
|
||||||
|
}
|
||||||
|
}
|
||||||
157
src/main/java/com/ai/da/controller/PortfolioController.java
Normal file
157
src/main/java/com/ai/da/controller/PortfolioController.java
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
package com.ai.da.controller;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.exception.BusinessException;
|
||||||
|
import com.ai.da.common.response.PageBaseResponse;
|
||||||
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
|
import com.ai.da.model.dto.*;
|
||||||
|
import com.ai.da.model.vo.*;
|
||||||
|
import com.ai.da.model.vo.CommentVO;
|
||||||
|
import com.ai.da.model.vo.PortfolioVO;
|
||||||
|
import com.ai.da.model.vo.UserLikeChooseVO;
|
||||||
|
import com.ai.da.service.PortfolioService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Api(tags = "Portfolio模块")
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/portfolio")
|
||||||
|
public class PortfolioController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PortfolioService portfolioService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "发布作品集")
|
||||||
|
@PostMapping("/publish")
|
||||||
|
public Response<Long> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) {
|
||||||
|
return Response.success(portfolioService.publish(canvas, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除作品集")
|
||||||
|
@GetMapping("/delete")
|
||||||
|
public Response<Boolean> delete(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.delete(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@ApiOperation(value = "作品集page")
|
||||||
|
@PostMapping("/page")
|
||||||
|
public Response<PageBaseResponse<PortfolioVO>> page(@Valid @RequestBody QueryPortfolioPageDTO query) {
|
||||||
|
return Response.success(portfolioService.page(query));
|
||||||
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@ApiOperation(value = "作品详情")
|
||||||
|
@PostMapping("/detail")
|
||||||
|
public Response<PortfolioVO> detail(@Valid @RequestBody PortfolioDTO portfolioDTO) {
|
||||||
|
return Response.success(portfolioService.detail(portfolioDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "选择作品")
|
||||||
|
@PostMapping("/choose")
|
||||||
|
public Response<UserLikeChooseVO> choose(@Valid @RequestBody PortfolioDTO portfolioDTO) {
|
||||||
|
return Response.success(portfolioService.choose(portfolioDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "更新作品")
|
||||||
|
@PostMapping("/update")
|
||||||
|
public Response<PortfolioVO> update(@Valid @RequestBody PortfolioDTO portfolioDTO) {
|
||||||
|
return Response.success(portfolioService.update(portfolioDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "广场用户注册")
|
||||||
|
@PostMapping("/designWorksRegister")
|
||||||
|
public Response<Boolean> designWorksRegister(@Valid @RequestBody DesignWorksRegisterDTO designWorksRegisterDTO) {
|
||||||
|
return Response.success(portfolioService.designWorksRegister(designWorksRegisterDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "喜欢")
|
||||||
|
@GetMapping("/like")
|
||||||
|
public Response<Boolean> like(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.like(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "不喜欢")
|
||||||
|
@GetMapping("/unlike")
|
||||||
|
public Response<Boolean> unlike(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.unlike(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取点赞数")
|
||||||
|
@GetMapping("/getLikeCount")
|
||||||
|
public Response<Long> getLikeCount(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.getLikeCount(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "评论")
|
||||||
|
@PostMapping("/comment")
|
||||||
|
public Response<Boolean> comment(@Valid @RequestBody CommentDTO commentDTO) {
|
||||||
|
return Response.success(portfolioService.comment(commentDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "评论列表")
|
||||||
|
@PostMapping("/commentPage")
|
||||||
|
public Response<PageBaseResponse<CommentVO>> commentPage(@Valid @RequestBody CommentPageDTO commentPageDTO) {
|
||||||
|
return Response.success(portfolioService.commentPage(commentPageDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "增加浏览量")
|
||||||
|
@GetMapping("/viewsIncrease")
|
||||||
|
public Response<Boolean> viewsIncrease(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.viewsIncrease(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "浏览量获取")
|
||||||
|
@GetMapping("/viewsGet")
|
||||||
|
public Response<Long> viewsGet(@RequestParam("id") Long id) {
|
||||||
|
return Response.success(portfolioService.viewsGet(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除评论")
|
||||||
|
@PostMapping("/commentDelete")
|
||||||
|
public Response<Boolean> commentDelete(@Valid @RequestBody CommentDTO commentDTO) {
|
||||||
|
return Response.success(portfolioService.commentDelete(commentDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "关注")
|
||||||
|
@GetMapping("/follow")
|
||||||
|
public Response<String> follow(@RequestParam("followeeId") Long followeeId) {
|
||||||
|
portfolioService.follow(followeeId);
|
||||||
|
return Response.success(BusinessException.getMessageFromResource("subscription.success"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "取消关注")
|
||||||
|
@GetMapping("/cancelFollow")
|
||||||
|
public Response<String> cancelFollow(@RequestParam("followeeId") Long followeeId) {
|
||||||
|
portfolioService.cancelFollow(followeeId);
|
||||||
|
return Response.success(BusinessException.getMessageFromResource("unsubscribe.success"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取关注列表")
|
||||||
|
@PostMapping("/getFolloweeList")
|
||||||
|
public Response<List<AccountFollowVO>> getFolloweeList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
|
||||||
|
return Response.success(portfolioService.getFolloweeList(getFollowListDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取粉丝列表")
|
||||||
|
@PostMapping("/getFollowerList")
|
||||||
|
public Response<List<AccountFollowVO>> getFollowerList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
|
||||||
|
return Response.success(portfolioService.getFollowerList(getFollowListDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @ApiOperation(value = "按标签名查询作品")
|
||||||
|
@GetMapping("/queryPortfolioByTag")
|
||||||
|
public Response<List<PortfolioVO>> queryPortfolioByTag(@RequestParam(value = "tagName", required = false) String tagName,
|
||||||
|
@RequestParam(value = "tagId", required = false) Long tagId) {
|
||||||
|
return Response.success(portfolioService.queryPortfolioByTag(tagName, tagId));
|
||||||
|
}*/
|
||||||
|
}
|
||||||
@@ -8,13 +8,11 @@ import com.ai.da.common.response.Response;
|
|||||||
import com.ai.da.common.utils.CopyUtil;
|
import com.ai.da.common.utils.CopyUtil;
|
||||||
import com.ai.da.common.utils.MinioUtil;
|
import com.ai.da.common.utils.MinioUtil;
|
||||||
import com.ai.da.mapper.primary.TDesignPythonOutfitMapper;
|
import com.ai.da.mapper.primary.TDesignPythonOutfitMapper;
|
||||||
import com.ai.da.mapper.primary.entity.Account;
|
import com.ai.da.mapper.primary.entity.*;
|
||||||
import com.ai.da.mapper.primary.entity.Library;
|
|
||||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfit;
|
|
||||||
import com.ai.da.mapper.primary.entity.UserLikeGroup;
|
|
||||||
import com.ai.da.model.dto.*;
|
import com.ai.da.model.dto.*;
|
||||||
import com.ai.da.model.vo.*;
|
import com.ai.da.model.vo.*;
|
||||||
import com.ai.da.service.*;
|
import com.ai.da.service.*;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@@ -26,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
@@ -50,6 +49,8 @@ public class SavedCollectionController {
|
|||||||
private MinioUtil minioUtil;
|
private MinioUtil minioUtil;
|
||||||
@Resource
|
@Resource
|
||||||
private ClassificationService classificationService;
|
private ClassificationService classificationService;
|
||||||
|
@Resource
|
||||||
|
private PortfolioService portfolioService;
|
||||||
|
|
||||||
@ApiOperation(value = "History用户分页分组列表")
|
@ApiOperation(value = "History用户分页分组列表")
|
||||||
@PostMapping("/queryUserGroup")
|
@PostMapping("/queryUserGroup")
|
||||||
@@ -103,9 +104,9 @@ public class SavedCollectionController {
|
|||||||
}
|
}
|
||||||
List<Long> groupIds = page.getRecords().stream().map(UserLikeGroup::getId).collect(Collectors.toList());
|
List<Long> groupIds = page.getRecords().stream().map(UserLikeGroup::getId).collect(Collectors.toList());
|
||||||
List<UserLikeVO> groupDetails = userLikeService.getGroupDetails(groupIds);
|
List<UserLikeVO> groupDetails = userLikeService.getGroupDetails(groupIds);
|
||||||
if (CollectionUtils.isEmpty(groupDetails)) {
|
// if (CollectionUtils.isEmpty(groupDetails)) {
|
||||||
throw new BusinessException("groupDetails.not.found");
|
// throw new BusinessException("groupDetails.not.found");
|
||||||
}
|
// }
|
||||||
Map<Long, List<UserLikeVO>> groupDetailMap = groupDetails.stream()
|
Map<Long, List<UserLikeVO>> groupDetailMap = groupDetails.stream()
|
||||||
.collect(Collectors.groupingBy(UserLikeVO::getUserLikeGroupId));
|
.collect(Collectors.groupingBy(UserLikeVO::getUserLikeGroupId));
|
||||||
|
|
||||||
@@ -116,13 +117,25 @@ public class SavedCollectionController {
|
|||||||
userLikeGroupVO.setUpdateDate(group.getUpdateDate().getTime());
|
userLikeGroupVO.setUpdateDate(group.getUpdateDate().getTime());
|
||||||
userLikeGroupVO.setAuthor(account.getUserName());
|
userLikeGroupVO.setAuthor(account.getUserName());
|
||||||
//count 和detail
|
//count 和detail
|
||||||
|
if (groupDetailMap.keySet().contains(group.getId())) {
|
||||||
List<UserLikeVO> details = groupDetailMap.get(group.getId());
|
List<UserLikeVO> details = groupDetailMap.get(group.getId());
|
||||||
for (UserLikeVO detail : details) {
|
for (UserLikeVO detail : details) {
|
||||||
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(detail.getDesignOutfitId());
|
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(detail.getDesignOutfitId());
|
||||||
detail.setUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60));
|
detail.setUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60));
|
||||||
}
|
}
|
||||||
userLikeGroupVO.setGroupDetails(details);
|
userLikeGroupVO.setGroupDetails(details);
|
||||||
userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size());
|
userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size());
|
||||||
|
}else {
|
||||||
|
userLikeGroupVO.setSketchCount(0);
|
||||||
|
}
|
||||||
|
if (userLikeGroupVO.getOriginal() == 0) {
|
||||||
|
userLikeGroupVO.setOriginalAccountName(accountService.getById(userLikeGroupVO.getOriginalAccountId()).getUserName());
|
||||||
|
Portfolio byId = portfolioService.getByIdAll(userLikeGroupVO.getOriginalPortfolioId());
|
||||||
|
if (Objects.nonNull(byId)) {
|
||||||
|
String portfolioName = byId.getPortfolioName();
|
||||||
|
userLikeGroupVO.setOriginalPortfolioName(portfolioName);
|
||||||
|
}
|
||||||
|
}
|
||||||
return userLikeGroupVO;
|
return userLikeGroupVO;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -159,4 +172,89 @@ public class SavedCollectionController {
|
|||||||
return Response.success(userLikeGroupService.choose(userGroupId));
|
return Response.success(userLikeGroupService.choose(userGroupId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "exportSave")
|
||||||
|
@PostMapping("/exportSave")
|
||||||
|
public Response<Boolean> exportSave(@RequestParam("file") MultipartFile file, @RequestParam("userLikeGroupId") Long userLikeGroupId) {
|
||||||
|
return Response.success(userLikeGroupService.exportSave(file, userLikeGroupId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "exportSearch")
|
||||||
|
@PostMapping("/exportSearch")
|
||||||
|
public Response<JSONObject> exportSearch(@Valid @RequestBody ExportSearchDTO exportSearchDTO) {
|
||||||
|
return Response.success(userLikeGroupService.exportSearch(exportSearchDTO.getUserLikeGroupId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "toProduct")
|
||||||
|
@PostMapping("/toProduct")
|
||||||
|
public Response<List<ToProductImageResult>> toProduct(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
|
||||||
|
return Response.success(userLikeGroupService.toProduct(toProductImageDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "toProductImageElementUpload")
|
||||||
|
@PostMapping("/toProductImageElementUpload")
|
||||||
|
public Response<ToProductElementVO> toProductImageElementUpload(@RequestParam("file") MultipartFile file, @RequestParam(value = "userlikeGroupId") Long userLikeGroupId) {
|
||||||
|
return Response.success(userLikeGroupService.toProductImageElementUpload(file, userLikeGroupId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "productImageLike")
|
||||||
|
@PostMapping("/productImageLike")
|
||||||
|
public Response<Boolean> productImageLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) {
|
||||||
|
return Response.success(userLikeGroupService.productImageLike(productImageLikeDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "productImageUnLike")
|
||||||
|
@PostMapping("/productImageUnLike")
|
||||||
|
public Response<Boolean> productImageUnLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) {
|
||||||
|
return Response.success(userLikeGroupService.productImageUnLike(productImageLikeDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取生成结果")
|
||||||
|
@PostMapping("/toProductImageResult")
|
||||||
|
public Response<List<MagicToolResultVO>> getToProductImageResult(@Valid @RequestBody List<String> taskIdList) {
|
||||||
|
List<MagicToolResultVO> magicToolResultVOList = userLikeGroupService.getToProductImageResultList(taskIdList);
|
||||||
|
return Response.success(magicToolResultVOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "画布用户上传元素")
|
||||||
|
@PostMapping("/canvasElementUpload")
|
||||||
|
public Response<CanvasElementUpload> canvasElementUpload(@RequestParam("file") MultipartFile file) {
|
||||||
|
return Response.success(userLikeGroupService.canvasElementUpload(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("productImageLikeList")
|
||||||
|
@PostMapping("/productImageLikeList")
|
||||||
|
public Response<List<ToProductImageResultVO>> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
|
||||||
|
return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "relight")
|
||||||
|
@PostMapping("/relight")
|
||||||
|
public Response<List<ToProductImageResult>> relight(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
|
||||||
|
return Response.success(userLikeGroupService.relight(toProductImageDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取relight结果")
|
||||||
|
@PostMapping("/relightResult")
|
||||||
|
public Response<List<MagicToolResultVO>> getRelightResult(@Valid @RequestBody List<String> taskIdList) {
|
||||||
|
List<MagicToolResultVO> magicToolResultVOList = userLikeGroupService.getRelightResult(taskIdList);
|
||||||
|
return Response.success(magicToolResultVOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "likeHistoryRelSketch")
|
||||||
|
@PostMapping("/likeHistoryRelSketch")
|
||||||
|
public Response<String> likeHistoryRelSketch() {
|
||||||
|
return Response.success(userLikeGroupService.likeHistoryRelSketch());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "download")
|
||||||
|
@PostMapping("/download")
|
||||||
|
public Response<String> download() {
|
||||||
|
return Response.success(userLikeGroupService.download());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "productImageInitialize")
|
||||||
|
@PostMapping("/productImageInitialize")
|
||||||
|
public Response<Boolean> productImageUpload(@Valid @RequestBody ProductImageInitializeDTO productImageInitializeDTO) {
|
||||||
|
return Response.success(userLikeGroupService.productImageInitialize(productImageInitializeDTO));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
54
src/main/java/com/ai/da/controller/StripeController.java
Normal file
54
src/main/java/com/ai/da/controller/StripeController.java
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package com.ai.da.controller;
|
||||||
|
|
||||||
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.service.StripeService;
|
||||||
|
import com.paypal.http.HttpResponse;
|
||||||
|
import com.paypal.payments.Refund;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Api(tags = "Stripe模块")
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/stripe")
|
||||||
|
public class StripeController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StripeService stripeService;
|
||||||
|
|
||||||
|
@ApiOperation("创建支付链接")
|
||||||
|
@PostMapping("/createOrder/{amount}")
|
||||||
|
public Response<String> pay(@PathVariable Integer amount, @RequestParam String returnUrl) {
|
||||||
|
return Response.success(stripeService.pay(amount, returnUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("支付通知")
|
||||||
|
@PostMapping("/trade/notify")
|
||||||
|
public Response<String> callback(HttpServletRequest request) throws ServletException, IOException {
|
||||||
|
Boolean result = stripeService.notify(request);
|
||||||
|
if (result){
|
||||||
|
return Response.success(200,"success");
|
||||||
|
}else {
|
||||||
|
return Response.fail(400,"failure");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("申请退款")
|
||||||
|
@PostMapping("/trade/refund/{orderNo}/{reason}")
|
||||||
|
public Response<HttpResponse<Refund>> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException {
|
||||||
|
String response = stripeService.refund(null,orderNo,reason);
|
||||||
|
if (response.equals("退款成功")){
|
||||||
|
return Response.success();
|
||||||
|
}else {
|
||||||
|
return Response.fail("Request for refund failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
31
src/main/java/com/ai/da/controller/TagsController.java
Normal file
31
src/main/java/com/ai/da/controller/TagsController.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package com.ai.da.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.mapper.primary.entity.Product;
|
||||||
|
import com.ai.da.mapper.primary.entity.Tags;
|
||||||
|
import com.ai.da.service.ProductService;
|
||||||
|
import com.ai.da.service.TagsService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@CrossOrigin //开放前端的跨域访问
|
||||||
|
@Api(tags = "标签管理")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/tags")
|
||||||
|
public class TagsController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TagsService tagsService;
|
||||||
|
|
||||||
|
@ApiOperation("获取标签")
|
||||||
|
@GetMapping("/getTags")
|
||||||
|
public Response<List<Tags>> getTags(@RequestParam("userInput") String userInput) {
|
||||||
|
return Response.success(tagsService.getTags(userInput));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.ai.da.controller;
|
package com.ai.da.controller;
|
||||||
|
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.mapper.primary.entity.GoogleUser;
|
||||||
import com.ai.da.model.dto.*;
|
import com.ai.da.model.dto.*;
|
||||||
import com.ai.da.model.vo.AccountLoginVO;
|
import com.ai.da.model.vo.AccountLoginVO;
|
||||||
|
import com.ai.da.model.vo.DesignCollectionVO;
|
||||||
import com.ai.da.service.AccountService;
|
import com.ai.da.service.AccountService;
|
||||||
|
import com.ai.da.service.DesignService;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -14,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
|
|
||||||
@@ -27,11 +32,14 @@ public class ThirdPartyController {
|
|||||||
@Resource
|
@Resource
|
||||||
private AccountService accountService;
|
private AccountService accountService;
|
||||||
|
|
||||||
@ApiOperation(value = "Add user information")
|
@Resource
|
||||||
|
private DesignService designService;
|
||||||
|
|
||||||
|
/*@ApiOperation(value = "Add user information")
|
||||||
@PostMapping("/addUser")
|
@PostMapping("/addUser")
|
||||||
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
|
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
|
||||||
return Response.success(accountService.addUser(accountAddDTO));
|
return Response.success(accountService.addUser(accountAddDTO));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@ApiOperation(value = "Edit user information")
|
@ApiOperation(value = "Edit user information")
|
||||||
@PostMapping("/editUser")
|
@PostMapping("/editUser")
|
||||||
@@ -107,4 +115,35 @@ public class ThirdPartyController {
|
|||||||
public Response<String> getRedirectUrl() {
|
public Response<String> getRedirectUrl() {
|
||||||
return Response.success(REDIRECT_URL);
|
return Response.success(REDIRECT_URL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@ApiOperation(value = "updateNoLoginRequiredNew")
|
||||||
|
@PostMapping("/updateNoLoginRequiredNew")
|
||||||
|
public Response<String> updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
|
||||||
|
return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@GetMapping("/auth/google_callback")
|
||||||
|
public Response<String> googleCallback(@RequestParam("code") String code, HttpSession session) {
|
||||||
|
return Response.success(accountService.googleCallback(code, session));
|
||||||
|
}
|
||||||
|
@CrossOrigin
|
||||||
|
@GetMapping("/parseGoogleCredential")
|
||||||
|
public Response<AccountLoginVO> parseGoogleCredential(@RequestParam("credential") String credential) {
|
||||||
|
return Response.success(accountService.parseGoogleCredential(credential));
|
||||||
|
}
|
||||||
|
|
||||||
|
@CrossOrigin
|
||||||
|
@GetMapping("/parseWeChatCode")
|
||||||
|
public Response<AccountLoginVO> parseWeChatCode(@RequestParam("code") String code) {
|
||||||
|
return Response.success(accountService.parseWeChatCode(code));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "接收Design结果")
|
||||||
|
@PostMapping("/receiveDesignResults")
|
||||||
|
@CrossOrigin
|
||||||
|
public Response<Boolean> receiveDesignResults(@Valid @RequestBody JSONObject responseObject) {
|
||||||
|
return Response.success(designService.receiveDesignResults(responseObject));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
package com.ai.da.controller;
|
package com.ai.da.controller;
|
||||||
|
|
||||||
import com.ai.da.common.response.Response;
|
import com.ai.da.common.response.Response;
|
||||||
|
import com.ai.da.mapper.primary.entity.Style;
|
||||||
import com.ai.da.mapper.primary.entity.Workspace;
|
import com.ai.da.mapper.primary.entity.Workspace;
|
||||||
import com.ai.da.model.dto.WorkspaceDTO;
|
import com.ai.da.model.dto.WorkspaceDTO;
|
||||||
|
import com.ai.da.model.dto.WorkspaceSaveDTO;
|
||||||
import com.ai.da.model.enums.BizJson;
|
import com.ai.da.model.enums.BizJson;
|
||||||
import com.ai.da.model.vo.ModelsVO;
|
import com.ai.da.model.vo.ModelsVO;
|
||||||
|
import com.ai.da.model.vo.StyleVO;
|
||||||
import com.ai.da.model.vo.WorkspaceVO;
|
import com.ai.da.model.vo.WorkspaceVO;
|
||||||
import com.ai.da.service.WorkspaceService;
|
import com.ai.da.service.WorkspaceService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@@ -44,8 +47,8 @@ public class WorkspaceController {
|
|||||||
@GetMapping("/detail")
|
@GetMapping("/detail")
|
||||||
@ApiOperationSupport(order = 1)
|
@ApiOperationSupport(order = 1)
|
||||||
@ApiOperation(value = "详情", notes = "传入workspace")
|
@ApiOperation(value = "详情", notes = "传入workspace")
|
||||||
public Response<Workspace> detail(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) {
|
public Response<WorkspaceVO> detail(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) {
|
||||||
Workspace detail = workspaceService.getByIdNew(id);
|
WorkspaceVO detail = workspaceService.getByIdNew(id);
|
||||||
return Response.success(detail);
|
return Response.success(detail);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,8 +69,8 @@ public class WorkspaceController {
|
|||||||
@PostMapping("/saveOrUpdate")
|
@PostMapping("/saveOrUpdate")
|
||||||
@ApiOperationSupport(order = 3)
|
@ApiOperationSupport(order = 3)
|
||||||
@ApiOperation(value = "新增或编辑", notes = "传入workspace")
|
@ApiOperation(value = "新增或编辑", notes = "传入workspace")
|
||||||
public Response saveOrUpdate(@Valid @RequestBody Workspace workspace) {
|
public Response saveOrUpdate(@Valid @RequestBody WorkspaceSaveDTO workspaceDTO) {
|
||||||
return Response.success(workspaceService.saveOrUpdate(workspace));
|
return Response.success(workspaceService.saveOrUpdate(workspaceDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -92,8 +95,8 @@ public class WorkspaceController {
|
|||||||
@GetMapping("/getMannequins")
|
@GetMapping("/getMannequins")
|
||||||
@ApiOperationSupport(order = 6)
|
@ApiOperationSupport(order = 6)
|
||||||
@ApiOperation(value = "获取模特")
|
@ApiOperation(value = "获取模特")
|
||||||
public Response<List<ModelsVO>> getMannequins(@RequestParam("sex") String sex) {
|
public Response<List<ModelsVO>> getMannequins(@RequestParam("sex") String sex, @RequestParam("style") String style) {
|
||||||
List<ModelsVO> modelsVO = workspaceService.getMannequins(sex);
|
List<ModelsVO> modelsVO = workspaceService.getMannequins(sex, style);
|
||||||
return Response.success(modelsVO);
|
return Response.success(modelsVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,10 +118,17 @@ public class WorkspaceController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("maleDataInsert")
|
@PostMapping("maleDataInsert")
|
||||||
@ApiOperationSupport(order = 7)
|
@ApiOperationSupport(order = 8)
|
||||||
@ApiOperation(value = "男装数据入库入minio")
|
@ApiOperation(value = "男装数据入库入minio")
|
||||||
public Response<Boolean> maleDataInsert() throws FileNotFoundException {
|
public Response<Boolean> maleDataInsert() throws FileNotFoundException {
|
||||||
workspaceService.maleDataInsert();
|
workspaceService.maleDataInsert();
|
||||||
return Response.success(true);
|
return Response.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("styleList")
|
||||||
|
@ApiOperationSupport(order = 9)
|
||||||
|
@ApiOperation(value = "获取style列表")
|
||||||
|
public Response<List<StyleVO>> styleList() {
|
||||||
|
return Response.success(workspaceService.styleList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.AccountExtend;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper 接口
|
||||||
|
*
|
||||||
|
* @author easy-generator
|
||||||
|
* @since 2022-06-13
|
||||||
|
*/
|
||||||
|
public interface AccountExtendMapper extends CommonMapper<AccountExtend> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package com.ai.da.mapper.primary;
|
|||||||
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
import com.ai.da.mapper.primary.entity.Account;
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,6 +28,8 @@ public interface AccountMapper extends CommonMapper<Account> {
|
|||||||
* @param id
|
* @param id
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Account findById(String id);
|
// Account findById(String id);
|
||||||
|
|
||||||
|
void toVisitor(Long id, Date date);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/main/java/com/ai/da/mapper/primary/CanvasMapper.java
Normal file
7
src/main/java/com/ai/da/mapper/primary/CanvasMapper.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Canvas;
|
||||||
|
|
||||||
|
public interface CanvasMapper extends CommonMapper<Canvas> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Comment;
|
||||||
|
|
||||||
|
public interface CommentMapper extends CommonMapper<Comment> {
|
||||||
|
}
|
||||||
@@ -18,5 +18,5 @@ public interface DesignMapper extends CommonMapper<Design> {
|
|||||||
//返回插入数据后生成的主键
|
//返回插入数据后生成的主键
|
||||||
Long insertDesign(Design design);
|
Long insertDesign(Design design);
|
||||||
|
|
||||||
List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime);
|
List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime, List<Long> ids, String email);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.ExportFile;
|
||||||
|
|
||||||
|
public interface ExportFileMapper extends CommonMapper<ExportFile> {
|
||||||
|
}
|
||||||
@@ -3,5 +3,10 @@ package com.ai.da.mapper.primary;
|
|||||||
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
import com.ai.da.mapper.primary.entity.Generate;
|
import com.ai.da.mapper.primary.entity.Generate;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface GenerateMapper extends CommonMapper<Generate> {
|
public interface GenerateMapper extends CommonMapper<Generate> {
|
||||||
|
|
||||||
|
List<Map<String, Object>> getByTypeAndTime(String startTime, String endTime, List<Long> accountIdList);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Notification;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface NotificationMapper extends CommonMapper<Notification> {
|
||||||
|
|
||||||
|
List<Map<String, Object>> getTypeCount(Long receiverId);
|
||||||
|
|
||||||
|
/** 解决mybatis-plus自动过滤 is_deleted为1的数据 问题 */
|
||||||
|
Notification getUniqueLikeAndFollow(String type, Long senderId, Long receiverId, Long portfolioId);
|
||||||
|
|
||||||
|
void updateUniqueLikeAndFollow(Long id, LocalDateTime time);
|
||||||
|
|
||||||
|
void deleteNotification(Long id, LocalDateTime time);
|
||||||
|
|
||||||
|
void setPersonalNotificationAllRead(String type, Long receiverId, LocalDateTime time);
|
||||||
|
|
||||||
|
List<Long> getUnreadSysNotification(Long accountId);
|
||||||
|
}
|
||||||
12
src/main/java/com/ai/da/mapper/primary/PortfolioMapper.java
Normal file
12
src/main/java/com/ai/da/mapper/primary/PortfolioMapper.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Portfolio;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface PortfolioMapper extends CommonMapper<Portfolio> {
|
||||||
|
Portfolio getByIdAll(Long originalPortfolioId);
|
||||||
|
|
||||||
|
List<Portfolio> getByTag(Long accountId, String tagName);
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.PortfolioTags;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
public interface PortfolioTagsMapper extends CommonMapper<PortfolioTags> {
|
||||||
|
|
||||||
|
void deleteByPortfolioId(Long portfolioId);
|
||||||
|
|
||||||
|
// portfolioId与tagId建立唯一约束, 如果组合 portfolio_id 和 tag_id 已经存在,插入操作会被忽略。
|
||||||
|
void insertIgnore(Long portfolioId, Long tagId, LocalDateTime time);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.ProductImageAttribute;
|
||||||
|
|
||||||
|
public interface ProductImageAttributeMapper extends CommonMapper<ProductImageAttribute> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Questionnaire;
|
||||||
|
|
||||||
|
public interface QuestionnaireMapper extends CommonMapper<Questionnaire> {
|
||||||
|
}
|
||||||
17
src/main/java/com/ai/da/mapper/primary/StyleMapper.java
Normal file
17
src/main/java/com/ai/da/mapper/primary/StyleMapper.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Style;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper 接口
|
||||||
|
*
|
||||||
|
* @author easy-generator
|
||||||
|
* @since 2022-06-13
|
||||||
|
*/
|
||||||
|
public interface StyleMapper extends CommonMapper<Style> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.SysNotificationReadStatus;
|
||||||
|
|
||||||
|
public interface SysNotificationReadStatusMapper extends CommonMapper<SysNotificationReadStatus> {
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@ import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
|||||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail;
|
import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail;
|
||||||
import com.ai.da.model.vo.TDesignPythonOutfitDetailVO;
|
import com.ai.da.model.vo.TDesignPythonOutfitDetailVO;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import io.lettuce.core.dynamic.annotation.Param;
|
||||||
|
import org.apache.ibatis.annotations.Delete;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -24,4 +26,7 @@ public interface TDesignPythonOutfitDetailMapper extends CommonMapper<TDesignPyt
|
|||||||
*/
|
*/
|
||||||
List<TDesignPythonOutfitDetailVO> selectTDesignPythonOutfitDetailPage(IPage page, TDesignPythonOutfitDetailVO tDesignPythonOutfitDetail);
|
List<TDesignPythonOutfitDetailVO> selectTDesignPythonOutfitDetailPage(IPage page, TDesignPythonOutfitDetailVO tDesignPythonOutfitDetail);
|
||||||
|
|
||||||
|
@Delete("DELETE FROM t_design_python_outfit_detail WHERE design_python_outfit_id = #{designPythonOutfitId}")
|
||||||
|
void deleteByDesignPythonOutfitIdPhysical(@Param("designPythonOutfitId") Long designPythonOutfitId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/main/java/com/ai/da/mapper/primary/TagsMapper.java
Normal file
17
src/main/java/com/ai/da/mapper/primary/TagsMapper.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Tags;
|
||||||
|
import com.ai.da.model.dto.TagsDTO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public interface TagsMapper extends CommonMapper<Tags> {
|
||||||
|
|
||||||
|
List<Map<String, String>> getMatchingTags(String userInput);
|
||||||
|
|
||||||
|
List<TagsDTO> getTagByPortfolioId(Long portfolioId);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.ToProductElement;
|
||||||
|
|
||||||
|
public interface ToProductElementMapper extends CommonMapper<ToProductElement> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.ToProductImageRecord;
|
||||||
|
|
||||||
|
public interface ToProductImageRecordMapper extends CommonMapper<ToProductImageRecord> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.ToProductImageResult;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface ToProductImageResultMapper extends CommonMapper<ToProductImageResult> {
|
||||||
|
|
||||||
|
List<Map<String, Object>> getByTypeAndTime(String startTime, String endTime, List<Long> accountIdList);
|
||||||
|
}
|
||||||
@@ -3,6 +3,9 @@ package com.ai.da.mapper.primary;
|
|||||||
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapper 接口
|
* Mapper 接口
|
||||||
*
|
*
|
||||||
@@ -11,6 +14,6 @@ import com.ai.da.mapper.primary.entity.TrialOrder;
|
|||||||
*/
|
*/
|
||||||
public interface TrialOrderMapper extends CommonMapper<TrialOrder> {
|
public interface TrialOrderMapper extends CommonMapper<TrialOrder> {
|
||||||
|
|
||||||
|
Map<String, Long> countOfficialUser();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/main/java/com/ai/da/mapper/primary/UserFollowMapper.java
Normal file
19
src/main/java/com/ai/da/mapper/primary/UserFollowMapper.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.UserFollow;
|
||||||
|
import com.ai.da.model.vo.AccountFollowVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public interface UserFollowMapper extends CommonMapper<UserFollow> {
|
||||||
|
List<AccountFollowVO> getFolloweeListByFollower(Long followerAccountId, Integer limit, Integer offset, String order);
|
||||||
|
|
||||||
|
List<AccountFollowVO> getFollowerListByFollowee(Long followeeAccountId, Integer limit, Integer offset, String order);
|
||||||
|
|
||||||
|
List<AccountFollowVO> getFolloweeListByName(String name, Long followerId);
|
||||||
|
|
||||||
|
List<AccountFollowVO> getFollowerListByName(String name, Long followeeId);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,6 +3,9 @@ package com.ai.da.mapper.primary;
|
|||||||
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
import com.ai.da.mapper.primary.entity.UserLike;
|
import com.ai.da.mapper.primary.entity.UserLike;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapper 接口
|
* Mapper 接口
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ai.da.mapper.primary;
|
||||||
|
|
||||||
|
import com.ai.da.common.config.mybatis.plus.CommonMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.WorkspaceRelStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper 接口
|
||||||
|
*
|
||||||
|
* @author easy-generator
|
||||||
|
* @since 2022-06-13
|
||||||
|
*/
|
||||||
|
public interface WorkspaceRelStyleMapper extends CommonMapper<WorkspaceRelStyle> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package com.ai.da.mapper.primary.entity;
|
|||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
@@ -69,11 +70,13 @@ public class Account implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
private Date createDate;
|
private Date createDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新时间
|
* 更新时间
|
||||||
*/
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
private Date updateDate;
|
private Date updateDate;
|
||||||
|
|
||||||
private Integer isTrial;
|
private Integer isTrial;
|
||||||
@@ -86,4 +89,35 @@ public class Account implements Serializable {
|
|||||||
* 积分
|
* 积分
|
||||||
*/
|
*/
|
||||||
private BigDecimal credits;
|
private BigDecimal credits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于区分游客与系统用户
|
||||||
|
* 0 : 游客
|
||||||
|
* 1 : 年付用户
|
||||||
|
* 2 : 月付用户
|
||||||
|
* 3 : 试用用户
|
||||||
|
* 4 : 参加活动获取30天有效期和6000个积分的用户
|
||||||
|
* 5 : 企业管理员账号
|
||||||
|
* 6 : 企业子账号
|
||||||
|
* 7 : 学校管理员
|
||||||
|
* 8 : 学校子账号
|
||||||
|
*/
|
||||||
|
private Integer systemUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头像
|
||||||
|
*/
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
private String organizationName;
|
||||||
|
|
||||||
|
private Long parentId;
|
||||||
|
|
||||||
|
private Integer isAdmin;
|
||||||
|
|
||||||
|
private BigDecimal shareCredits;
|
||||||
|
|
||||||
|
private Integer subAccountNum;
|
||||||
|
|
||||||
|
private String invitationCode;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("account_extend")
|
||||||
|
public class AccountExtend implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ID
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long accountId;
|
||||||
|
|
||||||
|
private String authType;
|
||||||
|
|
||||||
|
private String auth;
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.ai.da.mapper.primary.entity;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
@@ -24,11 +25,13 @@ public class BaseEntity implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新时间
|
* 更新时间
|
||||||
*/
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
private LocalDateTime updateTime;
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
42
src/main/java/com/ai/da/mapper/primary/entity/Canvas.java
Normal file
42
src/main/java/com/ai/da/mapper/primary/entity/Canvas.java
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attendance
|
||||||
|
*
|
||||||
|
* @author easy-generator
|
||||||
|
* @since 2022-06-13
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("canvas")
|
||||||
|
public class Canvas implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("ID")
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty("url")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@ApiModelProperty("accountId")
|
||||||
|
private Long accountId;
|
||||||
|
|
||||||
|
@ApiModelProperty("createTime")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CanvasElementUpload {
|
||||||
|
private String url;
|
||||||
|
private String minioUrl;
|
||||||
|
}
|
||||||
@@ -40,6 +40,8 @@ public class Collection implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String moodTemplateId;
|
private String moodTemplateId;
|
||||||
|
|
||||||
|
private String moodboardPosition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ public class CollectionElement implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String md5;
|
private String md5;
|
||||||
|
|
||||||
|
private String gradientString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
38
src/main/java/com/ai/da/mapper/primary/entity/Comment.java
Normal file
38
src/main/java/com/ai/da/mapper/primary/entity/Comment.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("comment")
|
||||||
|
public class Comment implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long portfolioId;
|
||||||
|
|
||||||
|
private Long accountId;
|
||||||
|
|
||||||
|
private String comment;
|
||||||
|
|
||||||
|
// 一级父节点ID
|
||||||
|
private Long parentLevel1Id;
|
||||||
|
|
||||||
|
// 二级父节点ID
|
||||||
|
private Long parentLevel2Id;
|
||||||
|
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
private Integer isDeleted;
|
||||||
|
}
|
||||||
@@ -12,6 +12,8 @@ import java.math.BigDecimal;
|
|||||||
public class CreditsDetail extends BaseEntity {
|
public class CreditsDetail extends BaseEntity {
|
||||||
/** 用户id */
|
/** 用户id */
|
||||||
private Long accountId;
|
private Long accountId;
|
||||||
|
/** 任务id或uuid */
|
||||||
|
private String taskId;
|
||||||
/** 积分变更事件 */
|
/** 积分变更事件 */
|
||||||
private String changeEvent;
|
private String changeEvent;
|
||||||
/** 变更积分 ( + 表示加,- 表示减) */
|
/** 变更积分 ( + 表示加,- 表示减) */
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ public class DesignItemDetail implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String color;
|
private String color;
|
||||||
|
|
||||||
|
private String gradientString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对应的print图片的绝对路径
|
* 对应的print图片的绝对路径
|
||||||
*/
|
*/
|
||||||
@@ -88,6 +90,10 @@ public class DesignItemDetail implements Serializable {
|
|||||||
* item的优先级
|
* item的优先级
|
||||||
*/
|
*/
|
||||||
private Integer priority;
|
private Integer priority;
|
||||||
|
/**
|
||||||
|
* 未分割的只上了颜色或只有overall印花的图层
|
||||||
|
*/
|
||||||
|
private String undividedLayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
|
|||||||
@@ -20,6 +20,16 @@ public class DesignItemDetailPrint {
|
|||||||
* 关联t_design_item_detail表ID
|
* 关联t_design_item_detail表ID
|
||||||
*/
|
*/
|
||||||
private Long designItemDetailId;
|
private Long designItemDetailId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 印花的类型 print || trims
|
||||||
|
*/
|
||||||
|
private String printType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 印花二级分类 Slogan || Logo || Pattern
|
||||||
|
*/
|
||||||
|
private String level2Type;
|
||||||
/**
|
/**
|
||||||
* 印花路径
|
* 印花路径
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("export_file")
|
||||||
|
public class ExportFile implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String url;
|
||||||
|
private Long userLikeGroupId;
|
||||||
|
}
|
||||||
@@ -33,10 +33,15 @@ public class Generate {
|
|||||||
private String uniqueId;
|
private String uniqueId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sketchboard Printboard
|
* Sketchboard Printboard Moodboard
|
||||||
*/
|
*/
|
||||||
private String level1Type;
|
private String level1Type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slogan Logo Pattern
|
||||||
|
*/
|
||||||
|
private String level2Type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 图片来源 collection | library
|
* 图片来源 collection | library
|
||||||
*/
|
*/
|
||||||
@@ -62,6 +67,24 @@ public class Generate {
|
|||||||
*/
|
*/
|
||||||
private String modelName;
|
private String modelName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logo 种子 相同种子 相同prompt 输出一定相同
|
||||||
|
*/
|
||||||
|
private String seed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1 -> 粗
|
||||||
|
* 2 -> 中
|
||||||
|
* 3 -> 细
|
||||||
|
* custom -> 自定义
|
||||||
|
*/
|
||||||
|
private String sketchStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sketch 风格参考图的collection_element_id
|
||||||
|
*/
|
||||||
|
private Long styleImageElementId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class GoogleUser {
|
||||||
|
private String sub; // 用户唯一标识
|
||||||
|
private String email;
|
||||||
|
private String name;
|
||||||
|
private String picture;
|
||||||
|
private boolean emailVerified;
|
||||||
|
private String givenName;
|
||||||
|
private String familyName;
|
||||||
|
}
|
||||||
15
src/main/java/com/ai/da/mapper/primary/entity/Gradient.java
Normal file
15
src/main/java/com/ai/da/mapper/primary/entity/Gradient.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Gradient implements Serializable {
|
||||||
|
private List<GradientItem> gradientList;
|
||||||
|
private int angle;
|
||||||
|
private int selectIndex;
|
||||||
|
private boolean gradientShow;
|
||||||
|
private String colorImg;
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class GradientItem implements Serializable {
|
||||||
|
private RGBA rgba;
|
||||||
|
private String left;
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("t_notification")
|
||||||
|
@Data
|
||||||
|
public class Notification extends BaseEntity{
|
||||||
|
/**
|
||||||
|
* 操作类型 system/like/comment/follow
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
/**
|
||||||
|
* 发起操作者用户id
|
||||||
|
*/
|
||||||
|
private Long senderId;
|
||||||
|
/**
|
||||||
|
* 被操作对象用户id
|
||||||
|
*/
|
||||||
|
private Long receiverId;
|
||||||
|
/**
|
||||||
|
* 点赞评论时的作品id
|
||||||
|
*/
|
||||||
|
private Long portfolioId;
|
||||||
|
/**
|
||||||
|
* 消息内容
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
/**
|
||||||
|
* 评论id
|
||||||
|
*/
|
||||||
|
private Long commentId;
|
||||||
|
/**
|
||||||
|
* 个人消息已读状态
|
||||||
|
*/
|
||||||
|
private Integer isRead;
|
||||||
|
/**
|
||||||
|
* 系统消息发布状态
|
||||||
|
*/
|
||||||
|
private Integer publishFlag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否被删除
|
||||||
|
*/
|
||||||
|
private Integer isDeleted;
|
||||||
|
|
||||||
|
public Notification() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Notification(String type, Long senderId, Long receiverId) {
|
||||||
|
this.type = type;
|
||||||
|
this.senderId = senderId;
|
||||||
|
this.receiverId = receiverId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Notification(String type, Long senderId, Long receiverId, Long portfolioId) {
|
||||||
|
this.type = type;
|
||||||
|
this.senderId = senderId;
|
||||||
|
this.receiverId = receiverId;
|
||||||
|
this.portfolioId = portfolioId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Notification(String type, Long senderId, Long receiverId, Long portfolioId, String content, Long commentId) {
|
||||||
|
this.type = type;
|
||||||
|
this.senderId = senderId;
|
||||||
|
this.receiverId = receiverId;
|
||||||
|
this.portfolioId = portfolioId;
|
||||||
|
this.content = content;
|
||||||
|
this.commentId = commentId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ public class OrderInfo extends BaseEntity{
|
|||||||
|
|
||||||
private Long productId;//支付产品id
|
private Long productId;//支付产品id
|
||||||
|
|
||||||
private Integer totalFee;//订单金额(元)
|
private Float totalFee;//订单金额(元)
|
||||||
|
|
||||||
private String codeUrl;//订单二维码连接
|
private String codeUrl;//订单二维码连接
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class PaymentInfo extends BaseEntity{
|
|||||||
|
|
||||||
private String tradeState;//交易状态
|
private String tradeState;//交易状态
|
||||||
|
|
||||||
private Integer payerTotal;//支付金额(分)
|
private Float payerTotal;//支付金额(元)
|
||||||
|
|
||||||
private String content;//通知参数
|
private String content;//通知参数
|
||||||
}
|
}
|
||||||
|
|||||||
67
src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java
Normal file
67
src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "Portfolio对象", description = "作品集")
|
||||||
|
@TableName("portfolio")
|
||||||
|
public class Portfolio implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "ID")
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "collection ID")
|
||||||
|
private Long collectionId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "userLikeGroup源")
|
||||||
|
private Long userLikeGroupSourceId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "作品名称")
|
||||||
|
private String portfolioName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "作品描述")
|
||||||
|
private String portfolioDes;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "作品类型")
|
||||||
|
private String portfolioType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "画布ID")
|
||||||
|
private Long canvasId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "封面ID")
|
||||||
|
private Long coverId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "作品状态1公开0隐藏")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否允许二次创作1允许0不允许")
|
||||||
|
private Integer openSource;
|
||||||
|
|
||||||
|
private Integer original;
|
||||||
|
|
||||||
|
private Long originalAccountId;
|
||||||
|
|
||||||
|
private Long originalPortfolioId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "作品集作者ID")
|
||||||
|
private Long accountId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
private LocalDateTime createDate;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "更新时间")
|
||||||
|
private LocalDateTime updateDate;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否删除")
|
||||||
|
private Integer isDeleted;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("t_portfolio_tags")
|
||||||
|
@Data
|
||||||
|
public class PortfolioTags extends BaseEntity{
|
||||||
|
private Long portfolioId;
|
||||||
|
|
||||||
|
private Long tagId;
|
||||||
|
}
|
||||||
@@ -9,7 +9,8 @@ public class Product extends BaseEntity{
|
|||||||
|
|
||||||
private String title; //商品名称
|
private String title; //商品名称
|
||||||
|
|
||||||
private Integer price; //价格(分)
|
// private Integer price; //价格(分)
|
||||||
|
private Float price; //价格(元)
|
||||||
|
|
||||||
private Integer credits; // 积分
|
private Integer credits; // 积分
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("product_image_attribute")
|
||||||
|
public class ProductImageAttribute implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
private String imgName;
|
||||||
|
private String length;
|
||||||
|
private String sleeveLength;
|
||||||
|
private String sleeveShape;
|
||||||
|
private String sleeveShoulder;
|
||||||
|
private String neckline;
|
||||||
|
private String collar;
|
||||||
|
private String design;
|
||||||
|
private String silhouette;
|
||||||
|
private String type;
|
||||||
|
private String openingType;
|
||||||
|
private String subtype;
|
||||||
|
|
||||||
|
private String style;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@TableName("t_questionnaire")
|
||||||
|
public class Questionnaire extends BaseEntity{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户所填调查问卷结果
|
||||||
|
*/
|
||||||
|
private String questionnaireInfo;
|
||||||
|
/**
|
||||||
|
* 调查问卷标题
|
||||||
|
*/
|
||||||
|
private String title;
|
||||||
|
}
|
||||||
13
src/main/java/com/ai/da/mapper/primary/entity/RGBA.java
Normal file
13
src/main/java/com/ai/da/mapper/primary/entity/RGBA.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package com.ai.da.mapper.primary.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RGBA implements Serializable {
|
||||||
|
private int r;
|
||||||
|
private int g;
|
||||||
|
private int b;
|
||||||
|
private double a;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user