Merge remote-tracking branch 'origin/master' into master

# Conflicts:
#	dvadmin-backend/apps/vadmin/system/urls.py
#	dvadmin-backend/apps/vadmin/system/views.py
pull/2/head
qianzhengkai 2021-03-23 14:51:37 +08:00
commit a80c52136b
239 changed files with 9057 additions and 2135 deletions

1
.gitignore vendored
View File

@ -19,3 +19,4 @@ bin-release/
docker_env/mysql/data/
docker_env/redis/data/
*/.idea
dvadmin-doc/docs/.vuepress/dist

View File

@ -31,20 +31,24 @@ github地址[https://github.com/liqianglog/django-vue-admin](https://github.c
## 内置功能
##### 预计3月底发布v1.0正式版本,个别功能开发中 [版本功能说明](https://gitee.com/liqianglog/django-vue-admin/wikis/releaseNote?sort_id=3615540)
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识、后端接口权限等。
5. 角色管理:角色菜单权限分配、数据权限分配、设置角色按机构进行数据范围权限划分。
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7. 参数管理:对系统动态配置常用参数。
8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
9. 登录日志:系统登录日志记录查询包含登录异常。
10. 在线用户:当前系统中活跃用户状态监控。
11. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
12. ~~代码生成:前后端代码的生成。~~
13. ~~服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。~~
14. ~~在线构建器拖动表单元素生成相应的HTML代码。~~
8. 文件管理:管理所有上传的和导出的文件。
9. 通知公告:发布通知公告给所有人,进行消息的通知。
10. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
11. 登录日志:系统登录日志记录查询包含登录异常。
12. 在线用户:当前系统中活跃用户状态监控、用户强退功能。
13. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
14. 用户注册:新用户注册页面。
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈、celery 当前状态等相关信息。
16. 在线构建器拖动表单元素生成相应的HTML代码。
## 在线体验
@ -98,7 +102,7 @@ npm run build:prod
python3 manage.py makemigrations
python3 manage.py migrate
5. 初始化数据
python3 manage.py initialization
python3 manage.py init
6. 启动项目
python3 manage.py runserver 0.0.0.0:8000

View File

@ -6,6 +6,43 @@
version: "3"
services:
dvadmin-ui:
container_name: dvadmin-ui
build:
context: ./
dockerfile: ./docker_env/vue-ui/Dockerfile
environment:
TZ: Asia/Shanghai
volumes:
- "./dvadmin-ui:/dvadmin-ui"
command:
- /bin/bash
- -c
- |
cd /dvadmin-ui
npm install --registry=https://registry.npm.taobao.org
rm -rf /dvadmin-ui/dist
npm run build:prod
dvadmin-doc:
container_name: dvadmin-doc
build:
context: ./
dockerfile: ./docker_env/vue-doc/Dockerfile
environment:
TZ: Asia/Shanghai
volumes:
- "./dvadmin-doc:/dvadmin-doc"
command:
- /bin/bash
- -c
- |
cd /dvadmin-doc
npm install --registry=https://registry.npm.taobao.org
rm -rf /dvadmin-doc/dist
npm run docs:build
dvadmin-redis:
image: redis:latest

110
docker_env/nginx/keys/api.django-vue-admin.com.crt Executable file → Normal file
View File

@ -1,59 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIFiTCCBHGgAwIBAgIQCSthZmB3qh7J8+SexO9NvzANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMjEwMzA2MDAwMDAwWhcNMjIwMzA2MjM1OTU5WjAj
MSEwHwYDVQQDExhhcGkuZGphbmdvLXZ1ZS1hZG1pbi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDjV1vx/gUbM4FAS0jL+8EomI8l71vooU1NOaHp
oAeEOFEaVOLwmB7ObPWhsl4bb2z+pA6081360bzu4d46ZsRV45IY5YafMLaSF+Fn
sKZHc1db18yp60GSITJoEIrqDV+cmwaBlcdgvOi0MzcHpoAv5yJrarwYj2sruNfb
+Whu6yPGY+ZEmJVKPcOxS67ckkBFyf0yfBci+0sYh1cTNxGx/oISnu8b290d2G0H
cIIB8GmpZBcrQtvHXq59jTwhL0soX3s4ZsMIQZlHVnUVYfEGyl90i3pt9WGraDcI
H3C1l4nG5+u7XsiBtPAhdLHUIp6+KAcXX+OeSP5Xv+Cn2IN7AgMBAAGjggJsMIIC
aDAfBgNVHSMEGDAWgBRVdE+yck/1YLpQ0dfmUVyaAYca1zAdBgNVHQ4EFgQU5DlU
Ojy2nTlzZ4fxjtbaHX+IoLkwIwYDVR0RBBwwGoIYYXBpLmRqYW5nby12dWUtYWRt
aW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
BQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEFBQcCARYbaHR0cDov
L3d3dy5kaWdpY2VydC5jb20vQ1BTMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUH
MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDov
L2NhY2VydHMuZGlnaWNlcnQuY29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFND
QS1HMS5jcnQwCQYDVR0TBAIwADCCAQIGCisGAQQB1nkCBAIEgfMEgfAA7gB1ACl5
vvCeOTkh8FZzn2Old+W+V32cYAr4+U1dJlwlXceEAAABeAh+/14AAAQDAEYwRAIg
YaqOZibfJ+3YCZ0J2J+nOKAcDcOnGLLLBG7DkU+T+EgCIEmuNiy7gZRDUBHQxCht
329qSdpzeGnKUNczDUzxtxe+AHUAIkVFB1lVJFaWP6Ev8fdthuAjJmOtwEt/XcaD
XG7iDwIAAAF4CH7/QwAABAMARjBEAiB9i6rk7/0JQ3WB2Cktkt8UHbs2SSTQKcbY
71Pjr2gHNAIgLZbdCE34ldSfcH9ZQzer8T6bGNNZ5ARDA8Cjyh5ABM8wDQYJKoZI
hvcNAQELBQADggEBAG2T1E+mZTcRge0ivp1mTLdhy2qKd4tw8WosFCU7wv8U6D8f
DQV4OBOj/n0jXArAUHCcUhNNkxuwT1n9H1AOxVqrIqqUASIyqwCRukQudXBVI7rG
bCSdjP8bmlFodBqpfbXnccwgzTzB4DGJrV44NGD0lJEUE/890EP+1Ay++y8k71jw
Ns9dMdA+GKTmj6YxCI0BJnldpKN8dxNN/XGdAPJaf8u3zHgUN/CXLNbnwQTUWlSv
1qeFNBMMeUypWtpy4V9jJrqzvKKQQv8vbZgmZBIGhjq72fBK3DR2OofWjYT/ckIz
tGbJfoef3qjhNeTxty+S5WoVwtHPr+3MUmk3j7o=
MIIFoTCCBImgAwIBAgIQA4TN09XlucVnL4BLCuvHijANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMwMzAwMDAwMFoXDTIyMDMwMjIzNTk1
OVowIzEhMB8GA1UEAxMYYXBpLmRqYW5nby12dWUtYWRtaW4uY29tMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5QSBTQbToLUu4wCYy/BNoinqFkXiTZE
aV6/5PJIeNsz75fnAEuBpIATEHqRsY6L9HdYAvBiAEv6ufCZhzwWF7ph1ZMhg6ul
foaQwoVCkbKi/zgwi3tvteda5vXQs4e8GvgZ6zkabQ4cZFjVpb3dA6huBbs20jLf
YYXsXWsJEGF3JK5okQ08+u/h/q0lFDFa70S9hpQXMtSfCCW/AuEc/+tG7rnUul1o
MXjpVnDOmg+CZfIYgi9D30/zd1DYFJOEwawl5FKLFQY7TOn3RlZ3SR4mNbbhIgHP
L9S1xHGcm8UC7PKuOgh8+5Nl0aeeUB1liuzM/w5JbF4L4FoZW6ciNQIDAQABo4IC
gDCCAnwwHwYDVR0jBBgwFoAUf9OZ86BHDjEAVlYijrfMnt3KAYowHQYDVR0OBBYE
FHvXBhsuPta7SwvCVVgv9e/bZ9AeMCMGA1UdEQQcMBqCGGFwaS5kamFuZ28tdnVl
LWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0
dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYIKwYBBQUHAQEEgYUwgYIwNAYI
KwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0YWxjZXJ0dmFsaWRhdGlvbi5j
b20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRzLmRpZ2l0YWxjZXJ0dmFsaWRh
dGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0MAkGA1UdEwQCMAAwggEEBgor
BgEEAdZ5AgQCBIH1BIHyAPAAdgApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZc
JV3HhAAAAXf48Te1AAAEAwBHMEUCIDjqPKTNX4EcFxayaLirTT1y98X9X1HP97bM
IV0HpJmYAiEAjMdYYUqFuHLkSl4/bq5F/FPtt25AbKGhyolIVDWvsNoAdgAiRUUH
WVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXf48TgFAAAEAwBHMEUCIBQM
bXvVtAOXQfBjp+7HzsyWH51BZ2vyH1VyLpuGSs7dAiEAiyt4h7P7oRheoZKmn8wp
CptaYocY509Dr8aFbCicWWAwDQYJKoZIhvcNAQELBQADggEBAJG3Ne57IlaucGjH
y6j/zJsRnCsIrVNoPUROma+2FD7SauHT6U7iDLtNT5BIrBmDcEnYdqMAjJQoRJC1
VvXSkABEngUajpdpB0m8k9UVB5W+6Extt8TYyRLu1/Xpq0JHiOg+rPYK3UljYybG
2V9KWNhYd2G5yg0+1ZzvaC3zEFIfQJpuESio6hEbilT6FLeVC8TabL0/2tqE12n/
uWYU3Pr9AokD0OQkzN4BUswwIpYBfAXa6HLvj+V6tLOthxY0PLuOm7WiwU2MP0bz
dq6LIFu0z8fkwBkkqXXtgSfCigqvRhybaKKF0FT4cdJUb0cfMhUshlzWpJ5EEskO
46xDUok=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
-----END CERTIFICATE-----
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----

52
docker_env/nginx/keys/api.django-vue-admin.com.key Executable file → Normal file
View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA41db8f4FGzOBQEtIy/vBKJiPJe9b6KFNTTmh6aAHhDhRGlTi
8Jgezmz1obJeG29s/qQOtPNd+tG87uHeOmbEVeOSGOWGnzC2khfhZ7CmR3NXW9fM
qetBkiEyaBCK6g1fnJsGgZXHYLzotDM3B6aAL+cia2q8GI9rK7jX2/lobusjxmPm
RJiVSj3DsUuu3JJARcn9MnwXIvtLGIdXEzcRsf6CEp7vG9vdHdhtB3CCAfBpqWQX
K0Lbx16ufY08IS9LKF97OGbDCEGZR1Z1FWHxBspfdIt6bfVhq2g3CB9wtZeJxufr
u17IgbTwIXSx1CKevigHF1/jnkj+V7/gp9iDewIDAQABAoIBAFH6kAjQ2WWIKp0V
KMCJ3Yr2jHQY/rMB636kACtfTiaTKkfNAXLR4BX++4pd6AqLoSmn3jfJJIQMOs2H
fFvh7/2qzOWWavefmM5QtzLtY+CTCpbvV/mUAHah6uvUv0sMHIS78FotORK8vEsy
xq7HDyV2+xXyDLbsjLBc/NXxd4O7L9i6+6VrFFX4efowedLdudWG2GXyrq/6xT6E
0G1aDI1ViYoCYiP/Rm1ET8qVhtHBiQ2rHIYsTdUhkMubT29AvDBaxyi+syyeXmLu
W/ZafdP37hm2f0DQXmlRr7Wr0Cni8oOSFAZj7IFhxuWKCaMVPxTeAUSJfFqiUN2X
cm9Tv7kCgYEA/gOAt3zrMezkqSWr+S5m5/i8ClBJvZJ6Yp/tMg6AR+W0GH94hFZC
u/dtFPI7nPNHTp19YNq2/TTfA81PmQMOVvQbg9eH2016XY+x0Z6i1vKdMEqddkcW
36hslgmY3cyXDL0WzZgX2aCl8uy8XViHkMaf1RPL10hqdXXcNoOOSPkCgYEA5R52
T8bn3spBSfaKooTwrHj2Varxxo9KbypJo0OzOFF5zPwJdypj9BCI9ajVnkIVjsSv
snBdB4qoM/IYluXc2E801Ub+SbY+jx6HJemTy/zKqr1nJABlZcp1KgyQfMhUa4cA
iqMJX3ggR7xdph73kW3s4eKeGLc5kkUQMQUpIRMCgYAVWS4EPdd2hrZhEO13L9Mu
Q9Vp+H16FUl76H0C6/0UDdYpCO2UEbviGFVuoT0pX7jqfon/DeK7PSpRI3xBG+Sk
ojd9ySt93vEd0+nZ+D8vWYykdmDtg+QEQB+ALKZQXdWEGJBGDzZR8BKCbCsYnUwn
esoMGnHTUh7AaHttiXj34QKBgQCu4bR+qhz74bc55FPnPr+RdfbYZtWKsH6pIUb5
tkgKua3Vd58l9RY8CY7wq4D5/gkEYz6UXc20XvKKS8TXEPajqLlz/W9FBjTz+uI/
Xu0v63EqJ82dHixHKOSLRvHWPPaq6G3SZCVYWJGTD8UPcl2XBKelttrjlJ799Xcp
Y34EPwKBgQDrPDgphCWQos/62qQ2NW0qpxphItlCM/w/j0s8Ff2qT82NKIM3Nr7U
Ol9Fm0m4FepvryunWiAF+pD7m+SDAI1abm3MN7QB653w+2zu9B8mY0jU+uFjGCUQ
5uFXsTgbnAYev5V9fCKGRPwHXEIJsidg1jOpc5pGnOvvlTZ+uno6Gg==
-----END RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAu5QSBTQbToLUu4wCYy/BNoinqFkXiTZEaV6/5PJIeNsz75fn
AEuBpIATEHqRsY6L9HdYAvBiAEv6ufCZhzwWF7ph1ZMhg6ulfoaQwoVCkbKi/zgw
i3tvteda5vXQs4e8GvgZ6zkabQ4cZFjVpb3dA6huBbs20jLfYYXsXWsJEGF3JK5o
kQ08+u/h/q0lFDFa70S9hpQXMtSfCCW/AuEc/+tG7rnUul1oMXjpVnDOmg+CZfIY
gi9D30/zd1DYFJOEwawl5FKLFQY7TOn3RlZ3SR4mNbbhIgHPL9S1xHGcm8UC7PKu
Ogh8+5Nl0aeeUB1liuzM/w5JbF4L4FoZW6ciNQIDAQABAoIBAAEnd9Xq3GknAm6V
/bTFCDQQ8rElPTEVsaWRVO5wdDQ0KxVkEqKMlGNh+1wMWQWl6iQKsPKxrnSwgv4u
Zg9wNfWW6r+w7FGeVoIZC157Ce4SEpEt9BSDoawVnJhTtmFIakajNKufGhPGNLQE
XOosaSX63RRxcrSn5fp4Y7wuaqucXzPV3MuRABrDTHugW1O37570HLwvY9Hmf2+N
WIqEasCjeZ575EwTcqqVwB/j3BNqyrbkxP6aFszxYdMvlK/mpPhrShV6+QmuP02j
OvRt9HM8knUVzsGJzuDk5V5VUGejih3VZO1BuqP1LFb1j4siWBoKpVQrP0wSJzaa
5Vru/wECgYEA9SygrrkPESbjSLYIJU4mRmC4zSqbUoWpvTgpK29nNmif7BSJ9bRr
2QSCIho58a0bl3a7GLwY0dnEyDYKF9nTQ8HqlkvwRwxdMql+0hU0o5hOBnljYoyM
BBptFvoihCe2se+1FEQkunAFCDph00S5utz+8uTlHSFiSy/fQ4GOZwECgYEAw9xl
kZOPSGNEd69F9gtkOAT0kWuazvePSoeYNldZ/MZyE0zE4Wyh5Dk8y5cBt3Pw0ZTr
NN1dc24EkjcFIBop4Me5n5zKr4rH1XKsUQ2jaTurp/fVQwGo820n+ChO8cIEobHY
p6wmKopnnDKOATMjZd8hg+Gck7qWoeTxk3XizzUCgYAFGGJWfz4S6y36Ct5seA1P
lR8CFIqZ0nFOn2YrousQNGhubZbYZmF/ZxqVPtpJbYGPSkZlIzOY2N/AEW9wQ3Si
idsoOHfL4jPlo6QhFZO8eqPUep1YJPeb9jiiK5ygBntDg2nN/ASPY1iXbS8vRtRd
T850mdExI8p5KYuISZ7+AQKBgHF/ENhoErqW04ErbzYh6cRQksyF92KBsGY25uxu
d/XzpP0sGlaq1bFjvagYbGU7aUx5qEatFE8kbL+x5GVy49uewSEOAaHxoNU+qz4Y
0h3T9yfRhKJcnuPY2DWEXiLYFEkCvxKCvmceZuXrocBuOs/4mfpLTamJkWplOdwC
jxkVAoGBALU/996M9frxtjvzQdF3ncbKrDcptZN6s1hIBVk1t2PzcT0XgiOUZRqj
jvUqZWg7MV6kovdjg7N2KSE0u9p2nysL4ejvZRKMNNBdaFJvOUcaYCMTHok1KfXp
Bq75mMgfFLrY+huWzKdRWkEjqD6A05Us48iuikW5Ec32sI6mUzg9
-----END RSA PRIVATE KEY-----

View File

@ -1,59 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIFlzCCBH+gAwIBAgIQDXgUgr0IFkhSkGrfB3BoCzANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMjEwMzA2MDAwMDAwWhcNMjIwMzA2MjM1OTU5WjAp
MScwJQYDVQQDEx5kYWlseS5hcGkuZGphbmdvLXZ1ZS1hZG1pbi5jb20wggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIoHO8FAq7byt+gDDP2/QjOm/8YSFO
s+AC0iyhMLx6NDRh9cIJE4U/VVpUrbXKspgO2lVN9c3Z28EhimgTj8wLl4uBXAHg
mYS6KZSY1qewN6zagijo0uhI6qSuc+Qr4hZkTrVHhhdIM7G7z7+nMDovLcfZheyT
+0emMhqrO5Oroq/+Ym0jbqBY7tLp7ODxdiG7ONNkIgR/t0cK1P5j16h97LUTHvJS
QbXd9JpGROWQArwB7bthyW+BjOc8y/z5jyiE0wrrzcDoc707T2855VzeYnoJ/1t/
zNdTpJ/VtM6jk5NjqlqHZE7IPNUPdRQ3ysftVAgoHh/R+UtUs1LheUMbAgMBAAGj
ggJ0MIICcDAfBgNVHSMEGDAWgBRVdE+yck/1YLpQ0dfmUVyaAYca1zAdBgNVHQ4E
FgQUtkEWynD115BC1cCt+dVbYMINNIEwKQYDVR0RBCIwIIIeZGFpbHkuYXBpLmRq
YW5nby12dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggr
BgEFBQcDAQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEF
BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGABggrBgEFBQcBAQR0
MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBKBggrBgEF
BQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0VuY3J5cHRpb25FdmVy
eXdoZXJlRFZUTFNDQS1HMS5jcnQwCQYDVR0TBAIwADCCAQQGCisGAQQB1nkCBAIE
gfUEgfIA8AB2ACl5vvCeOTkh8FZzn2Old+W+V32cYAr4+U1dJlwlXceEAAABeAiA
1B4AAAQDAEcwRQIgJNPwwa2Ckt6jT4iZkg+j7K4dx7Ilg6eo9lITNtas+jwCIQDU
6aY1CbJZQJCfgPbx61LGz6we0rSmw9KLukq2TFJlZgB2ACJFRQdZVSRWlj+hL/H3
bYbgIyZjrcBLf13Gg1xu4g8CAAABeAiA1HAAAAQDAEcwRQIhANyqViocLYtbkecx
QnhZyr8LIHPq9Uw3RuiN21RPxY84AiBACIPopJaybo6lQhgQGFVwKayEP3ba+QTK
E0REYDfHAzANBgkqhkiG9w0BAQsFAAOCAQEAHaYxBQYKYOpdJ3vEGX7ExR+kTjNM
83r74xAwV2nhbXIsTE0fwuwK7wGPzVyjVpqypIs93/18ehLhTF2Nr4dwloMMfsC+
HWM3mvtb6Y8v5xZ5duZuOeUUlSPlAniygFWB7XuBHJti01YtiwyRxtvELLk3pv3T
W2B0NNajfWPqhSm2IShnOL2sxD2OKvDXIKwAjbDRjOTQlkZgH6UocvtKE0REXym7
RHaujJ+fhWwtOqhkshmtWQSha9J4r2/X4v2uS8VyvJ1Lr+UwnxWeYlQ0Zz6Xgqtc
b0SD3GvHsA1mxnZJ0oPj3VA8MQkpMJtUjiNPypEjN4YH7UK+B5zXhoAB2A==
MIIFrDCCBJSgAwIBAgIQDw9E1qRxoRsSagKtIUbGJzANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
OVowKTEnMCUGA1UEAxMeZGFpbHkuYXBpLmRqYW5nby12dWUtYWRtaW4uY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyijP5M9nLFbIimHuhYl4cK7C
e4SewgiERRThx+4/iLzFKMVHpSQ0GgcSN7e6tLlfgMzRcUbAnUsia4bzcp0UG+w0
Ny6OrFF7XuU71YQ3B+35NpfAvJGr7pw71aFpl1l+jz9iym4iw6yN5F8poq6TR7Gl
PNhX1YWZ+Wy0MCDnvQ00MBsQ/42CGEPzE6ZdKJ3l19NY/9/djnxZE+OgMVR3cdCI
I/Et0mahIWYaPGP14/nIzNfOcEZtJMHmgSGF/l9NyUdsrRRK7ltV87YWeU86e2Da
hqW9v0oSOLepOzg4PB4wU2IJfykRMXfJNUG6iWjOMVPdqIFTXjJZvtvZg5J4GQID
AQABo4IChTCCAoEwHwYDVR0jBBgwFoAUf9OZ86BHDjEAVlYijrfMnt3KAYowHQYD
VR0OBBYEFOqwsoYN4FxXPwL2my2kdh/PuVB4MCkGA1UdEQQiMCCCHmRhaWx5LmFw
aS5kamFuZ28tdnVlLWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYI
KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYIKwYBBQUH
AQEEgYUwgYIwNAYIKwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0YWxjZXJ0
dmFsaWRhdGlvbi5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRzLmRpZ2l0
YWxjZXJ0dmFsaWRhdGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0MAkGA1Ud
EwQCMAAwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQBGpVXrdfqRIDC1oolp9PN9
ESxBdL79SbiFq/L8cP5tRwAAAXhNdRxuAAAEAwBGMEQCICntYjFg4csRL4bxiJvr
ma95JmMzYRrLx84UgLbd1iWhAiB64xH69vjCf4JfVB+3G1UN6G4pphW4m/nYBA2E
ElFuIgB2ACJFRQdZVSRWlj+hL/H3bYbgIyZjrcBLf13Gg1xu4g8CAAABeE11HF4A
AAQDAEcwRQIhANsjDO2cASF5sGZCyjS8jz9qA+5N4WWFxG+tO4VyELjtAiAIqurr
QbHF9fkBFDg995q5eR16ncpS1d75a0Nhis62PjANBgkqhkiG9w0BAQsFAAOCAQEA
DADo2zekDxm3zbuHGAlQR17h4BtD3tRDy58J58L5CnL+VhNLAN2Fp4AQF1w4a4+z
89ZFOKn+RcwSwyYDFHqsKYa7QYL97z7GJ1ASPG79faO5osbo1SOrSdwzIjjUnSD5
V4Fr0Fw6NYkq72pJPZkPEeivGEG3MvhzTaFSTwkylDVx6wxzaPY/p9WJpbopKN/8
+2WSM0b6UB1cuOgfJlhcqYYFqAPO/2XLY60uPpKgboPFAznT8T2QSaYd7JXHndYJ
IgTtXPr7hPOeXP9kDdUycCf3WOjp00gSk/guSujW4ZEaqCrJOkiMCbOrgyCIF7AK
pzwp4H5aJpzHXqObsb5n3Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----

View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAyKBzvBQKu28rfoAwz9v0Izpv/GEhTrPgAtIsoTC8ejQ0YfXC
CROFP1VaVK21yrKYDtpVTfXN2dvBIYpoE4/MC5eLgVwB4JmEuimUmNansDes2oIo
6NLoSOqkrnPkK+IWZE61R4YXSDOxu8+/pzA6Ly3H2YXsk/tHpjIaqzuTq6Kv/mJt
I26gWO7S6ezg8XYhuzjTZCIEf7dHCtT+Y9eofey1Ex7yUkG13fSaRkTlkAK8Ae27
YclvgYznPMv8+Y8ohNMK683A6HO9O09vOeVc3mJ6Cf9bf8zXU6Sf1bTOo5OTY6pa
h2ROyDzVD3UUN8rH7VQIKB4f0flLVLNS4XlDGwIDAQABAoIBAATB2TyydPaw0iUz
wPSM0KMtNY6Udwe4uC0Y8rn3v+Bd8IgKHcm9TsGLspKjc9YUmgpwHum0VGdAELpM
397m3/2+YC53EgxTV5RafA2LuXoyN8UOpQ2wQpXICpOgZ96qg8FpJF9HzLGHmEVN
zcuXFyobOcvsowl3QeGs+njo9r1xGVCZVo/c+XT95vU+o4bIeao5MyseVg7LLgXC
EsTJIVLaRK3WDCaZAegXoiVJQlgLR6qWrY+97E2yxCIAVZejdiPiejwT3i5XEsxT
w11FdaZXrCKYktid1b74tDwpHTSekevKWrzrT2QkgGv3VJfGHcvDeeQpyYGE13nd
IsyTynECgYEA+8JfXOL3hXRBOSZJYysLkIYXhiPw/P8Ao69pgRDEKaA2YSoojHnE
Rzo+v4cHw0x47WzLkjs/xf1ON3jBEEZ/2KG+FDpRXieC19xfvlEe1tf9RaFfdU0E
R2n059d8R3CC7M+nMEwfkYZ9OtV1SSeQlf6GyhBT3XmLlnRMKWbwRh8CgYEAzAGW
edCFYmTyzFBjxq8GARzvptCU/sAZBBFF18mz7jsFJhidxZ2nMS0tFZIy+yvg1dpE
ElkILAzMt4v0lmHWBTRcHCllnAwu+o5JsBR1pqzj+Q84iWurgkWI+MG0g56CjyBS
exJn8RL7JNt7QNUiiz1WB8oWa/knXXM/L8kui4UCgYEAsGWlabDBm2k0VfWkj+5W
IQJDM0K1lJ6bdRTvyHXV7BCMaZIfbSXYR8vgsVPMNaO8Sybij+ghq/jqt+VM6Lls
1H2ncAbYgi8O9246S2ANSp11oTcLamX3LI5qAZOzSV7k7UYlr6p2qAFidzme/w3Q
ubfn+2ZrTI/gJSABSTUN/yMCgYEAq7UWa1dIPWYMOk3bfSppmlw5liVvkvAq3hKP
v62kxXplvgfwG5mzVJ/al5JjWKc46aZ5rxvC1hi74i1pY33bfqvwbz+kp3BVxkwm
146Q7AYPJ91Yz8mRJOfT/tRDVJkA+OjSo4X9eJpqSj52Aj6igaHRnGLK9nxSVsSe
xWDGzWUCgYEAsk02rZvSc0XiddlQQ5vGNVezikbqtmrwQf32EUuxI8jklY6Ry7/M
BQA46J4psF0xtH93MV5Dsz5HqyJM6OPeQ4ONlCYrhZ1yHHti+YFivKtUdeZCPkn7
ygz3P8kQhLlNtFomXqFK787jlC1rZuTC5IXA4SL5zq4ThWh7vnb65Sw=
-----END RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyijP5M9nLFbIimHuhYl4cK7Ce4SewgiERRThx+4/iLzFKMVH
pSQ0GgcSN7e6tLlfgMzRcUbAnUsia4bzcp0UG+w0Ny6OrFF7XuU71YQ3B+35NpfA
vJGr7pw71aFpl1l+jz9iym4iw6yN5F8poq6TR7GlPNhX1YWZ+Wy0MCDnvQ00MBsQ
/42CGEPzE6ZdKJ3l19NY/9/djnxZE+OgMVR3cdCII/Et0mahIWYaPGP14/nIzNfO
cEZtJMHmgSGF/l9NyUdsrRRK7ltV87YWeU86e2DahqW9v0oSOLepOzg4PB4wU2IJ
fykRMXfJNUG6iWjOMVPdqIFTXjJZvtvZg5J4GQIDAQABAoIBAFYjOqXXe7IoTi2s
mbnbf+6fgC2qLg0mHNnkkmmiif7E1EtRd/wVJ4AZmDkWd57ux5M1cl6OU58R9xoS
9+NTq9BT/lGu7ErfMy6VhT+upNYjn4cT9SND/Jrghhw6OSgskWEPFJSFhhmTCiiP
Jcn0EbxAJNR+qDpKQXfGSiahtqxV01kNRU/j6YmVrQEoVif/9+LJmcs5Uy+gqA4a
fQou8/QQjrmPHPOSSWZ8aZlPNt89+E4P+XIkf4rPxD8lrWd2ufDeCdm1As4qYQQD
c/eeBh6qkrKijZZ8NRgonTaCYPXkkkHME4BgdP2gVCW/KMVfdM5pVVk7dctSs+6w
VFfF5CsCgYEA/pXLQXt6PUlJAVSFodK8CndZY1pAbzLNVTsDAVuEAepwmEL7Tw0O
nV4igsANdRxZxEdYWsY8CClNTNLNY92zaAbpsQXHxHqnXnl2ZGQi1Jb2eFR6zw+m
8Qyb6aca58Q95flHQY75/+IFWemj76p1aT7aIvpElMdkBUh1Ak92cv8CgYEAy0hu
MqJga0/3UoMLhjhUVWGXI6NBpvWNv7FqSeQ2SDj0iBib7nyrlP41bCcyHFXryrXf
YsbG4fq0mmyhQUz4++OP57lxXXBu3UvBd6qQUorWX9HVHy6ljun8PsJdNUGj9Q2v
arH6Rv/emIx86IAOGjgIgK+YiNwiw/uEYgNzTOcCgYBryjh4zTMAZ9sFOSgrT/JV
7Bpounm1myjdAVNQa9MEjKKHlTSaT8j0UDsEaRRJlWtcc2ixZmVcf0A/WrGjquaf
EO45CV1/jv72PS8nak5k/FX2tK4apWHlhZUt5Ja7spcSm+zTkRnAgY4Kd6X1f5Ke
sQHi9Vu8Mn/izL7d748TOQKBgH75txuZoXBmeq3nfQNRnBvY4Xc5OoD3UJs0Tpfp
HJ7wNI3uETheVy6xutzbfsmEQcxU3jvsvb3Zw4XR5MfNNJjiA7lSdCVRXW6NK0N8
HrnwTwd7IgxgLrmeHhl1fpMNdURUUAXtNc+zc28GEd+IXUazSVxYUobqOi0Apigy
z4pxAoGBAPKd+WMUS94Ne7WMHDzcCcQKl2dJmBVj036qCtPgUL4yDyRDc/H1fQxI
jr/+JueqktrJgJsOL4uygn0zzKIJyQIToufxOodUdmviRLaH2UskNUBUjIBqyDc0
pjPebC7sxg6HZQmVpgX4klj1IWDpudD+cCRGF9SIzKRvNEadLgOl
-----END RSA PRIVATE KEY-----

View File

@ -1,59 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIFmTCCBIGgAwIBAgIQCzI6tyKHzyI4bN6BJiBWZzANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMjEwMzA2MDAwMDAwWhcNMjIwMzA2MjM1OTU5WjAq
MSgwJgYDVQQDEx9kYWlseS5kZW1lLmRqYW5nby12dWUtYWRtaW4uY29tMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwd2udVfp+a/7oaVwqOxQeu6hqcLY
78tdYoz20XJZN9/LmTFxRoOm/FT773gJ90Ot/TfiAVuxfhfNXSS6fVGdRi0DIMW8
OReUwmLtDCD87xz2LNjMz73/am1FYchUEIXc1R9mME2DOHozGuK1qhF9T2YM9jkU
JL92OQ4eJ2EzbPLrXYoWFJIr050OT21xtgoTNlzi/+JqE8xuEDihjtsziT7KzgZl
5cSsJ7WAEio68oEXHhxPF4Xp/ziRDnmNA1Qd5+BZU/jUsQmDsMWAOpkV8EYG8GYI
AVSr2TegtSgrS7eXxFh0JsfpSbY2x1Og15IwU3WIo18kEnUz5jNpfL7miQIDAQAB
o4ICdTCCAnEwHwYDVR0jBBgwFoAUVXRPsnJP9WC6UNHX5lFcmgGHGtcwHQYDVR0O
BBYEFNIBagOABbLoxHlUOLebkahQPO5tMCoGA1UdEQQjMCGCH2RhaWx5LmRlbWUu
ZGphbmdvLXZ1ZS1hZG1pbi5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQG
CCsGAQUFBwMBBggrBgEFBQcDAjA+BgNVHSAENzA1MDMGBmeBDAECATApMCcGCCsG
AQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYAGCCsGAQUFBwEB
BHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEoGCCsG
AQUFBzAChj5odHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRW5jcnlwdGlvbkV2
ZXJ5d2hlcmVEVlRMU0NBLUcxLmNydDAJBgNVHRMEAjAAMIIBBAYKKwYBBAHWeQIE
AgSB9QSB8gDwAHUARqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+bUcAAAF4
CIG3RgAABAMARjBEAiB5Ba4CnxlhBvIQo3CPXbMhIxpT+Z4ujAD87mL4yD+rSgIg
WYu1d9u1lEIzth9PXL1U1O2H6gMK1pO+tLhUmkBIt6kAdwAiRUUHWVUkVpY/oS/x
922G4CMmY63AS39dxoNcbuIPAgAAAXgIgbdSAAAEAwBIMEYCIQD2rqMSWMVQSyep
vkZ39MuKoNfZ3nfKYAJ1XB8awJLj6QIhAJEIOcdX9QhVH8pB8jr/HrInLzTt/BOT
ArfsR+J/aqyVMA0GCSqGSIb3DQEBCwUAA4IBAQAcH2NGwZ4yAiOvXXP5W5+/9CHw
EA9uyDx8LY0UoPzxUEuk6zHtZ+0nj9JvitH6UUhfP5qV+gzzSEIPnZePCf9VI6Y4
F6yCYU5baV/vv2w+ccZSADY7YMm/NadECWX4hhvhZRLRyShSuN2GceWj1hTWrT7S
o9ZQ35KH5JcTL47VgoXgNNwIEqaJfAsTuFlAAn96DXzfS4KicNhBoAUTPW/VZn18
hG+G23tAWSwBkN2PTkLOnHMV+qmEKRIjH+eTxe5+XWY5KrmYH2am3eK92DiMAaI4
qaOAEhIN1RmIITZxgFfChaTadwR7jY27hG5HkvwRuV+fhsYnfYMiJUnoN34j
MIIFsDCCBJigAwIBAgIQBbQIKLDxaNeKW6HjUJCFNjANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
OVowKjEoMCYGA1UEAxMfZGFpbHkuZGVtby5kamFuZ28tdnVlLWFkbWluLmNvbTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAOwxsoKm4vH/gv8h7OHYHI
5dQAAKm3tk1ZsyY9cMlSq/GIMSY15BZSwdSiwyI3vcCpmz2YCVRXpH8r0LNm/Ygu
fjVeK1H+F6fQkGj7065ye1Z15PtgI6Dx9dhLlFlR3lZYm0MVwSIW2xgVqbL+WNKl
198afnP+/B/Klzjyud4wqAlzDcD8lIh8iL0LMY3HSHzSzr8xtYZLxUvEzcl+vRF9
a9GjTOgg01Ukk04zHXan7VInK1/lurQ+WuntfPFDe/jmlEid4/wvB/lCMi0KUSWd
0C9CCB+2q/Lsa0hr8v4DF1TS1/YGg/y0Ye1+DzpKLKv/mfe6py18Ca7FcnFoKVsC
AwEAAaOCAogwggKEMB8GA1UdIwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0G
A1UdDgQWBBQ14z4HfGEjC4tAPVnN/AvsXmgHYDAqBgNVHREEIzAhgh9kYWlseS5k
ZW1vLmRqYW5nby12dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAn
BggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGSBggrBgEF
BQcBAQSBhTCBgjA0BggrBgEFBQcwAYYoaHR0cDovL3N0YXR1c2UuZGlnaXRhbGNl
cnR2YWxpZGF0aW9uLmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGln
aXRhbGNlcnR2YWxpZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FDQS5jcnQwCQYD
VR0TBAIwADCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB3AEalVet1+pEgMLWiiWn0
830RLEF0vv1JuIWr8vxw/m1HAAABeE1yhJEAAAQDAEgwRgIhAIdZiX5qq+KJjdtl
2Z9ejh5o9VHKyVVUgkJb0+S8aQGlAiEA5nEVffySiTcUogz+b7n34hmG2aW3YO02
UhMzyv7hoGcAdgAiRUUHWVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXhN
coRmAAAEAwBHMEUCIDFWIi3mkGmkB/uuTCqJyPTz8/WS4vqvdAUWO+MuxuaoAiEA
yP80fJCLnfso7VoJcWQT1l6bN6XL/jxip1OjXU0+dQMwDQYJKoZIhvcNAQELBQAD
ggEBAB0vH0OMrwGOQHdRdaN9t+2Yc1xnBNcksHcCmVD09gO2clA06OqTiu77g8lw
KwO2M5DmNFAA2onDxRVIL6auyLNdyK4X2m9i1eGnyAKro7d4owIlG30JdJ7uHzLG
ROL9SR0ibNZwOhoKSfpy3a+fWngMjCdW8pAFJHfPbOf6lP/CpGwoBnLvm9a9ZG3K
m2NmFN1/GPje25tXy0S/NaVFDVcJyfMeuVKqdwY9sbN7nOYGUury5NC5LWbgJ0T2
KWLcZc3LCa791kHLWVt/KI+9UgpM6Xiie0jUUIU92NaxBD/wY/jybPiogJkAz/sl
TncbnwO2+WpN6jIy9ccs8ogUMTQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----

View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwd2udVfp+a/7oaVwqOxQeu6hqcLY78tdYoz20XJZN9/LmTFx
RoOm/FT773gJ90Ot/TfiAVuxfhfNXSS6fVGdRi0DIMW8OReUwmLtDCD87xz2LNjM
z73/am1FYchUEIXc1R9mME2DOHozGuK1qhF9T2YM9jkUJL92OQ4eJ2EzbPLrXYoW
FJIr050OT21xtgoTNlzi/+JqE8xuEDihjtsziT7KzgZl5cSsJ7WAEio68oEXHhxP
F4Xp/ziRDnmNA1Qd5+BZU/jUsQmDsMWAOpkV8EYG8GYIAVSr2TegtSgrS7eXxFh0
JsfpSbY2x1Og15IwU3WIo18kEnUz5jNpfL7miQIDAQABAoIBABHmSOxWsKi4IfCb
2NoP76JaFB0be3Iwga/Ouh8+gpRRGnhLg1zyXOGhax2CJNFqs07U8Q4VDD9LLU/z
SzC072OCVm6ZMzbGQZrtDVv4U8I0F1qurcJklYebDTPpDjH0Wh5nZsUA8yOszLkn
w4QvVzWUg4/cV0rJTr4X2priM6BUaAKGWe8BH1DX69K7jgSyvEZhSLN/aSxLJpwy
hfL8OSBeVAwciyr0MqoqSoVgcYdcxtGt5dePezpQi6glXf2bMhxYv3692EsbOgh4
eR24CO0xZJkp6AZN7BY4OaKwf3TmnJtIKg+ZhRwHTAMwHg9LDidsc/P1zMyvecPD
RcRBYo0CgYEA/UqadAgNEmcoe8on9S0UtmPp1hXnh+z8EmvFHmZfSt/FxW1DHM0y
c0hxsst/zIG8Q8B5W1HsLYbbBCvfG3RJDICbjBSRm+Aimz2HhIEtQl75YmXZ4srq
jaiRsvXsbBjwr5Syol4XvZQH7TAYuZKKZbNTKayFVo6ADJMwgxBBe5MCgYEAw/Bl
8kpUAnPOiAAzIr+sANd11trUUDRsTk0KCN6GJHWK8Q1O7ec5xjRjdffkOhKUloJJ
UuarxJoNKwrAbfa63aOP8h5jqqqXk41+Trj94qlbzCjL+o7hfezGQeY8HxdxmDAf
cBCLFGroND9aU7pCKATtIft5A7C09Gs1mpZTPvMCgYEAyFbFq5jinfex8ZeH20h4
5XpJbeeNZdlv1zIei1j1bkdoKiuttY4npT9bjsuenabPvdbzJeO6JphPixEYOqLT
VGw0m6t5MA0r0hXspkV2AtUT81wT5moQ81KtSxtwkF95n6bBU+OQa4Y2bshoBf9+
L8qSsJegL0IuzcNtz3yADrkCgYEAo0qAG4j4NEcA0vSfqRDlrpnhWdpq4CCgNi0b
9MJGNrJCxZsasUdnLZhRX2nkqMT9UeVoaA9XDPR5jupZ7gqWNsnt15Cd7QhYZB6i
KccfxrrvhthlDf3vTDt8CkVuy1aFU5ifSoxu6+ggdhJqG6b5JVLdsNlbQ8kLNTr3
pEotPCMCgYBmM0K9U1j4zO0L+/cpdDT8sYPpFUMdcEXCvLb/J9+v3kndbWhQbTyG
UYulGyvmkTGpmYnwG5TEZbHroEI3qNG593Ae6AiUciKaTenH9f9HkWhIldJEua5g
lKAA+18wOv5LbDFV4hUIaX4iDKBaKPiQu/Vi0HFy2SikiS+RUV10kQ==
-----END RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAoA7DGygqbi8f+C/yHs4dgcjl1AAAqbe2TVmzJj1wyVKr8Ygx
JjXkFlLB1KLDIje9wKmbPZgJVFekfyvQs2b9iC5+NV4rUf4Xp9CQaPvTrnJ7VnXk
+2AjoPH12EuUWVHeVlibQxXBIhbbGBWpsv5Y0qXX3xp+c/78H8qXOPK53jCoCXMN
wPyUiHyIvQsxjcdIfNLOvzG1hkvFS8TNyX69EX1r0aNM6CDTVSSTTjMddqftUicr
X+W6tD5a6e188UN7+OaUSJ3j/C8H+UIyLQpRJZ3QL0IIH7ar8uxrSGvy/gMXVNLX
9gaD/LRh7X4POkosq/+Z97qnLXwJrsVycWgpWwIDAQABAoIBABaP2NHdrhQnwWu/
T8km3dhFz5vm6jECVrN9nE1yJhFtqBOH0qx5C+9Xor9iDXv9JoWKLaTCPI0ZPkoM
4kI/wietrMMXb1IuAqX4YOWORgRrr9YmupdIBzhbPdVLsMbhzaPB9r+UnqEQXrmn
ksB1WQ5MgWsPdYQit+XqrWQXgbrU9kAP5+aO2GKrlnWZqBgshUkd2Sq5rdgrK5nv
kcmVBGClPsgOG2HgA+aJoFGLccoF8NMrBWaSc+zlHjiT8fP2YnMcDsX8Fw1tETbK
P9jf9wd4b/2ezKL3TWJMkbTRnxBwDgARWFVrD9jZqLtw342YuGQnEhPJFFdepKpQ
3GtbyiECgYEA0KlSF3K+coEjCjBGSFD5ACmB5ipl/NFPXVjCG1vHGHRh/0WnXBPI
zY3pRHFr9cJKLxQPe+4085yFXGTV7GHhH4nd1tEVxrH8ouNok0/WL4HHtvfGOq/H
sKQsZKVaUXd+NTZmzoXXJsb9Jgnu6r4AS4QazP1FRxSbSToxbut1ezsCgYEAxF6f
mAFz9p5ptNStJLXV53nTgNHK0Hk2cISu5aAUGQKA26VwnZTEo09Wt+WOGjzjTkSi
+TCoFfG77aqFQ1AyuAYWWErcS4/1/p0SeINXdztx34CJM/OqJ/AtjdL+09xwUZe6
JeUWWPMJukkrFkjNkCjkdQlVxG+a3jMlmM016GECgYEAoJJ8QuEhH7qyvUdy/nmZ
dH98oCPmggyM15fTH/yblP0S4L+4T8pFz7EyXmIuI1xVfC8iz0r7YrEDi5tpaFPW
S0/r8EDMUjBr6um3cw2QFNT5XJsF5+mXcR6Vrwn0HBcpf0eTC8DBVezxqFEik3CN
h49slG0e39lCurJWkjYOHTsCgYBeA/Oi4ic0DvoLErvm1IwZ7BDgHxFcKHxw+IWH
+NFGfBVXk+jL+Vr/2U9qciRL2ZT2dxQT/ECtaPQRwM9WwAHYa0mtcgHwx3b+NROP
0UpCEprdZ/vIfMOdpXcZ7MgGhQbdeags1naRlaK1pqxTWf3ZJErk4dhHWSurcI9y
jeVeYQKBgQCsIaGmX/xigoLaEucXOM4V34QU1gepJkDLDNEw4r9EoNHoBCwIaGxX
CWCsyuOwnCWM2OJJth5a+1xPYul0jsh7HCShICpkMsktoq4UdYbBfVNQiqenI7L7
l6/mzU5Ds6KXKVh2FZ7O8zcup1BYs0pAHTZqF+P/1FjSu1jbGfezFg==
-----END RSA PRIVATE KEY-----

View File

@ -1,59 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIFizCCBHOgAwIBAgIQAn/QNFyusvPyPREjg5iJWzANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMjEwMzA2MDAwMDAwWhcNMjIwMzA2MjM1OTU5WjAk
MSIwIAYDVQQDExlkZW1lLmRqYW5nby12dWUtYWRtaW4uY29tMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk06Sqv+Al94VYBy4mKn4S/BYDxMdZxqC9YXM
1o4h4JB3bnpV2r9SFIcWu16uHs3RqSMMoR8+fhoaXRZLMZExV98nKkeAUhKWA5TJ
kQ+GMe3+XFmzeB+TJJmXDeIJZyAPc8wfqWLZLjvAfkMPzCHyxmf6k+sN0bfT7kFr
0xhzDUhIpQp218BCUm4hyW2bqzwjHgzeg/TkHpaHNO7o0pR5/JEJs3jr3Hwsu0s0
kfuAlBnf7BcJIh65BmVxXVFrW4qytPUk1d6Zt76nWy5AZtTw33cqUtKH7HcDHNgT
ICsP8ozKaQ23Tb62kCMPwskvXIFuFOgwYKkHTMhXKefglhYGiwIDAQABo4ICbTCC
AmkwHwYDVR0jBBgwFoAUVXRPsnJP9WC6UNHX5lFcmgGHGtcwHQYDVR0OBBYEFL0O
PlBNqYf3I4ypNWFDpJ1U2G3pMCQGA1UdEQQdMBuCGWRlbWUuZGphbmdvLXZ1ZS1h
ZG1pbi5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
BgEFBQcDAjA+BgNVHSAENzA1MDMGBmeBDAECATApMCcGCCsGAQUFBwIBFhtodHRw
Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEF
BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEoGCCsGAQUFBzAChj5odHRw
Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRW5jcnlwdGlvbkV2ZXJ5d2hlcmVEVlRM
U0NBLUcxLmNydDAJBgNVHRMEAjAAMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUA
KXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4QAAAF4CH/v+AAABAMARjBE
AiAB+AshGhA6yvyvSV/q3jkTAyHxHKZACFnpAYEonFjS6gIgKayzGSgNkJbGJ1qp
JqlVtA6dG53dG8bdUTmIiGF34k0AdQAiRUUHWVUkVpY/oS/x922G4CMmY63AS39d
xoNcbuIPAgAAAXgIf+/JAAAEAwBGMEQCIC0/8V0lWjiV37EeIKAkH5zzvCpqO96s
lLY5/FKsXLplAiBOPzyGwXNAZ4HoFYAhGcd1jZE9eb0esgYUCq5d16njDDANBgkq
hkiG9w0BAQsFAAOCAQEAldgl6ApHK14DitAxzT0ejbu2E87d0tcQy7TOJTMEZs5p
UokcBd54SEgt2COh73MUmTBU1DVdOtkY9Ok1mDPQdWQvu3P90KRsIEPYLIEh0w6O
3SJmE0hXIcvC8u8ku36HyQnj1spHG9wKQBfH9Qdq9zti2wo2cAtmvF477H+a+wzD
Y2iNY1ucgc1vDxwD6VVRg3iETqL7t8e1KHBMqDZ2EQvr0YHnms+D4VaFXA9WtRRg
coSbdko2h+voGNuyJ3zvywN6zLnAfEqoyGEf9tzPDZbrkkp8BJGbGLvbc0PhPX6Q
++r7ty7YFDzX+XDiGu2y+X+BVTqiP+FpP0C0Zqhnng==
MIIFoTCCBImgAwIBAgIQBL1afhbyouKA0yBDgDhq/zANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
OVowJDEiMCAGA1UEAxMZZGVtby5kamFuZ28tdnVlLWFkbWluLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMk2tqLVSJyC/VTuWlZ+a+bjthUotJ/o
yQcXMC6eu/KyHbWqh5Ccj2kLh/zf9uhcs/GcYl/H1hyIVuiC+SHGmGfCqQB96vLl
uwwJDlM+y910xKmKV2S6DEFbXDZP76pShrpPs1nDkU5gftuGhX1S77pmMqjbOsG+
gZJAlAZKzT5xnGwpo4rkHc8xPY0ac29+9HXYDawpmySSdbfG+W0kape/wBexFmO+
KLt/oRk+QJbtPguLNLLlvZznf+fFp5UcmsVks/scg9fM1pnj3QQaCB8RXQQKkskm
Hi67PGFJOeepNFkApzHO4sUM3ya2Rskzfs9DtTlCODn3XFSVJz7DyTsCAwEAAaOC
An8wggJ7MB8GA1UdIwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0GA1UdDgQW
BBSRBeJj2dUcPqhi3km5tbW5lZP3aTAkBgNVHREEHTAbghlkZW1vLmRqYW5nby12
dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD
AQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEFBQcCARYb
aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGSBggrBgEFBQcBAQSBhTCBgjA0
BggrBgEFBQcwAYYoaHR0cDovL3N0YXR1c2UuZGlnaXRhbGNlcnR2YWxpZGF0aW9u
LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaXRhbGNlcnR2YWxp
ZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FDQS5jcnQwCQYDVR0TBAIwADCCAQIG
CisGAQQB1nkCBAIEgfMEgfAA7gB1AEalVet1+pEgMLWiiWn0830RLEF0vv1JuIWr
8vxw/m1HAAABeE1whV0AAAQDAEYwRAIgPFX8oV29XVZMDi2tbEuBo2AuS4udT2I/
tMHo9EPNPOYCIGFeOpkGfPcG4szSvKEmUIYimb3vejH0QJ6qB3+T6E5kAHUAIkVF
B1lVJFaWP6Ev8fdthuAjJmOtwEt/XcaDXG7iDwIAAAF4TXCFeAAABAMARjBEAiBC
HxlN8ItLz/FW/gYrmGGXTVvxxnVKv9t5bsj2AsdmOQIgJVu8zYZVNjt7AHFusZWg
ZYSY0Qd+11v1oXBHAi0OUAowDQYJKoZIhvcNAQELBQADggEBAEKj+pGihWMbm/Bm
d+7Ra6gngG5N/c7S1cPzmOAlX3bWOFLqZRVPiC8Xa5uzLuqkYMiRIuIFUjZj2CwS
gKVwEk3xIL76sMVURV17mhjV7jbhzCSIqnEVLpiGRsuEoHKW8UUAzBdAZjjk4D+Y
LZKOQKcWojGTCyRJA5dRHy+sWtnZcHGaD36UHeVh0ctFhoVcc9Oxsh9T6W4NnMd/
CthO8fDic3643232J+6VF1vH5fkz1Q6UGbH+GbmkZ70Rv9YCl78zU77juBfTy9ht
HJmcwLWF6Hef7Z+K2QnvT6H+cIb6OxSErshy9TlKgTRjVD7A3wTrri/dCJqfINVk
FoBVzmQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----

View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAk06Sqv+Al94VYBy4mKn4S/BYDxMdZxqC9YXM1o4h4JB3bnpV
2r9SFIcWu16uHs3RqSMMoR8+fhoaXRZLMZExV98nKkeAUhKWA5TJkQ+GMe3+XFmz
eB+TJJmXDeIJZyAPc8wfqWLZLjvAfkMPzCHyxmf6k+sN0bfT7kFr0xhzDUhIpQp2
18BCUm4hyW2bqzwjHgzeg/TkHpaHNO7o0pR5/JEJs3jr3Hwsu0s0kfuAlBnf7BcJ
Ih65BmVxXVFrW4qytPUk1d6Zt76nWy5AZtTw33cqUtKH7HcDHNgTICsP8ozKaQ23
Tb62kCMPwskvXIFuFOgwYKkHTMhXKefglhYGiwIDAQABAoIBAACotbtFUI8qLTC0
fP1VDu+4CYzRUKzCnGdgy91oRJQh0VPEzfGGlzI3g7O4fre6KZmQg8cmW283ZEea
VYfJPU4S74GFUSumbaL8EJ+XhDAty/+Gkmj59/yOVPPfWQKfGbKY7TAiz+BT4Btj
s9Ewx0p5i9A+Ziqg04MZw9O6V9/TuzkKd0HoSNNEnTueEb4IZgvEbNQRWyvkBiY5
X2o5keDUIQY1/Psrd+HqCq6BngV+2p+dlmTtzkFm4SX5pVptvkasdj/GPQHCTIU+
DpS/dYV0T43pm7VpGz/3XSkPXPiIBkcAofY3VcMF4YV1CW1YnWDuuP8VMFoeG5B9
g4MrHzECgYEAw1ATxKZ3SB/PbnkaHRiwhh/tLXP/0SZokMRABsTcVFpK1xqOlX8i
1wYKk52XvV5LyYZQNiKgRGlSda3lv0H9nfibPo/EDbH/UerHnKAztas5vnHNeAAK
LGq4QK8kJ/pplqi8C+bWmgA22Rx/kYaiCrtZUG/IRFUge4bCDp949BUCgYEAwRPt
AX7eg9f0hxsmpqWhjBV2InzDGN2j+V3kSLwuzUZqTH6JQL9x6UgA5O3XmhMp1hMr
ZkedM/7rvGxeo02t/l51CKSsjLkrW21zt1Rj4KY98Ay1ajAqmmMB2cE/G8AWRbbL
EKRKRRyiC+umcX7fdCjsiSXNWQ1BzjFmFGx0mB8CgYAPAt+SFK1ESNWbiwk7xUMD
+/4xqSG3RHly7vJw0r6QaSQpZiwhR1U5K4iykcEw18eBZKZTktO4jlO9IbFvwrWo
Z4wfAdOyrcSO2jmfSxzOUKuufHarS218vnMM3aksvW1SHAPf8kz6JxwQEcWoPK3F
n2Kc8Qp2XgiSFehiUVVthQKBgQCp1Uwhh6ZVFK179i7+YS0DmpEqbtHx2mv02lkG
fbkxSWIRXTB/6qZZS8O1m1yNo5OmQYBoXE/0P6S+PhjUzmxhFlcdvjQlKG/x4Qnr
Vejw32oV8CfXevzOho5HK4vGbiVpNwvR3KGTv0bu816Z8L6/X4wIa18AmP+sTpl7
F5dLgwKBgHymEzm+tzUetW6JX3zK38TwSqBp5oExano91yQrnl9DNnx1umojKrGr
jmkYdvJbOXYGi9qo0cJeX/1bycA0ISEBFItWPp23WDK6rKKypC2kY2nYZKIQNWZl
jYUrCYxu9KqMmpYPQfIpnjbWzjKN6OnFD1VJJDczEFqLUm1q79ba
-----END RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAyTa2otVInIL9VO5aVn5r5uO2FSi0n+jJBxcwLp678rIdtaqH
kJyPaQuH/N/26Fyz8ZxiX8fWHIhW6IL5IcaYZ8KpAH3q8uW7DAkOUz7L3XTEqYpX
ZLoMQVtcNk/vqlKGuk+zWcORTmB+24aFfVLvumYyqNs6wb6BkkCUBkrNPnGcbCmj
iuQdzzE9jRpzb370ddgNrCmbJJJ1t8b5bSRql7/AF7EWY74ou3+hGT5Alu0+C4s0
suW9nOd/58WnlRyaxWSz+xyD18zWmePdBBoIHxFdBAqSySYeLrs8YUk556k0WQCn
Mc7ixQzfJrZGyTN+z0O1OUI4OfdcVJUnPsPJOwIDAQABAoIBAA8baQX7vnplyVBt
nuG8lyxcL2kSR9FzwFgkcQ0nBNR5dAqWNZxxbMEFyR1+0UJr52S+CZLIZbZ5tBC7
+KmFCB9OObMcQR4ginUiXu14GwVTBYr3JI2e/FmR2vAG+2cN0Ci/4CberJO2Yf/o
bzBUIESd9LLB1v0B6SeKarK4PgWwjrr/twowABRBhkkKFErfYZjfNh1mALXPNEUA
7z3a8abw+JWympIFKWxi3YXyLOJZaGawOPDhq+ZVv+7rXvIyAzUzpmwCprjZFL4Q
hgN7IY7KjYK772Ffe0nwMbd3wbwYeAelM9fndH9dTMrQ1n6EcDBzla8Cwl6OVEk3
GpQqOfECgYEA+7qFHw75AOI3FFke/2VOJ58m0rrYJwDrLazlrzashi7qgJOBY6jp
yjLgGCOcR9v8pRWkOw2VLy+dhdr16Xp/XYhuSa6O5EC7igtnUVx9xu+XAksZiB97
f4lm7F3uirEh7ewuqiRETI9o6V5iGTCSMSc21zlJ1zoxnLMSuMyCKTECgYEAzKDD
PNJVZAiZJ25JKinkZlTyQ9VmQkfrvsIBWheN844uoSmmLR4PNwriZQtlURI58WA2
pe20aHJaleOJvzgW/OvcB+7mf/Ukn1mw6Ciusj6jXLXmmq8i80W0RMr1Rdbq8+dp
DNZt0iDXEZXHEGqdkpkn/gsvYL+jeIiKyuJ9PisCgYAoZGF//lMORT45UaObr5G+
4dbE8Z5Fg+w4xAmG9+rvDRAr2X9lknERNOCofu5QyYfcpYBYyXEqxSUtmVjkQfe1
9nJb+FqNXaW6HOJTN9gm18MPZyWNph+W82FEhD4Gmy2qk79ZJcCf2FMpPy/Wguiy
Ymx2VIb4tinHzyQt6wLnwQKBgAURSiR8dP7oM5rFYWx44x4hpmpFo6WqkE0GEvB/
OtW4RLFbDbF6WBgd3eNwt86dK/AtWM0dKOWZR2ME4olowzD6SlWr9etfT8vedcIa
F9F0Oal3G8Hi6nOp20AE4rQbEXB+35wgx1F33LujwO1IJqTVxCbHciHsPQkkIIPL
vhxHAoGAdwbRiK2OCmycedsD+L5qdxOYiL8JIAXLP+H7ZD0Jyx21UxQAmvza6fIx
HygnDGzrTJoOPEWu5WmGs4i6mr1bChHpo85LVNfytsxbE59y3I0va1IlSUC6wjXP
Yy3caUiBgxmzz4vhqCFdpLhT2SyyB4m13ggLmeyqLy88WnYCgiE=
-----END RSA PRIVATE KEY-----

111
docker_env/nginx/keys/www.django-vue-admin.com.crt Executable file → Normal file
View File

@ -1,60 +1,61 @@
-----BEGIN CERTIFICATE-----
MIIFnzCCBIegAwIBAgIQDULdZ8Ko3AktSKrXM0T8azANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMjEwMzA2MDAwMDAwWhcNMjIwMzA2MjM1OTU5WjAf
MR0wGwYDVQQDExRkamFuZ28tdnVlLWFkbWluLmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALPsn57ttIHmQQQSdtdOP+f07zelzXk6Y2Ta6mLdBx0z
HZjoCH3CieDGyLs19B6dphURjI8TtRd6KkclUKwYHL4gzP1AzDOCNzOtizMRm/ad
3hS2H10oZHxOI6fec/ytb7b0Nu4EhZ8/GLsIGvs/hXBaadk8DP5gOLHsm28rlROT
EGYraXYi5CTM/auRJcndTNp/v6VhQblqWxojAzlTxlcjwXkreqzhk3y9IN+1VYiV
AEk2srVdbfjk6yB5tnKGErAxKPOBzrkzWvh3lIEwrZ/0wRsb/NFGW9g5QDCa8oXV
HaJ8qq2dW4X7HOm88QO6xqZiFLldYoYv9psdrrNHd58CAwEAAaOCAoYwggKCMB8G
A1UdIwQYMBaAFFV0T7JyT/VgulDR1+ZRXJoBhxrXMB0GA1UdDgQWBBR6M6BtHZ13
MWMDkoP/lLyUfEAcezA5BgNVHREEMjAwghRkamFuZ28tdnVlLWFkbWluLmNvbYIY
d3d3LmRqYW5nby12dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAn
BggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGABggrBgEF
BQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBK
BggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0VuY3J5cHRp
b25FdmVyeXdoZXJlRFZUTFNDQS1HMS5jcnQwCQYDVR0TBAIwADCCAQYGCisGAQQB
1nkCBAIEgfcEgfQA8gB3ACl5vvCeOTkh8FZzn2Old+W+V32cYAr4+U1dJlwlXceE
AAABeAiEftAAAAQDAEgwRgIhALoCVuRcMRqM2wwuEsGGCy2mno/3t4qi3RZR2l4B
sWZ2AiEApyQ2yCgb2UsEx0YAnjrejgPgj7tsCmwBAi5Vsl/vmccAdwAiRUUHWVUk
VpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXgIhH8pAAAEAwBIMEYCIQCpvmUS
hv244dpidw1cD6BNu3MPp7xii+63D0OtQa5cJgIhAMAS6PWmwy0g5naWQBj028Qt
mh/UdGFSQhgQsPfyAjZUMA0GCSqGSIb3DQEBCwUAA4IBAQBVCd2ZGxA01PyIUokC
1rsjxPCtdvzdj4jcIBiXQw1AVSRrkq9L6TkQfF12wYLzTzLbiW/JmenIdVUC1O2N
mc1Zd8jxqr/gC3RhdnzxV1ABA6jn44MYfdK5ZGXyG8wTBXMczfHRJhlhLsfdK78U
BHkBbsKq3Q4rjOf/hV2TDBa77Grd66m0zfaTYcidja6wIZvnrzNl7Tf6rIgRnx8O
/vo/IJhfkQzT9ZfyOfLMiiZUMzwKPQPpHBbJ3C3JSLq9fPeTm4/soN/4aKn1hU3m
qJvfqBtzg4vafmj3p7BZD0LdSmYn8to+xq5gkt57/4Bfn+RAX7/dqx8pBjHXOj98
rjQN
MIIFszCCBJugAwIBAgIQCGwikUrRfEUk8GbxRWLVIDANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMwMzAwMDAwMFoXDTIyMDMwMjIzNTk1
OVowHzEdMBsGA1UEAxMUZGphbmdvLXZ1ZS1hZG1pbi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC0iitqUeTxkq5qabbVcB+7a+YArfKAJBRvcj+T
VVdRkvEjcfGLvXIJUTvcUqJkRRYFbimdjB5q7CWCld8bgz/UOpIEmbdqn+WgzrNn
WWZrRiN5ylHAsIaKlgYKh6gcftEco6OgkrM8oyq1gORRBIcSj95VcqpIeAUMVyCX
R0h3dXnLCVe70ejr8w2cyHrSeS68mXw7LlAdfC0JAZTB/wxwcitSnnIVEbV6wMzG
BD5Ka/WprnJgJa7Prb5KHiZh4UG4Es2JpIHALMYLIeKQCUCIP1NmW8Ale+nhY9kD
tJeSEIY+/dRoDjpPkkIZalMp+5p0yDQ1LIO4pDZxnoI2vFLFAgMBAAGjggKWMIIC
kjAfBgNVHSMEGDAWgBR/05nzoEcOMQBWViKOt8ye3coBijAdBgNVHQ4EFgQUru5P
/0LuJj6hxqHWVYUN690wFNEwOQYDVR0RBDIwMIIUZGphbmdvLXZ1ZS1hZG1pbi5j
b22CGHd3dy5kamFuZ28tdnVlLWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIB
MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYI
KwYBBQUHAQEEgYUwgYIwNAYIKwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0
YWxjZXJ0dmFsaWRhdGlvbi5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRz
LmRpZ2l0YWxjZXJ0dmFsaWRhdGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0
MAkGA1UdEwQCMAAwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgBGpVXrdfqRIDC1
oolp9PN9ESxBdL79SbiFq/L8cP5tRwAAAXf475pDAAAEAwBHMEUCIHTgL1+oRWE+
REuWNRa5J1cflPKW63jk6/3ibF+Sm5peAiEAt74SK9Ka9QyMJfP57eDl3xA1Ctnb
Bz6zTLIQFFicPGsAdgAiRUUHWVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAA
AXf475pNAAAEAwBHMEUCIQDOE36oL7MAxmHdEoI338jLW0xnBN8VeW9XyuTzIcq7
eQIgLwJTNfLqgw7TofY3dKqof5rkcuJWMmSI4aapUUBjFfIwDQYJKoZIhvcNAQEL
BQADggEBAC9lYBZuCzle1tSaJ4nVfogwHf0B4lKjDI8ixEnrDaY0tAuYst4S7zoU
76dZcpdwQjVLtlLk5jyaNdN5ohsu9WpErq6N7bXKhbSPBavCPxP4sMWMvmeQQUtB
UKqqRofXbx3WcWtsf1/Wlg3pyb0oyJ7kKt3iDG9OYEihQzEyG5Y72IE+HsbhTAWR
zqxGnmMumQ+JTnxCCudPoVPk25i2BfndMbcY4N6YyJYuLwMojtMkAeWtRdMmqtiy
lMb7EbWLYCHDyv892WTzie1BqZ7YcOaE59OChhmoYxiSXNHPCToIFECTz6BhPxlI
T3LbIM4+81HNDebdR17NUE3zN44OjsA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
-----END CERTIFICATE-----
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----

52
docker_env/nginx/keys/www.django-vue-admin.com.key Executable file → Normal file
View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAs+yfnu20geZBBBJ2104/5/TvN6XNeTpjZNrqYt0HHTMdmOgI
fcKJ4MbIuzX0Hp2mFRGMjxO1F3oqRyVQrBgcviDM/UDMM4I3M62LMxGb9p3eFLYf
XShkfE4jp95z/K1vtvQ27gSFnz8Yuwga+z+FcFpp2TwM/mA4seybbyuVE5MQZitp
diLkJMz9q5Elyd1M2n+/pWFBuWpbGiMDOVPGVyPBeSt6rOGTfL0g37VViJUASTay
tV1t+OTrIHm2coYSsDEo84HOuTNa+HeUgTCtn/TBGxv80UZb2DlAMJryhdUdonyq
rZ1bhfsc6bzxA7rGpmIUuV1ihi/2mx2us0d3nwIDAQABAoIBADEzNl7eP2r6DLNR
XT/4/M6wEq4T38ETr1RH7KoGKMjaTnCempvRE6Tslr1ivpOUpnLCbr49NFrsJB16
XboBifKPw55JFs3LAM9X2GWpng1tE+pz9tWhkwDO2T8xPGRPBOpxk4e4otVuCpQy
XjZwI0wa3TDzE9aHd1loCwT2VPiZ3As8rr0+4kIN6EyzneNb5Uys0LHMzHGHVBUl
JY0fAwqrt7wi+AXSufcxX6uhwJOY0LAU0iiT3Y1CYP6IdTtwpyWW2DcYeuHtLK9Y
oSnkHRXaJOcUHytDdRSXyJVD174r1wfSPCZ6DjXGc9ydwTQQg3ibTJrdn5gnaLZ9
/Lrk80ECgYEA3CrP4NlbfBestRuU2LfEQvyzVVfiVWv7NjHDbryVTQ3hu5dR2hr8
Q9acWwvg2virQVzSnECk4QsNydcaRriU0kq2Nf9Vzs8oTDZl7+K203L+Ry3bguUe
r4q9v7mY6cCOIgE19H+BR2T21NVHHK3acR6WVO+95rlD0Aqe0FXmZmECgYEA0TUa
y3Pbp7+kcUQIqdKwrYVCSgKQeco3VqtqlXDHjoD49tBP/WHJqJaGJ582bW3ozIYs
1Iol3wInjOy6iOIvRK2tJibb7tor/WxMO4R5NbMYSswyOwyO+gaz3hoQbu+m/S12
8BwM9JN1QHq3mYqT0QHvamPW9asU2auONRq+nf8CgYBREeKh5Odu9ji+J33TnzdB
g1N1pXrOAYjrF7/i0sYXLXllXf7h1PX29Nt2GxWdC9vjoY5bwuHzi+Jz5CTkzarf
FGurzm2GTXmFNrKqdkzj54ACLbyaokt+UBQ2uNy5lhHAK7n2Ycz0wRSyoiYhRVMe
PCkW9YBzqNxzirWX+UlxgQKBgGhZlajffDOa2noIlk2moquaaWsjBk9JNvsK+1nY
7CC/Ye8yDoPzL7PgiL/goTRJ+zFwx5Gn6qXmnDWlqpE2SJ94BYKfJVppBkIcr5WM
SS0ozLgaS/+6DuLVTwg8de/vp5pnAAlZ5HhlyLlFvKhgP8Sjs3icng7hq7+6227P
jT6fAoGBAMyPW7voNx29oPT04MMgAKdwyjR5sZv6vWhOW6KBOPkLUKPDfSfrVN0B
H6JfetLZryHXgJioxBfLoLqIW+iMvW7UcCFD53I6nWpOzBtcPTjgeeIK0W4+f113
RrXOS29rrxKr0NXvnYx26v5deQ9+KlxAUgTuC+EjqsX8NnGW21Cv
-----END RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAtIoralHk8ZKuamm21XAfu2vmAK3ygCQUb3I/k1VXUZLxI3Hx
i71yCVE73FKiZEUWBW4pnYweauwlgpXfG4M/1DqSBJm3ap/loM6zZ1lma0YjecpR
wLCGipYGCoeoHH7RHKOjoJKzPKMqtYDkUQSHEo/eVXKqSHgFDFcgl0dId3V5ywlX
u9Ho6/MNnMh60nkuvJl8Oy5QHXwtCQGUwf8McHIrUp5yFRG1esDMxgQ+Smv1qa5y
YCWuz62+Sh4mYeFBuBLNiaSBwCzGCyHikAlAiD9TZlvAJXvp4WPZA7SXkhCGPv3U
aA46T5JCGWpTKfuadMg0NSyDuKQ2cZ6CNrxSxQIDAQABAoIBAA5RZOcOLp9/+Agl
cSQVO9cD1B5arUA/XEWIZIVdP8sO4cPjXfosoJYflKVBAnL8TaZJmdBOU/071C+6
jhKjApVkvb7SqAqzOqVZrz2zh91bFyYqBvjGpyznf/wmzQzRe+kPC0OJTuCwugrh
+Xl5Z/LvaP0S1nFf31qesE1/ED609pvWtdUWj2oop9zORBzjaGcXeOKNqX8XnQCp
rJ487wcnuL8Nnuu+vuh8dC9o7zwjGrKwXhM3sijLp4q9VOF9fW2bYLyfLUR3FCFq
JPrQXe1mY28w+uIlnEdPkwgGIJbzur601BuzU9ZH5MSl7iYV319MPz+rtizFJxLm
OCg5hcMCgYEA7RrgQsrSj4fhi0VVkQ3fFeLJPQlvVcMK0OOYxP3cKQYSgXo79bQK
i9yRCRVS2UTGh8B3MGbPr+sRINokeYtjWxGDOwAlkye9kRiCKzzZOrlwDAY/SEDZ
HH5mVnv9UHtxCFSUub67IVWH7wCmoprKEK/loyvJFiE5jsxVmNZl3o8CgYEAwu1R
nBsETJLuN5/fB9rW3NvjaHGT1B6LQ1uIBmsU6V71gBasawX/X3ENOoX1dQa2japp
x58pjLJuP/t4WgZ41PBagij2G83VdFBdvrcVSk7B1yt8rudxmcvo1K6FR2FG7DMU
9kkb9JKFT3/FM7LT+z4xXxJ0AoNg6QD1IIT5Y2sCgYEAyQUvOxGQISY334bh+8AB
8iE7MidsoA5jfiRoIiOEY7eFOwbyDOcexeMzh7rvacs4cmGH655O2Lv34p1vrSiz
DMO1OfFu6esYegqIWbYWCgar61XkkxJ/v/ueMhae9nwhoclr6mq9Zo6IV+Z6YIPR
awJmM8fsjXmPvfSZYaHr7hsCgYAPzW99SU9q6cp4JfTNzTb4BreD4xlJ7AP8PPJl
Gs9CMBmU/cGSl5ThZufco7mHeDjaeUNEFKooptp7Q2a5Xab0FFwyCyIQlPpGCLHg
4TTPplzelb7w6wBxqG9CtrdFVySJx4ZehQTIKgy2qjQRgeDfkGYuP++5uG7l1NcK
gN066wKBgDg2F4yMx4SBWL3aBjIVd+Zilm+pkU1ZGC1XcuLnqSSMcoDy/JMszQC1
SEdDxgnCGlkWjtaxNPwfZTPU0SIoX5dcAx1EaHDJ+ibiIKGtM8forSCiP8fNz0oR
SYNZaYVuDJb1SFk9vKJMuIIFWS+AM6rlcOpNu6A0+1MbstM4BvwS
-----END RSA PRIVATE KEY-----

View File

@ -1,7 +1,7 @@
## 将HTTP请求全部重定向至HTTPS
server {
listen 80;
server_name api.django-vue-admin.com;
server_name daily.api.django-vue-admin.com;
charset utf-8;
access_log /var/log/nginx/api-80.access.log;
error_log /var/log/nginx/api-80.error.log;
@ -9,11 +9,11 @@ server {
}
server {
listen 443 ssl;
server_name api.django-vue-admin.com;
server_name daily.api.django-vue-admin.com;
root /dvadmin-backend/;#项目路径
charset utf-8;
ssl_certificate /nginx/keys/api.django-vue-admin.com.crt;#.pem证书路径
ssl_certificate_key /nginx/keys/api.django-vue-admin.com.key;#.key证书路径
ssl_certificate /nginx/keys/daily.api.django-vue-admin.com.crt;#.pem证书路径
ssl_certificate_key /nginx/keys/daily.api.django-vue-admin.com.key;#.key证书路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
@ -21,7 +21,7 @@ server {
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
proxy_set_header Host $proxy_host;
proxy_set_header X-DTS-SCHEMA api;
proxy_set_header X-DTS-SCHEMA daily.api;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
@ -41,6 +41,6 @@ server {
alias /dvadmin-backend/static; # your Django project's static files - amend as required
}
access_log /var/log/nginx/api-443.access.log;
error_log /var/log/nginx/api-443.error.log;
access_log /var/log/nginx/daily.api-443.access.log;
error_log /var/log/nginx/daily.api-443.error.log;
}

View File

@ -25,10 +25,20 @@ server {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
root /dvadmin-ui/dist/;
add_header Cache-Control max-age=no-cache;
index index.html index.php index.htm;
}
location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
access_log off;
add_header Cache-Control max-age=604800;
root /dvadmin-ui/dist/;
index index.html index.php index.htm;
}
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/daily.demo-443.access.log;
error_log /var/log/nginx/daily.demo-443.error.log;
}

View File

@ -25,10 +25,20 @@ server {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
root /dvadmin-ui/dist/;
add_header Cache-Control max-age=no-cache;
index index.html index.php index.htm;
}
location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
access_log off;
add_header Cache-Control max-age=604800;
root /dvadmin-ui/dist/;
index index.html index.php index.htm;
}
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/demo-443.access.log;
error_log /var/log/nginx/demo-443.error.log;
}

