first

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了first相关的知识,希望对你有一定的参考价值。

一、项目基本

目的:

①更加熟悉Thinkphp框架的使用

②熟悉各种技术在thinkphp框架中如何应用

例如jquery、ajax、ueditor、htmlpurifier、购物车等

③对商城项目的开发、维护有一定认识

 

1、搭建虚拟主机

打开apache的主机配置文件vhosts.conf,添加新的虚拟主机:

 

2、搭建thinkphp框架的运行环境

①把thinkphp的代码拷贝到站点根目录中

 

 

②    运行站点,使thinkphp自动生成home模块文件:

 

 

③创建Admin模块

方式一:直接复制Home模块,进行名称修改

 

方式二:使用thinkphp的配置文件进行自动生成(可以生成任何模块)

说明:在入口文件index.php中,添加一行配置,指定想要生成的模块,然后运行项目站点即可。

 

 

 

 

此时,会自动生成Admin模块:

 

 

测试:自动生成User模块:

 

 

成功。

此时,项目基本要素搭建完毕。

 

 

3、后台首页模板的搭建

①在后台模板中找到文件,并放入到后台首页的视图中

 

 

 

 

②修改后台首页控制器,展示页面:

 

 

③在Admin模块的配置文件中,配置资源文件的路径:

 

 

 

④把对应的资源路径替换成配置好的路径:

 

 

 

⑤预览结果

 

后台首页功能完成!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

二、商品管理(一)

1、创建商品表

数据库名:jxshop(注意字符集--utf8)

CREATE TABLE `jxshop_goods` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键‘,

  `goods_name` varchar(80) NOT NULL COMMENT ‘商品名称‘,

  `goods_price` decimal(10,2) NOT NULL DEFAULT ‘0.00‘ COMMENT ‘商品价格‘,

  `logo` varchar(200) NOT NULL DEFAULT ‘‘ COMMENT ‘商品logo‘,

  `sm_logo` varchar(200) NOT NULL DEFAULT ‘‘ COMMENT ‘logo小图‘,

  `mid_logo` varchar(2000) NOT NULL DEFAULT ‘‘ COMMENT ‘logo中图‘,

  `goods_desc` longtext COMMENT ‘商品描述‘,

  `add_time` int(11) NOT NULL COMMENT ‘添加时间‘,

  `upd_time` int(11) NOT NULL COMMENT ‘修改时间‘,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

 

 

2、商品添加页

①查找模板,找到合适的页面:

 

 

 

②在模板文件夹中,找到对应的文件form_validation.html,放入项目中的goods视图下:

 

 

③在admin模块下创建商品控制器,并做出添加页面展示效果的代码:

 

 

 

④把添加页面的CSS JS IMAGE资源文件的路径进行替换

 

⑤完成后,页面的效果如下:

 

 

 

 

 

 

 

 

3、商品添加页--左侧菜单、JS验证细节处理

①修改后台首页的左侧菜单使其变成如下:

 

 

代码部分:把原来的

 

 

 

修改为如下图,注意商品添加前面的超链接也要改。

商品管理下面多余的<li>标签全部删掉:

 

 

 

 

②修改验证的JS,使其能够配合我们的表单名称进行验证

 

找到form-validation.js,把自动验证的代码提取出来,

文件位置:\Public\Admin\js\form-validation.js

复制如下代码:

 

一直到:

 

 

 

,把它们粘贴到商品添加页,替换掉:

 

 

 

 

 

③修改表单的name和jQuery对应验证的部分,实现验证:

 

 

 

 

注意:上述过程中,删除了暂时不用的表单项,并且创建了和我们数据库中字段相同的表单内容。

 

 

修改jQuery代码,进行商品名称和价格的必填验证(暂时删掉了其他内容的验证):

 

 

 

 

此时,若是不填数据,则进行了验证:

 

 

验证正确后:

 

 

 

 

 

 

4、完成商品添加功能--钩子、自动验证

①修改表单,让其能够提交到我们自己的控制器中:

 

 

