Browse Source

first commit

master
unknown 11 months ago
commit
1f71331049
  1. 3
      .idea/.gitignore
  2. 8
      .idea/FristProject.iml
  3. 6
      .idea/inspectionProfiles/profiles_settings.xml
  4. 10
      .idea/misc.xml
  5. 8
      .idea/modules.xml
  6. 41
      DBManager.py
  7. 25
      DataStruct.py
  8. 172
      SocketManager.py
  9. 0
      SystemManager.py
  10. 0
      ViewManager.py
  11. 27
      config.yaml
  12. 4
      logs/2024-05-25.log
  13. 4
      logs/app.log
  14. 13
      main.py
  15. 204
      model/ModelManager.py
  16. 9
      model/plugins/AQM_Model.py
  17. 17
      model/plugins/ModelBase.py
  18. 5
      model/plugins/RYRQ_Model.py
  19. BIN
      model/plugins/__pycache__/AQM_Model.cpython-312.pyc
  20. BIN
      model/plugins/__pycache__/ModelBase.cpython-312.pyc
  21. BIN
      model/plugins/__pycache__/RYRQ_Model.cpython-312.pyc
  22. 54
      util/ConfigManager.py
  23. 73
      util/MyLogger_logger.py
  24. 42
      util/MyLogger_logging.py
  25. BIN
      util/__pycache__/ConfigManager.cpython-312.pyc
  26. BIN
      util/__pycache__/MyLogger_logger.cpython-312.pyc
  27. BIN
      util/__pycache__/MyLogger_logging.cpython-312.pyc
  28. 2
      util/logs/2024-05-25.log
  29. 16
      util/logs/app.log
  30. 213
      web/__init__.py
  31. BIN
      web/__pycache__/__init__.cpython-312.pyc
  32. 5
      web/main/__init__.py
  33. BIN
      web/main/__pycache__/__init__.cpython-312.pyc
  34. BIN
      web/main/__pycache__/routes.cpython-312.pyc
  35. 10
      web/main/routes.py
  36. 7
      web/static/data/document.js
  37. 105
      web/static/data/styles.css
  38. BIN
      web/static/favicon.ico
  39. 7
      web/static/files/实时预览/data.js
  40. 1397
      web/static/files/实时预览/styles.css
  41. 7
      web/static/files/用户管理/data.js
  42. 4032
      web/static/files/用户管理/styles.css
  43. 7
      web/static/files/登录/data.js
  44. 763
      web/static/files/登录/styles.css
  45. 7
      web/static/files/算法管理/data.js
  46. 3945
      web/static/files/算法管理/styles.css
  47. 7
      web/static/files/系统管理/data.js
  48. 1604
      web/static/files/系统管理/styles.css
  49. 7
      web/static/files/通道管理/data.js
  50. 6164
      web/static/files/通道管理/styles.css
  51. BIN
      web/static/images/实时预览/u20_menu.png
  52. BIN
      web/static/images/实时预览/u22.png
  53. BIN
      web/static/images/实时预览/u26.png
  54. BIN
      web/static/images/实时预览/u32.png
  55. BIN
      web/static/images/实时预览/u48.png
  56. BIN
      web/static/images/实时预览/u48_selected.png
  57. BIN
      web/static/images/用户管理/u410.png
  58. BIN
      web/static/images/用户管理/u411.png
  59. BIN
      web/static/images/用户管理/u412.png
  60. BIN
      web/static/images/用户管理/u413.png
  61. BIN
      web/static/images/用户管理/u441.png
  62. BIN
      web/static/images/用户管理/u442.png
  63. BIN
      web/static/images/用户管理/u443.png
  64. BIN
      web/static/images/用户管理/u444.png
  65. BIN
      web/static/images/用户管理/u466.png
  66. BIN
      web/static/images/用户管理/u467.png
  67. BIN
      web/static/images/用户管理/u468.png
  68. BIN
      web/static/images/用户管理/u469.png
  69. BIN
      web/static/images/用户管理/u497.png
  70. BIN
      web/static/images/用户管理/u498.png
  71. BIN
      web/static/images/用户管理/u499.png
  72. BIN
      web/static/images/用户管理/u500.png
  73. BIN
      web/static/images/登录/u12.png
  74. 6
      web/static/images/登录/u4.svg
  75. BIN
      web/static/images/算法管理/u252.png
  76. BIN
      web/static/images/算法管理/u253.png
  77. BIN
      web/static/images/算法管理/u254.png
  78. BIN
      web/static/images/算法管理/u255.png
  79. BIN
      web/static/images/算法管理/u256.png
  80. BIN
      web/static/images/算法管理/u312.png
  81. BIN
      web/static/images/算法管理/u313.png
  82. BIN
      web/static/images/算法管理/u314.png
  83. BIN
      web/static/images/算法管理/u315.png
  84. BIN
      web/static/images/算法管理/u316.png
  85. 5
      web/static/images/算法管理/u363.svg
  86. 5
      web/static/images/算法管理/u363_disabled.svg
  87. 6
      web/static/images/算法管理/u363_selected.svg
  88. 6
      web/static/images/算法管理/u363_selectedDisabled.svg
  89. 5
      web/static/images/算法管理/u364.svg
  90. 5
      web/static/images/算法管理/u364_disabled.svg
  91. 6
      web/static/images/算法管理/u364_selected.svg
  92. 6
      web/static/images/算法管理/u364_selectedDisabled.svg
  93. 5
      web/static/images/算法管理/u366.svg
  94. 5
      web/static/images/算法管理/u366_disabled.svg
  95. 6
      web/static/images/算法管理/u366_selected.svg
  96. 6
      web/static/images/算法管理/u366_selectedDisabled.svg
  97. 5
      web/static/images/算法管理/u367.svg
  98. 5
      web/static/images/算法管理/u367_disabled.svg
  99. 6
      web/static/images/算法管理/u367_selected.svg
  100. 6
      web/static/images/算法管理/u367_selectedDisabled.svg

3
.idea/.gitignore

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

8
.idea/FristProject.iml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/inspectionProfiles/profiles_settings.xml

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

10
.idea/misc.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="PyTorch" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="PyTorch" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>
</project>

8
.idea/modules.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/FristProject.iml" filepath="$PROJECT_DIR$/.idea/FristProject.iml" />
</modules>
</component>
</project>

41
DBManager.py

@ -0,0 +1,41 @@
import pymysql
import sqlite3
class DBManager():
#实例化数据库管理对象,并连接数据库
def __init__(self,ip,prot,user,passwd):
pass
#检查设备ID是否在数据库?
def checkDevID(self,cID):
pass
def test(self):
# 建立数据库连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='username',
password='password',
database='database_name'
)
# 创建游标对象
cursor = conn.cursor()
# 执行 SQL 查询
query = "SELECT * FROM table_name"
cursor.execute(query)
# 获取查询结果
result = cursor.fetchall()
# 输出结果
for row in result:
print(row)
# 关闭游标和连接
cursor.close()
conn.close()

25
DataStruct.py

@ -0,0 +1,25 @@
'''
数据结构定义类
'''
import ctypes
'''
iDataType 0-心跳1-设备端登录2-手机端登录3-
'''
class CSHeadMessage(ctypes.Structure):
_fields_ = [
('Flag',ctypes.c_char * 4),
('iDataType',ctypes.c_int),
('iDataLen',ctypes.c_int)
]
class CSDevLogin_Data(ctypes.Structure):
_fields_ = [('DID',ctypes.c_char * 32)]
class CSAPPLogin_Data(ctypes.Structure):
_fields_ = [
('username', ctypes.c_char * 32),
('passwd', ctypes.c_char * 32)
]

172
SocketManager.py

