Skip to content

Commit 4ba1bed

Browse files
authored
Merge pull request #28 from lt94/dev
v0.2.0
2 parents 995abdb + 1eb0261 commit 4ba1bed

File tree

95 files changed

+36926
-2480
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+36926
-2480
lines changed

admin.py

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from flask_login import current_user
55
from flask import redirect, url_for, request, flash, current_app, jsonify
66
from app.models import Post, Tag, Comment, User, History, MessageBoard, FriendLink
7-
from flask_admin.form import Select2Widget
7+
from flask_admin.form.upload import ImageUploadField,FileUploadField
88
import os
9+
import imghdr
910

1011
class PeachView(ModelView):
1112

@@ -46,6 +47,24 @@ class PeachPostView(ModelView):
4647
edit_template = 'admin/model/peach-post-edit.html'
4748
column_searchable_list = ['title']
4849
column_exclude_list = ['content']
50+
column_labels = dict(cover='Cover')
51+
column_default_sort = ('create_at', True)
52+
53+
def picture_validation(form, field):
54+
if field.data:
55+
filename = field.data.filename
56+
if not imghdr.what(field.data):
57+
flash('上传的不是图片!')
58+
return False
59+
path = f'{os.getcwd()}/app/static/covers'
60+
os.makedirs(path,exist_ok=True)
61+
field.data.save(f'{path}/{filename}')
62+
field.data = f'covers/{filename}'
63+
return True
64+
return False
65+
66+
form_overrides = dict(cover=FileUploadField)
67+
form_args = dict(cover=dict(label="封面",validators=[picture_validation]))
4968

5069
def __init__(self, model, session, **kwargs):
5170
self.model = model
@@ -88,9 +107,9 @@ def export_content_to_md(self, post):
88107
f.write(export_post_data)
89108
return True
90109

91-
def after_model_change(self, form, model, is_created):
92-
# TODO after add post generate the match post.md
93-
pass
110+
def on_model_change(self, form, model, is_created):
111+
model.cover = form.cover.data
112+
94113

95114
def after_model_delete(self, model):
96115
# TODO after delete post, delete the match post.md
@@ -108,6 +127,23 @@ def can_delete(self):
108127
def can_edit(self):
109128
return current_user.is_authenticated and current_user.level == 1
110129

130+
class PeachCommentView(PeachView):
131+
column_filters = ['is_read']
132+
column_default_sort = ('comment_time', True)
133+
134+
135+
def __init__(self, model, session, **kwargs):
136+
self.session = session
137+
super(PeachView, self).__init__(model, session, **kwargs)
138+
139+
@action("read", 'readAll', 'Are you sure make all comments read')
140+
def make_all_read(self, ids):
141+
for id in ids:
142+
comment = Comment.query.filter_by(id=id).first()
143+
comment.is_read = 1
144+
self.session.commit()
145+
146+
111147
class PeachAdminIndexView(AdminIndexView):
112148

113149
@expose('/')
@@ -122,7 +158,7 @@ class PeachAdmin:
122158

123159
__slots__ = ['admin']
124160

125-
def __init__(self, name="Peach-Blog", template_mode="bootstrap3"):
161+
def __init__(self, name="Peach-Blog Management", template_mode="bootstrap3"):
126162
self.admin = Admin(name=name, template_mode=template_mode,
127163
index_view=PeachAdminIndexView(), base_template='admin/peach-base.html')
128164

