侧边栏壁纸
博主头像
亚玛沃小库博主等级

行动起来,活在当下

  • 累计撰写 88 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

应用项目

Administrator
2025-03-26 / 0 评论 / 0 点赞 / 10 阅读 / 10326 字 / 正在检测是否收录...

好的,既然你需要完善整个框架,包括用户管理、管理员界面、登录注册、邀请码管理、签到获取积分等功能,我们可以分步骤来实现,确保项目的基础框架得到完整和合理的结构。

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 认证保护接口。

  • 提供了基本的前端登录页面。

这个基础框架可以进一步扩展,比如添加更多的前端界面、权限管理等功能。如果你有任何问题或需要进一步的帮助,随时告诉我!

0

评论区