first commit

This commit is contained in:
552068321@qq.com
2022-11-04 17:37:08 +08:00
commit 6f7de660aa
192 changed files with 32574 additions and 0 deletions
.gitignoreSetParams.zip
SetParams
SetParams_Demo.py__init__.py
app
__init__.py
configs
controller
core
exts.pyfile_tool.pyjson_util.py
models
run.py
schemas
services
utils
yolov5
.dockerignore.gitattributes
.github
.gitignore.pre-commit-config.yamlCONTRIBUTING.mdLICENSEREADME.md
classify
data
data_set
detect_server.pyexport.pyhubconf.py
models
train_server.pytutorial.ipynb
utils
val.pyvalidate_server.py圆孔_123_RODY_1_640.zip
deploy.shdocker-compose.yml
docs
nohup.outpytest.inirequirements.txtrequirements_p37.txtsetparams.py
tests

125
app/utils/DateTimeUtil.py Normal file

@ -0,0 +1,125 @@
# coding:utf-8
import time
import datetime
def gap_day(time_str, date=None, format="%Y-%m-%d"):
"""
:判断自然日差几天
:param time_str: 2019-02-19 21:49:20
:return:
"""
if not date:
date = time.strftime(format)
now_day_stamps = time.mktime(time.strptime(date, format))
if " " in format:
format = format.split(" ")[0]
input_stamps = time.mktime(time.strptime(time_str.split(" ")[0], format))
return int(abs((now_day_stamps - input_stamps)) // 86400)
def gap_stamps_day(time_str, now_day_stamps=None):
"""
:判断绝对时间差几天
:param time_str: 2019-02-19 21:49:20
:return:
"""
if not now_day_stamps:
now_day_stamps = time.time()
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
return int(abs((now_day_stamps - input_stamps)) // 86400)
def gap_stamps_hour(time_str):
"""
:判断绝对上差几个小时
:param time_str: 2019-02-19 21:49:20
:return:
"""
now = int(time.time())
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
return int(abs((now - input_stamps)) // 3600)
def gap_stamps_minute(time_str):
"""
:判断绝对上差几个分钟
:param time_str: 2019-02-19 21:49:20
:return:
"""
now = int(time.time())
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
return int(abs((now - input_stamps)) // 60)
def get_now():
"""
获取当前时间 YYYY-MM-DD HH:mm:ss
:param
:return:
"""
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
return current_time
def get_time_stamp(timeStr, format="%Y-%m-%d %H:%M:%S"):
"""
获取时间戳
:param timeStr: 2019-05-12 09:00:00
:param format: "%Y-%m-%d %H:%M:%S"
:return:
"""
timeArray = time.strptime(timeStr, format)
timestamp = time.mktime(timeArray)
return int(timestamp)
def gap_stamps_sec(time_str):
"""
:判断绝对上差几秒
:param time_str: 2019-02-19 21:49:20
:return:
"""
now = int(time.time())
input_stamps = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
return int(abs((now - input_stamps)))
def get_day_jia(date, n, format='%Y-%m-%d'):
"""
时间加n天
:param date:
:param n:
:return:
"""
jia_date = datetime.datetime.strptime(date, format)
jia_date = jia_date + datetime.timedelta(days=n)
return jia_date.strftime(format)
def get_sec_jia(seconds, format="%Y-%m-%d %H:%M:%S"):
"""
当前时间加多少秒
:param seconds:
:param format:
:return: 2019-12-30 19:25:30
"""
return (datetime.datetime.now() + datetime.timedelta(seconds=seconds)).strftime(format)
def get_ts_to_time(ts):
"""时间戳转字符串"""
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts))
def day_long(time1, time2):
"""
计算时间差
:return: 相差的天数
"""
ts1 = get_time_stamp(time1)
ts2 = get_time_stamp(time2)
date1 = datetime.datetime.fromtimestamp(ts1)
date2 = datetime.datetime.fromtimestamp(ts2)
return abs(int((date2 - date1).days))

@ -0,0 +1,24 @@
import hashlib
import uuid
def sha256_encode(contents: str):
res = hashlib.sha256(b"%b" % contents.encode("utf8")).hexdigest()
return res
def sha3_256_encode(contents: str):
res = hashlib.sha3_256(b"%b" % contents.encode("utf8")).hexdigest()
return res
def generate_uuid():
return uuid.uuid4()
if __name__ == "__main__":
print(hashlib.algorithms_guaranteed)
print(hashlib.algorithms_available)
print(sha256("res"))
print(sha3_256("res" + generate_uuid().hex))
print(generate_uuid().hex)

@ -0,0 +1,21 @@
"""
@Time 2022/10/17 10:12
@Auth
@File JSONEncodeTools.py
@IDE PyCharm
@MottoABC(Always Be Coding)
@Desc
"""
import datetime
import json
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
if isinstance(obj, datetime.datetime):
return str(obj)
return json.JSONEncoder.default(self, obj)

42
app/utils/RedisMQTool.py Normal file

@ -0,0 +1,42 @@
"""
@Time 2022/10/9 17:50
@Auth
@File RedisMQTool.py
@IDE PyCharm
@MottoABC(Always Be Coding)
@Desc
"""
import json
import redis
class Task(object):
def __init__(self, redis_conn, channel):
self.rcon = redis_conn
self.ps = self.rcon.pubsub()
self.key = 'task:pubsub:%s' % channel
self.ps.subscribe(self.key)
def listen_task(self):
for i in self.ps.listen():
if i['type'] == 'message':
print("Task get ", i["data"])
def publish_task(self, data):
self.rcon.publish(self.key, json.dumps(data))
def del_listen(self):
self.ps.unsubscribe(self.key)
if __name__ == '__main__':
print("listen task channel")
pool = redis.ConnectionPool(host='127.0.0.1',
port=6379, db=5,)
redis_conn = redis.StrictRedis(connection_pool=pool)
Task(redis_conn, 'channel').listen_task()

@ -0,0 +1,95 @@
# coding: utf-8
# Authortajochen
import sqlite3
import os
class SimpleSQLite3Tool:
"""
simpleToolSql for sqlite3
简单数据库工具类
编写这个类主要是为了封装sqlite继承此类复用方法
"""
def __init__(self, filename="stsql"):
"""
初始化数据库,默认文件名 stsql.db
filename文件名
"""
self.filename = filename
self.db = sqlite3.connect(self.filename)
self.c = self.db.cursor()
def close(self):
"""
关闭数据库
"""
self.c.close()
self.db.close()
def execute(self, sql, param=None):
"""
执行数据库的增、删、改
sqlsql语句
param数据可以是list或tuple亦可是None
return成功返回True
"""
try:
if param is None:
self.c.execute(sql)
else:
if type(param) is list:
self.c.executemany(sql, param)
else:
self.c.execute(sql, param)
count = self.db.total_changes
self.db.commit()
except Exception as e:
print(e)
return False, e
if count > 0:
return True
else:
return False
def query(self, sql, param=None):
"""
查询语句
sqlsql语句
param参数,可为None
return成功返回True
"""
if param is None:
self.c.execute(sql)
else:
self.c.execute(sql, param)
return self.c.fetchall()
# def set(self,table,field=" * ",where="",isWhere=False):
# self.table = table
# self.filed = field
# if where != "" :
# self.where = where
# self.isWhere = True
# return True
if __name__ == "__main__":
# 数据库文件位置
sql = SimpleSQLite3Tool("../test.db")
f = sql.execute("create table test (id int not null,name text not null,age int);")
print("ok")
sql.execute("insert into test (id,name,age) values (?,?,?);", [(1, 'abc', 15), (2, 'bca', 16)])
res = sql.query("select * from test;")
print(res)
sql.execute("insert into test (id,name) values (?,?);", (3, 'bac'))
res = sql.query("select * from test where id=?;", (3,))
res = sql.query("select * from data_collection_info;")
print(res)
sql.close()

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
"""
@author: cxyfreedom
@desc: 基于 snowflake 生成分布式ID
"""
import time
# 每一部分占用的位数
TIMESTAMP_BIT = 41 # 时间戳占用位数
MACHINE_BIT = 5 # 机器标识占用的位数
DATACENTER_BIT = 5 # 数据中心占用的位数
SEQUENCE_BIT = 12 # 序列号占用的位数
# 每一部分的最大值
MAX_DATACENTER_NUM = -1 ^ (-1 << DATACENTER_BIT)
MAX_MACHINE_NUM = -1 ^ (-1 << MACHINE_BIT)
MAX_SEQUENCE = -1 ^ (-1 << SEQUENCE_BIT)
# 每一部分向左的位移
MACHINE_LEFT = SEQUENCE_BIT
DATACENTER_LEFT = MACHINE_BIT + SEQUENCE_BIT
TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT
class SnowFlake:
class OverflowError(TypeError):
"""
分布式ID生成算法占位符溢出异常会导致生成ID为负数
"""
pass
class RuntimeError(TypeError):
"""
运行时间错误,在此项目中当前运行时间小于上一次运行时间。
"""
pass
def __init__(self):
if TIMESTAMP_BIT + SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT != 63:
raise self.OverflowError(
"TIMESTAMP_BIT + SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT not equal to 63bit")
self.datacenter_id = 0 # 数据中心编号
self.machineId = 0 # 机器标识编号
self.sequence = 0 # 序列号
self.last_stamp = -1 # 上一次时间戳
def nextId(self):
"""生成下一个ID"""
cur_stamp = self.get_new_stamp()
if cur_stamp < self.last_stamp:
raise self.RuntimeError(
"Clock moved backwards. Refusing to generate id")
if cur_stamp == self.last_stamp:
# 相同毫秒内,序列号自增
self.sequence = (self.sequence + 1) & MAX_SEQUENCE
# 同一秒的序列数已经达到最大
if self.sequence == 0:
cur_stamp = self.get_next_mill()
else:
# 不同秒内序列号为0
self.sequence = 0
self.last_stamp = cur_stamp
return (cur_stamp << TIMESTAMP_LEFT) | (
self.datacenter_id << DATACENTER_LEFT) | (
self.machineId << MACHINE_LEFT) | self.sequence
def get_next_mill(self):
mill = self.get_new_stamp()
while mill <= self.last_stamp:
mill = self.get_new_stamp()
return mill
@staticmethod
def get_new_stamp():
now = lambda: int(time.time() * 1000)
return now()
if __name__ == "__main__":
print(SnowFlake().nextId())

@ -0,0 +1,5 @@
from flask import jsonify
def output_wrapped(status: int = 0, message: str = "", data: object = None):
return jsonify(code=status, message=message, data=data)

53
app/utils/UDPReceive.py Normal file

@ -0,0 +1,53 @@
#!/usr/bin/python3
# coding= utf-8
import socket
import sys
import struct
import json
# 本机信息
import time
host_ip = socket.gethostbyname(socket.gethostname())
# 组播组IP和端口
mcast_group_ip = '224.1.1.1'
mcast_group_port = 2234
def receiver():
# 建立接收 udp socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# linux能绑定网卡这里绑定组播IP地址不会服错windows没法绑定网卡只能绑定本网卡IP地址
if "linux" in sys.platform:
# 绑定到的网卡名如果自己的不是eth0则修改
nic_name = 0
# 监听的组播地址
sock.setsockopt(socket.SOL_SOCKET, 25, nic_name)
sock.bind((mcast_group_ip, mcast_group_port))
else:
sock.bind((host_ip, mcast_group_port))
# 加入组播组
mq_request = struct.pack("=4sl", socket.inet_aton(mcast_group_ip), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mq_request)
# 设置非阻塞
sock.setblocking(True)
while True:
try:
data, address = sock.recvfrom(4096)
data2 = json.loads(data)
# 若组播数据不正确
if len(data2) < 3:
return
except socket.error as e:
print(f"while receive message error occur:{e}")
else:
print("Receive Data!")
print("FROM: ", address)
print("DATA: ", data.decode('utf-8'))
if __name__ == "__main__":
receiver()

32
app/utils/UDPSender.py Normal file

@ -0,0 +1,32 @@
#!/usr/bin/python3
# coding= utf-8
import time
import struct
import socket
# 本机信息
host_ip = socket.gethostname()
host_port = 6501
# 组播组IP和端口
mcast_group_ip = '239.255.255.252'
mcast_group_port = 5678
def sender():
send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
send_sock.bind((host_ip, host_port))
# 设置存活时长
ttl_bin = struct.pack('@i', 255)
send_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
while True:
data = '12345 english 汉字#测试'
send_sock.sendto(str(data).encode('utf-8'), (mcast_group_ip, mcast_group_port))
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: send finish.')
time.sleep(10)
if __name__ == "__main__":
sender()

@ -0,0 +1,29 @@
"""
@Time 2022/10/11 16:43
@Auth
@File WebsocketClient.py
@IDE PyCharm
@MottoABC(Always Be Coding)
@Desc
"""
from threading import Thread
import websocket
def connect(self, apiKey, secretKey, trace=False):
self.host = OKEX_USD_CONTRACT
self.apiKey = apiKey
self.secretKey = secretKey
self.trace = trace
websocket.enableTrace(trace)
self.ws = websocket.WebSocketApp(self.host,
on_message=self.onMessage,
on_error=self.onError,
on_close=self.onClose,
on_open=self.onOpen)
self.thread = Thread(target=self.ws.run_forever, args=(None, None, 60, 30))
self.thread.start()

40
app/utils/YamlTool.py Normal file

@ -0,0 +1,40 @@
import yaml
import os
# 单个文档
def get_yaml_data(yaml_file):
# 打开yaml文件
file = open(yaml_file, 'r', encoding='utf-8')
file_data = file.read()
file.close()
# 将字符串转化为字典或列表
data = yaml.safe_load(file_data) # safe_loadsafe_load,unsafe_load
return data
# yaml文件中含多个文档时分别获取文档中数据
def get_yaml_load_all(yaml_file):
# 打开文件
file = open(yaml_file, 'r', encoding='utf-8')
file_data = file.read()
file.close()
all_data = yaml.load_all(file_data, Loader=yaml.FullLoader)
for data in all_data:
print('data-----', data)
# 生成yaml文档
def generate_yaml_doc(yaml_file):
py_ob = {"school": "zhang", "students": ['a', 'b']}
file = open(yaml_file, 'w', encoding='utf-8')
yaml.dump(py_ob, file)
file.close()
if __name__ == '__main__':
current_path = os.path.abspath("../../")
yaml_path = os.path.join(current_path, "config.yaml")
print('--------------------', yaml_path)
get_yaml_data(yaml_path)

0
app/utils/__init__.py Normal file

66
app/utils/redis_config.py Normal file

@ -0,0 +1,66 @@
"""
redis 配置类
"""
import sys
import redis
from ..configs import default
class RedisCli(object):
def __init__(self, *, host: str, port: str, password: str, db: int, socket_timeout=5):
# redis对象在 @app.on_event('startup') 中连接创建
self._redis_client = None
self.host = host
self.port = port
self.password = password
self.db = db
self.socket_timeout = socket_timeout
def init_redis_connect(self) -> None:
"""
初始化链接
:return:
"""
try:
r = redis.ConnectionPool(
host=self.host,
port=self.port,
password=self.password,
db=self.db,
socket_timeout=self.socket_timeout,
decode_responses=True # 解码
)
self._redis_client = redis.StrictRedis(connection_pool=r)
if not self._redis_client.ping():
print('连接超时')
sys.exit()
except (redis.AuthenticationError, Exception) as e:
print('连接redis异常')
sys.exit()
def get_redis(self):
return self._redis_client
# 使实例化后的对象赋予redis对象的方法和属性
def __getattr__(self, item):
return self._redis_client.has_key(item)
def __getitem__(self, item):
return self._redis_client[item]
def __setitem__(self, key, value):
self._redis_client[key] = value
def __delitem__(self, key):
del self._redis_client[key]
redis_client = RedisCli(
host=default.db['host'],
port=default.db['port'],
password=default.db['password'],
db=default.db['db'],
)

@ -0,0 +1,60 @@
"""
@Time 2022/10/12 17:55
@Auth
@File websocket_tool.py
@IDE PyCharm
@MottoABC(Always Be Coding)
@Desc
"""
import json
from typing import Union, List, Dict
from app.core.common_utils import logger
from app.utils.JSONEncodeTools import MyEncoder
class WebsocketUtil:
def __init__(self):
self.active_connections: List = []
self.active_connections_dist: Dict = {}
def connect(self, ws, id: str):
# 等待连接
msg = ws.receive()
# 存储ws连接对象
self.active_connections.append(ws)
if id in self.active_connections_dist:
self.active_connections_dist[id].append(ws)
else:
ws_list = [ws, ]
self.active_connections_dist[id] = ws_list
def disconnect(self, ws, id):
# ws关闭时 移除ws对象
if ws.closed:
if ws in self.active_connections_dist.values():
self.active_connections.remove(ws)
self.active_connections_dist[id].pop(ws)
@staticmethod
async def send_personal_message(message: str, ws):
# 发送个人消息
await ws.send(message)
def broadcast(self, message: str):
# 广播消息
for connection in self.active_connections:
connection.send(message)
def send_message_proj_json(self, message: Union[str, int, List, Dict], id: str):
# 广播该项目的消息
for connection in self.active_connections_dist[id]:
try:
connection.send(json.dumps(message, cls=MyEncoder, indent=4), )
except Exception as e:
logger.error("websocket异常断开{}", e)
self.disconnect(ws=connection, id=id)
manager = WebsocketUtil()