@@ -134,7 +170,7 @@ def init_app(self, app, db):
134170
Post, db.session, endpoint='PeachPost'))
135171
self.admin.add_view(PeachView(Tag, db.session, endpoint='PeachTag'))
136172
self.admin.add_view(
137-
PeachView(Comment, db.session, endpoint='PeachComment'))
173+
PeachCommentView(Comment, db.session, endpoint='PeachComment'))
138174
self.admin.add_view(
139175
PeachView(History, db.session, endpoint='PeachHistory'))
140176
self.admin.add_view(

app/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
hexo = Hexo()
2525

2626
from admin import PeachAdmin
27-
admin = PeachAdmin(name="PeachBlog", template_mode="bootstrap3")
27+
admin = PeachAdmin(name="Management", template_mode="bootstrap3")
2828

2929

3030
def create_app(config_name):

app/api_v1_0/dashboard.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,12 @@ def get_sum_device_visit_chart():
9898
sum_device_visit_data_list.append(temp_dict)
9999
return sum_device_visit_data_list
100100

101+
def get_unread_comments():
102+
rows = Comment.query.filter_by(is_read=0).all()
103+
return len(rows)
104+
101105

102106
@api.route("/dashboard", methods=["GET"])
103107
def dashboard():
104108
# https://github.com/pallets/flask/issues/835
105-
return jsonify({"comment_count": get_comment_count(), "message_board_count": get_message_board_count(), "today_visit_count": get_today_visit_count(), "sum_visit_count": get_sum_visit_count(), "today_visit_chart": get_today_visit_chart(), "top_ten_posts": get_top_ten_posts(), "sum_seven_day_visit_chart": get_sum_seven_day_visit_chart(), "sum_device_visit": get_sum_device_visit_chart()})
109+
return jsonify({"comment_count": get_comment_count(), "message_board_count": get_message_board_count(), "today_visit_count": get_today_visit_count(), "sum_visit_count": get_sum_visit_count(), "today_visit_chart": get_today_visit_chart(), "top_ten_posts": get_top_ten_posts(), "sum_seven_day_visit_chart": get_sum_seven_day_visit_chart(), "sum_device_visit": get_sum_device_visit_chart(),"unread_comments":get_unread_comments()})

app/main/forms.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44

55

66
class CommentForm(FlaskForm):
7-
user_name = StringField('*用户名', validators=[DataRequired()])
8-
email = StringField(
9-
'*邮箱', validators=[DataRequired(), Email(message="请确保邮箱有效,以确保可以收到回复")])
10-
website = StringField('网址')
11-
comment = TextAreaField('*评论', validators=[DataRequired()])
7+
user_name = StringField('用户名', validators=[DataRequired()],render_kw={"class_":"form-control","placeholder":"昵称(必填)"})
8+
email = StringField('邮箱', validators=[DataRequired(), Email(message="请确保邮箱有效,以确保可以收到回复")],render_kw={"class_":"form-control","type":"email","placeholder":"邮箱(必填)"})
9+
website = StringField('网址',render_kw={"class_":"form-control","placeholder":"网址"})
10+
comment = TextAreaField('', validators=[DataRequired()],render_kw={"class_":"form-control","rows":"3"})
1211
parent_id = HiddenField()
1312
submit = SubmitField("评论")

app/main/views.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,10 @@ def post(title):
6161
if regx_user is not None:
6262
comment = Comment(post_id=id, user_name=form.user_name.data, email=form.email.data, website=form.website.data,
6363
comment=form.comment.data, platform=platform, browser=browser, comment_time=datetime.now(),parent=comment_parent)
64-
msg = "回复成功!"
6564
send_email(comment_parent.email,'评论回复','mail/comment',comment=comment,post=post)
66-
65+
msg = "回复成功!"
6766
db.session.add(comment)
68-
try:
69-
db.session.commit()
70-
flash("评论成功!")
71-
except Exception as e:
72-
db.session.rollback()
73-
print(e)
74-
flash("数据库提交失败!")
67+
db.session.commit()
7568
flash(msg)
7669
return redirect(url_for('main.post', title=title))
7770

@@ -95,20 +88,21 @@ def post(title):
9588
return render_template('post.html', current_user=current_user, post=post, comments=comments, form=form, pagination=pagination, title=title)
9689

9790

98-
@main.route("/timeline")
91+
@main.route("/archives")
9992
def timeline():
10093
page = request.args.get('page', 1, type=int)
10194
pagination = Post.query.order_by(Post.create_at.desc()).paginate(
10295
page, per_page=current_app.config['FLASK_PER_PAGE'], error_out=True)
10396
posts = pagination.items
10497
post_dict = group_posts_by_date(posts)
105-
return render_template("timeline.html", current_user=current_user, post_dict=post_dict, pagination=pagination)
98+
posts_all = Post.query.all()
99+
return render_template("archives.html", current_user=current_user, total_count=len(posts_all),post_dict=post_dict, pagination=pagination)
106100

107101

108102
def group_posts_by_date(posts):
109103
post_dict = OrderedDict()
110104
for post in posts:
111-
year_month = post.create_at.strftime("%Y-%m")
105+
year_month = post.create_at.strftime("%Y")
112106
if post_dict.get(year_month, None) is None:
113107
post_dict[year_month] = [post]
114108
else:

app/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ class Post(db.Model):
5555
content = db.Column(db.Text)
5656
create_at = db.Column(db.Date(), default=datetime.datetime.today)
5757
last_update = db.Column(db.DateTime(), default=datetime.datetime.now)
58+
cover = db.Column(db.String(200))
5859
postviews = db.relationship('PostView', backref='postviews', lazy='joined')
5960
comments = db.relationship('Comment', backref='comments', lazy='joined')
61+
historys = db.relationship('History', backref='post', lazy='dynamic', cascade='all, delete-orphan', passive_deletes = True)
6062

6163
def __repr__(self):
6264
return self.title
@@ -82,6 +84,7 @@ class Comment(db.Model):
8284
comment_time = db.Column(db.DateTime(), default=datetime.datetime.now())
8385
platform = db.Column(db.String(50))
8486
browser = db.Column(db.String(100))
87+
is_read = db.Column(db.Boolean,default=False)
8588
parent_id = db.Column(db.Integer, db.ForeignKey('comments.id'))
8689
replies = db.relationship('Comment', backref=db.backref("parent", remote_side=[id]), lazy='dynamic')
8790

@@ -103,7 +106,7 @@ class History(db.Model):
103106
__tablename__ = 'history'
104107
id = db.Column(db.Integer, primary_key=True)
105108
ip = db.Column(db.String(128))
106-
post_id = db.Column(db.Integer,db.ForeignKey('posts.id'))
109+
post_id = db.Column(db.Integer,db.ForeignKey('posts.id',ondelete='CASCADE'))
107110
platform = db.Column(db.String(50))
108111
browser = db.Column(db.String(100))
109112
visit_time = db.Column(db.DateTime(), default=datetime.datetime.now())

0 commit comments

Comments
 (0)