Django2.0教程学习笔记
文章平均质量分 84
最近深入学习Django,根据杨仕航Django2.0教学视频所作笔记。具体内容见杨仕航B站教学视频(https://space.bilibili.com/252028233/#/video)
张张张与 π
这个作者很懒,什么都没留下…
展开
-
【Django2.0学习笔记】43.用QQ登录到我们的网站
暂无内容(因为本人没有进行备案,所以本节暂无笔记)原创 2020-10-24 11:30:15 · 193 阅读 · 0 评论 -
【Django2.0学习笔记】Django2.0视频学习个人笔记
B站视频教程链接:再敲一行代码(杨仕航)目录:第1部分 Django基本认识01.什么是Django02.入门仪式:Hello World03.Django基本应用结构04.使用模版显示内容05.定制后台和修改模型第2部分 以实际项目带动学习06.开始完整制作网站07.构建个人博客网站08.常用的模版标签和过滤器09.模版嵌套10.使用CSS美化页面11.CSS框架协助前端布局12.Bootstrap响应式布局13.分页和shell命令行模式14.优化分页展原创 2020-10-14 17:08:01 · 418 阅读 · 0 评论 -
【Django2.0学习笔记】01.什么是Django
01、什么是Django什么是Django1、什么是Django“DjangoThe web framework for perfectionists with deadlines.”——在截止日期内,完美主义者使用的Web框架“Django was invented to meet fast-moving newsroom deadlines, while satisfying the tough requirements of experienced Web developers.”——Dja原创 2020-10-14 17:08:15 · 281 阅读 · 0 评论 -
【Django2.0学习笔记】番外篇:Django admin全面汉化
番外篇:Django admin全面汉化1、admin汉化的作用1)方便自己阅读2)方便他人使用2、admin汉化相关内容1)语言2)时区3)字段名4)admin自定义字段名5)模块名称6)app名称7)admin后台标题打开项目的settings(这里是base.py),将LANGUAGE_CODE改为'zh-hans'# LANGUAGE_CODE = 'en-us'LANGUAGE_CODE = 'zh-hans'base.py:# TIME_ZONE原创 2020-10-26 16:00:58 · 482 阅读 · 0 评论 -
【Django2.0学习笔记】番外篇:外键那些事儿
番外篇:外键那些事儿1、什么是外键外键是数据表用来指向某个外来的键值的字段。这个外键键值代表另外一个表的某条记录2、为什么使用外键(作用)1、去除冗余的数据2、数据结构化,使用和执行效率更高3、便于管理,更好地存储数据3、外键的种类常见外键:ForeignKey多对多:ManyToManyField一对一:OneToOneField万能外键:ContentTypegithub外键示例代码4、ForeignKey1、原理2、如何使用举例:学生与班级3、属原创 2020-10-26 15:48:54 · 544 阅读 · 0 评论 -
【Django2.0学习笔记】46.完结,新的开始
46、完结,新的开始1、衔接上一节课的内容站内简单搜索——通过标题搜索博客,支持多个关键字1、搜索框响应式布局使用flex布局2、全文搜索过于复杂,超出博客应用开发的范畴有兴趣可以使用Haystack,接入全文搜索引擎1)Solr2)ElasticSearch3)Whoosh4)Xapian如果数据库是PostgresSQL的全文搜索(https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/search/)原创 2020-10-26 15:15:34 · 266 阅读 · 0 评论 -
【Django2.0学习笔记】45.站内简单搜索
45、站内简单搜索1、搜索功能作用1、让更多博客内容被挖掘出来2、用户体验更好2、搜索功能实现方法1、用户提交搜索请求(参数搜索关键字)2、根据关键字查找博客标题和内容(通过filter筛选方式)我们先要实现在页面加一个搜索框,加在导航栏的右侧,那这就要加到最底层的模板,查看Bootstrap,在“组件”——“导航条”,修改base.html如下:刷新页面这个submit按钮有点多余,我们可以改个样式,查看Bootstrap组件 图标修改base.html如下:原创 2020-10-26 14:59:35 · 370 阅读 · 0 评论 -
【Django2.0学习笔记】44.站内消息通知
44、站内消息通知(Part1)1、为什么需要站内消息通知1)弥补发送邮件通知的不足邮件发送不了邮件被归为垃圾邮件用户不能登录邮箱2)形成较为完整的体验2、要实现什么功能1)消息中心2)什么情况需要通知评论/回复发送消息通知被评论的人点赞发送消息通知被点赞的人用户注册发送消息(更多,例如公告…)3)点击消息,跳转到对应页面这次课主要实现上面三个功能,那么要怎么去实现呢,这谢消息都是具体的一条条数据,是需要保存到数据库的,随时可以去查看,这样的话,我们就需原创 2020-10-26 11:55:41 · 2874 阅读 · 4 评论 -
【Django2.0学习笔记】42.阶段性总结和后续开发
42、阶段性总结和后续开发1、阶段性总结个人博客网站:项目管理IDE本地虚拟环境Git/Github前端开发html + javascript + CSSjQueryBootstrapajax后端开发博客管理和展示用户登录和注册——>第三方登录评论和回复点赞数据库和服务器MySQLLinux网站部署2、部署完成之后(1)开发 ——>(2) 部署上线 ——>(3)持续更新:内容更新功能更新:新需求、提升用户原创 2020-10-24 10:00:44 · 376 阅读 · 0 评论 -
【Django2.0学习笔记】41.域名、备案和https
41、域名、备案和https(Part1)1、使用域名的好处使用ip地址进行访问:1)不太方便记忆2)不用备案使用域名进行访问:1)方便记忆2)有利于建立品牌2、申请和购买域名域名运营商:万网、阿里云、腾讯云、xx云…域名构成:baidu.com,其中baidu是域名主体,com是域名后缀二级域名:比如 www.baidu.com、map.baidu.com、image.baidu.com搜索“阿里云”——“域名注册”——搜索自己定义的域名——加入清单——结算原创 2020-10-24 09:34:07 · 785 阅读 · 0 评论 -
【Django2.0学习笔记】40.部署配置清单
40、部署配置清单这个部署配置清单是指,我们部署到服务器之后,还要对哪些配置进行修改1、为什么部署之后要针对【】配置开发环境:一般是本地电脑为开发服务,一般不会接触到外界生产环境:服务器提供web服务,面临外界复杂未知的环境,可能存在各种危险(XSS攻击、DDos攻击、盗链、渗透、爬虫、暴力破解、安全漏洞等等)1)在互联网的人并非全都是友好的2)要有防范安全意识和相关措施3)Django已经为我们做了不少安全处理2、Django部署配置清单1原创 2020-10-23 16:06:56 · 623 阅读 · 0 评论 -
【Django2.0学习笔记】39.用Nginx+uWSGI部署
39、用Nginx+uWSGI部署1、web服务怎么提供服务2、使用Nginx+uWSGI部署1)安装uwsgi2)测试uwsgi3)安装Nginx4)配置我们在git登录服务器后台首先我们安装uwsigi:输入pip3 install uwsgi。这里我们要注意一点,我们没有开启虚拟环境,而是直接安装到系统环境,公共环境,很多教程或者文章都是安装到虚拟环境,实际上我们正式用的时候是会放到外边的。第二点,安装这个的时候,还要安装python的开发包(我们前面已经安装过,这里就不用原创 2020-10-23 13:53:02 · 322 阅读 · 0 评论 -
【Django2.0学习笔记】38.用Apache+mod_wsgi部署
38、用Apache+mod_wsgi部署1、web服务器怎么提供服务浏览器 请求 web服务器,web服务器 响应 浏览器——http协议web服务器 从 web服务器软件 接手请求,web服务器软件响应web服务器web服务器软件 和 Django程序 之间怎么交互?——WSGI(Web Server Gateway Interface)规范Linux常用的web服务器软件:Apache、NginxApache:模块多,功能强大内置了对PHP,Python,Perl原创 2020-10-23 10:44:50 · 649 阅读 · 0 评论 -
【Django2.0学习笔记】37.部署准备(三):服务器
37、部署准备(三):服务器我们网站放到哪里,怎么让别人去访问,这个实际上我们会放到一个叫做服务器的东西1、什么是服务器流通信息,存储数据服务器是为我们提供服务的计算机访问某个网站实际上是访问某个服务器给我们提供的信息要了解到什么是服务器的话,这里就要提到一个概念:互联网。假如我们有多台电脑,在某个地方或者某个区里面,这些电脑相互连接,组成一个局部的网络。世界上存在很多局部网络,这些网络再以某种形式把它连到一起,就形成一个互联网,互联网实际上是这些网络的一个连接。只要大家能连上互联网的原创 2020-10-22 16:28:34 · 396 阅读 · 2 评论 -
【Django2.0学习笔记】36.部署准备(二):MySQL
36、部署准备(二):MySQLB站教程视频链接:36.部署准备(二):MySQL1、什么是MySQLMySQL是一款跨平台的开源的关系型数据库2、为什么使用MySQL-MySQLSQLite特点为服务器端而设计轻量级、可嵌入高并发访问能不能占用内存比SQLite大小适用性服务器适合桌面应用和手机应用3、如何使用MySQL1、安装MySQL1)下载MySQL2)路径加入系统环境3)配置MySQL4)启动服务5)设置r原创 2020-10-21 16:27:30 · 380 阅读 · 0 评论 -
【Django2.0学习笔记】35.部署准备(一):Git
35、部署准备(一):Git1、什么是GitGit是一款开源的分布式版本控制系统随着敲代码和修改代码,。我们的代码会更新很多个版本版本控制系统:控制代码版本2、集中式和分布式3、为什么使用Git1、快速控制服务器代码版本2、有利于团队协作4、如何使用Git1、安装Git(Linux和Mac一般默认有Git)2、使用GitHub3、下载代码git clone4、查看状态git status5、添加代码git add .6、忽略文件ignore7、提交代码git原创 2020-10-21 14:51:06 · 266 阅读 · 0 评论 -
【Django2.0学习笔记】34.评论发送邮件通知
34、评论发送邮件通知1、利用邮件提高访问量进一步发挥邮箱作用一旦被评论(回复)了,发邮件通知,让用户再次访问我们的网站在comment/views.py中的update_comment,我们提交评论之后,就可以发送邮件。该怎么发送邮件通知分两种情况:一种是评论博客的,一种是回复评论的。我们可以通过parent进行判断,如果有parent,说明是回复评论的。修改如下(其中的send_email,参考user/views.py中的send_email):text = comment.text原创 2020-10-21 13:43:09 · 402 阅读 · 0 评论 -
【Django2.0学习笔记】33.发挥邮箱作用
33、发挥邮箱作用1、邮箱发挥作用减少垃圾用户保证账户安全推送消息(通知)2、引导用户填写邮箱可从注册的时候要求填写邮箱:(1)发送邮件,填写验证码(2)发送验证邮箱链接(3)直接使用邮箱注册当然也可以不要求填邮箱建议:一经绑定,不可解绑第一种方式:发送邮件,填写验证码我们想在注册表单上加多一个验证码字段,点击“发送验证码”,填写上验证码就可以。修改user/forms.py中的RegForm如下(复制BindEmailForm里面验证码那段代码):另外,我们还要让页原创 2020-10-21 10:39:04 · 423 阅读 · 0 评论 -
【Django2.0学习笔记】32.修改用户信息
32、修改用户信息在“个人资料”这里,我们要实现点击“修改昵称”弹出一个form表单出来,这里有多种方式可以实现,可以弹出一个小窗口,也可以用ajax提交的形式,但这些写的代码会有点多。这里我们采用一种方法:打开一个form表单,我们把这个form表单做的比较通用。因为我们发现之前的user里面登录和注册的html代码写的差不多那现在我们要给一个form表单 填新的昵称,在user/forms.py里新建一个修改昵称的form有了这个form表单,我们还需要有一个具体的处理方法去把它给渲染出来,原创 2020-10-20 17:16:56 · 1601 阅读 · 0 评论 -
【Django2.0学习笔记】31.自定义用户模型
31、自定义用户模型我们上节课在导航栏加了登录、注册和用户个人信息,在个人信息这里的个人资料,我们可能需要昵称这个信息,但我们这里没有昵称,因为系统自带的用户模型里没有这个字段,我们要想办法给它加一个这个字段1、拓展方法1、继承Django的用户模型2、新的模型拓展关联User2、继承Django用户模型方法:1)自定义模型继承AbstractUser2)配置settings的AUTH_USER_MODEL使用:外键关联settings.AUTH_USER_MODEL用get_原创 2020-10-20 15:41:29 · 585 阅读 · 0 评论 -
【Django2.0学习笔记】30.导航栏添加用户操作
30、导航栏添加用户操作1、方便登录登出导航栏右侧添加“登录、注册”或用户信息查看Bootstrap里面“组件”——“导航条”复制代码,打开templates/base.html,粘贴进去。if判断,显示未登录状态的页面导航栏显示和登录之后的页面导航栏显示然后这里的“登录”和“注册”,参考blog_detail.html里面尚未登录部分的代码:参考,继续修改base.html如下:刷新页面,未登录时候,右上角导航栏显示有“登录”和“注册”的选项::点击右上角的“注册”,可以跳原创 2020-10-20 14:42:36 · 980 阅读 · 0 评论 -
【Django2.0学习笔记】29.完善点赞功能
29、完善点赞功能1、完善点赞功能1、新增评论和回复无法点赞2、未登录情况下点赞2、新增评论和回复无法点赞新增评论和回复没有onclick事件字符串拼接问题完善问题一:新增评论和回复无法点赞在blog_detail.html页面,在新增评论这部分(在{% block script_extends %}里的插入评论和插入回复的部分),只有评论,没有点赞,这里我们要改成和评论列表部分的评论和回复处的代码一样,有点赞的onclick事件。但我们看到新增评论这里,这一串html代码维护起原创 2020-10-20 11:48:28 · 385 阅读 · 0 评论 -
【Django2.0学习笔记】28.用所学知识实现点赞功能
28、用所学知识实现点赞功能1、点赞功能设计1、博客和评论、回复可点赞2、可取消点赞3、可看到点赞总数因为点赞是一个独立的功能模板,它可以加到任意位置,所以最好是新创建一个点赞app,python manage.py startapp likes,app创建完成后,到里面的models.py进行创建:# # C:\Users\12482\Desktop\py_learn\Django2.0_chapter46\mysite_env\mysite\likes\models.pyfrom原创 2020-10-20 09:51:59 · 1278 阅读 · 2 评论 -
【Django2.0学习笔记】27.获取评论数和细节处理
27、获取评论数和细节处理1、如何获取评论数方法:filter筛选再用count方法计数问题:页面和代码更加复杂了修改blog/views.py如下:修改blog_detail.html如下:刷新页面,可以看到在博客详情页面就有显示评论数了接着我们要让博客列表页面也显示出评论数2、自定义模板标签降低耦合,代码更加独立和使用更加简单在app内创建templatetags包创建py文件load标签加载该文件在comment文件夹下面新建一个文件夹templatetag原创 2020-10-19 18:21:18 · 352 阅读 · 0 评论 -
【Django2.0学习笔记】26.回复功能设计和树结构
26、回复功能设计和树结构本节课想要实现如下效果:1、如何设计回复功能评论可被回复回复可被回复在comment/models.py中,如果新添加一个回复的类Reply,外键关联到Comment这个类,这样可以实现“评论可被回复”,但“回复可被回复”这个功能,又得新建一个类,然后外键关联到Reply,这样关联下去,显然是不可行的。实际上,回复也是一种评论的行为,说明回复的本质也是评论,既然这样的话,那我们回复功能可不可以在Comment这个模型里面实现呢?'content_object’原创 2020-10-19 17:08:49 · 522 阅读 · 3 评论 -
【Django2.0学习笔记】24.使用Django Form表单
24、使用Django Form表单1、Django Form的作用Django用Form类描述html表单,帮助或简化操作1、接收和处理用户提交的数据可检查提交的数据可将数据转换成Python的数据类型2、可自动生成html代码打开具体博客页面,有登录框,那如果我们在其他地方需要登录才能继续操作,那我们就得再写一个form标签,每个需要登录的地方都这样做的做,就比较麻烦、分散。这里我们可以把登录专门放到一个页面,不管哪个地方需要登录,我我们点击那个按钮或者链接,它就跳转到登录页面原创 2020-10-19 11:19:59 · 379 阅读 · 0 评论 -
【Django2.0学习笔记】23.html表单提交评论
23、html表单提交评论这节课想要做成如下的效果1、提交评论评论对象评论内容评论时间评论者先简单的对页面进行css布局样式优化,打开blog_detail.html修改如下:修改blog.css如下:刷新页面登录之后会跳转到首页,我们还要去找到原来博客的页面,有点不方便。这里最好点登录的时候会自动跳转到原来页面。在mysite/views.py中,登录成功之后我们重定向到首页那我们有没有办法记录跳转之前的页面,修改mysite/views.py如下。request发原创 2020-10-18 17:22:11 · 583 阅读 · 0 评论 -
【Django2.0学习笔记】22.评论功能设计和用户登录
22、评论功能设计和用户登录1、实现评论功能的方式1、第三方社会化评论插件:有言、多说、畅言、Disqus网易云跟帖2、Django评论库 django-comment3、自己写代码实现2、创建评论模型评论对象评论内容评论时间评论者打开项目cmd,输入..\Script\activate启动虚拟环境,输入python manage.py startapp comment创建app(1)第一步:创建模型。打开comment\models.py:# # C:\Us原创 2020-10-18 16:39:49 · 638 阅读 · 0 评论 -
【Django2.0学习笔记】番外篇:在pythonanywhere部署
番外篇:在pythonanywhere部署1、本次课程目的进一步激发大家的学习激情2、部署上线常见主机1、Pythonanywhere、heroku2、云主机:阿里云、亚马逊、其他各种云…学习成本、经济成本、网站用途打开 https://www.pythonanywhere.com输入用户名、密码、邮箱,然后打开邮箱,点击链接 确认邮箱地址这里分四部分:控制台终端Consoles、文件Files、日志Notebooks、Web apps,导航栏目前还不支持Djan原创 2020-10-17 17:09:10 · 552 阅读 · 1 评论 -
【Django2.0学习笔记】21.热门阅读博客排行及缓存提速
21、热门阅读博客排行及缓存提速1、利用阅读量数据排行1、24小时内 ——> 今天数据统计2、昨日 ——> 昨天数据统计3、一周4、30天我们先来完成第一个功能:24小时内(今日)数据统计我们可以考虑写到阅读计数 read_statistics 这个app里面修改 read_statistics 下的 utils.py 如下:修改全局 mysite/views.py如下:修改首页 home.html如下:刷新页面:我们点击一下(让今天有博客阅读量),然后再刷原创 2020-10-16 19:20:41 · 237 阅读 · 0 评论 -
【Django2.0学习笔记】20.阅读计数统计和显示
20、阅读计数统计和显示1、简单计数方法的缺点:1、后台编辑博客可能影响数据2、功能单一,无法统计某一天的阅读数2、统计需要记录明细例如:120 —> 2月1号 20、 2月2号 60、2月3号 401、模型models修改read_statistics\models.py代码如下:数据库同步:2、admin修改admin.p如下:启动服务器,刷新页面添加一条记录接下来我们要考虑一个问题,这个数据我们怎么加 什么时候加 怎么去统计单天或者对应博客阅读数原创 2020-10-16 17:28:08 · 464 阅读 · 0 评论 -
【Django2.0学习笔记】19.博客阅读计数优化
19、博客阅读计数优化1、简单计数方法的缺点1、后台编辑博客可能影响数据2、功能单一、无法统计某一天的阅读数2、计数功能独立博客内容——Blog计数字段——Read Num造成这两个缺点的原因就是我们把计数字段和博客内容放到了一起。那么我们能不能将这两块分开呢?然后通过外键关联。最直接的方法就是创建一个模型,这个模型用来记录计数字段信息在models.py中添加代码如下:删掉admin.py中的‘read_num’同步迁移数据库修改admin.py如下:启动本地服原创 2020-10-16 16:18:52 · 274 阅读 · 0 评论 -
【Django2.0学习笔记】18.博客阅读简单计数
18、博客阅读简单计数1、简单计数处理1、Blog模型添加数字字段记录2、每次有人打开,记录数+1在model.py的Blog类里面新增一个字段,修改models.py如下:同步修改admin.py如下:同步迁移数据库,启动,然后修改views.py里的blog_detail如下:然后我们点击浏览博客30详情页面,在回到后台页面刷新,可以看到博客30的read_num增加了1接下来我们把阅读量信息加到博客详情页面中显示修改blog_detail.html接着,我们让原创 2020-10-16 14:09:28 · 175 阅读 · 0 评论 -
【Django2.0学习笔记】17.博客后台富文本编辑
17、博客后台富文本编辑1、使用html丰富页面简单文本编辑——直接贴入html代码富文本编辑——最终解析成html——富文本编辑器、markdown编辑器(1)简单文本编辑——>直接贴入html代码打开blog_detail.html,输入{{ blog.content }}那里加一个过滤器{{ blog.content | safe }},然后在后台中修改博客内容如下:然后访问该博客的详细页面,可以看到已经实现了加粗和换行的效果但是在博客列表页面,还是有显示标签内容,我们需要原创 2020-10-16 11:42:57 · 306 阅读 · 0 评论 -
【Django2.0学习笔记】16.博客分类统计
16、博客分类统计我们想要在博客分类栏和日期归档栏得到每个分类的博客数量修改views.py如下:(1)博客分类(2)日期归档修改blog_list.html如下:(1)博客分类(2)日期归档刷新页面:除此以外,有没有一个更方便的办法呢?django给我们提供了方法1、annotate注释使用annotate拓展查询字段可以修改views.py中博客分类的博客数量如下:...原创 2020-10-16 10:58:17 · 265 阅读 · 0 评论 -
【Django2.0学习笔记】15.上下篇博客和按月分类
15、上下篇博客和按月分类我们打开一篇博文之后,如果我们想要看上一篇下一篇,有一个直接的链接可以点击,就会方便很多,那么自然而然就会产生这样的需求:有上一篇下一篇的按钮1、上一篇和下一篇博客对比当前博客,得到上一篇或下一篇比如:假如我们打开的是id=3的博客,它的上一篇就是id=4的博客,下一篇就是id=2的博客。既然我们是按照创建时间倒序排序的,那么能不能按照创建时间来进行。这里我们就可以用filter,通过某些条件进行查询,得到QuerySet,比如想找到上一篇博客,即日期比2018年原创 2020-10-16 10:32:44 · 492 阅读 · 0 评论 -
【Django2.0学习笔记】14.优化分页展示
14、优化分页展示修正上节课的两个地方:比如,如果每页显示两篇博客,那么底部的页面就会很长,过多的页码选择,影响页面布局1、优化分页展示友好的用户体验1)当前页高亮2)不要过多页码选择,影响页面布局1)修改blog_list.html:{# 全部页码 #}{% for page_num in page_of_blogs.paginator.page_range %} {# 判断是否是当前页,如果是当前页,则高亮显示(设置class为active),否则正常显示 #}原创 2020-10-15 17:30:58 · 285 阅读 · 0 评论 -
【Django2.0学习笔记】13.分页和shell命令行模式
13、分页和shell命令行模式1、为什么先讲分页功能(1)新增或编辑博客内容(2)博客文章数较多–>全部加载过慢–>分页加载为了夯实基础,借机讲shell模式、模型操作、模板标签、分页器2、快速添加博客shell命令行模式添加博客(1)python manage.py shell(2)for循环执行新增博客代码3、模型新增对象from blog.models import Blogblog = Blog()blog.title = "xxx"...blo原创 2020-10-15 16:58:09 · 315 阅读 · 0 评论 -
【Django2.0学习笔记】12.Bootstrap响应式布局
12、Bootstrap响应式布局这节课我们完成对博客列表页的修改想要实现的效果如图响应式布局:根据屏幕的大小自动地控制调整页面布局在www.bootcss.com页面的“全局CSS样式”——“栅格系统”、“栅格参数”:分为四种屏幕大小:xs(手机)、sm(平板)、md(桌面显示器)、lg(大桌面显示器)。“实例:从堆叠到水平排列”:.col-md-8表示:列-屏幕大小-占多少列宽度,1、Bootstrap的响应式设计适应4种屏幕大小、12列布局< 768px(手机)>原创 2020-10-15 15:56:05 · 424 阅读 · 0 评论 -
【Django2.0学习笔记】11.CSS框架协助前端布局
11、CSS框架协助前端布局1、为什么用CSS框架1、不会或不怎么会CSS2、不知道如何设计前端样式3、从头到尾写整个网站的CSS代码量大4、…2、如何选择CSS框架易用性兼容性大小效果功能————Bootstrap——文档齐全,使用简单兼容较多浏览器非轻量级扁平、简洁组件齐全、响应式3、部署Bootstrap1、打开bootstrap网站www.bootcss.com2、下载Bootstrap3、引用Bootstrap4、开始使用下载原创 2020-10-15 14:43:16 · 402 阅读 · 3 评论