因为这个提交按钮绑定的是“验证”事件,我们要把其改成为“提交“事件。

 

 

修改位置:

 

②在控制器中接收post提交过来的数据:

 

 

③创建goodsModel模型,用于后台数据自动验证

 

 

在控制器使用“D”方法去实例化一个模型:

 

 

 

 

④在模型中创建允许接收的字段和一套验证规则:

 

在控制器中,使用create()方法来触发验证:

 

 

④连接数据库

模型验证需要数据库的支持,在Application/Common/Conf/config.php中,配置数据库相关信息:

 

 

⑤开始验证

连接成功后进行测试:

(不写商品名)

 

 

报错:

 

 

⑥优化错误提示

在控制器中,取出模型中的错误信息,并通过error()方法进行跳转:

 

 

 

验证成功之后跳转到列表页面:

 

 

 

 

细节:

 

 

 

⑦添加前的钩子函数

验证成功后,在控制器中调用模型的add()方法,进行数据的存储:

 

 

 

 

 

钩子函数在add()方法执行前,自动调用。注意,传智时的$data必须使用引用传值,否则就是局部变量,无法对要入库的数据产生影响!

 

 

添加完钩子函数后,数据在存储之前,会把添加和修改时间补上,存入数据库。

 

 

 

 

 

 

 

补充:自动验证货币类型

 

补充2:

list是关键字,请不要用作方法名:

 

5、商品logo和缩略图的处理

①为表单添加属性,允许图片上传

 

②模拟上传按钮

把下方的提交按钮的样式复制,放到上传按钮上,把上传按钮隐藏

 

添加事件

 

在普通按钮的click事件中,触发上传按钮的click事件

 

 

 

 

 

实现效果如下:点击按钮,自动打开文件上传域

 

 

③优化上传效果

目的:在上传按钮后方,添加文字,让用户知道图片状态

 

效果:

 

 

 

 

添加事件,在文件域的值发生改变(其实就是有图片被选中了)时,改变span标签中的文字:

 

 

 

④后台实现文件上传

先使用$_FILES进行表单提交的数据查看:

 

 

参照tp手册,进行文件上传的处理:

 

 

在钩子函数中,添加对上传logo的处理方法:

 

把相关代码摘抄下来:

 

修改$_FILES中的name值:

 

注意:要事先按照配置好的路径,建立对应的文件夹!

 

 

准备就绪后,打印$info数组,查看图片处理结果:

 

 

拼装路径,存入数据库:

 

 

图片上传成功:

 

 

 

 

数据库中对应的字段(笔记中,成功的只有一个,另一个是测试时上传的,没有入库)

 

 

 

⑤缩略图的处理

当商品图片上传成功之后,才能进行缩略图的处理:

 

首先,要打开一张图片,才能生成新的缩略图

 

 

然后,为缩略图生成要存放的路径:

 

最后,调用tp中的方法,生成两张尺寸不同的缩略图:

 

 

注意缩略图存放的路径,相对于入口文件,所以要添加“.”:

 

效果:

 

 

 

 

细节处理:没有图片的时候,当前的写法会报错,因为$this->error()方法是控制器的方法,而我们目前是在模型中进行处理,所以,要回避这种方法:

 

 

 

 

完善方式:

                            1 判断,如果没有图片上传则不进行处理

                            2 图片出错时不判断(以后可以打印日志,但是这里不作为知识点进行讲解)

 

 

6、商品列表页

①引入列表页页面

 

对应的文件:

 

 

把页面放入到视图中,同时创建goods_list()方法,进行页面的展示

 

 

 

 

替换页面中资源文件的路径(自行替换),效果:

 

 

 

②修改添加按钮

 

 

代码改为:注意,这里添加的按钮有ID,去掉ID,避免其触发JS事件

 

 

 

效果:点击后实现商品添加页的跳转

 

 

③拼凑数据

把表头修改为要展示的字段名:

 

 

使用<foreach>标签,进行数据的循环输出,注意图片的格式。

 

 

 

