功能模块重构 & CSS 整体优化:首页篇


通过前面三十篇教程的讲解,我们已经完成了 Roast 应用的所有前端功能,相信你也已经初步掌握了基于 Laravel + Vue 实现前后端分离单页面应用的开发,接下来的几篇教程我们将围绕对现有 Roast 应用进行优化展开,对底层数据结构和前端功能模块进行重构,从而让应用的整体架构更加清晰,同时对 CSS 进行优化,从而让应用看上去更加美观,以首页为例,优化后的效果是这样的:

roast-app-home

跟之前相对简陋的首页相比,可以说是很酷了。

在正式编码前,我们先来规划下对应用哪几块功能进行重构:

  • 将咖啡店列表页合并到首页
  • 移除信息窗体功能,点击咖啡店标记直接跳转到对应的咖啡店详情页
  • 移除标签和标签过滤器(暂时)
  • 移除文件上传功能,将其替换为上传咖啡店 Logo
  • 将是否是烘焙店替换为咖啡店类型字段
  • 将之前的咖啡店总店概念整合到所属公司,分店打平,将对应的公有字段也移到公司表中
  • 有了上面的基础,在新增咖啡店页面,现在一次只能添加一个咖啡店
  • 编辑咖啡店功能实现
  • 应用 CSS 整体优化

接下来,我们遵循之前的开发流程「数据表 -> 模型类-> 路由 -> 控制器-> 前端调用API -> Vuex -> Vue Router -> Vue组件 -> CSS」,从应用首页着手,对应用进行重构,重构教程,我们将以代码为主,讲述为辅,因为流程和原理前面都说过了,直接看代码就能看懂。

第一步:数据表调整

首先需要创建从原来的表中拆分出两张表,一张是公司表 companies,用于存放咖啡店所属公司的公共属性:

在新生成的数据库迁移文件类中,编辑 up 方法如下:

另一张表是城市表 cities,用于单独存放城市信息,以便后续实现级联功能:

编辑对应的数据表迁移类的 up 方法如下:

接下来的一些数据库迁移文件由上面两张新表衍生而来,首先看 companies,从 cafes 表中抽走了咖啡店的公共属性,所以需要对 cafes 表进行调整:

编辑对应的数据表迁移类 up 方法如下:

cafes 表与 companies 表通过 company_id 进行关联,此外关于用户与公司之间的关系,我们创建一张 company_owners 表进行存储:

编辑对应的数据表迁移类 up 方法如下:

捋好公司表后,我们还要为 cafes 表和 cities 表建立关联:

编辑对应的数据表迁移类 up 方法如下:

最后我们为 companies 添加一个 subscription 字段,标识该咖啡店是否支持订购,为 brew_methods 表添加 add_brew_methods_icon 字段,标识该冲泡方法的 icon 图标:

对应的数据表迁移类 up 方法分别是:

和:

至此,我们已经完成了数据表迁移类的创建,运行 php artisan migrate 应用这些迁移,完成数据库中数据表创建及修改。

第二步:模型类调整

首先是创建两个模型类 CompanyCity

然后编辑 Company 类代码如下,主要是定义两个关联关系,公司与用户之间是多对多的关系,与咖啡店之间是一对多的关系:

相对的,在 Cafe 模型类中定义其与 Company 的关联关系如下:

最后在 User 模型类中定义其与 Company 的关联关系:

City 模型类留空即可。

第三步:后端路由及控制器实现

对于路由来说,只需要为获取城市信息新增两个公有路由即可:

然后创建一个新的控制器:

在这个新创建的控制器中编写对应的路由方法:

然后由于我们调整了咖啡店的数据结构,所以需要修改 CafesControllergetCafesgetCafe 方法:

注:新增咖啡店方法代码放到下一篇教程去修改。

至此,我们的后端代码重构已经完成了,重头戏在前端,接下来我们将进行前端代码的重构。

第四步:新增 API 调用文件

创建一个新的 resources/assets/js/api/cities.js 文件,并编写后端 API 调用代码如下:

第五步:新增/调整 Vuex 模块

新增 resources/assets/js/modules/cities.js

新增 resources/assets/js/modules/display.js

新增 resources/assets/js/modules/filters.js

调整 resources/assets/js/modules/cafes.js

然后在 resources/assets/js/store.js 中引入新增的几个文件:

第六步:调整 Vue Router

打开 resources/assets/js/routes.js 文件,修改前端路由配置如下:

在这里我们将 Layout.vue 移动到 resources/assets/js/layouts 目录下,同时将 Cafes.vue 合并到 Home.vue 页面。接下来我们就要来具体重构 Layout.vueHome.vue 页面组件,从而完成首页重构。

第七步:重构 Layout 组件

重构 resources/assets/js/layouts/Layout.vue 代码如下:

这里面引入几个新的组件,我们需要依次创建这些组件。

resources/assets/js/components/global/SuccessNotification.vue 用于显示成功通知:

resources/assets/js/components/global/ErrorNotification.vue 用于显示失败通知:

resources/assets/js/components/global/Filters.vue 用于实现过滤器:

resources/assets/js/components/global/PopOut.vue 用于实现滑出菜单:

最后,我们还要修改原来的导航组件 resources/assets/js/components/global/Navigation.vue

以及登录模态框组件 resources/assets/js/components/global/LoginModal.vue

注:以上组件中用到的图片都可以到 https://github.com/nonfu/roastapp/tree/master/storage/app/public/img 去下载,后面也是一样,不再赘述。

第八步:重构 Home 组件

修改 resources/assets/js/pages/Home.vue 组件代码如下:

同样我们新增了一些组件。

resources/assets/js/components/cafes/CafeList.vue 用于渲染咖啡店列表:

在这个组件中引入了一个新的组件 resources/assets/js/components/cafes/ListFilters.vue,其实现思路和 Filters.vue 完全一致,详细代码可以从这里拷贝:https://github.com/nonfu/roastapp/blob/master/resources/assets/js/components/cafes/ListFilters.vue

另外,resources/assets/js/components/cafes/CafeCard.vue 代码也有调整:https://github.com/nonfu/roastapp/blob/master/resources/assets/js/components/cafes/CafeCard.vue

回到 Home.vue 组件,resources/assets/js/components/cafes/AddCafeButton.vue 用于实现新增咖啡店按钮:

resources/assets/js/components/cafes/ToggleCafesView.vue 用于在地图和列表布局之间进行切换:

resources/assets/js/components/cafes/MapLegend.vue 用于渲染图例:

最后,用于在地图上以点标记渲染咖啡店的地图组件 resources/assets/js/components/cafes/CafeMap.vue 代码也有很大的调整:

我们在这个组件的 mixins 中新引入了多个过滤器函数,大家可以在 https://github.com/nonfu/roastapp/tree/master/resources/assets/js/mixins/filters 拷贝/下载代码到本地,这里就不一一列举了,需要注意的是,在 buildMarkers 方法中,我们注释掉了之前的信息窗体实现代码,将点击点标记事件处理为跳转到咖啡店详情页。

第九步:优化全局 CSS

最后,我们来完全全局 CSS 文件的编写,打开 resources/assets/sass/app.scss,引入新的组件 SCSS 和动画效果 SCSS 文件:

具体的 SCSS 文件源码可以从 https://github.com/nonfu/roastapp/tree/master/resources/assets/sass 下载或拷贝,因为文件太多,这里就不一一列举了。

完成以上编码工作后,运行 npm run dev 重新编译所有前端资源,访问应用首页,页面会跳转到 http://roast.test/#/cafes,并显示我们开头提供的重构后的页面效果,上面是地图布局,下面给出列表布局的渲染效果:

roast-app-list

完成首页重构后,我们将会在下一篇教程完成新增咖啡店功能的重构。

注:完整项目代码位于 nonfu/roastapp


<< 上一篇: 通过 Laravel + Vue 实现文件上传功能

>> 下一篇: 功能模块重构 & CSS 整体优化:新增咖啡店篇