Merge pull request #131 from Leif160519/main

新增自建主机,mysql,redis和站点管理支持csv格式导入功能
pull/137/head
StarsL.cn 2024-10-28 07:38:05 +08:00 committed by GitHub
commit 3e109b75b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 107 additions and 12 deletions

View File

@ -1,4 +1,6 @@
#!/usr/bin/python3
import csv,re
from io import StringIO
import requests, json, traceback
import xlrd,re,sys
sys.path.append("..")
@ -102,3 +104,52 @@ def read_execl(file_contents,imptype):
if imp['code'] == 50000:
return imp
return {"code": 20000, "data": f"导入成功!共导入 {rownum} 条数据。"}
import csv
import re
def read_csv(file_content, imptype):
file_content_str = file_content.decode('utf-8')
# 使用StringIO创建一个模拟的文件对象
csvfile = StringIO(file_content_str)
# 初始化一个空列表来存储处理后的数据
processed_rows = []
# 使用csv模块读取CSV文件
reader = csv.reader(csvfile)
next(reader) # 跳过表头行,如果有
# 遍历CSV文件的每一行
for row in reader:
nrow = [] # 初始化一个空列表来存储当前行的处理结果
# 遍历当前行的每个单元格
for cell in row:
cell = cell.strip() # 去除字符串两端的空白字符
# 尝试将单元格内容转换为数字
try:
# 尝试转换为浮点数,然后检查是否为整数
num = float(cell)
if num.is_integer():
num = int(num)
nrow.append(str(num)) # 将数字转换为字符串并添加到列表中
except ValueError:
# 如果转换失败,则执行字符串清洗操作
if cell: # 如果字符串非空
# 替换特殊字符为下划线除了第6个单元格索引为5
if row.index(cell) != 5:
cell = re.sub(r'[[\]`~!\\\#$^/&*=|"{}\':;?\t\n]', '_', cell)
else:
cell = '_' # 空字符串替换为下划线
nrow.append(cell) # 将清洗后的字符串添加到列表中
# 处理完当前行后将其添加到processed_rows列表中
processed_rows.append(nrow)
imp = importconsul(nrow, imptype)
if imp['code'] == 50000:
return imp
# 返回处理后的数据或其他信息,例如成功消息和处理的行数
return {"code": 20000, "data": f"处理成功!共处理 {len(processed_rows)} 条数据。", "rows": processed_rows}

View File

