一、Django-blog-material-x

 

  • 本站是基于的Hexo博客主题 Material X ,使用 Python3.6.3+Django3.0.7编写;
  • 后台集成富文本编辑器 django-ckeditor;
  • 代码高亮使用 Prism插件,可选择自己喜欢的样式,替换静态文件中的highlight\prism.css文件即可;

 

项目地址: https://github.com/Bgods/Django-blog-material-x

1、页面

  • 侧边栏有

侧边栏有个人卡片、、广告位、友情链接、热门标签、音乐插件,可在默认配置文件及后台管理修改相关设置。

  • 主页

  • 博客列表页

  • 归档

  • 标签

  • 博客正文

博客正文支持代码高亮,支持显示文章目录。

  • 评论

评论区支持富文本编辑器 django-ckeditor,评论支持邮箱通知

2、后台管理

使用simpleui第三方后台管理工具,特色如下:

  • 编辑器

后台集成编辑器 django-ckeditor

  • 后台管理主页

  • 博客文章管理

  • 友情链接管理

  • 音乐插件管理

支持虾米音乐、QQ音乐、酷狗音乐、网易云音乐。注意设置多个时,只有一个是有效,因此可以将其他设置为不启用,只需要启用一个即可。

  • 评论管理




评论

支持上传图片(拖动图片或者截图粘贴)

148 评论
gkmlglpolvChrome/43.0.2357.81Macintosh; Intel Mac OS X 10_10_3
2026-04-13 07:39:10 回复

uyvejkesuvlovrwfjqxysmdruqgqqy

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 20:36:09 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:19 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:02:31 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:01:38 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:41 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:39 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:36 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:34 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:32 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:00:27 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:59:30 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:58:57 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:58:24 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:57:48 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:57:16 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:56:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:56:03 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:55:16 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:54:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:53:28 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:53:18 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:53:14 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:53:09 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:53:05 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:59 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:54 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:41 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:37 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:34 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:31 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:28 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:51:11 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:50:03 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:58 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:56 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:51 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:49 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:48 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:49:47 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:48:40 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:48:00 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:47:36 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:47:08 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:46:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:46:17 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:45:48 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:45:22 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:44:48 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:30 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:28 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:26 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:23 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:19 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:15 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:07 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:58 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:40:46 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:31:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:31:26 回复

555

@@hEE3kChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:31:04 回复

555

nZkkAbWB'"Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:31:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:31:01 回复

555

nZkkAbWBH7fyI2pm'Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:29:41 回复

555

-1" OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:50 回复

555

-1' OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:48 回复

555

-1 OR 5*5=25Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:45 回复

555

-1 OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:38 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:58 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:30 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:29 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:27 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:12 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:10 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:09 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:06 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:23:37 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:23:16 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:57 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:41 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:26 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:12 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:21:53 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:21:35 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:53 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:19 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:14 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:12 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:11 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:07 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:03 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:01 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:19:31 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:19:04 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:35 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:24 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:14 回复

(select 198766*667891 from DUAL)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:13 回复

(select 198766*667891)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:09 回复

@@fDEP1

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:07 回复

555����%2527%2522\'\"

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:05 回复

555'"

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:03 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:17:01 回复

555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:16:46 回复

555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:16:36 回复

555B0xwTS1s')) OR 731=(SELECT 731 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:16:26 回复

5550nIJg23n') OR 32=(SELECT 32 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:16:15 回复

555WWG9FCBI' OR 460=(SELECT 460 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:16:08 回复