@ -0,0 +1,172 @@
import threading
import socket
import socketserver
from DataStruct import *
from util.MyLogger_logging import MyLogger
from DBManager import DBManager
import time
m_BRun = False #线程运行标识
'''
客户端SOCKET类
'''
class ClientSocket():
def __init__(self,strIP,strPort):
self.strIP = strIP
self.strPort = strPort
self.isOnline = True
self.strUserID = "" # userID 可以在字典层
'''
服务端SOCKET--Handler类--目前验证效果是一个客户端就是一个handler
使用一些全局变量
'''
class SSocketHandler(socketserver.BaseRequestHandler):
#重写handle,把上级类的对象传递到每个socket
def __init__(self, request, client_address, server,sc_manager):
#自定义初始化内容
self.sc_manager = sc_manager #把管理类的对象传递到每个socket连接
self.db_manager = sc_manager.myDBM #数据库连接类
self.myID = "" #socket ID
self.log = MyLogger("SSocketHandler")
super().__init__(request, client_address, server)
def getSendHead(self,itype):
if itype ==0:
data_to_send = CSHeadMessage()
data_to_send.Flag = b"TFTF"
data_to_send.iDataType = 0
data_to_send.iDataLen = 0
return data_to_send
#对接收到的数据进行分析处理 --- 数据协议还没定好
#-1非法数据,会断开连接
def data_analyse(self,head,buffer):
if head.iDataType == 0: #心跳包
#回个心跳包
senddata = self.getSendHead(0)
self.request.sendall(senddata)
elif head.iDataType == 1: #设备端登录 -- 32个字节 -- 登录失败也退出
# 处理登录信息,buffer应该为32长度的ID值,在数据库中查询已售设备清单,存在的则上线。 初步为此机制,后期要加强安全机制
# 目前设备和用户使用同一个字典,后期可以分开 2024-04-07
cID = self.db_manager.checkDevID(buffer)
self.log.debug("处理登录信息:{}".format(buffer))
if cID:
self.myID = cID
#验证通过则添加设备客户端节点
self.sc_manager.update_client_dict(1,cID,self)
self.log.debug("设备{}登录成功".format(cID))
elif head.iDataType == 2: #app端等 --用户名和密码 -- 登录失败也退出
user_data = CSAPPLogin_Data.from_buffer_copy(buffer)
self.log.debug("处理APP登录信息:{}--{}".format(user_data.username,user_data.passwd))
else:
if self.myID == "": #在接收除了1和2的数据时,若没有登录,则关闭连接
return -1
elif head.iDataType == 3:
pass
elif head.iDataType == 4:
pass
else:
self.log.error("数据类型错误")
return -1
return 1
def handle(self): #接受到客户端连接会触发handle -- handle已经多线程
print("conn is :", self.request) # conn
print("addr is :", self.client_address) # addr
self.request.settimeout(10*60) #单位秒 -- 客户端需要5分钟发送一次心跳包
while self.sc_manager.m_BRun:
try:
# 先接收数据包头
head_data = self.request.recv(ctypes.sizeof(CSHeadMessage)) #12个字节
if not head_data or len(head_data) != ctypes.sizeof(CSHeadMessage):
self.log.debug("包头接收不完整,或客户端断开")
break
head = CSHeadMessage.from_buffer_copy(head_data)
if head.Flag == b"TFTF":
iDLen = head.iDataLen
irecvlen= 0
buffer = b''
while irecvlen < iDLen:
data = self.request.recv(1024)
if not data:
self.log.debug("客户端断开")
break
irecvlen += len(data)
buffer += data
#对数据进行分析处理
ret = self.data_analyse(head,buffer)
if ret == -1: #未登录处理其他数据或登录失败,则进行报错和关闭socket连接
self.log.info("该连接还未登录:{}".format(head_data))
break
else: #非法的数据头,需要关闭socket连接
self.log.info("接收到的数据非法:{}".format(head_data))
break
except TimeoutError:
self.log.debug("socket接收数据超时")
break
except Exception as e:
self.log.error("Socket异常:{}".format(e))
break
#需要更新客户端列表 -- 删除socket节点 --只有登录过维护过连接的需要删除
if(self.myID != ""):
self.sc_manager.update_client_dict(0,self.myID,self)
self.log.info("handle结束")#?handle结束后,资源是否释放需要确认
class SocketManager():
def __init__(self,iPort):
self.mylog = MyLogger("SocketManager")
self.client_dict = {} #socket列表
self.lock = threading.Lock() #互斥锁
self.m_BRun = True
self.iPort = iPort
def __del__(self):
self.m_BRun = False
time.sleep(3)
#itype:0-删除socket节点,1-添加socket节点
#设备ID和用户ID都为不重复值
def update_client_dict(self,itype,cID,csHandle):
with self.lock:
if itype == 0: #删除节点
self.client_dict[cID].request.close()
del self.client_dict[cID]
elif itype == 1: #添加节点,先删后加
if cID in self.client_dict:
self.client_dict[cID].request.close()
del self.client_dict[cID]
self.client_dict[cID] = csHandle
else:
self.mylog.error("有非预设值传入!")
def startListen(self):
print("开始socket实例化")
ip_port = ("127.0.0.1", self.iPort)
self.s = socketserver.ThreadingTCPServer(ip_port, lambda *args, **kwargs: SSocketHandler(*args, **kwargs,
sc_manager=self))
# s = socketserver.ThreadingTCPServer(ip_port, SSocketHandler)
self.s.serve_forever()
# ?待完善项,如何停止Server_socket的运行。
#创建socket对象,并执行工作
def doWork(self):
#实例化数据库连接
self.myDBM = DBManager("ip","prot","username","passwd")
if not self.myDBM:
self.mylog.error("建立数据库连接失败!请检查程序")
return
#开始
thread = threading.Thread(target=self.startListen) # 如果目标函数带括号,则代表已调研,返回的目标对象是函数执行的结果。
print("开始启动线程了")
thread.start()
# 等待线程结束
thread.join()
if __name__ == "__main__":
SocketM = SocketManager(18000)
SocketM.doWork()

0
SystemManager.py

0
ViewManager.py

27
config.yaml

@ -0,0 +1,27 @@
#字典更新接口
url: http://192.168.2.61/api/
hyMD5: http://192.168.2.61/api/defaultMd5/download
hyfile: http://192.168.2.61/api/defaultPassword/download/
hyget: http://192.168.2.61/api/defaultPassword/export/
#主线程数
concurrency: 6 #同时执行的子任务数,--线程数
#超时配置
TagTime: 60 #任务执行超时时间
pocTime: 30 #一次poc执行超时时间,0不进行超时判断
nmapTime: 10 #一次nmap执行超时时间,0不进行超时判断
#日志记录
file_log_level: INFO #是否记录日志
show_log_level: DEBUG #日志记录级别
log_dir: logs
#远程数据库
mysql:
host: 192.168.2.54
port: 3306
user: root
pass: crnn@cz***
db: sfind

4
logs/2024-05-25.log

@ -0,0 +1,4 @@
2024-05-25_09-59-06-INFO-main:info
2024-05-25_10:00:46-INFO-main:info
2024-05-25_10:17:32-main-INFO:info
2024-05-25_16:16:27-main-INFO:info

4
logs/app.log

@ -0,0 +1,4 @@
2024-05-25T09:33:17.757522+0800-INFO-main:111
2024-05-25T09:41:26.638770+0800-INFO-main:info
2024-05-25T09:44:17.514570+0800-INFO-main:info
2024-05-25T09:45:10.481132+0800-INFO-main:info

13
main.py

@ -0,0 +1,13 @@
from util.ConfigManager import myCongif
from util.MyLogger_logger import LogHandler
from web import create_app
app = create_app()
if __name__ == '__main__':
# logger = LogHandler().get_logger("main")
# logger.debug("debug")
# logger.info("info")
app.run(debug=True)

204
model/ModelManager.py