View File

@ -0,0 +1,37 @@
## 将HTTP请求全部重定向至HTTPS
server {
listen 80;
server_name django-vue-admin.com;
charset utf-8;
access_log /var/log/nginx/www-80.access.log;
error_log /var/log/nginx/www-80.error.log;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443 ssl;
server_name django-vue-admin.com;
root /vadmin-doc/;#项目路径
charset utf-8;
ssl_certificate /nginx/keys/www.django-vue-admin.com.crt;#.pem证书路径
ssl_certificate_key /nginx/keys/www.django-vue-admin.com.key;#.key证书路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
proxy_set_header Host $proxy_host;
proxy_set_header X-DTS-SCHEMA www;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
root /dvadmin-doc/docs/.vuepress/dist/;
index index.html index.php index.htm;
}
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/www-443.access.log;
error_log /var/log/nginx/www-443.error.log;
}

View File

@ -25,10 +25,13 @@ server {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
root /dvadmin-doc/dist/;
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
root /dvadmin-doc/docs/.vuepress/dist/;
index index.html index.php index.htm;
}
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/www-443.access.log;
error_log /var/log/nginx/www-443.error.log;
}

View File

@ -0,0 +1,5 @@
FROM node:12
COPY ./dvadmin-ui/package.json /
RUN npm install --registry=https://registry.npm.taobao.org
#RUN npm run build:prod
#CMD ["npm","run","dev"]

