You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from flask import Flask, render_template, request, redirect, url_for, session
from flask import Flask, request, jsonify, send_from_directory
import os
app = Flask(__name__)
app.secret_key = 'your_secret_key' # 用于会话管理,请替换为更安全的密钥
app.config['UPLOAD_FOLDER'] = 'uploads' # 设置上传文件存储目录
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # 确保目录存在
# EXTERNAL_SCOUT_URL = 'http://192.168.78.178:5000/' # 外部侦查者页面URL
# 处理文件上传
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'message': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'message': 'No selected file'}), 400
if file:
filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(filepath)
return jsonify({'message': 'File uploaded successfully', 'filepath': filepath}), 201
# 提供上传文件的访问
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
# 登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 在这里添加你的认证逻辑(例如,从数据库验证用户名和密码)
# 假设我们总是接受任何用户名和密码为'admin'的登录
if username == 'admin' and password == 'admin':
role = request.form['role']
session['username'] = username
session['role'] = role
if role == '侦查者':
return redirect(url_for('scout'))
elif role == '指挥者':
return redirect(url_for('commander'))
elif role == '攻击者':
return redirect(url_for('attacker'))
else:
return "Invalid credentials. Please try again."
return render_template('login.html')
# 侦查者页面
@app.route('/scout')
def scout():
if 'username' not in session or session['role'] != '侦查者':
return redirect(url_for('login'))
return render_template('scout.html')
# 指挥者页面
@app.route('/commander')
def commander():
if 'username' not in session or session['role'] != '指挥者':
return redirect(url_for('login'))
return render_template('commander.html')
# 攻击者页面
@app.route('/attacker')
def attacker():
if 'username' not in session or session['role'] != '攻击者':
return redirect(url_for('login'))
return render_template('attacker.html')
# 退出登录(清除会话)
@app.route('/logout')
def logout():
session.pop('username', None)
session.pop('role', None)
return redirect(url_for('login'))
from werkzeug.utils import secure_filename
import uuid
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/send_message', methods=['GET', 'POST'])
def send_message():
if request.method == 'POST':
# 处理照片上传
if 'photo' in request.files:
file = request.files['photo']
if file.filename == '':
return "No selected file", 400
if file and allowed_file(file.filename):
filename = secure_filename(f"{uuid.uuid4().hex}_{file.filename}")
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
photo_url = url_for('uploaded_file', filename=filename, _external=True)
else:
return "Allowed file types are png, jpg, jpeg, gif", 400
else:
photo_url = None
# 处理消息文本上传
message = request.form.get('message')
if not message:
return "No message provided", 400
# 在这里处理消息和照片的存储或进一步处理
# 例如将消息和照片URL存储到数据库
# 返回成功响应或重定向
return f"Message and photo (if uploaded) have been received. Message: {message}\nPhoto URL: {photo_url if photo_url else 'N/A'}"
# 如果是GET请求渲染发送消息的表单
return render_template('send_message.html')
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8000)