@ -0,0 +1,204 @@
import torch
import cv2
import numpy as np
import torch
import os
import importlib
from model.plugins.ModelBase import ModelBase
from loguru import logger
'''
class ModelManager_tmp():
def __init__(self):
print("ModelInit")
def __del__(self):
print("ModelManager DEL")
def __preprocess_image(self,image, cfg, bgr2rgb=True):
"""图片预处理"""
img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape'])
if bgr2rgb:
img = img[:, :, ::-1]
img = img.transpose(2, 0, 1) # HWC2CHW
img = np.ascontiguousarray(img, dtype=np.float32)
return img, scale_ratio, pad_size
def __draw_bbox(self,bbox, img0, color, wt, names):
"""在图片上画预测框"""
det_result_str = ''
for idx, class_id in enumerate(bbox[:, 5]):
if float(bbox[idx][4] < float(0.05)):
continue
img0 = cv2.rectangle(img0, (int(bbox[idx][0]), int(bbox[idx][1])), (int(bbox[idx][2]), int(bbox[idx][3])),
color, wt)
img0 = cv2.putText(img0, str(idx) + ' ' + names[int(class_id)], (int(bbox[idx][0]), int(bbox[idx][1] + 16)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
img0 = cv2.putText(img0, '{:.4f}'.format(bbox[idx][4]), (int(bbox[idx][0]), int(bbox[idx][1] + 32)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
det_result_str += '{} {} {} {} {} {}\n'.format(
names[bbox[idx][5]], str(bbox[idx][4]), bbox[idx][0], bbox[idx][1], bbox[idx][2], bbox[idx][3])
return img0
def __get_labels_from_txt(self,path):
"""从txt文件获取图片标签"""
labels_dict = dict()
with open(path) as f:
for cat_id, label in enumerate(f.readlines()):
labels_dict[cat_id] = label.strip()
return labels_dict
def __draw_prediction(self,pred, image, labels):
"""在图片上画出预测框并进行可视化展示"""
imgbox = widgets.Image(format='jpg', height=720, width=1280)
img_dw = self.__draw_bbox(pred, image, (0, 255, 0), 2, labels)
imgbox.value = cv2.imencode('.jpg', img_dw)[1].tobytes()
display(imgbox)
def __infer_image(self,img_path, model, class_names, cfg):
"""图片推理"""
# 图片载入
image = cv2.imread(img_path)
# 数据预处理
img, scale_ratio, pad_size = self.__preprocess_image(image, cfg)
# 模型推理
output = model.infer([img])[0]
output = torch.tensor(output)
# 非极大值抑制后处理
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
pred_all = boxout[0].numpy()
# 预测坐标转换
scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))
# 图片预测结果可视化
self.__draw_prediction(pred_all, image, class_names)
def __infer_frame_with_vis(self,image, model, labels_dict, cfg, bgr2rgb=True):
# 数据预处理
img, scale_ratio, pad_size = self.__preprocess_image(image, cfg, bgr2rgb)
# 模型推理
output = model.infer([img])[0]
output = torch.tensor(output)
# 非极大值抑制后处理
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
pred_all = boxout[0].numpy()
# 预测坐标转换
scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))
# 图片预测结果可视化
img_vis = self.__draw_bbox(pred_all, image, (0, 255, 0), 2, labels_dict)
return img_vis
def __img2bytes(self,image):
"""将图片转换为字节码"""
return bytes(cv2.imencode('.jpg', image)[1])
def __infer_camera(self,model, labels_dict, cfg):
"""外设摄像头实时推理"""
def find_camera_index():
max_index_to_check = 10 # Maximum index to check for camera
for index in range(max_index_to_check):
cap = cv2.VideoCapture(index)
if cap.read()[0]:
cap.release()
return index
# If no camera is found
raise ValueError("No camera found.")
# 获取摄像头 --这里可以换成RTSP流
camera_index = find_camera_index()
cap = cv2.VideoCapture(camera_index)
# 初始化可视化对象
image_widget = widgets.Image(format='jpeg', width=1280, height=720)
display(image_widget)
while True:
# 对摄像头每一帧进行推理和可视化
_, img_frame = cap.read()
image_pred = self.__infer_frame_with_vis(img_frame, model, labels_dict, cfg)
image_widget.value = self.__img2bytes(image_pred)
def __infer_video(self,video_path, model, labels_dict, cfg):
"""视频推理"""
image_widget = widgets.Image(format='jpeg', width=800, height=600)
display(image_widget)
# 读入视频
cap = cv2.VideoCapture(video_path)
while True:
ret, img_frame = cap.read()
if not ret:
break
# 对视频帧进行推理
image_pred = self.__infer_frame_with_vis(img_frame, model, labels_dict, cfg, bgr2rgb=True)
image_widget.value = self.__img2bytes(image_pred)
def startWork(self,infer_mode,file_paht = ""):
cfg = {
'conf_thres': 0.4, # 模型置信度阈值,阈值越低,得到的预测框越多
'iou_thres': 0.5, # IOU阈值,高于这个阈值的重叠预测框会被过滤掉
'input_shape': [640, 640], # 模型输入尺寸
}
model_path = 'yolo.om'
label_path = './coco_names.txt'
# 初始化推理模型
model = InferSession(0, model_path)
labels_dict = self.__get_labels_from_txt(label_path)
#执行验证
if infer_mode == 'image':
img_path = 'world_cup.jpg'
self.__infer_image(img_path, model, labels_dict, cfg)
elif infer_mode == 'camera':
self.__infer_camera(model, labels_dict, cfg)
elif infer_mode == 'video':
video_path = 'racing.mp4'
self.__infer_video(video_path, model, labels_dict, cfg)
'''
'''
算法实现类实现算法执行线程根据配内容以线程方式执行算法模块
'''
class ModelManager():
def __init__(self):
print("ModelManager init")
def __del__(self):
print("ModelManager del")
def doWork(self):
pass
#动态导入文件 -- 方法二 -- 相对推荐使用该方法 但spec感觉没什么用
def import_source(spec, plgpath):
module = None
if os.path.exists(plgpath):
module_spec = importlib.util.spec_from_file_location(spec, plgpath)
module = importlib.util.module_from_spec(module_spec)
module_spec.loader.exec_module(module)
else:
logger.error("{}文件不存在".format(plgpath))
return module
#plgpath 为list [poc][file_name][name]
def run_plugin(plgpath, target,copy_flag=True):
module = import_source("", plgpath)
if module:
classname = "Model"
plg = getattr(module, classname)()
if not isinstance(plg, ModelBase):
raise Exception("{} not rx_Model".format(plg))
new_plg = plg
result = new_plg.doWork("","","","") # 执行plugin基类的run, 返回结果
return result
else:
print("模型加载失败")
return None
def test():
run_plugin("plugins/RYRQ_Model.py","")
if __name__ == "__main__":
test()

9
model/plugins/AQM_Model.py

@ -0,0 +1,9 @@
from model.plugins.ModelBase import ModelBase
class Model(ModelBase):
def __init__(self):
super().__init__()
pass
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True):
print("AQM_Model")

17
model/plugins/ModelBase.py

@ -0,0 +1,17 @@
from abc import abstractmethod
class ModelBase(object):
def __init__(self):
pass
def __del__(self):
pass
'''
模型处理的标准接口
1.输入标准化
2.输出标准化
'''
@abstractmethod
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True):
pass

5
model/plugins/RYRQ_Model.py

@ -0,0 +1,5 @@
from model.plugins.ModelBase import ModelBase
class Model(ModelBase):
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True):
print("RYRQ_Model")

BIN
model/plugins/__pycache__/AQM_Model.cpython-312.pyc

Binary file not shown.

BIN
model/plugins/__pycache__/ModelBase.cpython-312.pyc

Binary file not shown.

BIN
model/plugins/__pycache__/RYRQ_Model.cpython-312.pyc

Binary file not shown.

54
util/ConfigManager.py

@ -0,0 +1,54 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ZL'
import yaml,os
class ConfigManager():
def __init__(self,congif_path='config.yaml'):
self.ok = False
if os.path.exists(congif_path):
self.file_path = congif_path
self.data = self.read_yaml()
self.ok = True
else:
congif_path = "../" + congif_path
if os.path.exists(congif_path):
self.file_path = congif_path
self.data = self.read_yaml()
self.ok = True
else:
raise Exception('没有找到%s文件路径'%congif_path)
print("ConfigManager实例化")
def __del__(self):
print("ConfigManager销毁")
#已调整方案--配置文件的初始化工作放到构造函数中处理。
def my_init(self,file_path):
if os.path.exists(file_path):
self.file_path = file_path
self.data = self.read_yaml()
self.ok = True
else:
raise Exception('没有找到%s文件路径'%file_path)
def read_yaml(self):
with open(self.file_path,'r',encoding='utf_8') as f:
p = f.read()
return p
def get_data(self,pwd=None):
if self.ok:
result = yaml.load(self.data,Loader=yaml.FullLoader)
if pwd == None:
return result
else:
return result.get(pwd)
#这种方法实现的单例优点是简单,但不能动态创建实例,程序加载时就已实例化。
myCongif = ConfigManager()
if __name__ == '__main__':
r = myCongif.get_data('url')
print(r)

73
util/MyLogger_logger.py

@ -0,0 +1,73 @@
from loguru import logger
import os
from functools import wraps
from util.ConfigManager import myCongif
'''
@logger.catch() 异常捕获注解
----
TRACE 5
DEBUG 10
INFO 20
SUCCESS 25
WARNING 30
ERROR 40
CRITICAL 50
----
'''
#singleton--使用装饰器来保障单一实例的好处是能够动态加载,但线程不安全
def singleton(cls):
instances = {}
@wraps(cls)
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class LogHandler():
def __init__(self, log_dir=myCongif.get_data('log_dir')):
# 确保日志目录存在
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 清除所有以前的处理器
logger.remove()
# 配置控制台输出
logger.add(lambda msg: print(msg, end=""),
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}",
level=myCongif.get_data('show_log_level'))
# 配置文件输出
logger.add("logs/{time:YYYY-MM-DD}.log", rotation="00:00", retention="90 days",
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}",
level=myCongif.get_data('file_log_level'))
def get_logger(self, caller):
# 返回一个带有调用者信息的logger
return logger.bind(caller=caller)
# 示例类A
class ClassA:
def __init__(self):
self.logger = LogHandler().get_logger("ClassA")
def do_something(self):
self.logger.warning("ClassA is doing something.")
# 示例类B
class ClassB:
def __init__(self):
self.logger = LogHandler().get_logger("ClassB")
def do_something(self):
self.logger.error("ClassB is doing something.")
if __name__ == "__main__":
a = ClassA()
b = ClassB()
r = myCongif.get_data('url')
print(r)
a.do_something()
b.do_something()

