1.前端部分
1.1 api设置
// 导入用户
export function uploadUser(data) {
const formData = new FormData();
formData.append('file', data); // data 是从文件上传事件中获取的文件对象
return request({
url: '/users/upload',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: formData,
transformRequest: [(data) => data] // 禁用默认的序列化行为
})
}
1.2 导入按钮
<el-upload
class="upload-demo"
ref="upload"
action="dummy-action"
:show-file-list="false" :before-upload="handleImportUser">
<el-button type="primary" icon="el-icon-download" style="margin-left: 20px">导入</el-button>
</el-upload>
1.3 按钮点击事件调用接口
// 导入的回调
async handleImportUser(file) {
if (!file.name.endsWith('.xlsx')) return this.$message.error('请上传Excel文件!')
if (file.size > 1024 * 1024 * 5) return this.$message.error('文件大小不能超过5MB!')
const res = await uploadUser(file)
if (res.code !== 200) return this.$message.error('导入失败!')
this.$message.success('导入成功!')
this.getUserList()
}
2. 后端部分
@user_router.post('/upload', summary='导入用户')
async def user_upload(file: UploadFile):
# 检查文件类型是否为 Excel
if not file.filename.endswith(('.xls', '.xlsx')):
return base_response(code=400, msg='文件格式错误!')
if file.size > 1024 * 1024 * 5:
return base_response(code=400, msg='文件大小不能超过5MB!')
# 读取 Excel 文件
wb = openpyxl.load_workbook(file.file)
ws = wb.active
# 遍历 Excel 表格的每一行数据并保存到数据库中
for row in ws.iter_rows(min_row=2, values_only=True): # Assuming first row is header
try:
name, nick_name, phone, password = row
# 数据校验
if not name or not password:
raise ValueError('姓名和密码不能为空!')
if await User.exists(name=name):
raise ValueError('用户已存在!')
if not re.match(r'^1[3-9]\d{9}$', str(phone)):
raise ValueError('手机号码格式错误!')
# 将有效数据保存到数据库中,这里假设有一个数据库操作函数 save_user()
await User.create(name=name, nick_name=nick_name, phone=phone, password=hash_password(str(password)))
except ValueError as e:
print(f"数据导入失败:{e}")
return base_response(code=200, msg='导入用户成功!')