@ -1,3 +1,4 @@
import os
from flask import Blueprint
from flask_restful import reqparse, Resource, Api
import sys,traceback
@ -25,7 +26,17 @@ class Upload(Resource):
def post(self):
file = parser.parse_args().get("file")
try:
return upload.read_execl(file.read(),'blackbox')
filename = file.filename
file_extension = os.path.splitext(filename)[1].lower()
try:
file_data = file.read()
if file_extension == '.xlsx':
return upload.read_execl(file_data,'blackbox')
elif file_extension == '.csv':
return upload.read_csv(file_data,'blackbox')
except Exception as e:
logger.error(f"【blackbox】文件后缀名错误请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"文件后缀名错误请导入xlsx或csv格式"}
except Exception as e:
logger.error(f"【blackbox】导入失败,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"导入失败!"}

View File

@ -1,3 +1,4 @@
import os
from flask import Blueprint
from flask_restful import reqparse, Resource, Api
import sys,traceback
@ -27,7 +28,17 @@ class Upload(Resource):
def post(self):
file = parser.parse_args().get("file")
try:
return upload.read_execl(file.read(),'selfnode')
filename = file.filename
file_extension = os.path.splitext(filename)[1].lower()
try:
file_data = file.read()
if file_extension == '.xlsx':
return upload.read_execl(file_data,'selfnode')
elif file_extension == '.csv':
return upload.read_csv(file_data,'selfnode')
except Exception as e:
logger.error(f"【selfnode】文件后缀名错误请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"文件后缀名错误请导入xlsx或csv格式"}
except Exception as e:
logger.error(f"【selfnode】导入失败,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"导入失败!"}

View File

@ -1,3 +1,4 @@
import os
from flask import Blueprint
from flask_restful import reqparse, Resource, Api
import sys,traceback
@ -27,7 +28,17 @@ class Upload(Resource):
def post(self):
file = parser.parse_args().get("file")
try:
return upload.read_execl(file.read(),'selfrds')
filename = file.filename
file_extension = os.path.splitext(filename)[1].lower()
try:
file_data = file.read()
if file_extension == '.xlsx':
return upload.read_execl(file_data,'selfrds')
elif file_extension == '.csv':
return upload.read_csv(file_data,'selfrds')
except Exception as e:
logger.error(f"【selfrds】文件后缀名错误请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"文件后缀名错误请导入xlsx或csv格式"}
except Exception as e:
logger.error(f"【selfrds】导入失败,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"导入失败!"}

View File

@ -1,3 +1,4 @@
import os
from flask import Blueprint
from flask_restful import reqparse, Resource, Api
import sys,traceback
@ -27,7 +28,17 @@ class Upload(Resource):
def post(self):
file = parser.parse_args().get("file")
try:
return upload.read_execl(file.read(),'selfredis')
filename = file.filename
file_extension = os.path.splitext(filename)[1].lower()
try:
file_data = file.read()
if file_extension == '.xlsx':
return upload.read_execl(file_data,'selfredis')
elif file_extension == '.csv':
return upload.read_csv(file_data,'selfredis')
except Exception as e:
logger.error(f"【selfredis】文件后缀名错误请导入xlsx或csv格式,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"文件后缀名错误请导入xlsx或csv格式"}
except Exception as e:
logger.error(f"【selfredis】导入失败,{e}\n{traceback.format_exc()}")
return {"code": 50000, "data": f"导入失败!"}

View File

@ -286,7 +286,7 @@ export default {
methods: {
handleBeforeUpload(file) {
const uploadLimit = 5
const uploadTypes = ['xlsx']
const uploadTypes = ['xlsx','csv']
const filetype = file.name.replace(/.+\./, '')
const isRightSize = (file.size || 0) / 1024 / 1024 < uploadLimit
if (!isRightSize) {
@ -295,7 +295,7 @@ export default {
}
if (uploadTypes.indexOf(filetype.toLowerCase()) === -1) {
this.$message.warning({
message: '仅支持上传xlsx格式的文件!'
message: '仅支持上传xlsx和csv格式的文件!'
})
return false
}

View File

@ -290,7 +290,7 @@ export default {
methods: {
handleBeforeUpload(file) {
const uploadLimit = 5
const uploadTypes = ['xlsx']
const uploadTypes = ['xlsx','csv']
const filetype = file.name.replace(/.+\./, '')
const isRightSize = (file.size || 0) / 1024 / 1024 < uploadLimit
if (!isRightSize) {
@ -299,7 +299,7 @@ export default {
}
if (uploadTypes.indexOf(filetype.toLowerCase()) === -1) {
this.$message.warning({
message: '仅支持上传xlsx格式的文件!'
message: '仅支持上传xlsx和csv格式的文件!'
})
return false
}

View File

@ -290,7 +290,7 @@ export default {
methods: {
handleBeforeUpload(file) {
const uploadLimit = 5
const uploadTypes = ['xlsx']
const uploadTypes = ['xlsx','csv']
const filetype = file.name.replace(/.+\./, '')
const isRightSize = (file.size || 0) / 1024 / 1024 < uploadLimit
if (!isRightSize) {
@ -299,7 +299,7 @@ export default {
}
if (uploadTypes.indexOf(filetype.toLowerCase()) === -1) {
this.$message.warning({
message: '仅支持上传xlsx格式的文件!'
message: '仅支持上传xlsx和csv格式的文件!'
})
return false
}

View File

@ -290,7 +290,7 @@ export default {
methods: {
handleBeforeUpload(file) {
const uploadLimit = 5
const uploadTypes = ['xlsx']
const uploadTypes = ['xlsx','csv']
const filetype = file.name.replace(/.+\./, '')
const isRightSize = (file.size || 0) / 1024 / 1024 < uploadLimit
if (!isRightSize) {
@ -299,7 +299,7 @@ export default {
}
if (uploadTypes.indexOf(filetype.toLowerCase()) === -1) {
this.$message.warning({
message: '仅支持上传xlsx格式的文件!'
message: '仅支持上传xlsx和csv格式的文件!'
})
return false
}