View File

@ -0,0 +1,5 @@
FROM node:12
COPY ./dvadmin-ui/package.json /
RUN npm install --registry=https://registry.npm.taobao.org
#RUN npm run build:prod
#CMD ["npm","run","dev"]

View File

@ -13,6 +13,7 @@ https://docs.djangoproject.com/en/1.11/ref/settings/
# 导入全局环境变量
import datetime
import os
import sys
from mongoengine import connect
@ -20,7 +21,7 @@ from conf.env import *
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
@ -45,9 +46,9 @@ INSTALLED_APPS = [
'corsheaders',
'captcha',
# 自定义app
'apps.permission',
'apps.op_drf',
'apps.system',
'apps.vadmin.permission',
'apps.vadmin.op_drf',
'apps.vadmin.system',
]
MIDDLEWARE = [
@ -59,6 +60,7 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'vadmin.op_drf.middleware.ApiLoggingMiddleware', # 用于记录API访问日志
]
# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL
@ -117,7 +119,7 @@ USE_I18N = True
USE_L10N = True
USE_TZ = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
@ -126,10 +128,15 @@ USE_TZ = True
"""
# 访问静态文件的url地址前缀
STATIC_URL = '/static/'
# 设置django的静态文件目录
# 收集静态文件,必须将 MEDIA_ROOT,STATICFILES_DIRS先注释
# python manage.py collectstatic
# STATIC_ROOT=os.path.join(BASE_DIR,'static')
# # 设置django的静态文件目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
os.path.join(BASE_DIR, "static"),
]
if not os.path.exists(os.path.join(BASE_DIR, 'media')):
os.makedirs(os.path.join(BASE_DIR, 'media'))
# 访问上传文件的url地址前缀
MEDIA_URL = "/media/"
# 项目中存储上传文件的根目录
@ -160,6 +167,10 @@ LOGGING = {
'format': CONSOLE_LOG_FORMAT,
'datefmt': '%Y-%m-%d %H:%M:%S',
},
'file': {
'format': CONSOLE_LOG_FORMAT,
'datefmt': '%Y-%m-%d %H:%M:%S',
},
},
'handlers': {
'file': {
@ -189,7 +200,7 @@ LOGGING = {
'loggers': {
# default日志
'': {
'handlers': ['console'],
'handlers': ['console','error','file'],
'level': 'INFO',
},
# 数据库相关日志
@ -247,9 +258,9 @@ JWT_AUTH = {
'JWT_AUTH_HEADER_PREFIX': 'Bearer', # JWT的Header认证头以'JWT '开始
'JWT_AUTH_COOKIE': 'AUTH_JWT',
'JWT_VERIFY_EXPIRATION': True,
'JWT_PAYLOAD_HANDLER': 'utils.jwt_util.jwt_payload_handler',
'JWT_GET_USER_SECRET_KEY': 'utils.jwt_util.jwt_get_user_secret_key',
'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.jwt_util.jwt_response_payload_handler',
'JWT_PAYLOAD_HANDLER': 'apps.vadmin.utils.jwt_util.jwt_payload_handler',
'JWT_GET_USER_SECRET_KEY': 'apps.vadmin.utils.jwt_util.jwt_get_user_secret_key',
'JWT_RESPONSE_PAYLOAD_HANDLER': 'apps.vadmin.utils.jwt_util.jwt_response_payload_handler',
}
# ================================================= #
@ -261,23 +272,24 @@ REST_FRAMEWORK = {
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'apps.vadmin.utils.authentication.RedisOpAuthJwtAuthentication',
# 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'utils.authentication.RedisOpAuthJwtAuthentication'
),
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
'EXCEPTION_HANDLER': 'utils.exceptions.op_exception_handler',
'EXCEPTION_HANDLER': 'apps.vadmin.utils.exceptions.op_exception_handler',
}
# ================================================= #
# ************** 登录方式配置 ************** #
# ================================================= #
AUTHENTICATION_BACKENDS = (
'utils.backends.CustomBackend',
'utils.backends.SessionAuthentication',
'apps.vadmin.utils.backends.CustomBackend',
'apps.vadmin.utils.backends.SessionAuthentication',
)
AUTH_USER_MODEL = 'permission.UserProfile'
# username_field
@ -302,3 +314,7 @@ CAPTCHA_NOISE_FUNCTIONS = (
)
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
API_LOG_ENABLE = True
# API_LOG_METHODS = 'ALL' # ['POST', 'DELETE']
# API_LOG_METHODS = ['POST', 'DELETE'] # ['POST', 'DELETE']

View File

@ -18,16 +18,11 @@ from captcha.conf import settings as ca_settings
from captcha.helpers import captcha_image_url, captcha_audio_url
from captcha.models import CaptchaStore
from django.conf import settings
from django.conf.urls import url
from django.contrib import admin
from django.urls import re_path, include
from django.views.static import serve
from rest_framework.documentation import include_docs_urls
from rest_framework.views import APIView
from apps.permission.views import GetUserProfileView, GetRouters
from apps.op_drf.response import SuccessResponse
from utils.login import LoginView, LogoutView
from apps.vadmin.op_drf.response import SuccessResponse
class CaptchaRefresh(APIView):
@ -45,18 +40,6 @@ class CaptchaRefresh(APIView):
urlpatterns = [
re_path('api-token-auth/', LoginView.as_view(), name='api_token_auth'),
re_path(r'^admin/', admin.site.urls),
url(r'docs/', include_docs_urls(title='接口文档')),
re_path(r'^permission/', include('apps.permission.urls')),
re_path(r'^system/', include('apps.system.urls')),
re_path(r'media/(?P<path>.*)', serve, {"document_root": settings.MEDIA_ROOT}),
re_path(r'^login/$', LoginView.as_view()),
re_path(r'^logout/$', LogoutView.as_view()),
re_path(r'^getInfo/$', GetUserProfileView.as_view()),
re_path(r'^getRouters/$', GetRouters.as_view()),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r"captcha/refresh/$", CaptchaRefresh.as_view(), name="captcha-refresh"), # 刷新验证码
re_path('captcha/', include('captcha.urls')), # 图片验证码 路由
re_path(r'^admin/', include('apps.vadmin.urls')),
]

View File

@ -1,102 +0,0 @@
"""
django中间件
"""
import json
import datetime
from django.utils.deprecation import MiddlewareMixin
from mongoengine import DynamicDocument, StringField, IntField, DictField, DateTimeField
from rest_framework_mongoengine.serializers import DocumentSerializer
import logging
from utils.decorators import exceptionHandler
from utils.request_util import get_request_ip, get_request_data, get_request_path
from .viewsets import CustomMongoModelViewSet
from django.conf import settings
logger = logging.getLogger(__name__)
class ApiLog(DynamicDocument):
"""
API访问日志的Mongo模型
"""
request_ip = StringField(verbose_name="request_ip", help_text="请求IP")
request_username = StringField(verbose_name="request_username", help_text="请求username")
request_method = StringField(verbose_name="request_method", help_text="请求方法")
request_path = StringField(verbose_name="request_path", help_text="请求路径")
request_body = DictField(verbose_name="request_body", help_text="请求参数")
response_code = IntField(verbose_name="response_code", help_text="响应状态码")
response_reason = StringField(verbose_name="response_reason", help_text="响应简述")
access_time = DateTimeField(verbose_name="access_time", help_text="访问时间")
class ApiLogSerializer(DocumentSerializer):
"""
API访问日志的Mongo序列化器
"""
class Meta:
model = ApiLog
fields = '__all__'
class ApiLogModelViewSet(CustomMongoModelViewSet):
"""
API访问日志的CRUD视图
"""
queryset = ApiLog.objects.all()
serializer_class = ApiLogSerializer
search_fields = ('request_ip', 'request_username', 'request_method', 'response_reason', 'source_system')
ordering = '-access_time' # 默认排序
class ApiLoggingMiddleware(MiddlewareMixin):
"""
用于记录API访问日志中间件
"""
def __init__(self, get_response=None):
super().__init__(get_response)
self.enable = op_settings.get_api_log_setting().get('enable', False)
self.methods = op_settings.get_api_log_setting().get('methods', set())
@classmethod
@exceptionHandler()
def __handle_request(cls, request):
request.request_ip = get_request_ip(request)
request.request_data = get_request_data(request)
request.access_time = datetime.datetime.now()
@classmethod
@exceptionHandler(logger=logger)
def __handle_response(cls, request, response):
# request_data,request_ip由PermissionInterfaceMiddleware中间件中添加的属性
body = getattr(request, 'request_data', {})
# 请求含有password则用*替换掉(暂时先用于所有接口的password请求参数)
if isinstance(body, dict) and body.get('password', ''):
body['password'] = '*' * len(body['password'])
info = {
'request_ip': getattr(request, 'request_ip', 'unknown'),
'request_username': request.user.username,
'request_method': request.method,
'request_path': request.path,
'request_body': body,
'response_code': response.status_code,
'response_reason': response.reason_phrase,
'source_system': getattr(settings,'SOURCE_SYSTEM_NAME',None),
'access_time': request.access_time.strftime('%Y-%m-%d %H:%M:%S'),
}
log = ApiLog(**info)
log.save()
def process_request(self, request):
self.__handle_request(request)
def process_response(self, request, response):
"""
主要请求处理完之后记录
:param request:
:param response:
:return:
"""
if self.enable:
if self.methods == 'ALL' or request.method in self.methods:
self.__handle_response(request, response)
return response

View File

@ -1,287 +0,0 @@
import logging
import traceback
from types import FunctionType, MethodType
from rest_framework.exceptions import APIException as DRFAPIException
from rest_framework.request import Request
from rest_framework.views import APIView
from utils import exceptions
from utils.model_util import ModelRelateUtils
from .logging.view_logger import CustomerRelationshipViewLogger
from .response import SuccessResponse, ErrorResponse
from .serializers import CustomModelSerializer
logger = logging.getLogger(__name__)
def op_exception_handler(ex, context):
"""
统一异常拦截处理
目的:(1)取消所有的500异常响应,统一响应为标准错误返回
(2)准确显示错误信息
:param ex:
:param context:
:return:
"""
msg = ''
if isinstance(ex, DRFAPIException):
# set_rollback()
msg = ex.detail
elif isinstance(ex, exceptions.APIException):
msg = ex.message
elif isinstance(ex, Exception):
logger.error(traceback.format_exc())
msg = str(ex)
return ErrorResponse(msg=msg)
class CustomAPIView(APIView):
"""
继承增强DRF的APIView
"""
extra_permission_classes = ()
# 仅当GET方法时会触发该权限的校验
GET_permission_classes = ()
# 仅当POST方法时会触发该权限的校验
POST_permission_classes = ()
# 仅当DELETE方法时会触发该权限的校验
DELETE_permission_classes = ()
# 仅当PUT方法时会触发该权限的校验
PUT_permission_classes = ()
view_logger_classes = ()
def initial(self, request: Request, *args, **kwargs):
super().initial(request, *args, **kwargs)
self.check_extra_permissions(request)
self.check_method_extra_permissions(request)
def get_view_loggers(self, request: Request, *args, **kwargs):
logger_classes = self.view_logger_classes or []
if not logger_classes:
return []
view_loggers = [logger_class(view=self, request=request, *args, **kwargs) for logger_class in logger_classes]
return view_loggers
def handle_logging(self, request: Request, *args, **kwargs):
view_loggers = self.get_view_loggers(request, *args, **kwargs)
method = request.method.lower()
for view_logger in view_loggers:
view_logger.handle(request, *args, **kwargs)
logger_fun = getattr(view_logger, f'handle_{method}', None)
if logger_fun and isinstance(logger_fun, (FunctionType, MethodType)):
logger_fun(request, *args, **kwargs)
def get_extra_permissions(self):
return [permission() for permission in self.extra_permission_classes]
def check_extra_permissions(self, request: Request):
for permission in self.get_extra_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
def get_method_extra_permissions(self):
_name = self.request.method.upper()
method_extra_permission_classes = getattr(self, f"{_name}_permission_classes", None)
if not method_extra_permission_classes:
return []
return [permission() for permission in method_extra_permission_classes]
def check_method_extra_permissions(self, request):
for permission in self.get_method_extra_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
class BatchModelApIView(CustomAPIView):
"""
模型批量CRUD通用视图
"""
model = None
serializer_class = None
POST_serializer_class = None
PUT_serializer_class = None
field_name = 'instanceId'
instanceId_list_param_name = 'instanceIdList'
instance_info_param_name = 'info'
def get_serializer(self, *args, **kwargs):
if not self.request:
return None
serializer_class = getattr(self, f"{self.request.method}_serializer_class", None) or getattr(self,
'serializer_class')
serializer = serializer_class(*args, **kwargs)
if isinstance(serializer, CustomModelSerializer):
serializer.request = self.request
return serializer
def get(self, request: Request = None, *args, **kwargs):
data = self.get_serializer(self.model.objects.filter(**{f'{self.field_name}__in': request.data}),
many=True).data
return SuccessResponse(data=data)
def post(self, request: Request = None, *args, **kwargs):
data = []
for info in request.data:
serializer = self.get_serializer(data=info)
serializer.is_valid(raise_exception=True)
serializer.save()
data.append(serializer.data)
return SuccessResponse(data=data)
def put(self, request: Request = None, *args, **kwargs):
data = []
instanceId_list = request.data.get(self.instanceId_list_param_name, [])
info = request.data.get(self.instance_info_param_name, {})
for instanceId in instanceId_list:
serializer = self.get_serializer(
instance=self.model.objects.get(**{f'{self.field_name}': instanceId}),
data=info,
partial=True
)
serializer.is_valid(raise_exception=True)
serializer.save()
return SuccessResponse(data=instanceId_list)
def delete(self, request: Request = None, *args, **kwargs):
self.model.objects.filter(**{f'{self.field_name}__in': request.data}).delete()
return SuccessResponse(data=request.data)
class ModelRelationshipAPIView(CustomAPIView):
"""
模型关联关系通用CRUD视图
"""
model = None
through_model = None
relationship_model = None
relationship_serializer = None
field_name: str = None
from_field_name: str = 'instanceId'
to_field_name: str = None
relationship_field_values = ()
view_logger_classes = [CustomerRelationshipViewLogger, ]
def get_relationship_data(self, instanceId: str):
relationship_model_field_name = self.relationship_field_values[0]
params = {}
params[self.field_name] = instanceId
business_key_dict = self.through_model.objects.filter(**params).values(
*self.relationship_field_values).distinct()
business_key_list = [ele[relationship_model_field_name] for ele in business_key_dict]
params = {}
params[f"{self.to_field_name}__in"] = business_key_list
queryset = self.relationship_model.objects.filter(**params)
data = ModelRelateUtils.model_to_dict(queryset, self.relationship_serializer, default=[])
if 'creator' in self.relationship_field_values and 'ctime' in self.relationship_field_values:
for _index in range(len(data)):
ele = data[_index]
ele['relationship_creator'] = business_key_dict[_index]['creator']
ele['relationship_ctime'] = business_key_dict[_index]['ctime']
return data
def execute_method(self, execute: str, request: Request, instanceId: str, *args, **kwargs):
method = request.method.lower()
fun = None
if execute == 'before':
fun = getattr(self, f'before_{method}', None)
elif execute == 'handle':
fun = getattr(self, f'handle_{method}', None)
elif execute == 'after':
fun = getattr(self, f'after_{method}', None)
if fun and isinstance(fun, (FunctionType, MethodType)):
fun(request, instanceId, *args, **kwargs)
def do_request(self, request: Request, instanceId: str, *args, **kwargs):
self.execute_method('before', request, instanceId, *args, **kwargs)
self.execute_method('handle', request, instanceId, *args, **kwargs)
self.execute_method('after', request, instanceId, *args, **kwargs)
self.handle_logging(request, instanceId=instanceId, *args, **kwargs)
data = self.get_relationship_data(instanceId)
return SuccessResponse(data)
def get(self, request: Request, instanceId: str, *args, **kwargs):
return self.do_request(request, instanceId, *args, **kwargs)
def post(self, request: Request, instanceId: str, *args, **kwargs):
return self.do_request(request, instanceId, *args, **kwargs)
def put(self, request: Request, instanceId: str, *args, **kwargs):
return self.do_request(request, instanceId, *args, **kwargs)
def delete(self, request: Request, instanceId: str, *args, **kwargs):
return self.do_request(request, instanceId, *args, **kwargs)
class ModelRelationshipView(ModelRelationshipAPIView):
"""
模型关联关系通用CRUD视图
"""
def handle_get(self, request: Request, instanceId: str, *args, **kwargs):
data = self.get_relationship_data(instanceId)
return SuccessResponse(data)
def handle_post(self, request: Request, instanceId: str, *args, **kwargs):
relationship_model_field_name = self.relationship_field_values[0]
params = {}
params[f"{self.to_field_name}__in"] = request.data
queryset = self.relationship_model.objects.filter(**params)
exist_list = [getattr(ele, self.to_field_name) for ele in queryset]
bulk_info = []
for _id in exist_list:
info = {}
info[relationship_model_field_name] = _id
info[self.field_name] = instanceId
info['creator'] = request.user.username
bulk_info.append(self.through_model(**info))
self.through_model.objects.bulk_create(bulk_info)
data = self.get_relationship_data(instanceId)
return SuccessResponse(data)
def handle_put(self, request: Request, instanceId: str, *args, **kwargs):
relationship_model_field_name = self.relationship_field_values[0]
params1 = {}
params1[f"{self.field_name}"] = instanceId
params2 = {}
params2[f"{relationship_model_field_name}__in"] = request.data
relationships = self.through_model.objects.filter(**params1).exclude(**params2)
relationships.delete()
params = {}
params[f"{self.field_name}"] = instanceId
instanceId_dict = self.through_model.objects.filter(**params).values(*self.relationship_field_values).distinct()
instanceId_list = [ele.get(relationship_model_field_name) for ele in instanceId_dict]
create_list = list(set(request.data).difference(set(instanceId_list)))
for _id in create_list:
info = {}
info[relationship_model_field_name] = _id
info[self.field_name] = instanceId
info['creator'] = request.user.username
data = self.get_relationship_data(instanceId)
return SuccessResponse(data)
def handle_delete(self, request: Request, instanceId: str, *args, **kwargs):
relationship_model_field_name = self.relationship_field_values[0]
params = {}
params[f"{self.field_name}"] = instanceId
params[f"{relationship_model_field_name}__in"] = request.data
self.through_model.objects.filter(**params).delete()
data = self.get_relationship_data(instanceId)
return SuccessResponse(data)

View File

@ -1,75 +0,0 @@
import logging
import os
from django.core.management.base import BaseCommand
from django.db import connection
from scripts import getSql
logger = logging.getLogger(__name__)
class Command(BaseCommand):
"""
项目初始化命令: python manage.py initialization
"""
def customSql(self, sql_list, model_name, table_name):
"""
批量执行sql
:param sql_list:
:param table_name: 表名
:return:
"""
with connection.cursor() as cursor:
num = 0
for ele in table_name.split(','):
cursor.execute("select count(*) from {}".format(ele))
result = cursor.fetchone()
num += result[0]
if num > 0:
while True:
inp = input(f'[{model_name}]模型已初始化完成,继续将清空[{table_name}]表中所有数据,是否继续初始化?【 Y/N 】')
if inp.upper() == 'N':
return False
elif inp.upper() == 'Y':
logger.info(f'正在清空[{table_name}]中数据...')
cursor.execute("SET foreign_key_checks = 0")
for ele in table_name.split(','):
cursor.execute("truncate table {};".format(ele))
cursor.execute("SET foreign_key_checks = 1")
connection.commit()
logger.info(f'清空[{table_name}]中数据{result[0]}')
break
for sql in sql_list:
cursor.execute(sql)
connection.commit()
return True
def init(self, sql_filename, model_name, table_name):
"""
初始化
:param sql_filename: sql存放位置
:param model_name: 模块名
:param table_name: 表名
:return:
"""
logger.info(f'正在初始化[{model_name}]中...')
if self.customSql(getSql(sql_filename), model_name, table_name):
logger.info(f'[{model_name}]初始化完成!')
else:
logger.info(f'已取消[{table_name}]初始化')
def handle(self, *args, **options):
self.init(os.path.join('system', 'system_dictdata.sql'), '字典管理', 'system_dictdata')
self.init(os.path.join('system', 'system_dictdetails.sql'), '字典详情', 'system_dictdetails')
self.init(os.path.join('system', 'system_configsettings.sql'), '参数设置', 'system_configsettings')
self.init(os.path.join('permission', 'permission_post.sql'), '岗位管理', 'permission_post')
self.init(os.path.join('permission', 'permission_dept.sql'), '部门管理', 'permission_dept')
self.init(os.path.join('permission', 'permission_menu.sql'), '菜单管理', 'permission_menu')
self.init(os.path.join('permission', 'permission_role.sql'), '角色管理',
','.join(['permission_role', 'permission_role_dept', 'permission_role_menu']))
self.init(os.path.join('permission', 'permission_userprofile.sql'), '用户管理', ','.join(
['permission_userprofile_groups', 'permission_userprofile', 'permission_userprofile_role',
'permission_userprofile_post']))

View File

@ -1,34 +0,0 @@
import django_filters
from apps.system.models import DictDetails, DictData, ConfigSettings
class DictDataFilter(django_filters.rest_framework.FilterSet):
"""
字典管理 简单过滤器
"""
class Meta:
model = DictData
fields = '__all__'
class DictDetailsFilter(django_filters.rest_framework.FilterSet):
"""
字典详情 简单过滤器
"""
dictType = django_filters.CharFilter(field_name='dict_data__dictType')
class Meta:
model = DictDetails
fields = '__all__'
class ConfigSettingsFilter(django_filters.rest_framework.FilterSet):
"""
参数设置 简单过滤器
"""
class Meta:
model = ConfigSettings
fields = '__all__'

View File

@ -0,0 +1,31 @@
from logging import StreamHandler, getLevelName
from logging.handlers import RotatingFileHandler
from typing import Optional, IO
class MyStreamHandler(StreamHandler):
def __init__(self, stream: Optional[IO[str]] = ...) -> None:
print(222)
super().__init__(stream)
def __repr__(self):
level = getLevelName(self.level)
name = getattr(self.stream, 'name', '')
# bpo-36015: name can be an int
name = str(name)
if name:
name += ' '
print(111)
return '<%s %s(%s)>' % (self.__class__.__name__, name, level)
class MyRotatingFileHandler(RotatingFileHandler):
def __init__(self, filename: str, mode: str = ..., maxBytes: int = ..., backupCount: int = ...,
encoding: Optional[str] = ..., delay: bool = ...) -> None:
print(4444)
super().__init__(filename, mode, maxBytes, backupCount, encoding, delay)
def __repr__(self):
level = getLevelName(self.level)
print(22)
return '<%s %s (%s)>' % (self.__class__.__name__, self.baseFilename, level)

View File

@ -6,7 +6,7 @@ logger = logging.getLogger(__name__)
class OpDrfConfig(AppConfig):
name = 'op_drf'
name = 'apps.vadmin.op_drf'
verbose_name = "OP DRF"
def ready(self):

View File

@ -2,7 +2,7 @@ from django.contrib.auth import get_user_model
from django.db import models
from django.db.models import SET_NULL
from utils.string_util import uuid_8, uuid_16, uuid_32, uuid_36
from ..utils.string_util import uuid_8, uuid_16, uuid_32, uuid_36
class IdField(models.CharField):

View File

@ -6,12 +6,11 @@ import logging
import operator
from functools import reduce
from django.db.models import Q
from django.utils import six
from mongoengine.queryset import visitor
from rest_framework.filters import BaseFilterBackend, SearchFilter, OrderingFilter
from apps.permission.models import Dept
from ..permission.models import Dept
logger = logging.getLogger(__name__)
@ -102,45 +101,55 @@ class MongoAdvancedSearchFilter(BaseFilterBackend):
class DataLevelPermissionsFilter(BaseFilterBackend):
"""
数据 级权限过滤器
0. 判断过滤的数据是否有创建人 "creator" 字段
1. 判断用户是否为超级管理员角色
2. 根据角色的最大权限进行数据过滤(会有多个角色进行去重取最大权限)
3. 只为仅本人数据权限时只返回过滤本人数据
4. 自定数据权限 获取部门根据部门过滤
0. 获取用户的部门id没有部门则返回空
1. 判断过滤的数据是否有创建人所在部门 "creator" 字段,没有则返回全部
2. 如果用户没有关联角色则返回本部门数据
3. 根据角色的最大权限进行数据过滤(会有多个角色进行去重取最大权限)
3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则返回所有数据
4. 只为仅本人数据权限时只返回过滤本人数据并且部门为自己本部门(考虑到用户会变部门只能看当前用户所在的部门数据)
5. 自定数据权限 获取部门根据部门过滤
"""
project_resource_name: str = 'project__tenant__managers'
def filter_queryset(self, request, queryset, view):
# 0. 判断过滤的数据是否有创建人 "creator" 字段
if not hasattr(queryset.model, 'creator'):
# 0. 获取用户的部门id没有部门则返回空
user_dept_id = getattr(request.user, 'dept_id')
if not user_dept_id:
return queryset.none()
# 1. 判断过滤的数据是否有创建人所在部门 "dept_belong_id" 字段
if not hasattr(queryset.model, 'dept_belong_id'):
return queryset
# 1. 判断用户是否为超级管理员角色
# 2. 如果用户没有关联角色则返回本部门数据
if not hasattr(request.user, 'role'):
return queryset.filter(creator=request.user)
role_list = request.user.role.all().values('id', 'admin', 'dataScope')
if True in list(set([ele.get('admin') for ele in role_list])):
return queryset
return queryset.filter(dept_belong_id=user_dept_id)
# 2. 根据角色的最大权限进行数据过滤(会有多个角色,进行去重取最大权限)
dataScope_list = list(set([ele.get('dataScope') for ele in role_list]))
if '1' in dataScope_list: # 返回所有数据
return queryset
# 3. 根据所有角色 获取所有权限范围
role_list = request.user.role.all().values('admin', 'dataScope')
dataScope_list = []
for ele in role_list:
# 3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则返回所有数据
if '1' == ele.get('dataScope') or ele.get('admin') == True:
return queryset
dataScope_list.append(ele.get('dataScope'))
dataScope_list = list(set(dataScope_list))
# 3. 只为仅本人数据权限时只返回过滤本人数据
# 4. 只为仅本人数据权限时只返回过滤本人数据,并且部门为自己本部门(考虑到用户会变部门,只能看当前用户所在的部门数据)
if dataScope_list == ['5']:
return queryset.filter(Q(creator=request.user))
return queryset.filter(creator=request.user, dept_belong_id=request.user.dept_id)
# 4. 自定数据权限 获取部门,根据部门过滤
# 5. 自定数据权限 获取部门,根据部门过滤
dept_list = []
for ele in dataScope_list:
if ele == '2':
dept_list.extend(request.user.role.all().values_list('dept__id', flat=True))
elif ele == '3':
dept_list.append(request.user.dept.id)
dept_list.append(user_dept_id)
elif ele == '4':
dept_list.extend(self.get_dept(request.user.dept.id, Dept.objects.all().values('id', 'parentId')))
dept_list.append(request.user.dept.id)
return queryset.filter(Q(creator=request.user) | Q(creator__dept__in=list(set(dept_list))))
dept_list.extend(self.get_dept(user_dept_id, Dept.objects.all().values('id', 'parentId')))
dept_list.append(user_dept_id)
return queryset.filter(dept_belong_id__in=list(set(dept_list)))
def get_dept(self, id, dept_all_list, dept_list=[]):
"""