42
util/MyLogger_logging.py

@ -0,0 +1,42 @@
import logging
'''
日志记录方案暂时使用logger来实现--2024-5-25-zl
'''
class MyLogger:
_loggers = {}
def __new__(cls, name='my_logger', level=logging.DEBUG):
if name not in cls._loggers:
cls._loggers[name] = super().__new__(cls)
return cls._loggers[name]
def __init__(self, name='my_logger', level=logging.DEBUG): #logging.INFO
if not hasattr(self,'logger'):
self.logger = logging.getLogger(name)
self.logger.setLevel(level)
# 创建一个handler,用于写入日志文件
file_handler = logging.FileHandler('../log/my_app.log')
file_handler.setLevel(logging.info)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
self.logger.addHandler(console_handler)
def info(self, message):
self.logger.info(message)
def error(self, message):
self.logger.error(message)
def warning(self, message):
self.logger.warning(message)
def debug(self, message):
self.logger.debug(message)
# 使用示例
if __name__ == "__main__":
logger = MyLogger()
logger.info("This is an info message")
logger.error("This is an error message")

BIN
util/__pycache__/ConfigManager.cpython-312.pyc

Binary file not shown.

BIN
util/__pycache__/MyLogger_logger.cpython-312.pyc

Binary file not shown.

BIN
util/__pycache__/MyLogger_logging.cpython-312.pyc

Binary file not shown.

2
util/logs/2024-05-25.log

@ -0,0 +1,2 @@
2024-05-25_10:00:34-WARNING-ClassA:ClassA is doing something.
2024-05-25_10:00:34-ERROR-ClassB:ClassB is doing something.

16
util/logs/app.log

@ -0,0 +1,16 @@
2024-05-24T17:33:38.578964+0800 INFO ClassA is doing something. ClassA
2024-05-24T17:33:38.578964+0800 INFO ClassB is doing something. ClassB
2024-05-24T17:46:27.219835+0800 INFO ClassA is doing something. ClassA
2024-05-24T17:46:27.220833+0800 INFO ClassB is doing something. ClassB
2024-05-24T17:47:54.316369+0800 WARNING ClassA is doing something. ClassA
2024-05-24T17:47:54.316369+0800 ERROR ClassB is doing something. ClassB
2024-05-24T18:09:02.525386+0800 WARNING ClassA is doing something. ClassA
2024-05-24T18:09:02.525386+0800 ERROR ClassB is doing something. ClassB
2024-05-24T18:10:02.546333+0800-WARNING-ClassA:ClassA is doing something.
2024-05-24T18:10:02.547467+0800-ERROR-ClassB:ClassB is doing something.
2024-05-25T09:13:06.400538+0800-WARNING-ClassA:ClassA is doing something.
2024-05-25T09:13:06.400538+0800-ERROR-ClassB:ClassB is doing something.
2024-05-25T09:27:15.187474+0800-WARNING-ClassA:ClassA is doing something.
2024-05-25T09:27:15.187474+0800-ERROR-ClassB:ClassB is doing something.
2024-05-25T09:33:41.352180+0800-WARNING-ClassA:ClassA is doing something.
2024-05-25T09:33:41.353189+0800-ERROR-ClassB:ClassB is doing something.

213
web/__init__.py

@ -0,0 +1,213 @@
import os
import sqlite3
import cv2
import asyncio
import av
from aiohttp import web
from quart import Quart, render_template, request, jsonify,send_from_directory
from aiortc import RTCPeerConnection, RTCSessionDescription, VideoStreamTrack, RTCConfiguration, RTCIceServer
from fractions import Fraction
from .main import main as main_blueprint
#app.config['SECRET_KEY'] = 'mysecret' #密钥 --需要放配置文件
#socketio = SocketIO(app)
'''
************************
功能函数
'''
rtsp_url = 'rtsp://127.0.0.1/live1'
#-------------------基于WEBRTC实现拉流
pcs = set() #创建一个空的集合,去重复且无序
def create_app():
app = Quart(__name__)
# 注册蓝图
app.register_blueprint(main_blueprint)
return app
class VideoTransformTrack(VideoStreamTrack):
kind = "video"
def __init__(self):
super().__init__()
self.cap = cv2.VideoCapture('rtsp://127.0.0.1/live1')
if not self.cap.isOpened():
raise Exception("Unable to open video source")
# Set desired resolution and frame rate
# self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # Set width to 1280
# self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # Set height to 720
# self.cap.set(cv2.CAP_PROP_FPS, 30) # Set frame rate to 30 FPS
self.frame_rate = int(self.cap.get(cv2.CAP_PROP_FPS)) or 30 # Default to 30 if unable to get FPS
self.time_base = Fraction(1, self.frame_rate)
async def recv(self):
ret, frame = self.cap.read()
if not ret:
raise Exception("Unable to read frame")
# Convert frame to RGB
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Convert to VideoFrame
video_frame = av.VideoFrame.from_ndarray(frame_rgb, format="rgb24")
# Set timestamp
video_frame.pts = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
video_frame.time_base = self.time_base
return video_frame
'''
************************
页面路由
'''
@app.route('/')
async def index():
#return await render_template('登录.html')
return await render_template('登录.html')
@app.route('/favicon.ico')
async def favicon():
return await send_from_directory('static', 'favicon.ico')
@app.route('/<html>')
async def get_html(html):
return await render_template(html)
#--------------------webrtc-----------------
async def server(pc, offer):
# 监听 RTC 连接状态
@pc.on("connectionstatechange")
async def on_connectionstatechange():
print("Connection state is %s" % pc.connectionState)
# 当 RTC 连接中断后将连接关闭
if pc.connectionState == "failed":
await pc.close()
pcs.discard(pc)
# 监听客户端发来的视频流
@pc.on("track")
def on_track(track):
print("======= received track: ", track)
if track.kind == "video":
# # 对视频流进行人脸替换
# t = FaceSwapper(track)
# 绑定替换后的视频流
pc.addTrack(track)
# 记录客户端 SDP
await pc.setRemoteDescription(offer)
# 生成本地 SDP
answer = await pc.createAnswer()
# 记录本地 SDP
await pc.setLocalDescription(answer)
@app.route('/offer', methods=['POST'])
async def offer():
#接收客户端的连接请求
params = await request.json
#params = await request.json()
print(params)
#提取客户端发来的SDP,生成服务器端的SDP
offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"])
# Configure ICE servers if necessary
#config = RTCConfiguration([RTCIceServer(urls=['stun:stun.voiparound.com'])])
pc = RTCPeerConnection() #实例化一个rtcp对象
pcs.add(pc) #集合中添加一个对象,若已存在则不添加
print(pc)
@pc.on("datachannel")
def on_datachannel(channel):
@channel.on("message")
def on_message(message):
if isinstance(message, str) and message.startswith("ping"):
channel.send("pong" + message[4:])
#监听RTC连接状态
@pc.on("iconnectionstatechange") #当ice连接状态发生变化时
async def iconnectionstatechange():
if pc.iceConnectionState == "failed":
await pc.close()
pcs.discard(pc) #移除对象
# 添加视频轨道
video_track = VideoTransformTrack()
pc.addTrack(video_track)
print("完成视频轨道的添加")
# 记录客户端 SDP
await pc.setRemoteDescription(offer)
# 生成本地 SDP
answer = await pc.createAnswer()
# 记录本地 SDP
await pc.setLocalDescription(answer)
return jsonify({
"sdp": pc.localDescription.sdp,
"type": pc.localDescription.type
})
@app.route('/shutdown', methods=['POST'])
async def shutdown():
coros = [pc.close() for pc in pcs]
await asyncio.gather(*coros)
pcs.clear()
return 'Server shutting down...'
'''3333
各种配置文件路由
'''
@app.route('/data/<file>')
async def data(file):
return await send_from_directory('static/data',file)
@app.route('/files/<path:subdir>/<file>')
async def files(subdir,file):
return await send_from_directory(os.path.join('static/files', subdir),file)
@app.route('/images/<path:subdir>/<file>')
async def images(subdir,file):
return await send_from_directory(os.path.join('static/images', subdir),file)
@app.route('/resources/<file>')
async def resources(file):
return await send_from_directory('static/resources',file)
@app.route('/resources/<path:subdir>/<file>')
async def resources_dir(subdir,file):
return await send_from_directory(os.path.join('static/resources', subdir),file)
@app.route('/resources/css/<path:subdir>/<file>')
async def resources_css_dir(subdir,file):
return await send_from_directory(os.path.join('static/resources/css', subdir),file)
@app.route('/resources/scripts/<path:subdir>/<file>')
async def resources_scripts_dir(subdir,file):
return await send_from_directory(os.path.join('static/resources/scripts', subdir),file)
'''
后端数据接口
'''
@app.route('/submit', methods=['POST'])
def submit():
if request.method == 'POST':
suggestion = request.form['suggestion']
file = request.files['attachment']
if file:
filename = file.filename
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# 将意见和附件的文件名保存到数据库
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
cursor.execute('INSERT INTO suggestions (suggestion, attachment_filename) VALUES (?, ?)',
(suggestion, filename))
conn.commit()
conn.close()
return "Thanks for your suggestion and attachment! Data saved to the database."
# 如果没有附件上传的逻辑处理
return "Data saved!"
if __name__ == '__main__':
#app.run(debug=True)
app.run(debug=True, host='0.0.0.0', port=5000)

