Bladeren bron

feat: 关注与取消关注

SongZihuan 2 jaren geleden
bovenliggende
commit
9bb94dd40b
3 gewijzigde bestanden met toevoegingen van 51 en 2 verwijderingen
  1. 39 1
      app/auth.py
  2. 7 0
      app/db.py
  3. 5 1
      templates/auth/user.html

+ 39 - 1
app/auth.py

@@ -8,9 +8,10 @@ from wtforms import (EmailField,
 from wtforms.validators import DataRequired, Length, Regexp, EqualTo
 from flask_login import current_user, login_user, logout_user, login_required
 from urllib.parse import urljoin
+from sqlalchemy.exc import IntegrityError
 
 
-from .db import db, User, Role
+from .db import db, User, Role, Follow
 from .logger import Logger
 from .mail import send_msg
 
@@ -293,3 +294,40 @@ def followed_page():
                            items=[i.followed for i in pagination.items],
                            pagination=pagination,
                            title="关注")
+
+
+@auth.route("/followed/follow")
+def set_follow_page():
+    user_id = request.args.get("user", 1, type=int)
+    if user_id == current_user.id:
+        return abort(404)
+
+    user = User.query.filter_by(id=user_id).first()
+    if not user:
+        return abort(404)
+
+    try:
+        db.session.add(Follow(follower=current_user, followed=user))
+        db.session.commit()
+    except IntegrityError:
+        flash("不能重复关注用户")
+    else:
+        flash("关注用户成功")
+
+    return redirect(url_for("auth.user_page", user=user_id))
+
+
+@auth.route("/followed/unfollow")
+def set_unfollow_page():
+    user_id = request.args.get("user", 1, type=int)
+    if user_id == current_user.id:
+        return abort(404)
+
+    user = User.query.filter_by(id=user_id).first()
+    if not user:
+        return abort(404)
+
+    Follow.query.filter_by(follower=current_user, followed=user).delete()
+    flash("取消关注用户成功")
+
+    return redirect(url_for("auth.user_page", user=user_id))

+ 7 - 0
app/db.py

@@ -49,6 +49,13 @@ class User(db.Model, UserMixin):
     def followed_count(self):
         return self.followed.count()
 
+    def in_followed(self, user):
+        user_id = user.id
+        if Follow.query.filter_by(followed_id=user_id, follower_id=self.id).first():
+            return True
+        return False
+
+
     @staticmethod
     def register_creat_token(email: str, passwd_hash: str):
         s = Serializer(conf["SECRET_KEY"])

+ 5 - 1
templates/auth/user.html

@@ -15,7 +15,11 @@
 
         <div class="text-end">
             <div class="btn-group">
-                <a class="btn btn-outline-danger" href="#"> 关注 </a>
+                {% if current_user.in_followed(user) %}
+                    <a class="btn btn-outline-danger" href="{{ url_for("auth.set_unfollow_page", user=user.id) }}"> 取消关注 </a>
+                {% else %}
+                    <a class="btn btn-outline-danger" href="{{ url_for("auth.set_follow_page", user=user.id) }}"> 关注 </a>
+                {% endif %}
             </div>
         </div>