View File

@ -7,8 +7,8 @@ from rest_framework.settings import api_settings
from . import mixins
from .pagination import Pagination, JsonPagination
from .response import SuccessResponse
from utils.jsonpath_util import get_jsonpath, filter_json, search_json
from utils.sort_util import sortList
from ..utils.jsonpath_util import get_jsonpath, filter_json, search_json
from ..utils.sort_util import sortList
from .views import CustomAPIView

View File

@ -16,11 +16,27 @@ class ViewLogger(object):
super().__init__()
self.view = view
self.request = request
self.model = None
self.log_prefix: str = ''
if self.view and hasattr(self.view.get_queryset(), 'model'):
self.model: Model = self.view.get_queryset().model
elif self.view and hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta,
'model'):
self.model: Model = self.view.get_serializer().Meta.model
if self.model:
request.session['model_name'] = getattr(self.model, '_meta').verbose_name
def handle(self, request: Request, *args, **kwargs):
pass
def logger(self, msg):
"""
:param msg:
:return: logger
"""
self.request.session['request_msg'] = msg
return logger
class APIViewLogger(ViewLogger):
"""
@ -36,7 +52,7 @@ class APIViewLogger(ViewLogger):
"""
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
super().__init__()
super().__init__(view, request, *args, **kwargs)
self.view: APIView = view
self.request: Request = request
self.user = request.user
@ -52,12 +68,7 @@ class ModelViewLogger(APIViewLogger):
"""
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
super().__init__(view, request)
if hasattr(self.view.get_queryset(), 'model'):
self.model: Model = self.view.get_queryset().model
elif hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, 'model'):
self.model: Model = self.view.get_serializer().Meta.model
super().__init__(view, request, *args, **kwargs)
class RelationshipViewLogger(APIViewLogger):
@ -103,7 +114,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
logger.info(
self.logger(
f'{self.log_prefix}用户[username={operator}]新增, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
def handle_put(self, request: Request, *args, **kwargs):
@ -114,7 +125,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
logger.info(
self.logger(
f'{self.log_prefix}用户[username={operator}]重置, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
def handle_delete(self, request: Request, *args, **kwargs):
@ -125,7 +136,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
logger.info(
self.logger(
f'{self.log_prefix}用户[username={operator}]移除, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
@ -144,7 +155,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]检索{model_name}:[{instance}]')
self.logger(f'{self.log_prefix}用户[username={operator}]检索{model_name}:[{instance}]')
def handle_list(self, request: Request, *args, **kwargs):
"""
@ -153,7 +164,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]查询{model_name}')
self.logger(f'{self.log_prefix}用户[username={operator}]查询{model_name}')
def handle_create(self, request: Request, instance: Model = None, *args, **kwargs):
"""
@ -162,7 +173,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]创建{model_name}:[{instance}]')
self.logger(f'{self.log_prefix}用户[username={operator}]创建{model_name}:[{instance}]')
def handle_update(self, request: Request, instance: Model = None, *args, **kwargs):
"""
@ -171,7 +182,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]更新{model_name}:[{instance}]')
self.logger(f'{self.log_prefix}用户[username={operator}]更新{model_name}:[{instance}]')
def handle_partial_update(self, request: Request, instance: Model = None, *args, **kwargs):
"""
@ -180,7 +191,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]部分更新{model_name}:[{instance}]')
self.logger(f'{self.log_prefix}用户[username={operator}]部分更新{model_name}:[{instance}]')
def handle_destroy(self, request: Request, instance: Model = None, *args, **kwargs):
"""
@ -189,4 +200,13 @@ class CustomerModelViewLogger(ModelViewLogger):
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
logger.info(f'{self.log_prefix}用户[username={operator}]删除{model_name}:[{instance}]')
self.logger(f'{self.log_prefix}用户[username={operator}]删除{model_name}:[{instance}]')
def handle_other(self, request: Request, instance: Model = None, *args, **kwargs):
"""
其他 请求才会触发此方法
"""
pass
operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name
self.logger(f'{self.log_prefix}用户[username={operator}]其他请求{model_name}:[{instance}]')

