add excel handle

This commit is contained in:
RainSun 2020-02-14 14:15:38 +08:00
parent cd5ec0a6e9
commit 59bafbb20e
6 changed files with 192 additions and 8 deletions

@ -21,4 +21,11 @@
* 502num自增失败
* /keyword/update
* 600校验失败
* 601更新keyword数据库修改失败
* 601更新keyword数据库修改失败
* /excel/add
* 700文件格式不符
* 701keyword插入失败
* /excel/reset
* 800文件格式不符
* 801keyword数据库清空失败
* 701keyword插入失败

30
api.js

@ -2,7 +2,7 @@
import axios from 'axios'
export const api = axios.create({
baseURL: 'https://api.powerrain.cn/',
baseURL: 'https://chenmo1212.site/wxapi',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
@ -42,12 +42,34 @@ export function addKeywords(item) {
return api.post('/keyword/insert',params)
}
// index 就是关键词的index
export function delKeywords(index) {
let data = { index }
// id 就是关键词的 id
export function delKeywords(id) {
let data = { id }
let sign = CryptoJS.MD5(JSON.stringify(data).replace(/\"/g,"'")).toString().toUpperCase();
data.sign = sign
let params = new URLSearchParams();
params.append('data', JSON.stringify(data));
return api.post('/keyword/del',params)
}
// 上传excel
export function addExcel(file) {
let param = new FormData();
param.append('excel', file);
return api.put('/excel/add', param, {
headers: {
'Content-Type': 'multipart/form-data',
}
})
}
// 上传excel
export function resetExcel(file) {
let param = new FormData();
param.append('excel', file);
return api.put('/excel/reset', param, {
headers: {
'Content-Type': 'multipart/form-data',
}
})
}

15
api.py

@ -2,7 +2,7 @@
import sys
sys.path.append('./lib')
from flask import Flask, escape, url_for, request, render_template, redirect, abort, send_from_directory, Response
from allFunction import manageGet, managePost, manageInsertKeyword, manageDelKeyword, manageGetKeyword, manageMaterial, replySomething, manageUpdateKeyword
from allFunction import manageGet, managePost, manageInsertKeyword, manageDelKeyword, manageGetKeyword, manageMaterial, replySomething, manageUpdateKeyword, manageExcelAdd, manageExcelReset
from flask_apscheduler import APScheduler
from wxRequest import requestsAccessToken
scheduler = APScheduler()
@ -49,6 +49,7 @@ def sayHello():
return replySomething(dict_content['msg'])
except Exception as e:
return 'please send some arg as msg'
# 用于接受微信发来的消息
@app.route('/wxpy/acceptmsg', methods=["POST", "GET"])
def acceptMsg():
@ -93,4 +94,16 @@ def getKeyword():
@app.route('/keyword/update', methods=["POST"])
def updateKeyword():
res = manageUpdateKeyword(request)
return res
# excel上传新增数据
@app.route('/excel/add', methods=['PUT'], strict_slashes=False)
def excelAdd():
res = manageExcelAdd(request)
return res
# excel上传重置数据
@app.route('/excel/reset', methods=['PUT'], strict_slashes=False)
def excelReset():
res = manageExcelReset(request)
return res

@ -7,13 +7,15 @@ import reply
# 引入md5校验
from hashlib import md5
# 引入数据库操作函数
from db import insertKeyword, delKeyword, getAllKeyword, fuzzySearch, addCount, updateKeyword
from db import insertKeyword, delKeyword, getAllKeyword, fuzzySearch, addCount, updateKeyword, clearKeyword
# 引入json
import json
# 引入获取微信图文信息
from wxRequest import batchget_material
# 引入时间
import datetime
# 引入excel处理函数
from excel import upload_excel, loadData, insertToDB
# 主处理逻辑函数-----------------------------------------------------------
@ -151,6 +153,41 @@ def manageUpdateKeyword(request):
else:
return {'errcode': 600, 'errmsg': '校验失败'}
# 处理excel上传新增数据
def manageExcelAdd(request):
# 保存excel并获取新文件名
res_upload = upload_excel(request)
# 保存错误拦截
if res_upload['errcode'] != 200:
return res_upload
# 新文件名
filename = res_upload['filename']
# 获取文件内容
data_list = loadData(filename, 0)
# 插入数据
res_insert = insertToDB(data_list)
return res_insert
# 处理excel上传重置数据
def manageExcelReset(request):
# 保存excel并获取新文件名
res_upload = upload_excel(request)
# 保存错误拦截
if res_upload['errcode'] != 200:
return res_upload
# 新文件名
filename = res_upload['filename']
# 获取文件内容
data_list = loadData(filename, 0)
# 清空数据库
res_clear = clearKeyword()
# 清空错误拦截
if res_clear['errcode'] != 200:
return res_clear
# 插入数据
res_insert = insertToDB(data_list)
return res_insert
# 工具函数---------------------------------------------------------------
# 更新sha1

@ -109,4 +109,13 @@ def updateKeyword(id, keywords, content, date_now, news):
except Exception as e:
# 失败
return {'errcode': 601, 'errmsg': '更新keyword数据库修改失败'}
return {'errcode': 200, 'errmsg': 'ok'}
return {'errcode': 200, 'errmsg': 'ok'}
# 删库
def clearKeyword():
try:
col('keyword').remove({})
except Exception as e:
# 失败
return {'errcode': 801, 'errmsg': 'keyword数据库清空失败'}
return {'errcode': 200, 'errmsg': 'ok'}

96
lib/excel.py Normal file

@ -0,0 +1,96 @@
import os
from werkzeug.utils import secure_filename
import datetime
import random
from openpyxl import load_workbook
from db import insertKeyword, clearKeyword
# 获取本文件目录地址
basedir = os.path.abspath(os.path.dirname(__file__))
# 设置允许的文件尾缀
ALLOWED_EXTENSIONS = set(['xlsx'])
# 判断允许的文件尾缀
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
#生成唯一的名称字符串,防止重名问题
def create_uuid():
# 生成当前时间
nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# 生成的随机整数n其中0<=n<=100
randomNum = random.randint(0, 100)
if randomNum <= 10:
randomNum = str(0) + str(randomNum)
uniqueNum = str(nowTime) + str(randomNum)
return uniqueNum
# 接受前端传来的文件
def upload_excel(request):
# 文件夹地址
file_dir = os.path.join(basedir, '../upload')
# 文件夹不存在就创建
if not os.path.exists(file_dir):
os.makedirs(file_dir)
# 获取文件
f = request.files['excel']
# 文件格式判断拦截器
if f and allowed_file(f.filename):
fname = secure_filename(f.filename)
ext = fname.rsplit('.', 1)[1]
# 生成新文件名
new_filename = create_uuid() + '.' + ext
# 保存文件
f.save(os.path.join(file_dir, new_filename))
return {'errcode': 200, 'filename': new_filename}
else:
return {'errcode': 700, 'errmsg': '文件格式不符'}
# 加载excel文件
def loadData(file_name, sheet_index):
wb = load_workbook('../upload' + file_name)
ws = wb[wb.sheetnames[sheet_index]]
index = 0
data_list = {}
for row in ws.rows:
# 排除表头
if index != 0:
# 关键词
keywords = row[0].value
# 内容
content = row[1].value
data_list[keywords] = content
index += 1
return data_list
# 组织记录内容
def packageData(keywords, content):
return {
'keywords': keywords,
'content': content,
'num': 0,
'date': datetime.datetime.now().strftime('%Y-%m-%d'),
'news': {
"title": "",
"digest": "",
"update_time": "",
"cover": "",
"url": "",
"type": [],
}
}
# 插入到数据库中
def insertToDB(data_list):
# 插入错误列表
err_list = []
for keywords in data_list:
data = packageData(keywords, data_list[keywords])
res = insertKeyword(data)
# 插入失败处理
if res['errcode'] != 200:
res['keywords'] = keywords
res['content'] = data_list[keywords]
err_list.append(res)
if len(err_list) != 0:
return {'errcode': 701, 'errmsg': 'keyword插入失败', 'err_list': err_list}
return {'errcode': 200, 'errmsg': 'ok'}