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

View File

@ -6,6 +6,43 @@
version: "3" version: "3"
services: 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: dvadmin-redis:
image: redis:latest image: redis:latest

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

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

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

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

View File

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

View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

View File

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

View File

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

View File

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

View File

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

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

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

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

@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

View File

@ -1,7 +1,7 @@
## 将HTTP请求全部重定向至HTTPS ## 将HTTP请求全部重定向至HTTPS
server { server {
listen 80; listen 80;
server_name api.django-vue-admin.com; server_name daily.api.django-vue-admin.com;
charset utf-8; charset utf-8;
access_log /var/log/nginx/api-80.access.log; access_log /var/log/nginx/api-80.access.log;
error_log /var/log/nginx/api-80.error.log; error_log /var/log/nginx/api-80.error.log;
@ -9,11 +9,11 @@ server {
} }
server { server {
listen 443 ssl; listen 443 ssl;
server_name api.django-vue-admin.com; server_name daily.api.django-vue-admin.com;
root /dvadmin-backend/;#项目路径 root /dvadmin-backend/;#项目路径
charset utf-8; charset utf-8;
ssl_certificate /nginx/keys/api.django-vue-admin.com.crt;#.pem证书路径 ssl_certificate /nginx/keys/daily.api.django-vue-admin.com.crt;#.pem证书路径
ssl_certificate_key /nginx/keys/api.django-vue-admin.com.key;#.key证书路径 ssl_certificate_key /nginx/keys/daily.api.django-vue-admin.com.key;#.key证书路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; ssl_prefer_server_ciphers on;
@ -21,7 +21,7 @@ server {
ssl_session_timeout 10m; ssl_session_timeout 10m;
error_page 497 https://$host$request_uri; error_page 497 https://$host$request_uri;
proxy_set_header Host $proxy_host; 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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
location / { location / {
@ -41,6 +41,6 @@ server {
alias /dvadmin-backend/static; # your Django project's static files - amend as required alias /dvadmin-backend/static; # your Django project's static files - amend as required
} }
access_log /var/log/nginx/api-443.access.log; access_log /var/log/nginx/daily.api-443.access.log;
error_log /var/log/nginx/api-443.error.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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
location / { 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/; root /dvadmin-ui/dist/;
index index.html index.php index.htm; index index.html index.php index.htm;
} }
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/daily.demo-443.access.log; access_log /var/log/nginx/daily.demo-443.access.log;
error_log /var/log/nginx/daily.demo-443.error.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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
location / { 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/; root /dvadmin-ui/dist/;
index index.html index.php index.htm; index index.html index.php index.htm;
} }
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/demo-443.access.log; access_log /var/log/nginx/demo-443.access.log;
error_log /var/log/nginx/demo-443.error.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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
location / { 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; index index.html index.php index.htm;
} }
location @router {
rewrite ^.*$ /index.html last;
}
access_log /var/log/nginx/www-443.access.log; access_log /var/log/nginx/www-443.access.log;
error_log /var/log/nginx/www-443.error.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 datetime
import os import os
import sys
from mongoengine import connect from mongoengine import connect
@ -20,7 +21,7 @@ from conf.env import *
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 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 # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
@ -45,9 +46,9 @@ INSTALLED_APPS = [
'corsheaders', 'corsheaders',
'captcha', 'captcha',
# 自定义app # 自定义app
'apps.permission', 'apps.vadmin.permission',
'apps.op_drf', 'apps.vadmin.op_drf',
'apps.system', 'apps.vadmin.system',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -59,6 +60,7 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'vadmin.op_drf.middleware.ApiLoggingMiddleware', # 用于记录API访问日志
] ]
# 允许跨域源 # 允许跨域源
CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL CORS_ORIGIN_ALLOW_ALL = CORS_ORIGIN_ALLOW_ALL
@ -117,7 +119,7 @@ USE_I18N = True
USE_L10N = True USE_L10N = True
USE_TZ = True USE_TZ = False
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/ # https://docs.djangoproject.com/en/1.11/howto/static-files/
@ -126,10 +128,15 @@ USE_TZ = True
""" """
# 访问静态文件的url地址前缀 # 访问静态文件的url地址前缀
STATIC_URL = '/static/' STATIC_URL = '/static/'
# 设置django的静态文件目录 # 收集静态文件,必须将 MEDIA_ROOT,STATICFILES_DIRS先注释
# python manage.py collectstatic
# STATIC_ROOT=os.path.join(BASE_DIR,'static')
# # 设置django的静态文件目录
STATICFILES_DIRS = [ 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地址前缀 # 访问上传文件的url地址前缀
MEDIA_URL = "/media/" MEDIA_URL = "/media/"
# 项目中存储上传文件的根目录 # 项目中存储上传文件的根目录
@ -160,6 +167,10 @@ LOGGING = {
'format': CONSOLE_LOG_FORMAT, 'format': CONSOLE_LOG_FORMAT,
'datefmt': '%Y-%m-%d %H:%M:%S', 'datefmt': '%Y-%m-%d %H:%M:%S',
}, },
'file': {
'format': CONSOLE_LOG_FORMAT,
'datefmt': '%Y-%m-%d %H:%M:%S',
},
}, },
'handlers': { 'handlers': {
'file': { 'file': {
@ -189,7 +200,7 @@ LOGGING = {
'loggers': { 'loggers': {
# default日志 # default日志
'': { '': {
'handlers': ['console'], 'handlers': ['console','error','file'],
'level': 'INFO', 'level': 'INFO',
}, },
# 数据库相关日志 # 数据库相关日志
@ -247,9 +258,9 @@ JWT_AUTH = {
'JWT_AUTH_HEADER_PREFIX': 'Bearer', # JWT的Header认证头以'JWT '开始 'JWT_AUTH_HEADER_PREFIX': 'Bearer', # JWT的Header认证头以'JWT '开始
'JWT_AUTH_COOKIE': 'AUTH_JWT', 'JWT_AUTH_COOKIE': 'AUTH_JWT',
'JWT_VERIFY_EXPIRATION': True, 'JWT_VERIFY_EXPIRATION': True,
'JWT_PAYLOAD_HANDLER': 'utils.jwt_util.jwt_payload_handler', 'JWT_PAYLOAD_HANDLER': 'apps.vadmin.utils.jwt_util.jwt_payload_handler',
'JWT_GET_USER_SECRET_KEY': 'utils.jwt_util.jwt_get_user_secret_key', 'JWT_GET_USER_SECRET_KEY': 'apps.vadmin.utils.jwt_util.jwt_get_user_secret_key',
'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.jwt_util.jwt_response_payload_handler', 'JWT_RESPONSE_PAYLOAD_HANDLER': 'apps.vadmin.utils.jwt_util.jwt_response_payload_handler',
} }
# ================================================= # # ================================================= #
@ -261,23 +272,24 @@ REST_FRAMEWORK = {
), ),
'DEFAULT_AUTHENTICATION_CLASSES': ( '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.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.SessionAuthentication',
'utils.authentication.RedisOpAuthJwtAuthentication'
), ),
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema', 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), '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 = ( AUTHENTICATION_BACKENDS = (
'utils.backends.CustomBackend', 'apps.vadmin.utils.backends.CustomBackend',
'utils.backends.SessionAuthentication', 'apps.vadmin.utils.backends.SessionAuthentication',
) )
AUTH_USER_MODEL = 'permission.UserProfile' AUTH_USER_MODEL = 'permission.UserProfile'
# username_field # username_field
@ -302,3 +314,7 @@ CAPTCHA_NOISE_FUNCTIONS = (
) )
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_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.helpers import captcha_image_url, captcha_audio_url
from captcha.models import CaptchaStore from captcha.models import CaptchaStore
from django.conf import settings 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.urls import re_path, include
from django.views.static import serve from django.views.static import serve
from rest_framework.documentation import include_docs_urls
from rest_framework.views import APIView from rest_framework.views import APIView
from apps.permission.views import GetUserProfileView, GetRouters from apps.vadmin.op_drf.response import SuccessResponse
from apps.op_drf.response import SuccessResponse
from utils.login import LoginView, LogoutView
class CaptchaRefresh(APIView): class CaptchaRefresh(APIView):
@ -45,18 +40,6 @@ class CaptchaRefresh(APIView):
urlpatterns = [ 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'media/(?P<path>.*)', serve, {"document_root": settings.MEDIA_ROOT}),
re_path(r'^login/$', LoginView.as_view()), re_path(r'^admin/', include('apps.vadmin.urls')),
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')), # 图片验证码 路由
] ]

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): class OpDrfConfig(AppConfig):
name = 'op_drf' name = 'apps.vadmin.op_drf'
verbose_name = "OP DRF" verbose_name = "OP DRF"
def ready(self): 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 import models
from django.db.models import SET_NULL 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): class IdField(models.CharField):

