Browse Source

feat: 修改用户分组

SongZihuan 2 years ago
parent
commit
01c0e8adf5
4 changed files with 73 additions and 8 deletions
  1. 39 2
      app/auth.py
  2. 17 0
      templates/auth/change_role.html
  3. 1 0
      templates/auth/yours.html
  4. 16 6
      templates/base.html

+ 39 - 2
app/auth.py

@@ -4,7 +4,8 @@ from wtforms import (EmailField,
                      PasswordField,
                      PasswordField,
                      BooleanField,
                      BooleanField,
                      SubmitField,
                      SubmitField,
-                     ValidationError)
+                     ValidationError,
+                     StringField)
 from wtforms.validators import DataRequired, Length, Regexp, EqualTo
 from wtforms.validators import DataRequired, Length, Regexp, EqualTo
 from flask_login import current_user, login_user, logout_user, login_required
 from flask_login import current_user, login_user, logout_user, login_required
 from urllib.parse import urljoin
 from urllib.parse import urljoin
@@ -85,6 +86,21 @@ class ChangePasswdForm(AuthField):
             raise ValidationError("新旧密码不能相同")
             raise ValidationError("新旧密码不能相同")
 
 
 
 
+class ChangeRoleForm(AuthField):
+    email = AuthField.email_field("邮箱", "用户邮箱")
+    role = StringField("角色", description="用户角色", validators=[DataRequired(message="必须指定用户角色")])
+    submit = SubmitField("修改")
+
+    def validate_role(self, field):
+        if not Role.query.filter_by(name=field.data).first():
+            raise ValidationError("角色不存在")
+
+
+    def validate_email(self, field):
+        if not User.query.filter_by(email=field.data).first():
+            raise ValidationError("用户不存在")
+
+
 def __load_login_page(passwd_login_form=None, email_login_form=None, register_form=None,
 def __load_login_page(passwd_login_form=None, email_login_form=None, register_form=None,
                       on_passwd_login=True, on_email_login=False, on_register=False):
                       on_passwd_login=True, on_email_login=False, on_register=False):
     if not passwd_login_form:
     if not passwd_login_form:
@@ -350,4 +366,25 @@ def set_block_page():
     user.role = block
     user.role = block
     db.session.commit()
     db.session.commit()
 
 
-    return redirect(url_for("auth.user_page", user=user_id))
+    return redirect(url_for("auth.user_page", user=user_id))
+
+
+@auth.route('/role/user', methods=['GET', 'POST'])
+def change_role_page():
+    form = ChangeRoleForm()
+    if form.validate_on_submit():
+        user = User.query.filter_by(email=form.email.data).first()
+        if not user:
+            flash("用户不存在")
+            return redirect(url_for("auth.change_role_page"))
+
+        role = Role.query.filter_by(name=form.role.data).first()
+        if not role:
+            flash("角色不存在")
+            return redirect(url_for("auth.change_role_page"))
+
+        user.role = role
+        db.session.commit()
+        flash("用户分组修改成功")
+        return redirect(url_for("auth.change_role_page"))
+    return render_template("auth/change_role.html", form=form)

+ 17 - 0
templates/auth/change_role.html

@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+
+{% block title %} 用户 {% endblock %}
+
+{% block content %}
+    <div class="container">
+        <form method="post" action="{{ url_for("auth.change_role_page") }}" class="was-validated">
+            {{ form.hidden_tag() }}
+            {{ render_field(form.email) }}
+            {{ render_field(form.role) }}
+
+            <div class="text-end">
+                {{ form.submit(class='btn btn-success me-2') }}
+            </div>
+        </form>
+    </div>
+{% endblock %}

+ 1 - 0
templates/auth/yours.html

@@ -18,6 +18,7 @@
 
 
         <div class="text-end">
         <div class="text-end">
             <div class="btn-group">
             <div class="btn-group">
+                <a class="btn btn-outline-danger" href="{{ url_for("auth.change_role_page") }}"> 修改分组 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("archive.create_page") }}"> 创建新归档 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("archive.create_page") }}"> 创建新归档 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("comment.create_page") }}"> 创建新讨论 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("comment.create_page") }}"> 创建新讨论 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("auth.change_passwd_page") }}"> 修改密码 </a>
                 <a class="btn btn-outline-danger" href="{{ url_for("auth.change_passwd_page") }}"> 修改密码 </a>

+ 16 - 6
templates/base.html

@@ -1,6 +1,11 @@
 {% macro render_field(field) %}
 {% macro render_field(field) %}
-    <div class="form-floating my-3">
-        {{ field(class="form-control", placeholder=field.label.text) | safe }}
+    <div class="form-group form-floating my-3">
+        {% if not field.errors %}
+            {{ field(class="form-control", placeholder=field.label.text) | safe }}
+        {% else %}
+            {{ field(class="form-control", placeholder=field.label.text, value="") | safe }}
+        {% endif %}
+
         {{ field.label }}
         {{ field.label }}
         {% for error in field.errors %}
         {% for error in field.errors %}
             <div class="invalid-feedback"> {{ error }} </div>
             <div class="invalid-feedback"> {{ error }} </div>
@@ -9,8 +14,13 @@
 {% endmacro %}
 {% endmacro %}
 
 
 {% macro render_text_field(field) %}
 {% macro render_text_field(field) %}
-    <div class="form-floating my-3">
-        {{ field(class="form-control", placeholder=field.label.text, style="height: 40vh") | safe }}
+    <div class="form-group form-floating my-3">
+        {% if not field.errors %}
+            {{ field(class="form-control", placeholder=field.label.text, style="height: 40vh") | safe }}
+        {% else %}
+            {{ field(class="form-control", placeholder=field.label.text, style="height: 40vh", value="") | safe }}
+        {% endif %}
+
         {{ field.label }}
         {{ field.label }}
         {% for error in field.errors %}
         {% for error in field.errors %}
             <div class="invalid-feedback"> {{ error }} </div>
             <div class="invalid-feedback"> {{ error }} </div>
@@ -19,10 +29,10 @@
 {% endmacro %}
 {% endmacro %}
 
 
 {% macro render_select_field(field) %}
 {% macro render_select_field(field) %}
-    <div class="my-3">
+    <div class="form-group my-3">
         {{ field(class="form-select") | safe }}
         {{ field(class="form-select") | safe }}
         {% for error in field.errors %}
         {% for error in field.errors %}
-            <div class="invalid-feedback"> {{ error }} </div>
+            <div class="invalid-feedback d-block"> {{ error }} </div>
         {% endfor %}
         {% endfor %}
     </div>
     </div>
 {% endmacro %}
 {% endmacro %}