BIN
web/__pycache__/__init__.cpython-312.pyc

Binary file not shown.

5
web/main/__init__.py

@ -0,0 +1,5 @@
from quart import Blueprint
main = Blueprint('main', __name__)
from . import routes

BIN
web/main/__pycache__/__init__.cpython-312.pyc

Binary file not shown.

BIN
web/main/__pycache__/routes.cpython-312.pyc

Binary file not shown.

10
web/main/routes.py

@ -0,0 +1,10 @@
from quart import render_template
from . import main
@main.route('/')
async def index():
return await render_template('index.html')
@main.route('/about')
async def about():
return await render_template('about.html')

7
web/static/data/document.js

@ -0,0 +1,7 @@
$axure.loadDocument(
(function() {
var _ = function() { var r={},a=arguments; for(var i=0; i<a.length; i+=2) r[a[i]]=a[i+1]; return r; }
var _creator = function() { return _(b,_(c,d,e,f,g,d,h,d,i,d,j,k,l,d,m,f,n,f,o,d,p,f),q,_(r,[_(s,t,u,v,w,x,y,z),_(s,A,u,B,w,x,y,C),_(s,D,u,E,w,x,y,F),_(s,G,u,H,w,x,y,I),_(s,J,u,K,w,x,y,L),_(s,M,u,N,w,x,y,O)]),P,[Q,R,S],T,[U,V,W],X,_(Y,Z),ba,_(bb,_(s,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,_(bm,bn,bo,bp,bq,br),bs,bt,bu,f,bv,bw,bx,bi,by,bi,bz,bA,bB,f,bC,_(bD,bE,bF,bE),bG,_(bH,bE,bI,bE),bJ,d,bK,f,bL,bc,bM,_(bm,bn,bo,bN),bO,_(bm,bn,bo,bP),bQ,bR,bS,bn,bq,bR,bT,bU,bV,bW,bX,bY,bZ,ca,cb,ca,cc,ca,cd,ca,ce,_(),cf,null,cg,null,ch,bU,ci,_(cj,f,ck,cl,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cv,_(cj,f,ck,bE,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cw,_(cj,f,ck,br,cm,br,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cx)),cy,cz),cA,_(cB,_(s,cC),cD,_(s,cE),cf,_(s,cF,bQ,bU),cG,_(s,cH,bT,bk),cI,_(s,cJ,bl,_(bm,bn,bo,bN,bq,br),bQ,bU,bT,bk,bM,_(bm,bn,bo,cK)),cL,_(s,cM,bs,cN,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cS,_(s,cT,bs,cU,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cV,_(s,cW,bs,cX,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cY,_(s,cZ,bs,da,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),db,_(s,dc,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dd,_(s,de,bs,df,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dg,_(s,dh,bs,da,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),di,_(s,dj,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dk,_(s,dl,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,bY),dn,_(s,dp,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),dq,_(s,dr,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),ds,_(s,dt,bv,cQ,bX,cR),du,_(s,dv,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,bY),dw,_(s,dx),dy,_(s,dz,bM,_(bm,bn,bo,cP)),dA,_(s,dB,bl,_(bm,bn,bo,dC,bq,br)),dD,_(s,dE,bM,_(bm,bn,bo,dF)),dG,_(s,dH,bM,_(bm,bn,bo,bN)),dI,_(s,dJ,bQ,bU,bM,_(bm,bn,bo,bp)),dK,_(s,dL)),dM,_(dN,cE,dO,cW,dP,dh)));};
var b="configuration",c="showPageNotes",d=true,e="showPageNoteNames",f=false,g="showAnnotations",h="showAnnotationsSidebar",i="showConsole",j="linkStyle",k="displayMultipleTargetsOnly",l="linkFlowsToPages",m="linkFlowsToPagesNewWindow",n="useLabels",o="useViews",p="loadFeedbackPlugin",q="sitemap",r="rootNodes",s="id",t="f8hzm0",u="pageName",v="登录",w="type",x="Wireframe",y="url",z="登录.html",A="tm5q63",B="实时预览",C="实时预览.html",D="20xynf",E="通道管理",F="通道管理.html",G="ey1jts",H="算法管理",I="算法管理.html",J="idexti",K="系统管理",L="系统管理.html",M="su6kdn",N="用户管理",O="用户管理.html",P="additionalJs",Q="plugins/sitemap/sitemap.js",R="plugins/page_notes/page_notes.js",S="plugins/debug/debug.js",T="additionalCss",U="plugins/sitemap/styles/sitemap.css",V="plugins/page_notes/styles/page_notes.css",W="plugins/debug/styles/debug.css",X="globalVariables",Y="onloadvariable",Z="",ba="stylesheet",bb="defaultStyle",bc="627587b6038d43cca051c114ac41ad32",bd="fontName",be="'Arial Normal', 'Arial', sans-serif",bf="fontWeight",bg="400",bh="fontStyle",bi="normal",bj="fontStretch",bk="5",bl="foreGroundFill",bm="fillType",bn="solid",bo="color",bp=0xFF333333,bq="opacity",br=1,bs="fontSize",bt="13px",bu="underline",bv="horizontalAlignment",bw="center",bx="lineSpacing",by="characterSpacing",bz="letterCase",bA="none",bB="strikethrough",bC="location",bD="x",bE=0,bF="y",bG="size",bH="width",bI="height",bJ="visible",bK="limbo",bL="baseStyle",bM="fill",bN=0xFFFFFFFF,bO="borderFill",bP=0xFF797979,bQ="borderWidth",bR="1",bS="linePattern",bT="cornerRadius",bU="0",bV="borderVisibility",bW="all",bX="verticalAlignment",bY="middle",bZ="paddingLeft",ca="2",cb="paddingTop",cc="paddingRight",cd="paddingBottom",ce="stateStyles",cf="image",cg="imageFilter",ch="rotation",ci="outerShadow",cj="on",ck="offsetX",cl=5,cm="offsetY",cn="blurRadius",co="spread",cp="r",cq=0,cr="g",cs="b",ct="a",cu=0.349019607843137,cv="innerShadow",cw="textShadow",cx=0.647058823529412,cy="viewOverride",cz="19e82109f102476f933582835c373474",cA="customStyles",cB="box_1",cC="4b7bfc596114427989e10bb0b557d0ce",cD="shape",cE="40519e9ec4264601bfb12c514e4f4867",cF="75a91ee5b9d042cfa01b8d565fe289c0",cG="button",cH="c9f35713a1cf4e91a0f2dbac65e6fb5c",cI="primary_button",cJ="cd64754845384de3872fb4a066432c1f",cK=0xFF169BD5,cL="heading_1",cM="1111111151944dfba49f67fd55eb1f88",cN="32px",cO="bold",cP=0xFFFFFF,cQ="left",cR="top",cS="heading_2",cT="b3a15c9ddde04520be40f94c8168891e",cU="24px",cV="heading_3",cW="8c7a4c5ad69a4369a5f7788171ac0b32",cX="18px",cY="heading_4",cZ="e995c891077945c89c0b5fe110d15a0b",da="14px",db="heading_5",dc="386b19ef4be143bd9b6c392ded969f89",dd="heading_6",de="fc3b9a13b5574fa098ef0a1db9aac861",df="10px",dg="label",dh="2285372321d148ec80932747449c36c9",di="paragraph",dj="4988d43d80b44008a4a415096f1632af",dk="text_field",dl="44157808f2934100b68f2394a66b2bba",dm=0xFF000000,dn="droplist",dp="85f724022aae41c594175ddac9c289eb",dq="list_box",dr="d5a74867db1f49ceb7c59e94129aa67a",ds="radio_button",dt="4eb5516f311c4bdfa0cb11d7ea75084e",du="tree_node",dv="93a4c3353b6f4562af635b7116d6bf94",dw="table_cell",dx="33ea2511485c479dbf973af3302f2352",dy="menu_item",dz="2036b2baccbc41f0b9263a6981a11a42",dA="form_hint",dB="4889d666e8ad4c5e81e59863039a5cc0",dC=0xFF999999,dD="form_disabled",dE="9bd0236217a94d89b0314c8c7fc75f16",dF=0xFFF0F0F0,dG="flow_shape",dH="caddf88798f04a469d3bb16589ed2a5d",dI="icon",dJ="26c731cb771b44a88eb8b6e97e78c80e",dK="ellipse",dL="78a26aa073ac4ed2b3c192ce4be8b862",dM="duplicateStyles",dN="55037c00beca4ab981fb8ff744aa5f75",dO="aa017f6a23d447e8a77c4c2eea3d335c",dP="4eea517f5eec41269a0db429802a7adf";
return _creator();
})());

105
web/static/data/styles.css

@ -0,0 +1,105 @@
.ax_default {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#333333;
vertical-align:none;
text-align:center;
line-height:normal;
text-transform:none;
}
.box_1 {
}
.shape {
}
.image {
}
.button {
}
.primary_button {
color:#FFFFFF;
}
.heading_1 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
font-size:32px;
text-align:left;
}
.heading_2 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
font-size:24px;
text-align:left;
}
.heading_3 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
font-size:18px;
text-align:left;
}
.heading_4 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
font-size:14px;
text-align:left;
}
.heading_5 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
text-align:left;
}
.heading_6 {
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:bold;
font-style:normal;
font-size:10px;
text-align:left;
}
.label {
font-size:14px;
text-align:left;
}
.paragraph {
text-align:left;
}
.text_field {
color:#000000;
text-align:left;
}
.droplist {
color:#000000;
text-align:left;
}
.list_box {
color:#000000;
text-align:left;
}
.radio_button {
text-align:left;
}
.tree_node {
text-align:left;
}
.table_cell {
}
.menu_item {
}
.form_hint {
color:#999999;
}
.form_disabled {
}
.flow_shape {
}
.icon {
}
.ellipse {
}
textarea, select, input, button { outline: none; }

BIN
web/static/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

7
web/static/files/实时预览/data.js

File diff suppressed because one or more lines are too long

1397
web/static/files/实时预览/styles.css

File diff suppressed because it is too large

7
web/static/files/用户管理/data.js

File diff suppressed because one or more lines are too long

4032
web/static/files/用户管理/styles.css

File diff suppressed because it is too large

7
web/static/files/登录/data.js

@ -0,0 +1,7 @@
$axure.loadCurrentPage(
(function() {
var _ = function() { var r={},a=arguments; for(var i=0; i<a.length; i+=2) r[a[i]]=a[i+1]; return r; }
var _creator = function() { return _(b,c,d,e,f,_(g,h,i,_(j,k,l,k)),m,[],n,_(h,o),p,[q],r,_(s,t,u,v,g,w,x,_(),y,[],z,_(A,B,C,D,E,_(F,G,H,I),J,null,K,L,L,M,N,O,null,P,Q,R,S,T,U,V,Q,W,X,Y,_(F,G,H,Z),ba,Q,bb,X,bc,_(bd,be,bf,bg,bh,bg,bi,bg,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,bp)),i,_(j,k,l,k)),bq,_(),br,_(),bs,_(bt,[_(bu,bv,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,bD,l,bE),A,bF),bq,_(),bG,_(),bH,be),_(bu,bI,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,bD,l,bJ),A,bF,E,_(F,G,H,bK),Y,_(F,G,H,bL)),bq,_(),bG,_(),bH,be),_(bu,bM,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,bP,l,bQ),A,bR,bS,_(bT,bU,bV,bW),bX,bY),bq,_(),bG,_(),bH,be),_(bu,bZ,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,ca,l,cb),A,cc,bS,_(bT,cd,bV,ce)),bq,_(),bG,_(),bH,be),_(bu,cf,bw,h,bx,cg,u,bz,bA,bz,bB,bC,z,_(A,ch,V,Q,i,_(j,ci,l,cj),E,_(F,G,H,ck),Y,_(F,G,H,cl),bc,_(bd,be,bf,k,bh,k,bi,cm,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,cn)),co,_(bd,be,bf,k,bh,k,bi,cm,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,cn)),bS,_(bT,cp,bV,cq)),bq,_(),bG,_(),cr,_(cs,ct),bH,be),_(bu,cu,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cv,l,cq),A,cw,bS,_(bT,cx,bV,cy)),bq,_(),bG,_(),bH,be),_(bu,cz,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cC,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cL)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cO,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cP,l,cq),A,cw,bS,_(bT,cQ,bV,cR)),bq,_(),bG,_(),bH,be),_(bu,cS,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cC,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cT)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cU,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cV,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cW)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cX,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cv,l,cq),A,cw,bS,_(bT,cx,bV,cY)),bq,_(),bG,_(),bH,be),_(bu,cZ,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,da,l,cj),A,db,bS,_(bT,cx,bV,dc),bX,dd),bq,_(),bG,_(),br,_(de,_(df,dg,dh,di,dj,[_(dh,h,dk,h,dl,be,dm,dn,dp,[_(dq,dr,dh,ds,dt,du,dv,_(dw,_(h,ds)),dx,_(dy,r,b,dz,dA,bC),dB,dC)])])),dD,bC,bH,be),_(bu,dE,bw,h,bx,dF,u,dG,bA,dG,bB,bC,z,_(i,_(j,da,l,dH),A,dI,J,null,bS,_(bT,dJ,bV,dK)),bq,_(),bG,_(),cr,_(cs,dL)),_(bu,dM,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,da,l,cj),A,dN,bS,_(bT,dJ,bV,dc),bX,dd),bq,_(),bG,_(),bH,be),_(bu,dO,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(dP,_(F,G,H,dQ,dR,dS),i,_(j,dT,l,dU),A,dV,bS,_(bT,dW,bV,dX)),bq,_(),bG,_(),bH,be)])),dY,_(),dZ,_(ea,_(eb,ec),ed,_(eb,ee),ef,_(eb,eg),eh,_(eb,ei),ej,_(eb,ek),el,_(eb,em),en,_(eb,eo),ep,_(eb,eq),er,_(eb,es),et,_(eb,eu),ev,_(eb,ew),ex,_(eb,ey),ez,_(eb,eA),eB,_(eb,eC),eD,_(eb,eE)));};
var b="url",c="登录.html",d="generationDate",e=new Date(1716520879185.01),f="defaultAdaptiveView",g="name",h="",i="size",j="width",k=0,l="height",m="adaptiveViews",n="sketchKeys",o="s0",p="variables",q="OnLoadVariable",r="page",s="packageId",t="7ecba5060add4e8c88625127aa952ee2",u="type",v="Axure:Page",w="登录",x="notes",y="annotations",z="style",A="baseStyle",B="627587b6038d43cca051c114ac41ad32",C="pageAlignment",D="center",E="fill",F="fillType",G="solid",H="color",I=0xFFFFFFFF,J="image",K="imageAlignment",L="near",M="imageRepeat",N="auto",O="favicon",P="sketchFactor",Q="0",R="colorStyle",S="appliedColor",T="fontName",U="Applied Font",V="borderWidth",W="borderVisibility",X="all",Y="borderFill",Z=0xFF797979,ba="cornerRadius",bb="cornerVisibility",bc="outerShadow",bd="on",be=false,bf="offsetX",bg=5,bh="offsetY",bi="blurRadius",bj="spread",bk="r",bl=0,bm="g",bn="b",bo="a",bp=0.349019607843137,bq="adaptiveStyles",br="interactionMap",bs="diagram",bt="objects",bu="id",bv="c5bc1d2efee44f68879fd659e38e9747",bw="label",bx="friendlyType",by="Rectangle",bz="vectorShape",bA="styleType",bB="visible",bC=true,bD=1280,bE=800,bF="caddf88798f04a469d3bb16589ed2a5d",bG="imageOverrides",bH="generateCompound",bI="2c24030b551d41378f944055f4a44c64",bJ=90,bK=0xFF02A7F0,bL=0xFF81D3F8,bM="fad482ab9b5c46c1952d5aad4ea0a508",bN="fontWeight",bO="700",bP=254,bQ=45,bR="1111111151944dfba49f67fd55eb1f88",bS="location",bT="x",bU=61,bV="y",bW=23,bX="fontSize",bY="40px",bZ="bb91b2fe6e994c93abaa1907c4f474e4",ca=289,cb=21,cc="8c7a4c5ad69a4369a5f7788171ac0b32",cd=496,ce=750,cf="fd8428de1c954a7fb54cb8b737fa8cb8",cg="Shape",ch="26c731cb771b44a88eb8b6e97e78c80e",ci=35,cj=40,ck=0xFF000000,cl=0xFFFFFF,cm=10,cn=0.313725490196078,co="innerShadow",cp=1165,cq=28,cr="images",cs="normal~",ct="images/登录/u4.svg",cu="81dff38c4abb4c299d032505ce1bd3b8",cv=96,cw="b3a15c9ddde04520be40f94c8168891e",cx=427,cy=265,cz="214f4eb955814b23864a6056e1b34ac4",cA="Text Field",cB="textBox",cC=300,cD=25,cE="stateStyles",cF="hint",cG="4889d666e8ad4c5e81e59863039a5cc0",cH="disabled",cI="9bd0236217a94d89b0314c8c7fc75f16",cJ="44157808f2934100b68f2394a66b2bba",cK=553,cL=266,cM="HideHintOnFocused",cN="placeholderText",cO="c1e2c2c547d34189a097fc5a573d1e84",cP=72,cQ=451,cR=343,cS="79ffc447be8549799643c1ef0b212546",cT=345,cU="ddb9300483dd4254bdfbb4ca5ff5723c",cV=136,cW=423,cX="c309227fa1ce48a0b2b15877b05adacb",cY=421,cZ="c17788f3902d49daa20fbbe38be1daa4",da=140,db="cd64754845384de3872fb4a066432c1f",dc=521,dd="18px",de="onClick",df="eventType",dg="OnClick",dh="description",di="Click or Tap",dj="cases",dk="conditionString",dl="isNewIfGroup",dm="caseColorHex",dn="AB68FF",dp="actions",dq="action",dr="linkWindow",ds="Open 实时预览 in Current Window",dt="displayName",du="Open Link",dv="actionInfoDescriptions",dw="实时预览",dx="target",dy="targetType",dz="实时预览.html",dA="includeVariables",dB="linkType",dC="current",dD="tabbable",dE="476ed508a0e641c3821a489ba050926d",dF="Image",dG="imageBox",dH=47,dI="75a91ee5b9d042cfa01b8d565fe289c0",dJ=713,dK=412,dL="images/登录/u12.png",dM="24c27214a4004ee3becff6c24ff7cfe3",dN="c9f35713a1cf4e91a0f2dbac65e6fb5c",dO="70009ea6695547be8b66debf61616908",dP="foreGroundFill",dQ=0xFFD9001B,dR="opacity",dS=1,dT=196,dU=16,dV="2285372321d148ec80932747449c36c9",dW=657,dX=581,dY="masters",dZ="objectPaths",ea="c5bc1d2efee44f68879fd659e38e9747",eb="scriptId",ec="u0",ed="2c24030b551d41378f944055f4a44c64",ee="u1",ef="fad482ab9b5c46c1952d5aad4ea0a508",eg="u2",eh="bb91b2fe6e994c93abaa1907c4f474e4",ei="u3",ej="fd8428de1c954a7fb54cb8b737fa8cb8",ek="u4",el="81dff38c4abb4c299d032505ce1bd3b8",em="u5",en="214f4eb955814b23864a6056e1b34ac4",eo="u6",ep="c1e2c2c547d34189a097fc5a573d1e84",eq="u7",er="79ffc447be8549799643c1ef0b212546",es="u8",et="ddb9300483dd4254bdfbb4ca5ff5723c",eu="u9",ev="c309227fa1ce48a0b2b15877b05adacb",ew="u10",ex="c17788f3902d49daa20fbbe38be1daa4",ey="u11",ez="476ed508a0e641c3821a489ba050926d",eA="u12",eB="24c27214a4004ee3becff6c24ff7cfe3",eC="u13",eD="70009ea6695547be8b66debf61616908",eE="u14";
return _creator();
})());