View File

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

View File

@ -16,11 +16,27 @@ class ViewLogger(object):
super().__init__() super().__init__()
self.view = view self.view = view
self.request = request self.request = request
self.model = None
self.log_prefix: str = '' 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): def handle(self, request: Request, *args, **kwargs):
pass pass
def logger(self, msg):
"""
:param msg:
:return: logger
"""
self.request.session['request_msg'] = msg
return logger
class APIViewLogger(ViewLogger): class APIViewLogger(ViewLogger):
""" """
@ -36,7 +52,7 @@ class APIViewLogger(ViewLogger):
""" """
def __init__(self, view=None, request=None, *args, **kwargs) -> None: def __init__(self, view=None, request=None, *args, **kwargs) -> None:
super().__init__() super().__init__(view, request, *args, **kwargs)
self.view: APIView = view self.view: APIView = view
self.request: Request = request self.request: Request = request
self.user = request.user self.user = request.user
@ -52,12 +68,7 @@ class ModelViewLogger(APIViewLogger):
""" """
def __init__(self, view=None, request=None, *args, **kwargs) -> None: def __init__(self, view=None, request=None, *args, **kwargs) -> None:
super().__init__(view, request) super().__init__(view, request, *args, **kwargs)
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
class RelationshipViewLogger(APIViewLogger): class RelationshipViewLogger(APIViewLogger):
@ -103,7 +114,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_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}的关联关系') f'{self.log_prefix}用户[username={operator}]新增, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
def handle_put(self, request: Request, *args, **kwargs): def handle_put(self, request: Request, *args, **kwargs):
@ -114,7 +125,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_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}的关联关系') f'{self.log_prefix}用户[username={operator}]重置, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
def handle_delete(self, request: Request, *args, **kwargs): def handle_delete(self, request: Request, *args, **kwargs):
@ -125,7 +136,7 @@ class CustomerRelationshipViewLogger(RelationshipViewLogger):
model_name = getattr(self.view.model, '_meta').verbose_name model_name = getattr(self.view.model, '_meta').verbose_name
to_field_name = self.view.to_field_name to_field_name = self.view.to_field_name
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_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}的关联关系') f'{self.log_prefix}用户[username={operator}]移除, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
@ -144,7 +155,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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): def handle_list(self, request: Request, *args, **kwargs):
""" """
@ -153,7 +164,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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): def handle_create(self, request: Request, instance: Model = None, *args, **kwargs):
""" """
@ -162,7 +173,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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): def handle_update(self, request: Request, instance: Model = None, *args, **kwargs):
""" """
@ -171,7 +182,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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): def handle_partial_update(self, request: Request, instance: Model = None, *args, **kwargs):
""" """
@ -180,7 +191,7 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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): def handle_destroy(self, request: Request, instance: Model = None, *args, **kwargs):
""" """
@ -189,4 +200,13 @@ class CustomerModelViewLogger(ModelViewLogger):
pass pass
operator = self.user.username operator = self.user.username
model_name = getattr(self.model, '_meta').verbose_name 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 mixins
from rest_framework import serializers from rest_framework import serializers
from rest_framework import status from rest_framework import status
@ -5,6 +6,8 @@ from rest_framework.relations import ManyRelatedField, RelatedField, PrimaryKeyR
from rest_framework.request import Request from rest_framework.request import Request
from .response import SuccessResponse 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): class CreateModelMixin(mixins.CreateModelMixin):
@ -33,10 +36,10 @@ class ListModelMixin(mixins.ListModelMixin):
list_serializer_class = None list_serializer_class = None
def list(self, request: Request, *args, **kwargs): def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if hasattr(self, 'handle_logging'): if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs) self.handle_logging(request, *args, **kwargs)
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None: if page is not None:
if getattr(self, 'values_queryset', None): if getattr(self, 'values_queryset', None):
return self.get_paginated_response(page) return self.get_paginated_response(page)
@ -91,11 +94,25 @@ class DestroyModelMixin(mixins.DestroyModelMixin):
""" """
destroy_serializer_class = None 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): def destroy(self, request: Request, *args, **kwargs):
instance = self.get_object() instance = self.get_object_list()
self.perform_destroy(instance)
if hasattr(self, 'handle_logging'): if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs) self.handle_logging(request, instance=instance, *args, **kwargs)
self.perform_destroy(instance)
return SuccessResponse(status=status.HTTP_204_NO_CONTENT) return SuccessResponse(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance): def perform_destroy(self, instance):
@ -271,3 +288,75 @@ class TableSerializerMixin:
info['type'] = 'select' info['type'] = 'select'
column.append(info) column.append(info)
return column 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, creator = models.ForeignKey(to='permission.UserProfile', related_query_name='creator_query', null=True,
verbose_name='创建者', on_delete=SET_NULL, db_constraint=False) # 创建者 verbose_name='创建者', on_delete=SET_NULL, db_constraint=False) # 创建者
modifier = ModifierCharField() # 修改者 modifier = ModifierCharField() # 修改者
dept_belong_id = models.CharField(max_length=64, verbose_name="数据归属部门", null=True, blank=True)
update_datetime = UpdateDateTimeField() # 修改时间 update_datetime = UpdateDateTimeField() # 修改时间
create_datetime = CreateDateTimeField() # 创建时间 create_datetime = CreateDateTimeField() # 创建时间

