Docker
docker run -itd -p 80:8080 registry.cn-beijing.aliyuncs.com/liyuanhao/homework:v3
博主最近小学期,每天得收三十多份报告;原采用QQ发送形式,但效率太低,很多时间都花在收发和修改命名格式上,因而博主打算写个提交作业平台,部署于阿里云,每个同学均可通过它上传当日作业,最后博主统一上交
PS:由于开发周期只有一天半,所以有些地方可能存有BUG,恳请指正
主页面
上传页面,点击可上传自己的作业文件 文件为空时提示
上传成功时提示
同学将每天的作业(Word文档)上传到该平台
按老师要求的格式给每份文件命名
将收齐的word文件放入一个文件夹内,压缩并下载
该系统采取C/S架构
部署环境 : CentOS7
前端 : Bootstrap + Jquery+SweetAlert2
WEB框架 : Flask
博主将上传文件存到了项目中文件夹内,所以此处没有使用数据库
项目结构
index.html为主页面信1701-3班-报告文件夹存储上传文件modles.py 存储学生学号与姓名信息主页面初始时显示一个提交表格,内容为每位同学的提交状态、学号、姓名、提交时间以及操作按钮. 图示
data是后端传来的一个列表,内含每个学生信息的字典 <!--提交信息的表格--> <table class="table table-hover" id="stuInfoTable"> <thead> <tr> <th>提交状态</th> <th>学号</th> <th>姓名</th> <th>上传时间</th> <th>操作</th> </tr> </thead> <tbody> {% for i in data %} <tr> {% if i['status'] == 'yes' %} <td style="color: green"> <strong>已提交</strong> </td> {% else %} <td style="color: red"> <strong>未提交</strong> </td> {% endif %} <td>{{ i['num'] }}</td> <td>{{ i['name'] }}</td> <td>{{ i['time'] }}</td> <!--已经提交则提交按钮为不可操作状态--> {% if i['status'] == 'yes' %} <td> <button class="btn btn-primary" disabled="disabled"> 已上传 </button> </td> {% else %} <!--否则当点击上传按钮时将字典i的值传给对应函数--> <td> <button class="btn btn-primary btn-lg" data-toggle="modal" onclick="display_form({{ i }})"> 文件上传 </button> </td> {% endif %} </tr> {% endfor %} </tbody> </table>app.py
import os import time from flask import Flask, render_template, request, redirect, url_for import models app = Flask(__name__) @app.route('/') def hello_world(): #上交作业的情况信息 data = get_upload_info() #已经上交的份数 num1 = len(get_stu_num()) return render_template('index.html', data=data, num1=num1) # 上传 @app.route('/upload', methods=['POST', 'GET']) def upload_file(): if request.method == 'POST': f = request.files['file'] name = request.form.get('name') num = request.form.get('num') # 获取文件格式 file_format = f.filename.split('.')[1] # 按老师要求命名 new_name = '%s-%s-课程设计工作日报表.%s' % (num, name, file_format) f.filename = new_name # 上传文件的所在路径 upload_path = os.path.join(os.getcwd(), '信1701-3班-报表-7月3日', f.filename) # 将路径转换为绝对路径 upload_path = os.path.abspath(upload_path) f.save(upload_path) return json.dumps({"result": 1}) # 下载文件 @app.route('/download/', methods=['GET']) def download(): zip_file() path = os.path.join(os.getcwd()) return send_from_directory(path, dir + '.zip', as_attachment=True) #压缩文件 def zip_file(): # 压缩文件夹 startdir = os.path.join(os.getcwd(), dir) file_news = dir + '.zip' z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED) # 参数一:文件夹名 for dirpath, dirnames, filenames in os.walk(startdir): fpath = dirpath.replace(startdir, '') # 这一句很重要,不replace的话,就从根目录开始复制 fpath = fpath and fpath + os.sep or '' for filename in filenames: z.write(os.path.join(dirpath, filename), fpath + filename) z.close() # 根据学号获取文件路径 def get_file_path(num): folder_path = os.path.join(os.getcwd(), '信1701-3班-报表-7月3日') for i in os.listdir(folder_path): if num in i: # 返回对应文件的绝对路径 return os.path.join(folder_path, i) # 获取文件修改时间 def get_upload_time(num): path = get_file_path(num) times = os.path.getmtime(path) return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(times)) # 获取已经上传学生的学号 def get_stu_num(): data = [] folder_path = os.path.join(os.getcwd(), '信1701-3班-报表-7月3日') for i in os.listdir(folder_path): path = os.path.join(folder_path, i) if os.path.isfile(path): num, name, file_format = i.split('-') data.append(num) return data # 获取上传情况 def get_upload_info(): data2 = [] num_info = get_stu_num() for i in models.stu_info: info = { 'status': 'no', 'num': i['num'], 'name': i['name'], 'time': '-----' } # 若该人已经提交 if num_info and i['num'] in num_info: info['status'] = 'yes' info['time'] = get_upload_time(i['num']) data2.append(info) return data2 if __name__ == '__main__': app.run()models.py 数据仅做示例
stu_info = [ {'num': '2015****', 'name': '李**'}, {'num': '2016****', 'name': '张**'}, {'num': '2017****', 'name': '张**'}, {'num': '2017****', 'name': '王**'}, {'num': '2017****', 'name': '张**'}, ]