④完善排序效果

修改\jxshop\Public\Admin\js\table-editable.js文件,使数据能够根据ID(第一列)进行排序。

 

此时,列表能够根据ID上方的箭头进行排序。

 

 

说明:实现原理---后台传入数据,前端通过jQuery datatable进行处理,可以进行翻页、修改每页展示的条数、按照某个字段进行排序、搜索的功能,十分强大,是以后工作中常用的技术。

 

补充

 

这样在每次刷新的时候,就能够保存状态了。

 

 

 

7、商品删除

①分析删除按钮

模板中自带删除按钮,效果如下:

 

点击“是”之后,

 

 

删除按钮在jxshop\Public\Admin\js\table-editable.js文件中对应的效果代码:

 

 

②实现ajax

在第二个弹窗处,写ajax请求服务器,进行真正的删除:

 

 

c_url是请求的地址,需要在具体页面中进行定义(定义一个全局变量)

 

 

 

注意,这里U()函数的第三个参数,代表生成的地址没有后缀。

 

③传递商品的ID

 

在每个删除按钮的标签上,添加自定义属性data-id(名字随便起),值是当前商品的ID:

 

 

在JS中,因为点击删除,获取的是当前的对象,所以当前的自定义属性data-id也能获取到,使用attr()方法:

 

 

④完成后台数据删除功能

把获得的ID传递给后台

 

 

在Goods控制器创建方法goods_del,完成删除功能。

 

 

注意:ID使用get 方式接收。

 

M(‘goods’)->delete($id)  根据主键ID删除一条数据(这么写的方式,仅限于$id是主键),等同于M(‘goods’)->where(‘id=’.$id)->delete();

 

无论成功与否,要返回json数据。

 

删除成功,弹出状态,确认成功与否:

 

 

 

 

修改JS,完成功能:

 

 

 

 

 

 

 

三、提取公共部分

在一个项目中,所有的页面会有一套公共的样式、和JS、以及图片文件。

 

 

 

而且每个页面中也有单独的样式和JS等文件。

 

我们需要把公共的样式、JS文件提取出来,把特有的文件单独引入,达到一个提升效率、方便修改的目的。

 

①创建公共布局文件夹

在view下,创建公共的布局文件夹Pub,存放布局文件

 

 

建立footer.html和layout.html 来存储公共部分

 

②提取首页公共部分

先把首页公共的CSS文件提取出来

 

把公共部分剪切,提取到这里:

 

 

提出的部分放到View/Pub/layout.html中:

 

 

在首页通过<layout>标签引入公共布局,下面写上公共的样式:

 

 

在layout.html文件中,通过TP的模板变量,匹配内容{__CONTENT__}:

 

 

首页的提取部分完成

 

③提取商品添加、商品列表页的样式

商品添加页goods_add.html:

 

商品列表页goods_list.html:

 

 

④提取公共脚部

原则:提取公共的js部分和脚部部分到文件:Pub/footer.html中,特有的放到自己的页面中。使用<include>标签引入:

首页:

 

 

商品列表页:

 

 

商品添加页:

 

 

至此,公共部分提取完成。

 

⑤修改公共部分的文字

 

公共部分的提示文字需要根据不同页面而不同:

 

 

修改布局文件:

 

 

这些变量在每个控制器中的具体方法中,进行传入:

 

 

 

 

 

 

⑥ 实现菜单自动选中

首页处理

把首页的超链接改为正确的形式:

 

通过尝试得知,首页自动选中的状态,依赖于一个类:active,所以,我们要判断当前的控制器,如果是Index则默认让首页的<li>标签拥有这个类:

 

提醒:在TP的模板中,如果想写PHP代码,可以用<php></php>标签,里面写PHP代码。

 

其他页面处理:

先删除其他的菜单,留下商品管理,并添加商品列表、完成超链接:

 

 

通过判断控制器,确定二级菜单的选中状态,控制其效果的也是active 类:

 

 

以上是关于first的主要内容,如果未能解决你的问题,请参考以下文章