Browse Source

feat: 用户重置

SongZihuan 3 years ago
parent
commit
2889303017
3 changed files with 51 additions and 15 deletions
  1. 24 2
      app/test.py
  2. 3 0
      app/user.py
  3. 24 13
      templates/test.html

+ 24 - 2
app/test.py

@@ -2,7 +2,7 @@ from flask import blueprints, render_template, current_app, abort, redirect, url
 from flask import send_file
 from flask import send_file
 from flask_login import current_user, login_required
 from flask_login import current_user, login_required
 from flask_wtf import FlaskForm
 from flask_wtf import FlaskForm
-from wtforms import StringField, SubmitField, BooleanField
+from wtforms import StringField, SubmitField, BooleanField, PasswordField
 from wtforms.validators import DataRequired, Length
 from wtforms.validators import DataRequired, Length
 from app.user import UserWordDataBase
 from app.user import UserWordDataBase
 from itsdangerous import URLSafeTimedSerializer
 from itsdangerous import URLSafeTimedSerializer
@@ -22,10 +22,17 @@ class SearchForm(FlaskForm):
     submit = SubmitField("Search")
     submit = SubmitField("Search")
 
 
 
 
+class ResetForm(FlaskForm):
+    name = StringField("User name", validators=[DataRequired(), Length(1, 32)])
+    passwd = PasswordField("Passwd", validators=[DataRequired(), Length(4, 32)])
+    submit = SubmitField("Reset")
+
+
 def __load_word(word):
 def __load_word(word):
     user: UserWordDataBase = current_user
     user: UserWordDataBase = current_user
     box, box_sum = user.get_box_count()
     box, box_sum = user.get_box_count()
     search_from = SearchForm()
     search_from = SearchForm()
+    reset_form = ResetForm()
     if word is None:
     if word is None:
         return render_template("test.html", word=word, len=len,
         return render_template("test.html", word=word, len=len,
                                box=box, box_sum=box_sum,
                                box=box, box_sum=box_sum,
@@ -34,7 +41,7 @@ def __load_word(word):
     word_id = serializer.dumps({"word": word.name})
     word_id = serializer.dumps({"word": word.name})
     return render_template("test.html", word=word, len=len,
     return render_template("test.html", word=word, len=len,
                            word_id=word_id, box=box, box_sum=box_sum,
                            word_id=word_id, box=box, box_sum=box_sum,
-                           search=search_from, have_word=True)  # 需要使用len函数
+                           search=search_from, have_word=True, reset=reset_form)
 
 
 
 
 @test.route("/")
 @test.route("/")
@@ -169,3 +176,18 @@ def download_table(file_type: str):
         return abort(404)
         return abort(404)
     df_io.seek(0, io.SEEK_SET)
     df_io.seek(0, io.SEEK_SET)
     return send_file(df_io, attachment_filename=f"{user.user}.henglish.{file_type}", as_attachment=True)
     return send_file(df_io, attachment_filename=f"{user.user}.henglish.{file_type}", as_attachment=True)
+
+
+@test.route("/reset", methods=["POST"])
+@login_required
+def reset_user():
+    reset = ResetForm()
+    if reset.validate_on_submit():
+        user: UserWordDataBase = current_user
+        if not user.check_passwd(reset.passwd.data):
+            flash("Passwd error.")
+        else:
+            flash("User reset")
+            user.reset()
+        return redirect(url_for("test.question"))
+    abort(404)

+ 3 - 0
app/user.py

@@ -45,6 +45,9 @@ class UserWordDataBase(WordDatabase, UserMixin):
             ret[i[1] - 1] = i[0]
             ret[i[1] - 1] = i[0]
         return ret, sum(ret)
         return ret, sum(ret)
 
 
+    def reset(self):
+        self.update(table="Word", kw={"box": "1"}, where="1")
+
 
 
 def check_base_db():
 def check_base_db():
     if os.path.exists(os.path.join(conf["DB_TEMPLATE"], "base.db")):
     if os.path.exists(os.path.join(conf["DB_TEMPLATE"], "base.db")):

+ 24 - 13
templates/test.html

@@ -110,22 +110,33 @@
                         </div>
                         </div>
                     </div>
                     </div>
 
 
-                    <div id="ResetModal" class="modal fade" role="dialog" aria-hidden="true">
-                        <div class="modal-dialog">
-                            <div class="modal-content">
-                                <div class="modal-header">
-                                    <h4 class="modal-title"> Reset user? </h4>
-                                </div>
-                                <div class="modal-body">
-                                    <p> Are you sure you want to reset '{{ current_user.user }}' ? </p>
-                                </div>
-                                <div class="modal-footer">
-                                    <a class="btn btn-danger" href="" > Sure </a>
-                                    <a class="btn btn-secondary" data-dismiss="modal"> No </a>
+                    <form method="post" action="{{ url_for("test.reset_user") }}">
+                        {{ reset.hidden_tag() }}
+                        <div id="ResetModal" class="modal fade" role="dialog" aria-hidden="true">
+                            <div class="modal-dialog">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <h4 class="modal-title"> Reset user? </h4>
+                                    </div>
+                                    <div class="modal-body">
+                                        <p> Are you sure you want to reset '{{ current_user.user }}' ? </p>
+                                        <div class="form-group text-left">
+                                            {{ reset.name.label }}
+                                            {{ reset.name(class="form-control") }}
+                                        </div>
+                                        <div class="form-group text-left">
+                                            {{ reset.passwd.label }}
+                                            {{ reset.passwd(class="form-control") }}
+                                        </div>
+                                    </div>
+                                    <div class="modal-footer">
+                                        {{ reset.submit(class='btn btn-info mr-2') }}
+                                        <a class="btn btn-secondary" data-dismiss="modal"> No </a>
+                                    </div>
                                 </div>
                                 </div>
                             </div>
                             </div>
                         </div>
                         </div>
-                    </div>
+                    </form>
 
 
                     <div class="col-12 col-lg-6 offset-lg-3 text-left">
                     <div class="col-12 col-lg-6 offset-lg-3 text-left">
                         <p class="h4 mb-2"> User: {{ current_user.user }} </p>
                         <p class="h4 mb-2"> User: {{ current_user.user }} </p>