View File

@ -15,6 +15,8 @@ class CustomModelSerializer(ModelSerializer):
modifier_field_name = 'modifier' modifier_field_name = 'modifier'
# 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖 # 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖
creator_field_name = '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) 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) 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 validated_data[self.modifier_field_name] = username
if self.creator_field_name in self.fields.fields: if self.creator_field_name in self.fields.fields:
validated_data[self.creator_field_name] = self.request.user 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) return super().create(validated_data)
def update(self, instance, 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.settings import api_settings
from rest_framework.viewsets import ViewSetMixin from rest_framework.viewsets import ViewSetMixin
from utils.exceptions import APIException from ..utils.exceptions import APIException
from . import mixins from . import mixins
from .filters import MongoSearchFilter, MongoOrderingFilter, AdvancedSearchFilter, MongoAdvancedSearchFilter from .filters import MongoSearchFilter, MongoOrderingFilter, AdvancedSearchFilter, MongoAdvancedSearchFilter
from .generics import GenericAPIView from .generics import GenericAPIView
@ -201,7 +201,9 @@ class MongoModelViewSet(mixins.CreateModelMixin,
pass pass
class CustomModelViewSet(ModelViewSet, mixins.TableSerializerMixin): class CustomModelViewSet(ModelViewSet, mixins.TableSerializerMixin,
mixins.ImportSerializerMixin,
mixins.ExportSerializerMixin):
""" """
自定义的ModelViewSet: 自定义的ModelViewSet:
(1)默认分页器就为统一分页器op_drf.pagination.Pagination (1)默认分页器就为统一分页器op_drf.pagination.Pagination

View File

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

View File

@ -1,12 +1,13 @@
import django_filters 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): class MenuFilter(django_filters.rest_framework.FilterSet):
""" """
菜单管理 简单序过滤器 菜单管理 简单序过滤器
""" """
name = django_filters.CharFilter(lookup_expr='icontains')
class Meta: class Meta:
model = Menu model = Menu
@ -17,6 +18,7 @@ class DeptFilter(django_filters.rest_framework.FilterSet):
""" """
部门管理 简单序过滤器 部门管理 简单序过滤器
""" """
deptName = django_filters.CharFilter(lookup_expr='icontains')
class Meta: class Meta:
model = Dept model = Dept
@ -27,6 +29,7 @@ class PostFilter(django_filters.rest_framework.FilterSet):
""" """
岗位管理 简单序过滤器 岗位管理 简单序过滤器
""" """
postName = django_filters.CharFilter(lookup_expr='icontains')
class Meta: class Meta:
model = Post model = Post
@ -37,6 +40,7 @@ class RoleFilter(django_filters.rest_framework.FilterSet):
""" """
角色管理 简单序过滤器 角色管理 简单序过滤器
""" """
roleName = django_filters.CharFilter(lookup_expr='icontains')
class Meta: class Meta:
model = Role 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') deptId = django_filters.CharFilter(field_name='dept__id')
class Meta: class Meta:
model = UserProfile model = UserProfile
exclude = ('secret', 'password',) 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 CASCADE
from django.db.models import CharField, IntegerField, ForeignKey from django.db.models import CharField, IntegerField, ForeignKey
from apps.op_drf.models import CoreModel from ...op_drf.models import CoreModel
class Dept(CoreModel): class Dept(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, ForeignKey, CharField, CASCADE 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): class Menu(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, BooleanField, CharField, TextField 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): class Post(CoreModel):

View File

@ -1,6 +1,6 @@
from django.db.models import IntegerField, BooleanField, CharField, TextField, ManyToManyField 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): class Role(CoreModel):