763
web/static/files/登录/styles.css

@ -0,0 +1,763 @@
body {
margin:0px;
background-image:none;
position:relative;
left:0px;
width:1280px;
margin-left:auto;
margin-right:auto;
text-align:left;
}
.form_sketch {
border-color:transparent;
background-color:transparent;
}
#base {
position:absolute;
z-index:0;
}
#u0_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:1280px;
height:800px;
background:inherit;
background-color:rgba(255, 255, 255, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u0 {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:1280px;
height:800px;
display:flex;
}
#u0 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u0_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
visibility:hidden;
}
#u1_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:1280px;
height:90px;
background:inherit;
background-color:rgba(2, 167, 240, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(129, 211, 248, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u1 {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:1280px;
height:90px;
display:flex;
}
#u1 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u1_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
visibility:hidden;
}
#u2_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:254px;
height:45px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
font-size:40px;
}
#u2 {
border-width:0px;
position:absolute;
left:61px;
top:23px;
width:254px;
height:45px;
display:flex;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
font-size:40px;
}
#u2 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u2_text {
border-width:0px;
white-space:nowrap;
text-transform:none;
}
#u3_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:289px;
height:21px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u3 {
border-width:0px;
position:absolute;
left:496px;
top:750px;
width:289px;
height:21px;
display:flex;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u3 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u3_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
}
#u4_img {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:35px;
height:40px;
}
#u4 {
border-width:0px;
position:absolute;
left:1165px;
top:28px;
width:35px;
height:40px;
display:flex;
}
#u4 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u4_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
visibility:hidden;
}
#u5_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:96px;
height:28px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u5 {
border-width:0px;
position:absolute;
left:427px;
top:265px;
width:96px;
height:28px;
display:flex;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u5 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u5_text {
border-width:0px;
white-space:nowrap;
text-transform:none;
}
#u6_input {
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u6_input.disabled {
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u6_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
background:inherit;
background-color:rgba(255, 255, 255, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u6 {
border-width:0px;
position:absolute;
left:553px;
top:266px;
width:300px;
height:25px;
display:flex;
}
#u6 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u6_div.disabled {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
background:inherit;
background-color:rgba(240, 240, 240, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u6.disabled {
}
#u7_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:72px;
height:28px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u7 {
border-width:0px;
position:absolute;
left:451px;
top:343px;
width:72px;
height:28px;
display:flex;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u7 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u7_text {
border-width:0px;
white-space:nowrap;
text-transform:none;
}
#u8_input {
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u8_input.disabled {
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u8_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
background:inherit;
background-color:rgba(255, 255, 255, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u8 {
border-width:0px;
position:absolute;
left:553px;
top:345px;
width:300px;
height:25px;
display:flex;
}
#u8 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u8_div.disabled {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:300px;
height:25px;
background:inherit;
background-color:rgba(240, 240, 240, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u8.disabled {
}
#u9_input {
position:absolute;
left:0px;
top:0px;
width:136px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u9_input.disabled {
position:absolute;
left:0px;
top:0px;
width:136px;
height:25px;
padding:2px 2px 2px 2px;
font-family:'Arial Normal', 'Arial', sans-serif;
font-weight:400;
font-style:normal;
font-size:13px;
letter-spacing:normal;
color:#000000;
vertical-align:none;
text-align:left;
text-transform:none;
background-color:transparent;
border-color:transparent;
}
#u9_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:136px;
height:25px;
background:inherit;
background-color:rgba(255, 255, 255, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u9 {
border-width:0px;
position:absolute;
left:553px;
top:423px;
width:136px;
height:25px;
display:flex;
}
#u9 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u9_div.disabled {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:136px;
height:25px;
background:inherit;
background-color:rgba(240, 240, 240, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#u9.disabled {
}
#u10_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:96px;
height:28px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u10 {
border-width:0px;
position:absolute;
left:427px;
top:421px;
width:96px;
height:28px;
display:flex;
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif;
font-weight:700;
font-style:normal;
}
#u10 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u10_text {
border-width:0px;
white-space:nowrap;
text-transform:none;
}
#u11_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:140px;
height:40px;
background:inherit;
background-color:rgba(22, 155, 213, 1);
border:none;
border-radius:5px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-size:18px;
}
#u11 {
border-width:0px;
position:absolute;
left:427px;
top:521px;
width:140px;
height:40px;
display:flex;
font-size:18px;
}
#u11 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u11_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
}
#u12_img {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:140px;
height:47px;
}
#u12 {
border-width:0px;
position:absolute;
left:713px;
top:412px;
width:140px;
height:47px;
display:flex;
}
#u12 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u12_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
visibility:hidden;
}
#u13_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:140px;
height:40px;
background:inherit;
background-color:rgba(255, 255, 255, 1);
box-sizing:border-box;
border-width:1px;
border-style:solid;
border-color:rgba(121, 121, 121, 1);
border-radius:5px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
font-size:18px;
}
#u13 {
border-width:0px;
position:absolute;
left:713px;
top:521px;
width:140px;
height:40px;
display:flex;
font-size:18px;
}
#u13 .text {
position:absolute;
align-self:center;
padding:2px 2px 2px 2px;
box-sizing:border-box;
width:100%;
}
#u13_text {
border-width:0px;
word-wrap:break-word;
text-transform:none;
}
#u14_div {
border-width:0px;
position:absolute;
left:0px;
top:0px;
width:196px;
height:16px;
background:inherit;
background-color:rgba(255, 255, 255, 0);
border:none;
border-radius:0px;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#D9001B;
}
#u14 {
border-width:0px;
position:absolute;
left:657px;
top:581px;
width:196px;
height:16px;
display:flex;
color:#D9001B;
}
#u14 .text {
position:absolute;
align-self:flex-start;
padding:0px 0px 0px 0px;
box-sizing:border-box;
width:100%;
}
#u14_text {
border-width:0px;
white-space:nowrap;
text-transform:none;
}

