Compare commits
15 Commits
dependabot
...
master
Author | SHA1 | Date |
---|---|---|
isummer | e12779d654 | 2 years ago |
isummer | ac590563a7 | 2 years ago |
isummer | 8fc1d353c9 | 2 years ago |
isummer | 35b64d74de | 2 years ago |
isummer | a064988f56 | 2 years ago |
isummer | adff361c11 | 2 years ago |
isummer | 419e39eaaa | 2 years ago |
isummer | 9d9cb3f2cb | 2 years ago |
isummer | dd802dccbb | 2 years ago |
isummer | 1262bff671 | 2 years ago |
isummer | 289737ed00 | 2 years ago |
isummer | dc7b491534 | 2 years ago |
isummer | eed0f5194c | 2 years ago |
isummer | e0599585be | 2 years ago |
isummer | 42451f2cb0 | 2 years ago |
@ -0,0 +1,102 @@ |
||||
### Docker最小化部署前准备,如果使用超级签和云存储,需要使用阿里云的服务器 |
||||
系统|Centos 8 Stream 纯净系统 [2cpu 4G内存] |
||||
----|---- |
||||
域名|```app.hehelucky.cn``` |
||||
域名SSL证书| nginx 格式证书 [阿里云和腾讯云都可以申请免费ssl证书] |
||||
数据路径| ```/data``` |
||||
|
||||
|
||||
### 开始部署 |
||||
##### 1.从git上面下载源码 |
||||
``` |
||||
cd /data/ |
||||
dnf install git -y |
||||
git clone https://github.com/nineaiyu/flyapps |
||||
``` |
||||
|
||||
## 注意,下面展示的相对路径,都是以```/data/flyapps```为相对目录 |
||||
|
||||
#### 2.docker环境安装 |
||||
``` |
||||
cd /data/flyapps/docker/init |
||||
sh init.sh |
||||
``` |
||||
|
||||
#### 3.配置域名和证书,如果有cdn或者oss,也要进行配置 |
||||
a.将域名证书通过```sftp软件```或者```rz命令```复制到```/data/flyapps/nginx.conf.d```目录中 |
||||
|
||||
b.将域名证书分别重命名为 ```域名.pem``` 和 ```域名.key``` .本次使用的域名是 ```app.hehelucky.cn``` ,因此,证书名称类似如下 |
||||
```shell script |
||||
nginx.conf.d/app.hehelucky.cn.key |
||||
nginx.conf.d/app.hehelucky.cn.pem |
||||
``` |
||||
c.修改NGINX配置文件```nginx.conf.d/flyapps-vhost.conf```,将```server_name```字段修改为域名,将```ssl_certificate```和 |
||||
```ssl_certificate_key```修改为对应证书路径,修改之后,对应字段如下 |
||||
```shell |
||||
server_name app.hehelucky.cn; |
||||
ssl_certificate /etc/nginx/conf.d/app.hehelucky.cn.pem; |
||||
ssl_certificate_key /etc/nginx/conf.d/app.hehelucky.cn.key; |
||||
``` |
||||
|
||||
#### 4.配置api服务需要修改api和web域名,如果有需求,还可以配置 短信,邮箱,geetest,存储等信息 |
||||
##### fir_ser配置文件 ```fir_ser/config.py``` |
||||
```python |
||||
class DOMAINCONF(object): |
||||
API_DOMAIN = "https://app.hehelucky.cn" # 用与开启本地存储,上传应用配置 |
||||
WEB_DOMAIN = "https://app.hehelucky.cn" # 用于超级签跳转配置,该域名一般为前端页面域名 |
||||
``` |
||||
|
||||
##### fir_client配置文件 ```fir_client/vue.confjg.js``` |
||||
```javascript |
||||
const pro_base_env = { |
||||
baseUrl: '/', //该选项可以填写web-api的域名,类似 https://api.xxx.com/ |
||||
index_static: '/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
baseShortUrl: '/', //该选项可以填写short-api的域名,也可以和web-api域名一样,类似 https://api.xxx.com/ |
||||
short_static: '/short/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
version: version, |
||||
}; |
||||
``` |
||||
|
||||
##### 构建静态资源 |
||||
``` |
||||
cd /data/flyapps/docker/scripts |
||||
sh build.sh |
||||
``` |
||||
|
||||
##### 启动所有服务 |
||||
``` |
||||
cd /data/flyapps/docker/scripts |
||||
sh start_all.sh |
||||
``` |
||||
|
||||
##### 关闭所有服务 |
||||
``` |
||||
cd /data/flyapps/docker/scripts |
||||
sh stop_all.sh |
||||
``` |
||||
|
||||
##### 根据提示创建默认管理用户,用与访问管理后台 |
||||
```shell |
||||
docker exec -it flyapps python manage.py createsuperuser |
||||
``` |
||||
|
||||
##### 测试访问 |
||||
- 在浏览器输入自己配置的域名 https://app.hehelucky.cn/ 进行访问 |
||||
- 管理后台访问 https://app.hehelucky.cn:3448/ 进行访问 |
||||
|
||||
|
||||
##### 如果要使用本地的数据库和redis,api服务使用容器,需要修改文件```/data/flyapps/docker/flyapps/docker-compose.yml``` |
||||
```shell |
||||
external_links: |
||||
- mariadb:mariadb |
||||
- redis:redis |
||||
``` |
||||
修改为 |
||||
```shell |
||||
extra_hosts: |
||||
- "mariadb:172.31.31.1" |
||||
- "redis:172.31.31.1" |
||||
``` |
||||
并将```nginx:```下面的配置注释掉 |
||||
|
||||
同时还需要修改mariadb和redis授权 |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 57 KiB |
After Width: | Height: | Size: 56 KiB |
@ -0,0 +1,166 @@ |
||||
### 本地部署前准备 |
||||
系统 | Centos 8 Stream [2cpu 4G内存] |
||||
----|---- |
||||
域名|```app.hehelucky.cn``` |
||||
域名SSL证书| nginx 格式证书 [阿里云和腾讯云都可以申请免费ssl证书] |
||||
数据路径| ```/data``` |
||||
|
||||
|
||||
##### 从git上面下载源码 |
||||
```shell |
||||
cd /data/ |
||||
dnf install git gcc zip unzip -y |
||||
git clone https://github.com/nineaiyu/flyapps |
||||
``` |
||||
|
||||
|
||||
### flyapps 本地部署 [python3 环境] |
||||
|
||||
##### 搭建python env 环境 |
||||
```shell |
||||
dnf install python39 python39-devel redis mariadb-server mariadb-devel -y |
||||
python3.9 -m venv py39 |
||||
source py39/bin/activate |
||||
``` |
||||
|
||||
###### 安装pip包 |
||||
```shell |
||||
cd /data/flyapps/fir_ser/ |
||||
pip install -U setuptools pip -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
||||
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
||||
``` |
||||
|
||||
#### 配置数据库 |
||||
##### 启动mariadb数据库 |
||||
```shell |
||||
systemctl restart mariadb |
||||
systemctl enable mariadb |
||||
``` |
||||
##### 创建mysql数据库 |
||||
```shell |
||||
mysql |
||||
``` |
||||
执行下面mysql命令 |
||||
```mariadb |
||||
create database flyapps default character set utf8 COLLATE utf8_general_ci; |
||||
grant all on flyapps.* to flyuser@'127.0.0.1' identified by 'KGzKjZpWBp4R4RSa'; |
||||
``` |
||||
##### 启动redis数据库 |
||||
```shell |
||||
echo 'requirepass nineven' >> /etc/redis.conf # 配置授权密码 |
||||
systemctl restart redis |
||||
systemctl enable redis |
||||
``` |
||||
|
||||
### flyapps zsign ipa重签名工具安装 |
||||
```shell |
||||
dnf install openssl-devel -y |
||||
dnf install gcc-c++ gcc -y |
||||
cd /data/flyapps/fir_ser/ |
||||
tar xvf zsign-1.1.2.tar.gz |
||||
cd zsign-1.1.2/ |
||||
g++ *.cpp common/*.cpp -lcrypto -O3 -std=c++11 -o /usr/bin/zsign |
||||
``` |
||||
|
||||
|
||||
#### 配置api服务需要修改api和web域名,如果有需求,还可以配置 短信,邮箱,geetest,存储等信息 |
||||
##### fir_ser配置文件 ```fir_ser/config.py``` |
||||
```python |
||||
class DOMAINCONF(object): |
||||
API_DOMAIN = "https://app.hehelucky.cn" # 用与开启本地存储,上传应用配置 |
||||
WEB_DOMAIN = "https://app.hehelucky.cn" # 用于超级签跳转配置,该域名一般为前端页面域名 |
||||
``` |
||||
|
||||
##### fir_client配置文件 ```fir_client/vue.confjg.js``` |
||||
```javascript |
||||
const pro_base_env = { |
||||
baseUrl: '/', //该选项可以填写web-api的域名,类似 https://api.xxx.com/ |
||||
index_static: '/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
baseShortUrl: '/', //该选项可以填写short-api的域名,也可以和web-api域名一样,类似 https://api.xxx.com/ |
||||
short_static: '/short/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
version: version, |
||||
}; |
||||
``` |
||||
|
||||
### flyapps web端搭建 |
||||
###### npm编译环境 |
||||
```shell |
||||
dnf install npm -y |
||||
npm install -g n |
||||
n 12.13 # 安装12版本的node或者14版本 ,最新版本会有问题 |
||||
npm install -g yarn |
||||
``` |
||||
|
||||
|
||||
|
||||
###### 编译web端和下载页 |
||||
```shell |
||||
cd /data/flyapps/fir_client/ |
||||
vim vue.config.js #修改api接口地址 |
||||
# pro_base_env 正式环境信息 |
||||
# dev_base_env 开发环境信息 |
||||
|
||||
yarn install |
||||
yarn build index # 前端打包,输出目录 dist_index |
||||
yarn build short # 下载页打包,输出目录 dist_short |
||||
``` |
||||
|
||||
###### 编译web管理后台 |
||||
```shell |
||||
cd /data/flyapps/fir_admin/ |
||||
yarn install |
||||
yarn build:prod # 下载页打包,输出目录 dist |
||||
``` |
||||
|
||||
### nginx配置 |
||||
##### 安装nginx |
||||
```shell |
||||
dnf install nginx -y |
||||
``` |
||||
##### 将域名ssl证书解压到```/etc/nginx/conf.d/``` 目录中,并重命名为```域名.pem```,```域名.key```格式 |
||||
##### 拷贝虚拟主机配置文件 |
||||
```shell |
||||
cp /data/flyapps/nginx.conf.d/flyapps-vhost.conf /etc/nginx/conf.d/ |
||||
``` |
||||
1.创建web目录,并将打包好的web复制该目录 |
||||
```shell |
||||
mkdir -pv /data/{fir_client/short,fir_admin} |
||||
cp -a /data/flyapps/fir_client/dist_index/* /data/fir_client/ |
||||
cp -a /data/flyapps/fir_client/dist_short/* /data/fir_client/short/ |
||||
cp -a /data/flyapps/fir_admin/dist/* /data/fir_admin/ |
||||
chown nginx.nginx -R /data/{fir_client,fir_admin} |
||||
``` |
||||
2.启动nginx服务 |
||||
```shell |
||||
nginx -t |
||||
systemctl restart nginx |
||||
systemctl enable nginx |
||||
``` |
||||
|
||||
##### 添加redis和mariadb uwsgi本地解析 |
||||
```shell |
||||
echo '127.0.0.1 mariadb redis flyapps' >> /etc/hosts |
||||
``` |
||||
|
||||
###### 迁移数据库 |
||||
```shell |
||||
cd /data/flyapps/fir_ser/ |
||||
python manage.py makemigrations |
||||
python manage.py migrate |
||||
``` |
||||
|
||||
#### 启动api服务 |
||||
```shell |
||||
echo 'net.core.somaxconn=1024' >> /etc/sysctl.conf |
||||
sysctl -p |
||||
cd /data/flyapps/fir_ser/ |
||||
python manage.py start all -u nginx -usm 1 -d |
||||
``` |
||||
|
||||
##### 根据提示创建默认管理用户,用与访问管理后台 |
||||
```shell |
||||
python manage.py createsuperuser |
||||
``` |
||||
- 需要输入用户名,邮箱和密码 |
||||
- 用户名和密码用与登录管理后台 |
||||
- 邮箱和密码用与登录前端web |
@ -1,81 +0,0 @@ |
||||
##### 从git上面下载源码 |
||||
``` |
||||
cd /data/ |
||||
git clone https://github.com/nineaiyu/FlyApps |
||||
``` |
||||
|
||||
#### docker环境安装 [centos8] |
||||
``` |
||||
cd /data/FlyApps/docker/init |
||||
sh init.sh |
||||
``` |
||||
#### 域名证书准备 |
||||
- 域名: app.hehelucky.cn |
||||
- 证书(nginx) |
||||
- app.hehelucky.cn.key |
||||
- app.hehelucky.cn.pem |
||||
|
||||
#### 配置域名和证书,如果有cdn或者oss,也要进行配置 |
||||
```shell script |
||||
nginx.conf.d/app.hehelucky.cn.key |
||||
nginx.conf.d/app.hehelucky.cn.pem |
||||
nginx.conf.d/flyapps-vhost.conf |
||||
``` |
||||
|
||||
#### api服务需要修改api和web域名,短信,邮箱,geetest,存储等信息 |
||||
##### fir_ser配置文件 config.py |
||||
```python |
||||
class DOMAINCONF(object): |
||||
API_DOMAIN = "https://app.hehelucky.cn" # 用与开启本地存储,上传应用配置 |
||||
WEB_DOMAIN = "https://app.hehelucky.cn" # 用于超级签跳转配置,该域名一般为前端页面域名 |
||||
``` |
||||
|
||||
##### fir_client配置文件 vue.confjg.js |
||||
```javascript |
||||
const pro_base_env = { |
||||
baseUrl: '/', //该选项可以填写web-api的域名,类似 https://api.xxx.com/ |
||||
index_static: '/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
baseShortUrl: '/', //该选项可以填写short-api的域名,也可以和web-api域名一样,类似 https://api.xxx.com/ |
||||
short_static: '/short/', //若配置cdn等加速,可以填写cdn加速域名 |
||||
version: version, |
||||
}; |
||||
``` |
||||
|
||||
##### 构建静态资源和api服务 |
||||
``` |
||||
cd /data/FlyApps/docker/scripts |
||||
sh build.sh |
||||
``` |
||||
##### 构建flyapps-cli |
||||
```shell |
||||
cd /data/FlyApps/fir_ser |
||||
docker build -t flyapps-cli -f Dockerfile.cli . |
||||
``` |
||||
|
||||
##### 构建镜像的同时,下载依赖镜像 |
||||
```shell |
||||
docker pull 'bitnami/mariadb:10.7.3' |
||||
docker pull 'bitnami/redis:6.2.7' |
||||
docker pull 'nginx:1.21.3' |
||||
``` |
||||
|
||||
##### 启动所有服务 |
||||
``` |
||||
cd /data/FlyApps/docker/scripts |
||||
sh start_all.sh |
||||
``` |
||||
|
||||
##### 关闭所有服务 |
||||
``` |
||||
cd /data/FlyApps/docker/scripts |
||||
sh stop_all.sh |
||||
``` |
||||
|
||||
##### 根据提示创建默认管理用户 |
||||
```shell |
||||
docker exec -it flyapps python manage.py createsuperuser |
||||
``` |
||||
|
||||
##### 测试访问 |
||||
- 在浏览器输入自己配置的域名 https://app.hehelucky.cn/ 进行访问 |
||||
- 管理后台访问 https://app.hehelucky.cn:3448/ 进行访问 |
@ -0,0 +1,31 @@ |
||||
version: '3' |
||||
|
||||
networks: |
||||
flyapps: |
||||
external: true |
||||
name: flyapps |
||||
|
||||
services: |
||||
flyapps: |
||||
container_name: flyapps |
||||
restart: always |
||||
image: 'nineven/flyapps' |
||||
working_dir: /data/fir_ser |
||||
volumes: |
||||
- /etc/localtime:/etc/localtime:ro |
||||
- ../../fir_ser:/data/fir_ser |
||||
- ../../data/flyapps/files:/data/fir_ser/files |
||||
- ../../data/logs/flyapps/:/data/fir_ser/logs |
||||
- ../../data/flyapps/supersign/:/data/fir_ser/supersign |
||||
- ../../nginx.conf.d:/data/cert |
||||
networks: |
||||
flyapps: |
||||
ipv4_address: 172.31.31.100 |
||||
external_links: |
||||
- mariadb:mariadb |
||||
- redis:redis |
||||
sysctls: |
||||
- net.core.somaxconn=4096 |
||||
extra_hosts: |
||||
- "mariadb:172.31.31.1" |
||||
- "redis:172.31.31.1" |
@ -0,0 +1,10 @@ |
||||
#!/bin/bash |
||||
# |
||||
# |
||||
|
||||
|
||||
docker pull 'bitnami/mariadb:10.7.3' |
||||
docker pull 'bitnami/redis:6.2.7' |
||||
docker pull 'nginx:1.21.3' |
||||
docker pull 'nineven/flyapps:latest' |
||||
docker pull 'node:14.17.3' |
@ -1,146 +0,0 @@ |
||||
from functools import wraps, WRAPPER_ASSIGNMENTS |
||||
|
||||
from django.http.response import HttpResponse |
||||
|
||||
from common.cache.storage import AppDownloadShortShowCache |
||||
|
||||
|
||||
def get_cache(alias): |
||||
from django.core.cache import caches |
||||
return caches[alias] |
||||
|
||||
|
||||
def set_short_show_cache(short, cache_key): |
||||
short_show_cache = AppDownloadShortShowCache("ShortDownloadView".lower(), short) |
||||
key_list = short_show_cache.get_storage_cache() |
||||
|
||||
if key_list and isinstance(key_list, list): |
||||
key_list.append(cache_key) |
||||
key_list = list(set(key_list)) |
||||
else: |
||||
key_list = [cache_key] |
||||
short_show_cache.set_storage_cache(key_list, 600) |
||||
|
||||
|
||||
class CacheResponse: |
||||
""" |
||||
Store/Receive and return cached `HttpResponse` based on DRF response. |
||||
.. note:: |
||||
This decorator will render and discard the original DRF response in |
||||
favor of Django's `HttpResponse`. The allows the cache to retain a |
||||
smaller memory footprint and eliminates the need to re-render |
||||
responses on each request. Furthermore it eliminates the risk for users |
||||
to unknowingly cache whole Serializers and QuerySets. |
||||
""" |
||||
|
||||
def __init__(self, |
||||
timeout=None, |
||||
key_func=None, |
||||
cache=None, |
||||
cache_errors=None): |
||||
if timeout is None: |
||||
self.timeout = None |
||||
else: |
||||
self.timeout = timeout |
||||
|
||||
if key_func is None: |
||||
self.key_func = '' |
||||
else: |
||||
self.key_func = key_func |
||||
|
||||
if cache_errors is None: |
||||
self.cache_errors = True |
||||
else: |
||||
self.cache_errors = cache_errors |
||||
|
||||
self.cache = get_cache(cache or 'default') |
||||
|
||||
def __call__(self, func): |
||||
this = self |
||||
|
||||
@wraps(func, assigned=WRAPPER_ASSIGNMENTS) |
||||
def inner(self, request, *args, **kwargs): |
||||
return this.process_cache_response( |
||||
view_instance=self, |
||||
view_method=func, |
||||
request=request, |
||||
args=args, |
||||
kwargs=kwargs, |
||||
) |
||||
|
||||
return inner |
||||
|
||||
def process_cache_response(self, |
||||
view_instance, |
||||
view_method, |
||||
request, |
||||
args, |
||||
kwargs): |
||||
|
||||
key = self.calculate_key( |
||||
view_instance=view_instance, |
||||
view_method=view_method, |
||||
request=request, |
||||
args=args, |
||||
kwargs=kwargs |
||||
) |
||||
|
||||
timeout = self.calculate_timeout(view_instance=view_instance) |
||||
|
||||
response_triple = self.cache.get(key) |
||||
if not response_triple: |
||||
# render response to create and cache the content byte string |
||||
response = view_method(view_instance, request, *args, **kwargs) |
||||
response = view_instance.finalize_response(request, response, *args, **kwargs) |
||||
response.render() |
||||
|
||||
if not response.status_code >= 400 or self.cache_errors: |
||||
# django 3.0 has not .items() method, django 3.2 has not ._headers |
||||
if hasattr(response, '_headers'): |
||||
headers = response._headers.copy() |
||||
else: |
||||
headers = {k: (k, v) for k, v in response.items()} |
||||
response_triple = ( |
||||
response.rendered_content, |
||||
response.status_code, |
||||
headers |
||||
) |
||||
short = kwargs.get("short", '') |
||||
set_short_show_cache(short, key) |
||||
self.cache.set(key, response_triple, timeout) |
||||
else: |
||||
# build smaller Django HttpResponse |
||||
content, status, headers = response_triple |
||||
response = HttpResponse(content=content, status=status) |
||||
for k, v in headers.values(): |
||||
response[k] = v |
||||
if not hasattr(response, '_closable_objects'): |
||||
response._closable_objects = [] |
||||
|
||||
return response |
||||
|
||||
def calculate_key(self, |
||||
view_instance, |
||||
view_method, |
||||
request, |
||||
args, |
||||
kwargs): |
||||
if isinstance(self.key_func, str): |
||||
key_func = getattr(view_instance, self.key_func) |
||||
else: |
||||
key_func = self.key_func |
||||
return key_func( |
||||
view_instance=view_instance, |
||||
view_method=view_method, |
||||
request=request, |
||||
args=args, |
||||
kwargs=kwargs, |
||||
) |
||||
|
||||
def calculate_timeout(self, view_instance, **_): |
||||
if isinstance(self.timeout, str): |
||||
self.timeout = getattr(view_instance, self.timeout) |
||||
return self.timeout |
||||
|
||||
|
||||
cache_response = CacheResponse |
@ -1,252 +0,0 @@ |
||||
[ |
||||
{ |
||||
"model": "api.price", |
||||
"pk": 1, |
||||
"fields": { |
||||
"name": "1k_times", |
||||
"title": "1k_times", |
||||
"description": "1k_times", |
||||
"price": 2500, |
||||
"package_size": 1000, |
||||
"download_count_gift": 100, |
||||
"is_enable": true, |
||||
"updated_time": "2021-05-25T16:22:23.744" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.price", |
||||
"pk": 2, |
||||
"fields": { |
||||
"name": "10k_times", |
||||
"title": "10k_times", |
||||
"description": "10k_times", |
||||
"price": 22000, |
||||
"package_size": 10000, |
||||
"download_count_gift": 800, |
||||
"is_enable": true, |
||||
"updated_time": "2021-05-25T16:22:35.404" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.price", |
||||
"pk": 3, |
||||
"fields": { |
||||
"name": "100k_times", |
||||
"title": "100k_times", |
||||
"description": "100k_times", |
||||
"price": 200000, |
||||
"package_size": 100000, |
||||
"download_count_gift": 8000, |
||||
"is_enable": true, |
||||
"updated_time": "2021-05-25T16:22:43.995" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 1, |
||||
"fields": { |
||||
"domain_record": "d.ashort.top", |
||||
"ip_address": "d.ashort.top.w.kunlunsl.com", |
||||
"is_enable": true, |
||||
"is_system": true, |
||||
"is_https": false, |
||||
"description": "d.ashort.top \u7cfb\u7edf\u81ea\u5e26\u57df\u540d\uff0c\u672a\u5907\u6848\uff0c\u56fd\u5916\u52a0\u901f\uff0c\u7528\u4e0e\u4e0b\u8f7d\u9875\u8df3\u8f6c\u57df\u540d", |
||||
"created_time": "2021-05-21T21:25:33" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 2, |
||||
"fields": { |
||||
"domain_record": "d.bshort.top", |
||||
"ip_address": "d.bshort.top.w.kunlunsl.com", |
||||
"is_enable": true, |
||||
"is_system": true, |
||||
"is_https": false, |
||||
"description": "d.bshort.top \u7cfb\u7edf\u81ea\u5e26\u57df\u540d\uff0c\u672a\u5907\u6848\uff0c\u56fd\u5916\u52a0\u901f\uff0c\u7528\u4e0e\u4e0b\u8f7d\u9875\u8df3\u8f6c\u57df\u540d", |
||||
"created_time": "2021-05-21T21:25:33" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 3, |
||||
"fields": { |
||||
"domain_record": "d.cshort.top", |
||||
"ip_address": "d.cshort.top.w.kunlunsl.com", |
||||
"is_enable": true, |
||||
"is_system": true, |
||||
"is_https": false, |
||||
"description": "d.cshort.top \u7cfb\u7edf\u81ea\u5e26\u57df\u540d\uff0c\u672a\u5907\u6848\uff0c\u56fd\u5916\u52a0\u901f\uff0c\u7528\u4e0e\u4e0b\u8f7d\u9875\u8df3\u8f6c\u57df\u540d", |
||||
"created_time": "2021-05-21T21:25:33" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 4, |
||||
"fields": { |
||||
"domain_record": "d.eshort.top", |
||||
"ip_address": "d.eshort.top.w.kunlunsl.com", |
||||
"is_enable": true, |
||||
"is_system": true, |
||||
"is_https": false, |
||||
"description": "d.eshort.top \u7cfb\u7edf\u81ea\u5e26\u57df\u540d\uff0c\u672a\u5907\u6848\uff0c\u56fd\u5916\u52a0\u901f\uff0c\u7528\u4e0e\u4e0b\u8f7d\u9875\u8df3\u8f6c\u57df\u540d", |
||||
"created_time": "2021-05-21T21:25:33" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 5, |
||||
"fields": { |
||||
"domain_record": "234bfdd02542cf838cff76b9.dshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:10:37.180" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 6, |
||||
"fields": { |
||||
"domain_record": "03d9108cf7caf79ba2667a94.dshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:14:17.624" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 7, |
||||
"fields": { |
||||
"domain_record": "e61cc922e0227d4febfdd681.fshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:16:17.067" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 8, |
||||
"fields": { |
||||
"domain_record": "93bab80713ed87897d30e4db.fshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:16:25.248" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 9, |
||||
"fields": { |
||||
"domain_record": "b1cf45592f107520a29475dc.eshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:36:38.244" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 10, |
||||
"fields": { |
||||
"domain_record": "a897858c4775a288f99dd55e.eshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:36:44.967" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 11, |
||||
"fields": { |
||||
"domain_record": "2f717ce5b6d2ad8bc8216808.ashort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:37:38.661" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 12, |
||||
"fields": { |
||||
"domain_record": "051466b64caf72a2de466400.ashort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:37:43.715" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 13, |
||||
"fields": { |
||||
"domain_record": "eb7a92ce0b9c613f2dead7d4.bshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:38:32.069" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 14, |
||||
"fields": { |
||||
"domain_record": "798c2576b649ce38bdc16eb3.bshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:38:36.919" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 15, |
||||
"fields": { |
||||
"domain_record": "42ff0f107683baf335162f78.cshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:39:18.063" |
||||
} |
||||
}, |
||||
{ |
||||
"model": "api.domaincnameinfo", |
||||
"pk": 16, |
||||
"fields": { |
||||
"domain_record": "8fc3c8b4cc987c235a68b347.cshort.top", |
||||
"ip_address": "47.241.30.190", |
||||
"is_enable": true, |
||||
"is_system": false, |
||||
"is_https": false, |
||||
"description": "", |
||||
"created_time": "2021-05-25T16:39:23.235" |
||||
} |
||||
} |
||||
] |
@ -0,0 +1,20 @@ |
||||
# Generated by Django 4.0.8 on 2022-11-12 08:53 |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
dependencies = [ |
||||
('xsign', '0003_deviceabnormaludid_deviceblackudid'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='udidsyncdeveloper', |
||||
name='device_class', |
||||
field=models.CharField( |
||||
choices=[('APPLE_WATCH', 'APPLE_WATCH'), ('IPAD', 'IPAD'), ('IPHONE', 'IPHONE'), ('IPOD', 'IPOD'), |
||||
('APPLE_TV', 'APPLE_TV'), ('MAC', 'MAC')], default='IPHONE', max_length=16, |
||||
verbose_name='设备类型'), |
||||
), |
||||
] |