View File

@ -3,7 +3,7 @@ from uuid import uuid4
from django.contrib.auth.models import UserManager, AbstractUser from django.contrib.auth.models import UserManager, AbstractUser
from django.db.models import IntegerField, ForeignKey, CharField, TextField, ManyToManyField, CASCADE 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): class UserProfile(AbstractUser):
@ -24,6 +24,7 @@ class UserProfile(AbstractUser):
post = ManyToManyField(to='Post', verbose_name='关联岗位', db_constraint=False) post = ManyToManyField(to='Post', verbose_name='关联岗位', db_constraint=False)
role = ManyToManyField(to='Role', 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 = 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() create_datetime = CreateDateTimeField()
update_datetime = UpdateDateTimeField() update_datetime = UpdateDateTimeField()

View File

@ -1,8 +1,10 @@
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import empty
from rest_framework.validators import UniqueValidator from rest_framework.validators import UniqueValidator
from apps.op_drf.serializers import CustomModelSerializer from ..op_drf.serializers import CustomModelSerializer
from apps.permission.models import Menu, Dept, Post, Role, UserProfile 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) admin = serializers.SerializerMethodField(read_only=True)
deptId = serializers.IntegerField(source='dept.id', 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): def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True) role_list = obj.role.all().values_list('admin', flat=True)
@ -220,12 +222,8 @@ class UserProfileSerializer(CustomModelSerializer):
return True return True
return False return False
# def get_unread_msg_count(self, obj: UserProfile): def get_unread_msg_count(self, obj: UserProfile):
# UserProfile.objects.all() return MessagePush.objects.filter(status='2').exclude(user=obj,messagepushuser_message_push__is_read=True).count()
# role_list = obj.role.all().values_list('admin', flat=True)
# if True in list(set(role_list)):
# return True
# return False
class Meta: class Meta:
model = UserProfile model = UserProfile
@ -288,3 +286,25 @@ class UserProfileCreateUpdateSerializer(CustomModelSerializer):
model = UserProfile model = UserProfile
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined') exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')
read_only_fields = ('dept',) 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 django.urls import re_path
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.permission.views import MenuModelViewSet, DeptModelViewSet, PostModelViewSet, RoleModelViewSet, \ from ..permission.views import MenuModelViewSet, DeptModelViewSet, PostModelViewSet, RoleModelViewSet, \
UserProfileModelViewSet UserProfileModelViewSet
router = DefaultRouter() router = DefaultRouter()
@ -29,13 +29,16 @@ urlpatterns = [
# 用户自己重置密码 # 用户自己重置密码
re_path('user/profile/updatePwd/', UserProfileModelViewSet.as_view({'put': 'update_pwd'})), 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 urlpatterns += router.urls

View File

@ -2,16 +2,18 @@ from django.contrib.auth import authenticate
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.views import APIView from rest_framework.views import APIView
from apps.op_drf.viewsets import CustomModelViewSet from ..op_drf.filters import DataLevelPermissionsFilter
from apps.permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter from ..op_drf.viewsets import CustomModelViewSet
from apps.permission.models import Role, Menu, Dept, Post, UserProfile from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter
from apps.permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \ from ..permission.models import Role, Menu, Dept, Post, UserProfile
from ..permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \
MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \ MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \
RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \ RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \
PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer, \
from apps.op_drf.filters import DataLevelPermissionsFilter UserProfileImportSerializer
from utils.export_excel import export_excel_save_model from ..system.models import DictDetails
from utils.response import SuccessResponse, ErrorResponse from ..utils.export_excel import export_excel_save_model, excel_to_data
from ..utils.response import SuccessResponse, ErrorResponse
class GetUserProfileView(APIView): class GetUserProfileView(APIView):
@ -21,7 +23,7 @@ class GetUserProfileView(APIView):
def get(self, request, format=None): def get(self, request, format=None):
user_dict = UserProfileSerializer(request.user).data 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) role__userprofile=request.user).values_list('perms', flat=True)
return SuccessResponse({ return SuccessResponse({
'permissions': [ele for ele in permissions_list if ele], 'permissions': [ele for ele in permissions_list if ele],
@ -46,25 +48,27 @@ class GetRouters(APIView):
def get(self, request, format=None): def get(self, request, format=None):
# data = GetUserInfoSerializer(request.user).data # 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', 'web_path',
'visible', 'status', 'visible', 'status',
'isFrame', 'isFrame',
'component_path', 'component_path',
'icon', 'parentId', 'icon', 'parentId',
'isCache').distinct() '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 = json.loads(data)
data = [] data = []
sys_show_hide = DictDetails.get_default_dictValue('sys_show_hide')
for ele in menus: for ele in menus:
data.append({ data.append({
'id': ele.get('id'), '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'), 'path': ele.get('web_path'),
'hidden': True if ele.get('visible') != '1' else False, 'hidden': True if ele.get('visible') != '1' else False,
'redirect': ele.get('web_path') if ele.get('isFrame') == '1' else 'noRedirect', 'redirect': ele.get('web_path') if ele.get('isFrame') == '1' else 'noRedirect',
'component': ele.get('component_path') or 'Layout', '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') 'parentId': ele.get('parentId')
}) })
return SuccessResponse(data) return SuccessResponse(data)
@ -252,6 +256,15 @@ class UserProfileModelViewSet(CustomModelViewSet):
update_serializer_class = UserProfileCreateUpdateSerializer update_serializer_class = UserProfileCreateUpdateSerializer
filter_class = UserProfileFilter filter_class = UserProfileFilter
extra_filter_backends = [DataLevelPermissionsFilter] 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,) # update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,) # destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,) # create_extra_permission_classes = (IsManagerPermission,)
@ -364,15 +377,3 @@ class UserProfileModelViewSet(CustomModelViewSet):
if hasattr(self, 'handle_logging'): if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs) self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data) 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') :param filename: 例如os.path.join('permission','permission_dept.sql')
:return: :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: with open(pwd,'rb') as fp:
content = fp.read().decode('utf8') 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 -- 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` (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` 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 (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 -- 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 -- Records of permission_userprofile_post
-- ---------------------------- -- ----------------------------
INSERT INTO `permission_userprofile_post` VALUES (1, 1, 1); INSERT INTO `permission_userprofile_post` (id, userprofile_id, post_id) VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_post` VALUES (2, 2, 4); INSERT INTO `permission_userprofile_post` (id, userprofile_id, post_id) VALUES (2, 2, 4);
-- ---------------------------- -- ----------------------------
-- Table structure for permission_userprofile_role -- Table structure for permission_userprofile_role
@ -72,5 +72,5 @@ INSERT INTO `permission_userprofile_post` VALUES (2, 2, 4);
-- ---------------------------- -- ----------------------------
-- Records of permission_userprofile_role -- Records of permission_userprofile_role
-- ---------------------------- -- ----------------------------
INSERT INTO `permission_userprofile_role` VALUES (1, 1, 1); INSERT INTO `permission_userprofile_role` (id, userprofile_id, role_id) VALUES (1, 1, 1);
INSERT INTO `permission_userprofile_role` VALUES (2, 2, 2); 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): class PermissionConfig(AppConfig):
name = 'permission' name = 'vadmin.system'
verbose_name = "权限管理" 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.web_set import WebSet
from ..models.save_file import SaveFile from ..models.save_file import SaveFile
from ..models.message_push import MessagePush 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 django.db.models import CharField, ForeignKey, BooleanField, CASCADE
from apps.op_drf.models import CoreModel from ...op_drf.models import CoreModel
class ConfigSettings(CoreModel): class ConfigSettings(CoreModel):

View File

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

View File

@ -1,6 +1,6 @@
from django.db.models import CharField, ForeignKey, BooleanField, CASCADE 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): class DictDetails(CoreModel):
@ -9,9 +9,14 @@ class DictDetails(CoreModel):
is_default = BooleanField(verbose_name="是否默认", default=False) is_default = BooleanField(verbose_name="是否默认", default=False)
status = CharField(max_length=2, verbose_name="字典状态") status = CharField(max_length=2, verbose_name="字典状态")
sort = CharField(max_length=256, 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) 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: class Meta:
verbose_name = '字典详情' verbose_name = '字典详情'
verbose_name_plural = 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 import models
from django.db.models import * from django.db.models import *
from apps.op_drf.fields import UpdateDateTimeField, CreateDateTimeField from ...op_drf.fields import UpdateDateTimeField, CreateDateTimeField
from apps.op_drf.models import CoreModel from ...op_drf.models import CoreModel
from apps.permission.models import UserProfile from ...permission.models import UserProfile
""" """
消息通知模型 消息通知模型
@ -13,15 +13,16 @@ from apps.permission.models import UserProfile
class MessagePush(CoreModel): class MessagePush(CoreModel):
title = CharField(max_length=128, verbose_name="通知标题") title = CharField(max_length=128, verbose_name="通知标题")
content = TextField(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="是否审核") 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", user = ManyToManyField(to="permission.UserProfile",
related_name="user", related_query_name="user_query", through='MessagePushUser', related_name="user", related_query_name="user_query", through='MessagePushUser',
through_fields=('message_push', 'user')) through_fields=('message_push', 'user'))
class Meta: class Meta:
verbose_name = '消息通知' verbose_name = '通知公告'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
def __str__(self): def __str__(self):
@ -41,5 +42,5 @@ class MessagePushUser(models.Model):
create_datetime = CreateDateTimeField() # 创建时间 create_datetime = CreateDateTimeField() # 创建时间
class Meta: class Meta:
verbose_name = "消息通知与用户关系" verbose_name = "通知公告与用户关系"
verbose_name_plural = 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.db.models import CharField, FileField,BooleanField
from django.utils import timezone from django.utils import timezone
from apps.op_drf.models import CoreModel from ...op_drf.models import CoreModel
def files_path(instance, filename): def files_path(instance, filename):

View File

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

View File

@ -1,8 +1,8 @@
from rest_framework import serializers from rest_framework import serializers
from apps.op_drf.serializers import CustomModelSerializer from .models import LoginInfor, OperationLog
from apps.permission.serializers import UserProfileSerializer from ..op_drf.serializers import CustomModelSerializer
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush 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: class Meta:
model = MessagePush model = MessagePush
@ -198,5 +193,83 @@ class ExportMessagePushSerializer(CustomModelSerializer):
class Meta: class Meta:
model = MessagePush model = MessagePush
fields = ( fields = (
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier', 'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'update_datetime', 'create_datetime') '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 django.urls import re_path
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.system.views import DictDataModelViewSet, DictDetailsModelViewSet, \ from ..system.views import DictDataModelViewSet, DictDetailsModelViewSet, \
ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet, SystemInfoApiView ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet, LoginInforModelViewSet, \
OperationLogModelViewSet
router = DefaultRouter() router = DefaultRouter()
router.register(r'dict/type', DictDataModelViewSet) router.register(r'dict/type', DictDataModelViewSet)
@ -10,6 +11,9 @@ router.register(r'dict/data', DictDetailsModelViewSet)
router.register(r'config', ConfigSettingsModelViewSet) router.register(r'config', ConfigSettingsModelViewSet)
router.register(r'savefile', SaveFileModelViewSet) router.register(r'savefile', SaveFileModelViewSet)
router.register(r'message', MessagePushModelViewSet) router.register(r'message', MessagePushModelViewSet)
router.register(r'logininfor', LoginInforModelViewSet)
router.register(r'operation_log', OperationLogModelViewSet)
urlpatterns = [ urlpatterns = [
re_path('dict/get/type/(?P<pk>.*)/', DictDetailsModelViewSet.as_view({'get': 'dict_details_list'})), 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'})), 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/receive/', MessagePushModelViewSet.as_view({"get": "get_received_messages"})),
# 消息通知导出 # 消息通知导出
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export',})), re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export', })),
# 用户个人消息列表
re_path('sys/info/', SystemInfoApiView.as_view()) 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 urlpatterns += router.urls

View File

@ -1,18 +1,21 @@
from django.db.models import Q
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.views import APIView
from apps.op_drf.filters import DataLevelPermissionsFilter from .models import LoginInfor, OperationLog
from apps.op_drf.viewsets import CustomModelViewSet from ..op_drf.filters import DataLevelPermissionsFilter
from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter from ..op_drf.viewsets import CustomModelViewSet
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush from ..system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter, MessagePushFilter, \
from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \ 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, \ DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \ ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \
ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \ ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \
MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer, LoginInforSerializer, \
from utils.export_excel import export_excel_save_model OperationLogSerializer, ExportOperationLogSerializer, ExportLoginInforSerializer
from utils.response import SuccessResponse from ..utils.export_excel import export_excel_save_model
from utils.system_info_utils import get_memory_used_percent, get_cpu_used_percent, get_disk_used_percent from ..utils.response import SuccessResponse
class DictDataModelViewSet(CustomModelViewSet): class DictDataModelViewSet(CustomModelViewSet):
@ -25,6 +28,7 @@ class DictDataModelViewSet(CustomModelViewSet):
update_serializer_class = DictDataCreateUpdateSerializer update_serializer_class = DictDataCreateUpdateSerializer
# list_serializer_class = ListRoleSerializer # list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer # retrieve_serializer_class = DetailRoleSerializer
extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = DictDataFilter filter_class = DictDataFilter
# update_extra_permission_classes = (IsManagerPermission,) # update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,) # destroy_extra_permission_classes = (IsManagerPermission,)
@ -133,16 +137,16 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
class SaveFileModelViewSet(CustomModelViewSet): class SaveFileModelViewSet(CustomModelViewSet):
""" """
参数设置 模型的CRUD视图 文件管理 模型的CRUD视图
""" """
queryset = SaveFile.objects.all() queryset = SaveFile.objects.all()
serializer_class = SaveFileSerializer serializer_class = SaveFileSerializer
create_serializer_class = SaveFileCreateUpdateSerializer create_serializer_class = SaveFileCreateUpdateSerializer
update_serializer_class = SaveFileCreateUpdateSerializer update_serializer_class = SaveFileCreateUpdateSerializer
# filter_class = ConfigSettingsFilter filter_class = SaveFileFilter
extra_filter_backends = [DataLevelPermissionsFilter] extra_filter_backends = [DataLevelPermissionsFilter]
search_fields = ('configName',) search_fields = ('configName',)
ordering = 'id' # 默认排序 ordering = '-create_datetime' # 默认排序
class MessagePushModelViewSet(CustomModelViewSet): class MessagePushModelViewSet(CustomModelViewSet):
@ -154,6 +158,7 @@ class MessagePushModelViewSet(CustomModelViewSet):
create_serializer_class = MessagePushCreateUpdateSerializer create_serializer_class = MessagePushCreateUpdateSerializer
update_serializer_class = MessagePushCreateUpdateSerializer update_serializer_class = MessagePushCreateUpdateSerializer
extra_filter_backends = [DataLevelPermissionsFilter] extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = MessagePushFilter
ordering = "-update_datetime" # 默认排序 ordering = "-update_datetime" # 默认排序
def get_message_list(self, request: Request, *args, **kwargs): def get_message_list(self, request: Request, *args, **kwargs):
@ -164,13 +169,19 @@ class MessagePushModelViewSet(CustomModelViewSet):
data = MessagePushSerializer(messages, many=True) data = MessagePushSerializer(messages, many=True)
return SuccessResponse(msg="返回", data=data) 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 = 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) page = self.paginate_queryset(queryset)
if hasattr(self, 'handle_logging'): if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs) self.handle_logging(request, *args, **kwargs)
@ -184,11 +195,14 @@ class MessagePushModelViewSet(CustomModelViewSet):
serializer = self.get_serializer(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
return SuccessResponse(serializer.data) 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): 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')) 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): 操作日志 模型的CRUD视图
# 获取内存使用率 """
memory_used_percent = get_memory_used_percent() queryset = OperationLog.objects.all()
# 获取cpu使用率 serializer_class = OperationLogSerializer
cpu_used_percent = get_cpu_used_percent() filter_class = OperationLogFilter
# 获取硬盘使用率 extra_filter_backends = [DataLevelPermissionsFilter]
disk_used_percent = get_disk_used_percent() ordering = '-create_datetime' # 默认排序
return SuccessResponse(data={"memory_used_percent": memory_used_percent, export_field_data = ['请求模块', '请求地址', '请求参数', '请求方式', '操作说明', '请求ip地址',
"cpu_used_percent": cpu_used_percent, '请求浏览器', '响应状态码', '操作地点', '操作系统', '返回信息', '响应状态', '操作用户名']
"disk_used_percent": disk_used_percent 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 logging
import jwt
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.cache import cache from django.core.cache import cache
from django.utils.six import text_type 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 rest_framework_jwt.utils import jwt_decode_handler
from .decorators import exceptionHandler from .decorators import exceptionHandler
from .jwt_util import jwt_get_session_id
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
User = get_user_model() User = get_user_model()
@ -20,12 +24,21 @@ class OpAuthJwtAuthentication(object):
统一JWT认证(环境允许情况下, 推荐使用RedisOpAuthJwtAuthentication) 统一JWT认证(环境允许情况下, 推荐使用RedisOpAuthJwtAuthentication)
""" """
@exceptionHandler()
def authenticate(self, request): def authenticate(self, request):
token = self.get_header_authorization(request) or self.get_cookie_authorization(request) token = self.get_header_authorization(request) or self.get_cookie_authorization(request)
if not token: if not token:
return None 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) username = payload.get('username', None)
if not username: if not username:
return None return None
@ -51,7 +64,7 @@ class OpAuthJwtAuthentication(object):
if not auth: if not auth:
return '' return ''
auth = str(auth, encoding='utf-8').split() 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 ''
return auth[1] return auth[1]
@ -75,15 +88,15 @@ class RedisOpAuthJwtAuthentication(OpAuthJwtAuthentication):
""" """
prefix = settings.JWT_AUTH.get('JWT_AUTH_HEADER_PREFIX', 'JWT') prefix = settings.JWT_AUTH.get('JWT_AUTH_HEADER_PREFIX', 'JWT')
@exceptionHandler()
def authenticate(self, request): def authenticate(self, request):
res = super().authenticate(request) res = super().authenticate(request)
if res: if res:
user, token = super().authenticate(request) user, token = res
key = f"{self.prefix}_{user.username}" session_id = jwt_get_session_id(token)
key = f"{self.prefix}_{session_id}_{user.username}"
redis_token = cache.get(key) redis_token = cache.get(key)
if redis_token == token: if redis_token == token:
return user, token return user, token
else: else:
return None raise exceptions.AuthenticationFailed("登录信息失效,请重新登录!")
return None return None

View File

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

View File

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

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