View File

@ -0,0 +1,79 @@
"""
django中间件
"""
from django.conf import settings
from django.contrib.auth.models import AnonymousUser
from django.utils.deprecation import MiddlewareMixin
from apps.vadmin.system.models import OperationLog
from ..utils.request_util import get_request_ip, get_request_data, get_request_path, get_browser, get_os, \
get_login_location
class ApiLoggingMiddleware(MiddlewareMixin):
"""
用于记录API访问日志中间件
"""
def __init__(self, get_response=None):
super().__init__(get_response)
self.enable = getattr(settings, 'API_LOG_ENABLE', None) or False
self.methods = getattr(settings, 'API_LOG_METHODS', None) or set()
@classmethod
def __handle_request(cls, request):
request.request_ip = get_request_ip(request)
request.request_data = get_request_data(request)
request.request_path = get_request_path(request)
@classmethod
def __handle_response(cls, request, response):
# request_data,request_ip由PermissionInterfaceMiddleware中间件中添加的属性
body = getattr(request, 'request_data', {})
# 请求含有password则用*替换掉(暂时先用于所有接口的password请求参数)
if isinstance(body, dict) and body.get('password', ''):
body['password'] = '*' * len(body['password'])
if not hasattr(response, 'data') or not isinstance(response.data, dict):
response.data = {}
info = {
'request_ip': getattr(request, 'request_ip', 'unknown'),
'creator': request.user,
'dept_belong_id': getattr(request.user, 'dept_id', None),
'request_method': request.method,
'request_path': request.request_path,
'request_body': body,
'response_code': response.data.get('code'),
'request_location': get_login_location(request),
'request_os': get_os(request),
'request_browser': get_browser(request),
'request_msg': request.session.get('request_msg'),
'status': True if response.data.get('code') in [200, 204] else False,
'json_result': {"code": response.data.get('code'), "msg": response.data.get('msg')},
'request_modular': request.session.get('model_name'),
}
if isinstance(request.user, AnonymousUser):
info['creator'] = None
log = OperationLog(**info)
log.save()
def process_request(self, request):
self.__handle_request(request)
def process_response(self, request, response):
"""
主要请求处理完之后记录
:param request:
:param response:
:return:
"""
if self.enable:
if self.methods == 'ALL' or request.method in self.methods:
self.__handle_response(request, response)
return response
class PermissionModeMiddleware(MiddlewareMixin):
"""
权限模式拦截判断
"""

View File

@ -1,3 +1,4 @@
from django.db import transaction
from rest_framework import mixins
from rest_framework import serializers
from rest_framework import status
@ -5,6 +6,8 @@ from rest_framework.relations import ManyRelatedField, RelatedField, PrimaryKeyR
from rest_framework.request import Request
from .response import SuccessResponse
from ..utils.export_excel import excel_to_data, export_excel_save_model
from ..utils.request_util import get_verbose_name
class CreateModelMixin(mixins.CreateModelMixin):
@ -33,10 +36,10 @@ class ListModelMixin(mixins.ListModelMixin):
list_serializer_class = None
def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
if getattr(self, 'values_queryset', None):
return self.get_paginated_response(page)
@ -91,11 +94,25 @@ class DestroyModelMixin(mixins.DestroyModelMixin):
"""
destroy_serializer_class = None
def get_object_list(self):
queryset = self.filter_queryset(self.get_queryset())
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
assert lookup_url_kwarg in self.kwargs, (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwarg)
)
filter_kwargs = {f"{self.lookup_field}__in": self.kwargs[lookup_url_kwarg].split(',')}
obj = queryset.filter(**filter_kwargs)
self.check_object_permissions(self.request, obj)
return obj
def destroy(self, request: Request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
instance = self.get_object_list()
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
self.perform_destroy(instance)
return SuccessResponse(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
@ -271,3 +288,75 @@ class TableSerializerMixin:
info['type'] = 'select'
column.append(info)
return column
class ImportSerializerMixin:
"""
自定义导出模板导入功能
"""
# 导入字段
import_field_data = {}
# 导入序列化器
import_serializer_class = None
@transaction.atomic # Django 事物
def importTemplate(self, request: Request, *args, **kwargs):
"""
用户导人模板
:param request:
:param args:
:param kwargs:
:return:
"""
assert self.import_field_data, (
"'%s' 请配置对应的导出模板字段。"
% self.__class__.__name__
)
# 导出模板
if request.method == 'GET':
# 示例数据
return SuccessResponse(
export_excel_save_model(request, self.import_field_data.values(), [], '导入用户数据模板.xls'))
updateSupport = request.data.get('updateSupport')
# 从excel中组织对应的数据结构然后使用序列化器保存
data = excel_to_data(request.data.get('file_url'), self.import_field_data)
unique_list = [ele.attname for ele in self.get_queryset().model._meta.get_fields() if
hasattr(ele, 'unique') and ele.unique == True]
for ele in data:
# 获取 unique 字段
filter_dic = {i: ele.get(i) for i in list(set(self.import_field_data.keys()) & set(unique_list))}
instance = self.get_queryset().filter(**filter_dic).first()
if instance and not updateSupport:
continue
if not filter_dic:
instance = None
serializer = self.import_serializer_class(instance, data=ele)
serializer.is_valid(raise_exception=True)
serializer.save()
return SuccessResponse(msg=f"导入成功!")
class ExportSerializerMixin:
"""
自定义导出功能
"""
# 导出字段
export_field_data = []
# 导出序列化器
export_serializer_class = None
def export(self, request: Request, *args, **kwargs):
"""
导出功能
:param request:
:param args:
:param kwargs:
:return:
"""
assert self.export_field_data, (
"'%s' 请配置对应的导出模板字段。"
% self.__class__.__name__
)
data = self.export_serializer_class(self.get_queryset(), many=True).data
return SuccessResponse(export_excel_save_model(request, self.export_field_data, data,
f'导出{get_verbose_name(self.get_queryset())}.xls'))

View File

@ -27,6 +27,7 @@ class CoreModel(models.Model):
creator = models.ForeignKey(to='permission.UserProfile', related_query_name='creator_query', null=True,
verbose_name='创建者', on_delete=SET_NULL, db_constraint=False) # 创建者
modifier = ModifierCharField() # 修改者
dept_belong_id = models.CharField(max_length=64, verbose_name="数据归属部门", null=True, blank=True)
update_datetime = UpdateDateTimeField() # 修改时间
create_datetime = CreateDateTimeField() # 创建时间

View File

@ -15,6 +15,8 @@ class CustomModelSerializer(ModelSerializer):
modifier_field_name = 'modifier'
# 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖
creator_field_name = 'creator'
# 数据所属部门字段
dept_belong_id_field_name = 'dept_belong_id'
# 添加默认时间返回格式
create_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
@ -33,6 +35,8 @@ class CustomModelSerializer(ModelSerializer):
validated_data[self.modifier_field_name] = username
if self.creator_field_name in self.fields.fields:
validated_data[self.creator_field_name] = self.request.user
if self.dept_belong_id_field_name in self.fields.fields:
validated_data[self.dept_belong_id_field_name] = getattr(self.request.user,'dept_id',None)
return super().create(validated_data)
def update(self, instance, validated_data):

View File

@ -0,0 +1,101 @@
import logging
import traceback
from types import FunctionType, MethodType
from rest_framework.exceptions import APIException as DRFAPIException
from rest_framework.request import Request
from rest_framework.views import APIView
from ..utils import exceptions
from ..utils.model_util import ModelRelateUtils
from .logging.view_logger import CustomerRelationshipViewLogger
from .response import SuccessResponse, ErrorResponse
from .serializers import CustomModelSerializer
logger = logging.getLogger(__name__)
def op_exception_handler(ex, context):
"""
统一异常拦截处理
目的:(1)取消所有的500异常响应,统一响应为标准错误返回
(2)准确显示错误信息
:param ex:
:param context:
:return:
"""
msg = ''
if isinstance(ex, DRFAPIException):
# set_rollback()
msg = ex.detail
elif isinstance(ex, exceptions.APIException):
msg = ex.message
elif isinstance(ex, Exception):
logger.error(traceback.format_exc())
msg = str(ex)
return ErrorResponse(msg=msg)
class CustomAPIView(APIView):
"""
继承增强DRF的APIView
"""
extra_permission_classes = ()
# 仅当GET方法时会触发该权限的校验
GET_permission_classes = ()
# 仅当POST方法时会触发该权限的校验
POST_permission_classes = ()
# 仅当DELETE方法时会触发该权限的校验
DELETE_permission_classes = ()
# 仅当PUT方法时会触发该权限的校验
PUT_permission_classes = ()
view_logger_classes = ()
def initial(self, request: Request, *args, **kwargs):
super().initial(request, *args, **kwargs)
self.check_extra_permissions(request)
self.check_method_extra_permissions(request)
def get_view_loggers(self, request: Request, *args, **kwargs):
logger_classes = self.view_logger_classes or []
if not logger_classes:
return []
view_loggers = [logger_class(view=self, request=request, *args, **kwargs) for logger_class in logger_classes]
return view_loggers
def handle_logging(self, request: Request, *args, **kwargs):
view_loggers = self.get_view_loggers(request, *args, **kwargs)
method = request.method.lower()
for view_logger in view_loggers:
view_logger.handle(request, *args, **kwargs)
logger_fun = getattr(view_logger, f'handle_{method}', f'handle_other')
if logger_fun and isinstance(logger_fun, (FunctionType, MethodType)):
logger_fun(request, *args, **kwargs)
def get_extra_permissions(self):
return [permission() for permission in self.extra_permission_classes]
def check_extra_permissions(self, request: Request):
for permission in self.get_extra_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
def get_method_extra_permissions(self):
_name = self.request.method.upper()
method_extra_permission_classes = getattr(self, f"{_name}_permission_classes", None)
if not method_extra_permission_classes:
return []
return [permission() for permission in method_extra_permission_classes]
def check_method_extra_permissions(self, request):
for permission in self.get_method_extra_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)

View File

@ -11,7 +11,7 @@ from rest_framework.request import Request
from rest_framework.settings import api_settings
from rest_framework.viewsets import ViewSetMixin
from utils.exceptions import APIException
from ..utils.exceptions import APIException
from . import mixins
from .filters import MongoSearchFilter, MongoOrderingFilter, AdvancedSearchFilter, MongoAdvancedSearchFilter
from .generics import GenericAPIView
@ -201,7 +201,9 @@ class MongoModelViewSet(mixins.CreateModelMixin,
pass
class CustomModelViewSet(ModelViewSet, mixins.TableSerializerMixin):
class CustomModelViewSet(ModelViewSet, mixins.TableSerializerMixin,
mixins.ImportSerializerMixin,
mixins.ExportSerializerMixin):
"""
自定义的ModelViewSet:
(1)默认分页器就为统一分页器op_drf.pagination.Pagination

View File

@ -2,5 +2,5 @@ from django.apps import AppConfig
class PermissionConfig(AppConfig):
name = 'system'
name = 'apps.vadmin.permission'
verbose_name = "权限管理"

View File

@ -1,12 +1,13 @@
import django_filters
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
from ..permission.models import Menu, Dept, Post, Role, UserProfile
class MenuFilter(django_filters.rest_framework.FilterSet):
"""
菜单管理 简单序过滤器
"""
name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Menu
@ -17,6 +18,7 @@ class DeptFilter(django_filters.rest_framework.FilterSet):
"""
部门管理 简单序过滤器
"""
deptName = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Dept
@ -27,6 +29,7 @@ class PostFilter(django_filters.rest_framework.FilterSet):
"""
岗位管理 简单序过滤器
"""
postName = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Post
@ -37,6 +40,7 @@ class RoleFilter(django_filters.rest_framework.FilterSet):
"""
角色管理 简单序过滤器
"""
roleName = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Role
@ -47,7 +51,10 @@ class UserProfileFilter(django_filters.rest_framework.FilterSet):
"""
用户管理 简单序过滤器
"""
username = django_filters.CharFilter(lookup_expr='icontains')
mobile = django_filters.CharFilter(lookup_expr='icontains')
deptId = django_filters.CharFilter(field_name='dept__id')
class Meta:
model = UserProfile
exclude = ('secret', 'password',)

View File

@ -0,0 +1,102 @@
import logging
import os
from django.core.management.base import BaseCommand
from django.db import connection
from ....scripts import getSql
logger = logging.getLogger(__name__)
class Command(BaseCommand):
"""
项目初始化命令: python manage.py initialization
"""
def customSql(self, sql_list, model_name, table_name, is_yes):
"""
批量执行sql
:param sql_list:
:param table_name: 表名
:return:
"""
with connection.cursor() as cursor:
num = 0
for ele in table_name.split(','):
cursor.execute("select count(*) from {}".format(ele))
result = cursor.fetchone()
num += result[0]
if num > 0:
while True:
if is_yes is None:
inp = input(f'[{model_name}]模型已初始化完成,继续将清空[{table_name}]表中所有数据,是否继续初始化?【 Y/N 】')
else:
inp = 'Y' if is_yes == True else 'N'
if inp.upper() == 'N':
return False
elif inp.upper() == 'Y':
logger.info(f'正在清空[{table_name}]中数据...')
cursor.execute("SET foreign_key_checks = 0")
for ele in table_name.split(','):
cursor.execute("truncate table {};".format(ele))
cursor.execute("SET foreign_key_checks = 1")
connection.commit()
logger.info(f'清空[{table_name}]中数据{result[0]}')
break
for sql in sql_list:
try:
cursor.execute(sql)
except Exception as e:
print(e)
connection.commit()
return True
def init(self, sql_filename, model_name, table_name, is_yes):
"""
初始化
:param sql_filename: sql存放位置
:param model_name: 模块名
:param table_name: 表名
:return:
"""
logger.info(f'正在初始化[{model_name}]中...')
if self.customSql(getSql(sql_filename), model_name, table_name, is_yes):
logger.info(f'[{model_name}]初始化完成!')
else:
logger.info(f'已取消[{table_name}]初始化')
def add_arguments(self, parser):
parser.add_argument('init_name', nargs='*', type=str, )
parser.add_argument('-y', nargs='*')
parser.add_argument('-Y', nargs='*')
parser.add_argument('-n', nargs='*')
parser.add_argument('-N', nargs='*')
def handle(self, *args, **options):
init_dict = {
'system_dictdata': [os.path.join('system', 'system_dictdata.sql'), '字典管理', 'system_dictdata'],
'system_dictdetails': [os.path.join('system', 'system_dictdetails.sql'), '字典详情', 'system_dictdetails'],
'system_configsettings': [os.path.join('system', 'system_configsettings.sql'), '参数设置',
'system_configsettings'],
'permission_post': [os.path.join('permission', 'permission_post.sql'), '岗位管理', 'permission_post'],
'permission_dept': [os.path.join('permission', 'permission_dept.sql'), '部门管理', 'permission_dept'],
'permission_menu': [os.path.join('permission', 'permission_menu.sql'), '菜单管理', 'permission_menu'],
'permission_role': [os.path.join('permission', 'permission_role.sql'), '角色管理',
','.join(['permission_role', 'permission_role_dept', 'permission_role_menu'])],
'permission_userprofile': [os.path.join('permission', 'permission_userprofile.sql'), '用户管理', ','.join(
['permission_userprofile_groups', 'permission_userprofile', 'permission_userprofile_role',
'permission_userprofile_post'])]
}
init_name = options.get('init_name')
is_yes = None
if isinstance(options.get('y'), list) or isinstance(options.get('Y'), list):
is_yes = True
if isinstance(options.get('n'), list) or isinstance(options.get('N'), list):
is_yes = False
if init_name:
[self.init(*init_dict[ele], is_yes=is_yes) for ele in init_name if ele in init_dict]
else:
for ele in init_dict.values():
self.init(*ele, is_yes=is_yes)

View File

