docker_env:删除docker中的nginx、dvadmin-doc;权限管理:对数据的增删改查的权限控制
							parent
							
								
									1f5f0478da
								
							
						
					
					
						commit
						6ce0c3acdf
					
				| 
						 | 
				
			
			@ -25,25 +25,6 @@ services:
 | 
			
		|||
        npm run build:prod
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  dvadmin-doc:
 | 
			
		||||
    container_name: dvadmin-doc
 | 
			
		||||
    build:
 | 
			
		||||
      context: ./
 | 
			
		||||
      dockerfile: ./docker_env/vue-doc/Dockerfile
 | 
			
		||||
    environment:
 | 
			
		||||
      TZ: Asia/Shanghai
 | 
			
		||||
    volumes:
 | 
			
		||||
      - "./dvadmin-doc:/dvadmin-doc"
 | 
			
		||||
    command:
 | 
			
		||||
      - /bin/bash
 | 
			
		||||
      - -c
 | 
			
		||||
      - |
 | 
			
		||||
        cd /dvadmin-doc
 | 
			
		||||
        npm install --registry=https://registry.npm.taobao.org
 | 
			
		||||
        rm -rf /dvadmin-doc/dist
 | 
			
		||||
        npm run docs:build
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  dvadmin-redis:
 | 
			
		||||
    image: redis:latest
 | 
			
		||||
    container_name: dvadmin-redis
 | 
			
		||||
| 
						 | 
				
			
			@ -134,32 +115,3 @@ services:
 | 
			
		|||
    restart: always
 | 
			
		||||
    networks:
 | 
			
		||||
      - dvadmin_net
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  dvadmin-nginx:
 | 
			
		||||
    image: nginx:latest
 | 
			
		||||
    container_name: dvadmin-nginx
 | 
			
		||||
    # build: ./docker_env/nginx
 | 
			
		||||
    restart: always
 | 
			
		||||
    ports:
 | 
			
		||||
      - "80:80"
 | 
			
		||||
      - "443:443"
 | 
			
		||||
    expose:
 | 
			
		||||
      - "80"
 | 
			
		||||
      - "443"
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./docker_env/nginx/nginx.conf:/etc/nginx/nginx.conf
 | 
			
		||||
      - ./docker_env/nginx/sites-enabled:/etc/nginx/sites-enabled
 | 
			
		||||
      - ./docker_env/nginx/keys:/nginx/keys
 | 
			
		||||
      - ./dvadmin-backend:/dvadmin-backend
 | 
			
		||||
      - ./dvadmin-doc:/dvadmin-doc
 | 
			
		||||
      - ./dvadmin-ui:/dvadmin-ui
 | 
			
		||||
      - ./logs/nginx:/var/log/nginx
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - dvadmin-django
 | 
			
		||||
    networks:
 | 
			
		||||
      - dvadmin_net
 | 
			
		||||
 | 
			
		||||
networks:
 | 
			
		||||
  dvadmin_net:
 | 
			
		||||
    driver: bridge
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +0,0 @@
 | 
			
		|||
FROM nginx:latest
 | 
			
		||||
 | 
			
		||||
COPY nginx.conf /etc/nginx/nginx.conf
 | 
			
		||||
 | 
			
		||||
CMD ["nginx", "-g", "daemon off;"]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIFoTCCBImgAwIBAgIQA4TN09XlucVnL4BLCuvHijANBgkqhkiG9w0BAQsFADBy
 | 
			
		||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
 | 
			
		||||
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
 | 
			
		||||
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMwMzAwMDAwMFoXDTIyMDMwMjIzNTk1
 | 
			
		||||
OVowIzEhMB8GA1UEAxMYYXBpLmRqYW5nby12dWUtYWRtaW4uY29tMIIBIjANBgkq
 | 
			
		||||
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5QSBTQbToLUu4wCYy/BNoinqFkXiTZE
 | 
			
		||||
aV6/5PJIeNsz75fnAEuBpIATEHqRsY6L9HdYAvBiAEv6ufCZhzwWF7ph1ZMhg6ul
 | 
			
		||||
foaQwoVCkbKi/zgwi3tvteda5vXQs4e8GvgZ6zkabQ4cZFjVpb3dA6huBbs20jLf
 | 
			
		||||
YYXsXWsJEGF3JK5okQ08+u/h/q0lFDFa70S9hpQXMtSfCCW/AuEc/+tG7rnUul1o
 | 
			
		||||
MXjpVnDOmg+CZfIYgi9D30/zd1DYFJOEwawl5FKLFQY7TOn3RlZ3SR4mNbbhIgHP
 | 
			
		||||
L9S1xHGcm8UC7PKuOgh8+5Nl0aeeUB1liuzM/w5JbF4L4FoZW6ciNQIDAQABo4IC
 | 
			
		||||
gDCCAnwwHwYDVR0jBBgwFoAUf9OZ86BHDjEAVlYijrfMnt3KAYowHQYDVR0OBBYE
 | 
			
		||||
FHvXBhsuPta7SwvCVVgv9e/bZ9AeMCMGA1UdEQQcMBqCGGFwaS5kamFuZ28tdnVl
 | 
			
		||||
LWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
 | 
			
		||||
CCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0
 | 
			
		||||
dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYIKwYBBQUHAQEEgYUwgYIwNAYI
 | 
			
		||||
KwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0YWxjZXJ0dmFsaWRhdGlvbi5j
 | 
			
		||||
b20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRzLmRpZ2l0YWxjZXJ0dmFsaWRh
 | 
			
		||||
dGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0MAkGA1UdEwQCMAAwggEEBgor
 | 
			
		||||
BgEEAdZ5AgQCBIH1BIHyAPAAdgApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZc
 | 
			
		||||
JV3HhAAAAXf48Te1AAAEAwBHMEUCIDjqPKTNX4EcFxayaLirTT1y98X9X1HP97bM
 | 
			
		||||
IV0HpJmYAiEAjMdYYUqFuHLkSl4/bq5F/FPtt25AbKGhyolIVDWvsNoAdgAiRUUH
 | 
			
		||||
WVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXf48TgFAAAEAwBHMEUCIBQM
 | 
			
		||||
bXvVtAOXQfBjp+7HzsyWH51BZ2vyH1VyLpuGSs7dAiEAiyt4h7P7oRheoZKmn8wp
 | 
			
		||||
CptaYocY509Dr8aFbCicWWAwDQYJKoZIhvcNAQELBQADggEBAJG3Ne57IlaucGjH
 | 
			
		||||
y6j/zJsRnCsIrVNoPUROma+2FD7SauHT6U7iDLtNT5BIrBmDcEnYdqMAjJQoRJC1
 | 
			
		||||
VvXSkABEngUajpdpB0m8k9UVB5W+6Extt8TYyRLu1/Xpq0JHiOg+rPYK3UljYybG
 | 
			
		||||
2V9KWNhYd2G5yg0+1ZzvaC3zEFIfQJpuESio6hEbilT6FLeVC8TabL0/2tqE12n/
 | 
			
		||||
uWYU3Pr9AokD0OQkzN4BUswwIpYBfAXa6HLvj+V6tLOthxY0PLuOm7WiwU2MP0bz
 | 
			
		||||
dq6LIFu0z8fkwBkkqXXtgSfCigqvRhybaKKF0FT4cdJUb0cfMhUshlzWpJ5EEskO
 | 
			
		||||
46xDUok=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
 | 
			
		||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
 | 
			
		||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
 | 
			
		||||
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
 | 
			
		||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
 | 
			
		||||
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
 | 
			
		||||
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
 | 
			
		||||
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
 | 
			
		||||
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
 | 
			
		||||
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
 | 
			
		||||
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
 | 
			
		||||
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
 | 
			
		||||
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
 | 
			
		||||
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
 | 
			
		||||
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
 | 
			
		||||
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
 | 
			
		||||
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
 | 
			
		||||
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
 | 
			
		||||
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
 | 
			
		||||
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
 | 
			
		||||
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
 | 
			
		||||
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
 | 
			
		||||
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
 | 
			
		||||
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
 | 
			
		||||
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
 | 
			
		||||
RmE=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIEowIBAAKCAQEAu5QSBTQbToLUu4wCYy/BNoinqFkXiTZEaV6/5PJIeNsz75fn
 | 
			
		||||
AEuBpIATEHqRsY6L9HdYAvBiAEv6ufCZhzwWF7ph1ZMhg6ulfoaQwoVCkbKi/zgw
 | 
			
		||||
i3tvteda5vXQs4e8GvgZ6zkabQ4cZFjVpb3dA6huBbs20jLfYYXsXWsJEGF3JK5o
 | 
			
		||||
kQ08+u/h/q0lFDFa70S9hpQXMtSfCCW/AuEc/+tG7rnUul1oMXjpVnDOmg+CZfIY
 | 
			
		||||
gi9D30/zd1DYFJOEwawl5FKLFQY7TOn3RlZ3SR4mNbbhIgHPL9S1xHGcm8UC7PKu
 | 
			
		||||
Ogh8+5Nl0aeeUB1liuzM/w5JbF4L4FoZW6ciNQIDAQABAoIBAAEnd9Xq3GknAm6V
 | 
			
		||||
/bTFCDQQ8rElPTEVsaWRVO5wdDQ0KxVkEqKMlGNh+1wMWQWl6iQKsPKxrnSwgv4u
 | 
			
		||||
Zg9wNfWW6r+w7FGeVoIZC157Ce4SEpEt9BSDoawVnJhTtmFIakajNKufGhPGNLQE
 | 
			
		||||
XOosaSX63RRxcrSn5fp4Y7wuaqucXzPV3MuRABrDTHugW1O37570HLwvY9Hmf2+N
 | 
			
		||||
WIqEasCjeZ575EwTcqqVwB/j3BNqyrbkxP6aFszxYdMvlK/mpPhrShV6+QmuP02j
 | 
			
		||||
OvRt9HM8knUVzsGJzuDk5V5VUGejih3VZO1BuqP1LFb1j4siWBoKpVQrP0wSJzaa
 | 
			
		||||
5Vru/wECgYEA9SygrrkPESbjSLYIJU4mRmC4zSqbUoWpvTgpK29nNmif7BSJ9bRr
 | 
			
		||||
2QSCIho58a0bl3a7GLwY0dnEyDYKF9nTQ8HqlkvwRwxdMql+0hU0o5hOBnljYoyM
 | 
			
		||||
BBptFvoihCe2se+1FEQkunAFCDph00S5utz+8uTlHSFiSy/fQ4GOZwECgYEAw9xl
 | 
			
		||||
kZOPSGNEd69F9gtkOAT0kWuazvePSoeYNldZ/MZyE0zE4Wyh5Dk8y5cBt3Pw0ZTr
 | 
			
		||||
NN1dc24EkjcFIBop4Me5n5zKr4rH1XKsUQ2jaTurp/fVQwGo820n+ChO8cIEobHY
 | 
			
		||||
p6wmKopnnDKOATMjZd8hg+Gck7qWoeTxk3XizzUCgYAFGGJWfz4S6y36Ct5seA1P
 | 
			
		||||
lR8CFIqZ0nFOn2YrousQNGhubZbYZmF/ZxqVPtpJbYGPSkZlIzOY2N/AEW9wQ3Si
 | 
			
		||||
idsoOHfL4jPlo6QhFZO8eqPUep1YJPeb9jiiK5ygBntDg2nN/ASPY1iXbS8vRtRd
 | 
			
		||||
T850mdExI8p5KYuISZ7+AQKBgHF/ENhoErqW04ErbzYh6cRQksyF92KBsGY25uxu
 | 
			
		||||
d/XzpP0sGlaq1bFjvagYbGU7aUx5qEatFE8kbL+x5GVy49uewSEOAaHxoNU+qz4Y
 | 
			
		||||
0h3T9yfRhKJcnuPY2DWEXiLYFEkCvxKCvmceZuXrocBuOs/4mfpLTamJkWplOdwC
 | 
			
		||||
jxkVAoGBALU/996M9frxtjvzQdF3ncbKrDcptZN6s1hIBVk1t2PzcT0XgiOUZRqj
 | 
			
		||||
jvUqZWg7MV6kovdjg7N2KSE0u9p2nysL4ejvZRKMNNBdaFJvOUcaYCMTHok1KfXp
 | 
			
		||||
Bq75mMgfFLrY+huWzKdRWkEjqD6A05Us48iuikW5Ec32sI6mUzg9
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIFrDCCBJSgAwIBAgIQDw9E1qRxoRsSagKtIUbGJzANBgkqhkiG9w0BAQsFADBy
 | 
			
		||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
 | 
			
		||||
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
 | 
			
		||||
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
 | 
			
		||||
OVowKTEnMCUGA1UEAxMeZGFpbHkuYXBpLmRqYW5nby12dWUtYWRtaW4uY29tMIIB
 | 
			
		||||
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyijP5M9nLFbIimHuhYl4cK7C
 | 
			
		||||
e4SewgiERRThx+4/iLzFKMVHpSQ0GgcSN7e6tLlfgMzRcUbAnUsia4bzcp0UG+w0
 | 
			
		||||
Ny6OrFF7XuU71YQ3B+35NpfAvJGr7pw71aFpl1l+jz9iym4iw6yN5F8poq6TR7Gl
 | 
			
		||||
PNhX1YWZ+Wy0MCDnvQ00MBsQ/42CGEPzE6ZdKJ3l19NY/9/djnxZE+OgMVR3cdCI
 | 
			
		||||
I/Et0mahIWYaPGP14/nIzNfOcEZtJMHmgSGF/l9NyUdsrRRK7ltV87YWeU86e2Da
 | 
			
		||||
hqW9v0oSOLepOzg4PB4wU2IJfykRMXfJNUG6iWjOMVPdqIFTXjJZvtvZg5J4GQID
 | 
			
		||||
AQABo4IChTCCAoEwHwYDVR0jBBgwFoAUf9OZ86BHDjEAVlYijrfMnt3KAYowHQYD
 | 
			
		||||
