● 项目简介:基于Yii2.框架开发的博客系统,实现了系统前后台分离,实现了基本的博客文章、评论以及用户管理,并且进行了细节的改进,完成了功能相对齐全的系统。
● 使用的技术和工具:WampServer Version 2.5、Apache+MySQL+PHP、yii-advanced-app-2.0.8框架
Yii 应用参照模型-视图-控制器 (MVC)设计模式来组织。M模型代表数据、业务逻辑和规则;V视图展示模型的输出;C控制器接受出入并将其转换为模型和视图命令。
-
在前端frontend和后端backend的文件夹中:
-
config文件夹:配置文件存放的文件夹
-
assets文件夹:存放资源文件
-
controller文件夹:MVC中C文件存放的文件夹
根据相应的功能创建了管理员控制器、用户控制器、评论控制器、文章控制器以及网页 控制器,控制器从应用主体 接管控制后会分析请求数据并传送到模型, 传送模型结果 到视图,最后生成输出响应信息。
-
models文件夹:MVC中M文件存放的文件夹有用于重置密码、注册的表单模型文件,代表业务数据、规则和逻辑的对象。
-
runtime:日志文件
-
tests:测试脚本文件夹
-
views:MVC中V存放的文件夹
-
存放了布局、管理员、评论、文章等文件夹,这些文件夹里面的每一项对应一个视图文 件,实现出相应功能调用时应渲染出的页面样式,根据视图模板来创建视图,视图模板 为PHP脚本文件, 主要包含HTML代码和展示类PHP代码,通过view应用组件来管 理, 该组件主要提供通用方法帮助视图构造和渲染
-
web:web主应用入口脚本存放的位置
-
入口脚本主要完成以下工作:
-
定义全局常量;
-
注册 Composer 自动加载器;
-
包含 Yii 类文件;
-
加载应用配置;
-
创建一个应用实例并配置;
-
调用 yii\base\Application::run() 来处理请求。
-
-
common文件夹是一个共用的地方,前后台共用的模型文件如博客系统的评论、文章、用户等模型类文件就可以放在这里面
-
console文件夹中存放控制台执行的程序,比如存放一些定时执行的程序,或者需要在更底层的操作系统上运行的功能
-
environment文件夹放环境的配置文件
通过继承 yii\db\ActiveRecord基类来声明一个AR类,并实现相应的tablename方法,返回与之相关联的数据表的名称,AR对象的属性对应为数据行的列,可以直接用面向对象的方法来操纵数据表中的数据,这样就不用写SQL语句就可以实现数据库的访问
-
查询过程大致如下三个步骤:
-
通过 yii\db\ActiveRecord::find() 方法创建一个新的查询生成器对象;
-
使用查询生成器的构建方法来构建你的查询;
-
调用查询生成器的查询方法来取出数据到 Active Record 实例中。
-
-
Yii 提供了两个快捷方法:
-
yii\db\ActiveRecord::findOne():返回一个 Active Record 实例,填充于查询结果的第一行数据。
-
yii\db\ActiveRecord::findAll():返回一个 Active Record 实例的数据,填充于查询结果的全部数据
-
-
小部件DetailView
可用于显示一条记录数据,如ActiveRecord类的一个实例对象,通过调用DetailView::widget()方法实现,可以指定数据的展示格式
-
通过new一个新的文章对象,然后对其进行复制,在通过yii\db\ActiveRecord::save()
-
就可实现文章的新增,通过yii\db\ActiveRecord::findOne(),找到要进行修改的文章对象,然后对其进行修改,在调用yii\db\ActiveRecord::save()就完成了对文章的修改
-
表单ActiveForm,Yii中主要方式是通过 yii\widgets\ActiveForm将模型和表单结合在一起,此外,在 yii\helpers\Html 中有很多实用的方法为表单添加按钮和帮助文档。
-
GridView是Yii中的一个Widget,是Yii中功能最强大的小部件之一,非常适合用来建立系统的管理后台,用来展示数据表格,有排序,分页和过滤功能,其中的dataprovider键指定数据的数据提供者,filterModel键指定一个能够提供搜索过滤的搜索模型类如PostSearch,colums键指定需要展示的列及其格式
-
数据提供者dataProvider可以获取数据并提供给其他组件或页面使用
-
PostSearch提供搜索过滤的搜索模型类,属性和搜索表单对应,数据规则要重写,其实现靠查询构建器来程序化的构建查询然后交给数据提供者在后续的阶段去执行查询
-
将界面中的英文改为中文,并将评论的新增按钮去掉,调整表格的相应宽度,以及去掉不需要的列,评论状态用文字和下拉菜单过滤;评论者用用户名关联表取代原先的数字,并实现了搜索排序的功能
-
主要运用了Getter和Setter方法来实现属性的定义,Yii 引入了一个名为 yii\base\Object 的基类, 它支持基于类内的 getter 和 setter(读取器和设定器)方法来定义属性。 如果某类需要支持这个特性,只需要继承 yii\base\Object 或其子类即可。getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是: 当这种属性被读取时,对应的 getter 方法将被调用;而当属性被赋值时, 对应的 setter 方法就调用。
-
Bootstrap是一个优秀的,响应式框架,可以大大加快客户端的开发过程。Bootstrap的核心由两部分组成:基础CSS样式,如栅格化布局,排版,帮助类和响应式工具;开箱即用的组件,如表单,菜单,分页,模态框,标签等。
● 将待审核的评论排在前面,并用不同的底色区别,并完成审核动作的实现,并在顶部条形栏上,评论项处显示待审核评论条数的气泡
● 使用GridView小部件实现,并通过yii\grid\ActionColumn实现动作列的自定义
● 主要需要用到 bootstrap 的 徽章,首先在控制器中查出徽章中需要显示的那个数字
● 然后在视图文件中用徽章 badge 这个class样式即可
与文章的查看、修改删除实现方式相似
-
认证是鉴定用户身份的过程。它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份。认证是登录功能的基础。Yii提供了一个认证框架,它连接了不同的组件以支持登录。
-
将认证类改为common\models\Adminuser;调整Adminuser验证类,增加字段并用Gii修改代码等;建立后台登录的表单模型AdminLoginForm;调试验证类代码并设定后台专用session和前台分开。
取消新增用户、删除用户的按钮,将部分隐私字段隐藏,并将用户状态通过下拉菜单来设置;对管理员用户的管理则主要为添加重置密码按钮,和权限设置按钮
授权是指验证用户是否允许做某件事的过程。Yii提供两种授权方法: 存取控制过滤器(ACF)和基于角色的存取控制(RBAC)。存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法, 非常适用于仅需要简单的存取控制的应用。基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制。 Yii 实现了通用的分层的 RBAC,遵循的模型是 NIST RBAC model. 它通过 authManager application component 提供 RBAC 功能。使用 RBAC 涉及到两部分工作。
- 第一部分是建立授权数据,用数据迁移创建四张数据库表,准备来存放授权数据;通过authManager提供的API创建一个控制台命令初始化授权数据
- 第二部分是使用这些授权数据在需要的地方执行检查,用yii\web\User::can()方法来对当前登录的用户进行权限检查
-
用Gii建立了前台目录下文章的增删查改代码
-
运用数据小部件ListView显示数据提供者DataProvider提供的数据,每条数据用一个指定的子视图文件来渲染,集成了分页、排序这些特性,可以方便的显示数据以及管理数据
-
给文章增加URL属性,用getUrl方法给文章标题加上了链接
-
并加上发表时间和作者、面包屑导航等功能
自定义小部件,从yii\base\Widget继承类,重写yii\base\Widget::init()方法,处理小部件属性,ii\base\Widget::run()方法包含小部件渲染结果的代码
实现findTagWidgets()方法,用自定义小部件实现标签云
实现findRecentComments()方法,完成了最新评论的数据准备;并实现了用自定义小部件渲染最近回复这个模块
通过detail的视图来展示文章的详细情况,并实现了评论列表和评论提交的功能
-
除了用于构建 Web 应用程序的丰富功能,Yii 中也有一个拥有丰富功能的控制台, 它们主要用于创建网站后台处理的任务。
-
控制台应用程序的结构非常类似于 Yii 的一个 Web 应用程序。 它由一个或多个 yii\console\Controller 类组成,它们在控制台环境下通常被称为“命令”。 每个控制器还可以有一个或多个动作,就像 web 控制器。
-
控制台命令可以实现很多功能,比如数据库迁移、定时任务、清除应用临时缓存等诸自动化维护的功能。在实际项目开发中还是会经常用到的。
-
● 框架一般都采用入口程序和路由提交请求,再加上参数等内容,URL难免显得冗长,URL美化研究如何把一个冗长的地址美化成一目了然有意义的地址
-
● 好处
缩短URL隐藏实际路由提高安全性
易于被用户记忆和键入
易于被搜索引擎收录
③ 缓存
-
缓存是提升 Web 应用性能简便有效的方式。 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省了每次重新生成这些数据所需的时间。
-
缓存可以应用在 Web 应用程序的任何层级任何位置。 在服务器端,在较的低层面,缓存可能用于存储基础数据,例如从数据库中取出的最新文章列表; 在较高的层面,缓存可能用于存储一段或整个 Web 页面, 例如最新文章的渲染结果。在客户端,HTTP 缓存可能用于 将最近访问的页面内容存储到浏览器缓存中。
-
Yii 支持如上所有缓存机制:
-
数据缓存数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。 它也是更高级缓存特性的基础,例如查询缓存 和内容缓存。
-
片段缓存片段缓存指的是缓存页面内容中的某个片段。例如,一个页面显示了逐年销售额的摘要表格, 可以把表格缓存下来,以消除每次请求都要重新生成表格的耗时。 片段缓存是基于数据缓存实现的。
-
页面缓存页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。
-
HTTP 缓存,Web 应用还可以利用客户端缓存 去节省相同页面内容的生成和传输时间。通过配置 yii\filters\HttpCache 过滤器,控制器操作渲染的内容就能缓存在客户端。
-
① 检查测试前后端文章相关功能,比如文章的增加、删除和修改功能是否可以和相关数据库对应
② 检查测试小部件的效果功能,如前端的文章搜索小部件,是否可以达到预期关键词模糊搜索功能,以及标签云小部件,其样式是否能够按照标签出现的次数展示,并可以根据小部件上的关键词定位到相关的文章
③ 检查测试用户相关的功能,能否注册登录,能否在后台根据管理相应的权限,能否实现用户的增删改查等的功能
④ 检查页面的排布是否合理
⑤ 检查系统在不同的浏览器平台上是否可以正常的运行
① 防止批量注册,使用验证码,运用Yii自带的captcha验证码功能
② 用户名由字母,汉字,数字,下划线组成,且不能以数字和下划线开头,注册登录
表单SignupForm中用正则表达式实现这一用户名注册的需求
③ 重复两次密码输入
SignupForm中的规则rulers中添加规则,前后密码输入相同
利用网上现成的组件Ueditor,并将其引入/common/widgets,在需要处引用即可
为网页加入一个css以及js文件,改变原来较为粗糙的界面风格
自定义组件banner实现前端图片轮播功能,自定义view和相应的JavaScript脚本
为了后台系统的信息安全,后台系统用户必须登录后才可进入到后台系统,并且将后端和前端登录界面重写的更为美观
本次的Yii2.0博客系统的开发经历是一个十分宝贵的经历,从一开始看见框架文件,复杂的结构,各种脚本文件,一头雾水,到后来一步一步实现出博客系统,其中有各种页面崩溃,效果没有办法呈现等等的bug出现,但是经过沉下心来一点点领悟和改正,自己已经可以算是入门了基于Yii2.0的编程。从这次的实践经历中我学习到
① Web开发中MVC模式的应用的好处,是将业务逻辑从用户界面的考虑中分离,这样开发者就可以更容易地改变每一部分而不会影响其他;
② 约定优于配置(convention over configuration),是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性,在Yii框架中体现在运用Gii代码生成器,代码均遵从一定的规范,降低开发的复杂性;
③ ORM模型是表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂,ActiveRecord的主要思想是:1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;;3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;
④ Gii代码生成器优点在于简化了开发流程,可以生成绝大数的代码,开发后台等效率还是蛮高的,缺点在于很多时候还是需要很多自定义的东西,比如验证规则我们可能有我们自己的验证规则是数据库设计做不到或者比较难做到的,比如controller里面也是基本的crud,需要特殊的功能当然要亲自动手实现;
⑤ 查询构建器QueryBuilder与手撕SQL语句相比的好处在于查询构建器也是建立在 DAO 基础之上,可让你创建程序化的、DBMS 无关的 sql 语句,并且这样创建的 sql 语句比原生的sql 语句更易读、更安全。
⑥ Yii2中, 的RBAC管理, 涉及到的内容有: 权限, 角色, 规则, 为角色赋予权限, 为用户分配角色.
⑦ 前端基于Bootstrap这样的框架开发与自己从零开始编写CSS相比有好处在于,比较成熟,在大量的项目中充分的使用和测试,拥有完善的文档,使用起来更方便,有大量的组件样式,接受定制
⑧ URL rewrite的好处在于框架一般都采用入口程序和路由提交请求,再加上参数等内容,URL难免显得冗长,URL美化研究如何把一个冗长的地址美化成一目了然有意义的地址
⑨ 缓存是提升 Web 应用性能简便有效的方式。 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省了每次重新生成这些数据所需的时间。
从这次经历中我认识到只有理解了软件产品的本质及软件产品研发的思想精髓才可以很好的运用知识开发出高效的应用。在大学中应该打下扎实的计算机专业知识,这是能够从事软件一切工作最基本的前提,是软件工程最基本的素质,还要进行一些实践性强的项目,以及去接触最新软件技术;并且认识到软件开发本身有一个循序渐进的过程,其基础知识和实践经验需要不断的积累,从而详细制定自己学习计划,并注意及时修正和调整为今后面对工作挑战或是进一步的学习深造打下坚实基础。