@ -1,7 +1,7 @@
from django.db.models import CASCADE
from django.db.models import CharField, IntegerField, ForeignKey
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class Dept(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, ForeignKey, CharField, CASCADE
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class Menu(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, BooleanField, CharField, TextField
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class Post(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, BooleanField, CharField, TextField, ManyToManyField
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class Role(CoreModel):

View File

@ -3,7 +3,7 @@ from uuid import uuid4
from django.contrib.auth.models import UserManager, AbstractUser
from django.db.models import IntegerField, ForeignKey, CharField, TextField, ManyToManyField, CASCADE
from apps.op_drf.fields import CreateDateTimeField, UpdateDateTimeField
from ...op_drf.fields import CreateDateTimeField, UpdateDateTimeField
class UserProfile(AbstractUser):
@ -24,6 +24,7 @@ class UserProfile(AbstractUser):
post = ManyToManyField(to='Post', verbose_name='关联岗位', db_constraint=False)
role = ManyToManyField(to='Role', verbose_name='关联角色', db_constraint=False)
dept = ForeignKey(to='Dept', verbose_name='归属部门', on_delete=CASCADE, db_constraint=False, null=True, blank=True)
dept_belong_id = CharField(max_length=64, verbose_name="数据归属部门", null=True, blank=True)
create_datetime = CreateDateTimeField()
update_datetime = UpdateDateTimeField()

View File

@ -1,8 +1,10 @@
from rest_framework import serializers
from rest_framework.fields import empty
from rest_framework.validators import UniqueValidator
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
from ..op_drf.serializers import CustomModelSerializer
from ..permission.models import Menu, Dept, Post, Role, UserProfile
from ..system.models import MessagePush
# ================================================= #
@ -212,7 +214,7 @@ class UserProfileSerializer(CustomModelSerializer):
admin = serializers.SerializerMethodField(read_only=True)
deptId = serializers.IntegerField(source='dept.id', read_only=True)
# 未读通知数量
# unread_msg_count = serializers.SerializerMethodField(read_only=True)
unread_msg_count = serializers.SerializerMethodField(read_only=True)
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
@ -220,12 +222,8 @@ class UserProfileSerializer(CustomModelSerializer):
return True
return False
# def get_unread_msg_count(self, obj: UserProfile):
# UserProfile.objects.all()
# role_list = obj.role.all().values_list('admin', flat=True)
# if True in list(set(role_list)):
# return True
# return False
def get_unread_msg_count(self, obj: UserProfile):
return MessagePush.objects.filter(status='2').exclude(user=obj,messagepushuser_message_push__is_read=True).count()
class Meta:
model = UserProfile
@ -288,3 +286,25 @@ class UserProfileCreateUpdateSerializer(CustomModelSerializer):
model = UserProfile
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')
read_only_fields = ('dept',)
class UserProfileImportSerializer(CustomModelSerializer):
def save(self, **kwargs):
data = super().save(**kwargs)
data.set_password(self.initial_data.get('password', None))
data.save()
return data
def run_validation(self, data={}):
# 把excel 数据进行格式转换
if type(data) is dict:
data['role'] = str(data['role']).split(',')
data['post'] = str(data['post']).split(',')
data['gender'] = {'': '0', '': '1', '未知': '2'}.get(data['gender'])
data['is_active'] = {'启用': True, '禁用': False}.get(data['is_active'])
return super().run_validation(data)
class Meta:
model = UserProfile
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')

View File

@ -1,7 +1,7 @@
from django.urls import re_path
from rest_framework.routers import DefaultRouter
from apps.permission.views import MenuModelViewSet, DeptModelViewSet, PostModelViewSet, RoleModelViewSet, \
from ..permission.views import MenuModelViewSet, DeptModelViewSet, PostModelViewSet, RoleModelViewSet, \
UserProfileModelViewSet
router = DefaultRouter()
@ -29,13 +29,16 @@ urlpatterns = [
# 用户自己重置密码
re_path('user/profile/updatePwd/', UserProfileModelViewSet.as_view({'put': 'update_pwd'})),
# 获取、更新用户个人信息
re_path('user/profile/', UserProfileModelViewSet.as_view({'get': 'profile','put': 'put_profile'})),
re_path('user/profile/', UserProfileModelViewSet.as_view({'get': 'profile', 'put': 'put_profile'})),
# 导出用户
re_path('user/export/', UserProfileModelViewSet.as_view({'get': 'export',})),
re_path('user/export/', UserProfileModelViewSet.as_view({'get': 'export', })),
# 导出角色
re_path('role/export/', RoleModelViewSet.as_view({'get': 'export',})),
re_path('role/export/', RoleModelViewSet.as_view({'get': 'export', })),
# 导出岗位
re_path('post/export/', PostModelViewSet.as_view({'get': 'export',})),
re_path('post/export/', PostModelViewSet.as_view({'get': 'export', })),
# 用户导入模板下载及导入
re_path('user/importTemplate/',
UserProfileModelViewSet.as_view({'get': 'importTemplate', 'post': 'importTemplate'})),
]
urlpatterns += router.urls

View File

@ -2,16 +2,18 @@ from django.contrib.auth import authenticate
from rest_framework.request import Request
from rest_framework.views import APIView
from apps.op_drf.viewsets import CustomModelViewSet
from apps.permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter
from apps.permission.models import Role, Menu, Dept, Post, UserProfile
from apps.permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \
from ..op_drf.filters import DataLevelPermissionsFilter
from ..op_drf.viewsets import CustomModelViewSet
from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter
from ..permission.models import Role, Menu, Dept, Post, UserProfile
from ..permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \
MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \
RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \
PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer
from apps.op_drf.filters import DataLevelPermissionsFilter
from utils.export_excel import export_excel_save_model
from utils.response import SuccessResponse, ErrorResponse
PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer, \
UserProfileImportSerializer
from ..system.models import DictDetails
from ..utils.export_excel import export_excel_save_model, excel_to_data
from ..utils.response import SuccessResponse, ErrorResponse
class GetUserProfileView(APIView):
@ -21,7 +23,7 @@ class GetUserProfileView(APIView):
def get(self, request, format=None):
user_dict = UserProfileSerializer(request.user).data
permissions_list = ["*:*:*"] if user_dict.get('admin') else Menu.objects.filter(
permissions_list = ['*:*:*'] if user_dict.get('admin') else Menu.objects.filter(
role__userprofile=request.user).values_list('perms', flat=True)
return SuccessResponse({
'permissions': [ele for ele in permissions_list if ele],
@ -46,25 +48,27 @@ class GetRouters(APIView):
def get(self, request, format=None):
# data = GetUserInfoSerializer(request.user).data
menus = Menu.objects.filter(role__userprofile=request.user).exclude(menuType="2").values('id', 'name',
menus = Menu.objects.filter(role__userprofile=request.user).exclude(menuType='2').values('id', 'name',
'web_path',
'visible', 'status',
'isFrame',
'component_path',
'icon', 'parentId',
'isCache').distinct()
# data = '{"msg":"操作成功","code":200,"data":[{"name":"System","path":"/system","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统管理","icon":"system","noCache":false},"children":[{"name":"User","path":"user","hidden":false,"component":"permission/user/index","meta":{"title":"用户管理","icon":"user","noCache":false}},{"name":"Role","path":"role","hidden":false,"component":"permission/role/index","meta":{"title":"角色管理","icon":"peoples","noCache":false}},{"name":"Menu","path":"menu","hidden":false,"component":"permission/menu/index","meta":{"title":"菜单管理","icon":"tree-table","noCache":false}},{"name":"Dept","path":"dept","hidden":false,"component":"permission/dept/index","meta":{"title":"部门管理","icon":"tree","noCache":false}},{"name":"Post","path":"post","hidden":false,"component":"permission/post/index","meta":{"title":"岗位管理","icon":"post","noCache":false}},{"name":"Dict","path":"dict","hidden":false,"component":"system/dict/index","meta":{"title":"字典管理","icon":"dict","noCache":false}},{"name":"Config","path":"config","hidden":false,"component":"system/config/index","meta":{"title":"参数设置","icon":"edit","noCache":false}},{"name":"Notice","path":"notice","hidden":false,"component":"system/notice/index","meta":{"title":"通知公告","icon":"message","noCache":false}},{"name":"Log","path":"log","hidden":false,"redirect":"noRedirect","component":"ParentView","alwaysShow":true,"meta":{"title":"日志管理","icon":"log","noCache":false},"children":[{"name":"Operlog","path":"operlog","hidden":false,"component":"monitor/operlog/index","meta":{"title":"操作日志","icon":"form","noCache":false}},{"name":"Logininfor","path":"logininfor","hidden":false,"component":"monitor/logininfor/index","meta":{"title":"登录日志","icon":"logininfor","noCache":false}}]}]},{"name":"Monitor","path":"/monitor","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统监控","icon":"monitor","noCache":false},"children":[{"name":"Online","path":"online","hidden":false,"component":"monitor/online/index","meta":{"title":"在线用户","icon":"online","noCache":false}},{"name":"Job","path":"job","hidden":false,"component":"monitor/job/index","meta":{"title":"定时任务","icon":"job","noCache":false}},{"name":"Druid","path":"druid","hidden":false,"component":"monitor/druid/index","meta":{"title":"数据监控","icon":"druid","noCache":false}},{"name":"Server","path":"server","hidden":false,"component":"monitor/server/index","meta":{"title":"服务监控","icon":"server","noCache":false}},{"name":"Cache","path":"cache","hidden":false,"component":"monitor/cache/index","meta":{"title":"缓存监控","icon":"redis","noCache":false}}]},{"name":"Tool","path":"/tool","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统工具","icon":"tool","noCache":false},"children":[{"name":"Build","path":"build","hidden":false,"component":"tool/build/index","meta":{"title":"表单构建","icon":"build","noCache":false}},{"name":"Gen","path":"gen","hidden":false,"component":"tool/gen/index","meta":{"title":"代码生成","icon":"code","noCache":false}},{"name":"Swagger","path":"swagger","hidden":false,"component":"tool/swagger/index","meta":{"title":"系统接口","icon":"swagger","noCache":false}}]},{"name":"Http://ruoyi.vip","path":"http://ruoyi.vip","hidden":false,"component":"Layout","meta":{"title":"若依官网","icon":"guide","noCache":false}}]}'
# data = '{'msg':'操作成功','code':200,'data':[{'name':'System','path':'/system','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统管理','icon':'system','noCache':false},'children':[{'name':'User','path':'user','hidden':false,'component':'permission/user/index','meta':{'title':'用户管理','icon':'user','noCache':false}},{'name':'Role','path':'role','hidden':false,'component':'permission/role/index','meta':{'title':'角色管理','icon':'peoples','noCache':false}},{'name':'Menu','path':'menu','hidden':false,'component':'permission/menu/index','meta':{'title':'菜单管理','icon':'tree-table','noCache':false}},{'name':'Dept','path':'dept','hidden':false,'component':'permission/dept/index','meta':{'title':'部门管理','icon':'tree','noCache':false}},{'name':'Post','path':'post','hidden':false,'component':'permission/post/index','meta':{'title':'岗位管理','icon':'post','noCache':false}},{'name':'Dict','path':'dict','hidden':false,'component':'system/dict/index','meta':{'title':'字典管理','icon':'dict','noCache':false}},{'name':'Config','path':'config','hidden':false,'component':'system/config/index','meta':{'title':'参数设置','icon':'edit','noCache':false}},{'name':'Notice','path':'notice','hidden':false,'component':'system/notice/index','meta':{'title':'通知公告','icon':'message','noCache':false}},{'name':'Log','path':'log','hidden':false,'redirect':'noRedirect','component':'ParentView','alwaysShow':true,'meta':{'title':'日志管理','icon':'log','noCache':false},'children':[{'name':'Operlog','path':'operlog','hidden':false,'component':'monitor/operlog/index','meta':{'title':'操作日志','icon':'form','noCache':false}},{'name':'Logininfor','path':'logininfor','hidden':false,'component':'monitor/logininfor/index','meta':{'title':'登录日志','icon':'logininfor','noCache':false}}]}]},{'name':'Monitor','path':'/monitor','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统监控','icon':'monitor','noCache':false},'children':[{'name':'Online','path':'online','hidden':false,'component':'monitor/online/index','meta':{'title':'在线用户','icon':'online','noCache':false}},{'name':'Job','path':'job','hidden':false,'component':'monitor/job/index','meta':{'title':'定时任务','icon':'job','noCache':false}},{'name':'Druid','path':'druid','hidden':false,'component':'monitor/druid/index','meta':{'title':'数据监控','icon':'druid','noCache':false}},{'name':'Server','path':'server','hidden':false,'component':'monitor/server/index','meta':{'title':'服务监控','icon':'server','noCache':false}},{'name':'Cache','path':'cache','hidden':false,'component':'monitor/cache/index','meta':{'title':'缓存监控','icon':'redis','noCache':false}}]},{'name':'Tool','path':'/tool','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统工具','icon':'tool','noCache':false},'children':[{'name':'Build','path':'build','hidden':false,'component':'tool/build/index','meta':{'title':'表单构建','icon':'build','noCache':false}},{'name':'Gen','path':'gen','hidden':false,'component':'tool/gen/index','meta':{'title':'代码生成','icon':'code','noCache':false}},{'name':'Swagger','path':'swagger','hidden':false,'component':'tool/swagger/index','meta':{'title':'系统接口','icon':'swagger','noCache':false}}]},{'name':'Http://ruoyi.vip','path':'http://ruoyi.vip','hidden':false,'component':'Layout','meta':{'title':'若依官网','icon':'guide','noCache':false}}]}'
# data = json.loads(data)
data = []
sys_show_hide = DictDetails.get_default_dictValue('sys_show_hide')
for ele in menus:
data.append({
'id': ele.get('id'),
'name': ''.join([i.capitalize() for i in ele.get('web_path', '').split('/')]),
'name': ele.get('web_path', '').split('/')[-1] and ele.get('web_path', '').split('/')[-1].capitalize(),
'path': ele.get('web_path'),
'hidden': True if ele.get('visible') != '1' else False,
'redirect': ele.get('web_path') if ele.get('isFrame') == '1' else 'noRedirect',
'component': ele.get('component_path') or 'Layout',
'meta': {"title": ele.get('name'), "icon": ele.get('icon'), "noCache": ele.get('isCache')},
'meta': {'title': ele.get('name'), 'icon': ele.get('icon'),
'noCache': True if ele.get('isCache') == sys_show_hide else False},
'parentId': ele.get('parentId')
})
return SuccessResponse(data)
@ -252,6 +256,15 @@ class UserProfileModelViewSet(CustomModelViewSet):
update_serializer_class = UserProfileCreateUpdateSerializer
filter_class = UserProfileFilter
extra_filter_backends = [DataLevelPermissionsFilter]
# 导出
export_serializer_class = ExportUserProfileSerializer
export_field_data = ['用户序号', '登录名称', '用户名称', '用户邮箱', '手机号码', '用户性别', '帐号状态', '最后登录时间', '部门名称', '部门负责人']
# 导入
import_serializer_class = UserProfileImportSerializer
import_field_data = {'username': '登录账号', 'name': '用户名称', 'email': '用户邮箱', 'mobile': '手机号码',
'gender': '用户性别(男/女/未知)',
'is_active': '帐号状态(启用/禁用)', 'password': '登录密码', 'dept': '部门ID', 'role': '角色ID',
'post': '岗位ID'}
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
@ -364,15 +377,3 @@ class UserProfileModelViewSet(CustomModelViewSet):
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def export(self, request: Request, *args, **kwargs):
"""
导出用户
:param request:
:param args:
:param kwargs:
:return:
"""
field_data = ['用户序号', '登录名称', '用户名称', '用户邮箱', '手机号码', '用户性别', '帐号状态', '最后登录时间', '部门名称', '部门负责人']
data = ExportUserProfileSerializer(UserProfile.objects.all(), many=True).data
return SuccessResponse(export_excel_save_model(request, field_data, data, '导出用户数据.xls'))

View File

@ -7,7 +7,8 @@ def getSql(filename):
:param filename: 例如os.path.join('permission','permission_dept.sql')
:return:
"""
pwd = os.path.join(os.getcwd(), 'scripts', filename)
abspath = os.path.abspath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
pwd = os.path.join(abspath, 'scripts', filename)
with open(pwd,'rb') as fp:
content = fp.read().decode('utf8')
return [ele for ele in content.split('\n') if not ele.startswith('--') and ele]
return [ele for ele in content.split('\n') if not ele.startswith('--') and ele.strip(' ')]

View File

@ -0,0 +1,42 @@
-- ----------------------------
-- 部门管理 初始化sql
-- Table structure for permission_dept
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_dept`;
-- CREATE TABLE `permission_dept` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `deptName` varchar(64) NOT NULL,
-- `orderNum` int(11) NOT NULL,
-- `owner` varchar(32) DEFAULT NULL,
-- `phone` varchar(32) DEFAULT NULL,
-- `email` varchar(32) DEFAULT NULL,
-- `status` varchar(8) DEFAULT NULL,
-- `parentId_id` int(11) DEFAULT NULL,
-- PRIMARY KEY (`id`),
-- KEY `permission_dept_parentId_id_43a4fd49` (`parentId_id`) USING BTREE
-- ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_dept
-- ----------------------------
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 07:26:20.518695', '2021-02-27 15:18:39.000000', 'XX创新科技', 1, NULL, '15888888888', 'cxkj@qq.com', '1', 1,NULL, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 07:25:09.041807', '2021-02-27 07:25:09.041853', '北京总公司', 1, NULL, NULL, NULL, '1', 1, 1, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (3, '', 'admin', '2021-02-27 07:26:14.418894', '2021-02-27 07:25:25.195849', '上海分公司', 2, NULL, NULL, NULL, '1', 1, 1, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (4, '', 'admin', '2021-02-27 07:26:01.993095', '2021-02-27 07:25:38.904644', '杭州分公司', 4, NULL, NULL, NULL, '1', 1, 1, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (5, '', 'admin', '2021-02-27 07:28:15.854856', '2021-02-27 07:25:54.379081', '深圳分公司', 3, NULL, NULL, NULL, '0', 1, 1, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (6, '', 'admin', '2021-02-27 07:26:37.589741', '2021-02-27 07:26:37.589780', '研发部门', 1, NULL, NULL, NULL, '1', 1, 2, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (7, '', 'admin', '2021-02-27 07:26:47.781467', '2021-02-27 07:26:47.781511', '市场部门', 2, NULL, NULL, NULL, '1', 1, 2, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (8, '', 'admin', '2021-02-27 07:26:57.059878', '2021-02-27 07:26:57.059923', '测试部门', 3, NULL, NULL, NULL, '1', 1, 2, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (9, '', 'admin', '2021-02-27 07:27:06.088134', '2021-02-27 07:27:06.088178', '财务部门', 4, NULL, NULL, NULL, '1', 1, 2, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (10, '', 'admin', '2021-02-27 07:27:15.287731', '2021-02-27 07:27:15.287772', '运维部门', 5, NULL, NULL, NULL, '1', 1, 2, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (11, '', 'admin', '2021-02-27 07:27:24.834369', '2021-02-27 07:27:24.834413', '市场部门', 1, NULL, NULL, NULL, '1', 1, 3, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (12, '', 'admin', '2021-02-27 07:27:34.161898', '2021-02-27 07:27:34.161944', '财务部门', 2, NULL, NULL, NULL, '1', 1, 3, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (13, '', 'admin', '2021-02-27 07:28:20.474025', '2021-02-27 07:27:47.938676', '市场部门', 1, NULL, NULL, NULL, '0', 1, 5, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (14, '', 'admin', '2021-02-27 07:28:23.394188', '2021-02-27 07:27:53.794331', '财务部门', 2, NULL, NULL, NULL, '0', 1, 5, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (15, '', 'admin', '2021-02-27 07:28:03.368497', '2021-02-27 07:28:03.368540', '市场部门', 1, NULL, NULL, NULL, '1', 1, 4, 1);
INSERT INTO `permission_dept` (id, description, modifier, update_datetime, create_datetime, deptName, orderNum, owner, phone, email, status, creator_id, parentId_id, dept_belong_id) VALUES (16, '', 'admin', '2021-02-27 07:28:10.532392', '2021-02-27 07:28:10.532436', '财务部门', 2, NULL, NULL, NULL, '1', 1, 4, 1);

View File

@ -0,0 +1,121 @@
-- ----------------------------
-- 菜单管理初始化sql
-- Table structure for permission_menu
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_menu`;
-- CREATE TABLE `permission_menu` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `menuType` varchar(8) NOT NULL,
-- `icon` varchar(64) DEFAULT NULL,
-- `name` varchar(64) NOT NULL,
-- `orderNum` int(11) NOT NULL,
-- `isFrame` varchar(8) NOT NULL,
-- `web_path` varchar(128) DEFAULT NULL,
-- `component_path` varchar(128) DEFAULT NULL,
-- `interface_path` varchar(256) DEFAULT NULL,
-- `interface_method` varchar(16) NOT NULL,
-- `perms` varchar(256) DEFAULT NULL,
-- `status` varchar(8) NOT NULL,
-- `visible` varchar(8) NOT NULL,
-- `isCache` varchar(8) NOT NULL,
-- `parentId_id` int(11) DEFAULT NULL,
-- PRIMARY KEY (`id`),
-- KEY `permission_menu_parentId_id_df49c7ef_fk_permission_menu_id` (`parentId_id`),
-- CONSTRAINT `permission_menu_parentId_id_df49c7ef_fk_permission_menu_id` FOREIGN KEY (`parentId_id`) REFERENCES `permission_menu` (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_menu
-- ----------------------------
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 07:50:00.410101', '2021-02-27 07:41:28.660364', '0', 'system', '系统管理', 1, '1', '/system', '', '', 'GET', NULL, '1', '1', '1', 1, NULL, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 07:51:14.500722', '2021-02-27 07:51:14.500768', '0', 'peoples', '权限管理', 2, '1', '/permission', '', '', 'GET', NULL, '1', '1', '1', 1, NULL, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (3, '', 'admin', '2021-03-16 14:50:55.740451', '2021-02-27 07:54:38.630670', '1', 'dict', '字典管理', 1, '1', 'dict', 'vadmin/system/dict/index', '', 'GET', '', '1', '1', '1', 1, 1, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (4, '', 'admin', '2021-03-16 14:51:07.813189', '2021-02-27 08:06:51.019173', '1', 'edit', '参数管理', 2, '1', '/system/config', 'vadmin/system/config/index', '', 'GET', '', '1', '1', '1', 1, 1, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (5, '', 'admin', '2021-03-16 14:51:36.950198', '2021-02-27 08:25:37.339270', '1', 'post', '岗位管理', 1, '1', '/permission/post', 'vadmin/permission/post/index', '', 'GET', '', '1', '1', '1', 1, 2, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (6, '', 'admin', '2021-03-16 14:52:06.412883', '2021-02-27 08:26:48.454553', '1', 'tree', '部门管理', 2, '1', '/permission/dept', 'vadmin/permission/dept/index', '', 'GET', '', '1', '1', '1', 1, 2, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (7, '', 'admin', '2021-03-16 14:52:12.835100', '2021-02-27 08:28:20.411164', '1', 'tree-table', '菜单管理', 3, '1', '/permission/menu', 'vadmin/permission/menu/index', '', 'GET', '', '1', '1', '0', 1, 2, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (8, '', 'admin', '2021-03-16 14:52:31.046775', '2021-02-27 08:29:30.153361', '1', 'peoples', '角色管理', 4, '1', '/permission/role', 'vadmin/permission/role/index', '', 'GET', '', '1', '1', '1', 1, 2, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (9, '', 'admin', '2021-03-16 14:52:39.106512', '2021-02-27 08:30:14.030888', '1', 'user', '用户管理', 5, '1', '/permission/user', 'vadmin/permission/user/index', '', 'GET', '', '1', '1', '1', 1, 2, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (10, '', 'admin', '2021-02-27 08:37:24.948235', '2021-02-27 08:36:04.824117', '0', 'guide', 'dvAdmin官网', 9, '0', 'https://django-vue-admin.com', '', NULL, 'GET', NULL, '1', '1', '1', 1, NULL, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (11, '', 'admin', '2021-03-16 14:51:15.042512', '2021-02-27 16:17:36.685174', '1', 'job', '文件管理', 3, '1', '/system/savefile', 'vadmin/system/savefile/index', '', 'GET', '', '1', '1', '1', 1, 1, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (13, '', 'admin', '2021-03-03 14:41:08.227821', '2021-03-03 14:18:52.530449', '2', NULL, '用户新增', 1, '1', NULL, NULL, '/admin/permission/user/', 'POST', 'permission:user:post', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (14, '', 'admin', '2021-03-03 14:43:34.207938', '2021-03-03 14:43:34.208093', '2', NULL, '用户修改', 2, '1', NULL, NULL, '/admin/permission/user/{id}/', 'PUT', 'permission:user:{id}:put', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (15, '', 'admin', '2021-03-03 14:44:58.006289', '2021-03-03 14:44:58.006338', '2', NULL, '用户删除', 3, '1', '', NULL, '/admin/permission/user/{id}/', 'DELETE', 'permission:user:{id}:delete', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (16, '', 'admin', '2021-03-03 14:45:50.575443', '2021-03-03 14:45:50.575507', '2', NULL, '用户导出', 4, '1', NULL, NULL, '/admin/permission/user/export/', 'GET', 'permission:user:export:get', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (17, '', 'admin', '2021-03-03 14:51:14.157310', '2021-03-03 14:51:14.157447', '2', NULL, '用户导入', 5, '1', NULL, NULL, '/admin/permission/user/import/', 'POST', 'permission:user:import:post', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (18, '', 'admin', '2021-03-03 14:51:51.220886', '2021-03-03 14:51:51.220933', '2', NULL, '重置密码', 6, '1', NULL, NULL, '/admin/permission/user/resetPwd/', 'PUT', 'permission:user:resetpwd:put', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (19, '', 'admin', '2021-03-03 14:53:47.877063', '2021-03-03 14:53:47.877116', '2', NULL, '角色新增', 1, '1', NULL, NULL, '/admin/permission/role/', 'POST', 'permission:role:post', '1', '1', '1', 1, 8, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (20, '', 'admin', '2021-03-03 14:54:28.794968', '2021-03-03 14:54:28.795015', '2', NULL, '角色修改', 2, '1', NULL, NULL, '/admin/permission/role/{id}/', 'PUT', 'permission:role:{id}:put', '1', '1', '1', 1, 8, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (21, '', 'admin', '2021-03-03 14:58:00.798718', '2021-03-03 14:58:00.798813', '2', NULL, '删除角色', 3, '1', NULL, NULL, '/admin/permission/role/{id}/', 'DELETE', 'permission:role:{id}:delete', '1', '1', '1', 1, 8, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (22, '', 'admin', '2021-03-03 14:58:28.940577', '2021-03-03 14:58:28.940625', '2', NULL, '角色导出', 4, '1', NULL, NULL, '/admin/permission/role/export/', 'GET', 'permission:role:export:get', '1', '1', '1', 1, 8, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (23, '', 'admin', '2021-03-03 15:00:41.081771', '2021-03-03 15:00:41.081832', '2', NULL, '菜单新增', 1, '1', NULL, NULL, '/admin/permission/menus/', 'POST', 'permission:menus:post', '1', '1', '1', 1, 7, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (24, '', 'admin', '2021-03-03 15:01:03.178824', '2021-03-03 15:01:03.178874', '2', NULL, '菜单修改', 2, '1', NULL, NULL, '/admin/permission/menus/{id}/', 'PUT', 'permission:menus:{id}:put', '1', '1', '1', 1, 7, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (25, '', 'admin', '2021-03-03 15:02:56.123525', '2021-03-03 15:02:56.123571', '2', NULL, '菜单删除', 3, '1', NULL, NULL, '/admin/permission/menus/{id}/', 'DELETE', 'permission:menus:{id}:delete', '1', '1', '1', 1, 7, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (26, '', 'admin', '2021-03-03 15:04:35.191774', '2021-03-03 15:04:35.191856', '2', NULL, '部门新增', 1, '1', NULL, NULL, '/admin/permission/dept/', 'POST', 'permission:dept:post', '1', '1', '1', 1, 6, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (27, '', 'admin', '2021-03-03 15:04:56.963168', '2021-03-03 15:04:56.963214', '2', NULL, '部门修改', 2, '1', NULL, NULL, '/admin/permission/dept/{id}/', 'PUT', 'permission:dept:{id}:put', '1', '1', '1', 1, 6, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (28, '', 'admin', '2021-03-03 15:05:39.602577', '2021-03-03 15:05:39.602622', '2', NULL, '部门删除', 3, '1', NULL, NULL, '/admin/permission/dept/{id}/', 'DELETE', 'permission:dept:{id}:delete', '1', '1', '1', 1, 6, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (29, '', 'admin', '2021-03-03 15:06:50.095341', '2021-03-03 15:06:50.095388', '2', NULL, '岗位新增', 1, '1', NULL, NULL, '/admin/permission/post/', 'POST', 'permission:post:post', '1', '1', '1', 1, 5, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (30, '', 'admin', '2021-03-03 15:07:36.013313', '2021-03-03 15:07:36.013358', '2', NULL, '岗位修改', 2, '1', NULL, NULL, '/admin/permission/post/{id}/', 'PUT', 'permission:post:{id}:put', '1', '1', '1', 1, 5, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (31, '', 'admin', '2021-03-03 15:08:10.371530', '2021-03-03 15:08:10.371575', '2', NULL, '岗位删除', 3, '1', NULL, NULL, '/admin/permission/post/{id}/', 'DELETE', 'permission:post:{id}:delete', '1', '1', '1', 1, 5, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (32, '', 'admin', '2021-03-03 15:09:02.213084', '2021-03-03 15:09:02.213131', '2', NULL, '岗位导出', 4, '1', NULL, NULL, '/admin/permission/post/export/', 'GET', 'permission:post:export:get', '1', '1', '1', 1, 5, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (33, '', 'admin', '2021-03-03 15:11:37.616329', '2021-03-03 15:11:37.616415', '2', NULL, '字典新增', 1, '1', NULL, NULL, '/admin/system/dict/type/', 'POST', 'system:dict:type:post', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (34, '', 'admin', '2021-03-03 15:12:47.237658', '2021-03-03 15:12:47.237713', '2', NULL, '字典修改', 2, '1', NULL, NULL, '/admin/system/dict/type/{id}/', 'PUT', 'system:dict:type:{id}:put', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (35, '', 'admin', '2021-03-03 15:13:40.185174', '2021-03-03 15:13:40.185230', '2', NULL, '字典删除', 3, '1', NULL, NULL, '/admin/system/dict/type/{id}/', 'DELETE', 'system:dict:type:{id}:delete', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (36, '', 'admin', '2021-03-03 15:15:12.950584', '2021-03-03 15:15:12.950684', '2', NULL, '字典导出', 4, '1', NULL, NULL, '/admin/system/dict/type/export/', 'GET', 'system:dict:type:export:get', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (37, '', 'admin', '2021-03-03 15:16:54.709780', '2021-03-03 15:16:20.868146', '2', NULL, '清理缓存', 5, '1', NULL, NULL, '/admin/system/dict/type/clearCache/', 'DELETE', 'system:dict:type:clearcache:delete', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (38, '', 'admin', '2021-03-03 15:17:54.232085', '2021-03-03 15:17:54.232166', '2', NULL, '参数新增', 1, '1', NULL, NULL, '/admin/system/config/', 'POST', 'system:config:post', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (39, '', 'admin', '2021-03-03 15:18:37.088187', '2021-03-03 15:18:37.088237', '2', NULL, '参数修改', 2, '1', NULL, NULL, '/admin/system/config/{id}/', 'PUT', 'system:config:{id}:put', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (40, '', 'admin', '2021-03-03 15:19:05.532556', '2021-03-03 15:19:05.532616', '2', NULL, '参数删除', 3, '1', NULL, NULL, '/admin/system/config/{id}/', 'DELETE', 'system:config:{id}:delete', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (41, '', 'admin', '2021-03-03 15:19:49.576174', '2021-03-03 15:19:49.576221', '2', NULL, '参数导出', 4, '1', NULL, NULL, '/admin/system/config/export/', 'GET', 'system:config:export:get', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (42, '', 'admin', '2021-03-03 15:21:20.098250', '2021-03-03 15:21:20.098345', '2', NULL, '清理缓存', 5, '1', NULL, NULL, '/admin/system/config/clearCache/', 'DELETE', 'system:config:clearcache:delete', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (43, '', 'admin', '2021-03-03 15:22:48.492613', '2021-03-03 15:22:48.492666', '2', NULL, '文件上传', 1, '1', NULL, NULL, '/admin/system/savefile/', 'POST', 'system:savefile:post', '1', '1', '1', 1, 11, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (44, '', 'admin', '2021-03-03 15:23:58.219105', '2021-03-03 15:23:58.219155', '2', NULL, '文件删除', 2, '1', NULL, NULL, '/admin/system/savefile/{id}/', 'DELETE', 'system:savefile:{id}:delete', '1', '1', '1', 1, 11, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (45, '', 'admin', '2021-03-03 15:25:15.224971', '2021-03-03 15:25:15.225018', '2', NULL, '清理废弃文件', 3, '1', NULL, NULL, '/admin/system/clearsavefile/', 'POST', 'system:clearsavefile:post', '1', '1', '1', 1, 11, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (46, '', 'admin', '2021-03-03 15:28:30.061632', '2021-03-03 15:27:19.945663', '2', NULL, '文件下载', 4, '1', NULL, NULL, NULL, 'GET', 'system:clearsavefile:download:post', '1', '1', '1', 1, 11, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (47, '', 'admin', '2021-03-16 14:51:22.015400', '2021-03-07 14:32:06.754815', '1', 'message', '通知公告', 4, '1', 'system/message', 'vadmin/system/message/index', '', 'GET', '', '1', '1', '1', 1, 1, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (48, '', 'admin', '2021-03-07 14:35:06.718432', '2021-03-07 14:35:06.718463', '2', NULL, '发布公告', 1, '1', NULL, NULL, '/admin/system/message/', 'POST', 'system:message:post', '1', '1', '1', 1, 47, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (49, '', 'admin', '2021-03-08 13:04:32.158707', '2021-03-07 14:36:47.675837', '2', NULL, '修改公告', 2, '1', NULL, NULL, '/admin/system/message/{id}/', 'PUT', 'system:message:{id}:put', '1', '1', '1', 1, 47, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (50, '', 'admin', '2021-03-08 13:04:58.206693', '2021-03-07 14:37:52.130567', '2', NULL, '删除公告', 3, '1', NULL, NULL, '/admin/permission/menu/{id}/', 'DELETE', 'permission:menu:{id}:delete', '1', '1', '1', 1, 47, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (51, '', 'admin', '2021-03-07 14:42:37.410336', '2021-03-07 14:42:37.410366', '2', NULL, '公告导出', 4, '1', NULL, NULL, '/admin/system/message/export/', 'GET', 'system:message:export:get', '1', '1', '1', 1, 47, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (52, '', 'admin', '2021-03-09 17:19:13.828166', '2021-03-09 17:18:14.976783', '2', NULL, '字典查询', 0, '1', NULL, NULL, '/admin/system/dict/type/', 'GET', 'system:dict:type:get', '1', '1', '1', 1, 3, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (53, '', 'admin', '2021-03-09 17:19:46.963317', '2021-03-09 17:19:33.953559', '2', NULL, '参数查询', 0, '1', NULL, NULL, '/admin/system/config/', 'GET', 'system:config:get', '1', '1', '1', 1, 4, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (54, '', 'admin', '2021-03-09 17:20:14.749627', '2021-03-09 17:20:02.783389', '2', NULL, '文件查询', 0, '1', NULL, NULL, '/admin/system/savefile/', 'GET', 'system:savefile:get', '1', '1', '1', 1, 11, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (55, '', 'admin', '2021-03-09 17:20:44.604824', '2021-03-09 17:20:36.025364', '2', NULL, '公告查询', 0, '1', NULL, NULL, '/admin/system/message/', 'GET', 'system:message:get', '1', '1', '1', 1, 47, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (56, '', 'admin', '2021-03-09 17:21:06.429585', '2021-03-09 17:21:06.429629', '2', NULL, '岗位查询', 0, '1', NULL, NULL, '/admin/permission/post/', 'GET', 'permission:post:get', '1', '1', '1', 1, 5, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (57, '', 'admin', '2021-03-09 17:21:29.013165', '2021-03-09 17:21:29.013210', '2', NULL, '部门查询', 0, '1', NULL, NULL, '/admin/permission/dept/', 'GET', 'permission:dept:get', '1', '1', '1', 1, 6, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (58, '', 'admin', '2021-03-09 17:21:56.243957', '2021-03-09 17:21:47.358360', '2', NULL, '菜单查询', 0, '1', NULL, NULL, '/admin/permission/menus/', 'GET', 'permission:menus:get', '1', '1', '1', 1, 7, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (59, '', 'admin', '2021-03-09 17:22:20.140143', '2021-03-09 17:22:20.140189', '2', NULL, '角色查询', 0, '1', '', NULL, '/admin/permission/role/', 'GET', 'permission:role:get', '1', '1', '1', 1, 8, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (60, '', 'admin', '2021-03-09 17:22:38.595706', '2021-03-09 17:22:38.595751', '2', NULL, '用户查询', 0, '1', NULL, NULL, '/admin/permission/user/', 'GET', 'permission:user:get', '1', '1', '1', 1, 9, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (61, '', 'admin', '2021-03-21 11:34:17.635680', '2021-03-16 13:34:04.148728', '0', 'log', '日志管理', 5, '1', 'log', 'ParentView', NULL, 'GET', NULL, '1', '1', '1', 1, 1, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (62, '', 'admin', '2021-03-16 15:09:30.396752', '2021-03-16 13:36:00.114652', '1', 'logininfor', '登录日志', 1, '1', 'logininfor', 'vadmin/monitor/logininfor/index', '', 'GET', '', '1', '1', '1', 1, 61, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (63, '', 'admin', '2021-03-16 15:09:38.015636', '2021-03-16 14:28:10.395273', '1', 'log', '操作日志', 2, '1', 'operlog', 'vadmin/monitor/operlog/index', '', 'GET', '', '1', '1', '1', 1, 61, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (64, '', 'admin', '2021-03-16 14:31:27.618230', '2021-03-16 14:31:01.026470', '2', NULL, '登录日志查询', 1, '1', NULL, NULL, '/admin/system/logininfor/', 'GET', 'admin:system:logininfor:get', '1', '1', '1', 1, 62, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (65, '', 'admin', '2021-03-16 14:31:44.112525', '2021-03-16 14:31:44.112572', '2', NULL, '操作日志查询', 1, '1', NULL, NULL, '/admin/system/operlog/', 'GET', 'admin:system:operlog:get', '1', '1', '1', 1, 63, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (66, '', 'admin', '2021-03-16 14:33:05.482942', '2021-03-16 14:33:05.483003', '0', 'monitor', '系统监控', 3, '1', 'monitor', NULL, NULL, 'GET', NULL, '1', '1', '1', 1, NULL, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (67, '', 'admin', '2021-03-16 14:49:59.260322', '2021-03-16 14:34:59.165065', '1', 'online', '在线用户', 1, '1', 'online', 'vadmin/monitor/online/index', '', 'GET', '', '1', '1', '1', 1, 66, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (68, '', 'admin', '2021-03-16 14:36:00.989981', '2021-03-16 14:35:50.894454', '2', NULL, '在线用户查询', 1, '1', NULL, NULL, '/admin/monitor/online/', 'GET', 'admin:monitor:online:get', '1', '1', '1', 1, 67, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (69, '', 'admin', '2021-03-16 14:37:10.577186', '2021-03-16 14:37:10.577231', '2', NULL, '用户强退', 2, '1', NULL, NULL, '/admin/monitor/online/{id}/', 'PUT', 'admin:monitor:online:{id}:put', '1', '1', '1', 1, 67, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (70, '', 'admin', '2021-03-16 15:04:21.404578', '2021-03-16 14:45:51.507961', '1', 'job', '定时任务', 2, '1', 'celery', 'vadmin/monitor/celery/index', '', 'GET', NULL, '1', '1', '1', 1, 66, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (71, '', 'admin', '2021-03-16 15:04:11.799260', '2021-03-16 14:59:53.619219', '2', NULL, '任务查询', 1, '1', NULL, NULL, '/admin/monitor/celery/', 'GET', 'admin:monitor:celery:get', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (72, '', 'admin', '2021-03-16 15:04:06.645135', '2021-03-16 15:00:21.809600', '2', NULL, '任务新增', 2, '1', NULL, NULL, '/admin/monitor/celery/', 'POST', 'admin:monitor:celery:post', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (73, '', 'admin', '2021-03-16 15:04:00.041701', '2021-03-16 15:00:45.994228', '2', NULL, '任务修改', 3, '1', NULL, NULL, '/admin/monitor/celery/{id}/', 'PUT', 'admin:monitor:celery:{id}:put', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (74, '', 'admin', '2021-03-16 15:03:54.891216', '2021-03-16 15:01:19.624182', '2', NULL, '任务删除', 4, '1', NULL, NULL, '/admin/monitor/celery/{id}/', 'DELETE', 'admin:monitor:celery:{id}:delete', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (75, '', 'admin', '2021-03-16 15:07:03.505007', '2021-03-16 15:03:35.796596', '2', NULL, '任务单次执行', 6, '1', NULL, NULL, '/admin/monitor/celery/run/', 'PUT', 'admin:monitor:celery:run:put', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (76, '', 'admin', '2021-03-16 15:08:09.768588', '2021-03-16 15:07:45.064547', '2', NULL, '任务导出', 5, '1', NULL, NULL, '/admin/monitor/celery/export/', 'GET', 'admin:monitor:celery:export:get', '1', '1', '1', 1, 70, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (77, '', 'admin', '2021-03-16 15:09:09.928480', '2021-03-16 15:08:46.299829', '2', NULL, '登录日志导出', 2, '1', NULL, NULL, '/admin/system/logininfor/export/', 'GET', 'admin:system:logininfor:export:get', '1', '1', '1', 1, 62, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (78, '', 'admin', '2021-03-16 15:09:59.500271', '2021-03-16 15:09:59.500333', '2', NULL, '操作日志导出', 2, '1', NULL, NULL, '/admin/system/operlog/export/', 'GET', 'admin:system:operlog:export:get', '1', '1', '1', 1, 63, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (79, '', 'admin', '2021-03-16 15:13:41.377208', '2021-03-16 15:11:05.675729', '1', 'job', '定时日志', 3, '1', 'celerylog', 'vadmin/monitor/celerylog/index', NULL, 'GET', NULL, '1', '1', '1', 1, 61, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (80, '', 'admin', '2021-03-16 15:16:29.349992', '2021-03-16 15:12:19.707979', '2', NULL, '定时日志查询', 1, '1', NULL, NULL, '/admin/monitor/celerylog/', 'GET', 'admin:monitor:celerylog:get', '1', '1', '1', 1, 79, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (81, '', 'admin', '2021-03-16 15:16:34.419420', '2021-03-16 15:12:51.090410', '2', NULL, '定时日志导出', 2, '1', NULL, NULL, '/admin/monitor/celerylog/export/', 'GET', 'admin:monitor:celerylog:export:get', '1', '1', '1', 1, 79, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (82, '', 'admin', '2021-03-16 15:15:21.397132', '2021-03-16 15:15:21.397186', '0', 'tool', '系统工具', 4, '1', 'tool', NULL, NULL, 'GET', NULL, '1', '1', '1', 1, NULL, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (83, '', 'admin', '2021-03-16 15:16:10.318380', '2021-03-16 15:16:10.318426', '1', 'build', '表单构建', 1, '1', 'build', 'vadmin/tool/build/index', NULL, 'GET', NULL, '1', '1', '1', 1, 82, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (84, '', 'admin', '2021-03-16 15:19:24.228395', '2021-03-16 15:17:23.507732', '1', 'swagger', '系统接口', 2, '1', 'swagger', 'vadmin/tool/swagger/index', '/admin/docs/', 'GET', 'admin:docs:get', '1', '1', '1', 1, 82, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (85, '', 'admin', '2021-03-21 11:37:06.119591', '2021-03-21 11:37:06.119623', '2', NULL, '操作日志批量删除', 3, '1', NULL, NULL, '/admin/system/operation_log/{id}/', 'DELETE', 'admin:system:operation_log:{id}:delete', '1', '1', '1', 1, 63, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (86, '', 'admin', '2021-03-21 11:39:07.579469', '2021-03-21 11:39:07.579517', '2', NULL, '操作日志清空', 4, '1', NULL, NULL, '/admin/system/operation_log/clean/', 'DELETE', 'admin:system:operation_log:clean:delete', '1', '1', '1', 1, 63, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (87, '', 'admin', '2021-03-21 23:32:44.308857', '2021-03-21 23:32:44.308882', '2', NULL, '登录日志批量删除', 3, '1', NULL, NULL, '/admin/system/logininfor/{id}/', 'DELETE', 'admin:system:logininfor:{id}:delete', '1', '1', '1', 1, 62, 1);
INSERT INTO `permission_menu` (id, description, modifier, update_datetime, create_datetime, menuType, icon, name, orderNum, isFrame, web_path, component_path, interface_path, interface_method, perms, status, visible, isCache, creator_id, parentId_id, dept_belong_id) VALUES (88, '', 'admin', '2021-03-21 23:33:30.888568', '2021-03-21 23:33:30.888593', '2', NULL, '登录日志清空', 4, '1', NULL, NULL, '/admin/system/logininfor/clean/', 'DELETE', 'admin:system:logininfor:clean:delete', '1', '1', '1', 1, 62, 1);

View File

@ -0,0 +1,27 @@
-- ----------------------------
-- 岗位管理初始化sql
-- Table structure for permission_post
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_post`;
-- CREATE TABLE `permission_post` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `postName` varchar(64) NOT NULL,
-- `postCode` varchar(32) NOT NULL,
-- `postSort` int(11) NOT NULL,
-- `status` varchar(8) NOT NULL,
-- `remark` longtext,
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_post
-- ----------------------------
INSERT INTO `permission_post` (id, description, modifier, update_datetime, create_datetime, postName, postCode, postSort, status, remark, creator_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 07:16:10.725970', '2021-02-27 07:16:10.726016', '董事长', 'ceo', 1, '1', NULL, 1, 1);
INSERT INTO `permission_post` (id, description, modifier, update_datetime, create_datetime, postName, postCode, postSort, status, remark, creator_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 07:16:28.139648', '2021-02-27 07:16:28.139689', '项目经理', 'ce', 2, '1', NULL, 1, 1);
INSERT INTO `permission_post` (id, description, modifier, update_datetime, create_datetime, postName, postCode, postSort, status, remark, creator_id, dept_belong_id) VALUES (3, '', 'admin', '2021-02-27 07:16:39.843069', '2021-02-27 07:16:39.843114', '人力资源', 'hr', 3, '1', NULL, 1, 1);
INSERT INTO `permission_post` (id, description, modifier, update_datetime, create_datetime, postName, postCode, postSort, status, remark, creator_id, dept_belong_id) VALUES (4, '', 'admin', '2021-02-27 07:16:51.082769', '2021-02-27 07:16:51.082813', '普通员工', 'user', 4, '1', NULL, 1, 1);

View File

@ -0,0 +1,173 @@
-- ----------------------------
-- 角色管理 初始化
-- Table structure for permission_role
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_role`;
-- CREATE TABLE `permission_role` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `roleName` varchar(64) NOT NULL,
-- `roleKey` varchar(64) NOT NULL,
-- `roleSort` int(11) NOT NULL,
-- `status` varchar(8) NOT NULL,
-- `admin` tinyint(1) NOT NULL,
-- `dataScope` varchar(8) NOT NULL,
-- `remark` longtext,
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_role
-- ----------------------------
INSERT INTO `permission_role` (id, description, modifier, update_datetime, create_datetime, roleName, roleKey, roleSort, status, admin, dataScope, remark, creator_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 08:48:23.225361', '2021-02-27 08:48:08.064911', '超级管理员', 'admin', 1, '1', 1, '2', NULL, 1, 1);
INSERT INTO `permission_role` (id, description, modifier, update_datetime, create_datetime, roleName, roleKey, roleSort, status, admin, dataScope, remark, creator_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 08:49:05.149632', '2021-02-27 08:48:47.317214', '普通角色', 'common', 2, '1', 0, '2', NULL, 1, 1);
-- ----------------------------
-- Table structure for permission_role_dept
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_role_dept`;
-- CREATE TABLE `permission_role_dept` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `role_id` int(11) NOT NULL,
-- `dept_id` int(11) NOT NULL,
-- PRIMARY KEY (`id`),
-- UNIQUE KEY `permission_role_dept_role_id_dept_id_1d89afeb_uniq` (`role_id`,`dept_id`),
-- KEY `permission_role_dept_role_id_99a9f232` (`role_id`) USING BTREE,
-- KEY `permission_role_dept_dept_id_cbe9076a` (`dept_id`) USING BTREE
-- ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_role_dept
-- ----------------------------
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (1, 1, 1);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (2, 1, 2);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (3, 1, 3);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (4, 1, 4);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (5, 1, 5);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (6, 1, 6);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (7, 1, 7);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (8, 1, 8);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (9, 1, 9);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (10, 1, 10);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (11, 1, 11);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (12, 1, 12);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (13, 1, 13);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (14, 1, 14);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (15, 1, 15);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (16, 1, 16);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (17, 2, 1);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (18, 2, 2);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (19, 2, 3);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (20, 2, 4);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (21, 2, 5);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (22, 2, 6);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (23, 2, 7);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (24, 2, 8);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (25, 2, 9);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (26, 2, 10);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (27, 2, 11);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (28, 2, 12);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (29, 2, 13);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (30, 2, 14);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (31, 2, 15);
INSERT INTO `permission_role_dept` (id, role_id, dept_id) VALUES (32, 2, 16);
-- ----------------------------
-- Table structure for permission_role_menu
-- ----------------------------
-- DROP TABLE IF EXISTS `permission_role_menu`;
-- CREATE TABLE `permission_role_menu` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `role_id` int(11) NOT NULL,
-- `menu_id` int(11) NOT NULL,
-- PRIMARY KEY (`id`),
-- UNIQUE KEY `permission_role_menu_role_id_menu_id_bb9e5441_uniq` (`role_id`,`menu_id`),
-- KEY `permission_role_menu_role_id_33541d2b` (`role_id`) USING BTREE,
-- KEY `permission_role_menu_menu_id_0c24555f` (`menu_id`) USING BTREE
-- ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of permission_role_menu
-- ----------------------------
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (1, 1, 1);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (2, 1, 2);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (3, 1, 3);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (4, 1, 4);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (5, 1, 5);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (6, 1, 6);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (7, 1, 7);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (8, 1, 8);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (9, 1, 9);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (10, 1, 10);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (21, 1, 11);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (22, 1, 13);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (23, 1, 14);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (24, 1, 15);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (25, 1, 16);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (26, 1, 17);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (27, 1, 18);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (28, 1, 19);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (29, 1, 20);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (30, 1, 21);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (31, 1, 22);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (32, 1, 23);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (33, 1, 24);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (34, 1, 25);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (35, 1, 26);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (36, 1, 27);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (37, 1, 28);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (38, 1, 29);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (39, 1, 30);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (40, 1, 31);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (41, 1, 32);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (42, 1, 33);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (43, 1, 34);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (44, 1, 35);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (45, 1, 36);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (46, 1, 37);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (47, 1, 38);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (48, 1, 39);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (49, 1, 40);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (50, 1, 41);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (51, 1, 42);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (52, 1, 43);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (53, 1, 44);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (54, 1, 45);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (55, 1, 46);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (56, 1, 47);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (57, 1, 48);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (58, 1, 49);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (59, 1, 50);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (60, 1, 51);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (61, 1, 52);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (62, 1, 53);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (63, 1, 54);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (64, 1, 55);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (65, 1, 56);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (66, 1, 57);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (67, 1, 58);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (68, 1, 59);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (69, 1, 60);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (74, 1, 61);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (75, 1, 62);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (76, 1, 63);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (70, 1, 64);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (71, 1, 65);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (72, 1, 77);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (73, 1, 78);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (77, 1, 85);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (78, 1, 86);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (11, 2, 1);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (12, 2, 2);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (13, 2, 3);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (14, 2, 4);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (15, 2, 5);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (16, 2, 6);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (17, 2, 7);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (18, 2, 8);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (19, 2, 9);
INSERT INTO `permission_role_menu` (id, role_id, menu_id) VALUES (20, 2, 10);

View File

@ -33,8 +33,8 @@
-- ----------------------------
-- Records of permission_userprofile
-- ----------------------------
INSERT INTO `permission_userprofile` VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 8);
INSERT INTO `permission_userprofile` VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 8);
INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (1, 'pbkdf2_sha256$150000$OjTMSXJgkzrE$jEQCjWbIbXwpN4k2z0o8Yvou1UQGuoJALyL/kGDZFd4=', '2021-02-27 06:20:28.214775', 1, '', '', 1, 1, '2021-02-27 06:20:09.188689', 'admin', '3704adf3-380f-4c27-a8da-60420e8cb4ab', 'admin@qq.com', NULL, NULL, '管理员', '2', '1', 2, '2021-02-27 06:20:09.263192', '2021-02-27 09:14:30.009998', 8, 1);
INSERT INTO `permission_userprofile` (id, password, last_login, is_superuser, first_name, last_name, is_staff, is_active, date_joined, username, secret, email, mobile, avatar, name, gender, remark, user_type, create_datetime, update_datetime, dept_id, dept_belong_id) VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpNms$xVguE/dOEpI4D95LjSaKm0xzG7vNSopUolANr8f/6/E=', NULL, 0, '', '', 0, 1, '2021-03-03 15:38:27.009893', 'dvadmin', 'b4c5d79a-f01c-4244-92f8-b5288eca1d50', NULL, NULL, NULL, '普通用户', '2', NULL, 0, '2021-03-03 15:38:27.010771', '2021-03-03 15:38:27.086069', 8, 1);
-- ----------------------------
-- Table structure for permission_userprofile_post
-- ----------------------------
@ -52,8 +52,8 @@ INSERT INTO `permission_userprofile` VALUES (2, 'pbkdf2_sha256$150000$5Z9LSi7LpN
-- ----------------------------
-- Records of permission_userprofile_post
-- ----------------------------
INSERT INTO `permission_userprofile_post` VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_post` VALUES (2, 2, 4);
INSERT INTO `permission_userprofile_post` (id, userprofile_id, post_id) VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_post` (id, userprofile_id, post_id) VALUES (2, 2, 4);
-- ----------------------------
-- Table structure for permission_userprofile_role
@ -72,5 +72,5 @@ INSERT INTO `permission_userprofile_post` VALUES (2, 2, 4);
-- ----------------------------
-- Records of permission_userprofile_role
-- ----------------------------
INSERT INTO `permission_userprofile_role` VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_role` VALUES (2, 2, 2);
INSERT INTO `permission_userprofile_role` (id, userprofile_id, role_id) VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_role` (id, userprofile_id, role_id) VALUES (2, 2, 2);

View File

@ -0,0 +1,27 @@
-- ----------------------------
-- 参数设置 初始化sql
-- Table structure for system_configsettings
-- ----------------------------
-- DROP TABLE IF EXISTS `system_configsettings`;
-- CREATE TABLE `system_configsettings` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `configName` varchar(64) NOT NULL,
-- `configKey` varchar(256) NOT NULL,
-- `configValue` varchar(256) NOT NULL,
-- `configType` varchar(8) NOT NULL,
-- `status` varchar(8) NOT NULL,
-- `remark` varchar(256) DEFAULT NULL,
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of system_configsettings
-- ----------------------------
INSERT INTO `system_configsettings` (id, description, modifier, update_datetime, create_datetime, configName, configKey, configValue, configType, status, remark, creator_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 07:14:48.935587', '2021-02-27 07:14:48.935634', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', '1', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 1, 1);
INSERT INTO `system_configsettings` (id, description, modifier, update_datetime, create_datetime, configName, configKey, configValue, configType, status, remark, creator_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 07:15:14.039924', '2021-02-27 07:15:14.039967', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', '1', '初始化密码 123456', 1, 1);
INSERT INTO `system_configsettings` (id, description, modifier, update_datetime, create_datetime, configName, configKey, configValue, configType, status, remark, creator_id, dept_belong_id) VALUES (3, '', 'admin', '2021-02-27 07:15:36.091655', '2021-02-27 07:15:36.091694', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', '1', '深色主题theme-dark浅色主题theme-light', 1, 1);

View File

@ -0,0 +1,35 @@
-- ----------------------------
-- 字典管理初始化sql
-- Table structure for system_dictdata
-- ----------------------------
-- DROP TABLE IF EXISTS `system_dictdata`;
-- CREATE TABLE `system_dictdata` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `dictName` varchar(64) NOT NULL,
-- `dictType` varchar(64) NOT NULL,
-- `status` varchar(8) NOT NULL,
-- `remark` varchar(256) DEFAULT NULL,
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of system_dictdata
-- ----------------------------
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 06:22:24.215575', '2021-02-27 06:22:24.215617', '用户性别', 'sys_user_sex', '1', '用户性别列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 06:24:38.126411', '2021-02-27 06:24:38.126456', '菜单状态', 'sys_show_hide', '1', '菜单状态列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (3, '', 'admin', '2021-02-27 06:24:54.943462', '2021-02-27 06:24:54.943516', '系统开关', 'sys_normal_disable', '1', '系统开关列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (4, '', 'admin', '2021-02-27 06:25:16.667651', '2021-02-27 06:25:16.667697', '任务状态', 'sys_job_status', '1', '任务状态列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (5, '', 'admin', '2021-02-27 06:25:34.967768', '2021-02-27 06:25:34.967812', '任务分组', 'sys_job_group', '1', '任务分组列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (6, '', 'admin', '2021-02-27 06:26:01.081973', '2021-02-27 06:26:01.082016', '系统是否', 'sys_yes_no', '1', '系统是否列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (7, '', 'admin', '2021-02-27 06:26:17.716100', '2021-02-27 06:26:17.716144', '通知类型', 'sys_notice_type', '1', '通知类型列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (8, '', 'admin', '2021-02-27 06:26:42.305470', '2021-02-27 06:26:42.305517', '通知状态', 'sys_notice_status', '1', '通知状态列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (9, '', 'admin', '2021-02-27 06:26:57.913406', '2021-02-27 06:26:57.913457', '操作类型', 'sys_oper_type', '1', '操作类型列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (10, '', 'admin', '2021-02-27 06:27:16.392863', '2021-02-27 06:27:16.392961', '系统状态', 'sys_common_status', '1', '登录状态列表', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (11, '', 'admin', '2021-02-27 07:59:30.310069', '2021-02-27 07:59:30.310115', '菜单类型', 'sys_menu_type', '1', '菜单类型', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (12, '', 'admin', '2021-02-27 07:59:47.677379', '2021-02-27 07:59:47.677423', '接口请求方式', 'sys_interface_method', '1', '接口请求方式', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (13, '', 'admin', '2021-03-07 15:06:34.123188', '2021-03-07 14:27:51.286902', '消息类型', 'sys_message_push_type', '1', '消息通知类型', 1, 1);
INSERT INTO `system_dictdata` (id, description, modifier, update_datetime, create_datetime, dictName, dictType, status, remark, creator_id, dept_belong_id) VALUES (14, '', 'admin', '2021-03-07 15:06:38.891604', '2021-03-07 15:06:00.930057', '消息状态', 'sys_message_push_status', '1', '消息通知状态', 1, 1);

View File

@ -0,0 +1,70 @@
-- ----------------------------
-- 字典详情初始化sql
-- Table structure for system_dictdetails
-- ----------------------------
-- DROP TABLE IF EXISTS `system_dictdetails`;
-- CREATE TABLE `system_dictdetails` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `description` longtext,
-- `creator` varchar(255) DEFAULT NULL,
-- `modifier` varchar(255) DEFAULT NULL,
-- `update_datetime` datetime(6) DEFAULT NULL,
-- `create_datetime` datetime(6) DEFAULT NULL,
-- `dictLabel` varchar(64) NOT NULL,
-- `dictValue` varchar(256) NOT NULL,
-- `is_default` tinyint(1) NOT NULL,
-- `status` varchar(2) NOT NULL,
-- `sort` varchar(256) NOT NULL,
-- `remark` varchar(256) DEFAULT NULL,
-- `dict_data_id` int(11) NOT NULL,
-- PRIMARY KEY (`id`),
-- KEY `system_dictdetails_dict_data_id_0bfceb37_fk_system_dictdata_id` (`dict_data_id`),
-- CONSTRAINT `system_dictdetails_dict_data_id_0bfceb37_fk_system_dictdata_id` FOREIGN KEY (`dict_data_id`) REFERENCES `system_dictdata` (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of system_dictdetails
-- ----------------------------
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (1, '', 'admin', '2021-02-27 07:10:41.679229', '2021-02-27 06:28:44.246112', '', '0', 0, '1', '1', '性别男', 1, 1, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (2, '', 'admin', '2021-02-27 06:29:33.556002', '2021-02-27 06:29:03.591400', '', '1', 0, '1', '2', '性别女', 1, 1, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (3, '', 'admin', '2021-02-27 06:29:51.943789', '2021-02-27 06:29:17.544082', '未知', '2', 1, '1', '3', '性别未知', 1, 1, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (4, '', 'admin', '2021-02-27 07:10:27.513951', '2021-02-27 06:31:38.884136', '显示', '1', 1, '1', '1', '显示菜单', 1, 2, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (5, '', 'admin', '2021-02-27 07:10:30.824117', '2021-02-27 06:33:07.491136', '隐藏', '0', 0, '1', '2', '隐藏菜单', 1, 2, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (6, '', 'admin', '2021-02-27 07:00:47.233161', '2021-02-27 07:00:47.233220', '正常', '1', 1, '1', '1', '正常状态', 1, 3, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (7, '', 'admin', '2021-02-27 07:01:02.598169', '2021-02-27 07:01:02.598213', '停用', '0', 0, '1', '2', '停用状态', 1, 3, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (8, '', 'admin', '2021-02-27 07:02:03.014319', '2021-02-27 07:01:43.750881', '正常', '1', 1, '1', '1', '正常状态', 1, 4, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (9, '', 'admin', '2021-02-27 07:01:58.880996', '2021-02-27 07:01:58.881040', '暂停', '0', 0, '1', '2', '停用状态', 1, 4, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (10, '', 'admin', '2021-02-27 07:02:51.415658', '2021-02-27 07:02:51.415703', '默认', 'DEFAULT', 1, '1', '1', '默认分组', 1, 5, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (11, '', 'admin', '2021-02-27 07:03:13.560650', '2021-02-27 07:03:13.560696', '系统', 'SYSTEM', 0, '1', '2', '系统分组', 1, 5, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (12, '', 'admin', '2021-02-27 07:03:42.729915', '2021-02-27 07:03:42.729966', '', 'Y', 1, '1', '1', '系统默认是', 1, 6, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (13, '', 'admin', '2021-02-27 07:04:01.389829', '2021-02-27 07:04:01.389872', '', 'N', 0, '1', '2', '系统默认否', 1, 6, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (14, '', 'admin', '2021-02-27 07:04:25.094873', '2021-02-27 07:04:25.094917', '通知', '1', 1, '1', '1', '通知', 1, 7, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (15, '', 'admin', '2021-02-27 07:04:48.136899', '2021-02-27 07:04:48.136942', '公告', '2', 0, '1', '2', '公告', 1, 7, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (16, '', 'admin', '2021-02-27 07:05:19.801756', '2021-02-27 07:05:14.206563', '正常', '1', 1, '1', '1', '正常状态', 1, 8, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (17, '', 'admin', '2021-02-27 07:05:37.420621', '2021-02-27 07:05:37.420665', '关闭', '0', 0, '1', '2', '关闭状态', 1, 8, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (18, '', 'admin', '2021-02-27 07:06:46.397742', '2021-02-27 07:06:10.700351', '新增', '1', 0, '1', '1', '新增操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (19, '', 'admin', '2021-02-27 07:06:24.688730', '2021-02-27 07:06:24.688786', '修改', '2', 0, '1', '2', '修改操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (20, '', 'admin', '2021-02-27 07:06:43.320943', '2021-02-27 07:06:43.320988', '删除', '3', 0, '1', '3', '删除操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (21, '', 'admin', '2021-02-27 07:07:00.508951', '2021-02-27 07:07:00.508996', '授权', '4', 0, '1', '4', '授权操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (22, '', 'admin', '2021-02-27 07:07:38.550527', '2021-02-27 07:07:38.550573', '导出', '5', 0, '1', '5', '导出操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (23, '', 'admin', '2021-02-27 07:08:09.294696', '2021-02-27 07:08:09.294743', '导入', '6', 0, '1', '6', '导入操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (24, '', 'admin', '2021-02-27 07:08:32.640718', '2021-02-27 07:08:32.640763', '强退', '7', 0, '1', '7', '强退操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (25, '', 'admin', '2021-02-27 07:08:47.559833', '2021-02-27 07:08:47.559887', '生成', '8', 0, '1', '8', '生成操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (26, '', 'admin', '2021-02-27 07:09:13.410371', '2021-02-27 07:09:04.346547', '清空', '9', 0, '1', '9', '清空操作', 1, 9, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (27, '', 'admin', '2021-02-27 07:09:37.467839', '2021-02-27 07:09:37.467883', '正常', '1', 0, '1', '1', '正常状态', 1, 10, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (28, '', 'admin', '2021-02-27 07:10:17.235559', '2021-02-27 07:10:02.980623', '停用', '0', 0, '1', '2', '停用状态', 1, 10, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (29, '', 'admin', '2021-02-27 08:00:07.361327', '2021-02-27 08:00:07.361371', '目录', '0', 1, '1', '1', '目录', 1, 11, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (30, '', 'admin', '2021-02-27 08:00:27.832697', '2021-02-27 08:00:22.160349', '菜单', '1', 0, '1', '2', '菜单', 1, 11, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (31, '', 'admin', '2021-02-27 08:00:45.794325', '2021-02-27 08:00:45.794369', '按钮', '2', 0, '1', '3', '按钮', 1, 11, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (32, '', 'admin', '2021-02-27 08:02:22.957299', '2021-02-27 08:02:22.957364', 'GET', 'GET', 1, '1', '1', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (33, '', 'admin', '2021-02-27 08:02:37.650203', '2021-02-27 08:02:37.650291', 'POST', 'POST', 0, '1', '2', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (34, '', 'admin', '2021-02-27 08:02:56.731151', '2021-02-27 08:02:56.731262', 'PUT', 'PUT', 0, '1', '3', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (35, '', 'admin', '2021-02-27 08:03:19.639542', '2021-02-27 08:03:19.639611', 'PATCH', 'PATCH', 0, '1', '4', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (36, '', 'admin', '2021-02-27 08:03:31.746528', '2021-02-27 08:03:31.746574', 'DELETE', 'DELETE', 0, '1', '5', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (37, '', 'admin', '2021-02-27 08:03:41.277335', '2021-02-27 08:03:41.277383', 'HEAD', 'HEAD', 0, '0', '6', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (38, '', 'admin', '2021-02-27 08:03:50.891906', '2021-02-27 08:03:50.891950', 'OPTIONS', 'OPTIONS', 0, '0', '7', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (39, '', 'admin', '2021-02-27 08:04:00.460564', '2021-02-27 08:04:00.460610', 'TRACE', 'TRACE', 0, '0', '8', NULL, 1, 12, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (40, '', 'admin', '2021-03-07 14:29:10.529482', '2021-03-07 14:29:10.529513', '消息通知', '1', 1, '1', '1', '消息通知', 1, 13, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (41, '', 'admin', '2021-03-07 14:29:40.480856', '2021-03-07 14:29:26.851952', '文件下发', '2', 0, '1', '2', '文件下发', 1, 13, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (42, '', 'admin', '2021-03-07 15:07:23.204077', '2021-03-07 15:07:23.204107', '待发送', '1', 1, '1', '1', '消息发送状态:待发送', 1, 14, 1);
INSERT INTO `system_dictdetails` (id, description, modifier, update_datetime, create_datetime, dictLabel, dictValue, is_default, status, sort, remark, creator_id, dict_data_id, dept_belong_id) VALUES (43, '', 'admin', '2021-03-07 15:07:31.927366', '2021-03-07 15:07:31.927397', '已发送', '2', 0, '1', '2', '消息发送状态:已发送', 1, 14, 1);

View File

@ -0,0 +1 @@

View File

@ -2,5 +2,5 @@ from django.apps import AppConfig
class PermissionConfig(AppConfig):
name = 'permission'
name = 'vadmin.system'
verbose_name = "权限管理"

View File

@ -0,0 +1,84 @@
import django_filters
from .models import LoginInfor, OperationLog
from ..system.models import DictDetails, DictData, ConfigSettings, MessagePush, SaveFile
class DictDataFilter(django_filters.rest_framework.FilterSet):
"""
字典管理 简单过滤器
"""
dictName = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = DictData
fields = '__all__'
class DictDetailsFilter(django_filters.rest_framework.FilterSet):
"""
字典详情 简单过滤器
"""
dictLabel = django_filters.CharFilter(lookup_expr='icontains')
dictType = django_filters.CharFilter(field_name='dict_data__dictType')
class Meta:
model = DictDetails
fields = '__all__'
class ConfigSettingsFilter(django_filters.rest_framework.FilterSet):
"""
参数设置 简单过滤器
"""
configName = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = ConfigSettings
fields = '__all__'
class SaveFileFilter(django_filters.rest_framework.FilterSet):
"""
文件管理 简单过滤器
"""
name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = SaveFile
exclude = ('file',)
class MessagePushFilter(django_filters.rest_framework.FilterSet):
"""
消息通知 简单过滤器
"""
# is_read = django_filters.CharFilter(field_name='messagepushuser_message_push__is_read')
title = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = MessagePush
fields = '__all__'
class LoginInforFilter(django_filters.rest_framework.FilterSet):
"""
登录日志 简单过滤器
"""
class Meta:
model = LoginInfor
fields = '__all__'
class OperationLogFilter(django_filters.rest_framework.FilterSet):
"""
操作日志 简单过滤器
"""
request_modular = django_filters.CharFilter(lookup_expr='icontains')
creator_username = django_filters.CharFilter(field_name='creator__username', lookup_expr='icontains')
class Meta:
model = OperationLog
fields = '__all__'

View File

@ -4,4 +4,7 @@ from ..models.dict_details import DictDetails
from ..models.web_set import WebSet
from ..models.save_file import SaveFile
from ..models.message_push import MessagePush
from ..models.message_push import MessagePushUser
from ..models.logininfor import LoginInfor
from ..models.operation_log import OperationLog

View File

@ -1,6 +1,6 @@
from django.db.models import CharField, ForeignKey, BooleanField, CASCADE
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class ConfigSettings(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import TextField, CharField,ForeignKey
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class DictData(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import CharField, ForeignKey, BooleanField, CASCADE
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class DictDetails(CoreModel):
@ -9,9 +9,14 @@ class DictDetails(CoreModel):
is_default = BooleanField(verbose_name="是否默认", default=False)
status = CharField(max_length=2, verbose_name="字典状态")
sort = CharField(max_length=256, verbose_name="字典排序")
dict_data = ForeignKey(to='DictData', on_delete=CASCADE, verbose_name="关联字典",db_constraint=False)
dict_data = ForeignKey(to='DictData', on_delete=CASCADE, verbose_name="关联字典", db_constraint=False)
remark = CharField(max_length=256, verbose_name="备注", null=True, blank=True)
@classmethod
def get_default_dictValue(cls, dictName):
instance = DictDetails.objects.filter(dict_data__dictName=dictName, is_default=True).first()
return instance and instance.dictValue
class Meta:
verbose_name = '字典详情'
verbose_name_plural = verbose_name

View File

@ -0,0 +1,20 @@
from django.db.models import CharField, BooleanField
from ...op_drf.models import CoreModel
class LoginInfor(CoreModel):
session_id = CharField(max_length=64, verbose_name="会话标识", null=True, blank=True)
browser = CharField(max_length=64, verbose_name="浏览器")
ipaddr = CharField(max_length=32, verbose_name="ip地址", null=True, blank=True)
loginLocation = CharField(max_length=64, verbose_name="登录位置", null=True, blank=True)
msg = CharField(max_length=64, verbose_name="操作信息", null=True, blank=True)
os = CharField(max_length=64, verbose_name="操作系统", null=True, blank=True)
status = BooleanField(default=False, verbose_name="登录状态")
class Meta:
verbose_name = '登录日志'
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.creator and self.creator.name}"

View File

@ -1,9 +1,9 @@
from django.db import models
from django.db.models import *
from apps.op_drf.fields import UpdateDateTimeField, CreateDateTimeField
from apps.op_drf.models import CoreModel
from apps.permission.models import UserProfile
from ...op_drf.fields import UpdateDateTimeField, CreateDateTimeField
from ...op_drf.models import CoreModel
from ...permission.models import UserProfile
"""
消息通知模型
@ -13,15 +13,16 @@ from apps.permission.models import UserProfile
class MessagePush(CoreModel):
title = CharField(max_length=128, verbose_name="通知标题")
content = TextField(verbose_name="通知内容")
message_type = CharField(max_length=8, verbose_name="消息类型")
message_type = CharField(max_length=8, verbose_name="通知类型")
is_reviewed = BooleanField(default=True, verbose_name="是否审核")
status = CharField(max_length=8, verbose_name="消息状态")
status = CharField(max_length=8, verbose_name="通知状态")
to_path = CharField(max_length=256, verbose_name="跳转路径", null=True, blank=True, )
user = ManyToManyField(to="permission.UserProfile",
related_name="user", related_query_name="user_query", through='MessagePushUser',
through_fields=('message_push', 'user'))
class Meta:
verbose_name = '消息通知'
verbose_name = '通知公告'
verbose_name_plural = verbose_name
def __str__(self):
@ -41,5 +42,5 @@ class MessagePushUser(models.Model):
create_datetime = CreateDateTimeField() # 创建时间
class Meta:
verbose_name = "消息通知与用户关系"
verbose_name = "通知公告与用户关系"
verbose_name_plural = verbose_name

View File

@ -0,0 +1,25 @@
from django.db.models import TextField, CharField, BooleanField
from ...op_drf.models import CoreModel
class OperationLog(CoreModel):
request_modular = CharField(max_length=64, verbose_name="请求模块", null=True, blank=True)
request_path = CharField(max_length=400, verbose_name="请求地址", null=True, blank=True)
request_body = TextField(verbose_name="请求参数", null=True, blank=True)
request_method = CharField(max_length=64, verbose_name="请求方式", null=True, blank=True)
request_msg = TextField(verbose_name="操作说明", null=True, blank=True)
request_ip = CharField(max_length=32, verbose_name="请求ip地址", null=True, blank=True)
request_browser = CharField(max_length=32, verbose_name="请求浏览器", null=True, blank=True)
response_code = CharField(max_length=32, verbose_name="响应状态码", null=True, blank=True)
request_location = CharField(max_length=32, verbose_name="操作地点", null=True, blank=True)
request_os = CharField(max_length=64, verbose_name="操作系统", null=True, blank=True)
json_result = TextField(verbose_name="返回信息", null=True, blank=True)
status = BooleanField(default=False, verbose_name="响应状态")
class Meta:
verbose_name = '操作日志'
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.request_msg}[{self.request_modular}]"

View File

@ -4,7 +4,7 @@ import uuid
from django.db.models import CharField, FileField,BooleanField
from django.utils import timezone
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
def files_path(instance, filename):

View File

@ -1,6 +1,6 @@
from django.db.models import TextField, CharField
from apps.op_drf.models import CoreModel
from ...op_drf.models import CoreModel
class WebSet(CoreModel):

View File

@ -1,8 +1,8 @@
from rest_framework import serializers
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.serializers import UserProfileSerializer
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from .models import LoginInfor, OperationLog
from ..op_drf.serializers import CustomModelSerializer
from ..system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush, MessagePushUser
# ================================================= #
@ -162,11 +162,6 @@ class MessagePushSerializer(CustomModelSerializer):
"""
消息通知 简单序列化器
"""
# users = UserProfileSerializer(read_only=True)
users = serializers.SerializerMethodField(read_only=True)
def get_users(self, obj):
return UserProfileSerializer(obj.user.all(), many=True).data
class Meta:
model = MessagePush
@ -198,5 +193,83 @@ class ExportMessagePushSerializer(CustomModelSerializer):
class Meta:
model = MessagePush
fields = (
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'update_datetime', 'create_datetime')
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'update_datetime', 'create_datetime')
class MessagePushUserSerializer(CustomModelSerializer):
"""
消息通知 用户查询简单序列化器
"""
# users = UserProfileSerializer(read_only=True)
# users = serializers.SerializerMethodField(read_only=True)
is_read = serializers.SerializerMethodField(read_only=True)
# def get_users(self, obj):
# return UserProfileSerializer(obj.user.all(), many=True).data
# 返回这个消息是否已读
def get_is_read(self, obj):
object = MessagePushUser.objects.filter(message_push=obj, user=self.context.get('request').user).first()
return object.is_read if object else False
class Meta:
model = MessagePush
fields = "__all__"
def save(self, **kwargs):
return super().save(**kwargs)
# ================================================= #
# ************** 登录日志 序列化器 ************** #
# ================================================= #
class LoginInforSerializer(CustomModelSerializer):
"""
登录日志 简单序列化器
"""
creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True)
class Meta:
model = LoginInfor
fields = "__all__"
class ExportLoginInforSerializer(CustomModelSerializer):
"""
导出 登录日志 简单序列化器
"""
creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True)
class Meta:
model = LoginInfor
fields = ('id', 'creator_name', 'ipaddr', 'loginLocation', 'browser', 'os',
'status', 'msg', 'creator_name')
# ================================================= #
# ************** 操作日志 序列化器 ************** #
# ================================================= #
class OperationLogSerializer(CustomModelSerializer):
"""
操作日志 简单序列化器
"""
creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True)
class Meta:
model = OperationLog
fields = "__all__"
class ExportOperationLogSerializer(CustomModelSerializer):
"""
导出 操作日志 简单序列化器
"""
creator_name = serializers.SlugRelatedField(slug_field="username", source="creator", read_only=True)
class Meta:
model = OperationLog
fields = ('request_modular', 'request_path', 'request_body', 'request_method', 'request_msg', 'request_ip',
'request_browser', 'response_code', 'request_location', 'request_os', 'json_result', 'status',
'creator_name')

View File

@ -1,8 +1,9 @@
from django.urls import re_path
from rest_framework.routers import DefaultRouter
from apps.system.views import DictDataModelViewSet, DictDetailsModelViewSet, \
ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet, SystemInfoApiView
from ..system.views import DictDataModelViewSet, DictDetailsModelViewSet, \
ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet, LoginInforModelViewSet, \
OperationLogModelViewSet
router = DefaultRouter()
router.register(r'dict/type', DictDataModelViewSet)
@ -10,6 +11,9 @@ router.register(r'dict/data', DictDetailsModelViewSet)
router.register(r'config', ConfigSettingsModelViewSet)
router.register(r'savefile', SaveFileModelViewSet)
router.register(r'message', MessagePushModelViewSet)
router.register(r'logininfor', LoginInforModelViewSet)
router.register(r'operation_log', OperationLogModelViewSet)
urlpatterns = [
re_path('dict/get/type/(?P<pk>.*)/', DictDetailsModelViewSet.as_view({'get': 'dict_details_list'})),
re_path('config/configKey/(?P<pk>.*)/', ConfigSettingsModelViewSet.as_view({'get': 'get_config_key'})),
@ -24,8 +28,18 @@ urlpatterns = [
# 用户获取个人通知列表
re_path('message/receive/', MessagePushModelViewSet.as_view({"get": "get_received_messages"})),
# 消息通知导出
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export',})),
re_path('sys/info/', SystemInfoApiView.as_view())
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export', })),
# 用户个人消息列表
re_path('message/user_messages/', MessagePushModelViewSet.as_view({'get': 'get_user_messages', })),
# 改为已读
re_path('message/is_read/(?P<pk>.*)/', MessagePushModelViewSet.as_view({'put': 'update_is_read', })),
# 清空操作日志
re_path('operation_log/clean/', OperationLogModelViewSet.as_view({'delete': 'clean_all', })),
# 导出操作日志
re_path('operation_log/export/', OperationLogModelViewSet.as_view({'get': 'export', })),
# 清空登录日志
re_path('logininfor/clean/', LoginInforModelViewSet.as_view({'delete': 'clean_all', })),
# 导出登录日志
re_path('logininfor/export/', LoginInforModelViewSet.as_view({'get': 'export', })),
]
urlpatterns += router.urls

View File

@ -1,18 +1,21 @@
from django.db.models import Q
from rest_framework.request import Request
from rest_framework.views import APIView
from apps.op_drf.filters import DataLevelPermissionsFilter
from apps.op_drf.viewsets import CustomModelViewSet
from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
from .models import LoginInfor, OperationLog
from ..op_drf.filters import DataLevelPermissionsFilter
from ..op_drf.viewsets import CustomModelViewSet
from ..system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter, MessagePushFilter, \
SaveFileFilter, LoginInforFilter, OperationLogFilter
from ..system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from ..system.models import MessagePushUser
from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \
ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \
MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer
from utils.export_excel import export_excel_save_model
from utils.response import SuccessResponse
from utils.system_info_utils import get_memory_used_percent, get_cpu_used_percent, get_disk_used_percent
MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer, LoginInforSerializer, \
OperationLogSerializer, ExportOperationLogSerializer, ExportLoginInforSerializer
from ..utils.export_excel import export_excel_save_model
from ..utils.response import SuccessResponse
class DictDataModelViewSet(CustomModelViewSet):
@ -25,6 +28,7 @@ class DictDataModelViewSet(CustomModelViewSet):
update_serializer_class = DictDataCreateUpdateSerializer
# list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer
extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = DictDataFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
@ -133,16 +137,16 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
class SaveFileModelViewSet(CustomModelViewSet):
"""
参数设置 模型的CRUD视图
文件管理 模型的CRUD视图
"""
queryset = SaveFile.objects.all()
serializer_class = SaveFileSerializer
create_serializer_class = SaveFileCreateUpdateSerializer
update_serializer_class = SaveFileCreateUpdateSerializer
# filter_class = ConfigSettingsFilter
filter_class = SaveFileFilter
extra_filter_backends = [DataLevelPermissionsFilter]
search_fields = ('configName',)
ordering = 'id' # 默认排序
ordering = '-create_datetime' # 默认排序
class MessagePushModelViewSet(CustomModelViewSet):
@ -154,6 +158,7 @@ class MessagePushModelViewSet(CustomModelViewSet):
create_serializer_class = MessagePushCreateUpdateSerializer
update_serializer_class = MessagePushCreateUpdateSerializer
extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = MessagePushFilter
ordering = "-update_datetime" # 默认排序
def get_message_list(self, request: Request, *args, **kwargs):
@ -164,13 +169,19 @@ class MessagePushModelViewSet(CustomModelViewSet):
data = MessagePushSerializer(messages, many=True)
return SuccessResponse(msg="返回", data=data)
def get_received_messages(self, request: Request, *args, **kwargs):
def get_user_messages(self, request: Request, *args, **kwargs):
"""
用户获取未读消息通知列表
获取用户自己消息列表
"""
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(recipient_id=request.user.id, is_read=0)
is_read = request.query_params.get('is_read', None)
if is_read:
if is_read == 'False':
queryset = queryset.filter(Q(messagepushuser_message_push__is_read=is_read) | Q(user=None))
else:
queryset = queryset.filter(messagepushuser_message_push__is_read=is_read)
queryset = queryset.filter(is_reviewed=True)
page = self.paginate_queryset(queryset)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
@ -184,11 +195,14 @@ class MessagePushModelViewSet(CustomModelViewSet):
serializer = self.get_serializer(queryset, many=True)
return SuccessResponse(serializer.data)
def get_received_messages_count(self, request: Request, *args, **kwargs):
def update_is_read(self, request: Request, *args, **kwargs):
"""
获取用户未读消息数量
修改为已读
"""
pass
instance, _ = MessagePushUser.objects.get_or_create(message_push_id=kwargs.get('pk'), user=request.user)
instance.is_read = True
instance.save()
return SuccessResponse()
def export(self, request: Request, *args, **kwargs):
"""
@ -203,18 +217,51 @@ class MessagePushModelViewSet(CustomModelViewSet):
return SuccessResponse(export_excel_save_model(request, field_data, data, '导出岗位数据.xls'))
class SystemInfoApiView(APIView):
class LoginInforModelViewSet(CustomModelViewSet):
"""
系统服务监控视图
登录日志 模型的CRUD视图
"""
queryset = LoginInfor.objects.all()
serializer_class = LoginInforSerializer
filter_class = LoginInforFilter
extra_filter_backends = [DataLevelPermissionsFilter]
ordering = '-create_datetime' # 默认排序
export_field_data = ['访问编号', '用户名称', '登录地址', '登录地点', '浏览器', '操作系统',
'登录状态', '操作信息', '登录日期']
export_serializer_class = ExportLoginInforSerializer
def clean_all(self, request: Request, *args, **kwargs):
"""
清空登录日志
:param request:
:param args:
:param kwargs:
:return:
"""
self.get_queryset().delete()
return SuccessResponse(msg="清空成功")
class OperationLogModelViewSet(CustomModelViewSet):
"""
def get(self, request, *args, **kwargs):
# 获取内存使用率
memory_used_percent = get_memory_used_percent()
# 获取cpu使用率
cpu_used_percent = get_cpu_used_percent()
# 获取硬盘使用率
disk_used_percent = get_disk_used_percent()
return SuccessResponse(data={"memory_used_percent": memory_used_percent,
"cpu_used_percent": cpu_used_percent,
"disk_used_percent": disk_used_percent
})
操作日志 模型的CRUD视图
"""
queryset = OperationLog.objects.all()
serializer_class = OperationLogSerializer
filter_class = OperationLogFilter
extra_filter_backends = [DataLevelPermissionsFilter]
ordering = '-create_datetime' # 默认排序
export_field_data = ['请求模块', '请求地址', '请求参数', '请求方式', '操作说明', '请求ip地址',
'请求浏览器', '响应状态码', '操作地点', '操作系统', '返回信息', '响应状态', '操作用户名']
export_serializer_class = ExportOperationLogSerializer
def clean_all(self, request: Request, *args, **kwargs):
"""
清空操作日志
:param request:
:param args:
:param kwargs:
:return:
"""
self.get_queryset().delete()
return SuccessResponse(msg="清空成功")

View File

@ -0,0 +1,57 @@
"""application URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from captcha.conf import settings as ca_settings
from captcha.helpers import captcha_image_url, captcha_audio_url
from captcha.models import CaptchaStore
from django.conf.urls import url
from django.urls import re_path, include
from rest_framework.documentation import include_docs_urls
from rest_framework.views import APIView
from .op_drf.response import SuccessResponse
from .permission.views import GetUserProfileView, GetRouters
from .utils.login import LoginView, LogoutView
class CaptchaRefresh(APIView):
authentication_classes = []
permission_classes = []
def get(self, request):
new_key = CaptchaStore.pick()
to_json_response = {
"key": new_key,
"image_url": captcha_image_url(new_key),
"audio_url": captcha_audio_url(new_key) if ca_settings.CAPTCHA_FLITE_PATH else None,
}
return SuccessResponse(to_json_response)
urlpatterns = [
re_path('api-token-auth/', LoginView.as_view(), name='api_token_auth'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'docs/', include_docs_urls(title='接口文档')),
re_path(r'^login/$', LoginView.as_view()),
re_path(r'^logout/$', LogoutView.as_view()),
re_path(r'^getInfo/$', GetUserProfileView.as_view()),
re_path(r'^getRouters/$', GetRouters.as_view()),
url(r"captcha/refresh/$", CaptchaRefresh.as_view(), name="captcha-refresh"), # 刷新验证码
re_path('captcha/', include('captcha.urls')), # 图片验证码 路由
re_path(r'^permission/', include('apps.vadmin.permission.urls')),
re_path(r'^system/', include('apps.vadmin.system.urls')),
]

View File

@ -3,13 +3,17 @@
"""
import logging
import jwt
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.cache import cache
from django.utils.six import text_type
from django.utils.translation import ugettext as _
from rest_framework import exceptions
from rest_framework_jwt.utils import jwt_decode_handler
from .decorators import exceptionHandler
from .jwt_util import jwt_get_session_id
logger = logging.getLogger(__name__)
User = get_user_model()
@ -20,12 +24,21 @@ class OpAuthJwtAuthentication(object):
统一JWT认证(环境允许情况下, 推荐使用RedisOpAuthJwtAuthentication)
"""
@exceptionHandler()
def authenticate(self, request):
token = self.get_header_authorization(request) or self.get_cookie_authorization(request)
if not token:
return None
payload = jwt_decode_handler(token)
try:
payload = jwt_decode_handler(token)
except jwt.ExpiredSignature:
msg = _('Signature has expired.')
raise exceptions.AuthenticationFailed(msg)
except jwt.DecodeError:
msg = _('Error decoding signature.')
raise exceptions.AuthenticationFailed(msg)
except jwt.InvalidTokenError:
raise exceptions.AuthenticationFailed()
username = payload.get('username', None)
if not username:
return None
@ -51,7 +64,7 @@ class OpAuthJwtAuthentication(object):
if not auth:
return ''
auth = str(auth, encoding='utf-8').split()
if len(auth) != 2 or auth[0].upper() != settings.JWT_AUTH.get('JWT_AUTH_HEADER_PREFIX', 'JWT'):
if len(auth) != 2 or auth[0].upper() != settings.JWT_AUTH.get('JWT_AUTH_HEADER_PREFIX', 'JWT').upper():
return ''
return auth[1]
@ -75,15 +88,15 @@ class RedisOpAuthJwtAuthentication(OpAuthJwtAuthentication):
"""
prefix = settings.JWT_AUTH.get('JWT_AUTH_HEADER_PREFIX', 'JWT')
@exceptionHandler()
def authenticate(self, request):
res = super().authenticate(request)
if res:
user, token = super().authenticate(request)
key = f"{self.prefix}_{user.username}"
user, token = res
session_id = jwt_get_session_id(token)
key = f"{self.prefix}_{session_id}_{user.username}"
redis_token = cache.get(key)
if redis_token == token:
return user, token
else:
return None
raise exceptions.AuthenticationFailed("登录信息失效,请重新登录!")
return None

View File

@ -7,7 +7,6 @@ from django.contrib.auth.backends import ModelBackend
from django.utils import timezone
from rest_framework.authentication import SessionAuthentication as DjangoSessionAuthentication
from utils.exceptions import GenException
logger = logging.getLogger(__name__)
UserModel = get_user_model()

View File

@ -2,7 +2,9 @@ import logging
import traceback
from rest_framework import serializers, exceptions
from rest_framework.views import set_rollback
from .request_util import get_verbose_name
from .response import ErrorResponse
logger = logging.getLogger(__name__)
@ -16,9 +18,9 @@ class APIException(Exception):
"""
def __init__(self, code=201, message='API异常', args=('API异常',)):
self.args = args
self.code = code
self.message = message
args = args
code = code
message = message
def __str__(self):
return self.message
@ -35,7 +37,7 @@ class FrameworkException(Exception):
def __init__(self, message='框架异常', *args: object, **kwargs: object) -> None:
super().__init__(*args, **kwargs)
self.message = message
message = message
def __str__(self) -> str:
return f"{self.message}"
@ -63,13 +65,17 @@ def op_exception_handler(ex, context):
"""
msg = ''
code = '201'
request = context.get('request')
request.session['model_name'] = get_verbose_name(view=context.get('view'))
if isinstance(ex, AuthenticationFailed):
code = 401
msg = ex.detail
elif isinstance(ex, DRFAPIException):
# set_rollback()
set_rollback()
msg = ex.detail
elif isinstance(ex, exceptions.APIException):
set_rollback()
msg = ex.detail
elif isinstance(ex, Exception):
logger.error(traceback.format_exc())

Some files were not shown because too many files have changed in this diff Show More