From 5c78e5e461169735b744e6b0dffb4933baffc9eb Mon Sep 17 00:00:00 2001 From: Fantasy lee <129943055+Fantasylee21@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:41:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[feat]:=20=E5=AE=9E=E7=8E=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=B3=A8=E5=86=8C=E7=9A=84=E7=9B=B8=E5=85=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +++ ...17\351\273\230\350\256\244\345\200\274.py" | 32 +++++ ...33\264\346\224\271password\345\220\215.py" | 34 +++++ ...56\345\272\223\345\256\232\344\271\211.py" | 34 +++++ app/api/v1/endpoints/auth.py | 123 ++++++++++++++++++ app/core/config.py | 10 +- app/curd/user.py | 12 ++ app/db/session.py | 2 +- app/main.py | 5 +- app/models/model.py | 45 +++---- app/schemas/auth.py | 15 +++ app/static/avatar/default.jpg | Bin 0 -> 62637 bytes requirements.txt | 10 ++ 13 files changed, 313 insertions(+), 26 deletions(-) create mode 100644 "alembic/versions/2acf0b902f73_\346\267\273\345\212\240\345\244\264\345\203\217\351\273\230\350\256\244\345\200\274.py" create mode 100644 "alembic/versions/9af9d4a35bef_fix_\346\233\264\346\224\271password\345\220\215.py" create mode 100644 "alembic/versions/c49010e96150_fix_\346\225\260\346\215\256\345\272\223\345\256\232\344\271\211.py" create mode 100644 app/api/v1/endpoints/auth.py create mode 100644 app/curd/user.py create mode 100644 app/schemas/auth.py create mode 100644 app/static/avatar/default.jpg diff --git a/README.md b/README.md index 3465e4d..947fc58 100644 --- a/README.md +++ b/README.md @@ -83,11 +83,28 @@ This is the backend service for JieNote, built with FastAPI. uvicorn app.main:app --reload ``` +## Redis +- Redis is used for caching and session management. +- Make sure to have Redis installed and running. + +```bash +cd path/to/redis +# Start Redis server +redis-server.exe redis.windows.conf +``` +Attention!!! +- Make sure the port is not occupied by other services. +- If you want to use the default port, please modify the `redis.windows.conf` file. +- Must connect Redis before running the application. ‼️‼️‼️ + + ## Folder Structure - `app/`: Contains the main application code. - `tests/`: Contains test cases. - `env/`: Virtual environment (not included in version control). + + ## ER Diagram ![ER Diagram](img/er_diagram.jpg) diff --git "a/alembic/versions/2acf0b902f73_\346\267\273\345\212\240\345\244\264\345\203\217\351\273\230\350\256\244\345\200\274.py" "b/alembic/versions/2acf0b902f73_\346\267\273\345\212\240\345\244\264\345\203\217\351\273\230\350\256\244\345\200\274.py" new file mode 100644 index 0000000..f9dca8a --- /dev/null +++ "b/alembic/versions/2acf0b902f73_\346\267\273\345\212\240\345\244\264\345\203\217\351\273\230\350\256\244\345\200\274.py" @@ -0,0 +1,32 @@ +"""添加头像默认值 + +Revision ID: 2acf0b902f73 +Revises: b7940480e6e6 +Create Date: 2025-04-11 22:54:09.734172 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '2acf0b902f73' +down_revision: Union[str, None] = 'b7940480e6e6' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git "a/alembic/versions/9af9d4a35bef_fix_\346\233\264\346\224\271password\345\220\215.py" "b/alembic/versions/9af9d4a35bef_fix_\346\233\264\346\224\271password\345\220\215.py" new file mode 100644 index 0000000..2f52761 --- /dev/null +++ "b/alembic/versions/9af9d4a35bef_fix_\346\233\264\346\224\271password\345\220\215.py" @@ -0,0 +1,34 @@ +"""fix:更改password名 + +Revision ID: 9af9d4a35bef +Revises: c49010e96150 +Create Date: 2025-04-12 10:27:52.832186 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision: str = '9af9d4a35bef' +down_revision: Union[str, None] = 'c49010e96150' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('password', sa.String(length=60), nullable=False)) + op.drop_column('users', 'hash_password') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('hash_password', mysql.VARCHAR(length=60), nullable=False)) + op.drop_column('users', 'password') + # ### end Alembic commands ### diff --git "a/alembic/versions/c49010e96150_fix_\346\225\260\346\215\256\345\272\223\345\256\232\344\271\211.py" "b/alembic/versions/c49010e96150_fix_\346\225\260\346\215\256\345\272\223\345\256\232\344\271\211.py" new file mode 100644 index 0000000..5c4fa4e --- /dev/null +++ "b/alembic/versions/c49010e96150_fix_\346\225\260\346\215\256\345\272\223\345\256\232\344\271\211.py" @@ -0,0 +1,34 @@ +"""fix 数据库定义 + +Revision ID: c49010e96150 +Revises: 2acf0b902f73 +Create Date: 2025-04-12 10:19:29.708681 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision: str = 'c49010e96150' +down_revision: Union[str, None] = '2acf0b902f73' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('notes', sa.Column('content', sa.String(length=255), nullable=True)) + op.drop_column('notes', 'name') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('notes', sa.Column('name', mysql.VARCHAR(length=30), nullable=True)) + op.drop_column('notes', 'content') + # ### end Alembic commands ### diff --git a/app/api/v1/endpoints/auth.py b/app/api/v1/endpoints/auth.py new file mode 100644 index 0000000..81bb525 --- /dev/null +++ b/app/api/v1/endpoints/auth.py @@ -0,0 +1,123 @@ +from fastapi import APIRouter, HTTPException, Depends +from sqlalchemy.orm import Session +from passlib.context import CryptContext +from datetime import datetime, timedelta +import jwt +import smtplib +from email.mime.text import MIMEText +from email.header import Header +import random +import time +import redis +from email.utils import formataddr + +from app.db.session import SessionLocal +from app.models.model import User +from app.schemas.auth import UserCreate, UserLogin, UserSendCode +from app.core.config import settings +from app.curd.user import get_user_by_email, create_user + +router = APIRouter() + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +SECRET_KEY = settings.SECRET_KEY +ALGORITHM = settings.ALGORITHM +ACCESS_TOKEN_EXPIRE_MINUTES = settings.ACCESS_TOKEN_EXPIRE_MINUTES + +# 配置 Redis 连接 +while True: + try: + print("Connecting to Redis...") + redis_client = redis.StrictRedis(host='localhost', port=6379, db=0) + redis_client.ping() + break + except redis.ConnectionError: + print("Redis connection failed, retrying...") + time.sleep(1) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +def create_access_token(data: dict, expires_delta: timedelta = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + +@router.post("/register", response_model=dict) +def register(user: UserCreate, db: Session = Depends(get_db)): + existing_user = get_user_by_email(db, user.email) + if (redis_client.exists(f"email:{user.email}:code")): + code = redis_client.get(f"email:{user.email}:code").decode("utf-8") + if (user.code != code): + raise HTTPException(status_code=400, detail="Invalid verification code") + else: + raise HTTPException(status_code=400, detail="Verification code expired or not sent") + + if (existing_user): + raise HTTPException(status_code=400, detail="Email already registered") + hashed_password = pwd_context.hash(user.password) + create_user(db, user.email, user.username, hashed_password) + return {"msg": "User registered successfully"} + +@router.post("/login", response_model=dict) +def login(user: UserLogin, db: Session = Depends(get_db)): + db_user = get_user_by_email(db, user.email) + if not db_user or not pwd_context.verify(user.password, db_user.password): + raise HTTPException(status_code=401, detail="Invalid email or password") + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": db_user.email}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer", } + +# 发送验证码 +@router.post("/send_code", response_model=dict) +def send_code(user_send_code : UserSendCode, db: Session = Depends(get_db)): + # 检查 Redis 中是否存在该邮箱的发送记录 + if redis_client.exists(f"email:{user_send_code.email}:time"): + raise HTTPException(status_code=429, detail="You can only request a verification code once every 5 minutes.") + + # 生成随机验证码 + code = str(random.randint(100000, 999999)) + + # SMTP 配置 + smtp_server = "smtp.163.com" + smtp_port = 465 + sender_email = "19855278313@163.com" # 替换为你的网易邮箱 + sender_password = "DHSihwnVc4wS89eV" # 替换为你的授权码 + + # 邮件内容 + subject = "验证码" + body = f"欢迎使用JieNote,很开心遇见您,您的验证码是:{code},请在5分钟内使用。" + + # 创建MIMEText对象时需要显式指定子类型和编码 + message = MIMEText(_text=body, _subtype='plain', _charset='utf-8') + message["From"] = formataddr(("JieNote团队", "noreply@jienote.com")) + message["To"] = user_send_code.email + message["Subject"] = Header(subject, 'utf-8').encode() + # 添加必要的内容传输编码头 + message.add_header('Content-Transfer-Encoding', 'base64') + + try: + # 连接 SMTP 服务器并发送邮件 + with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: + server.login(sender_email, sender_password) + server.sendmail(sender_email, [user_send_code.email], message.as_string()) + + # 将验证码和发送时间存储到 Redis,设置 5 分钟过期时间 + redis_client.setex(f"email:{user_send_code.email}:code", 300, code) + redis_client.setex(f"email:{user_send_code.email}:time", 300, int(time.time())) + + return {"msg": "Verification code sent"} + + except smtplib.SMTPException as e: + raise HTTPException(status_code=500, detail=f"Failed to send email: {str(e)}") \ No newline at end of file diff --git a/app/core/config.py b/app/core/config.py index 68818c4..fedf166 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -1,6 +1,12 @@ +import os +from datetime import timedelta + class Settings: - PROJECT_NAME: str = "JieNote Backend" - VERSION: str = "1.0.0" + PROJECT_NAME: str = "JieNote Backend" # 项目名称 + VERSION: str = "1.0.0" # 项目版本 SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:coders007@47.93.172.156:3306/JieNote" # 替换为实际的用户名、密码和数据库名称 + SECRET_KEY: str = os.getenv("SECRET_KEY", "your_secret_key") # 替换为更安全的密钥 + ALGORITHM: str = "HS256" # JWT算法 + ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 # token过期时间 settings = Settings() \ No newline at end of file diff --git a/app/curd/user.py b/app/curd/user.py new file mode 100644 index 0000000..e0393ff --- /dev/null +++ b/app/curd/user.py @@ -0,0 +1,12 @@ +from sqlalchemy.orm import Session +from app.models.model import User + +def get_user_by_email(db: Session, email: str): + return db.query(User).filter(User.email == email).first() + +def create_user(db: Session, email: str, username: str,hashed_password: str): + new_user = User(email=email, username=username, password=hashed_password, avatar="app/static/avatar/default.jpg") + db.add(new_user) + db.commit() + db.refresh(new_user) + return new_user \ No newline at end of file diff --git a/app/db/session.py b/app/db/session.py index 5801d8e..7c9648b 100644 --- a/app/db/session.py +++ b/app/db/session.py @@ -3,5 +3,5 @@ from app.core.config import settings -engine = create_engine(settings.SQLALCHEMY_DATABASE_URI, pool_pre_ping=True) #连接mysql +engine = create_engine(settings.SQLALCHEMY_DATABASE_URL, pool_pre_ping=True) #连接mysql SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) \ No newline at end of file diff --git a/app/main.py b/app/main.py index e8f2e2f..078afc5 100644 --- a/app/main.py +++ b/app/main.py @@ -1,4 +1,5 @@ from fastapi import FastAPI +from app.api.v1.endpoints.auth import router as auth_router app = FastAPI() @@ -8,4 +9,6 @@ def read_root(): @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): - return {"item_id": item_id, "q": q} \ No newline at end of file + return {"item_id": item_id, "q": q} + +app.include_router(auth_router, prefix="/public", tags=["auth"]) \ No newline at end of file diff --git a/app/models/model.py b/app/models/model.py index 0f2959d..83db46a 100644 --- a/app/models/model.py +++ b/app/models/model.py @@ -1,6 +1,5 @@ -from sqlalchemy import Column, Integer, String, Boolean, Table, ForeignKey, UniqueConstraint +from sqlalchemy import Column, Integer, String, Boolean, Table, ForeignKey, UniqueConstraint, CheckConstraint from sqlalchemy.orm import relationship - from app.db.base_class import Base # 多对多关系表 @@ -8,54 +7,64 @@ 'user_group', Base.metadata, Column('user_id', Integer, ForeignKey('users.id'), primary_key=True), Column('group_id', Integer, ForeignKey('groups.id'), primary_key=True), - Column('is_admin', Boolean, default=False) # 是否是管理员 + Column('is_admin', Boolean, default=False) ) class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, index=True, autoincrement=True) - email = Column(String(30), index=True, nullable=False, unique=True) + email = Column(String(30), unique=True, index=True, nullable=False) username = Column(String(30), index=True, nullable=False) - hash_password = Column(String(60), nullable=False) - avatar = Column(String(100), nullable=True) # 头像的url + password = Column(String(60), nullable=False) + avatar = Column(String(100)) groups = relationship('Group', secondary=user_group, back_populates='users') + folders = relationship('Folder', back_populates='user') class Group(Base): __tablename__ = 'groups' id = Column(Integer, primary_key=True, index=True, autoincrement=True) - leader = Column(Integer) # the id of the leader + leader = Column(Integer) users = relationship('User', secondary=user_group, back_populates='groups') + folders = relationship('Folder', back_populates='group') -class Folder(Base): # 文件夹 +class Folder(Base): __tablename__ = 'folders' id = Column(Integer, primary_key=True, index=True, autoincrement=True) - name = Column(String(30)) + name = Column(String(30), nullable=False) + user_id = Column(Integer, ForeignKey('users.id')) group_id = Column(Integer, ForeignKey('groups.id')) + + # 关系定义 user = relationship('User', back_populates='folders') group = relationship('Group', back_populates='folders') + articles = relationship('Article', back_populates='folder') __table_args__ = ( UniqueConstraint('user_id', 'group_id', name='uq_user_group_folder'), - ) + ) class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True, index=True, autoincrement=True) - name = Column(String(30)) + name = Column(String(30), nullable=False) folder_id = Column(Integer, ForeignKey('folders.id')) + folder = relationship('Folder', back_populates='articles') + notes = relationship('Note', back_populates='article') + tags = relationship('Tag', back_populates='article') class Note(Base): __tablename__ = 'notes' id = Column(Integer, primary_key=True, index=True, autoincrement=True) - name = Column(String(30)) + content = Column(String(255)) # 为 content 字段指定长度 article_id = Column(Integer, ForeignKey('articles.id')) + article = relationship('Article', back_populates='notes') class Tag(Base): @@ -64,13 +73,5 @@ class Tag(Base): id = Column(Integer, primary_key=True, index=True, autoincrement=True) content = Column(String(30)) article_id = Column(Integer, ForeignKey('articles.id')) - article = relationship('Article', back_populates='tags') - -# 添加反向关系 -User.folders = relationship('Folder', back_populates='users') -Group.folders = relationship('Folder', back_populates='groups') -Folder.articles = relationship('Article', back_populates='folders') -Article.notes = relationship('Note', back_populates='articles') -Article.tags = relationship('Tag', back_populates='articles') - - + + article = relationship('Article', back_populates='tags') \ No newline at end of file diff --git a/app/schemas/auth.py b/app/schemas/auth.py new file mode 100644 index 0000000..9fa4bfc --- /dev/null +++ b/app/schemas/auth.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, EmailStr + +class UserCreate(BaseModel): + email: EmailStr + username: str + password: str + code: str + avatar: str | None = None + +class UserLogin(BaseModel): + email: EmailStr + password: str + +class UserSendCode(BaseModel): + email: EmailStr \ No newline at end of file diff --git a/app/static/avatar/default.jpg b/app/static/avatar/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..232972a9414af75f0514afc7fe9190db4b4e62b9 GIT binary patch literal 62637 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 VnSsA$r+-|g!T(~%BKvFZ{{Y0akFNj# literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 84b9803..c4c0d64 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,33 @@ alembic==1.15.2 annotated-types==0.7.0 anyio==4.9.0 +cffi==1.17.1 click==8.1.8 colorama==0.4.6 +cryptography==44.0.2 dotenv==0.9.9 fastapi==0.115.12 greenlet==3.1.1 h11==0.14.0 idna==3.10 +jwt==1.3.1 Mako==1.3.9 MarkupSafe==3.0.2 +numpy==2.2.4 +pandas==2.2.3 passlib==1.7.4 +pycparser==2.22 pydantic==2.11.2 pydantic_core==2.33.1 PyMySQL==1.1.1 +python-dateutil==2.9.0.post0 python-dotenv==1.1.0 +pytz==2025.2 +six==1.17.0 sniffio==1.3.1 SQLAlchemy==2.0.40 starlette==0.46.1 typing-inspection==0.4.0 typing_extensions==4.13.1 +tzdata==2025.2 uvicorn==0.34.0 From 889c538c54a9ed7ada2c576d043e8c9f70a3102a Mon Sep 17 00:00:00 2001 From: Fantasy lee <129943055+Fantasylee21@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:43:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[docs]:=20=E6=9B=B4=E6=96=B0requirements.tx?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/requirements.txt b/requirements.txt index c4c0d64..6ac98c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,14 @@ alembic==1.15.2 annotated-types==0.7.0 anyio==4.9.0 +bcrypt==4.3.0 cffi==1.17.1 click==8.1.8 colorama==0.4.6 cryptography==44.0.2 +dnspython==2.7.0 dotenv==0.9.9 +email_validator==2.2.0 fastapi==0.115.12 greenlet==3.1.1 h11==0.14.0 @@ -19,10 +22,12 @@ passlib==1.7.4 pycparser==2.22 pydantic==2.11.2 pydantic_core==2.33.1 +PyJWT==2.10.1 PyMySQL==1.1.1 python-dateutil==2.9.0.post0 python-dotenv==1.1.0 pytz==2025.2 +redis==5.2.1 six==1.17.0 sniffio==1.3.1 SQLAlchemy==2.0.40