├── .gitattributes ├── README.md ├── app ├── __init__.py ├── controllers │ ├── __init__.py │ ├── guest_feedback.py │ ├── loginout.py │ ├── post.py │ ├── search.py │ └── writer.py ├── markdown_html.py ├── models.py ├── sm.py ├── static │ ├── Upload_Files │ │ ├── article │ │ │ └── .ignoredir │ │ ├── img │ │ │ ├── 1.jpg │ │ │ └── header2.jpg │ │ └── markdown │ │ │ └── 1.md │ ├── audio │ │ └── 2.mp3 │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ └── my.css │ ├── font │ │ ├── STZHONGS.woff │ │ ├── addurl.png │ │ ├── control.svg │ │ ├── ios-create.svg │ │ ├── log-out.svg │ │ └── more2.png │ ├── img │ │ ├── big-home.jpg │ │ ├── grand-sky.jpg │ │ ├── header.jpg │ │ ├── header2.jpg │ │ ├── loding2.gif │ │ ├── logo.jpg │ │ └── logo.png │ └── js │ │ ├── bootstrap.bundle.js │ │ ├── bootstrap.bundle.js.map │ │ ├── bootstrap.bundle.min.js │ │ ├── bootstrap.bundle.min.js.map │ │ ├── bootstrap.js │ │ ├── bootstrap.js.map │ │ ├── bootstrap.min.js │ │ ├── bootstrap.min.js.map │ │ ├── jquery-2.1.1.min.js │ │ └── my.js └── templates │ ├── Post_Details.html │ ├── addurl.html │ ├── base.html │ ├── error.html │ ├── index.html │ ├── login.html │ ├── root.html │ ├── search.html │ ├── tag_details.html │ ├── test.html │ └── writer.html ├── manage.py └── requirements.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=python 2 | *.css linguist-language=python 3 | *.html linguist-language=python 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blog-flask 2 | ## 自己用Flask写博客系统,并不断优化中更新中 3 | 博客地址:http://blog.wayen.tech 4 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/1 12:07 6 | author: peak 7 | description: 8 | """ 9 | from flask import Flask, redirect, url_for, render_template, session, g, jsonify, request 10 | from config import DevConfig 11 | from app.models import db, User, Comment, Post, Tag, tags, Access, Like 12 | from controllers.post import post 13 | from controllers.writer import writer 14 | from controllers.loginout import loginout 15 | from controllers.search import search 16 | from controllers.guest_feedback import guest_feedback 17 | from sqlalchemy import not_ 18 | import json 19 | 20 | app = Flask(__name__) 21 | app.config.from_object(DevConfig) 22 | 23 | db.init_app(app) 24 | 25 | @app.route('/', methods=['POST', 'GET']) 26 | def index(): 27 | secret = Tag.query.filter(Tag.Title == "私密").first() # 查询私密tag对象 28 | index_tag = Tag.query.filter(Tag.Title != "私密").all() 29 | if request.method == 'POST': 30 | page = request.form.get('page') 31 | page = int(page) 32 | pagination = Post.query.filter(Post.User_Id == 1, not_(Post.tags.contains(secret))).order_by(Post.Id.desc()).paginate(page, per_page=6, error_out=False) 33 | user_Post = pagination.items 34 | lenth = len(user_Post) 35 | tem = [] 36 | for x in user_Post: 37 | tem.append(x.to_json()) 38 | print jsonify(tem) 39 | return jsonify(objects=tem) 40 | 41 | if request.method == 'GET': 42 | # 记录访问信息 43 | ip = request.remote_addr 44 | access_forsql = Access() 45 | access_forsql.Ip = ip 46 | db.session.add(access_forsql) 47 | db.session.commit() 48 | 49 | # 查询首页文章列表 50 | 51 | page = request.form.get('page', 1) 52 | page = int(page) 53 | pagination = Post.query.filter(Post.User_Id == 1, not_(Post.tags.contains(secret))).order_by(Post.Id.desc()).paginate(page, per_page=6, error_out=False) 54 | user_Post = pagination.items 55 | lenth = len(user_Post) 56 | 57 | # 站点信息 58 | website_info = {} # 创建空站点信息字典 59 | all_access = Access.query.count() # 查询截至当前访问量 60 | articles_count = Post.query.count() # 查询文章总量 61 | like_count = Like.query.filter(Like.Like_Type == 1).count() # 查询点赞总数 62 | cancellike = Like.query.filter(Like.Like_Type == 0).count() 63 | like_count = like_count - cancellike 64 | website_info['all_access'] = all_access 65 | website_info['articles_count'] = articles_count 66 | website_info['like_count'] = like_count 67 | 68 | return render_template('index.html', user_Post=user_Post, lenth=lenth, pagination=pagination, website_info=website_info, index_tag=index_tag, title="TF'S BLOG") 69 | 70 | @app.before_request 71 | def check_user(): 72 | if 'user_name' in session: 73 | g.current_user_name = session['user_name'] 74 | user = User.query.filter(User.Name == session['user_name']).first() 75 | g.current_user = user 76 | 77 | else: 78 | g.current_user_name = json.dumps(None) 79 | g.current_user = None 80 | 81 | app.register_blueprint(post) 82 | app.register_blueprint(writer) 83 | app.register_blueprint(loginout) 84 | app.register_blueprint(search) 85 | app.register_blueprint(guest_feedback) 86 | 87 | if __name__ == '__main__': 88 | app.run(host='localhost', port=80) 89 | -------------------------------------------------------------------------------- /app/controllers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/controllers/__init__.py -------------------------------------------------------------------------------- /app/controllers/guest_feedback.py: -------------------------------------------------------------------------------- 1 | from flask import Blueprint, render_template, request, jsonify 2 | from app.models import Post, Like, db 3 | 4 | guest_feedback = Blueprint( 5 | 'guest_feedback', 6 | __name__ 7 | ) 8 | 9 | @guest_feedback.route('/like', methods=['POST']) 10 | def like(): 11 | like_forsql = Like() 12 | like_forsql.Like_Type = 1 13 | db.session.add(like_forsql) 14 | db.session.commit() 15 | like_count = Like.query.filter(Like.Like_Type == 1).count() 16 | cancellike = Like.query.filter(Like.Like_Type == 0).count() 17 | like_count = like_count - cancellike 18 | back_data = {'like_count': like_count} 19 | return jsonify(back_data) 20 | 21 | @guest_feedback.route('/cancel_like', methods=['POST']) 22 | def cancel_like(): 23 | like_forsql = Like() 24 | like_forsql.Like_Type = 0 25 | db.session.add(like_forsql) 26 | db.session.commit() 27 | like_count = Like.query.filter(Like.Like_Type == 1).count() 28 | cancellike = Like.query.filter(Like.Like_Type == 0).count() 29 | like_count = like_count - cancellike 30 | back_data = {'like_count': like_count} 31 | return jsonify(back_data) -------------------------------------------------------------------------------- /app/controllers/loginout.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/30 12:45 6 | author: peak 7 | description: 8 | """ 9 | 10 | from flask import Flask, Blueprint, render_template, request, flash, session, redirect, url_for, g 11 | import datetime, os 12 | from app.models import db, User, Comment, Post, Tag, tags 13 | 14 | from werkzeug.utils import secure_filename 15 | 16 | loginout = Blueprint( 17 | 'loginout', 18 | __name__ 19 | ) 20 | 21 | 22 | @loginout.route('/login/', methods=['GET', 'POST']) 23 | def login(): 24 | if request.method == 'POST': 25 | Name = request.form.get("name") 26 | Name = Name.encode("utf-8") 27 | Password = request.form.get("password") 28 | user = User.query.filter(User.Email == Name, User.Password == Password).first() 29 | if user: 30 | session['user_name'] = user.Name 31 | g.current_user = user 32 | flash(u"登陆成功啦! ^_^", category="success") 33 | return redirect('/root') 34 | else: 35 | flash(u"登陆失败,请重试! -_-||", category="warning") 36 | return render_template('login.html') 37 | 38 | @loginout.route("/logout", methods=['GET']) 39 | def logout(): 40 | session.pop('user_name', None) 41 | g.current_user = None 42 | return redirect('/') -------------------------------------------------------------------------------- /app/controllers/post.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/2 13:41 6 | author: peak 7 | description: 8 | """ 9 | from flask import Flask, Blueprint, render_template, request, flash, session, redirect, url_for, g 10 | import datetime, os 11 | from app.models import db, User, Comment, Post, Tag, tags 12 | from app.markdown_html import switch_html 13 | from werkzeug.utils import secure_filename 14 | from sqlalchemy import not_ 15 | from app.sm import mail_admin 16 | 17 | post = Blueprint( 18 | 'post', 19 | __name__ 20 | ) 21 | 22 | @post.route('/post///', methods=['GET', 'POST']) 23 | def postdetails(year,month,id): 24 | lenth = 0 25 | comments = Comment.query.filter(Comment.Post_Id == id).order_by(Comment.Id.desc()).all() 26 | lenth = len(comments) 27 | 28 | 29 | content = "" 30 | posts = Post.query.filter(Post.User_Id == 1, Post.Id == id).first() 31 | post_file = posts.Content_Name 32 | basepath = os.path.abspath(os.path.dirname(__file__)) # 当前文件所在目录 33 | parentdir = os.path.dirname(basepath) # 父级目录 34 | datetimes = posts.Publish_Date 35 | # now = str(datetimes.year)+"-"+str(datetimes.month)+"-"+str(datetimes.day) 36 | # newdirname = now + "_" + posts.Title 37 | if post_file != None: 38 | post_file_url = os.path.join(parentdir, 'static/Upload_Files/article', posts.Dir_Name, secure_filename(post_file)) 39 | content = switch_html(post_file_url) 40 | 41 | 42 | 43 | if request.method == "POST": 44 | # 判断称呼是否合法 45 | if request.form.get("nickname") == u"落风" and g.current_user_name != u"落风": 46 | flash(u"评论的称呼已被博主使用了哦,换个称呼重试吧! -_-||", category="warning") 47 | return render_template('Post_Details.html', posts=posts, content=content, lenth=lenth, comments=comments, title=posts.Title) 48 | 49 | commentforsql = Comment() 50 | commentforsql.Name = request.form.get("nickname") 51 | commentforsql.Email = request.form.get("email") 52 | commentforsql.text = request.form.get("leavemessage") 53 | commentforsql.Post_Id = id 54 | 55 | 56 | 57 | db.session.add(commentforsql) 58 | db.session.commit() 59 | 60 | comments = Comment.query.filter(Comment.Post_Id == id).order_by(Comment.Id.desc()).all() 61 | lenth = len(comments) 62 | return render_template('Post_Details.html', posts=posts, content=content, lenth=lenth, comments=comments, title=posts.Title) 63 | 64 | return render_template('Post_Details.html', posts=posts, content=content, lenth=lenth, comments=comments, title=posts.Title) 65 | 66 | @post.route('/tag/', methods=['GET', 'POST']) 67 | def tag(tagid): 68 | if request.method == 'POST': 69 | page = request.form.get('page') 70 | page = int(page) 71 | TAG = Tag.query.filter(Tag.Id == tagid).first() 72 | SecretTag = Tag.query.filter(Tag.Title == "私密").first() 73 | POST = TAG.posts 74 | pagination = POST.filter(not_(Post.tags.contains(SecretTag))).order_by(Post.Id.desc()).paginate(page, per_page=6, error_out=False) 75 | print len(pagination.items) 76 | user_Post = pagination.items 77 | lenth = len(user_Post) 78 | tem = [] 79 | for x in user_Post: 80 | tem.append(x.to_json()) 81 | print jsonify(tem) 82 | return jsonify(objects = tem) 83 | 84 | if request.method == 'GET': 85 | page = request.form.get('page', 1) 86 | page = int(page) 87 | TAG = Tag.query.filter(Tag.Id == tagid).first() 88 | SecretTag = Tag.query.filter(Tag.Title == "私密").first() 89 | POST = TAG.posts 90 | pagination = POST.filter(not_(Post.tags.contains(SecretTag))).order_by(Post.Id.desc()).paginate(page, per_page=6, error_out=False) 91 | user_Post = pagination.items 92 | lenth = len(user_Post) 93 | return render_template('tag_details.html', user_Post=user_Post, lenth=lenth, pagination=pagination, title=TAG.Title) 94 | 95 | @post.route('/addurl', methods=['GET', 'POST']) 96 | def addurl(): 97 | if request.method == 'POST': 98 | urls = request.form.get("urls") 99 | emails = request.form.get("emails") 100 | leavemes = request.form.get("leavemessage") 101 | leavemes = leavemes.encode('utf-8') 102 | try: 103 | mail_admin(urls, emails, leavemes) 104 | except: 105 | flash(u"提交失败,请重试! -_-||", category="warning") 106 | # return render_template('addurl.html') 107 | else: 108 | flash(u"提交成功啦,主人已经收到你的请求了哦! ^_^", category="success") 109 | # return render_template('addurl.html') 110 | return render_template('addurl.html') -------------------------------------------------------------------------------- /app/controllers/search.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/30 12:45 6 | author: peak 7 | description: 8 | """ 9 | 10 | from flask import Blueprint, render_template, request, jsonify 11 | from app.models import Post 12 | 13 | search = Blueprint( 14 | 'search', 15 | __name__ 16 | ) 17 | 18 | 19 | @search.route('/search/', methods=['GET', 'POST']) 20 | def search_post(): 21 | if request.method == 'POST': 22 | page = request.form.get('page') 23 | keyword = request.form.get('keyword') 24 | page = int(page) 25 | search_result = Post.query.filter(Post.Title.like('%' + keyword + '%')) \ 26 | .order_by(Post.Id.desc()).paginate(page, per_page=2, error_out=False) 27 | articles = search_result.items 28 | lenth = len(articles) 29 | tem = [] 30 | for x in articles: 31 | tem.append(x.to_json()) 32 | print jsonify(tem) 33 | return jsonify(objects=tem) 34 | if request.method == 'GET': 35 | keyword = request.args.get("keyword") 36 | search_result = Post.query.filter(Post.Title.like('%' + keyword + '%'))\ 37 | .order_by(Post.Id.desc()).paginate(1, per_page=2, error_out=False) 38 | articles = search_result.items 39 | tem = [] 40 | lenth=0 41 | if articles is not None: 42 | lenth = len(articles) 43 | for x in articles: 44 | tem.append(x.to_json()) 45 | print jsonify(tem) 46 | return render_template('search.html', articles=articles, search_result=search_result, lenth=lenth, keyword=keyword) 47 | -------------------------------------------------------------------------------- /app/controllers/writer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/10 15:58 6 | author: peak 7 | description: 8 | """ 9 | 10 | from flask import Flask, Blueprint, render_template, request, flash, session, redirect, url_for, g 11 | import datetime, os 12 | from app.models import db, User, Comment, Post, Tag, tags 13 | 14 | from werkzeug.utils import secure_filename 15 | 16 | writer = Blueprint( 17 | 'writer', 18 | __name__ 19 | ) 20 | 21 | @writer.before_request 22 | def checklogin(): 23 | if g.current_user == None: 24 | return redirect('/login') 25 | 26 | 27 | 28 | @writer.route('/root', methods=['GET', 'POST']) 29 | def root(): 30 | return render_template('root.html') 31 | 32 | 33 | 34 | @writer.route('/writer/', methods=['GET', 'POST']) 35 | def write(uid): 36 | if g.current_user == None: 37 | return render_template('error.html') 38 | elif g.current_user.Id != uid: 39 | return render_template('error.html') 40 | else: 41 | if request.method == 'POST': 42 | new_title = request.form.get("title") 43 | new_cover = request.files['cover'] 44 | new_markdown = request.files['markdown'] 45 | if request.files.has_key("music"): 46 | new_music = request.files['music'] 47 | else: 48 | new_music = None 49 | new_tag = request.form.get("tag") 50 | # 查询是否title重名 51 | if Post.query.filter(Post.Title == new_title and Post.User_Id == uid).first() is not None: 52 | flash(u"文章标题已经存在,换个标题吧! -_-", category="warning") 53 | return render_template('writer.html') 54 | # 第一次提交数据库 55 | post_forsql = Post() 56 | post_forsql.Title = new_title 57 | post_forsql.User_Id = uid 58 | # 处理tag 59 | tag_list = new_tag.split() 60 | tag_object = [] 61 | for i in tag_list: 62 | if Tag.query.filter(Tag.Title == i).first() is None: 63 | # 若是新的tag首先创建新的tag 64 | tag_forsql = Tag() 65 | tag_forsql.Title = i 66 | db.session.add(tag_forsql) 67 | db.session.commit() 68 | tag_object.append(Tag.query.filter(Tag.Title == i).first()) 69 | post_forsql.tags = tag_object 70 | db.session.add(post_forsql) 71 | db.session.commit() 72 | 73 | # 获取初始文件名 74 | new_cover_name = new_cover.filename 75 | new_cover_point = new_cover_name.rindex(".") 76 | new_markdown_name = new_markdown.filename 77 | new_markdown_point = new_markdown_name.rindex(".") 78 | 79 | # 查询ID并改文件名 80 | post_checksql = Post.query.filter(Post.Title == new_title and Post.User_Id == uid).first() 81 | pid = post_checksql.Id 82 | new_cover_name = str(pid) + new_cover_name[new_cover_point:] 83 | new_markdown_name = str(pid) + new_markdown_name[new_markdown_point:] 84 | 85 | 86 | # 获取目录 87 | basepath = os.path.abspath(os.path.dirname(__file__)) # 当前文件所在目录 88 | parentdir = os.path.dirname(basepath) # 父级目录 89 | # 新建目录 90 | datetimes = post_checksql.Publish_Date 91 | now = str(datetimes.year)+"-"+str(datetimes.month)+"-"+str(datetimes.day) 92 | newdirname = now + "_" + post_checksql.Title 93 | new_dirpath = os.path.join(parentdir, 'static/Upload_Files/article', newdirname) 94 | os.mkdir(new_dirpath) 95 | # 保存封面图 96 | upload_path1 = os.path.join(parentdir, 'static/Upload_Files/article', newdirname, secure_filename(new_cover_name)) 97 | new_cover.save(upload_path1) 98 | # 保存markdown文件 99 | upload_path2 = os.path.join(parentdir, 'static/Upload_Files/article', newdirname, secure_filename(new_markdown_name)) 100 | new_markdown.save(upload_path2) 101 | # 保存音乐 102 | if new_music is not None: 103 | upload_path3 = os.path.join(parentdir, 'static/Upload_Files/article', newdirname, secure_filename(new_music.filename)) 104 | new_markdown.save(upload_path3) 105 | 106 | 107 | 108 | 109 | # 第二次提交数据库 110 | post_checksql.Cover_Picture_Name = new_cover_name 111 | post_checksql.Content_Name = new_markdown_name 112 | post_checksql.Dir_Name = newdirname 113 | if new_music is not None: 114 | post_checksql.Music_Name = new_music.filename 115 | db.session.add(post_checksql) 116 | db.session.commit() 117 | 118 | flash(u"提交成功! -_-", category="success") 119 | 120 | return render_template('writer.html') 121 | 122 | -------------------------------------------------------------------------------- /app/markdown_html.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/2 14:14 6 | author: peak 7 | description: 8 | """ 9 | import markdown 10 | 11 | 12 | 13 | css = u''' 14 | 15 | 405 | ''' 406 | 407 | def switch_html(file): 408 | with open(file, 'rb') as f: 409 | try: 410 | text = f.read() 411 | text = text.decode('utf-8') 412 | html = markdown.markdown(text) 413 | newhtml = html 414 | except: 415 | return None 416 | else: 417 | return css+newhtml 418 | 419 | -------------------------------------------------------------------------------- /app/models.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | """ 4 | file:.py 5 | date:2018/12/1 12:09 6 | author: peak 7 | description: 8 | """ 9 | from flask_sqlalchemy import SQLAlchemy 10 | import datetime, os, time 11 | 12 | db = SQLAlchemy() 13 | 14 | class User(db.Model): 15 | __tablename__ = 'User' #表名字默认是类名字的小写版本(如果没有此语句) 16 | 17 | Id = db.Column(db.Integer(), primary_key=True) 18 | Name = db.Column(db.String(255)) 19 | Password = db.Column(db.String(255)) 20 | Email = db.Column(db.String(255)) 21 | Register_Date = db.Column(db.DateTime, default=datetime.datetime.now) 22 | 23 | tags = db.Table('Post_Tags', 24 | db.Column('Id', db.Integer, primary_key=True), 25 | db.Column('post_id', db.Integer, db.ForeignKey('Post.Id'), ), 26 | db.Column('tag_id', db.Integer, db.ForeignKey('Tag.Id')) 27 | 28 | ) 29 | 30 | class Post(db.Model): 31 | __tablename__ = 'Post' 32 | 33 | Id = db.Column(db.Integer(), primary_key=True) 34 | Title = db.Column(db.String(255), nullable=False) # 文章标题 35 | Publish_Date = db.Column(db.DateTime, default=datetime.datetime.now, nullable=False) # 文章日期 36 | Cover_Picture_Name = db.Column(db.String(255)) # 封面图片名字 37 | Content_Name = db.Column(db.String(255)) # 内容markdown文件名字 38 | Music_Name = db.Column(db.String(255)) # 音乐名,可为空 39 | Dir_Name = db.Column(db.String(255)) # 文章目录 40 | 41 | User_Id = db.Column(db.Integer(), db.ForeignKey('User.Id')) # 作者 42 | user = db.relationship('User', foreign_keys='Post.User_Id') 43 | 44 | tags = db.relationship( 45 | 'Tag', 46 | secondary=tags, 47 | backref=db.backref('posts', lazy='dynamic') 48 | ) 49 | 50 | # Comments = db.Column(db.Integer(), db.ForeignKey('Comments.Id')) # 评论 51 | # comment = db.relationship('Comments', foreign_keys='Comments.Id') 52 | 53 | def to_json(self): 54 | Publish_date = str(self.Publish_Date.year)+"-"+str(self.Publish_Date.month)+"-"+str(self.Publish_Date.day)+" "+str(self.Publish_Date.hour)+":"+str(self.Publish_Date.minute)+":"+str(self.Publish_Date.second) 55 | Publish_year = str(self.Publish_Date.year) 56 | Publish_month = str(self.Publish_Date.month) 57 | return { 58 | 'Title': self.Title, 59 | 'Publish_Date': Publish_date, 60 | 'Publish_year': Publish_year, 61 | 'Publish_month': Publish_month, 62 | 'Dir_Name': self.Dir_Name, 63 | 'Cover_Picture_Name': self.Cover_Picture_Name, 64 | 'Id': self.Id 65 | } 66 | 67 | class Comment(db.Model): 68 | __tablename__ = 'Comment' 69 | 70 | Id = db.Column(db.Integer(), primary_key=True) 71 | Name = db.Column(db.String(255), nullable=False) 72 | Email = db.Column(db.String(255), nullable=False) 73 | text = db.Column(db.Text()) 74 | Date = db.Column(db.DateTime, default=datetime.datetime.now, nullable=False) # 日期 75 | Post_Id = db.Column(db.Integer(), db.ForeignKey('Post.Id')) 76 | 77 | class Tag(db.Model): 78 | __tablename__ = 'Tag' 79 | 80 | Id = db.Column(db.Integer(), primary_key=True) 81 | Title = db.Column(db.String(255), nullable=False) 82 | 83 | class Access(db.Model): 84 | __tablename__ = 'Access' # 表名字默认是类名字的小写版本(如果没有此语句) 85 | 86 | Id = db.Column(db.Integer(), primary_key=True) 87 | Access_Date = db.Column(db.DateTime, default=datetime.datetime.now, nullable=False) 88 | Ip = db.Column(db.String(255)) 89 | 90 | class Like(db.Model): 91 | __tablename__ = 'Like' 92 | Id = db.Column(db.Integer(), primary_key=True) 93 | Like_Date = db.Column(db.DateTime, default=datetime.datetime.now, nullable=False) 94 | Like_Type = db.Column(db.Integer()) # 0为取消点赞,1为点赞 95 | -------------------------------------------------------------------------------- /app/sm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | ''' 4 | 发送txt文本邮件 5 | ''' 6 | import smtplib 7 | from email.mime.text import MIMEText 8 | import os, time 9 | 10 | mailto_list=["hopeaktian@foxmail.com"] 11 | mail_host="smtp.sohu.com" #设置服务器 12 | mail_user="hopeaktian@sohu.com" #用户名 13 | mail_pass="*********" #口令 14 | mail_postfix="sohu.com" #发件箱的后缀 15 | 16 | def send_mail(to_list,sub,content): 17 | me="peaktian"+"<"+mail_user+"@"+mail_postfix+">" 18 | msg = MIMEText(content, 'plain', 'utf-8') 19 | msg['Subject'] = sub 20 | msg['From'] = me 21 | msg['To'] = ";".join(to_list) #将收件人列表以‘;’分隔 22 | try: 23 | server = smtplib.SMTP_SSL() 24 | server.connect(mail_host, 465) #连接服务器 25 | server.login(mail_user,mail_pass) #登录操作 26 | server.sendmail(me, to_list, msg.as_string()) 27 | server.close() 28 | return True 29 | except Exception, e: 30 | print str(e) 31 | return False 32 | def mail_admin(urls,email,mes): 33 | message = str(urls) + " " + str(email) + " " + str(mes) 34 | for i in range(1): #发送1封,上面的列表是几个人,这个就填几 35 | if send_mail(mailto_list,"互加友链请求",message): 36 | return 1 37 | else: 38 | return 0 39 | 40 | -------------------------------------------------------------------------------- /app/static/Upload_Files/article/.ignoredir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/Upload_Files/article/.ignoredir -------------------------------------------------------------------------------- /app/static/Upload_Files/img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/Upload_Files/img/1.jpg -------------------------------------------------------------------------------- /app/static/Upload_Files/img/header2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/Upload_Files/img/header2.jpg -------------------------------------------------------------------------------- /app/static/Upload_Files/markdown/1.md: -------------------------------------------------------------------------------- 1 | # TF's blog 2 | This project is aimed to create a blog that belong to myself. 3 | 我好高兴啊 4 | -------------------------------------------------------------------------------- /app/static/audio/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/audio/2.mp3 -------------------------------------------------------------------------------- /app/static/css/bootstrap-grid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.0.0 (https://getbootstrap.com) 3 | * Copyright 2011-2018 The Bootstrap Authors 4 | * Copyright 2011-2018 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}} 7 | /*# sourceMappingURL=bootstrap-grid.min.css.map */ -------------------------------------------------------------------------------- /app/static/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.0.0 (https://getbootstrap.com) 3 | * Copyright 2011-2018 The Bootstrap Authors 4 | * Copyright 2011-2018 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -ms-text-size-adjust: 100%; 19 | -ms-overflow-style: scrollbar; 20 | -webkit-tap-highlight-color: transparent; 21 | } 22 | 23 | @-ms-viewport { 24 | width: device-width; 25 | } 26 | 27 | article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { 28 | display: block; 29 | } 30 | 31 | body { 32 | margin: 0; 33 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 34 | font-size: 1rem; 35 | font-weight: 400; 36 | line-height: 1.5; 37 | color: #212529; 38 | text-align: left; 39 | background-color: #fff; 40 | } 41 | 42 | [tabindex="-1"]:focus { 43 | outline: 0 !important; 44 | } 45 | 46 | hr { 47 | box-sizing: content-box; 48 | height: 0; 49 | overflow: visible; 50 | } 51 | 52 | h1, h2, h3, h4, h5, h6 { 53 | margin-top: 0; 54 | margin-bottom: 0.5rem; 55 | } 56 | 57 | p { 58 | margin-top: 0; 59 | margin-bottom: 1rem; 60 | } 61 | 62 | abbr[title], 63 | abbr[data-original-title] { 64 | text-decoration: underline; 65 | -webkit-text-decoration: underline dotted; 66 | text-decoration: underline dotted; 67 | cursor: help; 68 | border-bottom: 0; 69 | } 70 | 71 | address { 72 | margin-bottom: 1rem; 73 | font-style: normal; 74 | line-height: inherit; 75 | } 76 | 77 | ol, 78 | ul, 79 | dl { 80 | margin-top: 0; 81 | margin-bottom: 1rem; 82 | } 83 | 84 | ol ol, 85 | ul ul, 86 | ol ul, 87 | ul ol { 88 | margin-bottom: 0; 89 | } 90 | 91 | dt { 92 | font-weight: 700; 93 | } 94 | 95 | dd { 96 | margin-bottom: .5rem; 97 | margin-left: 0; 98 | } 99 | 100 | blockquote { 101 | margin: 0 0 1rem; 102 | } 103 | 104 | dfn { 105 | font-style: italic; 106 | } 107 | 108 | b, 109 | strong { 110 | font-weight: bolder; 111 | } 112 | 113 | small { 114 | font-size: 80%; 115 | } 116 | 117 | sub, 118 | sup { 119 | position: relative; 120 | font-size: 75%; 121 | line-height: 0; 122 | vertical-align: baseline; 123 | } 124 | 125 | sub { 126 | bottom: -.25em; 127 | } 128 | 129 | sup { 130 | top: -.5em; 131 | } 132 | 133 | a { 134 | color: #007bff; 135 | text-decoration: none; 136 | background-color: transparent; 137 | -webkit-text-decoration-skip: objects; 138 | } 139 | 140 | a:hover { 141 | color: #0056b3; 142 | text-decoration: underline; 143 | } 144 | 145 | a:not([href]):not([tabindex]) { 146 | color: inherit; 147 | text-decoration: none; 148 | } 149 | 150 | a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { 151 | color: inherit; 152 | text-decoration: none; 153 | } 154 | 155 | a:not([href]):not([tabindex]):focus { 156 | outline: 0; 157 | } 158 | 159 | pre, 160 | code, 161 | kbd, 162 | samp { 163 | font-family: monospace, monospace; 164 | font-size: 1em; 165 | } 166 | 167 | pre { 168 | margin-top: 0; 169 | margin-bottom: 1rem; 170 | overflow: auto; 171 | -ms-overflow-style: scrollbar; 172 | } 173 | 174 | figure { 175 | margin: 0 0 1rem; 176 | } 177 | 178 | img { 179 | vertical-align: middle; 180 | border-style: none; 181 | } 182 | 183 | svg:not(:root) { 184 | overflow: hidden; 185 | } 186 | 187 | table { 188 | border-collapse: collapse; 189 | } 190 | 191 | caption { 192 | padding-top: 0.75rem; 193 | padding-bottom: 0.75rem; 194 | color: #6c757d; 195 | text-align: left; 196 | caption-side: bottom; 197 | } 198 | 199 | th { 200 | text-align: inherit; 201 | } 202 | 203 | label { 204 | display: inline-block; 205 | margin-bottom: .5rem; 206 | } 207 | 208 | button { 209 | border-radius: 0; 210 | } 211 | 212 | button:focus { 213 | outline: 1px dotted; 214 | outline: 5px auto -webkit-focus-ring-color; 215 | } 216 | 217 | input, 218 | button, 219 | select, 220 | optgroup, 221 | textarea { 222 | margin: 0; 223 | font-family: inherit; 224 | font-size: inherit; 225 | line-height: inherit; 226 | } 227 | 228 | button, 229 | input { 230 | overflow: visible; 231 | } 232 | 233 | button, 234 | select { 235 | text-transform: none; 236 | } 237 | 238 | button, 239 | html [type="button"], 240 | [type="reset"], 241 | [type="submit"] { 242 | -webkit-appearance: button; 243 | } 244 | 245 | button::-moz-focus-inner, 246 | [type="button"]::-moz-focus-inner, 247 | [type="reset"]::-moz-focus-inner, 248 | [type="submit"]::-moz-focus-inner { 249 | padding: 0; 250 | border-style: none; 251 | } 252 | 253 | input[type="radio"], 254 | input[type="checkbox"] { 255 | box-sizing: border-box; 256 | padding: 0; 257 | } 258 | 259 | input[type="date"], 260 | input[type="time"], 261 | input[type="datetime-local"], 262 | input[type="month"] { 263 | -webkit-appearance: listbox; 264 | } 265 | 266 | textarea { 267 | overflow: auto; 268 | resize: vertical; 269 | } 270 | 271 | fieldset { 272 | min-width: 0; 273 | padding: 0; 274 | margin: 0; 275 | border: 0; 276 | } 277 | 278 | legend { 279 | display: block; 280 | width: 100%; 281 | max-width: 100%; 282 | padding: 0; 283 | margin-bottom: .5rem; 284 | font-size: 1.5rem; 285 | line-height: inherit; 286 | color: inherit; 287 | white-space: normal; 288 | } 289 | 290 | progress { 291 | vertical-align: baseline; 292 | } 293 | 294 | [type="number"]::-webkit-inner-spin-button, 295 | [type="number"]::-webkit-outer-spin-button { 296 | height: auto; 297 | } 298 | 299 | [type="search"] { 300 | outline-offset: -2px; 301 | -webkit-appearance: none; 302 | } 303 | 304 | [type="search"]::-webkit-search-cancel-button, 305 | [type="search"]::-webkit-search-decoration { 306 | -webkit-appearance: none; 307 | } 308 | 309 | ::-webkit-file-upload-button { 310 | font: inherit; 311 | -webkit-appearance: button; 312 | } 313 | 314 | output { 315 | display: inline-block; 316 | } 317 | 318 | summary { 319 | display: list-item; 320 | cursor: pointer; 321 | } 322 | 323 | template { 324 | display: none; 325 | } 326 | 327 | [hidden] { 328 | display: none !important; 329 | } 330 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /app/static/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.0.0 (https://getbootstrap.com) 3 | * Copyright 2011-2018 The Bootstrap Authors 4 | * Copyright 2011-2018 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /app/static/css/bootstrap-reboot.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAAA;;;;;;ACoBA,ECXA,QADA,SDeE,WAAA,WAGF,KACE,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAKA,cACE,MAAA,aAMJ,QAAA,MAAA,OAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,IAAA,QACE,QAAA,MAWF,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,kBACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,KACA,iBAAA,KEvBF,sBFgCE,QAAA,YASF,GACE,WAAA,YACA,OAAA,EACA,SAAA,QAaF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAQF,EACE,WAAA,EACA,cAAA,KChDF,0BD0DA,YAEE,gBAAA,UACA,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QCrDF,GDwDA,GCzDA,GD4DE,WAAA,EACA,cAAA,KAGF,MCxDA,MACA,MAFA,MD6DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAIF,EC1DA,OD4DE,YAAA,OAIF,MACE,UAAA,IAQF,IChEA,IDkEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QG3LA,QH8LE,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGvMA,oCAAA,oCH0ME,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EClEJ,KACA,ID2EA,IC1EA,KD8EE,YAAA,SAAA,CAAA,UACA,UAAA,IAIF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAGA,mBAAA,UAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAGE,WAAA,QAQF,MAEE,QAAA,aACA,cAAA,MAMF,OACE,cAAA,EAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC9GF,ODiHA,MC/GA,SADA,OAEA,SDmHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OCjHA,MDmHE,SAAA,QAGF,OCjHA,ODmHE,eAAA,KC7GF,aACA,cDkHA,OCpHA,mBDwHE,mBAAA,OCjHF,gCACA,+BACA,gCDmHA,yBAIE,QAAA,EACA,aAAA,KClHF,qBDqHA,kBAEE,WAAA,WACA,QAAA,EAIF,iBCrHA,2BACA,kBAFA,iBD+HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDEA,yCDuIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDEA,yCD+IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UACA,OAAA,QAGF,SACE,QAAA,KErJF,SF2JE,QAAA","sourcesContent":["/*!\n * Bootstrap Reboot v4.0.0 (https://getbootstrap.com)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0); // 6\n}\n\n// IE10+ doesn't honor `` in some cases.\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n// stylelint-disable selector-list-comma-newline-after\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use the\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\n// stylelint-disable font-family-no-duplicate-names\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n// stylelint-enable font-family-no-duplicate-names\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v4.0.0 (https://getbootstrap.com)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","/*!\n * Bootstrap Reboot v4.0.0 (https://getbootstrap.com)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable indentation\n\n// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Origally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS—an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular psuedo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} -------------------------------------------------------------------------------- /app/static/css/my.css: -------------------------------------------------------------------------------- 1 | .shadow { 2 | position: relative; 3 | width: 20%; 4 | float: left; 5 | border: 1px solid #ccc; 6 | height: 100px; 7 | margin: 20px; 8 | background: white; 9 | text-align: center; 10 | padding-top: 30px; 11 | box-sizing: border-box; 12 | box-shadow: 0 0 40px rgba(0, 0, 0, 0.1) inset; 13 | } 14 | 15 | 16 | .shadow::before, 17 | .shadow::after { 18 | content: ""; 19 | position: absolute; 20 | z-index: -2; 21 | } 22 | 23 | /*============= 24 | transform问题 25 | =============*/ 26 | .shadow1 { 27 | transform: rotate(3deg); 28 | } 29 | .shadow1::before, 30 | .shadow1::after { 31 | bottom: 15px; 32 | left: 10px; 33 | width: 50%; 34 | height: 20%; 35 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7); 36 | transform: rotate(-3deg); 37 | max-width: 300px; 38 | } 39 | 40 | .shadow1::after{ 41 | right: 10px; 42 | left: auto; 43 | transform: rotate(3deg); 44 | } 45 | 46 | /*============= 47 | 微折角 48 | =============*/ 49 | .shadow2::before, 50 | .shadow2::after { 51 | bottom: 15px; 52 | left: 10px; 53 | width: 50%; 54 | height: 20%; 55 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7); 56 | transform: rotate(-3deg); 57 | max-width: 300px; 58 | } 59 | 60 | .shadow2::after{ 61 | right: 10px; 62 | left: auto; 63 | transform: rotate(3deg); 64 | } 65 | 66 | 67 | /*============= 68 | 折起角效果 69 | =============*/ 70 | .shadow3 { 71 | border-radius: 0 0 120px 120px / 0 0 6px 6px; 72 | } 73 | .shadow3::before, 74 | .shadow3::after { 75 | bottom: 15px; 76 | left: 10px; 77 | width: 50%; 78 | height: 20%; 79 | box-shadow: 0 8px 12px rgba(0, 0, 0, 0.5); 80 | transform: rotate(-3deg); 81 | max-width: 300px; 82 | } 83 | 84 | .shadow3::after{ 85 | right: 10px; 86 | left: auto; 87 | transform: rotate(3deg); 88 | } 89 | 90 | /*============= 91 | 凸起效果 92 | =============*/ 93 | .shadow4 { 94 | box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; 95 | } 96 | 97 | /*============= 98 | 旋转效果 99 | =============*/ 100 | .shadow5 { 101 | transform: rotate(3deg); 102 | } 103 | .shadow5 p { 104 | margin: 0; 105 | } 106 | .shadow5 p::before { 107 | content: ""; 108 | position: absolute; 109 | z-index: -1; 110 | background: #fff; 111 | box-shadow: 0 0 40px rgba(0, 0, 0, 0.1) inset; 112 | top: 0; 113 | bottom: 0; 114 | right: 0; 115 | left: 0; 116 | } 117 | .shadow5::before, 118 | .shadow5::after { 119 | bottom: 15px; 120 | left: 10px; 121 | width: 50%; 122 | height: 20%; 123 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7); 124 | transform: rotate(-3deg); 125 | max-width: 300px; 126 | } 127 | 128 | .shadow5::after{ 129 | right: 10px; 130 | left: auto; 131 | transform: rotate(3deg); 132 | } 133 | 134 | /*============= 135 | 凸显效果 136 | =============*/ 137 | .shadow6 { 138 | transition:all 0.3s ease; 139 | } 140 | .shadow6:hover{ 141 | border:1px solid rgba(82, 168, 236, 0.6); 142 | box-shadow: 0 0 8px rgba(82, 168, 236, 0.6),0 0 40px rgba(0, 0, 0, 0.1) inset; 143 | } 144 | 145 | /*============= 146 | 对角折起效果 147 | =============*/ 148 | .shadow7::before{ 149 | content:""; 150 | width:50%; 151 | height:50%; 152 | left:0; 153 | top:0; 154 | box-shadow:-20px -30px 15px rgba(0,0,0,0.2); 155 | transform:skew(10deg,10deg) translate(40px,30px); 156 | } 157 | .shadow7::after{ 158 | content:""; 159 | width:50%; 160 | height:50%; 161 | right:0; 162 | top:50%; 163 | box-shadow:20px 30px 15px rgba(0,0,0,0.2); 164 | transform:skew(10deg,10deg) translate(-40px,-20px); 165 | } 166 | 167 | /*============= 168 | 书页效果 169 | 三个框的重叠 170 | 1. 原盒子 171 | 2. before 172 | 3. after 173 | =============*/ 174 | .shadow8{ 175 | background: linear-gradient(100% 50%, #fff, #fff 10%, #f3f3f3); 176 | border-bottom-right-radius: 60px 5px; 177 | } 178 | .shadow8::before{ 179 | content:""; 180 | width:98%; 181 | height:98%; 182 | left:0; 183 | top:0; 184 | background-color:#fff; 185 | border: 1px solid #ccc; 186 | transform:skew(4deg, 2deg) translate(6px, 7px); 187 | border-bottom-right-radius: 60px 5px; 188 | } 189 | .shadow8::after{ 190 | content:""; 191 | width:98%; 192 | height:98%; 193 | left:0; 194 | top:0; 195 | background-color:#fff; 196 | border: 1px solid #ccc; 197 | transform:skew(3deg, 1deg) translate(4px, 4px); 198 | } 199 | /* 黏贴纸效果 */ 200 | .shadow9{ 201 | box-shadow: 0 0 5px rgba(0,0,0,0.3); 202 | } 203 | .shadow9::before{ 204 | content:""; 205 | width:110px; 206 | height:30px; 207 | background-color:rgba(255,255,0,0.2); 208 | z-index:1; 209 | top:8px; 210 | left:-32px; 211 | box-shadow: 0 0 5px rgba(0,0,0,0.3); 212 | transform:rotate(-45deg); 213 | } 214 | .shadow9::after{ 215 | content:""; 216 | width:110px; 217 | height:30px; 218 | background-color:rgba(255,255,0,0.2); 219 | z-index:1; 220 | bottom:8px; 221 | right:-32px; 222 | box-shadow: 0 0 5px rgba(0,0,0,0.3); 223 | transform:rotate(-45deg); 224 | } 225 | 226 | /* 点赞 */ 227 | .like{ font-size:66px; color: #ffffff; cursor:pointer;} 228 | .cs{color:#f00;} -------------------------------------------------------------------------------- /app/static/font/STZHONGS.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/font/STZHONGS.woff -------------------------------------------------------------------------------- /app/static/font/addurl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/font/addurl.png -------------------------------------------------------------------------------- /app/static/font/control.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/font/ios-create.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/font/log-out.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/font/more2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/font/more2.png -------------------------------------------------------------------------------- /app/static/img/big-home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/big-home.jpg -------------------------------------------------------------------------------- /app/static/img/grand-sky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/grand-sky.jpg -------------------------------------------------------------------------------- /app/static/img/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/header.jpg -------------------------------------------------------------------------------- /app/static/img/header2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/header2.jpg -------------------------------------------------------------------------------- /app/static/img/loding2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/loding2.gif -------------------------------------------------------------------------------- /app/static/img/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/logo.jpg -------------------------------------------------------------------------------- /app/static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hopeaktian/blog-flask/980c8a5619de4e5dcf5d30e3b890ec7adc0ecb35/app/static/img/logo.png -------------------------------------------------------------------------------- /app/static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v4.0.0 (https://getbootstrap.com) 3 | * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); 7 | //# sourceMappingURL=bootstrap.min.js.map -------------------------------------------------------------------------------- /app/static/js/my.js: -------------------------------------------------------------------------------- 1 | function showlentime() { 2 | var from = new Date("2018-12-02 20:40:00"); 3 | from = from.getTime(); 4 | var now = new Date(); 5 | now = now.getTime(); 6 | var lentime = new Date(now - from); 7 | var dayDiff = Math.floor(lentime / (24 * 3600 * 1000));//计算出相差天数 8 | var leave1=lentime%(24*3600*1000) //计算天数后剩余的毫秒数 9 | var hours=Math.floor(leave1/(3600*1000))//计算出小时数 10 | //计算相差分钟数 11 | var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 12 | var minutes=Math.floor(leave2/(60*1000))//计算相差分钟数 13 | //计算相差秒数 14 | var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 15 | var seconds=Math.round(leave3/1000) 16 | 17 | document.getElementById("lengthtime").innerHTML = dayDiff + "天"+ hours + "时" + minutes + "分"+ seconds + "秒" ; 18 | setTimeout("showlentime()",1000); 19 | } 20 | -------------------------------------------------------------------------------- /app/templates/Post_Details.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: auto; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | input{ 15 | height: 2rem; 16 | line-height: 1rem; 17 | display: inline-block; 18 | padding: .438rem .525rem; 19 | border: 0; 20 | width: 200%; 21 | height: 35px; 22 | border-radius: .3125rem; 23 | background: #343232b3; 24 | color: #fff; 25 | } 26 | .text-area{ 27 | display: inline-block; 28 | padding: .438rem .525rem; 29 | border: 0; 30 | border-radius: .3125rem; 31 | background: #343232b3; 32 | color: #fff; 33 | overflow-y: visible; 34 | margin-top: .625rem; 35 | width: 100%; 36 | height: 100px; 37 | vertical-align: top; 38 | resize: none; 39 | } 40 | .mysubmit{ 41 | cursor: pointer; 42 | /* background: #343232 repeating-linear-gradient(-45deg,#2c2a2a,#2c2a2a 1.125rem,transparent 1.125rem,transparent 2.25rem); */ 43 | color: #9e9e9e; 44 | width: auto; 45 | border: .0625rem solid #c8c8c8; 46 | margin: 0 auto; 47 | border-radius: .3125rem; 48 | display: block; 49 | padding: 0 1rem; 50 | height: 2.2rem; 51 | font-weight: 500; 52 | font-family: inherit; 53 | -webkit-transition: all .5s ease-out; 54 | -moz-transition: all .5s ease-out; 55 | -ms-transition: all .5s ease-out; 56 | -o-transition: all .5s ease-out; 57 | transition: all .5s ease-out; 58 | } 59 | {% endblock style %} 60 | 61 | {% block photo %} 62 | background: url(/static/Upload_Files/article/{{ posts.Dir_Name }}/{{ posts.Cover_Picture_Name }}) center; 63 | {% endblock photo %} 64 | 65 | {% block title %} 66 |

