好的,既然你需要完善整个框架,包括用户管理、管理员界面、登录注册、邀请码管理、签到获取积分等功能,我们可以分步骤来实现,确保项目的基础框架得到完整和合理的结构。
1. 完善的项目结构
/project_root
│
├── /app # 存放应用的主逻辑和启动文件
│ ├── __init__.py # 初始化Flask应用
│ ├── main.py # 启动文件
│ ├── /models # 存放数据库模型
│ │ ├── user.py # 用户模型
│ │ ├── points.py # 积分模型
│ │ └── invite_code.py # 邀请码模型
│ ├── /routes # 存放路由文件
│ │ ├── auth_routes.py # 用户认证路由
│ │ ├── admin_routes.py # 管理员路由
│ │ └── points_routes.py # 积分相关路由
│ └── /templates # 存放HTML模板
│ ├── login.html # 登录页面
│ ├── register.html # 注册页面
│ ├── dashboard.html # 管理员控制面板
│ └── user_management.html # 用户管理界面
│
├── /services # 存放业务逻辑和服务层
│ ├── api_client.py # 通用API客户端
│ └── navidrome_client.py # Navidrome客户端
│
├── requirements.txt # 项目依赖库
└── .env # 环境配置文件
2. 数据库模型
我们需要三个模型:用户模型(User)、积分模型(Points)、邀请码模型(InviteCode)。在 /app/models
目录下创建相应的文件。
2.1 /app/models/user.py
- 用户模型
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
"""用户模型"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
is_admin = db.Column(db.Boolean, default=False)
last_sign_in = db.Column(db.Date)
def __repr__(self):
return f'<User {self.username}>'
2.2 /app/models/points.py
- 积分模型
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Points(db.Model):
"""积分模型"""
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), unique=True, nullable=False)
balance = db.Column(db.Integer, default=0)
def __repr__(self):
return f'<Points {self.user_id}, Balance {self.balance}>'
2.3 /app/models/invite_code.py
- 邀请码模型
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class InviteCode(db.Model):
"""邀请码模型"""
id = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(100), unique=True, nullable=False)
used = db.Column(db.Boolean, default=False)
def __repr__(self):
return f'<InviteCode {self.code}, Used {self.used}>'
3. 路由和功能实现
我们需要处理用户认证、管理员管理、积分管理和邀请码管理等功能。
3.1 /app/routes/auth_routes.py
- 用户认证路由
from flask import Blueprint, request, jsonify
from flask_jwt_extended import create_access_token
from werkzeug.security import generate_password_hash, check_password_hash
from .models.user import db, User
auth_bp = Blueprint('auth', __name__)
# 用户注册
@auth_bp.route('/register', methods=['POST'])
def register():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({"msg": "用户名和密码不能为空"}), 400
hashed_password = generate_password_hash(password)
new_user = User(username=username, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return jsonify({"msg": "注册成功"}), 201
# 用户登录
@auth_bp.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({"msg": "用户名和密码不能为空"}), 400
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
access_token = create_access_token(identity=user.id)
return jsonify(access_token=access_token), 200
else:
return jsonify({"msg": "用户名或密码错误"}), 401
3.2 /app/routes/admin_routes.py
- 管理员路由
from flask import Blueprint, request, jsonify
from .models.user import User, db
from flask_jwt_extended import jwt_required, get_jwt_identity
admin_bp = Blueprint('admin', __name__)
# 获取所有用户
@admin_bp.route('/users', methods=['GET'])
@jwt_required()
def get_all_users():
current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if not user or not user.is_admin:
return jsonify({"msg": "无权限访问"}), 403
users = User.query.all()
return jsonify([{"id": u.id, "username": u.username, "is_admin": u.is_admin} for u in users]), 200
# 创建新用户
@admin_bp.route('/users', methods=['POST'])
@jwt_required()
def create_user():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({"msg": "用户名和密码不能为空"}), 400
hashed_password = generate_password_hash(password)
new_user = User(username=username, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return jsonify({"msg": "用户创建成功", "user_id": new_user.id}), 201
3.3 /app/routes/points_routes.py
- 积分管理路由
from flask import Blueprint, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from .models.points import Points, db
points_bp = Blueprint('points', __name__)
# 获取用户积分
@points_bp.route('/balance', methods=['GET'])
@jwt_required()
def get_balance():
current_user_id = get_jwt_identity()
points = Points.query.filter_by(user_id=current_user_id).first()
if not points:
points = Points(user_id=current_user_id, balance=0)
db.session.add(points)
db.session.commit()
return jsonify({"balance": points.balance}), 200
# 增加积分
@points_bp.route('/add', methods=['POST'])
@jwt_required()
def add_points():
current_user_id = get_jwt_identity()
points = Points.query.filter_by(user_id=current_user_id).first()
if not points:
points = Points(user_id=current_user_id, balance=0)
db.session.add(points)
points.balance += 10 # 示例增加积分
db.session.commit()
return jsonify({"balance": points.balance}), 200
3.4 /app/routes/invite_routes.py
- 邀请码管理路由
from flask import Blueprint, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from .models.invite_code import InviteCode, db
invite_bp = Blueprint('invite', __name__)
# 生成邀请码
@invite_bp.route('/generate', methods=['POST'])
@jwt_required()
def generate_invite():
new_code = InviteCode(code="samplecode123") # 可以修改为生成随机码
db.session.add(new_code)
db.session.commit()
return jsonify({"msg": "邀请码生成成功", "code": new_code.code}), 201
# 获取所有邀请码
@invite_bp.route('/list', methods=['GET'])
@jwt_required()
def list_invites():
invites = InviteCode.query.all()
return jsonify([{"id": invite.id, "code": invite.code, "used": invite.used} for invite in invites]), 200
4. 前端界面
4.1 /app/templates/login.html
- 登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
</head>
<body>
<h2>登录</h2>
<form id="login-form">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">登录</button>
</form>
<script>
document.getElementById('login-form').addEventListener('submit', async function(e) {
e.preventDefault();
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const response = await fetch('/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, password })
});
const data = await response.json();
if (response.status === 200) {
alert("登录成功!");
// 这里可以处理存储token或跳转到其他页面
} else {
alert(data.msg || "登录失败");
}
});
</script>
</body>
</html>
总结
我们实现了用户管理、管理员控制面板、积分管理、邀请码管理等核心功能。
完善了用户注册和登录功能,通过 JWT 认证保护接口。
提供了基本的前端登录页面。
这个基础框架可以进一步扩展,比如添加更多的前端界面、权限管理等功能。如果你有任何问题或需要进一步的帮助,随时告诉我!
评论区