7
web/static/files/算法管理/data.js

File diff suppressed because one or more lines are too long

3945
web/static/files/算法管理/styles.css

File diff suppressed because it is too large

7
web/static/files/系统管理/data.js

File diff suppressed because one or more lines are too long

1604
web/static/files/系统管理/styles.css

File diff suppressed because it is too large

7
web/static/files/通道管理/data.js

File diff suppressed because one or more lines are too long

6164
web/static/files/通道管理/styles.css

File diff suppressed because it is too large

BIN
web/static/images/实时预览/u20_menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

BIN
web/static/images/实时预览/u22.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

BIN
web/static/images/实时预览/u26.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

BIN
web/static/images/实时预览/u32.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
web/static/images/实时预览/u48.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

BIN
web/static/images/实时预览/u48_selected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

BIN
web/static/images/用户管理/u410.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

BIN
web/static/images/用户管理/u411.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

BIN
web/static/images/用户管理/u412.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

BIN
web/static/images/用户管理/u413.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

BIN
web/static/images/用户管理/u441.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

BIN
web/static/images/用户管理/u442.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

BIN
web/static/images/用户管理/u443.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

BIN
web/static/images/用户管理/u444.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

BIN
web/static/images/用户管理/u466.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

BIN
web/static/images/用户管理/u467.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