VR0OBBYEFOqwsoYN4FxXPwL2my2kdh/PuVB4MCkGA1UdEQQiMCCCHmRhaWx5LmFw
 | 
			
		||||
aS5kamFuZ28tdnVlLWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
 | 
			
		||||
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYI
 | 
			
		||||
KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYIKwYBBQUH
 | 
			
		||||
AQEEgYUwgYIwNAYIKwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0YWxjZXJ0
 | 
			
		||||
dmFsaWRhdGlvbi5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRzLmRpZ2l0
 | 
			
		||||
YWxjZXJ0dmFsaWRhdGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0MAkGA1Ud
 | 
			
		||||
EwQCMAAwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQBGpVXrdfqRIDC1oolp9PN9
 | 
			
		||||
ESxBdL79SbiFq/L8cP5tRwAAAXhNdRxuAAAEAwBGMEQCICntYjFg4csRL4bxiJvr
 | 
			
		||||
ma95JmMzYRrLx84UgLbd1iWhAiB64xH69vjCf4JfVB+3G1UN6G4pphW4m/nYBA2E
 | 
			
		||||
ElFuIgB2ACJFRQdZVSRWlj+hL/H3bYbgIyZjrcBLf13Gg1xu4g8CAAABeE11HF4A
 | 
			
		||||
AAQDAEcwRQIhANsjDO2cASF5sGZCyjS8jz9qA+5N4WWFxG+tO4VyELjtAiAIqurr
 | 
			
		||||
QbHF9fkBFDg995q5eR16ncpS1d75a0Nhis62PjANBgkqhkiG9w0BAQsFAAOCAQEA
 | 
			
		||||
DADo2zekDxm3zbuHGAlQR17h4BtD3tRDy58J58L5CnL+VhNLAN2Fp4AQF1w4a4+z
 | 
			
		||||
89ZFOKn+RcwSwyYDFHqsKYa7QYL97z7GJ1ASPG79faO5osbo1SOrSdwzIjjUnSD5
 | 
			
		||||
V4Fr0Fw6NYkq72pJPZkPEeivGEG3MvhzTaFSTwkylDVx6wxzaPY/p9WJpbopKN/8
 | 
			
		||||
+2WSM0b6UB1cuOgfJlhcqYYFqAPO/2XLY60uPpKgboPFAznT8T2QSaYd7JXHndYJ
 | 
			
		||||
IgTtXPr7hPOeXP9kDdUycCf3WOjp00gSk/guSujW4ZEaqCrJOkiMCbOrgyCIF7AK
 | 
			
		||||
pzwp4H5aJpzHXqObsb5n3Q==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
 | 
			
		||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
 | 
			
		||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
 | 
			
		||||
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
 | 
			
		||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
 | 
			
		||||
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
 | 
			
		||||
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
 | 
			
		||||
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
 | 
			
		||||
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
 | 
			
		||||
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
 | 
			
		||||
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
 | 
			
		||||
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
 | 
			
		||||
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
 | 
			
		||||
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
 | 
			
		||||
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
 | 
			
		||||
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
 | 
			
		||||
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
 | 
			
		||||
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
 | 
			
		||||
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
 | 
			
		||||
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
 | 
			
		||||
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
 | 
			
		||||
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
 | 
			
		||||
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
 | 
			
		||||
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
 | 
			
		||||
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
 | 
			
		||||
RmE=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIEowIBAAKCAQEAyijP5M9nLFbIimHuhYl4cK7Ce4SewgiERRThx+4/iLzFKMVH
 | 
			
		||||
pSQ0GgcSN7e6tLlfgMzRcUbAnUsia4bzcp0UG+w0Ny6OrFF7XuU71YQ3B+35NpfA
 | 
			
		||||
vJGr7pw71aFpl1l+jz9iym4iw6yN5F8poq6TR7GlPNhX1YWZ+Wy0MCDnvQ00MBsQ
 | 
			
		||||
/42CGEPzE6ZdKJ3l19NY/9/djnxZE+OgMVR3cdCII/Et0mahIWYaPGP14/nIzNfO
 | 
			
		||||
cEZtJMHmgSGF/l9NyUdsrRRK7ltV87YWeU86e2DahqW9v0oSOLepOzg4PB4wU2IJ
 | 
			
		||||
fykRMXfJNUG6iWjOMVPdqIFTXjJZvtvZg5J4GQIDAQABAoIBAFYjOqXXe7IoTi2s
 | 
			
		||||
mbnbf+6fgC2qLg0mHNnkkmmiif7E1EtRd/wVJ4AZmDkWd57ux5M1cl6OU58R9xoS
 | 
			
		||||
9+NTq9BT/lGu7ErfMy6VhT+upNYjn4cT9SND/Jrghhw6OSgskWEPFJSFhhmTCiiP
 | 
			
		||||
Jcn0EbxAJNR+qDpKQXfGSiahtqxV01kNRU/j6YmVrQEoVif/9+LJmcs5Uy+gqA4a
 | 
			
		||||
fQou8/QQjrmPHPOSSWZ8aZlPNt89+E4P+XIkf4rPxD8lrWd2ufDeCdm1As4qYQQD
 | 
			
		||||
c/eeBh6qkrKijZZ8NRgonTaCYPXkkkHME4BgdP2gVCW/KMVfdM5pVVk7dctSs+6w
 | 
			
		||||
VFfF5CsCgYEA/pXLQXt6PUlJAVSFodK8CndZY1pAbzLNVTsDAVuEAepwmEL7Tw0O
 | 
			
		||||
nV4igsANdRxZxEdYWsY8CClNTNLNY92zaAbpsQXHxHqnXnl2ZGQi1Jb2eFR6zw+m
 | 
			
		||||
8Qyb6aca58Q95flHQY75/+IFWemj76p1aT7aIvpElMdkBUh1Ak92cv8CgYEAy0hu
 | 
			
		||||
MqJga0/3UoMLhjhUVWGXI6NBpvWNv7FqSeQ2SDj0iBib7nyrlP41bCcyHFXryrXf
 | 
			
		||||
YsbG4fq0mmyhQUz4++OP57lxXXBu3UvBd6qQUorWX9HVHy6ljun8PsJdNUGj9Q2v
 | 
			
		||||
arH6Rv/emIx86IAOGjgIgK+YiNwiw/uEYgNzTOcCgYBryjh4zTMAZ9sFOSgrT/JV
 | 
			
		||||
7Bpounm1myjdAVNQa9MEjKKHlTSaT8j0UDsEaRRJlWtcc2ixZmVcf0A/WrGjquaf
 | 
			
		||||
EO45CV1/jv72PS8nak5k/FX2tK4apWHlhZUt5Ja7spcSm+zTkRnAgY4Kd6X1f5Ke
 | 
			
		||||
sQHi9Vu8Mn/izL7d748TOQKBgH75txuZoXBmeq3nfQNRnBvY4Xc5OoD3UJs0Tpfp
 | 
			
		||||
HJ7wNI3uETheVy6xutzbfsmEQcxU3jvsvb3Zw4XR5MfNNJjiA7lSdCVRXW6NK0N8
 | 
			
		||||
HrnwTwd7IgxgLrmeHhl1fpMNdURUUAXtNc+zc28GEd+IXUazSVxYUobqOi0Apigy
 | 
			
		||||
z4pxAoGBAPKd+WMUS94Ne7WMHDzcCcQKl2dJmBVj036qCtPgUL4yDyRDc/H1fQxI
 | 
			
		||||
jr/+JueqktrJgJsOL4uygn0zzKIJyQIToufxOodUdmviRLaH2UskNUBUjIBqyDc0
 | 
			
		||||
pjPebC7sxg6HZQmVpgX4klj1IWDpudD+cCRGF9SIzKRvNEadLgOl
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIFsDCCBJigAwIBAgIQBbQIKLDxaNeKW6HjUJCFNjANBgkqhkiG9w0BAQsFADBy
 | 
			
		||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
 | 
			
		||||
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
 | 
			
		||||
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
 | 
			
		||||
OVowKjEoMCYGA1UEAxMfZGFpbHkuZGVtby5kamFuZ28tdnVlLWFkbWluLmNvbTCC
 | 
			
		||||
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAOwxsoKm4vH/gv8h7OHYHI
 | 
			
		||||
5dQAAKm3tk1ZsyY9cMlSq/GIMSY15BZSwdSiwyI3vcCpmz2YCVRXpH8r0LNm/Ygu
 | 
			
		||||
fjVeK1H+F6fQkGj7065ye1Z15PtgI6Dx9dhLlFlR3lZYm0MVwSIW2xgVqbL+WNKl
 | 
			
		||||
198afnP+/B/Klzjyud4wqAlzDcD8lIh8iL0LMY3HSHzSzr8xtYZLxUvEzcl+vRF9
 | 
			
		||||
a9GjTOgg01Ukk04zHXan7VInK1/lurQ+WuntfPFDe/jmlEid4/wvB/lCMi0KUSWd
 | 
			
		||||
0C9CCB+2q/Lsa0hr8v4DF1TS1/YGg/y0Ye1+DzpKLKv/mfe6py18Ca7FcnFoKVsC
 | 
			
		||||
AwEAAaOCAogwggKEMB8GA1UdIwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0G
 | 
			
		||||
A1UdDgQWBBQ14z4HfGEjC4tAPVnN/AvsXmgHYDAqBgNVHREEIzAhgh9kYWlseS5k
 | 
			
		||||
ZW1vLmRqYW5nby12dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUE
 | 
			
		||||
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAn
 | 
			
		||||
BggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGSBggrBgEF
 | 
			
		||||
BQcBAQSBhTCBgjA0BggrBgEFBQcwAYYoaHR0cDovL3N0YXR1c2UuZGlnaXRhbGNl
 | 
			
		||||
cnR2YWxpZGF0aW9uLmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGln
 | 
			
		||||
aXRhbGNlcnR2YWxpZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FDQS5jcnQwCQYD
 | 
			
		||||
VR0TBAIwADCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB3AEalVet1+pEgMLWiiWn0
 | 
			
		||||
830RLEF0vv1JuIWr8vxw/m1HAAABeE1yhJEAAAQDAEgwRgIhAIdZiX5qq+KJjdtl
 | 
			
		||||
2Z9ejh5o9VHKyVVUgkJb0+S8aQGlAiEA5nEVffySiTcUogz+b7n34hmG2aW3YO02
 | 
			
		||||
UhMzyv7hoGcAdgAiRUUHWVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXhN
 | 
			
		||||
coRmAAAEAwBHMEUCIDFWIi3mkGmkB/uuTCqJyPTz8/WS4vqvdAUWO+MuxuaoAiEA
 | 
			
		||||
yP80fJCLnfso7VoJcWQT1l6bN6XL/jxip1OjXU0+dQMwDQYJKoZIhvcNAQELBQAD
 | 
			
		||||
ggEBAB0vH0OMrwGOQHdRdaN9t+2Yc1xnBNcksHcCmVD09gO2clA06OqTiu77g8lw
 | 
			
		||||
KwO2M5DmNFAA2onDxRVIL6auyLNdyK4X2m9i1eGnyAKro7d4owIlG30JdJ7uHzLG
 | 
			
		||||
ROL9SR0ibNZwOhoKSfpy3a+fWngMjCdW8pAFJHfPbOf6lP/CpGwoBnLvm9a9ZG3K
 | 
			
		||||
m2NmFN1/GPje25tXy0S/NaVFDVcJyfMeuVKqdwY9sbN7nOYGUury5NC5LWbgJ0T2
 | 
			
		||||
KWLcZc3LCa791kHLWVt/KI+9UgpM6Xiie0jUUIU92NaxBD/wY/jybPiogJkAz/sl
 | 
			
		||||
TncbnwO2+WpN6jIy9ccs8ogUMTQ=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
 | 
			
		||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
 | 
			
		||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
 | 
			
		||||
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
 | 
			
		||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
 | 
			
		||||
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
 | 
			
		||||
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
 | 
			
		||||
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
 | 
			
		||||
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
 | 
			
		||||
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
 | 
			
		||||
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
 | 
			
		||||
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
 | 
			
		||||
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
 | 
			
		||||
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
 | 
			
		||||
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
 | 
			
		||||
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
 | 
			
		||||
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
 | 
			
		||||
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
 | 
			
		||||
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
 | 
			
		||||
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
 | 
			
		||||
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
 | 
			
		||||
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
 | 
			
		||||
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
 | 
			
		||||
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
 | 
			
		||||
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
 | 
			
		||||
RmE=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIEpAIBAAKCAQEAoA7DGygqbi8f+C/yHs4dgcjl1AAAqbe2TVmzJj1wyVKr8Ygx
 | 
			
		||||
JjXkFlLB1KLDIje9wKmbPZgJVFekfyvQs2b9iC5+NV4rUf4Xp9CQaPvTrnJ7VnXk
 | 
			
		||||
+2AjoPH12EuUWVHeVlibQxXBIhbbGBWpsv5Y0qXX3xp+c/78H8qXOPK53jCoCXMN
 | 
			
		||||
wPyUiHyIvQsxjcdIfNLOvzG1hkvFS8TNyX69EX1r0aNM6CDTVSSTTjMddqftUicr
 | 
			
		||||
X+W6tD5a6e188UN7+OaUSJ3j/C8H+UIyLQpRJZ3QL0IIH7ar8uxrSGvy/gMXVNLX
 | 
			
		||||
9gaD/LRh7X4POkosq/+Z97qnLXwJrsVycWgpWwIDAQABAoIBABaP2NHdrhQnwWu/
 | 
			
		||||
T8km3dhFz5vm6jECVrN9nE1yJhFtqBOH0qx5C+9Xor9iDXv9JoWKLaTCPI0ZPkoM
 | 
			
		||||
4kI/wietrMMXb1IuAqX4YOWORgRrr9YmupdIBzhbPdVLsMbhzaPB9r+UnqEQXrmn
 | 
			
		||||
