1
1
import markdown
2
2
from flask import Blueprint , render_template , request , url_for , flash
3
3
from flask_login import login_required , current_user
4
+ from sqlalchemy import func
4
5
from sqlmodel import Session , select , desc
5
6
from werkzeug .utils import redirect
6
7
from datetime import datetime
7
8
8
- from app import engine
9
- from app .models import Post , User , Comment
9
+ from app import engine , app , mail
10
+ from app .md_processor import CustomMarkdownExtension
11
+ from app .models import Post , User , Comment , Like
10
12
from app .forms import CommentForm , EditCommentForm , PostForm
11
13
12
14
# 创建蓝图
@@ -22,7 +24,16 @@ def index():
22
24
.order_by (desc (Post .created_at ))
23
25
.limit (10 )
24
26
).all ()
25
- return render_template ('index.html' , posts = posts , datetime = datetime , len = len )
27
+
28
+ popular_posts = session .exec (
29
+ select (Post )
30
+ .order_by (desc (func .count (Like .id )))
31
+ .join (Like , isouter = True )
32
+ .group_by (Post .id )
33
+ .limit (5 )
34
+ ).all ()
35
+
36
+ return render_template ('index.html' , posts = posts , datetime = datetime , len = len , popular_posts = popular_posts )
26
37
27
38
28
39
@main .route ('/dashboard' )
@@ -47,7 +58,9 @@ def dashboard():
47
58
def create_post ():
48
59
form = PostForm ()
49
60
if form .validate_on_submit ():
50
- html_content = markdown .markdown (form .content .data ) # 解析 Markdown
61
+ html_content = markdown .Markdown (
62
+ extensions = [CustomMarkdownExtension ()]
63
+ ).convert (form .content .data ) # 解析 Markdown
51
64
new_post = Post (
52
65
title = form .title .data ,
53
66
content = form .content .data ,
@@ -78,7 +91,9 @@ def view_post(post_id):
78
91
def add_comment (post_id ):
79
92
form = CommentForm ()
80
93
if form .validate_on_submit ():
81
- html_content = markdown .markdown (form .content .data ) # 解析 Markdown
94
+ html_content = markdown .Markdown (
95
+ extensions = [CustomMarkdownExtension ()]
96
+ ).convert (form .content .data ) # 解析 Markdown
82
97
new_comment = Comment (
83
98
content = form .content .data ,
84
99
html_content = html_content ,
@@ -100,7 +115,7 @@ def edit_post(post_id):
100
115
if not post :
101
116
flash ('博文未找到!' )
102
117
return redirect (url_for ('main.dashboard' ))
103
- if post .author_id != current_user .id :
118
+ if post .author_id != current_user .id and not current_user . is_admin :
104
119
flash ('你没有编辑这篇博文的权限!' )
105
120
return redirect (url_for ('main.dashboard' ))
106
121
@@ -113,7 +128,9 @@ def edit_post(post_id):
113
128
else :
114
129
post .title = title
115
130
post .content = content
116
- post .html_content = markdown .markdown (content )
131
+ post .html_content = markdown .Markdown (
132
+ extensions = [CustomMarkdownExtension ()]
133
+ ).convert (content ) # 转换 Markdown
117
134
session .commit ()
118
135
flash ('你的博文已被更新!' )
119
136
return redirect (url_for ('main.view_post' , post_id = post .id ))
@@ -129,8 +146,8 @@ def delete_post(post_id):
129
146
if not post :
130
147
flash ('博文未找到!' )
131
148
return redirect (url_for ('main.dashboard' ))
132
- if post .author_id != current_user .id :
133
- flash ('你没有编辑这篇博文的权限 !' )
149
+ if post .author_id != current_user .id and not current_user . is_admin :
150
+ flash ('你没有删除这篇博文的权限 !' )
134
151
return redirect (url_for ('main.dashboard' ))
135
152
136
153
session .delete (post )
@@ -147,14 +164,16 @@ def edit_comment(comment_id):
147
164
if not comment :
148
165
flash ('评论未找到!' , 'error' )
149
166
return redirect (url_for ('main.index' ))
150
- if comment .author_id != current_user .id :
167
+ if comment .author_id != current_user .id and not current_user . is_admin :
151
168
flash ('你没有权限编辑这条评论!' , 'error' )
152
169
return redirect (url_for ('main.view_post' , post_id = comment .post_id ))
153
170
154
171
form = EditCommentForm ()
155
172
if form .validate_on_submit ():
156
173
comment .content = form .content .data
157
- comment .html_content = markdown .markdown (form .content .data ) # 解析 Markdown
174
+ comment .html_content = markdown .Markdown (
175
+ extensions = [CustomMarkdownExtension ()]
176
+ ).convert (form .content .data ) # 解析 Markdown
158
177
session .commit ()
159
178
flash ('评论已更新!' , 'success' )
160
179
return redirect (url_for ('main.view_post' , post_id = comment .post_id ))
@@ -173,7 +192,7 @@ def delete_comment(comment_id):
173
192
if not comment :
174
193
flash ('评论未找到!' , 'error' )
175
194
return redirect (url_for ('main.index' ))
176
- if comment .author_id != current_user .id :
195
+ if comment .author_id != current_user .id and not current_user . is_admin :
177
196
flash ('你没有权限删除这条评论!' , 'error' )
178
197
return redirect (url_for ('main.view_post' , post_id = comment .post_id ))
179
198
@@ -182,3 +201,39 @@ def delete_comment(comment_id):
182
201
session .commit ()
183
202
flash ('评论已删除!' , 'success' )
184
203
return redirect (url_for ('main.view_post' , post_id = post_id ))
204
+
205
+
206
+ @main .route ('/post/<int:post_id>/like' , methods = ['POST' ])
207
+ @login_required
208
+ def like_post (post_id ):
209
+ with Session (engine ) as session :
210
+ # 检查用户是否已经点赞过该博文
211
+ existing_like = session .exec (
212
+ select (Like )
213
+ .where (Like .user_id == current_user .id )
214
+ .where (Like .post_id == post_id )
215
+ ).first ()
216
+
217
+ if existing_like :
218
+ # 如果已经点赞过,取消点赞
219
+ session .delete (existing_like )
220
+ session .commit ()
221
+ flash ('已取消点赞!' , 'info' )
222
+ else :
223
+ # 如果未点赞过,添加点赞
224
+ new_like = Like (user_id = current_user .id , post_id = post_id )
225
+ session .add (new_like )
226
+ session .commit ()
227
+ flash ('点赞成功!' , 'success' )
228
+ return redirect (url_for ('main.view_post' , post_id = post_id ))
229
+
230
+
231
+ @app .errorhandler (404 )
232
+ def page_not_found (error ):
233
+ return render_template ('404.html' ), 404
234
+
235
+
236
+ @app .errorhandler (500 )
237
+ def internal_server_error (error ):
238
+ return render_template ('500.html' , error = error ), 500
239
+
0 commit comments