BIN
web/static/images/用户管理/u468.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

BIN
web/static/images/用户管理/u469.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

BIN
web/static/images/用户管理/u497.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

BIN
web/static/images/用户管理/u498.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

BIN
web/static/images/用户管理/u499.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

BIN
web/static/images/用户管理/u500.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

BIN
web/static/images/登录/u12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

6
web/static/images/登录/u4.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="35px" height="40px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -1165 -28 )">
<path d="M 34.767578125 28.9192708333333 C 34.9225260416667 30.2300347222222 35 31.6232638888889 35 33.0989583333333 C 35 34.9913194444444 34.4303385416667 36.6145833333333 33.291015625 37.96875 C 32.1516927083333 39.3229166666667 30.7799479166667 40 29.17578125 40 L 5.82421875 40 C 4.22005208333333 40 2.84830729166667 39.3229166666667 1.708984375 37.96875 C 0.569661458333333 36.6145833333333 0 34.9913194444444 0 33.0989583333333 C 0 31.6232638888889 0.0774739583333335 30.2300347222222 0.232421875 28.9192708333333 C 0.387369791666667 27.6085069444444 0.674479166666667 26.2890625 1.09375 24.9609375 C 1.51302083333333 23.6328125 2.04622395833333 22.4956597222222 2.693359375 21.5494791666667 C 3.34049479166667 20.6032986111111 4.197265625 19.8307291666667 5.263671875 19.2317708333333 C 6.330078125 18.6328125 7.55598958333333 18.3333333333333 8.94140625 18.3333333333333 C 11.3294270833333 20.5555555555556 14.1822916666667 21.6666666666667 17.5 21.6666666666667 C 20.8177083333333 21.6666666666667 23.6705729166667 20.5555555555556 26.05859375 18.3333333333333 C 27.4440104166667 18.3333333333333 28.669921875 18.6328125 29.736328125 19.2317708333333 C 30.802734375 19.8307291666667 31.6595052083333 20.6032986111111 32.306640625 21.5494791666667 C 32.9537760416667 22.4956597222222 33.4869791666667 23.6328125 33.90625 24.9609375 C 34.3255208333333 26.2890625 34.6126302083333 27.6085069444444 34.767578125 28.9192708333333 Z M 24.923828125 2.9296875 C 26.974609375 4.8828125 28 7.23958333333333 28 10 C 28 12.7604166666667 26.974609375 15.1171875 24.923828125 17.0703125 C 22.873046875 19.0234375 20.3984375 20 17.5 20 C 14.6015625 20 12.126953125 19.0234375 10.076171875 17.0703125 C 8.025390625 15.1171875 7 12.7604166666667 7 10 C 7 7.23958333333333 8.025390625 4.8828125 10.076171875 2.9296875 C 12.126953125 0.9765625 14.6015625 0 17.5 0 C 20.3984375 0 22.873046875 0.9765625 24.923828125 2.9296875 Z " fill-rule="nonzero" fill="#000000" stroke="none" transform="matrix(1 0 0 1 1165 28 )" />
</g>
</svg>

BIN
web/static/images/算法管理/u252.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

BIN
web/static/images/算法管理/u253.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

BIN
web/static/images/算法管理/u254.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

BIN
web/static/images/算法管理/u255.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

BIN
web/static/images/算法管理/u256.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

BIN
web/static/images/算法管理/u312.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

BIN
web/static/images/算法管理/u313.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

BIN
web/static/images/算法管理/u314.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

BIN
web/static/images/算法管理/u315.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

BIN
web/static/images/算法管理/u316.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

5
web/static/images/算法管理/u363.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

5
web/static/images/算法管理/u363_disabled.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

6
web/static/images/算法管理/u363_selected.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 216 69.5 C 214.32 69.5 213 68.18 213 66.5 C 213 64.82 214.32 63.5 216 63.5 C 217.68 63.5 219 64.82 219 66.5 C 219 68.18 217.68 69.5 216 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

6
web/static/images/算法管理/u363_selectedDisabled.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 216 69.5 C 214.32 69.5 213 68.18 213 66.5 C 213 64.82 214.32 63.5 216 63.5 C 217.68 63.5 219 64.82 219 66.5 C 219 68.18 217.68 69.5 216 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

5
web/static/images/算法管理/u364.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

5
web/static/images/算法管理/u364_disabled.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

6
web/static/images/算法管理/u364_selected.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 304 69.5 C 302.32 69.5 301 68.18 301 66.5 C 301 64.82 302.32 63.5 304 63.5 C 305.68 63.5 307 64.82 307 66.5 C 307 68.18 305.68 69.5 304 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

6
web/static/images/算法管理/u364_selectedDisabled.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 304 69.5 C 302.32 69.5 301 68.18 301 66.5 C 301 64.82 302.32 63.5 304 63.5 C 305.68 63.5 307 64.82 307 66.5 C 307 68.18 305.68 69.5 304 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

5
web/static/images/算法管理/u366.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

5
web/static/images/算法管理/u366_disabled.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

6
web/static/images/算法管理/u366_selected.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 216 120.5 C 214.32 120.5 213 119.18 213 117.5 C 213 115.82 214.32 114.5 216 114.5 C 217.68 114.5 219 115.82 219 117.5 C 219 119.18 217.68 120.5 216 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

6
web/static/images/算法管理/u366_selectedDisabled.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 216 120.5 C 214.32 120.5 213 119.18 213 117.5 C 213 115.82 214.32 114.5 216 114.5 C 217.68 114.5 219 115.82 219 117.5 C 219 119.18 217.68 120.5 216 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

5
web/static/images/算法管理/u367.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

5
web/static/images/算法管理/u367_disabled.svg

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" />
</svg>

6
web/static/images/算法管理/u367_selected.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" />
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 304 120.5 C 302.32 120.5 301 119.18 301 117.5 C 301 115.82 302.32 114.5 304 114.5 C 305.68 114.5 307 115.82 307 117.5 C 307 119.18 305.68 120.5 304 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

6
web/static/images/算法管理/u367_selectedDisabled.svg

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" />
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" />
<path d="M 304 120.5 C 302.32 120.5 301 119.18 301 117.5 C 301 115.82 302.32 114.5 304 114.5 C 305.68 114.5 307 115.82 307 117.5 C 307 119.18 305.68 120.5 304 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" />
</svg>

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

Loading…
Cancel
Save