ksB1WQ5MgWsPdYQit+XqrWQXgbrU9kAP5+aO2GKrlnWZqBgshUkd2Sq5rdgrK5nv
 | 
			
		||||
kcmVBGClPsgOG2HgA+aJoFGLccoF8NMrBWaSc+zlHjiT8fP2YnMcDsX8Fw1tETbK
 | 
			
		||||
P9jf9wd4b/2ezKL3TWJMkbTRnxBwDgARWFVrD9jZqLtw342YuGQnEhPJFFdepKpQ
 | 
			
		||||
3GtbyiECgYEA0KlSF3K+coEjCjBGSFD5ACmB5ipl/NFPXVjCG1vHGHRh/0WnXBPI
 | 
			
		||||
zY3pRHFr9cJKLxQPe+4085yFXGTV7GHhH4nd1tEVxrH8ouNok0/WL4HHtvfGOq/H
 | 
			
		||||
sKQsZKVaUXd+NTZmzoXXJsb9Jgnu6r4AS4QazP1FRxSbSToxbut1ezsCgYEAxF6f
 | 
			
		||||
mAFz9p5ptNStJLXV53nTgNHK0Hk2cISu5aAUGQKA26VwnZTEo09Wt+WOGjzjTkSi
 | 
			
		||||
+TCoFfG77aqFQ1AyuAYWWErcS4/1/p0SeINXdztx34CJM/OqJ/AtjdL+09xwUZe6
 | 
			
		||||
JeUWWPMJukkrFkjNkCjkdQlVxG+a3jMlmM016GECgYEAoJJ8QuEhH7qyvUdy/nmZ
 | 
			
		||||
dH98oCPmggyM15fTH/yblP0S4L+4T8pFz7EyXmIuI1xVfC8iz0r7YrEDi5tpaFPW
 | 
			
		||||
S0/r8EDMUjBr6um3cw2QFNT5XJsF5+mXcR6Vrwn0HBcpf0eTC8DBVezxqFEik3CN
 | 
			
		||||
h49slG0e39lCurJWkjYOHTsCgYBeA/Oi4ic0DvoLErvm1IwZ7BDgHxFcKHxw+IWH
 | 
			
		||||
+NFGfBVXk+jL+Vr/2U9qciRL2ZT2dxQT/ECtaPQRwM9WwAHYa0mtcgHwx3b+NROP
 | 
			
		||||
0UpCEprdZ/vIfMOdpXcZ7MgGhQbdeags1naRlaK1pqxTWf3ZJErk4dhHWSurcI9y
 | 
			
		||||
jeVeYQKBgQCsIaGmX/xigoLaEucXOM4V34QU1gepJkDLDNEw4r9EoNHoBCwIaGxX
 | 
			
		||||
CWCsyuOwnCWM2OJJth5a+1xPYul0jsh7HCShICpkMsktoq4UdYbBfVNQiqenI7L7
 | 
			
		||||
l6/mzU5Ds6KXKVh2FZ7O8zcup1BYs0pAHTZqF+P/1FjSu1jbGfezFg==
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIFoTCCBImgAwIBAgIQBL1afhbyouKA0yBDgDhq/zANBgkqhkiG9w0BAQsFADBy
 | 
			
		||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
 | 
			
		||||
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
 | 
			
		||||
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMyMDAwMDAwMFoXDTIyMDMxOTIzNTk1
 | 
			
		||||
OVowJDEiMCAGA1UEAxMZZGVtby5kamFuZ28tdnVlLWFkbWluLmNvbTCCASIwDQYJ
 | 
			
		||||
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMk2tqLVSJyC/VTuWlZ+a+bjthUotJ/o
 | 
			
		||||
yQcXMC6eu/KyHbWqh5Ccj2kLh/zf9uhcs/GcYl/H1hyIVuiC+SHGmGfCqQB96vLl
 | 
			
		||||
uwwJDlM+y910xKmKV2S6DEFbXDZP76pShrpPs1nDkU5gftuGhX1S77pmMqjbOsG+
 | 
			
		||||
gZJAlAZKzT5xnGwpo4rkHc8xPY0ac29+9HXYDawpmySSdbfG+W0kape/wBexFmO+
 | 
			
		||||
KLt/oRk+QJbtPguLNLLlvZznf+fFp5UcmsVks/scg9fM1pnj3QQaCB8RXQQKkskm
 | 
			
		||||
Hi67PGFJOeepNFkApzHO4sUM3ya2Rskzfs9DtTlCODn3XFSVJz7DyTsCAwEAAaOC
 | 
			
		||||
An8wggJ7MB8GA1UdIwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0GA1UdDgQW
 | 
			
		||||
BBSRBeJj2dUcPqhi3km5tbW5lZP3aTAkBgNVHREEHTAbghlkZW1vLmRqYW5nby12
 | 
			
		||||
dWUtYWRtaW4uY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD
 | 
			
		||||
AQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEFBQcCARYb
 | 
			
		||||
aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGSBggrBgEFBQcBAQSBhTCBgjA0
 | 
			
		||||
BggrBgEFBQcwAYYoaHR0cDovL3N0YXR1c2UuZGlnaXRhbGNlcnR2YWxpZGF0aW9u
 | 
			
		||||
LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaXRhbGNlcnR2YWxp
 | 
			
		||||
ZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FDQS5jcnQwCQYDVR0TBAIwADCCAQIG
 | 
			
		||||
CisGAQQB1nkCBAIEgfMEgfAA7gB1AEalVet1+pEgMLWiiWn0830RLEF0vv1JuIWr
 | 
			
		||||
8vxw/m1HAAABeE1whV0AAAQDAEYwRAIgPFX8oV29XVZMDi2tbEuBo2AuS4udT2I/
 | 
			
		||||
tMHo9EPNPOYCIGFeOpkGfPcG4szSvKEmUIYimb3vejH0QJ6qB3+T6E5kAHUAIkVF
 | 
			
		||||
B1lVJFaWP6Ev8fdthuAjJmOtwEt/XcaDXG7iDwIAAAF4TXCFeAAABAMARjBEAiBC
 | 
			
		||||
HxlN8ItLz/FW/gYrmGGXTVvxxnVKv9t5bsj2AsdmOQIgJVu8zYZVNjt7AHFusZWg
 | 
			
		||||
ZYSY0Qd+11v1oXBHAi0OUAowDQYJKoZIhvcNAQELBQADggEBAEKj+pGihWMbm/Bm
 | 
			
		||||
d+7Ra6gngG5N/c7S1cPzmOAlX3bWOFLqZRVPiC8Xa5uzLuqkYMiRIuIFUjZj2CwS
 | 
			
		||||
gKVwEk3xIL76sMVURV17mhjV7jbhzCSIqnEVLpiGRsuEoHKW8UUAzBdAZjjk4D+Y
 | 
			
		||||
LZKOQKcWojGTCyRJA5dRHy+sWtnZcHGaD36UHeVh0ctFhoVcc9Oxsh9T6W4NnMd/
 | 
			
		||||
CthO8fDic3643232J+6VF1vH5fkz1Q6UGbH+GbmkZ70Rv9YCl78zU77juBfTy9ht
 | 
			
		||||
HJmcwLWF6Hef7Z+K2QnvT6H+cIb6OxSErshy9TlKgTRjVD7A3wTrri/dCJqfINVk
 | 
			
		||||
FoBVzmQ=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
 | 
			
		||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
 | 
			
		||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
 | 
			
		||||
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
 | 
			
		||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
 | 
			
		||||
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
 | 
			
		||||
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
 | 
			
		||||
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
 | 
			
		||||
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
 | 
			
		||||
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
 | 
			
		||||
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
 | 
			
		||||
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
 | 
			
		||||
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
 | 
			
		||||
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
 | 
			
		||||
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
 | 
			
		||||
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
 | 
			
		||||
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
 | 
			
		||||
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
 | 
			
		||||
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
 | 
			
		||||
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
 | 
			
		||||
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
 | 
			
		||||
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
 | 
			
		||||
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
 | 
			
		||||
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
 | 
			
		||||
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
 | 
			
		||||
RmE=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIEogIBAAKCAQEAyTa2otVInIL9VO5aVn5r5uO2FSi0n+jJBxcwLp678rIdtaqH
 | 
			
		||||
kJyPaQuH/N/26Fyz8ZxiX8fWHIhW6IL5IcaYZ8KpAH3q8uW7DAkOUz7L3XTEqYpX
 | 
			
		||||
ZLoMQVtcNk/vqlKGuk+zWcORTmB+24aFfVLvumYyqNs6wb6BkkCUBkrNPnGcbCmj
 | 
			
		||||
iuQdzzE9jRpzb370ddgNrCmbJJJ1t8b5bSRql7/AF7EWY74ou3+hGT5Alu0+C4s0
 | 
			
		||||
suW9nOd/58WnlRyaxWSz+xyD18zWmePdBBoIHxFdBAqSySYeLrs8YUk556k0WQCn
 | 
			
		||||
Mc7ixQzfJrZGyTN+z0O1OUI4OfdcVJUnPsPJOwIDAQABAoIBAA8baQX7vnplyVBt
 | 
			
		||||
nuG8lyxcL2kSR9FzwFgkcQ0nBNR5dAqWNZxxbMEFyR1+0UJr52S+CZLIZbZ5tBC7
 | 
			
		||||
+KmFCB9OObMcQR4ginUiXu14GwVTBYr3JI2e/FmR2vAG+2cN0Ci/4CberJO2Yf/o
 | 
			
		||||
bzBUIESd9LLB1v0B6SeKarK4PgWwjrr/twowABRBhkkKFErfYZjfNh1mALXPNEUA
 | 
			
		||||
7z3a8abw+JWympIFKWxi3YXyLOJZaGawOPDhq+ZVv+7rXvIyAzUzpmwCprjZFL4Q
 | 
			
		||||
hgN7IY7KjYK772Ffe0nwMbd3wbwYeAelM9fndH9dTMrQ1n6EcDBzla8Cwl6OVEk3
 | 
			
		||||
GpQqOfECgYEA+7qFHw75AOI3FFke/2VOJ58m0rrYJwDrLazlrzashi7qgJOBY6jp
 | 
			
		||||
yjLgGCOcR9v8pRWkOw2VLy+dhdr16Xp/XYhuSa6O5EC7igtnUVx9xu+XAksZiB97
 | 
			
		||||
f4lm7F3uirEh7ewuqiRETI9o6V5iGTCSMSc21zlJ1zoxnLMSuMyCKTECgYEAzKDD
 | 
			
		||||
PNJVZAiZJ25JKinkZlTyQ9VmQkfrvsIBWheN844uoSmmLR4PNwriZQtlURI58WA2
 | 
			
		||||
pe20aHJaleOJvzgW/OvcB+7mf/Ukn1mw6Ciusj6jXLXmmq8i80W0RMr1Rdbq8+dp
 | 
			
		||||
DNZt0iDXEZXHEGqdkpkn/gsvYL+jeIiKyuJ9PisCgYAoZGF//lMORT45UaObr5G+
 | 
			
		||||
4dbE8Z5Fg+w4xAmG9+rvDRAr2X9lknERNOCofu5QyYfcpYBYyXEqxSUtmVjkQfe1
 | 
			
		||||
9nJb+FqNXaW6HOJTN9gm18MPZyWNph+W82FEhD4Gmy2qk79ZJcCf2FMpPy/Wguiy
 | 
			
		||||
Ymx2VIb4tinHzyQt6wLnwQKBgAURSiR8dP7oM5rFYWx44x4hpmpFo6WqkE0GEvB/
 | 
			
		||||
OtW4RLFbDbF6WBgd3eNwt86dK/AtWM0dKOWZR2ME4olowzD6SlWr9etfT8vedcIa
 | 
			
		||||
F9F0Oal3G8Hi6nOp20AE4rQbEXB+35wgx1F33LujwO1IJqTVxCbHciHsPQkkIIPL
 | 
			
		||||
vhxHAoGAdwbRiK2OCmycedsD+L5qdxOYiL8JIAXLP+H7ZD0Jyx21UxQAmvza6fIx
 | 
			
		||||
HygnDGzrTJoOPEWu5WmGs4i6mr1bChHpo85LVNfytsxbE59y3I0va1IlSUC6wjXP
 | 
			
		||||
Yy3caUiBgxmzz4vhqCFdpLhT2SyyB4m13ggLmeyqLy88WnYCgiE=
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIFszCCBJugAwIBAgIQCGwikUrRfEUk8GbxRWLVIDANBgkqhkiG9w0BAQsFADBy
 | 
			
		||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
 | 
			
		||||
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
 | 
			
		||||
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTIxMDMwMzAwMDAwMFoXDTIyMDMwMjIzNTk1
 | 
			
		||||
OVowHzEdMBsGA1UEAxMUZGphbmdvLXZ1ZS1hZG1pbi5jb20wggEiMA0GCSqGSIb3
 | 
			
		||||
DQEBAQUAA4IBDwAwggEKAoIBAQC0iitqUeTxkq5qabbVcB+7a+YArfKAJBRvcj+T
 | 
			
		||||
VVdRkvEjcfGLvXIJUTvcUqJkRRYFbimdjB5q7CWCld8bgz/UOpIEmbdqn+WgzrNn
 | 
			
		||||
WWZrRiN5ylHAsIaKlgYKh6gcftEco6OgkrM8oyq1gORRBIcSj95VcqpIeAUMVyCX
 | 
			
		||||
R0h3dXnLCVe70ejr8w2cyHrSeS68mXw7LlAdfC0JAZTB/wxwcitSnnIVEbV6wMzG
 | 
			
		||||
BD5Ka/WprnJgJa7Prb5KHiZh4UG4Es2JpIHALMYLIeKQCUCIP1NmW8Ale+nhY9kD
 | 
			
		||||
tJeSEIY+/dRoDjpPkkIZalMp+5p0yDQ1LIO4pDZxnoI2vFLFAgMBAAGjggKWMIIC
 | 
			
		||||
kjAfBgNVHSMEGDAWgBR/05nzoEcOMQBWViKOt8ye3coBijAdBgNVHQ4EFgQUru5P
 | 
			
		||||
/0LuJj6hxqHWVYUN690wFNEwOQYDVR0RBDIwMIIUZGphbmdvLXZ1ZS1hZG1pbi5j
 | 
			
		||||
b22CGHd3dy5kamFuZ28tdnVlLWFkbWluLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYD
 | 
			
		||||
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4GA1UdIAQ3MDUwMwYGZ4EMAQIB
 | 
			
		||||
MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBkgYI
 | 
			
		||||
KwYBBQUHAQEEgYUwgYIwNAYIKwYBBQUHMAGGKGh0dHA6Ly9zdGF0dXNlLmRpZ2l0
 | 
			
		||||
YWxjZXJ0dmFsaWRhdGlvbi5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRz
 | 
			
		||||
LmRpZ2l0YWxjZXJ0dmFsaWRhdGlvbi5jb20vVHJ1c3RBc2lhVExTUlNBQ0EuY3J0
 | 
			
		||||
MAkGA1UdEwQCMAAwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgBGpVXrdfqRIDC1
 | 
			
		||||
oolp9PN9ESxBdL79SbiFq/L8cP5tRwAAAXf475pDAAAEAwBHMEUCIHTgL1+oRWE+
 | 
			
		||||
REuWNRa5J1cflPKW63jk6/3ibF+Sm5peAiEAt74SK9Ka9QyMJfP57eDl3xA1Ctnb
 | 
			
		||||
Bz6zTLIQFFicPGsAdgAiRUUHWVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAA
 | 
			
		||||
AXf475pNAAAEAwBHMEUCIQDOE36oL7MAxmHdEoI338jLW0xnBN8VeW9XyuTzIcq7
 | 
			
		||||
eQIgLwJTNfLqgw7TofY3dKqof5rkcuJWMmSI4aapUUBjFfIwDQYJKoZIhvcNAQEL
 | 
			
		||||
BQADggEBAC9lYBZuCzle1tSaJ4nVfogwHf0B4lKjDI8ixEnrDaY0tAuYst4S7zoU
 | 
			
		||||
76dZcpdwQjVLtlLk5jyaNdN5ohsu9WpErq6N7bXKhbSPBavCPxP4sMWMvmeQQUtB
 | 
			
		||||
UKqqRofXbx3WcWtsf1/Wlg3pyb0oyJ7kKt3iDG9OYEihQzEyG5Y72IE+HsbhTAWR
 | 
			
		||||
zqxGnmMumQ+JTnxCCudPoVPk25i2BfndMbcY4N6YyJYuLwMojtMkAeWtRdMmqtiy
 | 
			
		||||
lMb7EbWLYCHDyv892WTzie1BqZ7YcOaE59OChhmoYxiSXNHPCToIFECTz6BhPxlI
 | 
			
		||||
T3LbIM4+81HNDebdR17NUE3zN44OjsA=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
 | 
			
		||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
 | 
			
		||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
 | 
			
		||||
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
 | 
			
		||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
 | 
			
		||||
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
 | 
			
		||||
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
 | 
			
		||||
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
 | 
			
		||||
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
 | 
			
		||||
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
 | 
			
		||||
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
 | 
			
		||||
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
 | 
			
		||||
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
 | 
			
		||||
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
 | 
			
		||||
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
 | 
			
		||||
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
 | 
			
		||||
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
 | 
			
		||||
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
 | 
			
		||||
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
 | 
			
		||||
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
 | 
			
		||||
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
 | 
			
		||||
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
 | 
			
		||||
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
 | 
			
		||||
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
 | 
			
		||||
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
 | 
			
		||||
RmE=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIEowIBAAKCAQEAtIoralHk8ZKuamm21XAfu2vmAK3ygCQUb3I/k1VXUZLxI3Hx
 | 
			
		||||
i71yCVE73FKiZEUWBW4pnYweauwlgpXfG4M/1DqSBJm3ap/loM6zZ1lma0YjecpR
 | 
			
		||||
wLCGipYGCoeoHH7RHKOjoJKzPKMqtYDkUQSHEo/eVXKqSHgFDFcgl0dId3V5ywlX
 | 
			
		||||
u9Ho6/MNnMh60nkuvJl8Oy5QHXwtCQGUwf8McHIrUp5yFRG1esDMxgQ+Smv1qa5y
 | 
			
		||||
YCWuz62+Sh4mYeFBuBLNiaSBwCzGCyHikAlAiD9TZlvAJXvp4WPZA7SXkhCGPv3U
 | 
			
		||||
aA46T5JCGWpTKfuadMg0NSyDuKQ2cZ6CNrxSxQIDAQABAoIBAA5RZOcOLp9/+Agl
 | 
			
		||||
cSQVO9cD1B5arUA/XEWIZIVdP8sO4cPjXfosoJYflKVBAnL8TaZJmdBOU/071C+6
 | 
			
		||||
jhKjApVkvb7SqAqzOqVZrz2zh91bFyYqBvjGpyznf/wmzQzRe+kPC0OJTuCwugrh
 | 
			
		||||
+Xl5Z/LvaP0S1nFf31qesE1/ED609pvWtdUWj2oop9zORBzjaGcXeOKNqX8XnQCp
 | 
			
		||||
rJ487wcnuL8Nnuu+vuh8dC9o7zwjGrKwXhM3sijLp4q9VOF9fW2bYLyfLUR3FCFq
 | 
			
		||||
JPrQXe1mY28w+uIlnEdPkwgGIJbzur601BuzU9ZH5MSl7iYV319MPz+rtizFJxLm
 | 
			
		||||
OCg5hcMCgYEA7RrgQsrSj4fhi0VVkQ3fFeLJPQlvVcMK0OOYxP3cKQYSgXo79bQK
 | 
			
		||||
i9yRCRVS2UTGh8B3MGbPr+sRINokeYtjWxGDOwAlkye9kRiCKzzZOrlwDAY/SEDZ
 | 
			
		||||
HH5mVnv9UHtxCFSUub67IVWH7wCmoprKEK/loyvJFiE5jsxVmNZl3o8CgYEAwu1R
 | 
			
		||||
nBsETJLuN5/fB9rW3NvjaHGT1B6LQ1uIBmsU6V71gBasawX/X3ENOoX1dQa2japp
 | 
			
		||||
x58pjLJuP/t4WgZ41PBagij2G83VdFBdvrcVSk7B1yt8rudxmcvo1K6FR2FG7DMU
 | 
			
		||||
9kkb9JKFT3/FM7LT+z4xXxJ0AoNg6QD1IIT5Y2sCgYEAyQUvOxGQISY334bh+8AB
 | 
			
		||||
8iE7MidsoA5jfiRoIiOEY7eFOwbyDOcexeMzh7rvacs4cmGH655O2Lv34p1vrSiz
 | 
			
		||||
DMO1OfFu6esYegqIWbYWCgar61XkkxJ/v/ueMhae9nwhoclr6mq9Zo6IV+Z6YIPR
 | 
			
		||||
awJmM8fsjXmPvfSZYaHr7hsCgYAPzW99SU9q6cp4JfTNzTb4BreD4xlJ7AP8PPJl
 | 
			
		||||
Gs9CMBmU/cGSl5ThZufco7mHeDjaeUNEFKooptp7Q2a5Xab0FFwyCyIQlPpGCLHg
 | 
			
		||||
4TTPplzelb7w6wBxqG9CtrdFVySJx4ZehQTIKgy2qjQRgeDfkGYuP++5uG7l1NcK
 | 
			
		||||
gN066wKBgDg2F4yMx4SBWL3aBjIVd+Zilm+pkU1ZGC1XcuLnqSSMcoDy/JMszQC1
 | 
			
		||||
SEdDxgnCGlkWjtaxNPwfZTPU0SIoX5dcAx1EaHDJ+ibiIKGtM8forSCiP8fNz0oR
 | 
			
		||||
SYNZaYVuDJb1SFk9vKJMuIIFWS+AM6rlcOpNu6A0+1MbstM4BvwS
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
events {
 | 
			
		||||
    worker_connections  1024;
 | 
			
		||||
}
 | 
			
		||||
http {
 | 
			
		||||
    include       mime.types;
 | 
			
		||||
    default_type  application/octet-stream;
 | 
			
		||||
    sendfile        on;
 | 
			
		||||
    client_max_body_size   100m;
 | 
			
		||||
    include /etc/nginx/sites-enabled/*;#主要是这个地方,把新建的两配置文件包含进来
 | 
			
		||||
    server {
 | 
			
		||||
        listen 80 default_server;
 | 
			
		||||
        server_name _;
 | 
			
		||||
        return 404;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
## 将HTTP请求全部重定向至HTTPS
 | 
			
		||||
server {
 | 
			
		||||
    listen       80;
 | 
			
		||||
    server_name  api.django-vue-admin.com;
 | 
			
		||||
    charset utf-8;
 | 
			
		||||
    access_log /var/log/nginx/api-80.access.log;
 | 
			
		||||
    error_log  /var/log/nginx/api-80.error.log;
 | 
			
		||||
    rewrite ^(.*)$ https://${server_name}$1 permanent;
 | 
			
		||||
}
 | 
			
		||||
server {
 | 
			
		||||
        listen 443 ssl;
 | 
			
		||||
        server_name api.django-vue-admin.com;
 | 
			
		||||
        root /dvadmin-backend/;#项目路径
 | 
			
		||||
        charset utf-8;
 | 
			
		||||
        ssl_certificate    /nginx/keys/api.django-vue-admin.com.crt;#.pem证书路径
 | 
			
		||||
        ssl_certificate_key  /nginx/keys/api.django-vue-admin.com.key;#.key证书路径
 | 
			
		||||
        ssl_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 api;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $remote_addr;
 | 
			
		||||
        location / {
 | 
			
		||||
		root html/www;
 | 
			
		||||
            include uwsgi_params;
 | 
			
		||||
            uwsgi_pass dvadmin-django:8000;
 | 
			
		||||
            uwsgi_param UWSGI_SCRIPT home.wsgi;
 | 
			
		||||
            uwsgi_param UWSGI_CHDIR /dvadmin-backend/;#项目路径
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        # Django media
 | 
			
		||||
        location /media  {
 | 
			
		||||
                alias /dvadmin-backend/media;  # your Django project's media files - amend as required
 | 
			
		||||
            }
 | 
			
		||||
        # Django static
 | 
			
		||||
        location /static {
 | 
			
		||||
            alias /dvadmin-backend/static; # your Django project's static files - amend as required
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        access_log  /var/log/nginx/api-443.access.log;
 | 
			
		||||
        error_log   /var/log/nginx/api-443.error.log;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
## 将HTTP请求全部重定向至HTTPS
 | 
			
		||||
server {
 | 
			
		||||
    listen       80;
 | 
			
		||||
    server_name  daily.api.django-vue-admin.com;
 | 
			
		||||
    charset utf-8;
 | 
			
		||||
    access_log /var/log/nginx/api-80.access.log;
 | 
			
		||||
    error_log  /var/log/nginx/api-80.error.log;
 | 
			
		||||
    rewrite ^(.*)$ https://${server_name}$1 permanent;
 | 
			
		||||
}
 | 
			
		||||
server {
 | 
			
		||||
        listen 443 ssl;
 | 
			
		||||
        server_name daily.api.django-vue-admin.com;
 | 
			
		||||
        root /dvadmin-backend/;#项目路径
 | 
			
		||||
        charset utf-8;
 | 
			
		||||
        ssl_certificate    /nginx/keys/daily.api.django-vue-admin.com.crt;#.pem证书路径
 | 
			
		||||
        ssl_certificate_key  /nginx/keys/daily.api.django-vue-admin.com.key;#.key证书路径
 | 
			
		||||
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 | 
			
		||||
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
 | 
			
		||||
        ssl_prefer_server_ciphers on;
 | 
			
		||||
        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 daily.api;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $remote_addr;
 | 
			
		||||
        location / {
 | 
			
		||||
		root html/www;
 | 
			
		||||
            include uwsgi_params;
 | 
			
		||||
            uwsgi_pass dvadmin-django:8000;
 | 
			
		||||
            uwsgi_param UWSGI_SCRIPT home.wsgi;
 | 
			
		||||
            uwsgi_param UWSGI_CHDIR /dvadmin-backend/;#项目路径
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        # Django media
 | 
			
		||||
        location /media  {
 | 
			
		||||
                alias /dvadmin-backend/media;  # your Django project's media files - amend as required
 | 
			
		||||
            }
 | 
			
		||||
        # Django static
 | 
			
		||||
        location /static {
 | 
			
		||||
            alias /dvadmin-backend/static; # your Django project's static files - amend as required
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        access_log  /var/log/nginx/daily.api-443.access.log;
 | 
			
		||||
        error_log   /var/log/nginx/daily.api-443.error.log;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,44 +0,0 @@
 | 
			
		|||
## 将HTTP请求全部重定向至HTTPS
 | 
			
		||||
server {
 | 
			
		||||
    listen       80;
 | 
			
		||||
    server_name  daily.demo.django-vue-admin.com;
 | 
			
		||||
    charset utf-8;
 | 
			
		||||
    access_log /var/log/nginx/daily.demo-80.access.log;
 | 
			
		||||
    error_log  /var/log/nginx/daily.demo-80.error.log;
 | 
			
		||||
    rewrite ^(.*)$ https://${server_name}$1 permanent;
 | 
			
		||||
}
 | 
			
		||||
server {
 | 
			
		||||
        listen 443 ssl;
 | 
			
		||||
        server_name daily.demo.django-vue-admin.com;
 | 
			
		||||
        root /vadmin-doc/;#项目路径
 | 
			
		||||
        charset utf-8;
 | 
			
		||||
        ssl_certificate    /nginx/keys/daily.demo.django-vue-admin.com.crt;#.pem证书路径
 | 
			
		||||
        ssl_certificate_key  /nginx/keys/daily.demo.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 daily.demo;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $remote_addr;
 | 
			
		||||
        location / {
 | 
			
		||||
            try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
 | 
			
		||||
            root   /dvadmin-ui/dist/;
 | 
			
		||||
            add_header  Cache-Control  max-age=no-cache;
 | 
			
		||||
            index  index.html index.php index.htm;
 | 
			
		||||
        }
 | 
			
		||||
        location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
 | 
			
		||||
            access_log off;
 | 
			
		||||
            add_header Cache-Control max-age=604800;
 | 
			
		||||
            root   /dvadmin-ui/dist/;
 | 
			
		||||
            index  index.html index.php index.htm;
 | 
			
		||||
        }
 | 
			
		||||
        location @router {
 | 
			
		||||
            rewrite ^.*$ /index.html last;
 | 
			
		||||
        }
 | 
			
		||||
        access_log  /var/log/nginx/daily.demo-443.access.log;
 | 
			
		||||
        error_log   /var/log/nginx/daily.demo-443.error.log;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,44 +0,0 @@
 | 
			
		|||
## 将HTTP请求全部重定向至HTTPS
 | 
			
		||||
server {
 | 
			
		||||
    listen       80;
 | 
			
		||||
    server_name  demo.django-vue-admin.com;
 | 
			
		||||
    charset utf-8;
 | 
			
		||||
    access_log /var/log/nginx/demo-80.access.log;
 | 
			
		||||
    error_log  /var/log/nginx/demo-80.error.log;
 | 
			
		||||
    rewrite ^(.*)$ https://${server_name}$1 permanent;
 | 
			
		||||
}
 | 
			
		||||
server {
 | 
			
		||||
        listen 443 ssl;
 | 
			
		||||
        server_name demo.django-vue-admin.com;
 | 
			
		||||
        root /vadmin-doc/;#项目路径
 | 
			
		||||
        charset utf-8;
 | 
			
		||||
        ssl_certificate    /nginx/keys/demo.django-vue-admin.com.crt;#.pem证书路径
 | 
			
		||||
        ssl_certificate_key  /nginx/keys/demo.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 demo;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $remote_addr;
 | 
			
		||||
        location / {
 | 
			
		||||
            try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
 | 
			
		||||
            root   /dvadmin-ui/dist/;
 | 
			
		||||
            add_header  Cache-Control  max-age=no-cache;
 | 
			
		||||
            index  index.html index.php index.htm;
 | 
			
		||||
        }
 | 
			
		||||
        location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
 | 
			
		||||
            access_log off;
 | 
			
		||||
            add_header Cache-Control max-age=604800;
 | 
			
		||||
            root   /dvadmin-ui/dist/;
 | 
			
		||||
            index  index.html index.php index.htm;
 | 
			
		||||
        }
 | 
			
		||||
        location @router {
 | 
			
		||||
            rewrite ^.*$ /index.html last;
 | 
			
		||||
        }
 | 
			
		||||
        access_log  /var/log/nginx/demo-443.access.log;
 | 
			
		||||
        error_log   /var/log/nginx/demo-443.error.log;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,37 +0,0 @@
 | 
			
		|||
## 将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;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,37 +0,0 @@
 | 
			
		|||
## 将HTTP请求全部重定向至HTTPS
 | 
			
		||||
server {
 | 
			
		||||
    listen       80;
 | 
			
		||||
    server_name  www.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 www.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;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
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"]
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ from django.utils import six
 | 
			
		|||
from mongoengine.queryset import visitor
 | 
			
		||||
from rest_framework.filters import BaseFilterBackend, SearchFilter, OrderingFilter
 | 
			
		||||
 | 
			
		||||
from ..permission.models import Dept
 | 
			
		||||
from ..utils.model_util import get_dept
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +118,7 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
 | 
			
		|||
            return queryset.none()
 | 
			
		||||
 | 
			
		||||
        # 1. 判断过滤的数据是否有创建人所在部门 "dept_belong_id" 字段
 | 
			
		||||
        if not hasattr(queryset.model, 'dept_belong_id'):
 | 
			
		||||
        if not getattr(queryset.model, 'dept_belong_id', None):
 | 
			
		||||
            return queryset
 | 
			
		||||
 | 
			
		||||
        # 2. 如果用户没有关联角色则返回本部门数据
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +137,7 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
 | 
			
		|||
 | 
			
		||||
        # 4. 只为仅本人数据权限时只返回过滤本人数据,并且部门为自己本部门(考虑到用户会变部门,只能看当前用户所在的部门数据)
 | 
			
		||||
        if dataScope_list == ['5']:
 | 
			
		||||
            return queryset.filter(creator=request.user, dept_belong_id=request.user.dept_id)
 | 
			
		||||
            return queryset.filter(creator=request.user, dept_belong_id=user_dept_id)
 | 
			
		||||
 | 
			
		||||
        # 5. 自定数据权限 获取部门,根据部门过滤
 | 
			
		||||
        dept_list = []
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +147,5 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
 | 
			
		|||
            elif ele == '3':
 | 
			
		||||
                dept_list.append(user_dept_id)
 | 
			
		||||
            elif ele == '4':
 | 
			
		||||
                dept_list.extend(get_dept(user_dept_id,))
 | 
			
		||||
                dept_list.extend(get_dept(user_dept_id, ))
 | 
			
		||||
        return queryset.filter(dept_belong_id__in=list(set(dept_list)))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,12 +320,13 @@ class ImportSerializerMixin:
 | 
			
		|||
        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
 | 
			
		||||
        queryset = self.filter_queryset(self.get_queryset())
 | 
			
		||||
        unique_list = [ele.attname for ele in 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()
 | 
			
		||||
            instance = queryset.filter(**filter_dic).first()
 | 
			
		||||
            if instance and not updateSupport:
 | 
			
		||||
                continue
 | 
			
		||||
            if not filter_dic:
 | 
			
		||||
| 
						 | 
				
			
			@ -357,6 +358,7 @@ class ExportSerializerMixin:
 | 
			
		|||
                "'%s' 请配置对应的导出模板字段。"
 | 
			
		||||
                % self.__class__.__name__
 | 
			
		||||
        )
 | 
			
		||||
        data = self.export_serializer_class(self.get_queryset(), many=True).data
 | 
			
		||||
        queryset = self.filter_queryset(self.get_queryset())
 | 
			
		||||
        data = self.export_serializer_class(queryset, many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, self.export_field_data, data,
 | 
			
		||||
                                                       f'导出{get_verbose_name(self.get_queryset())}.xls'))
 | 
			
		||||
                                                       f'导出{get_verbose_name(queryset)}.xls'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
"""
 | 
			
		||||
常用的Permission以及DRF的Permission
 | 
			
		||||
@author: ruoxing
 | 
			
		||||
"""
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
from django.contrib.auth import get_user_model
 | 
			
		||||
from rest_framework.permissions import (BasePermission,
 | 
			
		||||
                                        )
 | 
			
		||||
from rest_framework.request import Request
 | 
			
		||||
from rest_framework.views import APIView
 | 
			
		||||
 | 
			
		||||
from ..utils.model_util import get_dept
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
User = get_user_model()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CustomPermission(BasePermission):
 | 
			
		||||
    def __init__(self, message=None) -> None:
 | 
			
		||||
        super().__init__()
 | 
			
		||||
        self.message = getattr(self.__class__, 'message', '无权限')
 | 
			
		||||
        self.user: User = None
 | 
			
		||||
 | 
			
		||||
    def init_permission(self, request: Request, view: APIView):
 | 
			
		||||
        self.user = request.user
 | 
			
		||||
 | 
			
		||||
    def has_permission(self, request: Request, view: APIView):
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    def has_object_permission(self, request: Request, view: APIView, obj):
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CommonPermission(CustomPermission):
 | 
			
		||||
    """
 | 
			
		||||
    通用权限类,判断用户是否有这条数据的查询权限,如没有则直接没有操作权限
 | 
			
		||||
        0. 获取用户的部门id,没有部门则返回 False
 | 
			
		||||
        1. 判断过滤的数据是否有创建人所在部门 "dept_belong_id" 字段,没有则返回 True
 | 
			
		||||
        2. 如果用户没有关联角色则校验该数据是否属于本部门
 | 
			
		||||
        3. 根据所有角色 获取所有权限范围
 | 
			
		||||
            3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则有权限操作
 | 
			
		||||
        4. 只为仅本人数据权限时只有操作本人数据权限,并且部门为自己本部门(考虑到用户会变部门,只能看当前用户所在的部门数据)
 | 
			
		||||
        5. 自定数据权限 获取部门,根据部门判断,是否有权限操作
 | 
			
		||||
    """
 | 
			
		||||
    message = '没有有操作权限'
 | 
			
		||||
 | 
			
		||||
    def check_queryset(self, request, instance):
 | 
			
		||||
        # 0. 获取用户的部门id,没有部门则返回 False
 | 
			
		||||
        user_dept_id = getattr(request.user, 'dept_id')
 | 
			
		||||
        if not user_dept_id:
 | 
			
		||||
            self.message = "该用户无部门,无权限操作!"
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        # 1. 判断过滤的数据是否有创建人所在部门 "dept_belong_id" 字段,没有则返回 True
 | 
			
		||||
        if not getattr(instance, 'dept_belong_id', None):
 | 
			
		||||
            return True
 | 
			
		||||
 | 
			
		||||
        # 2. 如果用户没有关联角色则校验该数据是否属于本部门
 | 
			
		||||
        if not hasattr(request.user, 'role'):
 | 
			
		||||
            self.message = "该用户无角色,无权限操作!"
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        # 3. 根据所有角色 获取所有权限范围
 | 
			
		||||
        role_list = request.user.role.filter(status='1').values('admin', 'dataScope')
 | 
			
		||||
        dataScope_list = []
 | 
			
		||||
        for ele in role_list:
 | 
			
		||||
            # 3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则有权限操作
 | 
			
		||||
            if '1' == ele.get('dataScope') or ele.get('admin') == True:
 | 
			
		||||
                return True
 | 
			
		||||
            dataScope_list.append(ele.get('dataScope'))
 | 
			
		||||
        dataScope_list = list(set(dataScope_list))
 | 
			
		||||
 | 
			
		||||
        # 4. 只为仅本人数据权限时只有操作本人数据权限,并且部门为自己本部门(考虑到用户会变部门,只能看当前用户所在的部门数据)
 | 
			
		||||
        if dataScope_list == ['5']:
 | 
			
		||||
            return int(instance.dept_belong_id) == user_dept_id and request.user == instance.creator
 | 
			
		||||
 | 
			
		||||
        # 5. 自定数据权限 获取部门,根据部门判断,是否有权限操作
 | 
			
		||||
        dept_list = []
 | 
			
		||||
        for ele in dataScope_list:
 | 
			
		||||
            if ele == '2':
 | 
			
		||||
                dept_list.extend(request.user.role.filter(status='1').values_list('dept__id', flat=True))
 | 
			
		||||
            elif ele == '3':
 | 
			
		||||
                dept_list.append(user_dept_id)
 | 
			
		||||
            elif ele == '4':
 | 
			
		||||
                dept_list.extend(get_dept(user_dept_id, ))
 | 
			
		||||
        return int(instance.dept_belong_id) in list(set(dept_list))
 | 
			
		||||
 | 
			
		||||
    def has_permission(self, request: Request, view: APIView):
 | 
			
		||||
        """判断是否为演示模式"""
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    def has_object_permission(self, request: Request, view: APIView, instance):
 | 
			
		||||
        self.message = f"没有此数据操作权限!"
 | 
			
		||||
        res = self.check_queryset(request, instance)
 | 
			
		||||
        print(res)
 | 
			
		||||
        return res
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ from django.contrib.auth import authenticate
 | 
			
		|||
from rest_framework.request import Request
 | 
			
		||||
from rest_framework.views import APIView
 | 
			
		||||
 | 
			
		||||
from .permissions import CommonPermission
 | 
			
		||||
from ..op_drf.filters import DataLevelPermissionsFilter
 | 
			
		||||
from ..op_drf.viewsets import CustomModelViewSet
 | 
			
		||||
from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +13,6 @@ from ..permission.serializers import UserProfileSerializer, MenuSerializer, Role
 | 
			
		|||
    PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer, \
 | 
			
		||||
    UserProfileImportSerializer
 | 
			
		||||
from ..system.models import DictDetails
 | 
			
		||||
from ..utils.export_excel import export_excel_save_model
 | 
			
		||||
from ..utils.response import SuccessResponse, ErrorResponse
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,9 +78,9 @@ class MenuModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = MenuCreateUpdateSerializer
 | 
			
		||||
    filter_class = MenuFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('name',)
 | 
			
		||||
    ordering = 'create_datetime'  # 默认排序
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -127,9 +127,9 @@ class DeptModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = DeptCreateUpdateSerializer
 | 
			
		||||
    filter_class = DeptFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('deptName',)
 | 
			
		||||
    ordering = 'create_datetime'  # 默认排序
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,23 +192,13 @@ class PostModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = PostCreateUpdateSerializer
 | 
			
		||||
    filter_class = PostFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('postName',)
 | 
			
		||||
    ordering = ['postSort', 'create_datetime']  # 默认排序
 | 
			
		||||
 | 
			
		||||
    def export(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        导出岗位
 | 
			
		||||
        :param request:
 | 
			
		||||
        :param args:
 | 
			
		||||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        field_data = ['岗位序号', '岗位编码', '岗位名称', '岗位排序', '状态', '创建者', '修改者', '备注']
 | 
			
		||||
        data = ExportPostSerializer(Post.objects.all(), many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, field_data, data, '导出岗位数据.xls'))
 | 
			
		||||
    export_field_data = ['岗位序号', '岗位编码', '岗位名称', '岗位排序', '状态', '创建者', '修改者', '备注']
 | 
			
		||||
    export_serializer_class = ExportPostSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RoleModelViewSet(CustomModelViewSet):
 | 
			
		||||
| 
						 | 
				
			
			@ -221,23 +211,13 @@ class RoleModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = RoleCreateUpdateSerializer
 | 
			
		||||
    filter_class = RoleFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('roleName',)
 | 
			
		||||
    ordering = 'create_datetime'  # 默认排序
 | 
			
		||||
 | 
			
		||||
    def export(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        导出角色
 | 
			
		||||
        :param request:
 | 
			
		||||
        :param args:
 | 
			
		||||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        field_data = ['角色序号', '角色名称', '角色权限', '角色排序', '数据范围', '角色状态', '创建者', '修改者', '备注']
 | 
			
		||||
        data = ExportRoleSerializer(Role.objects.all(), many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, field_data, data, '导出角色数据.xls'))
 | 
			
		||||
    export_field_data = ['角色序号', '角色名称', '角色权限', '角色排序', '数据范围', '角色状态', '创建者', '修改者', '备注']
 | 
			
		||||
    export_serializer_class = ExportRoleSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserProfileModelViewSet(CustomModelViewSet):
 | 
			
		||||
| 
						 | 
				
			
			@ -259,9 +239,9 @@ class UserProfileModelViewSet(CustomModelViewSet):
 | 
			
		|||
                         'gender': '用户性别(男/女/未知)',
 | 
			
		||||
                         'is_active': '帐号状态(启用/禁用)', 'password': '登录密码', 'dept': '部门ID', 'role': '角色ID',
 | 
			
		||||
                         'post': '岗位ID'}
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('username',)
 | 
			
		||||
    ordering = 'create_datetime'  # 默认排序
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,6 @@
 | 
			
		|||
from ..models.config_settings import ConfigSettings
 | 
			
		||||
from ..models.dict_data import DictData
 | 
			
		||||
from ..models.dict_details import DictDetails
 | 
			
		||||
from ..models.web_set import WebSet
 | 
			
		||||
from ..models.save_file import SaveFile
 | 
			
		||||
from ..models.message_push import MessagePush
 | 
			
		||||
from ..models.message_push import MessagePushUser
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +0,0 @@
 | 
			
		|||
from django.db.models import TextField, CharField
 | 
			
		||||
 | 
			
		||||
from ...op_drf.models import CoreModel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WebSet(CoreModel):
 | 
			
		||||
    name = CharField(max_length=64, verbose_name="站点名称")
 | 
			
		||||
    web_site = CharField(max_length=256, verbose_name="站点网址", null=True, blank=True)
 | 
			
		||||
    logo = CharField(max_length=256, verbose_name="网站Logo", null=True, blank=True)
 | 
			
		||||
    record_info = TextField(verbose_name="备案信息", null=True, blank=True)
 | 
			
		||||
    statistics_code = TextField(verbose_name="统计代码", null=True, blank=True)
 | 
			
		||||
    copyright_info = TextField(verbose_name="版权信息", null=True, blank=True)
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        verbose_name = '站点设置'
 | 
			
		||||
        verbose_name_plural = verbose_name
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return f"{self.name}"
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ from rest_framework.request import Request
 | 
			
		|||
from .models import LoginInfor, OperationLog, CeleryLog
 | 
			
		||||
from ..op_drf.filters import DataLevelPermissionsFilter
 | 
			
		||||
from ..op_drf.viewsets import CustomModelViewSet
 | 
			
		||||
from ..permission.permissions import CommonPermission
 | 
			
		||||
from ..system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter, MessagePushFilter, \
 | 
			
		||||
    SaveFileFilter, LoginInforFilter, OperationLogFilter, CeleryLogFilter
 | 
			
		||||
from ..system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
 | 
			
		||||
| 
						 | 
				
			
			@ -36,23 +37,13 @@ class DictDataModelViewSet(CustomModelViewSet):
 | 
			
		|||
    # retrieve_serializer_class = DetailRoleSerializer
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    filter_class = DictDataFilter
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('dictName',)
 | 
			
		||||
    ordering = 'id'  # 默认排序
 | 
			
		||||
 | 
			
		||||
    def export(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        导出字典管理数据
 | 
			
		||||
        :param request:
 | 
			
		||||
        :param args:
 | 
			
		||||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        field_data = ['字典主键', '字典名称', '字典类型', '字典状态', '创建者', '修改者', '备注']
 | 
			
		||||
        data = ExportDictDataSerializer(DictData.objects.all(), many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, field_data, data, '导出参数管理数据.xls'))
 | 
			
		||||
    export_field_data = ['字典主键', '字典名称', '字典类型', '字典状态', '创建者', '修改者', '备注']
 | 
			
		||||
    export_serializer_class = ExportDictDataSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DictDetailsModelViewSet(CustomModelViewSet):
 | 
			
		||||
| 
						 | 
				
			
			@ -65,9 +56,9 @@ class DictDetailsModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = DictDetailsCreateUpdateSerializer
 | 
			
		||||
    filter_class = DictDetailsFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('dictLabel',)
 | 
			
		||||
    ordering = 'sort'  # 默认排序
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +74,7 @@ class DictDetailsModelViewSet(CustomModelViewSet):
 | 
			
		|||
        if not dict_details_dic:
 | 
			
		||||
            queryset = self.filter_queryset(self.get_queryset())
 | 
			
		||||
            queryset_dic = queryset.order_by('sort').values('dict_data__dictType', 'dictLabel', 'dictValue',
 | 
			
		||||
                                                                       'is_default')
 | 
			
		||||
                                                            'is_default')
 | 
			
		||||
            for ele in queryset_dic:
 | 
			
		||||
                dictType = ele.pop('dict_data__dictType')
 | 
			
		||||
                if dictType in dict_details_dic:
 | 
			
		||||
| 
						 | 
				
			
			@ -127,12 +118,14 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
 | 
			
		|||
    create_serializer_class = ConfigSettingsCreateUpdateSerializer
 | 
			
		||||
    update_serializer_class = ConfigSettingsCreateUpdateSerializer
 | 
			
		||||
    filter_class = ConfigSettingsFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    # update_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # destroy_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    # create_extra_permission_classes = (IsManagerPermission,)
 | 
			
		||||
    search_fields = ('configName',)
 | 
			
		||||
    ordering = 'id'  # 默认排序
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    export_field_data = ['参数主键', '参数名称', '参数键名', '参数键值', '系统内置', '参数状态', '创建者', '修改者', '备注']
 | 
			
		||||
    export_serializer_class = ExportConfigSettingsSerializer
 | 
			
		||||
 | 
			
		||||
    def get_config_key(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
| 
						 | 
				
			
			@ -142,8 +135,6 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
 | 
			
		|||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        # if hasattr(self, 'handle_logging'):
 | 
			
		||||
        #     self.handle_logging(request, *args, **kwargs)
 | 
			
		||||
        config_key_dic = cache.get('system_configKey')
 | 
			
		||||
        if not config_key_dic:
 | 
			
		||||
            queryset = self.filter_queryset(self.get_queryset())
 | 
			
		||||
| 
						 | 
				
			
			@ -163,18 +154,6 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
 | 
			
		|||
        cache.delete('system_configKey')
 | 
			
		||||
        return SuccessResponse(msg='清理成功!')
 | 
			
		||||
 | 
			
		||||
    def export(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        导出参数管理数据
 | 
			
		||||
        :param request:
 | 
			
		||||
        :param args:
 | 
			
		||||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        field_data = ['参数主键', '参数名称', '参数键名', '参数键值', '系统内置', '参数状态', '创建者', '修改者', '备注']
 | 
			
		||||
        data = ExportConfigSettingsSerializer(ConfigSettings.objects.all(), many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, field_data, data, '导出参数管理数据.xls'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SaveFileModelViewSet(CustomModelViewSet):
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			@ -186,6 +165,9 @@ class SaveFileModelViewSet(CustomModelViewSet):
 | 
			
		|||
    update_serializer_class = SaveFileCreateUpdateSerializer
 | 
			
		||||
    filter_class = SaveFileFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    search_fields = ('configName',)
 | 
			
		||||
    ordering = '-create_datetime'  # 默认排序
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -219,8 +201,14 @@ class MessagePushModelViewSet(CustomModelViewSet):
 | 
			
		|||
    create_serializer_class = MessagePushCreateUpdateSerializer
 | 
			
		||||
    update_serializer_class = MessagePushCreateUpdateSerializer
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    filter_class = MessagePushFilter
 | 
			
		||||
    ordering = "-update_datetime"  # 默认排序
 | 
			
		||||
    export_field_data = ['消息序号', '标题', '内容', '消息类型', '是否审核', '消息状态', '通知接收消息用户',
 | 
			
		||||
                         '创建者', '修改者', '修改时间', '创建时间']
 | 
			
		||||
    export_serializer_class = ExportMessagePushSerializer
 | 
			
		||||
 | 
			
		||||
    def get_user_messages(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
| 
						 | 
				
			
			@ -257,18 +245,6 @@ class MessagePushModelViewSet(CustomModelViewSet):
 | 
			
		|||
        instance.save()
 | 
			
		||||
        return SuccessResponse()
 | 
			
		||||
 | 
			
		||||
    def export(self, request: Request, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        导出岗位
 | 
			
		||||
        :param request:
 | 
			
		||||
        :param args:
 | 
			
		||||
        :param kwargs:
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        field_data = ['消息序号', '标题', '内容', '消息类型', '是否审核', '消息状态', '通知接收消息用户', '创建者', '修改者', '修改时间', '创建时间']
 | 
			
		||||
        data = ExportMessagePushSerializer(MessagePush.objects.all(), many=True).data
 | 
			
		||||
        return SuccessResponse(export_excel_save_model(request, field_data, data, '导出岗位数据.xls'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LoginInforModelViewSet(CustomModelViewSet):
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			@ -278,6 +254,9 @@ class LoginInforModelViewSet(CustomModelViewSet):
 | 
			
		|||
    serializer_class = LoginInforSerializer
 | 
			
		||||
    filter_class = LoginInforFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    ordering = '-create_datetime'  # 默认排序
 | 
			
		||||
    export_field_data = ['访问编号', '用户名称', '登录地址', '登录地点', '浏览器', '操作系统',
 | 
			
		||||
                         '登录状态', '操作信息', '登录日期']
 | 
			
		||||
| 
						 | 
				
			
			@ -303,6 +282,9 @@ class OperationLogModelViewSet(CustomModelViewSet):
 | 
			
		|||
    serializer_class = OperationLogSerializer
 | 
			
		||||
    filter_class = OperationLogFilter
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    ordering = '-create_datetime'  # 默认排序
 | 
			
		||||
    export_field_data = ['请求模块', '请求地址', '请求参数', '请求方式', '操作说明', '请求ip地址',
 | 
			
		||||
                         '请求浏览器', '响应状态码', '操作地点', '操作系统', '返回信息', '响应状态', '操作用户名']
 | 
			
		||||
| 
						 | 
				
			
			@ -326,6 +308,10 @@ class CeleryLogModelViewSet(CustomModelViewSet):
 | 
			
		|||
   """
 | 
			
		||||
    queryset = CeleryLog.objects.all()
 | 
			
		||||
    serializer_class = CeleryLogSerializer
 | 
			
		||||
    extra_filter_backends = [DataLevelPermissionsFilter]
 | 
			
		||||
    update_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    destroy_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    create_extra_permission_classes = (CommonPermission,)
 | 
			
		||||
    filter_class = CeleryLogFilter
 | 
			
		||||
    ordering = '-create_datetime'  # 默认排序
 | 
			
		||||
    export_field_data = ['任务名称', '执行参数', '执行时间', '运行状态', '任务结果', '创建时间']
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,47 +0,0 @@
 | 
			
		|||
module.exports = {
 | 
			
		||||
    title: 'Django-Vue-Admin',
 | 
			
		||||
    base: '/',
 | 
			
		||||
    head: [
 | 
			
		||||
        [
 | 
			
		||||
            'link', // 设置 favicon.ico,注意图片放在 public 文件夹下
 | 
			
		||||
            { rel: 'icon', href: '/logo.png' }
 | 
			
		||||
        ]
 | 
			
		||||
    ],
 | 
			
		||||
    description: '',
 | 
			
		||||
    themeConfig: {
 | 
			
		||||
        logo: '/logo.png',
 | 
			
		||||
        nav: [
 | 
			
		||||
            { text: '在线文档', link: '/document/' },
 | 
			
		||||
            { text: '关于我们', link: '/about/' },
 | 
			
		||||
            { text: '在线体验', link: 'https://demo.django-vue-admin.com/' },
 | 
			
		||||
            { text: 'Gitee', link: 'https://gitee.com/liqianglog/django-vue-admin' },
 | 
			
		||||
            { text: 'Github', link: 'https://github.com/liqianglog/django-vue-admin' },
 | 
			
		||||
        ],
 | 
			
		||||
        sidebar: [
 | 
			
		||||
            {
 | 
			
		||||
                title: '文档',   // 必要的
 | 
			
		||||
                // path: '/document/',      // 可选的, 标题的跳转链接,应为绝对路径且必须存在
 | 
			
		||||
                collapsable: false, // 可选的, 默认值是 true,
 | 
			
		||||
                sidebarDepth: 1,    // 可选的, 默认值是 1
 | 
			
		||||
                children: [
 | 
			
		||||
                    '/document/',
 | 
			
		||||
                    '/document/kslj',
 | 
			
		||||
                    '/document/hjbs',
 | 
			
		||||
                    '/document/web',
 | 
			
		||||
                    '/document/server',
 | 
			
		||||
                    '/document/gxrz',
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                title: '其他',
 | 
			
		||||
                children: [
 | 
			
		||||
                    '/other/cjwt',
 | 
			
		||||
                    '/other/jzzc',
 | 
			
		||||
                ],
 | 
			
		||||
                collapsable: false,
 | 
			
		||||
                sidebarDepth: 1,
 | 
			
		||||
                initialOpenGroupIndex: -1 // 可选的, 默认值是 0
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 171 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 74 KiB  | 
| 
						 | 
				
			
			@ -1,22 +0,0 @@
 | 
			
		|||
---
 | 
			
		||||
home: true
 | 
			
		||||
heroImage: /logo.png
 | 
			
		||||
heroText: Django-Vue-Admin
 | 
			
		||||
tagline: 使用django+vue进行极速开发的全栈管理系统
 | 
			
		||||
actionText: 快速开始 →
 | 
			
		||||
actionLink: /document/
 | 
			
		||||
features:
 | 
			
		||||
- title: 简单易用
 | 
			
		||||
  details: 大幅度降低应用层代码难度,让每一个刚开始学习 django 和vue的新手都能快速上手。这将会是你上手学习 django+vue的最佳代码。
 | 
			
		||||
- title: 自由拓展
 | 
			
		||||
  details: 系统底层代码和业务逻辑代码分层清晰,不会发生相互干扰,便于根据自己业务方向进行拓展。
 | 
			
		||||
- title: 标准化目录
 | 
			
		||||
  details: 项目目录分层清晰,项目模式结构清晰,包名语义化,让你更加容易理解目录结构,读懂代码更加方便!
 | 
			
		||||
- title: 功能完善
 | 
			
		||||
  details: 内置完整的权限架构,包括:菜单、角色、用户、字典、参数、监控、代码生成等一系列系统常规模块。
 | 
			
		||||
- title: 代码生成器
 | 
			
		||||
  details: 在线配置表信息生成对应的代码,一键生成模块,包含增删改查/排序/导出/权限控制等操作,编译即可使用。
 | 
			
		||||
- title: 完全响应式布局
 | 
			
		||||
  details: 提供多终端适配:电脑、平板、手机等所有主流设备,提供多种不同风格的皮肤。页面美观,高端大气上档次。
 | 
			
		||||
footer: MIT Licensed | Copyright © 2021-2021 django-vue-admin All Rights Reserved
 | 
			
		||||
---
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 关于我们
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 项目介绍
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 更新日志
 | 
			
		||||
| 
						 | 
				
			
			@ -1,98 +0,0 @@
 | 
			
		|||
# 环境部署
 | 
			
		||||
## 1.前端搭建环境
 | 
			
		||||
 | 
			
		||||
### 1.1 安装node
 | 
			
		||||
 | 
			
		||||
## 1. 后端搭建环境
 | 
			
		||||
 | 
			
		||||
### 1.1 安装Python3.8
 | 
			
		||||
 | 
			
		||||
### 1.2 安装Reids
 | 
			
		||||
        sudo apt-get install -y redis-server
 | 
			
		||||
 | 
			
		||||
### 1.3 安装nginx
 | 
			
		||||
        sudo apt-get install -y nginx
 | 
			
		||||
 | 
			
		||||
### 1.1 安装其它软件
 | 
			
		||||
        sudo apt-get install -y python3-venv pcre pcre-devel pcre-static zlib* gcc openssl openssl-devel libffi-devel 
 | 
			
		||||
 | 
			
		||||
## 2. 创建虚拟环境
 | 
			
		||||
### 2.1 进入项目目录 cd gh-baohua-backend
 | 
			
		||||
        在项目根目录中,复制./conf/env.example.py文件为一份新的到./conf文件夹下,并重命名为env.py,在env.py中配置数据库信息。
 | 
			
		||||
 | 
			
		||||
### 2.2 激活虚拟环境
 | 
			
		||||
 | 
			
		||||
#### 2.2.1 python(python3) -m venv xxxx-venv, (xxxx根据情况定义)
 | 
			
		||||
 | 
			
		||||
#### 2.2.2 \xxxx-venv\Scripts\activate (window OS)
 | 
			
		||||
 | 
			
		||||
#### 2.2.3 sudo chmod -R 777 xxxx-venv/* (Linux OS)
 | 
			
		||||
#### 2.2.4 source ./gh-baohua-venv/bin/activate (Linux OS)
 | 
			
		||||
 | 
			
		||||
## 3. 升级pip
 | 
			
		||||
 | 
			
		||||
	sudo python(python3) -m pip install --upgrade pip
 | 
			
		||||
 | 
			
		||||
## 4. 安装依赖环境
 | 
			
		||||
 | 
			
		||||
	pip install -r requirements.txt
 | 
			
		||||
 | 
			
		||||
## 5. 执行迁移命令:
 | 
			
		||||
	python manage.py makemigrations
 | 
			
		||||
	python manage.py migrate
 | 
			
		||||
 | 
			
		||||
## 6. 初始化数据
 | 
			
		||||
	python manage.py init
 | 
			
		||||
 | 
			
		||||
## 7. 启动项目
 | 
			
		||||
	python manage.py runserver 8888
 | 
			
		||||
 | 
			
		||||
## 8. 初始账号:admin  密码:123456
 | 
			
		||||
 | 
			
		||||
## 9. 搭建正式环境,完成上述步骤1-6
 | 
			
		||||
 | 
			
		||||
### 9.1 配置uwsgi.ini(主要配置项)
 | 
			
		||||
 | 
			
		||||
[uwsgi]
 | 
			
		||||
 | 
			
		||||
chdir           = /mnt/dvadmin-backend
 | 
			
		||||
wsgi-file       = /mnt/dvadmin-backend/application/wsgi.py
 | 
			
		||||
home            = /mnt/dvadmin-backend/leo-baohua-venv
 | 
			
		||||
pidfile = /mnt/dvadmin-backend/uwsgi.pid
 | 
			
		||||
daemonize = /mnt/dvadmin-backend/uwsgi.log
 | 
			
		||||
master          = true
 | 
			
		||||
processes       = 8
 | 
			
		||||
socket          = 0.0.0.0:7777
 | 
			
		||||
module          = application.wsgi:application
 | 
			
		||||
vacuum          = true
 | 
			
		||||
 | 
			
		||||
### 9.2 Nginx 配置
 | 
			
		||||
 | 
			
		||||
#### 9.2.1 配置uwsgi
 | 
			
		||||
        server {
 | 
			
		||||
                listen 7077;
 | 
			
		||||
                server_name 192.168.xx.xxx;
 | 
			
		||||
    
 | 
			
		||||
                location / {
 | 
			
		||||
                        include uwsgi_params;
 | 
			
		||||
                        uwsgi_pass 127.0.0.1:7777;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#### 9.2.2 配置前端
 | 
			
		||||
        server {
 | 
			
		||||
                listen 7078;
 | 
			
		||||
                server_name 192.168.xx.xxx;
 | 
			
		||||
    
 | 
			
		||||
                root /mnt/dvadmin-ui/dist;
 | 
			
		||||
    
 | 
			
		||||
                index index.html index.htm index.nginx-debian.html;
 | 
			
		||||
    
 | 
			
		||||
                location / {
 | 
			
		||||
                        try_files $uri $uri/ /index.html;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#### 9.2.3 配置前端接口-env.production
 | 
			
		||||
VUE_APP_BASE_API = 'http://192.168.xx.xxx:7077'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 快速了解
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 后台手册
 | 
			
		||||
| 
						 | 
				
			
			@ -1,29 +0,0 @@
 | 
			
		|||
# 前端手册
 | 
			
		||||
## 添加菜单页面
 | 
			
		||||
 | 
			
		||||
- 在views中添加页面,如下
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
- 在前端系统中,权限管理——菜单管理——新增
 | 
			
		||||
 | 
			
		||||
  - 例如:一级菜单(目录)
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  - 添加末级菜单
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  - 添加外链跳转菜单(菜单类型目录菜单均可)
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  - 按钮同理
 | 
			
		||||
 | 
			
		||||
- 给角色添加按钮权限
 | 
			
		||||
  
 | 
			
		||||
  - 权限管理——角色管理——修改——添加对应按钮——刷新页面即可。
 | 
			
		||||
  
 | 
			
		||||
    <img src="http://pic.pgroom.cn/image-20210228010835275.png" alt="image-20210228010835275" style="zoom: 33%;" />
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 常见问题
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
# 捐赠支持
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "django-vue-admin-doc",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "description": "",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "docs:dev": "vuepress dev docs",
 | 
			
		||||
    "docs:build": "vuepress build docs"
 | 
			
		||||
  },
 | 
			
		||||
  "author": "",
 | 
			
		||||
  "license": "ISC",
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "vuepress": "^1.8.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,465 +0,0 @@
 | 
			
		|||
<!--
 | 
			
		||||
@description: 封装组件
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <div style="padding-left: 10px;">
 | 
			
		||||
    <el-row v-if="topLayout" style="margin-bottom: 20px">
 | 
			
		||||
      <el-col v-if="topLayoutLeft" :span="18">
 | 
			
		||||
        <div class="grid-content bg-purple">
 | 
			
		||||
          <el-input
 | 
			
		||||
            v-model="searchForm.search"
 | 
			
		||||
            :disabled="tableLoading"
 | 
			
		||||
            :size="$ELEMENT.size"
 | 
			
		||||
            :placeholder="filterPlaceholder"
 | 
			
		||||
            clearable
 | 
			
		||||
            style="width: 200px;"
 | 
			
		||||
            @keyup.enter.native="handleSearchFormSubmit"/>
 | 
			
		||||
          <el-button
 | 
			
		||||
            :size="$ELEMENT.size"
 | 
			
		||||
            type="primary"
 | 
			
		||||
            title="过滤"
 | 
			
		||||
            @click="handleSearchFormSubmit">
 | 
			
		||||
            <common-icon value="svg:icon-filter"/>
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            v-show="isFilter"
 | 
			
		||||
            :size="$ELEMENT.size"
 | 
			
		||||
            type="info"
 | 
			
		||||
            title="取消过滤"
 | 
			
		||||
            style="margin-left: 0;"
 | 
			
		||||
            @click="handleCancelFilter">
 | 
			
		||||
            <common-icon value="svg:icon-unfilter"/>
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <slot name="button"/>
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col v-if="topLayoutRight" :span="6">
 | 
			
		||||
        <div class="grid-content bg-purple-light" style="text-align: right">
 | 
			
		||||
          <slot name="tools"/>
 | 
			
		||||
          <el-button
 | 
			
		||||
            :size="$ELEMENT.size"
 | 
			
		||||
            name="refresh"
 | 
			
		||||
            type="info"
 | 
			
		||||
            title="导出数据"
 | 
			
		||||
            @click="handleExportTableData">
 | 
			
		||||
            <svg-icon icon-class="icon-excel" style="font-size: 1em"/>
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-popover
 | 
			
		||||
            placement="bottom"
 | 
			
		||||
            width="200"
 | 
			
		||||
            trigger="click">
 | 
			
		||||
            <div style="width: 50px;">
 | 
			
		||||
              <el-checkbox-group v-model="showFields">
 | 
			
		||||
                <el-checkbox
 | 
			
		||||
                  v-for="(field, index) in fields"
 | 
			
		||||
                  :key="index"
 | 
			
		||||
                  :label="field"
 | 
			
		||||
                  :checked="field.show"
 | 
			
		||||
                  style="width: 100%"
 | 
			
		||||
                  @change="handleSelectField($event, field)">{{ field.label }}</el-checkbox>
 | 
			
		||||
              </el-checkbox-group>
 | 
			
		||||
            </div>
 | 
			
		||||
            <el-button
 | 
			
		||||
              slot="reference"
 | 
			
		||||
              :size="$ELEMENT.size"
 | 
			
		||||
              name="refresh"
 | 
			
		||||
              type="info"
 | 
			
		||||
              icon="el-icon-s-fold"
 | 
			
		||||
              title="设置显示的字段"/>
 | 
			
		||||
          </el-popover>
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
    <el-table
 | 
			
		||||
      v-loading="tableLoading"
 | 
			
		||||
      ref="table"
 | 
			
		||||
      :data="filterData"
 | 
			
		||||
      :span-method="spanMethod"
 | 
			
		||||
      :max-height="maxHeight"
 | 
			
		||||
      :row-key="getRowKeys"
 | 
			
		||||
      :stripe="stripe"
 | 
			
		||||
      :fit="fit"
 | 
			
		||||
      :border="border"
 | 
			
		||||
      :empty-text="emptyText"
 | 
			
		||||
      :highlight-current-row="highlightCurrentRow"
 | 
			
		||||
      :show-overflow-tooltip="showOverflowTooltip"
 | 
			
		||||
      @cell-click="handleCellClick"
 | 
			
		||||
      @cell-dblclick="handleCellDbClick"
 | 
			
		||||
      @header-click="handleHeaderClick"
 | 
			
		||||
      @row-click="handleRowClick"
 | 
			
		||||
      @row-dblclick="handleRowDblClick"
 | 
			
		||||
      @selection-change="handleSelectionChange">
 | 
			
		||||
      <el-table-column
 | 
			
		||||
        v-if="selection"
 | 
			
		||||
        :reserve-selection="true"
 | 
			
		||||
        type="selection"
 | 
			
		||||
        width="50"/>
 | 
			
		||||
      <template v-for="field in fields">
 | 
			
		||||
        <el-table-column
 | 
			
		||||
          v-if="field.show"
 | 
			
		||||
          :key="field.prop"
 | 
			
		||||
          :prop="field.prop"
 | 
			
		||||
          :label="field.label"
 | 
			
		||||
          :sortable="field.sortable"
 | 
			
		||||
          :width="field.width || ''"
 | 
			
		||||
          show-overflow-tooltip>
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <slot :name="field.prop" :values="scope.row" :prop="field.prop" :field="field">
 | 
			
		||||
              <span v-html="formatColumnData(scope.row, field)"/>
 | 
			
		||||
            </slot>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
      </template>
 | 
			
		||||
      <slot name="column"/>
 | 
			
		||||
    </el-table>
 | 
			
		||||
    <el-row>
 | 
			
		||||
      <el-col :span="6" style="margin-top: 20px">
 | 
			
		||||
        <span>已选择:<span style="color: #ff00ff;font-weight: bold;">{{ multipleSelection.length }}</span>条</span>
 | 
			
		||||
        <el-button
 | 
			
		||||
          v-show="multipleSelection.length"
 | 
			
		||||
          type="info"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          title="清空多选"
 | 
			
		||||
          @click="clearMultipleSelection">清空</el-button>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col :span="18" style="margin-top: 20px; text-align: right">
 | 
			
		||||
        <span>总计:<span style="color: #ff00ff;font-weight: bold;">{{ filterData.length }}</span>条</span>
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
  import moment from 'moment';
 | 
			
		||||
  import * as Utils from '@/utils';
 | 
			
		||||
  export default {
 | 
			
		||||
    name: 'CommonStaticTable',
 | 
			
		||||
    props: {
 | 
			
		||||
      value: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => []
 | 
			
		||||
      },
 | 
			
		||||
      spanMethod: {
 | 
			
		||||
        type: Function,
 | 
			
		||||
        default: null
 | 
			
		||||
      },
 | 
			
		||||
      data: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => []
 | 
			
		||||
      },
 | 
			
		||||
      initSelected: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => []
 | 
			
		||||
      },
 | 
			
		||||
      // eslint-disable-next-line vue/require-prop-types
 | 
			
		||||
      maxHeight: {
 | 
			
		||||
        default: 700
 | 
			
		||||
      },
 | 
			
		||||
      stripe: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: true
 | 
			
		||||
      },
 | 
			
		||||
      fit: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: true
 | 
			
		||||
      },
 | 
			
		||||
      highlightCurrentRow: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: true
 | 
			
		||||
      },
 | 
			
		||||
      showOverflowTooltip: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: true
 | 
			
		||||
      },
 | 
			
		||||
      border: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: false
 | 
			
		||||
      },
 | 
			
		||||
      emptyText: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        default: '暂无数据'
 | 
			
		||||
      },
 | 
			
		||||
      topLayout: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => {
 | 
			
		||||
          return ['left', 'right'];
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      bottomLayout: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => {
 | 
			
		||||
          return ['left', 'right'];
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      fields: {
 | 
			
		||||
        // 后端返回的字段
 | 
			
		||||
        type: Array,
 | 
			
		||||
        default: () => {
 | 
			
		||||
          return [];
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      selection: {
 | 
			
		||||
        // 开始开启多选(默认不开启, false)
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: false
 | 
			
		||||
      },
 | 
			
		||||
      // api 对象
 | 
			
		||||
      api: {
 | 
			
		||||
        type: Function,
 | 
			
		||||
        default: null
 | 
			
		||||
      },
 | 
			
		||||
      params: {
 | 
			
		||||
        type: Object,
 | 
			
		||||
        default: () => {
 | 
			
		||||
          return {};
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
        tableEditable: true,
 | 
			
		||||
        showFields: [], // 显示的字段
 | 
			
		||||
        filterFields: [], // 过滤的字段
 | 
			
		||||
        filterPlaceholder: '过滤', // 过滤提示文字
 | 
			
		||||
        buttonTagList: [], // 所有按钮标签
 | 
			
		||||
        excelDialogVisible: false,
 | 
			
		||||
        tableLoading: false,
 | 
			
		||||
        advancedSearchForm: {},
 | 
			
		||||
        advancedSearchFields: [],
 | 
			
		||||
        rowKey: null,
 | 
			
		||||
        multipleSelection: [],
 | 
			
		||||
        excelHeader: [],
 | 
			
		||||
        excelData: [],
 | 
			
		||||
        searchForm: {
 | 
			
		||||
          search: ''
 | 
			
		||||
        },
 | 
			
		||||
        getRowKeys: row => {
 | 
			
		||||
          if (this.rowKey) {
 | 
			
		||||
            return row[this.rowKey];
 | 
			
		||||
          }
 | 
			
		||||
          return row.id || row.uuid;
 | 
			
		||||
        },
 | 
			
		||||
        exportFields: [],
 | 
			
		||||
        tableData: [],
 | 
			
		||||
        filterData: [],
 | 
			
		||||
        isFilter: false
 | 
			
		||||
      };
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
      topLayoutLeft() {
 | 
			
		||||
        return this.topLayout.indexOf('left') >= 0;
 | 
			
		||||
      },
 | 
			
		||||
      topLayoutRight() {
 | 
			
		||||
        return this.topLayout.indexOf('right') >= 0;
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    watch: {
 | 
			
		||||
      data: {
 | 
			
		||||
        handler: function(newData, oldData) {
 | 
			
		||||
          this.handleChangeTableData(newData);
 | 
			
		||||
        },
 | 
			
		||||
        immediate: true
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    mounted() {
 | 
			
		||||
    },
 | 
			
		||||
    created() {
 | 
			
		||||
      this.initComponentData();
 | 
			
		||||
      this.initData();
 | 
			
		||||
      this.initSelect();
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      initData() {
 | 
			
		||||
        if (Utils.isFunction(this.api)) {
 | 
			
		||||
          this.listInterfaceData();
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      initSelect() {
 | 
			
		||||
        for (const row of this.initSelected) {
 | 
			
		||||
          this.$refs['table'].toggleRowSelection(row, true);
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      initComponentData() {
 | 
			
		||||
        this.fields.forEach(field => {
 | 
			
		||||
          field.show = (!!field.show);
 | 
			
		||||
          field.type = (field.type || 'string').toLocaleLowerCase();
 | 
			
		||||
          field.label = field.label || field.prop;
 | 
			
		||||
          field.search = (!!field.search);
 | 
			
		||||
          field.sortable = (!!field.sortable);
 | 
			
		||||
          field.unique = (!!field.unique);
 | 
			
		||||
          field.width = field.width || '';
 | 
			
		||||
          if (field.type === 'choices') {
 | 
			
		||||
            if (Utils.isArray(field.choices) && field.choices.length > 0) {
 | 
			
		||||
              if (!Utils.isObj(field.choices[0])) {
 | 
			
		||||
                field.choices = field.choices.map(value => {
 | 
			
		||||
                  return {
 | 
			
		||||
                    label: value,
 | 
			
		||||
                    value: value
 | 
			
		||||
                  };
 | 
			
		||||
                });
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          field.unique = (!!field.unique);
 | 
			
		||||
          if (field.unique) {
 | 
			
		||||
            this.rowKey = field.prop;
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        this.filterFields = this.fields.filter(field => field.search).map(field => field.prop);
 | 
			
		||||
        if (this.filterFields.length) {
 | 
			
		||||
          const text = this.fields.filter(field => field.search).map(field => field.label).join('、');
 | 
			
		||||
          this.filterPlaceholder = `${text} 过滤`;
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      listInterfaceData() {
 | 
			
		||||
        this.tableLoading = true;
 | 
			
		||||
        this.api(this.params).then(response => {
 | 
			
		||||
          this.tableLoading = false;
 | 
			
		||||
          this.handleChangeTableData(response.data);
 | 
			
		||||
        }).catch(() => {
 | 
			
		||||
          this.tableLoading = false;
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
      formatColumnData(row, field) {
 | 
			
		||||
        const type = field.type || 'string';
 | 
			
		||||
        const prop = field.prop;
 | 
			
		||||
        if (field.formatter && typeof field.formatter === 'function') {
 | 
			
		||||
          return field.formatter(row, prop, type);
 | 
			
		||||
        }
 | 
			
		||||
        if (type === 'string') {
 | 
			
		||||
          return row[prop];
 | 
			
		||||
        } else if (type === 'datetime') {
 | 
			
		||||
          return this.formatDatetime(row[prop]);
 | 
			
		||||
        } else if (type === 'date') {
 | 
			
		||||
          return this.formatDate(row[prop]);
 | 
			
		||||
        } else if (type === 'time') {
 | 
			
		||||
          return this.formatTime(row[prop]);
 | 
			
		||||
        } else if (type.startsWith('bool')) {
 | 
			
		||||
          return row[prop] ? '是' : '否';
 | 
			
		||||
        } else if (type === 'choices') {
 | 
			
		||||
          const choices = field.choices;
 | 
			
		||||
          return this.formatChoices(choices, row[prop]);
 | 
			
		||||
        } else {
 | 
			
		||||
          return row[prop];
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      formatChoices(choices, value) {
 | 
			
		||||
        for (const choice of choices) {
 | 
			
		||||
          if (choice.value === value) {
 | 
			
		||||
            return choice.label;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
      },
 | 
			
		||||
      formatDatetime(datetime) {
 | 
			
		||||
        return moment(datetime).format('YYYY-MM-DD HH:mm:ss');
 | 
			
		||||
      },
 | 
			
		||||
      formatDate(date) {
 | 
			
		||||
        return moment(date).format('YYYY-MM-DD');
 | 
			
		||||
      },
 | 
			
		||||
      formatTime(time) {
 | 
			
		||||
        return moment(time).format('HH:mm:ss');
 | 
			
		||||
      },
 | 
			
		||||
      getMultipleSelection() {
 | 
			
		||||
        return this.multipleSelection || [];
 | 
			
		||||
      },
 | 
			
		||||
      clearMultipleSelection() {
 | 
			
		||||
        this.$refs.table.clearSelection();
 | 
			
		||||
      },
 | 
			
		||||
      clearSelection() {
 | 
			
		||||
        this.$refs.table.clearSelection();
 | 
			
		||||
      },
 | 
			
		||||
      clearFilter() {
 | 
			
		||||
        // 重置过滤
 | 
			
		||||
        this.searchForm.search = '';
 | 
			
		||||
        this.filterData = Array.from(this.tableData);
 | 
			
		||||
      },
 | 
			
		||||
      handleSelectField(e, field) {
 | 
			
		||||
        field.show = e;
 | 
			
		||||
      },
 | 
			
		||||
      handleChangeTableData(data) {
 | 
			
		||||
        this.tableData = Array.from(data);
 | 
			
		||||
        this.filterData = Array.from(this.filterHandler(this.tableData));
 | 
			
		||||
      },
 | 
			
		||||
      // 导出表格的数据, 当前数据、当前列
 | 
			
		||||
      handleExportTableData() {
 | 
			
		||||
        this.excelDialogVisible = true;
 | 
			
		||||
        this.exportFields = this.fields.map(field => {
 | 
			
		||||
          return { prop: field.prop, label: field.label, show: field.show };
 | 
			
		||||
        });
 | 
			
		||||
        this.excelHeader = this.showFields.map(field => field['prop']);
 | 
			
		||||
      },
 | 
			
		||||
      // 处理修改多选的值
 | 
			
		||||
      handleSelectionChange(val) {
 | 
			
		||||
        this.$emit('selection-change', val);
 | 
			
		||||
        this.multipleSelection = val;
 | 
			
		||||
      },
 | 
			
		||||
      handleSortChange(val) {
 | 
			
		||||
        this.sort.prop = val.prop;
 | 
			
		||||
        this.sort.order = val.order;
 | 
			
		||||
        this.getTableData();
 | 
			
		||||
      },
 | 
			
		||||
      filterHandler(data) {
 | 
			
		||||
        if (!data) {
 | 
			
		||||
          data = this.tableData || [];
 | 
			
		||||
        }
 | 
			
		||||
        const search = this.searchForm.search.trim();
 | 
			
		||||
        if (!search.length || !this.filterFields.length) {
 | 
			
		||||
          this.isFilter = false;
 | 
			
		||||
          return data;
 | 
			
		||||
        }
 | 
			
		||||
        const filterData = data.filter(row => {
 | 
			
		||||
          for (const field of this.filterFields) {
 | 
			
		||||
            if (row[field] && row[field].indexOf(search) >= 0) {
 | 
			
		||||
              return true;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          return false;
 | 
			
		||||
        });
 | 
			
		||||
        this.isFilter = true;
 | 
			
		||||
        return filterData;
 | 
			
		||||
      },
 | 
			
		||||
      handleCellClick(row, column, cell, event) {
 | 
			
		||||
        this.$emit('cell-click', row, column, cell, event);
 | 
			
		||||
      },
 | 
			
		||||
      handleCellDbClick(row, column, cell, event) {
 | 
			
		||||
        this.$emit('cell-dblclick', row, column, cell, event);
 | 
			
		||||
      },
 | 
			
		||||
      handleRowClick(row, column, event) {
 | 
			
		||||
        this.$emit('row-click', row, column, event);
 | 
			
		||||
      },
 | 
			
		||||
      handleRowDblClick(row, column, event) {
 | 
			
		||||
        this.$emit('row-dblclick', row, column, event);
 | 
			
		||||
      },
 | 
			
		||||
      handleHeaderClick(column, event) {
 | 
			
		||||
        this.$emit('header-click', column, event);
 | 
			
		||||
      },
 | 
			
		||||
      toggleRowSelection(row, selected = true) {
 | 
			
		||||
        this.$refs.table.toggleRowSelection(row, selected);
 | 
			
		||||
      },
 | 
			
		||||
      toggleFilter() {
 | 
			
		||||
        // 触发过滤
 | 
			
		||||
        this.filterData = Array.from(this.filterHandler());
 | 
			
		||||
      },
 | 
			
		||||
      handleSearchFormSubmit() {
 | 
			
		||||
        this.toggleFilter();
 | 
			
		||||
      },
 | 
			
		||||
      handleCancelFilter() {
 | 
			
		||||
        this.isFilter = false;
 | 
			
		||||
        this.clearFilter();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
  .picker {
 | 
			
		||||
    width: 240px;
 | 
			
		||||
  }
 | 
			
		||||
  .el-pagination {
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
  }
 | 
			
		||||
  .right_pagination {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    padding-top: 20px;
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
		Loading…
	
		Reference in New Issue