{{ posts.Title }}

67 |

{{ posts.Publish_Date }}

68 | {% endblock title %} 69 | 70 | {% block access %} 71 | 72 | {% endblock access %} 73 | 74 | {% block musicname %} 75 | {#
#} 76 | {#
#} 77 | {# #} 78 | {#
#} 79 | {#
#} 80 | {#
#} 81 | {#
#} 82 | {# #} 83 | {#
#} 84 | {#
#} 85 | {% endblock musicname %} 86 | 87 | {% block content %} 88 |
89 |
90 | {{ content | safe }} 91 |
92 |
93 | {% endblock content %} 94 | 95 | 96 | {% block right_side %} 97 |
98 |
99 | 100 |
BGM

101 | {% if posts.Music_Name is not none %} 102 |
103 | 104 |
105 |
106 |
107 | 110 |
111 |
112 | {% endif %} 113 | 114 |
添加新评论

115 |
116 |
117 |
118 |
119 | 120 |
121 |
122 |
123 |
124 | 125 |
126 |
127 | 128 |
129 |
130 | 131 |
132 |
133 |
134 | {% with messages = get_flashed_messages(with_categories=true) %} 135 | {% if messages %} 136 | {% for category, message in messages %} 137 | 141 | {% endfor %} 142 | {% endif %} 143 | {% endwith %} 144 | 145 |
146 |
147 |
148 |
149 |

已有{{ lenth }}条评论

150 |
151 | {% if lenth != 0 %} 152 | {% for i in range(lenth) %} 153 |
154 |
155 | 156 |
157 | 158 |
159 |
160 |
{{ comments[i].Name }}
161 | {% if comments[i].Name == "落风" %} 162 |
163 | 164 |
165 | {% endif %} 166 |
167 |
168 |
169 |

{{ comments[i].Date }}

170 |
171 | {#
#} 172 | {#
回复#} 173 | {#
#} 174 |
175 |
176 |
177 |

{{ comments[i].text }}

178 |
179 | 180 |
181 |
182 |
183 | {% endfor %} 184 | {% endif %} 185 |
186 |
187 | 196 | {% endblock right_side %} 197 | -------------------------------------------------------------------------------- /app/templates/addurl.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: 689px; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | input{ 15 | height: 2rem; 16 | line-height: 1rem; 17 | display: inline-block; 18 | padding: .438rem .525rem; 19 | border: 0; 20 | width: 226px; 21 | height: 35px; 22 | border-radius: .3125rem; 23 | background: #343232; 24 | color: #fff; 25 | } 26 | .text-area{ 27 | display: inline-block; 28 | padding: .438rem .525rem; 29 | border: 0; 30 | border-radius: .3125rem; 31 | background: #343232; 32 | color: #fff; 33 | overflow-y: visible; 34 | margin-top: .625rem; 35 | width: 100%; 36 | height: 100px; 37 | vertical-align: top; 38 | resize: none; 39 | } 40 | .mysubmit{ 41 | cursor: pointer; 42 | /* background: #343232 repeating-linear-gradient(-45deg,#2c2a2a,#2c2a2a 1.125rem,transparent 1.125rem,transparent 2.25rem); */ 43 | color: #9e9e9e; 44 | width: 689px; 45 | border: .0625rem solid #c8c8c8; 46 | margin: 0 auto; 47 | border-radius: .3125rem; 48 | display: block; 49 | padding: 0 1rem; 50 | height: 2.2rem; 51 | font-weight: 500; 52 | font-family: inherit; 53 | -webkit-transition: all .5s ease-out; 54 | -moz-transition: all .5s ease-out; 55 | -ms-transition: all .5s ease-out; 56 | -o-transition: all .5s ease-out; 57 | transition: all .5s ease-out; 58 | } 59 | {% endblock style %} 60 | 61 | {% block photo %} 62 | background: url(../static/img/header2.jpg) center; 63 | {% endblock photo %} 64 | 65 | {% block title %} 66 |

互加友情链接

67 | {% endblock title %} 68 | 69 | {% block content %} 70 |
71 |
72 |
73 |
74 |
75 |

填写你的网站信息

76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 |
86 | 87 |
88 |
89 | 90 |
91 |
92 |
93 | {% with messages = get_flashed_messages(with_categories=true) %} 94 | {% if messages %} 95 | {% for category, message in messages %} 96 | 100 | {% endfor %} 101 | {% endif %} 102 | {% endwith %} 103 | 104 |
105 |
106 | 107 |
108 | 116 | {% endblock content %} -------------------------------------------------------------------------------- /app/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ title }} 7 | 8 | 9 | 10 | 11 | 12 | 14 | 26 | 27 | {% block links %} 28 | {% endblock %} 29 | 172 | 173 | 174 | 175 | 176 | 177 |
178 | 179 |
180 | 181 |
182 |
183 |
184 | 185 | HOME 186 | 187 |
188 |
189 | 200 |
201 | {#
#} 202 | {# #} 203 | {# #} 204 | {# #} 205 | {#
#} 206 | {% block head_right %} 207 | 208 | {% endblock head_right %} 209 | 210 |
211 | {% block musicname %} 212 | 213 | {% endblock musicname %} 214 | 215 | {% if g.current_user_name != 'null' %} 216 |
217 |  退出 218 |
219 | {% endif %} 220 | 221 | 222 | {% block title %} 223 | {% endblock title %} 224 | 225 |
226 | 227 | 228 |
229 |
230 |
231 | 232 | {% block content %} 233 | {% endblock content %} 234 |
235 |
236 | 237 | {% block right_side %} 238 | {% endblock right_side %} 239 |
240 |
241 | 242 | 243 |
244 | {##} 245 | {#{% block content %}#} 246 | {#{% endblock content %}#} 247 | {##} 248 | {##} 249 | {#{% block comment %}#} 250 | {#{% endblock comment %}#} 251 | 252 | {% block link %} 253 | {% endblock link %} 254 | 255 | 256 | 257 |
258 | 259 |
260 |
261 | {#
#} 262 |

Copyright © 2018 TF's Blog

263 | 264 |
265 |
266 |
267 | 268 | 269 | 270 | 271 | 288 | 289 | 290 | 291 | -------------------------------------------------------------------------------- /app/templates/error.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: 689px; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | .text-area{ 15 | display: inline-block; 16 | padding: .438rem .525rem; 17 | border: 0; 18 | border-radius: .3125rem; 19 | background: #343232; 20 | color: #fff; 21 | overflow-y: visible; 22 | margin-top: .625rem; 23 | width: 100%; 24 | height: 100px; 25 | vertical-align: top; 26 | resize: none; 27 | } 28 | 29 | {% endblock style %} 30 | 31 | {% block photo %} 32 | background: url(../static/img/header2.jpg) center; 33 | {% endblock photo %} 34 | 35 | {% block title %} 36 |

错误

37 | {% endblock title %} 38 | 39 | {% block content %} 40 |
41 |
42 |
43 |
44 |
45 |

出错了,请重试

46 |
47 | 48 |
49 |
50 | {% with messages = get_flashed_messages(with_categories=true) %} 51 | {% if messages %} 52 | {% for category, message in messages %} 53 | 57 | {% endfor %} 58 | {% endif %} 59 | {% endwith %} 60 | 61 |
62 |
63 | 64 |
65 | {% endblock content %} -------------------------------------------------------------------------------- /app/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block links %} 4 | 5 | 6 | {% endblock links %} 7 | 8 | {% block style %} 9 | container-fluaid{ 10 | background-color: #3B3F45; 11 | } 12 | body{ 13 | background-color: #2c2a2a; 14 | } 15 | a.link{ 16 | color: #83c200;font-size: 16px 17 | } 18 | input{ 19 | height: 2rem; 20 | line-height: 1rem; 21 | display: inline-block; 22 | padding: .438rem .525rem; 23 | border: 0; 24 | width: 200%; 25 | height: 35px; 26 | border-radius: .3125rem; 27 | background: #343232b3; 28 | color: #fff; 29 | } 30 | /* 点赞 */ 31 | .like{ font-size:4em;color: #ffffff; cursor:pointer;transition: all 0.4s;} 32 | .like:hover{transform: scale(1.3)} 33 | .cs{ont-size:4em;color:#f00;cursor:pointer;} 34 | {% endblock style %} 35 | 36 | {% block photo %} 37 | background: url(../static/img/big-home.jpg) center; 38 | {% endblock photo %} 39 | 40 | 41 | {% block head_right %} 42 |
43 |
44 | 46 | 47 | 48 | 49 |
50 |
51 | {% endblock head_right %} 52 | 53 | 54 | {% block title %} 55 |

TF'S BLOG


56 | {% endblock title %} 57 | 58 | 59 | {% block content %} 60 |
61 |
62 |
63 | {% if lenth != 0 %} 64 | {% for i in range(lenth) %} 65 | 66 |
67 |

{{ user_Post[i].Title }}

68 |
69 |
78 |
79 | 80 |
81 |
82 | {% endfor %} 83 | {% else %} 84 | {% endif %} 85 |
86 |
87 | 88 | {% if pagination.pages >= 1 %} 89 |
90 |
91 |
92 | 97 |
98 |
99 |
100 | {% endif %} 101 | 102 | 103 | 117 | 118 | 166 | 176 |
177 | {% endblock content %} 178 | 179 | {#{% block link %}#} 180 | {#{% endblock link %}#} 181 | 182 | {% block right_side %} 183 |
184 |
185 | 186 |
187 | 188 |

Ryan

189 |
190 | 191 |
192 | 海到无边天作岸,山登绝顶我为峰 193 |
194 | 195 | 196 | 197 | 227 | 228 |
229 |
标签云

230 |
231 | {% for tag in index_tag %} 232 | 233 | {% endfor %} 234 |
235 | 236 |
237 |
友情链接

238 |
239 | • MyGitHub
240 | • 袋鼠共享打印
241 | • Minz的博客
242 | • 携手凡生的博客
243 | • 一百个小排的博客
244 | 互加友链 245 | 246 | 247 |
248 | 249 |
250 |
站点信息

251 |
252 | • 文章总数:{{ website_info['articles_count'] }}
253 | • 访问总数:{{ website_info['all_access'] }}
254 | • 运行时长:
257 |
258 | 259 |
260 | {% endblock right_side %} 261 | -------------------------------------------------------------------------------- /app/templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: 689px; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | input{ 15 | height: 2rem; 16 | line-height: 1rem; 17 | display: inline-block; 18 | padding: .438rem .525rem; 19 | border: 0; 20 | width: 226px; 21 | height: 35px; 22 | border-radius: .3125rem; 23 | background: #343232; 24 | color: #fff; 25 | } 26 | .text-area{ 27 | display: inline-block; 28 | padding: .438rem .525rem; 29 | border: 0; 30 | border-radius: .3125rem; 31 | background: #343232; 32 | color: #fff; 33 | overflow-y: visible; 34 | margin-top: .625rem; 35 | width: 100%; 36 | height: 100px; 37 | vertical-align: top; 38 | resize: none; 39 | } 40 | .mysubmit{ 41 | cursor: pointer; 42 | /* background: #343232 repeating-linear-gradient(-45deg,#2c2a2a,#2c2a2a 1.125rem,transparent 1.125rem,transparent 2.25rem); */ 43 | color: #9e9e9e; 44 | width: 689px; 45 | border: .0625rem solid #c8c8c8; 46 | margin: 0 auto; 47 | border-radius: .3125rem; 48 | display: block; 49 | padding: 0 1rem; 50 | height: 2.2rem; 51 | font-weight: 500; 52 | font-family: inherit; 53 | -webkit-transition: all .5s ease-out; 54 | -moz-transition: all .5s ease-out; 55 | -ms-transition: all .5s ease-out; 56 | -o-transition: all .5s ease-out; 57 | transition: all .5s ease-out; 58 | } 59 | {% endblock style %} 60 | 61 | {% block photo %} 62 | background: url(../static/img/header2.jpg) center; 63 | {% endblock photo %} 64 | 65 | {% block title %} 66 |

管理员登陆

67 | {% endblock title %} 68 | 69 | {% block content %} 70 |
71 |
72 |
73 |
74 |
75 |

填写用户名密码

76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 |
84 |
85 |
86 | 87 |
88 |
89 |
90 | 91 |
92 |
93 |
94 | {% with messages = get_flashed_messages(with_categories=true) %} 95 | {% if messages %} 96 | {% for category, message in messages %} 97 | 101 | {% endfor %} 102 | {% endif %} 103 | {% endwith %} 104 | 105 |
106 |
107 | 108 |
109 | 117 | {% endblock content %} -------------------------------------------------------------------------------- /app/templates/root.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: 689px; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | .text-area{ 15 | display: inline-block; 16 | padding: .438rem .525rem; 17 | border: 0; 18 | border-radius: .3125rem; 19 | background: #343232; 20 | color: #fff; 21 | overflow-y: visible; 22 | margin-top: .625rem; 23 | width: 100%; 24 | height: 100px; 25 | vertical-align: top; 26 | resize: none; 27 | } 28 | 29 | 30 | 31 | {% endblock style %} 32 | 33 | {% block photo %} 34 | background: url(../static/img/header2.jpg) center; 35 | {% endblock photo %} 36 | 37 | {% block title %} 38 |

管理员控制中心

39 | {% endblock title %} 40 | 41 | {% block content %} 42 |
43 | 44 |
45 |
46 | {% with messages = get_flashed_messages(with_categories=true) %} 47 | {% if messages %} 48 | {% for category, message in messages %} 49 | 53 | {% endfor %} 54 | {% endif %} 55 | {% endwith %} 56 | 57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 |
65 |
66 | 67 | 68 | 69 |
70 | 71 |
72 |
73 | 74 |
75 |
76 |
77 |
78 |
79 |
80 | 81 | 82 | 83 |
84 |
85 |
86 | 87 |
88 |
89 |
90 | 91 |
92 |
93 |
94 | 95 | 96 | 97 |
98 |
99 |
100 | 101 |
102 |
103 |
104 |
105 | 106 | 107 | 108 |
109 | {% endblock content %} -------------------------------------------------------------------------------- /app/templates/search.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block head_right %} 3 | 4 |
5 |
6 | 8 | 9 | 10 | 11 |
12 |
13 | {% endblock %} 14 | {% block title %} 15 | 16 |
17 |
18 | #} 37 |
38 |
39 | {% endfor %} 40 | {% else %} 41 | {% endif %} 42 |
43 |
44 | 45 | 46 |
47 | {% if search_result and search_result.pages >= 1 %} 48 |
49 |
50 |
51 | 56 |
57 |
58 |
59 | {% endif %} 60 |
61 | 62 | 63 | 64 | 75 | 76 | 122 | 123 | {% endblock title %} -------------------------------------------------------------------------------- /app/templates/tag_details.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block style %} 3 | {% endblock style %} 4 | 5 | {% block photo %} 6 | background: url(../static/img/header.jpg) center; 7 | {% endblock photo %} 8 | 9 | {% block title %} 10 |

{{ title }}

11 | {% endblock title %} 12 | 13 | {% block content %} 14 |
15 | 47 | 48 | {% if pagination.pages >= 1 %} 49 |
50 | 55 |
56 | {% endif %} 57 | 58 | 72 | 73 | 112 |
113 | {% endblock content %} -------------------------------------------------------------------------------- /app/templates/test.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/templates/writer.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block style %} 4 | p{ 5 | font-family: Arial, '华文中宋'; 6 | font-size: 18px; 7 | line-height: 38px; 8 | } 9 | .message-card-container{ 10 | width: 689px; 11 | margin-right: auto; 12 | margin-left: auto; 13 | } 14 | input{ 15 | height: 2rem; 16 | line-height: 1rem; 17 | display: inline-block; 18 | padding: .438rem .525rem; 19 | border: 0; 20 | width: 226px; 21 | height: 35px; 22 | border-radius: .3125rem; 23 | background: #343232; 24 | color: #fff; 25 | } 26 | .text-area{ 27 | display: inline-block; 28 | padding: .438rem .525rem; 29 | border: 0; 30 | border-radius: .3125rem; 31 | background: #343232; 32 | color: #fff; 33 | overflow-y: visible; 34 | margin-top: .625rem; 35 | width: 100%; 36 | height: 100px; 37 | vertical-align: top; 38 | resize: none; 39 | } 40 | .mysubmit{ 41 | cursor: pointer; 42 | /* background: #343232 repeating-linear-gradient(-45deg,#2c2a2a,#2c2a2a 1.125rem,transparent 1.125rem,transparent 2.25rem); */ 43 | color: #9e9e9e; 44 | width: 689px; 45 | border: .0625rem solid #c8c8c8; 46 | margin: 0 auto; 47 | border-radius: .3125rem; 48 | display: block; 49 | padding: 0 1rem; 50 | height: 2.2rem; 51 | font-weight: 500; 52 | font-family: inherit; 53 | -webkit-transition: all .5s ease-out; 54 | -moz-transition: all .5s ease-out; 55 | -ms-transition: all .5s ease-out; 56 | -o-transition: all .5s ease-out; 57 | transition: all .5s ease-out; 58 | } 59 | {% endblock style %} 60 | 61 | {% block photo %} 62 | background: url(../static/img/header2.jpg) center; 63 | {% endblock photo %} 64 | 65 | {% block title %} 66 |

作者主页

67 | {% endblock title %} 68 | 69 | {% block content %} 70 |
71 |
72 |
73 |
74 |
75 |

添加新文章

76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 |
86 |
87 |
88 | 89 |
90 |
91 | 92 |
93 |
94 | 95 |
96 | 97 |
98 |
99 | 100 |
101 |
102 |
103 | {% with messages = get_flashed_messages(with_categories=true) %} 104 | {% if messages %} 105 | {% for category, message in messages %} 106 | 110 | {% endfor %} 111 | {% endif %} 112 | {% endwith %} 113 | 114 |
115 |
116 |
117 | 118 |
119 |
120 | 128 | {% endblock content %} 129 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #coding:utf-8 3 | from flask_script import Manager, Server 4 | from app import app 5 | from app.models import db, User, Post, Comment, Tag, tags, Access, Like 6 | 7 | manager = Manager(app) 8 | manager.add_command("server", Server()) 9 | 10 | @manager.shell 11 | def make_shell_context(): 12 | return dict(app=app, db=db, User=User, Post=Post, Comment=Comment, Tag=Tag, tags=tags, Access=Access, 13 | Like=Like) 14 | 15 | if __name__ == "__main__": 16 | manager.run() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asn1crypto==0.24.0 2 | cffi==1.11.5 3 | Click==7.0 4 | cryptography==2.4.2 5 | enum34==1.1.6 6 | Flask==1.0.2 7 | Flask-Script==2.0.6 8 | Flask-SQLAlchemy==2.3.2 9 | idna==2.7 10 | ipaddress==1.0.22 11 | itsdangerous==1.1.0 12 | Jinja2==2.10 13 | Markdown==3.1 14 | MarkupSafe==1.1.0 15 | pycparser==2.19 16 | PyMySQL==0.9.2 17 | six==1.11.0 18 | SQLAlchemy==1.2.14 19 | Werkzeug==0.14.1 20 | --------------------------------------------------------------------------------