forked from kongfp/TP_Admin
31
0
Fork 1

Merge pull request 'master' (#2) from lishuang/TP_Admin:master into master

Reviewed-on: http://192.168.0.102:3000/Yaxin/TP_API/pulls/2
master
kongfp 2 years ago
commit 84bdc96656

3
.gitignore vendored

@ -1,7 +1,8 @@
.DS_Store
node_modules
/dist
.idea
__pycache__
# local env files
.env.local

@ -1,5 +1,5 @@
"""
ASGI config for TP_Admin project.
ASGI config for TP_Api project.
It exposes the ASGI callable as a module-level variable named ``application``.
@ -11,6 +11,6 @@ import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Admin.settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Api.settings')
application = get_asgi_application()

@ -1,5 +1,5 @@
"""
Django settings for TP_Admin project.
Django settings for TP_Api project.
Generated by 'django-admin startproject' using Django 3.2.19.
@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/3.2/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
@ -20,12 +21,12 @@ BASE_DIR = Path(__file__).resolve().parent.parent
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-d@xkg+%-m3g_h!%howm1%u#1l*v&sd3=7&_-33w!(oy7#!hg79'
SECRET_KEY = 'django-insecure-kqm6r(-!q-emw5c!!@dc)9l^hm@m#4!)-d7ecq85&u^5leu5)_'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG = False
ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["*"]
# Application definition
@ -37,26 +38,29 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.apps.AppConfig',
'rest_framework',
'django_filters',
'corsheaders',
'app'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'TP_Admin.urls'
ROOT_URLCONF = 'TP_Api.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates']
,
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
@ -69,7 +73,7 @@ TEMPLATES = [
},
]
WSGI_APPLICATION = 'TP_Admin.wsgi.application'
WSGI_APPLICATION = 'TP_Api.wsgi.application'
# Database
@ -105,15 +109,15 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
@ -121,7 +125,37 @@ USE_TZ = True
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# 解决跨域
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = ["*"]
CORS_ORIGIN_WHITELIST = ()
# 对应的发送的请求的跨域
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
USE_L10N = False
DATE_FORMAT = 'Y-m-d'
DATETIME_FORMAT = 'Y-m-d H:M:S'
REST_FRAMEWORK = {
'DATETIME_FORMAT': "%Y-%m-%d %H:%M:%S",
'DATE_FORMAT': "%Y-%m-%d",
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}

