Commit 85d566a0 authored by ma's avatar ma

Merge branch 'for-yx' of http://120.77.240.215:9701/tianlai3/ioc_sixiang_license into for-yx

parents 920b3d16 c897a5ba
# 注意事项
##### 2023.1版本
> 1. 执行update.2023.1.sql
> 2. 原来的root账号要换成邮箱,包括user_name和notify字段,两个都填超管账号邮箱。
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIDHjCCAgYCCQCTGGHg/dGQXjANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJD
TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQswCQYDVQQKDAJTUjELMAkGA1UE
CwwCU1IxDjAMBgNVBAMMBVNSLUNBMB4XDTIzMDIwMzA5NTQ0MVoXDTMzMDEzMTA5
NTQ0MVowUTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEL
MAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQ4wDAYDVQQDDAVTUi1DQTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOGm68efDJou2ElrzrEUpDGSp5oOqn+6
0UbFKquObbH1sfnkpJeJYsTLT9EkZYEt1um76St2+4VJAyeLC6KEW4j8q8QoIoDD
wYa85+uwEgNAj8AJikBidCboFjdgtHJLqwmrdJGHYtqnFnIdyvzLZe7GrxsbDhZ3
99qEaxvYmwGRI7ZkT5v9lPpw9RqfPysaS829zn6W1mUCeVPPMSbCtgSqsYjRPDHu
zi15GygEnsMMFTozSvLm5xrpSbY9jNvXo5weUy/OCaIkiVmiL2dUVMf10y4Pphxv
zGnnX78dJ7iuo1as+V0zs6CngVdiMWmmt1yX2TyTsm2tbZHH5w+wknkCAwEAATAN
BgkqhkiG9w0BAQUFAAOCAQEAFO/2fvXzpJzFcBAxMPLh5HrGXim+E3WOaRjfzskk
GYj9o7re/nJIhTEY/YngNGdoRLMvKtA4uHjiv4ca0ecSiOJX7y+AqtwbLorSHwot
CmGBTOPiG5KkL8bo+OarLWve9WLwaKFLf5D3RzBf1FdRPzjFO0l1Cm9i1Yc79r8y
o71s5CpuM+tTutqcq4LNBpCb2BB8Y6Joj81c3G5W+xrutSysWKZsRAPwBVvJkT2C
HY5+dvvYsR2bESKJBl8vu/VnTxLop4Zvdr7kb/hBVKClqOSx7XwT5I2598UTSYkb
RcLItTMFJJUBzfeMQsmrxHeBGUYv7ovjnVTVnKjI3IDBoA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
MIICljCCAX4CAQAwUTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQ4wDAYDVQQDDAVTUi1DQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOGm68efDJou2ElrzrEUpDGS
p5oOqn+60UbFKquObbH1sfnkpJeJYsTLT9EkZYEt1um76St2+4VJAyeLC6KEW4j8
q8QoIoDDwYa85+uwEgNAj8AJikBidCboFjdgtHJLqwmrdJGHYtqnFnIdyvzLZe7G
rxsbDhZ399qEaxvYmwGRI7ZkT5v9lPpw9RqfPysaS829zn6W1mUCeVPPMSbCtgSq
sYjRPDHuzi15GygEnsMMFTozSvLm5xrpSbY9jNvXo5weUy/OCaIkiVmiL2dUVMf1
0y4PphxvzGnnX78dJ7iuo1as+V0zs6CngVdiMWmmt1yX2TyTsm2tbZHH5w+wknkC
AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQAAmVVU9YceDSOtKv5k0YLc0so6rsD0
y53KlEVDRDBmllSl45Q5J444U3bgg+mBQgHfEcTG5r/LCiBifnpezvNMHPvrlBK2
4ivKNXfqi/sK9OwWvZfRHMfkQalPoDsno2AZ5HKTf9ljf+/qQlvHegSt+5CbeLOZ
+wWgLujDcCo/qNRIgBkJJMERt2tdllww7rUC1e0vXQaLUoL1tre+n9lKSNscxX1P
Cx8a8RJF+9Rdu+ZZOvn0zU+xwxRmiYBrtnJDS1p/Mstpa97xezC6CofpXZGbvUwm
0XjjwV4rzQ1XEdG1oUgusC2tp9PYRZHiPE4HIi0HoRKxj8XHGggEIGkz
-----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA4abrx58Mmi7YSWvOsRSkMZKnmg6qf7rRRsUqq45tsfWx+eSk
l4lixMtP0SRlgS3W6bvpK3b7hUkDJ4sLooRbiPyrxCgigMPBhrzn67ASA0CPwAmK
QGJ0JugWN2C0ckurCat0kYdi2qcWch3K/Mtl7savGxsOFnf32oRrG9ibAZEjtmRP
m/2U+nD1Gp8/KxpLzb3OfpbWZQJ5U88xJsK2BKqxiNE8Me7OLXkbKASewwwVOjNK
8ubnGulJtj2M29ejnB5TL84JoiSJWaIvZ1RUx/XTLg+mHG/Maedfvx0nuK6jVqz5
XTOzoKeBV2Ixaaa3XJfZPJOyba1tkcfnD7CSeQIDAQABAoIBAQCK2PEf5egVP1nq
46FNKQxXTIxAqWGUMtnvGAdHhN5OsIYQ4/W7INhbi1bTs/eZYyFotS2mhxIBU4nT
XSWNnK/OPNtcWe3RGaMNS1PRnIeY5LMPUU92ip46CnkRHjoqUhEuZAfYPFxBeqq/
EUIEBwvzvuGkZiNnA+7I0M4vVjsa3JIcg9fiW0zw/08XlcUiQIImt8kjYMLFWGmC
qzfJQG9zhhx/h9VC0jJsT6IB9qHUmZfT/ohBVnvd3j8jc8kpBnhNlm8SKcApn7MX
PdPBV+tZXZ6/3b61nEdu13Pzo0UOfrrUs+DMcjEJyq8eu0v1vH5JnszKeCU7id5n
FHBreKvhAoGBAPctp6goWRpUj69roVCeg/TjXBcOLNneEGO/5r5D/3rS34FkdvAc
IwCrxH1gvOnLAkf37eif2oaoi1m3oSiopWqGLFJKFOZUZCthlywdmNp9haL5NOmm
doKxnq07v6JEWRixRPYQ5N04NGzZJwhvqYMRIwhcU5ErZpqs9tuLR0gtAoGBAOm0
l0xkGCyc/aX7I+POygmFv9y4ruo303rwoEdib/0FF464fmAt+UYYUvPgSccaupXh
Fu0I5V2JeVFG+af7SHV4U3U017wFfxO2s20HqWS5UtINY/ggOlacxxYPRfPAKL1l
0U7t4KxOcuWByJHOHqWSiYi2rRfnT9A1daVZT/b9AoGBALIvS0lBrNn6U4pVwHhp
jR6gN+a25UY5ev8te511T1qvYUfZsJPu9JyrNn5bmlO/cOmIpQypD9M69Rm78oVo
7bYY+yJnHSHdfEh5lYzL2UDIc+nEVIyK36vfd0/SXpcPRlsyj1ADZbjDp6c/8491
T3GYjPSd+fAQpWqjfWFOyhgRAoGAdMpR3dQbnJfrzjm+Csc5gh677eLBTr0NS1/a
yTGxQ2F7D1C1nvz6mIPpWISaegyqd+Ifod8TOHZOEUcF1mOmJ0Y1dtosgYLBqalg
6zir93EBqYUVk1cPsF7ywtxpGdHKyjOKsQYBhDpEAtujzvGRsS6U2qRnxg1LfoJo
w3PpmUUCgYEAoUFvcUXarfOSrozBc7fUzOWZ7kn8OMDh3ByIC+PVF4aZ3ghNhgWK
ayTRB0c2h8kwvBfKcvPpy0PjmwzfhQj99wW1h+UcMF+SJV7/+HI7Lm+ZUGZHN9NE
pjxK7ig1+MtiwGgcgiM2WdZRb/1cz34KEouwxOfAXdJocAm0iZQyvvQ=
-----END RSA PRIVATE KEY-----
B81C2DC0B70ABED8
-----BEGIN CERTIFICATE-----
MIIDIjCCAgoCCQC4HC3Atwq+2DANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJD
TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQswCQYDVQQKDAJTUjELMAkGA1UE
CwwCU1IxDjAMBgNVBAMMBVNSLUNBMB4XDTIzMDIwMzA5NTU0N1oXDTMzMDEzMTA5
NTU0N1owVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEL
MAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1DTElFTlQwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC//jI81JWRFmuXI2THdQX7Mu1c
hPBXhmkGRP8Ex77CQRcAzTFNV3m5SuMJ+ggO+Ig7O24LzupSjJEto5tYZzu15DJW
rBMvtdDCK+zsPCwatLSQ1nx+5q4OsLzuA+MsWrF2r+KfnEIh4CSGf4ApFS9yUz15
7JIVqWnHmABy40/DssWOsch0/oJ1W1Ge8XgmVKKwg83Gl+VUFdJWL+4nlupKTXKA
L/EOxgcGK8nXUBhOR/kj6kHMk0avoG3J4Y0tM5NNTqhD2HbSuW+TdSf9SNc/dUea
UHgvZuvzkaFEI2xxulQsLPD3PGmugJi88wROyf1k3o8f14Yo3y3wWMM/MdolAgMB
AAEwDQYJKoZIhvcNAQEFBQADggEBAJ73A6chnUA42ck55NzRILrfZy/EEtkbrLo0
U4q0ehUWz9dxfvnTwhTDYaaL92fFuAL8RxNPnUdYGOn1AQ7HwB9Y899dzUOjM7Nn
QukT+IXaQ3r7bYwQ5whN6ZeB/5d1KoS/+Rxp0+9T1fn4gaAE759JYI3EVzjO/458
0Rxu3AWS7JZuXqtTbFCS+adAjolKdiwo2nTmv9lVdl4Cc9+7/OgcrpFGyy6WbH3H
QXGeLv+kSq/gAhP2TLHWIGHbZ5u5uUdEzBs3KQTkW2tkCo61pqWIDQNFfrez4YjB
j9o7iOkzd42C4fNxS7YCAatsrbfj23byiwiWAyLpq7MjrlD+yfM=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
MIICmjCCAYICAQAwVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1DTElF
TlQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC//jI81JWRFmuXI2TH
dQX7Mu1chPBXhmkGRP8Ex77CQRcAzTFNV3m5SuMJ+ggO+Ig7O24LzupSjJEto5tY
Zzu15DJWrBMvtdDCK+zsPCwatLSQ1nx+5q4OsLzuA+MsWrF2r+KfnEIh4CSGf4Ap
FS9yUz157JIVqWnHmABy40/DssWOsch0/oJ1W1Ge8XgmVKKwg83Gl+VUFdJWL+4n
lupKTXKAL/EOxgcGK8nXUBhOR/kj6kHMk0avoG3J4Y0tM5NNTqhD2HbSuW+TdSf9
SNc/dUeaUHgvZuvzkaFEI2xxulQsLPD3PGmugJi88wROyf1k3o8f14Yo3y3wWMM/
MdolAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEALbAVckgD4YRmV1lcLQtlL5cy
oGyqhf+5YfvdlK5jOVVSnT/vE3nPvoz5SQ1ewDTewHdS3nyYirxbyxh730/RhFeU
r7nzqvzasH8tsk/R5NImRYDEp1yuCc5aUpQYHeBx2oVMwClCZm1TmmnJbH+EXHZw
TLlLAVaGmu1UbBozb1RIf/LeTO3e8H7S/8D9nPLprjOjVqUUEOWEuxgO+cGO5wkw
AvbysVaMxTmHhKXW74OpOlSXY/i+Ma93OYJ3K7XwuAjrGOIuemjEn8fy2RkyO3KZ
0kW19fiJllm5BFyL+vXwW3S8gD8k2B4hpPlgtAHZk2DztjAoN9KLkg4EUsbQWQ==
-----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAv/4yPNSVkRZrlyNkx3UF+zLtXITwV4ZpBkT/BMe+wkEXAM0x
TVd5uUrjCfoIDviIOztuC87qUoyRLaObWGc7teQyVqwTL7XQwivs7DwsGrS0kNZ8
fuauDrC87gPjLFqxdq/in5xCIeAkhn+AKRUvclM9eeySFalpx5gAcuNPw7LFjrHI
dP6CdVtRnvF4JlSisIPNxpflVBXSVi/uJ5bqSk1ygC/xDsYHBivJ11AYTkf5I+pB
zJNGr6BtyeGNLTOTTU6oQ9h20rlvk3Un/UjXP3VHmlB4L2br85GhRCNscbpULCzw
9zxproCYvPMETsn9ZN6PH9eGKN8t8FjDPzHaJQIDAQABAoIBAQC85LzKqqEo6TUb
sz/xGYqz9gwgbc8FXgGwoGuDaX6eImoeaMOsA3eIPUyZQT1ydUWbeUIxLffPFeu0
SnaJiK/vqj94lL4fv7NPhuYIGr+N2uKYad59ADqZy3tmdb6poeVeD3hZbuSF7cAh
8AnI4cYXphwi/AVSeKbRMBSo9EpDD8hnp1F2Ush/1cv7XKt74PTQVMgbPGXwQDJd
Sa/q7XPx76mgSp1Sb2ifjBhsg9D497yHRC2zEtGoIA6noLRDP4z3qXcNjUN7JtWn
DSxli2vO8CmGfxWGIxx3EvOoejba1DkXEykVSI+cgz6cWqQwMQwby8kgb+fUHngR
xe6837EhAoGBAOq/cB6B5DkKIsUqj8Owg0BVR89ncIQiVrELciCWuX3iLrxennB5
G6yg/W5KtPSWVPxcpGeimkXfZkiO7R+Wx1WLpWySbc+RvrJ8qxVh6j64YWfCsbTM
EuSbtRbfQcWMYhRCzwHMVkKR3KDt/fTcIODpHjjgivS3hiidNZzje7tJAoGBANFf
3QI8/ySFQLxxXJV4UD946fEmjCcaPfJKMHjRVTw5y9ZjzsHjPvHbmZRJQdJymvbX
wzrfA/52lEifZs3yU+UEC+ZdFSEZqA/r6TS0cEk3P0qk7+NS99geshdkn7dSHkms
X9nsvuIThnnqj8i+566H7LSETnX9+2OJ5T05UKv9AoGBAKmUF7uCG8r0vn9uKqKz
7WzY7mIumEJrx/JnkU9ncqI0dYyQUaZwZoSDW/CDuUsDGmufxQg0l3uoUWxTC4sJ
UgBDPAI9mWQcJgUsOC7fJ+edLIhXRiaUUYWh0eSu7QV3TxbR2Fa1NQ8r7ZS3uABd
0MaIwNNXqin0Nc87GhK25pg5AoGASytYpJoTnB//KuikLcGhRfh6PSryvIMuZFOA
bY/yQwoZBaKVs4SLr7eAvv1CFXUx75dtLzCsNWqLODuKZDwxJJK8VvtqP5T/gp/W
/SYe/hpIrdrjiUDbXItAsydcNCvWVer+CrZ1naMW76Rn9NGdSkrgj7rElJYX8Bes
5rsyHF0CgYAsSw6QGVqrE0zjan1PdbxifKMVnQ17ADp2rmIGouoTagiBbcBio+qT
f/Op2uhcQCUQkUvXtBAqa2twAfjGzxoxQotD6pLKtarLtULYH8wQw8eMPcPh8K5a
fRKgII/YRRPOOK1NGjxG6wLlRL2FuOPyyY8Fao5zuKwDiLqZ9kMR/w==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/4yPNSVkRZrlyNkx3UF
+zLtXITwV4ZpBkT/BMe+wkEXAM0xTVd5uUrjCfoIDviIOztuC87qUoyRLaObWGc7
teQyVqwTL7XQwivs7DwsGrS0kNZ8fuauDrC87gPjLFqxdq/in5xCIeAkhn+AKRUv
clM9eeySFalpx5gAcuNPw7LFjrHIdP6CdVtRnvF4JlSisIPNxpflVBXSVi/uJ5bq
Sk1ygC/xDsYHBivJ11AYTkf5I+pBzJNGr6BtyeGNLTOTTU6oQ9h20rlvk3Un/UjX
P3VHmlB4L2br85GhRCNscbpULCzw9zxproCYvPMETsn9ZN6PH9eGKN8t8FjDPzHa
JQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC//jI81JWRFmuX
I2THdQX7Mu1chPBXhmkGRP8Ex77CQRcAzTFNV3m5SuMJ+ggO+Ig7O24LzupSjJEt
o5tYZzu15DJWrBMvtdDCK+zsPCwatLSQ1nx+5q4OsLzuA+MsWrF2r+KfnEIh4CSG
f4ApFS9yUz157JIVqWnHmABy40/DssWOsch0/oJ1W1Ge8XgmVKKwg83Gl+VUFdJW
L+4nlupKTXKAL/EOxgcGK8nXUBhOR/kj6kHMk0avoG3J4Y0tM5NNTqhD2HbSuW+T
dSf9SNc/dUeaUHgvZuvzkaFEI2xxulQsLPD3PGmugJi88wROyf1k3o8f14Yo3y3w
WMM/MdolAgMBAAECggEBALzkvMqqoSjpNRuzP/EZirP2DCBtzwVeAbCga4Npfp4i
ah5ow6wDd4g9TJlBPXJ1RZt5QjEt988V67RKdomIr++qP3iUvh+/s0+G5ggav43a
4php3n0AOpnLe2Z1vqmh5V4PeFlu5IXtwCHwCcjhxhemHCL8BVJ4ptEwFKj0SkMP
yGenUXZSyH/Vy/tcq3vg9NBUyBs8ZfBAMl1Jr+rtc/HvqaBKnVJvaJ+MGGyD0Pj3
vIdELbMS0aggDqegtEM/jPepdw2NQ3sm1acNLGWLa87wKYZ/FYYjHHcS86h6NtrU
ORcTKRVIj5yDPpxapDAxDBvLySBv59QeeBHF7rzfsSECgYEA6r9wHoHkOQoixSqP
w7CDQFVHz2dwhCJWsQtyIJa5feIuvF6ecHkbrKD9bkq09JZU/FykZ6KaRd9mSI7t
H5bHVYulbJJtz5G+snyrFWHqPrhhZ8KxtMwS5Ju1Ft9BxYxiFELPAcxWQpHcoO39
9Nwg4OkeOOCK9LeGKJ01nON7u0kCgYEA0V/dAjz/JIVAvHFclXhQP3jp8SaMJxo9
8koweNFVPDnL1mPOweM+8duZlElB0nKa9tfDOt8D/naUSJ9mzfJT5QQL5l0VIRmo
D+vpNLRwSTc/SqTv41L32B6yF2Sft1IeSaxf2ey+4hOGeeqPyL7nrofstIROdf37
Y4nlPTlQq/0CgYEAqZQXu4IbyvS+f24qorPtbNjuYi6YQmvH8meRT2dyojR1jJBR
pnBmhINb8IO5SwMaa5/FCDSXe6hRbFMLiwlSAEM8Aj2ZZBwmBSw4Lt8n550siFdG
JpRRhaHR5K7tBXdPFtHYVrU1DyvtlLe4AF3QxojA01eqKfQ1zzsaErbmmDkCgYBL
K1ikmhOcH/8q6KQtwaFF+Ho9KvK8gy5kU4Btj/JDChkFopWzhIuvt4C+/UIVdTHv
l20vMKw1aos4O4pkPDEkkrxW+2o/lP+Cn9b9Jh7+Gkit2uOJQNtci0CzJ1w0K9ZV
6v4KtnWdoxbvpGf00Z1KSuCPusSUlhfwF6zmuzIcXQKBgCxLDpAZWqsTTONqfU91
vGJ8oxWdDXsAOnauYgai6hNqCIFtwGKj6pN/86na6FxAJRCRS9e0ECpra3AB+MbP
GjFCi0Pqksq1qsu1QtgfzBDDx4w9w+Hwrlp9EqAgj9hFE844rU0aPEbrAuVEvYW4
4/LJjwVqjnO4rAOIupn2QxH/
-----END PRIVATE KEY-----
# 1.生成服务器端私钥
openssl genrsa -out server.key 2048
# 2.生成服务器端公钥
openssl rsa -in server.key -pubout -out server.pem
# 3.生成客户端私钥
openssl genrsa -out client.key 2048
# 4.生成客户端公钥
openssl rsa -in client.key -pubout -out client.pem
# 5.生成 CA 私钥
openssl genrsa -out ca.key 2048
# 6.生成CA的csr文件,保存必要信息
openssl req -new -key ca.key -out ca.csr
# 7.生成CA的证书文件crt文件
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650
# 8.生成服务器端的csr文件,为生成服务器证书做准备
openssl req -new -key server.key -out server.csr
# 9.生成服务器端证书crt文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -days 3650
# 10.生成client 端csr文件,为生成client证书做准备
openssl req -new -key client.key -out client.csr
# 11.生成client 端证书crt文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt -days 3650
# 将key文件进行PKCS8编码
openssl pkcs8 -topk8 -in server.key -out server.pkcs8.key -nocrypt
openssl pkcs8 -topk8 -in client.key -out client.pkcs8.key -nocrypt
# 注意生成的 Common Name不能一样,否则客户端会出错
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIDIjCCAgoCCQC4HC3Atwq+1zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJD
TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQswCQYDVQQKDAJTUjELMAkGA1UE
CwwCU1IxDjAMBgNVBAMMBVNSLUNBMB4XDTIzMDIwMzA5NTUxOVoXDTMzMDEzMTA5
NTUxOVowVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEL
MAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1TRVJWRVIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt718RXKUVJwm4V2GoTk0X2d4R
8RsmpdrxQnyAbQE8P4BxJAPZYCrYZQ4PMh9mcMcCeSHq6hMSPlgZKxYOwHJAOI7g
/WcbtGfsXkzqyfnZtG8KACP35ykcgffGVi5MBIM1aG7ah11o0ZpmFtueT8cYWd4W
1+NKfObFDviU1g8wV5ka6L+zeih+5Eiy6Zd9m8q+DjdTHaQVTlgIrLLyn+6pkwgt
3EMxVBy7wN+k2RK656iVqRHc4ttPWWc7HCVa1u9XiFR2K56qJDKLt4nEWJ3O+qC0
D++l8N/blZI3TYU07nC9j3mdWs8pOSvAQO+1Gg76LTM2T1bGL5at1ZYoRBmfAgMB
AAEwDQYJKoZIhvcNAQEFBQADggEBAHOgZsqs4xb7i58xTZZ03fcOMz62aUh9vHNY
09ifHnrJq0R3aJmxB7NluJ+PCx7j8MouTzxLrpon4EPRu5RmryXgQrMP1wfFTelS
iX0pNfSAsc5cXu33i/fBQmV6UNcaQ00toN7cj4FqQ0VVQzFpZ/Mv7nllrDR3Z5PP
gYmrzHy5WKet/zHPq8T95L1/AeOIVkr1fOuGQEa/LMgXCLITWQrlxoFQPLpRTW3B
m79EXCOK2ra6NmyF47aa3BRkn3q4ySoUkkpvWdTGIxnjlTh/t8CWfmsXAETpiqNN
6VgagtHeg/qMqD2S0Q2GBXHolpFe9gfKStpQXUVF9njZrFWAdMI=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
MIICmjCCAYICAQAwVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1TRVJW
RVIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt718RXKUVJwm4V2Go
Tk0X2d4R8RsmpdrxQnyAbQE8P4BxJAPZYCrYZQ4PMh9mcMcCeSHq6hMSPlgZKxYO
wHJAOI7g/WcbtGfsXkzqyfnZtG8KACP35ykcgffGVi5MBIM1aG7ah11o0ZpmFtue
T8cYWd4W1+NKfObFDviU1g8wV5ka6L+zeih+5Eiy6Zd9m8q+DjdTHaQVTlgIrLLy
n+6pkwgt3EMxVBy7wN+k2RK656iVqRHc4ttPWWc7HCVa1u9XiFR2K56qJDKLt4nE
WJ3O+qC0D++l8N/blZI3TYU07nC9j3mdWs8pOSvAQO+1Gg76LTM2T1bGL5at1ZYo
RBmfAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAa4KUVDxcBOjIewXpPBMEQOW2
cTD0SQminwEnJJAC8ocp34Ia9ZZnBz3G7izQ9BTWL4iTlBXkcpqM4SoUYTAKbXIi
JQZbFPeacn0jCp3X9tl8Pea4lWNfT03iuvDA2izo5TmbEufO9SXSsm5UvrPAXuk8
Q1jzlk3Se8SwI240Vm6OTidS3YdM7ldet+ds4aUa1HuR75jUYy44jjDap4qCnmyn
4NAH7jB1EeqbJt6I8U9KbUQxbHeaxzWtD2L3pcsVD+JsADz4rNcJm+UD2vII425B
uTIQM/pU/FveRqt2W0r9GIKdKztE6RdFTU3Czfu4VRb0P+iH2K0ec4WRcgjyog==
-----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAre9fEVylFScJuFdhqE5NF9neEfEbJqXa8UJ8gG0BPD+AcSQD
2WAq2GUODzIfZnDHAnkh6uoTEj5YGSsWDsByQDiO4P1nG7Rn7F5M6sn52bRvCgAj
9+cpHIH3xlYuTASDNWhu2oddaNGaZhbbnk/HGFneFtfjSnzmxQ74lNYPMFeZGui/
s3oofuRIsumXfZvKvg43Ux2kFU5YCKyy8p/uqZMILdxDMVQcu8DfpNkSuueolakR
3OLbT1lnOxwlWtbvV4hUdiueqiQyi7eJxFidzvqgtA/vpfDf25WSN02FNO5wvY95
nVrPKTkrwEDvtRoO+i0zNk9Wxi+WrdWWKEQZnwIDAQABAoIBAE+C2HuwVUrZIKlj
UKJGwRlBIDIlfNrrAK4/TXjL27+167pM03Ggc5WehJHPwOjsbx0jUKz5uiQh2dYP
izLNKK1Q7YfObz8L9mHoLdM653ts70GsFMUzp+h/RUwmg11+xpg4mExPixTqlGFM
27KAF6x7EHpy0FVxyXCVym8Hd8QJ1mGmxbGPRQgY8bCz0/wBjqDtqlsdcvjMo+u4
5xBz3FG1KBrEFJpPZZdpNvzCDLzplMcbJw85vtbErPzlqELsJFTLKefD7IIfJ4YG
LXr1H+6aFqNuqaS42Shsa6egwllsVj+mVEa+8qnfGGcMlXJOoeTzHoG9qCkNcXWg
EqPLIbkCgYEA1k7/ByMUF7rMJINaeTCkH+KVeRc/1rvJPVASrLKwoq4gV2XnhGsm
DBrYvzfNFfmofx3JclmVNNTUJaR+LI01zMXat/aQLAkrbPdZ4HH2/0fSmSDuv8Q+
HSWrykpFK40fsQmWZOh7AWTdFBRF3D98hfdqZAw82ZA8OJ9GorwYTeUCgYEAz8Ww
3jgWGKH/+lXYRl6gF7vTs8sxjRJtwwVCrdtroPC+3vV/1ndTmqHSnY8xP3UiMnF0
8h1CrY7ab1m8panzWCwmkYtbqlvlkv3W6StB0M8jrZmPu7NLb3IYVWEuca65JCzl
pEDocHUBGCP6fZ+jmbYYUuU7cjlujnSJ33Q48TMCgYAdbivHpyGTQKvYN9Gs4ukn
F86/GlpB+vff26c04DUxogf++Jear7xB3U32tIsNgYOKMWUAtxyubKvVn4lURPAm
duVabhnOclPsWuuUzxHEbPCW5tbiruh4yDuXRCvLl03K2i41HVgHEPrrTv1pCa7o
FtodczDID+61N+pTXtFXoQKBgQCvmmg4CLM0ModErxVRtFwecxMkXFIO50p5j5Kh
mlfG+HJ5wog/XS79/FMj84guF/PFKnsqvmxCgABCKFf2tEMFfJtEW8Ino+/OYlgn
TfYcY1XGPYlrnMfe81F5p983GfNEjeWxA2Lw2RMJsi7dyfTdzzeTqEar7bpxEDIO
+A3AXQKBgD825+ykNYEKdaj+oBNf5NN9QZ1sDfRksBfmG4vnJSvV8HZGePHy+mJ0
ba82D81i606rahUTOWNathrTTl6ltDY3rAXb+89aI71DnFA2Zx7h01L0a5OZNp4A
8LOfALw8rrv2icC/4RhHPjl7MPLBAIUM8RrLqLuaLKiJpdwo7Qad
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAre9fEVylFScJuFdhqE5N
F9neEfEbJqXa8UJ8gG0BPD+AcSQD2WAq2GUODzIfZnDHAnkh6uoTEj5YGSsWDsBy
QDiO4P1nG7Rn7F5M6sn52bRvCgAj9+cpHIH3xlYuTASDNWhu2oddaNGaZhbbnk/H
GFneFtfjSnzmxQ74lNYPMFeZGui/s3oofuRIsumXfZvKvg43Ux2kFU5YCKyy8p/u
qZMILdxDMVQcu8DfpNkSuueolakR3OLbT1lnOxwlWtbvV4hUdiueqiQyi7eJxFid
zvqgtA/vpfDf25WSN02FNO5wvY95nVrPKTkrwEDvtRoO+i0zNk9Wxi+WrdWWKEQZ
nwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCt718RXKUVJwm4
V2GoTk0X2d4R8RsmpdrxQnyAbQE8P4BxJAPZYCrYZQ4PMh9mcMcCeSHq6hMSPlgZ
KxYOwHJAOI7g/WcbtGfsXkzqyfnZtG8KACP35ykcgffGVi5MBIM1aG7ah11o0Zpm
FtueT8cYWd4W1+NKfObFDviU1g8wV5ka6L+zeih+5Eiy6Zd9m8q+DjdTHaQVTlgI
rLLyn+6pkwgt3EMxVBy7wN+k2RK656iVqRHc4ttPWWc7HCVa1u9XiFR2K56qJDKL
t4nEWJ3O+qC0D++l8N/blZI3TYU07nC9j3mdWs8pOSvAQO+1Gg76LTM2T1bGL5at
1ZYoRBmfAgMBAAECggEAT4LYe7BVStkgqWNQokbBGUEgMiV82usArj9NeMvbv7Xr
ukzTcaBzlZ6Ekc/A6OxvHSNQrPm6JCHZ1g+LMs0orVDth85vPwv2Yegt0zrne2zv
QawUxTOn6H9FTCaDXX7GmDiYTE+LFOqUYUzbsoAXrHsQenLQVXHJcJXKbwd3xAnW
YabFsY9FCBjxsLPT/AGOoO2qWx1y+Myj67jnEHPcUbUoGsQUmk9ll2k2/MIMvOmU
xxsnDzm+1sSs/OWoQuwkVMsp58Psgh8nhgYtevUf7poWo26ppLjZKGxrp6DCWWxW
P6ZURr7yqd8YZwyVck6h5PMegb2oKQ1xdaASo8shuQKBgQDWTv8HIxQXuswkg1p5
MKQf4pV5Fz/Wu8k9UBKssrCiriBXZeeEayYMGti/N80V+ah/HclyWZU01NQlpH4s
jTXMxdq39pAsCSts91ngcfb/R9KZIO6/xD4dJavKSkUrjR+xCZZk6HsBZN0UFEXc
P3yF92pkDDzZkDw4n0aivBhN5QKBgQDPxbDeOBYYof/6VdhGXqAXu9OzyzGNEm3D
BUKt22ug8L7e9X/Wd1OaodKdjzE/dSIycXTyHUKtjtpvWbylqfNYLCaRi1uqW+WS
/dbpK0HQzyOtmY+7s0tvchhVYS5xrrkkLOWkQOhwdQEYI/p9n6OZthhS5TtyOW6O
dInfdDjxMwKBgB1uK8enIZNAq9g30azi6ScXzr8aWkH699/bpzTgNTGiB/74l5qv
vEHdTfa0iw2Bg4oxZQC3HK5sq9WfiVRE8CZ25VpuGc5yU+xa65TPEcRs8Jbm1uKu
6HjIO5dEK8uXTcraLjUdWAcQ+utO/WkJrugW2h1zMMgP7rU36lNe0VehAoGBAK+a
aDgIszQyh0SvFVG0XB5zEyRcUg7nSnmPkqGaV8b4cnnCiD9dLv38UyPziC4X88Uq
eyq+bEKAAEIoV/a0QwV8m0Rbwiej785iWCdN9hxjVcY9iWucx97zUXmn3zcZ80SN
5bEDYvDZEwmyLt3J9N3PN5OoRqvtunEQMg74DcBdAoGAPzbn7KQ1gQp1qP6gE1/k
031BnWwN9GSwF+Ybi+clK9XwdkZ48fL6YnRtrzYPzWLrTqtqFRM5Y1q2GtNOXqW0
NjesBdv7z1ojvUOcUDZnHuHTUvRrk5k2ngDws58AvDyuu/aJwL/hGEc+OXsw8sEA
hQzxGsuou5osqIml3CjtBp0=
-----END PRIVATE KEY-----
# -------------------- 平台应用相关,以pms开头 --------------------
-------------------- 平台应用相关,以pms开头 --------------------
DROP TABLE IF EXISTS `pms_use_log`;
CREATE TABLE `pms_use_log`
(
......
ALTER TABLE `user`
ADD COLUMN `notify` varchar(50) NULL DEFAULT NULL COMMENT '报警的邮箱,注册的时候用户名是邮箱则这里自动填那个邮箱,可以修改' AFTER `company`,
ADD COLUMN `parent` int(11) NULL COMMENT '父账号标识,空则表示超管,一级' AFTER `notify`,
ADD COLUMN `level` int(1) NULL COMMENT '账号等级(共有三级),空则表示二级' AFTER `parent`;
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission`
(
`id` int(10) NOT NULL AUTO_INCREMENT,
`description` varchar(50) DEFAULT NULL COMMENT '权限说明',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` int(1) DEFAULT '0' COMMENT '逻辑删除标识 1:删除,0:未删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT ='权限表';
CREATE TABLE `user_permission`
(
`id` int(10) NOT NULL AUTO_INCREMENT,
`permission` int(10) NOT NULL COMMENT '权限标识',
`user` int(11) NOT NULL COMMENT '用户标识',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` int(1) DEFAULT '0' COMMENT '逻辑删除标识 1:删除,0:未删除',
UNIQUE KEY `user_permission_unique_key` (`permission`,`user`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT ='用户权限表';
-- 添加权限 --
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (1, '邀请注册', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (2, '删除用户', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (3, '应用管理', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (4, '设备管理', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (5, '运维管理', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (6, '日志管理', NULL, NULL, 0);
INSERT INTO `permission` (`id`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (7, '安全报警', NULL, NULL, 0);
-- 报警类型表 --
DROP TABLE IF EXISTS `report_type`;
CREATE TABLE `report_type`
(
`id` int(10) NOT NULL AUTO_INCREMENT,
`category` int(1) DEFAULT NULL COMMENT '报警大类 1:系统,0:设备',
`description` varchar(100) DEFAULT NULL COMMENT '说明',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` int(1) DEFAULT '0' COMMENT '逻辑删除标识 1:删除,0:未删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT ='报警类型表';
-- 报警表 --
DROP TABLE IF EXISTS `report`;
CREATE TABLE `report`
(
`id` int(10) NOT NULL AUTO_INCREMENT,
`category` int(1) DEFAULT NULL COMMENT '报警大类 1:系统,0:设备',
`type` int(3) DEFAULT NULL COMMENT '报警类型',
`sn` varchar(50) DEFAULT NULL COMMENT '设备编码(系统报警该值为空)',
`description` varchar(100) DEFAULT NULL COMMENT '报警说明',
`user_name` varchar(50) DEFAULT NULL COMMENT '报警账户',
`user_company` varchar(50) DEFAULT NULL COMMENT '报警公司',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` int(1) DEFAULT '0' COMMENT '逻辑删除标识 1:删除,0:未删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT ='报警表';
-- 新增报警类型 --
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (1, 1, '系统故障', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (2, 1, '系统超负荷', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (3, 1, '系统连接失败', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (4, 0, '数据请求失败', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (5, 0, '卡交互失败', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (6, 0, '鉴权失败', NULL, NULL, 0);
INSERT INTO `report_type` (`id`, `category`, `description`, `create_time`, `update_time`, `deleted`)
VALUES (7, 0, '解码失败', NULL, NULL, 0);
......@@ -115,22 +115,10 @@
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.owasp.antisamy</groupId>
......
......@@ -46,7 +46,7 @@ public class AuthManager {
public void initApps() {
allApply = new HashMap<>();
PageInfoModel<AppVo> records = applyService.getAppList(1, 10000, "");
PageInfoModel<AppVo> records = applyService.getAppList(1, 10000, "", null);
List<AppVo> appList = records.getResult();
for (Apply apply : appList) {
String appId = apply.getAppId();
......
......@@ -5,7 +5,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
......@@ -41,4 +45,5 @@ public class CorsConfig implements WebMvcConfigurer {
registry.addInterceptor(authenticationInterceptor)
.addPathPatterns("/**");
}
}
......@@ -21,10 +21,22 @@ import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class ThreadPoolConfig {
private static final int corePoolSize = 1; // 核心线程数(默认线程数)
private static final int maxPoolSize = 2; // 最大线程数
private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒)
private static final int queueCapacity = 2; // 缓冲队列数
/**
* 核心线程数(默认线程数)
*/
private static final int CORE_POOL_SIZE = 1;
/**
* 最大线程数
*/
private static final int MAX_POOL_SIZE = 2;
/**
* 允许线程空闲时间(单位:默认为秒)
*/
private static final int KEEP_ALIVE_TIME = 10;
/**
* 缓冲队列数
*/
private static final int QUEUE_CAPACITY = 2;
/**
* 默认异步线程池
......@@ -35,13 +47,26 @@ public class ThreadPoolConfig {
public Executor taskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setThreadNamePrefix("threadPoll-");
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setKeepAliveSeconds(keepAliveTime);
pool.setQueueCapacity(queueCapacity);
pool.setCorePoolSize(CORE_POOL_SIZE);
pool.setMaxPoolSize(MAX_POOL_SIZE);
pool.setKeepAliveSeconds(KEEP_ALIVE_TIME);
pool.setQueueCapacity(QUEUE_CAPACITY);
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
pool.initialize();
return pool;
}
@Bean("mailExecutor")
public Executor mailExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("threadPoll-mail-");
threadPoolTaskExecutor.setCorePoolSize(3);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setKeepAliveSeconds(3);
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
......@@ -9,6 +9,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.log.BusinessType;
import iot.sixiang.license.log.MyLog;
import iot.sixiang.license.model.BaseResult;
......@@ -16,12 +18,15 @@ import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.vo.AppVo;
import iot.sixiang.license.service.ApplyService;
import iot.sixiang.license.util.TreeUtil;
import iot.sixiang.license.xss.XssUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -90,7 +95,14 @@ public class ApplyController {
@RequestParam(value = "pageSize", defaultValue = "0") int pageSize,
@RequestParam(value = "appName", required = false) String appName) {
appName = XssUtil.checkXSS(appName);
PageInfoModel<AppVo> records = applyService.getAppList(pageNo, pageSize, appName);
String userId = UserUtils.getLoginUserId();
if (StringUtils.isEmpty(userId)) {
throw new IotLicenseException(403, "请重新登录");
}
List<Integer> userIds = new ArrayList<>();
List<Integer> userChildIds = TreeUtil.getUserChildIds(Integer.parseInt(userId), userIds);
userChildIds.add(Integer.parseInt(userId));
PageInfoModel<AppVo> records = applyService.getAppList(pageNo, pageSize, appName, userChildIds);
int total = records.getTotal();
int pages = total / pageSize;//pages为总页数
int mod = total % pageSize;
......
......@@ -11,6 +11,8 @@ import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import iot.sixiang.license.device.DeviceManager;
import iot.sixiang.license.entity.DeviceBlack;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.log.BusinessType;
import iot.sixiang.license.log.MyLog;
import iot.sixiang.license.model.BaseResult;
......@@ -20,7 +22,9 @@ import iot.sixiang.license.model.vo.DeviceDetailVo;
import iot.sixiang.license.model.vo.DeviceVo;
import iot.sixiang.license.service.DeviceBlackService;
import iot.sixiang.license.service.DeviceService;
import iot.sixiang.license.util.TreeUtil;
import iot.sixiang.license.xss.XssUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -31,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -108,7 +113,14 @@ public class DeviceController {
@RequestParam(value = "status", required = false) Integer status) {
appName = XssUtil.checkXSS(appName);
userName = XssUtil.checkXSS(userName);
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(pageNo, pageSize, appName, userName, sn, status);
String userId = UserUtils.getLoginUserId();
if (StringUtils.isEmpty(userId)) {
throw new IotLicenseException(403, "请重新登录");
}
List<Integer> userIds = new ArrayList<>();
List<Integer> userChildIds = TreeUtil.getUserChildIds(Integer.parseInt(userId), userIds);
userChildIds.add(Integer.parseInt(userId));
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(pageNo, pageSize, appName, userName, sn, status, userChildIds);
int total = records.getTotal();
int pages = total / pageSize;//pages为总页数
int mod = total % pageSize;
......
......@@ -5,21 +5,25 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import iot.sixiang.license.entity.PmsUseLog;
import iot.sixiang.license.entity.SysOperLog;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.log.BusinessType;
import iot.sixiang.license.log.MyLog;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.vo.DeviceVo;
import iot.sixiang.license.service.PmsUseService;
import iot.sixiang.license.service.SysOperLogService;
import iot.sixiang.license.util.CommonUtil;
import iot.sixiang.license.util.TreeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -45,14 +49,30 @@ public class PmsUseLogController {
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNo", value = "当前在第几页", required = true, dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页显示多少条", required = true, dataType = "int"),
@ApiImplicitParam(name = "startTime", value = "开始时间"),
@ApiImplicitParam(name = "endTime", value = "结束时间"),
@ApiImplicitParam(name = "sn", value = "设备编号"),
@ApiImplicitParam(name = "status", value = "状态 1:成功,0:失败", dataType = "int")
})
public PageResult<PmsUseLog> getPmsUseLogList(@RequestParam(value = "pageNo", defaultValue = "0") int pageNo,
@RequestParam(value = "pageSize", defaultValue = "0") int pageSize,
@RequestParam(value = "startTime", required = false) String startTime,
@RequestParam(value = "endTime", required = false) String endTime,
@RequestParam(value = "sn", required = false) String sn,
@RequestParam(value = "status", required = false) Integer status) {
PageInfoModel<PmsUseLog> records = pmsUseService.getPmsUseLogList(pageNo, pageSize, sn, status);
@RequestParam(value = "status", required = false) Integer status) throws ParseException {
String userId = UserUtils.getLoginUserId();
if (StringUtils.isEmpty(userId)) {
throw new IotLicenseException(403, "请重新登录");
}
List<Integer> userIds = new ArrayList<>();
List<Integer> userChildIds = TreeUtil.getUserChildIds(Integer.parseInt(userId), userIds);
userChildIds.add(Integer.parseInt(userId));
if (StringUtils.isEmpty(endTime)) {
endTime = CommonUtil.getDayByNum(1, CommonUtil.dateToString(new Date(), "yyyy-MM-dd"));
} else {
endTime = CommonUtil.getDayByNum(1, endTime);
}
PageInfoModel<PmsUseLog> records = pmsUseService.getPmsUseLogList(pageNo, pageSize, sn, status, startTime, endTime, userChildIds);
int total = records.getTotal();
int pages = total / pageSize;//pages为总页数
int mod = total % pageSize;
......
package iot.sixiang.license.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import iot.sixiang.license.entity.ReportType;
import iot.sixiang.license.log.BusinessType;
import iot.sixiang.license.log.MyLog;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.ResResult;
import iot.sixiang.license.model.dto.ReportDTO;
import iot.sixiang.license.model.vo.ReportVO;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.service.ReportTypeService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by m33
* Date 2023/2/1 9:52
* Description
*/
@RestController
@RequestMapping("/iot_license/report")
@Api(value = "安全报警模块", tags = {"安全报警模块"})
public class ReportController {
@Resource
ReportTypeService reportTypeService;
@Resource
ReportService reportService;
/**
* 查询所有报警类型
*
* @return
*/
@ApiOperation(value = "获取报警类型接口", notes = "用于获取报警类型")
@GetMapping("report_type/list")
@MyLog(title = "获取报警类型", businessType = BusinessType.SELECT)
public ResResult getReportTypeList() {
List<ReportType> reportTypes = reportTypeService.getReportTypeList();
return ResResult.success().goRecord(reportTypes);
}
@ApiOperation(value = "获取报警列表接口", notes = "用于获取报警列表")
@GetMapping("list")
@MyLog(title = "获取报警列表", optParam = "#{reportDTO.pageNo},#{reportDTO.pageSize},#{reportDTO.type},#{reportDTO.sn},#{reportDTO.startTime},#{reportDTO.endTime}", businessType = BusinessType.SELECT)
public PageResult<ReportVO> getReportList(ReportDTO reportDTO) {
return reportService.getReportList(reportDTO);
}
}
......@@ -10,12 +10,16 @@ import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.vo.SysOperLogVo;
import iot.sixiang.license.service.SysOperLogService;
import iot.sixiang.license.util.CommonUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
/**
......@@ -31,6 +35,7 @@ public class SysOperLogController {
/**
* 分页查询所有的oper_log
*
* @param pageNo
* @param pageSize
* @return
......@@ -39,17 +44,26 @@ public class SysOperLogController {
@GetMapping("operate/list")
@MyLog(title = "获取日志列表", businessType = BusinessType.SELECT)
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNo",value = "当前在第几页", required = true,dataType = "int"),
@ApiImplicitParam(name = "pageSize",value = "每页显示多少条", required = true, dataType = "int")
@ApiImplicitParam(name = "pageNo", value = "当前在第几页", required = true, dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页显示多少条", required = true, dataType = "int"),
@ApiImplicitParam(name = "startTime", value = "开始时间"),
@ApiImplicitParam(name = "endTime", value = "结束时间")
})
public PageResult<SysOperLogVo> getOperLogList(@RequestParam(value = "pageNo", defaultValue = "0") int pageNo,
@RequestParam(value = "pageSize",defaultValue = "0") int pageSize) {
PageInfoModel<SysOperLogVo> records = sysOperLogService.getOperLogList(pageNo,pageSize);
@RequestParam(value = "pageSize", defaultValue = "0") int pageSize,
@RequestParam(value = "startTime", required = false, defaultValue = "") String startTime,
@RequestParam(value = "endTime", required = false, defaultValue = "") String endTime) throws ParseException {
if (StringUtils.isEmpty(endTime)) {
endTime = CommonUtil.getDayByNum(1, CommonUtil.dateToString(new Date(), "yyyy-MM-dd"));
} else {
endTime = CommonUtil.getDayByNum(1, endTime);
}
PageInfoModel<SysOperLogVo> records = sysOperLogService.getOperLogList(pageNo, pageSize, startTime, endTime);
int total = records.getTotal();
int pages = total/pageSize;//pages为总页数
int mod = total%pageSize;
if(mod!=0){
pages = pages +1;
int pages = total / pageSize;//pages为总页数
int mod = total % pageSize;
if (mod != 0) {
pages = pages + 1;
}
List<SysOperLogVo> result = records.getResult();
return new PageResult(200, "查找成功", pageNo, pages, total, result);
......
......@@ -54,7 +54,7 @@ public class DeviceManager {
public void initDevices() {
allDevice = new HashMap<>();
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(1, 10000, "", "", null, null);
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(1, 10000, null, "", "", null, null);
List<DeviceVo> deviceList = records.getResult();
for (DeviceVo deviceVo : deviceList) {
......@@ -151,7 +151,7 @@ public class DeviceManager {
}
public PageInfoModel<DeviceDetailVo> getDeviceDetailList(int pageNo, int pageSize, String appName, String userName) {
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(pageNo, pageSize, appName, userName, null, null);
PageInfoModel<DeviceVo> records = deviceService.getDeviceList(pageNo, pageSize, null, appName, userName, null, null);
List<DeviceVo> deviceVos = records.getResult();
PageInfoModel<DeviceDetailVo> detailVoPageInfoModel = new PageInfoModel<>();
List<DeviceDetailVo> detailVos = new ArrayList<>();
......
......@@ -9,14 +9,18 @@ import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.SocketChannel;
import iot.sixiang.license.auth.AuthManager;
import iot.sixiang.license.consts.Constant;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.event.CreateForwardClientEvent;
import iot.sixiang.license.event.DeviceClientInactiveEvent;
import iot.sixiang.license.event.DeviceClientLicenseEvent;
import iot.sixiang.license.event.EventPublisher;
import iot.sixiang.license.event.ForwardClientRequestEvent;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.SessionContext;
import iot.sixiang.license.model.dto.ReportErrorMsgDTO;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.service.PmsUseService;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.service.TerminalDeviceService;
import iot.sixiang.license.third_lib.LibHelper;
import iot.sixiang.license.util.CommonUtil;
......@@ -28,6 +32,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.net.InetSocketAddress;
import java.util.Date;
import java.util.List;
@Component
......@@ -41,6 +46,10 @@ public class DeviceServerHandler extends SimpleChannelInboundHandler<Object> {
private PmsUseService pmsUseService;
@Resource
TerminalDeviceService terminalDeviceService;
@Resource
ReportService reportService;
@Resource
UserMapper userMapper;
public DeviceServerHandler() {
super();
......@@ -172,6 +181,10 @@ public class DeviceServerHandler extends SimpleChannelInboundHandler<Object> {
eventPublisher.publishEvent(event);
} else {
pmsUseService.createFailUseLog(sn, "鉴权失败");
UserInfoVO user = userMapper.getUserBySn(sn);
Report report = Report.builder().category(0).type(6).sn(sn).userName(user.getUserName())
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
}
return license;
}
......
package iot.sixiang.license.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/1/31 14:26
* Description
*/
@Data
public class Permission {
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("权限说明")
private String description;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("逻辑删除标识 1:删除,0:未删除")
private Integer deleted;
}
package iot.sixiang.license.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/1/31 14:27
* Description
*/
@Data
@Builder
public class Report {
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("报警大类 1:系统,0:设备")
private Integer category;
@ApiModelProperty("报警类型")
private Integer type;
@ApiModelProperty("设备编码(系统报警该值为空)")
private String sn;
@ApiModelProperty("报警说明")
private String description;
@ApiModelProperty("报警账户")
private String userName;
@ApiModelProperty("报警公司")
private String userCompany;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("逻辑删除标识 1:删除,0:未删除")
private Integer deleted;
}
package iot.sixiang.license.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/1/31 14:31
* Description
*/
@Data
public class ReportType {
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("报警大类 1:系统,0:设备")
private Integer category;
@ApiModelProperty("报警说明")
private String description;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("逻辑删除标识 1:删除,0:未删除")
private Integer deleted;
}
......@@ -13,7 +13,7 @@ import java.util.Date;
/**
* <p>
*
*
* </p>
*
* @author m33
......@@ -40,6 +40,15 @@ public class User implements Serializable {
@ApiModelProperty("公司")
private String company;
@ApiModelProperty("报警的邮箱,注册的时候用户名是邮箱则这里自动填那个邮箱,可以修改")
private String notify;
@ApiModelProperty("父账号标识(超管为空)")
private Integer parent;
@ApiModelProperty("账号等级(共有三级),超管一级")
private Integer level;
@ApiModelProperty("创建时间")
private Date createTime;
......
package iot.sixiang.license.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/1/31 14:41
* Description
*/
@Data
public class UserPermission {
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("权限标识")
private Integer permission;
@ApiModelProperty("用户标识")
private Integer user;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("逻辑删除标识 1:删除,0:未删除")
private Integer deleted;
}
......@@ -2,16 +2,22 @@ package iot.sixiang.license.event;
import com.alibaba.fastjson.JSONObject;
import iot.sixiang.license.device.DeviceProtocol;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.SamInfo;
import iot.sixiang.license.model.SamMonitor;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.operate.OperateManager;
import iot.sixiang.license.service.AlarmService;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.util.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
......@@ -23,9 +29,12 @@ import java.util.List;
public class OperateSAMStatusResponseEventHandler {
@Autowired
public OperateManager operateManager;
@Autowired
private AlarmService alarmService;
@Resource
UserMapper userMapper;
@Resource
ReportService reportService;
public OperateSAMStatusResponseEventHandler() {
}
......@@ -51,6 +60,10 @@ public class OperateSAMStatusResponseEventHandler {
String title = "SAM故障";
String content = "index为" + index + "的SAM发生故障";
alarmService.addAlarm(typeId,title,content);
UserInfoVO user = userMapper.getRootAccount();
Report report = Report.builder().category(1).type(1).userName(user.getUserName())
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
}
}
SamMonitor samMonitor = new SamMonitor();
......@@ -63,6 +76,10 @@ public class OperateSAMStatusResponseEventHandler {
String title = "SAM不足";
String content = "当前在线客户端已超过70%";
alarmService.addAlarm(typeId,title,content);
UserInfoVO user = userMapper.getRootAccount();
Report report = Report.builder().category(1).type(2).userName(user.getUserName())
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
}
}
}
......@@ -4,17 +4,23 @@ import io.netty.channel.ChannelFuture;
import io.netty.channel.socket.SocketChannel;
import iot.sixiang.license.device.DeviceManager;
import iot.sixiang.license.device.DeviceProtocol;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.event.DeviceClientBeForcedOfflineEvent;
import iot.sixiang.license.event.DeviceClientLicenseEvent;
import iot.sixiang.license.event.EventPublisher;
import iot.sixiang.license.event.ForwardClientConnectEvent;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.SessionContext;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.net.BaseConnectionListener;
import iot.sixiang.license.operate.OperateManager;
import iot.sixiang.license.service.AlarmService;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.util.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
@Slf4j
public class ForwardConnectionListener extends BaseConnectionListener {
private DeviceManager deviceManager;
......@@ -34,7 +40,13 @@ public class ForwardConnectionListener extends BaseConnectionListener {
String title = "连接服器失败";
String content = "连接服务器:" + this.host + ":" + this.port + "失败";
alarmService.addAlarm(typeId, title, content);
UserMapper userMapper = SpringUtil.getBean(UserMapper.class);
ReportService reportService = SpringUtil.getBean(ReportService.class);
UserInfoVO user = userMapper.getRootAccount();
Report report = Report.builder().category(1).type(3).userName(user.getUserName())
.description("桥接客户端,连接服务器" + this.host + ":" + this.port + "失败")
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
// forward client连接失败,则强制踢掉设备客户端
DeviceClientBeForcedOfflineEvent deviceClientBeForcedOfflineEvent = new DeviceClientBeForcedOfflineEvent();
deviceClientBeForcedOfflineEvent.setSn(this.sn);
......
......@@ -17,7 +17,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody //为了返回数据
public BaseResult error(Exception e){
log.error("出现自定义异常", e);
log.error("出现全局异常", e);
return BaseResult.serverException();
}
......@@ -25,7 +25,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(IotLicenseException.class)
@ResponseBody//为了返回数据
public BaseResult error(IotLicenseException e){
log.error("出现自定义异常,{}" + e.getMsg());
log.error("出现自定义异常,{}", e.getMsg());
return BaseResult.failed().setMsgValue(e.getMsg()).setCodeValue(e.getCode());
}
}
......@@ -97,6 +97,11 @@ public class JwtFilter implements Filter {
String userId = userData.get("userId").asString();
String userName = userData.get("userName").asString();
String password = "";
if (UserUtils.getToken(userId) == null) {
request.setAttribute("msg", "登录信息已失效,请重新登录");
request.getRequestDispatcher("/iot_license/fail").forward(request, response);
return;
}
if (!token.equals(UserUtils.getToken(userId))) {
request.setAttribute("msg", "账户已在别处登录,请重新登录");
request.getRequestDispatcher("/iot_license/fail").forward(request, response);
......
......@@ -8,7 +8,7 @@ import java.util.List;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author m33
......@@ -18,7 +18,9 @@ public interface ApplyMapper extends BaseMapper<Apply> {
boolean addApply(String appId, String appName, String appKey, int userId);
List<AppVo> getAppList(String appName);
List<AppVo> getAppList(String appName, List<Integer> userChildIds);
Apply getApplyByAppName(String appName);
void deleteByUserId(Integer userId);
}
......@@ -13,9 +13,11 @@ import java.util.List;
* @since 2022-06-08
*/
public interface DeviceMapper extends BaseMapper<Device> {
List<DeviceVo> getDeviceList(String appName, String userName, String sn, Integer status);
List<DeviceVo> getDeviceList(String appName, String userName, List<Integer> userChildIds, String sn, Integer status);
boolean addDevice(String sn, String appId);
int updateDeviceById(Device device);
void deleteByUserId(int userId);
}
package iot.sixiang.license.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import iot.sixiang.license.entity.Permission;
/**
* Created by m33
* Date 2023/1/31 14:48
* Description
*/
public interface PermissionMapper extends BaseMapper<Permission> {
}
......@@ -12,5 +12,5 @@ import java.util.List;
* Description
*/
public interface PmsUseLogMapper extends BaseMapper<PmsUseLog> {
List<PmsUseLog> getPmsUseLogList(String sn, Integer status);
List<PmsUseLog> getPmsUseLogList(String sn, Integer status, String startTime, String endTime, List<Integer> userChildIds);
}
package iot.sixiang.license.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.model.vo.ReportVO;
import java.util.List;
/**
* Created by m33
* Date 2023/2/1 10:00
* Description
*/
public interface ReportMapper extends BaseMapper<Report> {
List<ReportVO> getReportList(Integer type, String sn, String startTime, String endTime, List<Integer> userChildIds);
}
package iot.sixiang.license.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import iot.sixiang.license.entity.ReportType;
/**
* Created by m33
* Date 2023/2/1 10:00
* Description
*/
public interface ReportTypeMapper extends BaseMapper<ReportType> {
}
......@@ -19,5 +19,5 @@ public interface SysOperLogMapper extends BaseMapper<SysOperLog> {
boolean addOperlog(String title, Integer businessType, String uri, Integer status, String optParam, String errorMsg, Date operTime);
List<SysOperLogVo> getOperLogList();
List<SysOperLogVo> getOperLogList(String startTime, String endTime);
}
......@@ -2,13 +2,15 @@ package iot.sixiang.license.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import iot.sixiang.license.entity.User;
import iot.sixiang.license.model.vo.UserChildIdVO;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.model.vo.UserVo;
import java.util.List;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author m33
......@@ -19,13 +21,19 @@ public interface UserMapper extends BaseMapper<User> {
boolean deleteUser(int user);
boolean addUser(String userName, String company, String password);
boolean addUser(String userName, String company, String password, String notify, int parent, int level);
boolean updateUser(int userId, String password);
List<UserVo> getUserList( String userName, String company);
List<UserVo> getUserList(String userName, String company, List<Integer> userIds);
User getUserByUserName(String userName);
User getUserById(int userId);
List<UserChildIdVO> getChildUser(int userId);
UserInfoVO getRootAccount();
UserInfoVO getUserBySn(String sn);
}
package iot.sixiang.license.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import iot.sixiang.license.entity.Permission;
import iot.sixiang.license.entity.UserPermission;
import java.util.List;
/**
* Created by m33
* Date 2023/1/31 14:48
* Description
*/
public interface UserPermissionMapper extends BaseMapper<UserPermission> {
List<UserPermission> getPermissionById(int userId);
int saveBatch(List<Integer> userPermissions, int userId);
void deleteUserPermission(int parseInt);
int delBatch(List<Integer> permissionDelList, Integer userId);
}
package iot.sixiang.license.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* Created by m33
* Date 2023/1/31 15:32
* Description
*/
@Data
public class AssignUserPermissionDTO {
@ApiModelProperty("权限列表")
List<Integer> permissions;
@ApiModelProperty("用户id")
Integer userId;
}
......@@ -10,6 +10,9 @@ import lombok.Data;
*/
@Data
public class CheckCodeDto {
@ApiModelProperty("验证码")
private String account;
@ApiModelProperty("验证码")
private String code;
}
package iot.sixiang.license.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/2/1 13:57
* Description
*/
@Data
public class ReportDTO {
@ApiModelProperty("当前页")
private Integer pageNo;
@ApiModelProperty("每页条数")
private Integer pageSize;
@ApiModelProperty("报警事件类型")
private Integer type;
@ApiModelProperty("设备编码")
private String sn;
@ApiModelProperty("开始时间")
private String startTime;
@ApiModelProperty("结束时间")
private String endTime;
}
package iot.sixiang.license.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Created by m33
* Date 2023/1/30 14:18
* Description
*/
@Data
public class UpdateNotifyDTO {
@ApiModelProperty("通知人邮箱")
private String notify;
}
......@@ -16,8 +16,8 @@ public class LoginReqVo {
@ApiModelProperty("用户名")
private String userName;
@ApiModelProperty("密码")
private String password;
// @ApiModelProperty("密码")
// private String password;
@ApiModelProperty("验证码")
private String code;
......
package iot.sixiang.license.model.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import iot.sixiang.license.entity.Report;
import lombok.Data;
import java.util.Date;
/**
* Created by m33
* Date 2023/2/1 14:06
* Description
*/
@Data
public class ReportVO {
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("报警大类 1:系统,0:设备")
private Integer category;
@ApiModelProperty("报警类型")
private Integer type;
@ApiModelProperty("设备编码(系统报警该值为空)")
private String sn;
@ApiModelProperty("报警说明")
private String description;
@ApiModelProperty("报警账户")
private String userName;
@ApiModelProperty("报警公司")
private String userCompany;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("逻辑删除标识 1:删除,0:未删除")
private Integer deleted;
@ApiModelProperty("报警事件")
private String reportTypeStr;
}
package iot.sixiang.license.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Created by m33
* Date 2023/2/1 14:52
* Description
*/
@Data
public class UserChildIdVO {
@ApiModelProperty("用户Id")
private Integer userId;
@ApiModelProperty("父Id")
private Integer parent;
@ApiModelProperty("账号级别")
private Integer level;
}
package iot.sixiang.license.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Created by m33
* Date 2023/1/31 17:51
* Description
*/
@Data
public class UserDeleteVO {
@ApiModelProperty("userId")
public String userId;
}
package iot.sixiang.license.model.vo;
import io.swagger.annotations.ApiModelProperty;
import iot.sixiang.license.entity.User;
import iot.sixiang.license.entity.UserPermission;
import lombok.Data;
import java.util.List;
/**
* Created by m33
* Date 2023/2/2 16:53
* Description
*/
@Data
public class UserDetailVO extends User {
@ApiModelProperty("用户权限列表")
private List<UserPermission> permissionList;
}
package iot.sixiang.license.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Created by m33
* Date 2023/2/2 15:03
* Description
*/
@Data
public class UserInfoVO {
@ApiModelProperty("用户名")
private String userName;
@ApiModelProperty("公司名")
private String company;
@ApiModelProperty("通知邮箱")
private String notify;
}
......@@ -9,5 +9,6 @@ import lombok.Data;
*/
@Data
public class UserResetPwdVo {
private String account;
private String password;
}
......@@ -2,12 +2,22 @@ package iot.sixiang.license.net;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.ssl.ClientAuth;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import iot.sixiang.license.util.CommonUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
@Slf4j
public class TcpServer {
private int port;
......@@ -18,7 +28,15 @@ public class TcpServer {
this.channelInitializer = channelInitializer;
}
@SneakyThrows
public void start() {
String topPath = CommonUtil.getServerParentDirectory() + File.separator + "/sec/";
SslContext sslContext = SslContextBuilder
.forServer(new File(topPath + "server.crt"), new File(topPath + "server.pkcs8.key"))
.trustManager(new File(topPath + "ca.crt"))
.clientAuth(ClientAuth.REQUIRE)
.build();
//创建两个线程组 bossGroup、workerGroup
EventLoopGroup bossGroup = new NioEventLoopGroup(4);
EventLoopGroup workerGroup = new NioEventLoopGroup(4);
......@@ -29,8 +47,17 @@ public class TcpServer {
b.group(bossGroup, workerGroup)
//设置服务端通道实现类型
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() { //配置具体的数据处理方式
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addFirst("ssl", sslContext.newHandler(socketChannel.alloc()));
//业务handler
pipeline.addLast(channelInitializer);
}
})
// .handler(new LoggingHandler(LogLevel.INFO))
.childHandler(channelInitializer)
//.childHandler(channelInitializer)
// 设置tcp缓冲区
.option(ChannelOption.SO_BACKLOG, 1024)
//设置保持活动连接状态
......
......@@ -3,13 +3,19 @@ package iot.sixiang.license.operate;
import io.netty.channel.ChannelFuture;
import io.netty.channel.socket.SocketChannel;
import iot.sixiang.license.device.DeviceProtocol;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.event.EventPublisher;
import iot.sixiang.license.event.OperateSAMStatusRequestEvent;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.net.BaseConnectionListener;
import iot.sixiang.license.service.AlarmService;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.util.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
@Slf4j
public class OperateConnectionListener extends BaseConnectionListener {
......@@ -25,6 +31,13 @@ public class OperateConnectionListener extends BaseConnectionListener {
String title = "连接服器失败";
String content = "连接服务器:" + this.host + ":" + this.port + "失败";
alarmService.addAlarm(typeId, title, content);
UserMapper userMapper = SpringUtil.getBean(UserMapper.class);
ReportService reportService = SpringUtil.getBean(ReportService.class);
UserInfoVO user = userMapper.getRootAccount();
Report report = Report.builder().category(1).type(3).userName(user.getUserName())
.description("运维客户端,连接服务器" + this.host + ":" + this.port + "失败")
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
} else {
log.info("运维客户端,连接服务器成功:{},{}", this.host, this.port);
//TODO 查询SAM状态
......
......@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.vo.AppVo;
import java.util.List;
/**
* <p>
* 服务类
......@@ -17,5 +19,7 @@ public interface ApplyService extends IService<Apply> {
boolean addApply(String appName, String appKey, int userId);
PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName);
PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName, List<Integer> userChildIds);
void deleteByUserId(Integer userId);
}
......@@ -10,6 +10,8 @@ import iot.sixiang.license.model.dto.TerminalDevieBindDTO;
import iot.sixiang.license.model.dto.TerminalDevieUnBindDTO;
import iot.sixiang.license.model.vo.DeviceVo;
import java.util.List;
/**
* 服务类
*
......@@ -17,7 +19,7 @@ import iot.sixiang.license.model.vo.DeviceVo;
* @since 2022-06-08
*/
public interface DeviceService extends IService<Device> {
PageInfoModel<DeviceVo> getDeviceList(int pageNo, int pageSize, String appName, String userName, String sn, Integer status);
PageInfoModel<DeviceVo> getDeviceList(int pageNo, int pageSize, String appName, String userName, String sn, Integer status, List<Integer> userChildIds);
boolean addDevice(String appId, int count);
......@@ -28,4 +30,6 @@ public interface DeviceService extends IService<Device> {
ResResult getBindStatus(TerminalDevieUnBindDTO terminalDevieUnBindDTO);
BaseResult platFormBind(PlatFormBindDTO platFormBindDTO);
void deleteByUserId(int userId);
}
package iot.sixiang.license.service;
import iot.sixiang.license.entity.Permission;
import java.util.List;
/**
* Created by m33
* Date 2023/1/31 14:21
* Description
*/
public interface PermissionService {
List<Permission> getPermissionList();
}
......@@ -4,6 +4,8 @@ import iot.sixiang.license.entity.PmsUseLog;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.dto.ReportErrorMsgDTO;
import java.util.List;
/**
* Created by M=54G
* Date 11/23/22 3:09 PM
......@@ -14,11 +16,13 @@ public interface PmsUseService {
void createFailUseLog(String sn, String message);
void success(int useLogId);
void success(ReportErrorMsgDTO reportErrorMsgDTO);
PageInfoModel<PmsUseLog> getPmsUseLogList(int pageNo, int pageSize, String sn, Integer status);
PageInfoModel<PmsUseLog> getPmsUseLogList(int pageNo, int pageSize, String sn, Integer status, String startTime, String endTime, List<Integer> userChildIds);
boolean reportErrorMsg(ReportErrorMsgDTO reportErrorMsgDTO);
boolean deletePmsUseLogById(Integer id);
PmsUseLog getPmsUseLogById(Integer id);
}
package iot.sixiang.license.service;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.model.BaseResult;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.dto.ReportDTO;
import iot.sixiang.license.model.vo.ReportVO;
/**
* Created by M=54G
* Date 11/23/22 3:09 PM
* Description
*/
public interface ReportService {
PageResult<ReportVO> getReportList(ReportDTO reportDTO);
void reportToEmail(Report report, String notify);
}
package iot.sixiang.license.service;
import iot.sixiang.license.entity.PmsUseLog;
import iot.sixiang.license.entity.ReportType;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.dto.ReportErrorMsgDTO;
import java.util.List;
/**
* Created by M=54G
* Date 11/23/22 3:09 PM
* Description
*/
public interface ReportTypeService {
List<ReportType> getReportTypeList();
}
......@@ -18,5 +18,5 @@ import java.util.Date;
public interface SysOperLogService extends IService<SysOperLog> {
boolean addOperlog(String title, Integer businessType, String uri, Integer status, String optParam, String errorMsg, Date operTime);
PageInfoModel<SysOperLogVo> getOperLogList(int pageNo, int pageSize);
PageInfoModel<SysOperLogVo> getOperLogList(int pageNo, int pageSize, String startTime, String endTime);
}
package iot.sixiang.license.service;
import iot.sixiang.license.entity.Permission;
import iot.sixiang.license.entity.UserPermission;
import iot.sixiang.license.model.dto.AssignUserPermissionDTO;
import java.util.List;
/**
* Created by m33
* Date 2023/1/31 14:21
* Description
*/
public interface UserPermissionService {
List<UserPermission> getPermissionById(int userId);
boolean saveBatch(AssignUserPermissionDTO assignUserPermissionDTO);
void deleteUserPermission(int parseInt);
}
package iot.sixiang.license.service;
import iot.sixiang.license.entity.User;
import iot.sixiang.license.model.BaseResult;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.dto.UpdateNotifyDTO;
import iot.sixiang.license.model.vo.UserChildIdVO;
import iot.sixiang.license.model.vo.UserVo;
import java.util.List;
/**
* <p>
* 服务类
......@@ -16,13 +21,17 @@ public interface UserService {
boolean deleteUser(int userIdVo);
boolean addUser(String userName, String company, String password);
boolean addUser(String userName, String company, String password, int parent, int level);
boolean updateUser(User user);
PageInfoModel<UserVo> getUserList(int pageNo, int pageSize, String userName, String company);
PageInfoModel<UserVo> getUserList(int pageNo, int pageSize, String userName, String company, List<Integer> userIds);
User getUserById(int userId);
User getUserByName(String root);
BaseResult updateNotify(UpdateNotifyDTO updateNotifyDTO);
List<UserChildIdVO> getChildUser(int userId);
}
......@@ -22,7 +22,7 @@ import java.util.stream.Collectors;
/**
* <p>
* 服务实现类
* 服务实现类
* </p>
*
* @author m33
......@@ -33,11 +33,12 @@ public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements
@Resource
ApplyMapper applyMapper;
@Override
public boolean addApply(String appName, String appKey, int userId) {
if(StringUtils.isEmpty(appName) || StringUtils.isEmpty(appKey)
|| userId == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(),ResultCode.VALIDATE_FAILED.getMsg());
if (StringUtils.isEmpty(appName) || StringUtils.isEmpty(appKey)
|| userId == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
Apply res = applyMapper.getApplyByAppName(appName);
if (res != null) {
......@@ -54,11 +55,11 @@ public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements
}
@Override
public PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName) {
if(pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(),ResultCode.VALIDATE_FAILED.getMsg());
public PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName, List<Integer> userChildIds) {
if (pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
List<AppVo> records = applyMapper.getAppList(appName);
List<AppVo> records = applyMapper.getAppList(appName, userChildIds);
records = records.stream().sorted(Comparator.comparing(AppVo::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
List<AppVo> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize;
......@@ -70,4 +71,9 @@ public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements
objectPageInfoModel.setResult(result);
return objectPageInfoModel;
}
@Override
public void deleteByUserId(Integer userId) {
applyMapper.deleteByUserId(userId);
}
}
......@@ -40,11 +40,11 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
private DeviceMapper deviceMapper;
@Override
public PageInfoModel<DeviceVo> getDeviceList(int pageNo, int pageSize, String appName, String userName, String sn, Integer status) {
public PageInfoModel<DeviceVo> getDeviceList(int pageNo, int pageSize, String appName, String userName, String sn, Integer status, List<Integer> userChildIds) {
if (pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
List<DeviceVo> deviceTypes = deviceMapper.getDeviceList(appName, userName, sn, status);
List<DeviceVo> deviceTypes = deviceMapper.getDeviceList(appName, userName, userChildIds, sn, status);
deviceTypes = deviceTypes.stream().sorted(Comparator.comparing(DeviceVo::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
List<DeviceVo> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize;
......@@ -156,7 +156,15 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
if (deviceId.equals(device.getDeviceId())) {
return BaseResult.success();
} else {
return BaseResult.failed().setMsgValue("设备sn已被绑定");
return BaseResult.failed().setMsgValue("设备编码已被绑定");
}
}
LambdaQueryWrapper<Device> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Device::getSn, sn).last("limit 1");
Device device1 = deviceMapper.selectOne(lambdaQueryWrapper);
if (device1 != null) {
if (!deviceId.equals(device1.getDeviceId())) {
return BaseResult.failed().setMsgValue("SN已存在");
}
}
LambdaQueryWrapper<Device> wrapper = new LambdaQueryWrapper<>();
......@@ -180,4 +188,9 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
return BaseResult.failed();
}
}
@Override
public void deleteByUserId(int userId) {
deviceMapper.deleteByUserId(userId);
}
}
package iot.sixiang.license.service.impl;
import iot.sixiang.license.entity.Permission;
import iot.sixiang.license.mapper.PermissionMapper;
import iot.sixiang.license.service.PermissionService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by m33
* Date 2023/1/31 14:21
* Description
*/
@Service
public class PermissionServiceImpl implements PermissionService {
@Resource
PermissionMapper permissionMapper;
@Override
public List<Permission> getPermissionList() {
return permissionMapper.selectList(null);
}
}
......@@ -7,6 +7,8 @@ import iot.sixiang.license.mapper.PmsUseLogMapper;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.dto.ReportErrorMsgDTO;
import iot.sixiang.license.service.PmsUseService;
import iot.sixiang.license.util.CommonUtil;
import org.owasp.esapi.ESAPI;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -41,19 +43,33 @@ public class PmsUseServiceImpl implements PmsUseService {
}
@Override
public void success(int useLogId) {
public void success(ReportErrorMsgDTO reportErrorMsgDTO) {
PmsUseLog pmsUseLog = new PmsUseLog();
pmsUseLog.setId(useLogId);
pmsUseLog.setId(reportErrorMsgDTO.getId());
pmsUseLog.setStatus(1);
if (reportErrorMsgDTO.getErrorMsg() != null) {
String[] successMessage = reportErrorMsgDTO.getErrorMsg().split(",");
if (successMessage.length == 2) {
// 身份证脱敏
String idCardString = ESAPI.encoder().encodeForDN(CommonUtil.idCardEncrypt(successMessage[1]));
// 姓名脱敏
String nameString = ESAPI.encoder().encodeForDN(CommonUtil.nameDesensitization(CommonUtil.unicodeToStr(successMessage[0])));
pmsUseLog.setMessage(nameString + "," + idCardString);
} else {
pmsUseLog.setMessage(reportErrorMsgDTO.getErrorMsg());
}
}
pmsUseLogMapper.updateById(pmsUseLog);
}
@Override
public PageInfoModel<PmsUseLog> getPmsUseLogList(int pageNo, int pageSize, String sn, Integer status) {
public PageInfoModel<PmsUseLog> getPmsUseLogList(int pageNo, int pageSize, String sn, Integer status, String startTime, String endTime, List<Integer> userChildIds) {
if (pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
List<PmsUseLog> pmsUseLogs = pmsUseLogMapper.getPmsUseLogList(sn, status);
List<PmsUseLog> pmsUseLogs = pmsUseLogMapper.getPmsUseLogList(sn, status, startTime, endTime, userChildIds);
List<PmsUseLog> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize;
if (begin >= 0 && pmsUseLogs.size() > 0) {
......@@ -91,6 +107,11 @@ public class PmsUseServiceImpl implements PmsUseService {
return res > 0;
}
@Override
public PmsUseLog getPmsUseLogById(Integer id) {
return pmsUseLogMapper.selectById(id);
}
private PmsUseLog getPmsUseLog(String sn) {
PmsUseLog pmsUseLog = new PmsUseLog();
Date date = new Date();
......
package iot.sixiang.license.service.impl;
import cn.hutool.core.lang.Validator;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.entity.ReportType;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.mapper.ReportMapper;
import iot.sixiang.license.mapper.ReportTypeMapper;
import iot.sixiang.license.model.PageResult;
import iot.sixiang.license.model.dto.ReportDTO;
import iot.sixiang.license.model.vo.ReportVO;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.util.CommonUtil;
import iot.sixiang.license.util.EmailUtils;
import iot.sixiang.license.util.TreeUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by m33
* Date 2023/2/1 9:59
* Description
*/
@Service
public class ReportServiceImpl implements ReportService {
@Resource
ReportMapper reportMapper;
@Resource
EmailUtils emailUtils;
@Resource
ReportTypeMapper reportTypeMapper;
@Override
public PageResult<ReportVO> getReportList(ReportDTO reportDTO) {
int pageNo = reportDTO.getPageNo();
int pageSize = reportDTO.getPageSize();
Integer type = reportDTO.getType();
String sn = reportDTO.getSn();
String startTime = reportDTO.getStartTime();
String endTime = reportDTO.getEndTime();
String userId = UserUtils.getLoginUserId();
if (StringUtils.isEmpty(userId)) {
throw new IotLicenseException(403, "请重新登录");
}
List<Integer> userIds = new ArrayList<>();
List<Integer> userChildIds = TreeUtil.getUserChildIds(Integer.parseInt(userId), userIds);
userChildIds.add(Integer.parseInt(userId));
List<ReportVO> reportList = reportMapper.getReportList(type, sn, startTime, endTime, userChildIds);
int total = reportList.size();
List<ReportVO> result;
int begin = (pageNo - 1) * pageSize;
if (begin >= 0 && total > 0) {
result = reportList.stream().skip(begin).limit(pageSize).collect(Collectors.toList());
} else {
return new PageResult<>(200, "查找成功", pageNo, 0, 0, null);
}
// pages为总页数
int pages = total / pageSize;
int mod = total % pageSize;
if (mod != 0) {
pages = pages + 1;
}
return new PageResult(200, "查找成功", pageNo, pages, total, result);
}
@Async("mailExecutor")
@Override
public void reportToEmail(Report report, String notify) {
if (!Validator.isEmail(notify)) {
throw new IotLicenseException(403, "报警失败,无效的邮箱账号");
}
reportMapper.insert(report);
Integer type = report.getType();
ReportType reportType = reportTypeMapper.selectById(type);
if (reportType == null) {
throw new IotLicenseException(403, "报警失败,无效的报警类型");
}
Integer category = report.getCategory();
String content = "";
if (category == 1) {
content = "【实名制身份验证云平台】系统报警!报警时间:" + CommonUtil.getSystemTime() + ",报警事件:" + reportType.getDescription()
+ ",报警用户:" + report.getUserName() + ",公司名称:" + report.getUserCompany() + ",请核实!";
} else if (category == 0) {
content = "【实名制身份验证云平台】设备报警!报警时间:" + CommonUtil.getSystemTime() + ",报警事件:" + reportType.getDescription()
+ ",设备SN:" + report.getSn() + ",报警用户:" + report.getUserName() + ",公司名称:" + report.getUserCompany()
+ ",请核实!";
} else {
throw new IotLicenseException(403, "报警失败,无效的报警大类");
}
emailUtils.sendSimpleMail(notify, "实名制身份验证云平台", content);
}
}
package iot.sixiang.license.service.impl;
import iot.sixiang.license.entity.ReportType;
import iot.sixiang.license.mapper.ReportTypeMapper;
import iot.sixiang.license.service.ReportTypeService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by m33
* Date 2023/2/1 9:59
* Description
*/
@Service
public class ReportTypeServiceImpl implements ReportTypeService {
@Resource
ReportTypeMapper reportTypeMapper;
@Override
public List<ReportType> getReportTypeList() {
return reportTypeMapper.selectList(null);
}
}
......@@ -45,11 +45,11 @@ public class SysOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOper
}
@Override
public PageInfoModel<SysOperLogVo> getOperLogList(int pageNo, int pageSize) {
public PageInfoModel<SysOperLogVo> getOperLogList(int pageNo, int pageSize, String startTime, String endTime) {
if(pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(),ResultCode.VALIDATE_FAILED.getMsg());
}
List<SysOperLogVo> records = sysOperLogMapper.getOperLogList();
List<SysOperLogVo> records = sysOperLogMapper.getOperLogList(startTime, endTime);
List<SysOperLogVo> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize;
if (begin >= 0 && records.size() > 0) {
......
......@@ -2,14 +2,19 @@ package iot.sixiang.license.service.impl;
import iot.sixiang.license.auth.AuthManager;
import iot.sixiang.license.device.DeviceManager;
import iot.sixiang.license.entity.PmsUseLog;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.JwtUtil;
import iot.sixiang.license.jwt.LoginUser;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.BaseResult;
import iot.sixiang.license.model.ResResult;
import iot.sixiang.license.model.dto.*;
import iot.sixiang.license.model.vo.UserInfoVO;
import iot.sixiang.license.service.DeviceService;
import iot.sixiang.license.service.PmsUseService;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.service.TerminalDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -17,7 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
@Slf4j
......@@ -31,6 +36,10 @@ public class TerminalDeviceServiceImpl implements TerminalDeviceService {
private PmsUseService pmsUseService;
@Resource
private DeviceManager deviceManager;
@Resource
UserMapper userMapper;
@Resource
ReportService reportService;
@Override
public ResResult getToken(GetTerminalDeviceTokenDTO getTerminalDeviceTokenDTO) {
......@@ -69,10 +78,27 @@ public class TerminalDeviceServiceImpl implements TerminalDeviceService {
return BaseResult.validate_failed();
}
if ("0".equals(reportErrorMsgDTO.getErrorCode())) {
pmsUseService.success(reportErrorMsgDTO.getId());
pmsUseService.success(reportErrorMsgDTO);
} else if ("-1".equals(reportErrorMsgDTO.getErrorCode())) {
pmsUseService.deletePmsUseLogById(id);
} else {
PmsUseLog pmsUseLog = pmsUseService.getPmsUseLogById(reportErrorMsgDTO.getId());
if (pmsUseLog == null || StringUtils.isEmpty(pmsUseLog.getSn())) {
throw new IotLicenseException(403, "添加报警信息失败:查无SN");
}
UserInfoVO user = userMapper.getUserBySn(pmsUseLog.getSn());
int code = Integer.parseInt(reportErrorMsgDTO.getErrorCode());
int type = 0;
if (code == 1) {
type = 5;
} else if (code == 2) {
type = 4;
} else if (code == 3) {
type = 7;
}
Report report = Report.builder().category(0).type(type).sn(pmsUseLog.getSn()).userName(user.getUserName())
.userCompany(user.getCompany()).createTime(new Date()).updateTime(new Date()).build();
reportService.reportToEmail(report, user.getNotify());
boolean res = pmsUseService.reportErrorMsg(reportErrorMsgDTO);
if (!res) {
return BaseResult.failed();
......
package iot.sixiang.license.service.impl;
import iot.sixiang.license.consts.ResultCode;
import iot.sixiang.license.entity.UserPermission;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.mapper.UserPermissionMapper;
import iot.sixiang.license.model.dto.AssignUserPermissionDTO;
import iot.sixiang.license.service.UserPermissionService;
import iot.sixiang.license.util.CommonUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by m33
* Date 2023/1/31 14:21
* Description
*/
@Service
public class UserPermissionServiceImpl implements UserPermissionService {
@Resource
UserPermissionMapper userPermissionMapper;
@Override
public List<UserPermission> getPermissionById(int userId) {
if (userId <= 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
return userPermissionMapper.getPermissionById(userId);
}
@Override
public boolean saveBatch(AssignUserPermissionDTO assignUserPermissionDTO) {
List<Integer> userPermissions = assignUserPermissionDTO.getPermissions();
Integer userId = assignUserPermissionDTO.getUserId();
if (userPermissions.isEmpty() || userId <= 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
List<UserPermission> permissionById = userPermissionMapper.getPermissionById(userId);
// 筛选出已有的权限
List<Integer> originPermissions = permissionById.stream().map(UserPermission::getPermission).collect(Collectors.toList());
// 新增权限处理,找出 userPermissions 中新增的权限并添加到用户权限表中
List<Integer> permissionAddList = CommonUtil.getDiffList(userPermissions, originPermissions);
int res = 0;
if (!permissionAddList.isEmpty()) {
res = userPermissionMapper.saveBatch(permissionAddList, userId);
}
// 删除权限处理,找出 originPermissions 中多出的权限并从用户权限表中删除
List<Integer> permissionDelList = CommonUtil.getDiffList(originPermissions, userPermissions);
if (!permissionDelList.isEmpty()) {
res += userPermissionMapper.delBatch(permissionDelList, userId);
}
return res >= 0;
}
@Override
public void deleteUserPermission(int parseInt) {
userPermissionMapper.deleteUserPermission(parseInt);
}
}
package iot.sixiang.license.service.impl;
import cn.hutool.core.lang.Validator;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import iot.sixiang.license.consts.ResultCode;
import iot.sixiang.license.entity.User;
import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.BaseResult;
import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.dto.UpdateNotifyDTO;
import iot.sixiang.license.model.vo.UserChildIdVO;
import iot.sixiang.license.model.vo.UserVo;
import iot.sixiang.license.service.UserService;
import iot.sixiang.license.util.CommonUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
......@@ -35,12 +40,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
UserMapper userMapper;
@Override
public PageInfoModel<UserVo> getUserList(int pageNo, int pageSize, String userName, String company) {
public PageInfoModel<UserVo> getUserList(int pageNo, int pageSize, String userName, String company, List<Integer> userIds) {
if (pageNo == 0 || pageSize == 0) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
List<UserVo> records = userMapper.getUserList(userName, company);
records = records.stream().sorted(Comparator.comparing(UserVo::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
List<UserVo> records = userMapper.getUserList(userName, company, userIds);
records = records.stream().sorted(Comparator.comparing(UserVo::getCreateTime, Comparator.reverseOrder())).sorted(Comparator.comparing(UserVo::getLevel)).collect(Collectors.toList());
List<UserVo> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize;
if (begin >= 0 && records.size() > 0) {
......@@ -73,19 +78,55 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
}
@Override
public boolean addUser(String userName, String company, String password) {
if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(company) || !CommonUtil.regularMessage(userName)) {
public boolean addUser(String userName, String company, String password, int parent, int level) {
String notify;
if (Validator.isEmail(userName)) {
notify = userName;
} else {
throw new IotLicenseException(403, "请输入正确的邮箱账号");
}
if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(company)) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
User res = userMapper.getUserByUserName(userName);
if (res != null) {
throw new IotLicenseException(403, "用户名已存在");
}
return userMapper.addUser(userName, company, password);
return userMapper.addUser(userName, company, password, notify, parent, level);
}
@Override
public boolean updateUser(User user) {
return userMapper.updateUser(user.getUserId(), user.getPassword());
}
@Override
public BaseResult updateNotify(UpdateNotifyDTO updateNotifyDTO) {
String notify = updateNotifyDTO.getNotify();
String loginUserId = UserUtils.getLoginUserId();
if (StringUtils.isEmpty(notify) || !Validator.isEmail(notify)) {
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
}
if (StringUtils.isEmpty(loginUserId)) {
throw new IotLicenseException(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMsg());
}
int userId = Integer.parseInt(loginUserId);
User user = new User();
user.setNotify(notify);
user.setUpdateTime(new Date());
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUserId, userId);
int res = userMapper.update(user, wrapper);
if (res > 0) {
return BaseResult.success();
} else {
return BaseResult.failed();
}
}
@Override
public List<UserChildIdVO> getChildUser(int userId) {
return userMapper.getChildUser(userId);
}
}
package iot.sixiang.license.util;
import iot.sixiang.license.consts.Constant;
import iot.sixiang.license.entity.UserPermission;
import iot.sixiang.license.model.ResResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -11,16 +12,45 @@ import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Slf4j
public class CommonUtil {
/**
* 获取指定日期前或后几天
*
* @return
*/
public static String getDayByNum(int num, String dateStr) throws ParseException {
//获取指定当前日期的前三天时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(dateStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, num);
date = calendar.getTime();
return format.format(date);
}
/**
* date 转 字符串
*
* @param date
* @param pattern
* @return
*/
public static String dateToString(Date date, String pattern) {
SimpleDateFormat ft = new SimpleDateFormat(pattern);
return ft.format(date);
}
/**
* 验证密码-是否包含用户名字符(密码应与用户名无相关性,密码中不得包含用户名的完整字符串、大小写变位或形似变换的字符串)
*/
......@@ -100,11 +130,6 @@ public class CommonUtil {
return result;
}
public static void main(String[] args) {
boolean b = checkPassword("1234qwe123");
System.out.println(b);
}
/**
* 密码验证
* (至少由8位及以上大写字母、小写字母、数字与特殊符号等4类中3类混合)
......@@ -234,7 +259,7 @@ public class CommonUtil {
}
public static String getServerParentDirectory() {
return new File(new ApplicationHome(Constant.class).getSource().getParentFile().getPath()).getParent() + File.separator + "lib";
return new File(new ApplicationHome(Constant.class).getSource().getParentFile().getPath()) + File.separator + "file";
}
/**
......@@ -271,7 +296,7 @@ public class CommonUtil {
return myName;
}
//身份证前三后四脱敏
// 身份证前三后四脱敏
public static String idCardEncrypt(String idcard) {
if (idcard == null || idcard.length() == 0 || idcard.contains("*")) {
return idcard;
......@@ -279,10 +304,11 @@ public class CommonUtil {
if (StringUtils.isEmpty(idcard) || (idcard.length() < 8)) {
return idcard;
}
String res = StringUtils.overlay(idcard, "**************", 0, 14);
String res = StringUtils.overlay(idcard, "***********", 3, 14);
return res;
}
public static String getCurDateStr() {
Date date = new Date();
String pattern = "yyyy-MM-dd";
......@@ -315,4 +341,62 @@ public class CommonUtil {
}
return "";
}
/**
* 检查是否有某个权限
*
* @param userPermissions
* @param permission
* @return
*/
public static boolean checkPermission(List<UserPermission> userPermissions, int permission) {
boolean res = false;
for (UserPermission userPermission : userPermissions) {
if (userPermission.getPermission() == permission) {
res = true;
break;
}
}
return res;
}
/**
* 差集计算
*
* @param A 集合A
* @param B 集合B
* @return 筛选出【集合A中存在且集合B中不存在】的元素集合
*/
public static <T> List<T> getDiffList(List<T> A, List<T> B) {
if (A == null) {
return Collections.emptyList();
}
if (B == null) {
return A;
}
return A.stream().filter(a -> {
if (a == null) {
return false;
}
return B.stream().noneMatch(b -> b != null && b.equals(a));
}
).collect(Collectors.toList());
}
/**
* UNICODE转字符串
*
* @param unicode
* @return
*/
public static String unicodeToStr(String unicode) {
StringBuilder sb = new StringBuilder();
String[] hex = unicode.split("\\\\u");
for (int i = 1; i < hex.length; i++) {
int index = Integer.parseInt(hex[i], 16);
sb.append((char) index);
}
return sb.toString();
}
}
package iot.sixiang.license.util;
import iot.sixiang.license.model.vo.UserChildIdVO;
import iot.sixiang.license.service.UserService;
import java.util.List;
/**
* Created by m33
* Date 2023/2/1 14:49
* Description
*/
public class TreeUtil {
/**
* 获取所有子账号userId
*
* @param userId
* @param res
* @return
*/
public static List<Integer> getUserChildIds(int userId, List<Integer> res) {
UserService userService = SpringUtil.getBean(UserService.class);
List<UserChildIdVO> userChildIdVOS = userService.getChildUser(userId);
if (userChildIdVOS.isEmpty()) {
return res;
}
for (UserChildIdVO userChildIdVO : userChildIdVOS) {
if (userChildIdVO.getLevel() < 3) {
getUserChildIds(userChildIdVO.getUserId(), res);
}
res.add(userChildIdVO.getUserId());
}
return res;
}
}
......@@ -2,7 +2,7 @@ server:
port: 8868
logging:
level:
root: debug
root: info
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
......
......@@ -32,7 +32,7 @@ server:
cros:
# 需要设置访问白名单
cros_allowed_origins: http://192.168.1.88:8080, http://192.168.1.88:8081, http://localhost:8868, http://localhost:8080, http://192.168.1.54:8080
cros_allowed_origins: http://192.168.1.88:8080, http://192.168.1.88:8081, http://localhost:8868, http://localhost:8080, http://192.168.1.155:8080
cros_allowed_method: GET,POST
other:
......
......@@ -6,16 +6,28 @@
app.app_id, app.app_name, app.app_key, app.create_time, app.update_time, us.user_id,
COUNT(sn) AS deviceCount, us.user_name, us.company
</sql>
<insert id="addApply" parameterType="iot.sixiang.license.entity.Apply">
insert into apply(app_id,app_name, app_key, user_id, create_time, update_time) values (#{appId}, #{appName}, #{appKey}, #{userId}, now(), now())
</insert>
<delete id="deleteByUserId">
delete from `apply` where user_id = #{userId}
</delete>
<select id="getAppList" resultType="iot.sixiang.license.model.vo.AppVo">
SELECT <include refid="AppVoColumn"/>
FROM apply AS app LEFT JOIN device AS de ON app.app_id = de.app_id
LEFT JOIN user AS us ON us.user_id = app.user_id
where 1=1
<if test="null != _parameter and '' != _parameter">
and app_name like concat('%',#{_parameter},'%')
<if test="userChildIds != null">
AND us.user_id IN
<foreach collection="userChildIds" open="(" separator="," close=")" item="userId">
#{userId}
</foreach>
</if>
<if test="null != appName and '' != appName">
and app_name like concat('%',#{appName},'%')
</if>
GROUP BY app.app_id
</select>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.DeviceMapper">
<delete id="deleteByUserId">
delete device from device,apply,`user` WHERE device.app_id = apply.app_id
and user.user_id = apply.user_id and user.user_id = #{userId}
</delete>
<select id="getDeviceList" resultType="iot.sixiang.license.model.vo.DeviceVo">
SELECT de.device_id, de.app_id, app_name,user_name,sn,sn_bind,de.status,de.create_time,de.update_time,de.device_id IN (select
......@@ -8,6 +12,12 @@
JOIN apply AS app ON de.app_id = app.app_id
JOIN `user` AS us ON us.user_id = app.user_id
where 1=1
<if test="userChildIds != null">
AND us.user_id IN
<foreach collection="userChildIds" open="(" separator="," close=")" item="userId">
#{userId}
</foreach>
</if>
<if test="null != appName and '' != appName">
and app_name like concat('%',#{appName},'%')
</if>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.PermissionMapper">
</mapper>
\ No newline at end of file
......@@ -2,18 +2,33 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.PmsUseLogMapper">
<select id="getPmsUseLogList" resultType="iot.sixiang.license.entity.PmsUseLog">
SELECT * FROM pms_use_log
SELECT * FROM `pms_use_log`
INNER JOIN device ON device.sn = pms_use_log.sn
INNER JOIN apply ON device.app_id = apply.app_id
INNER JOIN `user` ON `user`.user_id = apply.user_id
where 1=1
<if test="userChildIds != null">
AND user.user_id IN
<foreach collection="userChildIds" open="(" separator="," close=")" item="userId">
#{userId}
</foreach>
</if>
<if test="startTime != null and startTime != ''">
AND pms_use_log.create_time &gt; #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND pms_use_log.create_time &lt; #{endTime}
</if>
<if test="null != sn and '' != sn">
and sn like concat('%',#{sn},'%')
and pms_use_log.sn like concat('%',#{sn},'%')
</if>
<if test="null != status and status == 0">
and status = #{status}
and pms_use_log.status = #{status}
</if>
<if test="null != status and status == 1">
and (status = #{status} or status is null)
and (pms_use_log.status = #{status} or pms_use_log.status is null)
</if>
and deleted = 0
order by create_time desc
and pms_use_log.deleted = 0
order by pms_use_log.create_time desc
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.ReportMapper">
<select id="getReportList" resultType="iot.sixiang.license.model.vo.ReportVO">
SELECT
report.*,
report_type.description
FROM
`report`
LEFT JOIN `user` ON user.user_name = report.user_name
LEFT JOIN report_type ON report.type = report_type.id
where 1=1
<if test="userChildIds != null">
AND user.user_id IN
<foreach collection="userChildIds" open="(" separator="," close=")" item="userId">
#{userId}
</foreach>
</if>
<if test="null != type">
AND report.type = #{type}
</if>
<if test="null != sn and '' != sn">
AND report.sn like concat('%',#{sn},'%')
</if>
<if test="startTime != null and startTime != ''">
AND report.create_time &gt; #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND report.create_time &lt; #{endTime}
</if>
AND report.deleted = 0
AND report_type.deleted = 0
ORDER BY report.create_time DESC
</select>
</mapper>
......@@ -6,6 +6,14 @@
</insert>
<select id="getOperLogList" resultType="iot.sixiang.license.model.vo.SysOperLogVo">
select id, title, business_type, uri, status, error_msg, oper_time from sys_oper_log order by oper_time desc
select id, title, business_type, uri, status, error_msg, oper_time from sys_oper_log
where 1=1
<if test="startTime != null and startTime != ''">
AND oper_time &gt; #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND oper_time &lt; #{endTime}
</if>
order by oper_time desc
</select>
</mapper>
......@@ -3,7 +3,7 @@
<mapper namespace="iot.sixiang.license.mapper.UserMapper">
<insert id="addUser" parameterType="iot.sixiang.license.entity.User">
insert into user(user_name, company, password,create_time, update_time) values (#{userName},#{company}, #{password}, now(), now())
insert into user(user_name, company, password, notify, parent, `level`, create_time, update_time) values (#{userName},#{company}, #{password}, #{notify, jdbcType=VARCHAR}, #{parent}, #{level}, now(), now())
</insert>
<delete id="deleteUser" parameterType="iot.sixiang.license.entity.User">
......@@ -15,15 +15,22 @@
</update>
<select id="getUserList" resultType="iot.sixiang.license.model.vo.UserVo">
SELECT user.user_id, user_name, password, company, user.create_time, user.update_time,
COUNT(device.`device_id`) totalDevice,
COUNT(if(device.device_id is NOT NULL, if (device.`status` = 0 or device.`status` is NULL, 1, NULL), NULL)) unUseDevice,
COUNT(if(device.device_id is NOT NULL and device.`status` = 1, 1, NULL)) inUseDevice,
COUNT(if(device.device_id is NOT NULL and device.`status` = 2, 1, NULL)) failedDevice
FROM USER
LEFT JOIN apply ON user.user_id = apply.user_id
LEFT JOIN device ON apply.app_id = device.app_id
SELECT user.user_id, user_name, password, company, user.level, user.create_time, user.update_time,
COUNT(device.`device_id`) totalDevice,
COUNT(if(device.device_id is NOT NULL, if (device.`status` = 0 or device.`status` is NULL, 1, NULL), NULL))
unUseDevice,
COUNT(if(device.device_id is NOT NULL and device.`status` = 1, 1, NULL)) inUseDevice,
COUNT(if(device.device_id is NOT NULL and device.`status` = 2, 1, NULL)) failedDevice
FROM USER
LEFT JOIN apply ON user.user_id = apply.user_id
LEFT JOIN device ON apply.app_id = device.app_id
where 1=1
<if test="userIds != null">
and user.user_id in
<foreach collection="userIds" open="(" separator="," close=")" item="userId">
#{userId}
</foreach>
</if>
<if test="null != userName and '' != userName">
and user_name like concat('%',#{userName},'%')
</if>
......@@ -34,11 +41,26 @@
</select>
<select id="getUserByUserName" resultType="iot.sixiang.license.entity.User">
select * from user where user_name = #{userName}
select * from user where user_name = #{userName} limit 1
</select>
<select id="getUserById" resultType="iot.sixiang.license.entity.User">
select * from user where user_id = #{userId}
select * from user where user_id = #{userId} limit 1
</select>
<select id="getChildUser" resultType="iot.sixiang.license.model.vo.UserChildIdVO">
select user_id, parent, `level` from `user` where parent = #{userId}
</select>
<select id="getUserBySn" resultType="iot.sixiang.license.model.vo.UserInfoVO">
SELECT `user`.user_name, `user`.company, `user`.notify FROM user
INNER JOIN apply on user.user_id = apply.user_id
INNER JOIN device on device.app_id = apply.app_id
WHERE device.sn = #{sn}
</select>
<select id="getRootAccount" resultType="iot.sixiang.license.model.vo.UserInfoVO">
SELECT user_name, company, notify FROM `user` WHERE parent IS NULL AND `level` = 1 LIMIT 1
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.UserPermissionMapper">
<insert id="saveBatch">
insert into user_permission(permission, user, create_time) values
<foreach collection="userPermissions" separator="," item="permission">
(#{permission}, #{userId}, now())
</foreach>
</insert>
<delete id="deleteUserPermission">
delete from user_permission where user = #{userId}
</delete>
<delete id="delBatch">
delete from user_permission where user = #{userId} and permission in
<foreach collection="permissionDelList" open="(" separator="," close=")" item="permission">
#{permission}
</foreach>
</delete>
<select id="getPermissionById" resultType="iot.sixiang.license.entity.UserPermission">
SELECT * FROM `user_permission` WHERE user = #{userId} and deleted = 0
</select>
</mapper>
\ No newline at end of file
package iot.sixiang.license;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
/**
* Created by M=54G
* Date 9/14/22 3:08 PM
* Description
*/
@SpringBootTest
@ActiveProfiles({"test-acc"})
@Slf4j
public class BaseTest {
protected void log(Object object) {
log.info(JSON.toJSONString(object));
}
}
\ No newline at end of file
package iot.sixiang.license.object.data;
import lombok.Data;
/**
* Created by M=54G
* Date 11/11/22 10:08 AM
* Description
*/
@Data
public class AuthData {
private String app_id;
private String sn;
private String sign;
}
\ No newline at end of file
package iot.sixiang.license.service;
import iot.sixiang.license.BaseTest;
import iot.sixiang.license.model.dto.ReportErrorMsgDTO;
import org.junit.jupiter.api.Test;
import javax.annotation.Resource;
/**
* Created by M=54G
* Date 11/23/22 3:39 PM
* Description
*/
public class PmsUseServiceTest extends BaseTest {
@Resource
private PmsUseService pmsUseService;
@Test
void addLog() {
log(pmsUseService.createUseLog("abcd"));
}
@Test
void updateLog() {
ReportErrorMsgDTO reportErrorMsgDTO = new ReportErrorMsgDTO();
reportErrorMsgDTO.setId(1);
pmsUseService.success(reportErrorMsgDTO);
}
}
\ No newline at end of file
package iot.sixiang.license.util;
import org.apache.http.util.TextUtils;
public class ByteHelper {
/**
* src:源数组
* srcPos:源数组要复制的起始位置
* dest:目的数组
* destPos:目的数组放置的起始位置
* length:要复制的长度
*
* @param src
* @param begin
* @param count
* @return
*/
public static byte[] subBytes(byte[] src, int begin, int count) {
byte[] bs = new byte[count];
System.arraycopy(src, begin, bs, 0, count);
return bs;
}
/**
* 字节码转化十六进制
*
* @author xzb
*/
public static String fromBytesToHex(byte[] resultBytes) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < resultBytes.length; i++) {
if (Integer.toHexString(0xFF & resultBytes[i]).length() == 1) {
builder.append("0").append(Integer.toHexString(0xFF & resultBytes[i]));
} else {
builder.append(Integer.toHexString(0xFF & resultBytes[i]));
}
}
return builder.toString();
}
/**
* byte[] 转为16进制String
*/
public static String Bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
/**
* 转化十六进制编码为字符串
*
* @param s
* @return
*/
public static String toStringHex(String s) {
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "utf-8");//UTF-16le:Not
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
/***
* 合并数组
* @param byteList
* @return
*/
public static byte[] byteMerger(byte[]... byteList) {
int lengthByte = 0;
for (int i = 0; i < byteList.length; i++) {
lengthByte += byteList[i].length;
}
byte[] allByte = new byte[lengthByte];
int countLength = 0;
for (int i = 0; i < byteList.length; i++) {
byte[] b = byteList[i];
System.arraycopy(b, 0, allByte, countLength, b.length);
countLength += b.length;
}
return allByte;
}
/**
* 字符串转16进制
*
* @param string
* @return
*/
public static String stringToHexString(String string) {
char[] c = new char[string.length()];
c = string.toCharArray();
String hesStr = "";
for (int i = 0; i < c.length; i++) {
hesStr = hesStr + Integer.toHexString(c[i]);
}
return hesStr;
}
/**
* 字符串转化成为16进制字符串
*
* @param s
* @return
*/
public static String strTo16(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
return str;
}
/**
* hex字符串转byte数组
*
* @param inHex 待转换的Hex字符串
* @return 转换后的byte数组结果
*/
public static byte[] hexToByteArray(String inHex, int len) {
int hexlen = inHex.length();
byte[] result;
if (hexlen % 2 == 1) {
//奇数
hexlen++;
result = new byte[(hexlen / 2)];
inHex = "0" + inHex;
} else {
//偶数
result = new byte[(hexlen / 2)];
}
int j = 0;
for (int i = 0; i < hexlen; i += 2) {
result[j] = hexToByte(inHex.substring(i, i + 2));
j++;
}
return result;
}
public static long bytes2long(byte[] bs) throws Exception {
int bytes = bs.length;
if (bytes > 1) {
if ((bytes % 2) != 0 || bytes > 8) {
throw new Exception("not support");
}
}
switch (bytes) {
case 0:
return 0;
case 1:
return (long) ((bs[0] & 0xff));
case 2:
return (long) ((bs[0] & 0xff) << 8 | (bs[1] & 0xff));
case 4:
return (long) ((bs[0] & 0xffL) << 24 | (bs[1] & 0xffL) << 16 | (bs[2] & 0xffL) << 8 | (bs[3] & 0xffL));
case 8:
return (long) ((bs[0] & 0xffL) << 56 | (bs[1] & 0xffL) << 48 | (bs[2] & 0xffL) << 40 | (bs[3] & 0xffL) << 32 |
(bs[4] & 0xffL) << 24 | (bs[5] & 0xffL) << 16 | (bs[6] & 0xffL) << 8 | (bs[7] & 0xffL));
default:
throw new Exception("not support");
}
//return 0;
}
public static long bytes2long(byte[] bs, int offset) {
return (long) ((bs[7 + offset] & 0xffL) << 56 | (bs[6 + offset] & 0xffL) << 48 | (bs[5 + offset] & 0xffL) << 40 | (bs[4 + offset] & 0xffL) << 32 |
(bs[3 + offset] & 0xffL) << 24 | (bs[2 + offset] & 0xffL) << 16 | (bs[1 + offset] & 0xffL) << 8 | (bs[0 + offset] & 0xffL));
}
public static byte[] hexStrToBytes(String hexStr, int len) {
if (TextUtils.isEmpty(hexStr) || hexStr.length() == 0) {
return null;
}
if (hexStr.length() % 2 == 1) {
hexStr = "0" + hexStr;
}
byte[] result = new byte[len];
char[] chars = hexStr.toCharArray();
int hexlen = hexStr.length();
if (hexlen > len)
hexlen = len;
for (int i = 0; i < hexlen - 1; i++) {
result[i] = (byte) (charToByte(chars[i]) << 4 | charToByte(chars[i + 1]));
}
return result;
}
private static byte charToByte(char c) {
String chars = "0123456789ABCDEF";
byte b = (byte) chars.indexOf(c);
return b;
}
/**
* Hex字符串转byte
*
* @param inHex 待转换的Hex字符串
* @return 转换后的byte
*/
public static byte hexToByte(String inHex) {
return (byte) Integer.parseInt(inHex, 16);
}
}
package iot.sixiang.license.util;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
/**
* Title: HmacShaUtils
* Description:
*
* @author YFW
* @version V1.0
* @date 2022-03-14
*/
public class HmacShaUtils {
private static final String HMAC_ALGORITHM = "hmacsha1";
private static final String secretKey = "90d2fca50ea8ed5472c5776c9fc53699";
/**
* 使用HMAC_ALGORITHM加密。
*
* @param content,明文。
* @param secret,密钥。
* @return 密文。
*/
public static String encrypt(String content, String secret) {
if (PubUtils.isNull(secret)) secret = secretKey;
try {
byte[] text = content.getBytes(StandardCharsets.UTF_8);
byte[] key = secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKey = new SecretKeySpec(key, HMAC_ALGORITHM);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return byte2hex(mac.doFinal(text));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 二进制转十六进制字符串。
*
* @param b,二进制数组。
* @return 十六进制字符串。
*/
public static String byte2hex(byte[] b) {
StringBuffer sb = new StringBuffer();
for (int n = 0; b != null && n < b.length; n++) {
String stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
sb.append('0');
}
sb.append(stmp);
}
return sb.toString().toUpperCase();
}
}
package iot.sixiang.license.util;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.Collection;
import java.util.UUID;
/**
* Title: PubUtils
* Description: 公共实体类
*
* @author YFW
* @version V1.0
* @date 2020-07-28
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PubUtils {
/**
* The constant STRING_NULL.
*/
private final static String STRING_NULL = "-";
/**
* 匹配手机号码, 支持+86和86开头
*/
private static final String REGX_MOBILENUM = "^((\\+86)|(86))?(13|15|17|18)\\d{9}$";
/**
* 匹配手机号码, 支持+86和86开头
*/
private static final String REGX_MOBILENUM_NEW = "^((\\+86)|(86))?(1)\\d{10}$";
/**
* 匹配邮箱帐号
*/
private static final String REGX_EMAIL = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
/**
* 匹配设备标签,支持字母、数字、汉字和英文逗号,但不能以英文逗号结尾
*/
private static final String REGX_TAGS = "[a-zA-Z0-9,\\u4E00-\\u9FA5]*[^,]";
/**
* 匹配手机号码(先支持13, 15, 17, 18开头的手机号码).
*
* @param inputStr the input str
*
* @return the boolean
*/
public static Boolean isMobileNumber(String inputStr) {
return !PubUtils.isNull(inputStr) && inputStr.matches(REGX_MOBILENUM);
}
public static Boolean isMobileNumberNew(String inputStr) {
return !PubUtils.isNull(inputStr) && inputStr.matches(REGX_MOBILENUM_NEW);
}
/**
* 判断一个或多个对象是否为空
*
* @param values 可变参数, 要判断的一个或多个对象
*
* @return 只有要判断的一个对象都为空则返回true, 否则返回false boolean
*/
public static boolean isNull(Object... values) {
if (!PubUtils.isNotNullAndNotEmpty(values)) {
return true;
}
for (Object value : values) {
boolean flag;
if (value instanceof Object[]) {
flag = !isNotNullAndNotEmpty((Object[]) value);
} else if (value instanceof Collection<?>) {
flag = !isNotNullAndNotEmpty((Collection<?>) value);
} else if (value instanceof String) {
flag = isOEmptyOrNull(value);
} else {
flag = (null == value);
}
if (flag) {
return true;
}
}
return false;
}
/**
* Is o empty or null boolean.
*
* @param o the o
*
* @return boolean boolean
*/
private static boolean isOEmptyOrNull(Object o) {
return o == null || isSEmptyOrNull(o.toString());
}
/**
* Is s empty or null boolean.
*
* @param s the s
*
* @return boolean boolean
*/
private static boolean isSEmptyOrNull(String s) {
return trimAndNullAsEmpty(s).length() <= 0;
}
/**
* Trim and null as empty string.
*
* @param s the s
*
* @return java.lang.String string
*/
private static String trimAndNullAsEmpty(String s) {
if (s != null && !s.trim().equals(STRING_NULL)) {
return s.trim();
} else {
return "";
}
// return s == null ? "" : s.trim();
}
/**
* 判断对象数组是否为空并且数量大于0
*
* @param value the value
*
* @return boolean
*/
private static Boolean isNotNullAndNotEmpty(Object[] value) {
boolean bl = false;
if (null != value && 0 < value.length) {
bl = true;
}
return bl;
}
/**
* 判断对象集合(List,Set)是否为空并且数量大于0
*
* @param value the value
*
* @return boolean
*/
private static Boolean isNotNullAndNotEmpty(Collection<?> value) {
boolean bl = false;
if (null != value && !value.isEmpty()) {
bl = true;
}
return bl;
}
/**
* Is email boolean.
*
* @param str the str
*
* @return the boolean
*/
public static boolean isEmail(String str) {
boolean bl = true;
if (isSEmptyOrNull(str) || !str.matches(REGX_EMAIL)) {
bl = false;
}
return bl;
}
/**
* Is tags boolean.
*
* @param str the str
*
* @return the boolean
*/
public static boolean isTags(String str) {
boolean bl = true;
if (isSEmptyOrNull(str) || !str.matches(REGX_TAGS)) {
bl = false;
}
return bl;
}
/**
* Uuid string.
*
* @return the string
*/
public synchronized static String uuid() {
return UUID.randomUUID().toString().replace("-", "");
}
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment