diff --git a/app.py b/app.py
index 86b483a..277b549 100644
--- a/app.py
+++ b/app.py
@@ -1,6 +1,8 @@
from flask import Flask, redirect, url_for, render_template, request, flash
-from models import db, Contact
+from models import db, Contact, User
from forms import ContactForm
+from flask_login import LoginManager, current_user, login_user, login_required
+
# Flask
app = Flask(__name__)
@@ -8,13 +10,46 @@ app.config['SECRET_KEY'] = 'my secret'
app.config['DEBUG'] = False
# Database
-app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///book.sqlite'
-# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root@localhost/book'
+# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///book.sqlite'
+app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/hp'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
+# Login
+login_manager = LoginManager()
+login_manager.init_app(app)
+password = 'sintow2020@'
+
+
+@login_manager.user_loader
+#使用user_loader装饰器的回调函数非常重要,他将决定 user 对象是否在登录状态
+def user_loader(id):
+ #这个id参数的值是在 login_user(user)中传入的 user 的 id 属性
+ user = User()
+ return user
+
+
+@app.route('/login', methods=['GET', 'POST'])
+def login():
+ if request.method == 'GET':
+ return '''
+
+ '''
+ name = request.form.get('name')
+ if request.form.get('pw') == password:
+ user = User()
+ login_user(user)
+ return redirect(url_for('index'))
+ return redirect(url_for('login'))
@app.route("/")
+@login_required
def index():
'''
Home page
@@ -23,6 +58,7 @@ def index():
@app.route("/new_contact", methods=('GET', 'POST'))
+@login_required
def new_contact():
'''
Create new contact
@@ -37,14 +73,15 @@ def new_contact():
# User info
flash('Contact created correctly', 'success')
return redirect(url_for('contacts'))
- except:
+ except Exception as ex:
db.session.rollback()
- flash('Error generating contact.', 'danger')
+ flash('Error generating contact. {}'.format(ex), 'danger')
return render_template('web/new_contact.html', form=form)
@app.route("/edit_contact/", methods=('GET', 'POST'))
+@login_required
def edit_contact(id):
'''
Edit contact
@@ -70,6 +107,7 @@ def edit_contact(id):
@app.route("/contacts")
+@login_required
def contacts():
'''
Show alls contacts
@@ -79,6 +117,7 @@ def contacts():
@app.route("/search")
+@login_required
def search():
'''
Search
@@ -91,6 +130,7 @@ def search():
@app.route("/contacts/delete", methods=('POST',))
+@login_required
def contacts_delete():
'''
Delete contact
@@ -108,4 +148,4 @@ def contacts_delete():
if __name__ == "__main__":
- app.run(host="0.0.0.0")
+ app.run(host="0.0.0.0", port=5002, debug=True)
diff --git a/forms.py b/forms.py
index 164e00b..da67dd2 100644
--- a/forms.py
+++ b/forms.py
@@ -4,7 +4,10 @@ from wtforms.validators import DataRequired, Email, Length
class ContactForm(FlaskForm):
- name = StringField('Name', validators=[DataRequired(), Length(min=-1, max=80, message='You cannot have more than 80 characters')])
- surname = StringField('Surname', validators=[Length(min=-1, max=100, message='You cannot have more than 100 characters')])
- email = StringField('E-Mail', validators=[Email(), Length(min=-1, max=200, message='You cannot have more than 200 characters')])
- phone = StringField('Phone', validators=[Length(min=-1, max=20, message='You cannot have more than 20 characters')])
+ name = StringField('用户名', validators=[DataRequired(), Length(min=-1, max=30, message='用户名需要控制在30个字符以内')])
+ password = StringField('密码1(公开)', validators=[DataRequired(), Length(min=-1, max=30, message='密码1(公开)需要控制在30个字符以内')])
+ password2 = StringField('密码2(内部)', validators=[DataRequired(), Length(min=-1, max=30, message='密码2(内部)需要控制在30个字符以内')])
+
+ # surname = StringField('Surname', validators=[Length(min=-1, max=100, message='You cannot have more than 100 characters')])
+ # email = StringField('E-Mail', validators=[Email(), Length(min=-1, max=200, message='You cannot have more than 200 characters')])
+ # phone = StringField('Phone', validators=[Length(min=-1, max=20, message='You cannot have more than 20 characters')])
diff --git a/models.py b/models.py
index 51d3b0a..1fb5162 100644
--- a/models.py
+++ b/models.py
@@ -8,15 +8,21 @@ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Contact(db.Model):
-
-
- __tablename__ = 'contacts'
-
+ __tablename__ = 't_user'
id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(80), nullable=False)
- surname = db.Column(db.String(100), nullable=True)
- email = db.Column(db.String(200), nullable=True, unique=True)
- phone = db.Column(db.String(20), nullable=True, unique=False)
+ name = db.Column(db.String(30), nullable=True)
+ password = db.Column(db.String(30), nullable=True)
+ password2 = db.Column(db.String(30), nullable=True)
def __repr__(self):
return '' % self.name
+
+class User():
+ id = 1
+ username = 'admin'
+ password = 'na'
+ is_active = True
+ is_authenticated = True
+
+ def get_id(id):
+ return 1
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 5706461..3e67dd0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,20 @@
+click==7.1.2
+dnspython==2.0.0
+email-validator==1.1.1
Faker==0.7.11
Flask==1.0
+Flask-Login==0.5.0
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
-gunicorn
-Werkzeug==0.16
-email_validator
+gunicorn==20.0.4
+idna==2.10
+itsdangerous==1.1.0
+Jinja2==2.11.2
+MarkupSafe==1.1.1
+pkg-resources==0.0.0
+PyMySQL==0.10.1
+python-dateutil==2.8.1
+six==1.15.0
+SQLAlchemy==1.3.20
+Werkzeug==0.16.0
+WTForms==2.3.3
diff --git a/templates/layouts/master.html b/templates/layouts/master.html
index 6edf0a9..c9694d2 100644
--- a/templates/layouts/master.html
+++ b/templates/layouts/master.html
@@ -19,18 +19,18 @@
- Contact Manager
+ 用户管理
diff --git a/templates/web/contacts.html b/templates/web/contacts.html
index ff4aa6e..c52ffa2 100644
--- a/templates/web/contacts.html
+++ b/templates/web/contacts.html
@@ -5,10 +5,9 @@
- Name |
- Surname |
- E-Mail |
- Phone |
+ 用户名 |
+ 密码1(公开) |
+ 密码2(内部) |
|
@@ -16,16 +15,15 @@
{% for contact in contacts %}
{{ contact.name }} |
- {{ contact.surname }} |
- {{ contact.email }} |
- {{ contact.phone }} |
+ {{ contact.password }} |
+ {{ contact.password2 }} |
|