@ -1,5 +1,5 @@
"""
WSGI config for TP_Admin project.
WSGI config for TP_Api project.
It exposes the WSGI callable as a module-level variable named ``application``.
@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Admin.settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Api.settings')
application = get_wsgi_application()

@ -0,0 +1,240 @@
# TP后台接口文档
<details>
<summary>条件查询</summary>
- 请求方式GET
- 请求链接http://127.0.0.1:8002/api/
- 请求参数:
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| ----------- |---------------------| -------- |--------| ---------- |
| record_time | 2023-05-26 13:09:05 | 否 | string | 记录仪时间 |
| police_id | 00000001 | 否 | string | 警号 |
| event_type | 0 | 否 | string | 事件类型 |
- 可选参数:
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| --------- | ------ | -------- | -------- | -------------------- |
| page | 1 | 否 | string | 页码 |
| page_size | 20 | 否 | string | 页面大小(每页条数) |
- 返回值:
| 参数名 | 参数值 | 参数类型 | 描述说明 |
| ------------- | ------------------------------------------------- | -------- | ------------------------ |
| uid | 1 | int | 自增 |
| video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
| record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
| police_id | 00000001 | string | 警号 |
| event_type | 1 | string | 事件类型 |
| is_violation | true | bool | 是否违规 |
| small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
| relative_time | 4.0 | float | 相对时间 |
| video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
| car_number | 苏a045689 | string | 车牌号 |
| ai_analysis | 违规 | string | 分析结果 |
| add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
| update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
| is_display | true | bool | 是否展示(自动添加) |
</details>
<details>
<summary>查询所有</summary>
- 请求方式GET
- 请求链接http://127.0.0.1:8002/api/
- 可选参数:
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| --------- | ------ | -------- | -------- | -------------------- |
| page | 1 | 否 | string | 页码 |
| page_size | 20 | 否 | string | 页面大小(每页条数) |
- 返回值
| 参数名 | 参数值 | 参数类型 | 描述说明 |
| ------------- | ------------------------------------------------- | -------- | ------------------------ |
| uid | 1 | int | 自增 |
| video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
| record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
| police_id | 00000001 | string | 警号 |
| event_type | 1 | string | 事件类型 |
| is_violation | true | bool | 是否违规 |
| small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
| relative_time | 4.0 | float | 相对时间 |
| video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
| car_number | 苏a045689 | string | 车牌号 |
| ai_analysis | 违规 | string | 分析结果 |
| add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
| update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
| is_display | true | bool | 是否展示(自动添加) |
</details>
<details>
<summary>新增数据</summary>
- 请求方式POST
- 请求链接http://127.0.0.1:8002/api/
- 请求body
```json
{
"video_hash": "vbhdrbvcw",
"record_time": "2023-05-26 13:09:05",
"police_id": "00000002",
"event_type": "1",
"is_violation": true,
"small_image": "nvikefrooiwer",
"relative_time": 4.0,
"video_dir": "/d/test",
"car_number": "苏a045689",
"ai_analysis": "违规"
}
```
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| ------------- |---------------------| -------- |----------| ------ |
| video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
| record_time | 2023-05-26 13:09:05 | 是 | datetime | 记录仪时间 |
| police_id | 00000002 | 是 | string | 警号 |
| event_type | 1 | 是 | string | 事件类型 |
| is_violation | true | 是 | bool | 是否违规 |
| small_image | nvikefrooiwer | 是 | string | 缩略图 |
| relative_time | 4.0 | 是 | int | 相对时间 |
| video_dir | /d/test | 是 | string | 视频路径 |
| car_number | 苏a045689 | 是 | string | 车牌号 |
| ai_analysis | 违规 | 是 | string | 分析结果 |
- 返回值
| 参数名 | 参数值 | 参数类型 | 描述说明 |
| ------------- | ------------------------------------------------- | -------- | ------------------------ |
| uid | 1 | int | 自增 |
| video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
| record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
| police_id | 00000001 | string | 警号 |
| event_type | 1 | string | 事件类型 |
| is_violation | true | bool | 是否违规 |
| small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
| relative_time | 4.0 | float | 相对时间 |
| video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
| car_number | 苏a045689 | string | 车牌号 |
| ai_analysis | 违规 | string | 分析结果 |
| add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
| update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
| is_display | true | bool | 是否展示(自动添加) |
</details>
<details>
<summary>修改数据</summary>
- 请求方式put
- 请求链接http://127.0.0.1:8002/api/20/
- 请求body
```json
{
"video_hash": "vbhdrbvcw",
"record_time": "2023-05-26 13:09:05",
"police_id": "00000002",
"event_type": "1",
"is_violation": true,
"small_image": "nvikefrooiwer",
"relative_time": 4.0,
"video_dir": "/d/test",
"car_number": "苏a045689",
"ai_analysis": "违规"
}
```
| 参数名 | 参数值 | 是否必填 | 参数类型 | 描述说明 |
| ------------- |---------------------| -------- |-----|-------|
| video_hash | vbhdrbvcw | 是 | string | 视频哈希 |
| record_time | 2023-05-26 13:09:05 | 是 | string | 记录仪时间 |
| police_id | 00000002 | 是 | string | 警号 |
| event_type | 1 | 是 | string | 事件类型 |
| is_violation | true | 是 | bool | 是否违规 |
| small_image | nvikefrooiwer | 是 | string | 缩略图 |
| relative_time | 4.0 | 是 | float | 相对时间 |
| video_dir | /d/test | 是 | string | 视频路径 |
| car_number | 苏a045689 | 是 | string | 车牌号 |
| ai_analysis | 违规 | 是 | string | 分析结果 |
- 备注操作会修改uid为20的数据
- 返回值:
| 参数名 | 参数值 | 参数类型 | 描述说明 |
| ------------- | ------------------------------------------------- | -------- | ---------------------- |
| uid | 1 | int | 自增 |
| video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
| record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
| police_id | 00000001 | string | 警号 |
| event_type | 1 | string | 事件类型 |
| is_violation | true | bool | 是否违规 |
| small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
| relative_time | 4.0 | float | 相对时间 |
| video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
| car_number | 苏a045689 | string | 车牌号 |
| ai_analysis | 违规 | string | 分析结果 |
| add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
| update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
| is_display | true | bool | 是否展示(自动添加) |
</details>
<details>
<summary>删除数据</summary>
- 请求方式delete
- 请求链接http://127.0.0.1:8002/api/20/
- 备注操作会删除uid为20的数据
- 返回值:
| 参数名 | 参数值 | 参数类型 | 描述说明 |
| ------------- | ------------------------------------------------- | -------- | ------------------------ |
| uid | 1 | int | 自增 |
| video_hash | 38fb463b135fa12534104f85492cc6f1 | string | 视频哈希值 |
| record_time | 2023-05-26 13:09:05 | string | 记录仪时间 |
| police_id | 00000001 | string | 警号 |
| event_type | 1 | string | 事件类型 |
| is_violation | true | bool | 是否违规 |
| small_image | http://192.168.0.47:8000/media/images/0000609.jpg | string | 缩略图 |
| relative_time | 4.0 | float | 相对时间 |
| video_dir | http://192.168.0.47:8000/media/video/B1.MP4 | string | 视频地址 |
| car_number | 苏a045689 | string | 车牌号 |
| ai_analysis | 违规 | string | 分析结果 |
| add_time | 2023-05-31 18:42:15 | string | 记录添加时间(自动添加) |
| update_time | 2023-05-31 18:42:15 | string | 记录更新时间(自动添加) |
| is_display | true | bool | 是否展示(自动添加) |
</details>

@ -1,6 +1,6 @@
from django.apps import AppConfig
class AppConfig(AppConfig):
class App01Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app'

@ -0,0 +1,30 @@
# Generated by Django 3.2.19 on 2023-05-25 08:07
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='MyModel',
fields=[
('uid', models.AutoField(primary_key=True, serialize=False)),
('video_hash', models.CharField(max_length=50)),
('record_time', models.DateTimeField()),
('police_id', models.CharField(max_length=50)),
('event_type', models.IntegerField()),
('is_violation', models.BooleanField()),
('small_image', models.CharField(max_length=50)),
('relative_time', models.IntegerField()),
('video_dir', models.CharField(max_length=50)),
('car_number', models.CharField(max_length=50)),
('ai_analysis', models.CharField(max_length=50)),
],
),
]

@ -0,0 +1,23 @@
# Generated by Django 3.2.19 on 2023-05-26 10:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='mymodel',
name='ai_analysis',
field=models.CharField(max_length=255),
),
migrations.AlterField(
model_name='mymodel',
name='relative_time',
field=models.FloatField(),
),
]

@ -0,0 +1,35 @@
# Generated by Django 3.2.19 on 2023-05-29 14:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0002_auto_20230526_1003'),
]
operations = [
migrations.CreateModel(
name='TP_Api',
fields=[
('uid', models.AutoField(primary_key=True, serialize=False)),
('video_hash', models.CharField(max_length=50)),
('record_time', models.DateTimeField()),
('police_id', models.CharField(max_length=50)),
('event_type', models.IntegerField()),
('is_violation', models.BooleanField()),
('small_image', models.CharField(max_length=50)),
('relative_time', models.FloatField()),
('video_dir', models.CharField(max_length=50)),
('car_number', models.CharField(max_length=50)),
('ai_analysis', models.CharField(max_length=255)),
('add_time', models.DateTimeField()),
('update_time', models.DateTimeField()),
('is_display', models.BooleanField()),
],
),
migrations.DeleteModel(
name='MyModel',
),
]

@ -0,0 +1,23 @@
# Generated by Django 3.2.19 on 2023-05-31 10:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0003_auto_20230529_1446'),
]
operations = [
migrations.AlterField(
model_name='tp',
name='small_image',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='tp',
name='video_dir',
field=models.CharField(max_length=100),
),
]

@ -0,0 +1,18 @@
# Generated by Django 3.2.19 on 2023-05-31 14:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0004_auto_20230531_1032'),
]
operations = [
migrations.AlterField(
model_name='tp',
name='event_type',
field=models.CharField(max_length=50),
),
]

@ -0,0 +1,28 @@
# Generated by Django 3.2.19 on 2023-05-31 17:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0005_alter_tp_event_type'),
]
operations = [
migrations.AlterField(
model_name='tp',
name='add_time',
field=models.DateTimeField(auto_now=True),
),
migrations.AlterField(
model_name='tp',
name='is_display',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='tp',
name='update_time',
field=models.DateTimeField(auto_now_add=True),
),
]

@ -0,0 +1,23 @@
# Generated by Django 3.2.19 on 2023-06-01 10:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0006_auto_20230531_1757'),
]
operations = [
migrations.AlterField(
model_name='tp',
name='add_time',
field=models.DateTimeField(auto_now_add=True),
),
migrations.AlterField(
model_name='tp',
name='update_time',
field=models.DateTimeField(auto_now=True),
),
]

@ -1,3 +1,36 @@
from django.db import models
# Create your models here.
class TP(models.Model):
# uid
uid = models.AutoField(primary_key=True)
# 视频哈希
video_hash = models.CharField(max_length=50)
# 记录仪时间
record_time = models.DateTimeField()
# 警号
police_id = models.CharField(max_length=50)
# 事件类型
event_type = models.CharField(max_length=50)
# 是否违规
is_violation = models.BooleanField()
# 缩略图
small_image = models.CharField(max_length=100)
# 相对时间
relative_time = models.FloatField()
# 视频路径
video_dir = models.CharField(max_length=100)
# 车牌号
car_number = models.CharField(max_length=50)
# 分析结果
ai_analysis = models.CharField(max_length=255)
# 加入时间
add_time = models.DateTimeField(auto_now_add=True)
# 更新时间
update_time = models.DateTimeField(auto_now=True)
# 是否显示
is_display = models.BooleanField(default=True)

@ -0,0 +1,9 @@
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 10
page_query_param = "page"
page_size_query_param = "page_size"
max_page_size = 100

@ -0,0 +1,31 @@
from rest_framework import serializers
from django_filters.rest_framework import FilterSet
import django_filters
from app.models import TP
class SerialMyModel(serializers.ModelSerializer):
class Meta:
model = TP
fields = "__all__"
class SerialFilter(FilterSet):
"""
过滤器支持模糊查询
record_time日期时间格式 2023-01-01 00:00:00
police_id支持模糊匹配
event_type支持模糊匹配
"""
record_time = django_filters.DateTimeFilter(field_name='record_time', lookup_expr='icontains')
police_id = django_filters.CharFilter(field_name='police_id', lookup_expr='icontains')
event_type = django_filters.CharFilter(field_name='event_type', lookup_expr='icontains')
class Meta:
# 指定模型
models = TP
# 指定需要模糊查询的字段
fields = ("record_time", "police_id", "event_type",)

@ -1,4 +1,4 @@
"""TP_Admin URL Configuration
"""TP_Api URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.2/topics/http/urls/
@ -13,9 +13,14 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
# from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from app import views
router = DefaultRouter()
router.register('', views.ModelQuery)
urlpatterns = [
path('admin/', admin.site.urls),
]
path('', include(router.urls)),
]

@ -1,3 +1,21 @@
from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets
from rest_framework.response import Response
from app.models import TP
from app.serializers import SerialMyModel, SerialFilter
from app.pagination import MyPageNumberPagination
class ModelQuery(viewsets.ModelViewSet):
# 查询类
queryset = TP.objects.all().order_by("uid")
# 序列化类
serializer_class = SerialMyModel
# 分页类
pagination_class = MyPageNumberPagination
# 条件筛选
filterset_class = SerialFilter

Binary file not shown.

@ -6,7 +6,7 @@ import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Admin.settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TP_Api.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save