555-1)) OR 662=(SELECT 662 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:58 回复

555-1) OR 141=(SELECT 141 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:49 回复

555-1 OR 924=(SELECT 924 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:42 回复

555kNIAPqAC'

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:35 回复

555-1 waitfor delay '0:0:15' --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:27 回复

555-1)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:20 回复

555-1

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:12 回复

(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:15:04 回复

5550"XOR(555*if(now()=sysdate(),sleep(15),0))XOR"Z

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:56 回复

5550'XOR(555*if(now()=sysdate(),sleep(15),0))XOR'Z

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:48 回复

555*if(now()=sysdate(),sleep(15),0)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:40 回复

-1" OR 5*5=25 or "lx1ByeDn"="

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:39 回复

-1' OR 5*5=25 or 'K9kYrjee'='

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:36 回复

-1" OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:36 回复

-1' OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:33 回复

-1 OR 5*5=25

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:31 回复

-1 OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:30 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:21 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:14:14 回复

555

ozqenovxpkChrome/43.0.2357.130Windows NT 6.3; WOW64
2026-01-28 11:54:53 回复

ygupjhkfwmqyklwvlxvskeyhukromv

wnwtslkdwgUnknown BrowserWindows NT 10.0; Win64; x64; Trident/7.0; rv:11.0
2025-12-22 06:56:52 回复

gewhtyejxpfkzdrydotdvtnwuzfsmq

gsgtuyordyChrome/40.0.2214.45Windows NT 6.1; WOW64
2025-12-19 11:50:08 回复

egnxflygtyhqrquvufsyyfoquqxmfp

ziwexinirxUnknown BrowserMacintosh; Intel Mac OS X 10.9; rv:34.0
2025-11-27 06:21:56 回复

jkfxrzpmfwkpwitwrgevtfgmiiqstf

ezuuxnhrwmChrome/40.0.2214.93Windows NT 6.1; WOW64
2025-11-15 05:45:35 回复

yxllmeixqlizsloouqnzyswdfwnend

fhqxigqpuzVersion/7.1.3Macintosh; Intel Mac OS X 10_9_5
2025-10-16 02:46:40 回复

hzvywmuxxlfnxnnylyyuslozdopzgg

kllwifyuoeVersion/8.0Macintosh; Intel Mac OS X 10_10
2025-07-17 01:38:45 回复

yerqyzfmkkddqdridythihhtyskkqj

zsgdxhqlwgUnknown BrowserWindows NT 6.1; Win64; x64; Trident/7.0; rv:11.0
2025-07-14 10:07:22 回复

ueqswyhxnmmnomudoxpxnzrvpnwyis

vkfnxqutyqChrome/30.0.1599.101Windows NT 6.3; WOW64
2025-07-09 11:37:15 回复

ljkkztfvjnueehkidsezihnsrewymz

zxeqxojmtmChrome/45.0.2454.85Windows NT 5.2
2025-06-23 18:24:57 回复

qoqvhslyfgkyidgylhwsvzexvhhnvv

htpzwrnqitChrome/47.0.2503.0Windows NT 6.3; Win64; x64
2025-06-12 23:38:07 回复

rhrdhfomopyyltdetxvpghjpmhxzgd

jyoltwguupUnknown BrowserWindows NT 5.1; rv:39.0
2025-06-09 13:04:25 回复

hpdtpujlifgkrqenyrxqgpgrjskvhf

curry03Chrome/103.0.0.0Macintosh; Intel Mac OS X 10_15_7
2022-06-26 18:05:34 回复

你好,我想问一下。comment/views.py下引用了EmailMultiAlternatives,邮件可以正常发送成功。但是我看send_email方法中只入参了发件人和接收人的信息,但并没有入参(email_host,email_port,email_password等信息),email_host,email_port,email_password这些信息我是在setting里面配置的,他是怎么调用过去的。

bgods Chrome/103.0.0.0 Macintosh; Intel Mac OS X 10_15_7
2022-06-26 18:47:37 回复

@curry03 , EmailMultiAlternatives会自动调用setting 里面的设置的,只需要配置就行,如果想知道,可以看源代码

jmChrome/93.0.4577.82Macintosh; Intel Mac OS X 10_15_7
2021-09-26 01:47:04 回复

ERROR: Could not find a version that satisfies the requirement mysqlclient==2.0.1 (from versions: 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.3.8, 1.3.9, 1.3.10, 1.3.11rc1, 1.3.11, 1.3.12, 1.3.13, 1.3.14, 1.4.0rc1, 1.4.0rc2, 1.4.0rc3, 1.4.0, 1.4.1, 1.4.2, 1.4.2.post1, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 2.0.0, 2.0.1, 2.0.2, 2.0.3)

ERROR: No matching distribution found for mysqlclient==2.0.1

 

删了mysqlclient,过了

 

ModuleNotFoundError: No module named 'ckeditor'

看到 https://dev-qa.com/352279/django-why-after-installing-the-editor-crashes-the-website

python3 -m pip install --user django-ckeditor,解决

 

终于run起来了,一直想学一下python,打算从Django开始,想找一个源码看一下,嗯,那就从您的blog开始吧

MrBunChrome/92.0.4515.107Windows NT 10.0; WOW64
2021-08-11 11:32:59 回复

请问Hexo博客怎么跟Django对接呢?

我想自己试着写一个

bgods Chrome/92.0.4515.107 Windows NT 10.0; Win64; x64
2021-08-11 22:23:17 回复

@MrBun , 对接?不太了解的你的意思?Hexo是静态网站

bgods Chrome/92.0.4515.107 Windows NT 10.0; Win64; x64
2021-08-11 22:25:17 回复

@MrBun , 如果是按照hexo的页面,用django写的话,熟悉django的话这个很简单,先django的模板按照hexo的写就好了